package.xml0000644000175000017500000016016415001737315012131 0ustar biggibiggi solr pecl.php.net The Apache Solr PHP extension is an extremely fast, light-weight, feature-rich library that allows PHP applications to communicate easily and efficiently with Apache Solr server instances using an object-oriented API. It effectively simplifies the process of interacting with Apache Solr using PHP. The extension has features such as built-in, serializable query string builder objects which effectively simplifies the manipulation of name-value pair request parameters across repeated requests. The response from the Solr server is also automatically parsed into native php objects whose properties can be accessed as array keys or object properties without any additional configuration on the client-side. Its advanced HTTP client reuses the same connection across multiple requests and provides built-in support for connecting to Solr servers secured behind HTTP Authentication or HTTP proxy servers. It is also able to connect to SSL-enabled containers. Please consult the documentation for more details on features. Included in the source code are phpdoc stubs that enable autocomplete of Solr classes and methods in IDE during development in userland. Please consider staring the package on github, and get a free release ;) https://github.com/php/pecl-search_engine-solr Omar Shaban omars omars@php.net yes Birgir Haraldsson biggi biggi@stefna.is yes 2025-04-22 2.8.1 2.8.1 stable stable PHP License Fixes: - Fix return type of SolrUtils::escapeQueryChars() (#83) 7.4.0 8.4.99 1.4.0 libxml solr 2.8.1 2.8.1 stable stable 2025-04-22 PHP License Fixes: - Fix return type of SolrUtils::escapeQueryChars() (#83) 2.8.0 2.8.0 stable stable 2024-12-30 PHP License Features: - Support PHP 8.4 Internals: - improve config.m4 and config.w32 (remicollet and petk) 2.7.0 2.7.0 stable stable 2024-01-11 PHP License Features: - Support Highlight Query (#28) - Support PHP 8.3 - Dropped Support for PHP 7.3 and below API Changes: - Added SolrQuery SolrQuery::setHighlightQuery(string $q) - Added string SolrQuery::getHighlightQuery() Bug Fixes: - Fix parsed parameter types (#37) - Fix compile error: libcurl on linux multi-arch support (#46) - Fix SegFault in SolrClient::optimize() (debug mode) - Fix Missing Windows DLLs (#51) / available on github releases now - Fix curl checks for PHP 7.4+, use PKG_CONFIG (remicollet) Internals: - ci: windows tests (#51) - parse_int macros 2.6.0 2.6.0 stable stable 2022-11-09 PHP License - PHP 8.1 compatible - PHP 8.2 compatible Omar Shaban omars omars@php.net yes 2.5.1 2.5.1 stable stable 2020-09-09 PHP License - PHP 7.4 compatible - PHP 7 windows support - PHP 8.0.0beta3 compatible - Bug #72740 Fixes NULL byte when using addQueryField() w/o boost Omar Shaban omars omars@php.net yes 2.5.0 2.5.0 stable stable 2019-07-04 PHP License - Atomic Updates (partials) - Simple Optimistic Concurrency - Compatibility with PHP 7.1, 7.2, 7.3, latest 7.4 - Enable gzip encoding if server supports it - Fix Real Time Get requests fails if it wasn't the first request - Fix addQueryField return wrong query - Fix Solr Extension build fail with curl 7.19+ Omar Shaban omars omars@php.net yes 2.4.0 2.4.0 stable stable 2016-03-30 PHP License - PHP 7 Support [Request #70696] - Performance Optimizations - Enabled SolrUtils::getSolrStats() - Fix SolrException*::getInternalInfo - Fix SolrQueryResponse::getRequestUrl returns wrong url with terms [Bug #71591] - Fix SolrClient::deleteByIds Segfaults with invalid ids [Bug #71853] - Fix SolrObject::offsetExists SegFault [Bug #71852] - Fix float formatting with decimal comma [Bug #71568] Omar Shaban omars omars@php.net yes 2.3.0 2.3.0 stable stable 2015-11-29 PHP License - Support indexing child/nested documents [Request #70739] - Support nested documents parsing SolrObject [Request #70953] - Support nested documents parsing SolrDocument [Request #70974] - Added maxScore to SolrResponse [Request #68610] - Fixed issues on big endean processors (Remi Collet) - Enhancements on method parameter naming (reflections) Omar Shaban omars omars@php.net yes 2.2.1 2.2.1 stable stable 2015-09-27 PHP License - Fix windows build Omar Shaban omars omars@php.net yes 2.2.0 2.2.0 stable stable 2015-09-26 PHP License - Support Real Time Get (Request #68647) - Support Result Grouping (Request #68793) - Support Field Collapsing (Request #70175) - Support Expand Component (Request #70176) - SolrMissingMandatoryParameterException (Request #70301) - Fix SegFault on Solr Server 500 Response with no msg [xml RW] (Bug #69156) - Fix SegFault on non-phpserialized 500 responses from Solr Server with PHPS RW (Bug #69156) - Fix Failed to parse 500 error response when it lacks msg JSON/PHPS RW (Bug #70495, #70496) - Fix compatibility tests with Solr Server 5 (Bug #70333) - Fix Error unserializing raw response on statistics response having NaN as value (Bug #67394) Omar Shaban omars omars@php.net yes 2.1.0 2.1.0 stable stable 2014-01-15 PHP License - New Feature: SolrDisMaxQuery Builder (dismax/edismax) [Feature #67101] - Support PHPS (PHP Serialized) Response Writer [Request #61329] - SolrResponse::getArrayResponse [Feature #67660] - SolrResponse::getResponse() returns SolrObject instead of array (with json response writer) [Bug #67579] - Argument list parameter: Argument to value separator disappears [Bug #68179] - Conflict Occurs When using SolrDisMax::addBoostQuery and setBoostQuery [Bug #68181] - Doc Fix [Doc #67542] - Internals: simple_list parameter type allow custom delimiter - Internals: Allowed zero-length argument value - Internals: Allowed zero-length argument-to-argument-value separator - Security Fix Omar Shaban omars omars@php.net yes 2.0.0 2.0.0 stable stable 2014-06-24 PHP License - Introduced SolrServerException which handles exception responses produced by Solr Server [Feature #67063] - SolrClient::commit $maxSegments removed - Removed php curl extension dependency for static builds [Bug #59028] - SolrParams/SolrModifiableParams/SolrQuery throws SolrIllegalArguments Exception instead of E_ERROR [Feature #66858] - SolrQuery::__construct throws SolrIllegalArgumentException instead of E_ERROR - Dropped Support for phpnative Response Writer - Fix config that always enables solr debug [Bug #60361] Omar Shaban omars omars@php.net yes 1.1.1 1.1.1 stable stable 2014-06-20 PHP License - Fix Windows Build Omar Shaban omars omars@php.net yes 1.1.0 1.1.0 stable stable 2014-06-19 PHP License 1.1.0 Stable - Introduced SolrServerException which handles exception responses produced by Solr Server [Feature #67063] - SolrClient::commit $maxSegments removed - SolrQuery::__construct throws SolrIllegalArgumentException instead of E_ERROR - Removed php curl extension dependency for static builds [Bug #59028] From 1.1.0b - SolrClient::system Access system servlet which fetch Solr Server System Information - SolrClient::commit argument $maxSegments is now DEPRECATED - SolrClient::commit Added support for expungeDeletes on - All SolrClient methods throws SolrClientExceptions instead of E_WARNING + SolrClientException - SolrClientExceptions' messages are more informative in case of connection errors - Added json extension validation - All SolrResponse, SolrQueryResponse, SolrUpdateResponse, SolrPingResponse, SolrGenericResponse, SolrDocument, and SolrInputDocument classes are now final - All parameters functions throws SolrIllegalArgumentException instead of E_RROR - SolrParams/SolrModifiableParams/SolrQuery throws SolrIllegalArguments Exception instead of E_ERROR [Feature #66858] - Various Bug Fixes Omar Shaban omars omars@php.net yes 1.1.0b 1.1.0b beta beta 2014-03-17 PHP License - SolrClient::system Access system servlet which fetch Solr Server System Information - SolrClient::commit argument $maxSegments is now DEPRECATED - SolrClient::commit Added support for expungeDeletes on - All SolrClient methods throws SolrClientExceptions instead of E_WARNING + SolrClientException - SolrClientExceptions' messages are more informative in case of connection errors - Added json extension validation - All SolrResponse, SolrQueryResponse, SolrUpdateResponse, SolrPingResponse, SolrGenericResponse, SolrDocument, and SolrInputDocument classes are now final - All parameters functions throws SolrIllegalArgumentException instead of E_RROR - SolrParams/SolrModifiableParams/SolrQuery throws SolrIllegalArguments Exception instead of E_ERROR (Feature #66858) - Various Bug Fixes Omar Shaban omars omars@php.net yes 2.0.0b 2.0.0b beta beta 2014-02-28 PHP License - Support Solr version 4.0+ - Added support for retreiving Solr Server system information through SolrClient SolrClient::system() - Support for softCommit - Suppport for expungeDeletes - maxSegments for commit is deprecated - Added escape character / as per Solr 4 it is reserved for REGEX - Disabled warnings for connection errors, SolrClientException is thrown - SolrClientException messages for connection errors are more meaningful indicating error messages and codes - API changes for: SolrClient::commit($maxSegments = 0, $softCommit = false, $waitSearcher = true, $expungeDeletes = false) SolrClient::optimize($maxSegments = 1, $softCommit = false, $waitSearcher = true) SolrClient::addDocument(SolrInputDocument &$doc, $overwrite = true, $commitWithin = 0) SolrClient::addDocuments(array &$docs, $overwrite = true, $commitWithin = 0) - Several Bug Fixes Warning: PECL Solr >= 2 is not compatible with Solr Server < 4.0 Israel Ekpo iekpo iekpo@php.net yes 1.0.2 1.0.2 stable stable 2011-11-29 PHP License - Several Bug Fixes by Pierrick, Felipe and Tony - Changes to make the code compile on 5.2.3 and greater - Changes to Tests by Pierrick Israel Ekpo iekpo iekpo@php.net yes 1.0.1 1.0.1 stable stable 2011-06-04 PHP License - Added support for json response writer in SolrClient - Removed final bit from classes so that they can be mocked in unit tests - Changed from beta to stable - Included phpdoc stubs in source to enable autocomplete of Solr classes and methods in IDE during development - Lowered libxml2 version requirement to 2.6.16 Israel Ekpo iekpo iekpo@php.net yes 0.9.11 0.9.11 beta beta 2010-06-22 PHP License - Added ability to specify response writer in constructor option - Added new method to set response writer SolrClient::setResponseWriter() - Currently, the only supported response writers are 'xml' and 'phpnative' - Added support for new native Solr response writer - New response writer is available at https://issues.apache.org/jira/browse/SOLR-1967 Israel Ekpo iekpo iekpo@php.net yes 0.9.10 0.9.10 beta beta 2010-05-04 PHP License - Increased compatibility with older systems running CentOS 4 or 5 and RHEL4 or 5 - Added ability to compile directly without having to build libcurl and libxml2 from source on older systems - Lowered minimum supported version for libcurl to 7.15.0 (Alex Samorukov) - Lowered minimum supported version for libxml2 to 2.6.26 (Alex Samorukov) - Fixed PECL Bug# 17172 MoreLikeThis only parses one doc (trevor at blubolt dot com, max at blubolt dot com) - Declared workaround macros for SSL private key constants due to support for earlier versions of libcurl (Alex Samorukov) - Changed extension version numbers to start using hexadecimal numbers (Israel Ekpo) - Added instructions on how to attempt to compile on windows (Israel Ekpo) - Fixed PECL Bug# 17292 sending UTF-8 encoding in header (giguet at info dot unicaen dot fr) Israel Ekpo iekpo iekpo@php.net yes 0.9.9 0.9.9 beta beta 2010-01-10 PHP License - Fixed Bug #17009 Creating two SolrQuery objects leads to wrong query value - Reset the buffer for the request data from the previous request in SolrClient - Added new internal static function solr_set_initial_curl_handle_options() - Moved the intialization of CURL handle options to solr_set_initial_curl_handle_options() function - Resetting the CURL options on the (CURL *) handle after each request is completed - Added more explicit error message to indicate that cloning SolrParams objects and its descendants is currently not yet supported Israel Ekpo iekpo iekpo@php.net yes 0.9.8 0.9.8 beta beta 2009-12-04 PHP License - Fixed config.w32 for Windows build support (Pierre, Pierrick) - Fixed Bug #16943 Segmentation Fault from solr_encode_string() during attempt to retrieve solrXmlNode->children->content when solrXmlNode->children is NULL (Israel) - Disabled Expect header in libcurl (Israel) - Disabled Memory Debugging when normal debug is enabled (Israel) - Added list of contributors to the project Israel Ekpo iekpo iekpo@php.net yes 0.9.7 0.9.7 beta beta 2009-11-17 PHP License - Fixed bug 16924 AC_MSG_NOTICE() is undefined in autoconf 2.13 - Added new method SolrClient::getDebug() - Modified SolrClient::__construct() so that port numbers and other integer values for the options can be passed as strings. - Changed internal string handling mechanism to allow for tracking of memory allocation in debug mode. - Lowered minimum php version to 5.2.3. Unfortunately, this is the lowest PHP version that will be supported. PHP versions lower than 5.2.3 are not compatible or are causing tests to FAIL. - Added php stubs for code-completion assists in IDEs and editors. - Added more examples Israel Ekpo iekpo iekpo@php.net yes 0.9.6 0.9.6 beta beta 2009-11-01 PHP License Reduced minimum php version to 5.2.4 Israel Ekpo iekpo iekpo@php.net yes 0.9.5 0.9.5 beta beta 2009-10-27 PHP License Added support for secure connections to SSL-enabled Solr servers (SSL/HTTPS). Made connection errors more verbose. The following options where added to the SolrClient constructor : - secure (Boolean value indicating whether or not to connect in secure mode) - timeout (This is maximum time in seconds allowed for the http data transfer operation. Default is 30 seconds) - ssl_cert (File name to a PEM-formatted file containing the private key + private certificate (concatenated in that order) ) - ssl_key (File name to a PEM-formatted private key file only) - ssl_keypassword (Password for private key) - ssl_cainfo (Name of file holding one or more CA certificates to verify peer with) - ssl_capath (Name of directory holding multiple CA certificates to verify peer with ) Israel Ekpo iekpo iekpo@php.net yes 0.9.4 0.9.4 beta beta 2009-10-23 PHP License Fixed bug 16897 - ap_php_vasprintf not available in 5.2.11 Israel Ekpo iekpo iekpo@php.net yes 0.9.3 0.9.3 beta beta 2009-10-19 PHP License - Corrected configuration options for automated installation via PECL. Removed extra hyphens. Israel Ekpo iekpo iekpo@php.net yes 0.9.2 0.9.2 beta beta 2009-10-19 PHP License - Fixed bug #16874 Added explanation in documentation - Updated SolrParams::__toString() - modified to return name-value pair list instead of serialized object string - Added the following methods to SolrParams : SolrParams::toString() SolrParams::getParam() - Created the following aliases in SolrParams : SolrParams::set() SolrParams::add() SolrParams::get() - Added the following methods to SolrQuery : SolrQuery::getQuery() SolrQuery::getStart() SolrQuery::getRows() SolrQuery::getFields() SolrQuery::getSortFields() SolrQuery::getFilterQueries() SolrQuery::getTimeAllowed() SolrQuery::getFacet() SolrQuery::getFacetFields() SolrQuery::getFacetQueries() SolrQuery::getFacetPrefix() SolrQuery::getFacetSort() SolrQuery::getFacetLimit() SolrQuery::getFacetOffset() SolrQuery::getFacetMinCount() SolrQuery::getFacetMissing() SolrQuery::getFacetMethod() SolrQuery::getFacetDateFields() SolrQuery::getFacetDateStart() SolrQuery::getFacetDateEnd() SolrQuery::getFacetDateGap() SolrQuery::getFacetDateHardEnd() SolrQuery::getFacetDateOther() SolrQuery::getHighlight() SolrQuery::getHighlightFields() SolrQuery::getHighlightSnippets() SolrQuery::getHighlightFragsize() SolrQuery::getHighlightMergeContiguous() SolrQuery::getHighlightRequireFieldMatch() SolrQuery::getHighlightMaxAnalyzedChars() SolrQuery::getHighlightAlternateField() SolrQuery::getHighlightMaxAlternateFieldLength() SolrQuery::getHighlightFormatter() SolrQuery::getHighlightSimplePre() SolrQuery::getHighlightSimplePost() SolrQuery::getHighlightFragmenter() SolrQuery::getHighlightUsePhraseHighlighter() SolrQuery::getHighlightHighlightMultiTerm() SolrQuery::getHighlightRegexSlop() SolrQuery::getHighlightRegexPattern() SolrQuery::getHighlightRegexMaxAnalyzedChars() SolrQuery::getStats() SolrQuery::getStatsFields() SolrQuery::getStatsFacets() SolrQuery::getMlt() SolrQuery::getMltCount() SolrQuery::getMltFields() SolrQuery::getMltQueryFields() SolrQuery::getMltMinTermFrequency() SolrQuery::getMltMinDocFrequency() SolrQuery::getMltMinWordLength() SolrQuery::getMltMaxWordLength() SolrQuery::getMltMaxNumTokens() SolrQuery::getMltMaxNumQueryTerms() SolrQuery::getMltBoost() SolrQuery::getTerms() SolrQuery::getTermsField() SolrQuery::getTermsLowerBound() SolrQuery::getTermsUpperBound() SolrQuery::getTermsIncludeLowerBound() SolrQuery::getTermsIncludeUpperBound() SolrQuery::getTermsMinCount() SolrQuery::getTermsMaxCount() SolrQuery::getTermsPrefix() SolrQuery::getTermsLimit() SolrQuery::getTermsReturnRaw() SolrQuery::getTermsSort() Israel Ekpo iekpo iekpo@php.net yes 0.9.1 0.9.1 beta beta 2009-10-07 PHP License - Fixed bug #16864 (Build failure in Non-ZTS builds) Israel Ekpo iekpo iekpo@php.net yes 0.9.0 0.9.0 beta beta 2009-10-05 PHP License - Initial release after approximately 10 months of development and 3 weeks of testing. This is the beta version. Some of the features may be modified in future releases. solr-2.8.1/examples/bootstrap.php0000664000175000017500000000004215001737315015771 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $query->setFacet(true); $query->addFacetField('cat')->addFacetField('name')->setFacetMinCount(2); $updateResponse = $client->query($query); $response_array = $updateResponse->getResponse(); $facet_data = $response_array->facet_counts->facet_fields; print_r($facet_data); solr-2.8.1/examples/facet_002.php0000664000175000017500000000116715001737315015430 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $query->setFacet(true); $query->addFacetField('cat')->addFacetField('name')->setFacetMinCount(2); $query->setFacetMinCount(4, 'name'); $updateResponse = $client->query($query); $response_array = $updateResponse->getResponse(); $facet_data = $response_array->facet_counts->facet_fields; print_r($facet_data); solr-2.8.1/examples/solrclient_001_adddocument_01.php0000664000175000017500000000114115001737315021362 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $updateResponse = $client->addDocument($doc); print_r($updateResponse->getResponse()); /* you will have to commit changes to be written if you didn't use $commitWithin */ $client->commit(); solr-2.8.1/examples/solrclient_002_adddocument_02.php0000664000175000017500000000116615001737315021373 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); // No need to call commit() because $commitWithin is passed, so Solr Server will auto commit within 10 seconds $updateResponse = $client->addDocument($doc, false, 10000); print_r($updateResponse->getResponse()); solr-2.8.1/examples/solrclient_002_adddocument_03_child_docs.php0000664000175000017500000000312015001737315023537 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_STORE_PATH, ); $client = new SolrClient($options); $product = new SolrInputDocument(); $product->addField('id', 'black'); $product->addField('cat', 'tshirt'); $product->addField('cat', 'polo'); $product->addField('content_type', 'product'); $small = new SolrInputDocument(); $small->addField('id', 'TS-BLK-S'); $small->addField('content_type', 'sku'); $small->addField('size', 'S'); $small->addField('inventory', 100); $medium = new SolrInputDocument(); $medium->addField('id', 'TS-BLK-M'); $medium->addField('content_type', 'sku'); $medium->addField('size', 'M'); $medium->addField('inventory', 200); $large = new SolrInputDocument(); $large->addField('id', 'TS-BLK-L'); $large->addField('content_type', 'sku'); $large->addField('size', 'L'); $large->addField('inventory', 300); // add child documents $product->addChildDocument($small); $product->addChildDocument($medium); $product->addChildDocument($large); // or // $skus = [$small, $medium, $large]; // $product->addChildDocuments($skus); // add product document to the index $updateResponse = $client->addDocument( $product, true, // overwrite if the document exists 10000 // commit within 10 seconds ); print_r($updateResponse->getResponse()); /* OUTPUT SIMILAR TO: SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => 5 ) ) */ solr-2.8.1/examples/solrclient_003_adddocuments_01.php0000664000175000017500000000131715001737315021554 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc2 = clone $doc; $doc2->deleteField('id'); $doc2->addField('id', 334456); $docs = array($doc, $doc2); $updateResponse = $client->addDocuments($docs); /* you will have to commit changes to be written if you didn't use $commitWithin */ $client->commit(); print_r($updateResponse->getResponse()); solr-2.8.1/examples/solrclient_004_adddocuments_02.php0000664000175000017500000000116215001737315021554 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc2 = clone $doc; $doc2->deleteField('id'); $doc2->addField('id', 334456); $docs = array($doc, $doc2); $updateResponse = $client->addDocuments($docs, true, 1024); print $updateResponse->getRawRequest(); solr-2.8.1/examples/solrclient_005_optimize.php0000664000175000017500000000063115001737315020442 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $update_response = $client->optimize(4, false, false); $response = $update_response->getRawRequest(); print_r($response); solr-2.8.1/examples/solrclient_006_commit.php0000664000175000017500000000063215001737315020074 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $update_response = $client->commit(true, false, false); $response = $update_response->getRawRequest(); print_r($response); solr-2.8.1/examples/solrclient_007_query.php0000664000175000017500000000110415001737315017745 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response); solr-2.8.1/examples/solrclient_008_query_lucene.php0000664000175000017500000000114615001737315021307 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('manu:"Apple Computer Inc." OR text:apple'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response); solr-2.8.1/examples/solrclient_009_query_parsemode.php0000664000175000017500000000120715001737315022012 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $query_response->setParseMode(SolrQueryResponse::PARSE_SOLR_DOC); $response = $query_response->getResponse(); print_r($response); solr-2.8.1/examples/solrdocument_001.php0000664000175000017500000000045315001737315017060 0ustar biggibiggiaddField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; print_r($doc->toArray()); ?> solr-2.8.1/examples/solrdocument_002.php0000664000175000017500000000057015001737315017061 0ustar biggibiggiaddField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; foreach ($doc as $fieldname => $fieldvalues) { print "$fieldname\n"; print_r($fieldvalues); } ?> solr-2.8.1/examples/solrdocument_003.php0000664000175000017500000000053315001737315017061 0ustar biggibiggiaddField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; $input_doc = $doc->getInputDocument(); var_dump(get_class($input_doc)); ?> solr-2.8.1/examples/solrdocument_004.php0000664000175000017500000000064715001737315017070 0ustar biggibiggiaddField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; $second_doc->addField('cat', 'Lucene Search'); $second_doc->merge($doc, true); print_r($second_doc->toArray()); ?> solr-2.8.1/examples/solrobject_001.php0000664000175000017500000000026115001737315016505 0ustar biggibiggi solr-2.8.1/examples/solrobject_002.php0000664000175000017500000000034215001737315016506 0ustar biggibiggiemail = "iekpo@php.net"; } catch (Exception $e) { var_dump($e->getCode()); var_dump($e->getMessage()); } var_dump($solrObject->getPropertyNames()); ?> solr-2.8.1/examples/solrobject_003.php0000664000175000017500000000033115001737315016505 0ustar biggibiggisystem->threadDump->thread->stackTrace); ?> solr-2.8.1/examples/solrobject_004.php0000664000175000017500000000041215001737315016506 0ustar biggibiggiresponseHeader); $system = $solrObject->system; print_r($header); print_r($system); ?> solr-2.8.1/examples/solrobject_005.php0000664000175000017500000000041615001737315016513 0ustar biggibiggi solr-2.8.1/examples/solrquery_001.php0000664000175000017500000000061315001737315016405 0ustar biggibiggisetParam('a', 1); $query->setParam('b', 2); $query->setParam('c', 3); $query->setStart(4)->setQuery('solr')->setTimeAllowed(500)->setRows(17); $query->addField('israel')->addField('joshua')->addField('june'); $query->addSortField('cat', 0); $query->addFilterQuery('solr')->addFilterQuery('solr1')->addFilterQuery('solr2'); echo $query; echo "\n"; solr-2.8.1/examples/solrquery_002_facet.php0000664000175000017500000000113615001737315017551 0ustar biggibiggisetFacet(0); $query->addFacetField('israel')->addFacetField('israel2'); $query->addFacetQuery('silk')->addFacetQuery('name:june'); $query->setFacetPrefix('A')->setFacetPrefix('C', 'june'); $query->setFacetSort(1)->setFacetSort(0, 'june'); // $query->setFacetLimit(98)->setFacetLimit(44, 'june'); $query->setFacetOffset(110)->setFacetOffset(12, 'june'); $query->setFacetMinCount(4)->setFacetMinCount(30, 'june'); $query->setFacetMissing(1)->setFacetMissing(0, 'june'); $query->setFacetMethod('enum')->setFacetMethod('fc', 'june'); echo $query; echo "\n"; solr-2.8.1/examples/solrquery_003_date_facet.php0000664000175000017500000000140715001737315020550 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $query->setFacet(true); $query->addFacetDateField('manufacturedate_dt'); $query->setFacetDateStart('2006-02-13T00:00:00Z'); $query->setFacetDateEnd('2012-02-13T00:00:00Z'); $query->setFacetDateGap('+1YEAR'); $query->setFacetDateHardEnd(1); $query->addFacetDateOther('before'); $updateResponse = $client->query($query); $response_array = $updateResponse->getResponse(); $facet_data = $response_array->facet_counts->facet_dates; print_r($facet_data); solr-2.8.1/examples/solrquery_004_highlight.php0000644000175000017500000000314315001737315020436 0ustar biggibiggisetHighlight(true); $query->setHighlightQuery('title:PHP OR description:Solr'); $query->addHighlightField('a')->addHighlightField('a')->addHighlightField('a'); $query->removeHighlightField('a')->removeHighlightField('a')->removeHighlightField('a'); $query->setHighlightSnippets(4)->setHighlightSnippets(5, 'june'); $query->setHighlightFragsize(41)->setHighlightFragsize(52, 'june'); $query->setHighlightMergeContiguous(true)->setHighlightMergeContiguous(false, 'june'); $query->setHighlightRequireFieldMatch(true); $query->setHighlightMaxAnalyzedChars(44)->setHighlightMaxAnalyzedChars(53); $query->setHighlightAlternateField('pizza')->setHighlightAlternateField('bread', 'june'); $query->setHighlightAlternateField('blue')->setHighlightAlternateField('red','june'); $query->setHighlightAlternateField('a')->setHighlightAlternateField('b','june'); $query->setHighlightMaxAlternateFieldLength(300)->setHighlightMaxAlternateFieldLength(335, 'june'); $query->setHighlightFormatter('F')->setHighlightFormatter('G', 'june'); $query->setHighlightSimplePre('OO')->setHighlightSimplePre('PP', 'june'); $query->setHighlightSimplePost('ZZ')->setHighlightSimplePost('YY', 'june'); $query->setHighlightFragmenter('gap')->setHighlightFragmenter('space', 'june'); $query->setHighlightUsePhraseHighlighter(false); $query->setHighlightHighlightMultiTerm(1); $query->setHighlightRegexSlop(0.0025); $query->setHighlightRegexPattern("israel")->setHighlightRegexPattern("ekpo"); $query->setHighlightRegexMaxAnalyzedChars(444)->setHighlightRegexMaxAnalyzedChars(5.0); echo $query; echo "\n"; solr-2.8.1/examples/solrquery_005_stats.php0000664000175000017500000000036615001737315017634 0ustar biggibiggisetStats(0); $query->addStatsField('hello')->addStatsField('june')->removeStatsField('hello'); $query->addStatsFacet('world')->addStatsFacet('pear')->removeStatsFacet('world'); echo $query; echo "\n"; solr-2.8.1/examples/solrquery_006_mlt.php0000664000175000017500000000102115001737315017260 0ustar biggibiggisetMlt(1); $query->setMltCount(55)->setMltCount(90); $query->addMltField('june')->addMltField('joshua')->addMltField('mom')->removeMltField('joshua'); $query->addMltQueryField('june', 0.0)->addMltQueryField('israel', 9.558); $query->setMltMinTermFrequency(9); $query->setMltMinDocFrequency(5); $query->setMltMinWordLength(8); $query->setMltMaxWordLength(99); $query->setMltMaxNumTokens(6); $query->setMltMaxNumQueryTerms(2); $query->setMltBoost(true); echo $query; echo "\n"; solr-2.8.1/examples/solrquery_007_terms.php0000664000175000017500000000071115001737315017624 0ustar biggibiggisetTerms(true); $query->setTermsField('israel'); $query->setTermsLowerBound('june'); $query->setTermsUpperBound('joshua'); $query->setTermsIncludeLowerBound(false); $query->setTermsIncludeUpperBound(0); $query->setTermsMinCount(50); $query->setTermsMaxCount(200); $query->setTermsPrefix('A'); $query->setTermsLimit(45); $query->setTermsReturnRaw(false); $query->setTermsSort(0); echo $query; echo "\n"; solr-2.8.1/examples/solrutils_001_digestxmlresponse.php0000664000175000017500000000033115001737315022234 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, ); $client = new SolrClient($options); $query = new SolrQuery(); $userInput = 'USB/2'; $escapedUserInput = SolrUtils::escapeQueryChars($userInput); $query->setQuery('text:'.$escapedUserInput); echo $query.PHP_EOL; solr-2.8.1/examples/terms_001.php0000664000175000017500000000070315001737315015472 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setTerms(true); $query->setTermsField('cat'); $updateResponse = $client->query($query); print_r($updateResponse->getResponse()); solr-2.8.1/examples/terms_002.php0000664000175000017500000000103215001737315015467 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setTerms(true); /* Return only terms starting with $prefix */ $prefix = 'c'; $query->setTermsField('cat')->setTermsPrefix($prefix); $updateResponse = $client->query($query); print_r($updateResponse->getResponse()); solr-2.8.1/examples/terms_003.php0000664000175000017500000000121215001737315015470 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setTerms(true); /* Return only terms starting with $prefix */ $prefix = 'c'; /* Return only terms with a frequency of 2 or greater */ $min_frequency = 2; $query->setTermsField('cat')->setTermsPrefix($prefix)->setTermsMinCount($min_frequency); $updateResponse = $client->query($query); print_r($updateResponse->getResponse()); solr-2.8.1/examples/test.config.php0000664000175000017500000000332115001737315016202 0ustar biggibiggi solr-2.8.1/examples/solrdismaxquery_001.php0000664000175000017500000000174515001737315017622 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $disMaxQuery = new SolrDisMaxQuery(); $disMaxQuery->setStart(0)->setQuery('solr')->setTimeAllowed(500)->setRows(17); $disMaxQuery->addSortField('price', 0); $disMaxQuery ->setQueryAlt('*:*')->addQueryField('text', 1.5) ->addQueryField('title', 5) ->addBoostQuery('cat', 'electronics', 2) ->setQueryPhraseSlop(1) ->setBigramPhraseSlop(3) ->addBigramPhraseField('text', 2.5) ->addBigramPhraseField('type', 3, 4) ->setTrigramPhraseFields('content^0.5 anchor~4^1.5 title^1.2 site^1.5') ; $queryResponse = $client->query($disMaxQuery); $response = $queryResponse->getResponse(); if($response->response->numFound > 0) { $docs = $response->response->docs; print_r($docs); } else { echo "No Documents Found".PHP_EOL; } solr-2.8.1/examples/solrclient_010_getbyid.php0000664000175000017500000000054715001737315020233 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->getById('GB18030TEST'); print_r($response->getResponse()); solr-2.8.1/examples/solrclient_011_getbyids.php0000664000175000017500000000056615001737315020420 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->getByIds(['GB18030TEST', '6H500F0']); print_r($response->getResponse()); solr-2.8.1/examples/solrclient_012_system.php0000664000175000017500000000060415001737315020124 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query_response = $client->system(); $response = $query_response->getResponse(); print_r($response); solr-2.8.1/examples/solrquery_008_facetquery.php0000664000175000017500000000105515001737315020645 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $query->setFacet(true); $query->addFacetQuery('price:[* TO 500]')->addFacetQuery('price:[500 TO *]'); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response->facet_counts->facet_queries); solr-2.8.1/examples/solrquery_009_grouping.php0000664000175000017500000000115515001737315020331 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $query = new SolrDismaxQuery('*:*'); $query->setRows(4); $query->setGroup(true); $query->addGroupField('manu_s_id'); $query->setGroupLimit(2); $query->addGroupSortField('price', SolrQuery::ORDER_ASC); $query->setGroupNGroups(true); $query_response = $client->query($query); $response = $query_response->getResponse(); print_r($response); solr-2.8.1/examples/solrquery_010_collapse.php0000664000175000017500000000123615001737315020271 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $collapseFunction = new SolrCollapseFunction('manu_id_s'); $collapseFunction ->setSize(2) ->setNullPolicy(SolrCollapseFunction::NULLPOLICY_IGNORE); // $collapseFunction->setMax('sum(cscore(),field(A))'); $query ->collapse($collapseFunction) ->setRows(4); $queryResponse = $client->query($query); $response = $queryResponse->getResponse(); print_r($response); solr-2.8.1/examples/solrquery_011_expand.php0000664000175000017500000000126115001737315017745 0ustar biggibiggi SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $func = new SolrCollapseFunction('manu_id_s'); $query->collapse($func); $query->setExpand(true); $query->setExpandRows(10); $query->setExpandQuery('manu_id_s:corsair'); $query->addExpandFilterQuery('inStock:true'); $query->addExpandSortField('score', SolrQuery::ORDER_DESC); $queryResponse = $client->query($query); $response = $queryResponse->getResponse(); print_r($response); solr-2.8.1/examples/update_stream_file.php0000664000175000017500000000201615001737315017613 0ustar biggibiggiset(SolrExtractRequest::LITERALS_PREFIX . 'id', 'doc1') // capture what is inside paragraph tags ->set(SolrExtractRequest::CAPTURE_ELEMENTS, 'p') // Indexes attributes of the Tika XHTML elements into separate fields ->set(SolrExtractRequest::CAPTURE_ATTRIBUTES, 'true') // map p content to solr field ->set( SolrExtractRequest::FIELD_MAPPING_PREFIX . 'p', 'an_indexed_field_name_that_holds_paragraphs' ) // capture unmapped content here ->set(SolrExtractRequest::DEFAULT_FIELD, '__text__') // restrict capturing to matching xpath expression ->set( SolrExtractRequest::XPATH_EXPRESSION, '/xhtml:html/xhtml:body/xhtml:div//node()' ) ; // please reference docs/documentation.php for the rest of the parameters $extractRequest = SolrExtractRequest::createFromFile('path/to/file.html', $extractParams); $response = $client->sendUpdateStream($extractRequest); solr-2.8.1/examples/update_stream_payload.php0000664000175000017500000000211415001737315020324 0ustar biggibiggiset(SolrExtractRequest::LITERALS_PREFIX . 'id', 'doc1') // capture what is inside paragraph tags ->set(SolrExtractRequest::CAPTURE_ELEMENTS, 'p') // Indexes attributes of the Tika XHTML elements into separate fields ->set(SolrExtractRequest::CAPTURE_ATTRIBUTES, 'true') // map p content to solr field ->set( SolrExtractRequest::FIELD_MAPPING_PREFIX . 'p', 'an_indexed_field_name_that_holds_paragraphs' ) // capture unmapped content here ->set(SolrExtractRequest::DEFAULT_FIELD, '__text__') // restrict capturing to matching xpath expression ->set( SolrExtractRequest::XPATH_EXPRESSION, '/xhtml:html/xhtml:body/xhtml:div//node()' ) ; $binContent = file_get_contents('somefile.pdf'); // please reference docs/documentation.php for the rest of the parameters $extractRequest = SolrExtractRequest::createFromStream($binContent, 'application/pdf', $extractParams); $response = $client->sendUpdateStream($extractRequest); solr-2.8.1/examples/solrinputdocument_update_partial.php0000664000175000017500000000111615001737315022633 0ustar biggibiggiaddField('id', 'my_long_doc_id'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_ADD, 'newly added value'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVE, 'remove me please'); $doc->updateField('field3_i', SolrInputDocument::UPDATE_MODIFIER_INC, 5); $doc->updateField('field2_s', SolrInputDocument::UPDATE_MODIFIER_SET, 'updated string'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVEREGEX, '[\d]{2}/[\d]{2}/[\d]{4}'); $response = $client->addDocument($doc); $client->commit();solr-2.8.1/tests/files/bug67394.json0000664000175000017500000000143515001737315015765 0ustar biggibiggi{ "responseHeader": { "status": 0, "QTime": 5, "params": { "fl": "date", "indent": "true", "start": "0", "stats": "true", "stats.field": "date", "q": "bahruz", "_": "1402067668264", "wt": "json", "rows": "1" } }, "response": { "numFound": 1039, "start": 0, "docs": [ { "date": "2012-10-10T15:05:18Z" } ] }, "stats": { "stats_fields": { "date": { "min": "2011-10-20T11:16:34Z", "max": "2014-06-04T13:41:45Z", "count": 1039, "missing": 0, "sum": "47085-11-30T17:59:27.999Z", "mean": "2013-06-03T17:17:43.684Z", "sumOfSquares": -234260129500201700000, "stddev": "NaN", "facets": {} } } } } solr-2.8.1/tests/files/bug67394.xml0000664000175000017500000000120215001737315015604 0ustar biggibiggi 0 72 0 0 0.0 0.0 NaN 0.0 solr-2.8.1/tests/files/extract_file.1.pdf0000664000175000017500000151751215001737315017214 0ustar biggibiggi%PDF-1.3 %Çì¢ 30 0 obj <> stream xœí}Ý“%·mïûüS÷%NUö¸ùM&O7‰ã›”]ql¥’‡¼Ø+Kr¼+Ù’%Çùë/~º›=žÃÓ{feY›T¢¦› ‚ˆ/òüþqº8ÿ8áç¼~ûðû‡þÜ·ÇO¿zø7ú7o’›ð7òœ'ü{ùÇ<~þà?¥ÿûÍC¬%\ByLÕ·K¬ô®‹!_b^0o3¹K Æz§E‚SÙÂÍ?¾~ Ð]rbC¿yˆ>_rëŸ<ÔKÀÿ<þñ!>þ”(ùú¿ÿ~˜.m¢‰]2ÿó¿Oâ\‡ùņŽ/‰QÉùK#:šK—˜Žš/%-˜7‚©üL¾„Ç ˜s—‹  ˜ä ãÃÅ<á.ár)x£øKÄD gÚcN‡út™"=AS,NÆ,p¢¦ˆ™à ÂD <¨dÐeÀîâªÀó¦]’•ˆãàf-—"òt©XºJÜÀ`ÿ݃H¼Q2Qk¸ð,ˆyY`8ð¬j —Iç.) &ɹØôYŽxI< âK^o1éŠÑH.M´ôüé’àzIL4ý7ò4a” _(2Gš[Æ3­˜8£IÊ0^j—‚I»&Ð %° ¢Ækë œ§ÿN¼2Ç+(#&%0˜a¡(– 9˜1Ì·ìº7ˆ ^áIØ@‹yÌÄK¡tX܈ØNFë¥ ÛˆãM¤‹¿ÂKúT¨_“Vò3‘=¾N‚ž¼ÎŒ¤´fæ~š.Ñ=Åðì\„n1ÆÉÀLhrÊ®Œ©ì/S¸ÈÔR¾€2ïyARÖ™’œ{†^$˜Æg~ÓÁPXBV>Až§† é’Y/¦‹ OIàÈŒBÁI˜™TŒ5‰¤Ý%,‹\ÁH!!̼U„“ov¼}Ãün"¹úaâ7™h–m *ÓX(2lèwaAÍô¯‰ß/þ{f1o¤$L•àØŠ²Å ÷ʲª û•s¯wSzóð=ó*L¦Å*CxfŒVŒ´ÂÉDÔÐý<ê¤Æ‘¬ øMê#ö—Nð̈eÅhÉ”¶ðÌRi¢ô¤Ó5á v¹Sú,zÁHQ&ɼ^ñRASÐTÐcQði{æOГO0›ÙX&LŠd {‘Šªì'k æ`0`˜¿›©pJÏ B WåÏ£°à?°SkK“–ý.µ*ÛÑX¡--ï³à¶ ƶrÝê0¬WžEƒ½a˜7\‚‹ð!ºóFܱQçí‚á4ïñq#ELO¦?‰‘mPÈ™wÞIòÌ+­*÷J »B4»…u™L;ó‹f‹Í$“ÅnE`Ïâ ŒS~8ðøàœ@(jËŸñX™—!V1)Q]]øË/`#œ—€ÀyɈvIËúòÓI·ÏÈ~>Ç{[%ä¼ &€ ïAxMëóŠõ N0MhÂ_0)âRœWƒY’eE_?aþ¬´ÄKWDõIŰ U4b1 11µÊšÂ0›ÝLfš÷i–AP–EZ QÁÒQVÆ6Á*¾{!‰%®$¶ÜM–¦TðF,Ø¢ÁP‘ÄÄ"SØøÒÛ®›Üä{U•¾Î‹;u;ý<¼1<ñƒ½Å\gý[0…](â-bLF?AÜ_‹ » F~"Š@fÇâWÈ ±«"0½Q¦¨fh~þd±9Ù©DÚW\ K‚™U Cã y/I÷q¨ í‹.õzT¼:]²1œu?ÃJ潋àèd Ùš ÉØ m$Å‹ÜÂÛ\Õ‘ŒUè$)H‚i鱃Yn™Î©,RÊo¬~‰ÓéÅK";—•ò´x9žé(¼>ì+`›¾AϱÁ´–­ ¦²ˆw×hFV4ÍÎA†L°¦‹"xW&Pƒ/€ÓÆëÎðyÛ‚y³ÅðÆÜÁ5 œt^b…!‰Nvr¶Rbƒ±mgÕh– rÖq`‚ZKõe«gL„‘c ;xÔâÔU4Š×”Iér]‰ °9ñ°1V×Ai&{½4‹…„šÄ“ 3“˰‰©‹‰á} Ð6 W ö3sÌWhewÎ9 J›Úcë;¥ì‚Úbê¡<Ä^Äv²áq‡˜ÄZ_ªÊÖCtÕºùv.âvÏÏ@”eë*P× »Y$‚çY²Ë@£:^lË"¦À„º`.Q ¨ í+‹³!*™«(Pæ¿ðW³+~—à$_…©"ÔPxQ¸TY,Ù‰Åqv’v0ÓT‚Z§ öÀI ,‡éO“¸B|6>o%ùò³Ï[á«v>o%au½Ï[uuY+y€±óy«“xtõy+²*Á™] y¯b<û¼@äÎçœ:ŸpÜø¼O¦ÄÛg¥ ¨¦Þç­´qø®>o%w‘•^^̤¸Þë-ØÃêõ2-¯^o¡(\Ãõz!Ò³ˆ#cÛ¯^o%­›ÄdÜêôÖ9Ü›ÞJ®;,‹Ó[cwPÞJ;pX}ÞJQ½Ï[½»¬Nð æ»¼óœ@pûÜû¼•vŠØVŸKÌ>’8½axè^¬‡K«Ó[!Kso@˜Zïôöض CV§°‹½Ó‹õu§˜Ð9½€Kçô²DlÞF†¬ª°J¼ BÐÐG†mÄ`÷×G®®‡«È7ä˜ùÑHÃ@\/^v<˜åFNï€ÄÈêäÏr•‘!Û¥,d—¸ÒË ˜ˆ_0¬çÅ“™“ t–Îʓ環f=FcoŸVDá‚ZÂ’…²ÊÊ×àaÀôIjÍ/€-žg$¢o8UDÁ`é°3Ö…TA*7;nT4#„­¾ƒž’zY úP^üBÂø)«q'U÷ ŒœwaeáN‡ñ"ÆA‰§ãÝU3+Ý$6®õ#/ªÃLEò.+Ýuê풺׳‡FÎt³‡F@”°xh'Í–ª‹F˜"V=,›Ð!. –פ£ºh„©¼Ç‰‡æ¹H×÷ t¥sÑ3åÅE#x’t¢¸h ×Õ!{½›¯Oh™ýÎÅE#L¹¬­i”¢xhD椉hõÐHgïqê¡ù@ÂÍVI<4ZM¨ªƒF¢­VµÈÔɸÅAcÎùØ9h<•Xà&oˆ‡F4M©‡F“˜XÔC#ØK…E\4‚cç1÷³Tdf1R‚‹F`’¬…¸h Kb3Ì ’ƒx»â¢ìò‹FÓªš4S×#ùÅE#FV‰ÄE£¿Oš£PmƒÉEžà`E\4†Sç¡ÑJŸG( W-5L¢q¢€® Û2¯)ÛØŽª¯¥‰½KQkáâ龦JxâðÀ£š›ç ¬GatÒ­Z6¬”§GÍ)zVåeÎ¥z.Êé`®ÊÓ™£}-Å.08 .Ìo $¢¼‘– ²ò˜N*y4ëŒ7à|hMˆóÝg¶ÀÈö㉨5z‚߈s ¥ ͘¢V¶0§é§éž²é5¼ <3iî2³ŽD|N'®'ïd®ŽKAäh kÑÇenR2çFÿ¼Öv¡èQz“,/ˆ2§ y®l×3w•07&­WLI¸1û€Ì'‚++×8œÀ¢UÕýï‘§CÚ‘Ðäá6˜¦±ßâ"'U€ƒ¢½ïÊ5ÁD©#„[Ië8ÃŒ 22Û•Ÿº£jË´Iû ñÒ\ûÏ  Ûò£YÈ6{½YÈXOp 0çŤÒÀpÉâ;HLŒoË~I°®„:UøªìmNzB<ª¿I囪¤YÕ‘öCÏ5PÝÅ7Ì‘ÃT–:’†×ÚŸGq‹Ý„¦¥úVÝpÕAç6˜\z…÷PŸb¤":AÖã5‘ÜXåA9’Ì’Áse}! jB9R¢AäZÌuë*n-¬êù\{-+Éö±pŒ`­Ãä7‚Ö”¹>.«_Åë_cÔ,dgž§[¼“d튡¨#æÍŒ·ãp,À•¥ÐÇj…„ÐmR™„\bè“$½ÄjOÆáxª4MC,ñTY"šå=Âø5ïð–ZG, ×Ô ²Ñ‰eEòßkaJMB.ñ`Û÷Š»\H©%çÎkŠÔ>ï--HM˜1“víy<0I *ôð$•iƈÿÇ΋Gõ@}ÒÈ:‘šÒÔ£/Y“ͰÃOMºr~Žç”´ M°Ibúc‘${Ès#¸­Y[6]Ûq[0`4Ê\ê´‚OMó|ð“1MTÖØ³N0R¢j“\æèÁ#Åîu_N ¡›Xß {S´×Ÿð“€…Ý_‚畘7ö2§b5‚Uˆ*Õ¨Á-yn¹šS$,c1GÀÊT‹xÐÀ“¬Z ²ü$ƒ\Dƒû…Š'¶À"¢® ˜YlgÆVuC"~ê§Õ€P7˜PÅ»’¶3ÆÌ3š<ñ<ÛQDn«¡$è‚a­¾À³a`×8È s=VDŸ¿×Ä™%óäQÃHs¯ŸÛšNb/fÜ× Ò«µÖPXª0ÛR™»T7WÝb³#ZHOËê‹zyúÒ†Ëb/ 1a“6d¯²O¤zº] ®%§ÞÎ=‡ÇFÂ~(l:Û"õNØvsµÚ7Mc³5O‚Ñ€?q÷*còò ÌA›£Ü.¢5Iû]=ò¡"D‰/uhÀsiUÞ˜{´¸š¨³¥_¦FFgÊ[Œc§B;NÃ_K¶> .`i¹ÑVTºn8'ÌpRÏ)LÀÒ.3éLëÐôÇ2€¿øí¤œ€n'4ÆÅÚJPÒfßyòTÛ©/$…AQœÈfS£äæjä”×LÃR,àuŬK½ÀZQDC#;,Bn!ˆU˜JžÎÝ[„ñbÜçö-¸ÞÍfŒ,ž¶o…)k¯éJ@=¢i΃ÝÆLksÁÓR棕IR Ëßñüæe%ˆ•Þ->Ï1aTâ$OE°W“=v‚533÷o&iôÁý[<¦7щD`]R“NbNciaª´¹Ì \¥§˜ˆ‰!P˜?o >® \[þKzÜ\â\nà"Œ†ý’6 ¨à$mñŠ˜mÈEÓª‡%qš4újB,®SÁ¡¨z/-\'ß´…+L{еƒ+L~”9„!¸hvRžöI}.T»œúj!È÷ª¬«,@?DZ¸–9h ó2?®\+‚{OljdB^K=J{¸X’'­ìD~"Šk*-YaªÚ:÷p&jáa~BƒÚ.´¹‰+ ¾å´­+a%š†¤ÒÄE°ö%ÎM\ÁMܼ²*—¤fI¤ÎªnXlÀszŽ·AÂLZô樊>RU–ùã sEp6[Œis × ²à2‘bHµƒ‹1a«˜J¿ôe¥{.ÉñNF™›×¯è s‰@@¸HDš4CIÁI‹ÚÀŘ iˆÉËNÛ­ŒZÐ.Š ŽÚÁµÁdV•®Qà¨y‘Ix•£fF*›<Ÿá.–3öZæ.Ñr­‚µ˜ˆ--\¬çMËßlòHÅ­C¾EDóqmá"D’úƒÐP’ö“³Î1<çä”hÂDM<.$ˆI`!g¤´ãEF²t'¬\´ \DY¼—à¼ôA/1YpQ«“{Œø…ŒQŸÇñæF°–w¥O;¸¹)§_ ÏIÚã=Ÿë 0I)Òs MðÜøÔÜ»E¶HÐé=z‚`šbesgEpee}aâ&D†%kà?ð´[fvÁ˜ìÒ6˜¤2貃pöÛŸâªF‹ M{UK‡*Œ°.VÍg²|ƒ“nûY[˜ È.Jû†fÝv’?G°$¼ QËN Ù›ef/Àãâây½B;ÃwÍõpûz=íÀŠIßáj°ŠR‹Dü|xF*—EÅ`WQne Õ¸XÜ·!LÔ&P Õð•imñdØõÇmÂR^ÖXm…ÅïÌI±%X¦ôÇmœÏþmVʵ¯Á··õ¸˜“þ¸ ¦_ÛTóz܆¤FŽ­Ñ0eu žcCî£5ôÓ”>X뙕eá EÍx­¡Z„;±œ¶ sʪAÊRêC5`JÚf‘»5T‹AŽ™Ï¡àºDj,—ýiÆ´ÖÑ´å@b5À›PÛoºÓ6lY\\C5Àm=m#Vf{Ú†öç¨6Nû›È)¨KÚ ð° "ˆé`8]=¬ZÛd&ÚßÒ|EƒnišëïÚßøD[0»¥# +€³Ó^»æ¸¿) Rµ†øù\+÷7ñóIK¡jCéÆù÷ÜV?ßôšá'¦ª©+ë8.guW¢-ÅÅq“áÄTn2ÜàpŒßin™œ˜=Nu™œˆe.ür!œžÏ+"Ñu=;ÇÂQ“Úrío ¸–÷~nobpšÅ Ò ×'B4Í£s}1KHÉ=ND£žÐ×'r‘¢ºŠÜâЙ ÒŽ'ƒ §¶8uî÷a¸hÂ$êzŠ.ëz5ZµÃiƒÉ¼MOÞÍR³ÂA¥¤jVA<9H‰4vqŸ/!ìsŸ/¡ΊHêÜõ• Uû¦¸Í‰0IÀ7‘»iN¡r›ÿ½mi‚¡[çÅß(sÄUÊ4˜—- ’ÛæED†¼4«všy3ˆY†Ðl2ßm"y>iÛ­v9\îPæSóôe&5T‚ÅJ~\µË‰I=aér Ü£=‚#„ºœ!? râµGi‚–ù¤;6w9±Ö=bEr«æ)¥Ë) “J‚&–á9'?‰5Æá áyk+qÕô&pšÕRúfº®2|è#J}'IHµjŸß‚)óÙÚ9Œ}2»s©M’Ñœ{ £ýÓKlË}Mm‹‘ˆ¥sàé8œb® ­il\òúJ`ÈAÿãž&žŒÃc£Ç…£·¹6p×è´4Hˆµ¬Ç¥AÂÈÁƒ¥4ø„µôÇpr[¸­¥CZ@t¶„þ‰¨ùq) ¬u›¹4Ș¬Ž —™Ôù†Q‰œõàO‡‘Îç¹2Ȉ 7Éh-g™äæ»lÄ©¦t©Àq­û1ì5yÄ…AÆÔÔ?¡å´e„¤ßú¤ohm0àÔ¼\Ó£µÁ€kúÒ`À±ðM±Ñj® Ò0Rs”Ò`Ȥ_Q ˆ¸ËGK…âàc¡ÊŠY—zµü8—E‚Êã¦4XÈÎmŽ…â´S› Pœ*è‚™[¤}2 +Ž›6]°Â GœúmÚ‘y‰K,’ÐÁã´úßa$äå«—¢`dYiÔž·ó _¢K'm0Ü\ðö i*…7Ø‚î<&¾t"“=…Pðõoë~A„ª¥'Ü °%=¬RxnÃз³“䪎>ƒ¯p6wZ8öÚÞ38è*4˜¸‘0Š9sÙ]áÅyPUýÌS£7¡¹G‚qÄnZÿ ñì|ý&¹áHóÉ-4„©IÍpžpjçQßÌ(:ò ÒÄHäˆç3‚èwç¼×NàRÐ4œiDƒ³…ûÞ´,IæÙIW}Ëœn™]ƒ¬½ŒÉk‚Rr-س±É¹‚ JŒîîIMHÂòN•å8ë§Àežñæš‚TÕ›Æî¤Û³BÒ¸óÙëÙ‘„‡&‡ 0r£¸éŽžC ¾Ÿ|J²UÁå§Àþè¤g÷¢œÐÞ°‰õØôX/¶ $ÖŠ¢ZN°ŠÌ:½£ªôU½6Ùa¶:8:ÉJÜW«NWlqÓ »„•³úh1ÖSsÞ ¶þ‰“Ò•÷R”—É©ÊÓÄq9ÜÞ H‹Iòq„®fd¶Aoã4;u`OSµeUÉÃøs•›\‘j .«ã‡3VŒÇfë ÷Ñu-­*¿Þ0›2>ø„Ÿ8‹6W¦06É;g®[d®`#gYà{_2NÖ±à9éåÆÕ…“…Û‡±gñôP5£ça¼¼Íž®ÖaIŒØe3κB lþmjì4ã]ŽG"§ìrÖBSà&®œµFä«Dè¤tÿ  Û_T ɼ`Š …$kŠ‘ƒŸÀd¿9r™9Ï÷UÄ&Å™Ïø>+–Ž®ˆI“füJP»(ÛVÖdITç°IÕ*U½¬)Œ‰æÑ$‡m8«Œ6¬3Ü©–4úAIïý˜¸13g§Õï&Ábž¿êØ ²£g;è3Y¸ÍßfÎæ¤íSUâ²Â—µƒêP€GŽ»Þ<à’"¨M‡Á=Ì‚6I Ì©ÀØMbܽ˜üiâ,X˜•ƒâãÕ7ÄEußÒg5#‚´;Èðzns†wº­â.w„ô0œ1Pé¼\/YP#aºÇ·hö¤°óàD,nd G °çr!÷†öÒT:nM÷xåóÈ âÍ®¿pü„ãƒÀ 2Õc _•¸b Ç ó‚kGxÒBT!=-jåŽì-ÆIµmæVÕ«âfXUHÙýæ)ÿùZÏ$÷òUN¿e˜õ¬ñÙ_nŸ€¶íÊ!ªØ:ÉŽ7?ÎnB|™¢Æem¸%AÍ™<­}Ÿ…m g©ÕxÕã4NcÃW.Vm6ÃÎFâ5“Z8 Ô^Xe‘z*ê ±ÛŠiνP´cð톢3¤t|³AÁ‰†3}²Sqª¦ÜÕÙd¦]·Í·ä,±5ßÚ€@î3AEäŠC­»’)3Â5#²X.é¿pgÀ8ÜÓDO{X“2ìV›M’œ€A/Ñ#Óë|,zi[¨I»L"_ç¢e2HÏÁøË7‰·Åu ¤¶œR\!Ž‘k*ˆ¢Ç«öã².HÞ*†¯^7±ž“Χ¯Ëã|~œÛpµg#2-r¥ª-|ß*f‰§™ Õ“ý‰ Û9ßâáeÝ0µ¨§ÊowåZÏ*‹„‹EØÃ)sóH`¤/šáãǽ9±Yh§˜*î½ý *T僪ªÊgÃq¿sìtn²qþÜ%qØ›ï´ÄM‹Ájâ–ûXDOÖ‹TQÚS¹€%šâ¸uÑú@Y4…HÐ;EU˜ä´èÊ®Êâ¦%âPma¢¸Ý\ÔÅMiZîiÃ-–è-dïoÖ‡Þ¼(ŒC“;Ö¢0MzµS“3«‹C3‚\ÕžœïEa@-ÛQ˜&é§YcÐtžS§1e1.ü>âÂÃ&2­ƒà¤,*Ñ–“ ¬0KWB§1̯²h ¯€\ŒÌ*ã@Õ|± ë a¼v±Ò,mãª54‚Tlµ!Œ\¡£zã›É=>|Á®±áOÌšÓÈ“š&kN“’ê¬9­Êõ;‹æ4ÄöyÑ€rÁk@ß:ÍÑûèVÍi豋ê à™+ GVÒmæƒæ|Мšs»æ`×qHÜ9ÝÒ‹™óA¯ŽdÌ›#ݤÌ)(‡üݤ”ðÈ„I2jàLƒsšO§p#¤ ÚáãùÞÐó¾(ÿÐú¢»YX-£+8ÈZÉ-„hžôx*Óä(‘ÚÀ^ßóì^d¾êƒ¿È!¹\C4%É+f¯¿€„+ë r Êëaëħ:– xC—Œê>9¾uNÎ푊d½Ô·[± ¶`\+¢g““*}·-þïŒ ’”©Ü{ǃ²7Êw+÷òñT˜Ý¨ÝË‚D½ƒU:g7Q«>aòYŽÜ¢»Nø›õƊƧoÎÒ Ó¸”I°z_Mû`Úv9¹Y¹åÐyé£!îÜ|ÈW‰pË}®Jß`ÃM¿-ÎòŒ¢65$Bð´4–pˆ-lïÇàVÀum^¯Cã[!×A% 77NhÏàïsáYä¾,RÎÉæºðA>è‚î øß?Î?]ƒ_ØéÿýúíãßôðßçÛãGŸ Õ*N4â†fñ½}øÁã_ôßèyýà_éÿûˆþöõ)¢rõÑÇ?ø "Ï×ÊŒúõ%’„FbAýnÿÔÇ{Ô'ûÛþ)F!yA>Š¢Ò_É‹)£iTP_ïÇú¼H~yO‚úÃ~¬ãiGb×üâCsã×—òT­)Õãá ®s|½ç„1Gƒ_©¯ötœøPh»qÙßE¶(CþfO„Aýiº~tðâa:-ä3$L¿Üõùäcýb?mž#Jæ¡Ì¨O÷c}¾'â—û§ æ|}  (e& ÚõÑ`á˜ä ùö‹†«}¬Cý‹' " ­ýb?Ç·@Ú:#EÝ5Ù>õfOªÁÂӆϘ¶AªA„±Ú†È¶Ðrƒ«†nc"gŒõ'™cŒ5u$Ц íG74Ô`ª!%ÆUJbŠñ28h¬†±þÆþÕ1Óõ«!‘8ÖªŽÏ†gb‰1ÃT¬7^üõžxƒƒÆší‰¿ ™ñÞ£ŽãzGb«¯¤‘ü9—b+Ô†¼~³£×Xcž7öS7æi¼gì`†…sE •óÉ ?jŒˆ±]ú“½éÿ".:^ _(Èö©1õ3ÄîO{"Œ9cÝÝHoͨ±»=ïop­®::c®Õs®Že˜÷½¢kf¨ÿ~3<CêÑO³ÆPvƒÒ1ž)è™-Ó ÂØbŽuãy¦Þ \£~ûÓÐu56Ö±W°ÛE·¬7´ø´ç;&—Æð†úÑuÖß;ÚðôÑã¿=L—<ÁVñï¯À—ŸŽ$|ÊQÂ'OmNøǼ Wõ&w+£7Äâ2“GšÀãÝv¢J~µ#ÝÆ1 ÿÛÝJ»'W‚µ± ñȱ¹DìÅì…·"c,c6<C+Çl·ñEÃc9rˆ¶_<Öð+þƒ±Ø†åË>»ØMÑô]²Æ¢ü2$Î@޹ Nëhl‰¿ß¿hØÒ±í&/öyE3Ò|#Ž|Š«ÉcÆÂðÓÖkÌ76Éw+\eáóI„Íboår̃Ëÿ£ bóižö?í7˱e,à³hï'"ê‡?ÎRô21–¥“Õ#³ºÍ" m˜†yÛŒòÆéDÀQÐw5I5¶s2nH‰¡†­:¢þU’ëé_É1¯q+`ºaÆJNgÝî{ºþ78gªcÒs“½ê ¹ïf¯¶òzÚ‘6Ò¿Cð‘s²¥ôtä, GB•[ÇÕØÛ7îãtv?–!p7íåýXÿG¤¿!sÍ_½š<3}Æ=÷ç„!$Fe䞉CÍÆÒð©c¹ƒÔ³¥¡@ÆZ¹ßÛµ6¤~,3k(ÂX 2ÖðnßêO«ñŸSAðJõ×`ôe§"‰³LtFèËnLȰ^cÁüXo„A½‘Û³‡ÊiÆP»ÆêsEgd";n.ß 5§ÓCFæ+ÝËæXlxÚo×±¤Â˜l޵€Ü3@=Ä«îʘ L+s¿ÿN±±þC¼Æ¶Ã±n’Ófô¨5áª&ë8–Aøí]÷Œ'ŽðNz ²µcÛïq=øŠwwœâ¾:{Ôpm¨ÓηÓ6ooÖt®¼ÇtNïeÿ)OÕ†K"-ÐX7À?ìMñ»Ž¢£í‹F£Ç÷c}$ê£ý1‘0Œ1m1rrÇ…ä+ͤc¤îõÚH´ï-ãXê~¬Ú<Ö 9»h|÷Éó=[†914ät—¦±âÿ;bb†:»nˆ£¯æ¿ 3†7v¯›¸õíö .ŽéíQcí“ü¾]ω{úv/Ü¥ýÂ+tÓö~%Y0¶íœ5¶cexÃ/8Ý_tƒG»%Õðh‡ Ú Ä„/gšg°æxO»²m%Í® ½BÝÔ³5ÖÑqÏúJBiÌ=ЩÑ(qÄ lY?fŸ ßñùºÀ3ôMGþFlý™#7T"®îzïfŒ_%ùÁšÎ»»·E>ôÝÓ%Û [y5&4æ¥1Ø{QÉ+} §WcŒ7ccí§h<4Ö¤bäÍïÙ¯wÏCY/ÛvyTƒ¹š35DÐ`—1–ÁzƒˆË^,_ºÅ÷ÇÆún-ÆGÇj·/þæÀø–Û•«çKÌV6Œ%ªŽ[koßçÇrƆy·ceOCŽOûÀÇü2"å+Ñš¡&êØƒ?Y…¾j{Ʋe†Li)ìœî/¹ç„Î6àŽåÝÇ®v¸©p|E_Œ/þí!©g+ž}ÊÈè–K"Üóì÷¡÷y,‹{ÚªŽ%]DzncDïÿÝ¡í½â{Wç¯ô^eO¯gÇ#Ï{tSŸ¹âœãºèíBx¶®7Ƈ1Ãþwöì~Ü Äp¥ x¬­Å˜ÃX4fÌO7ž…é±. ƒ·†ùøín}ǪcÉËÄîLû rgºjßäîåZa†öä;æ îy¼êžMíÿoÏÀö ü©HjÀÛ*ê'Cßá…ýWAµâ3©c¬ÿúÁôŽ]´0–«[È¡Vôÿúë=õcúrÏŠ“áŠÙñ3ÛôØöô~ê1¾Æ8õ@ÕKmÏ´£ó®w:£:v’±/m&ßR‘ëð”ç;·VŒÝ„ç}ű{/Ž2£gúÞn¸Rðÿä¨÷}ÏïéŠÕXšû¦hí[m¹§K?ÖR2Ö¨ixº7ˆ°aGïän=¯¦×bç3~C⌀û^ p¥ž0£ŽUVŽ—ãJÂkÌÝ3ó7æìŽ6ºÓ•c] oÆŽ ÞÐB¼}q¬ÿÒU𨸧àPž8ºÌsKZ·>ø|:µ­,|½Q%†¤£lÒ€W;^¶–Óø;fíÅW¯’{áZÎiisõƒócÓ>>qûÆXcîìØm•ïã–°ûÜ=rO39–l;¹'Þè¼y‹\¯jÛÐOߌ9æ]¶=~ÍÁU'l,¬{·Ã£c¥œ3QÅé ö=û–Æ*Åc2Cý€aì*Á›ŠÇ··úNËóç=žQmCLÆÎQ¤yN?üy¤½Ú¯Ûwëüœê6[·Ã¯)m~àड़,7ñO…Dü~CfŒ$êg{ÔéÒÝ ·÷Ýé>tÃs4\»£63íl_ ÍÑ@)½ËùÕ¥0<ÚÓëøÉžÆßì_4Púbß·ûG1ÉS Å/‡áÈîþõ§ïº¹SPðÕ5vÇñ½Âè±>#cŽÇwûipÜun4aô/Ì1èâž•[#¦£Ø²Ò×z³w§P6:uFþ©•ÿàƒÿWæœÓ4sAw¡\Ûd4sÅž}Û§Þ.ú³ q¯ŽÕmän»`([ô3/~¾ÿâWû±~½ª‹&ËM¤œ0ˆ0¨7^üdÿ”ñ¢A½Áû_íŸ2^üx¥/’·àëñS©oöü[´ßîÍXGIÚ»ˆrÄÕý‹õÇKYÖg•‹ÝMb`±ñ”!±Ÿí_uã‹# vÿýN› !3P·Ç´Ù`„Žå§êüµ•køA0]¹W?éšAúÝ!ªQc¢cZnpÖÐ̱á±þqH8?’ƒúÓÒ³gýY†úŽ~ce Zzl ~X=õ¦à{ P,¹L{ýñ‹ÆbÓ6DÅX€1©þÑŽõûÅÛß 3ì¦1é?í­‘1é»ïô¯œ/DZî-ÛÞÕ:–º+›¯ñÙ±ýø—wËXpcåÆä©Ë†<£ö?Û1Õ ëŸöú14”Á-ÃüÝfŸê¥ÔÖÛ§ýž=f<ÇŽ¡yŽ CPn2uè rÇ_‹(ŒáºêØÍê ÁÆZŽyîcÌÑ®<´à…ã± ”αNk;Ÿ!GZDÊ_r(Ï(cîk y‹€Æ^³Fÿ°W{ÃöIºa³Æ™±°ulëS·CKSñÄ9÷–æŸ÷¯}Ä"ÃŽ…N/Tÿq/c^ó˜í¼ÉÖ\qMÞÕÖôöôØÖ¸¼ök7¦oyz†Ñ©c*ø‡=]cá§¡\Föb,üœSø±f×[·;z {/v, »§ìå. ¨Žå’šs½y0,èØžl¬Õ˜ûpüÔ—ËXƒ.#Î3$mlQî)•Ä¿’æü5GóLžt,Ë;¶Où]Æú¿wÖ«UÉñÒÒ&]e„ÞÆN2–Õ›‚”œNÙ¿ÚÓ5–Ì1´mŒú/öÔ¿p<>¦"§…ß0~Ç9‡~ÚW RǨßoHÆèßìÉ[³¡¸ÀxÏðÆ¢C½Å8Ú^¹ ™W\_C„ IsÒÆ\Ì?‹â‘aïÆ÷ã·wø~¸j̯0¦}ôö,<.WÝMϱýnÌKÌgªaY°|Ÿj*ÆšŒÅ c ½{RºN>æzéKNá¶Tá˜3˜c¤ÖN{N«›!¾÷LkžvUgϱ]Ðits¸e|ä›ýjžîgxÙŒúi§ê_öSÜ“µ¯.ýXÍÎ[ÝMÏÌÙðâ Á˜´û¢fýÑ~4/‘[ÚOzlôý{†´ýçî¡? +w¼±Ur5Êfcû CÇ/-0†˜B÷“¡ás÷c]B½ÓxS^²ßØN*ÿuo) Y2Æ2¶Ò›$îJôeHÜX¸qSmº¯kø°)Ò˜¤W]LåÝç§øªÐ«9ºçkoß¡>Lî_42%§óx§ÃßÓ‚~,Wš)nØâ¶OE&§Kï£6GÁhC×õ÷¬kïYíí˜ñšaÇÆ’„c3üw}œ@9jLv†R7•b{wàt¸zCDörß¡B”A×»‰Ä+?¹‹‹› ÉØˆÇ©ïÞcº{àUWãóöi,mw,0W²þ§ëíwtŽö±ôw­ãr;–\Y¶%ìtk±AëqjéJ?Ö˜39¶þ®)¯±…a'å«!›·!†wŸÐ+Of#ÇM—ïX€h,Ý= ¾)ŠéÍÓ QÌÕªôéÔ˜öXLó鞈1 —;­ ­ÅK‰¾~ÏX#=rÚ†Kg<õ¿{é?mß±Écò×Ê÷¬~f˜-#nxæ ×éœÄ؆v¬å·WìÆ2ic’xäPº 'nÓ£îîštÚºgg—1Ö˜|Çó cêüÂ?c§p FŒ5œiò›š2®z“U¸ÒAo ÿBÉ%Lªï2]Àün»þNgVïž{¾j æÓ>}:xÌà¾ÿsÇ åþLÚýHrš6•ÃÇ1ˆ;Þ¯¯¬ÜéÞ¨ÃJt—0–ÈÞ¥t쨗±&7*é}®{v#ëtº©ð¦L³wë/nÞtßã•íwu5¿L)ÏJh†ðõ»ùúF’×8li´âŽíaceÚ±Óág¯£ôt˹ §Ï—¿W^¹úelyÇ2…FògÌ3óû±¦!T²ÌßšŒ• n]î à˦Ä÷îÄÐM‹§ª;º/cI±±ìôM¥w¹‰dέ$2Ìáy›r|µã•Ynx{Ù…ûÕNËØØš¾;ü¦«#÷7ŠÞó0Ë?Ævö— nŒ]w¬¨ùÂ×Mu¯'ݦp™B»N¾kq,<¸ç‰Ç›bº+yô±”ÀM×ÔÝ%‹8NùvÆ´Çšðï™óæÇJÑc;Ò ËñÊ%z0]©Q¾}qìÎÁ±gìŽ÷±Dšq²`,%|‹ËšÚ¥¤´qa }ú"³¿âšaðî™/½a»}ŸÙé{özœNž>gl¡w?ÝðÊER‰²±#O Æé+-ŽcèÇLb¼8ŸÜ·«‡ÆÇÎ0ž®K}·÷ñOÆð§usloK6Þ”Ô»Ò£|úá\ü:mÔŸ_Ž3=]cªŒ˜ÒX1 ×ch9}Ûúé>C>n*¸öž˜1ÖXàs:~yÿGuÞ­†3q{Jò…ÅÓí_<Î*÷êj¹Q·l~‡B~m\ømˆÅ^ ’÷ÎêÙ—²¾M›hyËÛÇe6N˜£Ùä·„ö/îG7¨2V®3<–‘šÈJMè³ï­Tˆúð+×È‚ñEü.üH>Ih7iŽ|)´l~ûÝ_rLÓK19ë–û>n÷{;Ô{ÔëýP_/KÆNÄ¡¶ùý³íSŸï‡ÿƒrŽaKi2¦øfõõþ‹o "¾<°}Û ýaÇÔ_}И¢ñ”1Ö7"šµ9ŸŽŸ:&¾Ê`×^Hô—ºcÍ9ð˜5ýÅ0(½‰ƒ¥_ìi0ˆ78¿_DCÉ ªŒ¡~& Kfb¹Wìã!²Úþ©¶ÿb:$¢#þ«AkÇŒ74ÊX±ãYŸe|÷ÞÏö„â`Œn.c††áêfx,Y—‹Ä›-þ÷ÿÀó¤fendstream endobj 31 0 obj 14422 endobj 47 0 obj <> stream xœì½Iޤ9²&¸·Sè ´9'èU/ªzQptf`VÀ뢷oŠ|ŸpRóÌÈ–1•#p*ùIÊH¡ð?îéÃÃÉöÇ··ÿxû?þk*¿ÿoÿeü-…oÙõþÌmüý>ÿ.yü›Ò(qÛßÿíñ?ßüãïãÿÿñ½&_9Çðôé‘RõOßÞ•úŒáñÿþ?oÓAfÅèó3ñRmáY ~7¸Äîž1Žk±Jþû1t¨­>s=¸ðŒcÈèŸ%LJùSÅС‡ötõWŠ®¤gmœb|¦ŒJãS}ßÐ=+ÅØžÁŸ•¤§£RªéÙÓ?©TS{ÆòO*çŸÙ?JÓÒÊY©å³§\©µüü'%çÇ4]—Êç(ýã¹´ø‡•ÊXÛRþI¥Öü3þã:É ¨ü”’Ïíe£ÈÇí•Æ÷Ç8vÛÿzKÿklw?á¿þŸs“•ä¢ìþµí ‡Zƶü¿ß¤m(q4û-=CÙë³d¯?6œ{ö¶Õ²’½ÖB)ú^ŸÕïõYò9c¯¦g {}–X(­îßf%ßÁ¢¸*;h«Ï’ï`QSzæº×gÉ–y«ÄuÿÛ¨«úܺŸâ0Ö~öþV²×O¡{Ùö[-–|‹4¸Šß×ÏJ¾ƒE å¡Vaö‹â,Q,¬–YvØV‹%/XhýÁ˜ã³÷­¾•|ŽEn9G:JN<ßÿe<ÿö+–8÷Âi²“Ý`® æ!¤}T¡Pâ@ZP½«ÈÂ`—´!#›Õ”ØR”?Jôcg?Z.O7¶%Qþém¸šŸUèA„Y`üùÁöÄï0ð½ ŽMPØ[ÈÐ’<È5?Ú`øEPZÞ`§'°6˜ðÕÿÏ:éaé¿ß-?Þ®¾åëÆ^ÊR0p©cìñù©€« *KÇ^²‚…‹´ˆ}aÃ'x`ð ÈU¯È®ê 8˜ô]E‹Õ_v¯ÈQ…ÚÐä„ã)ìK6ôF·£§Ä¿À¢×“¢wöõñv'½÷§sZâEµxˆ3ÀCiÙéÔùv²9†V²aÈ6%ö9áདྷÕÕÛÇÛ=â»–äÀ’±P-]æuËwá0gG8ë,J‰?hÀÚHŸñ„Ýp;ìïo³ÿ ÇsDôß KÆÌB¶6ð¼ÁéîŽðX>Á‘%k­Í›õ¹Áë«æ<–®8ž½}¼Ý#JÿqÔnäÌ‚£0ÂYàA1°/Š#K¶y^²ÏûœðŽÇœÇǽ7จyzš®µÓ}Ýò0c*áØ.ì®wÅ‘%Û<²Íœ7ö¹Á;À1ù¢8ž½}¼Ý#¢ÿZYÒŠâÔ#áo–üí3–lMæ´Éh'\Â9¿^ˉCí JZ&K†=xY1a¢‚×OÁûÓ[­C±Aí\á}” B"u 1DuzÔaE»¬ð ¨2˜÷=Š ²ßkô[šÝm>>i3Ìß±•“÷g‹$¼¨0α-·¡l;í¥‹¯aà6Tµd Ð>Ám‰µ»µX(çCIÝX"(ÄÁ 8óçIä]'Eû«c¯¸&’Ë fÖuºDvq˜1‘‡NXÀ‹]¶Ý †ç€‚áØÅ%ƒ1‘“|_Lx|qƒ7XJ­"kzí^QÜ” [AàäÙ¼ñØÜÝ›àxŽ(8ŽO+Os‡ÌH‰¬{Lcó†p Š-h§^5\)È…±>–ñöéqbñvt–u÷ñ|WexŒÓ©·®j}ަ.·Û‡¦(ŠÖ¬½†gˆŠ£8ÞX2ìb]å¸íq£±K·³3˜Áû€:½¯,Ý Ü õ÷Ô2©§¤(ަ…½6îhj( éŽq›#œïxìÒíîíãíñ]M¥lv‡—i¢¦MѽÂÝ •b8v`4 z¢X ‚Ì¢(.„]T8Ô…Æ.Ü´3?;ûPè·5ž`ØÌRY&¶T „=øŸÏiÊ•oÊsf§=+Š}ÐKªlƱ‹ìr{\hì¢íîìC­;_Ö€ïZ’Œî.Vc,Å‹e¦,ºœ,ºc;K‰†Åì7¿N´S+?ЧÌ !:g_áÐÀ»˜ÃäðÉéRöÁVË¡ $ÒCíïb8¸¨Ÿ*Šu]Ýe±p-ÈÔ #Ç%ÙüÒb1^õÜ$fHùÐEWý€j€©æ}ê£D|“µ­!ùçN½¡ŒeYâñè.Ø…öøím„Īž°|ó`ØŠî0·­…Ø'n—±«Ú~èayl\a50Ì:à¨Ú¿øhF[”ä1cs—!'BOöC[ûáÛ[šuÛû êÐj…á‡A°Æ~8œC®‚TÔT Ëœ7ÕÊÌóW¡þ¢*\ÊÄáŠ{š¸ë· ãß–Ì,Ý>^¦Ç­éÁô¥9}cëÏ iSü,éâ>ñaÂ?¿­’ÁSDylcÛ‰—|Ö§Ù ‚°¬ Š—¿É'Ô õtÒš#®Óó顨}_9ü1QÜG‚Có‹}|¼É!GUoYsåñ Ž˜ÃþCæÎï/ß®ï¨çw”ë;Âùýú޼Ç¿m9Ë¿´œ‚צÁªoŸS >—‹(æ}(Ù>¦cFo]¦,•gÌ©œŽéœŽà(Ä¢È[)‰QKÆZ!5‚c¦Îý\µ¡C·¿äªýkD8¨q[%ñ0î°¬Ì˪Ū«–9«6Ö8è” ÌÊhÝ©(\Ä âá*å\7.Tµ_O¹;WvHV“».þX¸.~ö/Txöcádq^Î']¸¡¥Ösá²þ6jèÞJ»àøcÐÛ0A³Ò²¾’wÇQ0èRàä ±'å‰ëª «½[AÇ:geþ^ìîù^çÜüÿöë,&~Ù×Õ_ë<ÖòeS+ºÎAÃ?öuN°…\Tõæ!–‹^Ta¬´×Iz¾« =·Bܸ°9P&•ëc/©Ä=h 9”ÀBÆì¯¥îrÖr,dþë-dìçBºtpI/ 9–öïÊ¥£;²Ò&ôSÅ §°8tŽ‚²Œâ‡‰ówY#%·±ÎkTâM~/ÄÕþÄõ/é,μ%¶Žž‡µFáh¡kÅ#ë©'×Ûš8Ó€‚¸õ”t•üb>ÃBÖÞ¢¨ç?i {ŠaÓCpöˆXÆ€S ÁÈkŸ^iÊ™kT!ÇQÑÈ5ª=U'5JA~¦Y%c›6ØÒOµ;]|õÒ»_ï[ó.—æ]mõ›­~~œ.—l«Ÿmõ»®¾ mFúDBÀÀÕwÝ(s©&·®~Æê·´§Ìþ¤¸ ëåû ÷·Ëñ$mËI‘âÙì\m8*B gmâÙM« %¤ Ã‚\JÙ{m¶HÄwÀ¾éÂ5~Q©Êús²²öB[»‡ÚÕP¢”9Ë¢ëR×È¥¯—Á5W>^+ß®•¯÷ÊÇså%PâXùr¯<ˆt[ùö²òõ\ù䯕¯×Ê{_ΕOçÊWw¯¼ÛJŽ\ŽÛ‰ßÁù>þ3œOä8œ¾xå2Í=Ãtx†Ñ§çÂ˲x…ñN¬$é³*ln¨“¹÷KPxúÊõ¤¶¶ˆ)Ë!0ö’sâØ¸«BçDkÔf89ñy\bÄAK¯ ÷NXWºIÌ Ɔ¸zÂ^5=,þ]mQFE–ÈÞpí„eD9P%¨‘o….«~ö`Ÿ• ¶|7ÆWÍ,ðM+ç¢í•8‚EO%FI©,Iâ[2oºDô6YüΣ[)©ž%2‘rê–g¯°˜D «Ø’’Y"äˆLÁ$AaçL¸¨ Õk”ØØîN¸¢V9%u‘¶±ã Ä ê_âsK“Y"Ö°MªðÐéÆ?MµÁ‰R£ÐЂ¡­Ë…޾Ñ:ô¹šÌ–Ü|CP…nηT…Ø–®°ð-•DZ GqQŽÐ’lj„‚lUlã„ØÃž&%UGÛ¬%`‘ ËqDËj )¬ HJšµPb*zL£Û¬)(§ "–CX¼n‚*-Ôõ±@QŽã†Â¯‘®£¦^lÙphx u>˜R]ÍARy?·æøi°M¡ßtñòÁ!_±,<“UÙ¥‡LÆÀšFt‰a)]ä ý3Ú&ïB˜ò9ŽQTõs†ÌSíO&1ŒÏ ÷?Ç·/ùœ"b‘Ÿ£2«ª{Çzvªa-̱+‡NÙvUÔ]·€Ë¶ËTRŽ[±«\%œƒÂ)v4£ë™åðI¥}ŠÆ`QCó Òß©i¦hKÜSÃqüwܧ[ÕWLX.œ°qV›—<„åÈ Rçt•„ä•ÿCT&Ì%–È©Ì"\a7 7G8cÂñäŽKUÙ^jHŸúž"µ£ ·FUmzÔ"’š°“[ÿÉ×&cÜÜWÌ™/ µè8’w™[ªcΊ΀•àpwÎZê:‹©s›I Á ’žmNå~ŒiŠ9'cÿzÌ@’¿oJ©*s‡¬ª Ö“%ï Ðkaÿ‹GÂ4w9¢5pf\?tÈû€ÀÈ_?‡M/{=9Îzö§3æ1‡8±×ªA•¯Ô¸«¨)ù`ßï©Ze›Uc‚ZÒ {hN¡1x½é‘èøŒJB 4;UIiڜ̛ÞÏÖ IM=±LùÓiø":ŠTâ|yÄÎä2e!¶'´¨,Fž¸]JfÚùñš¨·-±Á†vcÓ£,ØtÑEdº<¾"Ãnò$s1 ºz{Öã\†ytu$ÌçàÛ†údýú(³×0ë&± *¡Š—#=|ovø.vŒžëZ]îÑ‚>‹¨UW¨öÏŸ†jk¼ôï5K‚Y›ÁplãGöX³oS3Øà1fí eÉÙÐ Vµ?®•ŽüjÒ à>Áàª0œªÛåÊ^K%йÛ8(yƒÓãÆƒ8¶@Wo†ãÑæ°d+Jž ˆj8œÁÁPtìÔ&1Û´ [¸Ø¨ÀxÇVW ÃÙ™m´5 a˜ % =p2ŒÅeéOŠ\*QLÖkhÄ1Y˜dÄB' O êÞV<üü(¢:QÜ;Šû€@1Š˜´`뜱/½Á)àÁ ÑQR  £Í¢Ø‚†'ÆÁkŽD‘A êZŠÞRF×ÄËÕY"nU=p ÜÑ8N®Þ€â6 0,¶Ü«™x"0ζÚѶŸ³µs•(:›UÖ댌=ö㎆-ïÞ P[#âF:J€ŠÑÎ`K'›Ì`f€(©†Z´’Ôl#:ÌæBcÞ÷¶ÀβFuC1ÙäÛ‚ˆý•à˜l:@#¦WL wȘ %݆FÎ@ìÈ‹í¨ìêŠøÍá*ñ‹6©Ëm‹z „¼ágÃÑÑYìˆGƒ•Î6lÜÇq£fÎX½Eìè€À0Ñ:lÀ`:`Œðì¬Ñ@‘ç6Ît÷bö…/.f_8èî'Ç©íÑ›¡ŒhqÀ`óêÀXp÷$k†B…“ÁÙp´iÌG›ÆLm pluáq~Ëo~õi½VæõP‡ÆL™§ÑÚ‚–ÄŽ!ŠÕH‘(VCAUùbfÇöqcqD\Ã}@`è<1’)‰D¯ü‰)8®ÝP4ZˆÁPœ™Ü€S5úŽØœ;G†üæWo‚cCŽøŽ›WÉŽ"°38)ÜlV«L± Å‚~¾ÏbƆƒŠ¿£a"…á,Ggž(®QÄ!T®PšÉ˜úX웲íE蜮Ãñ¦%¶Ð³X %O”'¦ êö{o…(®Q,¶SSœ²¡˜°ÒÉZðô¶P³“ãD¢È<ݸ§ô úq¢a䂨)­kéýªÍb²­+Q¤¹¡§í Ûæ ØœÁZxÛŒÁ0Hƹ£á1mPõ\òqãÁ[Á-ǽ7฽á(qÍŽ›ÓÛq¶½aÞîÑ?sN¥_p¸q,6+꽟m‰;ûdtñÇ‘TâêíãíýÃL^8¥kcºqÔÃeɦ1ò ¢UHíq¢‘ù† ³³Up`≑w;<¤æ…!KÊ>¼Í’ŠÁPâEû…Å‘9çêëãíï]Kj;1Êý„÷<8À06öš*ûÈ%%?fŸ—»}å—ËœLWoo÷ˆèßë\¯¶à|áÈ bmÚÛh`.2ÁøL8ÔljG;TVí­®Þ>VɆ£$~Þq*vSrÂá¢i–hà-ØLA0Ç…ÇìSàxáQÕ_{ó«·U²á˜.z ÌѰåÎÚö -‹–h$\Ð>çÉë ºÙg ׎6<Ê9Wgo÷€.ìéJ +QTØ~Çe:-‘£gU{g /@Ö ‡étãq§Û{ûx»G”þMûZ)ÈÜc¦+láÈ=2jìÃ%–4ôQGÑ–n<î„X{oo÷ˆïš§iÒ]†[>Ÿ+ÓKÔ!˜Ø‡¶¡¯zöÉs“~òÆ«··{Äw-ÉùÄÉõtÙîÉߊeV׊´ñªEÀÇ0û¤3éÄ#ž"æêíãíñ]K‚Ûq’HÊFBœ=ÕYDØ¿…¶)‡ß<áÔ'íÕWoo÷ˆïš¦kÍL´S÷êÇ^ÀUÀ™„¢ZÚ–ôü˜}2þÇKŠšÙ›Š™cD ©]%»²Ã©n÷äÅ6ѳmSYR‘ø&ó…Mv}Õ§‰T˜@øã%µÊûÛ™ž:ë¾c?KìS-ÿ4uX73%g¤ca—ÌS|£ñÅÊÿR{/]úÔµ·—N q{è„/£œÏšüü2‹âÿŽ|+ý/¯¼¼6ùLßtãŸÐGß4~^ï´..pWøõ§Æ¦ÍtiÓz©{tÓ=ÒDvMÅ*\5¹7bzºU|æ-Ôe.´™©ª›LÕ¥úlª¯zõéVÁ»f ÐÐBÀ8ûSÚöuK =:ªT”×X•Šx(¦ÄFä…í„}VØ5*½È}£Ù¸ Æ+M m cæ8û»PØõø½#¬ì>VVn9*ÇT¯±äßÐÐS½‰†,šx!Luß%Š·á¹ï`U½q”°óH:P8¦nïÊHƒÃŒ%ïÈmQ#J|D6 SlņñtjÄž.lˬϼÛäð’’¶‘ÔC¾÷Ùç…Æ±õ¤³¶:ƒnŒ¼ûÖýÌ>©zkP½¶Eêˆzn0½WõZy–‰?y祧®mô¡& è6sáqPïÕòeî#B¯…þå‘NO/κ²'ì‘!ß­3L—rœîhwžp÷ø¸ñ8˜ßÕô÷}Ä÷•÷“ú³êµ¦Çf茰³ìøBŸe²€ª<ÓÐFày"ñ]‡ô¸zƒn¼Ý;Ûzj³ø§7=6CÏ­öbˆøÉ³Ló`ÑŽ904mæÓKÚçÇ!~¯Þ¾qºw´Ç ôÚ>Ÿø+Ðsa 8”g˜p#%|\ʵÙF`+jŸŠGjÛwnÌÕô÷ÜÓÖ¿”{p£{Ud›=’»ÂÉtsä·l³Tñ,Iõgó„Ë­y\Ê·í;ÏÇ¥bX½}¬¤–³) f18dDéóQ]ôÛ'ºhž'GÚBà‰¡ä”¸°øõý×>]õ|ª€×üÐ7™"ÕVÏv}y^qÄ¡Ä<Æ5ýßôÊæo‚êm ¼¾žõL +IÉ™ªC,é¡…f"h·euûú-‹ÄÎÖÍP˜#XŽˆ=“Æ™iÙ rÛóXH¯ÅFTU^JÒ´‚â ÇÑçÇΪîÞ€ã>"smØÄ1Õ†¡¬¹"#iMŽ’É'ï¶‚ ƒ¨/´¸ w,v†w ÷™i#RmȬ-ûGŠ3Ï…W ;!©ÖË(ͶKEzT,Êþ‘Kl^}¼]ý_™7Ê•Ãâq¦¸P’iö„£©öR‚Ð>˜ 2hn«Ë ‰]õ¸;ûx»D .PDn’ÀÇË`hŠ‹ºëÖÃ>£¢aê}lž‡œh#°««Ï]…ÓÞâêíI5ÊÞ¿&©ˆ–¤Â+NÜ÷j d½»ÀßpLŒ:3û!JîѸÚìÌf¨Ÿx슰öf©¡#¦2K€£L¬!ïüHt¹#,·5œZaQò„bVhFÄf¡ëh%™io³OÅ£.ϯ:MŠ»··{Ä÷ëfJ¸â÷Ë'±Êò sy–Ès{’É Ì6òˆa´G ƒ¼bxâ±ÓõÝÛÇKön‹è¢©‰Pžb悎È­y–ŽöÍg %×¾=c(8žxì¼ñîíãí‘ÁoW°Ûh¶f}ã€~Wùå™BX˜h#ãò59íóÆc—0woß ,s$ÕsÒ6ó@Ñ,DJUmy0—]åWÍÈ/Í%ÎÞ ”ÕžŸÓ 97fw€Ð>⇖d ÕaxQ´×b3By‚…ú¼^xhf*ÿ+Ö÷8ïWP«Gàà6õþŒÕé ƒ«›2­ҿbucþ~EøÔ¼zü@ÌOZ ¼ãØ[wíE™üäYwÅ)ï8Ý£¼‰€7òô,61‡Ö,ÉÈl²`¼A<áÂWLµÄ’Ñþm¾ù>Ÿ>Ɖ„‚2˜Nß&äc…û¬ÛÛ…Ì•øc½þ$ëE: ?íO¶p{;Óð–~°«È¹k~€4o3í‚]LÖô RRìî·¸Þçã¹ë™‹Àvï_/¶ž%ƒÙCœ~¸Àž0^§¨–\,Y‚È=óè8ô›®…¦¶Ïx]–"ØÔL….`.…¾°Ê2ù€µËۻ첵¯]ŽZ'ÌåhÛ£«zdÁ7Ykß°ÉsÛ{JÝjdͺáíùfÆ^’Ð"ZÆrÁÍZÄ™Y,¢†ensÀ*X6?8¾ƒÝø.žrÕÐ`‰·ÕdÀ3¯òÞïô‰¤ÁR,áŠ{ˆ\±¦y*ôEdLèOŽ%ur H))V¢ä3v ºˆš­D^ç©„y¬êùŒnÌÇ%žÇÀU8Óg— Þ5¢ÚV‰’oYÏš“|«‘/T"×Ö»è‰ùpú,Yº*á©«íMW%ÉtUÂå‚Ûl±%ÝT8µ‚xgnUãF™z³[i7°O WÚm„3`N6³*íêk² ‘´‹7äÕß¡´ÛÿÚ­F¼Õˆ7ñv#^+‘´4B¼F¬5%>,#ÞlÄIªÉh×íNâF¼ÁˆW•óìžAˆ·‚T»‘*(ñ&#^gÄëA½ÉT|^5‚Àã)ƒ^CƒæZôùŸ®)<@TÈÓI!+1¨Þçפ)Á„egÚf\ÏÉú Œ$’Fú²\ €+Ó8êMA(saÛÓÈ™¹²«>'¥Ø¸lZ±•df ´œvyåÊÌhz4­K*Åø‡þëIà›+9ãʣݶ‘ûá•éè˜)%ixÏÜó¡ä‚'ã%JAHp^ϲÍh:sS¸™™ CîÚãäá ”M؃ˆ›åÀ#ŸÈ̵‰|[gUÓ£IÖzíóŸ=Ó*6"þž[âEçKçKç[c)w×Ä‹î§öîÃÉßr%»Ïè”ÃÉßrx–˜6j*¼äðôéP[RnÊaË,n4ŸÍOµä°åÚ¥ži¼M…/9<+“ÃÁ›RAl,ßÙnœ_dp¾dp¿dp{‘Áù–ÁñE県|M7oäk2Ø».\Œ~íº¯Ñ¯É`&^âÕoÉwD!A¿ÎtãyM)aÎôQ ŒëÅúøI"ÜÚF+9¥;YJ:)˜2qÒ¸ï'¬µIÚ|ƒ¢W›ª—MóvØ"šÙS4ƒdv±¼î&ô=…´©Õ¥‡S%ìÊQOpâïx1M³ÿk u{â;—r~Âñâôq ö“G”Q./Ñ^xD»xD{áõä&èý‹ ÷— ÷— ÷/‚Þ_‚Þ”÷rÁKÐO&O&a‚~¾?Ð_ØÄôÉÔuO6a꺿ØÄôõ–óÆ$aRþEÌO>Ñ^øD½øD¾øDºùÄó“Q¼ð‰)æ“éêSÌ{ÓÕà Ÿˆ/|‚lÂTu{ËTuóuŠ^ä+¡?K3)(+˜þ­ó1ÍœfiŸmØO/xÔÓoù¤³¾L¦±0ª"-ñ2³$kf|F¸ÔÃû¥1>žœç¡#fSøP”™ ˜}IS1 ôúx…ÏG.¾áaÛˆù“ga2o«–ȯ.£íJA*i&LŒ|·¼™d¿G~E·ÇhBããQäD-«~“a–¼w¥'%r¢b^¿Óm°àé6¸Ô•pº –Í1Õ•t©+éRWÒ­®,›£_6G±9Úis´Ëä˜êÊ49ö›º2MŽx´ØÔ3áË/u¥°ÄÔ¬ßTWÁ©®ØK]™+N·q;SWÌ­°Ô•r» ÌÜð§½A¯­ÞÒX¦ÁÑ_ Žvå28¦ÆbÇÔX í øÎ®±ÄÛkÐ܋נ¿h,þÒXòå5˜”mK1¡Aca>U½4©ìÆ,Ž͈ìkšwв‡â-%I›åÉŠäåv¡IcM’æ\§œý®«¬U,Gý ì ãÂ{HnK~ðìVž®9ÉÔ‡y¸ÈdîgŠX°;×/$âr'êC}Å(8--Ì ’÷…:™·Bò¹ûùÌL4ÕÌÙÓzØŠÞ’ }ëv_üü9ë¸,¿.ë¸,é­X¬ã²tæsM§³b±ŽKgú*Œu\–ÎôU,ÖñbéL_ÅçÌã7â/ÖÎtV,ÞñbíLgÅ¿Â;.k§ÞÖ Ý+š†Íx3Væ)ôu83vVBΙ#v&M{–dlQÕ„sR枣&iל žsÕΕ0l¹h ëÙ2 É¡HØ7kaü²‚Ìy2‘ j%:Çs&9È»èC}$BÅÁ`Žáƒµhd%![à…´è+C­>q\“ 2ôÉ@K©æ€E‚–ùFæ®´`¦Š•tÿCù¡ÆüÕ˜lŽÓ 5ÆÙ1m´|õ~ÂkÔ×X÷CõœEdFK5‹.ðp043 ^ošC†j‹\†DÝ'ܵ…3ҦE3«-{5ž¢ ²f¤qÍÉ>';ÏÛƒš/O÷‘¬ºN¬¼½ˆ£vZ²Whtü¾ž«ç ‘%3Nì‡ëå‡ë…œâ¯àzɦ³h Çjª½¤Êf–í‡Y{bMÓl'ªæŸmш\÷>\¡bÊ㳉\oÌ/ÑŽ‡wyU)Ÿºñ™)=šíSì™j±¨½n'ç™|†Ýò,\Q,¿v µ ¦M4ùÔñ:u±w—ûMÐù:o!Ao‡¨$èrt¹º¼´¿ºß-7F‚öA#×ßNÐÆ² C8 z*øáh±z½9yÁ‹ ÛEÐù$èù6ï"èðBÐæQ7‚6’7‚N/ÝÌ™}‘´ßhZS±_$]^Hºœ$ÜEÒý…¤Ë I§›¤Ë Iç—CÓpšzÿBÒñ$ézšöûÐ4Uº”€ÔÊ–E¸‚¤g¤ÁÌŸ…¤ÝgóL¢¦oúl©Q±Šélû,bçÉQ ¿2 'Ñ"Š9S4tÕo© )jTÐWúV¡bª®æðß±—_àÇ èÐGùƒœ€&GbÌ–SÜRz7¾`1…󽑪KFŒ¹Q&î†×T‹Â/Ëi‰ÎL1«•‚´g^>ÉwùÜ>·sÐÖÚúÃÒVœ‡ó^i‹žð‚B?¤­ylˆ›Ô‰ÐI[öP ¼©ö\e´ ø )4(<Ç÷¶À’ߦ¨ù #<é£M“6{ÌBìœLç9SzÐì¡[µQÔ¬ž›°Ò(N{H™æª28¶MVMÃ*æ “%öÕt°ÿÑmf•ŸÆ”Õlá>3†öÅÌ«‚ÊÃÇéÝy\¶àã°낲ìR -ÁÇ<ûbºË´Gfðì‹h%þàYú8¿=KËäûÁ³—ø[ÆÎöÇ;ÛÿRì¬Ï¤«Í3˜O¶IW~¦×üê²'\ðj¼ŸÏ@¨ž*SU‰ŸÊͨ~L­Dð`ÀÔTÖ“A šË¼IƒÑnçvý9:;TŠ C­M¼Ü& ë¨Öêžö”’¸0'TÛç6ñâìmt¹ã«y–TÜΖI¶õŠõ”‰Kà}›Yyw‰Øï˼Ñ]—yÃ!§ÿf Äé¿ÙklqÒC.ðôŠž¢°½ˆÂ~‰ÂKÎ òëã’…3qAÚQ>9.Y¸iè§™øµ‡—OtŠß?äx‘…ÓPQYØœ¢· ,· ,‡ §|u†ÞBð—o¼A AÚýÇñÆ)Ë%Û)óXYR“ç[dF] ï§åyaãLn¤w¸M†d¯ÚíE¼•9El‚Íè,ÜÝY8¹+´k$à+¨kF¥¨„I}ïO?ÛgÌœ³Iˆu¿s§¯ß ½ {&É$´g=îÈ\hoëÆÉ¤Û–i8ád¶þ«úa þ ļhVú-šÈKá’ðæ¡¹}V®Þ‚èðóå?¼W˜­uOÍɚĉªAZÆC@ašKšŽ}ž«*»Bx#?ÐÛ\M ³Žš QËñIôÐ+%Qs#u!8¬65ªJ˜H!»ØÈ×6]€Jõ‡úÃýcY ÙÔÑ„X‚b/Oë]GÄK®3wmì$\grª4úO÷•¾`¤ª‰¢¾B¦èï3 |ÆzP!.‰8„ ä•ÈP)4u©½] ks´‹ ÎôQÊoý¡üþ…”ß+ÀçÒ~¿*¼ç7Ñ“gIõZ£RÆ#·& Ã|è×CùÍ|Mo8þðö]ÔÓ¨IŠ%\‹éibžo·¤'^ªë¶Á‘˜£«÷(FsvŒšp€FH­¨ì)2aÐ@ì5êÔÙrzhœsçÝ*Ù·ÞÈuÛ3bðr(òâþÉ«Â.3Ó)3û%3û%3û‹Ìl»Ìl—È,/"³]"3_"ó%ÃÞŸ^Ù5‰ù=m×$æw•ÝßQ×}ñþL‰ùKuÝ`ôJŠæ)¤¦wW²´3!½pa¾¬µ„ȇîʼ«r|»{"|¡Ú.+Ë‹'ª›çއdÌok×|Ƶ€„$“ÛÀXº¨ÏlÚêÒQ[®úãvš˜´Ø¹xÝN…&%õÛKÿüÛÃ^ oeôóÛ#RuK瑜ž»Ö@À¤ædÝêÞúnÌÉðÐûu*J‚Fá™!¦$>:¢/¤¢ ž¿„Sâ÷sw¹ë¼eÜ줛Ý÷ËìNK”÷,ç¢ Η°wÈŽ¼õ"ïŒpØlÎCŠón°Ü\—PJÀÙĹg9)‰ZÃïÏl¾§»©%ФP¢cöþž"“<›bS÷oC–ý6 ¦˜$gÔ©Û@ ÜQׯtv¿j\fW~i0;)I¸Çb°Òõ|žM«ì¦.<;\RÊ“•<Ü“'›Æ…f"ªðƒ§ O— æÑB/!kÄØNÆ Ÿ*ã`‹ˆ×Ì‚…¾¶0å oi öÐÂ'ƒGŒh`ý‰%xK6M2›B´_ Ùç¢Ç€OÙ áŠs»f1h8àb¦¢‘ª…ï •ƒÍ›’?{`ð@&dåÄ¿+@erRW:áï…€ ¯Ú#Õäå±°ÁøÎÉúÅÊd` ó‚|EúIôÙ4K#⎩nvï5Q²#µiUñ²Z0Ö<ïIˆ–y–ºSy#•nÁfï—õ#Øì›É™·Ñ¤½`Ú3]¢1Ì(rÍʈ½Âéšò:åïé~×= Ùt±ôŠO‘à3}üÎ|òΜ{fz­ËͱÕw€—$•«Ó£X°ã¼ðÊÏϳeÄc¨âb´T4¨´÷ ^c:W1uÚ¥(¤f§Œ8@Å€·2H¾Ù| 5fз†Ï€c€°¦&á#+ÖNßäJ‹#¸›#¼QžH¿×¨JÜ×gا¹)Å-î¡î,Àó9XñeÞ(©A!KúÞ3ïR¼˜²¶¼$Éè{sW¾ÿpWþgÜ•» VdÓƊ¦ˆ? %ï㎩È;=BL òJ´}æ;µ÷E¢o‡L;¯L¾°ÄaÛï\¬üzçÖƒó/Ô‹gŸ W7V&—Aæm¿Ûï¸}=áŠ^œ ´fã:Û¬VÃH¢ÂjðFRøƒå²¡\¡Ô—H4šZ¾ xûÕ¢÷+8åÇÕ¢_vµèÔeßupŸy‡Yýȉ²+«ÃQ.ÐJƒP ‰·z½I…Ðl4 ÍÐõÁÔÅG“p|*_ÑvÞc³Ð"æzl#ÛxÙ6^°m/o³¿\^S‘šïL˜–´;¤oMê‡CúÅ!íÌ!ÑjhÛ³¤q9KÌ „­ZLAöó2¿]ÊÎfdD,€äJ4Í«&rZg§Dr\ƒ]4ãøxU½ÓP"R;t[‹ˆÛbvåTòõ™uBÎÌÀñE Å®2}}zNM£²²xQúÎaãÒùé°±-cNMºÓš9Lº_÷œ?‘î–anºS¶Ÿ¢½½Èöß/•ìËEç™!p›ÕHFUmã3³+Z9Þ«•‹ŠQw^K+åÁwvÞ4µý:÷FÆÎã +¿‰øWŸZ¸éü²§Îïð,Ÿ8岇HáF½[OŒ * ЧA}mbÓg¢¦S?¯{úMy\!ÒhK‚0‘û”d¬Ó”›Œ×ßÍ7ÙáÖ½N#•àR%ÁY¼;©,7šÌY®sÊþE*ý…‡ëH°|—xV¿”xþ ªñI> êùgºqji¥g–ðàP_)@+fÒïOœ§÷ÀnÕXkàâùÅÌý®O’"Æ›sR<6žÚÕ§±ç]ývƇ5ZW©3ÞÔ™füÊ»O¤ÎêÌ‘ð|oTÝÆ6M¶/»É…dyZZßðtä;4¤6˜ë‰Óƒ‚˕عv˜mzkºƒ±ñ¸yºÊLxÐϯÞÓU¤©:pžù*ÊãÌWÑn?L~Qú冩—úP^Ü0~ª–Ù&LýÁ2ÛÄ©?¯S06žXÒKâÒROV/Ê›øèÆH˜¡Qág¬$uÎu!‘1FxÙ·…?TÎWží Âx¶£~Ø-Ž <Ÿ™zc£Äˆ8æMtÜ$öŒþiA"¥î\;ãaå‰2ë=zrm‡:ø•J™žríÖO®m‡ùT“>ùòõÙ¢¹)#ZŸÓé KWªøh»I§³V cU씫 ,QÃÍŸ™`ö<ƒEኪ<1ÌêL™¹8Ìs<¾¸b¨¶‰©êÐù'b Ñ §iHÿÍÌ „ÕÍãœo_3fR,É3û ›Z(Üvj÷*mdoœ…±o©èfLS°7$§Xrh/¹Ô°š}†$9n*á'l”ÆÃd·ÔTHö¼Ô›‹]Å‘(¢gr[WW \öt~ÂŽðšH/›žt\Ãóš–a: änA2‡ƒ•Ô³BÍ'ÜüÝ ]]šë{ÂõlQ¡Óíp;aŸî÷zÿ|7Û‡Ô;ƒjW‡¾`îdK\ç°s#¥”v¦õÈ:›@6›ü£MIù§¬Cæ"›VÙf:;åVqèZNH.>Cj’a/ƒ¼äjÙ<¸©›QÑwî4™¹Ø™£,ê­ØUÒ•@a^.Íg~ålPÁ¿Ãõ„}¸[ø«FˆÜï15nЖ/›ï›l7üJ1¸÷ôùö™¡*Ô¢OcMlCÉÚI¼5¬ÃúÌíi1y ª¯Þ“ÓÖÇ ¸N LÊ[¤Q³ýèù@BHv˜)÷. [L„Lš&°J˜rϤ¶$ýSÛ`ÉÔ6¼ŸJîÚÆ*ég jžÚF™‘Wã‚w§ö~½ó“… –_Vë±0v²âüMÍÉé=!$&Äëò*ÌÏ…—–ƒäCçB¦Î•K•„À¶x¢‘ž¸ÜÍ—ææRg>˜ñ’™,¥7DÛ·jp˜‹½Jt)«Ý¢£C'_+‡‚)€&ØpŠŸYpþNácà]›úa5YÅ9^°q„jïÇ•ýtfhíL¹¾¸­‘'å›…|\ÉúŠáfìýçÑ»õeéÝ~ý­Ü»È[Iéôt˜Wï’3†Åœè¶íLí¡g$ÜØ0 âß,Gp@˜ ßR¾aTsÖªÛ#XTŒÃ¹Tûï·u£— '({83##rúcK"¸=Ì™lýT{5ÒÙƒä¯ ML­Ÿy …n׸ܞÃx … Ï=ÙšÝAa>á‰+çÃd¡³b„wžÖL¾hsZçž±—+»1s`q™í dÊ$ZÑj‹õáf¹7ÖV@ÅÞ‚R²ñ2 ÅQé×Vb uOöAT0¯ôXÓÌ›q騞,ê¬Zþ¥)#f ‡9ã3Ù®õÌG»Ån›h;Ùt§Z/÷§°ˆ3’›·véILÆ! 6Ïb‡æÛIæa?2e…ÌpÒ‰EÚµÂ`zÉ'\¥¥ïs•@OÿŒ('ËZ †·4Ô9‰£¬´“¹¥I™Õ.J̳ÚvÁë%jû)ñ Ïó‡-izÉëK&­Ê¡kÄ ãÕÎI¶¿ì¬æ‰_×JÜz£@ç(Û \pìœ3wÍY¼æ,\sÚ9gåž³pÍY»æ,¾Ì™É~ÕœeÛhsæl¼¨èpIyz-“XãœDÁ¿ÙFl]§°¿l³¹ñ8eþÚfkÛ}gÊ~ý6CŒÚWM™Æ±Y éÁ¦¬Ã" Ýhú€oj3£^ÝgѦD?ÜmTo-¼µHÊâNÌßÕ ›Gkj?°?mÿ)3-Öo\sûí¶o>™ì£àýeÌ÷-îž«-òjWËÜE#ÑŠ¹ãvc’TÍn³´F®&ïšÂÍæAƒ·t=:û€88𨆣†ê|Ž£Þ—’ZtÅAÃ^]†C¢zº§¤${–Èú \ Ž g0¤h]`S«PÓ'›lX|ް3„Z{ë½Áõ†°Æ.|VÃYöÙ&ÿ5ž³½DÄGñ*~GOckªÒb%ï/u¸TÒCÂ\å.ÑŠÒ8ú"A¸,x¿kHSëni(þ˜¬¢a&VðþR#ª·Ä° z©p§³À¤oAü¼pg‰ôõèE› ÝÅ;$"’:ûçÿƃr…TÅ­Êwå Ô´n<¶Ï«“N»“Ä’w”Hpšµ8l}nìªåÝÓÇÛ=Ú…_L'>ƒGn“Ùá2zÅÍ –¼£D’aY·ß÷Ç®éݽËgýï%±œ8 Ínƒ›á˜4ÚJÞQ"'üÖF`ÇqãÇ®Xݽ8¶Û9¹]óXm“Ê>+yG‰ä³6{Ž«8žxìŠÌÝÛc½×ZÃ6PC 8sõtÜJÅ [p¶8–Ù¥b‘8f9ô†»³Cë~/ñ;µd•”¬‡^.ç:KÞQâ=J„XäÖRY] ¶\²÷îëÀÐz_%z‰ÿ€³?aÇu.ÄGKÃ̽†6L)0ûT<Êö•KöÞ½}¼Ý#8ÊM¬ ×:‡9‰šãÑJE™m44³Î.‹°}å¶wg†ážEôó y´^:˜m®q~úWÿÅÌw¹0ˆúBjCs“Æl⫆­[‡¾häÎOÛªêN!öÛü=AƯ-ÀÉ)ˆ"†¨¬0¶§0Q‚B:kÈ‚2+K÷Õ¤ÀÔOtí¨ N¬­£¬loÒ'pîÀÉ;9yŠàš‘¿kÁ,ñr]ĺèc4ÿ˜] œÂã@`÷^=}¼ÝƒQð´@¦]À"™|¨€uí©ËYâ«.(Cà0½ã“š\»‡öì«Ãm¼j<Ý“‡ë*Ê!Öpä˜.ƒeVorAJ|ÕûÐ죠À'tá3†Õµ>ÑØ½âwgo÷€ï(É%1%H;uh)Ç„tϸ>:K|Õ#|ö!²IJ"ºHÃöð¸ÑØO"´³4ûú˜ŽB§ÁÒA¿šÔTá–GÎ!J|ò  `½Û;ûØûÇ…Å~öswöñvøÉ‘2X¸j‘ —¹°qiMu”îµÄ¥ÇìÓWÚºñ؃aîÞ>Þî•ÏjÞ‰Á‹5ÀÞkVö¹”d¼\@>)Ãw2K¼øeÉ«ÑÆ7†Ã>ý0ÄUÜîx´k÷ÞÀ¦×ˆè¼BE€áyçGa_‹±ð"з·Yâ[ÂMžÙFJÛˆÀ—AK}ÜHœ›ñìíãíQûWî§%À±éƒKǓ̻h³Ä·Œ žžñ¿:N÷h8ni“¢‘6ÛzûX%‘ýwÅAñ½„ úX HL‡X¯›Íé柵‘’Äïìü ûÌ…ÆÉa™Xg«„²{¨"™;Õ¨3V¢y àÐ C)‘N{¶. qVµAºô€+¿zCã”.Ò[ž½}¬ŽÈþ›á€î:+¨W´¸L:³D4›`=ô‚å­ìQ`GŒ7,N}töñvGg†‡j¥²UÀJ˜ªW€[7C@ŸquQYâÙ‡ç¨åqaqê6ggo÷€ì^U†ä±Dw‘Ú!?¡yC1”f%l8‰±?n<ö3·³·h8ÎwÔn/ ëD)†Yr¾X¡ß”Ú]OÞtkjÒ?æb›%Ô­'|+×,¸µúßzôÕþjòñÚdz™T!/PÈ ÀB§S# :Ð>Ó,y?KDJìpÊ'<¥ aǰ‚-[¹™"ñ—ËFàLN§¢MzõÙàÖ>JrypH ‹ƒ•\}¼Ýš—©R÷ôØP3ω¸ÕÅNu|/ÉJèóÂã`ÈWoT÷ýÑ¿z™¨‹ -S„#T÷Pk¬î¶ý2w%ŠÕ](ö…"ÅÚÑÞ>bžÖuqOŽòÏêé0Ñ»B ëm‰­W-y?Kvš©êS»Ñ8”ƒ«3Z$sÀdÖD£6¨œ+?pn€KÜÓ‰¢–¼Ÿ%¹=ø˜ÆÊ c›’uõF›d‘…LUì=ïæ+Ü´w• 5!,|ëUKõNò'ÿ¸ñ84Õ«··{DZ>AWEÅ+ +¥‚jAWôfÉû^’—O=¬>œîð÷ GMžð³¤%ª€xòlyBÔk:Õ7õÌ K²$GÞX¸–ìÓÈ6kXíòÂâóYlJ&o瀠iqn¢ Q9WÙañà§Â5¬%ïgIh«F—;8ßḷ":£¾ïËÞ=Ÿ,‡=‘’r–àÚÝÝ.áœC-y?KâNÒìóÂãs’FoÔ÷·©ï'âÔ¨«Wm£îYèîÔÃɼQò~–¸vâØÊãÆãsΈވã6¢Ù,IùÒÎfPw߉%ïgIyàÑaûÈϤ :£º¿ fNÁV©œÓàé4š:•Bi&ãOØgjƒô:ùSl˜S؉r3S ³IËŠ)ÑÞN•Y4f³Œ>‚ú‡öIëñk'M38ž“mÒÒéÌÉ|ÃN™¶gˆ³,{ I\J›r#ð†¦–h@•êŸêÕ¨S§_×€«P¿&Ãïúž æ”S±-1å噿 sŸ65BÈÝ:1ô œlSnË ³¥'¥Í5ÃñµVž<ðð¸§ñ§ýÖÉú-Ì‹’ñÉk@!cÂ…·+˜qΰ7 ˆà¸³ªûVXpz¯ÇkéÁ%#e_ÐŒ r‰" ØFîØèTLÉ;L;!m=DëiêÅìž§à"©TËêåylãüµ{¸ƪNbù•r{þ§´.LóòíJ%áŰ +„³Ý¯ %«ø×Y˜FÁV`ïF„,ì;Mj˜¼Ä#ɨt¹j3´2/÷¨ï¡™ú¥Œž,×53œ‡›3!ÿ*‰ ôk°C)á,7í9„†J±`H}žn‚Q“JoÕ#3­[GêL/Œ¢J¼"+ÈÔýêéÖõ§âC˜GÆ56¼¤mWyo°D®ß¿½Íæ]°wfœ5ÂyE ³¤wÑaË‚…Þ¶VR<»²«~Á²ôß±`…bU¡.ãõ ÇMÙ ‰¢´.LÉ@×}$ýëˆ%¥oð‹¡{Y—™ü¹m†¶²÷°»W·Åøm]¹Ž¼W5ŸPY!KÍÜú^Oiüü¶JX±ŠKÁ}l·@ç®èr.NÛ Ê£GÂì¦ÀÝôäÑ70;hL݉û±pÇ>öÇô<úOŠ=X-v9/þ“~Çßè](èÄ'³ƒÉ)<¥Fñä,ád^³SÛH,q4{5hÏGz4´Gá2E§ž@_VXõ So|A ¸t§j¦XJ~UaxCÅĵÇåÞ“¹PÙ驈š®;Fáš0›ÍôRÉ%)YM¸ñìõé3…Õbò–ÊM‘pP3y¼¾¦°2]qQÁÔš;{,j‚²ùRŒ¸O†rðõPöwpö‘z= ü±Ø§›¤ãÚ¶®>6¶ °•=œIŽñU¾À|¯sÒZ²•³iƒ‹ƒ±†7ºqÒ¼YŠòx¤ ¬„u—¯ƒû±<9œì=Óó:;ñšrÍNµÙQ¶í=üéþ ~97ÆoªJh2YÌã©ñ±Nt¢,r£G~l°é±]‡mYUU÷š¸Ì^\¸…8áÎÃ[T+_èT7Èxˆ³fêÑ¢ÚÎdúÅŠú + +Ê'+*6IjAx‡ÀÆs"Nß„8|¦1¶âb×ÚžÎGób|l¥Ièn²1 eBÞÁ…ã ”±`²…e7V£4e!Ç$2-²m]ÃE\·>Ÿ¤¦Ï÷~1©9Üð<¨êWwe.òåè„o¼!©{CK²©Ê7èÓ]—|ÀaI.5HùK—ÚaGƒÐo4O÷@Ô:+/ÿ+ïO * lÚ‡E©^Ÿèñdà¶ z—øKå&ª®Ó°ay™ê=)Ûý€pC‹˜Ñ¨ÇŽPGŽ’cŠçøgí×´—5hׄs æ>š‹ Þr§ÑéÀ3O÷¹-éy~·¼Ù¸ãT*\£nsY‹>7šÖ¨n¼ Sa^-*N´V }ãuƒË¾ZÚ‚Jô¬Á«!7RÃjÑü9—-î3ãÕÁrbÕ舟5*â&Ü÷¹–ÝßÑ’hLä( ŸKÏF¥zSº—µón¸÷°5èkÛ‰?Çùi®k"´…˜V)ì5Ê¢&…ë³ údZÁÃó»à°v:Zx/Ìe}·Âõ¥E?‘’#%¿ÃÔ W‹p24kl{Bá wkÑ¡[èÍŽô„ùt4ˆÛ¶ÓLwÂÛVG ávû‡&¿ˆEadÛÚ[äsr…-Úâ†h‘yö`5rX›Lá´ø)[äÅ´†*Üo¬ä ª½OylÇr0Îå¹O•\ ÞáºÑÔ°O·gN” Þx[TÕ¨V—‡ÁšYöh¡·ó¶ i'7¯GWƒ¶“s,GýÍ3€ y±… L»­³r°††´ö0ˆf 91Ú&bÀù u´ú³EÛ?;HÓ¾ÃaߤÒÀǃ̈́¡Óï=x¦7ÙZð¨Õn§%9Üt'NÃð:º”Þö¯å"p‰N8ºì;#ó/“o Ïm-Ò –¹´¨]ô`?÷ç%7w o4¤ÅºÅ´ÔÌ,;˜æîµeÊÔ¨“™îsÿ³EvSuÒÙŸ-rœSf-Ò<¢@<™…ÆÂØESÀÚ‚N¾Y£ÏÍ¥°øÓÓÑ¢¸3g8)pšÚZäIû¨QæÊ‰ƒ4HàZŸ°¶˜“¯ôêýÂS–RÝpÒ3±81àÅ­E~ƽB™¬#ðPÍ÷³Á:ÝQs­ö˜|aíÙfƒí×(`ýþ†óWc!"NÉt9ÀÛ¼ò@*/¤@nzà²Z0ä|2 ÷§”u@·&?Ñ·éø¤‚(xFJ9M¹evHš%jDèw\ÈÎÓÉôßu&Å›ì«ÎÔ™²"¨k‘ ã\Ÿ%0Âûé~Å©³æR+{@…È`óÄ­Æý¬FÂ7N8SßY-2&³†Í¼ÁuónÍû‹£¹™³zvð½[l¶šÁÛmµÀã‹«FzcH.¶³A!ÿ´ ¼‚>á¶Ïô7Þ]Þ»,îœ<î¶·ç÷> #¢&œI·«E!ÝX *£ö½CUü™¸ÇjTO¥ÜàpÏmed欑©V\¶!µA#§¶ fânŽJÞl!Ô¾WÐ÷œ÷Í@ÓbGº™‚fpß×FÕ~OŒ5z8qê鞨žç1jðÀhÂm§ÕûɆQA,‹ÚvØÁjÈè­F¡5¸Í“kÑ)õYÛÞipÜÉŸ¦Å¶óÕ´Ø7Œx]ObÓ¢nëíõi¹Ž4`g‹¨µYrЖiµèt°ÆPNvRÛ"¤áã±Ô¶8¼¬Fâ•w«‘Ìn78^»PL‹²#•êùá©?Oœ²;¿ï²npÚ7™¶(õ©e±¯F6A9[:®¬Faê˜ ç‹¡k\ûV¡2.zÂù"p½‚µQû9DóÔf‹v}(ÒQlpÙ·% …}1Z§±IXc@÷ú=Ô&†B<”{õz;X¾ »“P=wSàÅ )ˆ°fñ1Ã>›P·Þ-1a(LvÍP8äµÍí„:aÚ “À털æVÏi=ƒ§ÞßèóKï6½¿î5ÒœOÅß ÃpÕû~ÂÔš‰£éÙmñwhÍFY ‹Ö|4˜±Bˆ ÐÔÄšXœ¼©^žgÎŠÓæî/à~y€·”r„¿!/Ïì²?Níªžµ3—>Bi™±Ào˜¥>1Tw†«CF<-9k˜Ùàĵ^-÷Õ0ª0¸P®…v§Õ¨Ü 7ê´«E§±<68»½GÎ[ÙûÌá#[¨Øj‘( ­F&o6¸Pû_-*}žVÃë÷ç9„äÞ§¦xª[\-"åµÕ0Õ`Ä«/ÎÍ ¼9a³g‹jÖ"kˆ'wãÞu¯²1¹×ë³+“ Y…æÎÕ”ëµç.l¦ðY f›p~žËÝ̹aµÂÝÝÛ¶ûsCôÞö©yí(÷z~Rïs¦ÞU¶¥nð;©w¯yí?*^½ì°yãf ïæJQK½+•³AÞ°Tµ«æ6¹ôgß» ~íª])-ãPgB‹Ø`sÍÑHEslŸõ¬ŸGÒ æ1¸=ωMŽ2Ô-¥«ïpÚQ¦Òe"t®I–:WòV ©Á­B.Ô˜[nÔÕ@^ ß+ĵ¶ TÌGƒêNj¦š‡û˜z1°MXµ›¸¶| >´ƒe-t¿¶C :“¬—ì+¦Ws..½šù€ë?󙪄£ÐE¾oÙg—ˆ$½[ ŽÆ4Ê¿ãT5=ÎCÕÆ£/Ç¡*B4¬‡§››ð8Âzì±09frÔc”(Œ(>ƒ© ¦kBõÊYƒÌeÂ$™­EÆJÌeï)ÊûÙ¢ò›¬F»ÆèÐñW‹LŽh523ÆL˜éì·;fÖ j0a ÀX-2£Ì¬Eè„Iº[‹¶ÏrÁíc°¼Õ ø¨‡ ᢼ,G¹¦¿dPÖ„ËŒ^²u†»¡F?ǨŽ©³…lÂ}ÁÌ1aÜ©Ü[äçþr{Ÿ¹Úf0™5`n«!ÁÓ{‹öõUy­WK3d 0åøÖ¢BˆÍ}ßw8=ÇèaÇSGÓÑ"1Tlµ(WvõЯ1D”Æâ¼ÝœšpÛ)’‚2ï-|€}:á¸Ï%eÜ+Tp× ·@UDÅ3êöCRÖr¶ÈŒ›µuß*)Û±âèÛ‚‰»a'aûšˆy”ÙöO¼W‹*úb9[äÅðxt9Çð}[*ûübˆzw,ÔáÐÏÖhÚÚ—Òò¡XX4+ÔÑ@ôMLòM øú•µ§a«ÆöyÞb—J D’qV:ý·pÇ`")¼ˆ¤%¤Ö­“]&-˜¼•± öÄ”}p<(õ‰©ôB¶Ä½ÅÏ’I³Áe‚/ª,Ï ô1M¸0tzµ(ä_Vƒ7:'Üv¤è+?[t¸t ÎŽw@78íÓB¹u¶¨ÇJhÄþÑ ðÌÓ*„ÀP|ƒfB¹U÷.=Òî”c³E¤íb5$ºxÓ>s4ñú>D¬ƒAw6å6‚ýÓ¸ÇMeⓊ¼1q•ŒNW]}qÕÕËUW/W]5v¤¬Bº¬“S—3†\m$e@LmÁ[‘‰9ñDkƒ¡„V&¦…êÁUO ·tìÏ ž» 3ÝÙj‘™EØjdd©™ Oa¶Zn5ÂùU™ · ›52—Î`F«ï Ï+0Ã܄ӎ$uG"ó`{•öØjÑH"V£SÜ.ºj%£OµÔÖƒÖZ‚‡ÅµO…[\H|ö 5:«ûƒÖ:`Ù´Öä J·L'Á¦%o¶W&ÀzÐz”¨}m}*œÓãÆã³­­·íAkޏ=hÍÌ7Þ´Ö,6tõãðL/‹Ñ­Ø^ˆÛƒÖZÒi!fÅ1©ïÂã³­­·íAkޏ=hÍÔ~>N-ÑÌÐÐU ¯Êñ¤ ÈÞ/jݯ÷¬G &³Ë1¬çsoŸ½gÞÊþžµŽX÷'­¥$X,¿ŠåŒpí©g—gl –Œ^5|z=i­%m|À¸xrúÀã³'­­·íIkޏ=i-%÷ Ô[âxx‚9NL°À’Ñe¶ÇC3×µè5\Ï÷¬Žë# ‰ÏÞ³¶Þ¶÷¬9âöžµzß-~€5æ[r pœÊuLèu¾îæ9Lægu~D}ÜX|öœµþçÃl8éKÛ[Ñ,ð|;FÔ³ùxµ‹ÆsP¢ºõþQV­/Ô)ØÇ†ÆgÏY£·ã9k±ìÏYK‰½o×YÃ>vÔl*#$´D5›6ï…%ì£îö Ï´FÛýAk[”ëAk)(Ôµ<d™¯Ý*¤9†! Ï2Ÿfö•%öBž\ããÀ¢^ÏÛ½/Z{äÉß^´>nUí±¿ö´S_qŒÄ ×íEk”Ø ÖœÅâ'S;^´FÛ²¿hÍ#‹íIk꨿Lg…²o%ç8ÿ?{_–cÉŽcù«ð84Ëè¯^@4àÞ@ÿ< wß—<‡eQÈîò—™Y—º’™L#ÇÃïB8Ä2# ¦"€kšh…'Y¢ Â×ð)àfSº`_Ê9½E3¥f¯bz}­bA@z­Ñ¿ý8M s4\NS>%ýS@·Àf5ZÒ€¬" —ýv¬CHX½mp2>ÖUpµ·i˜Á“çMãóÃó žÈ{&º8™ƒøÐ7ýÆZ$B¨bˆvbfÕƒ1ꟗ˜õ^@?%÷$Èajÿ{rþ%'ç™ßï¿§é_ršþãÇթωN=K>^%¯Ne-Q›š,ž/ÞñMk¬´Àˆ›m5•¢xÍ…âØf tÜŠçÂõõâþîõ&W¬ˆ Eq”‘AE´PvIØÿÕI+’š´¨ã”ˆ X·Ñ[×øN‡F?w‹5D÷é«8ïÝö kÌÓ+¥ yÄâ[(Äx¤“ìn!+z„¢0;tNI9oð*ÐñPAYÜ@Ë&¶P¸ÆS##ÌöЊ”[0=©7b§‹êºb‹Òâ[_´f·s²J‚§X¿Â?÷TPoîCª\´‚Ån5è¼vhEŽ-:L^C{â;$Hú~½¸¼Æ€ƒÒ¡5$?4˜½*÷äÐ¥Ðìå° ˜ËЂH^^C`îÃÔdää-2!Oy}±Jc‹|L&X¬Ó¥ÄÏ¢Ñ)6¨ˆì94¢\Bƒ s¡×hˆo;tSHhAWv¯Ñé Ð*ÇýZ4]qõjŒçPMÞZVcÖØ F­÷PÉÝ[,DzÞKD¢+J|ä4Õ¡¡!?-4gÈ© ˜Ý}Ez>ƶ]õÔ€Š?Ð3vAZ ´ãÔdÍøÎ2p߇ûýR˵D$ns^#%-qþä.ºžÐ·Zàf 5¦š©î°*‡â>»c¦›CÇ¡Pè×é5èÊyhM¢[Œ×™"¢ôøÎ±âðˆ(+ö{æë”yÏÇ„ Us[ ÷2à·¦(ëÂÿ,(vŸð_;~µHm±’ÚÅ;ß#¹s#g×8)>S8°ø]­k ” ½[$.±Â8²Ðâ±£•»èñ¥e V¨%v ØõáÊ€Å-]h…Ü•7hý©Òæµµ”ÿº¿»rñV£];…)À®;žŽà¿z¤á8Z “ ¬Æx%ì×£Á~×دøÎ~y‹µü$Su€«ä–ÖÄw|§DŒ1íÆY¾ •Ç‹VAóii2½=ÈmuÓ~QlSH­U'tY •KV– 8á ^ÜSNL›¯=á•u0ýF#ú¤ ¤ˆÍØù­‚l ÿåZ6ç¿ÊƒÿZþë¨ÙZT³þËÓÀÃn÷ïÌÙ­—¨]5VÚUqjpv«+¶MO¤Œ¿<3Ù3JVzØ;6˜#áÿYRFÔf‘nÖÏ TDùÔtÕt¸‘~磅àXÍSCÁ4"-ø=¶¹ÜC Ñ EZ|¯ï¯›1”¨¾«F²P5Áªïª+Ö<æŒÖ´¾±E¶û™5˜ÈòÐ;Š-ì@`’ɸ­à¡Aw§ Br®w˜ëüm'-iYÉWƒVãGÁ?t› ˆ7zjëЛW»·ñƒÇˆÃø˜zUŸ•JEÖ˜i gh±ê{üæ5ï1Ýé½ßƒºå}«1cŸŠw½"3驱¨é$í[d ÑqºTÞpÞ‚È&^£¦»EEp^hQç5Û™Qj‡îÔŒx‹¶È)±†è9V¤5¶Þ¢_¤¼Wœ@á½ö=V3QwÂÓøE£5ùgl±mé5V£JÖèIîÍ[l»zYc7òF¯÷ë3„õjah”õÚ‘žïר çFœ×ˆô|¬¢{…RorPuêo ¬!ŒW|CU{VlQçµê Ñÿmb‘·hýš-ÅŽ_Õ5zÞ‚¸V§Æ=²Âì»W}_ó[F¾¿c”Ç)¨œW5<£EÆÓb“ßcyÏ¿²^w †“ñòô,crÿJÌíÐ ^.©ÀØUU=ø‚W™u 5 jÓ’ æNVK# -dGí¹“vBîÓ¬;Dyµª'“ öµ¶¨‘NT¶iÈÛÞôžÕ×`‰pZ9#nÖ 3ý[s-7óÉu\QÝØt]™4(Š™ö§ÛCƒïÒ¿—VÒƒK3)!Í—6É¥M×=LriÛ¹°¦J¯>ù–=´³Û[3•^´R&ðq2n‘îL{ZˆŠ$Ö˜ŠItèej2o±Íæˆá<-Bûˆ-DŸÍâ\[¼¤Õ}·Ä§…ri{Fº†êªÃÝnOž_FoÊýÞÂR¬‘ÛýfdŠ-Ï+Ö(™÷°Ñ7··(ƒL”ÕØïað…I{öªvžpVcÅgª§ôã­=j˜í…tO<½ÁŸOAñ”ôHÔüx‹]xjP"6rSgæ ¦)XcŽ÷i8~Ç«RIb5&'Ò;ñ ÷›êD«0© ]j Ä—4]5Ö{$s¡2Âä~­9aÕFè“°jåúnaÕvʌ܋‡lqÉ©] Z¦­Çèþ(åÔb^®ÙTNí(åÔªSNí¢G\×äÔâÊVN-~Ç4~Ã[¬üžâ3W#sn´qjÞÂ95ÖØíZ"ª%»Ö­²j¡WʪÍHOªa¼…Ëa¬!¼Zô|¿f\•dá3TI_QuÔ§•d¬àJ2£MIæ \IÆb¥Œ}^í©SS¨1ã3ƒ•Ò[¸•Òj´k‡+åi±ãž¯GJxµrµí:ÛŽ•ÒèÇú²R²ÆÌ÷àN³Rx‹Umûhb=QZt\ÊŒTV6IÓ7ýD&q5CÊRÑÌá„GÛš ]ø,"ÜP¢SOUÀ‰©Ò«wX-‡Z-!9 ÎG+`Œà»"3-Þ¼ ú3M|Ý[ o¥×zðRóÁKÕ/¼T}(½Öƒ¢Ÿõ¿%;•ÁN³ô:›”2zuc§Ì¦8Ù)Ú%Jã£ì%c¿!žK»!@GÒ‹F+¤€y7½ fj]5^ÇÞõÑŒ^-DPVˆ5dŪ\e´Ä€Ž«…b ñèé–€î~µÇþS¢6Æ›®‘&?uט¸CŒ¦r8´ÈÈËvjЋÄid_-è=c5ˆvhžï§E™•­FE¾ºC.MoQ¡´>5N)£[޽$?Õc¯$ (¾£û:´xñS+>“X_N„-´8×¼U%F3KEh0ë= ;ôâ…}ZÈ‹Xóì}W'DÊùz’ÂL«Gf„PCÁpÌäJNƒ<(g[ýÛà74˜ÂP¡<õГ7¨ëwá¥f‹4¢îB‹F·3«ÑË5Ì™@¡1~¼Æìä¡é,wZ̦Ñj0¡È¡çcïiÆ8R«ÁDíôŠ«ž¼Tœ\¹ßVôz¿NðR¡…ðR³Fš|éi!*†0šÊK­HÓsí´ z¿×(5Î4_÷; r´yZÀ¿9MËÜiQ絟Uó{Ù 0´UßA§©ÿ -úµ–ÁMÅwökû7æX¹©8ÚÄ} -F‹'4_ñc=V¢pSa+7Õ.ºÄý"W}±RPœ×v¨©Ôl!K[€2Ä$”ü0.XjŒ[ ¡ì•bƒ¬E"ÕT o#.ü”pIÝ| …RæI3ß‘šjê\ï•z(%‘+Áé[1UonJÁE"7µ¾pSëÒL!Èëâ¦öoËMÉD7Õ•›b 8šûÅM)˜~T ôŒ±O0öÊ~TôC”,)üÓŒô ÇhxdÁOÌj¼>©EZà¼gl¡0ÞýÔì䡯QE]óZœ"ÃGZ å±…*£°×€˜h9?4£WB‹ÁsÉj,(Œ¦ÜZdÊ^£ó,4šÞ®¡¢'½F¡ Çéþž¯eòÐg…šÞ[|@­ÏϨƒ|‡ÕX<ÈH· gÖÓ¢µ÷Øë6ï>öøÑÏ9öúÅMÕ8¶ÃîSoñºƒWìÄ îÏhÓfœóÑbÎø¡ÊNÍ«Á²KÛ*LϤwޝ$C5âgìu½ÂÐWN ~α†1'¤³1'Þ"kÙ4âÐ¥BMsZjÕ¬FM×@Su•0Uq0…©Zñ ­Ç5C¦*VèåZdÂSÕûÃ%‚7ì ÍQpÑó^·–¢À+L@žäV½ÅÊwÕî'¬Å Ú[ìLÆŽ5v»Gj¯¸L¥ -”¥‘¾–¾±T±F†FÓÉkå_k”ú %ÓÂ8*Ö¤‘4†Ê8Ce§é:¸Cå-œ­¶Š!£;B¦C g¨¬CyœqGS¢Õ×±*oa¦D¯1ÈD½âÀC*Lø*:yÇr×WªQÓsôZ1ª{h¬ì•Â*ìAï󺈙»4!¤Òð†RC‚2` _»Ôbô.ñŠ˜´tâ_Ì‘{w'Èõ¸šÆ©zªÀZ©ìR¡Û~‰ôÅP•C• ÕüÂPÍCUž Øÿ*ºT€›2_ÊÔÀM½ ¹©~›úVá’úƒ|¥+ýÝÁ9@×.éí¥Ü“š+ŒžÔ†{U_±†àoZl,uÆÂàïjHÚûØB\ûÕBõz¨!ê“H dDl¡Ú¨tž©Ü¶¿Ñôñ -è×ë5%0Òæ£qZäúäN&ÂèÅ»ÖÈQÛBBg§;ïÖÓb¹#Ö¨)v[¹©q†„ ^-6bÒ­„NÿlO‰ ļÈÎ#ËëwE_=ÿÏØe¥öU4ÊøVaò~!=Mã-f‹#­œT|£8Oߟ`ák^ƒ®JF‹YèW¹yW¬±¸å'Ñ̯‰6ªÏø7ãÈŒÎtß?-òæ@å©Fú9oÙÕ¬QÓµ62R †Õ˜?Vh™Z$£;yyo!LT˜él NÓýï´.*>S¸¨8Ät -&¹\V˜4Ž9Mç·Ó`er¬±ŒÇ5š&»ÓbÓDn5s)\Ôõ a¢be¢f¤¼xZdZÄ­Fn×ä.Ê[<¶öᢌ6.ê´Ø×¾s.ÊH㢼AT+³†sQF—÷köŽVÊ*EÚ™(oaþX^ã1R}Ü›ûðP¬à<”Ñ× g<ÔÕb\§¦»c…ûZØîŽå4ݱN‹]Ïá/³¶ÉékEüD*®8Ã’ù Çwæôœ4¯MõÚ‚ƒ}­Í|˜c‚½pà„êókäë«ÒœqË›´ß!f†Ø© ›Ó@üwâÿ)޽†§íkºS§ðë5îlt#[wZHæêØëF€ÑõÙ§z/ZTS|eY‘þ <¬»F¹Ÿ =uZd$¤?5*Ä!§É{žiÝÝNý:oE+ÐîO).2õeë÷ÆP¸Øþ—PÕètÑ0)§°ªa”-„íw öŒ5ä+à .ÇÉPÍP‹5^×kŠtÿÒBR†ÄÆi¹òî"PÇ¢#»ér·P.>ÔP·›N«]-†•(L•b\+w Õ†q­rœè-SË!E“7Œ$³ Ò2þW½f#{¢ŠgFŸŠ²ºÂ>¨FÈTM›Ò ƒ7ì<öÀP“üz™Y5»~c3‹t´R‚¨u¤)u ’~WÀÕÎÔJêÎÒQRÁ™ªê²Z´V¢.ÙY´¥Aè¨Ì®80L¼¡ÐcY1ª&§ò¹¨EAS‹©6u¨EÉ”…7U1gN“12WvƒB[ò°VŒ*{ÝÏ]ÍN:ìëÝüA%ßB…T"jZJ4´z›Î,Õœ”–d‚¹ÝNIW¦ºG€ÒÄ,|AJ’×%f®|iÃwR(Å]ß9Lm,fq]{¦![\I=>J'·'êõ…·Ü:Ø›pê8§uú xM èÁâ™ :îM{…ðEºvÖæT+ÿ§3©BDØâ^óØÌ³|Ú†¸XXgåAÕRgÖ²»uµ« 1¦wˆ^Kÿt­wŠÄ„mxI) p¥.²Ÿp‚ ›¯‚”;‰tëS.n…ï”cÆ`ËH¹WäÄ¢ :Ÿ@•…§£Û?ÂK x%yŽÎk9ÁH ¡ÐFŸ ¤r9 zXk™€h{ñ†VJ ý@ Ös)Ãj¶z p+åÍMx‹©\ŒŒ•Pd,‘m ©D}‚…­Þ…ª4h™Y.*AVDaJƒÄå£b¹,§ zØ9e ¬-{ÔÉ‚X“©ãwØ[¬Ùªn©:¥Ð|ýò’‹¯ßûæëÙâðõ¨pøú½o¾Þ¾^k¾~g‹À×£Fñyg‹À×kÀ×ï}óõÖâ\—Z#ðõ{ß|=[_ßøúÍt-ùþŽÀ×£Æáë7SÂ<¾Cøú8š™niF§é 0[¤æ‚jÀ@GRÙúk:„­3žwº>K9û«Áºû¤Œ}øŠ<‡3ál1«3—Zcì÷[Œñ~}¶ðõ=ö©/gÚ6³ Ý«Pû¦/›×ƒÓ͹W¶héîÔkÃøÎZÜ#’-ʦù‚5Jw¶4ÝÅN‹<ãâWÆ>~FNÎI²¨Éb8ÐÂÕ—ëùÂÕÇq—§¸[…«/×È Wßg¬‘âW*W_¯‘®~^5R\ÖÀ¹»>B¸ú¾Z3äŽHÇìIJЏ ,iõ¡Çcöħíjñbë¯ïª#n²õ%Ç)n áêÓýå^ç 7?\,Qùja»¼F¹¥ø®ûiºìížÐTœÍßÈL·áÔ†…Ìl÷šãÄèáÿ51L´ׇ˜&jØijš‘–P¼»…œH¡Æ”Mé× 5®¯ó!—XCNÖH‹ún!NÕ»g¨jRçW-ÈpíW®­™'Ë]ò¤ÿ7iIÀ”Ñ/0xê“,¹þœ•»0WÈA®<|AÉ Ÿ;l ‹RøkÑI2#ƒÆ¥á¼1– :ì­àäNV Ž3êÕ/üQƒqB &bðÊÆôkÎ+‰-^B¦¿ + 60ø©@çn5d‹1dH…Áš&ùÈÃBöèšã Ò¾ºƒê¬,÷×fº%úæwH^ø=šéÔ3KTõÛ²[ 4N¦g0™öµ2i@÷õýsBrk¡ÍYŽ‹d6<¤7 _]Íoš\T—Ã&è+:®hé’|±„èȯa±4 c™ Zþ­öê×~ NÖ@4séŽ*E´Šßa¹RŒ¶¥Ó"Ñ£ÅkPæ42Ÿ [)QœÿÅÛ),t(âŠÒÔÙ9ü-0(×ëXSø²ž¯Aq‘.ƺ[$Ž8ìVU‘–S-žj¸j?iIñTã;¦˜cd¾N ‡(^¯GçÏ2·±…øWõë‘ùðþÖœ?Aƒè¨”¦ zÊ• %2l…ªóMɆt6Üü¯ÓuçÙBy§û Û¬\û}ï¡.ûCyQxQ‹šrª–Q›ÊÈ$µâþ„Wµ €æ^¦'“|¶ùÁ|€›òÍp=|öÌÇœÃd4` (ÅzHó€òÜf>hð°ZÍ -!ºòðƒ.ûkR?MG®EÝl;!íÐÄ  †Yá>3:ĺ¨ìAFœ¾ã;‹Ö ûÍÐÒé[VÌbS¦Ü™¤Jî4/&#Ç›yE¤W®jx² Z} ˆ‰ÌHïœNo²]1'º=¡ý{ÿoôvC„½xv©°ô…†“U¡\Óé;¿B D•_ kéµÅH¯dn*m3~­ª¡²rÝK$q¶YqñŽÓ¦ö®Laó³.kØ0ÈØDw”@@¸™Òdû‡ýßM0€{N¦ËÌ‘tO˜™6_@ÙD±´Ñbðè¥ l´\)zÂè—¾ÐHŠ ¯ —Ô‚^GXOÝýä#±¦ï‡Ÿºy²›*3>Zb!¦…×gÆ{ó(òè)þŸo>] ›NÒ¸t«îL:ÿ7¤±è^Ý8tüßOoräÏ­º³çü߸s’Æœ[uçÍñ¿±æ¤LÑïµMÏÿ]ÍO²=ª»óþw¦¤ñäV½T²ür:)çÇ­¶³ãü?]Ãè̸Uw^œÿ+®äáÄYý0âüß@®ã(›Î?SråÁã¨dK]ÂÿÇŽ3  xœ^ þ_n”Ê侯žtâ.ó·ålaõç}þÕF¨]Ï­šíŽ£V,Œ…d­ç>çÆ8’áÍd·ã»-Ú ¤2Û¡¶°Úu…¿3í ×"ãgÕª…ÿéåHR¼©â&R&ûümá”FŽðj2ØaJ4ô¤1ËVÝ pø¿íðrå­gÜÂZ·ÐõJ´)#»k²ñÕ3ü(¾CŽ÷8CÂS÷øw¢dža˜”¡nïño‹/™¶óhÙ˜é>ÃÿÌ„ldß…´™û¬&Í«Ye®eVùõêsˆƒ µà Åa/,.a¤û¬çÿj,Èlîþ¬.¾5ëü?Å1=bfºªË ÿ‹Í'ÂÊ]Õ%*ü/bÀ!Å«ÿª>DëþF,2Æqåü8g´°Ö=]d#væWZöèɸí£e_Ûiå“ÁR‹*Õw¼3LÀ±àNÊ‹‘,›îéXH÷õ}'“ûÎÀšÈf¨ýfzõ®˜C‰Î¿X‡ Ú:ߎ¢.?¦¢˜Csx+t‡j þ•êojÑgìE |§ä*´¤þ>2bvUý5»ÙzL!XÔÎ8Šå%Á‘Àhs$ðÃ76*˜#ÑÅ•Ö ûM 5Ü‘Àè_iœE‹5Î9Ú ¼E¸|´†;]üÖµÉo?­Q§ßf Ûû¼Ôìì’V*vª çXØ¢T?JPƒé‘ŒÎç2`‹«G9Ý#뢦WO‡u@ì÷žÐÂkŒ«…25ÖH~e(½Žÿ[¨& ÖHÎ(=[ȳÞïûšMå;®ãž^e.aVj‹5:Òâ­sµŒ¹jÈ¥~ÑÃ"½…`ŠÄõª!LK~¼ÃãQCÎéuÑp ˜5Ö3©_t¹ÎfáNf5©lZ,‹ãêÕÿûÂôØVc7,5.xLB&dwüÐP2gx À)¹=™×#˜ѳQköšA*â¨V§±`ÎÏԼкÏ@¨…°>Êáü^pLû«¡SMÏ8ò):8œ˜XÜhWœº ÏEàÑ9©\ ñ¤Ê z5ñ}U T¡êRý²Õ fFu«ÔÄÕ¨kM®”*Ùñt™køg ñcÂm×0©Æ§³ôªSå#Õ•>¬¦ÏyÍ#øCu VGr¥ÜW›A¤Ê-.f؉—ûZoØIsÐÉU6l‡ô+ÝìB´˜r‡ŠWûæpåb+ª)Õu|†mÐ;p²Sŧ^#â(Œ— üß ØRUÄvª×V™M•;žÐ/)î‹‹BuÍâzSà ÎXO…°{ÊkE‹X¥0ðŒ·pq°n„ùô¥ÈtSÕz1{u×L›ŠéŠÖY ©_ÌoVÄÇΰGñ;æ 5ó^ 7µ²øq*Ã'=¯U1Æ7GèU±­6klºÙ`FºyɬþÎ`¯6èÛ‘± )²!ÞL\„™ÚŽËÇXðÆš±] >ÁèºàòŠ/uúâëÅxÝ­½bš "¸»”¦æ˜Úçb°ª™®Ôe/çÂ~§€¡>䈆UŽ\¥¬‚!hvXqPm˪ïFã©°9®4ÕÊad†0Îð^J×V-ðÎF@ršTï w N‹öQ2Ì‹.ÕF$¢U8 úÒ£i³uéoŒú$~¬ K1¢÷Ì‹ž‡kCùÜ%ZnÁøƒB÷£Äí0Ýp¡þQȦÂ?d^Vסïª{’¸abæ….ø«ÃðÀ^€’Q™6Ð%ó"›Œt6ý9¡ºÚ`έ8 Ü;<¬Æ; *©¼yáTZpƒ1ŠËÒj‘ÏwÌvT,ZC$©H‹sèõÕšß-Ô—¥ée.LÖbÌ«D”#¬¸­xžýjñºR¬!é3nº]÷*3¬Wâ­ØËC—Óu´iZc«©+^ä¹”áÕ-%¶7kp,“"—„kÞ,/«@²^вVŽ–æN᥂ý?±Þ)šþ½‹qƒð3Úäi` WnPˆEݳ1Ló2_”£*S uF1O°ÇÅ¢;¢ˆÊ¢×Qæ8ítBóÓå†0E•{‰¶'OX˜U’Ž’É €ŽSQ3%1|£aZÀ€ýê^Å­DÅo¸±¨Œ±ç·Àùæu«êK6 ¾WËt0Kï5)P?#×,"úwzâ/¨`T?2^3ð*#(˜æ3MÐ —Iå§Z7¢aä¹-Ɇ¯­ÔX” 5¦¶CT)?œ«©G2KÃYÐלE¦Jð|Â"©¶Æ»–ЛîFŽ?žïcš'оŠÝX-ˆ¢3‰°A"TÕM&É¡•#0J4]ë¢øz>#[MøØñZ“K5 õc |~-ŒŸÉÄ#kT… ó¤›ÄVήòi EeÀ‚•KÇ brØ,àä°1]– TYÌüÒˆ‡´˜Ó`ç⤇¤'Ã?Z̓K ajšI…ïm Uëˆ]ÎiÀoЧIÌRåµ/s¤›zê×¼2tšHÿ±Þ]l”^MLfÁ5Ðx…t{šèÅÕ†¼éŒé"ÛæáJÇ•äÈ’CH†YÙ–.š'GW¥@ónÔÑùÐånR|£‚˱ÅP¿µdÄg&*­Â,,S¨4]‹]1í?1Λ+…Â÷¤>¤ðø6äÎzxKå—ý·No5«äљх7˜¬e±F"™twÀÃ@¼Íå¸ ÔÅ‹{£O ¿EÁÂuÒm’‚p휭åU±”·P•?©@0žÔi¯âjsÕ­É5ãÓcjó‚ÙA0TnM1&±€Í©‘YÏ€Œ ¬58[Ù¦"ÛìCÆ67›ý’^© ªƒÁ{/*q_˜wgÁ®?SLަj骹,+.K¦ÖQÎèM³Uô]@P‡"D¦Çíô;ä{xºª¿ôè†^g‡è†ucïoj_ê`åŠLn-SŒ0ªL]2À¸y^苚ÊnZŽÆS±~E„¦îu1z®R½Uqöj{Àg¡ÚÉÆ\FËÂêšå2ZHÇÜ7ÀöSºS}ÕØÂ^D?ï ¹\àdÏtNXI«sD.i4 î£`òô‡Ë\Øèàqpé7dÕ±êv¡—9‚“(›þ·Õ ¿'´ïBƒ¤†QÂí6JÀßPº:X :¿—yÇ´D&‹8†Æ„íLLLê,Õri+N¿íQçCSyÐ43I¬j;´r›°ä#ù7cNÐ"´„Ë$Çnýè,ÜŠÊXrê ™ÑF§ dÌiÅîÛ ç™ù†™N<-Õj¥(‘Ø߆Í<\¯8˜½lfèØÕ×Ó—ìUçö]LÜ: üw±£°ñ#6â•ë¦özà(m‰Ö¿iH¢RBõ³ ÅZ-ˆTo(í¯ÐèT ÍëÒ¸ÕžVÜ‹åïzS>Ó^µfÚɱm^9½ØZÙœ5þ,$íЩb¬Ä䈟ºŠ‡®¶è6¹¤}²·-€LICµ%ŸœOÞv}`ÂéiÇï͹—1“mvCwœÇŠêžKF$U=Ÿ‘~B!Gõ<®”6/ËlY4:Â"ä€VÎŽNX"ù©¬`y9v1HÜ 9² ¤•½Ú4ºJÖ„Íh¦Ä2°òüzõˆo u`ö0y¤¬h“×!ᵡBÄę̀˜‰:º2ã:–Õ*¼O¯è~´Ffi ç§s wWe‹Ì€f2i²a­„›|e#fœRR# ($Y³«TH9“éK4ÕÈèØí›©·% bRAÐ(«;4³öýÂÉþ´ZÂ&t‚rRíÖÁÂ[‘b\æÂc:I3 k¤òJ0{õeÑÝLKXÍ©kSé‘ðî9!(b6PÆ'Ë”)C:xíÌ‚í1T“ &MÞÃØK²TuNÅ"ê0cŒžÙ€læ*ÂÙÓahoŒÙD4¢P2Øbó¸S‡‰ÆÈy¡›¿ƒ-ô+D†b.бh _Îâ8Mx&^¨ÄS`rè§Oã k0~eðT€ U¡›çöÔ ×'£v2×ú$—AP†>¡æøž5<\¥°D΂p^+Ñ€ÖйÉÝl4'<1Ê@Hº¦Ë!žp£ƒ5SÐÌéÂÖGPŸòÿ‹¾/n¦|ómƒ˜ÇwV#ç¼ùý†#p;Õ€‡­“~öb >`[ýf2ZÂ/›ý/ßSZÊuñ ðO‚ˆ¦Ì9M6rž¯5‘µ^l‘¨—T\múX ‡3f¼Ûœw‹>ýr¸6–u)á²Pæb¢ûªŽ¸ècV˜,2Ö.ÄóÂ"óÇ…x^XdFbkp\ˆ§a‘åHøÊŸ· ñ¼°ÈŒ>.ÄóEÆÁ…xY¾[âiXdñ Ç…x(²øÁ…xÙ=¶¥¾—X!¹Ö|‰,ÝßœN§!‘Å'¤éƈyÈâW¤cØœ„"W µ·•X¹×\GyÌëXŽæ¾Ím“Pd÷ô©¹-¾B}#=ÜL9‹,~ÆÙèþ~ÍžÚÛÂ’»oÄíê´ÜÂô‰Á­ÅµÄ5§·u͆Ýâg”;mF·P!W7ÏNB‘]«6§q¥˜Ü)©÷5²jt±Æ ¥RzM·ÄLÇ"+±Bò@¥CÔÙt(²Æ)ðI(²»Á(ï#ö¡o7:ƒîqöis+ñ;ۺε¹];ImnaºÕæ;U»tÙ¢7ˆi²¯sNmnw¯J½Ç¶¤»—yÆ'ÐèÖ®‹F§«—fw‹ß‘ªÐA[#¶»[8Ð7C¬ïëªã9)f·²BuE­f·TBj8½¤_·CºZÌm`e¨!¹Õb áæÝ¢YFÖ¨ÇgxhlõzµH†5€’Ñ$Gz½·tµûNê¡Æ8ÆA¥Å™·_-,®Õhǧ˜´çDa¯¢Ùíïó!žÛ뵮 ÛU"z¨X†¬²Ê9·à-có×ÐÞ|!¦e¶0N_Ø6pm`ôç~§a‘«kƸƒD²ædªç eü ,<r¡ê¥Jñ¼’Ç£zi;˜mc‹dpUfñØî¦òCèLÄÜêïä©ÕIdR–­¯Ÿ<z FÖ+§Ú¨ß­Ê›¢ý&—Ñ F]ÐçG2›ŠSÜżSƒX¼3bów³W ^ÔƒŸUÙ#=YfǪˆºvc™NîìÆ›&ÐþÑÔb›3Mqrv-™ÈÜ“ƒzÊQw”ÒèENo‹%×§Ô€Þü=‘-úªÆ†.Ÿ@Ï^üqE\hŠz€)c*…Ád1! Ë Ã%\ø¾®ª$NÂŽCJ_¶¥ÙbÅAs ûÞ\ʦ³NèEäxSMÞd®°Ákb¬ìq3¶fñÃð geHUüjG6Õ4 šÞr3ä%}UºYÉÛ ’h‹åäß ûYBÁøÑ z'jܲŒðÂL)ü™:(Ž\©,ÙÈ6“TߔաA3fNÒÓœ{bÉkX>ô©þŒÖµÝ̦҃ïöa ΢b‰±’üv}é7=nHXù=ÄÓ>Ÿã„+ó*èüî0Ró1RéËH¥¿s¤2àµ_#µl¤Gªu©Á‘J–¯‘UøÚŒ”§çÓ i<–|pOMÃÆM4#3ètÂõ^JpX“-C–1Ð 4…ƾÜÌX­ÅhVsô4èDŠÁé:§À” ­c_Ñ®Kí¡°YÉB&z !ˆVZˆp<<  ÙSÆØ£xoN«®,4âªõÏ qM†(R`ü=öÔ矸tÚcéÌÇÒÙ¶t,QmK×Ò¹SÑDRÜTj^»;~c©èãü÷©_UìèèX‰ËòOÎçW•/_U~÷Uëþ*¼#3Àz«­íþ*ñ+g›…¯Âw'õÔ»{~G?·OD›=JH~<×ÄGðËÕ>Ø«§—tÁÎ "yöLºØÓF±hÑ*öUiíPVhÁ°ldÓÙšz„^Ü †}5{DÑ—l˜L ¤Óɟש365¯ ‡Î – …|›<½SÍÄó¹¥¥8xFs®¸Ä1iµ›æ4›%7³Ö˜‰“æà™àpÐcž9ìTÚï¬0IžˆÀ€²éÀ‰Kœ NŪ²5+‚ØRmtíÜÇfÊš` ›·ìóÐÀ¼éü‡­Ž1¬¤av–m›/¤É#üæ)\±äãñT¼ñüø??Ò[z½¡'øP¦W¹ý}k:‘Wóû¾ýoÃ8xû_?TmŸßº,ù)]Õ„é¯ï›ì¾¦\¯/¢Ò‹IÑ|^ð¡Úd9ìЗðöÐ?ð–×ôZ‰õýŸõvŒM¶¯QÐ6k]¹zö‚RQ‚¬ïrЀî tã#Zµ›~Ÿr1yyð‡ÓŸùìú“»ŒOc[|¾–¼îz-!àÜkEvM«Î#ƒn8G^H_^‚˱Öåm„žÖeœÞ±7w?L{x½PzØHñ«I$£ €@*ôœ Ù¿ªÇ®•|èKò:m¶æõ™þLíÄXá#kŸ¦BÕõƆª>HKÓOÍ]Î1½;膻¢èin%úš”Y2q7{-ìb/îk=> “_ˆIn[dirB¥§¬n…’yÓÌŸ¤zS©ÁH‡ %`ZÑ4± \Èvc¯ðY¶;:ë§a–›&}³’” éôDþˆÔÔAVéNºOÐyðBØ¡·vËÛluÓXþÌû«l¢y#?ž¦}¼Þ¨}ì8æä°u¬Õ‰ˆjͽ¤ãHÝ£òkè‘–àHÞº|¤ÍÔc¼­éÏD?âwÞ·RëçiÚÇÁQâóµd” O"àvA-D—Õ'Lé INRd,/‘.Š$¿¼ölO¤v£­ð™ñƒ”gOÓ.ªà<_MÉUú0àöwØ’£hx‹ç[þøž{­vÕlt×4 à€JÿÖ}ü ¸Þb3ÏEùåܘÄJĆ ÛéäO»ÿ‚=çØƒüËŽþýˆex3þˆõxDpAz @ÕM°*­:Ëtn2 †˜A(xqÜÐðk–ÐÍTEÁãß¿pñ®Y®Ë'­TL£iÔGÅgCß9ô‹CÝ8ô‡ä ØÈ//Á°e§ÿø®¡\6”AzáPfÚ¸¢hôÊ é@ØÀ}B1ƒÈPYü諽.ÂÊ”·Þï¹vZ0¹!4×ÅrÈ‹5¦ÎŽ™«ÄLhƒþ%:b…+­›AVÀYÌÍu¢!ÿžötÁ ë1_ó1_㞯ñœ¯ñ˜®zM×Qê~ôiØ0murÚ0kƒËÓœ™“ ½šÊH äIQ§ZŽÀY˜3ÀŒŒÍ nǯáÜ6œnŠèý1œåÏaSó”8hó ѳNl‹¶úiæ¼J©wLf™h°‘)Êöæ„Ý1ö §žˆ·–³¦Óž¡“UùRؤt:èn2ÉAÜô ]°hÅžŠÉH¹Ì»£„¦Ò”ñ€\oÚ‚/CɆeoìY³ÌgNx±ù6ßó1ßãË|ïÇ|çÇ„ï/¾¾¿o±3ÎŒgNxˆÂzÓR¨ÉCtzµ&2Ÿ°hòØ¡á„/¹BáºjO0YÛ±±’åÉV_-hœK\LŒÈ †¨mûIÇ­=Ÿ@ÌíË?ï+~íÇ?¿\ñóqÅÏïøn'–ª®xËLh3÷Ã2‡&¡ÓaWÇ!†@ê6¢IOcIdä=^NtúâºêÁhZíxe™±z!BJ౞8ö gË÷º/úõúöeèûcèÛcèÛ—¡_¡Ï×Ч¨ï˜‚§@Ãór³h•ÆØš3 <­2: 9ÝåVm<©º3Õ–¿N[Ù¤´¹‘1Ñ\Bgsß,jžÎ*C·œ¾tÎØعóg_Ûß2òmÞ#?C¿ØÀLûˆWöË:îwÑs. |¯6Œjs.Œ1ý®ÄN¤3 ß’>_ žgZb9g*nÂů—Ls÷¸‰°åì0z™+¾ñl>;Û•oC?¹)ˆ5B×'Yå“÷³Þµùeڱħ#jè™_,<»ñ\iŒæ‹Ðq°/“¡ºàVéã7Ö;Á? ÝÁ8Uî)|Ð5îí1îõ÷úeÜçcÜŸœ*}k¿aøëº‡ØK°Ân§N·ñÄ;“Ñe:þœ¬²åádÛË»zÓæR8¼ìn©Æ‚-r/…7Ì—¤‹Ÿ®¢ÉN~vjz.1[ûýËŒÇô{ú—9Ø9(ß¿öëcíÛ 0i?j”þh?ÍOª­ŠZexN¢YÞÜwPoIޚͦÖÁñF¼òÀAQ2s2ó )´*ÃfcÆ ‘;´ß•þÕccÛp—m v^›â¯q a!ûáëZ£c{ù   ²„¢—GÝð2&°ìnÎDÇ‘…ùl@†áá“—CâpONXòëðÌ…¹÷ˆÊlFˆåëØ/Óî}\H î<@©²±~&=]^,d%†‰¤:„ö›Ÿg¼äÇŒÿùŒïA¾øŽ©¯÷ÔÛTÛÔ—rMý¸ ŠýÍÝ-eWØ©¥»¤dÎK=3¨@"Ò£MheèòvÁò†dw$„ªŽreœÂئ†½ý_ð$Ìûý zªfràñMç%T,›ÍÄŠo„ÓÀ&k†± l]Ý3™c­[;8­ô2]ÂF(§”4ÞS:;aìM‹CérN®™Á}ù×üv~žqð«úzg$Í5 cø`"e¯êDıïv\éõëÍ¡Öe>¼ ÌS¡é{ŽÈO©ãj’3Ç‹¿æ¾äÿðq?pbß1þ~ú¥u¿é€ÝZáüÅoèjz(¬fuˆT%9ä6UˆÙç aîØ>; ÌÝüÝ7œÏ¥ÄÜlu?PlPƒÕ†ÁŒÏé Û¿ØÚOã|Ž|ÆÈOnŒµ]9HýÏ&@J¦´a8†Ó®îiC߸¸;3AèI•+3w!_r RäÞp ÌÈ“-#jB7¬H¼i‰Š=§kw××üÿÒco ÿM˜·>ß”P§ ƒoŠUðM›pE™,:Kc-t$U×Ë,9}Fhš66 /ev 7 ´‹Æ‘DqXàÁœ®ù2ö*ßCùÿò$Ìc¬Ã$¬rMk½‡¾û*í‹öó*`ˆOŠ„PËI’8è:ÂD®Ø0;¸]µ`¢‚‚sfjtwáY– bõU¢¶¿\€×´3X¹2(Y¢êââà²ÚcÒþ,Cì·ìÄðIA£ß¿YVuyŽzìLEºy3[b@¨G¿q‚zl»{õ²ÍL>°S”Ó†-V¯žœÌ°º$ %8(2…}‚³Íä–ˆ3ø“{h=­àîŽù® ³æ=f²RµE­»¹§›´eØ]…S€-t‚jSаÂ5ÒuS‰šÔ»âiùÐÔj,PRï±Ä¸eìIêœÚ[T‘U†X/^æ­;]±ûeÇü™,Sà|Ǥ=6ŽU°I˼{¨€%Ô´œ­d‚|¡ŒA.vaÛX&à&êÎx;WKš<¥*þš“b&(“œ +izoMɤªÍw“I/tº05]sP4 ¸´CïeRÿ–™3SºÍ\³™£s‰ '„†É¯– FÀè$enÔäoà»êÞÁ0ª¾3QìßôŽH轛לši-:h’\I{pâÉ3ÊÄ7l¶D³M#?×<¦Ø8¼/Ù\ÿÔÍöm'¤ÝJ6e¦#ô†XvBºÊĤYüs$7’d©HÙ œ`"ì—Ïõ[»CàLͰ6Ðàrª€[`Ž•‘S_hõßnÉ…JÙ€«Kř̮±VmÚŠ‰@ÏÀÂ?sÚ¾kÒ†]k “f˜AKü †f¹Ô©<ÓDEUhIÀ€³¬s‚53QÓK$1Ó›m‚boÕ2ä±›ž… Gܤ/Sµ˜6ݘñ˜öK|§¿í–2ùÓæÀ36Ý6ŽŸƒ:©j¨ÜÊ > MΩùÖá «–r\,mb£lê’S5™w°ôi¢W»c;æB¾âÍÓ•”` a3v‚]- Ô”ò%.ÊÑ®n ž3™XA %›âY¹*jk"KCAF&Ú¥„†—âTi0ò1pf/^­‚Ù¾_Ñ\ð´~wB{˜áo;~®§ øG.¿þM^kÓ™"[~ɤ ø„¸­pÙ‰Õgž¥Ò¼Á`˜h—º™b7€sÊÔ;iŠ·!pb‹u¶‚ß¼P¢÷ ¤zÉ-¼€–CṜ+Ô¨ž0OZ]Ñé¢A'CÀë¿Ã¬ž'Oœ‰ý“Åu/ê ˆå¸‘L42H-aôÿ‚)¤”U¤2™’¿â…Öf;&ÿ¨æ5¨ªßà°ù¦¦šIC>Wæm:ߟz·?Sššå›¼^¦itÛ ÈõA<3»LW²›²“ û ±Y.,©5?¹5#ÇKbn$NP§‹v/ O*æÄ‚ŒBrªþuSDN@ Þ@þ#•ªÏ k\¢í^ä÷6 örakZ}0ó›{š.»‰€XöþÍX–L¯§BK&Jh„l”'°rб¯„†.‰ºHqSWëѤÊÞ… ÝØDq^ Û 5&V¥+{7LY³:\zˆià& 9‰¹,±LY#h\ÖÛ­q±Ë?úÖ¸Œã€ˆ¥x\¹LÓ·]Íf ¶uj.B¶N“™ —Iý™;™¾U¼u„‘†@–)¨åÖ³~,)ÇÒ&®ÅFÚ]¡“/#Ù¤»‚×Ù›9‘„7¬*-B'‰M­R‘'ýPìè4Á[w›[Cø5wdñДãÜÞÀK‡v𵑽×t©Òš2g¥dñ¥z:¥‡Ÿ4Ù‚Þ;¹ùâΰ«æÍx€¯‰:Û÷œlð«aeµFh" F ¶1Øø¸TqäLÂ^9¹~‘“Ç-'¯õ”ÇSPAyp¥ŽïÓOU*tÕ$Ñ7p\#»ôEÿœ™°»ëÁÚV_Ð2hOÚ°/ ˜ƒóRæ¬a ¦²’‡”…&G,ÕH4ÒÚp’Cxb±ŠÐVVÚÇ ó>J ×Ë.\{ÊÆéò·ȱ“ç¦4ÖžZ/Z}bçÚÓL¶z1LTPÍ2ó‚ë¹Jݨ-Ö„¥pé5÷}T©$;Õ<žõŽˆaêG[Lí±˜Ús1¹'Œ­¦ü\Mý›üÃ&”\a5uŠ(ƒÆÊa2ë‘èu C ý_2“mm$ô“#âÈæU 1¹;e±¬rؾ´–¹§lå0‡€Êvždsâ iã`J| ™K] kc”y#ÊD§“8Î1äLÚx7*½2iløì‚(û³†Ïr×YfŠò XÜ´ºm=¿VÄÙ¡g~;ÌÀª>`‚¤$5ÜErÝ¥•¹¹YÈ4ì*ÒñºÒz(-µ²àªZ¤‡Myíl¡‹HúM´>q[v?)É«?¬w ßút[î¹?Gd†oZ&ù±LLI¦ž‘]ƒa£•¬fEòŽÍˆ Y(Øû‹€ºÐ _Ï–ò ÝÒc =Þùx ¨þFE8ß¾¾Ë”Ê‘ ÞÐæ¿ˆÃš> «j` ¿ÏuvFÕQ6^Ô3gǸۙ¢M¼Ðnl*µžPÔ$$³#‹˜¸¢'%‹¥ã5)PoÒεÚ3|¼0]ÿùøo:sƱ¬cñŠþJîûJ5p0VWúÏ-®>˜æZpœ\ô,RÛÛVœv°RÃìó]zG:Öñ%÷U6æ€Ôor îücúº¿07(hôûh.Ì.º ¸ÛD%öF|Fü>Dêœï BÕo¿/Ó†ÎL ”ùÞâ$i~áèdOF®šj&apDÑBÍ;—2Ï{_ºêWð›Ûóg<•UñÃô˜åõ"ºjýV稯ÞÍÿ_‡¶à¦…Þ=z€C»­o’e‡«ökÑ=²írU?ļÝÁ¾gh(2uÈÈÂWëÏ*ÊUö«U…cX/Íz>Lê ¾_»¢Î(”•õà(ÛuÓÛ Úìï€Ù_?4gü÷×èà6¾IÏÚ©ÃMJ4Çsî]&Omq<43/ ˆvë÷Í]ÂèuS»)¹¤ …ºHlùÞ.ÐÈœý³äßsòËê­ûž2cÏ*8r€|©¬a é^Tï:3¢R«™š’RÁ~ Õ>g3Üí^pξ+8¯{Œš4úp‡eiAR-;ª©§¤ÍÃÜ‹+ÆÓ0SïC 8ìýûÈÃëž‘ÈoÓJuAK±Fud–>¹N(Θ: e3n Ò/7L¹NWéCz>ï ] _;Hæ+…ùmÂV§C•tΔ€Wí«™„¹:,;8žlpû.÷’î>?•hÐv¢|²ûE^ñnRƒi9ixHd¤7ùØ•†ë¡”äö£Íч7!­[4Ö(ÜÁNhTÛvçl“âv¢Ž•î¬;qâ',´Žò2OpšÙGiËÖ¤:¸¡Ä…Žôäqa?ÈwF¸øðŸ×rÇBÚ• ‰ü\nXøYµHö=3x•´בZ÷³ŽêˆëèË"µ  î Ó€m¨@úJçE;­·* f†5 ñéÆ-qß…'|݇­]Ý‹½¸ÁGÝküôèDë†á°s -n³íáß(‚Ó£MÆèW= Wͳ×F|ÄBZ)²$» –`µ§-¼œ÷Y«‡Ó¯¢_ôð1†ý¾üÿëPL_Áõ²¯$ƒìHì2ž˜QÓ´|x‹Q³ØYì‘ÄtýãË; `ðŸóîßÁ ^˜´w…,,ÌP‰ Ü=û»àr"Þ+ÛÕÊö<à/·G¯Lö@ Zݽٿó:Í톫·šš é¾aÿg£Dh³a :ºõÄ3ú -`®~<ÁÏÓ0†á…Ѐŀõ–âìÍn8{ÀÝ+›t2˜Wv/×i›Æ·ìñfTº·»vHtÁó´¦=½Ä^˜[GL@(¶"0ßXu“Ζ"j9Ökç3ˆÄœ‰‡g*-x~\È‚*]œ§}z‰½ñ@Ã*¤ÞX€Üˤ3h‡äè#J^OU_ ÀöÍÌ’ Ìà7 úôÃfÚãÓÐǨ6“ÃØuÝw9ëè4yH¢‡Ýð­;8¥ ÞÒ Æ£Ö€…x÷⼟öùãñB |͸¢Íü§ô0ˆÝ¢jíûãÛ`¿0ÌO­óã–ý›ó]ò›)4›èÇN‹B Å¥ÎÎ<^³^î?ëõÏíÙæómÀàž’l~‘‡ÎGe½M4ŒÝ^í›%öŒQñ^ïC?~Þ¢oxZAsT’Pú¼ÔääCLOfæµ´S¶dn{³g2·¾=ûñóV©\Oûüñ|ãÇ[óJÕô­Ú¯g\=,£¦6;>£ñòëÇ)_é=Þžýøy«Ý®§}þx¾ñ:ÇzÙ^‚6š#ʼû¨%Àœ-öŒU‰:Ku5ÝýöìÇC#«nÍö´O/¹úØ*}šæesM)¸mÖÀ3ô ×+R1ÏðL¥½)C?ZñëiŸ?žoü€q0_ʧù°i=ý1u ހŞý½˜ß|:únëow?\£b¦ŒëiŸ?žoü ›Ø5n;Îmv#uè£–è ¨xúÖFK°õ™ú^sNó~ؾvsÕõ´ÏÏ7~ü8†qWkf ðF—÷¯ÆCž‰|B&†q‹¦v½2ËùJëÅCf§ôݿկÕÞªZõîàÂîêD÷áÊú.€º“¦ü¤óœ¡üºzñP5_ûüñ|áÕÑQ8L;TÅpítIü™«=A‘©¨ùD¥×ùHëÅÍêyØçÇë>PÐý™—¾"Ç!¦Dh bi³– ªMÚ­vì«_táaŸ?ž/ü@IÉw—ÚM~Õì*Üø0˜4Ñ·@†×'*]ÚÛ³?ŸÚGżöf, w´ª…Â,´ï$Ò®ÝÖE0f*Hò‹†î$ãLôqŠýo_5[üoX÷¼‘ª˜ÀáÄc»!úõ©%ǃ+ZÛ°Ó­¸zGéþvõ¢ïû†¾6L3Sú=Š%ò>GWh×ü¸6©5<µdÆf õI•£XßžÝøù õšºþ­=±=ñ©›z`q¡l£÷°g–T×@îonüü…z U½‹½>±÷{ÐýädO—š?÷~Oýf¦?0»Oúæ±_]]‘^xE7èaº«ØøŸëÓ ìmv 1Ñ”šýk7S‹W~ö &z”\ìGÒXø¦Voz?;hwYOY‚v{¼*V†'Q=wÈ$y0%WÛ­ŒÁ3/º?=…½–}¼ÞøÁ{…w„Â6Ňéà}À¬Ç(1Ÿ>"G¯M<2Сóy­•¨×ùüq¿qÛ•”™ÙiðÀ×{]^‚Î̢İ”\Ãx9¤à™í¦Ç| £ßk×Ó><ßø‹¥óRRÄV7ø“t¥=†b….÷áäA¤öéÓí¦øèÇ}±ÝOûüñ|ã.–ÁkJDZLH ³CgW$Bövq¾ß‹±Ì{¿”‡VîîÅãZ‹ûüñx>]Ý[¤©ÿ‡uºU¾×Kþk—Z±ã|—­›öãÕóew§]®w ¹roé}„6 nѧÍUA›ŒÊ$çMÑ?­Ž||©‚ P¼àùfœz5žy`Ü\õ¬£/šC8\™3¥ ïä1 ¤ûâ±OyÈJFê Èétn[ó±]}HÀW™»å7W"#ʇ´çmï!zÒÓ¢¸„¾¶9˜Hô`j3oÁu¹I§Æ(IãB„…¼a y »‘:â±úêM?½"¸%ïT˜ÙèTJËX¡²’V" ùThùÐá Ö.”ëðk¨ùÐʺӢ«/‚?ÓèŒãÅéÓ)-i²ê”Í«`–46È>š³6§úÕbFg·ÜçBdäMg½ÌT0˜\’6·÷ªüyWS(«7œ¦™hí¨gTƒƒ‚¸ЄÎ5YþãËKœ¿üç¼ü {y7ùüE-œu  U-k¨ãØï¦7(¶ª9öXusìÁãܯçîÀC'â¢[Ïõ*ö­ã°$c)t;|e:ã+YrœzØÄ|zì‰æÓóèÃÅW^Ïâà…÷ñéœTØ%•ŽvË&8Ç®©=Ôóá3R¥SŸaN>½¿=ûq±–ú´œz¬ÄxÙ”dr·ª–#äÿTÚ²k –%dzmš{öØ3ͳçÙ‹µ|<íóÇóúüLÉ83B—£JhCcJŒÑÓ." Æ={Ø„Ž=ö@sìyvâb,Ïúô’ÀXJI9|eëûݲ _Ù_øJ–¿kc~=|¤¹õ<{q±•‡}þx¾PÏleŠ«³•M¢IZd+Yb.0|†˜ˆÔ­gà:­Äœ|ôãb+‘Ü­ÇJ[ÙÄ?¶RhËš”VëAà+Yr{ЦºcžYܱçÙ‹±|<íóÇóÊù,hÆÈZþ=çtCP}{î×|›oÏ׳üq=ÜýúÛÃdxO½Mn.äç;ž·Ù?ôÕ_î²»Åç×Z V#½‹xaªVBÄ6H`ý;×›l}ÆY‡FZÇH?Œ\§wú0vO7“?^.Ÿ«¸°¥)­P*£a ºdõ.N/ùˆ%hiyf¤‹{ÊÀVxú¨Oã¶®ç_·Ï@Ÿ2/'œó3ãœ(Ï-¹q**N¤û¸ébjÚ[Oõi¼Ïf‰Ï—’ÚPÒym¶Y<ê;~ Ÿœ§nZ3ã{Öz»hy棗Ýúñ4Þgá¼/KæuÃëhUÐà’%I{$¨;Û#ÁOóz´‰´<óÑËúÿxÚççya&Þ˜›h”½€ÜMÞO.jÉÇýš75ùèÆåAñxoݼâóõʬ¼2yÿ$ÞG¥ò~¼ŸÖÝG-ù¸KÊÕG<óÑËåñ´ÏÏ7~à–›¼3ÕvßÊ+÷Q¶;nó¾*wµäã.É5ö Ï|ôãræy<íóÇóÚÇÊãz"\¥ÃѰ惱A#:’Q®ƒ%ñàÉûœ“Ï‘æwþj‹Z¯TÇ¡>ÜVÂKu2x¦°BªëK4x-…ÚÅ£´Ð’xò°M¤s¥DõI¯’×BbŒKV±@iᵄîèœú¢@ôÍiEp—ôV] F©‰X;©šn”¦X ðm¯ÎWè†%#‰ÐëTLÅ-Û¬lÅpÈ«âsUW8EW C[õ|+m¨Hà-4% žÇ9ÈÕlJtØlzYÉz¡C¯êWÐYŠJô2ѧŽz2k¨,Ã0ßtT{稢A(¨–dÔ¨Ûk€Î¡EÿÒ§UŽiÃ-õ«öQ|èZ`§tÚ@BÁ¹3à Ìk_é¤f¯ijˆÓi*jB üÚŠvQŒ¾¦ aeU$,f·,ry "䨷%T‰\*â·yÕ$ܯ‚…ym‹ ¶&²\Ê‚”‰S(%¥¡D>{µúÎ ­‚TV 8&ÒüW‰^7jVÛ&9+]¤ñÊ'lýëo(b”Ÿ–Ú  ¢Ÿ©¾ÐTÎ’ì \Z²W…†Ri1ÔÊûW¾Cöª€;¡ÂÒeP±ùº Ê»¨ý53€žÙE‘&dj;×MX?#X ®)ùkðÖÕe“YÂe³h `z‚\\µ€–‘e‚·©/ô‹Þ8‹^gnÞšø}òU°\v†9KZT¬;Ù{ÒÎWRÒx@t]‰À°Ò  Ú¢Ú oõŠ}­DMı$–J š¢+SÏGñh\Xhêc! O4}«*NïkÒñ¼ÊÆ=Ÿ&Ù³UáV—ÓÐÕT°X˜`+R²µµõð*WZu¹pdât-‰šueÍ- IÖ ÷³Qõ)]Ũ¬2òè;-ß„à)YG©céoê7!»Éök¦ï|Ó;¨šƒGri”‰aÚ¥ã¨/ÐmèJk\<û:ÓŠ&rÀz[¾àΙúg„EÕK§U±åuqvÌ[Uƒ-ÖšÒÐPÉÊRÍ)nþXKJÃZÓ¨fÊ¢ÄX:‰wÏÆ!&@È•Çß±x êÔIÔÁ-‡ô³';7’ñ•$‹XQeêQÁsPoT€.ë¡¥3'èº2Sø[u…8r°ò¡èʘZ¨®¶JÈB[x4Ü쵤£ds1Œùfú<¡¾\=š’P–£ž¬5ñUãò‹¯ül:¹c·­–Š'¦Žl}T'[Z]\º¾Ú;y Ìaà ڌoX¾‰E|Ø%óÜP(üÏõѶqj®…'Ëäú(ç<+êg„‹ÞÄ ‘ëmá‹P„_’#Fy– ÝèFv5Fÿk'ÝùzÝëî“|>`¸dk, ›“ÇOC4]4×É"ÐËÐDè¤È8¯ñUWSÝ~°Lù‹ãÆœÀT¦Ù uÎ*˜X¥ Óv&‡¹Ð‰UÎqâÕf'‚*C18¸©\Ô¯Çp®3Úñë¦b\¥7לͫ%ªª7½Ë¤„Í*°CU¼`ë_‘r89qL‚Yµc”œ^uÑŠ£=°¾<øU¨2JÛïÎwÉG–¦†<¥w8èùû¢÷¯ÜizŠUú ­“Û .$"²ˆƒL·cHoèËM+Y>8¸2™Å½"%•—qczIVåý±\iÓF _nÛ<²†-åWïæjžª¤“Õ‡ÜAO¹=Ñ!¹d½ƒÞ|/Ê7_þˇ`å•Ûpƒ.‹$Ìý GÒ”Örûè+_Æ*¸ƒqÐ.:Fê…„ ­Ð 2M­\í“îªZ2±ÞÓBÊRy#R߬~§ ¢5,ÿi‹¹b‹vZb°#5´8^´&mv+Ðöe‹Mu½JËì{ÂX¼áy4ჷ[M§ ’ËDÀ>&ïR¢òlCëdA$“ÖÉÆXèBÖ¤Ú+&e!åŽÆâ|óZèr$M̵r¢¯¹Td_Ý ºzåÁ Õ[i“ÀõZ2))tÔ(ðF¼¸PÖ7žAŸ£_Ð8€OG)Ñû£i☳CšŠ¶g´ȼú̉E<¸+3/\ýÌ öÑϘyE·ÌÂþþp¡êò¬´ x•|»,*îñÝm“©€ç›j€-hÆœ4P”U¾vS¦l¸#˜7Dv™¼SX ¥=*@vn™L¹•߸Á6€•Ë&kËNÛByH—OäM®õÚé|6É1i yÅjؾÜñ Óß1Þ \‡¸mä\]Ý\i°@û¦–ù÷¦:Êø4î±aÜ Ü²¿Ð}qçWBy/"dšBDºPéÝÓI›¹4ù;`Ñ(%]M¥á†O—€J-½’AßD+ÊÍäâüB%É>8#ª«³s¹ë¿Š0®+GW·Ôôº–*K ÙÔ zNÒ4Ô·_¢%u£FGwg©»¾÷wÞ*î+Ô†™»˜'K?/¼Zl»Øë6èA®›õÁÐê'WlŽT°YÔ‹±eòåT>ˆÚÚöJáˆèY,I¨PFceœs’}T¥ÛÆ^Ñë"ÞH›'gæ*ÊÆË¬ÍÒõFYúNsYºróPR¯€›É}0¨nùzM`ÜŠJ¤€ý™§íVOH¯|£î†‰$lB#+”è\K‹övÓ*þê£lJ#è’*Ï öA¶H™ÌDÄá53™ÄFksáWè÷lîÄM5ÛÜAû(øT á„ 1NV9M³õ§”(ƒ•¾qœ“ÜE%÷ÚúS+Uá+m€ t ”LÖÈoÝ:ž°y´×§‰% Tú8ß[\Á \WK‚•òRÈrù…l{(dþ!ÇÚb¼{´–årŒ¤Œ0EÀÚxkÎ •î3'raUB¨hQ‘c­ ñhjB´×Ž´¢ôqémÔ`¹}Ï(¼B7a嘨x£_cÈ‚¦Z"AU­×[uC‹`HýæQL+Žšð^£:\«2É3Ž  ·RËÈ0#¶³…jŸ*äZUf#-Ôßë¸Y„1o¿Óå_–Ûo§ ij3 ™¾Mç¶íðö‚x4ÕUåèƒ;9rX³DêzÑ×g\†ßoþÄç<­cò» ­ûô»DQ¨J‰&FÃ÷-RƇœÉZ/ÒSuûBåñÑÅßóÍó"(õ¸}Û£Ëôß"DõŠ!Ë’çš z7ÚKñÖIK¸ižœÚ±Oãø’€#kj`Ú©°™w€~ŽÝ£ã;éèÁü¾Ùƒ¦7GçEm\XÜúFÞó%·ÚîéÐöw”iRèág­‹Ü••ƼٶÐ6[¢}¤Üµõ…É’ì+a»dl|¥~†á+·ÚåÏ$/Un((ÙFÞ'´£>£D±DÇZ…a‹ë#e¾6-Å]të›'R³×Xª‹ó§b‘ð‰©ò¼~{±~‹<>Sì߉_¡Ú—×w‚Ê!VÉ\QOW—aéXHè§‹¶-³¢Ïl¤y<Í—baT½×§F¥rÓ^Ë•çIeÖKúkéÒ,Öee)ÄjB(¿ÌóI'¯¥ä”K·ßš>RÓ™‡dËüˆE`¨ö' =èÑ=[ƒ–žt¡É«’G£öoÝ?KÑ,±…sOH¸JжÉIý[ÒY¡ë"ÂX/Nß6¨-ö!u c}¢I¡ÐkýBÜa¨­ñÊ)*bÎzúîË,¬Ça{¨zƒÜÏ6'[u)²†3 ° §ÔºÝWÕÞ<ó¼ÖS†ÇMT<$LÖ‡â²Iý À+W}Ø,”ÚX›Ô 0Q ݼµôZ¢›€E«éšÈžmB”Ú½ØRÕEBŸÉJQ½=žCP9å~þ%‰ÅQ“5lв )qIš—$iz¦’n±p’¦O±Xl¡wß&†™ÕÑsרŠ~3ßÏ],qc=bÈ}ÆÒ|vüÃðÙÄ›½âŠ[¿Í³“§QÙš;Ò»öç`{ ªùÃèÞÍ’*ƒ{È-ÜV©LÈ\QتœqÅÔÔ]b²ü«TÑË–ä—yþs·¦ÑšæaŸt+†áÅᤠ«—ò]‡½»ä ®£ªžï›×é"HCÙ $’ºÆ‰á¯Àÿjk«–. àpÉòXãŽÂ‰^Ï3h®OVBWÓRž™±©v$C—©jhAº[xåÆ*¸vJ{iѪDº³»&AkÜÝUÞZ&ž'пçáæ}8ÁPzÚœõy j}žÆ^yRú¬«®E‘ÙC—'!«Â‘ØÒÍ÷ëY¨§eŽQ²Œ~Mb Œ°µfC×Þ¸Œx°ùyrcžr髈°º(.C.œ{îÕ~‡Ô½zúîëãëuaZÆnè:•%VÞÏçº]žØZ®J¸‡bb l^ó øxÝfëíòÌ­òҸ¯,Æ…Ü)¤Õ$7Uc‹ÿO¯0+×?÷µJÍNß'%|P¸U’ŠªÈC!hUã~ÊG÷qkíš é´4™Uí¢©¾}˜‰ÔÆ>‰ZêY²Dÿ[ ŽK—«†®/[^®ö^gëy}EE´ñ˜ËÔŸ3zM#×+â`ŽÏÕ &µß¸Á&ú ÐŽu¡ÙbNë¡ô–B;³<º[á–Ê®cš&ŸAsnÓ>‡–@ÖD/KUÉýþªB@P°” u&ˆR„pk÷“ÏE G6³¸´-*˜–s×ö¨*8û7-"…`Jf I“m9ûédë/‰¥Ýšt[€ÿÿà´4MKé4úÄõ æÇDj—ù:U†è<æ\¶$k ¯ì§ÕõÎÄu<ÄzU›ž¡+pÈëjÛ¦† ‹“ —í¤À Ýõ¥éŒuDö¡¸Çýô5rÇ+Yž®¬öŒÉÎ:”«ù¸Ç}×â;çB‹tXi:!K£‡hƒ½Ø¤DŤ6=ul°¬8§M–Ç>Mö]a=“•¢}ÈÉv³VÌ}d&§/óg bí¶¡Ñnr\„ޏaN4‘(wç+{FOoñZšýž§ì¸ç}þ¡0Œ>”ž®‡XW®Â”Š¢)|²°¼ºéù0û»éÈÁyÇLø…ëÑ>=R†R^«vbd…è¤åÌa²ÏgNXΜ…‹íÌ¡{RJ‚®(Ò® øšRM[A+"…ªC¨:2› õ‚; RUЇ2ƒU~¶æ ™Iæ(M~IzõèТ(ü´vÓK„ òh R$t©Õ\XRǯK·‰#(w!ÙI2©øèI‚̤W©,©y¼CÇ,D…ô³$Ê_¨ƒŒ9è)šèîQÕÖéÓ›ã&UÇ!Џš¦ß_ßmIVòGu?{Žº=‡]Ï{7‚˜éc·ž³twUJWÀÉË·P¾o”•_ßC|° ›©_ ÌŠ´®XôñΑiI ½íæjÚ¶ö]õ7EÖ™¬¯]qȵ­¥¡d=´KŽ®t-]YUº3¦ãé_”(e¶çAPj·~B~”r¦«¦‚b¦¾Ðú–îž«ÎUErn¾,]3qtÍ\9¤‘Õ=Qè‚Wẇ嫯ÔHЄ„ VêfK|½2{2XŒ«ëÈž>2Ë¿Âí¡Dа$ÉtQ‹w‚&ûz÷;h±»!À EexØÑBŸÕôÊöƒ×þV«Ã°WPÉø"˜ϘV›¯¤"ÁIà’…ÏËFì+sŒoâÖöòMrš¿ÉÂÅöM n¹‡‹Ú¤·nØuT{d™Ã¼Ô¾Y‡½BǬGÀŸvq®ñªÀÌ’x:×ÜýŠ®+;¸µ£ì,PU×<ÝeZ†ëLéyS*ÛQí<4Jü*C4){ø¾v`s=3S˜¦gZ©ÊÂ<žíh9øÉ‘ íCú¸5Y[ý||3CÉu|©ó»fÙ}¢˜(JìÒ~¼ó¼2oXSíÁõu€SCÙå_ €zë kêéGŸœ®°kŠR\§k‘q;J•|ý ê"<нw©¯â£a ¨•jÌ’L•6¥HEÙüuiÛò‘cj“}º¿FsÄÑÖj»Ñ^= ½Žuo6î,§u(Lß«˜ßzn ¯ÃG™¯½HóÕç½Y¶½9qñ×l%­NÙj}ç°2²±çà;×U몬Òd¾òqö•š7yÓs!2œð²%—1¬ßNÊ|ìH×Qqx0¡}¥”\¹ÛB¬mÈbÌ8Z«dE‚CuC”r¥J‘&ŒØA…š¯ÉÉ¢ 7õ1çí.ß¹g~Àó‰K&µ«~PE“õœ6ë[¬–m‰ÖU…žJ ¯ /þø!p$“þœ.íƒL/_E'ÏæÑž×T ëššÖØ_³ôeŸ»ö£5Åtè)\S1ÏklÉûˆEÅÂÔJ%Yeùìk¬8¦UXå*ØÃzøqøÙ7–)MºÔïï´ÌcºæÈ—Hórát¥»ÅqEÏ?¸=ÿÙ<ÖU1ñ'2^ÞJ y¯Š†Ôt«1¦ìû*ktGÊQõKôj]•}þâ ñªC4²Úÿ{¿åµßÊ$½wƾÙÑkùx–¼)ú!ºC£öÒµF3Žovt öˆµËU wã{)Ó²Ò{Ópà9ÞF±Ykgj±´8¯ÊBÜ•c ä >Iã×6 óµ•¥FËL œ]ã|³©²Hé¼ ÅzqT¹Õ“«ÌÚåÌ™m̭ͩ5ÛT¹vy)É2“K× ßl²b0 ÍZ»©î_À§*xŒO ßÍ©¾¬õD=cmÖq"Í™ƒ¥ËF Ü-Ã}³§¨œmCIzéjíÔ+µ¨¨WPåÖ^\6›ë×õˆ5³êßæ@~{mÛ½víF ,.‚EÄxê0ÖNªnëÔf±º^»63gÞT\ÖzêT¼ÖÆ á¢ií:½åTŒe#öþÚ‹EÅžXh¶¸^Œ…µk­ÝkÒ¿*§C õÚµ99Uå£×ÚÉ¥ ˆå×T»ºÑ{Ö™µv¯hßÙ*ÞÒ“ÔäXYýh”®Í±©äLÖ‡>¸ðDrcc)ŲPãæGäþõ…åbTˆöwÎcǺ…zbåÝZ´¶Nhy¾-/Ôñ¯[Ý?e7‡hN7Ç6ʸ¶þM£ßî­í™÷‡g>hrwMï']pÒáŸD#¨þx`âTÒp>6zÕY±÷èYX”~nÊ ãÚž&WžŠõ*úõýÕŸé…È:M*SÁÄÇܵP{í#~3È'Ì‚Rèm) –\¨<]!¾}€Ì^ŠŒ4õ‹–_;[¬÷Bíýµø­¨Å…'eŽ›Úióøì%ë!ƒ|³§×œ ÎúEi¯-ÅBíýµúÌ:xñÔ“9_í¶-ÇÊÅVªtlxF7‡Wló¡Úd9¼v>¶T µ÷×>"èÓ+b°ÔÖ½íŽy)ÀUïP «¢RzÃ=EšÊžÇôZÙØ=/Vjï¯}Äoö´2óäf¹Y²6{]Þ¬bz=Xޤ‰qž ¤ó1ªÛȹq¥öþÚG}¹ÂžI7ÚqÞB?¿zÏÄÚiðöˆÊš š¸M˜©tácËÇy†Tææl# ^Ö+NQô³å`é¡@i² c¼q1æ¦ôy y«¤M wÑ‹Ø{ôÌ,²Êâók™ŸÃoç$Šüý¥GÐA?RI¹0~kåâ“P'ö¾¹‰ü¼ýöÕWsúÏaæ?‰ÂUù›=Ge[½'œ6·êòÚÙ¸; ¸Aí=z—;Ž–‡µYËÎ"+Ð!¥³HŽB×%Ý‘tÛ¹¸ÛA:±Ô9jâUÆUš»±›Â¦3];àE5ºÆNEŠ‹´}8ÍÖ^+›‰p¡ÖÕ“’^ä—h·Í•¨1Æòè–æ3è‰z&¨6sz-\¤öú¤%±Áâ8óÆ,Ž ½šµ²5ã>‰E•ý˜DqàÓÐŽqÔ×ÎÄ'UÖ®¸OaÙQ¢ßÚwP/}xU¯ÖW/Õën§×ÆÆêê@…z)±Â>…5®s6ÕÐØ¬›žét×qþä¿+i úñ„†,2ªtwáDù…U’;*æ7!SÕRîú¯Ûðÿ[Æþ•š ¼?<@•’TLf1Ƚ © [;.•„Õß¿y²UYß]?¶¡ÜE ûû+M—ÕLE‰«Â É|LÃ(Ò>Œ&Ê6Z,ýšË£ç›=!ôLeÒúAs¹¦6RÒ—MÃI_&»Jî™e$ñÊ­ÝKÞ+åBLœÑa1ÇÝ®g”âsZÀÆlLšnªšÔeÓˆRu¹zÝÖκ;*TèâR>ƒ^+}BÎa®ßÛ˜q2Ü€‡ù§{j#¥òG›‰[O^:$§«³JWF~Ë(ì Ý;¬,ÛŸ^ÃÈ‚"?þ"¹±±\T ±ÚUecÀÚÕ\¼\iQ­a2A¶ù˨ÝP2õ9DFýñ Ê„‹&ø¨cÔ墵úšÌ,Êo?™YL‰ÄS—F9Ul§p—òx ËJ§'0J4ÿÐUµÕ·£¹®ËbyõÈq-áÖáõ×:Ƹ¨þþ?]SóïýÞ)2à3·1›„-k¦n4÷ýšZ= ¶KÛ5—3ªPLj¡Û=µ:Œ-#iŒg S»QÜê™I_Ýf¢»jQ…÷´û×,³úqãávY-6²u´~çÈf”ÇÑWîˆãŒ…zJ>º jX¬tíÅ:+]6.¶»«l>=Û€º‚„?Ç,™›¢Ve6ÓIÖBÏÆb^좹´kØyìרBíýµø­{D†ó>ñQzý6b´âl=8gÒœÚÊA:ó8î±…Úûkñ›=Q‡xV}Énÿ€ k 2¥w‘K= a±dŠæÒneç±ße µ÷×>â7/“ª»ËGê^¶„qDGSغԳð¨HÁ“_|¸6>¶Ël¡öþÚGýn£IšÇƒSI]^Çû¸K]êYx<¶-s\ šýkçc½Ì£n.Ñ1É\¨%5‰]¿uTJªe?w•íÇù~C¬ŒÍ¬úÆÈUmÅ-5¨Õž<­»Žo´©ã«^‘G¿‘T â~Ø÷»ðçœ{]TÿkgzÙBáZÏyˆ'ÅN§"·÷ªÜŸ=וõdé7ׂߕÿŒoÊ–èFÉÔ´¯”ŽªFhoÕT°ç-#–ŠcL|”:“5žå莫¿v¤›Šï8'Q’V}D[åÞ”-,*5($#ÖQ_Niu³ø‘‹Gìõá”0ê´QiÚËȈn …ÊzöÈ“SFªàe`ñÌ™nþôâñîµü¿flsýù¡°0ˆ3Rã+øCI˜#ƾ©>»JN*csÓGŽJ~ްà tH¼õÕ}%ÄÇ䬶À¯ªìÅÊ>•; ¨b¤ŠîÙ´ö¶kë´*âlžÖr›Ö²MkÙ¦5ݦU/2'BÓÔý5#²kZë±Ýš: ïšò1%UkUlrl=ç‰Wå·¨Ì.¾Ôº 3d±»Ú}D›+^•yº?ìa®OÒ0p»mí¹ÛÚÛ–^Ý–Þ’LN<0Œ9""¼þ¯ô©£ó2@¸6’ :IYûS‰|¸¯N¯b)QgR«W@vTâ«Ð«‘ªh»W"æ˜/ü¨ò¢™Éª»(ãëeû “LËiòš§+Véù!¢ª¥\•Ž»½Ê5K¤×,eÚ³+KUâÇXÚ®êUÄ­—‰¹ä5I<•ÊkeĸÏ’”ž*ªŸVøÐç¢Í §èèðtÛniñíø£§˜ê?®ñ׌‰¯ÿJ²CT¯s™vJ.ˆÐTj ³”€Wˆ?ös¸ÝÞ moж7(·7P²ýçÏ 6ÿš!óõ Ø{x…¬LÁù‡ä“ ÊBïx_/opÔÿ[ÁŒ;—Í€úú¿‘Îû(ÊÂXMÏé#$§P¼¤I׳—ù‘e÷ÐæRN\x>«Êî¨jd~´‚š<áäÚåGáûîþ¯-U$MÞ§âOÅ·Lð½ÞòñÆÕùòpž¬BŠI¹P¥cZ,‚Ê™þ×ò·zS]M?~ï?^pMm+ÎY®'➟#Ú¤÷(¦ç¡Â3ŒŽ¹h^ ,:«Òû±7þB\ù9–­'ÂVÌIïQ4LŽÓ3ŒŽ!ÍôÚùXôVµåó úSϨݠ¶m¹íÿ9‚PzBcJ›žq¬;šéµó±¨®6j õÆc]ç1ÕmËøÎªÉÅÊ´ù§ððTÅãÂÇ¢ºÚ¨-<–ý[³ Ï|Yµ´¶“¦1©° z¾ÙÓ|<ãâ@áµrÑ=¶:HX‰-òS[Îò´k))»BQz¢e’2¼VÇ3IÇ @ý%ç+z¥µp8¨O·KËëm“ÜÚ>ô«] ñµß×MrŠn•Kdã_Ë[\æß5è/î¯Éþ³üœ§wO`yº;µce;ªíµ'Ýïéw¦©§ôNwYoVGÏ…˜¢Ï¦;õªû€‘]^‰2‘ýŒg¿/b¿ÃJvLý~nØK:Íá+‡A‹¯ìFìýµ¨£¢³\Ô¬uÔ3Ê0rRS¯¥ž) EÏŒ€ÐÔ/xl,|,ǵ÷×>â7{RwS+<)ýâÐÉ•q²¸~?DÙÛßï‡CVýè^æhÙøX<·7jï¯}DÑoÒô0|T%˜Yrm^óIb¢z¦€=3Z@ó5âY66÷w{´ZïÞчûf ¤\7Rò¤¨½YGA£àúýàeCÏ#˜²(¼ò ¯W@9à‰‹-še#öþÚÔõSu=NªNh #²—|a:&õLÑ,zfD³ˆæˆfYøØ¢Y6jï¯}Äoö4ie-·Rñ½º ?Ø‘×u°Ì~ªž)šEÏŒhÑÑ,K4 ¨•Aí=zúˆ /,d^1/\P¡—\D»u÷6ò׸3F,‹±, ‡ÏÌX–‡mjï¯e¸o6“JN"‡˜Wž‹³ ¥WPza«” ¡S=S(‹ž±,¢9bY6&Ö…¸R{í#~³‡êLı6 ý)Š>8UíåÕ3³è™ÌR¨œÁ,ënŽî>#˜E=}ÄoöPñ §H´©—òÜD"h”íÕî¯|½Ðz;O·øÉ¢ž> È ~6MX’–¬ ‚±¤“JW= ûèz$‹^i8 ­÷×>œ¨wßÙšÄP×Ýö8ñþ„ë uƒÃÜ}šúKu§§üZÙÌÊŸ daSXH|í^É'›)cö)y¤p«Q9”œêâ^‘$mCôï 7D—kø‰›·2©¤*Eê›ÒãX„¯©ª0z«ÚÈzæg’»ž©»‹N ¤ÒkÒI1ÛÉD[éP†J*÷NR/)ɤ’JN1ÃCed=É_Ϥn¥‘JjccQImÔÞ_ûˆ 9i m JA2i¤”‘dÒH%ß«RtQòºýôŒµ}'™^;‹Fj£öþÚGTÜJUOPÔI”ÂiL]]#•,ÅüÕóÍqj¼ž±v¯YW>ÔFí=Ò±Lô‘)Eý HÅ¡´Ô“’dZSÀ`…x2ù C¹c"™ÓEoãaÑG˜Šô$Í¡ }”²¤ åM&}TN]‹ØõQ©Çø QꑜÔGÙ°Í_$ÁÆ/R©‡…”’ Lä™%e莔Deè–”feÒG%OCÙP¥wÖv=bíP.’©%~PG±^üìÐG–Så ¯,)]y”»a\º%¥,™ÔQÉ+¿òP%_FÍɆuW´î@r}¥EµÑzíã)…8”ª%eYÙÏçõx–2S`˜Aó]]Û1Ž+![dåi0yݯúýP ‰Ü¤šw×ß<ê¯.¯Iµ>À»gŠ™´vIŒ•§¿Bu?ø:+¤ôÌPH‰æPHmL,€m¡æÉà4b¿~ÊT*ÄÎv×#!uÖç^2'rÍË“~h¤ôÌÐH‰æÐHml, w£ö=“J gw{ •”µ“ÎzŸÙnªzTK¿ÃZ›URzf¨¤Ds¨¤6>Éa£öþÚGüæÒýbáy^õ‹C‡g?Ÿ‹ëWD¡J*1GêPI%/,.•ÔÆÇ"~mÔÞ_ûˆºƒŠ.¥ày\zݦ’J>ŽÊ|TI©gRIᩤ@³\:©EŠMÌ«8)¥Ô3i¥ìHwº·°v¼|!¤•²ÔI¡\¿%œ›µRzfh¥Dsh¥>6µÔFíýµøÍž¢b¦€”¾Œr§\凮€"4P~´Y)¥'†RJ‡RjábSJ­ÄÞ_Ûpß¼IF©]PWý ©¤ìàKý ä~ Š*)cŠ ¾ç1ç‘ÝvÙyôìèþoüòñL~ÝAþñÒ«‘'·&ô•gŠK7šÊP«ãˆBsãkNY…7¾5Udµç),]:°‰:tJäY ›ž^% +|Ü¥yNÖÒ<·Û€Êä b‹‚j&%éãŠx—iÄ’KÍ4BÍK†öÀôˆ2—=†aíóåA´Ô×ÎÄluXh%Mâ47I@¡pôØUat<8DVV´«ÚU“È;hœ^’Ï!s!Цµq¬|̦›ÚûkôQì7y‚]Ø óÌIÁÖq™†‘ÞaG`>qXÚ‰ 6н·21Û¾6Z:“cÃõÈ @SÆ©ò3+㤉AUëœä6u1 öôGìpÔˆäaýƒŠu gj”o¯ñÚUFgÚ¥±Ñ6U;K~rˆŽ#¢R¦(`Ê"nÛAÑÚ8¯&Öe¸Ðzm£}³ƒâw{I…ÿ‚Á G*L‹¿¬ùÉ´nò™Âì\KìÊfˆ¯‰uÇ<½ÕÔHßÉkì,^"›Ø/6œh¹³–@¥„E"²Ã…× hÿâÌã·íä«tJï«G£‰vñ£z+ÚU%1=›½ÜwèÜY‡ÑÌ®S¨â7éJ`;ˆâà"o÷Hd° ¨ùÎaSEÅ úEÈMeˆ¦ÓbeÛ‹ax(ŒûW±ž±K{ ’h‹å‰õ&^©½¿öE?h±Ûøêlg¶cœÊDŽÃ]ºŒõŒýÛŠhh[xí|¬hf¦6TTcÄN>ö•šÆäFéK¶ÃT+sôvPåÄJü"’h§×þN³Ák#öþÚÇëä{××ÖüÇõÿ+?£câh,ó®¡Zg29™ ‘6Á£ó}éRᢰð_·!® Ìÿ†¡¥"ÅýôôÒ(>\”.OîhÖöÝ´å» ÊZý“Ô˜¨áR:nmèšyø òúmkÁ1œëJ¤:å¶´v·µ¡Eq#û1“[ª‡X?uá’:Í..ì|lЍ‰š&q1 Rzug3k¿†'šép&OµŸ_½‡p?Š€„>ÍïNqaç`SI-¤Þ_ëp¹+•)¢P9$3•ŸR[ZÓÉÅÔ–ê!ØO]ï“% ¤W§Hy!½v.n𩉨ûkð[ª!Y”Zø¤´)Ã:À Žñ¬FP‘ Šà¢·9œˆ‘Ái8òYºÑF±+É ÛÐÉEF®AÁTÉ ×¥nç ^z>lùN4W.Öå·{ívWfÕ ‰K–Ê'ª­Û^,*˜Ùó;&øõ{ܘX7ïLªuµY¼zºÎK ¥@†ZW&IW…/dú}äþ’¹åÀò“Ë™`Üv‘ÜØXÏ¿•˜´?n!ý›T5ÎoÚ¤²j›¢ë,¶«G,–ék§NÓ½v>Ö{d¥&ËB0ÑKÒ­P¹X¤ò+Ô¹G{›põÈý×u,4ýÛ1Ó.šà#Nï9ßÅFÍjÒ®8?ÓÇ»«§ŠÇ ›LƒAsÔJç1]=â1õgä'š+¢ iÌy+ÇPgú‹I*/(­­-•ŽQjxÄc¹zº×õˆ5sºHnl,:*<ê±®¤r3ùEµ)Ñ·ûMÕ™I×=‡.ªßßQ­<–¾^8ó¯W}ÎÕË©ãëî³ä‡ÏRç*tÿïÿWø~wšºx“ÓTžv…Pש w -»m¶÷t%’ðýÈ &W¶‘,n¼ßñ}/w™ä&¹—†yâ)¦ï#—ÎŒ€HQ¢aýÍà—î:Âah¶:ͤ0Ì>jçã†ð'jï¯}D!t/tëÑnÈÏ‘è’ÖF/ªzÒÃìÏtåi†¡üÚùØPþBíýµ(„ž„x£|–l8·Ì¹uå‚tøŽ¢9:EÇ÷êeãK{í|l(¡öþÚGýÖ‘v%úE+lW¡Í  ßFÊZ:–½Ô}â{õz]üaGúµÜݖƈ‚sæ‘MÃq&þ-B×,¼t—‘¶÷ôˆE‘(ò…:üK$„_;ÜŸˆùî¶Ôˆ½ÊŒì<qL¯aV†uPˆÙqÙØE~>Ã(Ìöê41,Îî™°ãþ‰ZénKcÄØA{“¥ˆSIdX¶ã/ëÈŒ‚ýiÍ ÆG«Çav’=sgcþIJIböžÉÖ,™ù‹–cBà0–÷U7= VÒwÉ#•ÏôPLQ쑘;î_ˆ½¿ö…ÚS7G¡b¡àŽ@£Pvë¨Z—.t Myµp”’bÅܹ؀a›”ÔÓhÏ”ÐüØ6FÆö±“K똵—¹BSc…¬´[äpâ"îÈÿ"&¯ájÄq² ±c‡ÐåYl{OEîõHR‘ûN1©ÈýÆÃ õZ©óW‹7Ю¦€å!ð‹%’¼d¯í=#“Hí*ÈßC2ëõŠŸb07Zï¯}¸ŽÖ»AYÐ&èUÀXüêjfσÙé1˜dÁܸ¸áý˜±÷è™LÞºþÂ÷ð%0îÖÒ1…=,u¼dê1—ú IsèÛkeãÜÏý·ÃìÇx"Ÿ;T—ÄÓ›šÃš'¬E`ꉀ٠öÌ•÷ë_ÄÞJÔ/×Ƚ}©§Câ^û(Ö$=™d7+ïb`˜,çÃäÕ{¾ÜB=>àfžÜ5Wƒôß8ð/]Kwsôx¢3И,›·÷4ÔqD íS÷,u£CÊÿ*WÐCÊxщ>; 7¿Ò‹Öûk®‡4Tö¤ªX6›S(A ©Ö‡îWê¯éþkÏ [€HëÄxÇͳt¢&ctéÓ|e>î1Eæe…TÚj½ï¾¥¡ŒêÖù{Ú&h½‡›ki¸ˆË= 'st`G’ù¹y¶« µI†Z/ßצ¸(ôH±îâxfØDs£Õ¯j¥&{ô4¢ÌÝNöî$cr¹ÜOцw¬UÁmÝý5§Ñ#Uú4ÙO˜TM4w>6çÒ…ÚûkQé& x’ñ8éÚÐËp>íÞ¥Tè«G€þˆ ƒ€Hîllî¥ 1Ù̧e僚C%à Y“}uÙ˺\»,&…=rQ=Ô˘ ‚eÐÜùØÜKjï¯}DY¼s¡ÁØò#™=LJÊYûH²7Ë¿4]hnéÿõ̰ˆæ° Œ÷\CÁ I.üôæoêê ½¼IÃøÈ^10 (i3RŠE[n®3ØýS‡²}r˜|í/tó6-ƒ¸Ø î"Ž×½_¹9ôDˆD8MÜÄØ½$]=Ý_ÕghhƒæÆÅÍ×t"¦0åi@…WñœYê”Ùäš,b2ôìêÙÝUåYÅ‹›§éäÙ*§Å¡:JG…šÓ"“FŸGÏxÌ$½ö±£¿êõÌ­g,ð>ô½£OÆõÌè1AË]¯!9I{j7.¨Ñs½ÏèáB45å× Iuc’ú7Ùf YÌjY§3ôêáÚªE³ÕqDºã`µ±qˆºCIOÆ/<¤£~ˆ^í~ˆŽž1C'Õµú½çúíü¯”?õ\3mܧú©g:F/J}i^£õÅ1z®/Пº÷LKÓ™ðŸçCÊ uͯ1zÆ"rG¡¹òÞ3ŽMw4ïwï™f-²ÆÓ½g:HÝÙ‰Q3ú]±¯s¶ãk‹¹óȆ;Éxý«g¼˜³“&칞ÊbøÐs1Ñ?öL‹×Yª«¹ –}ö°DKQ _× =:ÛpW8Û0æ&L>W¢;g°ò¤·t¹®!+ÁùA=®®6|´ð{®7ì\Ü{lY0!»7±<}ê™žŠˆsúУїòg©±l!uþ­€²oó Z¡iœžš+‡Ê5Cƒ3ÎáÏ‹³kîûûÜ{ô¿FcZÅká›é".odn6xë#0~Á™^‡pC&n‡¼5öêGã¯4¥+³ž«ÃH0EÇôÓ ’VMÊADtr&Æ'îÞs½tPŠÝ{O‰I%EFÏù¡-gs` ö“7˶‘-ÕTiуõ€ãJµ3g¡‘Ø8#kúPiûÍ*¾jÆr=ø‰äAKñÄÆjð3sÖ”x½ZoóåAƒ=Ó:i0.|虣P° Ç4:x·Щ &4Xx¦+(ZõÌrý"zLõ+h´ÇÔ{†@qõPb"ÍKB£‰‰|¥éd›Óhuyi{M»ˆ\¤±o:eCÅǾGu\CæÞ3Ÿ1 ¬bÚ± ñ´Äc½T)gk:¾¸Ú(žiàÑs¶,"}î1ä­ƒ­kAlŒrZ= 5Rg>.c«çš©þÔ½gú‡ž1#ã©«‡F¥1¯é`ÒÙ>ïW[øqôLïÔ{ô};ÍþýÇ,tüxÍÔX0ÛÜq>3Si^ -Uæþ›žSÏôÖ­ý¨{.t“­ iþÔ3ÍLÎÛzê=󓡯\ðÎô«3âÉ™^x׋˜ì— È•aß'"F ¾ÜœîcX•œmvV¨©ˆÛ47øôõ£Ñ˜VÍôžÙ*$5ºË–Â8ìÑ®Š©=Vk7|ì¹&"7ä'™{*ÓÒ•ƒ€/Wf/+æ–gu† 3Ú-dLè1!C=ßœ“Ò²C©¢Â<Ö%Ð4ÚcE õúd¬%¤y¾÷àmè ‚ÒŸ–âñºFnãúˆ×™_hô™n…Âlý×/J¡è¢[a´Ç­Ð{J;dg° ß>ö\[«Àžvï¸wæÞs†ÙJùØ3Áß­çºÇFî±> ý–êótÝc}&Ç/4ÓºÈFsÜdÛÇÁ«§L×ü¼}jdІk‘öžkjbƒ{ϵëk߇žkict÷©g>j­ì‹jôhQµƒ9ú’iŸ]æEÕÌ­d’‡ÛyAÒ¢í±¨zÏÅ[ƒâSÏõñÛÁÜ¡÷žéÅý½gxÞ-Ì˨÷\k¸?u]³U·åôGŽ…E4ÜNÿ~hZ¨B סÙ*Ë6]‡fkÅšqh6¢ ~fšV8™£=ÎÌÞ3ØðÇyÆò©gú µÎ€=ÌsÞÏL8D×ëÌDƉ2Ÿ™Öãý|f6(NǙٳpô3s´û™Ù;®Óü±g:3½¥?n3¾z¸¼{b¶¾xiw÷Óòö¦šó/Êñc¨ƒêÔîË{ôŒò¤<¹zÆbb®°ò©gã©{ÏØ4|Ç=}™^ÞzÆ©yõðÔó 3qÌÔ85Ç\Ž_h®yj^Í~jÌ,«ËpsõˆçÓÉPã#ä˜im½©™(\ŒôæÅˆz®àÊ”÷žkîO¡ÿÖœ~PHâÖ1l¼Kð‘šÖçèÑú4MÐ$ÇyW˜ øZŸ¦ W7Õ¢\Ÿ£=Ögï{Ú»šußí=×*ræl>õLO%Äz虎_>7¿m>~GϵúS÷žéøõÞ =šQoî}Ót™ëÒ<Ÿ¨ç¦äÊã»Ïgo_ó©žkw[°ãcÏŽPÆ|è¹–TêÞs}ÏO=c6‡·žk¿m3Ìõ‡4O×&³y„ʶÿ@ó¬M6šc“mŸ†Ùú|Éž'U÷cÑ)ž‹y iþcϘ„ñÔ­çšÌ>ú‡ž±€ÇS£Ç7?£ï+c${NmÉž£gúÔ½G®5 y!ÃkºìyÍÔ8O¶¹cíÿ2w˜ÿü?_>›Wç+5K³Šx¢†Þ’šâMZÏ|Ç Ф"ÿ½R ýÊaùý{'LÕlnpG‘²68‹4ÈŠ”œIôòÕ_CÌ$?½B8NæU¯ úÓû°_篶ùhç>+1$¦S‰¡1[‚cªï¯™A;;záDS˜Ë²;³v¶<ï óSE(,BÃYÀ=JÌž‡’ÉFß*ÅÙ„éçîùÿ?–=xP½¬šÓßÿ”3ÕöðûÃÃùmdbHtY2Ojë@$I4Í+Î8{¥ ýÏAíKnD?Œ¿°"AÄì ðØImÎðár*‰ójg0sB~þ3¡R™œ /85tÌ„¹Çôë†sL\ud/Iõž4'pŽu“ùcf§3ÎÝÊ¿`&eZ”©÷ÃÈËÄ ´OR3\4cÈÒãT8 žíþƒãµ 1ØÈNÁÆDaþ¿÷j„yªÉ‡ðì8¤@A¶“¬pJE½zã:フS’ä_°R‘´Sý]VK…™Ñ$°Ãó?Xå$[9E n‹ï•s»é/Xi,ÙE¢¿ÉI<ö\“'a<}\4ŸíC¨ ys7Þ+)鯱ªqPý]^‚]=¤ô)Z9 Ñb€Û௿rŸ.fÎgøÌÌdï«åÓÚWñ_'CF¤1(ýì쀦úl² c5/ëúÚGí¬%ïõ¬MDýoOSˆ¾ ó´Ç8OdI‰æJ3*rŒo¼VRÐ_°²Rý]^¬.¨­Û˜GDXÖ0æC Ãk„ãÖ>Î`¦Fý3+Ùße†¥ßSµBñ…ÌÈÌb.êÆLd"‚›1¹Ó™9¯Dý3,aßÉþ63•¤s$tˆf/ÁàÙqð$MþùK07smò|ŽÉ¿d†I1Eöw™±ŒŽçCEõÇ£ƒ³¡LtŽl¡% ZÐ\YŒT¯¿`d!ù»|Öç®Õ3Tý$ÓØSàQ}¶ O›‚x¸e˜ëõ¬¬T›„n§Úw=R·U$q?Û´üš3X°yYÇÌĤ¿df!ûkf®ž9;m*Š<'xªqWž« ™‰Îq*lÝæ‡ó§d®.Ž;˜+YÁœ‘­"{Ÿ©ß= Ï *>*#BΕe< Æ9Û™\äçXßæš¸ó†Ñ_ò6SýMl›c=6T1BÇÁŒ.÷hFT”Œ±âµ r-'ó¶ç_02Ñt¿.bË 7ÿv íÔÙHâ³­êŒkÚ‡¼”¤¿ä%3@TsR̵Ó£Ξƒ %˜Åâ$Ë*ƒ–?ÅNže”ÎI;²þ' ÑßÞdé¼ QÊŒìH,zšàyr¶•q‡É­öa/¡è/y™¨ÞÁß\Æ&Ý$•ºbüƒ|,œ÷Ü0ç0éV˜q`öºº¶XÓ›©æ_¬žä‡~fÐA–mƒ>òlG¦¯¨…Ùxý¹žµÏ#"ÚâüM-ÔrœO±è´©fÏ¥A¼ßìŸd½ž1-ü¤a3ŽŠÂÄÇ/¦geä·7£à̵Î÷݆ì:Øã籂|± —Ä>Æç54“üoìòÊüªÎåÍ“=ÞÎ@@23pœÜYÿ¼·6ªÿ ÌB¨L‡Íð°4»£œy’eè›s¬ÌÃø_8 Õ߯•#œqý¦72–hÊó.…²Á#›Ã”>Ì/â™êo‹›¨Ðʘ‡ëX§L!ÎÌZá,¹„~ë0¿¸Õ߀\…."zàáž­gdLš‹¨~4ñ‹ë{&yÿ8¿š3ëÙ L#XÏhN:ÀÆÜíãÄ«)&ôq~tf²¿/ãÕ'M¨Õ‹Æ1»¤Y9?œ¥It GÞ>Î/ àJöw™ñÀjçSYk 9eô  $+|¢„tšë8õWÐx&ûß~Y Ìeßa•‡_áÙƒ">8-VÙ®sœ:Øÿ…À°’ýmµs+¸ÜÏÇêDfC‚ç’~¸‰Öa~!I±r©þW÷öª?j«1LšŠâPñr0½³TE¯•÷_I˜ ÑÿJÜý/aú]…j~Œ5±'ZÜeDAÛ™>r÷ç¿wÚCOs x9*K|x¡Mûyö8´µ@ÒS´9©T¹²¢^ÛÙö”Ikb&}ô ħÁXŽ6r”ï7>ú þÏåï× èÿ±,ÿkkæè/êÉ0Ÿ/L¡j¥ß…ó%‚é"Uç ¥A`€ 0TÓ¯CéhY¢ìq™Z°óŽÅ׉¨ò|$*es#„r0AsFÞnm/=Ü€çËõ|Á¼‚yV¢‰$^gS.?_å/d ÏfΫ,Øz®Æô1ñlÒËÎ|G‘X† µh¡‚…Lçͳ'‹©lAUX̉¾çÒa­/ë91–’+jŸ|ž+âÝUžüÜ¡ŽËÛc5ۆȣ§Ù-}\T9Ûú"¾Ñh'/‡àg§gp@®þ¢¢ÝñÏ6ÔØ–Èózn»(Ïaå° É|‘ЃLXRf'ȹ/å`3ÝSÁQÀC'L/ƒ2Òh‡h•»`¼Ç:ÆA›É ƒej[l-ÌåLˆff8˜ÕÍËh{~ê`9fèo\µüL€£—Pdâ­`!Yp+c™`O®¢ÆÆááœ2Ë=³ZÃó¨`ûœ4Ìn¸§Š8Ý`vk8¢Úžm©w•ÚòËœ=Т# 2˜ Þìâ-Â{ál#<îl#é»0AJ5áá †žDUiìí¬cŽLJás˜´³Ý˜pܵ1«z&È:{TÅG¿É6’@'$(=Û•E 226ã=Qû¡'H>{ •’Mu—ÏÙs<ìÂLÏ6sRšæÐö€‰Ž꺤wÜê²…W.Ó gê¶Î%Ìê,ÅÍy´‹º£CŒBÁ̯”ã KX:–ÌÊYŽF[* Ù¼CÏaƒ)‡,½—«Ž¥CÌÌ–ìªCŒzgOÁii–4ÈI$™`šIS&{ó!HÜ,ìÍá ÛÙl¦jñ’r°*S'{ËßmMægDmì;ÑæÜðΞ&Ïèvƒe¤Iײv³}x»Â¼N¤FóQŽp!™nÅ:x|Z¼“åƒ37H»ÒÎÛéN=•z¸– ¦ØÇªÉ Æy âËN;S X÷«ˆ¦g²žjçj@è©­ŸÃ/èÙ>73lÙd‘„Ý6ó «Åyá› ÄùIp˜»ìÞõvˆ[3‘'ïil ¸¸àr‡dRá#–ÀîUäá=›Xƒ€Hàá8è,Ê[G~ :®ßfâ`‰óèmBŽƒ=L¦bi vE2Ò`~^áóV •f²óRÊ„)ÑÈ8åt?*«x¹ÃÑ}ö¨@TƒûÌÙ.Le_Q!à„:r#e2>;2 m¥¾ª¥*WE™ófœ/*_U¼ÀQžÀQ°s†s[!ð=æžßZæÝbE©äéåh=GfÞq YË®kF­Lè}ŽbFîq8þ$_¨tá«|/uó4²CÛ.¬š•ÚÜèópð²ÿ&ÒHà4è“Dc[eZþsŽ ìêA(S£«„^5 òÞyE–ì æÍ‚žCx0÷W¦#²‰æwƒPhÄã‚tѬî³ÞxkÚŠoÄ¥µKìHyyˆ:ÉI(q— ¸äg¤y.ƒ‰v¬Z„U}ßeEEìH7°tÕÔÄ]†r%°l0ý'ÁïA¥1Ó·ž—_ãÍÔœª…¢&\%øÍE Î/aØ€»À-Œ‡Â\të ñÉ1Š”žü,=í¿¸Q˜ÇµbÏÕY1Àþ,º%r¡Û1C‡¥'<[*˜àÒ,’SéÇ+áq *ïâø}3+AHjêPÿƒúÔÿ þõ?¨ÿAýêPÿŸDýiÚž0*êˆS³ŠbÖà{©¶ÌŸYm*ãàuÀšV«Ž›’•Ü̩̰B®,}aáËÕ†RYÆÓÂJˆù ÇV¢B@嵂o¸BíÌÇ¥Í\yÏ£+ÓwÉÎéOö’íxÜMÏï🠿«ü‰»ÇnõÜ+Tí‡Lq‰¥Ä qKÃv¦i<löª¡g Ä>Êp¸7Ðÿ€þô? ÿýè@ÿúÐÿ€þ?úÒ´1 ‰f!Ñ*¬ê¬ô™uhÉùç¼Zprc—´+þ¹-YYÏ16›úp[ÍyVál5Œzð ”©I¨Îûþ°@¢À'jäUõt¾Êž÷Ÿû>+û,ìv¼$Uqîö1€ýÏ©ö?¼°¿å„9ù‚ó¦™Q-´ð]ÁyâJ´úMe+gÇð)ª#ÐdS=Ðÿþô ÿýèÿ@ÿú?Ðÿþ úOH ÿ ‰6aÕD¬Ú¸Ëà ˜±ç¼ ½¡„48ù°\÷qΤ0 ·sqv}zCEmǪk€Ï©ù7:íÞ ¶4G䥉»`Ý'ïÿœ:Ú7[²@õÞq;Øý¹¨üCÇýÞ_¿Ø ì# §àùágÇäLÁ2>BÁ_ðå¡òçQ‹${ÆèÖ¶À øGEeåæç“7?Ÿ¼ùù䛟Oºùù”Õϧ´ÍÑ'­Ž>þæèãWGŸÜ6OŸróôÉ7OŸxóô)7OŸ°yúäÍÓÇß<}ÂÍÓ'lž>qóô)7OŸ›£Û}âæèãnŽ>›ŸÏæäãW'¿;ùXVþÕËÇo^>›“Ïîã“o>>nóñq›»ùø¸›OÚ||úùÕ}|ÊÍÇ'Þ||6Ÿ¼¹ø„ÝÅǯ.>è}öò‰›—O¾yùÔÝËéûg7;Û7?Ÿ¼ùùøÍÏ'ì~>õîè“6GŸ¸9úÔ›£O½9úäÍÑ'lŽ>áæè“nŽ>iuô)móô‰7OŸtóôñ›§Ïæè“oŽ>õæèã6G¿9ú”›£¿9ú„ÍÑ'¬Ž>áæèoŽ>asôñ›£OÞ}½OŸÐ6W·¹úÄ›«O¼¹ú”›«O¼¹úÔÍÕ'Ímԣؼ}ówŸº¹ûÔÍÝ'ÞÜ}üÍÝgõö)›·ÏîìSoÞ>¾mî>eu÷©›»ÏÍ×§¬¾>†DgŸ›¯OÞ|}6GŸÕÏÇÝü|ÜÍÏ'o~>aóó‰7?Ÿróóéá‹ÝÏ'­~>¹íŽ>в®ž>~óô©›§Oºyú„›§OØ=}ÂÍÓ'­ž>v‡-®>õæêão®>esõ©›«O¸¹ú„›«Oš]}Twöö©7oŸtóöI›·[½}òÍÛ'ݼ}êêí³9ûÄ›³O‡‚ÝÙ'nÎ>LgD˜²*"áhm¬I€µup˜äçoÊG«#j‰2 Ž¢qÏ+C:e wH˜€• ¶u®t¯Ig¸õx.OôG/ÿšÙ†k¨›D*?Þ£8¿ ôÚõ?«ü×_Ü(ìcþÁÿÐáVÂOU<£ã’±£ îñö‘à}$†/„,¥ŽÁiȨÅS•ÑP‹@„:‚)õë¥ó/›Î¿n:ÿrÓù·Mç7¼éüÛMç_WÝtþõ¦ó/7[uþnSú—›Ò?îJÿ¸)ýݦõo7­ÿ•w¶Ãÿ|Óú·›Ö?mZÿºiýãMëŸnZÿ´iýó¦õo7­¿¿iýæõÏ›Ö?Ü´þþ¦õ÷›Ö?nZÿxÓú»›Ú?njÿ.tµ¿¿©ýëMí6µØÔþá¦ö7µYÕþ~Óú·›Ö?ß´þ~Óú×UëŸnZÿ¸iýaGYÿySü×Uñߥ€Këïnjÿ+wqê¦÷›Þ?Ýôþî¦ø/›â?¯Š·êý»p)ýë¦ôO›Ò?Ý”þå¦ô/›Òß­Zÿ|Óú—›Ö?nZ¿iýë®õ7¥ø'JÿvSúÇ›Ò?mJÿ´)ýÓMéŸoJÿ´)ýã¦ô¯7¥¿»iýݪö›Ú?ßÔþù¦öo7µÞÕþeÓú/íDýøªøw»æß¯Šÿ]ïŸw½¼éýý¦÷o›ÞßïzwSü»MóßVÍÿ]ñßE€Kñß6Åÿ¦ù÷7ͽiþý¦ù÷›æ?Ü4ÿá¦ù¯›æ?mšÿ|Óü·›æ?¬šÿ²iþÝ®úw7Ý\uÿ]èªÿ+~Ò®úO7Õº©þ˦úw‹îßÝTÿqWý·Uõ_6ͺiþÓMó_fÍ?NýYùŸnºÿ²ëþ˦û›î¿Þtÿe×ýçMõï7Õÿ¿ZI`œ€ÿ•3g€4o•Ë;ª>]Pž|Ëû#œYû_~ ‡ŸCÚÿÆmؾ °|¦>*±Ÿ_Kôò9s‘Ü€+æ&È‹‰: «q`g“÷¬zå¡5ø¤ú_~p{~Ðß1À×þ%ôO fFQ›7ý”’r÷V*5)k…wa3‘¶"±Xl+ôl²O?EÜí4¿Ïãïóøû<þ>¿Ïãïóøû<þ>¿Ïãïó/ùûÀd"¤¹ ѲaU¡BÈòG@”*òþãÆàu §!ï?«Äÿâ³ÓÜ*":ù°b²#<Ή‘µö†¨=ÍM¿@RýJ÷wkC%VÙêr¤!×–:òÛÌ;ZTÏ‘Yë¿þb¡à?ŒaÐß5Bû—Ð?0 ¢b—¾)³ Þ9eú'ÕÀ[;Àà F}ƒÊ©cÿra~‘†/òdöy2û<™}žÌ>OfŸ'³Ï“ÙçÉìódöy2ûüÉÌ>‚™tÕ™`hNM©Ã9½y*ûÍuÇ”ÿÂäQÕ»LLÞ6:ve ¢ö8¨±¼ Lðìžåº˜w‡VÉó0‚cíù„§¦dFñÒßO¿0š;…}  øLßû—(Þ+¹(|=â oÀ±Â-n|œ0pcÂR½V†«Z¥V¡Ñ%Þ Ý§Æ?0þñŒ`üãÿÀøÆ?0þÂø4¦/HiwÅÏž Ç')ð4þ‘!bæbmTp.½Ô=ÓYq üCŽ:Þ:g(ëppªÁU¥Ž÷ˆm9}üÁ4úÞŠv­øÊ·¹ü`{Ú¨+ÕoáUQ×õŠºöÚ•ƒóC¿ ê9¬Á"P½‚<“:§ \Àð 5ÃÞƒ8±·û Îã‚ó¸à<.8 Îã‚ó¸à<.8 Îã‚ó/¹àd!͇:Õ( JŸ¯¥@%·åè‰@Ⱥ`ͬ:,–eRÔâçBÍØö‘a¸LøÜ‹i)s&¶ ñÒ¡æ`.OœO®ôLHÐq£°a8þ8a8ÞþŽOЭž?Âê}Ù#¸<"éyü0gÁa§‰½¼ó,-æ{°ÍŸ¡ÓvNS‘CÅ†Ö†Ì O íH»aù'ö ¤}iŸ@Ú'ö ¤}iŸ@Ú?H;g$ o^€´CV'ÈÊM–…àøÇþ@)¨š¹?Î…¥ñ‘J¶¨àáf~ú ºa¸Té³_»!ÇZ‘NØÜ5ið±#?¡ùí7 ór7$/ÏÈ^óè¯ÔÆ'ÕºJ‰iôë•"ÊÞ×E­qdüÃŒx`Ý–#l} 70¦ôðCÍãPó8Ô<5CÍãPó8Ô<5CÍãPó'jÒ„6Þ±ˆzAÕ,¨J\˜+}OÎév‘[âÀÂr`ò|]‡”—Yú˜b¯Ò¾ú¨Cç¡%"VBÏD})‡ÝA%¥sÜ >PAqÏiÉüšã7 ûßÍ 'Ÿ”¹sdµILô{ôË2„Û[€ «ã[Ø”û¿iŒL¤Ì,Ókk§6(Âÿ@øÂ?þð„ üáÿ@ø?á;ÒLîµ"QO¨ ŸxVû"¯Ò?GÎýŸøóEá’£“ItJeyî}äÂd™8Ñ£]`cê{ÊDý^)ql©—âUS–¸Ö–g|Msì‹ìÆX•GÑ­„Ï6{ν3\CZ¯§Ò j…ve+›¥j¼¼`º½°®Ôë=i™IÎ%|©óÿ=)žŸš…µÌ‰(ÊÁs*“õ;ËøØhƒðQŽ `> Lô“P§&„þÞ‡ …™wncsõqL¼oCØÄY)Ö_ìö$åœ_ªK9ÙxΉ>/:H9þlqXç;–yœ¯ Ó¦+´Óx×S æÈmwõlþ4µÁlúH9”óH9”óH9”óH9”óH9”ó¥ÃS@šXà‘¥Ì²2yºÂRY†U¹Â]¥ŠÞayœGÖJ†ß,¦þ7KBÈS üz E1PH2°m0žB  *Àm)âî`$C¢”dy<‹m[wçÇ)¤òt:xŒŸ/•¥{þòÀkg&Þ±o‰—°]Ã…§3¿KJðÍ †$]†Zd^®ƒ‹þü…£ s²o<°,Ÿ^!Óªyúj;Ûrs,eèjëù; ”áÜÈ,‘l‹eÿ«ƒ˜À™Ë±qOcTXoØ(@X;1øZ5y{EøæãˆMôé ðŠB U¯TJðž?Ü’69­ƒçL{Ðõ¹Kà#¬Òn|T™Y¾¦:SÝ!2Ý÷^×Ó=êúƒÛóû’½ŽËÂÔËŠb˜ìeÂ+– zηVè‡k\>îBS‡¤¯Ä 'r9/zsÌ·-váë‰Ù~b¶_OÌö³ýÄl?1ÛOÌö³ýÄl?1Ûÿÿc¶'¤Ù‹GQ'¨êUU*™™I!o!ßjâq¾y.´•à— µ¢ ³#÷ D ûäZÇÚeöÿ¼ªåOÂE•prØn@´¡Ýp‘m¬C[]œþFYè\f˜m*aB6©ó³ÚQd÷…vy£ §AIrW¥íz/êøßRBÓvk‰ Y[¤aò•§"ÏÍOàÓ̶ßÉtEÀ·SÚÄ£M6ò›läwÙÈ·›pä7áh“n¢Q¾‰FnÜ&¹›hän¢QÚD£º‰Få&Å›h´IFy•ŒÂM2ò«d(êÌÂQÜ„£|ŽnYÂ}‘Žì&ÜÄ£¼‰G~Â.Õ»|Ô³tù(nòQ½ÉG÷Lay“Â&…›|”nòQZå#z‰_R¼ Hé& ùM@Úä£|“êM>r›|ä7ù¨Üä#“Â&…M> 7ù(Þ䣰ÉG~“ò.APY$¤Ëš$$·IHñ&!Å›„TnR¼IHu“ÒÜf,î*$Q&Z¤¤ºIIu“’â.%ù›”´ Ie’6©Þ„$ß6)©lRRݤ¤›ˆTVéh«Œt‘ò&"mòÑ&¹›xänâQÞÄ£°‰Gñ&•›xäVñ(­âôº³|ÛM@ò›€´' K7)ìR¸ Há& ¥U@²Kl–êMBò»„T6 ©nR¸IHá&!¥IB‚÷Ø*$Õ›”v!)mB’Û„¤|’ÒMHª›´ÉHñ&#åUFŠ›ŒTv —±l# ¯Rfy=Û:AhU¸P¹#ôÎtUƒPLO|)Þ‘‡@•·™0iÅ¥Ô*13•¡ò£ µ°—r£ÕâHÊdoˆÈE»ÛBÅcÊxcÒÏE¤…›Ã]S|÷,ƒÙUn$ç‚I+’N¼Êj†§è‚#4ÒoËÚ÷è+;#"…ù´.ÒÔ®¬¿x¤'ãõ¼+ôç…VáŸ÷Üg 0Yq£°!¡"Ž“€|"LŒÀÏ!ÈÁí ›ÌÓ€oãÑ·Ýx‡mw~+jŒÎBÜg›¥ow}ŽÂAÍÊÓ/Pö}£° !™âÜÓ”)°¡‹6´3™¢ÆDÛ‡ÑÈYƒsÁ96Týcÿ*Ã[ÎÜð •|ûNÚÀ‘Å'mkÿVí_7öo7ŒíZ³”ulଠ<öoÕþÍÚ¿ÚÀ§m˜^#uìßÄý[ß¿*l “IF¤ ·¯voÖî›7cóŽ[¹s_ž²ÔGuÚ¼nlÞÊÍËs¿“só&mÞ(¥@ÕîmÚ½Ã΃Q™·N»7Ëë&Umß íë´}ËlùÁöm—mÛ·¬¶£x)N7BûÚ?KA¡sn‘Ù·^è ÔåcSaÈ@f œ„†q`4îÞê„bj'Q‘Pãœ=Ï5«nˆX5¦F±±Ñ1Ñ‚Îp€ó7‡¼×F‡#G™c y¶K€AóÊGîûýV'ÙئÄQvö!²ëM¹®©ú«©DrQÚŽ#³~¬½‰×dHìFL¤îvMå#r?"÷#r?"÷#r?"÷#rÿ"w¦o’- )9,Ì™ñ™þ¦p!4Ú|ÏTe\%®ùD××èÀФ‚(¿Yn¬ Müdd5Ë´(ñÔÁÍj¹ƒíº‡2l?¸؇ èÏç]"пBø7±'Ìte0¹Ež8¡>pý)\‡Ã{-„ç¥Ðˆ”¼."qÚ‰µýË^jsד+Ô@q á˜+ÜG–?z¼z4›•MýèrÂ6µMI×–eHà×ø”qùXÛ9æc`8“L\¬½T·”ThlPܧ¾{ ”JO»#Ó%á<{P êºôû«cnÊ47Á}îO»ÇÓîñ´»ôÇÓîñ´{<íO»æiw¤d‰‚ V-‹+B|NÐ]<¹òÈcûM혰Œ¶&U%rµÅ`:¢Ãª‚`u‡Ð5â½Ö"’®ÞÚŽ•Õ}ëüøÿÚûö KŽê¾»í®>d{¥¨b…ð¸ˆWÄ»;ÝÓÝÓMˆ,‰]THY ìD…„vÅ.ò÷­„„0¢0’À&}ίÏÆ?@ëOI)fÀ½JHäyëÿ¢w?<_vžзªÐ7&ëiÊ¿6–ä‚×=FÏèû ˆ¾¡ð3Ë-ý ‚¦ž05)XJçÞT5˜q„ZLßš°TR) ޲À ?¸-z®¬$Ï– HÚ’;BÖhÅî¡ØÅÎ(vF±3ŠQìŒbg¡Øŵ¿€¢ûÃá\*ôÊU¢Nô—µZ(_q5¤¤LIw ¢(0¿?ž iå†dùÉ•0aÐÓîBΊs+<ÝÚÙâJî1øn1ìÃe@jk5.QqøM_÷,û8€@Š!3Dñ#ˆÑÁ ¦ƒ˜-®uÎ+"ȪÉô„Q•AÞXjƒ^…z¬áîè;Z!)ñ#@ÛJ'‰U/ñCD™5jm ™ªŸøáâĪ—÷¡“¼ä}Tݼ‚w]äšd~Tý̪—ùQö2?l’ùQõ3?L/ñC.ãÄ((ñœ?zA¶V{e [qT–b‰0¾Aõð°tY×’‚ -4Q—åWÊRüÄÂ…ƒMø¹ 2” R(â™’lÀ3R‘êŒTg¤:#Õ©þ`!U§©ÊR‰…£ðŠ ÒUªP2´O4ØÇËÏŸ¡ò@ÎëfI€• 0H3ÄÐx-Ct†¡ÂeŸIZ]­ªPjÜPñÍ]æ*êê–i ÿ>Á' dšõ“@ÅZ:–¢s*œA´V–M& Æê—!õÄ’.sšÂƒƒ1ŵrÍòù-—QÄ8š§á;|µM9 =lë-ˆ…<ô¬ä³És’3œä $g ù$+A1©~à• ¢]aUè7$}/ÂU"¥B¼£4ô,¤ÀØá¸­#djÂ\)#žÕ QPphtj(â·¢¢ÒÎ`áHl'`B:«1AÕ5ˆÄXG¶ªL[˜‚AºDˆ|µ°šQçãubM?Å kº|…+ U…¤ M~Áí]†ˆÌœ¥þº~ù4¥*RÍfk.ƒ+è‡tÉÚ\ sU=YÎ(rF‘3ŠœQäŒ"gù„C‘^z†«Bµ cÈ`"I­iX_~‹“S7¿ÄÔ%(XFº´ØÆi\çXQÞvéF‘~&Lçù»djD ¯ƒ†À¤N6yJ1@CH§oYKarU( ì4£±íFcm€&õ£ð®Ä—˜ègÎWá šª»‹P ‰ýô c-CqqD&Bk, è(˜ÓÇ44?ù¥Šá¹›±ØŒÅf,6c±‹ÍXìñŽÅJjåRð©¡…"p†.ZUQs<åê {ЇÂ+ÔîNÑLšÃ'”¡ÙUŸÕ ñ­«Hh?ïØGF†”|)¨B(ë†ßŠr & –ô*4eH‚½$JKTè¡`Wè/âjŒ€ï DзÈ5èMY3ˆÞ°àš-)ÉÒÐ^#C·¿m~“”}ãé*ÑšfhTÖPïA¿°/Nu$T¯JCIæ°6%欄ª}`…©vmñ4 gÅ+²6§bŽꈞáÛ ßfø6÷¾Íðíû ßJòÁ•*\)hŠtXL‹Ð#2Ôÿ×µžgG•è$NºçkQ—4ª,%Øz!Œ:ÃäAe½:ê•0êߊô/Æ/uõs¯ÈH ¦´îz7h„9Ãl‘u£CM š^Îý,"$„IÃó‘©‹7ÎCAÂQ¥Jëš%° à®)ν–„2­%dãB™*@¡’ ‘ß8*<'6Ìðg†?3ü™áÏ vþx²]¨QŽNH¦ÆZð¨UÖ¦,K³ã°Ð„“I¤rO ‡[°ù×dp4*\ž=c‹ -ò¡`5 ëa×uIª’Êñ8ªšºNµ3„•ÀJÚCéP ºÐ:rÙÚºˆ)–‹‡õVÔðä¬Fï!T"qbW’˜5‚–¿"Íé'¶gœãøgÜ4ã¦7͸iÆMÛŒ›¨>À ª?¯ÁKœt´Õ F>”ùp–pQº¡¤U–2ÞTY7™wá’»>`Ái§h£UAÙjR­ÁjÐULjŒ:êºÌ!#¿£‡úø`N ¡.V,5ã¢.Bø mðdŠ#Á'ƒ¬9z@Ò»Ÿhº‚͹µ&Âï¡d0MøN±M~Ï”!gVa:£D¸©F9h½¢¡$:*áŠݧ°Fœrm¤z·Åí Œf`4£ÍÀhF›FUx¤bmÝP\³ ¨omuÓ3[RU1«šäD —U†î×<ÁTôÄŸ‚Ò¤H:¢ ˜í(á ¨„lG  úÖŠ’¤9æ(R¹~TΡ  ³d¡åZR”¹¥æ×¤Ý5iw™¯WáEwS7F FupÎU–LLZ´úÝ>¹ BÇ&4gÀnþ•T•·Uß‚=¯3DÌ?`¡ÛÑs¸ÃʳßIuáE¿Šu¯'æì›‘ÌŒdf$3#™p$#b(cÉå§°¤N‡~®¨Ž« õèuóc%ϘhÐíAP Šá jòhžA×…À.gU­È4uÍëj:ij3A£ ƒ§ dêÊlt)õ®úد™Å–¦ŠÀŽÅpí'®ÀÉ%¶¯8*]€*J,™ë³†ðd¨Ù«¦'B*ŒìÆV}˜] &†éh‹R£õ[oÏ0c†3̘aÆ 3~`a†—•XJ©¤9× ÷Xp‹iê,£ê4Z jªH»j??T´³À,*­BÇ#W›;$ôös#É¢ùW`Ô§!A=Oƒž0FŽ‚’4>ˆqpýu_’š´µžl±4A‘†zTå hM“H×DÓtÒ›’”‚@M 7”#¡ ÌÈêæ2µ uê\¦¶¡Î2î§Sç2 NƒÂ ˜“c'0Q€qÅOÙk4Õ»aI…´¢ J¬Ó–ä–B‘³¡/8Øo°C­ý{0茣Pþ;šíay©.ò î•ÞÈ7fÝ?ëþY÷ϺÖýßÝ_â®G]OíÀ5AzÕ›ñ”Qs{Mmµ+)æÐX4vkPáP­´é=tè{]aN/V;A•D)WAg‰®Î*IŠú-wOÐe«‡M™×Ãe(†SÂÌ•áü®móibAá”"S‚AÍê ýþ;JèlbV:WȘ t˜ªŠ’ºKK'hU‘ÕDS2M…e+O’*ƹösl%©bQ’*.Dœ=+âYÏŠxVij"~|(b`ØpÌ¢îï‹ûÓhñ.Ñ«’k±Ô0]á¿‹î¥uÔüÌoW0Nk?^dpjqFR5e`Aâ(<@¬RyæªÂÖA«¡<Òb²ìê9AFtЃµúVMÔwÙ„ ÄÚxƒæt¨Õá`^’Z„æ°–5${‚PÙE¨pLzÏÏ:fR€©mìE(Èbaö-Ùª©û­¡³))D°tÖ”µCZ²w—&ˆ­ÞÀ×gõ:«×Y½ÎêuV¯[U¯VRä[A¸€E百úMbAω²¶;ûxÖ·‘¢ï œà»ße`-,šOì±è— lòƒ¸Ä"xZà6Ø#õ‰|XÚÓ¼a'‚À…%fBe Q yf+aÑOÒXÀL…qd;l„©@I lCÛV ¡CГÀ"¯SOý»³â;ÊPÂCa]·Â/€úØ» F±~«k” =× ýÁ³3Í^sŒ6yЭºÃäxÃÉñÿÖ“#-å×V'”î,âxÐN‘[h^ã2ÁTˆÅøL"^ƒŠr@v|°ØüË¿CÏDUâ„;êáÕß@`)ä¢Q©zè~qèþ_ºF‡ ’ކN!¥ÐmL+ZGI22p$J`"¥z¡‰(+k h°¡'€|„UÂz¹[ë°Q”³T·¬Àd¤g+T¹§ Gîÿ­GŽoi^Ö#GŽ9"C³RMYɰ—tà¾ÐÅWÚ*ì#\Ï‚}ùËÁHèC#—K¸Ó—(T [G1è¿×Eb€Ã \C¥J LBñ˜°+4Í'5ä"b½ Ebá_"6´¹ TÑö+‰³Aƒ­H©¥ÛÎwvŸlZ·Vx‡ÀØ›ÂH ?á¿„Ü,zÅ ]¡b…aŠ+eM&ê­ês0½%]ÁRÓÎí#°w,L IÖõ mIÚ¦T‘Ç–ôÏóÎÏã̘º@ˆ*dŒ ¥% G” ´)hš\˜¦z·zòq*e˜É2Ô-0“ÂQ3K˜ÐþÂ྆"Lhr ÁáˆW@ĸÐ"ˆJò™uï=¼‚3ÍZg«¹"Ùµ ©$.s¡·žC…[Ň¿^Ô’3ÐаŒ¬AbC™#æ‚ö‡;Ùa¶ñn…KIß-‡´º#’ð l¶¾#FÉs¶û`@•Ä2U˜ú¹7$%‰U-h/ቃDœ ¡YZÚ}ÙA Ëç0œ…[ BH".(=€Hóâ§çÅÿK H:YLÎÚ C ®hE'^œ8Û„iñ;œˆ SÕ{ ί4/жíE;Kèð{$zJb}:ï:Ôú~¯adh>º£ µ„BN68wŠ˜ E*Ì@I#pÍÖ@±b(Þ vÊÔ U(~Ç^{• ›Q0é0ÝôƒÒtŽ Vü<Ù&Œå§_SÒ PJ¡(hIÓ/‚ì³A‰Ut/“Ђ¡ÍªiÔ.ZAGŠRÑ;etW¯Ùá~q‰ý¿´Äm0‹$…%¦%•yDIRúf’,ù2u¼F†ù&f¤y™` i,Ô­F¼ “ º’x¿¢s<.¥éÍl:´¤¡_ @nè 8¹x 9IÁŽ…¢éF6-tØàèöîS]OMà~í©€Z ÂT× š,5lkˆHÔ$4 c´Qš¸] @âÕ XdXTÜ¥Æ4ŒcI1C¨%F%~甪 ìÔôÌ ŠÄâWÜè~n0ÃÄa|'ÍU39Šf EY!ˆLÏ&4&u$hé°#Á~¤éšLKH“Ú õç)Lfø¬ |V`uäñ+˜ SÉ–o‚†«¿“È µ)šomIk’PV¤ Þ¨±ÞPŽƒ¼I¤bG,@]aKUô•Œo°>:<a£ ¬H6ƒœKD¥×­½fMj­¨S¼Da»±&Á¬#¨î‡bŽ$Ø^¡Eäukû”Í-C`ñpާIé¢Àž@âØè(œœÌÐÈgIH =%:¿/ýª:Ü%ð# ^ª¡|™À8„‡}Qº$3"f¶¼n-ò\…¦µÂ…Z&~ö Æ é„(ƒ ÂAþ5œ ö¹(¡\IDû7*èl`C+80«¢´!šC—T)à‘~ÊÀüÃÑËõ(ç(8þJØïþ‰Z¡xÕÆ Yb}MBj;Œ²½Ò[œõµ—/Ï®‰åiÿ¿Wûi¥+ZqÏ—8³mr‰öh˜VXŠ‹’p>–Pk+9+4'®÷ž&œ3~,­[X8O€ú”ª¿‚jCÉm2y4‘??È?Ùù©D^VxÊ÷·áŸÀѶ•>(Ï™I¼lœ°3Ƀ6¸™F-“—¡¥ûšêÒømƒö²Óæ6‚ýŒph“)­ Ç-åtfbZ]ZŠPW Ô'”tÂJPZU±8 |hãtÇŒŽò2 ±&ršEy ÄÅô´ƒÏÖ'H[à¶-(¯,­PpHƒÕ“Ç O`¨PD£K„©¨ê$#w%¨oh#,ÏhÑÜXyÉ¢5–3“U…èu?Ö Õ=¡„BUQuMl ¨E¨›Å=#„°WUèxBæFWU!@½$¸b°v9ÿŒÞ â ËÎ w×À4ÇtÉ84ýé2´‹ˆkÑpZ`exä+0<©€|UI9œª r–«¨{«V†U“&Ôܡք©íœ ÁNì¨3OØ–Ü`M®ª®,eiZ… :¸€ÞXs@ P³Tù–°y_fÙ S%U#Stl´hïòϨ°ã£!Ñmd°²ÆòF€í  áÜf,YîßEÕªÀB¸ì¿A4yjO®èM?ª%…¢®,ý7tÆ¡s WK!^ÙÅm0à;2¾û?« e¸žYëÏü¹ù¨ò» ³!ôsGçWICgn Nò ô¦~,» ¡Ÿ7LtYw¢J#  <ÂÔ- Ê*:$Zãá– ^ÐwPSBB_Ód¶Ë*X‚Šò ºàñÂÀžÂ’cÅU„ƒ“gôÄÜÆZÞÐ/eB0>C‘`ÜâDr׎È]Ö,^PØ i1š¬8ÁŠNh])ŠÆgÊ] ó¿A[ÑEÉÐxjDª©Š[$Ca_€QT’K†¦ rÃ!5)5J¿G¯ à_Ù—í™Í0ü`„Oƒç¬ádJ?+0f„Ža‘ŽA!)âº4Î+Ê8‡.cÀFàS@£xü  Wj:oÕaOèb)%Õ±Ùºæ‰h‚¦R˜#µA™Ñx2‘h2ÄÎ`ŠJ1VÚQÏbü“k}­²Ay r­ðúÍ’%Fœ@š#¶§T6B ô˜„"%žÉ€ã‘ãžË(ÔÄ”tŠrXkÚëEÉ#ú«‚«&ÛUK±C¤·zjK¦rf\‡pr¢ø‡WT2(¾Üï7È¥)ßÖNÿXÀíp„‡ –!”WXS“ëÓðjÉìÛD;Ê\ÔÔ&MƒÛ …fìXß îm…Ë9¯P åY0.(jÚÁ¬Uo)”ÔuÚŠ²9³MÉlÏäÁÁ.@°cÃiÄ’Í J;ªÁ"“Î2djPj©Ϥ >“Š\„ 'd£'2ÏPè«tµsS“Zpس·„jAEð¿·ÿûò!z!…¹t—1ÚÁh™lwâdˆ<è+‘¾’‰F¥êÙvØ»F :3c2 FjÌuDÿ†”ÁK’8*H“aGS^”‚Rbµ S¬Lr^4r>œ;2w•£t pÀ0Й±&¬Âé­£G(”UÒY´4öÙÖ†BY!Ü¢®ªL†V‘}X„²¡¦¶3‘ò9*²q/CX :)â&Ë–„C= qOÒ®lÚc‚)QùÍg,dJ`!€–ê%9á­lÌ˰~¥¶dD‚ó#{Üö…¨êháý” P]­Øƒó±ÃGn(nX,­z,­{,m;,íߤ<˜uþçT2k© <ÆHþ7 B¬I©éœ\•™‘lÇN÷Â#oû%‚¨X! ô¢«Æ9É®Îc¶R‚'½iuQû c !ʉ° ¤ÍìXйPo)–·™ß[(û#~Ç:T+Slƒ0}gÃß÷Ãð7›í³Ýlr{lMn³Åì i1Zð`ŽGaTV$õ ÌJa?Ì1ŠD‹BQR‡FÌF·ÇÔèÖœ*h,ëš ?(–ªxCIGÏm1òz¶Û=&v»î¤Wds+ÐÅ,”  zSRD~T”·…[ ÄÀÙö÷˜Ûþº P’ ›ª™`ƒ Q‡º ;ËdzùPkJ×ÓšjÐÐ6÷kXCtØÆ„ ÙÞ쎩CxjhK¤(ÞXx!K‡ ï÷¬éêˆdÈÄy`1ÊR¸°g„ í( e« ‰'{‡b ܪÙS)ân†$2Æànƒ]MÑÓØ¡²AÖâñ"5ñÑž’šl ŽâT]æ H€N\ƆTµµmC:1dç!h©ÚÄÎTŸLbmú)åÔ0š$f"à<áΓõ³kjyÍšX^íÿwÛ$PËë_<ÍGsàÑl˜ž,Œ9ðè‰g™~0Í(³ d½ñÀ%¿Z¶ð‚ˆ.½,½ñxzé\:~Ãò:œ%8d8–K w`Ã5`ç WÖ;W*®4wÕWhö^³„ŠZÎá¸ôHgÙÅɵ+®Z;ú—½þÅW¬}ùR®½r)ÖŽ^qâ…K»vÕ±åOüKü÷¿X;~U:HIƒ„¢ß 7áÊz÷Ší²¾Rjá»*7HÉÒôio{á|éÐçõÿ½ìKPžD¤I ð3pTôQëΠ`§¸Òâ¨`|΋vLû€/¸Q‰xèè‹Ö׎;ñ‚=qç­§^}òµ·ßéYÐßrûúÝgïÂüçÛï¼kY^z)ÐñúO~å®?¿íÚ?¾aß³lßñk^±û‚§ýÄs~íOþíõ7ì]üëÿzàLŸ.<ŒÁ¶e+ÄæÌ5]XoØïýh¶º”ãé2«ÒeèZwÞr⑽ÏzÉýü÷.Ä®¯_²ï YeKˆ Wˆø£*»Œ.±g¨*yF/V¤ nÈRµoß®Ëïÿ‘w¼è¼w¼ÿ2ó¾O®}ó¦ý¼u÷òï,^zÝþ˜¸0*¯Äpó@¿d¶½pe½s…F¾¾Ö§¥C8ìk3”ÓSÊWåSÉñ郿õóüÆ×/Z>ü™s=ï¶‹¯ü«¯>z÷¹×_È_ÙÿCýå,‹f9KuÒô>]ª ( Íí¾²à©R«R¥¨ú*QuÅïݱïË?ú³=‹ã—îû!n¥ ë¬!Ð3\Yï\¡w×±¾ÒP¬¡Jpn_ÒSŠõªk†â_\ÿÏ=ú—÷ì»èàÁ ï}æ…¿tÙÓŽ_³÷ªWÞñW‹ÅÏ_½Ÿ¥ZØ>ÕÂö©®ç¡OÇTªEFAíÕ>ôàý?ºX¼ùiçü9K´¬‰¶5Ѳ&Úö¦¡OF‡hD’Y¢y…'WÁ’Á5ÑÏY.-žó‡žz¿}Çûœ{ʘ÷þ֞Ż_±ÿ Gw¡ûtÓ•uf&ú”ðt§›ºàUêöÐý±ÏüÖ_~ëÑ={.ð‹}_qé¡§^þ êó¿ø™õpk¿uËäàŠ‹éWÖ™™èS2q½ÃwˆîGÞönyx±ûÍ»/û¿oyèü÷ý·ß~óWþÝ»¾úÐîsßõÌÅŸ|h• ÕeêfútL¦:£’·ê}{÷žsß×öö¡›®ûÇŸúKOÙ³øÀ;wsÛZXÓ'˜®¬3SÐ'a"{‡'î4ÁË_ôäÀuǯ¹ðø‡o„5þ•÷ïí®1…EUL+$Òõ>FªØ¸t­ÉʨâjU²ªhõ´Ë.;±øÄw>xæçþä#ÇŠoÞôâ¿ùË_ýήŇ>{nB\¥ZâDKQû{M#®ÊhÝí'îÊ7Püî½?|åÅϹP_÷_¾ý;/<öÑsÞ´X|îygúÛPXé–¬ö#6)šFa~%¡ð ÿäy·½ê)]|}¹ÓWKôÐE¸²Þ½R+Ú5#;²÷ŽÚ‘íÿñQϺÿË¿ýxïÓ'?¶ÿ·9šµîÓ¬uB³HhÄnï;Dsœ¿µ{×å»–ÿïò/\ùÕGÝòížðsO_}æy»ðít¿Òé?â‘ÝÑéÕÿa€:…Vñ‹uö»oyè—þÞ]—]ðÉë9õ»÷>ýØ›w->ð›k¿W¶ä-yíÇø;L^ùw`W ïüßÿØC¯ú7ºxqìûú6AYôQ)¤¥ˆ?bŒS{š+ó§98À²d•«’Uf4ãr¯×Œÿé˜G}ôå/_þŠÅOoìáP®( êµÒ¿Ã•õî•ÓØþÄyxâÈ‘ØÝ¬]v‘?Ïìýæ¯íyïÁ³¯{Ï.î½/]B©š%$!F•îG)Êû ü%j[ì+õ‘åâûîûàâÁï‘TYüïóö?ƒ±H‚£×Ð:åWL7WÖ;Wh¸‹ds¥5›Ê„ÚÞ+R™]ÕFf*Ï‚Úé{O¨Ý‹ÏýÔ9¯ì’ZÕãTtÕ™æÊz÷Š­I­¢ÑóöÀfoöÞ±CöÀ».~üs»ºë 9¢Ðdÿ†qH$KÆ‹®Á›ÊžìDS¹ÂŸò„¬j2œÉ¨2ýÁƒ‹Cì>§¥Ä~4…%‡EvYSFá-%àAw*– Øî()¯äĪ›M m¶õ‡Oü烋Ÿ¹~ïë;¤ I_Âdà=|¹5Ìœ‰¸¹ŠöR4°ÃP]ʦz*7ÀIg£ÃR¢=iyêy–‰Ë¥œzjl6‹[™ÃHž=;cÊãcÖ…IªjU Û †F{ØÔ[à8oÁ€öÈ·â±2;0$cÑêèPFN5à32nŒ† ø6YÇ¡“öÎ`%7z~Nx‹“?+ŸÛ÷®`ð™F™·0R&‡¬”83S30ŸÓN‘dÊóòèH)m ÜÚgšH¼÷u²)Š ½V\­ª’¸‘WÉ­:Ëc°vŒgÇ):]5¾_º¿3Ö/gûD¶‹²5g‚ ƒ·^®!!I„4ž;© àžœµ•AÑâß–>?eÖiаõ¥KЮÊRbÞ‰‚•X³Ãú,Rclq[0Äºó†ø–©R•×S0ìzN²(ÄŠTVEuDÙž;¸]²²äÞ¶Ù]{Ø#‹ç•éFm g·I±Lo¢Gg+Òš¹CðJV”1ûyol–´òZö€Í¤ÈøØ² Ë똰Æ-ǘ֎‡K°’ùi›¼Ù° N©tÎ#yÐ8 £7:sM™¼Ò&ÜÀEäïcü BÛ‡\ÐÀÔlN™´~›œ6ñK(ÐÙ;X¶òHöƒ>L!¦º!;înv_m¯"˜ªÆ)‚H(n‚™…‹ˆˆ¾0ã¿}üǃ‡ëTÒä°v&h’3lt§¼nô’šÙ3ðž êcÂ)7ÿÌwòaÆ/"æÐ®eŽhF˜!±¸­#þïgôœK|•2þ…Ô·zXòˆx>Öª1j·(¬qNó–O‹‹Ï9Ðãæaæ€W©0ò ã¥ÑÜìÃnéIg2TcÞµ9ÿ£eyoÌ?)ä#ÍJ4F3«í)>°¼=KeĈN@ï‰t†‰ÝmÉ‹ü¢™d€ïîX1ؼž–Kå º*+ó²ü9yÈDn'(°içà7M;!zl5~;—µ1 í‚È(å:>´¿šœm8-²“-8f œ OØÐëÁŒá˜FR0[fš_e%ÍF‘pBVG\áV‹„: W†ÍkÙœW”1ïe˜Ÿ9 m%a òt³yCGéî¤ík–]Xe1 0lQ¹>6=ðóð4’Jé’0"s¡(¯'†Âò"¿W¿¥µ‘ xÞ'©ñ•óD²kµPt6}ô³N"l‰Y'ͯpMÙ|è‘ecdU(èî°±fKìVR_Xo/ˆ"\h4…iVx‰ËïÄ/¯Kó¿>þqÿßO¾óÿÿqé-i\JoùÇi›>Âør@ýêiðSv<ÛSè¿úGNÿñûö½õÛG/->¸û]—|jñÏÿÇþ›ÒêiÚÐÌ«':\Xï\¨èBðR¡†“RK®ÌXýÀ”T±*©‚!õ¯;ðÆ¿þÓ7É·¹õ•¦lT’rÉ•­Ÿ˜’»j¥FÁUjôœúàwÿô ÷|úùo}æÁþã˯xàþv÷¯Ê7ž¾o×ý_»yqìùkìBÓ§œ®¬3sѧ…§<]hzâÎQî÷è¥{Îøïº¿µxè×c~–õŠ>?›¢ÏÏ5á»Ì2ãwì™^ê¾û®k¯¥¾ã½»ö/Ï:¶ÿŽV­ú´j•ÐZ$´«Ðªy·=´Ö{÷Ê›Ÿþïß½Ü÷Ãþщ+þì{ïüîËÎÛýé‹.]|y±çèSžÁQ®ª>åªêS^ÏEŸ–±m¿c‡(oDôž_=uóÍßwYû‚o]}í¾Å%o[cY[‰„hÑ'ºž†>S—[e´ìv±öç?úOóÿÜô•ÓïûÈE{ß%Þ¸{Ÿ{á¯ßöÑ]â{k‰Â-[…«Z-ÛùXNW¸åN*ÜH(_öÞ]ç¸úÐÞûšg^¹{ñðÙs™R¥ÒÈFïaéd£wë+e­w›»ÊžÞõ’¹–«UZ?q‡ S½wo^úÐwýÔÏ8÷kÿP¸ñŸÜ»øüÓ¢]k+ ´l¤Øë%,`ûQv+1Bëõ†º¤ðÓD½LºìÄçâm¿õÙ}‹ÛÏÀ`(+*¨Uj¨[Y_Yï\‘µJmî’=•Ê8ú¯˜tà ÓFtàØÁB˜ŸUQ%Lì'—%4Õ“ Kaâ©êéjeoã¥^@t‘õÙ’< Ð-Еù_½šÎ¿þÙ,b«×]íaT$÷ñQdT®Úã5¡3/¥»Ó=·md~gÿrk}ÌíY…BÎÎÿêlæ•ýrœÐ’¯ð§êÃÒúµ]57ÔNÎ9ɤ€®–ÓÔÄ\ ¹§2™Ó3êǪ޹åÆ|I‘]ޱoÂø·m³Ð:·RlÐE™« 6Pöc,!‰16fna3/ÆÈŒ]Œ!uŒ“Gã.™æ-ó•1…Õò~Æ|:-Ð"ÝÓ/eÍíNïããù‡2{+h#-{ÞkvÏÛB²QfÓ"£7·çGÊrÚíßòížaÂú^˜šYOлºu|¶¨~<“]p‚Èö—¸Ê,k3öÿÁ¬ÞÖdæƒN‘“ 9fÊRLr+ŒfÍŽEG¥ln{}|ød¾šÛfse0¢q/Sê ™à7)|“«¤3Z´'„¹bùh Ÿå°Ñ€7Ôʔ呢ïÊfBšÏÒÈ<0,˜0|Ö©8–?ðzB fô0Y¡ƒžúø މíMÎQ›ð,ÞSÈ 8&ì‰Ù×±eðŽÚeÄÿ$â@“ôAd3‚lO‹àqc,š ϯŽÅ@fø„•ŠL"Ñ`üþ€{8—Y;HÇÀ³Ú‘T,"6Ž9»‘JÑÁ\è¼9ÉÆŒ4¿:ü2|ªlJᱟˆL ÷iªbWo>‡x<a¡Ñßog™eR•ÛVÏm©RE$Äj²&iŽ\_ýŽHJL¯øÎpwÊYÃÇÍ!d3&CèJ©øÓ¢gòTVH䛆Éxñ3ˆ€¶¡‡Sw<ˆ…Ée²A´ ¿zÜm5Æ‘|X-§«”ž˜qW…òˆë·³`*·c`­Žâ|Ò=|FÑXºäv·›¡0Ö fí‡ê]e H]i¢@¦>/ÁîIW —œ”©Í¬úPfø^ã#–OÁcn/¦§TnH¯OÆ´ƒ5Í'gS³Oâð‰Ñý)Õiúkp `°IÕ]É3Ò×›x²•xÕJê«wŽ`¬*y±VG´ì•AiGÁ0†î3·-J¦ÊÀic¼l´Á't™&WìíÈ4JÕ K±@Ÿiv0)j–1y{kúDÆ`¹:ÃdÅ1GØŽ-|Š˜`ÀÿTbFÓ²k0Öþ*â6&XAw+$ (£±"¿c¹‚ƒ›i@,gò<#STÌ cX†cÉE[©BÉ$£ ¦(¥»%æ6.PzÎWz´ÀJFÔ4U¥2çꡳðð¹š#‰áÐÙ¾œ’F cÇÊNÒȵþ³|¢G2öÏ1Vëƒʼa ³\A7ºŽóf+vµiY¦qÖTü\¦ãCÎkMÚÁ Á .IßfàŠÍCJ0ÙŽû«~ÊñzZ²˜Š@-{ÖJ:&¿§­Ã˜Ù†©Í9bÆÌÄ6LM“1–o«MŠAÓëÉ øÆ*¡0²š±÷¢˜I^Ê莣>ìtD˜ž#;ªvw–nu®-ì—«ÒÃ*Ø~îuâñÙ¢òn«Ñƒ*q œ)š5©í[nPæšÝr¹ÿG°[‰Ý8©ø©cG²ˆ_ÆL©ç`À{¹•L‡Ú>´£rMôLtq_ʱcþd×ĦmƒŒ}ÀŸ¿’k"ç§]ùìeSOE/ß/ëFM_CÑ Sóâma˜œî¼äî´ØáP ¡QóŸž‹» bTEyXXÆs¥ §1iJÞj‘+“l+Ù¯·Á Ú.ôÊnÐÔ’Yÿ¹5u dèçEi®ÐV6h¥¶!c¶â‹‰I*7d˜\t­§ÚGk=Ž•ÄË×cÀkº¿;_üäI==WŠáab ˜°¯Á¤ó!õÖöo™x¬»C÷OÒ¥* l•m)ß“ ìÂ0Æ¢èU8m³¢ËôÅyhš71›Œajf¾˜Ó_¦äéÄZXc§¼z o¼$½–;zMm-5}·I[ xSåš÷'•>rié£ ˜dN$y³ÆŒß±sí˜#‚ÑimßO´yç][Ê%#k%*?29w²ZW.2h¬âm«¹¸ZxÃ¥¬Ø²Z¬Eóž ¤ü9Îô€Y„Gj«²Öº!™3æYXÁÖ˜œìYÓû€kg…À ö轉:à[íÍÔpÜJÉX׆AضmL^ ëÔš†Èëg­Ôå}¬ãõê]Q¶XåÑ Óº1¸©Õ!LÓ^.ŸO6M+ð¦bç"—ìI (G¯×¦cÜÙB`ÖÉJÜ^eÙ±`­}ÝXS®Â¤³2°ßVn±¹U 5Õ¶1zQ?$PKÛ Óåg~ÃL+ÿ>Ôt'S¨x²kYdÄ9™;¿×òm;kÐN49 •D ¶VßI•hSóø·dVsp¶çÆÌÙcRÙÙÔÿ°Z–ÖX£ F›ŽYц+º±lÆ0 ³²%£íaåÅ^§ šMפÝNMõØ1µ9O5”¦Ù;Ñ\™üÍ—O„ÔrQWc½ëVÒjñÚ®àoe]#õ`¯¢7V·÷`Ev~7L’à‘?..‰7-7eÚá»ýy›ÀÖΛc'a.‰dµófΗ1U£vú<Ô—;sıq÷œ¶äö@Û¿ØR•æz Vvÿ‚$J§?öäl²±Â‹8j`ß>%#S¿òPàcØ™lâΙ[öæ`.ESôüôïG']blL °d@pT€rZñi©ÿi§”ÄX:Ú6£B Å#AÁ;O<èã"¤J'ˆù1C1…¼ÊlÂÆÍÒcaÝ£â~šŸi;ÒŠ£ñ ¿Rê˜^·öÿšJOŠendstream endobj 48 0 obj 94837 endobj 62 0 obj <> stream xœì½Y®¤9Òø~Wá+ðæ<¬ ŸúAê- €* ¸.àG)äî›fç'¿!U©¢rR Èktö‘´‘Fã<ÜÓ‡‡“ÿìo¯ÿøø¿þsñ¿ÿÿiü½&_9úüÌ×Gª-<‹ÁŸ—ØÝ3ÆQ`-VÉýø/ÿþáÛ€FùÿøHÿçÃ?þÛ‡{ø1äþ¿?Bmõ™Ó£$Ÿ)Q¬$‡ÞŸµŒNþßiJ„Ò3”½>KöúÑ÷ìm«e%{­…Vô½>«ßë³äk,bŒé™Â^Ÿ%©ú§ß¿ÍJ¾ƒEqõÙöo³’ï`QSzæº×gÉEkþ÷J(ø‡äÆßnŸ +ù‡äszÖý­d¯ŸB;#ïµXò,RhO¿¯Ÿ•|‹Ê3 ,B­²ŸmÅY¢XX-³ì°­KÞ°Ðú¹÷øì}«o%_c‘[Ï÷ú,Ù±ÈÕ»gË{-–|‹\ú3X°ä;X¤0vð>V¢ý|Æü¯Ä/”8v…‹c¯µ±ó£—9o.<[›%ÒNƒ4x}d7V"·ñ÷çü»Œ‰‘õúuÖßÂƇ=þ®¤?VþÙãX…èòà²Ê 4-¨ò³gÏQ+…ð¬Ná&ßðíCjÄÊYZŒæeô—â s7»ÿv÷ùñ7ýˆß ÌJ+Åy9[¼Þ[ÈòùÎ!š ÎçˆCGɉçç?çßþ…%νðcšìd7¤+ƒy)dŸ%‰´H ªwYì’£²A­)±¥(”èÇÎ~´\žnlK¢üËÇ,p5?«Ðƒ6³À:$øë=‚í‰ßaà{-š °·b{A) rÍ6~”†LìtàÄvÀ¾úÿU'=¤*Ó~¶|}\}Ë×½”¥`àRÇØãóSWAU–:½d iû†NðÀàRøïèªÈ¡€ƒIßUt-ðå!`÷ŠÜPRnÊñöÀŽ%z£ÛÑSâ_àÑëIÑ;ûz}ÜãIïý霖xQ-â ðP`Zvc:u¾lŽ¡•l²ÍD‰}NøÄ8F¯duõöú¸GüÔ’X2ªå±Ë¼nù.FàìgE)ñ X#é3žð£Žc‡ýýcö¿áxŽˆþ{aɘYÈÖž78ÀÝË'8²dÍ£µ±y³>7x}ÕœÇÒdz·×Ç=¢ôGíFÎ,8 #!œÓû¢8²d›Gá%û¼±Ï ïxÌyìAqÜ{Žûˆ˜Ç¡§éZ;Ý×-积„cS¸²»ÞG–lóÈ6sÞØçïxÇä‹âxööú¸GDÿµ²¤Å©GÂ5Þ,ùÛW,ÙšÌi“ÑN¸„sÿu-'µ3(i™,zôàeÅ„‰ ^?ï/µÅVµsIl„ÏQ2iˆÔ1ÄÕéQK,_áAQe0ï{d¿×è·4»Û¼¾h‡!à³ròþlñ‘„•Æ9¶¥à6”m§½ nW·¡2ø¨%c€önK¬Ý­ÅB9GJ’ðèÆA!.XÀ™‡8O"ï:á(Ú_{Å5‘\n0³®Ó%²‹ÃŒ‰8tžXì²íîL0< Ç..Œyˆœaf/&<¾8 ƒÁ¬ ¥V‘µ ½v¯(Ž î J†­ pr„ÇlÞxìîîMpGS—Û€‹m„CSEkÖ^Ã3DÅq(%Ã.ØUŽÛ7»t;;ƒ¼Ø©ÓûʒѽÀ½P¯A-“jpJŠâhZØk鎦†¢î·9 ðŽÇ.ÝîÞ^÷ˆŸj*e³;¼L›5mŠîîf¨ñ£aÐÅêXdEq!ì¢Â¡.4vá¦ùÙÙK £ÞÖx‚a3;He™ØR)öà>§)W¾)Ì™ö¬(öA{,©²Ç.²oÈíq¡±‹¶»³—Zw¾¬?µ$ Ý \¬ÆXŠ7ËLYt9YtÇv– ‹7Ø?n4þ5ÑfL}¬ü(ž2wt4„èœal”ÁVJ³`˜>9]Ê>ØŠb9”¤Bz¨ý] õSE±Ž¢«»,šaä¸$›_Z #Æ«ž›Ä )º¨âªP 0Õ¼O=`”øÜ ˆÉ?7pê e,Ë*GwÑÀ.´·Ào³ Ä Võ„å›ÞðPt‡¹m-Ä>qC¸Œ]Õ†|ðCËcã «aÖGÕþÅG3Ú¢$y›»D9z²ÚÚß>ÊЬ›ØØÞg¸P‡V+ ? ‚í4öÃá”p¤¢¦"]漩Vfž¿ õ7UáR&†WÜÓÄ]¿mÿø¶dféöñ2=nM¦/Íé[N°H›âgI÷‰þõc• ž"ÊcۮȨcñ=pÈ „uø`µ›|B RO§!­i0âú9=ß™úˆÚ÷•ßÅ}$84¿ØÇëC9ªzË’˜+wxpÄöï"0×p~GxûŽp}G=¿£\ßÎïè×wäý;þmËYþ©å ¼6 ¾P}3øœjð¹,Ç`£íG1Ë0zë2eq¨p)ewîµAÚ"Ügøf¤ ×øE¥*ëÏÉjÈÚ mEìjWC‰Ræ,‹®K]#—¾^×\ùx­|»V¾Þ+Ï•—@‰cå˽ò ÒmåÛÛÊ×så“¿V¾^+ï}9W>+_ݽòn+8^p9Zl'~ç{ýïp> ã dp>úâE”Ë 4÷ ÓáFŸž /ËâÆ:±’¤Ï¨°¹¡<LæÞ/Aáé+דÚÚ"B\¤d,‡ÀØKΉcOà® ­Q[˜eàäÄç!p‰-½*Ü;a]é&1,Zàê {iPÔô°øwµEY"{cÀµ–å@• Fh¼º¬úÙƒ}V‚Ú~ðÝH_=h4³À7­@œ‹¶Tâ=•%¥²$‰kplÉ@X¼éÙdñ;n¥¤z–ÈDÊ©["œ½Âb)¬bKJZd‰T#2“… œ3á¢.T¯Qbc»;uâŠZå” ÔEÚÆŽ+ƒª‰Ïu,Mf‰XÃr4©"ÀC§ÿkª N”…†„ m]¶(t<ðÖ¡ÏÕd¶tàæ‚z,tÓp¾¥*Ķt…í„ÿGÐRI¤¥qTå-y@ð˜HH!ØÉVÅ6Nˆ=ìàiRRuÔ±ÍZ™°G´¬ÆÂÊ€¤¤Y %¦¢Ç4ºÍš‚rZ  b9„Åë&¨âÑÒH 9\ å8n(üÙ1à*ðh1úhêÅ–]‡†—ðQçƒ)ÕÕ$%‘÷skŽŸÛúM/_àò#–…g²*»ôÉXÓˆ.1,¥‹œ¡FÛä]S>'Àq Šª~ÎyªýÉ$†ñ9AÃàþçŸãÛùœ"b‘Ÿ£2«ª{Çzvªa-̱+‡NÙvUÔ]·€Ë¶ËTRŽ[±«\%œƒÂ)v4£ë™åðI¥}ŠÆ`QCó Òß©i¦hKÜSÃqüwܧ[Õ˜°\8a1â¬6/y„ Ë‘¤"Îé* È*ÿ†¨L˜K,‘S™E¸ÂnnŽpÆ„ âÉ3–ª²½ :Ô>õ=EjGnªÚô¨D$5a'·þ“¯MƸ¹1g¾0Ô¢ãHÞen©Ž9+:V‚ÃÝ9k©ë,¦Îm&ƒHz¶9i”û1¦)~朌ývè1Iü¾)¥ªL̲"¨j4XL– ¼/@¯…ý/ ÓÜåümˆÖÀ™qýÐ!Wì#ÿõ9lx¡ØëÉqÖ³?19ĉ½ÎP ª|¥Æ]EMÉû~OÕ*ÛŒ¨Ô’VØCs ÁëMDÇgTj Ù©JJÓàdÞô~x°Mjê‰eÊÿs: ?ˆN‡"•8_±3¹LYˆ-Ç -* …‘'n—R ™v~|†&êm Fl°¡ÝØôè 6]At™.¯È°›<É\ ƒ®žÄžõ8—a] ó9Á0(¶¡¾Ø_ÿz”Ù{˜u“X•PÅË„¾7;|;FÏu-„.wŒhAŸEÔª+Tû×/Cµ5^ú÷³PœÍƒ6ÉGä¶F´Z›dñæ³d(Wsa»w¯ŸWI`̺øÿ~ýf(hŸ%A‡¬Í`¸¶ñ#{¬ÙÆ·©lð³öÇ…ˆ²älè«Zˆ×JG~5i‰ðŸ`pUNUmŠre¯¥ÅÜm”¼ÁéqãA[ Ž«7ÃqhsX²•%OPD5Îà`(:vj“˜mZ…­\lT`¼c «+†áìÌ6ÚÐ0̆’„ž 8Æâ²ôŽ'E.•(&ë54â˜,L2b¡“†§uo+~~Q (îÅ}@  ELZ°uÎØ—Þà‰aÐ`Àè()‰††ÑfQlAÃã`5G¢È Pu-Eo)£kâåê,·ª8¦®ÀsoªÒ#½"V]Ž÷:qtØ‹ê™Øë¥ ×4n<ˆcµ•^½é4#Å r)BGƒ%*IwžpE£Oud}j‰F#Ë0bGÈy™#Ê›sÿ¨†sö‰àO×Ù5[È,²_$1 <Éõ æ2O›Å²ëŠ¡hÛÊŒ«ñ<‰nŒÏÍŠ¡yx½UváA =úìMpp ¶Ô&níc”زñ±ÓlÔl 2f)Ø$f¬+2 aëš¹®«7o(Î`½M_JŠ“·…M˜No-b3 ƒh{Ïd"~^Åtz›Î5{ÞfψÂyÆN̨!è… ³ˆÉt³…'fÎÆ 3[¸HÌ‚ÁÄl¢á'j«cÅk$EM4È…WÛ„Øè'CÍ&M/Éh‰MD-Å~Ö[ûÛÚMµ¹éÑþÝÙ ù5 PD@Å(‘S E¹+p°ßUµ—`ÀìNÜwVŠu¶=qÞðÀìí½dâ¶FJÄ­¡ˆÛR`#\«M™Ái¯ 柖D+‘•”-Œû¸‘˜ˆm]±} V 1•^ÁlL`YPÝɈÀªev YJª•‘Ö î ®jRcèê î#AĉK#ðH½85 ¯°:û²u°×Ò GÃAU¦¦ç_€1“;6yT«´àF™ä ´ÄY v•cùDÀ³…¡–Øi®D­Æ+*Ôî’èÛ7†ÚÞ PÛfÉ0C|ÀNžŽœÅˆZ±S6Ôlè„•¤— ähj{/@mÛQ.¹l+Ç€•5\QØkeî 7 ÛVJ(Š¢áBY!ûO< 7Òr4:õ /ÁHÀÍW+*z4)'<„=. Ójt uiI³Ù\ÕXJÔd2‚F08µÊ{ÝÒf¢æl¤BÔœ¡V’âá€Ó'…áÜ 7Ï^[6Ü¢•4à–mÜð8¿&/Üf/‰¸A8du× nŽš{î° C ³žã( öÄ­ÙHÕæ­Ù¼UÌI¢¼ñ8ÅÃÙÛëã‘8z®eêŠSkç–Ù"%Ã1°×2qLVBmþ*pÜñ°ùÛ{nûHÀ­¶jÉ:Š‹ÜaÉšwTàJܪí˜lk[mþ2Ö–œCxêãÄc­íêÅp[#âVmŸ©â4h°W¸ÛwÕvY²y«6O ó6áŒy«u}Í©ÒI6ªÕp,mKæZªv2à`5²Âyâˆc±i'J,¢•Ç ' 6}{'DÍ­€ZžÈ›Mµ®ÅWîf]W³Wõ†*1³]ˆ™­ZÄì[ù¸¡6{1ÔÖH¶ë ¾p(p2ªÅÂ"/óÞvÖ<:ìÔÛ¤e›$9•’amÓaÏíXœ&ØÙ0Lq  “ãº:¬c4šuÀ8’’ ?ÎMülê¦.ÛÆÃÌí8ØÌí¯9 ‚DË ^;G#H` 7”À‘x%,7]®2µ‡”`ÞhFcÖr\V©Zƒ@¬`iÉ0¶Õ`kI ðpij((ÛDÝ1¼;¥6W͆öÐæª™òÞÆŽÆé,Ù{3÷"b¤Ì„µ=1•®¬(F°Št¨k@‡µ©¬Dqû(›½½ ¶Ô\±Èg³Yª³é¬&âT&n6}Ómú pÛñ˜¸m½·m¤Ï*}ÓV$é.€ƒÁ¶åhßû§‰‡`{0cÚ¢M[eìhœnÄj~p¯éu¼¸Æ#†ÎJ¡f+ŸpKÛÞ 6mjËá=lêíhd}Áœ»ÙI"bkœBÄší0‰í”Ø«ÆeÕè¿®G3 'ã"ÞÆ1b 6U‘ˆyƒ1utPx3©§¸2±ŒÆ­ÃjªóTKlñ4¢±3,ZàØhÆôoãûF ½aÀA¼í»€}¸£qœ\½Åm@`Xl¹#V3ñD`œmµ£m?gkç*Qt6«¬×{ìÇ [Þ½ ¶F Äu”£Á–N6™Á6ÍQR µh%¨ÙFt˜Í…Ƽîmeê†b²É ¶û+%À1Ùt€F:L¯˜î1AKº ŒœØ‘;ÛQÙÕñ›ÃUâmR=–3Úõ@0 yÃφ££³Ø++œmظ-4ŽãFÍœ±zŠ8ØÑa0¢uØ€Á0tÀáÙY£ €"ÏmœéîÅì ^\̾pÐÝO4ŽSÛ£7C1Ñ:ã€ÁæÕ±àîIÖ … 'ƒ³áhÓ˜'Ž6™8Ú4àØêÂã8ü–ßüê 8Òz­Ìë!% )˜2O£µ-‰C«!"Q¬†‚ªòÅÌŽ1ìãÆâˆ ¸:†û€ÀÐyb$R‰^ù S(p&\»¡h´ƒ¡83¹§jô±9w<Ž8 ùͯÞdž,4ñ%6¯’E`gpR¸Ù¬V#˜b#Š9ü|ŸÅŒ GÃD ÃYŽÎîñ>µ¤¶£ÜOxσ cc¯©²ÜYRòcö©q¹ÛWq¹ÌÉtõöú¸GDÿþXçÊxµç G–hkÓ>ØFs‘ Æg¡>N<Ú¡²jouõöZ%Ž’øyÇ©ØMÉ ‡‹¦Y¢·`3IÀd³Oà…G=TíͯÞ^«dÃ1]ô˜£a˵%ìAZ-ÑH¸ }Γ×t³Ï®mx”s¯Î^÷€.ìéJ +QTØ~Çe:-‘£gU{g /@Ö ‡étãq§Û{{}Ü#Jÿ¦}­dîÀ1Ó¶pd‰5öáKú(€£hK7wB¬½·×Ç=â§fàéGš´D—á–ÏçÊôÄu&ö¡m諞}òÜäÄ£Ÿ¼ñêíõqø©%9Ÿ8¹¾Ã.Û=ù[± ÀêZ‘6^µøfŸt&xÄSÄ\½½>î?µ$¸'‰¤ú¦ñóz§uq»Â¯?56m¦K›ÖKÝ£›î‘&²k*ÀP᪩pȽÓÓ­à3oáašºŸ^8ì äê èíƒÝj:T^k’‘Î'ÙÏ$"}†6 >µÀî†I|tTE•ý]ìøêÈíc}®<ŒªÞ&h¿†~vÞ–Ö¹R n[}cŸÝ]ì"ìì¸m#A-í¦Böµ×TÌMº˜VµüT™Ž‚O-pKO–UÞ¢?E ­/[€v´z†Î¼ä¢éÜ)­Œ—ªïB—lžºdoÄ®×YìJŸ-Livxá°+QWOP—÷Á .s¡5ÈLUÝdª.ÕgS}ЫO· >5c€¾ €ÆÙŸ¢Ð¶¯[jèÑQ¥¢¼ÆªTÄC1%6"/l'ì³Â®QéEîÍÆe0^i h3ÇÙ߅®Çïae÷¡°²rËQ9¦z%ÿ††žêM4dÑÄ aø«û.iT¼Ï |«ê£ä€G@ÒÂ1u{GPFf,ùDn‹Qâ#²a˜b+6Œ§P#öta“Xf}–àÝ&‡—”´¤ò½Ï>/4Ž­'µÕtcäÝ·îgöIÕ[ƒêµ-RG¬Ðsƒé½ª×ʳL|üÉ38/Í8um£5Y@Ÿ°™ ƒz¯Þ/sz-ô/tzz˜p.Е=a ùnaz¼”ã,pGÛȸó„»ÇÇÇÁü®Þ ¿ï#~®¼ŸÔŸU¯5=6Cg„eÇú,“xo<ñ{õ†ôûˆÐ½£=NØ ×öùÄ_žÛkÀ¡<ÄA(áãR®Í6óXQûT.Ãêíµ’ZÎþ¥$˜Åà¥ÏGAÞtÑo_è¢yži '†’SâÂâǨïÿêÓ•Qϧ ØyÍ}“)RqPmõLÁa×—çGJÌc QÓÿM¯lþ&¨ÞÂûëYßɲ’”œ©:ÄBNZh&‚v[V·ïß²HìlÝ …9‚åˆØ3iœ™6Ý ·=…ôZlDUå¥$MK (NÑp}Þxì¬êî 8î#2׆MSmÊš; 2’ÖÔé(™|òn+È0ˆúB«ÁÀpÇbgøwgÀp™6"ÕöˆÌѲ 8ó\xŰ3’j½ŒÒl»A°QD¡GÅ¢ì¹ÄæÕÙëãîóʼQ®3Å…’L³'Mµ—„öÁlAs[]^HìªÇÝÙëã),¸@¹I/ƒ ).ê®[ûŒŠ†©÷±yr¢À®®>oñØaíÍ0R#BGLe–G™XCÞù‘èrGXn7j8µÂ4"¢ä ŬЌˆÍB×Ñ&J2ÓÞfŸŠG]xì–ÄÙÖzk-÷…”3eÏjÁK„ó"¤¾“,AúfLD ˪äécä(¹ì@'8Ÿxìó¨½Eë-¨m•˜,,¡ÙÍÕþf(³Zçý%Y§ä‘üw©üIoéÖÙ&iôk}ž_ušwo¯{ÄÏëfJ¸â÷˱Êò sy–Ès{’É Ì6òˆa´G ƒ¼bxâ±ÓõÝÛë-Hû·EtÑŠÔD(O1sÁÇaÄÖV¸Ïº½]È\‰?×ëO²^¤³ð“Ðþd ÷·3o黊œ»æHóÖ9Ó.ØÅdMß %Åî~‹ëÝy>N‘»ž¹l÷þõbëY‚1˜=Äé‡ ì ãuŠjÉÅ’%ˆÜ3Þ‰C¿éZhjûŒWÐe)‚M}ÁTèRæRè «¬!“X»\°½Ë.«Qû*Ñå¨uÂ\޶=ºªG|“µö Y<·½'¡Ô­FÖü¡Þžofì% -¢eÜ)ܬEœ™Å"jXæ6¬‚eóƒã;Øïây!W –ÈaPp+QM<óú ïýNŸHš,Å®¸‡Èkš§B_DÆÔþäXR 'Ü€”’b%J>c· ‹¨ÙJäužJ˜ÇªžÏèæÀÜIqüXây \QÅ3Ç«œgF-qÌVǦÂÛºšwá'^Jx©á“²ßÈ_À^r'aš_\žK¸L¤Qñ‘û—Óæ¥+‰Cëȹ.cž‰ ŠebR’’˘ÈVí¾cFލh×Àµ7Mf%9·²Ý¦kÈ"•ì26ë*A¾:?sy Á޳„;©‘ˆƒ¥Òìù'ÿ$â¿$;»!äyïЮUU$y(‰DÌwä5[…e˜q–¤¬±zdOívßQ¼e>]+×òt;ˆõ¹Åä}p½ÐBXs6Ê#¶;[c10 ßdòžú©’~£ªÈf¯Wv=i+_p2ò¥2bê7rå¦î &ùƾjèƒ3}v¹à]#ªm•(ù–õ¬9É·ùB%rm½‹>‘˜§Ï’¥«žº*ÑÞtÕY’LW%\.¸Í[ÒM…ƒQ+ˆwæV5þ`”©7»•vû”p%¡ÝF8æd3¡Ò®¾Ö( I»xC^ýJ»mñ¡ÝjÄ[x£o7âµIK#ÄkĪQSâÃ2âÍF¼‘¤šŒv½Ñî$ÞhÄŒxU9Ïé„x+Hµ©2Q€o2âuF¼Ô›LÅçU#<ž2è54h®EŸÿéšÂD…¬1²ƒê}~MšLXv¦mÆõœ¬ÏÀH"i¤/˸2£ÞyQ€2¶=œ™+»êsRŠË¦[IfJËiWW®Ìl¦G3Ѻ¤Rü)J࿞.¼¹’3®<Úm¹^™Þˆ~™R¢‘†÷Ì=/%</Q B‚óz|†”mFÓ™›ÂÍÌr×'ÏoРlÂDÜ,ùDf®MäÛ:3¨šM²ÖkŸÿ«g:@ÅFÄßsK¼Éá|Éá|Éá|Ëa,åîšx“Ãý”ÃÞr8ù[£d÷r8ù[Ï“ÃFMå‚—ž>ÊaKÊM9l™Åæ³ù©–¶\»”Ã3·Éa£ð%‡§ber8xS !ˆ‚å;Û-ƒó› Η î— no28ß28¾Éàü&ƒ“‘¯Éàæ|M{÷&ƒÃ%ƒ‹Ñ¯]÷5ú5ÌÄK¼ú-ùŽ(„#è×™n<¯I %Ì™> R¸sq½X?I„[ÛhE"§t'KI'S&N÷ý„ƒµ Ö I›oPôjSõ²iÞ[D3{ŠfÌ.–×Ý„¾§6Õ Ú£òpª„]9jâ)Nü/¦iö­¡nO|çRÎO8^<‚‚>.Á~òˆòÆ#ÊÅ#âÅ#Úhho<¢ž<½ôþôþôþMÐûKЛò^.x úÉ$âÉ$LÐÏ÷ú›˜‚>™ºîÉ&L]÷›˜‚¾ÞrÞ˜ÄÁ#LÊ¿‰ùÉ'ÚŸ¨ŸÈŸH7ŸXb~2Š7>1Å|2]}ŠyoºzxãñOM˜ªnb™ªnb¾NÑ‹|%ôgi&eÓ¿u>¦£™Ó,í² ûézÚà-ŸtÖ—É4Æ@U¤%^f–d­ÑŒÏ—Úax¿4ÆÇ“ów?Ÿ™‰¦š9{Z[Ñ[ä¢ocÝî‹_¿f—¥ó×e—¥3½‹u\–Î|®étV,ÖñféL_…±ŽËÒ™¾ŠÅ:Þ,髸šyüF¼ãÍڙΊÅ;Þ¬é¬øgxÇeíÔÛÚ¡¢¡{EÓ°ï`ÆÊ<…¾±gÆÎJÈ9sÄΡiÏ’ÌC€-ꢚpNÊÜsÔ$íš3Ás®ºÂ¹†­#7­d]#;PF!9 ûf-Œ_V9O&T­DçxÎ$y}¨D¨8Ì1|°¬$d ¼}b¨Õ'ŽkT†#h)Õ°HÐR"ßÈÜ•ÌT±’îª1?Õ˜¿ “ÍqZ¡Æ8#;&¢–¯ÞÏ@xúºë¾TÀYDf´T³èC3*àµñ¦9d¨¶ÈeèAÔ}Â][8S|hZ4³Ú¸Wã)šÀ ûhFÑÑ|‘ìs²ó¼=˜¡ùòtÙÁªëÄÊÛ‹8j§%{…F7Ìûë¹zY2ãÄ~º^~º^È)þ ®—l:‹¦p¬¦ÚKªlfÙ~˜%°ç Ö4Ív¢jþÙÈuïÚñ(¦<>›È5ðÆüíx(p—W•ò©Ÿ™Ò£Ù>Åž©‹ÚëvržyÁgØ-ÏÂÅòk×P«`ÚD“O¯S{w¹ß¯óôvˆJ‚.A—‹ ËAû‹ ûMÐrcô h4rýím,Û:„“ §‚Ž‹ ×›“¼º]O‚žoó.‚omu#h#y#èôFÐÍ ‘IÑIû¦5ûEÒå¤ËIÒÁ]$ÝßHº¼‘tºIº¼‘t~;4 ÷¡©÷o$O’®×¡i¿MSå¡K H­lY„+HzFÌüYHÚ}¦1Ï$júfqÀ¡Ï–«˜Î¶Ï"vž¥ð+“q-¢˜3U@CWý–š`¢F}¥o*¦ŠàjŽÿ{ù~ž€þ<}”?È hr$Æl9Å-¥wã»S8ß!Щ±dĘñhâ.`xMµX!ü²œ–è̳Z(X@{æõá“|—Ïík;÷'mý¤­?,mÅy8ï•¶è /h!ôCښdž¸I­‘´e¥ðÁ›jÏUF{€’âAƒÂs|o ,ùmŠšŸ0“>êÐ4i³Ç,ÄÎÉtž3¥§ÍºUEÍê¹ +â´‡”i®*ƒ3`ÛdÕ4¬b¾0Yb_Mû?ÁSõÓkþ§ôšÓÝ”ñôYåÂÉáù34ïñSWƒ=3â!!Ím40’¨¾ÐžHœ!1 ÍCÞ4,O›JÐS›ÏÀƒBçÝfVùi|@YÍî3chßÌÁ¼*¨<|œÞÇe >K°.Ø(Ë.Ò|œÁ³ov »ì@{hϾÙVò瞥ó»Ñ³´L¾<{™¿eìlܱ³ýñOÅÎúLºŠÐ<ƒ™¡ñd›tågêqÍ¡^ {¯Æûù „ê©2U•øÉ¡LЈêÇÁÔJfLMe=Ô ¹ÌÛ¸‘4ívnן£³C¥¨0ÔÚÄËm²°Žj­îiO)‰ sBµ}î`/ÎÞF—û0¾š×aIÅíl™d[O¡XO™¸Þ·™•w—ˆý¾ÌÝu™7qúo¦@œþ›½Æ&'=ģňËsÁK NÿM:ý7þtßL8½7S NïM¸¼7áòÞL8èˆáRi½ùoòé¿™±Þ±òÐN-Mö7qXnq˜ÞÄay‡ùM†[Ò-·‹ÃhTë/ïM¹¼7&yo²ë”\>«^Öë»Hs¾P¥(’÷«¨Ê©Ž–„KbA¼×OôÆ㜄 òÍÔ¼°(:oc{T¿$¡_°9FOIh÷ããO¯è) Û›(ì—(¼dá¼ ¿9.Y8¤åãã’…›†~š‰?öãò‰NCñû‡o²pŠ * [‚Sô„å„åƒáƒïÎÐ[þ#ÇoBÐßBvÿq¼q Ár Áv Áôë¡üf>€¦7œ@xû.êéFÔ¤ Å®Åô41Ï·[Ò/ÕuÛàHÌÑÕ{#ˆ9;FÍ‚8@£ ¤VTö™Œ0h öuêl9=4ιón•ì[oäºí 1x;ysÿäUa—™é”™ý’™ý’™ýMf¶]f¶Kd–7‘Ù.‘™/‘ù–aïO¯ìšÄüž¶kó»Êîï¨ë¾y¦ÄüGuÝ`ôJŠæ)¤¦wW²´3!½pa¾¬µ„ÈKweÞU9¾Ý½ ¾Pm—•åÅÕÍsÇC2æ·µk>c‡Z@B’Éíˆ?`,]Ôg6mu騭FWýñ»MLZì\<Èn§B“’úí¥ýía/з2úùí©º¥s‰HÎÏ]k `ÒGs²î uo}7ædxèý:%A£ðÌSÑRQPO‰_Â)ñû¹Ž»ÜuÞ2nvÒÍîûev§%Êû N–sÑ…ÇçKØ;dGÞz‘wF8l6ç!Åy7Xn®K(%àlâÜ3‰œ”D­áÀ÷gH6ßÓÝÔhR(Ñ1û O‘I M±©û·!K€~›ˆSL3êÔm î¨Îkc:;‰_5.³+¿µ@˜”$Üc1Xéú >ϦUvS—ž.)åÉÊîÉ“MãB3UøÉÓ O— æÑB/!kÄØNÆ Ÿ*ã`‹ˆ×Ì‚…¾¶0å oi öÐÂ'ƒGŒh`ý‰%xK6M2›B´_ Ùç¢Ç€OÙ áŠs»f1h8àb¦¢‘ª…ï •ƒÍ›’?{`ð@&dåÄ¿+@erRW:áï…€ ¯Ú#Õäå±°ÁøÎÉúÅÊd` ó‚|EúIôÙ4K#⎩nvï5Q²#µiUñ²Z0Ö<ïIˆ–y–ºSy#•nÁfŸ—õ3Øì6“3o£I{Á´gºDc˜Qäš•{…Ó5åuÊßÓ=ü®{<²écéŸ"Ágúøùä9=ö.Ìô Z—›c«ï/I*W§G±`Çy;à•;žŸgË.ˆÇPÅÅh©iPiï¼Æt®þfê´KQHÍN%p€Šoe|³ùj"Ì o ŸÇaMMÂFV¬¾É•Gp7Gx3¢<‘ ~¯Q•¸¯Ï°OsSŠ[ÜCÝY€çs°ã˼Q"RƒB–ô½gߥx1emyI’Ñ÷æ®üüé®üßqWî‚Z‘ O+š"þ€”¼;¦" ìô1%8È+Ñô™ïÔÞ‰¾2uì¼2øÂ‡MPl¿s±òûý[Îÿ ^<ûœX¸ò¸±2 ¸ 2oû=Ø~Çíë WôâL 5×ÙfµFVƒ·0’jÄ,— …ä ¥¾D¢ÑÔòM˜ÀÛ¯}^Á)?¯ýcW‹N]öS÷™w˜Õœ(»²:åí¡4•Hp«×‘TÍFؙР]L]|4 ǧòmç=6 -b®Ç6²—mãÛ6ñò6ûËå5©ù΄iI»CúÖ¤~:¤ßÒÎÒ­†¶=Kw³ÀÜ@تÅd?/óÛ¥ìlÖIFÄH®DÓ¼j"§uvJ$Ç5ØE3ŽWÕ;ý%"µC·µˆ¸-fWN%_ŸY'äìÁü_´Pì*Ó×§çÔ0*+‹¥ï6.ŸÛ2æôؤ;  ™Á¤ûuÏù én9æ¦;eû)ÚÛ›lÿýRɾ]tž)·YdTÕ6^13»¢•ã½Z¹¨uçµ´R|gçMS Ñß¡sodì<ÉçD=ÿ+ݸ 5‹´Ò3Kxp¨¯ 3é÷'ÎÓ{`·j¬‡5pñübæ~×'IãÍ9)›NOíêÓÎØó®~;ãí«ÔoêL3 ~åÝ'RguæHx¾7*nc›&Û—ÝäB²<­ ­ox:r‚Ò?̈õÆÄéAÁåJì\;Ì6½µNÝÁØxÜ<]e&<èçWïé*ÒT¸Ï|åqæ«h·&¿)ýrÃÔK}(on?ÕËl¦þ`™mâԌש?O,é%qi©'«å¿M|tc$ÌШð+V’:gºÈ#¼ìÛÂ*ç;ÏvHa<ÛQ?ž<[¢Ipj¤Ïfl<[ìGžÏL½±QbDó&:n’F{Fÿ´ ‘Rw®q°òD ™Àõ=¹6ƒCüJ¥LO ¹vë'×¶Ã|ªI_|ùúlÑÜ”­ÏÆét…¥+U|´ÆÝ‹¤ÓY+…±*vÊÕ„ –¨áæÏL0{ŠÁ"ÈpEUžfu¦Ì\æ9_\1TÛÄTuèü 1…è…Ó4¤ÿfæÂêæqNƒ·¯3)–d€™}M-n;µ{•ƒ6²7ÎÂØ·Tt3¦)Ø‹’S,9´—\jXÍ>C’7•ð6Jc„a²[jª $û ^êÍÅ®âHQƒ3¹­««.{:¿aGx M¤Ç—MO:®áyMË0r· ™ÃÁJêY¡ænþnЮ.Íõ=áz¶¨Ðév¸°Ow 1O8äŽþn¯)\p¹[ä«F®'\f(•åèlô¾›…ÈJÖ34aò=º<Ì‘HyÍ.å‰GˆkÏjÛÍ·h^h|û]X@¡›¢‚ K¤Jé‰Öfœ³T.T¢ã¯(9,>XTE‹z^¬ ²¦Æb,ˆ÷ñÔuõÆ'¢á¯Æ5””Fž*7•Œ¯“É`Ø¥¼]ÖÒg-»[“mD; ÛOk^{äÐqj>ƒÊ6¶3ÚÌ<Èh|³F\ñ=?6uxÉZU÷Å @¬S€#½Ó(–Œ}‘WUÀ·“§ˆhÊ\¨Ptsûñ yUg¿7Ü'Zœ@¸@¿®ô7ðônÞ²_¾y{ÑŠGZ ®'ìãÝ·³Fà˜–9s6˜¾»Çàyʶ©‚ï[¿awØÖOÏóš”ÔR‘ \I¸ñ›½j8NiäQãß´ÀëÑŒå´-ˆ:…„®<ü‹2£ +Õw\¤ñob%Q°¶Z€Ê1‚¶¯Ä=‚Þ¿ÞÆÍö!õÎ`§äÕ¡/˜;Ù×9ìÜÈC)e£i=²Î&Í&ÿhSRþ)ë¹È¦U¶™ÁN¹Uº–’‹Ïš¤AAØË /¹„Z6nêfT´Æ;Gf.væE„Ã(‹z+v•t%P˜—KóY£_`9TDðïp=aîþªâ÷»ELg´åËæûæÛ ¿S î=}½}f¨ uhÆÓXS„$ÛP²vo ë°>óc{ZLãê«wÆä´õ±®S“òiÔl?z>’fÊ}‡ ÈS !“¦ ¬¦ƒÜ3i‡-IÿÔ6X2µï§’»¶±JúYƒÚÆ„§¶QfäǸàÝ©½_ïüba‚å‡Õz,Œ¬øSsrzOàA‰ ñ:‚¼ ósá¥å ùй©såR%¡°-žh¤'.wó¥¹¹Ô™f¼d&KiÁÀ Ñö­æb¯]Êj·èèÐÉ×Ê¡`   ¶œâgœ¿Søxצ~XMVqŽl¡Úûqe¿Z`;Sn£/nkäIùf!W²¾b8…{ÿuôn}ÛEz·_+÷.òVR:=æÕ»¤ÅŒa1'ºm;S{èÉ76Œ¨ø7Ë&è·”oØÕœµêöãp.À>Ä{ÄmÝè%°Â JÅÎÌȈœþØ’nsG&Û_`?Õ^tö ¹Æ+HDSkǧFÞB¡Û5.·ç0^BaÂsO¶fwP€C˜OxbÄÊù0Yèl†áç5“/ڜֹgìåÊnÌÁX\f;™2‰Vt…Úb}¸YîµP±· T‡l¼ŒBqTúŵ•XÂGÝ“½CÌ+=Ö4óf\:ª'‹:«–iʈYÃaÎøŒA¶k=óQÆn1OÞÞ“#ÒëYÆ~žQc_ÓÏŒÛ$õ™Û&ÚN6Ý©–ÀËý%lâŒäæ­]z“qƒÍ³Xç¡ùv’yØ DYa'3œtb‘v­0˜^òWiéû\eÆÐÓ?ãÊɲVƒaÄ- µFNâ(+ídniRæ_µ‹ó¬¶Dð~E‰ZÀ~J|Âóüa ÏÙdl0é±¾üÌàwΘÍÊÜTHo8n{éPå‚ÅPßðúÆyÎ=OL®ÜtvƲaµ'Ýxýޱ}Ÿ…4Ú.ÉççÛ資rÝŤ+jbWl§&+1èôkM¦‰ºïÝó Ûõ…ƒ´ÅçZtΪ]Ï/d¤ØüÄìïoÌ×9WÎç*æt¯É?¿yQg»©ñ¾<¾÷‰Ín̪Ѿp~ó!Ñòlð Л»üJ C°¬;è*˜–4Ÿ¯rÇÝ€Sü£ã“vø×sçÝùh®m}s£) 6q5¯;R¼®ë;Ø–|íóÍ­PL–tØÙà2Ïí‰_¥"Ùë 4gSZ8íÏŸf ¶ ®oöËÇAV´èæ …;f2²©#¶sÓø×óp6Ü3^¿šñÿôñîáÊÙéÍùñ÷çü»äΣ·ýý_ÿ¯´úÇûèM*ŽºÑ™õ&†ƒh ·Þd"–ëI^åžÀò ›Jo"´DøØh!·ÙÃø2"­!¾é˜z …‚ …_ù]DÌ0wØåÜÙ“A£u©W˜d`%Ãf&"°‡*Òÿ7@«·„ûoQŸÚ~ÈLõÎÓ¾‘Þõ߿ҩøWú uŽü…>n¸¿Ò©[ú¯ôAz\ôWú ÿÛr¸Jû£>H÷¢¾¤LÀÆ®»N„õÅ)Ñ j)i ¦•XRÑ&ûHNJþ÷OJù‘ÛVï0J¡!Êø9PË} ~(OEj‹l_¤É¹.p˜Æº&ÓXÎI ýœ´ØîIó?|Òô’×™´*‡f¬ƒŽW;'mØþ²³š'~]?(që£l_T€pÁ=²sÎÜ5gñš³pÍYh眕{ÎÂ5gíš³ø6g$û£æ,ÛF+˜3gãEE‡KÊÓk™Äç$ þÍ6bë:…ým›ÍÇ)ó×6[Ûî;Sö¯o3Ĩý¨)Ó86«!=Ø”uX¤MðMm†`Ô«û,Ú”hâ»m‚ê­…·IY܉ù§šróhMí ûÓöŸ2ÓbýhðÆ5·ßnûæ‹É> >߯üÜâàî¹zi ¸W»Zæ.‰VÌ·“¤êlv›Í 5r5y×n6¼¥ëÑÙÄÁG55Tçkõþ¸”Ô¢+öê2ÕÓ=%%Ù³DÖOàbpT¸8ƒÙ Eë›*X…š¾Ød+Àâk„!ÜÐÚ[ï &¨7„5vá«Îj´¯6ù¿ây0ÛÙëAD|¯âwô4¶¦*-VòùV‡K%=$ÌUî­(£/„˂ϻ†4µîF‘†âÉ*fbŸoU0¢zK » — ¨q: Lúį w–HßY^´ÉÐ]¼C""éð—³ÿONño<(WHÕQ¬Ñªüº+o ¦u;à±}XtÚl$–|¢D‚Ó¬ÀaësC`W-ïž^÷h~1ø ¹MfG„Ëè73Xò‰I†emdÜF|Þ7»¦w÷v,Ÿõ¿—Ärâ44» n†cÒhh+ùD‰œð[ÇŽ»bu÷vàØÞplç<ævÍcµuN*û¬ä%’sÌÚì9®âxâ±+2woŽõ^k Ø@ <àÌiÔÓq+QƒlÁÙFàXf—ŠEâ˜åÐîÎ ­û½ÄïÔ’UR°x¹\œë,ùD‰÷(b‘[Keu)pØ>rÉÞ»¯Cë}•è%þÎþ„×¹-Q 3÷Ú0¥ÀìSñ(ÛW.Ù{÷öú¸G:K|Õ#|ö!²IJ"ºHÃöð¸ÑØO"´³4ûzÍG¡Óˆ€`é _MjªpK€#ç%¾FùаÞí} ìýãÂb?û¹;{}Ü~Br¤ ®ZdÂe.Cl\ZSÏ_5¼‰bÁé8š‰|ö)pÊ9‰ë¼õÆYÜFdÿê%bày/Oá S’‘Ê\Ù"ˆ…%Âõ¬¥{-qé1ûôU£¶n<ö`˜»·×Ç=¢òYÍ;1x±Ø{ÍÊž —’Œ— È'eøNf‰¿,y5ÚøæÁpا†¸ŠÛvÍãÞØôW¨P#<ïü(ì+`1ö^úö1K|K¸É3ÛH‰cø2h©‰s3ž½½>îµå~Z›>¸$pŒ€1ɼ‹6K|˸àéÿ«ãt6ã–ö¸ñ8)i³­·×*áˆì¿+ˆï%lÐ7ÀJ@b:$ÀzÝl–H¯0ÿ¬”$~gçWØg.4N¾ËÄ:{­ÈîY ŠdîT£ÌX‰æ-€C7 ¥D:íÙº(ÄYÕéÒ®üê SºHoyööZ%‘ý7ÃÝuVP-®8hq)˜tf‰h6ÁzèÊ[Ù£ÀŽoXœúèìõqGg†‡j¥²UÀJ˜ªW€[7C@ŸquQYâÙ‡ç¨åqaqê6gg¯{@v¯*CòX";áHíŸÐ¼¡‰@J³Î¶ œÄØ7û™ÛÙ[4爻Š ê ·7…u¢Ã,9‡ ?X¡ß”Ú]OÞtkjÒ¿~åb›%Ô­'|+×,¸µúßzô7Õþjòzo2½Lª(ä`¡Ó©hŸi–|ž%"%v8åžRƒ„°cØ Á–­ÀÜLŠxˆËe#p¦ §SQ‡&½úlpk%¹<8¤Ç…ÅÁJ®Î^÷€æeªÔÄ==6ÔÌs¢G'nõD±SßKòú¼ð8òÕÕ}ô¯^&êâ(AËáÕ=TÀ«»m?‡ÌGÉbuŠ}¡H±vô†·˜§5A]ÜÓ‡£ü³z:Lô®Âz[bëUK>Ï’fªúÔn4åàêŒÉ0™5Ѩ*çÊOœàÒ÷t¢¨%ŸgIn>¦±òÂØ¦d]½Ñ&ÙF¤A¡S{Ï»ù ·í]eBM ßzÕ’G½“|ÀÉ?n<MõêíõqH‹Â'hãªhâ¡x…a¥4PP-HãŠ^Ã,ùÜKòò©‡Õç‚Óþ¾á¨É^°A0KZ¢ ˆ'Ï–'D½¦“Q}ÃQḬ̈$[@rä…kÉ>l³†Õ./,¾žÅ¦dòú8M‹sʹÊö‹—8®á`Ý(ùy}æWRZcž Ç9âÔ§KT¼ÀPíœêµ7ÕØß(F¢ˆ6;ìÛãFãkM½QÞF4uÝÔñJõœF¢…a:b¼QLñF1Åú¸±8þ«3Sø÷Þ¿TÞÿQ=–m®a~Âÿ®êúó=.p•'kÃ,ñ· „ÔÕ|Ÿpð‰îˆY‚{*…7IþAØóÊþo¿¾6׋«Æv®wC‹î É‹¥/-zRÛbðÈ¢›×,¾Ú­‹…ó–€rÆA+°4™‘>áÔ’o‘ú¢ÉËþù=Ö,íkT4FíXCºêz EÉuäÒ¢­Žãi®9H×±Š=³ÙÔý\³šï5;9í‹Î.{ð÷X3yo÷XÅéÕE)tÀJ¨@taŠ65Ôz£µ*/ë}ÃüÂT×®®!æ;¡‡ÓöüçVäßGE§ùûÛ¯H}DÔN/R™B§S· ™é% O}± !”Ý@RY¢êJo„Ó³]$ÃÛ‚ü~lÍÿÎl ñF;|°5žÁ Œ Ï½ê1 Ó } žåx¦—•¨®{®G0ÒűÒg9µ½~sÉ;8„ÑD—¹£)Û2I5¯€ëŠÎ¤DŽÊ¢×Ç->’©IÁÜflá¤.˜ñ=r1‹\*ÖT‚ꬅÊnú„¯!9z`(Cá*zJÿ‚„º ˆŽ‡Z0…“7ø å K `¦Ò›XHün¿ÕÀ\þ²Gž¯%™‘ç=2ªU^"¡3V¸l¼R9‹ÉæÙG””ˆ•Èœg¬LF”¹d.m˜hp÷™¥Ùw¯áz…S'š%žá ˆ_’‰†‡¶Ò8¢±Ú R|%õ¹ï^§/­ž»Ù¿íæKü^»¹žÛY¾{¯‘þež_¿ÉQÇ :Gc¤CÉ4k\MÎ@WSPaIl‘ÁAõŒHfµbÒS9ÉŸ:¾Áø2ÉzRÜ59¤rt »»Wc1!aÊôšFô¼nyînœ8*SÒIÖdbk³:©ñ#·sêË«œl*Ùãÿ×,Wîæ"⥳ž£IñˆÙð<ú(¹LJûQâ°oä ö‡^Ô/Å_åàØª“à¥S)œÓMÒUÌ`H¶‘U®v7ûÃŒùÏ’¾¹ÍX]“Ö”ñ ´1^GèMÖ\Æ:ezeA’¬ÉÊ klŒ¹ýeÊzÁÖLs¦ÂÓë2v^²ISY#æ>)s±ñ·&³žƒ<¦=§œ!Ý~ p’ÎÇ}å{¿ìw$ÖoY„§Nš¦+šáÃQwË>“¥Ë<—™P`šÉøö™Ú ½Nþæv¢ÜŒÅèlÒ²bJô€·Se ¤Ù,£ þ¡}Òzü±“¦ωÉ6iétæd¾a§LÛ3ÄY–=†¤F€.¥Í¹xCSK4 ÊGõÏõjÔ©Ó¯kÀU(Œ_“a‹w}OsÊ)ŽØ–˜òòLs†¹O›!än‹z†N¶)·e†ÙÒ“Òæša Œø±Vž<ðð¸§ñ—ýÖÉú-Ì‹’ñÉk@!cÂ…·+˜qΰ7 ˆà¸³ªûVXpz¯ÇkéÁ%#e_ÐŒ r‰" ØFîØèTLÉ;L;!m=DëiêÅìž§à"©TËêåylãüc÷p9ŒUÄò/ÈíùŸÒº0ÍË·+•„ÃB‚B ¬Îv¿z0”¬â_ da[½²°ï4©aò~T$£ÒåªIÌÐʼÜ£¾‡fê”2z²\×Ìp>vn΄ü«$6ЯÁQ¤„³Ü´ç*Å‚!Yôyº FM*½UÌ´ný©3¼0Š*ñЬL OP÷«g¤[×GœŠaÔØð’¶]å½Á!¸~ÿö1K˜ktÁÞ!˜pÖ æ ,Ì’ÞE‡- zÛZXIqðìNXÈ®úËnÐ |ÿõÍ‚ŠU…R¸Œ×w€7e'$ŠÒº0%]÷‘ôS¬#–`”¾Áo†îe _fò×f´ÚÊ>ÜÃî^Ýã·uå:ò^Õ|>@e…,5Kpë{=¥ñëÇ*i`Å*.÷±Ý»¢Ë¹8m7( °›wSГGßÀì<¢1u?&îÇÂûØÐóè?)ö`q´Øå¼øOú£w¡ ŸÌ&§ð”RÅ“³d„“yÍrLm#±ÄÑìÕ =é=ÐÐ…Ëzz}YaÕ/L½ña€>âÒª™`)ùT…á ×O”{oüMæBe§§"jº:ì…kÂl6ÓK%—¤d5á:ijקÏV‹ÉkX*[4EÂAÍ äñú6šÂÊtÅES;hî챨 ÊnäK1â>ÊÁ×CÙßÁñLápo£vm£pn#EûØGêAö4ð{Äj` œn’ŽkÛºúØØ.ÀVöp&9ÆWùó½ÎIkÉVΦ .Æþ ÞèÆIóf)Êã‘‚°NÖ]¾îÇòätp~°÷PpLÏûìÄkvÊ5;ÕfGÙ¶÷ð§wø'túåÜ¿©*¡Éd1;Œ§ÆCÄ:=jЉ²Èù±Á¦Çv¶eUUÝ;hâ2{ páâ„;oeDP­|¡SÝ ã!Κ©G‹j;_é+êo¬(\¬(Ÿ¬¨Ø$©áω8}âð ˜ÄØŠ‹]k{:OÍ‹ñ±•&¡7ºÉÆ0” yŽ/pPBÆ‚aÈ–ÝXÒ”…8“ȴȶu qEÜú|’š>ßûƒIÍᎀçAU¸º+s‘/‡DÐ |ã IÝZ’õHU¾AŸ¾èºäKêp©AÊ?t©v4ýFótô@­³òò¿òþÙ ²À¦}X”êõ‰OnË w‰¨Ü¤SÕuú6,/S½2#e»/70´ˆúpìøuä(9¦x®Ö~­A{[ƒv­A8×`ê-w<óÄó´…»ÇÍ9ÈøÎ K{¬«%=0ÖG{Žopx5êd_S\ñLÏÿ¹+EÜÆ?ã¦5üWBqa C(n°Å¶Î/™·¸|Àc !àCÐEš%kƒ{„T ÏüS"ÿ¦ ÿ9?ão0 U“ |[@Kú*ÑK_9lprÓJÆá®””¾× Ö¾Áê›ÛZ„iy[zƒxÀ úóÖ"Á¯Vððü.8¬ŽžÇ ³FYß­p}kÑO¤äHÉï0õÂÕ"$œ ÍÛžP¸BãÝZtèÄV#z³ã#=a> â¶í´FÓð¶ÕÑB¸Ýþ¡É/bQÙ¶öùœ\aDG‹¶¸!Zdž=XÖ&S8-~Êy1­¡ Æ÷+y‚jïSžÛ±LÀ…³EyîS%ˆw¸nô‡5ìÓí™eƒ7ÞÇU5ªU£Ãåa°f–=Zèí¼­BÚÉÍkÀÑÕ íäÇãœËÁÃQó  B^,BáÓnkÁ¬¬¡‡!m‡= ¢ÙBNŒ¶‰p>HE­þlÑöÏ’Ç´ïpØ7©4ðñ`3aèôûFžéM¶¼j5‚ÛiI7݉Ó0¼Ž.å…·ý+B¹\¢Ž.ûÎÈ|àËä[ƒAÀs[K…´D‚€e.-jW=ØÏý¹AÉÍ i±n1-53˦¹{­A™ò5êd&€ûÜÿl‘ÝT´Fög‹ç”Y‹4(P#Of¡±0vѰ¶ “oÖèss),þôt´(îÌY#NJœæ†¶yÒ>j”¹râ ¸Ö'¬-æäk½z¿°Æ†¥T7œôL,NF x±@k‘Ÿq¯P&ëi† ž‘RNSn™’f‰ú²3À´C2ýwIñ&ûj§3u¦¬êZdÂ8×g Œ‡°Ã~º_qꬹÔÊ^#P!2Øs8ÇÈ*¶Z$ŠB«‘É› .ÔþW‹JŸ§Õ0ǺÁýy!9¤÷©)ž*ÁÆW‹Hym5ÌD5˜ñjÀ‹s³¯GNØlÅÙ¢šµÈâÉÝÁ¸w@Ý«ìCLG®ÁõúìÊ$CV¡¹s5åzí¹ ›)|Vƒ™Ç&œŸçr7snX…F­…pw÷¶íþÜ}ǰ§ýGj^;ʽžŸÔû\‡©w•m©Å…üGêÝ«E^ûŠW/;lÞ¸Ù»¹RÔ»&éRïJål7,Uíªy‡C®ýÙ÷.ƒ_{…jWÊG‹À8ÔY£Ð"6Ø\g³EtRÑ[Çg=ëçÅ‘´‚ùG nÏsb“£ uKéê;œv”©tY…k’e„Εü„U…Bjp« 5&–u5WÂ÷ q­m„óÑ º‡š©æá>¦^ lVí&®-¨í`Y ݯí¨Î¤ëåûŠéÕœ‹K¯f>àºÄÅ|¦*á(t‘ï[öYà%"Iïǃ£1òï8UMóPu‡ñèËq¨ŠÐ ëáéæ&<ް{ìÃ#LŽ™õX% #ŠÏ`ê€éšP½rÖ s™0Ifk‘±³FÙûDŠò~¶¨ü&«Ñ®1:tüÕ"“#ZÌŒ1f:û­EÀŽ™5¨LØ0V‹Ì(3«A:a’îÖ¢ís\pû˜,o5(~ê¡B8‡(oËQ®é/”5á2£—¬Eán¨ÑÏ1ªc@êl!›p_0s`Lw*÷ù¹†ÜÃÞg®¶Lf ˜‡ÛjHðôÞ¢…}}UF^ëÕÒ YL9¾µ¨b³Fß÷ŽFÏ1zØñÔÃÑt´H [-ÊU£]=ôk ¥q£8o7§&ÜvФ Ì{ `ŸN8î3AI÷ ÜuÂm'P•{î QñŒº½Å”µœ-2ãf­FÝ÷„JÊv,‡8$ú¶`ânØIØÇ¾&be¶ýÃïÕ¢†Š¾XÎy1<]Î1¿¢DÆ u8ô³…5Z…¶ö¥‡´¢$³:ê×p `a9N°0·…a5*%Átjm-:ƒY£yÞB08Ü-Îê™lp¹Q’#ýý#ä îÇÞ¡ Š{‹Îƒ ÛuŽÕ‚öÖ¬Ñ`>Ý^]ctúþs¤"bpšÄÖ¢ìD¢1:õ ïÛ—r«m›ÏãÐ Nû´Pn-ê±±4<ó´ !0ßàƒ™PnÕ½Ë@ô„;åØli»X ‰.ÞÁ´ÏM¼¾ëÁ DÐ äF¹ Gÿ4îqA™ø¤"oL\%£Óƒ…ÃUWß\uõrÕÕËUW)«.ëãäÔåŒ!W@'IS›CðVdbN<ÑÚ`(¡•I……)Ç£F¡z`pÕÓ­û³BƒçnÂLw¶Zdf¶Yj&ÈS˜­…–[p~UæíCÀfÌ¥3Ø„ÑjÁû³Ú&|NSîûÄi—ÞPü†hÊ~ÔØ¿ ð y«nú§Õ¨8YšpÛ×é‚)o®¦»ì©¶Í5î£*×|ÌÚ7S¶+9àܱ’ÅçD5ãXVcŸƒ§ÞV›oY…î(Ù ¦¾ZÈõ™ý+Åɶc(fÎoèmß-ÐüÛß5‹-G†ZN¸ïHÃQdÙ&R䎔ð¿tŽÊñYn6¸_DÁ(…1š‰“ñnj¼òXeg’;©Œ—w½ÂQw(ù .wzœ æãÐ/#½"ýi.ˆ‰âq9DÝõÈÕb@†h øLÝaJ¦7¢Å½“bnp÷g ¾Fh5„ñ\p=d˜Ï Ì07á´#IgDÝ‘È<Øžp¥=¶Z4’ˆÕè·„ œV á-û%Ì•Ïêiÿ-Ï{P€mŸ­ê|GbÖ°Ýmp§]4[Tw.·É<_[óUYL^k°ÉœÕ¢Ò~·;0˜Ž?1ÕpŸ9µÝ¿¡¥}µE&«³8dŸ`»¡á«ÐÝQ¿›ƒhÖï È÷ºAT³›ÓšÁeJ°²™úÜpÖûJÛˆjÅ_­®ù¾u)®ù¶Ãy­5¹Å#´F0ÛßàÄûO³…8ì 6}6hqu™”- €ËÉš4Ó0ªÆ“ o6!î¸ÞBæê¿áâ=Ç…/}4EJxçÝ%fÀÓåØ,Ù@2 ß¶ßéì6f«ºéüÝll‚éÚæÖâÏ™›š`ájÏê<8´ß)‚­ÕyfÇß%EÞö%Å_½“’ü X ¼P/fóg3îVGMŪáÏáøP<º³×fˆ¹ý^HY+mÝY™Yù{sGëÆgžfõf6çU÷5ù†ø¬½7¥tÔìnÛ ªÊÔmNz$OœÕ}ü=o;U Óvçs?ø]N ×+÷i{uïŽõ»²í %`u!SÏîpñ†·?• 5…]]£‹Ž²ÛEÙáqRö‚)lUtºŠ·òìÉ#Eó?{Ô»°?ºj%£OµÔÖƒÖZ‚‡ÅµO…[\H|õ 5:«ûƒÖ:`Ù´Öä J·L'Á¦%o¶W&ÀzÐz”¨}m}*œÓãÆã«­­·íAkޏ=hÍÌ7Þ´Ö,6tõãðL/‹Ñ­Ø^ˆÛƒÖZÒi!fÅ1©ïÂã«­­·íAkޏ=hÍÔ~>N-ÑÌÐÐU ¯Êñ¤ ÈÞ/jݯ÷¬G &³Ë1¬çso_½gÞÊþžµŽX÷'­¥$X,¿ŠåŒpí©g—gl –Œ^5|z=i­%m|À¸xrúÀã«'­­·íIkޏ=i-%÷ Ô[âxx‚9NL°À’Ñe¶ÇC3×µè5\Ï÷¬Žë# ‰¯Þ³¶Þ¶÷¬9âöžµzß-~€5æ[r pœÊuLèu¾îæ9Lægu~D}ÜX|õœµþçÃl8éKÛ[Ñ,ð|;FÔ³ùxµ‹ÆsP¢ºõþQV­/Ô)ØÇ†ÆWÏY£·ã9k±ìÏYK‰½o×YÃ>vÔl*#$´D5›6ï…%ì£îö ¯´FÛýAk[”ëAk)(Ôµ<d™¯Ý*¤9†! Ï2Ÿfö•%öBž\ããÀ¢^ÏÛ½/Z{äÉß^´>nUí±¿ö´S_qŒÄ ×íEk”Ø ÖœÅâ'S;^´FÛ²¿hÍ#‹íIkê¨ÿ˜Î eßJÎq~T†IêžPS3€kÑŠNÒÄA! ÇôiÂͤp] Ÿîâ™Òf£†½Ž],Æýõc5 |à AlL˜ö)áo’t جFrz!+ˆÂeÏ\‡,kšî­ó§àÅÇØD{ª–3¸òâyÒûy’Ãóžx÷L|q²8–âS2€>fPÑÐÏ\‹Ìª9D3sfÅ•ct~žã«÷:úy(9A¦ Kûsqþ‹s¿ï÷s™þËô·©×©»äs” ¤üÿÏÞŸäZ¶#É¢`ÿŽÂFpÀºF¶r$€YÙq fÿ·Šˆr)×¹þùžyD:â÷Žò\Ü,µE lj¶y6k|xÇ&Xsï¤E&ÀäØì»©tñY àØf:nà¹h}¸¿{¿Ùk"HŽ2Ó!@Da °KÆþ¯.Hj֢ާÄÁºÞØã;=4ǹ[¬aº—HXÅy·è~NTc>£mÉ#¶0ÇÈØã‘6L²»…íèj˜Âì¡sJàxNƒO"ÄC°¸¦Ml¸Æ§Ff˜íC)-¶Pz„§݈] ëŠ-J‹_ýÐÈnwÈj žbýJÿܧ¼¹r}lÐ 7»×óÚC=:¶è4eœØ¿aAÒ÷7äÅuj :(=4BòCƒ‰èý§‚pOQš¡Ì^§Â"–ÁC3æ2´’שa0÷ai2sr„YOyý*a•Æùž™,°ØC—–ŒN±AedÏC3Ê%4¨4žñmÝ  -äÊ~jt òqlѯMƒèŠkTc¼§jêÕò³ÆQ µÞSeogl±=öÐóÞ"]Qb—›ÐTM ùÓ9Cž †ÙÝW¤çkn ÑUŸTñzÆ!X †v<5 Y3~³ ¾÷¡Å¾f¿Ôrm‹Ûœ×LFK\?{‹®ãvC ¾Œ¡Æ„™úÐVåÐÂÜgw¬Ñ`±yèñºŠü:O ¹r>4’hÄ£Å}D”¿9V¼~eÅqÏ|]#†€2ïõ˜4¡"·•q/ƒ~k@Y7þgQáQj’§HU6Ä‚|#ñ€¶b?«« -Ï%Q‹Õ/?[G@•*SŸEÃ*ÑÐ&4•Í2s™çœõ ÇÕÏ(Ô L%¬æ¦¹Ò o>ƒg‹SxÕ?tnÒz ؼ*6o‰ÍÛbóšØ¼yؼ&6Ï~¨`€L¯ÌÀÿ7·õO¹-³;«Ä”SV0³W©`¦†W˜ÌT-¢¡o€qÃ;E*ó\‹´¾<ôO!ëjñY¹iŸ›§Å”Øâ5ÖÝ}W Žå㨟o^ôgÚK¿Z˜óO¬ñyBB‹lI*ø¦¨Å§„ŽÔO/¯‡¦U?´_È©!̽‡îºŸŸSw£j”¤wÈi¢e…òÎ}j¬{”5s·>-jûŠƒ¨ó«Ä-Êå5öW˜|cÒÞ£ª]7œ×X±OxJ¿¾ÑÚ«†Û^D÷¤ñ´øóScH<=’4?§Åà)|jH"vrKgvLW.¨Æ_3ÒtüŽ-V•’ÄkL1N¢wÒE~Zl©½Â”&€t>zTo`¾¤éª±¾"™‹”§Aîמ3Vm„1«V®ßm¬ÚS™™{ñ![œGqjWƒ–eëqº¿& œZ¬Ñ˵šàÔ®‰§v8µ‹q_‹S‹;œZüÓùÓbå¯û\M̹ÓΩ‡SSÝ®--ÙµoÁª…QU›‘žRÜGS ãÕj¤ç×µâP’…Ÿ%YüDÒQ?-¤$S…£$sÚ•d§ÁQ’©†Y)ãW»fªÐÔjÌØg°RžÇJé5ÚuÂ+åÓbÇ3O^-Δñjåj1Úu·=VJ§WœëËJ©3ß“;ÝJqZ¬êljõLiÑù(71RlÒ7ýd&q˜!m« s¸àÑ6²¡Ÿ…(ÂÝ¥aZ0xªN J¯Þiµ°ZRr2œVÈÑwÅVÚ¼yõgH|Ý[ o¥×zñRóÅKÕo¼T})½Ö‹’ŸõÿHv*“rfés7rzug§Ü¦8†Ø)Ù- ñQþ‘±0ž Ã0 #E“ÒÀ Ä<›Þ&3µ®ŸkïêÁ4£W À ©†íXÈUN[ è¸Z˜q ¶0žh èîW sìJ`c¼éiñSwÉ7Äi)‡C‹Ì¼lO y‘šÙWc yÏx á£=´î÷§E™”•½Fe¾º‡.Úš§E¥Òú©±xK9Ýr¥ø©GeAñØ×¡Å‡ŸZ±Oa}Z l¡Åà½v*HUâ´²T„³ÞËÁ°°‡^z°ŸvÄâ Ö¼'{ßÕ‘òü›z‘ÆLkD™f„P`¸‡ÌâJžyHÎöû+¶Àoh`0…¡B%xêC7]L§A]×¼/5[¤uZ4¹y^®i΂ -„ñsj ÂN>´œåž3‘iôJ(òÐóuöq ÎÔj4QzÅ]/^*.®½o«Fz}]7y©ÐÂx©Y#-¾ôia*†0›à¥V¤å¹ö´zÿ©Qj\1j¾îoæh;5j!ÿvhYæžu^皯8ÊÆL€¡…í‚ø AÈZúŸÐ¢_{™ÜTüf¿Ž¯sSaÁMÅÙîSh1Z¼¹¨ùŠßëµ› gÜT»èÏ‹=õÅW 8ŸãB:SSÁl1K[!˜aZ~˜L,ã€#À^d-!ASe¼¹8lòSÆ]$¸ùP æ ™ïÄNM˜:×W• $s%úVLÕ››¸Hä¦Ö7nj]š)y]Ü#ÂþÇrS¶ÐÎMupSj…“ ±_ÜÀô£¢È gœ}¢A°W£r¦ÜPI©äŸf¤‡<¶HÓ#‹~b^ãó“Z¤ Î{Æ€ñîO ËNj<ª¨§EG^‹§†Éð‘6CyleÏQ“,ç­è•Ðbè^ò‹Ê§%w„Yrà©Ñu:-o×Ђѓ§F‘ çÐý+_ ÊÔ¥¯ 5}µØA­ïŸQ‡ø¯±t‘‰n™Î¬O‹Ö¾â¨Û¼ÇØsìð'£Ÿsõ‡›ªqn‡¿§§Åç ^qCº?§]›ñ´˜¯sÆ vj^ –?Ú^aêz½sü¤ªÆ^×'}åiàçk8s":;srZäqm;FަD¯1®k#0T§…›O!&Úé'ƪPaÒWñ×ulo}•5-2GŸÝÓ@ 1Ø+À*ì!ï󺄙»4½¡`HøÚ‹ÑOºÄ1iaá?Ì{wÍÈx\Mg ž*´V‚]*rÛ/‘¾ªòb¨ò‹¡šßªùb¨Ê›¡bûÿ$†J.ä¦Ü—25rSN¯"nªß¦¾UÔA‚?ÈwºÊßœuMäá^/pO0W8=¥ÿ"M÷ª¾b Ãß ´ÙXêŒ-ŒÁß#Ô°´÷±…!¹ö«…!ëõPÃÔ'‘6ȈØÚ¨ôô nŠÇßiùx†òë=5–$0Ñî£ñ´Èõ+6È]L„ÓKoíi`Wm 5ŠœÝõ¶>-Öq$@šâ°ÁMûgXâÕbK ÝJôOÂö”ØÀÌû캲NýôÕçÿ3Ž¬Ô¾ê&ß+L½/¢§ë`N‹ÙâLƒ“Š_4çéû'xøÚ©!W%§Í,tÏ«½¼+ÖX:òShæ×ÂÕgü·âÈœÎrßZä¦ @å©Fú½nù¨!U£¦kod¦ ª3ªÐ²´HNwñò§…1Qa¥³6ZîO ã¢bŸÆEÅy¦kh1ÅåªÂ”qìÐr~{¬,îQ5–ó¸NËd÷´Ø2‘{×Zu}˜¨ØLÔŒ´‚ŸYq¯‘Ûµ8uZ¼ŽöÃE9í\ÔÓb_çîpQN:uÔ)µ²j.Êéòu­Þ£•ò ÎD‰>LÔiáþX§Æk¦ú¸÷ÃC©Âᡜ¾n8ç¡®ãº5;Vh±¯}ܱ-w¬§Å®ÏåoÁ„”Bq¥±Ý>lšÌèm;¥å#Cm:lR†¢©ÉÂq²¼+qÃpRrš«Os—ÿå¸é° |Öÿ< u’Ü<Ÿ*…$W0{ÐÊmKóGr¥KbÊM;h‹!’dé³—” ™hùï@ŠPÏCÓ¹±ù´0ÌâP!(³Ç–·+Å67=´0p¼»…%þ‹5<$…4ôËi„‘hËä±@LðŒ-úW¿Lé异 œÎnÑ=-²+E½†l^z™O‹’¤¸'H¥]ôÇñ´X2¦«FU¨ä¡ÛW¾Ty* ûëš)–½†Á´Ä.-÷Ll!<öТ»µÔkÄbô‡ê–I4þ†á|²è™ß‹7›¸ ¯1ïq´“§Å1ùz 7m‹Þr|Zl7x{¦‘8609iŽXa‹ë'reÏ«E_qj€YɧQrR8:H+˜s¤Û³©‡ J5~¢ ôãÐ=.¦¥[œ~$Ç}.2ñÏÿGû‡ï!MFFy…ÙèŒwhN< ÑT¼Âj÷ v¾çÕRWƕخªô’ÂÄš”wpqD€§…Å?ĹIÞpÚ%ýÓ¢(ZÇk”*k’Ó’šŸ[¼×8a+¹EºÅ£,))îòévè"ùã´hý+vÙ\y0NÔʵɋ2É>Z\LÈH÷LHŠ3;òu¬ $Ý?b¸vÊkŒëàAHzµØÒV³Ò.ÚeýÓb×g]B’‘•‘¹ŽR… L #ure2 3-Ŭ˜Ó¢ÉL[1+kº8bºçÒ+9ë-K}îäb'û2A‰!*Ð}3 "´[–M0"ƒS™M뤸b)X ÂZ¦’©õ!öŸûð(—©ô~Œêþ0bÉyŒc“¼Ó(ÿÓ{$ ªTmçÃúR~ç—òû¥ûÿ?ë¾ÇgϹ€ÔÈLÏìÌ÷ðqß*Èã œ'ýÈÒ¡k[&E¢=Ä‹nÊǛ‡õTùÀ2ó™•ÀÍcC×`üû.±…¾sâ𠛣ˆ(‹º]¤§ÜDŒZše“u1„ž{>ù ‚µ–6Äê9•Ñ¥6æ”1ÖݼjkñÛˆB|¥‘_.ñ±ÉPv v3xƒ–ÿ‚&•°º»ÅŽAÊ7Ôa!$(BÞP‡Q‚Ô™ð˜—ø¡³á Cô….4Ýäaáùвðå¡OX‰K›ÈàºI™ “ Zâ'×üôG47ŒmDýoÄk™¾Ç-„àK¢ž’ ›Ä·©V9;ð‚ 7Ñž÷5œÅmwfÙƒ k°Q{p0ÔaXAÆÈÊRï°äQÿZ ¢§…«N ©˜-%Th!¼¯áx‡¦žëiÐ[&߀øÉNDТɹÕk8,Ø¡¥µ -ä$æ5꼿aœÍÝ¢ éÏkx¼ö¡âZÝœ‰l€Óy’‘xZd¦Ð|jPt?t’]üi‘frjäØ'°âV‰-ä:jˆÛuz͸Àà‡ä;qj$>NOš÷Ÿ¦U‹ Æ–¼î4SÒ…ãZ èÂs$» aO¼F[÷¯h„×-ÚkÔu\sk„ùš[¤ç‹}Á6úÚ?™Š+®°e>èñ›9½W#Í뇦zGÃÁ¾v2æXA`N/^8¡|Þc|ýª4g<ò.íÄo˜™!j0èæi`þ;ñÿ)Î=ÂÓöµÜ©Kø=5îìt[÷´°ÌÕqÔM&§ë{LõÞ´&¨¦øÉ²"ý“xXwr÷=õ´ÈLHÿÔ¨‡-Þói‘Ö=ìÔ¯ûÖ´íþá)ÅM_¶Èq ÀÅ®ð U-NM“r »šFéÐÂÐ~·0hÏXÃ~eèÁ àr\ h†Z¬ñy^S¤û·–2$Ö°0®HÛ“w·0:Ö0ÙM—»¸øPn7V»Z /L0®Á@µc\CŽC^™ZÒ4yÃI1 –ùè5›Ø(ž}jÊbê û!K5íJƒLÞ°ëÚ#K Mò§1³0»~c'3Ët´V¨u¦)u0’~WÂÕ®ÔJpgé,©äL¡º¬­•¤K>,ÚB€:‚Ù5†É/y,Ó¨"q¸”Ϥƒ6uÀ¢ÀdÊÆ›BÌ™Óe ̕ݨж<¬•seïñs‡Ù Ó¾¾ÜÔò-TJ%¦¡ÐR’¡õ„±a` sRZ' “Ìí>ᔲqe©ûx€få )^WP˜¹ê£¿Sú@+Î"ùÎájc3‹cïeš†|s%x6> ‹Û“ôúÆ[nLöœ:ïi,!¯I„lnž™¨ãÞ²W_„½³¶–üVBœDÚâ>ëØÜ³|Ù†´YYgð °TÑ™µ¬DÀnìvÈÀcz§èµø‡½Þ% ¶á#¥à .Âvžxƒ›Aê8‰tS.Ç ß%Ç49Ñ–‘Nä?‘Ÿ lèü@4žNnÿÚ /M2à•tâp°®å FêÜE6ú\(•ÛeÐÃ^ËâLÛË/ °Jí´` 1—6­në` §·2à1IÞÜ‚·˜àbL`¬‚"#`‰SJ%ð 6¶z ¨Ö e`l»@‚¬ŒÂ´IÛb¹m§Mzø=å ¬-Ÿ¨“E±&KÇgî°·X³¡n©˜€Rdž{¤Ài=ðn‡i—jb©ã-ˆ¹Ð@ À^£Ë×÷Ð#~Ò¥š«…B|ÍXØÐ¢MÉAªÑ˜)ñ¡%R‡‚Ûó¡¸Þ»EÍ×T£l ݇’'N‹RãäQª‰¿ÜOÀÓ"·{®²üªœN Ð{Z$f{}jäkT&Õ„™q©æª ƒ…½†ýŒ5/p§--ZºöÉ4qǘL“îo˜#LlQºD5§åþ´È랪,¬øC§¯{)쩊 R½6¥É4íš)3}Ì«†ð’œ6°ÅkPÉuò§FŽ›Ž^l÷7¦Â)O$ÎY´‡p>-až¼‚;¹z¼6•I59vÙö=È6â’T“cº¯7ãÙ¼F­45œé:áòúF‘µëÔ †“ÙŠÓ w‰{^£^W°‰ïv€ã ’¸ÒC—¸±%Õ„=a>¦sRÞt^ß,²e„ÿÛuðT0“oZWCŠë±†å?‹´Éw “B Cî‰-¦áû]-¦í˜Xã3ê«…‰Ñw‹zÓ¤˜”"]:;-Ò=nSÀÏhãd¯Ô÷-Ô0óV½èv]THgǨS!ÕL—jNêžYO åš@ëÙ æ4K-ÁÖ5Á_`Rø¼ñÛ$-KÖÁ0ƒ-{42à°Z>ÁÅËù…Y¶³¦I2Å<¼é/ºä¶Lˆ #èÚo©ƒŽ»(q9¥’Êr’¦X3kסÓÜ’iF˜BüU:t¾æ5CtV3á Zs3 mµxèL·"0ìyÉÖ™\’‹[¡Ïõ8%‚«ÊÊ™ñ„4dd_ØÈíD;Cî(ãØ¡dž¨éØ&¡3¯I!IYj:6Añ§ÕÝ6…'ãÜ…ÃYú7ÑT•~QÖf ‡ªÃä–þ Ò@Q³¤¸ÊÓ–UÉúÏ]é¡4Ÿ°ÕL,Dbl†ë²-í4M´=º2²@Ü7ŽÁ€÷ìZYâ==33T#ô‚BÌU•ÐÁNŠæ½ „ ~ÀÆ4¤+tüÌ8Æ‚ÙG1à{7¸o!À@F”œ/I²ÿ’‹wyáÑ臭Ço?|ý:%_¿÷Í׫ÅÃ׳ÂÃ×ï}óõÞàáëQ#ðõ{ß|½Z¾ž5Êy‘÷¾ùzµ|=j¾~÷Ïs‰¯ßûæëÕÂøúøÀ×o¥kÉ÷ï|=k<|ýVJ˜×ï0¾>Îf–[šÓiX-R;‚kÐ@'lýµÆÖÇÏ;]? œýÕ`Ýcc~Ežã0áj1ëa.Qcì¯[Œñuýlãë{S_‡iÛÊ2tïBcì{X¾ì^‡n‡{U‹–îA}üˆß¬åxDªEÙ2_¨Fé‡í#-w±§Ežqóƒ±?#§ÃIª©Éb8ÑÆÕ—«ãêã<™ËS<­ÆÕ—kf«ï3ÖHñW‚«¯×ÌW?¯)nkâÜ]?¸ú~52äŽH×êYJЏ!Ütüáf‰ÊW ÏØuj”kSšế‘æ‘ýY£Ý šÊaó73Óm:µ± 9íÞ³fœ=ü?ÅKÍ ­Åýa¦‰NL#ÒŠw·°)Ô˜vH"ý¹¡ÆÕâs?äkØÍiSCß-Œ'‰5ò«ƒ§½Z ô5Ærc‡hs»¸[̇©G ç¨ÿO¦žRv0¦ãüÆÔ÷Sÿ¿ÎÇ ½ÛÓT“X_XéÚ®­¹'Ë]ò¦ÿAnÒ“€Ñ/4x¢çË ®¿çcQånÌsƒ‡/,òs§maI m:IeÄRи•0œ—!ÆöS‡ÝÈ µ'8'«FÇxõÔhœ€ÁÄ ^Ù™~ä¼²ØâÅ(búÛ ±bÈ`CƒÄ9wÃ=ÆP!kšNÈG²'לaí«ÑÀ«²Ž¿¾1Ó-É÷0Qòâߣ¹N=«ªß– q2M8ƒÉµ¯UICºï3̉ɭvg9m’!Øñ§øêêþxÓ墺l>ÑùDÛì[ˆŽÍñþ#²0–™¨åß°W΃øp±þ:™ ëØ¥ƒß…Æî–^ðF×~8÷%kK –°>请èÐY˜ÏcšÚJÝ®EÐ9ÖnÍ’/pëFƒ;Ó#¡ÔEéФ^í÷áBíô#2Ya´sd®#äÁë L=33·áÌú"o­¨D†¸@¸X'–Éf$A+öSéã6á(‘™Â¼ Ó?&èÃa8Ñ=ˆƒÚOI†Ôo»œö ±5²ÕߺÞâÿå÷[ê7秪¼0îüTŸ<1Ò‹Œrĉk¸óS½SÑ„.O¨Æq~ªwº›§EwÏ#¯áv‚ú¤Ô©W Ozè5šËN ¿#4bº×ðL›‡vqâ´8â„jqÂi7œEÙ$N$f žüF§‡rĉ؂ÆÔ‡Nó™ürĉøÃ=]4䉫EÞîä5Ò³`•òD»~G^׿Ó5Q&®©Í³^C2i‚šM§Ç3õåˆa¹LœX±‡®TO‹žïQ8œì¡öû´hJ'ç5ªÄb'‹ä‘Óൾ&M\óV¾ð´0Þ8U¶šqPGk|Z¤û0eÝ(N'…`=-L¢h-ÖÈ×Q9AO‹åf!¯‘®£bŽoM¢è;ÖN¦ÓCÏïÓ¡K¼†ç”=ôx®€âEüå&Q”é~âÕ´£qTu_ jE¾¿QÝS5Ê–êÃéñlL¶(î½ä5^s•ç몢Uüž+ÅiYzZ$y´œ’9ÌÏ­’(žÿ›·SØè&PÄ…ÔÙ9üÛ`mP®×µø²úGP\¤‹³î>‹#§ j#Òv«ÅV«†ñã‘¶O5~cš0ÖHîëDz˜âõjñèüUÃÖ6¶0ÿª~}#2ÿ/ÞÿÅú“óh•Ò<‚ø¡’©D¦­:ß$lúAgÇÍ_ôêq]w^”-À{4:ÝOÚfíÙïÛy¸ìð¢ô¢65å„–ŠM02 VÜŸôª¶ @îey2ÙÂe›_Ì¸É ßL×Ã÷(È|Ì9\öHƒÖ€R|„2€çvóA£‡…Ñ0/´ÄèʇlrÙ_Súi9r-éfÛÒNM¼ñ00ÌJ÷™Ñ)Þ(в‡qùŽïD.Aö[¡¥Ë·¬¸ Ä— Ü™¥J Aî4¯L&Ž7ë‰H‹®\ÕñdµúD3™QÞ9]Þd»rM:u{Fù÷$ý¿ÉÛöæÙaéM'«"¹¦Ëw~/†˜*¿PÖ µ¥H¯än*m+~­ÂPYµï-’8ûªñNˆ.G¡}E;ÓØ¼¥¬Ëf_èÎ  7-¶øÿ» tÏÉ’cõ¹(’îI3ÓÖ$›À9‘[›-†~ƒœ¢Â&ËÐF§¸ôfRû„¼¤õ:Æzâllzô‹äy˜ç<ü¼ÐÍ“¿TYñÑ 1=¼>+Þ[WщžÒÿóͧ[A`ÓE:—îÕ“®ÿ;.ÒYôSÝ9tþ¿?£É‘?÷ê‡=×ÿ;é̹W?¼9ÿיּ(WôŸÚ®ççÿš_d{U?Î;üÿaÚD:OîÕK›¡ÿSNuøq¯}Øqý?]Óx˜q¯~xqýßYq'®ê#®ÿ{ Éõ8ÊæÀ…ëŸ)N9xð8+ÙS—èÿcÇ×_OÂù_Ç(•Å}_#éÂ]Öÿ-Gd »Ç9ïçߦÚµëóªfg»ã¬c™Ck繟ç¦8‘áËb·ã·=ÚŠ$˜íPÛXíºÂ¿³ì$×ãçÕ ª…ÿËËQ¤ySÅC&ûù·‡S:9§Å`‡%A èHg–½ú1Àñÿm‡ƒ·žñTkÝÂЫЦœìG«¯žáÿŒâ{ÈñWÈxêÿ¤A'™g˜&0Ôí+þÛãKH¦}x´ìÌtŸáÿÊ„ìd¿‹i3÷³›W³<”»–yåϧŸëÀl¤'i{as#Ýg}þ_ƒ%™ÝÝ_ÕÍ·f=ÿŸæ˜H33]Õí †ÿ›Í'ÆÊ]Õ-*üßÄ€‡4¯þ«ú0­Sø¿1b´9ŽÓh÷ÇsGkÝÓE¦1â`þN˾=·ýhÙ×>×4ø¤$°ÔC%|Ç»Âä ~ÑIy)’eË=)ó½¾ßdqß™˜@“Ù aÑo®WïÀJrþå>hëüñ(úèbñ“`*Àšã°Rwñß©þ–£MBqÆQôÂwJG…–àïc3æïà€ê¯ùËÖc ÁO8ç(Ö) ŽN»#Ái1ÎÁfw$pºe£7Èç%@ãHàôˆŸt΢ÅÏ=FÚ N‹ðø Æq$pºœW×[¤óú¡Fç5#ݾæÕ æÃ.¡‚½PqPeŽE-J=W k(=’Óùy ÔâQN÷ÌQóTOëÀù¼{F¯1®`6j¬‘Γz=þkjM@¬‘Cz>l¡ZÌzcìk5Áw\ ƽ¼`<â z-7Xø‰6ãò~èzÞ µhqªõ¹ôI—óªE¹·©± Wî=zäׇ¾6ä>Jƈ´X#]ǬHºÎ˜‘käÃ|‚6ÍÎÝbµ#°Fº[ØÍtM•±$a¹ÒñqzœÇW ÆkØ}ߟì=®§“6•Ûìé~x µ0üÐ8Šº¯­nÜɺ&ר“‡%,ŒäïõiPê®XÃ=ODçyØcµÈ‚¶95òµqO¹¸1*ñº5N%Þ[ƪ”8*ãUæ³ Æ«Dª]Uͯ%ü×àŸ.ÚDú¸9ŒY©-Ö0èH›·ÎÕÂ0ær¨aúE<- S$Ö¨W cZòë'^‘5ìþ(‘^M§€Yc »“úE—ën6îdöXÃÊF Í²8®Qýo°/Jí5v;‚%"á‚×ÈdB>Ž%; O¡8¥£@OîõHfÅôlÒš}VPŠ8©ÕÈi,šó³4/²î+j1¬Or8¿F‡Òþ"tªáŽŸÒ©ƒàĬÄâf@;tppžKÀ/¦s‚\„xJeE½šù¾BU¤º„_6 êdf [•&®F]k:J©’ž®rÍÿ,1þq2`ÌØ }4LÐøt B^uP>J]y¦Õõ9Ÿu$çÙh1ã”+í½Ú "·¸d˜i'^Ç×zÓŽ`HšCN®v`39¤¿ÓÍ.F‹;^I™Ã•‹ïª¦ ëø~l«„Þ¡Ë ‘]*>x˜£0?6øÿƘX–BÛ¥^cXevUî\ì¡_ÒÜ–6tÍæzSè ®XO@ØÐ=å³#ˆElŠÒAzÆ{¸9X7Á| ùÒdºAµ^ÅÎâh ô°I¡˜GѺ ë!µä‹õ›øØöh~Çš¤æÞ ò¦‹Ï—2|ÊóŠ1͸;B¯ÊcµUcË͆+ÒÝKfõ/{µQߨ¯ŒUäL‘ñfò!,ÌÔö¸|ŒEoüŒíõ©Æ£ Nô(¯ ð²Y—/>½ZNïqk¯\¦"…ß.ÐÒKû\¶šé*]öRp.íw =SÎhXpä² § ùe¥Iõ# ߦ[a1r´ÔÊal…8Ïô^J×Q-ôÎæHj™ ÷¥»…–c´ŒÄ…ë‚­Ú„D´ŠVð§?)=º6[sÖ§ðc YJ½Ïºà>\›ÊçÆ,Ñöj Ź%‡y ð*D~pþCæåõ¹púðÝ“]À Ó¸.rÁ_.øCö"DÍÊô‰Ö,¹ÙT¤³ëÏÕÕ†rnÅeÐÙÑe5¾P èPKå­§Ê ÄLáÉ‹ªs ³Ô¯¥£BÃVåAèŠ _Úx½øüMJpvtЂѳp;o+žf÷5íLì\˜`eUq,ðCª7"LhQ=1ÙÓöô¿hí´PÒåXµÈÐ9Ï4Y¤¶ú³(”Õ(üB´­ÏÏ\”UÎ2)Bd”ãì·ýqw”,­ÆxnÅ8ù¾®“^gkðVjód[sÿA?/Ĺ=~\ë}Ì$̲ÿÀ£uúM6Ê5n:räâéÙáÄfq+D3‰MA´“~ %j,%¬ñ˜JH?¶oñKP#XKHøÍ—½„5ƒ éÇb¢Ád‚Í„äc4ñÕ5‚Ù„t;r²Z­j”Gd!=ŽÖ_-Ž;“×x´ óüº?‘cÿA©:(5T=(5XãQj•l•¬ñ(5@¥†Z¥k¤# ‚žïÅ‹J Ô0¡ä¢Çý«¡ÔˆŸèëkE²Y@ z>ž¨ÑæWlß®!»J#L-T‘,q»Q£þ]úÝÚeŸêyÆíE}ƈt:ê-µHãþÍéÚ ¦ÏˆÕM™QVüw>Z|Ðk¾VÊŒk¤»Åúsº2#î¦l`¤ÇQ1«Å(qQ›ÉþšV(3â Úº¶_jý˜:Ô¢•xÿ0õ\œˆÚã ¥ÌèaîM™7‹i3êuL¡ÍˆüÐù‘VÕÀº®ù^¼t/ћÿëQÙÎ÷m¼¦C›"#¯@VééOmS=<ŸßT´=$ñòC`óŽ5ªG#ˆÎ3á- þ¾?c4—¥Õ"=ÞߘíQ± †IR‘6çÐëW#¿[¨a.K9ÒË]˜¼Å˜W‰)/FØqxžýjñyR¬aé3nº]ï”>*óÖˆaÌå¥Ë ƒéz´i¨±ž§©/òy”éÕm%~6“jh.KÂ3ï–—U(Y/ ,‘•“åE¹SMx©dÿÈO¬/‰¦EÿÞŹAúmñ44…ƒB±¨Ÿl ӽ̗䨪h]QÌ“ìqñèßÎ(¢²äuÔˆy`N;]Ðür¹LQUÄ^’íé$,ÌĪgIgÉTAÇ¥¨Y’£cZЀý^Í­â7ÝX cì‡ó[äüŠòºUõ›Fß«å:˜…wÍ àgttKˆþ]žø‹*èG&Ñk&¯2ƒ‚e>C:€î¸Lp”7œjnBÃÈs{&’M_[«±$"¦¶ST)?8WW2 á,ÃÑ<› Jô|â&# [ã¢]Ëè-w£IÇŸ“ïcº'оŠÄn,FѹDØ(Bu“EjjMå(LM‡`]p±‘¯‡ð!ÙêÂÇö°ˆÏ~˜Úr¬Q¤KäókQüLö Û£&Ü“n [9•OküQR,Z¹0ÚSÓæy§¦Mñè¶EXqd)óKÒRR.ƒßŒ“^š’žÿhµ\B i&ßÛHBëÈS®e"ÀoЧYÌRÕµok„C=Šôk ^™‰:M¦ÿX_Gl’ ^-LfÃ5@¼Îb:Ž=]ôR„´!?°bØd{Ó<\帒²¥À€©0+?Òyr°+1íüà& ‘œ]Pî.Å7)¸¶Ø"ê7JFì3IiVa¹B¥a/v`Úÿ拽}dIЖüÖzêµëƒ ÞDO¿~iÌ•´•˜lk8q'~ÔT÷Ú2&©â~fú @Žâ>®’¶ËìY4:Ã"ì‚g'',“ü +x^Ž]·‚®ì¢i°W[æAWÙžðÍ’Xw~£_/®øF³‡Ë#M`E[¾M‰ž £+£bêèÊŠSèÜV«è=z¢ ùÑ>™…­O×®ªYÍbÒìÀz‰ ¶øÊ&:¬¸¤¤&—PHYfW©”r¦Ò— ÕÈè<í[©·-ŠbRaÐ('Vƒvheíû'CúÓ¢D7L„ä¤Ú}€E¯¢Ä¸¬§t’n@G¤òJ4{õåÑÝJKX͉½ z$~{N J£¸ Tñɶd`H‡žYx<4 fÒÔ;܉½d[kji^VEcpg²Y»ˆwO§¡½)Rd i ÐbˆBÉP‹­ëM‘óF·ó µÀ¯0JA>Øcɾ‹+à4ã™ô h¢’n©©Ÿg‡ XCñ+C·M`T¨ÝNnO¸>µ“µ×§¸ 2ôI5ÇÿKw.—!),‰³œ×Jò5tnq7ÛÍIOŒ2’Žt9Â!À 7:Y3€ŽpM>ƒz0}àÿ—| >ÜäøÙK-ÔÁöúÍ l¶Œ_vû_¾—´”ëá5à1ÝEMYkš|æN¾Ö$Öz©E’^jHqµåc1N8œ3ãÝà¼[ôy‡+acY#%]Ê\JÔÀkꈋ~Ì ó…E¦Á…x^Xd§ÅãBEv7åkÄ1ô}ŒÎ¤{\}ÙÜJüm]wln×I‚Í-,7lnqPµƒ®ZÔr b¨QöuÏÁævªÔ{nKºG™gìAF·vÕÈôXt:]£t»[ü©:iOb¤fw ú`è!ë׺jçxOšÙ­¬Pè¯ñGÃì–J¨Q§WôçuHW‹¹¬Œ5,·Zla<À¼[4Ïh¢õñž[½^-’c °†e4É‘^_-]-̾“z¨1ã hsæíW O†ë5ÚãS,úäDѨ¢Ùí?çC<÷q:GŽ«EôH±j4 Ye•çÞ¢·Œ¯_c{÷…˜žÙÂ9}cÛȵ‘ÑŸûKj„%®®9ãN’Éš“«ž'•ñC²ðdÈÔKUây'õÒ>`¶My,’ÃU¹ÅcS¸›'ŸBgæVÿO G$“IIz¶¾þäÁèÒ[(²œj“v|#ZU-¶xB:êÑQ£lEy„‡k+»¥†k§.ºŽÃÆ‹a£iŸIÝV)=eß#Aº‘îF”¤÷qÙæ>+º}E‹ÖhS<=l?S=5åø=ä^6ÅGñΘScã ÕD3˜Ef+Z†#/wŽgIaÝÿl.–`²¥yØåLù”ÞPy:èÍ ®ë”[±h‘=¹1]Ì(¾\Û,L‰yP8&ñåMßaj {Ô3‰L®“ë¾¹.k¿Ó¡S¹(§0ÃFòd’s‡É¹ïBÉ7¬F‘p5gg Y=VHùL?%PXL9× ¹âOG¦ßÜò”Gïè4å Ìb¬ç{ÈìµhˆìÄ…!;S²¢š&¹‡nÛ²cÉxÞ˜ÜÍh(Ö›ríâJѶh=ß…º6J H>ÇR8§:E:DLѺΦ’@³þ°¾Tãðä»Îs(ÕÑé È^;©|2´Lá’ Ú«lt ró¥™2iÔ“Ï^®ÅCž–ŸÃâbx8<Òp+±l™Š@°w‡+ÃÃ#ûûì'¯,#X ôhÄ‚ØÛ¤§cVC\‰”iÞÚt/²IÇoKçruR…,Ù›Tª©ÿÛ¯æO 8®xv¥)PŒ"¤3MîËin4 ¡]²8Hy4‡Î¼µ§{$tI@.ROÙê«qù⦜MH/RîO¸Cioñ0KDÞÌRC—âzõ£é.ÒJyÑ)¤Ù W’]îòBuì̵Zˆ2È%Ó%©¡±çvUÐTv±! xamaDö3Kšó$£EW0ï„&ÓÎ5¯Ú®ý àlFÌ®»}èkª1à43…!3fHƒÜdS•†jêÎtã V~ׯæ³Q”í“»tçj‘B—!x­/è2,`Œ]š¹µ–ßX‚«„'dž=ÁÛnʲøy™tûeÝŸC³à›Œ“ß=^aÊCzorvêNÍÓ=±šl¥*FÈß,àk õ©€©1•º'Tcdû-.£Qº¨Ïdv'®Ü¥¼SC,½™ ±¡ù»ù'†ꡟU5"Ü,³ó ¢®ßÁܦS'»é¥ ôùÑÒb»3M9 ä|<¶l!sOÔÓ®ºG)M‰Þäôvb±ìù´Ô» ‚¿'±EßÕØÔåËè=ŠÜW‘6P¸dJ¥0”€¬+&dqtº„ߢÏõ!•äàMØ™côe‹­+Ö š[<÷îR6œuR/b×4yS¹Â†R¬™±fhÄÍÙš¥ß†G=«Bªâ¯>ȦH“€ô–[á éû7Q¥›—üøÅ‚t Ðbò?(ûyBÁÁøÑÍ x 5nyFŒIx c¦çá_À‘+U%›ÙfôM Ș9EOw^ìI%Ÿiù…^O­cÝӃ̆wÿa‹Î¢f‰ñ’üãú¥sÜô¸!aí!{ûýž'N\™WA×ï35_3•¾ÍTúOÎT&¼ög¦–ÏÔÐLµî354SÉó5j¢Š>›™òôùiŽ4K~éLMÇÆM2#+ètÒõÞJxY‹-c–1Ò´„Æ¾Ž™±z‹AšÑ,2þ¬vÐÓ¨)§;äœBS>%´Îs%»®´‡Æf%uš%… Yi)Âéòl,X d,bOcWœÒ»9½:X$jÄ¡õϤùL†(Rbü½ÎÔïáÖi¯­3_[gûÖñDµ-][çÚL‰¤t¨`^»~c©àãùßoüªâWGçN\žr¾Uùö«Ê?ûUëþUüFV€õ†­íþUæW®6‹¿Š¿;ÁSïùü¾Þ~ó"ÚQbàéó\™:K#.Z+љծ_5¼$6}޾Ò'FXºÏg&œâÏ)ûõ×{Oü ~¹ƒ_°¸½l~oɳgÑÀž>‹ÍA‹Vñ_5˜öØ/ub…NËf6Ô#ªðá^8í«yÙ>1Y@HÏ ^·ÎØÒ8|.A,ˆ ¥|›N,z—šI÷sK[rðŠæ\‰p‰cÊj7Ý)h26Ë^fÔ˜I“•æà™èpAÐcÝ9”üVÚ_ª0E>?"zÊ—ƒ d.q>9•»Ê÷¬]fKõÙõ{Ÿ‡)#ÁoÙO§¿ó†õG;bxIãê,?6^É#ÎËS´%bɯW¯üâÿã¯ÿï_éGú|¡'úP¦O¹ÿ=úF:‘_Ÿ:ÏßÿÏÿÇ8øñÿþ jûü£Û–Ÿ6T$LÿÌxßb÷‘r½~hŠJ&ùNÁ/h“í²c^\Æ x§ÿàW>Ëë%>öÿ®¯sd²ýÌÚ¬u äÙ/”Êf}·‹†to¤›ºhÕ_úý”ˆ‹Éë´!8OŸï¡¿¹ËØ›†Øbÿ(ù¼õ(àÜgGv¤UWÈ‘I7Þ#¤¯SÂDZÖuÚ=}ȼ½ã(n6îî #¼>h#l‰¤ùÕ$ ’A"='i¯âÚõ’_øH^O›¼>óô‰AŒ~cd boª®/6ú ”Óænw‚™ŒÞtã[Qp›{É/|&e•L¾ÄÍ?K»8ŠûYq‘ã¹È­ðˆ,$'=mwJæ2’ð¦‚ÁSÆ2­›øÃ.³Ýø'Î*ûñâ³7®rCÒ7/ùÅ’aƒžÌ‘dAwÑ}’ÎCçŒ%|µÛX§Í†›Æ:}Þ¿ÊZ/ò«7Œñú"ÆØy)Ì©iëÜ«“ÕȽ„y”îüG„^ÉÛÇÚL\ãmÍÓ'Ççý*µþô†1Í’úGÉ,á˜LÀí†ZÈ!Ã' t¦$g)2Ö)±!š$¿NŒlÏÓ%†ÑVø™ñ£”ç½aˆ°<ýÔ\m ƒÞhÿ‰ ÛrÓâý•ü™w­vh6úÑ4; à JÿÖ}üq½Ífž øåÜ”ÄÊÌ<átš]¶3ËSbº•ÚÄ42¢ÿA Œ9í"ë0tÃÌ]j‰éÂö ò§¿‰ÿ†#×Ü“ü·ý»‹åx3§‹õê¢Ç.Ž =Xum€ ¡³LçfÓàˆ‚‚7Çý h³fÝŽ‚ª<>éô 7ïšuT`ùI+Óhºõ£âó©ïšú¥©nšú‡Ô¤øÌ¯SÂiˇþÇŸšÊåS)¤Me–M@;JFÏnáSÐCqƒÉPÙüè«Ï=6aUÊÛIï÷\»,˜„Ü0Z€ëf9T¥«ãæ*&13Ú¡ÿCɤŽp¥u+ÈŠ8‹¹èdÈÿI{ºè†õZ¯ùZ¯q¯×x¯×x-W½–ëQêþeCذlujÙ¸jCÛÓ™“‘ ½š`$sÈФh“S=Ç"pÀ 0#ó0Àíø3Û§ó˜"zMç¿Çö×´Á_Sÿ8Eý‰%(q ž—›G«4ÅÖ<‹0ÀÓª¢³˜ÓÝ^Õ¦›ªû5S}ûcÙÊ>AJ[{‘Íet>qî[%DÍê*tkÐé +ð,¯ß;ÿêgûÌ|›÷ÌÏ×Ô/5pÓ>£ÄÁ~r»óBçûnzÎʼnïÕ§6ç¢cÓß`'v!!|ÛHù|-zž¡ÄsÎT¾:E›L;îq“aËùÀèýÛ<ñMw õÙÙŸ|Ÿú©C!¬¹>Ù.ŸzŸñÔvÓÎ->¢îüâáÙM÷JSü1_ŒnŠƒE<¾L…ê’[•ßX_ÿptçTu¦øƒ®yo¯y¯÷¼×oó>_óþæTå[û¦¿®{ú‡¿¸+ì~ëtŸòGz3]†ù×p—­NVy¼Îf‡7m.EÓ;Èî–ê,Ø÷Ry£|IØürM~ókPóäó½ß¿­Áx­A¿× [ƒýZƒòç÷~}í}¦ìGMÒŸìÇ£›jCQ †§ñ&šåÇñÄ+©W³ùrœ«eh¾¯ûœ|WB œ&L¾+VÉ7mÁuýÈäÑYˆµÀLB׫,9 }Æh™66¡/muŠ µKÆ‘$qxàÁœGòmîÿ¥|<äÿa>Æ:.Â*×"¨¶Ð{ä»iÏ^pÙ“USü¤8`µÝ$I“ŽrÅ.<€ù€+Ð“Ι¥ÑÝEwYvˆÕO l¹¯ig²re>  b‰ê‡Õ^‹ö¯2Äþ‘Ã>+hòûwË*¶ç¨éD‘n½Ìžꑦ_Î8A¼Ûß^<¶YÉ6aŠrÚ´ÅâéÉÉ «›HV‹"KØ8ÛLÇñLþÔZo+ø¿öÄü©³æ½n² R”´E­sOwi˱»Š–€G†è.X‚êKиÃ麥DM‹j]ÙAZç µš @âKú·LR#b"I¬©Ÿ±%YUˆõÒcîѺó(v¿˜%‹¥8bÑ^Ç+ø¢e½=RÀÆiZž£ä‚|‘Œ!.vñØx&â&âdüxž–4uKUþÛh-ŠS\ ,r’®¢å9¼4e‹ ›ï“^ätájºv@Ñ,àÒ/½ÿ*“úY97¥ûÊ5_99—¸p"(ašüš`ÙhD!,)ër“&ßg‡Ó}g’ؿ呠÷n§ÆÐÒLoÑI‹ÔNÚC /žÑ¾ñ°%™mšø¹vbŠÃû–Íõ_zØþØ é¯’/™ëȆ¼!–ßÇerÑ<þ9’›I6R¤ìFN0 öë¬ô[»SàLͱ6Ñàrª„[PŽÈHŠ©/²úïcÉ¥JÙ둊³˜?c­ú²Þ…ÿÊeûS‹6üY[\4×À Yâ‡44ëH”ʳLTR…–D 8Ï:gX3Ó5<"I™Þü¨{#VßÈÇnjz+T^qS¾LÕW`ú tgÆÿË´_æ;ýÇ^)—?} \1ãkÐýàœ›bH'U•¬°CáÚpNíM:´”›àbi eK—œªË¼{¥O“£ÚÇ1qð•7hžGy ¶6c'ÊѥɠíAé!_â’}Ô Òs&+¤òdSº#kW% bMbi$ÈØB)¡ñ£¼U| œÙÄ‹‡U0ûïæ¯hGð²~wA{¸áoüÜ“&à¿rûõ?äµ6SäÛ/¹tAŸc+\~Er÷¹g)§4o2.Ú¥î¦ØM Ãœ²ôNHñ6 N¬pó‘ÎÖð›KðZª—ÌÙâd94žëpECõ¢æMƒÑ5.t1zþ;ÍêyêÆ™„Gàf—y”ì®ìTÂ>jlÖ–`ÍOÇš¿™ã%)7§ ¨Ã¦Ý‹Ó“Š;±0£Ý€Ð¿n‰È‰Ô›Èv¥Jõ¹iKr ÝKüÞ&dÃ^GØš^ŸÌüÖ™–Ën –ë¶-ÓëS¡%%0"#›d‡¡¬Zbž+£©ƒ¡K"6)_êê#šRÙa[(Ϋñ´æÂĪreïŽ)ëV'‹R1Üd1'±¶%·©jËúqk\üñÏ}k\Æã€È­ø¸,j›¦?ö4»%Ø÷©»ù>Mn.\.õgyìdùVéMÄ 3 mS!PÛŒ»~,›)ÇÒ®ÅfÚ]£ÓÙFvHw%¯³·r! oZU,ZDN[Zÿ‘‡7‘üPüê2Áßw[GÃøµãÈr:)›×¹o¼Á\vôµ±³×°UeMYγV²ôQÜN©Óá'Mµ÷NngsgÚUóÖ <Ȉ×$í {Nvø‹Õ¸³Z4‘#Û˜l|ܪ¼r¦`¯ƒœ\¿ÉÉã–“×z Êã-(— <´SÇŸÓOU)ta’è[ 8í‹‘ô%ÿœ™xºëƒµ _Ð2dOÚ´/˜Ãá¥ÜYÃLw;K´©„ÚM‚M•Ö“ŠšÄdvb“vô”d±0_Sõ}¸VïãÌ—ë=ãÝ9㱬 cñŠþJÇ÷Ujà`¬®òŸ- ZÚ}4͵à8¹äYÛÛ† ¬Ò0$ÿùGztŒ 9[î»l¬ ©È1hçwâË?ðø ‹q£‚¿Oá¢ì¢»»MRboÆgÄßÇHç÷¡êŸþ¾ü‡Ì8̳A¹ï-o’v,öT䪫f'Ç-ÒÜì{+ë¾?[~ÿäõü¯E°Š#þ0\³z^LW Ðo8G}÷nþߺ´ 7-Œî5^Úmý!YvÕ~ ºl»Žª¿?ÄzÝɾgj(²tÈÌÂwëŸ]”_»ìïv¯a<šõž|šÔüóìš:£HVÆÅQöaÔ]ogh³Ï|oÌþÝüScñÌÿþÜÆÒ³vEêè Íñ¹÷.“'Z<šY B»=÷í¸„Éë¦1’€Ã Ùÿ<òðzgl"ò×m]ÐÖ(ffùì‹ë¤â<‘ÁÔI(›ñ€p’þöÀ”ëvµ1¤÷äëÀfø>@1ïj\%Ìo¶*9©¤s–ü@¼ê³˜IøowƒÅãÇ› nʽ¤ŸŸ*4h¿Q >ÙÏC^âݤ†ÒrÊðÄHoñ±+F˜®‡V’K86'ÞÄ´ZjÑT£èS:‘Qmû›³]ŠÛI:V¹³î¤…œ°Ñ˜ååžà2³=¥o[—êè†7:Ó“Çý"k<áákÄ_|?ËiWm$ñs¹qãgh‘&í=¸3ô”´÷¬ûÿdÕ÷Ñ·MÄgîÓÀc }ÐysÓN-„Á¬P F$>ÜÏ]èáû9lí^Åu ¾ê^󇫓­§Ãï´tÌö™üB<#ÚbŒþn„á©yâ:ˆ¯XH¡D–äÏ@á¬ÞÛâ÷Çó=¯qpž§èoFøšÃ~?þÿçPLßÁõ ²¯$‡ìLì2Þ˜Qã$iùuZŒšÍÎâ] Óõß¾áƒÿ=ßþgð‚&íÝP€E%†j±¡Ó¡‰»çÿ®¸œ„÷ªöDu&†²÷Güåöõ“} ½îÞßó9Í펫· šš‹èN¾áÿÏ:f h³c tëÉ>úm`®¯q¼ÁŸÞ8‡á‹EЀÅõpöfwœ=âî•-:9Ì«»ëЦé+{üð.A÷ñã…_ÒºàÓ[ß/:†¬ƒûu"òÖ.ºÐnmÚ­Äí[[°¯DNS ”d"Ù.Ç©Ò` -x÷öû¯× X½ NBî9ŒÞ&_«Éø_•)u90òvèÚöûÄW Qø5ŠY0ŠÎ;û}Jüƒ„¹=(€‰ÅÄV$æ;€U·èì)¢ÖÁzíêCHÌ™xì´Aâ½Æq! Bºxzû}Jü‹4, õÆ"ä^IH¾Á1²äÓ+|)Û7³J21ƒ¸YÒÏ8|¥Y0öÆ1F@t?|%;§±cßw»ëé4uIr„Ýñ­»€8­ ¿ÒÆO³Öˆ…xâ¼{ûý×ëƒøYqL"€fþ·ôpˆÝµöýñÇ`¿1Ìo­óë•ýÃktËoh&5Á…fŠ ÎÎÿx}f?x¹ÿ]Ÿ¿hï6¿ÿ¦ ܧ$»_äCçGe½]tŒÝ^½­ïcT~×Åû0ŽŸ·èz+cŽJò_’>/5¹øÐ@Ó“›€õìíTm™Û~xŸ„Ì­?Þãøy«T®Þ~ÿõþ⯿nÍ«TÓ·j¿>ózÂ"8k°Ù©¦Ç¯?Nù ÷øñÇÏ[ívõöû¯÷QçX/Û SÐFsD™÷QBÌÙâ}¬*ÔY騫ãèîïq¼4²pköÞ~Ÿ’kŒý¥Ò—i.ÐAPv×”Â×f ö;O$0ÏØ'è!oÊ0Ž—Vüêí÷_ï/þ¢q0_ʧù²i=ýcêz‹÷Áó½”ß|ôÝÖÜã87e\½ýþëýÅ_r»æmǵÍÇHƈ¼€ÀÓ÷6(á~DŸø®;§qø¹>檫·ß½¿øë¯Ç0~ÔšY¼Óåë»ñPw¢zÈÂ0nÑÔŽ'³<¿ÒGñR£ÇÎü–¾Ç×i ú{µ7A«Þ\<Nt¿Ž²¾ î”)?a3•_×(^ªæ«³ß½?øKêè(¦ P1\§…Ýæê=™zÐZ=‚^ÏôQ|Ó¬>ýþëõ¹_,h¯ñÌK_‘ãK‚ CXÚjƒ’!µIÛ¤aǾFñM÷:ûý×ûƒ¿XRò=¤v“ß5»€sÃ&ø exôº´ïQü|ky}˜©$¼ÑP …7Ùès’Dmìö!’1ƒ ©>–MÝIæ8äãÇ1~|×léǸç=‰RÅ'^Ûѯo ¨8>Ñh£A·rÔ; ûk}ß/ôÕÙpÍLé÷,–Èû<º¢@ÍÏÑ&µÆ^K>}l•HŸT5‹õÇ{?ÿF½Å¦GÿÖÞ“Ø^“øÖM½°¸XB¶ñŒ°g•Ô£"ݼ†ñóoÔ[¬z†Øë{{¿'-ÐoNöR;ýÞß©˜éÌî›…¾yìÏPMWtæ^Á}˜îj6þ7ÏOÉ›åÿ/þøw†¿"ñÍw†ÿiC={g‰õ]ŸIâÝ•ìB8Ž–B£œ’_,Áò&u.Ê{ÜQ‡Å¾êéKã›ùêžï'…‡B¶©å£¾ðuêüâè8´)Y•ÍßCg÷¢ò u3?ìbÝêòC)佇{"ˆ—Ål£1Íkuˆs'³W<ùÔ6ŒˆÐWørÔV]Ý£º´äÏ›|öPÜæ”ìPå~“ŹûB6åIg!;¯+oS»ä6õ>ÕTï®~ÿõþœ€•äñ-ÆÇ³dnÜò`Êe­!„´—üâwR mjÓÎKdäïqDE{˧7 -_ýoèaQÒñÞg*9âÊÚ±ÜAŒ0Ê^ò‹%34¡CýÓåý£¢žêÝ™dðAÉ Urc­'·åœÇ1‘C>±×èŸ^‚!f&QîКyæ¼Ë{QMÅΤ8«ËEZO‰D ìý)ps¯WRŽ2È”ψÁY$ú¢—àòÛÜÎjcßM%ôiã˜ç«wβÓ?Éä¥Äͱá|ƒ6¼dI{]ÇûºŽ³ Ø_Y§Ï?õj}¿±Ëà÷gàØ3Ò(ë±É#Û±ÓÇBt&<[ÿ=_ÿgïV´p¿šð‘ѳ—]{„ô5’E½ß&+rœþnÝã J¸÷ ¾=\¡³ß½?¨·gêáBäi'÷Lâvéó‰ðdµ± q„ÌKÿ ɲû^#¼˜èëõŠ}ýöÿš?BJ4³í_njAÐyEô µO4ѳä`$ÅßÔêMï÷ý-ë/ã©JøÁîÝC¡°2=‰êó†LÑYï‚°Yr ±ÝÊöyÑýí)ÞµüãõÅ_zWôF¶)^ø¼L‡Þe=f‰û ¨‹½6Ùe Ã0æûY+Q¯óû¯û‹ÛŸ¤¬ÌNC>Þu$¼$•EIa,¹¦ñrHaŸí¦Ç|Mãy×®Þ~ÿõþâ/>,]tt[ÝxáOÑUöˆ¹Ü‡›‡‘ÚϘn7Å×8î‡íîí÷_ï/þâÃ2ôLaˤ:;uvÅ"thÑç×½˼ÏKyiåîQ¼žµØÙï¿^ŸCïpoa’¦þŸ¼¬Ó­ò½>òö¨¿ÎwiÔºaŸ‘/;ýq½kØ{”{K_#´it‹~Ú\ÐdT%9o@Dÿíu¼à×·*ÌIÅ ûwãÔ§ñÜÌsÌUï:øèDáðdΔ‚¼“ÇX2,ˆîK×¾ä!/©óйmäcqº0 ú°€¯J2wÏo"3ÊGô~œöïˆ#éiI\âXÛJ¤'z(µÙi¡¸Ü¤§Æ( q¡N҇¾0ˆÉ‚<˜ÝÎIÌx¬¾zÃO¯ nÉ;eö&:h› Ã#+é%˜Ÿ –-?tøkÉuükÀ€üÐ]ʺ§E‡/ÂéÓéÌëåÐÏ PÒl×Í«p•ä?Z«6'üj¹¢³{îs#2ó¦«^V*.®H_Û{Wþ|W^Kh«7Þ®™híQÏ@ƒÃ‚xØDÎ5¯UþÇ·þò¿çãßØË»Éï¿i‚’¡UG©jUŽcc|¹Þ øA¨îØãÕݱ‡Ý¿ž{/ÈéHn=×§4¶ÎËRŒ¥Ñíá+ÛhÒq8_©’Ç©GMܧÇ{tŸž×.¾òêK“¾§Þµ¨´K‚ŽvËf8]#D‰ûÀ¨TåÔ£>Üɧ÷ïq\¬%zÛÁ©ÇKœ—ýÅ’,îzÐQh9bþOО]“N°*y<{ئÏïÓ={Þã¸XËWo¿ÿzýgIîÄ™1º<ª„6S⌆ȀšãÙ£&rìñݱç=ˆ‹±|õõû”ÆÒJÊÃW¶¾¿<û§ñ•ñu¯TÉã×ãmܯG]º[Ï{[ùêì÷_ï¢{½hb+Q\[Ù,š¤E¶R%î£>ÌD·žÁ>°¬Âœ|ãb+›Ž[—¶²™7~~ØJ£=Ch ëAà+Uò8ö°M=Ž=ì³Çž÷8.ÆòÕÛï¿Þ_糨kùŸ¹§ƒ:äÛsæùö|¿Ë_ÏÃ=®ÿøëa2ÎHO ›Ü\È?Þßx¿fÿ¥Ÿþö–Ý-~o³á-Òƒ /¬Äˆmˆàþ?\oòýKl?>4Ó:FúeäzF‡Î4<¦Ó½=>ƒO'q;hK (•Ѹ ]²ž!ÎSò+–°M¤­ÏH—ã)C[á3Fô¦m]ý_¯Ïà˜²'Þó3óž'(Ï3%(¹&q'Ò}Ütqµ¿ì­Ïћ޳YbÿVRKºÞ¯­6KW}×ÕOô“§×-kfüÎZ?.Úú|ã²[¿zÓ{¾¨÷²d=7zŽV%M. (I¸ì™ î9‰~š×w¬M¤­Ï×8.ëÿ«·ß½¿¨3éÅìz€ÔQör7õ>½†ˆ’_÷gv<Ôêò5ŒËƒâÕ›^ݼbÿx2«žL½?IïQ©zŸ†Þ§u%¿î’r‘}¾Æqù¡¼zûý×û‹¿øÊM½™°Ýw†òÚ{”ýÛz¯Ê=F”üºKrcbŸ¯q\Î<¯Þ~ÿõþ"ÆXu]O†«t:Ö¼y16*cLG2Êuñ°$^½!1Ðo+>éSò9AFXŒqÉ @¯etçààCÊÓ7gB¦ÃE\6Z¸ŒR“°v‚šn”,‡Eø¶Ïà+uÖ‘Ähƒu*®â¶cV60òªü¹ÐNÓÓÐVO>„•6U$ôš/Žc“âj¶$:6ËÔ‡e*°1~í.E»)F?ËD€°²ª–²[¹|&‘rl¡Û&Õ"—Šùís]‘„ûS°¸®m©ÁF"ËÕ¤,HY8…VRKìg¯V¿T¡U’`¥ˆcb hÁÿ”à¹Ym»ä : ŒÆ+#ÏØúÏ¿©ˆ?mµ3AAM?SÏFƒœdÙ´µì¬M¥ÒR6¨•ö¾ÃΪ;±ÂÂ6¨<|Ýå] @ÿ¬ ¡gvÒ„-m×¾ {ãg Äž² ½ºØ6Y%Ú6k¶v£'É¥]KhÛ&ü|¡?ôæ]ô¹ƒpxkÒï³P±‘ˆå²3ÍYÖ¢rßÙÙ³t¾²’¦ ¢c'à  ] hQ}Ò7¼b?;‰8–ÅRÁøÐìLÜæÑ¸¸ÑàcaÏ4}«§÷³è„x^eóOSìÙ*Ìp‹m¡ ÆuÄ…tu,7f!ØŠ•lÔ¶ž^å ¡{ÈE3»‡½djÖ•‘1Ú6’íg\Q•õ”1*Ã@&Ý`§í71xÊöQêÜú[úMÊnvüšë;à ªnÁÐÁ\eršvé¼ê uØiM›g_wZA"î·u6Üs§‘þaQqcaY-ÍÙ¹n[î5ÐÔPÙÎ2RÝ)nþ%¥q¯áª™—²)ñ·NÒÛ³y‰rÕµ§o,]ƒ˜ƒ:…:¸íò±qöDcçf2¾2˜ä` +ªL\ºñ¢t—VÎÐum¥øoè yåpçSÑ•¹´T]mHÈF{x4ÝìQÒY²µÆüáúö P_í¤$´íˆ›µ&Ý£0.hBðÚÿ‰MgoìöÝRÙcêÜÀ>Fˆ8ÙÓ¢`Cj?bµ/ñ@YÓÆ´9ß°Î!6ña—¬{P6ü¿öGÛÎiÀ \‹n–©ýQž7ðÙQ?#\ônˆ=o‹/(Y„bü’]1àY*u£›Ù`Œ&þ×N8ùxîqú,Ÿ.;ËÂæ¬û鈦Kæ:Ûx ]„N@ÆùÌ/\Mqüh™:'Ø,Ž›kBS²AbÍ*™Z­ Ëvf—¹ÑIU­qÒÓæ7•©Ú‰R.âW˜c¸ö™ìøuK1Ž«ôÖ¾³»yµ$Uõ–w™•¨ y5À4Tàûô‰”ÃÍÉk’l̪³txáU—¬8Ðè‘õÍä!ȯR•QÚþ:|—ýÈÒ`ÈtÂÙ÷ï‡^:¿ö¦á«ô7‹Û $!²˜ƒL÷k/t#„厕m^\Y—ÌÒY±’ª‹Ë¹1<’¼?·ëíÚôÛÆm[WÖð­\ãîÝÚÍJ:ÛÝì\à¸åöä€ìi°ýNz«&^´_ÜÎöÜþ¼«žÜÆtX¼0aîOŠ8¸H7SZÛëƒ9"V>6Æ*|ƒyÑ.9FâAâƒVda€LS«vû”»*J&÷{Z¬QuBª^D©â›×ï²A´Æí?}3WÑ.K Od“†–×Á‡FÒæcå1Úÿ_ÕbK])`¹}Ï‹ìO&|òv«aÉ(¹Lìc:CJR¾‹mh],h¢dÒºØÂ]ÄšTÿÄ”,îh,@Â7¯Å!CÒäZƒý¬%}q@p€zÕÅLÕ[iSÀõ(™’:k x#>ÜÐö7ûÏÑßм€—nG+ÁûÑ8æ9! ¢-匡 ™}Nnâ¡S™õÀðéßd^xŽ~ÆÌ+82‹„úû‡ …Ë3hxU|»m*ñÝýAÀ;‡j-hΜ4 P”_»%S6¾Êb§Ì¾i¬Dé`§Œ¯L–ܪ߸É6‚•Û!kËoÛ"yÛ§ñ&ƒÏzír>›â˜P"C^ñ~.wìažoŒ/—á%îdž9WWwWnо%‚eý{KBeü"ƒ@šïØpî…nÙßè¾tò« ¼—2]!bC¨òîé¢Ý\šÎ7hA”vSi|áSæ#©¥W1è[HcÜL.‡_¨¢³Ø‡ÃˆbwvmwüãØ9ØýÝSÓc/U•±©›ôœ¢;iªo7 JêfÎáÎF§¾÷ï¼!îƒ?ê÷†ß:ÃÍ]Ê“…ͯ¯?.Eþ¹MzˆëV}2´øÉ•‡#x1¶,¾\ÊS[ûY)šÜÅ–$@Ú 0+ó~˜Sì#”n›gÏE|‘¶nά]”—Yƒ‡¥ãEYø¦»¬]ux¤©KO ÁÍì=R7˜|½&1nM%RÈþÌÂÛvÃ’Âk&߈Ó0™„Íhf¥³¬µµh?nâ/¡>Ê–4Â!AyF±²E¢¸Äd&!¯™Å$61X[¿R¿çkgnªÙ׎ÚGç"I'LŠq¶óäÌéš%ª?­ Vüã¹É]TñpŸ£?Q¨ ßi×L¢S°dªFþqÑ­³‡­«Õ¹>$–,Téó~oq/r]-QB VÊK!«í²í¥}ù‡<ÖçÝ£µ,—ÇHÚÉK¬M÷0rAºÏZÈÅ]a¡¦EerŒµ*Å£‰„hŸChEãÂkCÔ`{}šî(~‡°jN Þóê7ÆYÐTC!TÕиުëZCêžÅ´â¬!€÷šÕq´*S<ã˜dÑøÚ1µŒMãÐ4òx([(ÆT)×B™Í´T¯kNèfæ`üøgºüËrûG'äíBCñì™,ߦçµí”ðö¢x4áªòèƒ;9sX«Wu½èëg\†ß?üs\ó´“ßå1³ñ˺À¨)d/Ýý É¥?¿È¬{ÿëHÛJB0š±ßì §²ÁÍsE{X¾Wûmè®LdÐmel<ŒkJ ²’’‹Y +KJñIç6£ÁòM˜Ö‹ú»H­{¢¶©3£Þ(¼‹;Àø/^$­Êoª%€{ÏñÑKzôºŸ²–õP.ÈA‹) ÊbFèä„û¾º "îHÇd“Û6ÞYüç1Sz Ùn7“ÁºT}Ò; øX0+¤•Á9yÔ$»Ÿ:Œµ¥áKÔlM}Ü„ÞîS®ïœðÁ þ¿Ø{—dÉu$Yp~Vá+!þÀzBº^ŽOjpEj÷MSU€è‘Õïf•''§Áâ£ö2)Iö,ßq~˜iŽ&ùÓÚ|@WÆ2Á†Dú|Ó×.@«j¨>놎•mŠ•q‰]ô-\-i·ÓšpZ½2+ðW!Œ“Î=¢h(ïôn²*„tM3 ¨)€Fsñ¦ø£{ž¢ÜrîÇõ˜óð…º7;$IåBÙ°c”éÔÖWu¼Î½_Ýd*nŽ]Þ±j_€’MKÞqÚõR¿@j‹iÝK¢æ/XäÕ¤_HÔ“ucpS6ÝÍÌ[ΘâÀJÛrÒRÓÉPçÓ 4Um{Ø8" ( hq(+<2÷=˰ٺìæ: Q½Hseie*L¤&%ä&n3U—ÓÀ’Ü;ç (Z‡@õ]³p”š¸2„lÅ()%KР½oúZ8ûÖ•û·²,’E›ùʦWfÑØ!¾} `Ï(+ HE?-¤"1µVv`•Yc 7örþ9ùÔÒ¯eqýÞîþ±µ<1°}°~¹Ò*t5Ó†dŸ†0Ö%ȔόÙ"Œ}ª½X(v›YßO¥ @ei{‚ª£«"à;‹|MPý ó6V¥¬¿€',eÇ!ô#猪å±)×ÜV Q´çhçaXƒ°Ò€^æ&5$Z¯/TS·Âè¶,^‡M C5‰ác8`±(" xÓÇã W Ú69é¡K:+t]DëÅéÛµeÀ>d Na¬C4)z­Ÿ@È€[ µ5^9EEÌYO?Ã}™…õ8lUoûÙædË¢.EÖpÆcöBá”Z·ûªÚ›gž×zÊ𸉊‡„ÉúP\6©x媛…Rk“"&j¡›²–^Kt°h5]Ù³MˆR»[ªºHè3Y)ª÷£§Ñs*§ÜÏ¿$±8jÒ¡†MQV!%.Isâ’$í@ÏTÒ-NòÃô)ë‚-ôîÛÄ#ó¯:zî{£CÑoæû9£‹%n¬G ¹ÏøCšÏŽ?b>›8p³W\që·yv²â4*[sGz×þloA5Ý»Ù@r@ep¹…Û*• ™ë »S•3®˜šºKL–•*zÙÒƒüR#ÏîöÀ4@Ó<ì“nÅ0¼8œ4aõR¾ë°w—<ÁuôOÕó}ó:]i(„DR×81üø_mmÕÒ¥.YkÜQ8ÑKâyÍõ ÃJèÊbzBÊ3036ÕŽd(â2U -H÷bk¯ÜX×Ni/-Z•‚Hwv—Àd#h»»Ê[ËäÂóú÷<ܼ'JÏ@›³>/Aí£ÏÓØ‹‡î6/±©ib|œ¹ÔUœKé(»›€ÓÁ‹{ƒW}c;Ë4Sج}¶d/lU§óœCÞ^³]ûlCÅQ=}–K0î×,™i1Õ=DA+T(4y|)×.È~LBزöë!e4œùà±g¨½@k}¡r®H|gQ¼AÔžÇýŽÀ™-š³,…cÑm‘Æ}ÒuÁAê.ŠùZÓšå›-Û³.ãt¨øÈ9÷Ø+ŒO‚(s¿ ïžÜ:­æ„oÍ_Ãë*pìÞ¾ö¯gŒñد^žlÿ¥ýÊ€†CÑ´˜¼å™¨[„Ê@ùéØ}¥uèÿ»:V–ñod'—P”èQ¸‚¤]-rDfòª”$ÍsE%ò-"z.Bè_Ó'OJŸuµÓµ(2{èò$aU8ÛAºù~= õ´Ì1J–ѯI ”¶öÀlèÚ—V"¿1OnÌS.}VÅeÈ…‚sϽÚïï0€ºWOß½q}b|½.LËØ ]§²³ÄÊû¹â\·Ë[ËU ÷PL¬Íkž¯Ûl½ ]¹U¾ø÷•€Å¸»1…´šä¦jlñÿé¦óaåúç¾V©9‚'É›Ÿ€B“Y[?XnMð¥É‹¥6žìI!M–ÙÔ‘ÕØˆ©ƒB¨œ™ 'Æâtéb,Eùš*#=ÃU¸´){1í1bD2a¢ÂrÒºóú…¢}«‰Àí] Ö:¢!„#æRèü‡…ªó7€ ©Óü¼¡ó¡Ã¬{â·®¯º¨ˆ©6k«Öù!ëË¥P• CªÃ7È¥µ=>G~ÊH*|‹Â¼W«4mmF V¹(Cqãõy2ͶU‘”%ÈÄpHs<ž0˽'T:$+Ñð\èù•›îŠÖ•Ñ,ŸÏÃûK:¹ã¬Ý.Ú€gIâwëÞ¸‘ßÇéûÄ¡„ ·JRQy(­jÜOùè>n­]s!–&³ª]4u÷3‘ÚØ'QK=K–èc«ócÁqérÕÐõ…cËËÕÞël=¯¯¨ˆ6s™úsF¢@¯ A`ÄãzEÌñ¹ºÁ¤ö7ØÂD¿ÁÚ±.4[LÀi=4‚òÃRhg–Gw+ÜRÙuLÓä3hÎmÚçÐÈšèe©*¹ß_U –´ÎQŠní~ò¹äÒf—¶EÓrîÃUgÿ¦E¤ðL@É 4i²-g?lý%±´[“n ðÿ¿8-MÓR:>q}ƒù1‘Ú¥E~€N•a :9—…m'Éè+ûiuc½3qO#±^Õ¦ç@è rźڶ©aÂâ$Ãe;)0Hw}i:cÑ€}(îqF?}ÜñJ–§+«=c²³åª@>îqßµxçÎĹÐ"VšNÈÒè!Ú`/6)Q1©Md,+Îi“å±O“„ýFWXÏd¥hrò„ݬsG™ÉéËüÁˆX»-ÀCh´›¡#n˜M$ÊÝùÊžÑÓ[¼–f¿çé;îyŸ( ã„¥§ëáÖㆫ0¥¢hJŸ,,¯nz>Ìþn:rpÞ1~áz´O¤”¡”תY!:i9s˜€ìó™–3gáb;sèž”ƒ’† ‡+ „t‡‡+(¾¦TÓVЊH¡ê*ŽÌ&h½àNƒT•â¡ Å`•¤­9Hf’9J“†_’^=:´( ?­ÝôRaƒz’ 3éU*KjïÆ1 Q@aý,‰2Çê czŠ&º{ÔFµuúôæ¸IÕqˆ"®¦é÷×w[’•üQÝÏž£nÏa×óÞ æC:ÁØ­ç,Ý]•Òpòò-”ïe%Æ—Ã÷,èfêׂ³"­+}<†sdZ’Co»¹š¶­}WýÄÀM‘uæëkWrí@ki(Yí’£+]KWV•îŒéxúã%J™íy”Ú­…¥œéª© Øƒ©/´¾¥»çê„sU‘œ[…/K×L]3WiduOºàU¸îayãê+µ4!!ƒ•ºÙ_¯Ìž ãê:2ÏÝ•^Ó1i<5¥Çå­'’ž`Ü Ü„z¢’ù#l%Ô,ZU‰¾±[©EÅ=àyðŽÁ5±‰{·Pé³ÁXQ\ãžpM$-—áPÖ¤Cß$@Y€¶þ¿ôÿ÷¯çm½¥áë¦å–ä7 ,&Ô9ÕÉO¬I^¸t£”4zÍã¡}U¦ÔŽý¬j¹ HQ%:zM¾ÁB¥ ª”ô÷DÇÙö9œë&bgMR…ÉR¥d2µîzú§•FD}é¾VÚgDv©{ñÌ=ý‰×ëÓ®šSßf-)ç{¢•©±‚E×*ãcôh¡ØE:)˜ûunw1¶‰ý?£Î™·ùc¨Ã˜m -"_òt™3õçËnMÖV?ßÌPrßAê<Æ®YvŸ(&Š»t£ï<¯ÌÖT{p}àÔP6Eù( Þ:ÈšzúÑ'§+욢„×éZdÜŽR%_?¨z tïEê«x„ÁhªD¥š³‡$S¥M)RQ6]Âö‡¼Fä˜ÚdŸî¯Ñq´µƒÚn´WC¯c`Ý›;ËigÊÓ÷*æÀ·ž[ÃëðQ¦Ãk/Ò|õyo–moN\ü5[I«S¶Zß9¬Œlì9øÎuUǺ*«4™¯|œ}¥æMÞô\ˆ '¼lÉe ë·S†2;ÒuTLh_)%W®Ã¶k²3ŽÖ*Y‘àPÝ¥€\©R¤ #v`ÐD¡ækr²(AÂÍA}Ìy»Ë7dî™ð|câRI­ÃªEÑdý§Íú«eÛG"‚uU¡§ÒCë‹?~H'Éä£?§Kû ÓËWÑɳy´ç5Uú¦¦5ö×,}Ùç®}ÅhM1z ×TÌó[ò>bQ±0µRIVY>û«N iV¹ öã°~~öeÊF“.õû;-ó˜®yòÀ%Ò¼\8]énq\ÑónÏÇ6uULü‰Œ—·’BÞ«¢!5ÝÅjL†)û¾Ê]Å‘rTý=BWeŸ¿8H¼ê¬öÿžÁoyí·2Iï±ovôZ>ž%oŠ~€DˆîШ½t­ÑL£ã›‚=bírÕÂÝø^Ê´¬´ÄÞ4øCŽ·QlÖÚY…Zì-Ϋ²P wEå˜yƒOÒøµ èüEme`©Ñ2Sg×8ßlªìÒG:¯B±^\Unõä*³v9sf[s*skÍ6U®G^J²ÌdÀÒ5È7›¬ÌB³Önªûði£J'ãSÂwsª/k=Ñ_ÏX›uœHsæ`©Ä²‘wËpßì)*g›ÁPR…^z§Z;õJ-*êT¹µ—Íæúu=bͬú·9ß^Ûv¯]»‹Ë€`1^£:Œµ“ªÛ:µY¬®×®ÍÌ™7—µž:¯µqC¸hZ»No9cÙˆ½¿öÁbQ±'š-®caíZk÷€ô¯ÊéC½vmNNUùhŵöDrcc©Åbù5ծŀnô€Å^A†uf­ÝkÚwö‡Š·ô$59VV?¥ksl*9“õ¡.<‘ÜØXJ±,Ô¸yç¹}a¹¢ýóرn¡žØFùC·Ö­­ZžoË uü×׭›C4§›ce\[ÿ¦Ño÷ÖöÌûÃ34¹»¦÷“.8éðO¢T<0q*iޏ =‚ꬂØ{ô,,J?7eˆqmO“+OÅzýúþêÏôBd& •)‚`âc îZ¨½¿ö¿äfA©ô¶”K®Tž®ß¾G@f/EFšúE˯-Ö{¡öþÚGüVÔâ“2ÇMí´y|ö’õA¾ÙÓkÎF…gý¢´×ÎÇ–ƒb¡öþÚG}f¼xêÉœ¯vÛ–cåb+U:6<£›Ã+¶ùPm²^;[*…Úûkôé1XjëÞvǼàªw¨„UQ©=ƒaŽž"MeÏcz­lìž+µ÷×>â7{Z™yr³ÜÎ,Y½.oV1 =ƒ,GÒĸGOPÒùÕmäܸR{í#‚¾\áOФí8o¡Ÿ_½‡gbí4x{DeMMÜ&ÌTºð±åc¼NC*ss¶P/k‚§(úÙr °ôР4YÐ1Þ¸sSú<Ð<‡UÒ¦…‹»‡èEì=zfYHeñˆùµƒÌÏá·sÅFþþÒ#è ©$ƒ\¿µrñÉ ¨{ßÜ‚D~ÞÀ~ûê«9ýç0óŸDáªüÍž£²­ÞN›[uyílÜÜ ö= ‹ËGËÃÚ¬eg‘èÒY$ G¡ë’îHº‰í\Üí XêŽ5ñ*ã*ÍÝØMaÓ™‡®ð¢šG]c§"ÅEÚ>‹fë ¯•ÍD¸PëêII/òK4€Ûf‰JÔ¿cytKóôD=T›9½.R{}Ò’Ø`qœycG…^ÍZÙšqŸÄ¢Ê‚~L¢8ðihÇ8êkg⓪kWܧ°ì(Ñoí»¨—>¼ªW뫎—êu·Ókccuu B‰?½”XaŸÂ×9›jhì@ÖMÏtºë8 òß•4Pýø BCUº»p¢üÂ*Éó›©j)wý×mŒøÿ-cÿJM…Þ JI*&³ä^T…„­—JÂêï_4XDùN“þ„e/¾)©&Rï¯}8é™Z TátQé}HÅô4ê¡svì4RO]¡gšöîµóqSVMÔÞ_ûˆ]ëä GÛå ¥›î¤¸â¥*rƒö¹ÓpŠOÍ¢‘Å3?„²ù‘M{Es¥Kd1ý¾*å®}ò*qìµ;¬(ÍrÂÖ„šDE`#µÔC°¯)ž@Û‘^›k¦õþÚFû¦©JÔ‚;S)a(~âk*%¬Æ‚ÕN#(Zß¿:ÉÍ´2±©¯äºAZïÑ3•ÎL!2j ›^§ »ÆvxM¥„ÙÁ¸ÓØ5Cdˆ‘d™ÙiGàéÆÅ¦½b^PQ{ž©”°émÅ}¤úXUÎ,Ä>UV³[ì$œ‚s¡ˆIŠc^‹‹Uyµ{í~S{įH¯8k;éy´7§BÂêÉJ- N©Ìý4µêÊǦ½Z¨½¿ö©‹z*¿uB;ZX-‘t|ícüYÝÕ¬µqü».hÑ!¶RoÞ•GÒÃòØ GHnüë6Ä®¸ú[‡¾]cóï ‡ÖˆøC¾‡À­5ŽB]µÓ”9è‰nAxQ¼ž©]·K’ˆNº®ÎåS$ÒdmiG˜i+,vGÑ@¦— ìLŽÆ0›ÌOXHl?ýÚ†ó颶 ¿\_3)i©ú@RQÅ¥4íb†ýê¦W·µX’,*Ÿ<Ùª¬ï®ÛP„ýý•¦Ëj¦¢ÄUaÐd>¦ai FåF› -–~ÍåÑó͈z¦2iý 9¿\S)é˦á¤/“]%÷L‹2’xåÖî%ï•r!&Îè0„˜ãn×3Jñ9 -`c6&M7ÕFMê²iD©º\½îNkgÝN*tq)ŸA¯•> !ç0×ïmÌ8nÀÃüŽÓ=µ‘RyŒ£ÍÄ­'‹/’ÓÕY¥+#¿evÐîV‹íO¯adA‘‘ÜØX.ª…Xíª²1`íj.^®4‰¨ŒÖ0™ ÛüeT‹n(™ú"£þxåÂE|Ô1êrQZ}Mfå·ŸÌ,¦Dâ©K£‰œ*¶S¸Ky<…e¥Ó¥ šèªÚŽêÛÑ¿Ü ×e1‰¼zdˆ¸–pkŠðúkc\TÿÀŸ®©ù÷þïð™[Œ˜M–5S7šû~M­ ‹ۥ횎˙FU(&µÐížZÆ–‹4Æ3Pƒ©Ý(nõ̤¯n3Ñ]µ¨Â{ÚýkYý¸ñp»¬Ù:Z¿sd³ Êãè+wÄqÆB=%]5¬ V:ŒvŽb•.ÛÝU6Ÿžm@Ý?A‡c–ÌMQ«2›é$k¡gc1/öÑ\Ú5ì<ökl¡öþÚGüÖ="Ãy ŸÎø(½~1Zq¶ˆFœ¿3iNmå y÷ØBíýµøÍž¨C<«¾d·À…5™Ò»È¥ž…ǰX2Esi·²óØï²…Úûkñ›—IÕÝå#u/ÛÂ8¢£)l]êYxT$ÈàÉ/>\Ûe¶P{í#‚~·Ñ$ÍãA©¤. ¯ã}Ü¥.õ,<Û–9®Íþµó±^fQ7‹è˜d.Ô’šÄ®ß:ª%ÕÎÀ2ÈŸ»Êöã|¿!VÆfV}c䋪¶â–ÔjOžÖ]Ç7ÚÔñU¯ÈΣßH*ŒPq?ìû]ø¿sν.ªÿµ³?=l¡ðN­Šç<Ä“b§S‘Û{UîÏžëÊz²tÈ›kÁïÊ Æ7eKt£djÚWJGU#´·jªNØó‹–KÅ1&> JÉÏrtÇÕ_;ÒMÅwœŠ“(I«>¢­roÊ’ë¨/§´ºYüÈÅ#öúpÊ uÚ‡¨4íedD7†Be½F{ äÉ)#Uð‚2°xæL7zñx÷Ú?þ_3¶¹~‹üPXÄ©ñü¡¤NÌcßTÈ]%'•±¹é#G%?GXpP:$Þúj‡¾â‚‚còV[àWUöbeÊT1RE÷lZ{ÛµuZq6Ok¹MkÙ¦µlÓšnÓª™¡iêþšÙ5­õÇØnM†wMù˜’ªµ*69¶žóÄ«ò[TfßFj]…²Ø]í‰>"‹@‡ÆÍ¯Ê<]€ö0×'i¸Ý¶öÜmímK¯nKoɇ&§˜Æ^ÿWz„ÔQ‡ù \IΤ¬ý©D¾Ž ÜW§W±”¨3©‡Õ+ ;*ñUèÕHU´Ý+sÌ~TyÑÌdÕ]”ñõ²}†I¦å4yÍÓ•«ôüQÕR®ŽJÇÝÞNåš%aÒk–2íÙ•¥*ñc,mWuÈ*âÖËŠÄ\òš$ƒÊNåµ2ba\gIJOÕO+|èÀsÑæ„Sttxºm·´øvüÑSLõ׉økÆÄ×%Ù!ª×¹L» %Dh*5†YJÀ+Äû9Ünoж7hÛ”Û(Ù~Šóg›Íùzì=¼BV¦àüCr ‹Ie¡w¼¯—78êÿ­` ÆË¿f@}ýßHç}ea ¬¦çô’S(^R¿¤ëÙËüȲ{hs)'.<ŸUewTµ 2?ZÁNÍ žð ò íò£ðýFwÿ×–*’&ïSñ§â[& ø^oùxãê|y8OV!Ť\¨Ò1-AåLÿŠkù[½©®¦¿÷/¸¦¶ç,×qÏÏmÒ{ ÓóPáFÇ\4/ÕFé}ƒØ!®üˉÖa+æ¤÷(&ÇéFÇfzí|,z«Úòùý©gÔnPÛ¶ÜvÿA(½G¡1¥MÏ8ÖÍôÚùXTWµ…Çzã±®ó˜ê6e|gUÈdbeÚüŒSxxªâqácQ]mÔËþ­YÐg¾¬ZZÛIÓ˜TØ=ßìé>žqq ‚ðZ¹è[$¬Äù©Ç-gyZµ””Ç]¡(½GÑ2I^+ƒcŽ™¤c þ’ó½ÒZ8Ô§Û¥åõ¶InmúÎU4Q®À…Á ×3Ny:Í•Em¥¸–N­ó˜ú£ÇL=SÓ_ßYmM"#Qz‚eêôˆk#ÇzíL,:«Ö Ÿ'1é.òGëí×#ºèÞÕ3þ•Š£û³ñ™ã,Ÿ®…øÚïë&¹ E·ˆÊ%²ñ¯e€-.óïô÷×dÿY~ÎÓ»'°‹<ÝÚ±²ÕöÚ“Žî÷ô;Ó áÔSz§»¬7+ ‹£çBLÑgÓ€zÕ}ÀÈ.¯D™È~Ƴ¿ß±ßa¥;¦~?7ì%æð•àƒ‹ÅWv#öþÚÔÑÑY.jÖÎ:êe9©©W€RÏТgF@ hê<6>ãÚûkñ›=©»©ž”‡~qèäŒÊ8Y\¿¢ìí‡ï÷Ã!«~t¯Ns´l|,žÛµ÷×>¢è7iz>ªÌ,9Ž6¯ù$1Q=S@‹ž- ùñ,‹û»=Z­wïèÃ}3Ò‹®)yRÔÞ¬£ Qpý~ð²¡çLY^yˆ†×+ ðÄÅͲ{íêú©º'U'4… ÙK¾0“z¦h=3¢YDsD³,|lÑ,µ÷×>â7{š´²–[©ø^ÝŠ…ìÈë:Xf?UÏÍ¢gF4‹hŽh–%šÔÊ ö=}DÐ2¯˜.¨ÐK.¢Ýº{ùkÜ#–EŒXÐÃgf,ËÆÃ6‡ µ÷×2Ü7›I%'‘CÌ+ÏÅÙ†Ò+(½°UJ…Щž)”EÏŒXѱ,ëB\©½¿ö¿ÙCu& âX›…þEœª‡ör‡ê™‚YôÌf)TÎ`–u7GwŸÌ¢ž>â7{¨ø…S$ÚÔKynž ªi±W?TO@¤qÜ«“d4Kz­lÄíL Ži F4Ë6 ÈW±˜”ŵE=…Ù 2n±×RâO¾ÙqRr$÷o¯o´^,A!a=”eMÄ™¹夬ÔtjG±ËšYêéq"4JŒöj÷W¾^h½ƒ§[üˆdQOPä?›&,IKÖÁXÒI¥«…}t =’Eˆ?/Šƒ‰´œ…ÖûkNÔ»ïlMb¨ën{œxÂu‹ˆºÁaî>Mý¥ºÓS~­l æÆGž¨½¿ö¿*úä߀­Äø=´eåϲŒ0Ž),$¾v¯ä“Í1û”JYR†ò&“>*§®Eìú¨Ôcü†Æ(õHNê£lØæ/’`ã ©ÔÇBJIP&òÌ’2tGJ¢2tKJ³2飒§¡l¨‹Ò‰;k»±v(ÉÔƒ?¨£ŒX/~vè#Ë©rÐW–”®<ÊÝ0.Ý’R–Lê¨ä•_y(Œ’/£ædú+Zw ¹¾Ò¢ŽÚh½¿öñˆBJÕ’²¬ìçózª¤Ô3©¤ðŒ¿TR Y.ÔÆÇ"Å&æUœ”Rê™´Rv¤;Ý[X;^¾ÒJÙê¤Ð®ßÎÍZ)=3´R¢9´R ›Zj£öþÚGüfOQ1S@J_F¹S®ÇòCW@(?Ú¬”ÒC)%ŠC)µp±)¥Vbï¯m¸oÞ$£Ô.¨«~TRvð¥~Pr¿E •ž¹4R é/ÔÊÄ¢Úh½¿öñpô Q!ewݵ¨Jæ@Or—¹/†BJ …”è …ÔÆÃ:+µ÷×2ˆ«ü’RÖ¶‘B*Õ‚ )õL )=3R¢9Rë\©½¿ö¿Ù“¤€"ªÿ#…T MÜRê™Rzf(¤Ds(¤6>Ö­lÔʬRϤ²¯Â¢-’'àG)¤R÷& )õL )=ÓR"9R ›Bj#öþÚù"Yý6)¤ 2z‚ )õ\ )=ÒR¢84Rë½²ÐzíÃ}³gè¨ÈלÚaÑH©gÒH%Þ)‘©•‹õrއ²×t”z&zäÏÓ4etX¥J í®SÛ¤’Ò#C%%’C'µ°±é¤Vbï¯}<‘O]ß“H.u•&$õ'\ç0u Ô`±kÍœXL]E”_+›Nj£öþÚGü^`{}íJ–Kí2× Ìº×>ÆŸ…õ3ÀÝ1óŒ©O>cŒ×¼Ÿ1Eßó˜óÈn;ìîR<'kižÛm@eò±EA5“’ôqE¼K4bÉ¥f¡æ‰%C{`zD™ËC³>­~líš/bóÈ‹BÊ~Hàï;’GÆZÝ«T8òÔ-sŠ3—šfŠMÙ+šþß2Ъg¬ÛEsæ`ÑCm¤Þ_ûp’r$÷¯®WæRãö¨ÉØóB}Oµ+çï{(¨¦ðtƒáSJßõ’êrO†1žÀ qü×®­TæCHà Èü ÉÛÙøØ~ñÍÛ©ÐøË^ïäýåE4¨çûö{Ú~,¡éÞE>0è9›Ê”öÃt¥7±œnì9Å(V"émoù:®æ(/uŠëþp‰Œªé‹Áèç£ÃÓ8Ú."l´_¹§¼;¡|Þb¾V5åJ+¿i"è£Øoò=º°æ ˜“‚­ã2 #½ÃŽÀ( |â°´/l{oeb¶}m´t&Ç6†3ê‘ €¦ŒSågV4ÆIƒªÖ9Émê8bìéØÿà¨É#Âú5ëÎÔ(ß^ã%µ1ªŒ(δKc;¢mªv–ü,äGD¥LQÀ”Eܶƒ¢µq^-L¬Ëp¡õþÚFûfÅï ö’ ÿƒA:U˜Yó“iÝä3…=ع–Ø•Í_ë>Žyz«©‘¾9’רY¼D6±_l8=Ðrg-"J ‹Dd‡ ¯AÑþÅ™3ÆoÛ!ÈWé”ÞWFíâGõV´«Jbz6{¹ïй³£™]§PÅoÒ•ÀvÅÁEÞî‘È`APóÃ¦ŠŠAô‹*›ÊM§ÄʶÃðP=ö¯.b=cÿ–ö$ÑËëM¼R{í#Š~Ð$b·ñÕÙÎlÇ8•‰=†»tëû·ÑÐ4¶ðÚùXÑÌLm¨¨Æˆ|ì…+5ÉÒ—l‡©Væè4ì$ Ê‰•øE$ÑN¯ýfƒ×Fìýµ×É÷¯¯­ù_×ÿ¯üŒŽeˆ£ý± Ì»†jÉäd‚FÚÎ÷¥J„wŠÂÂ݆¸20ÿ†þ•jˆ÷GÐÓK øpQº<¹£YÛwÓ–ï*(Oh=ôORc¢†Ka踵Q kæáƒÊë·­uÇp®+‘ê”ÛÒÚÝÖ†"ÅìÇLn©býÔi„Kè4»¸°ó±)¢&jšÄiÄ44JéÕͬýžh¦Ã™<Õ~~õÂý(ø4¿;Å…ƒM%µz­Ãå®T:¤ˆBåÌT~JmiM' S[ª‡`?u½O–4^"å…ôÚ¹¸i¦&bï¯}Ào©†dQjá“Ò¦ óÐѺއÈõ»…9æ­'¾:I kY}666Í}|Eì=zÒ•ØN3Ò e)m²”4æL ‡Y€Šf1sD–®’â'' E¯å$P˲ð±é¦²d P{žt%¶„ˆx@±¢©oUbKhu¤Ô‹p†Jhé}šà·“Þ'é \¹ØTS3±÷×6Ü7UCY’9‡=›2“ZZ›^t=©¥zö£h 4Ä74Æ¢MåÙÌŦ™Zˆ½¿ö¡gJ*iì–ÿü¶"áö‘_ë ùO+¦&¥Ì®é™uA–¨§+ÕzÏ·¬ ýY,TETÿºsÓMýíãßÔS›‘ª«§Âô zR•.Iº%ˆ'ñ-Ðݘÿ±µq"w3Gï‘áãð×3°Ìä‹&­?ÕSZŠ$–»zÊi§¢~R9ªR6yOí9PZ›ú)¬§Ññ=L"ãÈÇñ"¹¼ÒêÖí'š4T>Ìô¡@Òo*ô_UÚ%*oBa3²— çØ#sˆÓo¼6Ò«¯‡E²Ø¨IC5(ýWÑo¨„äIc ÅÌ£ž<òxU,"Á]ÏÀd.šà#jÔMIkÊ ö¦Â «y·W'¥™ÔIhS/úöÚõOä¯r™è kEð0¿ã$Ø‚XèĤCËi¢nouˆŸ*Z¢2 D ÅõlC¶…F£·e­¡¦‡XÛk€*n«¿ÞoÒ €Ô %åY qè ¥6:º²ÌK$5g[¼1ßÛÈš§6°ÿÚÆã»“Úò*‹>å"$H:„©¼ í…LuHH”éd(¯_Báä¸= ³CGaàvæ¦ ˜-Šà"Œ1”Ñrõ7UdëÙ™Ãð ç%4Jó=O@sÙ}AáÔx¼X0ûèƒt8ưAE2(‚‹>fÜæp"F§áÈ_déFSÅ®$+lC'¹S%ƒ^o”º+xéøL°å;Ñ\¹X—ßJìýµØu^™=T3$.Y*Ÿ¨¶ l{±¨`fÏ7{øšàÖïApcbݼ3©ÖÕfñêé:/1”j]™$]¾éGô‘ûKæþ•ËO,g‚qÛErcc=ÿVbÒþ¸…<ôoRÕ8¿i“ʪmŠ®³Ø®±X¦g¬:M÷ÚùXï‘•šx, }hÀD/I·Båb‘ʯPçìlÂÕ#÷#\×±ÐôoÇL»h‚8½ç|5?¨I»âüLﮞ*ƒxl2 ÍQ+ÇtõˆÇÔŸ‘ Lœhn|¬ˆ&¤1ç­tCé/ $©¼ ´¶¶Tb8F©áåêén\×#ÖÌé"¹±±è¨ð¨ĺ’ÊÍä=Ö¦tBFßî4YTg&]÷º¨þ!|GµòXøzáÌO¼^õ9W/§Ž¯»Ï’>K}œ«Ðý¿oü_áûÝiêâMNSUxÚB]§6Ü \$´ì¶ÙÞÓ•HÂ÷#/˜\ÙF^°¸ñ~Ç÷½Üe’›Hä^æmˆ§˜¾CŽ\:3"E‰†õÿ5w€_ºtê?„¡Ùê4“Â0û¨Ÿ¨½¿ö…нЭOD»Y ?G¢KZ½L¨êI# ³?Ó•[¤†òkçcCù µ÷×>¢zâòY:²áÜ2#äÖAt” Òá;Š>äèß«—/íµó±¡ü…ÚûkQô[GÚ•88è­°]…6ƒ€~u(kéX:ôR÷‰ïÕëuñ[L|„éOÔrw[# ΙG6 Ç™ø·]C°ðNÐ]FÚÞÓ#E¢Èêð/‘df|í\lp"æ»ÛRp ö*3²óDÄ1½†YÖA!fÇIdcù!ø £0Û«Óİ8»g6ÂŽû'j¥»-cíM–b N%IaÙŽ¿¬#3 ö§53 ¯‡ÙIö8Ì ø')%ˆÙ{&[w°dæ/ZŽ ÃdXÜWÝô,X}Hß%T>ÓC1E±GbîLl¸!öþÚjOÝt…Š…‚;BÙ­£j^ºÐ)4åÕÂQJŠ=sçbþa„mRvROP = PBócÛXÛ;ÄnL.­cÖ^æ>v MAŽY²Òn‘É‹¸#ÿ‹˜¼†«ÇÉ‚ ÄŒB—[d±í=i¹×#IEî;Ť"÷7Ô?h¥Î_Y,Þ@»Bš–‡À/–|Hòv½¶÷ŒL>"µ« ɬ×+~ŠÁÜh½¿öá:ZïeA› _Tcñ««™=W f¤Ç`v’=sãâ†÷cÄÞ£g2yèú ßoÀ—À¸[KÇö°Ôñ’©Ç\ê+$Í¡o¯•p?÷ßv³ã‰|îP]Oojjž°þ©'zf'Ø0Wܬ{o(}P¿\#÷ö¥žþE ‰{í£üY“ôd’ݬ¼‹a²œ“Tïùr õø€›Yxr×\ ÒãÀ¿t-ÝÍÑã‰Ì@c²lÞÞÓP{ÄA€¶OݳÔ)ÿ«\A)ÿáE{$úì,LÜüJ/Zï¯}¸ÒPÙ“ªbØlN¡¦Zº_©¿z¤û¯i<3l"9¬ã7ÏÒ‰šŒÑu¦Oóq”ù¸Ç ™—RPi«õ¾û–†2z¨[çïi› !@ôvn®¥á".sô4œÌÑIæçæÙ®2Ô&j½|_›â¢Ð#ź‹ã™a ÍýV¿ª•šìÑÓˆ2w;Ù»“ŒÉår?EÞ±V·u÷לFTéSÐd?aR5ÑÜùØœKjï¯}D¤›,àIÆã¤ghC/Ãù´{—R¡¯Yú#þ5 "¹³±¹—.Äd3Ÿ”½›ì•t€7dMöAÖe/ërí°˜öÈEõP,c&–Asçcs/]¨½¿öeñÎ…cËdöd*gdí#ÉÞ,ÿÒtY ¹]¤ÿ×3Ã> šÃ‚0Þsñ0]¨½¿öÁã¡“©Î£ºÒ‹Î5žŠ)óHó‡înôÈMµögÀcÕ·)¸À7>6Ó‰OyÄÐíàtEtô°|?…í #×’WÁ¼¡rW¬µŽg†•@4»Aƒnn¦šr#VÈb¤Ÿ0{¾Ùã»ß«qÃ=QÙÌrLmà 6¦Ñ#•»ÐD 7 ³$}8âæfJõ=hq)&cªã›ôCćö!wÏ~½< _Ÿ ÷2zÄ ùù mƒ$¹ðcЛ¿©«ƒ8ôò& ã#{}ÄÀ0 ¤ÍH)m¹ºÎ`÷OÊöÉav@ðµ¿ÐÍÛ´ âb/¸‹8:\÷~ äæÐ!á4qc÷’taôtU?ž¡u  š7_Ó‰˜Â”§j\Ås d©OPf“k6²ˆÉг«gwW•giw.nž¦“g«8œ‡ê(jN‹8L}ò4½zºš} ÛÆÃt´§Äg53qEËSoò„z¾¿¢?‹w-IvЈ Öáî-+—©–K€v:F0u\€,j=-]=' »¤}Æ¿"Rf‡‹¦…˜Y£ž4,Ñ90^œYJ9¿ô˜{=•‹Ò?EKVç—{ç§§þã+ff7Ä, èù©ØÈT¤åõŸÿÏù›tXf¡:Í•å8ÜL)Yn.hÕ“°î¬ÍUtµ4–£§äDóëÕ“ è'”üCÍ£œi\¿`Tç T:š¦œÇÌ5Òž1õ l,Ù¡~`Ö žI–oš×“Lõó¼"—ŸÉˆ®Åì$Ò´ïvµ#}rGO‰‘ fEΟz®qÎïwõSÏøÿ/Ÿ³ Üb –CÿZSÏ÷Õ£¯ñ}=uïO+Á"^-6U¿:ig«•éççFOç)êÕ=ã©f»ÿÖ¾ÞÔF6Ò½g<ó_ÙD'Ë|’ÂOßSOEN•ó<8¶µ Š|Z¾íòhÿüÊÈ5^®_X\ŽéÑAajrˆóÞs½^0­JþÔ“k#³–¿8Õô©çzª3ïÑèxézÊ{f/Q ä÷ÔcékÎû¹™¸…OL*A›<š?¿¬žD3gÿ©ÐÏ‹êÔ>”½yôŒïQ]ïcE—ÃI÷©g<ÖÿÔ£±mã9Ë4Ö8sÓbícuŒgî=Ó /@•ó½PŠž?æèŸ®ÔÌ3ûÞc¥9à wžçEï>õ\Sf£ã¤¸õLg¶•Â;MYGÏX›ã©{Ï´ZMvu:Ž›EÈæùP=ã1“ôÚÇŽþª×3·ž±ÀûÐ÷Ž>×3£Ç-w}¼†ä$q|ì©Ý¸ FÏõ>£‡ yÐÔ”_3$ÕIêßd›5Ld1«eÎЫ‡gh«ÍVÇéŽƒÕÆÆ!ê%=¿ðŽú!zµû!:zÆ TÔê÷žë[´ó¿RþÔsÍ´qŸê§žé½(õ¥yÖÇè¹¾@êÞ3-Mgž)w$Ô5¿>Äè‹È…æÊ{Ï86ÝÑ<¾ß½gšµÈO÷žé ug'rDÍèwžÎEØŽ¯-æÎ#î$ãõ¯žñbÎNšü±çz*#ˆáCÏÅ4FÿØ3-^g©®Jä‚@XöÙÃ-E%|]ƒöèlÃ]álØS˜0ù\‰îœÁÊ“ÞÒ庆¬çõ¸ºÚðÑÂì¹Þ°sqï±eÁ„ìÞÄòô©gz*"ÎéCF_zÈŸ¥Æ²…Ôù·ʾÍ/h…¦qzj¬r(× Î8‡?/ή¹ïïsïÑSüi¯…o¦‹¸¼‘¹Ùà­Àøgz= ™¸òÖØT¨ Œ¿Ò”®Ìz®#ÁÓ#L4HZ5)75ÑAÈ™Kœ¸{ÏõÒA)vï=%&•=燶œÍ%ØOÞX,ÛF¶TS¥F; ^Ô *ÔÎ\œ…FbãŒD¬éC¥í»3†z4«øªýËõà'’-ŪÁÏlÌM8XgPâõj½Í— öLë¤Á¸ð¡g>ŽBÁ&wÐèàtÞþA§ /˜Ð`á™® hÕ3Ëõ‹è0Õ¯ ÑWPïÅÕC‰‰4/ iŒ:$&ò•¦_m L£Õå¥í5í"r‘Æ¾é” û:Õq] ý™{Ï|6Æ€°Ši7Æ‚4ÄÓõR¥œ ¬éøâjw °ˆô¹Ç´¶®±1ÊiIô(ÔHù¸Œ­žk¦úS÷žñÔ91)A?M¹åZ]@èè¹Ð@b“O=\OÝz.®ûèzÆŒŒ§®•Ƽ¦ƒIgû¼_máÇÑ3½SïÑ÷í4û÷³Ðñã5ScÁlsÇùÌL¥y-´T™ûozN=Ó[·ö£~ì¹ÐM¶*¤ùSÏ439oë©÷ÌL†¾rÁ;үΈ'gzá]/b²W\& W†}Ÿˆ)ørsºaUr¶Ù X¡¦"nÓÜàÓ×{ŒFcZ5Ó{f«Ôè.[ ã°G»*¦fô\|X­Ýð±çšˆÜŸdî©LKW¾\™½¬˜[žÕ*Ì h·’1¡Ç„ õ|sNHË¥Š óX—@cÐh[Œ)Ô등–æùÞƒ·¡+JZŠÇëR=ºŒë#^g~¡Ñgº ³õ_¿(…¢‹n…Ñ·Bï)íÁ6|ûØsm­{Ú½ãZÜý™{ÏuXf+åcÏ8t·žë=ºÇú,ô[ªÏÓuõ™¿ÐLë"Íq“m¬ž2]óóö©‘)®EÚ{®i¨‰U î=×®¯þ}z®¥Ñݧžù¨µ²o,ªÑ£EÕæ èK¦Y|v™U3·’Inçý!H‹j´Ç¢ê=o 6ŠO=×Ços‡Þ{¦w÷÷ždà¹ëîzk´0/£Þs­áþÔ½g–vÍVÝ–Ó9ÐDp;ýû¡i¡ 5\‡f«,Ûtš­kơو‚ú™iZ hàtfŽö83{Ï`Ãç˧žé3Ô:ô0Ïy?3á]¯3'Ê|fZ÷ó™Ù 8gfÏÂÑÏÌÑîgfï¸NHLóÇžéÌô–þ¸Í@úêáòî‰Ùúâ¥ÝÝOËÛ›j"Ì¿(Ç¡ªS»/ïÑ3NÈ“òä~苉¹ÂʧžqŒ§î=cSÐð?öôezqxë§æÕÃSs̃ÎÄ1SãÔs9~¡¹æ©y5û©¹|2°¬.ÃÍÕ#FœO?&CwŽcb¤!´õb¤f¢p1Ò›#ê¹v‚;(SÞ{®¹?…þ[sú}@!‰[Çd°ñ.ÁGjZŸ£GëÓ4A“ç]a*àk}šþ%\=Þ4>T‹r}ŽöXŸ½gìiïjÖ}·÷\«È™³]øÔ3=•ëý¡g:~ùÜ|ür´ùø=×nèOÝ{¦ã×{' 4ftôhF½¹÷MÓe®Kó|¢nœ›~+ï>Ÿ½}ͧz®ÝmÀŽ=÷>@ó¡çZRý©{Ïõ<#4>õŒÙÞz®ý>z´Í0×Ò<]›Ìæ*Ûþͳ6ÙhŽM¶}fëgLð%{žTÝE§0ô<ýµ/¹ý80züг'Àc7&µ9{ÀC„Ë©$Îs¨}œÁÌ ùùÌ„Jer.¼à8tÔÐi0æÓ¯Î1qÕ‘½$ÕÿyÒœÀ9ÖALæwPŒ™uœÎL8w+ÿ‚™”iP¦Þ#/C^,hÐ>IÍpÑŒ!KSá€z¶ûŽ×6Ä`#;ýE„ùÿÞªæ©&³ã>ÙN²Â)õê9ŒëŒVNI’ÁJE>ÐNõwYi,fF“ÀÏ ü@b•“lå5¸-n¼wVÎí¦¿`¥±d‰þ&'ñ`ØsuNž„ñôq9Ð|¶¡.äÍÝx¬¤¤¿Æ ¨ÆAõwyQvõФhå4D‹Inƒ¿þÊ}º˜9Ÿá_03“½¯–O;h_ÅT ‘Æ ô³#°šê³É‚ŒÕ¼¬ëkµ³–¼×_°6õ¿=M!Jø.ÌÓã<‘%%š(ͨÈ1¾ñ>XIAÁÊJõwy±º ¶nc=aYÃ4š) ¯Ž[û8ƒ™õ̬d—–~OÕ Å2#3‹¹¨3‘‰jlÆä>Ngæ¼õ̰„}'ûÛÌT’ΑÐ!š½ƒgÇÁ“4ùç/ÁÜ<εÉó9&ÿ’&ÅÙßeÆ2:žÕV Ά2uÒ9²…–€hAse}0R½þ‚‘…äïòQXŸ»VÏPõ“LcOGõÙ.ˆh‹ó7µPËq>Å¢Ó¦š=—9@ð~³_|’õz>NÄ´ð†Í8* ¿˜ž•‘ßÞ\Œ‚3×:ßw²ë`ŸÇ òÅ6\ûŸ×ÐLò¿±Ë+ó«:—; 4Orôx;qEÈÌH<ÂqrgýóÞÚ¨þ7.0 ¡26ÃÂÒìŽræI–¡oÎ5²2ãuâ,T_TŽpÆõ›ÞÈX¢)Ï»Ê`lSú0¿8ˆgª¿-n¢B+ `®c2…h83k…³ävú­ÃüâvTrºˆTè‡{¶ œ 1i.¢úÑ<Æ/®ï™äýãüjB̬g+0Œ`={ 8é4s_´ ¯¦˜ÐÇùЙÉþ¾ŒTŸ4¡V/zÇì’fåüp–&Ñ%yû8¿€€+ÙßeÆ«O5f­ä”у‚¬ð‰Òi®ãÔ_Aã™ìCúe50—}‡U~…gŠø@â´XeG¸Îqê`ÿÃJö·ÕÌ­àr?[«™ bœKúAà&Z‡ù…$ÅʤúîíUÔWc. ˜4Å¡ãå`>zg©Š^+ï¿’0¢ÿHÜý‡0ý®B5?ÆšØ-î²¢ íL¹Žûó_‰;퀡§9¼•¥>¼Ð¦ý<{œ ÚZ é)ÚœTª\YQ¯íl{ʤ51“>zâÓ`,G9‡Ê÷ýÿçò÷kôÿX–ÿµ5sô õd ˜Ï¦P µRo‚ÂùÁt*‰s‡…Ò 0@ Pªéסt´,Qö¸L-ØyÇâ¿áËDTy>•²Ç¹B9˜ 9£ o·¶—ƒŠî?Àóåz#Ôy„O<Àëˆ,Þß*p˜’Òùß¹S CCN‰Jz_ÄÐI˜.(†þ`EÞc~õPëz Ø’(va…òyÝŸß1„þ½KS»°ænC’˜ósfÆi{Nm°HmKîãOX{Ò )ðñ&̙ಥ1‹@‚ àÕ Y ™%CuAçîÁL8Á´s^ðëœî`q`ÈTÊëÊcÉ=+æY1¿»b˜Á*ÁtCÔø;Ï"úï;Áü¨¡fÈ¥¤ƒ9C ñyBu–{»9&JLž~8Á"‡Y ù¤Ï‘qG·RèŸùš‘npæ’ýB“¾Ý…ë-µæK %Öá7‡‚ØÁ¾$DBzÂ`ÍgJ }¶½þß›pb4\¡™0&¦d …O¾`Þ Á<+ÑD¯³)—ŸÀ/ˆ€ò²†Àg³ çUl=×cúŒx6éeg¾£H,Ã…Z´PÁB¦óæÙ“ÅT¶ *,æD_sé°Ö—õœ‹KɵO>Ïñƒî*O~îPÇåí±š¿mCäÑÓl–>.*Žœm}ßh4 ‰‹—Cð³ÇÓ38 WHQÑnŽøgê lKäy=·]”ç°rX†d¾HèÁǦF,)³äÜ—r°N™n‚©ˆà(à¡ ¦—Ái´C´Ê]0Þcã Íd…Á2µÀ-¶ær &D3 3Ìêæe´=?u°3ô7®Z~&ÀÑK(2ñV°,¸•±LH°À'×QcãpŒpN™åžƒY­áyT°}Nf·FÜSEœn0»5Q m϶ԻF‹GŽJmùƒeÎhÑPÌovñá½p¶w¶‘ôݘ ¥šððCO¢ª4övÖ1G&¥ð9LÚÙnL8îÚ„U½ d=ªˆâ£ßdI ”žíÊ"›ñž¨ýÐ$Ÿ=…JɦºËçì9v a¦g›9)Msh{ÀDÇ u]Ò»ÆnuÙBƒ+—Žé…3u[ç fu–âæ<ÚƒEÝÑ¡GF¡`æWÊñ‰†%,Kfå,G£-•†lÞ¡ç°Á”C–ÞËUÇÒŠ!ffKv Õ!FF=€³§à´4K䤒L0ͤ)“½ù$î öæp†íl6 SµxI9XH•©“½åï¶&ó3"€6öhsîƒ xgO“g t»Á2Ò$‰kY»Ù>¼]a^'R£ù(G¸L·b<>-ÞÉòÁ™¤]içí‹t§žJ=\ËSìcÕ‹äPã¼ñe§)¬‡ûÕNDÓ3YOµs5 NôÔÖÏát²Vqë£1õìÈ(ÿc£ÚÕ›M¨D»ð<ÍTCxjúpÔ#w^%—qmZ6IswíIůE=ŸlŸ›€¶l²HÂn›Æù†Õâ¼ðÍâü$8̃] vïz;Ä­™È“÷4¶\\p¹Ã2 ©ðË`÷*òðžM¬A@$ðpô ƒå-ƒ#¿×o3 q°Dyô6!HÇA&S±4P»"i0? /ðy«…J3Ùy)e”èdœrºŸ•U¼ÜáhÈ>{T ªÁ}æl¦²¯¨pB¹‘‹2Ÿ…¶RßÕR•«¢Ìy3Ε¯*^à(Oà(ع Ãǹ­øŽsÏo-ón±Ž¢Tòôr´ž#3ï8¬e×5£V&ô>G1#w‹8’/TºðU¾—ƺyÙ¡mVÍJmîô‚y8xÙi$pšôÉF¢±­2-ÿ9Ç…võ ”©ÑUB¯Py,"KöófAO€!<˜û+ÓÙDó»A(´GâqA:ŒèVw ˆYo¼5mÅ7âÒÚ%v$¼<ÄŽŽäŽ$”¸K\ò3Ò<—Á‚D;V-ª¾ï²¢¢v¤X ºjjâ.C¹X6H‚þ“à÷ Ò˜é[Ï˯ñfjNHÕÂQ®üæ¢ç—0ìÀ]àÆCa.ºu‹øäÅNJO~–žö_Ü(ÌcŒZ±çꇬ`ÿ ݈H¹Ðí¡ÃÒž-Lpi É©ôã•ð8•wqü¾™• $µõ?¨ÿAýêPÿƒúÔÿ þõ?¨ÿO¢þŽ4mO uÄ©YE1ë@ð½T[æÏ¬6•qðÀ:`M«UÇMÉJnæTfX!W–¾°ðåjC©,ãia%Äü…c+Q! òZÁ7\¡væáÃÒæ ®¼çÑ•é»dçô'{Éö<î¦ç÷øÏ€ßUþÄÝc·zªöC¦¸ÄRb8‚%€a;Ó4 6{ÕгbŸe¸Üè@ÿúÐÿ€þô? ÿýè@ÿýiÚ†D³hVõ V úÌ:´äüs^-8¹±ËÚ• ÿÜ–¬¬ç›M}¸­f‡<+€p¶šF½øGÊÔ$Tçá]X Qà5 rˆªz:_eÏûÏ€} Ÿ•ý‰ö ;^’ª8w ûÀþçTû^Øßrœ|A‚yÓL‚¨Zø®à½¡¢¶cÕ5ÀçÔˆüv o[š‡#òÇÒÄݰ÷Ní›-Y zï¸ìþ\Tþ¡ã~ï¯_ìöSðüðˆ³cr¦`¡à/øòPùó¨E’=ctk[`ü£¢²Gž³éæc1åŽ_Ø!~.0ª`þ^þ†ûóŠûm/À?îÀß· ù— ùûò÷7ä¿ÿ²ÿxþîüWÜgÜ_™¨y…þ7ä_Väï7ä?|¿òw7äïnÈ?ÞÚÜ¿»!ÿtCþaCþnCþå†üÝ ù× ùû ù×òw7äŸVä_wèŸ6è_ïØ¿lØ¿¬ØŸ’þþà üÇ ü× üûø/7ðŸ6ð_6ð_nà¿ÜÀÝÀÿŠývÿqÿqÿuÿùþëþÃ:ú/7ôï6ô_7ô_vô_oèßmè?oè¿Üй¡ÿº¡ÿ°¡ÿ|Cÿõ†þýŠþ7ðŸnàßÝÀÝÀÞÀ¸ÿxÿyÿ~ÿñþÓ üçü—¶¡ÿpCÿé†þó†þý†þËŽþóŽþ7ðŸ7ðnà?ÝÀÿPu ðnàßoàßÏà?ïàßßÀØÀÚÀÿ ûçû»¶ÿ´ÿû—û‡ûÛyÿáþë ü»üoؿް¼aÿ¸bÿºƒÿ|ÿîþÃþýþý üûøß°]±ÿýÓ ú§ ú» úûôß‘½Cÿ! è_Vè¿!wCþ7à_6àï6àïnÀßÝ€ÿŒûã†ûý ÷ß`^a¿©/Ü?T¹÷—÷§¶¿ÿ+ªøRÿ.¸ÿc”èŽ4$ê…U£°*%[ÛœŽß’B„O#`mwøJ´Ûœ´RŸ'}!ª¶[DZÂ4ÂjÔLXî‡D;âžÊFì°¿Üü|¶ 84ùù, ¨¿¬~>~óóñ7?ŸróóÉ›ŸOÞü|òÍÏ'Ýü|ÊêçSÚæè“VGsôñ«£On›§O¹yúä›§O¼yú”›§OØ<}òæéãož>áæé6OŸ¸yú”›§ÏÍÑÇmŽ>qsôq7GŸÍÏgsòñ«“ß|,+ÿêåã7/ŸÍÉg÷ñÉ7·ùø¸ÍÇÇÝ||ÜÍÇ'm>>ýüê>>åæão>>›‹OÞ\|ÂîâãWŸ@ô>{ùÄÍË'ß¼|êîåƒôý³›í›ŸOÞü|üæçv?ŸzwôI›£OÜ}êÍѧÞ}òæè6GŸpsôI7GŸ´:ú”¶yúÄ›§OºyúøÍÓgsôÉ7GŸzsôq›£ß}ÊÍÑÇß}ÂæèVGŸpsô‰7GŸ°9úøÍÑ'ïŽ>€Þ‹§Oh›«Û\}âÍÕ'Þ\}ÊÍÕ'Þ\}êæê“æ6êQlÞ>„ù‹»OÝÜ}êæîoî>þæî³zû”ÍÛgwö©7oß6wŸ²ºûÔÍÝçæëSV_C"‹³ÏÍ×'o¾>›£Ïêçãn~>îæç“7?Ÿ°ùùÄ›ŸO¹ùùôðÅîç“V?ŸÜvGhYWO¿yúÔÍÓ'Ý<}ÂÍÓ'ìž>áæé“VO»ÃWŸzsõñ7WŸ²¹úÔÍÕ'Ü\}ÂÍÕ'Í®>ªƒ;{ûÔ›·Oºyû¤ÍÛÇ­Þ>ùæí“nÞ>uõöÙœ}âÍÙ§CÁîì7gŸ&‡³"LY‘p4Ž6Ö$ÀÚ:8Lòó7å£ÕµD™‚GѸç•!¿²„;$L‡ÀÊ Û:WºÆ×¤3Üz<—§ú£—ÍlC€5ÔÍ"•ïQœ_zíúΟUþë/nö1ÿƒàèð?+á§*žÑqÉXQ÷øûHð>ÃB–RÇà4dÔâ©Êh¨Å BÁ”úõÒù—Mç_7¹éüÛ¦ó›Î?Þtþí¦ó¯«Î¿n:ÿzÓù—›Î¿­:·)ýËMéw¥Ü”þnÓú·›ÖÿÊ;Ûá¾iýÛMëŸ6­Ý´þñ¦õO7­Ú´þyÓú·›Ößß´þaÓúçMënZÓúûMë7­¼iýÝMí7µºÚßßÔþõ¦ö›Ú?ljÿpSû‡›Ú¿¬j¿iýÛMëŸoZ¿iýëªõO7­Ü´þ°£,Šÿ¼)þëªøïRÀ¥õw7µÿ•»¸‹uÓûÇMïŸnzwSü—MñŸWÅ¿[õþ]¸”þuSú§MéŸnJÿrSú—MéïV­¾iýËMë7­¿ß´þu×úÇ›Ò?ü¥»)ýãMéŸ6¥Ú”þé¦ôÏ7¥Ú”þqSú×›ÒßÝ´þnUû‡MíŸojÿ|Sû·›Ú?ïjÿ²iý—v¢~|Uü»]óïWÅÿ®÷Ï»Þ?Þôþ~Óû·Mïïw½¿»)þݦùo«æÿ®øï"À¥øo›âÓüû›æ¿Þ4ÿ~ÓüûMónšÿpÓü×MóŸ6;iþÛMóVÍÙ4ÿnWý»›î?®ºÿ.tÕÿ• ¿ iWý§›ê?ÝTÿeSý»E÷ïnªÿ¸«þÛªú/›æ?Ý4ÿé¦ù/³æ§þ¬üO7ÝÙuÿeÓý‡M÷_oºÿ²ëþó¦ú÷›êÿ_­$0NÀÿÊ™3@š7ÈÊåUŸ.(O¾åý‘?άý/?†ÃÏ!í㶇@l_X>S•ØÏ¯¥zùœ¹H nÀsäÅDÕ8°³É{V½òÐ|Rý/?¸=¿èïàkÿú'3£¨Í›~JI¹{«@•š”µÂ»°™H[‘X,¶z6Ù§ˆŽŸ"îvšÇßçñ÷yü}ŸÇßçñ÷yü}ŸÇßçñ÷ù—ü}`2Ò\hÙ°ªP!dù# Jyÿqcð: †Ó÷ŸUâ ñÙin‘ |X1ÙçÄHZ{ŠNCÔžf€¦_ ©~¥û»µ¡«‡lu9ÒkKù‚ÎíŒ æ-ªçȬõ_±PðÆ0èï¡¿ýKèQ±Kß”Yïœ2ý“jà­`ð† £¾AåÔ±¹°¿HÃy2û<™}žÌ>OfŸ'³Ï“ÙçÉìódöy2û<™}þdfÁLºêL0´§&áÔáœÞ<•ýæºcÊaò¨ê] &&o»2Q{ƒ@ÔXÞŒ&xöÏrÝÌ»C«äyÁ±ö|ÂSS2£xéï§_ÍÂ>P|¦ïŽýKï•\¾ž@ñ…7`ÈXá·@ >N¸1á¿©Þ +ÃU­R«Ðèo…îÓãÿÀøÆ?0þñŒ`üãÿGaü@šFÓΗF$Š´;‡âg Ï…ã“øÿÈ1s±Ç¶*8—^êžé¬¸ þ!Go3”u88ÕàªRÇ{ĶŽ>þ`}oE»V|åÛ\~°=mԀ귀ðª¨ëzE]{íJ‹Áù¡ßõ‡Ö`¨^Á ž‰IS ®`x‡…šaïÁÇ œØ[ŽýÇçqÁy\pœÇçqÁy\pœÇçqÁù—\p²¿æŒC€jP%‚ω×R ’ÛrôD äF]°ÇæFVË2)jñs¡flûÈ0Ü€ &|îÅ´”9Û…xéPs0—‚§ Î'Wz&$迸QØÇ0œ¿0oÿÇ'èVÏaõ¾‰ì\‘ô<~˜³à°ÓÄ^Þy–ó=ØæÏÐi;§©È¡ÆbCkCf†'ö ¤Ý°üHûÒ>´O íHûÒ>´O í¤€3Ð7/@Ú!«då&ËBðüc TÍÜçÂŒÒøH%[ Tðp3?}†NÝ0\ªôÙ¯Ýc­H§lîš4øØ‘ŸÐüö‹…y ¹Ç’Šgd¯yôWjã“j]¥Ä4úõJeïë¢Ö82þaF<°n˶¾†SzøÇ¡æq¨yj‡šÇ¡æq¨yj‡šÇ¡æq¨ù“5iBïØD½ jT%.Ì•¾'çt»È-q`a90y¾®CÊË,}L±ÀWiß }Ô¡ó‰Ð+¡g¢¾À”Ãî ’ÒÀ9¸ç´d~Íñ‹…} ƒïæ„“„OÊÜ9²Ú$&ú=ú‰eÂí­À†Õñ-lÊýß4F&Rf–鵉µSá„ üáÿ@øÂ?þð„ ü„ði&÷Z‘¨'T…O<«ý‘WéŸ#ç~„Oüù"€pÉÑÉ$:¥²<÷>ra²Ì œèÑ.°1õ=e"€~¯”8¶ÔKñª)K\kË3¾¦Œ9öŠEvc¬Ê£èVƒgŽ=çÞ®!­×SéµB»²•ÍR5^^0Ý€^X‚ Wêõž´Ì$ç¾ÔùÿžÏOÍÂZæDåàƒŒ9•Éúeül ´Aø¨ ÇŒ0Ÿ&úI¨Ó‹ BïC†ÂÌ;·±¹ú8&Þ7‚!lbެë/vû’rÎ/Õ¥œÀl<çDŸ¤ÿ¶8,€óaË<ÎW†iÓÚi¼ë)Psä¶;wMÔz6šÚ`6}¤œGÊy¤œGÊy¤œGÊy¤œGÊy¤œGÊùƒRŽá) M,ðÈRfY™<]a©,ê\á®REï°‰<Î#k%Ão–Sÿ›%!dŠ)~=…¢($Ø6˜‰b_!Ðà¶qw0’!QJ²<žÅ6Ž­»ócÈRy:<ÆÏ—JŒÒ=yàµ3ïØ·ÄKØ®ƒáÂÓ™ß%%ø‰€fC’.C-2/×A‡EþÂQÐ9Ù7žNX–O¯é Õ<}µŠ‚m¹‡9–2tµõüÊpnd–H¶E€²‰‚ÕALàÌ剨¸§1*¬7l ¬‡|­š¼½"|óqÄ&úôxE!…ªW*%xÏŸGnI›œÖÁs¦½èúÜ%ðVi7>ªÌ,_S©îG™î{¯ëéž@uýÁíù}É^ÇeaêeE±Lö2áË=ç[+ôÃ5.w¡©CÒWb‰À„¹œ½9æÛ–»ðõÄl?1Û¯'fû‰Ù~b¶Ÿ˜í'fû‰Ù~b¶Ÿ˜íÿÿ1ÛÒìÅÀ£€¨Tõ‚ª*•Ì̤·o5ñ‚8ß<ZŽJðK…ZQÙ‘{¢‚†ýr­cí2û^Õò'á¢J89l7 ÚÐn¸È6Ö¡­.N£,t.3Ì6‚0!›ÔùYí(²ûB»¼Ñ„Ó $9‰ˆ«Òv½uüïF)¡i»µÄ„¬-RŽ0ùÊÓ‹ ‘ˆçæ'ðÀifÛïdº"àÛ)ž±ñ‰JÏ4K?AÍ0‚{PfÖG´{R!ös¸ò!œP:Ba9‹(“é“¢‰,r‰áðçÕ ±ÐqbLø9±Š§ÊgñèÈ×/ ñÔê)TJ>êâµíxÚ¦¬05*±Š\Eöl¨JžP'÷¸ÿœWkd¥€ä°lqõ=Ò# =Ò# =Ò# =Ò# =Ò# ýAi M8ÄMH´ «zbUÅøj›åˆðMó>09…Öζˆ°nâÚªpÑk\B¨h×,4\öÎ ©[ΕOÏ,•†0¨p¯MÇa“³ü¶¸æçõ2tæGhSl9Ól'NäÎàÇðÌ£rî}äÖ-¬ªa¶¢ªÊÏÏ ûHÊ `¨íÜð‰NvH_r¤îUOË“Zà‘ E± bvH*£Ýà¼è <þÎ_”q/ÂÇ-g2²ìx&Ašq¨Ž˜² ñ8D“8DÈGžF0'š줄cf[ä#ŠGÓìf»ºìCH<:Ùèâ/Ã'÷<­VžIÎGé×Ö€ÍÙ.J2¬‹‘[­8š°Ú®å&¥M<Ê›xÔwÎ%•M<ò›xäoâQ¹‰Gyò&å›x”nâQYÄ£Ò6ù(Ýä#¿ËG~•rÛ¤ròM@Š7©Ü¤° HyüM@ 7)lRܤrnò‘Û䣸ÉGî&mâÑ&ùM6ò»läÛM8ò›p´ÉF7Ñ(ßD#·‰FnÜM4r7Ñ(m¢QÝD£râM4Ú$£¼JFá&ùU2 ufá(nÂQ¾ G·,aH޾HGvnâQÞÄ#¿‰Gaê]>êÙNº|7ù¨Þä£{¦°¼ÉGa“ÂM>J7ù(­ò½Ä/)Þ¤tü& mòQ¾ÉGõ&¹M>ò›|Tnò‘¿ÉGa“Â&…›|oòQØä#¿ÉGy— ¨,ÒeM’Û$¤x“âMB*7 )Þ$¤ºIHin3w’(-RRݤ¤ºIIq—’üMJÚ„¤² I›ŒToB’o›”T6)©nRÒMD*«ˆt´UFº‰Hy‘6ùhÜMŠí& ùM@Ú“„¥›€v)ܤpÒ* Ù%6KHõ&!ù]B*›„T7 )Ü$¤p“Ò$!Á{l’êMHJ»”6!ÉmBR¾ Ié&$ÕMHÚd¤x“‘ò*#ÅMF*»Œ„ËX¶‘‚„W)³¼žm ´*\¨Ü‘zgºªA(¦'¾ïÈC ÊÛL˜Š´bˆRj•˜™J€PùQZX¬Î‰fZ­.ŒäÃfµ€÷ÚM;Æ)u™5Ü€äfÌ¥‡ýû](W÷6K +Õ)w >xÀF®mVLœ½Gð̃èOœ"e¤óÀUúF—nÿ@ðÓ…å(_5^b›ìùÅ1›àù¾ÒFz\¤Q~Yp#°!ùåÜ>]~é6'?ä—ƒßQS'2V:?7Å6û‰î5)Ø·ht¤Qëi$I{Ä—G|yÄ—G|yÄ—G|yÄ—G|yÄ—G|ùsâ L[M.™<ŽvÀšXõ¢™—‚õuoÛ^ÆU””D¬&åÆ.°ûœ¿ (6W/èôOÐØmUÈ ?½öh$D°Šà´‚#E»DhµÿɰørE€ÇmOù„HÝž0Æ»+ ObÜÏ=…ݾæ) °°þÀžÇEÖ ì#PX(W66âZf_†¬ÀR°uØÁ’ ÅC¾†!,ݼ–qÿŸÇ S–Ô¹§[~<ÁO°Çìñ{<ÁO°Çìñ{<ÁO°?é –4Ëk¢©ª˜ÔÚ‰çýqÚ9ÎEnšÙÖpBŸK¹Ñjq$e ²7DdŒ¢Ým¡âŽ1e¼1iŽç"ÒÂÍᇮ)>€{–Áì*7‚’sÁ$‰I'^e5ÃStÁé·em„{ô•‘Â|Z€ƒ ijWÖ_&F`ŠçäàvMæiÀ·ñèÛn¼Ã¶;¿5FçN!î³ÍÒ7ž¹JžôgOú³'ýÙ“þìIö¤?{ÒŸ=éÏžôgOú³?”þ̔뚀…¸@TŠb@Y®£Ÿ ]ÇܶFÐWq†¥V+§ÆH¶Ï LM&'0¡ª¸pÀza¢Q†Ó!Ê!…1, ˆú–^«/eAò¨Ã{€¡À º8ÎtTٮΎ‘òžq®2†X.BŽomôÏ㯒ìÔ}Ÿ»Š>Gá f÷CBåé(û¾Q؆LqîiÊØÐEÚ™LQc¢íÀhä¬Á¹àŠ ªþ±•á-gnø„J¾}'màÈ Œâ“¶µ«ö¯û·›?Æv­YJ:6pÖû·jÿfí_m`ÈÓ6L¯‘:öoâþ­ï_¶†É$#Ò„ÛW»7k÷ŽÍ›±yÇέܹˆ/Š OYê£:m^76oåæå¹_‰É¹y“6o”R j÷6íÞaçÁ¨Ì[§Ý›åu“ª¶oÐöuÚ¾e¶ü`û¶Ë6„í[VÛQ¼§¡}m„Ÿ¥ ŠÐ9·Èl [/ôêò±©0d 3NBÇ80wouB1µ“¨H¨qÎ €çšÀÕ7D¬S#ÈØØè˜hAg8Ày›C^€k£C€‘£Lƒ1¼Û%À yå#÷ý~«“Æì?lSâ(;ûÙõ¦\×TýÕT"¹(mÇ‘Y?ÖÞÄk2$v#¦ Rw»¦ò¹‘û¹‘û¹‘û¹ÿN‘;Ó7É”‰–æÌøÌS¸í¾gª2®×|¢k‰kt` ERA”ß,7Ö†&~2²šeZ”xêàfµÜÁv ÝC¶ÜìCôçó.è_!üÈØÎfº2˜Ü"OœP¸þ¿®Ãá½ÂóRhÄ J^‘8íÄÚþÇe/µ¹ëÉj ƒ¸G†pÌîƒ#Ë=^=šÍÊ&Œ~t9a›Ú¦¤kË2$ðk|ʸü ¬íó10œI&.Ö^*ŠÛ Jª 46(îSß=J¥§Ý‘é’pž=(uÈF]úýÕ17eš›Æà>w§Ýãi÷xÚÝ@úãi÷xÚ=žv§Ý?ó´;Ò ²DA‡ «–Å!>'è.ž\yä±ý¦ö LXF[‚ª¹Úb0ÑaUA°ºCèñ^kIWomÇÊê¾u~ÿø´?!f¶"¶LH´¼í¿Øž7ú~¢/ôË?@ßÖKŒ¿Î•çÂy÷äô ïÿ…èÛ?CY^ùƒbE=mj<”)H%¹Ï¥ƒi;Žp‹9Ú]­K!H¥C£À,_fÄ ËUõ´l5!éJ5ö‚¬¡ÅÞPìûA±Š}Pìƒbû ØÅ.(öÀq}vàhG}8Ìe„U®¸èïûµèp¾âkxÏrà@\ÐÑ–¯)¬¼À%ëœ\oöÿµ÷m±»×]DZë8$ˆ‡ .ýJ©°Eþçì¹îÙ%Xµã$vÔ¦Žc%"Åéqããðÿ;Žã&U€FH%¨R+%TQ¡BáTñ7P…, Š"*U¼ *Jx«Dy©*0ë²/³gÍìù¾sŽc;;JrÎÞçÛ{ϬY³ÖoÖzÚ]GÈÙScn«ØÓí†À)®äƒë€aC¤ÎVcƒŠ#nú±— a¢²}@ŠfâÉ Qüb›Á‹I5ãZ5æ¼"‚ì§L@½ay¨ zÏõX!Â} k´BRâCÛÞe‰ý*ñC%™#j ™vø1¤‰ý*ïÃey.Ëûè—yï–È5Ëüè×™ý*óì2?B–ùѯ3?ü*ñCÓÄ$(ñ\H?VAaT{f„­8ª@±Daˆß£úx‡XÎŒµ¤ h M§0)ŠËŠ+(~báø`Ã?÷Ü!Ãz–B ϲïHuGª;RÝ‘êŽTw¤úƒ…TGU– ŽÂ;ŠJWÙ1@ÉÓ>õÚc¯H?OåÏÖMC€½g ¤bh¼Óá©pYÀw’VW¬Õ¹ ¥ÃÝ ßÑÜÕ‘a®§®¾Ia™Æë¾]€ "Ól$>•èhЊÎé‘‚h­4S& ÆêN= ¤ËGáÁlLFqm‡iyX~ëc1Žæi¸†Ë0™“ÐÃö¸ÞŠXÀÃÊJ¾›`ÁéÁÒFëYÙ:R­l5XªcDF umJÈ(îè2BД€êbKÁR;.Zà"„.°'S]gSœfXs õ€¤9v?qt›s Ôš¯¹d0M¸¦Ø¦¸g çÌZLgÔ(7(­w ƒ8J££î(î>…5âì0Gª/[ÜîÀhF;0ÚÑŒv`t.0êùJˆµu¹¸DdPß.¸©g¶¦ªbÁNɉР—õžž×¼Á÷tMâÏBiRœ:¢  Œ(á f ÙŽ@ô­#¥Is˜£HåúQ9sÀ!…”3·"¤(ó@ͯI»;Òîº\¯"Šî© oŒ@:vÎõLLNÍú=¼½ EÇ&4gÀnñ“T•·ãªolσÀ+ÂŒÍ èOXèvŒ>`åÙ¿IcáK¿P–õª'æîÛ‘ÌŽdv$³#™p$£R(ÈIh¨Óa¤Õqµ\ÞR7±8Vò,‰AÐþ¥¢ª&æt](ìrÖŠÌQ×¼¥¦Ó~4Lº=U »PW v\Áú8®YÀ–¦–ÀNÀpí·®@âÛÀ%ŽÊPÁ’ù°îܘ•Ó#Z f¯ŽÞ}¨0²[õavL<½r ½‡&,JÕ1F[·ÞÞaÆ3v˜±ÃŒfüÀÂŒ(+±”’!š;‹Ç{,¸‰Å4ËØ±sŠš†ZÒ®.Ò‡Švv˜Eå,w<Fs‡†Þ‘6š,*F}ÔóôèYÐŒ1zpÒø ÆÁõÃêÞš £žœ±ö¬H9‡U9(Z_Â$z˜¢iéMIŒ"Pcà0BºÀŒ¬e.ÓÜPgÌešêÓ~:c.“’4(<€9Y0vW"éÈ^ã¨Þ(Ø­h* ä,•Pb $/° šˆ†À}ÁÁ~ƒzÂèßz 3Žj@Åk4!ÚÃòRKäÅî•ÕȯvÝ¿ëþ]÷ïº×ýßÝop×£®§vàŽ }êÍÄ™Qs{GmÝ`(æÐ4v;P|¨ƒVÚ–ô:ô£‚î1§« J"ÄÇUÐYj©³ ©ñÎR¿åå ÚÌzØ›²6\ Çå Ÿß]à1ß#M¬(¼“Rd HÔ¬q±Ðï¯Q@gŽYYÜ!c‚rLªž’ºM ´íÉjâ(™¦Ç²•7I#­#ƒ&U¬ ©âN¥Ø»"Þñ®ˆwE¼+â7‡"†å;x`Vc_ÜǘF‹Gp^ý›”X‹¥†éŽ|­–O˜0Pó³¸]Á8íâx‘Á©ÅIUÔ@ŽËÀ‚ıx€ôX¤ÌÕóÖS¬ÕОh1m–zN‘ôਾíBS²ú6SÈ@ª¯è`N‡ZÇsCjšÃÑ'„ʶë¸Â1é½HṳS;ÚØ;.È€úlÕÔýÖÓÙßh 4Ã3z0t {·ñ,¶V¿ÜÕë®^wõº«×]½Þ©z š"ß:ªÀe¡(ºÈ„p7I=§Ìh)PìãX#ÜF–®A8Áµâkͬ…Eó©“=ýòìÁ&ï1ˆKìЩØã‰š­ÁÐT³f´¤rl`cXÇL¡ñ˜ZHQd;í»îº_)F>×Fµ×Õ‘þåØƒ¸ öˆG}–öŒo؉ paI€™PhH‘Ù ,úMz ˜Y‡B¶Ã†@¨‘:”ÈÀÛ¶jøj1= ò:õ$Ù°;+~Ãp ‹uݺÐQ¼êã8ìŽÅÆ­î`P÷\÷ô‘‰z=Ð  lò0&˜·›æÍĉ,†Ä‰ŽÄÑòk{‡Äå„;‹8´dävNñg„L@ O ŸI“W¤Ç ¢L;>lþ¿aÙóQ•HðzxAõ70rɨì8ô¸ˆ8ôø' Ý!‹ô@C§Rè6æ,­£Ã$͉˜¦2 ½s4(+ë¡h°§7€|„UÂF¹;NvÀFQC ºe& ãLZé xäqN8òøç8rü*Hs3Ž9ä Ds³RGYɰ—sa_èâ«xn=öî‰gÁ¾ü50+6úpÈ垌ׅJÆkƒñz,Öá2x*Uaš& »Ê=©!M6ÊPœ,üI“å6 zÚ~†84ÌgG(Ävqmy÷é©ukO(Œ½é¼¦…ññº#äÐ+Ö¹+ Sq®”ˆ˜¨Kœ[Ìy ÝÁRÓÃÀÚGaïX  Iõ ƒ!mÓ+ªÈ ½!òü0Ï#eüX D2FÒÐ#JÚD¦É4îÖ8}$¥fJ¨[€’j >f0; 5ü…Ç} “ðÜä :AƒÃ¸.DòÒ4ÇÞ{x)ÍZg«¹â´j’!.¸·Þ€* ·6Šx¿%'ÏabÝóXb*©@C#¦­bÅS¼ì6”©=ªP¼Æ^{½åÎÍ(˜“›~`üBá Üh%Ò)Laü(?ãzxCƒ@m<(…¢ †È¯XöVb=Á;Ä$´`¨Õô„µ«YБ¢´ôMDËÕ›vx¤!.qü“–¸£ pJ¼Ä´¤!2$¥¡o&É2¤•³(à3šéMÌÎS‹2Á{ÒX¨[½f¼ ÄàÁ‚°ƒ!Þïéˈüj¢æ XKzú TèžÞ€ÄÅÍM vì,‘Ù´s¼ÁÑí½žõHæ~7LRµ@©®WD,=5lë‰HÔt$4 ctRš¸]<@âUV,šw©÷ãR̈Qó¢Æk>§ôs`§£wöP$/q£GÚ`†É€ñD«‰8–¨…¢¬S4ÍÈ&4&{µ4ïH°9z€ˆiR»¡5˜˜=óYÏ|Öauäñ;˜ Óë™oXÃ×$ò³¢6Kôv´& eKÚ¨ƒàKáé8È[Ñ4U숨‹·TO—d|ƒõqü „Añ‹–Y‘l.9—&3ýøá 휥Nñ…íÕAƒYGQÝ(Ä4I°7¼E‹ÈkýÌôˆÆX<œãiR¢ÀžÀÉ+°ÑQ8' 8™¡‘/ÑzJ,~oâª(:ÜÃL4àG@¼TCù+dãöAD9CfDÌlyíx®¸i­¸–I¤Ô8#R†Mä_Ã)ÑcŸ åà !¿h¡³AàVp`¶ ̓¡KÖhEÆxe‚õ@8úc¹ëáÇ_ û=¾ÑY¯Î{4K\4¤¶Ã(ç;«Å¹<|êxû Ž/Äÿ½ɪ0Êõ´â‘/‘²=mröh˜ÖŠ‹Òp>ÖPk+9[4'^®Þ&œ[q,­[X8OúÔª¿‚jCÙc:{5M)} ¾:}Q|óI‰¼lñ”ÃRtGÛVþ¢l<·š"|l{b·²]I”MF­³¡eù"µñqÛ ½Ì`ÚÜÛ_Á‡69nÑ(ç8˜Å(´ º´t\W Ô'”tÂJP=ZU±8 |h3¸…ådbLä´€ò(ˆ‹[èi;_O¡Ãmk”÷VˆÒ`uÅä1èÈŠh”`‰ð=U=Ðdäîõ m„åšû(Yì@g ‚å±zÞˆQ÷c )®î %úžªkbc@§¸n–ôaï{îxBæÆ¡ï9@Ý\ñX»\~ÇŠ‚Ha½ ðr ütÌA—Ì€¦?g¸]¤B\‹†Ó+Ã#_áÉ2òµ†r8mGå,!VÑ­VÍðªiÏ5·ך𣔠؉êÌÓCÀ#¶%÷X“«+KEš„VáŠ. ·•À@ÆJ!Ô4¶'ß6ï+,tª¤jd–Ží]ñ=v|ô$º½î+;,ïáØÞàÎm`Á’åñ[T­ ,„Çõ÷Ä$ijǔ¸jE~TKD;\9Æ+tÆ¡s WË"^ÙÅð2¾Ç¶,e¤Þ:¬)En>ªü®ÈlýÜÑùeˆcèÌíÀÉC^é¯À²Û¡¡úy¡ÍØ ˆ*X€Rð ?¶40=:4Zãá ^ÐwPSB¸¯iFmÓ³%\!X¼"ßàÀ/ ìé9V†žppöŽ•˜»:Œè ýRžƒ€ñ–ã.A"wÆÜõ¼fé \qa?$¤Å8²v -ЖRÏ”»Äô¿¢Ž­è‚¢dh<5⬩Š["Ca_€QT“K†È¹ášÄG ÷òü3kÙ^Ø`³ì#|Êž³NóÉ”:~ö`ÌàŽa‰ŽA¡)âÚx†ó–2Ρ˰øÐ(>ÿèÕŽÎ[cغXŒ¦:6w®ù@"zÖTs¤®(3O&M†ØYÌAÊR)ÆÞ Ô³ƒÿæa­U®¨"D®uQ¢YÒ`Ä™4á¤É®”Ê—ðA ù3x&÷ ŽGƒôŽTFÄ ž q¤¤S쀵¦£N±½b½*¸jz^µ;$zk¥¶t.7âŽÃȈâ>ÑkV|Ü7Èë(?ŒNÿTÀãp„‡!”·XÓ‘ës à5Os5qØ&n ÌEGmÒ¸­`PhÆNõ êÞY¸\‘ó õ¸‘Pž±qÁRÓa­VKaµ[¬Ó(›[‡„d$³#“³ƒ\€`džÓH ›”v U£Ø"“ÓÇz25)(µÔƒgR³Ï¤'!è =é‰Â;,ú*‡Ñ¹éH- س×@5V²À_íÿµ|H>Ha.Ëe@ …v0Z¦°$œæÈƒµY+™dTv¤ö€½k´¢33&“``¤Ã\Gô`H LøHDzÄñvô=áE­(%Ö)J0uÈÊ$çÕ$çÙà¼Á¸«J·w  k"J $ï=B¡¬šÎB ¥±Ï¶óÊ ácPK`’kDKöaÅeCýhg"ÿ äsôdã>rX :)∎eK8ÆSOBÜ“´ë›r{L0%Ú¸yàŒ…L ,°1ÐAÝ>èɼ ëg\ #œr°÷ì¶ïÔèPG ÷S‚@tµBbòLGDHL(†ÆhÚûÏ0ÐÝ$æ(hDv+¿ h É £è3‰ aˆ¬V=yk¦ mÁŽhf@‡œu[YaqŽx…^Í”°†°2žâ¬c€Ú!øàh57—WT/$> œ%½{×öuÖ¬¢¢QG\l;>•CÌu|£‚Ðk¸Tˆ ×“€­³þjœ¸7,'i8ìÇ©¸i—<³š‡Kçáóˆ_‹aä>оÒ2’Õ”áΊ(KšE ”S5ŽF¡ýy´S…sˆ%£™£—¿˜ °¯Â¤LqÀˆ2±™ÆCX<±yg<&[ˆÍÛ¼Òx È©‡–,DªÇ¨C7%îQÕc4 càa ^3Ÿ8|ä3qÃ%³´]±´[±tX°tü’`v ð¿Áf4ÐøÚ@Eá5^Ë¿ycØbMŒ£sro #¹;= _Œ¼t—¢b`…(ЋV¬Ÿ禸:oØnÈ'Üô¥ÓE ì7Œ)„('ù; À.¼’6‹cA縥DÞ~Cnel Txu¨¬Lq„é[Èp¸þ¾†¿Ýl÷†˜ív“ÛkrÛ-foI‹ÌæxFeERÂ|p¡,ö#ÁìoI´X%chÄnt{CnKú#© =²kf€þ XV¨âá=%aìG{àÑx´íG{àÑx´íG{àÑ[Ùð·›íöÀ£·¡Ém·˜½%-f{àÑ[Íè¶½ìv{àÑ[Îö·íGoÚÀ£[‡O`I*ˆ2º:8¬:Ä¿_N÷Ž*‡^ÆßÌ¿…U‘S¨ãGøÏ_8‹ÿÁ¨¥åßo^öpã¨ûZ"þùìçPòëþ*»HZ´Çi={uxø±Gžýüà>”DìŽÏ>xøi¼¥X±²|áÖ3ùƒ? ·âj…. "ºõÉüÁå·ž€[zöøñ8û8϶9º#”ÊŠB§ÿ¤ŽˆK5ªô¨¸h†Ÿƒ—à kðŽ¿÷YhÁ¥ݺɷƿJOèõÊ·Þ·Æß?…ñ#C?ÎâöòßvúDÈîDMB·ž‡[Ãú‹CÇùÒò߯ðF¡åzãGþf6¨Á-̧‰˜³,ËÅ“°ˆÂ|±ÀÉ«’Yøœ6ÃÈ´óöt™$š%ÕÍœ·ÄO ©pÜ- h€a9•uC…¿Au3£@²È³„š´MÂ$¥M–¼±J¡ ÍöÕœÌÍuæa¾L/V ¡#ÆeuùóÂM&ñ(,DG¾d¥õ©A¾@·Â‚{z´©›»È©åi Cyá%!ç‰Q *f±æ¶<à×2ÎdÓ……Üñ¨@2r°+¥íjpj‘Öð ü+øt) Â5¬ >³ˆ @Þ*=Q)¿,³EÈ_Ÿí¢Y ãÊeÒ—6dNÓÇ%ü•VÌÐJ€Œù†h5³a²=’¡.ÄçPêíúÂ'¿6W.s@„”—“͇0ìB Ì¿€èâx Äù0M.âìZ<.`Àmyݧ/ Û²D{´Ÿ”!ßJ+cÝRF)mø/Ùˆ¨×ÏSy¹¾Bãåü,l³äµÂ>ùR;Ñ5Þúyz0âLA`Š; äg˜ö½7"w™ šVè$+Ï&·`‘ºòœÁcrÈÌ·F‰ËC8x ç>bZéBñÅ/ :šÞRä&ŸÇºuÔn%mA㊒¹-.KåÿB‚f¢]Dûã­™ùóÑÏ’ë» ‹{6=,Íß"¯ŽÒú,ãú„+kZ;ÈÝ:ŠU­ÉéSXÕœ’Õ5•uz®ë…ñÖ¤Dæ™'FAT}.WàùàJ‡ Š­ië€Ò|\˜ùiqªN蘞šÛlMâÙ¾zª®¬qaãÖ8•†{ÏGí`Dئ'lf’¨"€x©>¹üŽÀF‰ˆ®™½æ1,V*±‚f[Éð<Í7·Ø^Xô?úñÌäV³È6PèL}Ó“]ªÎâ ûº´j©¡*ŸÌuþ3t«[Üú)¸A!ýôâŸä[]ßIìP:O— Â6«î¼š%9‡)Kúá\Ý$b-YDLJ<.k³dà ֆ \O5e+ƒ`ë/$EU›Ìí¶øä,@gIÙ*äX²˜â6Ìd‚îE]V ñ‡ã·B(Z5V"[þËw“°*»»›šd…=BX™Âéá¼HËRà@B°Ïx¿ˆ@½0ÐuZ¯‚Ár\GU]ÑÛ¯eº®KKFÎä Hþ…Y5 Â4Š ¶³MòuXNE`aQ¿°¼È÷¯ø3aÓ~nc€¯Œ;xåUOm:%Ù óbŽo¹˜•œ‘èûÙl`[ÑRMñ#ÂʟݬU`îr ÖM+4Ó¦ÈE7UnZEš A ÐÓ9(‹Q ½â(g‰!Œ¬âR“}§Òoe ^ðdÕÎ/ÉZ6ù¸7\—.ضøÀ­c¢06!|'%opÅù'lNÁX •cçÚ¢Þ/>RSÙ¢A¶Í^tGÑ6ãwOˆ¶©!à „}ÒÏ Á eÒkNȧ(Ã%Î&ÃZ€ÑŒ›Puv…Iæ)Ñ+y†ÉúÌØ¼”"Pfª ¶!Z¾dÁ>Õ©µ&Ҍගž³C¢QK$lÒ‹š¼°É(±áó–åG5• —éBèwa+A0¹[º%‚!i¥ ÀäÂ8ôz´‚1Î g³ºË|F~‚j«¦$å{§ÝÔfš'!ä5¨á•%¡ÕšyQǺ#ÝäÐS1 2ýšR.L¿n6J|fè—ñ$Ù>D$Ð ÅÉ´­u« ËåΖ=p‘ã–[Eø¢Íx(@›ÅF^Íé^¾dì˨ŒñyÁkQM9”ã¥KÌb5E…<’ÿ¯ÐzLû¢:ÌÚçF'Ê f‡¨:ÎËQÊ[±¹µ„ùょ1QB‚@†• cIø§Ùé°*èY‰õÝ=‚5ëä$Äîmemé3$”€š’£ 6G‰·×+¨¦ÂVH3ÌtN˜!ÇFw5ÏhC oE„µE-ä.Ò‹HŽë>¬ ²ÌhÔä¡F¦|Z©úÃ’ª-«=óT‚[?¶±sÕ8¹¡Æ–ˆi —©×È*ÿlUžéÕ,€äÃö–@HOØS$¶_8o¿3l4[b¡í´ÝRš¶kz†°l)þäE!Q6@nAÄ–CWÁ£±*R¨z#Kš|÷– Ô¥«ÛXA³/èYìãÀ´25U »Ž7.7<ߘŸá;Ôì G Í8a8ÝK8u\àæÕáñ§7>ø‰Ï|äñÃOíáÆ“Gu¸ñøÓ<†ÃSOÿÇoýVüïü¥oÆÿ?|è)hß»ølåH5 ÇÒ¿bÿ³q8Ðàr°4Õ÷ôÚàP…ŸŠãQ]2 ¾ñáËÃ'žþÀn<ýÊÏ>ÿâÍW_zå¨\|ä¥Ë/]Ýþ">ÿþÒ+_<šG…|ù×n~õß¾ð'^øOŸ~ðÁ_üß7í~ý¿üÈ·¯ýãÿöÎÏ$â@k¤¼5Dhºq9ß ¡^Öƒ_LzcqÁ™ôë/äSU§NU Sýý×úêÿû½¿­ÿî_¼ß¿®þÅû®}í±úÌzᔚN˜Z_úWµ˜ 4¿L(ÍFɳѧÎF ³ùÍßéþÚwþàG¿þµýÕǾqߟùò?ùýºvùßøÞbB>ð@:Ç ç<èÄéÎåâ örñÔxgœl€¥Ã~"‹É®¾‘OÖž:Y+Lö¿óW¿ò_÷ß¼»{îÛÇ_ÿîëßý…ûø±®ýsõÀߦ ý]wêtÌ©¿ö‡¿÷óï¹ÿ;?þ‹?üžoý½Çÿæ×¾yß»ÿµùê ¿pß×¾÷ܵ'~ü -t7èlæz5ó‰ë¹È3Ïšßxïf÷è£÷¿÷õ¿<üékÿì7R~Ö<„àWüÌwüokÈ›¿*!¿Ð=°NÞ41MMkÉÇ3W`pATÎ^IÆ+HŠ­„⪃WèL"ÈôýumW¥é ŠZè'eË"æôôòùW„O=D±‚Ëñ(¥P“戩y([š›yKAòªÖjkWÛ¢ŸÔ¯a«¬{r!Xh„À?!Ñm+ïT»I@îVŽL ‰IÖâ\ψ‘l«[R϶h³{8‰.gØk¹C-0å±|u…Q¶áÒ™¿YàôÂv>/ð+䜳µBE÷ ŸÙH€î Ý¥¨ñ§tÒ…G#³ºÏ'“…Ï-dDšD¼0¯ÙÉQÍ@º;uPšËª³k¼žó…Õi­Qæ§“K€H¯tËI!A§·í¤ÓÉ)RI‡Ÿ›U z¬æù5gvç±Rµ„öjÎi ígöÖ¼kù¢ó„týz{¦µ.}>­Û`ëpu'½T$žKSQ9²®žgrBq­¥cŸþ\hŒ€Ì%p¥ÿÄéZÊ/¿1—³i2² NA9×Ë=l¹2·úÁmd.o©ÖseÝ…é!„w ë×K§³¥Ä*÷¨év:Ëy[Í+mæ2¡³O­¬UÈÅqS$å¶”qå¹·YrÜ ‚¨yÄ„“H¡#em[ä ¾©äÏVu+!ÔBÀâ5Ð7¼e¦íÇÿ> Èendstream endobj 63 0 obj 93286 endobj 74 0 obj <> stream xœì½Y®¤9Òø~Wá+ðæ<¬ ŸúAê- €* ¸.àG)äî›fç'¿!U©¢rR Èktö‘´‘Fã<ÜÓ‡‡“ÿìo¯ÿøø¿þs ¿ÿÿiü½&_9úüÌ×Gª-<‹ÁŸ—ØÝ3ÆQ`-VÉýø/ÿþáÛ€FùÿøHÿçÃ?þÛ‡{ø1äþ¿?Bmõ™Ó£$Ÿ)Q¬$‡ÞŸµŒNþßiJ„Ò3”½>KöúÑ÷ìm«e%{­…Vô½>«ßë³äk,bŒé™Â^Ÿ%©ú§ß¿ÍJ¾ƒEqõÙöo³’ï`QSzæº×gÉEkþ÷J(ø‡äÆßnŸ +ù‡äszÖý­d¯ŸB;#ïµXò,RhO¿¯Ÿ•|‹Ê3 ,B­²ŸmÅY¢XX-³ì°­KÞ°Ðú¹÷øì}«o%_c‘[Ï÷ú,Ù±ÈÕ»gË{-–|‹\ú3X°ä;X¤0vð>V¢ý|Æü¯Ä/”8v…‹c¯µ±ó£—9o.<[›%ÒNƒ4x}d7V"·ñ÷çü»Œ‰‘õúuÖßÂƇ=þ®¤?VþÙãX…èòà²Ê 4-¨ò³gÏQ+…ð¬Ná&ßðíCjÄÊYZŒæeô—â s7»ÿv÷ùñ7ýˆß ÌJ+Åy9[¼Þ[ÈòùÎ!š ÎçˆCGɉçç?çßþ…%νðcšìd7¤+ƒy)dŸ%‰´H ªwYì’£²A­)±¥(”èÇÎ~´\žnlK¢üËÇ,p5?«Ðƒ6³À:$øë=‚í‰ßaà{-š °·b{A) rÍ6~”†LìtàÄvÀ¾úÿU'=¤*Ó~¶|}\}Ë×½”¥`àRÇØãóSWAU–:½d iû†NðÀàRøïèªÈ¡€ƒIßUt-ðå!`÷ŠÜPRnÊñöÀŽ%z£ÛÑSâ_àÑëIÑ;ûz}ÜãIïý霖xQ-â ðP`Zvc:u¾lŽ¡•l²ÍD‰}NøÄ8F¯duõöú¸GüÔ’X2ªå±Ë¼nù.FàìgE)ñ X#é3žð£Žc‡ýýcö¿áxŽˆþ{aɘYÈÖž78ÀÝË'8²dÍ£µ±y³>7x}ÕœÇÒdz·×Ç=¢ôGíFÎ,8 #!œÓû¢8²d›Gá%û¼±Ï ïxÌyìAqÜ{Žûˆ˜Ç¡§éZ;Ý×-积„cS¸²»ÞG–lóÈ6sÞØçïxÇä‹âxööú¸GDÿµ²¤Å©GÂ5Þ,ùÛW,ÙšÌi“ÑN¸„sÿu-'µ3(i™,zôàeÅ„‰ ^?ï/µÅVµsIl„ÏQ2iˆÔ1ÄÕéQK,_áAQe0ï{d¿×è·4»Û¼¾h‡!à³ròþlñ‘„•Æ9¶¥à6”m§½ nW·¡2ø¨%c€önK¬Ý­ÅB9GJ’ðèÆA!.XÀ™‡8O"ï:á(Ú_{Å5‘\n0³®Ó%²‹ÃŒ‰8tžXì²íîL0< Ç..Œyˆœaf/&<¾8 ƒÁ¬ ¥V‘µ ½v¯(Ž î J†­ pr„ÇlÞxìîîMpGS—Û€‹m„CSEkÖ^Ã3DÅq(%Ã.ØUŽÛ7»t;;ƒ¼Ø©ÓûʒѽÀ½P¯A-“jpJŠâhZØk鎦†¢î·9 ðŽÇ.ÝîÞ^÷ˆŸj*e³;¼L›5mŠîîf¨ñ£aÐÅêXdEq!ì¢Â¡.4vá¦ùÙÙK £ÞÖx‚a3;He™ØR)öà>§)W¾)Ì™ö¬(öA{,©²Ç.²oÈíq¡±‹¶»³—Zw¾¬?µ$ Ý \¬ÆXŠ7ËLYt9YtÇv– ‹7Ø?n4þ5ÑfL}¬ü(ž2wt4„èœal”ÁVJ³`˜>9]Ê>ØŠb9”¤Bz¨ý] õSE±Ž¢«»,šaä¸$›_Z #Æ«ž›Ä )º¨âªP 0Õ¼O=`”øÜ ˆÉ?7pê e,Ë*GwÑÀ.´·Ào³ Ä Võ„å›ÞðPt‡¹m-Ä>qC¸Œ]Õ†|ðCËcã «aÖGÕþÅG3Ú¢$y›»D9z²ÚÚß>ÊЬ›ØØÞg¸P‡V+ ? ‚í4öÃá”p¤¢¦"]漩Vfž¿ õ7UáR&†WÜÓÄ]¿mÿø¶dféöñ2=nM¦/Íé[N°H›âgI÷‰þõc• ž"ÊcۮȨcñ=pÈ „uø`µ›|B RO§!­i0âú9=ß™úˆÚ÷•ßÅ}$84¿ØÇëC9ªzË’˜+wxpÄöï"0×p~GxûŽp}G=¿£\ßÎïè×wäý;þmËYþ©å ¼6 ¾P}3øœjð¹\D1ïCÉö1Ë0zë2eq¨p)ewîµAÚ"Ügøf¤ ×øE¥*ëÏÉjÈÚ mEìjWC‰Ræ,‹®K]#—¾^×\ùx­|»V¾Þ+Ï•—@‰cå˽ò ÒmåÛÛÊ×så“¿V¾^+ï}9W>+_ݽòn+8^p9Zl'~ç{ýïp> ã dp>úâE”Ë 4÷ ÓáFŸž /ËâÆ:±’¤Ï¨°¹¡<LæÞ/Aáé+דÚÚ"B\¤d,‡ÀØKΉcOà® ­Q[˜eàäÄç!p‰-½*Ü;a]é&1,Zàê {iPÔô°øwµEY"{cÀµ–å@• Fh¼º¬úÙƒ}V‚Ú~ðÝH_=h4³À7­@œ‹¶Tâ=•%¥²$‰kplÉ@X¼éÙdñ;n¥¤z–ÈDÊ©["œ½Âb)¬bKJZd‰T#2“… œ3á¢.T¯Qbc»;uâŠZå” ÔEÚÆŽ+ƒª‰Ïu,Mf‰XÃr4©"ÀC§ÿkª N”…†„ m]¶(t<ðÖ¡ÏÕd¶tàæ‚z,tÓp¾¥*Ķt…í„ÿGÐRI¤¥qTå-y@ð˜HH!ØÉVÅ6Nˆ=ìàiRRuÔ±ÍZ™°G´¬ÆÂÊ€¤¤Y %¦¢Ç4ºÍš‚rZ  b9„Åë&¨âÑÒH 9\ å8n(üÙ1à*ðh1úhêÅ–]‡†—ðQçƒ)ÕÕ$%‘÷skŽŸÛúM/_àò#–…g²*»ôÉXÓˆ.1,¥‹œ¡FÛä]S>'Àq Šª~ÎyªýÉ$†ñ9AÃàþçŸãÛùœ"b‘Ÿ£2«ª{Çzvªa-̱+‡NÙvUÔ]·€Ë¶ËTRŽ[±«\%œƒÂ)v4£ë™åðI¥}ŠÆ`QCó Òß©i¦hKÜSÃqüwܧ[Õ˜°\8a1â¬6/y„ Ë‘¤"Îé* È*ÿ†¨L˜K,‘S™E¸ÂnnŽpÆ„ âÉ3–ª²½ :Ô>õ=EjGnªÚô¨D$5a'·þ“¯MƸ¹1g¾0Ô¢ãHÞen©Ž9+:V‚ÃÝ9k©ë,¦Îm&ƒHz¶9i”û1¦)~朌ývè1Iü¾)¥ªL̲"¨j4XL– ¼/@¯…ý/ ÓÜåümˆÖÀ™qýÐ!Wì#ÿõ9lx¡ØëÉqÖ³?19ĉ½ÎP ª|¥Æ]EMÉû~OÕ*ÛŒ¨Ô’VØCs ÁëMDÇgTj Ù©JJÓàdÞô~x°Mjê‰eÊÿs: ?ˆN‡"•8_±3¹LYˆ-Ç -* …‘'n—R ™v~|†&êm Fl°¡ÝØôè 6]At™.¯È°›<É\ ƒ®žÄžõ8—a] ó9Á0(¶¡¾Ø_ÿz”Ù{˜u“X•PÅË„¾7;|;FÏu-„.wŒhAŸEÔª+Tû×/Cµ5^ú÷³PœÍƒ6ÉGä¶F´Z›dñæ³d(Wsa»w¯ŸWI`̺øÿ~ýf(hŸ%A‡¬Í`¸¶ñ#{¬ÙÆ·©lð³öÇ…ˆ²älè«Zˆ×JG~5i‰ðŸ`pUNUmŠre¯¥ÅÜm”¼ÁéqãA[ Ž«7ÃqhsX²•%OPD5Îà`(:vj“˜mZ…­\lT`¼c «+†áìÌ6ÚÐ0̆’„ž 8Æâ²ôŽ'E.•(&ë54â˜,L2b¡“†§uo+~~Q (îÅ}@  ELZ°uÎØ—Þà‰aÐ`Àè()‰††ÑfQlAÃã`5G¢È Pu-Eo)£kâåê,·ª8¦®ÀsoªÒ#½"V]Ž÷:qtØ‹ê™Øë¥ ×4n<ˆcµ•^½é4#Å r)BGƒ%*IwžpE£Oud}j‰F#Ë0bGÈy™#Ê›sÿ¨†sö‰àO×Ù5[È,²_$1 <Éõ æ2O›Å²ëŠ¡hÛÊŒ«ñ<‰nŒÏÍŠ¡yx½UváA =úìMpp ¶Ô&níc”زñ±ÓlÔl 2f)Ø$f¬+2 aëš¹®«7o(Î`½M_JŠ“·…M˜No-b3 ƒh{Ïd"~^Åtz›Î5{ÞfψÂyÆN̨!è… ³ˆÉt³…'fÎÆ 3[¸HÌ‚ÁÄl¢á'j«cÅk$EM4È…WÛ„Øè'CÍ&M/Éh‰MD-Å~Ö[ûÛÚMµ¹éÑþÝÙ ù5 PD@Å(‘S E¹+p°ßUµ—`ÀìNÜwVŠu¶=qÞðÀìí½dâ¶FJÄ­¡ˆÛR`#\«M™Ái¯ 柖D+‘•”-Œû¸‘˜ˆm]±} V 1•^ÁlL`YPÝɈÀªev YJª•‘Ö î ®jRcèê î#AĉK#ðH½85 ¯°:û²u°×Ò GÃAU¦¦ç_€1“;6yT«´àF™ä ´ÄY v•cùDÀ³…¡–Øi®D­Æ+*Ôî’èÛ7†ÚÞ PÛfÉ0C|ÀNžŽœÅˆZ±S6Ôlè„•¤— ähj{/@mÛQ.¹l+Ç€•5\QØkeî 7 ÛVJ(Š¢áBY!ûO< 7Òr4:õ /ÁHÀÍW+*z4)'<„=. Ójt uiI³Ù\ÕXJÔd2‚F08µÊ{ÝÒf¢æl¤BÔœ¡V’âá€Ó'…áÜ 7Ï^[6Ü¢•4à–mÜð8¿&/Üf/‰¸A8du× nŽš{î° C ³žã( öÄ­ÙHÕæ­Ù¼UÌI¢¼ñ8ÅÃÙÛëã‘8z®eêŠSkç–Ù"%Ã1°×2qLVBmþ*pÜñ°ùÛ{nûHÀ­¶jÉ:Š‹ÜaÉšwTàJܪí˜lk[mþ2Ö–œCxêãÄc­íêÅp[#âVmŸ©â4h°W¸ÛwÕvY²y«6O ó6áŒy«u}Í©ÒI6ªÕp,mKæZªv2à`5²Âyâˆc±i'J,¢•Ç ' 6}{'DÍ­€ZžÈ›Mµ®ÅWîf]W³Wõ†*1³]ˆ™­ZÄì[ù¸¡6{1ÔÖH¶ë ¾p(p2ªÅÂ"/óÞvÖ<:ìÔÛ¤e›$9•’amÓaÏíXœ&ØÙ0Lq  “ãº:¬c4šuÀ8’’ ?ÎMülê¦.ÛÆÃÌí8ØÌí¯9 ‚DË ^;G#H` 7”À‘x%,7]®2µ‡”`ÞhFcÖr\V©Zƒ@¬`iÉ0¶Õ`kI ðpij((ÛDÝ1¼;¥6W͆öÐæª™òÞÆŽÆé,Ù{3÷"b¤Ì„µ=1•®¬(F°Št¨k@‡µ©¬Dqû(›½½ ¶Ô\±Èg³Yª³é¬&âT&n6}Ómú pÛñ˜¸m½·m¤Ï*}ÓV$é.€ƒÁ¶åhßû§‰‡`{0cÚ¢M[eìhœnÄj~p¯éu¼¸Æ#†ÎJ¡f+ŸpKÛÞ 6mjËá=lêíhd}Áœ»ÙI"bkœBÄší0‰í”Ø«ÆeÕè¿®G3 'ã"ÞÆ1b 6U‘ˆyƒ1utPx3©§¸2±ŒÆ­ÃjªóTKlñ4¢±3,ZàØhÆôoãûF ½aÀA¼í»€}¸£qœ\½Åm@`Xl¹#V3ñD`œmµ£m?gkç*Qt6«¬×{ìÇ [Þ½ ¶F Äu”£Á–N6™Á6ÍQR µh%¨ÙFt˜Í…Ƽîmeê†b²É ¶û+%À1Ùt€F:L¯˜î1AKº ŒœØ‘;ÛQÙÕñ›ÃUâmR=–3Úõ@0 yÃφ££³Ø++œmظ-4ŽãFÍœ±zŠ8ØÑa0¢uØ€Á0tÀáÙY£ €"ÏmœéîÅì ^\̾pÐÝO4ŽSÛ£7C1Ñ:ã€ÁæÕ±àîIÖ … 'ƒ³áhÓ˜'Ž6™8Ú4àØêÂã8ü–ßüê 8Òz­Ìë!% )˜2O£µ-‰C«!"Q¬†‚ªòÅÌŽ1ìãÆâˆ ¸:†û€ÀÐyb$R‰^ù S(p&\»¡h´ƒ¡83¹§jô±9w<Ž8 ùͯÞdž,4ñ%6¯’E`gpR¸Ù¬V#˜b#Š9ü|ŸÅŒ GÃD ÃYŽÎîñ>µ¤¶£ÜOxσ cc¯©²ÜYRòcö©q¹ÛWq¹ÌÉtõöú¸GDÿþXçÊxµç G–hkÓ>ØFs‘ Æg¡>N<Ú¡²jouõöZ%Ž’øyÇ©ØMÉ ‡‹¦Y¢·`3IÀd³Oà…G=TíͯÞ^«dÃ1]ô˜£a˵%ìAZ-ÑH¸ }Γ×t³Ï®mx”s¯Î^÷€.ìéJ +QTØ~Çe:-‘£gU{g /@Ö ‡étãq§Û{{}Ü#Jÿ¦}­dîÀ1Ó¶pd‰5öáKú(€£hK7wB¬½·×Ç=â§fàéGš´D—á–ÏçÊôÄu&ö¡m諞}òÜäÄ£Ÿ¼ñêíõqø©%9Ÿ8¹¾Ã.Û=ù[± ÀêZ‘6^µøfŸt&xÄSÄ\½½>î?µ$¸'‰¤ú¦ñóz§uq»Â¯?56m¦K›ÖKÝ£›î‘&²k*ÀP᪩pȽÓÓ­à3oáašºŸ^8ì äê èíƒÝj:T^k’‘Î'ÙÏ$"}†6 >µÀî†I|tTE•ý]ìøêÈíc}®<ŒªÞ&h¿†~vÞ–Ö¹R n[}cŸÝ]ì"ìì¸m#A-í¦Böµ×TÌMº˜VµüT™Ž‚O-pKO–UÞ¢?E ­/[€v´z†Î¼ä¢éÜ)­Œ—ªïB—lžºdoÄ®×YìJŸ-Livxá°+QWOP—÷Á .s¡5ÈLUÝdª.ÕgS}ЫO· >5c€¾ €ÆÙŸ¢Ð¶¯[jèÑQ¥¢¼ÆªTÄC1%6"/l'ì³Â®QéEîÍÆe0^i h3ÇÙ߅®Çïae÷¡°²rËQ9¦z%ÿ††žêM4dÑÄ aø«û.iT¼Ï |«ê£ä€G@ÒÂ1u{GPFf,ùDn‹Qâ#²a˜b+6Œ§P#öta“Xf}–àÝ&‡—”´¤ò½Ï>/4Ž­'µÕtcäÝ·îgöIÕ[ƒêµ-RG¬Ðsƒé½ª×ʳL|üÉ38/Í8um£5Y@Ÿ°™ ƒz¯Þ/sz-ô/tzz˜p.Е=a ùnaz¼”ã,pGÛȸó„»ÇÇÇÁü®Þ ¿ï#~®¼ŸÔŸU¯5=6Cg„eÇú,“xo<ñ{õ†ôûˆÐ½£=NØ ×öùÄ_žÛkÀ¡<ÄA(áãR®Í6óXQûT.Ãêíµ’ZÎþ¥$˜Åà¥ÏGAÞtÑo_è¢yži '†’SâÂâǨïÿêÓ•Qϧ ØyÍ}“)RqPmõLÁa×—çGJÌc QÓÿM¯lþ&¨ÞÂûëYßɲ’”œ©:ÄBNZh&‚v[V·ïß²HìlÝ …9‚åˆØ3iœ™6Ý ·=…ôZlDUå¥$MK (NÑp}Þxì¬êî 8î#2׆MSmÊš; 2’ÖÔé(™|òn+È0ˆúB«ÁÀpÇbgøwgÀp™6"ÕöˆÌѲ 8ó\xŰ3’j½ŒÒl»A°QD¡GÅ¢ì¹ÄæÕÙëãîóʼQ®3Å…’L³'Mµ—„öÁlAs[]^HìªÇÝÙëã),¸@¹I/ƒ ).ê®[ûŒŠ†©÷±yr¢À®®>oñØaíÍ0R#BGLe–G™XCÞù‘èrGXn7j8µÂ4"¢ä ŬЌˆÍB×Ñ&J2ÓÞfŸŠG]xì–ÄÙÖzk-÷…”3eÏjÁK„ó"¤¾“,AúfLD ˪äécä(¹ì@'8Ÿxìó¨½Eë-¨m•˜,,¡ÙÍÕþf(³Zçý%Y§ä‘üw©üIoéÖÙ&iôk}ž_ušwo¯{ÄÏëfJ¸â÷˱Êò sy–Ès{’É Ì6òˆa´G ƒ¼bxâ±ÓõÝÛë-Hû·EtÑŠÔD(O1sÁÇaÄÖV¸Ïº½]È\‰?×ëO²^¤³ð“Ðþd ÷·3o黊œ»æHóÖ9Ó.ØÅdMß %Åî~‹ëÝy>N‘»ž¹l÷þõbëY‚1˜=Äé‡ ì ãuŠjÉÅ’%ˆÜ3Þ‰C¿éZhjûŒWÐe)‚M}ÁTèRæRè «¬!“X»\°½Ë.«Qû*Ñå¨uÂ\޶=ºªG|“µö Y<·½'¡Ô­FÖü¡Þžofì% -¢eÜ)ܬEœ™Å"jXæ6¬‚eóƒã;Øïây!W –ÈaPp+QM<óú ïýNŸHš,Å®¸‡Èkš§B_DÆÔþäXR 'Ü€”’b%J>c· ‹¨ÙJäužJ˜ÇªžÏèæÀÜIqüXây \QÅ3Ç«œgF-qÌVǦÂÛºšwá'^Jx©á“²ßÈ_À^r'aš_\žK¸L¤Qñ‘û—Óæ¥+‰Cëȹ.cž‰ ŠebR’’˘ÈVí¾cFލh×Àµ7Mf%9·²Ý¦kÈ"•ì26ë*A¾:?sy Á޳„;©‘ˆƒ¥Òìù'ÿ$â¿$;»!äyïЮUU$y(‰DÌwä5[…e˜q–¤¬±zdOívßQ¼e>]+×òt;ˆõ¹Åä}p½ÐBXs6Ê#¶;[c10 ßdòžú©’~£ªÈf¯Wv=i+_p2ò¥2bê7rå¦î &ùƾjèƒ3}v¹à]#ªm•(ù–õ¬9É·ùB%rm½‹>‘˜§Ï’¥«žº*ÑÞtÕY’LW%\.¸Í[ÒM…ƒQ+ˆwæV5þ`”©7»•vû”p%¡ÝF8æd3¡Ò®¾Ö( I»xC^ýJ»mñ¡ÝjÄ[x£o7âµIK#ÄkĪQSâÃ2âÍF¼‘¤šŒv½Ñî$ÞhÄŒxU9Ïé„x+Hµ©2Q€o2âuF¼Ô›LÅçU#<ž2è54h®EŸÿéšÂD…¬1²ƒê}~MšLXv¦mÆõœ¬ÏÀH"i¤/˸2£ÞyQ€2¶=œ™+»êsRŠË¦[IfJËiWW®Ìl¦G3Ѻ¤Rü)J࿞.¼¹’3®<Úm¹^™Þˆ~™R¢‘†÷Ì=/%</Q B‚óz|†”mFÓ™›ÂÍÌr×'ÏoРlÂDÜ,ùDf®MäÛ:3¨šM²ÖkŸÿ«g:@ÅFÄßsK¼Éá|Éá|Éá|Ëa,åîšx“Ãý”ÃÞr8ù[£d÷r8ù[Ï“ÃFMå‚—ž>ÊaKÊM9l™Åæ³ù©–¶\»”Ã3·Éa£ð%‡§ber8xS !ˆ‚å;Û-ƒó› Η î— no28ß28¾Éàü&ƒ“‘¯Éàæ|M{÷&ƒÃ%ƒ‹Ñ¯]÷5ú5ÌÄK¼ú-ùŽ(„#è×™n<¯I %Ì™> R¸sq½X?I„[ÛhE"§t'KI'S&N÷ý„ƒµ Ö I›oPôjSõ²iÞ[D3{ŠfÌ.–×Ý„¾§6Õ Ú£òpª„]9jâ)Nü/¦iö­¡nO|çRÎO8^<‚‚>.Á~òˆòÆ#ÊÅ#âÅ#Úhho<¢ž<½ôþôþôþMÐûKЛò^.x úÉ$âÉ$LÐÏ÷ú›˜‚>™ºîÉ&L]÷›˜‚¾ÞrÞ˜ÄÁ#LÊ¿‰ùÉ'ÚŸ¨ŸÈŸH7ŸXb~2Š7>1Å|2]}ŠyoºzxãñOM˜ªnb™ªnb¾NÑ‹|%ôgi&eÓ¿u>¦£™Ó,í² ûézÚà-ŸtÖ—É4Æ@U¤%^f–d­ÑŒÏ—Úax¿4ÆÇ“ów?Ÿ™‰¦š9{Z[Ñ[ä¢ocÝî‹_¿f—¥ó×e—¥3½‹u\–Î|®étV,ÖñféL_…±ŽËÒ™¾ŠÅ:Þ,髸šyüF¼ãÍڙΊÅ;Þ¬é¬øgxÇeíÔÛÚ¡¢¡{EÓ°ï`ÆÊ<…¾±gÆÎJÈ9sÄΡiÏ’ÌC€-ꢚpNÊÜsÔ$íš3Ás®ºÂ¹†­#7­d]#;PF!9 ûf-Œ_V9O&T­DçxÎ$y}¨D¨8Ì1|°¬$d ¼}b¨Õ'ŽkT†#h)Õ°HÐR"ßÈÜ•ÌT±’îª1?Õ˜¿ “ÍqZ¡Æ8#;&¢–¯ÞÏ@xúºë¾TÀYDf´T³èC3*àµñ¦9d¨¶ÈeèAÔ}Â][8S|hZ4³Ú¸Wã)šÀ ûhFÑÑ|‘ìs²ó¼=˜¡ùòtÙÁªëÄÊÛ‹8j§%{…F7Ìûë¹zY2ãÄ~º^~º^È)þ ®—l:‹¦p¬¦ÚKªlfÙ~˜%°ç Ö4Ív¢jþÙÈuïÚñ(¦<>›È5ðÆüíx(p—W•ò©Ÿ™Ò£Ù>Åž©‹ÚëvržyÁgØ-ÏÂÅòk×P«`ÚD“O¯S{w¹ß¯óôvˆJ‚.A—‹ ËAû‹ ûMÐrcô h4rýím,Û:„“ §‚Ž‹ ×›“¼º]O‚žoó.‚omu#h#y#èôFÐÍ ‘IÑIû¦5ûEÒå¤ËIÒÁ]$ÝßHº¼‘tºIº¼‘t~;4 ÷¡©÷o$O’®×¡i¿MSå¡K H­lY„+HzFÌüYHÚ}¦1Ï$júfqÀ¡Ï–«˜Î¶Ï"vž¥ð+“q-¢˜3U@CWý–š`¢F}¥o*¦ŠàjŽÿ{ù~ž€þ<}”?È hr$Æl9Å-¥wã»S8ß!Щ±dĘñhâ.`xMµX!ü²œ–è̳Z(X@{æõá“|—Ïík;÷'mý¤­?,mÅy8ï•¶è /h!ôCښdž¸I­‘´e¥ðÁ›jÏUF{€’âAƒÂs|o ,ùmŠšŸ0“>êÐ4i³Ç,ÄÎÉtž3¥§ÍºUEÍê¹ +â´‡”i®*ƒ3`ÛdÕ4¬b¾0Yb_Mû?ÁSõÓkþ§ôšÓÝ”ñôYåÂÉáù34ïñSWƒ=3â!!Ím40’¨¾ÐžHœ!1 ÍCÞ4,O›JÐS›ÏÀƒBçÝfVùi|@YÍî3chßÌÁ¼*¨<|œÞÇe >K°.Ø(Ë.Ò|œÁ³ov »ì@{hϾÙVò瞥ó»Ñ³´L¾<{™¿eìlܱ³ýñOÅÎúLºŠÐ<ƒ™¡ñd›tågêqÍ¡^ {¯Æûù „ê©2U•øÉ¡LЈêÇÁÔJfLMe=Ô ¹ÌÛ¸‘4ívnן£³C¥¨0ÔÚÄËm²°Žj­îiO)‰ sBµ}î`/ÎÞF—û0¾š×aIÅíl™d[O¡XO™¸Þ·™•w—ˆý¾ÌÝu™7qúo¦@œþ›½Æ&'=ģňËsÁK NÿM:ý7þtßL8½7S NïM¸¼7áòÞL8èˆáRi½ùoòé¿™±Þ±òÐN-Mö7qXnq˜ÞÄay‡ùM†[Ò-·‹ÃhTë/ïM¹¼7&yo²ë”\>«^Öë»Hs¾P¥(’÷«¨Ê©Ž–„KbA¼×OôÆ㜄 òÍÔ¼°(:oc{T¿$¡_°9FOIh÷ããO¯è) Û›(ì—(¼dá¼ ¿9.Y8¤åãã’…›†~š‰?öãò‰NCñû‡o²pŠ * [‚Sô„å„åƒáƒïÎÐ[þ#ÇoBÐßBvÿq¼q Ár Áv Áôë¡üf>€¦7œ@xû.êéFÔ¤ Å®Åô41Ï·[Ò/ÕuÛàHÌÑÕ{#ˆ9;FÍ‚8@£ ¤VTö™Œ0h öuêl9=4ιón•ì[oäºí 1x;ysÿäUa—™é”™ý’™ý’™ýMf¶]f¶Kd–7‘Ù.‘™/‘ù–aïO¯ìšÄüž¶kó»Êîï¨ë¾y¦ÄüGuÝ`ôJŠæ)¤¦wW²´3!½pa¾¬µ„ÈKweÞU9¾Ý½ ¾Pm—•åÅÕÍsÇC2æ·µk>c‡Z@B’Éíˆ?`,]Ôg6mu騭FWýñ»MLZì\<Èn§B“’úí¥ýía/з2úùí©º¥s‰HÎÏ]k `ÒGs²î uo}7ædxèý:%A£ðÌSÑRQPO‰_Â)ñû¹Ž»ÜuÞ2nvÒÍîûev§%Êû N–sÑ…ÇçKØ;dGÞz‘wF8l6ç!Åy7Xn®K(%àlâÜ3‰œ”D­áÀ÷gH6ßÓÝÔhR(Ñ1û O‘I M±©û·!K€~›ˆSL3êÔm î¨Îkc:;‰_5.³+¿µ@˜”$Üc1Xéú >ϦUvS—ž.)åÉÊîÉ“MãB3UøÉÓ O— æÑB/!kÄØNÆ Ÿ*ã`‹ˆ×Ì‚…¾¶0å oi öÐÂ'ƒGŒh`ý‰%xK6M2›B´_ Ùç¢Ç€OÙ áŠs»f1h8àb¦¢‘ª…ï •ƒÍ›’?{`ð@&dåÄ¿+@erRW:áï…€ ¯Ú#Õäå±°ÁøÎÉúÅÊd` ó‚|EúIôÙ4K#⎩nvï5Q²#µiUñ²Z0Ö<ïIˆ–y–ºSy#•nÁfŸ—õ3Øì6“3o£I{Á´gºDc˜Qäš•{…Ó5åuÊßÓ=ü®{<²écéŸ"Ágúøùä9=ö.Ìô Z—›c«ï/I*W§G±`Çy;à•;žŸgË.ˆÇPÅÅh©iPiï¼Æt®þfê´KQHÍN%p€Šoe|³ùj"Ì o ŸÇaMMÂFV¬¾É•Gp7Gx3¢<‘ ~¯Q•¸¯Ï°OsSŠ[ÜCÝY€çs°ã˼Q"RƒB–ô½gߥx1emyI’Ñ÷æ®üüé®üßqWî‚Z‘ O+š"þ€”¼;¦" ìô1%8È+Ñô™ïÔÞ‰¾2uì¼2øÂ‡MPl¿s±òûý[Îÿ ^<ûœX¸ò¸±2 ¸ 2oû=Ø~Çíë WôâL 5×ÙfµFVƒ·0’jÄ,— …ä ¥¾D¢ÑÔòM˜ÀÛ¯}^Á)?¯ýcW‹N]öS÷™w˜Õœ(»²:åí¡4•Hp«×‘TÍFؙР]L]|4 ǧòmç=6 -b®Ç6²—mãÛ6ñò6ûËå5©ù΄iI»CúÖ¤~:¤ßÒÎÒ­†¶=Kw³ÀÜ@تÅd?/óÛ¥ìlÖIFÄH®DÓ¼j"§uvJ$Ç5ØE3ŽWÕ;ý%"µC·µˆ¸-fWN%_ŸY'äìÁü_´Pì*Ó×§çÔ0*+‹¥ï6.ŸÛ2æôؤ;  ™Á¤ûuÏù én9æ¦;eû)ÚÛ›lÿýRɾ]tž)·YdTÕ6^13»¢•ã½Z¹¨uçµ´R|gçMS Ñß¡sodì<ÉçD=ÿ+ݸ 5‹´Ò3Kxp¨¯ 3é÷'ÎÓ{`·j¬‡5pñübæ~×'IãÍ9)›NOíêÓÎØó®~;ãí«ÔoêL3 ~åÝ'RguæHx¾7*nc›&Û—ÝäB²<­ ­ox:r‚Ò?̈õÆÄéAÁåJì\;Ì6½µNÝÁØxÜ<]e&<èçWïé*ÒT¸Ï|åqæ«h·&¿)ýrÃÔK}(on?ÕËl¦þ`™mâԌש?O,é%qi©'«å¿M|tc$ÌШð+V’:gºÈ#¼ìÛÂ*ç;ÏvHa<ÛQ?ž<[¢Ipj¤Ïfl<[ìGžÏL½±QbDó&:n’F{Fÿ´ ‘Rw®q°òD ™Àõ=¹6ƒCüJ¥LO ¹vë'×¶Ã|ªI_|ùúlÑÜ”­ÏÆét…¥+U|´ÆÝ‹¤ÓY+…±*vÊÕ„ –¨áæÏL0{ŠÁ"ÈpEUžfu¦Ì\æ9_\1TÛÄTuèü 1…è…Ó4¤ÿfæÂêæqNƒ·¯3)–d€™}M-n;µ{•ƒ6²7ÎÂØ·Tt3¦)Ø‹’S,9´—\jXÍ>C’7•ð6Jc„a²[jª $û ^êÍÅ®âHQƒ3¹­««.{:¿aGx M¤Ç—MO:®áyMË0r· ™ÃÁJêY¡ænþnЮ.Íõ=áz¶¨Ðév¸°Ow 1O8äŽþn¯)\p¹[ä«F®'\f(•åèlô¾›…ÈJÖ34aò=º<Ì‘HyÍ.å‰GˆkÏjÛÍ·h^h|û]X@¡›¢‚ K¤Jé‰Öfœ³T.T¢ã¯(9,>XTE‹z^¬ ²¦Æb,ˆ÷ñÔuõÆ'¢á¯Æ5””Fž*7•Œ¯“É`Ø¥¼]ÖÒg-»[“mD; ÛOk^{äÐqj>ƒÊ6¶3ÚÌ<Èh|³F\ñ=?6uxÉZU÷Å @¬S€#½Ó(–Œ}‘WUÀ·“§ˆhÊ\¨Ptsûñ yUg¿7Ü'Zœ@¸@¿®ô7ðônÞ²_¾y{ÑŠGZ ®'ìãÝ·³Fà˜–9s6˜¾»Çàyʶ©‚ï[¿awØÖOÏóš”ÔR‘ \I¸ñ›½j8NiäQãß´ÀëÑŒå´-ˆ:…„®<ü‹2£ +Õw\¤ñob%Q°¶Z€Ê1‚¶¯Ä=‚Þ¿ÞÆÍö!õÎ`§äÕ¡/˜;Ù×9ìÜÈC)e£i=²Î&Í&ÿhSRþ)ë¹È¦U¶™ÁN¹Uº–’‹Ïš¤AAØË /¹„Z6nêfT´Æ;Gf.væE„Ã(‹z+v•t%P˜—KóY£_`9TDðïp=aîþªâ÷»ELg´åËæûæÛ ¿S î=}½}f¨ uhÆÓXS„$ÛP²vo ë°>óc{ZLãê«wÆä´õ±®S“òiÔl?z>’fÊ}‡ ÈS !“¦ ¬¦ƒÜ3i‡-IÿÔ6X2µï§’»¶±JúYƒÚÆ„§¶QfäǸàÝ©½_ïüba‚å‡Õz,Œ¬øSsrzOàA‰ ñ:‚¼ ósá¥å ùй©såR%¡°-žh¤'.wó¥¹¹Ô™f¼d&KiÁÀ Ñö­æb¯]Êj·èèÐÉ×Ê¡`   ¶œâgœ¿Søxצ~XMVqŽl¡Úûqe¿Z`;Sn£/nkäIùf!W²¾b8…{ÿuôn}ÛEz·_+÷.òVR:=æÕ»¤ÅŒa1'ºm;S{èÉ76Œ¨ø7Ë&è·”oØÕœµêöãp.À>Ä{ÄmÝè%°Â JÅÎÌȈœþØ’nsG&Û_`?Õ^tö ¹Æ+HDSkǧFÞB¡Û5.·ç0^BaÂsO¶fwP€C˜OxbÄÊù0Yèl†áç5“/ڜֹgìåÊnÌÁX\f;™2‰Vt…Úb}¸YîµP±· T‡l¼ŒBqTúŵ•XÂGÝ“½CÌ+=Ö4óf\:ª'‹:«–iʈYÃaÎøŒA¶k=óQÆn1OÞÞ“#ÒëYÆ~žQc_ÓÏŒÛ$õ™Û&ÚN6Ý©–ÀËý%lâŒäæ­]z“qƒÍ³Xç¡ùv’yØ DYa'3œtb‘v­0˜^òWiéû\eÆÐÓ?ãÊɲVƒaÄ- µFNâ(+ídniRæ_µ‹ó¬¶Dð~E‰ZÀ~J|Âóüa ÏÙdl0é±¾üÌàwΘÍÊÜTHo8n{éPå‚ÅPßðúÆyÎ=OL®ÜtvƲaµ'Ýxýޱ}Ÿ…4Ú.ÉççÛ資rÝŤ+jbWl§&+1èôkM¦‰ºïÝó Ûõ…ƒ´ÅçZtΪ]Ï/d¤ØüÄìïoÌ×9WÎç*æt¯É?¿yQg»©ñ¾<¾÷‰Ín̪Ѿp~ó!Ñòlð Л»üJ C°¬;è*˜–4Ÿ¯rÇÝ€Sü£ã“vø×sçÝùh®m}s£) 6q5¯;R¼®ë;Ø–|íóÍ­PL–tØÙà2Ïí‰_¥"Ùë 4gSZ8íÏŸf ¶ ®oöËÇAV´èæ …;f2²©#¶sÓø×óp6Ü3^¿šñÿôñîáÊÙéÍùñ÷çü»äΣ·ýý_ÿ¯´úÇûèM*ŽºÑ™õ&†ƒh ·Þd"–ëI^åžÀò ›Jo"´DøØh!·ÙÃø2"­!¾é˜z …‚ …_ù]DÌ0wØåÜÙ“A£u©W˜d`%Ãf&"°‡*Òÿ7@«·„ûoQŸÚ~ÈLõÎÓ¾‘Þõ߿ҩøWú uŽü…>n¸¿Ò©[ú¯ôAz\ôWú ÿÛr¸Jû£>H÷¢¾¤LÀÆ®»N„õÅ)Ñ j)i ¦•XRÑ&ûHNJþ÷OJù‘ÛVï0J¡!Êø9PË} ~(OEj‹l_¤É¹.p˜Æº&ÓXÎI ýœ´ØîIó?|Òô’×™´*‡f¬ƒŽW;'mØþ²³š'~]?(që£l_T€pÁ=²sÎÜ5gñš³pÍYh眕{ÎÂ5gíš³ø6g$û£æ,ÛF+˜3gãEE‡KÊÓk™Äç$ þÍ6bë:…ým›ÍÇ)ó×6[Ûî;Sö¯o3Ĩý¨)Ó86«!=Ø”uX¤MðMm†`Ô«û,Ú”hâ»m‚ê­…·IY܉ù§šróhMí ûÓöŸ2ÓbýhðÆ5·ßnûæ‹É> >߯üÜâàî¹zi ¸W»Zæ.‰VÌ·“¤êlv›Í 5r5y×n6¼¥ëÑÙÄÁG55Tçkõþ¸”Ô¢+öê2ÕÓ=%%Ù³DÖOàbpT¸8ƒÙ Eë›*X…š¾Ød+Àâk„!ÜÐÚ[ï &¨7„5vá«Îj´¯6ù¿ây0ÛÙëAD|¯âwô4¶¦*-VòùV‡K%=$ÌUî­(£/„˂ϻ†4µîF‘†âÉ*fbŸoU0¢zK » — ¨q: Lúį w–HßY^´ÉÐ]¼C""éð—³ÿONño<(WHÕQ¬Ñªüº+o ¦u;à±}XtÚl$–|¢D‚Ó¬ÀaësC`W-ïž^÷h~1ø ¹MfG„Ëè73Xò‰I†emdÜF|Þ7»¦w÷v,Ÿõ¿—Ärâ44» n†cÒhh+ùD‰œð[ÇŽ»bu÷vàØÞplç<ævÍcµuN*û¬ä%’sÌÚì9®âxâ±+2woŽõ^k Ø@ <àÌiÔÓq+QƒlÁÙFàXf—ŠEâ˜åÐîÎ ­û½ÄïÔ’UR°x¹\œë,ùD‰÷(b‘[Keu)pØ>rÉÞ»¯Cë}•è%þÎþ„×¹-Q 3÷Ú0¥ÀìSñ(ÛW.Ù{÷öú¸G:K|Õ#|ö!²IJ"ºHÃöð¸ÑØO"´³4ûzÍG¡Óˆ€`é _MjªpK€#ç%¾FùаÞí} ìýãÂb?û¹;{}Ü~Br¤ ®ZdÂe.Cl\ZSÏ_5¼‰bÁé8š‰|ö)pÊ9‰ë¼õÆYÜFdÿê%bày/Oá S’‘Ê\Ù"ˆ…%Âõ¬¥{-qé1ûôU£¶n<ö`˜»·×Ç=¢òYÍ;1x±Ø{ÍÊž —’Œ— È'eøNf‰¿,y5ÚøæÁpا†¸ŠÛvÍãÞØôW¨P#<ïü(ì+`1ö^úö1K|K¸É3ÛH‰cø2h©‰s3ž½½>îµå~Z›>¸$pŒ€1ɼ‹6K|˸àéÿ«ãt6ã–ö¸ñ8)i³­·×*áˆì¿+ˆï%lÐ7ÀJ@b:$ÀzÝl–H¯0ÿ¬”$~gçWØg.4N¾ËÄ:{­ÈîY ŠdîT£ÌX‰æ-€C7 ¥D:íÙº(ÄYÕéÒ®üê SºHoyööZ%‘ý7ÃÝuVP-®8hq)˜tf‰h6ÁzèÊ[Ù£ÀŽoXœúèìõqGg†‡j¥²UÀJ˜ªW€[7C@ŸquQYâÙ‡ç¨åqaqê6gg¯{@v¯*CòX";áHíŸÐ¼¡‰@J³Î¶ œÄØ7û™ÛÙ[4爻Š ê ·7…u¢Ã,9‡ ?X¡ß”Ú]OÞtkjÒ¿~åb›%Ô­'|+×,¸µúßzô7Õþjòzo2½Lª(ä`¡Ó©hŸi–|ž%"%v8åžRƒ„°cØ Á–­ÀÜLŠxˆËe#p¦ §SQ‡&½úlpk%¹<8¤Ç…ÅÁJ®Î^÷€æeªÔÄ==6ÔÌs¢G'nõD±SßKòú¼ð8òÕÕ}ô¯^&êâ(AËáÕ=TÀ«»m?‡ÌGÉbuŠ}¡H±vô†·˜§5A]ÜÓ‡£ü³z:Lô®Âz[bëUK>Ï’fªúÔn4åàêŒÉ0™5Ѩ*çÊOœàÒ÷t¢¨%ŸgIn>¦±òÂØ¦d]½Ñ&ÙF¤A¡S{Ï»ù ·í]eBM ßzÕ’G½“|ÀÉ?n<MõêíõqH‹Â'hãªhâ¡x…a¥4PP-HãŠ^Ã,ùÜKòò©‡Õç‚Óþ¾á¨É^°A0KZ¢ ˆ'Ï–'D½¦“Q}ÃQḬ̈$[@rä…kÉ>l³†Õ./,¾žÅ¦dòú8M‹sʹÊö‹—8®á`Ý(ùy}æWRZcž Ç9âÔ§KT¼ÀPíœêµ7ÕØß(F¢ˆ6;ìÛãFãkM½QÞF4uÝÔñJõœF¢…a:b¼QLñF1Åú¸±8þ«3Sø÷Þ¿TÞÿQ=–m®a~Âÿ®êúó=.p•'kÃ,ñ· „ÔÕ|Ÿpð‰îˆY‚{*…7IþAØóÊþo¿¾6׋«Æv®wC‹î É‹¥/-zRÛbðÈ¢›×,¾Ú­‹…ó–€rÆA+°4™‘>áÔ’o‘ú¢ÉËþù=Ö,íkT4FíXCºêz EÉuäÒ¢­Žãi®9H×±Š=³ÙÔý\³šï5;9í‹Î.{ð÷X3yo÷XÅéÕE)tÀJ¨@taŠ65Ôz£µ*/ë}ÃüÂT×®®!æ;¡‡ÓöüçVäßGE§ùûÛ¯H}DÔN/R™B§S· ™é% O}± !”Ý@RY¢êJo„Ó³]$ÃÛ‚ü~lÍÿÎl ñF;|°5žÁ Œ Ï½ê1 Ó } žåx¦—•¨®{®G0ÒűÒg9µ½~sÉ;8„ÑD—¹£)Û2I5¯€ëŠÎ¤DŽÊ¢×Ç->’©IÁÜflá¤.˜ñ=r1‹\*ÖT‚ꬅÊnú„¯!9z`(Cá*zJÿ‚„º ˆŽ‡Z0…“7ø å K `¦Ò›XHün¿ÕÀ\þ²Gž¯%™‘ç=2ªU^"¡3V¸l¼R9‹ÉæÙG””ˆ•Èœg¬LF”¹d.m˜hp÷™¥Ùw¯áz…S'š%žá ˆ_’‰†‡¶Ò8¢±Ú R|%õ¹ï^§/­ž»Ù¿íæKü^»¹žÛY¾{¯‘þež_¿ÉQÇ :Gc¤CÉ4k\MÎ@WSPaIl‘ÁAõŒHfµbÒS9ÉŸ:¾Áø2ÉzRÜ59¤rt »»Wc1!aÊôšFô¼nyînœ8*SÒIÖdbk³:©ñ#·sêË«œl*Ùãÿ×,Wîæ"⥳ž£IñˆÙð<ú(¹LJûQâ°oä ö‡^Ô/Å_åàØª“à¥S)œÓMÒUÌ`H¶‘U®v7ûÃŒùÏ’¾¹ÍX]“Ö”ñ ´1^GèMÖ\Æ:ezeA’¬ÉÊ klŒ¹ýeÊzÁÖLs¦ÂÓë2v^²ISY#æ>)s±ñ·&³žƒ<¦=§œ!Ý~ p’ÎÇ}å{¿ìw$ÖoY„§Nš¦+šáÃQwË>“¥Ë<—™P`šÉøö™Ú ½Nþæv¢ÜŒÅèlÒ²bJô€·Se ¤Ù,£ þ¡}Òzü±“¦ωÉ6iétæd¾a§LÛ3ÄY–=†¤F€.¥Í¹xCSK4 ÊGõÏõjÔ©Ó¯kÀU(Œ_“a‹w}OsÊ)ŽØ–˜òòLs†¹O›!än‹z†N¶)·e†ÙÒ“Òæša Œø±Vž<ðð¸§ñ—ýÖÉú-Ì‹’ñÉk@!cÂ…·+˜qΰ7 ˆà¸³ªûVXpz¯ÇkéÁ%#e_ÐŒ r‰" ØFîØèTLÉ;L;!m=DëiêÅìž§à"©TËêåylãüc÷p9ŒUÄò/ÈíùŸÒº0ÍË·+•„ÃB‚B ¬Îv¿z0”¬â_ da[½²°ï4©aò~T$£ÒåªIÌÐʼÜ£¾‡fê”2z²\×Ìp>vn΄ü«$6ЯÁQ¤„³Ü´ç*Å‚!Yôyº FM*½UÌ´ný©3¼0Š*ñЬL OP÷«g¤[×GœŠaÔØð’¶]å½Á!¸~ÿö1K˜ktÁÞ!˜pÖ æ ,Ì’ÞE‡- zÛZXIqðìNXÈ®úËnÐ |ÿõÍ‚ŠU…R¸Œ×w€7e'$ŠÒº0%]÷‘ôS¬#–`”¾Áo†îe _fò×f´ÚÊ>ÜÃî^Ýã·uå:ò^Õ|>@e…,5Kpë{=¥ñëÇ*i`Å*.÷±Ý»¢Ë¹8m7( °›wSГGßÀì<¢1u?&îÇÂûØÐóè?)ö`q´Øå¼øOú£w¡ ŸÌ&§ð”RÅ“³d„“yÍrLm#±ÄÑìÕ =é=ÐÐ…Ëzz}YaÕ/L½ña€>âÒª™`)ùT…á ×O”{oüMæBe§§"jº:ì…kÂl6ÓK%—¤d5á:ijקÏV‹ÉkX*[4EÂAÍ äñú6šÂÊtÅES;hî챨 ÊnäK1â>ÊÁ×CÙßÁñLápo£vm£pn#EûØGêAö4ð{Äj` œn’ŽkÛºúØØ.ÀVöp&9ÆWùó½ÎIkÉVΦ .Æþ ÞèÆIóf)Êã‘‚°NÖ]¾îÇòätp~°÷PpLÏûìÄkvÊ5;ÕfGÙ¶÷ð§wø'túåÜ¿©*¡Éd1;Œ§ÆCÄ:=jЉ²Èù±Á¦Çv¶eUUÝ;hâ2{ páâ„;oeDP­|¡SÝ ã!Κ©G‹j;_é+êo¬(\¬(Ÿ¬¨Ø$©áω8}âð ˜ÄØŠ‹]k{:OÍ‹ñ±•&¡7ºÉÆ0” yŽ/pPBÆ‚aÈ–ÝXÒ”…8“ȴȶu qEÜú|’š>ßûƒIÍᎀçAU¸º+s‘/‡DÐ |ã IÝZ’õHU¾AŸ¾èºäKêp©AÊ?t©v4ýFótô@­³òò¿òþÙ ²À¦}X”êõ‰OnË w‰¨Ü¤SÕuú6,/S½2#e»/70´ˆúpìøuä(9¦x®Ö~­A{[ƒv­A8×`ê-w<óÄó´…»ÇÍ9ÈøÎ K{¬«%=0ÖG{Žopx5êd_S\ñLÏÿ¹+EÜÆ?ã¦5üWBqa C(n°Å¶Î/™·¸|Àc !àCÐEš%kƒ{„T ÏüS"ÿ¦ ÿ9?ão0 U“ |[@Kú*ÑK_9lprÓJÆá®””¾× Ö¾Áê›ÛZ„iy[zƒxÀ úóÖ"Á¯Vððü.8¬ŽžÇ ³FYß­p}kÑO¤äHÉï0õÂÕ"$œ ÍÛžP¸BãÝZtèÄV#z³ã#=a> â¶í´FÓð¶ÕÑB¸Ýþ¡É/bQÙ¶öùœ\aDG‹¶¸!Zdž=XÖ&S8-~Êy1­¡ Æ÷+y‚jïSžÛ±LÀ…³EyîS%ˆw¸nô‡5ìÓí™eƒ7ÞÇU5ªU£Ãåa°f–=Zèí¼­BÚÉÍkÀÑÕ íäÇãœËÁÃQó  B^,BáÓnkÁ¬¬¡‡!m‡= ¢ÙBNŒ¶‰p>HE­þlÑöÏ’Ç´ïpØ7©4ðñ`3aèôûFžéM¶¼j5‚ÛiI7݉Ó0¼Ž.å…·ý+B¹\¢Ž.ûÎÈ|àËä[ƒAÀs[K…´D‚€e.-jW=ØÏý¹AÉÍ i±n1-53˦¹{­A™ò5êd&€ûÜÿl‘ÝT´Fög‹ç”Y‹4(P#Of¡±0vѰ¶ “oÖèss),þôt´(îÌY#NJœæ†¶yÒ>j”¹râ ¸Ö'¬-æäk½z¿°Æ†¥T7œôL,NF x±@k‘Ÿq¯P&ëi† ž‘RNSn™’f‰ú²3À´C2ýwIñ&ûj§3u¦¬êZdÂ8×g Œ‡°Ã~º_qꬹÔÊ^#P!2Øs8ÇÈ*¶Z$ŠB«‘É› .ÔþW‹JŸ§Õ0ǺÁýy!9¤÷©)ž*ÁÆW‹Hym5ÌD5˜ñjÀ‹s³¯GNØlÅÙ¢šµÈâÉÝÁ¸w@Ý«ìCLG®ÁõúìÊ$CV¡¹s5åzí¹ ›)|Vƒ™Ç&œŸçr7snX…F­…pw÷¶íþÜ}ǰ§ýGj^;ʽžŸÔû\‡©w•m©Å…üGêÝ«E^ûŠW/;lÞ¸Ù»¹RÔ»&éRïJål7,Uíªy‡C®ýÙ÷.ƒ_{…jWÊG‹À8ÔY£Ð"6Ø\g³EtRÑ[Çg=ëçÅ‘´‚ùG nÏsb“£ uKéê;œv”©tY…k’e„Εü„U…Bjp« 5&–u5WÂ÷ q­m„óÑ º‡š©æá>¦^ lVí&®-¨í`Y ݯí¨Î¤ëåûŠéÕœ‹K¯f>àºÄÅ|¦*á(t‘ï[öYà%"Iïǃ£1òï8UMóPu‡ñèËq¨ŠÐ ëáéæ&<ް{ìÃ#LŽ™õX% #ŠÏ`ê€éšP½rÖ s™0Ifk‘±³FÙûDŠò~¶¨ü&«Ñ®1:tüÕ"“#ZÌŒ1f:û­EÀŽ™5¨LØ0V‹Ì(3«A:a’îÖ¢ís\pû˜,o5(~ê¡B8‡(oËQ®é/”5á2£—¬Eán¨ÑÏ1ªc@êl!›p_0s`Lw*÷ù¹†ÜÃÞg®¶Lf ˜‡ÛjHðôÞ¢…}}UF^ëÕÒ YL9¾µ¨b³Fß÷ŽFÏ1zØñÔÃÑt´H [-ÊU£]=ôk ¥q£8o7§&ÜvФ Ì{ `ŸN8î3AI÷ ÜuÂm'P•{î QñŒº½Å”µœ-2ãf­FÝ÷„JÊv,‡8$ú¶`ânØIØÇ¾&be¶ýÃïÕ¢†Š¾XÎy1<]Î1¿¢DÆ u8ô³…5Z…¶ö¥‡´¢$³:ê×p `a9N°0·…a5*%Átjm-:ƒY£yÞB08Ü-Îê™lp¹Q’#ýý#ä îÇÞ¡ Š{‹Îƒ ÛuŽÕ‚öÖ¬Ñ`>Ý^]ctúþs¤"bpšÄÖ¢ìD¢1:õ ïÛ—r«m›ÏãÐ Nû´Pn-ê±±4<ó´ !0ßàƒ™PnÕ½Ë@ô„;åØli»X ‰.ÞÁ´ÏM¼¾ëÁ DÐ äF¹ Gÿ4îqA™ø¤"oL\%£Óƒ…ÃUWß\uõrÕÕËUW)«.ëãäÔåŒ!W@'IS›CðVdbN<ÑÚ`(¡•I……)Ç£F¡z`pÕÓ­û³BƒçnÂLw¶Zdf¶Yj&ÈS˜­…–[p~UæíCÀfÌ¥3Ø„ÑjÁû³Ú&|NSîûÄi—ÞPü†hÊ~ÔØ¿ ð y«nú§Õ¨8YšpÛ×é‚)o®¦»ì©¶Í5î£*×|ÌÚ7S¶+9àܱ’ÅçD5ãXVcŸƒ§ÞV›oY…î(Ù ¦¾ZÈõ™ý+Åɶc(fÎoèmß-ÐüÛß5‹-G†ZN¸ïHÃQdÙ&R䎔ð¿tŽÊñYn6¸_DÁ(…1š‰“ñnj¼òXeg’;©Œ—w½ÂQw(ù .wzœ æãÐ/#½"ýi.ˆ‰âq9DÝõÈÕb@†h øLÝaJ¦7¢Å½“bnp÷g ¾Fh5„ñ\p=d˜Ï Ì07á´#IgDÝ‘È<Øžp¥=¶Z4’ˆÕè·„ œV á-û%Ì•Ïêiÿ-Ï{P€mŸ­ê|GbÖ°Ýmp§]4[Tw.·É<_[óUYL^k°ÉœÕ¢Ò~·;0˜Ž?1ÕpŸ9µÝ¿¡¥}µE&«³8dŸ`»¡á«ÐÝQ¿›ƒhÖï È÷ºAT³›ÓšÁeJ°²™úÜpÖûJÛˆjÅ_­®ù¾u)®ù¶Ãy­5¹Å#´F0ÛßàÄûO³…8ì 6}6hqu™”- €ËÉš4Ó0ªÆ“ o6!î¸ÞBæê¿áâ=Ç…/}4EJxçÝ%fÀÓåØ,Ù@2 ß¶ßéì6f«ºéüÝll‚éÚæÖâÏ™›š`ájÏê<8´ß)‚­ÕyfÇß%EÞö%Å_½“’ü X ¼P/fóg3îVGMŪáÏáøP<º³×fˆ¹ý^HY+mÝY™Yù{sGëÆgžfõf6çU÷5ù†ø¬½7¥tÔìnÛ ªÊÔmNz$OœÕ}ü=o;U Óvçs?ø]N ×+÷i{uïŽõ»²í %`u!SÏîpñ†·?• 5…]]£‹Ž²ÛEÙáqRö‚)lUtºŠ·òìÉ#Eó?{Ô»°?ºj%£OµÔÖƒÖZ‚‡ÅµO…[\H|õ 5:«ûƒÖ:`Ù´Öä J·L'Á¦%o¶W&ÀzÐz”¨}m}*œÓãÆã«­­·íAkޏ=hÍÌ7Þ´Ö,6tõãðL/‹Ñ­Ø^ˆÛƒÖZÒi!fÅ1©ïÂã«­­·íAkޏ=hÍÔ~>N-ÑÌÐÐU ¯Êñ¤ ÈÞ/jݯ÷¬G &³Ë1¬çso_½gÞÊþžµŽX÷'­¥$X,¿ŠåŒpí©g—gl –Œ^5|z=i­%m|À¸xrúÀã«'­­·íIkޏ=i-%÷ Ô[âxx‚9NL°À’Ñe¶ÇC3×µè5\Ï÷¬Žë# ‰¯Þ³¶Þ¶÷¬9âöžµzß-~€5æ[r pœÊuLèu¾îæ9Lægu~D}ÜX|õœµþçÃl8éKÛ[Ñ,ð|;FÔ³ùxµ‹ÆsP¢ºõþQV­/Ô)ØÇ†ÆWÏY£·ã9k±ìÏYK‰½o×YÃ>vÔl*#$´D5›6ï…%ì£îö ¯´FÛýAk[”ëAk)(Ôµ<d™¯Ý*¤9†! Ï2Ÿfö•%öBž\ããÀ¢^ÏÛ½/Z{äÉß^´>nUí±¿ö´S_qŒÄ ×íEk”Ø ÖœÅâ'S;^´FÛ²¿hÍ#‹íIkê¨ÿ˜Î eßJÎq~T†IêžPS3€kÑŠNÒÄA! ÇôiÂͤp] Ÿîâ™Òf£†½Ž],Æýõc5 |à AlL˜ö)áo’t جFrz!+ˆÂeÏ\‡,kšî­ó§àÅÇØD{ª–3¸òâyÒûy’Ãóžx÷L|q²8–âS2€>fPÑÐÏ\‹Ìª9D3sfÅ•ct~žã«÷:úy(9A¦ Kûsqþ‹s¿ï÷s™þËô·©×©»äs”üÿìýI®e;’, öï(l¬‹ad+`@ ˜%bö«ˆ(—rë‘ï™G¤#~ï(ÉÅÍRKÑÏ 2J`S³Í³YãÃ;þ0Áš{'-2&ÇfßM¥ ‹ÏZÇ6#ÐqÏEûëÃýÝûÍžXA p”™" [€]2öuÑ@R³u<%&ÖíôÆßé¡9ÎÝb Ó½DúÃ*λE÷s¢óhH±…9FÆ€´a’Ý-lGPÃfSÇs| !*€Å 4½hb À5>52ÃlHi±…Ò#<5èF|è]WlQZüê‡Fv»CVKðëWúç>àÍýëcƒV¸Ù½†œ×èѱE§)ãÔ°Àžø ’¾¿!/®ScÐAé¡’LDï?„{òÐˆÒ dö:± š1—¡…¼N ƒ¹K“™“#´È‚ |jÌëW «4¶È÷Ìdꔸ³dtŠ *#{šQ.¡A¥¹ðÔhŒo{èHh!WöS£é Ðc‹~mDW\£ã=US¯–ט5ŽѨõž*{;c‹Å豇ž÷±èл܄¦zhjÈŸÈòT0Ìî¾"=_s[ˆ®úÔ Š?Ð3ÁZ0´ã©aÈšñ›eð½-ö5û¥–k‹XÜæ¼fÊ0ZâúÙ[tõзZðe 5&ÌÔ‡î´*‡æ>»c‹ÍC×¥Pä×yjÈ•ó¡‘D#¶-î3 ¢ôøÍ±âð“ˆ(+Ž{æë1”y¯Ç¤ ¹­Œ{ô[ʺñ?‹ R“ÐKÀæU±yKlÞ›×ÄæÍÃæ5±yöCÝÛdzeþ¿¹­Êm™ÝY%¦œ²‚™½J35¼Â¬`¦j }ŒÞ)R˜çZ¤-ðå¡BYW‹ÏÊ­HûÜ<-¦Ä¯±îè»Zp,GÕø|ó¢?Ó^úÕœbÏZdKRÁ7E->%t¤~jtxy=4­ú¡…üBN aî=t×ýü´˜ºU£$½CN-+´wîScÝ£¬™»õiQÛWD_%và™Kž­Þ?Cyõš!z¡E/_aI¡†N%Ò[ÏÐi1¨rjPà ôÖEyZÌ¢çP5•üÐ[¼ËiaG=‡kÜ˱Ó×½~»ê>÷ 3î ˜îÓ5¨Ì„¡á­tc¡Eîbʼƾ&Ûâˆ^-Šs3ªQ“8§›^¶Óâ³Ä3L®ñ`-’ý+õ«A[wƒ^îOôkfê§Ÿ÷5a¯™5þ«Åy¢(ÐóuúŒÿÚñW›Ô[0©]l±ó=“ûµ6xvͰð3‹¿Ë8°uM8°0 {Eâ+Š# -^'ØEo-$K¨B-qØdÀ®,Öhéê qW§Aë×L•6¯£þëþݽˆ‹÷í:)JvµØñv$ÿÕ#MÇñÐb¸dà5ÆWœ(c¿^ öWx&È~ÅŸqدÓb­s“AÝDà*{¥‘øn“ï´ˆ1¥}Ø4˦òøÐàO Éôö·Õ]û%± ¨Á]gtY¤Á¥.«@K…‰qî)'¥M£×žñJLƒ:”~£ }ÒRÌf|ø­Âl ÿu´l‡ÿ*/þk½ø¯GÍÖ¢š-ð_' <ívÿ“ù/õ’´«Î Q»jN ‡Ýê`À¶ë‰Àø[ŸÉû(ôðol2GÆÿ«¤Œ¨ÍÝ|œ™¨ˆöSÓUÃÒáFú3Ÿ¯†c5ŸÓˆ´áöØÂ\är5L+ió½¾[|^ÆP}Wd‘jB  ïª+ÖºæœFZߨ"ûû¬JdùÐ ;Š-üBP’Ÿ8 pŠÐ Œ{P…!¹‡®÷ˆ”ëù·ß´¢m'_ Z?оø”Û|h ¼Ñ§Q°zëi?-FüÁcÄi'|L½ªÏ*¥¢jÌ×2ȉ3´Xõ+þæ5ï9Ýé«ß“º›ä}¯1㘊w}"+éScIÓ)šÇ)¶ÈD {j0DçÐ¥ê…;-„lrjÔt·¨ Î -ê¼V;+Jí¡»4#§E[â”TÃô+ÒCÛÓ¢_ Þ+. ñ^ûž«™¤;Qéü¢ÓHþ[,F[ž«I%ëô÷vZlzUc7ñN¯¯ëgëÕÂÔ€õÚ‘ž_×Üçf‚œ×ˆô|í¡Ÿ ¥Þäê©¿%P¨†1^ñ ö¬Ø¢Îkסÿ=´‹E§Eë×jo8þªž¤Ñ;-„kõÔ¸gÖØ‚}ªïk}ËÈ÷ïåu ‚óê±Æ€çô’Èø´Øâ÷TcÞëÖën¡p2=ž'˘½¿ó_;µ††—KFªðÆ v¡ê’¿Að"‘Y'Z£¡¶)-™aîdX™Xh1;jÌ´sŸfœðj7“¡öµE¶¨‰NR¶!ämoyÏšêk¨Ä8­œ™7#È ÿF®åæ>™¦Ž+ÐÍ£+³˜iÿr{hð]úÄ¥•ôâÒ\JHóÅ¥Mqió覸´}¸°¥WŸúÊÇìþÕ,¥—¬”‰|œÍ[¤»ÒÅ>-LEkL`=ôr5Ùi±ÝæÈˆp6¡}ĦÏàÁV s®Œ->Òê¾[Xb᧸´=#]CuèÄø¶û¿§î/§·äþÓâ¥T#·»edŠ-–î+Õ(Yï°ÓM/÷iQ†˜(¯±¿Âä“öUíºá¼ÆŠ}ÂSúõÖ^5Üö"º'݈§…ÀŸŸCâ©è‘¤ù9-OáSC±“[:³Ó`ºrA5æøš‘¦ãwl±ª”$^cŠq½“.òÓbKè¦4¤óÑ£zó%MWõÉ\¤Œ8 r¿öœ±j#ŒÉXµrýncÕv˜ÊÌÜ‹Ùâ<ŠS»´,[Óý5QàÔb^®Õ§vM8µ°ëÀ©]ôˆûZœZÜÙàÔâï˜Îoœ+¥ØçjbÎvNí´8œšjìvmhÉ®} V-Œ ¬ÚŒô”æ´8r˜j¯V#=¿®‡’,ü (Éâ'ÊŽúi!%™*%™Ó®$; Ž’L5ÌJÇh¼Ú5S…¦¦PcÆ>ƒ•ò´8VJ¯Ñ®þX)Ÿ;žyòjq¦ŒW+W‹Ñ®»í±R:½â\_VJÕ˜ùžÜéVŠÓbU?>H¬gJ‹ÎG¹‰‘Ê`“¾é'3‰Ã i[™Ã¶‘ Ýø,Dî&( Ó‚ÁS•pbPzõN«å€Õ’’“á|´Bƈ¾+¶ÒæÍÛ¨?CâëÞ}+½Ö‹—š/^ª~ã¥êKéµ^ì”ü¬ÿG²S™ì”3KŸ» ì”Ó«;;å6Å1ÄNÉFh‘PˆòŒýƒñ\†Ù(š¬f æiÜô4™©uÕø\{W¦½Z˜0VH5lÇB®rÚb@ÇÕÂŒ±…yôô@[@w¿Z˜cÿSãM×H‹ŸºkL¾!NK9Zdæe{jÈ‹äÐ̾[È{Ækí¡u¿?-ʤ¬ì5*óÕ=tÑÖ<-*•ÖOÅ[Êé–ã(ÅOõ8* Šßèľ->üÔŠ} ëëÐa -ïµSAª§•¥"4˜õ^†…=ôÒƒý´°#±æ=Ùû®.ˆ”çßÔ“ˆ4fj\#Ê4#„Ã=dWò4ÈCr¶×Ø_±½~Cƒ) *ÁSºéb: êºæÝx©Ù"ͨ»Ð¢ÉíÌkôrMs$Ph!ŒŸScvò¡å,÷´˜‰L£×PB‘‡ž¯³‡Œq¦V£‰úÐ+îzñRqqí}[5ÒëëºÈK…ÆKÍiñ¥O S1„Ù/µ"-ϵ§…ÐûORãŠQóu£0GÛ©Q ù·CË2÷´¨ó:ÏÐ|ÅQ6f -lÄoBæÐÒÿ„ýÚËä¦â7ûu|› k n*ζpŸB‹ÑâÍEÍWüæX¯hÜT8Ãà¦ÚE—x^ì©/¾BÅùâЙš >`‹YÚ qÀ“ÐòÃdº`Á·ö Ø k š*ãmÌÅa“Ÿ2î"Á͇Z(0OÈ|'vjÂÔ¹¾ªôP ™+áзbªÞÜÀE"7µ¾qSëÒL1Èëâ¦ö?–›²…vnªƒ›R ,œLˆý⦦E=ãì ‚½j•ã0å†JJ%ÿ4#=ä±EšYôóŸŸÔ"mpÞ3¶ŒwjXvòPãQE=-:òZ<5L†´Êc (£xÖˆ˜d9hE¯„C÷’×XT68-¹#´È’O®»Ðiy»†Œž<5Šl8‡î_ùjP¦.}U¨é«Åj}ÿŒ:Äwx¥‹LtËtf}Z´öGÝæ=Æžc‡?ýœã¨?ÜTs;ü==->oðŠƒÒý9íÚŒ§Å|µ˜3þP°Sój°üÑö S׳èã'ÅPø3öº>áè+O ?çXÙÑÙ™“Ó"kÛ 4â¡K¥šæiQ¤Uó5]aLÕ=UÆTÅÉ4¦jÅZ{FLU¬Ð˵Ɍ§ª÷·Þp6£à¢ç½o=EÁ©0e=ô·zZ¬|×Xíîa-=ЧÅÎbìTc·{¦öŠÛÔYªÐ,Õˆôµõ¥Š525š‡¼vþÅQ©F©/zHÒxZ8G¥–ô"’ÎP‡¡r€Ót]\CuZ¶ÚkL*†œî ™-Cå5Êsè÷q4%zq]¡:-Ü”xj 1ÑN¯81ÎP… “¾Š‡¼®c{ë«Ô¨i‘9úìèžÁ^VayŸ×%ÌÜ…„ é C0À×.XŒ~Ò%ˆI ÿa~„Ü»»hFÞÀãj:{õT¡µìR‘Û~‰ôÅP•C•_ ÕüÆPÍCUÞ Øÿ'1Tr© 7å¾”©‘›rzqSý6õ­¢üA¾ÓUþîä¨k"—ðz{‚¹Âé)ýiºWõkþV ÍÆRgla þ¡†¥½- ɵ_- Y¯‡¦>‰´AFÄÐF¥§OpS<þNËÇ3´_况$‰v§E®_±Aîb"œ^zkO»j[¨Qä¬pè®·õi±Ž#jÔ‡ njÜ?ÃB¯[±èV ¶§ÄfÞdוuêw ¯>ÿŸq`¥öU4Éø^aê}=]sZÌgœTü¢9Oß?ÁÃ×N ¹*9mf¡{^íå]±ÆÒ‘ŸB3¿Îب>ã¿Gæt–ûþÓ"0m*O5ÒïuËG ©5]{#3¥`hPùS…–¥Erº‹—?-Œ‰ +=°áÐrÿ{Zû4.*΃0]C‹).W¦Œc‡–óÛÓ`eqª±œÇuZ&»§Å–‰Ük¼ÖÒ¸¨ëÆDÅ`¢f¤¼ø´È²ˆ{Ü®Åy¸¨Óâu´.Êi碞û:w‡‹rÒ¹¨Ó N©•UãpQN—¯kõ­”Wp&Jôa¢N ÷Ç:5^3ÕÇ}¸JåôuÃ9uµ×­yܱB‹}mìãŽuh¹c=-v}.㲜o>G©ã‡›;–\áÛ?¢GóPgðÏú\ж¼f£è’Œ¬ŒÌmt”*L`©“+£™i)fÅœMfÚŠYYÓÅÓ=—^ÉYoYês';Þ• J Qî›Y¡u0 Ø²l‚œÊlZ'ÅÅKÁJÖ2•L­±ÿÌ(؇G¹L¥÷cT÷‡HÎc›äFù‡œÞ#AP¥j;Î8Зò;¿”ß/Ý÷øÿY÷=>{ΤFfzfg¾‡—ˆûF(PAoÐà<éGþ“XÛ2)í!^tS>Þ> ¨§Ê–™Ï¬nºãßwp‰-ô‡OØEDYÔí"=å&bÔÒ,›¬‹!ôÌØóɨ5°´!ÆPÏ©Œ.µ1§Œ±îæU[‹ßFÊàà+ Œür‰M†²S°›ÁÛ´ü´0©œ€ÕÝ%8(v R¾¡ !Aò†:Œ¤Î|„ÇŒ¸Äoèz /t é& χ–…/}ÂJ\ÚD×-HÊL˜lÐ?¹à§?¢ ¼al; ê#^ÞÈô=n!_õ”\Ø$¾Mu°ÊÙT¸‰ö¼¯á,n»³0ËYƒÚƒƒ¡ã˜À 2Þ@V–z‡%úçÐR=-\…tjHÅth)¡B á5x Çs84õ\OƒÞâ0ùÄOv" „Mέ^ÃaÁ-­Uh!'1¯Qçý ãlîUH^ÃãµÍ¿Ð¢(èæÔHdœÎ“ŒÄÓ"3…æSƒ¢û¡“ìâO‹$0“S#Ç>·Jl!×ùPCÜ®ÓkÆ?$߉S#ñtzÒ¼ÿ40­Zl0¶äu§™’.´×Až#Ù {¸à5ÚºE#¼FhÑ^£®ãš[ Ì×Ü"=_ì³¶éÐ׎øÉT\q…-óAßÌé½i^?4Õë<öµCù0Ç ;pzñ -àókäëW¥9ã‘wi'~ÃÌ qPƒA7Oó߉ÿOqîž¶¯åN]Âï©¡pg§›Øº§…e®Ž£n28]ßcª÷¦5A5ÅO–éŸÄúk”»‡,è©§EfBú§F¥8thñžO‹´îa§~Ý·¦h÷O)n2ø²õ@Žû`.v…ÿ[¨j tºhš”SØÕ4J‡Æ€ö»…A{Æö+C—ãb@3ÔbÏóš"Ý¿µ°”!±†…qEÚž¼»… Ô±†éÈnºÜ-ÀŇpû¸é´ÚÕbx `ª€q îÀªãr ðÊÔò¦ÉNŠY€´ÌÿC¯ÙÄž@ñ¬èSSSW؇ÔYªiWdò†]×Yi’?}ˆ™…ÙÅð;™Y¦£µF­3…L©ƒ‘ô»¨v¥V‚;KgI%g Õeõh­$]òaÑ‚ ÐÌ®90L~¡Èc˜F‰Ã¥|.°( µ´©&S6ÞbΜ.cd®ìF…¶åa­œ({Ÿ;ÌN˜öõåþ –o¡R*1 5€–’ ­'Œ ë¤K˜“Ò:™dn÷ §”+KÝÇ+´0 ,_Hñº‚ÂÌUmüÒZqæÉwW›Y{/Ó4ä›+Á³ðQXÜž¤×7Þrc²·àÔyOcù yM" `ƒpóÌD÷–½Âø"ìµµÔàÿ°’êà$Ò÷YÇæžåsÈ6¤Í2È:ƒ…¥ŠÎ¬e%vc·C¦Ó;E¯À?ìõ.‘X° )Wp¶óÄÜØ|RÇI¤û˜r9Vø.9¦ÉiŒ¶Œt"7ø‰ü±`Cç'ò ñtrû×F`xi’¯¤‡ƒu-O0RçF(²ÑçB©Ü.ƒöZ`Ú^~a0€Uh kˆ¹´iu[= ¸•Iòæ¼ÅccKì˜R*O°±Õ»H@µ-ËcÛde¦5HÚ>Ëm;mÒÃï)amùD,Š5Y:>s‡½Åš uKÅ”"óÜ#ÕNëw;´àH»T+HwhAÌ…ö]¾¾‡ñ“.Õ\-â{hÆÂ†mJRÆL‰-‘:´Üž×0íøÃíôÞ-j–¸¦eSè>ôŠ߃¸Á} 2¢äl|I’ üÇ\¼Ë ~Oå<~ûáë×)¹øú½o¾^-¾ž¾~÷_¯ßûæëÕ"ðõ¬Q΋¼÷Í׫EàëQ#ðõ{ß|½·xžKÔ|ýÞ7_¯Æ×Ço¾~+]K¾GàëYãáë·R¼~‡ñõq6³ÜÒœNó0Àj‘ÚÌXƒ:‘`ë¯å0¶>®xÞéúYàì¯ëûð+ò‡ W‹Ys‰c­ØbŒ¯ëg_ßã˜ú:LÛV–¡{cßÃòe÷z8t;Ü«Z´têsàGüf-Ç#R-Ê–ùB5J?li¹‹=-òŒ›Œ}ü9NR LMkĉ6®¾\ýWçÉ\žâi5®¾\3k\}Ÿ±FŠ¿\}½fÖ¸úyÕHq[çîúÆÕçð«‘!wDz¼VÏRRÄ áI«z¼VÏ|Ú®¶þú]uÄc ¶¾äX#Ńa\}ºF¹÷9à¦ã7KT¾ZxÆ®S£\›Òü ×ý4ìÏí^ÐT›¿™™nÓ©…Ìl÷ž5ãÄèáÿ)^jf˜h-î3MÔpÒ`š‘¶P¼»…ÝH¡Æ´CéÏ 5®Ÿû!—XÃnÖH›únaL=j8G½èø2õÄ*°ƒ1ç7¦¾¿˜úÿu>NèÝž> šÄú‚L×~pmÍ=Yî’7ýr“ž Œ~¡Á=¿Xqý8‹*wc®˜ƒ<|aÉŸ;m KRùkÓI*#–‚Æ­„á¼ 1¶˜:ìF­=Àé8Y5:ÎÀ«ßø£Fã &fðÊÎô#ç•Å/Î@ÓßCü ȹ†€ì1† ©pXÓtB>òð=¹æÐk_ˆî X•uüõ™nI¾‡ù‹’ÿÍuêY%Pý¶|,Pˆ“iÂL®}­JBÐ}|ŸaNLnm´;Ëi“ Á&ˆ‡< ÄWW÷Ç›.Õu`ð‰Î'Ú†d¿ØBtlŽ×ð±…±ÌD-ÿ†½úsć‹õ'ÐÌ\XÇ.ü.4nt·”ð‚7ºöù/Y[Z°„õA½E‡ÎÂ|FÓÔVêv-‚†Èi´vk–|y„X7Ü™ ¥.J‡&õj¿j§‘É £#s!Ï^eê™™¼ gÖykE%2ÄÂÅ:±L6# Z±ŸJ·E‰ŒÈæm˜þ‰0Aû(À‰îAÜÔ~J2ü£~Ûå´OPˆ­‘­þÖõ–ÿ/¿ßR¿9?Uå…qç§ú䉑^d”#NäXßêŠ&´pyB5ŽóS½ÓÝ<-º{y ·Ô'¥N½ZxÒC¯Ñ¤XvRø¡Ó½†gÚ<´‹§Å'TãˆN»™à´(Ê&qj$1õä7:=”#NÄ4¦>tšÏä—#NÄîqè¢!O\-òv· ¯‘ž«”'Úõ;òºþ®‰‚4qMmžõ’IÔl:=ž©/GœËeâÄŠ=t¥zxZô|Âád-°ß§ES:9¯Q%;Y$œ¯õ5iâš·¢ð…§…ùðÆ©²ÕŒƒ:ZãÓ"݇)ëFq:)ëiaEk±F¾ŽÊ ²xZ,7 yt“(î}kEß±†p2z~Ÿ]â5<§ì¡Çs—(â/7‰¢ÔH÷¨¦£ªûZP“(òýê~˜ªQ¶TNgc²Eqï%¯ñš«<_W­âïð\)N{ÈÒÓ"É£åÔÌéd~l•Dñüß¼ÂF7"î(¤ÎÎáßhƒr½®5À—åÐ?‚â"]œu÷ñXq8­U‘¶[-Þ° \5Œ´¥xªñÓÌ€±Fr_'ÒïW‹G篶¶±…ùWõë‘ùñþ/ÖŸœ¿@ƒä¨”æôÀ•L%2m…Ðù&dÓ:;nþ¢Wëºó¢lÞ£Ñé~Ò6kÏ~ßÎ{Àe€¥µ©)'´ŒPl‚‘I°âþ¤WµMr/Ë“É~.Ûüb>ÈÀMùfº¾GAæcÎá²G´”â#”y<·›=,Œ†y¡%FW>ü`“ËþšÒOË‘kI7Ûžvjâ?€aVºÏŒNñF.=ĈËw|'rÑ²ß Ý(]¾eÅm ¾dàÎ,U r§y`2q¼YODZt媎'Û¨Õ'Š˜ÉŒòÎéò&Û•kÒ©Û3zÈ¿'éÿMÞnŒ°7Ï.Kßh:YÉ5]¾ó{1ÄÀTù…²f¨-Ez%wSi[ñk†Êª}o‘ÄÙWåˆwZ6t9 í+򪮾-e]FØ0ÈøBw–P`¸h±ýÃÿß]0 {N–«ÌE‘tOš™¶> ÙΉÜÚl1ôä6Y®€ž0:Å¥o4“"Ø'ä%µ¨×1ÖgcÓ£_|$ÏÃ<çáç…nžü¥ÊжXˆéáõYñÞºŠNô”þŸo>Ý ›.Ò¹t¯~˜týßyt‘΢ŸêΡóÿýMŽü¹W?ì¹þïܹHgνúáÍùgÍE¹¢ÿÔv=?ÿÔü"Û«úqÞáÿÓ&Òyr¯^ªØ ýŸrº¨Ã{íÃŽëÿéšÆÃŒ{õËëÿΊƒ|8qUqýßH®ÇQ6.\ÿLqÊÁƒÇYÉžºDÿ;®ð¸þzÎÿû:F©,îûIî²þl9"[Ø=Îy?ÿ6ÕF¨]ŸW5;Ûg­x‹ÈZ;Ïýü;7ÅÙˆ _»¿íÑV$Ál‡ÚÆj×þe ¹–?¯n P-ü_^Ž"Í›*"0ÙÏ¿=œÒÉ>-;, R@@:³ìÕŽÿo;|¼õŒ§ÂXë†^…6åd?Z…ì|õ ÿgßCޝ¸BÆS÷øï$ :É<Ã4¡n_ñß_B2íãeg¦û ÿW&d'sø]L›¹ŸÝ„¼šå¡ÜµÌ+>ý\æ`#-8IsØ ›Ëé>ëóÿê,Éìîþªn¾5ëùÿ4Çô@š™éªng0üßl>4Vîªn!Páÿ&<¤yõ_Õ‡iÂÿ ¤ÍqœF»?ž;ÚXëž.2ówZö詸íG˾ö¹¦Á'%¥*á;Þ¦ àXð‹NÊK‘,[îéÜH™ïõý&‹ûÎÄšÌf‹~s½zæP’ó/÷!@[çGÑG‹ŸSæÐ'€•ºCˆÿNõ·µhŠ3Ž¢¿¾S:*´›1TÍ_¶SxÂ9G±NIp$pÚ N‹q6+¸#Óå(½A>/jG§Gü¤s-Öxî1ÒîHpZ„Ç5Ž#Ó强Þ"×5ê<¯éö5¯5v ì…Šƒ*ãp,jQê¹JXC鑜ÎÏc ׈rºgöˆš§zzXÖÈçÝ3Úxqµ³Qctž Ðëñ_S hbtÐóa ÕbÖûc_« ¾ãj0îåãÕûk¹ÁzÄO´—÷C×ó^¨EóˆSըϥOºœÇP-ʽM¹zpïÑÓ Ïx¸>ô5°!÷Q2F¤Åé:ž`EÒu–ÀŒäX#æ´ivî«¡€5ÒÝÂn¦kªŒ% Ë•ŽˆÓã<¾j0^Ãîûþdïq=Ř԰© Øf¯H÷ÃK¨…á‡ÆQÔ}muãNÖ5¹ÆžŒø;,aa$‡|¯OƒRpÅîy":ÏëE´Í©‘¯k|Ê}ÀQ‰×­q*ñÞ2V¥ÄQ¯2Ÿ5^%Ríªj~-á¿ÿtÑ&ÒÇÍaÌJm±†Á@GÚ¼u®†1—C {Ô/zxäàia˜"±F½jÓ’_ß8ñЬa÷G‰ôºh:ÌkØÔ/º\w³q'³Ç†T6m–Åqêƒ}Qzl¯±Û, ¼F¦ òqü@(Ùax À)zr¯G2+¦g“Ö쳂RÄI­FNcÑœŸ¥y‘u_P‹a}’à ø½è4:”ö¡S wœø”N'f%7Ú¡ƒƒ›ð\~1œ(à"ÄS*+êÕÌ÷¨"Õ%ü²aP'3ݪ4q5êZÓQJ•|ðt•kŽøg‰ñ“cÆí£a‚ƧkòªƒòQêÊ3­®Ïù¬#ùC8ÈF‹§\iïÕV)¸Å¥ ÃL;ñ:¾Ö›vCÒrrµ›É!ýnv1Z Ü!ðJâÈ®\|GP5]Çïðc[%ô]ìRñÁkÄ…ù±Áÿ7ÆÄ¶ŠØ.õÃ*³«rçbø’æ~°´) k6×›BOpÅz†î)ŸA,bS”:ÀÐ3Þ#ÀÍÁº æcÈ—ž Ó ªõâ(öpG¥‡M Å<ŠÖÍY©%_¬ß ÄÇ®°Gó;Ö$5÷^75X|θ”áSž×PŒiÆÝzU«­[n6\‘î^2«©€Ø«úƶxe¬"gŠìˆ7“aa¦¶Çåc,zãdl7¨OE0]p¢Gye€—ͺ|ñéÕrx[{å2)Døv–æXÚçâ°ÐLWé²—‚si¿`è™rFÂ#‡”U8Í/+MªYøn4Ý ‹‘ã ¥V«`+Äy¦÷RºŽj¡w6Ç@R˽/Ý-´,£e$.\lÕ&$¢U´ €?ýIéÑµÙØú›³>…kÈRŠè}Ö÷áÚT>7f‰¶Wc(þ Èý(é8Ìc¸€T!òƒ«ð2/¯Ï…ëÔ‡wèžìn\˜Æu‘ þêtÁº°!‚lV¦O´fɽȦ"].¨®6”s+.ƒÎŽ.«ñ¥€A‡Z*o=8UV ¾` O^T™õ ~-¶*BWTøÒÆëÅçoR‚³£ƒŒž…€Ûy[Áð4»¯igbçÂt+«ŠcRm¼¡`B‹êèè‰!È®˜¶§ÿEk§…’.7ÀªE†Î¡x¦Éâ µÕŸE¡¬v@á¢m}~Æà¢¬r–I"£g¿í»£di5Æs+ÆÉ÷uô:[ƒ·R›'Ûšûúy!Î èñãZïc&a– ø­Óo²Q®q›Ði”#OÏ'6‹[!šIl ¢„ôc(Q‹`)aÇTBú±•x‹ÇX‚ÁZBzÄo¾ì%¬ñLH?µ&Ôxl&$£‰7x¬&¨Ì&¤Û‘“Õ"h5P£<" éq´þjqÜ™¼Æ£Õç×ý‰ûJ ÐA©¡êA©ÁRÃè¨Ô`‹¨Ô`G©:(5Ô"(5X#aô|/^Tj † %=î_ ¥FüD__+’ýÈjÐóñ4@6¿bûv ÙUaj¡Òˆd‰ÛðïÒïÖî,ûTÏ3n/ê3F¤ÓQo©E÷oN×5}F¬nÊŒ²â¿óÑâƒ^óµ PfäX#Ý-æxÔŸÓ•q7¥`#=ŽŠY-F‰û‹ÚŒHö×´B™ÕÖµýRëÇÔ¡­Äû‡©çâDÔ)eFsoÊŒ¸YL›Q¯c mF¬ðàï€Î´ª†ÐuÕÈ÷â¥{)ˆÞþ]ʆt¾o3à5Úy²JOj›êáùüF j¤í!‰—›w¬Q=Atö˜ oað÷ý£¹,­éñþÆlŠ5L’Š´9‡^¿ùÝB sYÊ‘^îÂä-ƼJLy1ÂŽÛÀóìW‹Ï³b KŸqÓízï ÌðQ™·F c./]L×£MCõ¶‡E|öÃÔ–c"ýX"Ÿ_‹âg²ñØ…0ážtSØÊù¨|Zã’2`ÑÊ…yІ˜š6Ï85mŠG·-ˆ#K™_šð–’âpü`œôÒ”ôäøG«àJ˜H3 øÞFZGžr-~ƒ>Íb–ªÖ¨}[#êQ¤_SðÊLÔi2ýÇú:ò`“–J­Î耳¡ ú."¨SbËsíð;ì÷èv+Ráꦫ#túyö·´/u¨Æ:ŠL-WŒ(„ªLlâ¿ ¾z?Šô%Mew-GÓÉ©Ü?‹ˆ"FK÷º=W¥Þª| {õ3pV¡úͦ\FËÃêšç2ZH§Ü7ÄöÝ¥¾jjá /¡Ÿw…\.rvfº‰,%ƒÅ‰Kˆ{có*˜º=Gæå2:y¾@˜áÆìC¦:†n—Jq[#j0…â±å[ò{Rûn4Ii-Ün³„üT {q€U ó{¹wLKb²„cèLØÎÂĔΖKßÉtúm_ºˆº šª‹¦¹IbU?¡U«Øü†©+æt-%Ú&9žpo|®Î¢£ÆRK_ÄŒ69%gN+Oß&9Ÿ•o\é¤ÛV+ DòtN.|¾òt½VâPö²™©cR_Ï£¸ìdw—<­ºŽïR‚àÖ å¿‹_…M?b3^¹ni¯¯Ò–dý›Ž$j%R?ãP(žÑ° J½ú|Ñ©DšÇÒ´aÏ"«NîÅówýŸe¯Ú 3íâØ¶žœ^|¯l- Œ?‹I;°TŠ•˜êAø©«œÐÕ¢ÝWôYìí KÒ€¶ä·ÖS¯]\ð&zúõ»Hë`®¤m¬Äd[ÃÀ‰;ñ£¦º×–1I÷3ÓOr÷q•ì°õXfÏ¢Ña48;9a™äYÁórìâ¸veHƒ½Ú2ºÊö„¯h–Ä2¸óýzqÅ7Ò˜˜=\i+ÚâðmJôl@ˆ]³PGWVœBç¶ZEïéÐ]Èö¡È,”h}ºÖ°ètUµÈ h“fÖKh°ÅW6ÑaÅ%%5ñ¸„B‚Èr0»J¥”3•¾©FFçißJ½mÑP“ ƒ€F9±´C+kßß8ÒŸ%ºa $'Õî,z%Æem<¥“t:"•W¢Ù«/îVZÂÂhNìMÐ#ñÛsRPÅm ŠO¶%C:ôìÌÂã1 I0“¦ÞáNì%ÛªXS³Hó²*ʃ;›ÍÚE¼{: íM‘"[HCJ†Zl]wp˜hŠœ7ºo¨~…ÉP òÁ¦KÆðuX\§Ϥg@•t LMý<Ë8dÀŠ_ºh£BÕèvr{âÀõ©¨¬½>Åe”¡Oª9þ_ºkt¹ IaIœ…à¼V’'€¬¡s‹»Ù.hNzb”Át¤Ën¸ÑÉšt„kºxôÔƒéÿ¿ä[ðáæiÊ?`¾mó¸ðÍjâœw¿ßxîÃA5âaCPò!ÇÏ^j¡¶×o^`³eü²Ûÿò½¤¥\¯é&(ŠhÊZÓä3wòµ&±ÖK-’ôRCŠ«-‹qÂáœï~çÝ¢Ïó8\ Ëz)é²PæR¢^ûPG\ôcV˜/,2Õ.ÄóÂ";-âya‘9ý¸{ƒÇ…x:YŽôˆŸüy»Ï ‹ÌéÇ…x¾°ÈT#¸OÇ"Ëw‹Ç…x:Yìáq!žYüÁ…x:Ù=·¥~•X!­ùYºwp:ŽD{Hó#æƒDEz ›SPdãj{[‰5˜{ÝÉõ(Õ`=–£¹osÛÙ½|0·ÅOÀ0Òã˜)çÁ"‹“Ÿy7º]«{[ØCööØ ]ƒvƒ[X>3¸µØ¢–¸ç`q[×jÀèFÉqÐnt r=æÙ)(²k׿4î©4“ÛCZêÄ}Í,Œn#ÖxB©@¯y,1ó`‘•X!@Ð!êl(²æ)ð)(²»Á(_#Ž¡ïct&ÝãêËæVâïlëºs`s»Nlna¹as‹ƒªýtÕ¢–cC²¯{6·{T¥Þs[Ò=Ê Òt7¢$ý»ÿˆË6÷YÑí+Z´F›Šàéaû™ê©)Çï!÷²)–x<ŠwÆœ­Þ šÁ,2[¹Ð2y¹s1ÂÒ}æ83áNÙ¯¿Þ{âWðËÅü‚ÅíeCð{CHž=‹îöôYlZ´ŠÿªÁ´Ç~©+´pZ6³él¤Q…÷Âi_Í»(øÈö‰ÉBzùóºuÆ–Æáspé Â`¡@\(åÛtbÑ»ÔLº˜[Ú*ƒW4çJ„KSV»éNA“±Yö2£ÆL‚˜¬4ÏD‡ ‚ëΡà·ÒþR…)òùÑ#€P¾\ s‰óÉ©ÜU¾gíB0[ªÏ®ßû;²#­ºr@ŽLºñù }>޵®ÓÆèéCæíGq³qwgáõAaK$ͯ&Y Ôè9Ik|×®—üÂGòzÚläõ™§O b¬ð#k{ƒPu}±q€Ð¡˜~0t»Ì<`ôî¤ߊ‚ÛÜK~á3)«dò%nþY"ØÅQÜÏz쌋?ÈEn…Gd!9!èi»P2?ù³„7 F˜2–iåØÄv¹˜íÆ?qVÙß茟½q•’¾yÉ/– ôdþˆÔà º‹î“tzÐ8g,á«ÝÆ:m6Ü4ÖéóþU¾Ðz‘_½aŒ×1ÆÎKaNM[ç^Œ¨Fî%Ì£tà×8"”ðJÞØ>Öfâokž>9Žø;ïW©õ§7Œqh–Ô?Jæ` Çdn7ÔB>a 3%9K‘±N‰ Ñ$ùuÚ`d{ž.1Œ¶ÂÏŒï¥<ï C„àé¦äjcôFûO\Ø–£hœï¯üãϼkµC³Ñ¦ÙQUú·îã?ˆëm6ó\À/ç¦$Væ`æ §Óì²YžÓ¨Ð&¦‘ýj`ÌiY‡¡fîRK|L¶g?ýMü7¹æžìä¿íìß],Ç›9]¬W=vqéÁ¨›h å`:7›G̼9îGhø@›5ËèvTàñIß _¸y׬£ËOZ©˜FÓ¨ŸO}×Ô/MuÓÔ?¤&Åg~N[>ô?þÔT.ŸJ‰ ½h*³lÚQ2zpC˜Ÿ˜‚Š«L†ÊæG_}î± «RÞNz¿çÚeÁ$ä†Ñ\7Ë¡j,Õ˜X7W1‰™ÑýJ&uÄ€+­[AVÄYÌíèD'CþOÚÓE7¬×zÍ×z{½Æ{½Æk¹êµ\R÷,òÀ†e«SËÆUÚžîÌœŒTèÕ#1˜C†&E›œê9>³¸n€™‡nÇŸéÜ>ÇÑûk:ÿ=¶¿¦ æ)sÐÖE‚»Îl‹¾ûeæ¼J ©wLe™h´‘åçaKÂîœ{…SOÆ[Û]ÓeÏÀbU}”6),‡ÜM&ÌM¯È€ÇAVìÉ ˜Ì”Ëj°;Kd*M™äzÓ|J6-{«ð̺e>kÁ‹¯÷ðõž¯õßÖ{¿Ö;¿|[ðýZðýçœ'ãYñ¬QFoY ‘<Ë‹R˜ØzÒ¢©kG†9¼äJ…ëbª=Ãd]rlçÁJž'¾ (hZK>LŠÈCÄAÛç¦ÓÑžo æö퉟÷¿ö뉟ߞøùzâ矛øî7TWze¦ ´YçNa™Iè0ípR$Ž‘Lzˆ%±™?ñr¦Ó7×ÕŒö¢aÇ+ËÕ‹¡VBõ¤¹W8ÛX笟M¿^Sß¾M}M}{M}û6õë5õùšúÇ)êO,A‰K€ð¼Ü°9Å›þ;± é áÛFÊçkÑó %žs¦òÕ)ÚüxdÚq› [ÎFïßæ‰oº[¨ÏÎþäûÔO aÈõÉvùÔûŒ ¶ó˜vnñy5pçÏnºWšâŸˆùbtS,âñ­`*T—ܪ|üÆúø‡£;8§ª3ÅtÍ{{Í{½ç½~›÷ùš÷7§*ßÚ?0ýuÝÓ?üÅXa÷[§ûü“?Ò›©è2Ì¿€»lp²Êãu6;¼is)šÞAv·TgÁ–¸—"ÈåKÂæ—«hò›_ƒš'—˜ïýþm Æk ú½ýÛì×”?¿÷ëkïû 0e?j’þd?íÜTŠZ0<7Ñ,?Žï ^I½šÍ—ã\-CóÍxåÁ‹¢dådÖERdU¦ÍæŠ!w`ÜUþÕcsÛ8.ÛDì¼Å¿Çeäü%……|.'ZךƒŽ—ß ª J´ x<ꦗ±°€í|tw&Ú¼Ž<Ì—`6½ Ÿz’¦{jÁÒyNÏ\”{Oø¨ÊfÄX¾Îó2ýÝçƒÔèÎC”*#›êgÑóÈ‹E¬Äp‘!hϱõ³ãŠ—üZñ=ãû _ü‰¥¯÷ÒûRûÒ—r-ý$¸Åþã¸[Ú©ð[ §¤<È]zVP3DlD[ Ð`èò>‚Ÿä Ëî(UÌrUœÂئŽ@½ý¿áM˜÷=ûEp«æràã›®G¨x6›Éß§ÁCÖc—غ83Ys£œÖgz¹.a3”ÓJšÞ)¬N˜{×âHºœS{fè\þûL~»'?Ï8ù¾Þ™Isèœ~ L¦ì…N„0@šûî×Þ¨Ï\oM5¶ùPð21O–ï9#?­>¯«)Ì/øµãKþ_>ïœØŸ˜M¿üÎÒº§ßuÀÇpþfŠwt5\ «Y"UIr[*Äì—ó¦‚0wŸÈæîþî›ÎçVân¶8OÒ`µá0ãs…í¿ÙÞOãš|Í|æÌOŒµrPúŸ-€”,iÃq §?ÝÓ§¾iswe‚ÀM•«2w1ßr JäÞt ÌÌ“=#j&B7­Hzi…Š=çÑî®ïùþÿzî}ãÿ€óöÙçä»Jà4aò]±J¾i ®¨ëG&ÎB¬fº^eáÈYè›00FË´± }i«StP¨­X2Ž$1ˆÃæ<:osÿ/å{ä!ÿ¼ó1ÖqV¹Aµ…Þ#ß}H{Žð‚Ë~œ¬ œâ'ÅC¨í&Išt̰+váÌ\‰€®(˜¬pÎ,î.ºË²C¬~J`ûË…xM;“•+óKT¸8ô€¬öZ´•!öœÆðYA“ß¿[V±=G}ìL'ŠtëeöÄ€T4ýrÆ â%Øþöâ±ÍJ>° S”Ó¦-OONnXÝD°^Y¾ÀÙf:–ˆgò§ÎÐz[Áÿµ'æO˜5ï5p“‘¢¤-jý˜{ºK[ŽÝU´<2DwÁT_‚ÆŽH×-%jZT ìÊÒ:'©ÕTïXÒ°¸e’IbMýŒ-©ÈªB¬—sÖG±ûíÄü+Y,¥Àù‹ö:8^Á-ëí‘6–HÓò%ä‹d q±‹ÇƳ07'ãÇ󴤩[ªòßFkQœâe‘“t-ÏáÍ )[TØ|·˜ô"§ WÓµŠf—~éýW™ÔÿÈʹ)ÝW®ùÊɹąA Óä×ËF# a °HY—›4ù›ø®8;œFè;“Äþ-ïˆt½w;5†–fz‹NZ¤vÒZxñŒ¶ð‡-ÉlÓÄϵSìÞ·l®ÿÒÃöÇnH•|É\G6ä ±ü†<>(“‹æñÏ‘ÜDH² ”"e7r‚I°_g ¤ßÚgjް‰—S%Ü‚rD@FRL}‘ÕK.UÊ \TœuÀükÕ—­¸ô,üW.ÛŸZ´áÏÚ⢹fÈ?¤¡YGê Tže¢’*´$bÀyÖ9ڙΨáIÊôæGE Ø±úF†±ÄŸ·íGÓ`ñ¤bÅo‘æ÷ØŸö€ú¬ûŸr‡qwž® çû¸ÃúàqŽ?àÊЦ·¸Ié•uIóÀç#ˆj …—Ò‚•…OÕ=|ÉkW l "5â7MÒèq{v?+É…»?îw‹ßùt{î¹Èh0 h›ä×6q%4<# †CŽV±š•É;¶"2l£ðìnéB7}=YÊotK¯3ÂôxÏ'Šê?QQ3η¯?eJÕLoh뿌Ã#š> «00Hß„ç:»¢ê$/é™óÁ¸ÛY¢M%¼Ðnlª´žTÔ$&³‹˜´£§$‹…ùš¨·èõzg¾¸\ÿëùèÎeM‹WôW:¾¯Rcu•ÿlQ0ÐÒî£i®ÇÉ%Ï"ØÞ6lp`•†!ùÏ?Òãx¤cLÈÙrßecMHýCŽAã8¿ÇXþÇ_XŒ4ø}2eÝ…Üm’{3>#þ>Fê<¿'Uÿô÷å?t`Æa&˜ Ê}oy“´óà`±§"W]5“89¦h‘æfß[Y÷ýÙºð+ø'¯çÏx-‚Uñ‡ášÕóbºj€~Ã9ê»wóÿÖ¥m¸iat¯ðÒnëɲã¨ökÑ}dÛuTýýA ÖëNö=SC‘¥Cf–¸«ˆXÿì¢üÚe·«x ãѬ÷äÓ¤ž(àŸg×ÔE²2.޲£îz;C›}æ{3`öïæŸ‹gþ÷÷èà6þžµ+RG‡ThŽÏ½w™<ÑâñÐÌz\h(Ú퉸oÇ%L^7Eà±[’KÊT¨›Ä–ïãBÌs>h–üÏÜü¶{ë¾—ÌÙ³JŽœ _µ(Œ1Ý ô®ópFRj5WSJ*Øo¡ú¬Ù oûkZ³?œ×O L}‡eÄ´0©–_ÕÒSÊæáîÅ•ó¿e˜©÷‰‘NÈþ瑇×;c‘¼n+è‚°F13Ëg_\'ç‰Ì¦NBÙŒ„“ô·¦\·«!½'_ï6Ã÷ŠyWã*a~»°UÉéH%³äâUŸÝÀL»;,8ÞlpûSî%ýøüT¡AûJðÉ~òz/è&5”–S†‡$Fz‹]ù0Ât=´’\Âyt°9ùð&¦ÕR‹¦E'˜Ò‰ŒjÛßœíRÜNÒ±Êu'-œà„Æ,/÷—™íá(}ÛºTG7”¸Ñ™ž ØpߘCéƒÎ››vúh! f…5"ñáà–xîBßÏak×ðâ(®KðU÷š?\lÝ8~¤¥c¶Ïtà7ŠàÑcôw# OÍ{×A|ÅBú%²$ ·`õÞ¿?žïyk„óHXÀêurÏaô6!øZuH>ÀÿªH©Ë‘·C×¶Þ%¾jˆÂ¯QÜÈ‚ PtÞÙïSâ$ÌíALD(&¶"1߬ºEgOµÖkWBb΄ÄcŸ  ï5Ž YÒÅÓÛïSâ_| a©7!÷²èLú@ò Ž‘%Ÿ^áKAؾ™U’‰üÀÍ’~Æá+íÈ‚±7Ž1‚¢ûá+Ù9û¾Û]×H§©K’#ìŽoÝÄiMø•æ0~šµF,Ä{7°àÝÛï¿^4ÀÏŠc4󟸥‡C쨵ïoŒ?+øa~k_¯ì^£[~3@3© ~ìô(4ÃP\pvþÇë3ûÁËýïúüûE{·ùý7mÈà>%Ùý":?*ëí² cìöê}l•x£ò».Þ‡qü¼EßÐ[ásT’ÿ’ôy©ÉŇ:˜žÜ¬g‡h§jCÈÜöÃû$dnýñÇÏ[¥rõöû¯÷ýuk^¥š¾Uûõ™×ÁYƒÍN}4=~ýqʽÇ÷8~Þj·«·ß½¿ø‹:ÇzÙ^˜‚6š#ʼLjbÎïcU¡ÎJG]Gwÿx㥑…[³÷öû”\cì/•¾Ls‚²»¦¾6k°Üáx"yÆ>AyS†q¼´âWo¿ÿzñƒùR>Í—M+èéSÇÐ X¼žï¥üæó ï¶þãÇѨ¸)ãêí÷_ï/þ’›Ø5o;®m>Fê0F”àž¾·A ÷#úÄwÝ9íŒÃÏõ1W]½ýþëýÅ_=†ñ£ÖÌà._߇ºÕC†q‹¦v<™åù•>Š—=væ·ô=¾NÕß«½¡Zõàâép¢ûu”õÝu§Lù 뜩üºFñR5_ýþëýÁ_RGGá0íhh€Šá:-,è–ø3WïÈÔƒÔêôz~¤â›fõéì÷_¯ÏýbA{g^úЧX:LÐÂÒV” ©MÚ& ;ö5ŠoºÇÐÙï¿ÞüÅ’’ï!µ›ü®ÙÜøp˜6ÁW(ãGÐ¥ýxâç[ûÌë“ÀL%á†Z(¼ÉFŸ“$úhc·‘ŒIõ±4hêN2ïÄ!§8Žñã»fKÿ>Ä=ïI”*&p8ñÚnŒ~}k@Åñð‰F º•£ÞÝ\£èû~¡¯Î†kfJ¿g±DÞçÑúh~Ž6©5öZòéc«Dú¤ªY¬?ÞÃøù7ê-6=ú·öžÄöšÄ·nê…ÅŲg„=«¤ éþã5ŒŸ£ÞbÕ3Ä^ß“Øû=i~s²ÏÚé÷þNýÃL`vß,ôÍc†jº¢37xð èÃtW³ñ¿yî|JÞ,ÿñÇ¿3ü‰o¾3üOêÙ;K¤¨ïúLï®dÂq´å”üb ¶7©ëtQÞãŽ:,öUO_ßÌWïô|?)<²M-—õ…¯Ó(PçGÇ¡MqȪlæø:»•W¨›ùaCÈèV—J!ï=ÜA¬¸,fi^«Cœ;™½Šàɧ¶aD„¾Â—£¶êê†ýÓ¥%Þ䳇â6§d‡*÷›,Îݲ)ïH: Ùy]y›Ú%·©Ïðù¨¦zwõû¯÷ç$(à¬$o1>ž%sã–S.k !¤½ä¿“jhS›v^"##*ªØ[>½IØhùêC‹’®ˆð>SÉ÷PÖŽåb„Qö’_,™¡ êŸ.ïõTïÎ$k„JN¨’ k=¹-ç<މò‰½®@ÿô 13Ùˆr‡ÖÌ3ç]ÞÈj*v&ÅY].jÔzJ$j`ïOë˜{½’r”A¦¼xF Î"ѽ—ßævVûn*¡OÇ<_½Óp–u˜þI&/%nl–ˆ ç´áÅ KÚë:Þ×uœUÀøÊ:}þ©Wëû]÷¸?×Àž‘FYMÙŽ>¢û3áÙúïùú?{·¢…ûÕ„Œž-¸ìÚ#¤7¨‘,ºèý6Y‘ãôwëgP½ñíá ýþëýA½=S"Oë<¹§`·KŸO„'«­ˆ‰#d^úgH–Ý÷áÅD_¯Wìë·ø×üR¢)˜ýkÿrS ‚Î+¢_¨}¢‰ž%×û#i,þ¦Voz¿èoYOUÂvï …•éITŸ7dŠÎz„Í’kˆíVưϋîoO¡ð®åׯ/þÒ»¢7°MñÂçe:ô(ë1KÜg@]äèµÉ.†1ßÏZ‰zßÝ_Üþ$eevºðñ®#á%é¬,J ‹`É5—C ûl7=ækÏ»võöû¯÷ñaéz” £³ØêÆ Š®²Ç(@¬Èå>Ü<ŒÔ~Æt»)¾Æq?lwo¿ÿzñ–¡g óX&%ÐÙ©³+¡C{Œ†8¿îÍXæ}^ÊK+wâõ¬ÅÎ~ÿõúz‡{ “4õÿäen•ïõ‘ÿ³G­øu¾K£Ö ãøŒ|ùÛéë]ÃÞ£Ü[ú¡M£[ôÓæª€&£*Éy"úo¯ã¿¾UaH*^Ø¿§>çf˜c®z×ÁG'r‡'s¦ä<Æ’aAt_ºö%yÉH€œ‡Îm#‹Ó…IЇ|U’¹{~s™Q>ªè¤÷ã´GtIOKâÇÚæP"=ÑC©ÍN •Àå&=5FIˆ u’>ö…A4HäÁìvNbÆcõÕ~zepKÞ©(³7Ñ©@Û\!XI/±À„üT°hù¡Ã/X»H®ão\ä‡îRÖ=-:|NŸNg^/‡~…’f»|h^…«„Ø ÿÑZµ9áWËÝsŸ‘™7]õ²RÁpqEúÚÞ»ò烼òZB;X½ñ–pÍDkzÄsÀ&r®y­ò?¾}äð—ÿ=ÿÆ^ÞM~ÿM” ­:èLU«pãËõÅBuǯîŽ=ìîøõÜxéDNGrë¹>¥±u^–b,n_ÙF“ŽÃùJ•=Þ£ûô¼Æpñ•W_š¼ð=õ®E¥]t´[6Ãi|ìš!JÜF}¤*§õáN>½ÿxãb-ÑÛN=^â¼ì/–dq·ÐƒŽBËó‚öìšt‚UÉãÙÃ6íxöxŸîÙóÇÅZ¾zûý×û‹è?Kr'ÎŒÑåQ%´˜gô0DÔÏ5‘cwèŽ=ïA\Œå«¯ß§$0–VR¾²õýåÙ?¯lŒ¯ |¥J¿oã~=êÒÝzÞ£¸ØÊWg¿ÿzÝëE[ÙˆâzØÊfÑ$-²•*qõa&"¸õ öeæäk[Ù„ÄpÜz¼$°•ͼñóÃVíBhX_©’DZ‡mêqìaŸå8ö¼Çq1–¯Þ~ÿõþ"8ŸE͘XËÿÌ=ÝÔ!ßžû3Ì·çû]þzîqýÇ_“qFzJØäæBþñþÆû5û/ýô··ìnñû{ ˜Õo‘Lxa%&@lC÷ÿáz“ïÏXbûñ¡™Ö1Ò/#×3:t¦áá0îíñ|:‰ÛA[h@©ŒÆ}dè’õ qž’_±„m"m}FºOÚ Ÿ1¢7½hëêÿz}Ç”õ8ñžŸ™÷­{Œ(ùu—”kŒìó5ŽËåÕÛï¿Þ_üÅWnêÍ„í¾3”×Þ£ìoÜÖ{Uî1¢ä×]’kû|ãræyõöû¯÷1ƪëz2\¥ÓѰæÍ‹±Qc:’Q®‹‡%ñâÉû¹§ú‘Öïü»y,°^AÇn/Ñ#Ê:™¼Gl‡‘p}i„¯¥H»ø(-Poµ‰tŽ7?ú÷Û±ymÙç)øÅ‚ZX‚_ä$94âÅ=sˆ’_wÉüq‘ußtšÿäD—"Ã#>ØNÉ/–€ï("hÌØÁxÌ—zÔ{«–!–´kës|úùêßߌì c´Ü¡û˜¬ÌuòñÀ6ÜW7 ~Ýߨñø$˜~ áïô¥Ñ=_Óè i\/ Ðø ßÜ$‰•&°”Ø%x¶«¤Æ[Z}Þƒøûç™I>(½Ü§Õ+‡ämIž‹ypŒ÷Ç= þ`kÿ„Éagaø F8¤9œÎªÆÔ»ú˜ë=ĹÞCœ¯1Îòã=ŽË—çÕ›ëS¯þ/~õž~ã^¿ hÿxäqøß8ÜÆ36{ ©ĵˣ˜P~¾*¦2ÌöUU„åÐÿNqHëhê»îi¿oÔGáßpäœ{=Pÿ¶³Ø€á¬ôé ‰~[ ôIŸ’Ï 2ÂbŒK†XÚx-£;R˜¾92­.â²ÑÂÕ`”š„å°Ôt£4`9,·}_©¶Œ$F¬Sq·³²áWåÏ…®pš®˜†¶zò!¬´©"¡·Ð´(xq›äW³%Ññ°á±²/ô"+žêÏ ÐY ŠJô29¦Îz¶j¨lÓ0`V{׬²A&((J2kÔ}jΡEÿBoUsÚ¸F ~Õg– z‘6Ø),I*8w&Ü@¡yí;höY¦Æ8,Sˆ1ðkw)ÚM1úY&„•U°”ݲÈå3‰”c Ý–0©¹TÌoŸëŠ$ÜŸ‚ÅumK 6Y®&eAÊÂ)´’ÒXb?{µú¥ ­’+Ek@ þ§Ï ÌjÛ%gÐùH`„4^xÆÖþME øi« jú™z6äà<8 ËÞ ­egÕh*•–²A­Ì°ðvV ܉¶Aåáë.(ïúge=³ &li»öMØ?#X ö”ýkèÕŶÉ*ѶYƒ´°=I.íZBËØ6á×à ý¡7ï¢Ï„Ã[“~Ÿý€ŠD,—iβ•ûÎΞ5 ó••4];‘Vè`èA‹ê“¾áûÙ‰Hı,– Æ?€¦`gâ~4ÆÅ Ûx¦é[8½ŸE'Äó*›ï|šbÏVa†[l ]0®#.¤««`¹1 ÁV¬d£†´õô* ÝC.šÙE€8ì%S³®ŒŒÑ¶‘lßè<㊪¬¤tˆQ2ñè;m¿‰ÁS¶RçÖßÒoRv³ã×\ßùoPu †®æÒ(“Ó´KçU_¨ÛÀNkÚ<ûºÓ 9p¿­³áž;ôÏ‹Š Ë lylÎÎu«0Ør¯¦†Êv–€”êNq›ðÇ(){ 7Pͼ”M‰?¸u’ÞžÍKÌ€«®=}céÄÔ)ÔÁm—³';7“ñ•Á$KXQeâªÐ=ˆ• Ë¸´°r†®k+ÅCWÈ+‡;ŸŠ®Ì¥¥êjCB6Úãéf’Î’­Í0æ×—°…új÷ %¡mGܬ5é…qùC‚×þOl:{c·ï–ÊSçö1BÄÉžRûû«}‰Êš6¾ Íù†u±‰»dÝ€²áÿµ?ÚvNVàZt³Líò¼ÏŽúᢷpCìy[|AÉ"ã—ìŠÏR©ÝÌ®c4ñ¿vÂÉÇsÓgù|ÈpÙÑX6gÝOG4]2×Ù&Àcè"t2Îg~ájŠãGËÔ9ÁfqÜ\šÊ kVÉäÐ"hY¶3»ÌNÒ¨j“ž6¿¨LÅàÐN”r¿ÂõÏdǯ[Šq\  ·öÝÍ«%©ª·¼Ë¬DÍ+¨¦¡/؇ O¤nN^“dcV휥à ¯ºdÅF¬o&A~•ªŒÒö×á»ìG–Cè¤Î¸?ôÒùµ7 ·X% ¿ÑXÜVø ‘Ådº_Cx¡!,·p¬lûðâʺd–Ί•T]\Îᑬàý¹]‡h×F ß6nÛº²†oåwïÖnžPÒÙîfçwÀ-·'dOƒíwÒ[=0ñ¢ýâv¶ÿàöç%Xõä6¾ ‹Àâ… sRÄÁEº™ÒÚ^̱ò±1VáÌ‹vÉ1´" dšZµÛ§ÜUQ2¹ßÓbªRõ"Jß¼~— ¢5nÿ雹òˆvYbx"›4´¼>4’6+Ñþÿª[êzHËí{ÆXü`2á“·[ KFÉerdÓR’ò]lCëbA%“ÖÅÆØè"Ö¤ú'¦d!pGcé¾y-¹’&לèg-ì‹‚Ô«.fªÞJ›®GÉ”¤ÐY£HÀñá>øƒ¶¿Ù‡|Žþ†æ¼t;Z Þ†Ä1Ï im)Ï` Mȼèsrʬ†Oÿ&óÂsô3f^Á‘Y< Ôß?\(\žACÀ«âÛmSéŒïî‡ Þ9TƒlAsæ¤Q€" ,øÚ-™²ñPÞ;eöMc5 JŸ¨;e|e²äVýÆM¦°¬ÜY[~ÛÉCØ>uˆ7|Ök—óÙÇ„òŠ×ðs¹có|c|9¸ /q?6̹ºº»Òpƒö-,ëß[ê*ãÒ|džs/tËþF÷¥“_彄é B•wOíæÒt¾Aë ¢”°›Jã Ÿ2H-½ŠAßB+àfr9üBÅ>F»³k»ã¿@ÇÎÁîïžš{©ª¤ˆMݤçÝIS}»ùKPR7ktw6’8õ½¸¸xç qüQ¿7üÖnîRž,l~=xµøq)*ðÏmÒC\·ê“¡ÅO®<©ð°À‹±eñåR>˜ÚÚÏJÑŒà.¶$ÒN€ÑX™÷Üb¡tÛ<+x.â‹´usfí¢ì¼Ì<,/ÊÂ7ÝeÍèªÃ#H]zbnfïÁºÁäë5‰qk*‘BögÞ¶ž^3ùFœ†É$lF3+•`­­EûqÓ õQ¶¤ Ê3Š}”-¥À%&3 qxÍ,&±‰ÁÚÚø•ú=_;sS;vÔ>>I:aRŒ³'gN×,Qýi%`°ÒàoÏÍH‡ûý‰ DUøN»`‚%S5ò‹n=l]­Îõ!±d¡JŸ÷{‹;x‘ëj‰R°R^ Ymÿ m/…ìË?ä±¶8ï­e¹˜+êØ›xÄúð½ÚoCwe"ƒ¶h»(cãa\SJ•”\ÌJ XYRŠO:· –o´^ àÐßEjݵM-ðFá]ØÆñ"iU~Sõ(Ü{Ž^Ò£×ý”µ¬‡rAZLUö3B''Ü÷ÕeqG:&›Ü¶ñÎâw8™ÒcÈv»™Ö¥ê“ÞYÀÇ‚YA ­ Î9È£&Ùý¼pÐa¬- _¢fkêã&ôvŸrÍxç„ÿ_ì½K²ä:’,8?«ð„`=!]¯Ç'5¸"µû¦©*@ôÈŒêŒw³J„“„Ó`ñQûgN0II²gùŽó³ÀLs4ÈŸÖæº2– 6$Ò盾vZUCõY7t¬lS¬ŒCHì¢o¡àjI»ЄóÐê•Y¿ ñ`œtîECy§w“ÝP!¤kšI@MÔ0š‹7ÅÝóå–s?®Çœ—€/Ô½ùÛ!I*ʆ£L§¶¾Ú8¨ãuîýê&SqsìòŽUû”lZ²ðŽÓ®—úR[LÓè^5Á"¯&ýB¢>˜¬ûƒ›²énfÞrÆìïVÚ–“–šNF€¢8à˜¡©jÛÃÆY@ÙE‹CYá ¹ïY†ÍÖe7×QˆêEš+K+Sa"5)!7q›x¬ºœ–äÞ9W@Ñ:ªïš…£üÐÄ•!d#(FI)Y‚í}Ó§ÐÂÙ·®Ü¿ ”e‘,ÚÌW6½š0‹ÆñíS{FYIhDâùá¹·Àròý@n²ŠXàÑ*©$|Z÷ èw‰¢P-”:MŒ†ï[¤Œ9“µ^¤§êö…Ê㣋¿‡g›çEPêqû¶G—é¿DˆêC–%Ï5ôn´—â­“–pÓ<9µcŸÆñ%!GÖÔÀ´Sa3ïý»GÇwÒуù}³/L7:nŽÎ‹Ú¸°¸9ô¼ç5JnµÝÓ¡íï(Ó¤ÐÃÏZ¹+ *y³mÿ m¶DûH¹kë “%ÙWÂvÉØ&øJý ÃWnµËŸI^ªÜPP²¼OhG}F‰b‰Žµ 9Â×GÊ|mZŠ»èÖ7O¤f¯±Tç-NÄ"á=Råyýö4þbýy|¦Ø¿¿Bµ/¯ï•C¬’¹¢ž®4.ÂÒ±þÐOm[fEŸ Ø:Ióx0š/Å.¨z¯OJ妽–+ϓʬ—&ô×Ò¥Y¬ËÊRˆÕ„P~%˜ç“N^K-È)—n¿5}¤¦3É–ù‹ÀPíO@!{Ð-¢)z¶-=éB“W%Fí1Þº–¢Yb çxìfž¦›è|©cÞ÷ï°8þá«6nNù!¯W¯tÚ©H阅qƒBnó8\üÊ| \†ÿ`÷eÈKÇSÓòfOÒüò®ŒÂØ]yâ§£ë–@ W­lÊ •}l ‚·”˜ä”ðÐOH¸JжÉIý[ÒY¡ë"ÂX/Nß6¨-ö!u c}¢I¡ÐkýBÜa¨­ñÊ)*bÎzúîË,¬Ça{¨zƒÜÏ6'[u)²†3 ° §ÔºÝWÕÞ<ó¼ÖS†ÇMT<$LÖ‡â²Iý À+W}Ø,”ÚX›Ô 0Q ݼµôZ¢›€E«éšÈžmB”Ú½ØRÕEBŸÉJQ½=žCP9å~þ%‰ÅQ“5lв )qIš—$iz¦’n±p’¦O±Xl¡wß&†™ÕÑsרŠ~3ßÏ],qc=bÈ}ÆÒ|vüÃðÙÄ›½âŠ[¿Í³“§QÙš;Ò»öç`{ ªùÃèÞÍ’*ƒ{È-ÜV©LÈ\QتœqÅÔÔ]b²ü«TÑË–ä—yþs·¦ÑšæaŸt+†áÅᤠ«—ò]‡½»ä ®£ªžï›×é"HCÙ $’ºÆ‰á¯Àÿjk«–. àpÉòXãŽÂ‰^Ï3h®OVBWÓRž™±©v$C—©jhAº[xåÆ*¸vJ{iѪDº³»&AkÜÝUÞZ&ž'пçáæ}8ÁPzÚœõy j}žÆ^yRú¬«®E‘ÙC—'!«Â‘ØÒÍ÷ëY¨§eŽQ²Œ~Mb Œ°µfC×Þ¸Œx°ùyrcžr髈°º(.C.œ{îÕ~‡Ô½zúîëãëuaZÆnè:•%VÞÏçº]žØZ®J¸‡bb l^ó øxÝfëíòÌ­òҸ¯,Æ…Ü)¤Õ$7Uc‹ÿO¯0+×?÷µJÍNß'%|P¸U’ŠªÈC!hUã~ÊG÷qkíš é´4™Uí¢©¾}˜‰ÔÆ>‰ZêY²Dÿ[ ŽK—«†®/[^®ö^gëy}EE´ñ˜ËÔŸ3zM#×+â`ŽÏÕ &µß¸Á&ú ÐŽu¡ÙbNë¡ô–B;³<º[á–Ê®cš&ŸAsnÓ>‡–@ÖD/KUÉýþªB@P°” u&ˆR„pk÷“ÏE G6³¸´-*˜–s×ö¨*8û7-"…`Jf I“m9ûédë/‰¥Ýšt[€ÿÿÅiiš–Òiô‰ë̉Ô.-òtª Ñy ̹,l;IÖ@_ÙO«ë‰ëx‰õª6=BWà+ÖÕ¶M '.ÛIAºëKÓëˆìCq3ú9èkäŽW²<]Yí“u(Wòqû®Å;w&Î…é°ÒtB–FÑ{±I‰ŠImz ëØ`YqN›,}š$ì7ºÂz&+Eû“'ìf­˜;úÈLN_æÎ@ÄÚmB£Ýä¸qÜh"QîÎWöŒžÞâµ4û=OØqÏûüC9`'|(=]/°¯0\…)ES2ødayuÓóaöwÓ‘ƒóŽ™0ð ×£}z ¥ ¥¼VíÄÈ ÑIË™ÃdŸÏœ°œ9 Û™C÷¤”69\Q ¤;<\Añ5¥š¶‚VD U‡P td6Aëw¤ªe(«ü mÍA2“ÌQš4ü’ôêÑ¡EQøií¦—"äѤHèR«¹°¤Ž%^—nGPîB²“dR ðÑ“™I¯RYRóx‡4ŽYˆ +ègI”9¾PsÐS4ÑÝ£6ª­Ó§7ÇMªŽCq5M¿¿¾Û’¬äê~öu{»ž÷n1Ò Æn=gé®€“—o¡|ß(+1¾¾‡ø`A7S¿$˜i]±èã1œ#Ó’4zÛÍÕ´mí»ê'nЬ3X_»âk/ZKCÉzh—]éZº²ªtgLÇÓ¿(QÊlσ Ôný(„ü(åLWMÅL}¡õ-Ý=W'œ«ŠäÜ*|Yºfâèš¹rH#«{¢Ð¯ÂuËW_©=  ¬ÔÍ–øzeöd°Wבyî¨ôšŽ‘Hã©)=.ßh=‘ôãå&Ô•Ìa+¡fѪJôňÝJ-*îσw ®‰MÜ»å€JŸ ÆŠâ÷„k"h¹ ‡²&ú&Ê´õÿ¥ÿ¿m#²KÝ‹gîéO¼®XŸ¦pÕœú6kI9ß­L,ºV£G ­èÄ.ÒIÁܯs»‹±MìÿuÎl¼ÍCÆlPh!xù’§ËœÉ¨?_æi»Ì'þZ×Q$˜ËEü¡G‘ëhèäº'(f§ö}<}d–…ÛCÿˆ !-`I’é¢ïMöõîwÐbwC€ @‹:*Êð°£…>+2ªé•í¯ý­V‡a¯ ’ñE0?ž1­6_I)D‚“&À% Ÿ—ØWæ ßÄ­íå›ä4“…‹í›ÜrµIoݰë¨öÈ2‡y©}³{…ŽY€?íâ\ãU™%ñt®¹û!]Wv pkGÙY ª®y,ºË´" טÒó¦T¶£Úyh”øU*†hRöð|íþÀæzf¦0/LÏ´R•…y<ÛÑrð“#Ú‡ôqk²¶úùøf†’ëøRç1vͲûD1Q”Ø¥ýxçyeÞ°¦Úƒë맆²)Ê¿@õÖAÖÔÓ>9]a×%¤¸N×"ãv”*ùúAÕEx {ï(R_Å# FÃP%*Õ,˜=$™*mJ‘вùëÒ¶?ä5"ÇÔ&ût戣­Ôv£½zzëÞlÜYN;ëP˜¾W1¾õÜ^‡2^{‘æ«Ï{³l{sââ¯ÙJZ²ÕúÎaedcÏÁw®«:ÖUY¥É|åãì+5oò¦çBd8áeK.cX¿2”ùØ‘®£â ð`BûJ)¹r¶…XÛŘq´V)ÈŠ‡ê†(äJ•"M±ƒ& 5_““E nêcÎÛ]¾!sÏü€ç— LjVý (Š&ë8mÖ·X-Û>¬« =•^^üñC:9àH&ý9]Ú ˜^¾ŠNžÍ£=¯©Ö55­±¿féË>wí+FkŠéÐS¸¦bž×Ø’÷‹Š…©•J²ÊòÙ×X=pM«°ÊU°‡õðãð³o,S6št©ßßi™ÇtÍ .‘æåÂéJw‹ãŠžp{>þ³y¬«bâOd¼¼•ò^ ©é.Vc2LÙ÷UÖè*Ž”£ê—è Ôº*ûüÅAâU‡hdµÿ÷ ~Ëk¿•IzïŒ}³£×òñ,ySô$Bt‡Fí¥kfßìèìk—«îÆ÷R¦e¥%ö¦áÀr¼b³ÖÎ*Ôb7hq^•…¹+*ÇÈ|’Ưm@ç/j+K–™8»ÆùfSeÿ>ÒyŠõâ*¨r«'W™µË™3ÛšS™[k¶©rí<òR’e&–®A¾ÙdÅ`šµvSÝ¿€OU:ñŸ¾›S}Yë‰þzÆÚ¬ãDš3K%–¸[†ûfOQ9Û †’*ôÒ;ÕÚ©WjQQ¯ Ê­½¸l6ׯëkfÕ¿ÍüöÚ¶{íÚX\‹ˆñÕa¬TÝÖ©Íbu½vmfμ©¸¬õÔ©x­ÂEÓÚuzË©ËFìýµ‹Š=±Ðlq½ k×Z»×¤UN‡êµksrªÊG+®µ'’K-˯©v-t£,ö 2¬3kí^о³?T¼¥'©É±²úÑ(]›cSÉ™¬}pá‰äÆÆRŠe¡ÆÍ;Èýë ËŨíïœÇŽu õÄ6ʺµ>hmÐò|[^¨ã¿¾nuÿ” xÜ¢9ÝÛ(ãÚú7~»·¶gÞžù ÉÝ5½ŸtÁI‡ úã‰SIsÀ]øØèTgÄÞ£gaQú¹)+@Œk{š\y*Ö«è×÷W¦"ë4Y¨L[p×BíýµøÍ Ÿ0 J= o´¥$Xr òt…øö=2{)2ÒÔ/Z~í|l±Þ µ÷×>â·¢ž”9nj§Íã³—¬‡ òÍž^s6* 8륽v>¶ µ÷×>"è3ëàÅSOæ|µÛ¶+[©Ò±áÝ^±Í‡j“åðÚùØR,ÔÞ_ûˆ O¯ˆÁR[÷¶;æ¥W½C%¬ŠJuè sôi*{Ókec÷¼X©½¿ö¿ÙÓÊÌ“›åvfÉÚxìuy³Šièô`9’&Æ=z‚’ÎǨn#çÆ•Úûkôå ?xR$ÝhÇy ýüê=<k§ÁÛ#*k2hâ6a¦Ò…-{äuzP™›³€zY¬8EÑÏ”k€¥‡>¥É‚ŽñÆÅ˜›Òçæ9¬’6-\Ü=D/bïÑ3³ÈB*‹G̯d~¿“(6ò÷—AýH%äÂø­•‹ON@Øûæ$òóöÛW_Íé?‡™ÿ$ Wåoö•=lõžpÚܪËkgãî4àµ÷èYX\î8ZÖf-;‹¬@‡”Î"Q8 ]—tGÒMlçânéÄRçp ¨ˆWWiîÆn ›Î…eG‰~kßu@½ôáU½Z_u¼T¯»^««Jüé¥Ä ûÖ¸ÎÙTCc²nz¦Ó]Çùcÿ®¤êÇ_²È¨ÒÝ…åVI߄LUK¹ë¿nc ÀÿoûWj*<ðþðUJR1™Å ÷‚¤*$lí¸TV|ÿò Á""0Èwšô',{ðMI5‘zíÃIÏÔŠPx  §‹NíC*¦¥Q³c§‘zê =Óİw¯›²j¢öþÚGìZ'?P8Ú._(Ýt'Å /ýP‘´Ï†S|j,žù!”Í|lÚ+š+X"‹é‡ôU)wí“W‰c—¨ÝaEi–¶¶ |Ð$*i¬¥‚}Mñ¢ÈØŽôÚxØ4X3­÷×6Ú7HUÊ ¤Ø™J Cñ_S)aõ0¬vAÑúþÕIŽh¦•‰M}%× Òzž©”pf ‘QKØô:UèÜ5¶Ãk*%ÌÆÆ®"CŒ$ËÌN;O7.6íó‚ŠÚ{ôL¥„Mo#(î#Õ8ÐǪ’pf!ö©’°z˜Ýb'ᜠELRóZl\¬Ê«•Øûkð›Ú#~EzÅYÛIÏs  ¸9VOVjÑpJ-`î' ©øs¨UW>6íÕBíýµH]ÔkTþ­ÚÑÂj‰¤ãkãÏê®f­“àßuA‹®á°•zó®<²–ÇV8Brƒà_·!vÅÕß:ôí›xx=´FÄò=n­q*誦ÌA‡Hts‹âõLíº]’DtÒuu.÷˜"‘&kK;ÂL[a±Ã8‚Œ2½egr4¦€¹Ød~ÀBbûé×6œOµmøåúšIIKÕ’ Œ*.¥i?C0ì'P7½º­Å’dQùäÉVe}wý؆r-$ìï¯4]V3%® ƒ&ó1 £HcXø0š(7Údh±ôk.žoö@„Ð3•IëÍyüåšÚHI_6 '}™ì*¹gZ”‘Ä+·v/y¯” 1qF‡!ÄwC¸žQŠÏah³1iº©6jR—M#JÕåêuwZ;ëîtªP¡‹Kù z­ôa9‡¹~ocÆÉpæwœî©”Êcm&n=Y x霮Î*]ù-£°ƒvï°²Xlz # Šüø‹äÆÆrQ-ÄjW•kWsñr¥IDe´†ÉÙæ/£ XtCÉÔçõÇ3(.šà£ŽQ—‹ Ôêk2³(¿ýdf1%O]MäT±Â]Êã),+žÀ(mÐüCWÕvTߎþån¸.‹IäÕ#Cĵ„[S„×_ëã¢úûþtMͼ÷x§È€ÏÜbÄl¶¬™ºÑÜ÷kjUXô(Ø.m×t\Î4ªB1©…n÷Ôê0¶Œ8X¤1žLíFq«g&}u›‰îªEÞÓî_³xÌêLJÛeµØÈÖÑú#›MPG_y¸#Ž3ê(ù肨ae°Òa´së¬tÙ¸Øî®²ùôlêþ þ8³dnŠZ•ÙL'Y =‹y±ˆæÒ®aç±_c µ÷×>â·îÎ[øtÆGéõۈъ³õ@4âüIsj+éÌã¸Çjï¯}ÄoöDâYõ%»ý.¬1È”ÞE.õ,<†Å’)šK»•Ç~—-ÔÞ_ûˆß¼Lªî.y¨{ÙÆMaCèRÏ£"AO~ñáÚøØ.³…Úûkô»&ijL%uYxïã.u©gáñضÌq%hö¯õ2 Œº¹XDÇ$s¡–Ô$výÖQ(©v–AþÜU¶çû ±26³ê#\Tµ·Ô V{ò´î:¾Ñ¦Ž¯zEvýFRa €ŠûaßïÂÿmœsîuQý¯ýéyd …wjU<ç!ž;ŠÜÞ«rö\WÖ“¥C@Þ\ ~Wþ;H0¾)[¢%S{оR:ª¡½USuž_´ŒX*Žq0ñQPêLÖx–£;®nüÚ‘~l*¾ãTœDIXõm•{S¶°¨Ô ŒXG}9¥ÕÍâG.±×‡SNÀ¨Ó>D¥i/##º1*ë5Úk ON©‚”Å3gºùÓ‹Ç»×þñÿš±Íõ[ä‡Â ÎH¯à%ubŽû¦ú@î*9©ŒÍM9*ù9‚ƒÒ!AðÖW;ô•“G°Ú¿ª²+ûhTî€ Š‘*ºgÓÚÛ®­Óªˆ³yZËmZË6­e›Öt›V½ÈœMS÷׌Ȯi­?Ævkê@0¼kÊÇ”T­U±É±õœ'^•ߢ2»ø6Rë*ÌÅîjOôY:4n®xUæéü°‡¹>IÃÀí¶µçnko[zu[zK><09EðÀ|0戈ðú¿Ò#¤Ž:ÌÈáÚH‚èt&eíO%Bðulà¾:½Š¥DI=¬^ÙQ‰¯B¯Fª¢í^‰˜c¾ð£Ê‹f&«î¢Œ¯—í3L2-§Ékž®tX¥ç‡ˆª–ruT:îöv*×, “^³”iÏ®,U‰ci»ªCV·^V$æ’×$ñTv*¯• ã óeÕÒÚNšÆ¤Â&èùfO?ðñŒ‹„×ÊE÷Øê a%¶p8ÈO=n9ËÓz¬¥¤<î Eé=Š–IÊðZsÌ$3õ—œ¯è•ÖÂá >Ý.-¯·MrkûÐw®ò ‰r. ½žqÊÈÓi®|,j+ŵtjÇ´Ð=fꙚþúÎjk‰Ò{,S§G\9þÓkgbÑYm´ý<‰Iw‘Ÿ8Zh¿ÑE÷®žñǨTÝŸÏgùt-Ä×~o\7Ée(ºET.‘-lq™× ¿¸¿&ûÏòsžÞ=]äéîÔŽ•í¨¶×žtt¿§ß™n§žÒ8Ýe½YYX=bŠ>›ìÔ«îFvy%ÊDö3žýý¾ˆý+=Ø1õû!¸a/é4‡¯\,¾²±÷×> ŽvˆÎrQ³vÖQÏ(ÃÈIM½”z¦€=3Z@S¿à±±ð±xoÔÞ_ûˆßìIÝM­ð¤<ô‹C'gTÆÉâúýeo?|¿Yõ£{uš# eãcñÜÞ¨½¿öE¿IÓÃðQ•`fÉq´yÍ'‰‰ê™ZôÌhÍ׈gÙØXÜßíÑ:h½{Gî›^ pÝHÉ“¢öf‚ë÷ƒ— =`Ê¢ðÊC4¼^å€'.¶h–ØûkP×OÕõ@8©:¡)ŒHÈ^ò…é˜Ô3E³è™Í"š#šeác‹fÙ¨½¿ö¿ÙÓ¤•µÜJÅ÷êV,ü`G^×Á2û©z¦h=3¢YDsD³l|,Ñ, Vµ÷èé#‚¾°yżpA…^ríÖÝÛÈ_ãα,z`IJ€>3cY6¶9\¨½¿–á¾ÙL*9‰b^y.Î6”^Aé…­R*„NõL¡,zfIJˆæˆeÙ˜XâJíýµøÍª3YÇÚ,ô§(úàT=´—;TÏÌ¢gF0K¡r~³l|¬»98ºûŒ`õô¿ÙCÅ/œ"Ѧ^ÊsóUM‹½ú¡zzŠh$ã^$£YÒke#ngbpL[0¢Y¶E¾ŠÅ¤,¬-ê)Ì•q‹½ÎzòÍŽC¢#¹¿ x{}£õb ë¡,Ûh"ÎÌÅ('eÍ ¦S;Š]ÖÌROû‰ Qz`´W»¿òõBëí<ÝâG$‹zú€"/øÙ4aIZ²&ÆN*]õ(ì£Sè‘,zDüyQL¤ à,´Þ_ûp¢Þ}gkC]wÛãÄû®3XDÔ s÷iê/Õžòkec`07>òDíýµø=PéÐ'ÿl%Æï¡-û(6e„qLa!ñµ{%Ÿl¦xŒÙ§ä‘Â!¬FåPrª‹{E’´ Ñÿ½ƒÞ=~\®á'nzÜʤ’Bª©oJc¾¦ªÂè­j#뙟Iîz¦nì.:)J¯I'Ål'm¥C*©ÜK8I½¤L$“J*9Å •‘õ$=“º•F*©E%µQ{í#*ä¤)´%(ɤ‘RF’I#•|¯JÑ5FÉëöÓ3Öödzíl,©ÚûkQq+U=AQ'Q"§1 tuT²óWÏ7Ç©ñzÆÚ½fx\ùX4Rµ÷HÇ2ÑG¦ôƒ"M‡ÒROJ’iMƒaâÉä/ 厉@6fN½‡Eb*Ò“4‡J,8ôQÊ’2”G4™ôQ9u-b×G¥ã74F©GrReÃ6‘¿PH¥8RJ‚2‘g–”¡;R•¡[Rš•I•< eC]”NÜYÛõˆµC¹H¦”øAeÄzñ³CYN•ƒ¾²¤tåQî†qé–”²dRG%¯üÊCa”|5'Ö]ѺÉõ•uÔFëýµ§@âPª–”ee?Ÿ×ãYÊL=‚aÍ?tumÇ8®„4n‘•§Áäu¿ê÷C-$r“^h`Ü]󨿺¼&}Ôúïž)fÒÚ=$1Vœþ QÔýàë¬Ò3C!%šC!µ1±¶…š'ƒÓˆýú)S©;Û]„ÔYŸ{ÉœÈ5/Oú¡‘Ò3C#%šC#µ±±€ÞÚ{ôL*)œÝí5TRÖN:ë}f»©êQ-ýkmVI陡’Í¡’ÚøX$‡Úûkñ›wH÷#ˆ…çyÕ/žý|.®_=D„*©Ä©C%•¼°¸TR‹øµQ{í#ê*º”‚çqéu˜J*ù8*óQ%¥žI%…gü¥’Íré¤6>)61¯â¤”RϤ•²#ÝéÞÂÚñò…VÊP'…~pý–pnÖJ陡•Í¡•ZøØÔRµ÷×>â7{ŠŠ™Rú2Êr=–ºŠÐ@ùÑf¥”žJ)QJ©…‹M)µ{mÃ}ó&¥vA]õƒ¤’²ƒ/õƒ’û%(B`¨¤ðÌ¥‘Ii¤V&…ÔFëýµ‡£Whˆ )»£è®E…T2ÿz*»Ì}1Rz`(¤Do(¤6Öù[©½¿–á@\å—¤²6°R)¨ìPH©gRH陡͡ژX—àJíýµøÍž$yTý)¤Rhšà®RϤÒ3C!%šC!µñ±ne£Vf…”z&…”õxm‘<?J!•º7ÉPH©gRH陮ɡZØØR±÷×> ÈéÈ’è·I!eáÐTH©çRH鑮š‘Ú¸Xï•…Öûkî›=CGE~¼~àÔ‹FJ=“F*±ðÎÐH‰äÐH­\¬—s<”½¦k¤Ô3i¤Ð#ž¦)£Ã*URhw Ð˜ÂØ&•”*)‘:©…M'µ{íã‰|êúžDr©ë¨4!©?á:‡©k ‹]kæÄbê*¢üZÙØtRµ÷×>â÷ÛëkW²\j— ¼N`Ö½ö1þ,¬ŸgL}òc¼æÅøŒ)*øžÄœGvÛ dçѳ£û¿yðÈÇ3ùuùSÄtJ¯DžÜšÐWœ).Ýh*C­BŽ# ÍG¬9eÞø^ÔT‘Õž§°téÀ&êÐ) g)lzz• €®ðqp—zä9YK#ðÜ~l*“/ˆm , ª™”¤+â]j¤K.5Ó5O,ÚÓ#Ê\öò˜õiõck×|›G^RöCß‘<2Öê^¥ÚhÄ‘§n™Sœ¹Ô4SlzÌ^ÑôÇø–FP=cíÜ.š3‹j#õþÚ‡“Œ{ ¹u½Ò4—âi NÙ Ã÷àñÈ¢sãkÇð^;‹.j£öþÚG”œÑŒN5Mü1Ŧ§žJb§GÓuŽŽov` ëÕ»‹"¸øE`{¶Û ‹ïRF]bߥ8±äP,õ„¾þÕ•ESxzLŠIáé1µa8¶kÄÚ%_47>eÔB­v)cŒX»ŒpÈpMɼ\A¹+r¦ðô˜òÀèšF¦ñذG½HÆžêCx:¨]9ßCA5…§ ŸRú®—T?{00ÄxŒñ‰ƒä¿vmõ 2BV@æOHnÜÎÆÇö‹oÞÖH…Æ_öz'ï/(¢A=߷ߨÓ>¸ðc M÷þ(òAÏÙT¦¶î¤+½‰åtcÏ)F±Io{Ë×q5Gy9¨S\ïð‡KdTMŸX F?žÀÑvñ`£}øÊ=åÝ åóèðãaÂzoë§®Ô9¹f¥ñﳤšç¼˜?+B]®»›ŸlÎ0ÝXÿüZ\-;e©VÊþ{Ýöå†4þMƒß³6³òã̆ë—õ zò€h–+ÚK£–rÖç¬9VGu ‡i€Vœ†«m¢î­L÷TnížYÀYp‰I<5š;€ÀZ©\HÃÚmª]°1° ‰»†ùf3^YkÐ.=¡2¸Ê]I®L`Í.¨aíê/¨ÑX±í5f:`êå›ÍT,@»•ÎvO1С†šµÌh •CÓ­Ô9E¹§Ö™8X ÆF Ü-Ã}³§Ô5<+·vÔ€f¾ÒÔ€?ß+MMn_©s²Äy!i€Ú•‚,Öy"ï­pý‘,@;ùÐ^Ë ˜.Ã_Øã›=SµÕ]$w.¤byB°Nä½*LW"œ³íäʤvêWp#‹©§x#Ѐ²£W(À¤ue¡rë¬ï´™?ó<?³÷ræ(@»ú<*5.ypZî• Ò˜Ä¨4ÖÊ““ê@(·ÎÂÆ‚3bܼó€Ü¿ôlØ®ïÿúº]ðgGV‡笣üù˜Wæ¸r ,„¢²Çe¶c‡ÿºÐÄÁ0¼ïë‘#p wš¸UíÞ˜­W·Ö¿gðýÖZ!bZûfGîUmMšêÞ:ãÔ3c½µ±_n´AK}íLÌV‡…VÒ$Nãq“ G]FǃCdeE»ª]5‰ì±ƒÆé%ùÌ2¢hZ‡ÁÊÇlºÙ©½¿öAÅ~3'èÑ…Í0_Àœl—iévFQà‡¥x‘`ã Ø{+³ík£¥39¶1œQÌ4eü˜*?³¢1NšTµÎInSÇ£`OÄþGHÖ¯1¨ØX§p¦Fùö/ñ¨QeDqv ]ÛmSµ³äg!‡è8"*eЦ,â¶­ójab]† ­÷×6Ú7;(~±—Tø/ òxԩ´øËšŸLë&Ÿ)ìÁεĮl†øÚ˜X÷q̃Ð[MôÍ‘¼ÆÎâ%²‰ýbÃé–;k QJX$";\x Šö/Μ1~ÛA¾J§ô¾z4šh?ª·¢]UÓ³ÙË}‡ÎuÍì:…*~“Þ¨¶ƒ(.òvD ‚šï6UT ¢_TÜT†h:ý V¶½†‡Âè±uëû·´× ‰¶XžØXoâ•ÚûkQôƒ&»¯Îvf;Æ©Läè1Ü¥ËXÏØ¿­ˆ†¦±…×ÎÇŠffjCE5Fìäc/\©iLn”¾d;Lµ2G a'UN¬Ä/"‰vzíï4¼6bï¯}¼N¾x}mÍÿºþågt,Cíe`Þ50TëL&'4Ò&xt¾/=Pê ¼Sþë6Ä•ùß0ô¯4PC¤¸?‚ž^:Ň‹ÒåÉÍÚ¾›¶|WAyBë¡’5\ CÇ­]34P^¿m­38†s]‰T§Ü–Öî¶6¡(nd?frKõë§N#\Ò@§ÙÅ…M5QÓ$N#¦¡QJ¯îlfí×ðD3Îä©öó«÷îG0À§ùÝ).ìl*©…Ôûk.w¥Ò!E*‡d¦òSjKk:Y ˜ÚR=û©ë}²¤ôê)/¤×ÎÅM35{í~K5$‹R Ÿ”6e˜‡ŽÖõ>D®ÇØ-Ì1o=ñÕIbXËê³±±i¦èã+bïÑ“®Ä–pš‘n(Ki“¥¤1gj8´ÈT4‹™#²t•?9Q(z-'€Z–…M7•%K€Ú{ô¤+±%<@ÄŠåH}«[B«#¥ŽXŒ€3TBKïÓ¿ô>IïýãÊÅ¦šš‰½¿¶á¾©ÊÊÌ9ìÙ”™ÔÒÚô¢ëI-Õ°E™ !ม1m*Ïf.6ÍÔBìýµ=SRIfµü燴= ·üZÉZ15)evMϬ ²D=]©Ö{¾eéÏÈÚ`¡*¢ú×mœ›nêoÿ¦žÚŒT]=¦gГªtIÒ-A<ñˆoîÆü­¹›9z ‡¿že&_4iýù¨žÒR$±ÜÕSntH;õ“ÚÈQ•²É{joÌÒÚÔOa=Žïa@>ŽÉå•V?°n?éÔ¤¡òa¦’~S¡ÿªÒ.Qy ›)½L8Ç™Cœ~ãݰÑ^}í<,’ÅFMªiD鿊~C%$xèHÛX(fõä‘Ç«zd îz&›pÑQ£nJ*XS±7^X̓¼õh¼:)ͤNB›z‰€Ô°‡Ô®"•ËDOXû˜(‚‡ù'ÁÄB'&ZNu{«CüT©Ð•IÐ Z(®g²-4½-k 5=|ÀÚ^Tq[ýõ~“V¤-)ÏZ˜ˆCO(µÑÑ•e^j$©™8ÛâùÞŽ@Ö<µý×6ßÔ–WYô)!AÒi$ôHåi/dªCB¢L Cyý 'Çíœ: ·3Ÿ0mÄlQaŒ¹è¤Œ–»¨¿©"ƒXÏpȆ=/¡Q¢˜ïyšËî §ÆãÅ‚ÙG¤Ã1ž€Õ*’A\ô1ã6‡128 Gþ"K7šÂ(v%Ya:¹ÈÈ5(˜*ôz£Ôí\ÁKÀg‚-߉æÊźüVbï¯}À®óÊ졚!qÉRùDµU`Û‹Å@3{¾ÙÃ×?°~‚ëæIµ®6‹WO×y‰¡ÈPëÊ$éªð…L?¢Ü_2÷¯X~ò`9ŒÛ.’ëù·“öÇ-ä¡“ªÆùM›TVmStÅvõˆÅ2=cíÔiº×ÎÇz¬ÔÄcYèC&zIº*‹T~…:÷(``®¹Ẏ…¦;fÚE|Äé=ç»Ø¨ùAMÚçgúxwõTñÄc“i0hŽZé<¦«G<¦þŒ\`âDsãcE4!9o¥óêLQ I奵µ¥Ã1J x,WOw㺱fNÉEG…GÝ Ö•Tn&¿è±6¥2úv¿ É¢:3éºçÐEõáû;ª•ÇÒÀ× g~âõªÏ¹z9u|Ý}–üðYêã\…îÿ}ãÿ ßïNSoršªÂÓ®ê:µáNà"¡e·Íöž®D¾yÁäÊ6ò‚Å÷;¾ïå.“ÜD"÷Ò0oC<ÅôräÒ™)J4¬ÿ¯¹üÒ SGø! ÍV§™†ÙGí|ÜþDíýµ(„î…n}"ÚÍù9]ÒÚèeBUOa˜ý™®Ü"Í0”_;Ê_¨½¿ö…Гo”ÏÒ! ç–!·¢£\ßQô!G§èø^½l|i¯ å/ÔÞ_ûˆ¢ß:Ò®ÄÁA¿h…í*´ôÛ¨CYKÇÒ¡—ºO|¯^¯‹ßbâ#ìH¢–»ÛÒQpÎ<²i8ÎÄ¿Eè‚…w‚î2Òöž±(E¾P‡‰$ƒ0ãkçbƒû1ßÝ–ú€±W™‘'"Žé5Ìʰ 1;N"{³ÈÁg…Ù^&†ÅÙ=³vÜ?Q+ÝmiŒ;ho²q*I‚ Ëvüe™Q°?­™ÁøHxõ8ÌN²ÇaîllÀ?I)©@ÌÞ3Ùºƒ%3ÑrL&Ãrà¾ê¦gÁêCú.y¤ò™Š)Š=sgbÃý ±÷×> P{ê¦ã(T,ÜhÊnU+ðÒ…N¡)¯ŽRR졘;ð#l“²“zú€íY€šÛÆÂÈØÞ!vcri³ö2÷±Sh rÌ¢•v‹N\Äù_ÄÄà5\í€8Nä!v`ìºÜ"‹mïI£È½I*rß)&¹ßx¸¡þA+uþÊbñÚÒ°<~±äC’·ƒìµ½gÄ`ò©]ù{Hf½^ñS æFëýµ×Ñz7( Úý¢ ‹_]Íì¹b0û#=³“ì1˜7¼Ó ö=“É@×_ø~¾ÆÝZ:¦°‡¥Ž—L=æR_!i}{­l|€û¹ÿ¶s˜ýOäs‡ê’xzSs8Pó„õ¯L=Ñ0;Á€¹òà>`ý‹Ø{Céƒúå¹·/õô/bHÜkåÏš¤'“ìfå] “å|˜ zÏ—[¨ÇÜÌ“»æjþþ¥kénŽOô`“eóöž†Ú#Ž´}ꞥntHù_å zHù/Ú#ÑggaâæWzÑzíÃõ†ÊžT+Àfs %4ÕúÐýJýÕ#ÝMã™a Éaï¸y–NÔdŒ®3}š£ÌÇ=f È¼¬‚J[­÷Ý·4”ÑCÝ:OÛ ¢·óps- q™£§ádŽìH2?7Ïv•¡6ÉPëåûÚ…)Ö]Ï [€hîo´úU­ÔdžF”¹ÛÉÞdL.—û)Úð޵*¸­»¿æ4zä JŸ‚&û “ª‰æÎÇæ\ºP{í#Ê ÝdO2'=CzΧݻ” }õÈÐñ¯aÉͽt!&›ù4 ìÝt`w¨¤¼!k²².{Y—kw€Å¤°G.ª‡z`3A° š;›{éBíýµ(‹w.4[~$³'ãøP9#kIöfù—¦ËÍí"ý¿žöÑ„ñž‹‡éBíýµÔ¨HuÕ•^t®ñTL™Gš?„¨ pw£Gnªµ?«¾MÁ¾ñ±ù˜NÔxêÌ#†n§+¢£ç€åû)lgð¹–¼ æ •»zd¨u<3¬¢ÙÍts3Õ”±B#ý„ÙóÍßý^#è‰Êf–cjn°1©ÜÝx„&½%é{À77SªïA‹K1!Sßì "î<´¹{FðëåiøúT¸—Ñ#áÈÏgh#$É…ƒÞüM]ÄÀ¡—7iÙë#†%mFJ±hË-Ðu»êP¶O³Ã@‚¯ý…nÞ¦e{Á]ÄÑáº÷k 7‡ž‘§‰›»—¤ £§û«úñ ­mÐܸ¸ùšNĦ< ¨Pã*žS K}‚2›\³‘EL†ž]=»»ª«™‰(Zžz“'Ôóý øY¼kI²ƒFTh´žwÇhY¹Lµ\´ÓÑ0‚©ƒ¬àdQëiéê9iØ%íû3þ‘2;\4-„ÄÔÈõ¤aŽÌñâÌRÊù¥ÇÜ{ì©\”þ)Z²:¿ôØ;‡<=õ_13»!~dI@ÏO…ÄF¦"-¯ÿüÎߤÃ2 Õi®,ïÀáfJÉrs™@«ž„ugm®¢«í¤±=%'š_¯žA?¡äÚhÆå<(Hãú£:…ˆ ÒÑ4àvôW½ž¹õŒÞ‡¾wôɸž=&h¹ëã5$'‰ãcOíÆ5z®÷=\ȃ¦¦üš ©nLRÿ&Û¬a"‹Y-ët†^=`2ô• Þ9~uF<9Ó ïz“½â2¹2ìûDÄHÁ—›Ó} «’³ÍnÀ 5q›æŸ¾Þc4Óª™Þ3[…¤FwÙR‡=ÚU15£çâÃjí†=×Dä†ü$sOeZºrðåÊìeÅÜò¬ÎPaf@»%Œ =&d¨ç›sr@Zv(UT˜ÇºƒFÛb¬H¡^ŸŒµ„4Ï÷¼ ]APúÓR<^—ÂèÑ­`\ñ:ó >Ó­P˜­ÿúE)]t+Œö¸zOi‡ì ¶áÛÇžkkØÓî×âîÏÜ{®ÃÂ0[){Æ¡3ø»õ\÷ØèÑ=Ög¡ßR}ž®{¬Ïäø…fZÙhŽ›lû8ø`õ”隟·OLÑp-ÒÞsMCM¬bpï¹v}-ðïûÐs-mŒî>õÌç@­•}cQ-ªv0A_2Íâ³Ë¼¨š¹•Lòp;ï/AZT£=Uï¹xk°Q|ê¹>~;˜;ôÞ3½£¸¿÷Ì Ï]w×[£…yõžk ÷§î=³´k¶ê¶œþȱ°ˆ€&‚ÛéßM U¨á:4[eÙ¦ëÐlí X3ÍFÔÏLÓJ@§3s´Ç™Ù{þ8/ÀX>õLŸ¡Ö° ‡yÎû™ ‡èz™È8Qæ3Óz¼ŸÏÌÅé83{Ž~fŽv?3{ÇuBbš?öLg¦·ôÇmÒW—wOÌÖ/íî~ZÞÞTaþE9~ uPÚ}yžqBž4'÷CÏXLÌV>õŒ£`RÓú=ZŸ¦ šä8ï S_ëÓô/áêñ¦ñ¡Z”ës´Çúì=cO{W³î»½çZEΜí§žé©„Xï=ÓñËçæã—£ÍÇïè¹vCêÞ3¿Þ;a 1££G3êͽoš.s]šçuãÜôƒ\y|÷ùìík>Õsín«v|칸÷ʘ=×’êOÝ{®¯à¡ñ©gÌæàðÖsí÷Ñ£m†y¸öæéÚd6PÙöhžµÉFsl²íÓ0[?c‚/Ùó¤ê~,:åÑs1o!íÁì“0žºõ\“ÙGÿÐ3ðxjôøægÔá}ẽdÏ©-ÙsôLŸº÷ȵ4/dxÍB—=¯™çÉ6w¬à_æóŸÿçËgóê|¥fiVïQ”ÀÐ[RS¼Ië™ï8AšT„â¿W ¤R#,¿ïä‚©šÍ î(RÖg±q€Y‘’3‰^þ¡úkˆ™ä§WÇ Á¼ê5AzvãëâuÂ#íÜg%†Ät*14fKpÌBõý#3hgG/œhjsYvbÖζ‚ç}a~ªÅEh8Ë£G‰Ùó0@2Ùè[¥8›p ý¼±Ñ=ÿÿDzª—@súûŸr¦Ú~x8"¿L ‰.KæImˆ$‰¦yÅg¯ô¡ÿàà9è¯}ÉèÇÑãV$ˆ˜=»10©ÍÙ"\N%qžCíã fNÈÏ¿`&T*“sáÇ¡£†Nƒ™0÷˜~Ýpމ«Žì%©þÏ“æÎ1°b2¿ƒb̬ãtf¹[ṳ̀Lë€2õ~y™òbAƒöIj†‹f Yzœ Ô³Ýp¼¶!Ùé/ؘ("Ìÿ÷>P0O5ùž‡ô(Èv’N©¨WÏa\g|°rJ’ü V*òvª¿ËJc©03švx^૜d+§¨Ámqã½³rn7ý+%»Hô79‰Þ«sò$ŒG Ë€æ³}u!oîÆû`%%ý5V@5ª¿Ë‹B°«‡´€ž E+§!ZLpüõWîÓÅÌù ÿ‚™™ì}µ|ÚAû*þë¤b¨Àˆ4¥ŸÐTŸMd¬æe]_û¨µä½þ‚µ‰¨ÿíi QÂwažö‡à‰,)ÑüCiFEŽñ÷ÁJ ú VVª¿Ë‹Õµuóè‘˦Ñ|HaxpÜÚÇÌÔ¨¿`f%û»Ì°ô{ªV(¾™YÌEݘ‰LDPc3&÷q:3畨¿`†%ì;Ùßf¦’tŽ„Ñì%<;ž¤É? ææq®MžÏ1ù—Ì0)¦Èþ.3–Ññ|¨¨þx´bp6”©“Α-´D š+냑êõŒ,$—Âúܵz†ªŸd{ <ªÏváiS· s} â¢þ‚••êoó‚ÐíTòn¢Gê¶Š$îg›–_s 6/ë8ƒ™˜ô—Ì,dÍÌÕ³3g§ME‘çO5îñÊÂsµ!3Ñ9N…­Û¼ãpþ”ÌÕÅqs%ë/˜3²Udï3õ»GáÙcAÅGeDÈÙ¡²ŒÔ8g;0“ëüëÛ\wÞ0úKÞfª¿‰-bs¬Ç†*Fè8˜ÑÅÁâÍˆŠ’1vC¼–A®ådÞöü F&šî·ÑEl™ááæÁ¤:;I|¶UCqMû0ƒ—’ô—¼dhƒêoNйÖcú£c”ÂÙs0¡³XœdYeÐò§ØÉ³ŒÒ9iGÖ_ãd!úÛ›,4JC™1‰EOÌà%ý%/Õû!ø›Ëؤ›¤RWŒO‚…óžæ¦1Ý 3¬Ã^WWÃkÚb3Õü‹Õ“œâÐÀ :èÁ²mÐGžíÈô¡0¯?Ás£öyDD[œ¿©…ZŽó)6Õì¹4È‚÷›ý⓬×óq"¦…¿€4lÆQQ˜øøÅô¬Œüöæbœ¹Öù¾Û]{üÎ/€ÎLö÷e¼ ú¤ µzÑÃ8f—4+燳4‰.áÈÛÇù\Éþ.3Xí|ª1k $§ŒÄ€d…O”Ns§þ ÏdÿÒ/«¹ì;¬òð+<{PħÅ*;ÂuŽSû¿V²¿­`n—ûÙâXÈlHã\Ò7Ñ:Ì/$)V Õto¯ú£Ö¸sQÀ¤©(õ/óÑ;KUôZyÿ•„¹ýGâî?„éwªù1ÖÄžhq— mgúÈuÜŸÿJÜiG =Íàå¨, ðá…6íçÙãTÐÖIOÑæ¤RåÊŠzmgÛS&­‰™ôуŸc9ÚÈ9tP¾ßøè/ø?—¿_+ ÿDzü¯­™£¿`¨'KÀ|¾0…R¨• |Η¦‹hTIœ;,”zH€ÂPM¿¥£e‰ °ÇejÁÎ;ÿ _&¢Êó¨”=ÎÊÁÍex¸µ½Tôpÿž/×ó¡Î#|â^GdñþPÔ”Îÿöȵ˜J€rJTÒû"†NÂtAq0ô+òó«‡Z‡tÐcÀ–D± +ÄÈëþüŽ!ôï]šÚ…5w’Äœ˜33NÛsjƒEj[rÂÚ“nHGˆ7aÎÇ-¥ˆY2L¯fÈJÈ,ª :wf ¦ó‚_çt‹C¦RÖÀXWFKîY1ÏŠùÝÃÔV¡¦¢ÆçØyÑïØ æG 5C,%̉Ϫ³ÜÛÍ1Qbòôà 9ÌrXÈ'}~ŒŒ;ºBÿÌ׌tƒ3—ìšôí.\o9¨}0_Z(±¿9Äö%± Ò hF8Sé³íõÿÞ„£á Í„11%c°(|úðónæY‰&’xM¹ü~A”¿5>˜m8¯²`ë¹FÓÇ`ijI/;óEb.Ô¢… 27Ïž,¦²Ua1'újœK‡µ¾¬ç\ÄXJ®¨}òy®ˆ tWyòs‡:.oÕüm"žf ´ôqQqälë‹øF£iHœX¼€Ÿ=žžÁ¹úCŠŠv pÄ?ÛP_`["Ïë¹í¢<‡•Ã2$óEB>F05bAH™ ç¾”ƒu ÌtLEGh0½ ÈH£¢Uî‚ñë8 m&+ –©n±µ0—k0!š!X˜á`V7/£íù©ƒå˜¡¿qÕò3Ž^B‘‰·‚…dÁ­ŒeB‚>¹~ˆ‡c„sÊ,÷Ìj Ï£‚ísÒ0»5âž*âtƒÙ­áˆJh{¶¥Þ5ZgÏñ°k3=ÛÌIišCÛ&:V¨ë’Þ5p«Ë\¹tL/œ©Û:—P0«³7çÑ,êŽ=2 3¿RŽO4,aéX2+g9m©Dx4dó=‡ ¦²ô^®:–V 13[²k¨i42êœ=§¥YÒ 'd‚i&M™ì͇ q°X°7‡3lg³I˜ªÅ;HÊÁBªLì-·5™Ÿ´±ïD›sdÀ;{š»W‘‡÷lb "‡ã l°(où-(è¸~›aˆƒ%zÌ£·A:jô0™Š¥ÚÉHƒùIxi„Ï[-TšÉÎK)¦DG ã”Óý¨¬âåGCöÙ£Q î3g»0•}E…€êÈ\”ÉøìÈ(´•ú¨–ª\eÎs8˜q¾¨|UñGyGÁÎ]>Îm…Àwô˜{~k™w‹u¥’§—£õ™yÇd-»®µ2¡÷9й[Äáø“|¡Ò…¯ò½4ÖÍÓÈm»°jVjs ÌÃÁËþ›H#Ó O6m•iùÏ9.t@°«¡L®zÕ€Ê{çeY²'˜7 z áÁÜ_™ŽÈ&:˜ß B¡= ÒaDw°ºS@Ìzã­i+¾—Ö.±# äå!vtè$w$¡Ä]*à’Ÿ‘æ¹ $Ú±jVõ}—E°#ÝÀJÐUSw È•ÀB°Á@ôŸ¿•ÆLßz^~7SsBªvˆšp•à708¿„aî:·0 sÑ­3XÄ'Ç(vPzò³ô´ÿâFacÔŠ=W?dÅûO°èF”@Ê…nÇx –žðl©x`‚Kc°HN¥¯„Ç)¨¼‹ã÷ͬa ©=¨ÿAýêPÿƒúÔÿ þõ?¨ÿAýõw¤i{Âp¨`¨#NÍ*ŠY‚ï¥Ú0fµ©ŒƒÖkZ­:nJVr3§2à ¹²ô……/W;JeO +!æ,[ˆ •× ¾á µ3–6opå=®Lß%;§?ÙK¶àq7=¿À(ü® ð'î»Õsü­Pµ2Å%–ƒÄ, Û™¦ñ`°Ù«†ž-û(ÃuàÞx@ÿúÐÿ€þô? ÿýè@ÿúÿ èHÓÆ0$š…D«°ª_°jÐgÖ¡%çŸójÁÉ]ЮLøç¶de=ÇØlêÃm5;äY„³Õ|0ê À?2P¦&¡:ïúÉŸ¨I{@TÕÓù*{ÞìKø¬ìO °°_Øñ’TŹSØÇö?§ØÿðÂþ–æä Ì›f DµÐÂwç‰+ÑêO4•5®œç¨RŒ@|d=Lõ@ÿú?Ðÿþô ÿýèÿ@ÿúÿ1è?!M(ü'$Ú„U±jã. /`Æžó6ô†bnÐàäÃrÝÇ9“€8ÜÎÅÙõé µ«®>§Fäßè´Sx+ØÒ<‘?–&în<€uWœ¼ÿs:èhßlÉÕ{Çí`÷ç¢ò÷{ýb'°€œ‚ç‡Gœ“3ËøÁ—‡ÊŸG-’ì£[Û3à•=òœíL7‹)wüÂñsQó÷ò7ÜŸWÜoÛxþqþ¾mÈ¿lÈßß¿¿!ÿ ø— øÇðw7à¿âþ8ãþÊDÍ+ô¿!ÿ²"¿!ÿáû5¿»!wCþñ†üÓ†üã†üÝ ù§òòwò/7äïnÈ¿nÈßoȿ޿»!ÿ´"ÿºCÿ´AÿzÇþeÃþeÅþ”ôðnà?nà¿nàßßÀ¹ÿ´ÿ²ÿrÿåþëþWì´ø+øø¯øÏ7ð_7ð†4Ðѹ¡·¡ÿº¡ÿ²£ÿzCÿnCÿyCÿå†þË ý× ý‡ ýçú¯7ôïWô¿ÿtÿîþëþóþà üÇøÏø÷ø7ðŸnà?¯à¿´ ý‡úO7ôŸ7ôï7ô_vôŸwô¿ÿ¼ÿpÿéþ‡ªc€ÿpÿ~ÿ~ÿyÿþþÃþÓþoØ?ïØßµ ü§ üïØ¿ìØ?¬ØÞÌ3ø7ð_oàß­àÃþõ†ýã ûÇû×üçøw7ð6ðï7ðïoàßßÀÿ†ýëŠýwèŸnÐ?mÐßmÐßß ÿŽüëúé`@ÿ²Bÿ ù»ò¿ÿ²·wþîügÜ7Üïo¸ÿûó ûM}±àþ¡Ê¸¿ì¸?µ øû ø_QÅ—úwÁý£Dw¤¹ Q/¬…U)ÙÚætüæ"|‚k»ÃW¢Ý椕*Æ…<é QµÝ:ަ P£fÂzpç°8$Ú÷TæÁc;ÍZ«|¾¤ ›!SÛl+qTu›ÊßúO¿0š;…} `ÿâˆý‹öGÖwì˜ìºÎ¡ ÉQÊi<‹­Ìf“bíФœ´·¥i©ù‰=fÛþð€ÿüàÿÿø?Àÿþð€ÿ¿ü½ÒŒ¯†º § ÷?2õývxÈÀ÷µsÝp p­àMk»/ºiÏ äâÏ¢‘ö1b‡ýåæç³}PÀ¡ÉÏgY@ýeõóñ›Ÿ¿ùù”›ŸOÞü|òæç“o~>éæçSV?ŸÒ6GŸ´:úø›£_}rÛ<}ÊÍÓ'ß<}âÍÓ§Ü<}Âæé“7Oóô 7OŸ°yúÄÍÓ§Ü<}nŽ>nsô‰›£»9úl~>›“_|üîäcYùW/¿yùlN>»O¾ùø¸ÍÇÇm>>îæããn>>ióñéçW÷ñ)7ŸxóñÙ\|òæâv¿ºø¢÷ÙË'n^>ùæåSw/¤ïŸÝ|ìlßü|òæçã7?Ÿ°ûùÔ»£OÚ}âæèSoŽ>õæè“7GŸ°9ú„›£Oº9ú¤Õѧ´ÍÓ'Þ<}ÒÍÓÇož>›£O¾9úÔ›£Û}üæèSnŽ>þæè6GŸ°:ú„›£O¼9ú„ÍÑÇoŽ>ywôô^<}BÛ\}Üæêo®>ñæêSn®>ñæêS7WŸ4·Qbóö!Ì_Ü}êæîS7wŸxs÷ñ7wŸÕÛ§lÞ>»³O½yûø¶¹û”Õݧnî>7_Ÿ²úúYœ}n¾>yóõÙ}V?wóóq7?Ÿ¼ùù„ÍÏ'Þü|ÊÍϧ‡/v?Ÿ´úùä¶;ú@˺zúøÍÓ§nž>éæénž>a÷ô 7OŸ´zúض¸úÔ›«¿¹ú”ÍÕ§n®>áæên®>ivõQÜÙÛ§Þ¼}ÒÍÛ'mÞ>nõöÉ7oŸtóö©«·ÏæìoÎ> vgŸ¸9ût09œ}aʪˆ„£Ap´ °&ÖÖÁa’Ÿ¿)­Ž¨%Ê4|8 ˆÆ=¯ éü•%Ü!a:Vn(ØÖ¹Ò5¾&áÖã¹<}нükf¬¡n>©ü8xâü‚Ðk×wþ¬ò_q£°øÿC‡ÿY ?UñŒŽKÆjŒ‚¸ÇØG €÷‘¾²”:§!£OUFC-Nê¦Ô¯—οl:ÿºéüËMçß6Ütþñ¦óo7]uþuÓùכοÜtþmÕù»Mé_nJÿ¸+ýã¦ôw›Ö¿Ý´þWÞÙÿóMëßnZÿ´iýë¦õ7­ºiýÓ¦õϛֿݴþþ¦õ›Ö?oZÿpÓúû›ÖßoZÿ¸iýãMëïnjÿ¸©ý»ÐÕþþ¦ö¯7µØÔþaSû‡›Ú?ÜÔþeUûûMëßnZÿ|ÓúûMë_W­ºiýã¦õ‡eQüçMñ_WÅ—.­¿»©ý¯ÜÅ] ¨›Þ?nzÿtÓû»›â¿lŠÿ¼*þݪ÷ï"À¥ô¯›Ò?mJÿtSú—›Ò¿lJ·jýóMë_nZÿ¸iýý¦õ¯»Ö?Þ”þáŸ(ýÛMéoJÿ´)ýÓ¦ôO7¥¾)ýÓ¦ô›Ò¿Þ”þî¦õw«Ú?ljÿ|Sûç›Ú¿ÝÔþyWû—Më¿´õã«âßíš¿*þw½Þõþñ¦÷÷›Þ¿mz¿ëýÝMñï6Í[5ÿwÅ.ÅÛÿ›æßß4ÿõ¦ù÷›æßošÿpÓü‡›æ¿nšÿ´iþóMóßnšÿ°jþ˦ùw»êßÝtÿqÕýw! «þ¯\ø]H»ê?ÝTÿé¦ú/›êß-ºwSýÇ]õßVÕÙ4ÿé¦ùO7Í™5ÿ8õgåºéþË®û/›î?lºÿzÓý—]÷Ÿ7Õ¿ßTÿÿj% pþWΜÒ¼AV.ï¨útAyò-ïüqfíù1~iÿ·=bû2Àò™úp¨Ä~~-ÐËçÌEZp®˜› /&ꀬÆM޳ꕇÖà“êùÁíù}@Ç_û—Ð?1˜EmÞôSJÊÝpXªÔ¤¬Þ…ÍDÚŠÄb±­Ð³É>Etüq·Ó<þ>¿Ïãïóøû<þ>¿Ïãïóøû<þ>¿Ï¿äæ‚DˆU… !ËQªÈûƒ×Q0œ†¼ÿ¬ÿSˆÏNs«ˆ\èäÊɎð8'F ÔÚSt¢ö44ýIõ+Ýß­ •X=d«Ë‘†\[êÈtngl0ïhQmOfŸ'³Ï“ÙçÉìó'3ûfÒUg‚¡E85 §çôæ©ì7×Sþ “GUïj01yÛèØ•ˆÚã¢Æòf$0Á³x–ë~`ÞZ%ÏÃ޵çžš’ÅK?ýÂhîö1€â3}wì_¢x¯ä¢ðõŠ/¼CÆ ·¸jðqÂÀ ÿ}HõfX®j•Z…F—x+tŸÿÀøÆ?0þñŒ`üãÿÀø? ãÒ4šv¾4"Q¤Ý9?Kx.Ÿ¤ÀwÐøG†ˆ™‹=¶PÁ¹ôR÷LgÅ](ð9ê x뜡¬ÃÁ©W•:Þ#¶åpôñÓè{+Úµzà+ßæòƒíi£®T¿„WE]×+êÚkWZ Îý&¨?ä°‹@õ ^ðLL꜂TpuÃ;,Ô {>VàÄÞrì?.8 Îã‚ó¸à<.8 Îã‚ó¸à<.8 ο䂓ý…4gêT£€*|N¼–•Ü–£'!7ê‚=67²ê°X–IP‹Ÿ 5cÛG†áL0ás/¦¥Ì™Ø&(ÄK‡šƒ¹<]p>¹Ò3!AÿÅÂ>†áøãü…áxû8>A·zþ«÷Mdàòˆ ¤çñ܇&öòγ´˜ïÀ6†NÛ9ME5Z23<´O í†åŸ@Ú'ö ¤}iŸ@Ú'ö ¤}iÿ@ 휑€¾yÒY +7Y‚àû¥ jæþ8f”ÆG*yØJ ‚‡›ù è3tê†áR¥Ï~í†ChE:}`sפÁÇŽü„æ·_Ü(ÌcÈ=Þ¼P<#{Í£¿RŸTë*%¦Ñ¯WŠ({_µÆ‘ñ3âu[ްõ5ÜÀ˜ÒÃ?5CÍãPó8Ô<5CÍãPó8Ô<5CÍŸt¨HÚxÄ êU³ *qa®ô=9§ÛEn‰ ËÉóuR^fécоJû^è£O„–ˆX9=õ¦v•”Îq'ø@Å=§%ókŽ_Ü(ìc|7'œ< |RæÎ‘Õ&1ÑïÑO,Ëno6¬ŽoaSîÿ¦12‘2³L¯M¬}œÚ  üáÿ@øÂ?þð„ üáÿ „ïH3¹×ŠD=¡*|âY툼Jÿi8÷#|âÏ„KŽN&Ñ)•å¹÷‘ “enàDv©ï)ô{¥Ä±¥^ŠWMYâZ[žñ5e̱W,²cUE·<Ûpì9÷Îp i½žJ7¨Ú•­l–ªñò‚éôÂ\¸rP¯÷¤e&9—ð¥Îÿ÷¤x~jÖ2'¢(dÌ©LÖï,ã`k  ÂG]8f$€ù,0ÑOB^l`˜ú{2fÞ¸ÍÕÇ1ñ¾ asd¥X±ØG”s~©.åfã9'ú¼è åø°Åaœï[æq¾2L›®ÐNã]Oš#·Ý¹k¢Ö³ùÓÔ³é#å‹GG¾~±PˆÆ |TO¡RòQ¯mÇÓ6e…©Q‰=Pä**°gCUŠð„:¹Çýç̸Z; +$‡e‹«ïééééé HiÂ!nB¢MXÕ«*(ÆÿPÛ,G„Ÿhš÷É(´v¶5@„u×V…‹^ã²@õ@»d¡á²w^8HÝr®|zf©4„É@…{h:›œå·Å5çh|<¯”¡3?B›êøcË™`;q"w?†g•sï#·naU ³UU~>xNØGRn«@mç†Ot²Cú’#u·¨šxZžüÃÐoˆ\(Š]h³CâPíçEWàñwþ¢Œ{>n9“©eÇ3ñÒŒCEpœÀ”]ˆÇ!šÄ!š@>ò4‚9Ñ´`'%3#Ø"Q<š~`0ÛÕE`BâÑÉFx ~8¹‡xäi}´†ðLrv8J¿¶¦lÎvQ’`]ˆÜj•ÀÑ„Õnt-7ñ(mâQÞÄ£¾s.ñ¨lâ‘ßÄ#ÊM<Ê«x”7ñ(ßÄ£tÊ"•¶ÉGé&ù]>ò«|”Û& •›€”oR¼ Hå& …M@Ê›€äoR¸ Haâ& •›€t“Ü&ÅM>r7ùh6ÙÈo²‘ße#ßn‘߄£M6º‰Fù&¹M4r›hän¢‘»‰Fiê&•›ho¢Ñ&åU2 7Éȯ’Q ¨3 GqŽòM8ºe CrôE:²›pò&ùM< »xTïòQÏvÒ壸ÉGõ&Ý3…åM> ›|nòQºÉGi•è%~ Hñ& ¥›€ä7i“òM>ª7ùÈmò‘ßä£r“üM> ›|6ù(Üä£x“Â&ùM>Ê»|Ae.k’Ü&!Å›„oR¹IHñ&!ÕMBJs›±¸«D™h‘’ê&%ÕMJŠ»”äoRÒ&$•MHÚd¤z’|Û¤¤²IIu“’n"RYE¤£­2ÒMDÊ›ˆ´ÉG›xänâ‘»‰GyÂ&Å›xTnâ‘[Å£´ŠGÐëÎòQl7ÉoÒž$,ݤ° Há& …›€”VÉ.±YBª7 ÉïRÙ$¤ºIHá&!…›„”& Þc«ToBRÚ…¤´ In’òMHJ7!©nBÒ&#Å›Œ”W)n2RÙe$\Ʋ$¼J™åõlë¡UáBåŽtÐ;ÓU B1=ñ¥xGUÞfÂT¤C”R«ÄÌT„Ê‚ÔÂò`uN4Ðjua$6«¼ïÔnÚ1N©Ë<À¨á$7c.=ìØïBy¸z¸·Y"`X©N¹õÁn4rm{°bâì=‚gÄ@â)#6¨Ò7ºìtp£ø‚—˜.,GùªñÛdÈ/ŽÙÏ÷%è”6Ò³à’ òËúƒ}É/çöéòK·9ù!¿ü~ˆš:‘ °Òù¹)¶Þ¥H|t¯éLÁ¾¥@£#rXO#IÚ#¾<âË#¾<âË#¾<âË#¾<âË#¾<âËŸ_`Új tÉäp´Ö$Àªͼ®­{Ûö2®¢¤$b5)7vÝçüA±¹zA§‚Àn«BNøéµG#!‚U§y ( Ø%B«ýO†À—+<~h{Ê'Dêö„á0Þ]y ã~î)ìö5O……õö<.²N`ÂB¹²±×2û2d–z€­Ã–\(~Šð5¤aáèæµŒûÿü8n˜:°¤Î=Ýòã öx‚=ž`'Øã öx‚=ž`'Øã öx‚ýIO°$ Y^+íHUÅl¤ÖN<ï£ÐÎq.rÓ̶†ú\ÊV‹#)[½!"cín wŒ)ãI;p<‘n?tMñܳ fW¹Dœ &I¬H:ñ*«ž¢ ŽÐH¿-k#Ü£¯ìŒˆæÓd¸HS»²þâ‘zœŒ×ó®ПZU„ÞsŸ)ÀdýÅÂ>†„Š8Lò‰01S<‡ ·ƒl2O¾Dßvã¶Ýù­¨1:w qŸ}l–¾ñÌUò¤?{ÒŸ=éÏžôgOú³'ýÙ“þìIö¤?{ÒŸý¡ôg¦\'Ð,tÀ5¢RÊrýdè:æ¶5‚¾Š3,µZ95Ž@²5xN`jê09 UÅ…Ö 2œvQ)ŒaI˜@Ô·ôZÝx) ’GÞ VÐÅq¦£ÊvuvŒ”÷Œópõ1Äzpér|k xx•d§îûÜUô9 5»*O¿@Ù÷Â6„dŠsOS¦À†.ÚÐÎdŠmD#g ÎçØPTPõý« o9sÃ'Tòí8iGn`Ÿ´ ¬ý[µÝØ¿Ýü1¶kÍR Ô±³6ðØ¿Uû7kÿjCž¶azÔ±÷ol}ÿª°5L&‘&ܾڽY»wlÞŒÍ;vnåÎE|QdxÊRÕióº±y+7/ÏýJLÎÍ›´y£”U»·i÷;FeÞ:íÞ,¯›Tµ}ƒ¶¯Óö-³åÛ·]¶!lß²ÚŽ:à¥8Ýík#ü,U„ιEfsHhÜz¡'P—M…!™)p>ÄѸ{«Š©DEBsö`<×®>¸!bÕ˜AÆÆFÇD :ÃÎ{Üò\ŒeŒä Ø.Í+¹ï÷[4fÿa›GÙهȮ7度ꯦÉEi;ŽÌú±ö&^“!± 0]ºÛ5•ÈýˆÜÈýˆÜÈýˆÜÈýwŠÜ™¾I¶0¤Lä8°t0gÆg>ø›Â…Ðhwð=S•q•¸æ]K\£k(’ ¢üf¹±64ñ“‘Õ,Ó¢ÄS7«å¶cèʰýàF`‚ ?Ÿw‰@ÿ áß@Ævž0Ó•Áäyâ„úÀõÿ¥pﵞ—B#^PòºˆÄi'Öö?.{©Í]O®PÄ=2„c®pYþ@èñêÑlV6aô£Ë ÛÔ6%][–!_àSÆåo`mç˜áL2q±öRQÜNPR=X ±AqŸúî1P*=íŽL—„óìA)¨C@6êÒ﯎¹)ÓÜ4oô¹{<íO»ÇÓîÒO»ÇÓîñ´{<íþ™§Ý!^% :d€tXµ,®ñ9AwqðäÊ#í7µo`Â2ÚšT•ÈՃ鈫 ‚ÕB׈÷Z‹Hºzk;VV÷­ðÃøÇ ý 1³±eB¢åmÿÅö¼Ñ÷}¡ïXþúF°^büu®<λ'§}ÿ/Dß–øÊòÊ+êiSã¡LA*iÌ}.LÛq„[ÌÑîjEX A*âf!ø2#VX®ª§e« IWª±d -ö†bߊ}Pìƒbû ØÅ>(vA±Žë³G;êÃa.#¬rÅõ@߯E‡ó_Ã{>Ÿ¢8à‚Ž¶ìxMaå.Yçäþí][“æHq}ï_Ñv„g¬ºªŠ7°ÀaX6à†ËÓ°Üï¿wå9©KIU’ºgXvve‡=û©¿OReeež¼[!˜Ì´{ È9r0·7é9i‰+Ãcò9!í#w@êâ5vPåÐO³B£pPýãR¬‚”H7˜dñÄuƒ“fÁµfªy‚çJA£Sy“8}Ô~¬’ážù^H~(´îðcÜ~˜ªòcB­‹#Óo ?r]ø1nê>®î#ìê>ÆuÝáݹî*?ÆmåǸ©üp›Ê´«ü·•qSøaëÂ*)x.Õ…›¤‚4©=7ÁV¼Ub.2 ð#Ô‡À;$`7õ’’¤-¸NeQÌË*;•˜?'¹pjØè×£NÈðQ¥PÅ3Ž>à©ÞHõFª7R½‘êT¿YH5vYrh…+†­«ü” yN£˜ãUèÙ(Gõn:VŽQ=`RfˆÔø`5;#²qYÂ=©ÕjuíBp:¥ã;Ü]s#§úVe X>ß@ðë ]³…ø*)Ñ4³sFPÞJ7W’ WßiéI¢.ËéÁêL†¸öyÞ•ßö±Ê‡{Z>ËÇ4'™Sèa<öÛ…Zx‚3„hýÈáx>Oö̇ÂŽ»ó¤Õîàtػϑ‹xjD‰PèŽ92VKò­a‡ã¦ßž5 Ò“-½†ÀŠ4ÙËBZB¡kÃ./’'Œ€gl=r3zó)¢74\KŽEÆRžÕ>o7~ûpøÍ²ú¦¬ËÁ›ùV)rö`9 ˜‹3¾Öîâ#¡´´dÖ½q¨YÑ®}âRç¥yÒYqÅNîTtÜ_‡¾Ýðí†o7|»áÛ ßþÕðÍ1 $WF½2DaP FgDjÿÿ` õ {dv¢³ zák3µ4 l‹†ÎHŠ<ØÖk¥^‰ñ Gê_ä/­õó¦ÉȦBXG7gh„šá‘ [ì4¨#r肌S ÷<‹ ¡h8¢™S¼A‡"³SeÊó„9r{ ÚK”™‘MÖ2£B!G(í7®šß… 7ü¹áÏ nøsß.ü)ËÎÚ£ÎX¾f@/xIÔr“++‘:Þ$Ìbí¬=2Ž `%Æ×¬=W–ûcfì ÊsÒXLÚe:°ôZݸO" WÏd}ù¨nƒ:¥Ž3îq¤nä³ &«ÉJÐ{êK2:¶ãÉA»Æ©OuŽÄJâ%ÒñPA{áq mfÈ6MMLÑ.^öÛsàÈ3Ù dï*1b¼¤Ø9ŠÙh¸ý#5£”Ÿ¤ðÎã¿qÓ›nÜtã¦7}`ÜÄþXƒØ>H”Bƒtr".r:¥’Ö'V¼y7 ™Ï#qÉ€©h8=Ú¨Ê6Pµª×`­ŽŒVêÚõQ9ÑGÈ1>¡)t±g²Ô‹V¸ð!$dš×ꊳê oŽ”PšcúIà çÊM„ÏÚ2X„¦|fnS93Nkf=Ê-D à¦ åÀ{':H³¡,•rÅèô)ôˆóyÉT_¸½Ñ Œn`t£ÝÀè¥ÀhÔGH)!zëjs‰Â*¢¾C óÌlË®bÉÏʼnF—‘¿ÐˆÜ!ŽüLñç¥5)–$” ™W²J©vŒšdnQ”¥æÌ¨Qd»~(g˜=¢œu!³Ì‡_S»jwÛïWQD÷Ü·F¢FƒçÆDS0‹~O_/(äØ”á ˜öWÉ®¼ƒv}Sž$^3\—П X;Ïè<›ñD) ˜7x~Ãx"ëÍLÌ;4v#™ÉÜHæF2ßp$cj(“Ç*$tœtXhÅ>®^ûÑ{N+ïÊÈ’¸h’ñ¿"( s8ØMî„. ¦œ“" œš·Öt6Nn‚Yj¤Jdte7ÚÙp€+T—=Kiê vÒµ¿f¸Ä%ÛÈG¼UpPƒCË|Ùw̪éÉ-pØkàe2»1ªÕeê0‰¼eæÙƒ‹M©ÅhÛÑÛ7̸aÆ 3n˜qÃŒo,Ì(²­”i<Ì{4ÜD3Í É2~A‚áÐPOí }Ø´s@Uð:ñ(Oî+³… m,=*R%N}¾’ôóŒˆ,XÅ£ 5¾ˆq ý¨ºwT“iÒ“³"¶Q©ÖÐC•‹¢=LbóœM³*o"$q† ÆÉœÀCtЬu-Ó2PgªeZê<Öót¦Z&ÓÒ òÔdÉ»L â\)¤£¿&°ß¨ø­ˆ ,ϤÖ…Dy6@på¤sÁŃ =iŠï =Œc¨òî# =´—Z#/ ¯lÞüéÖý·î¿uÿ­ûoÝÿ¯×ý§ºžãÀ¡ŸÀ~3een8†0dǜØàì¢8Ô¨“QÚžzý¢ GÔô¢Û T5’š«¢³ÌZg9ªñÁsÞòÚ‚v‹Ž®¯‡6ÃqB9§ö{HúÎÿ$Ml˜ÞÉ'Ršµlâå3$L¶Ñœ•Õ:LPR,êv‰´é5 ,¦Ѷò U1h]hœ,U±qTŃ©+°oE|+â[ߊøVÄ_ E, «W`0›i¾/Î1Êha‚[Dõß°°­†y¥ýÙ¬áRæð³r\Å9Êû‚Á9âŒR(hX‘8dD±0רGϨVƒ¼ÒbÖ­õœ¡]ôाýJSªúvsÊ@­Ÿh˜Ó¨ j˜;ªE›šŽä² (ÛaÐÇÔ{…ꨤW;|ìƒ6dIBýD_5§ßFÚþÎ2EÐe…5nŠ`ØD·‹*¶6/þîV¯·z½Õë­^oõú¾ê5Yf¾ ìÀ奄(ºÂ„ò±’$zθÉSœ!öqEöÇÈó³'ùlô³UÖBÓ|N²GÓ¯¨lFE\bB§Ñˆ'4#¼Á2ÔªfôT9>©ŽqªcæÔx”Š2Ìlç¹^ÇbT»¶¨½ñÑ<ò_QŽ£Äh…ÛäŒDè“"øÐÚ³ÞrEàÊ–3AX¤ÂlN6ý f^ßÀí0i€¤'Ûjå/1$3 x3 Dö'LgÅ3œ¶ððèë6¤ùÐÇ嵊-G=ÈKe¹ù‡ÂΤÞ(´FŸ¼¼“¬;ÌëVâqÊ¿qlb}í@QN8YäxÑNR‘;£É€LBŠÈIÈÏäâ õ˜t”“…`âCÂð¯ò ¯‘ɪÁ3gxI÷7²rÕ[ùéÕË&âÕË¿|õÙÌWgJ©L žûP$c•#!¹”ùÕ‡ÀÅH[Ù(Mƒ#ï òQv /Zäî´ØŒAQ9±oÙ€d¬Ôª_Jß¼¬ o^þÞOiî¦7GŠ‚XVX•,g)(÷ûÊ_£k1Gx$ÏŠü••‡:‰}p¹•_–ÏBeHÓgˆÁòyj#6`"[•Hš„åâQ°kéÉ\\l‘¡X¬üËÅê˜ ‘@#Ÿ#g‹‘µbåMSlWŸ½ž>;nñ ƒÜ›!Z&ˆäO”Ï‘[BTl#«¼¦ÑZ©˜ILè’à§sB^Ç+h5³jƒÙ±B¾’ú&Gm3väIŽw(<Ÿ3y”‰SƒU`ŒÒRÐ#$É”•LÓi-Ë)­RÒ©€€nJšÌ9f‰˜]оqn„áeQ‡œÉ$h 8⊈˜¬p%ƒÈ1ÈeN³÷p”ưð ¸J+– ä•¹,ël½ …£ ñQ®“äÔ5Ì,cG]§Jlisd•<FOr”Z™¼;b+ùÙs;Œ®5¿¶Ä Ø^~¦cñ\šÀ¾8P-YfTÊðëIÂX”%úI ð,Áâ ˆ3š.ñô%°ƒ­Û; dñ8J0…°D4.2oÀ%+] IA—ò/ÀP:%g=ÑHÁŽŽ´xEp‚ÚÄ´ø,ñÇé,‰ýJºx žÏ“e‚~ß+€„ÑãÈú´w3´~9kÈŒÍÇ_ TKD œgO¦‚H 8¾AžÄJd¾—œ6ÈÔ*Ÿ1koô:¹‚)(¹ùW 'ë •B§4§ñC~–ýˆŽ/mœ"”JSPGò•}I•ØH|&á†A šù~ÔnAGEéùL ŒõîÍ'¼Ð[\þå<` KÒ-æ–Z@ã(¥en&eh§* yŒUz“ÙuiE&ÄHÝ­âM!†nÂfGÞiÇc{Éofjf£Z2ò¨"Ð#ïâ yÃdÇÁ“Ü`Ó!èGØ{»ê‰4Êý!ÏRZ`D©ë‰à1r€`ÛH>¢¨(4¤btVš8.¼ªŠÅê¦â”Æ83N¢b–ÐDF1Ê‹ŸÕN—ÄÎÀ{ŽÒ$qÐ mPa’‘ßIZÍÄñ¤DÙ`¸ÌÂ&|'ÿZµ´žHñþ€ÄLDš7´¥“sT>•Ï Qà`ÄG® f´ ߨ†›>Säe 6Oz‡D­I¡ì©IÞ˜°~0PÇIÝŠåR1KP—©‘é|“ý z À òD¯¬HŸKçr²ÒŸ<üùÁ†à9)ÞBØ>=Xqëöý(BÌŠI‚Ùð‘Ï,æ¸ù')°0ÎaMÚœ™ˆ"g‹7â£c:§ ±ÌàäKT 6ÈL‰Õ÷]ÙCã^Vb? âeå/èçŒ}QÁшʖϪȕ­5Y{™êI1éŒqê‚ÈR-VbÄœ 'íàH(Oô2Ù é+1˜ýà’fó uÉ;kè<[–WðQè/¦?Úõø(v”˜¿VÎ{¹cð¯!F¸%Þ=X)m—·\®l6çÝÃÏÿø`[þïw…¬9Pa䎾eGr ƒ L󢬨ÇVzí “³‡;ñÝæ>âÂy[Þ%»…ÆyFÔ§EªŽ|Kº í~fw·æ’êÛàÖõÊs!%xÙÃÊ/?ß -pø¶ö7Ú½ÏÛKi<ì|aow7zjQ¶zk»{ü,ëûÔ.–c™CÙÜ“ú_Å ŸŒK†[8å‚&³k¢SËdJË }•D}JK't‚áUE?pAù2&‡•òH* Ñœ– ª—qñ‘vñó¥É‚LŽ­SP>&î¤ÅëŠâ1™¨Šø–≈#»X:¹Gù!¢Ðž1ÁÝ8Éâ3m Âò±F=ˆE÷£‡”v÷” ãÈîš ŒöÍjÝCSØÇQ'žÐݘÇQÔáJDïòö=6…íŠÂë=ˆ³™ƒL†ë/8i€ká8Ð|%Ž'¯È×;Öpúí,%W1lvÍé®Ù¨=·Œöšˆ“ŸS” ø‰3'óŒ’ðˆ±ä=¹Æ©³T2Ô$Ü…'.¢·@ ˆ cc5[Âð¾Î¶É¤Jv#ó4ü]å#&>FŠîhÅÊí=¢ß›Ü ˆÝ&n´,/Ïb·*ñ>nŸ×|ƒŠxþ±&®ÙjÉ#AtÄ•Çò Á8·°[xMB<ô‹'uàg:ßËŸ½J™Ö ¾}ØRþ‰a>v~7tÊ6ï¯ùD"FÕT5RO¬Œ†ebá2Äd qÏVŒcÈœÙAÆó°Õ*OìÈ#™kCчpK:dœEA¡µØRyÒ>ˆ˜h“?›<1r뵌‰Á™ åM©S|F¯é¢S<v·Øî vÍ.»¶Ç•ÞÚ¨-»—›Bñ é BüË#F«ŠO“ûËÁùâ3ñÓô¯•ü\Lx¹(¥-¸GsÌÀÐg&ðZ–¹Y¸“Y¹8&-HØJ^ nìZß@÷.Âå‰Á+è/ #Až©sÁshGc¯6[ámXíÓû(›·É(³ “k€CB€âÇk$Ñç&­¨jŒzdöôñ‘®&#­–F‰LZ™Œ Šž°³žèÜÃ#V™§àf ZȘÙ뤄ªˆ¶Àßœÿ­|¨È4—õ6CÁÆmJkÂYÍ<Ø*‘­’©ÞÊOÔΘ]c mf“ 12 Öñ¤”È‚)q¼JœØaÇ8/ZÃ’Ø`X`ÀÊ”óf–óêp^É`œªÌr Èk ˜ ¹&M òNÙ#Leµ´…DKcÎvˆLe•t‹©G¨'˜ÔÉÓ?l´mhœüLŒJ=ÇH÷£¦µ ÌŒS!:Ú–h LäLBœIž:Á¦:S\‰¾±±À”ÂB uÇ |²³{YöÏ…D'’Ø™öQÃöƒ™êðpè<%I@¨U {À3‰ :L–˜Cã,Ï~†ó ‰&?RÌ1iÄN~«ˆo0›)ä1NhD̤l„#Y½Í#£µÁò@{‰ŸÍdä|°e…æÅîñ’Ž…(‹UJxI,—Чò /Þ1Aí’|ðè­—7ìR~`‚gˆÞŠ¿ÆKèsÝ3híÅ+šF¹Øj•KÎu¹£‘Ôkùh€ ·‹£³}jY˜„7¼Y1öËR¼Žwº·YG¨×Vë(O‹4ò˜¨âO¹ò&›%Ë• QÖ4+hOÕò6þgðè`:’àJF·|Ç®¿#9â_•E¹î eb˜ò!<ìÏG ï,f²—Ü<ñÍ 3`O=x²D™Y‡¾JœQ3"›¯‘õ5ƒ·Ì×|}pƒ›¹á²´ß°tذtZ±ty’/`63ý/û ,n›ØPnmû;_J®‰ ´“G×y“qÒ‹ðEæ ó²E’#;ÄD/îØ83Λæî|i§a¿àKOz¾¨‘ó†œBÉrj?ÇØ•ÛHÑf÷]\˜ŽT“·ßaX”‹I…ÏèC•Ñ™âÓÈqx;þþŽ¿Ûm÷¥¸ín—Û—ër»=f¥ÇLÖæ0”¥ž¤ù`£<æ‘ z$zŠQ2¥FÜN·/Õ鶦?H%ã‘íÔ3CôsY¥‹GŒ,:B>wBæõí·ûRüvk¢ô¹ 1o˜Dˆ$ócdÝŽ€CbÈíûûÒ}ë pT`:±9#Q-ªWL’NÌ”˜Uvº¯²û0–ë…À4<æe'ˆn”m¢&Ín®`:fÐôTKä™olŠ¥Qcåù…5ó”‘,•X"²,¥„ 3#¢Ž`dkÒÂäÞA,IXU*{FOî–T`)Ò¡3§MN5³§1P¹ÜKޤê x|PSSÏ” ômx1ÅÙ]Yh%KI\1i©šfm'-g#ãIu@˸” ®Hýf—k³MHqWÓhv9;’WžË²þñàô`ÿ§üß豈rxüäûwâÑxt'Ýþ‡;ñèëâÁ¸>>/ÈxôÍt£Ü>;ñèëåÀ¸wâÑxt'݉GwâÑxt'݉GwâÑxô1;þn·Ýxô5t¹Ý³Òcv'}lN·;ñècðÛ݉GïïN<º¾²‰Go~Š–T’eôôÐ%4—ÿ~7ÿw ìú®|gùï·èŠ$˜Â<~_ÿýíßå„•ÿAÖÒú¿ß<=~çÓ‡ÿüDÔ h‰"Š>ý̓´üz%ÿO:‡BZxŠË²>}zø·oÿû§¿¸/-‡ÇOõðo?Æ%iÅŠÎòKŸìø¿r©ìVŠ â¥ŸíøÝý¥ÿ–Kßýôñ'eõe×Ö8>J«¬"t°Dù“y.µPéEqq…?•›c²Ÿž÷—ôßÖþ"ÄË)西ñ’[]z7]JiúárI-àÇK¿9Ê:óDß,w·û»Oßúõô»bA¯_K$mMÿµªeýš/Tž§¿zÇ4_šŸ•çgýqw—j Ÿ¯ÿü‹é!Ë¿#—ŠÙdrLk¾¨ió=¹T°Tyù‰{þ ¾( w!NãíVßêÿîwûý©v¹Zâ¬?¼€ªÿXV·»”æ7¾õjÏ qg^\VñD²IzÑD¶wd ÍßJ¡Ú¨j·_é»ý¥Õ·R‹x¿å²Ò¸¬ôø.¡»Û/d¡ã¼ÜýBþJ†+wšÏÆ›=߬ˆéúÜõ‹ý¥£º|ëW ùö'öËë/Ç>…÷´i,èïë›4Î.½ò’wY8î•ôÛÍóÕKšh‡É‡ØzåÆú??ù{ƒ)ªùÙúÊóî–M6\ñŽoÝþ7{ùÙ]{ºÖ^ÖÁ¶4DOCê7Ä›ÝÝ™qw¶Žd]î¿Ê^ý‘N~ÿÈé'mfY$Àê)à/ûwi°qcgÛ¼–öGýHÚ4^¨O¶/Moô³½¼ÿ„—·œ±É%ñ‚óNý²k—o½^?ëSþ]Rœ›ØeEü²«Ñé[¯÷Õåž” hÍJ¾@;ÛßrÅú®¿®¿QJŸÑÁ« Ì~ÃóVVk­8­Á1eÚ”rÿ^}î[A‡>´œµ`Š©uÇŽ€N}®i –ýáä¥ýM¿h–KB\Z˦|ki¾Ôx»kô¶¹§‹ð¬H?+‰å|6v£q¾béë÷@g_wàÌæ”ײ A¤K[߸Õf:2WV”ÜmÎBü¾aÖƒ;ýcW1U…ÏL¹gæÆ—~ùüM™ßtQ•€ÿö~‡ŽÄ=ÏÍ—þ¢‚NúÊψ/lÈ*>—eÙMoÖ8@'÷ ÅÙlYŽtG³TÌÚxÞ5ûülm ©³²ÏÖVÉ‹6^<„&gª Bޕظf®Z éÌÞ‰C²ÛòÔ¯WÁç™òÁçîë]ù1o<®PÔ~ «“ªWöˆ¼KÎÌŒá¥ZÖ§¡’,_ðïE&Ìt¸Æ7{“¨!]'¢ÌΠE5žÒ—ÁŸíôdß<«>ôoY}íÍ~Ÿ÷›V‰õ¶fßœ„"Ýë!õ`S}4dÌ‹ô=,µÆïÿÔ]ìžü{ ]³mÃú­ÎxãH5ضa轟½Ö0ûûùr{í6í³}ó²Žùïöow䏢НpÜ5ñÁãÌ~ðÅÜ ·Zì\‚¿5ûþzArƒÒþR®/É@­4íü÷È !/ÌÐ'µaÙp³šõKæî±##;Ç8ÖŽ¸e[Ûj·’( N9 -?gSRuÔ\}Û x¬„Çô& €8²Š æÅî£3 ·8cmô¤u“sìÀ†×¿Á[+í>]j»|Òsöº1Ø JàòÆJи!Å;a££½ß“puÊvhiyÔê…Î8ëÔ*?²ÀÀ³¹­Ç;F른þj𚋹:ügn¡†S®áºÃ²Åìì”»h`µÓ^Š¡tüYmÍVAÕÆ¹ ž»–lÙó|ó4섆£ Kš½ísIਈž/®>6×$æ%áÛ0zö@Ÿ2ûØö™vÄ‹ˆ­Pbc{ú~µÆ™?1ÃÛAÈÆ]äj#ÛW¡Ù .{óçîÉj,û2m(üK’¼¦QƒÙf<ÒAÑ/MÎx%ÕNqˆµ)º Ÿ†c{Gå8˜ õtb‹êÑ÷Œ5Îø‹‘aßÐ.= ºúýÞqÄOÕù¿n8³[÷~íŽ¤ë ­Þ™–º¯ý*š9Ýå0š9Û[?ÔKÃàl(ÝþòµZÞÞÿNö8P›¿j/¿iÃ:yÚ™ Ñp&ãÁVÆqvEqu‚/ñÜ5cv?αiØÚ 'A^?¾òŒY•_ûaVXж±Àïï'¿$[¦Ãé$V~iŸ‘±†Ú—4Z?ÙãºM¿XùU¬·cHxÉ2j‚‰½ç÷ÜŸÔˆøExö)]Î幞µC×òÅÝÇ~áEbAŽÓPILÛŸAµti¼†¾>4Ôè[& Ø~1“³#T+½ùÊÉTr»A`0¯?p?ôÂÏ»³päPÞsÎ^a56£gù¼ çë¾9¸;&W­5ôBõ÷…G´—ÖTgÁ\öWI犠/Ã4Ëy¿€irCÈ7À«fyúóÍÆ (_“ qð‚”¯3—bík''ª¡Ifì›÷Øw±VØwºW/“¯ˆéx“_IBWþ(ZòúÜEZeǧ#9ÔÐÿ=Oس%FjÄÓ? F}fö†¤¡7²‹þù2¬ TP¬qPŽeXc-MÝÐ ggçÞ5×A’î‰'íZÈ¢aé6‚nô»ðT{ÜŒœiˆžG»>³ 溔§vÕxÍ{ß-ìe¥5‚rsz`ªjVÚ …œ µ g;É‘ŠÏäTÛºaŸNÊðBŸgdõ]Knz–)û!2¢åäqNý¾bæÀñÔ³v:iÌ•Þ?ýÙùç}‹«‘‚y’Lú­=}ža]M¤YU½5ƒ=çôD§ð‘£éè¼³´š3O÷Yî]CÌ¥”‹âÿ/~kX­²ñâ?˜~¸PtÎÄHGðàZœmu/Ó]]-¼¼¼§hݯ´õÓ7\-uz ég_åZÖÀ]¯)Cã¥mT<Ö¨=ÌüjÏ7§öñÆÊt?ãüý ß·hæegí4ó¯)Íövƒ_ :>ôY8È.h¨–¾£°ï5l¼QC‡4Œ¹µÑHí¨^¢GÏ®b? úIdö ájrx³Lë}è [co!¿òFZP„¼¹õ÷PÀoŒ(‹3¡!š.ן§½}Ô¬ÉiD5\'+8ÙçЧ4Ò¸_Ÿò=kçTý}±_ëµ{ßÎxFJ¹Ú®ïÒÌ\¬@õï÷\Üx¿ýiîIê =£$"l7j•‚h0Jã ž•T/ÖEŒ³•ÆÎUÜZC'Ôü0Añg¤ÓMVÒÌ3jn2Ž/å½4>_$¨´Û”á¯àâþ‘­†u–—:,,Èó Š¡aèe¿÷ùÝ; G~QaŒŠû>p|ñù±µ†´©,=A”—ËOÎÂD÷F ÅI}ã^mwبäZov®é"mŽk«L·çåO\ •œx".©„}χœœ…÷ÄÛ¯œ ¯’PÅZJuÉ­³±K{í”ÉõêõvJ¤sváÁŠm×M ºQmp¼@Tòi¯ò/%×58åLbçpM—;RÌf^%¡eƒûUõM¨|†Qûƒ×T â3ª,­ÀžésjpäŸe£ÖòŠ›%µÐY}cüjpÎYB`ƒí?\^ÝÝ‹B÷Ú&'MíÒŕӎ#¿Ð•s¢w_îʹæÖ<Ö»‡ý6.¹r.‰Ìn¨|×ô&¦‰Ö%Ñg&ǹ¶MkþªGfáÀÆ‘j˜uÕÁ>‹KWç`ŸúX',¯’IÝ~‡¯&“¾ _Ó%ÿ_Ã@Z ®d Ô‡=ӕ˸q8+MÕö 9> stream xœì½Iޤ9²&¸·Sè ´9'èU/ªzQptf`VÀ뢷oŠ|ŸpRóÌÈ–1•#p*ùIÊH¡ð?îéÃÃÉöÇ··ÿxû?þk ¿ÿoÿeü-…oÙõþÌmüý>ÿ.yü›Ò(qÛßÿíñ?ßüãïãÿÿñ½&_9Çðôé‘RõOßÞ•úŒáñÿþ?oÓAfÅèó3ñRmáY ~7¸Äîž1Žk±Jþû1t¨­>s=¸ðŒcÈèŸ%LJùSÅС‡ötõWŠ®¤gmœb|¦ŒJãS}ßÐ=+ÅØžÁŸ•¤§£RªéÙÓ?©TS{ÆòO*çŸÙ?JÓÒÊY©å³§\©µüü'%çÇ4]—Êç(ýã¹´ø‡•ÊXÛRþI¥Öü3þã:É ¨ü”’Ïíe£ÈÇí•Æ÷Ç8vÛÿzKÿklw?á¿þŸs“•ä¢ìþµí ‡Zƶü¿ß¤m(q4û-=CÙë³d¯?6œ{ö¶Õ²’½ÖB)ú^ŸÕïõYò9c¯¦g {}–X(­îßf%ßÁ¢¸*;h«Ï’ï`QSzæº×gÉ–y«ÄuÿÛ¨«úܺŸâ0Ö~öþV²×O¡{Ùö[-–|‹4¸Šß×ÏJ¾ƒE å¡Vaö‹â,Q,¬–YvØV‹%/XhýÁ˜ã³÷­¾•|ŽEn9G:JN<ßÿe<ÿö+–8÷Âi²“Ý`® æ!¤}T¡Pâ@ZP½«ÈÂ`—´!#›Õ”ØR”?Jôcg?Z.O7¶%Qþém¸šŸUèA„Y`üùÁöÄï0ð½ ŽMPØ[ÈÐ’<È5?Ú`øEPZÞ`§'°6˜ðÕÿÏ:éaé¿ß-?Þ®¾åëÆ^ÊR0p©cìñù©€« *KÇ^²‚…‹´ˆ}aÃ'x`ð ÈU¯È®ê 8˜ô]E‹Õ_v¯ÈQ…ÚÐä„ã)ìK6ôF·£§Ä¿À¢×“¢wöõñv'½÷§sZâEµxˆ3ÀCiÙéÔùv²9†V²aÈ6%ö9áདྷÕÕÛÇÛ=â»–äÀ’±P-]æuËwá0gG8ë,J‰?hÀÚHŸñ„Ýp;ìïo³ÿ ÇsDôß KÆÌB¶6ð¼ÁéîŽðX>Á‘%k­Í›õ¹Áë«æ<–®8ž½}¼Ý#JÿqÔnäÌ‚£0ÂYàA1°/Š#K¶y^²ÏûœðŽÇœÇǽ7จyzš®µÓ}Ýò0c*áØ.ì®wÅ‘%Û<²Íœ7ö¹Á;À1ù¢8ž½}¼Ý#¢ÿZYÒŠâÔ#áo–üí3–lMæ´Éh'\Â9¿^ˉCí JZ&K†=xY1a¢‚×OÁûÓ[­C±Aí\á}” B"u 1DuzÔaE»¬ð ¨2˜÷=Š ²ßkô[šÝm>>i3Ìß±•“÷g‹$¼¨0α-·¡l;í¥‹¯aà6Tµd Ð>Ám‰µ»µX(çCIÝX"(ÄÁ 8óçIä]'Eû«c¯¸&’Ë fÖuºDvq˜1‘‡NXÀ‹]¶Ý †ç€‚áØÅ%ƒ1‘“|_Lx|qƒ7XJ­"kzí^QÜ” [AàäÙ¼ñØÜÝ›àxŽ(8ŽO+Os‡ÌH‰¬{Lcó†p Š-h§^5\)È…±>–ñöéqbñvt–u÷ñ|WexŒÓ©·®j}ަ.·Û‡¦(ŠÖ¬½†gˆŠ£8ÞX2ìb]å¸íq£±K·³3˜Áû€:½¯,Ý Ü õ÷Ô2©§¤(ަ…½6îhj( éŽq›#œïxìÒíîíãíñ]M¥lv‡—i¢¦MѽÂÝ •b8v`4 z¢X ‚Ì¢(.„]T8Ô…Æ.Ü´3?;ûPè·5ž`ØÌRY&¶T „=øŸÏiÊ•oÊsf§=+Š}ÐKªlƱ‹ìr{\hì¢íîìC­;_Ö€ïZ’Œî.Vc,Å‹e¦,ºœ,ºc;K‰†Åì7¿N´S+?ЧÌ !:g_áÐÀ»˜ÃäðÉéRöÁVË¡ $ÒCíïb8¸¨Ÿ*Šu]Ýe±p-ÈÔ #Ç%ÙüÒb1^õÜ$fHùÐEWý€j€©æ}ê£D|“µ­!ùçN½¡ŒeYâñè.Ø…öøím„Īž°|ó`ØŠî0·­…Ø'n—±«Ú~èayl\a50Ì:à¨Ú¿øhF[”ä1cs—!'BOöC[ûáÛ[šuÛû êÐj…á‡A°Æ~8œC®‚TÔT Ëœ7ÕÊÌóW¡þ¢*\ÊÄáŠ{š¸ë· ãß–Ì,Ý>^¦Ç­éÁô¥9}cëÏ iSü,éâ>ñaÂ?¿­’ÁSDylcÛ‰—|Ö§Ù ‚°¬ Š—¿É'Ô õtÒš#®Óó顨}_9ü1QÜG‚Có‹}|¼É!GUoYsåñ Ž˜ÃþCæÎï/ß®ï¨çw”ë;Âùýú޼Ç¿m9Ë¿´œ‚צÁªoŸS >—‹(æ}(Ù>¦cFo]¦,•gÌ©œŽéœŽà(Ä¢È[)‰QKÆZ!5‚c¦Îý\µ¡C·¿äªýkD8¨q[%ñ0î°¬Ì˪Ū«–9«6Ö8è” ÌÊhÝ©(\Ä âá*å\7.Tµ_O¹;WvHV“».þX¸.~ö/Txöcádq^Î']¸¡¥Ösá²þ6jèÞJ»àøcÐÛ0A³Ò²¾’wÇQ0èRàä ±'å‰ëª «½[AÇ:geþ^ìîù^çÜüÿöë,&~Ù×Õ_ë<ÖòeS+ºÎAÃ?öuN°…\Tõæ!–‹^Ta¬´×Iz¾« =·Bܸ°9P&•ëc/©Ä=h 9”ÀBÆì¯¥îrÖr,dþë-dìçBºtpI/ 9–öïÊ¥£;²Ò&ôSÅ §°8tŽ‚²Œâ‡‰ówY#%·±ÎkTâM~/ÄÕþÄõ/é,μ%¶Žž‡µFáh¡kÅ#ë©'×Ûš8Ó€‚¸õ”t•üb>ÃBÖÞ¢¨ç?i {ŠaÓCpöˆXÆ€S ÁÈkŸ^iÊ™kT!ÇQÑÈ5ª=U'5JA~¦Y%c›6ØÒOµ;]|õÒ»_ï[ó.—æ]mõ›­~~œ.—l«Ÿmõ»®¾ mFúDBÀÀÕwÝ(s©&·®~Æê·´§Ìþ¤¸ ëåû ÷·Ëñ$mËI‘âÙì\m8*B gmâÙM« %¤ Ã‚\JÙ{m¶HÄwÀ¾éÂ5~Q©Êús²²öB[»‡ÚÕP¢”9Ë¢ëR×È¥¯—Á5W>^+ß®•¯÷ÊÇså%PâXùr¯<ˆt[ùö²òõ\ù䯕¯×Ê{_ΕOçÊWw¯¼ÛJŽ\ŽÛ‰ßÁù>þ3œOä8œ¾xå2Í=Ãtx†Ñ§çÂ˲x…ñN¬$é³*ln¨“¹÷KPxúÊõ¤¶¶ˆ)Ë!0ö’sâØ¸«BçDkÔf89ñy\bÄAK¯ ÷NXWºIÌ Ɔ¸zÂ^5=,þ]mQFE–ÈÞpí„eD9P%¨‘o….«~ö`Ÿ• ¶|7ÆWÍ,ðM+ç¢í•8‚EO%FI©,Iâ[2oºDô6YüΣ[)©ž%2‘rê–g¯°˜D «Ø’’Y"äˆLÁ$AaçL¸¨ Õk”ØØîN¸¢V9%u‘¶±ã Ä ê_âsK“Y"Ö°MªðÐéÆ?MµÁ‰R£ÐЂ¡­Ë…޾Ñ:ô¹šÌ–Ü|CP…nηT…Ø–®°ð-•DZ GqQŽÐ’lj„‚lUlã„ØÃž&%UGÛ¬%`‘ ËqDËj )¬ HJšµPb*zL£Û¬)(§ "–CX¼n‚*-Ôõ±@QŽã†Â¯‘®£¦^lÙphx u>˜R]ÍARy?·æøi°M¡ßtñòÁ!_±,<“UÙ¥‡LÆÀšFt‰a)]ä ý3Ú&ïB˜ò9ŽQTõs†ÌSíO&1ŒÏ ÷?Ç·/ùœ"b‘Ÿ£2«ª{Çzvªa-̱+‡NÙvUÔ]·€Ë¶ËTRŽ[±«\%œƒÂ)v4£ë™åðI¥}ŠÆ`QCó Òß©i¦hKÜSÃqüwܧ[ÕWLX.œ°qV›—<„åÈ Rçt•„ä•ÿCT&Ì%–È©Ì"\a7 7G8cÂñäŽKUÙ^jHŸúž"µ£ ·FUmzÔ"’š°“[ÿÉ×&cÜÜWÌ™/ µè8’w™[ªcΊ΀•àpwÎZê:‹©s›I Á ’žmNå~ŒiŠ9'cÿzÌ@’¿oJ©*s‡¬ª Ö“%ï Ðkaÿ‹GÂ4w9¢5pf\?tÈû€ÀÈ_?‡M/{=9Îzö§3æ1‡8±×ªA•¯Ô¸«¨)ù`ßï©Ze›Uc‚ZÒ {hN¡1x½é‘èøŒJB 4;UIiڜ̛ÞÏÖ IM=±LùÓiø":ŠTâ|yÄÎä2e!¶'´¨,Fž¸]JfÚùñš¨·-±Á†vcÓ£,ØtÑEdº<¾"Ãnò$s1 ºz{Öã\†ytu$ÌçàÛ†údýú(³×0ë&± *¡Š—#=|ovø.vŒžëZ]îÑ‚>‹¨UW¨öÏŸ†jk¼ôï5K‚Y›ÁplãGöX³oS3Øà1fí eÉÙÐ Vµ?®•ŽüjÒ à>Áàª0œªÛåÊ^K%йÛ8(yƒÓãÆƒ8ÊmÉ«7ÃqhsX²•%OPD5Îà`(:vj“˜mZ…­\lT`¼c «+†áìÌ6ÚÐ0̆’„ž 8Æâ²ôŽ'E.•(&ë54â˜,L2b¡“†§uo+~~Q (îÅ}@  ELZ°uÎØ—Þà‰aÐ`Àè()‰††ÑfQlAÃã`5G¢È Pu-Eo)£kâåê,·ª8¦®ÀsoªÒ#½"V]Ž÷:qtØ‹ê™Øë¥ ×4n<ˆcµ•^½é4#Å r)BGƒ%*IwžpE£Oud½k‰F#Ë0bGÈy™#Ê›sÿ¨†sö‰àO×Ù5[È,²_$1 <Éõ æ2O›Å²ëŠ¡hÛÊŒ«ñ<‰nŒÏÍŠ¡yx½UváA =úìMpp ¶Ô&níc”زñ±ÓlÔl 2f)Ø$f¬+2 aëš¹®«7o(Î`½M_JŠ“·…M˜No-b3 ƒh{Ïd"~^Åtz›Î5{ÞfψÂyÆN̨!è… ³ˆÉt³…'fÎÆ 3[¸HÌ‚ÁÄl¢á'j«cÅk$EM4È…WÛ„Øè'CÍ&M/Éh‰MD-Å~Ö[ûÛÚMµ¹éÑþÝÙòk@ ˆ€ŠQ"§0Šr-Và`¿«j/Á†Ù¸ï¬ël/zâ¼áÙÛ{ÉÄm”ˆ[5B·¥ÀF&¸V›> 29‚Ó^Ì?-‰V"+)Z÷q#1Ûºbû0@¬b*½‚Ù˜À² º“UËì:²”T+"­Ü7\Õ¤ÆÐÕÜG‚ˆ-–Fà‘zqj^1`uöe ê`¯¥ކƒªLMÏ¿c&wpk†­Z²Žâ"wX²æ¸·j;&ÛÚV›¿Œµ%çžú8ñXk»z1ÜÖH…¸UÛgª„8 ì.FDÁö]µ]–lÞªÍS¼M8cÞj]_sªt’jõK[#Ç’¹–ª 8X¬pž8âXlDÚ‰‹h%Àq (†…†MßÞ Qsk  –'²ÀÄfS­kGñ•»Y×ÕìU½¡JÌl×bf«1{ÅV>n¨Í^ µ5’í:ˆ/$ œŒj±°ÆË¼·5;õ6iÙ&IN¥dXÛtØs;§ vv S\Ã丮ëf0ޤ$Ãφs?›:‡©Ë¶ñ0s;6s{'Àkޤ Ñrƒ×ÎÑH %p$^ äM—«Lí!%˜7šÑ˜µ†UªÖ +XZ2Œm5ØZR<ñl Ê6Qw ¯ÀN©ÍU³¡=´¹j¦¼7±£q:KöÞ Å}D ˆØ)3¡@mOL¥ëk#ŠÑ¬†"êÐam*+QÜ>Êfoï¨í#5W¬òÀÙlV êl:«É°h#•‰›M_ÁôE›¾Üv<&n[/Äméý­J@_ã´‰@cz… à`°m9Ú÷þiâ!Ø̘¶hÓ–A;§±šÜk‚M/®ñˆ¡³E¨ÙÊg Ü’Á¶÷‚G›Úòcx›zû„Y_0çnv’ˆØ§±f;Lb;%öªqY5ú¯ëÑŒÂɸˆ·qŒXƒMU$bÞ`LÞLêé#®L,£që݆ê<Õ[ 0tžI„”D¢W~ƒÄ œ ×n(-Ä`(ÎLnÀ©}GlÎ#C~ó«7Á±! G|G‰Í«dGØœn6«Õ¦Øˆ†bA?ßg1cÃAÅßÑ0‘Âp–£3O×€(â*W(ÍdL},öMÙö"tN×áxÓ[h‡Y,†’'Ê S uû½·B׈‰(Û‹©)NÙPLXéd-xz[¨ÙÉq"QdžŽn\‡Szý8Ñ0rAì”Öµô~Õf1ÙÖŠ•(ÒÜÐÓv…mslÎ`-¼mÆ`$ãÜÑpȘ6¨€z.ù¸ñà­à–ˆãÞpÜGŽÞp”¸f G‡ÍéŒí8ÛŒÞ0ž8Ã!`ƒÍkÚñØܽÇ}DÁ±„ÆU#½ä!1ùàæEŒ ‰«>n¢è-¢Ã4âCÏ7·…Æ~+^{Ë«·Eˆþ–‚È%)Áu·\@Óv7M`€Ž ¨`gŠ q5b7fÊ<õé*JÎR#6Âi¡±ßÿÖ¶aõ‹_#EîÏ¢¡Å½2„?ha•W%sÁH¯ÅFt8VK©|&Ó.TÀ;ûÝeí-®Þ€#î8aÄw½)Ö GÝ}…wÉ4!ùÂdß™&“Øm82LR<0ŠS6¸.†ãŒWƵܳ7àXLweâÆª‡XR€òme=»˜I›2ÂQ¤Wgé"[ ŽÞpÒí˜i»¨Ñ¢0 ?à±_S½{Žûˆ‚cæµSÉ2‰`Òb‰¤T™È¼dšyb‘5t‡½‚¨AœÆ.Ì [ [œhìw)ÎÌ–Ì$eÉx¥©&r‚IšM!ÒÐÂ;üÞᯉ^Ù–È»o’nC…K]h|Mäð¶I2úž/渞(Q׳ÄRÏ&ˆá˜}2^öç—Q,pø÷‰Ì|¹gaÆ ¿¶¹óÿ(¼¥þøém–0 wkƒ8ÜWÔ¶ûÚWã·{t×®Ü"-_ðK6’6{}d+ÉÙ'C‰o<Ž{þWoo÷ˆè‡¹ §Ò/8Ü8›õÞÏ6ŒÄ}2ºøÆãH*qõöñvˆþa&/œÒ51Ý8j‰Æá²‹dÓyÑ*¤ö8ÑH‡|C†‰ÙÙÇ*80 ñÄÈ»RóÂ%ŒaEÞfÉÅ`(ñ¢ýÂâÈœsõõñv÷®%µå~Â{`{M•}äÎ’’³OËݾòˆËeN¦«··{Dôïu®ŒW[p¾pd‰±6íƒm40™`|&êãÄ£*«öVWo«dÃQ?ï8»)9ápÑ4K4ðl¦ ˜ŒãÂcö)p¼ð¨‡ê¯½ùÕÛÇ*ÙpL½æhØrgm {–EK4.hóäõÝì3‡kGåœÆ«³·{@öt%†•(*l¿ã2–Èѳª½³† kC tºñ¸S„í½}¼Ý#Jÿ¦}­dîÀ1Ó¶pd‰5öáKú(€£hK7wB¬½··{ÄwÍÀÓ4i‰.Ã-ŸÏ•é‰%êLìCÛÐW=ûä¹É‰G?yãÕÛÇÛ=â»–ä|âäúºl÷äoÅ2«kEÚxÕ"àc˜}Ò™tâOsõöñvø®%Áí8I$å #!Ξê,"lƒßBÛŽÃï žpêvŠê«··{ÄwMÓŽµf&Ú©{õc/à*àLB Q-mKz~Ì>™ÿÆã%EÍìMÅÌ1¢Î†Ô®]ÙáÆT·{òŒb›èYж©,©H|“ù‹¦»¾êÓD*L üñ’ZåýíLÏuß±Ÿ%ö©–š:¬›™’3Ò±°Kæ)¾Ñøb婽—.}êÚÛK'†¸=t—QÎgM~~áEñÿ G¾•þ—W^^›|¦¿oºñOè£o?¯wZ¸+üúScÓfº´i½Ô=ºé i"»¦â ®š ‡Ü1=Ý*>ó¦©ûÙá…ÃÎ@®ž€Þ>Ø­¦Cåµ&é|’ý¬A"Ògh³à] ìn˜ÄGGUTÙß…ÁÎ¯Ž€Ü>ÖûÊèêm‚ökè`çmi=‘+Õ`à¶Õ0öÙÝ…Á.ÂÎŽ€Û6ÔÒn*d/P{MÅlФ‹iÅQQËO•é(x×·ôdQå-úSÚú²¥hG«gèÌûX@.šÎÒÊx©ú.tÉæ©KöFìzÀ®ôÙBÀ”f‡»uõuy ê2ZƒÌTÕM¦êR}6Õ×½út«à]3è h!`œý) mûº¥†U*Êk¬JE<Sb#òÂvÂ>+ì•^ä¾Ñl\ã•&€61sœý](ìzüÞVv ++·•cª×Xòohè©ÞDCM¼&¿ºï’FÅ[ðÜÀw°ªÞ8JØy$(S·we¤ÁaÆ’w䶨%>"†)¶bÃx:5bO6‰eÖg ÞmrxIIÛHê!ßûìóBãØzÒY[A7FÞ}ë~fŸT½5¨^Û"uÄ =7˜Þ«z­<ËÄÇŸ<ƒóÒŒS×6úP“ô ›¹ð8¨÷ê ù2÷¡×BÿòH§§ˆ ç]ÙöÈïÖ¦ÇK9Îw´Œ;O¸{|ÜxÌïê úû>âûÊûIýYõZÓc3tFØYv|¡Ï2ÙGÀUžih#ð<‘ø® Cz\½A7ÞG„îí=µYüÓ››¡çV{1DüäY¦y°‚hÇšˆ6óé%íóÆã¿WoH߸Ý;Úã„ zmŸOüè¹°Ê3L¸„>.åÚl#0µOÅ#µí;7 æê ú{îië_J‚=¸Ñ½*²ÍžÉ]ádº9ò‰Û?¶Y‚ªx–¤Îz³yÂåÖƒ<.åÛöçãR1¬Þ>VRËÙ¿”³2¢ôù(È‹.úí]4Ï“#m!ðÄPrJ\X|úþkŸ®Œz>UÀÎk~è›L‘Šƒj«g »¾<¯8âPbcˆšþozeó7Aõ6^_ÏúN&•¤äLÕ!‚t‚ÐB3´Û²º}ý–Ebgëf(Ì,GÄžIãÌ´ì¹íy,¤×b#ª*/%iZAqІãèóÆcgUwoÀq‘¹6lâ˜jÃPÖÜ‘‘´¦NGÉä“w[A†AÔÚ\ †;;ÿ;†û€Ì´©¶GdÖˆ–ý#Å™çÂ+†Tëe”fÛ%‚" =*eÿÈ%6¯Î>Þ®áÞ¯ÌåÊañ8S\(É4{ÂÑT{)AhÌ4·Õå…Ä®zÜ}¼Ý"…("7Iàãe°4ÅEÝuëaŸQÑ0õ>6ÏCN´ØÕÕçÇ®Âioqõö¤eï_“TDKRá'î{5²Þ]àï8&F™ý%÷h\mvf3TO¯Aàñ”A¯¡As-úüO× *d餕TïókÒ”`²3m3®çd}FI#}Y.À•iõ¦ È‹”¹°íiäÌ\ÙUŸ“Rl\6­ØJ23PZN»‚¼ref 4=š‰Ö%•â üCÿõ$páÍ•œqåÑnÛÈýðÊôFô Ì”4¼gîùPrÁ“ñ¥ $8¯ÇgHÙf4¹)ÜÌL!wíqòŒð Ê&ìAÄÍrà‘OdæÚD¾­3ƒªéÑ$k½öùÏžéÏ-ñ"‡ó%‡ó%‡ó-‡±”»kâE÷S{wÈáäo9Œ’ÝgtÊáäo9A6aªº=Šeªº‰ù:E/ò•П¥™”LÿÖù˜ŽfN³´OÈ6ì§<êiƒ·|ÒY_&ÓXU‘–x™Y’µF3>#\j‡áýÒOÎóг)|(ÊÌ̾¤©˜z}¼Âç#ßð°‰mÄüɳ0™·UKäWH—Ñv¥ •4&F¾[ÞL²ß#¿¢Ûc4¡ññ(r¢–U¿É0K Þ»Ò‡“9Q1¯ßé6Xðt\êJ8ÝËæ˜êJºÔ•t©+éVW–ÍÑ/›£¿Øí´9ÚerLueš{M]™&G¡â`0ÇðÁZ4²’-ðBZôˆ¡VŸ8®IPzŒd ¥TsÀ"AK‰|#sWZ0SÅJºÿ¡ÆüPcþ‚jL6Çi…ãŒì˜ˆ6Z¾z?á5êëN¬û¡úÎ"2£¥šEx8šP¯7Í!CµE.C¢îîÚ™âCÓ¢™Õ–À½OÑÙG3Ò¸ˆŽæ‹dŸ“çíÁ Í—§ûÈV]'VÞ^ÄQ;-Ù+4ºa^_ÏÕsÐÈ’'öÃõòÃõBNñWp½dÓY4…c5Õ^Re3ËöÃ,=±¦i¶Uó϶hD®{®ÐŒG1åñÙD®7æ—hÇC»¼ª”OÝøÌ”Íö)öLµXÔ^·“óÌ >Ãny®(–_»†ZÓ&š|êxºØ»Ëý&è|· ·CTt¹º\]^Ú_Ýo‚–£Aû‹ ‘ëo'hcÙFÐ!œ=üp´X½Þœ¼àEÐí"è|ô|›wtx!hó¨AÉA§‚nfˆLоHÚo4­©Ø/’./$]N’î"éþBÒå…¤ÓMÒå…¤óË¡i¸M½!éx’t½Mû}hš*]J@jeË"\AÒ3Ò`æÏBÒî3y&QÓ7‹}¶Ô¨XÅt¶}±óä(…_™„ˆ“hÅœ©ºê·Ôƒ5*è+}«P1UWs øïˆØË/ðãôÇ è£üAN@“#1fË)n)½ß °˜ÂùÞHÕˆ%#ÆÜ¨ˆGwÃkªÅ á—å´Dg¦˜ÕÊ@ÁÚ3¯Ÿä»|nŸÛ¹?hëmýai+ÎÃy¯´EOxA ¡ÒÖ<6ÄMjDè¤-{(…ÞT{®2Úƒ|žã{[`ÉoSÔü„žôQ‡¦I›=f!vN¦óœ)= höЭÚ(jVÏMXi§=¤LsUœÛ&«¦aó…Éûj:Øÿžª^ó?¥×œî¦Œ§Ï*NÏy¿˜ºì™ in£‘Dõ…ö´@â ‰Yhò¦ayÚT‚žÚ|:Ÿè6³ÊOãÊj¶pŸCûbæUAåáãôî<.[ðqX‚uÁFYv)–àã ž}±ÝeÚ£@3xöÅ´’?ð,}œßž¥eòýàÙË ü-cgûãŽí)vÖgÒU„æÌ 'Û¤+?Sk~ õÙ.x5ÞÏg TO•©ªÄOe‚æ@T?¦V"x0 `j*ëÉ ÍeÞÆ¤Áh·s»þ*E…¡Ö&^n“…uTkuO{JI\˜ªís›xqö6ºÜ‡ñÕ¼K*ngË$Ûz ÅzÊÄ%ð¾Í¬¼»Dì÷eÞè®Ë¼áˆÓ3âôßì568é!-–@\þ› ^qúoÒé¿ñ§ûf Äé½™qzoÂå½ —÷f ÄÉ@§@ —JëÍ“OÿÍ”ˆõˆõ‡vjiâ°¿ˆÃr‹Ãô"Ë‹8Ì/â0Üân¹]F£ZyoÊå½1qèÌ{à]—РäòYõ²^ßEʘó…* @‘¼GØXEUNu´$\ úà½~¢7~ç$\o æ…EÑykÛƒ¤ú% ý‚Í1zJB»xzEOQØ^Da¿Dá% çùuÈqÉ™¸ í(‡—,Ü4ôÓLüÚCŽË': Åïr¼ÈÂi(‚¨,l NÑ[–[–C†S ¾:Co!øKŽ7^„ ¿… íþãxã‚å‚í‚y¬,©Éó-2£®†÷Óò¼°q&7Ò;Ü&C²WíŒö"ÞÊœ"6Áftîî,œÜÚ5ðÔ5£RT¤‚¾÷§ˆí3fÎÙ$ĺ߹Ó×o†^=“d‡ Ú³wd.´ÆŠ·uãdÒmË4œp2[„Uý0ÿÀb^4«ýMä¥pIxóÐÜ>+WoAtøùòÞ+ÌÖº§ÇædMâDÕ -ã! 0Í%MÇN€> ÏU•]!¼‘èm.¦…YG͆¨åø$zè•’¨¹‘ºŒV›U%Ì ¤]läk›.À¥‰úÃýaþ±,ÐlêhB,A±—§õ®#â% ×™»6v®³9Õ ý§ûJ_H° RÕÄFQ_!Sôá×>ã =¨—DÂòŒJdŒ@¨šºÔÞ®…5„9ÚEÐgú¨å·þP~ÿBÊïàsi¿_Þó›è¿É³¤z­Q©ã‘[…a>ôë¡üf>€¦7œ@xû.êéFÔ¤ Å®Åô41Ï·[Ò/ÕuÛàHÌÑÕ{#ˆ9;FÍ‚8@£ ¤VTö™Œ0h öuêl9=4ιón•ì[oäºí 1x9yqÿäUa—™é”™ý’™ý’™ýEf¶]f¶Kd–‘Ù.‘™/‘ù’aïO¯ìšÄüž¶kó»Êîï¨ë¾x¦Äü¥ºn0z%EóRÓ»+YZ‹™^¸0_ÖZBäCweÞU9¾Ý½ ¾Pm—•åÅÕÍsÇC2æ·µk>c‡Z@B’Éíˆ?`,]Ôg6mu騭FWýñ »MLZì\<Èn§B“’úí¥þía/з2úùí©º¥s‰HÎÏ]k `ÒGs²î uo}7ædxèý:%A£ðÌSÑRQPO‰_Â)ñû¹Ž»ÜuÞ2nvÒÍîûev§%Êû N–sÑ…ÇçKØ;dGÞz‘wF8l6ç!Åy7Xn®K(%àlâÜ3‰œ”D­áÀ÷gH6ßÓÝÔhR(Ñ1û O‘I M±©û·!K€~›ˆSL3êÔm î¨Îkc:;‰_5.³+¿´@˜”$Üc1Xéú >ϦUvS—ž.)åÉÊîÉ“MãB3UøÁÓ¿†§Kóh!‹—5bl'cÐO•q°EÄkfÁB_[˜ò„·€´ûhá“Á#F4°þļ%›&™M!Ú/ÐlŒsQ‹cÀ§l ÐpÅ9€]³4p1SÑHÕÂ÷…ʃÁæMÉŸ=°Gx ²r âß 2¹©+ð÷BÀ„Wí‘jòòXØ`|çä ýâ e² °…yA¾ƒ"ý$úlš¥qÇT7»÷š¨FÙ‘Ú´ªxY-kž÷$DË~g¾ygN½ 3=ˆÖ忨ê;ÀK’ÊÕéQ,ØqÞNxåŽççÙ² â1Tq1ZªFTÚ{¯1«¿˜:íRR³SF  bÀ[$ßl¾†š3è[ÃgÀ1@XS“p€‘k§or¥ÅÜÍ^Œ(O¤‚ßkT%îë3ìÓÜ”â÷Pwàù¬Àø2o”ˆÔ ‡%}ï™Æw)^LY[^’dô½¹+߸+ÿ3îÊ]P+²áIcESÄ’÷qÇTd!¦y%Zƒ>óÚû"Ñ·C¦ŽW¦_Xâ° Šíw.V~½¿sëÁùêųω…++“€Ë ó¶ßƒíwܾžpE/ÎZ³qmV«a$Qa5x #©FüÁrÙPH®PêK$M-ß„ ¼ýjÑûœòãjÑ/»Ztê²ï:¸Ï¼Ã¬~äDÙ•Õá(h¥A¨„D‚[½Þˆ¤Bh6šÀ΄fèú`êâ£I8>•¯h;ï±Yhs=¶‘m¼l/ض‰—·Ù_.¯©HÍw&LKÚÒ·&õÃ!ýâvæÎh5´íYÒ¸ƒœ¥æÂV-¦ ûy™ß.eg³N2"@r%šæU9­³S"9®Á.šq|¼ªÞé?(©º­EÄm1»r*ùúÌ:!gæ?àø¢…bW™¾>=§¦€QYY¼(}ç°qéütØØ–1§Ç&ÝiÍœ&ݯ{ΟHwˉ07Ý)ÛOÑÞ^dûï—Jöå¢óL‰¸Íj$£ª¶ñŠ™Ù­ïÕÊEŨ;¯¥•òà;;ošZˆþ{#cçáу„•ßDü«ÎO-Üt~YSçwx–O€rÙC¤p£Þ-ƒ'FÅÆÆˆÓ ¾6±é3QÓ©ŸWŒ=ý¦<® i´%Á?˜È}J2ÖiÊMÆëïæ›ìpë^§‘Jp©’à,ÞÔF–Í æ,×9eÿ"•þƒÃu$X¾K<«_J<ÿÕø$Ÿ?õü3ݸ 5‹´Ò3Kxp¨¯ 3é÷'ÎÓ{`·j¬‡5pñübæ~×'IãÍ9)›NOíêÓÎØó®~;ãí«ÔoêL3 ~åÝ'RguæHx¾7*nc›&Û—ÝäB²<­ ­ox:r‚Ò?̈õÆÄéAÁåJì\;Ì6½µNÝÁØxÜ<]e&<èçWïé*ÒT¸Ï|åqæ«h·&¿(ýrÃÔK}(/n?ÕËl¦þ`™mâԌש?O,é%qi©'«å¿M|tc$ÌШð3V’:gºÈ#¼ìÛÂ*ç+ÏvHa<ÛQ?ž<[¢Ipj¤Ïfl<[ìGžÏL½±QbDó&:n’F{Fÿ´ ‘Rw®q°òD ™Àõ=¹6ƒCüJ¥LO ¹vë'×¶Ã|ªIŸ|ùúlÑÜ”­ÏÆét…¥+U|´ÆÝ‹¤ÓY+…±*vÊÕ„ –¨áæÏL0{ŠÁ"ÈpEUžfu¦Ì\æ9_\1TÛÄTuèü1…è…Ó4¤ÿfæÂêæqNƒ·¯3)–d€™}M-n;µ{•ƒ6²7ÎÂØ·Tt3¦)Ø‹’S,9´—\jXÍ>C’7•ð6Jc„a²[jª $û ^êÍÅ®âHQƒ3¹­««.{:¿aGx M¤Ç—MO:®áyMË0r· ™ÃÁJêY¡ænþnЮ.Íõ=áz¶¨Ðév¸°Ow 1O8äŽþn¯)\p¹[ä«F®'\f(•åèlô¾›…ÈJÖ34aò=º<Ì‘HyÍ.å‰GˆkÏjÛ Í·h^h|û]X@¡›¢‚ K¤Jé‰Öfœ³T.T¢ã¯(9,>XTE‹z^¬ ²¦Æb,ˆ÷ñÔuõÆ'¢á¯Æ5””Fž*7•Œ¯“É`Ø¥¼]ÖÒg-»[“mD; ÛOk>öÈ¡ãÔ|•)llg´™yÑøf6¸â{~lê𒵪î‹€X§Gz§Q.,û"3®ª€o&OÑ”/¸P¡èæöãA.ò$ªÎ~o¸O´8$p~]éoàéݼe¿|óö¢´\OØÇ»…ogÀ1-sæl0}wOÀó”mS_·~Ãî°­Ÿžç5)!¨¥"¸’pã7=zÕpœÒÈ=¢Æ¿i×£Ëi[u ]yøeFVªï¸H#â ÞÄJ¢`mÿ´•=b1lŸ‰{½¾›íCêÁN5È«C_0w²%®sع‘‡RÊF;ÓzdM ›MþѦ¤üSÖ!s‘M«l3‚r«8t-'$Ÿ!5Iƒ‚°—A^r µlÜÔͨh;wÌ\ìÌ‹‡QõVì*éJ 0/—æ³F¿Àr6¨ˆàßázÂ>Ü-üU#Ä îw‹˜Î7hË—Í÷Ͷ~¥Ü{ú|ûÌPêÑŒ§±¦ H¶¡dí$ÞÖa}æÇö´˜<†GÕWïŒÉiëc\§&å-Ò¨Ù~ô| !$;Ì”û-¦@B&MX%L¹gÒ[’þ©m°dj ÞO%wmc•ô³µ Om£ÌÈ+ŽqÁ»S{¿ÞùÉÂË/«õX;Yñ þ¦æäôžÀƒâuyæçÂKËAò¡s!SçÊ¥JB`[<ÑHO\îæKss©3ÌxÉL–Ò‚¢í[58ÌÅ^%º”ÕnÑÑ¡“¯•CÁ@l8ÅÏ,8§ð1ð®Mý°š¬â/Ø8Bµ÷ãÊ~ :3´Àv¦ÜF_ÜÖÈ“òÍB>®d}Åp 3öþóèÝú²‹ôn¿þVî]ä­¤tz:Ì«wI‹ÃbNtÛv¦öÐ3’ nlPño–#8 LÐo)ß°ª9kÕí,*Æá\*€}ˆ÷ˆÛºÑKa…”Š=œ™‘9ý±%ÜæŽL¶¿À~ª½éìArWˆ&¦ÖŽO Œ¼…B·k\nÏa¼„„çžlÍî ‡0ŸðĈ•óa²ÐÙ 1Â;Ïk&_´9­sÏØË•Ý˜ƒ9°¸Ìv2e­è µÅúp³Ük+ boA©Ùx…â¨ô‹k+±„º'{‡ *˜Wz ¬iæÍ¸tTOuV-ÿÒ”³†Ãœñƒl×z棌Ýbž¼½'G¤×³Œý„=£Æ>§Ÿ·Iê3·M´lºS-—ûSØÄÉÍ[»ô$&ã›g±ÎCóí$󰈲ÂNf8éÄ"íZa0½ä®ÒÒ÷¹ÊŒ  §Æ”“e­È[jœÄQVÚÉÜҤ̿j%æYm;‰àõе€ý”ø„çùÞ³ÉØ`Òc}ù™Áïœ1›•¹7¨ÞpÜöÒ¡Ê‹¡¾áõóœ{ž˜\¹éìŒeÃjOºñúcû> i´]’ÏÏ·Ñg庋IWÔÄ®ØNMVb>;ÑéךLuß»ç¶ë -:i‹Ï/´èœU»ž_ÈH±ù‰Ùßߘ¯s®œÏUÌé^“3~ó¢ÎvSã}y.|ï›Ý ˜U£}áüæC¢ä!Øà 7wù•†`Y3vÐU0-i>_åŽ;»§øG Æ'íðÏçλóÑ\ÛúæFSlâj^w¤x]×w°-ùÚç›7Z¡˜,é°?²Áež!Ú¿JE²×AiΦ´pÚŸÿ8>Íl\ß>>ì§·ƒ¬hÑÍ w4ÌddSGlç¦ðÏçál¸g¼~6ãÿåí?ÞÜà ”³Ó›óãï÷ùwÉG?nûû¿=þ'_iõÿñÖ›$Tu£39:êM -Ðn½ÉD*,ד½Ê%<å6!•ÞD h‰ð±ÑBn³‡ñe2DZC|Ó1õ@  ?ó»þˆ˜aî°Ëÿ¸³'ƒFëR¯0É ÁJ†Í6LD` T¤ÿo€Vo ÷ߢ>µý™ê¦}#½ë¿¥R+ð¯ôAêù }Üp¥R·ô_éƒô¸è¯ôAþ/¶åp•ö«>H÷¢¾¤LÀÆ®»N„õÅ)Ñ j)i ¦•XRÑ&ûHNJþ÷OJùÊm«w¥ÆÐeü¨eŒ>¿Ž”§"µE¶/ÒäÜ—N8Lc]“Æi,礅~NZl÷¤ù/Ÿ4½äõ%“VåÐŒ5bÐñjç¤ Û_vVóįë%n½Q s”í‹ .¸GvΙ»æ,^s®9 휳rÏY¸æ¬]s_æLƒd¿jβm´‚9s6^Tt¸¤<½–I¬qN¢àßl#¶®SØ_¶ÙÜxœ2m³µí¾3e¿~›!Fí«¦LãØ¬†ô`SÖan4}À7µ‚Q¯î³hS¢‰î¶ ª·ÞZ$eq'æïjÈÍ£5µØŸ¶ÿ”™ëGƒ7®¹ývÛ7ŸLöQðþ2æûwÏÕ‡–€ yµ«ehÅÜq»1IªÎf·Ù Z#W“wMáfó Á[º}@xTÃQCu>ÇQïKI-ºâ a¯.C!Q=ÝSR’=Kdý.G…‹3˜ R´.°©‚U¨é“M¶,>GØ ­½õÞ`‚zCXc>«á¬Fûl“ÿσÙÎ^"â£x¿£§±5Ui±’÷—:\*é!a®r—hEi}‘ \¼ß5¤©u7Š4LVÑ0+x©‚Õ[bؽT¸@ÓY`Ò· ~^¸³DúÎzô¢M†îâI‡?ý¿sŠãA¹BªŽbVå»òjZ·Ûç€ÕI§ÝÉFbÉ;J$8ÍÚ¶>7vÕòîéãííÂ/¦ŸÁ#·Éìˆp½âfKÞQ"ɰ¬ŒÛˆïÀûÆc×ôîÞŽå³þ÷’XNœ†f·ÁÍpL m%ï(‘~k#°ã¸ÀñÀcW¬îÞÛ ŽíœÇÜ®y¬¶ÎIeŸ•¼£DrŽY=ÇUOÞîå&Ö†kÜDÍñh%Š¢FŽÌ6šYg—ŠEؾr Û»³ÃpÏ"úù…ÞîÁ(xZ Ó.`‘L>TÀ:‡öÔå,ñU”‚!p˜ÞñIÍ. ‹ÝC{öU€á6^5žîÉÃuåÎk8rL—Á2«7¹ %¾ê}höQPàºðÃêZŸhì^ñ»³·{Àw”d’€¤:´”cBºg\%¾ê>ûÙ$%]¤Ža{xÜhì'ÚYš}}ÌG¡Óˆ€`é _MjªpK€#ç%¾FùаÞí} ìýãÂb?û¹;ûx»|‡äH,\µÈ„Ë\‡ظ´¦:ž%¾jxÅ‚Óq4ùìSà”'s×y본ÈþÕÿ0J4ÄÀó^žÂA¦$#•¹²E K„ëYJ÷ZâÒcöé«FmÝxìÁ0woo÷ˆÊg5ïÄàÅ`ï5+{‚\J2^. Ÿ”á;™%^ü²äÕhã›ÃaŸ~â*nw<Ú5{o`ÓkDt^¡"@ð¼ó£°¯€ÅØxèÛÛ,ñ-á&Ïl#%ŽmDàË ¥>n$ÎÍxööñv¨ý+÷ÓàØôÁ%cŒIæ]´Yâ[ÆOÏø_§{´ ·´ÇÇIÑH›m½}¬ŽÈþ»â ø^Â}¬$¦C¬×Íf‰ô óÏÚHIâwv~…}æBãä‹°L¬³UÂÙ= T‘ÌjT€+Ѽp膡”H§=[…8«Ú ]zÀ•_½¡qJé-ÏÞ>V GdÿÍp@wT‹+Z\ &Y"šM°zAòVö(°#Ƨ€>:ûx»Ç£3ÃCµRÙ*`%LÕ+À­‚! Ï¸º¨,ñìÃsÔò¸°8u›³³·{@v¯*CòX";áHíŸÐ¼¡‰@J³Î¶ œÄØ7û™ÛÙ[4爻Š ê ·…u¢Ã,9‡ _¬ÐoJí®'oº55éŸ?s±ÍêÖ¾•kÜZýo=ú‹j5ùxm2½Lª(ä`¡Ó©hŸi–¼Ÿ%"%v8åžRƒ„°cØ Á–­ÀÜLŠxˆËe#p¦ §SQ‡&½úlpk%¹<8¤Ç…ÅÁJ®Î>ÞîÍËT©‰{zl¨™çDNÜê‰b§:¾—ä%ôyáq0ä«7ªûþè_½LÔÅP‚–)ª{¨€5VwÛ~™;’Åê.ûB‘bíè o1Ok‚º¸§Gùgõt˜è]!…õ¶ÄÖ«–¼Ÿ%;ÍTõ©ÝhÊÁÕ-’9`2k¢QTΕŸ87À¥îéDQKÞÏ’Ü|Lcå…±Mɺz£M²HƒB ¦*öžwón ڻʄš¾õª%Žz'ù€“ÜxšêÕÛÇÛ="- Ÿ «¢‰‡â†•Ò@Aµ +z ³ä}/É˧VŸ Nwøû†£&Oø€ ‚YÒU@×tÐÕémDS×M¯TÏia$Z¦#ÆÅoÓ‰Q¬‹Cá¿:3…ïýSåý—ê±ls óE ÿ«ª{èÏ÷¸ÀUž¬ ³ÄkÜ‚RWó}ÂÁ'º#f òÔÍ̺N4¶²3æuÒª‡Ì u³]†Œ ‡¨’•Ç®DA—\KgÑÓ½s¨§¡‡{: y†#ü˜Ïgç¾´ðcž¾·‹Ž?þý#žÆFßu¥¨‡P‡î4Å2¸ÌÃE8WËì Q¥,”’ç=µòP7ÒeÜO+±™m—ãýÚ åe/”k/ôk/Ä—½νÐέÐîpnh‚Ÿ>ÓÐ~ó%+]}ˆ»‘ࣙDQ­ ™ ¶‚~SàG‰Æèv•fúþêׇ餱–·®–ÊxÉN…õ÷X²ö%òÇ ½ÚyTŠ"Ï~"­W*Ô5ÓÂn´™ùÊŒ–¨²Zí´wyÕ„›€i™‹©ªªé’fP`ß? ñ ÜS)¼Iòž?Qöûõµ¹^\5¶s½ZtM^,}iѓڃGݼfyðÕn],œ·43Zý ÉŒô §–|‹Ô?M^öÏï±fi_£¢1jÇÒU×)J®#m-p÷HsÍñ @¸ŽUì $˜Í¦îçšÕ|¯ÙÉiÿXtvÙƒ¿ÇšùË{»Ç*Nר.J¡VB¢ S´©¡Ö­UyYïæ¶ ºvu 1ßé=œ¶ç¿¶"ÿ>*:Íßß~Eêó ¢vz‘Ê:ºÉL/Ixê‹Uà¡äè’‚ÌUWz#œží"‘^ä÷ckþwfkˆ7Úჭñ f`}¾èU1¹˜éc@ð,À3½¬DuÝs=‚ù“.Ž•þ8ËÁ¨íõ›³HÞÁ!4˜¨àˆ&ºÄÈMÙ6Iªy$XWôp %rT½>n9ð‘LM æ0c 'uÁŒï‘‹XäR±¦Tg-TpÓ'„xµÉÑC WÑSú$üÓe@t„<Ô‚),˜ä¸Á—X(—XXb3•^ÄBâwû­æò§=ò|-ÉŒ<ï‘Q­ò¢ ±Â%`ã•ÊYL6Ï>¢¤D¬Dæ s4F@Ê1”L³ÆÕä t5æÄÔùQψdV+&=€‘“¬ñ©ã{Œ/“¬'Å]“C*G×±±»{5¦L¯iô@Ï;á–çîÆ‰£2%dM&¶6«s_¹S_^ådSùÓÿ¿f¹r7Ç/õ}LŠĞGàiÔGÉeRîØ‡}#O°?ô²¸ Æx)þ*ÇV,G(ŠHáœh’®bC²¬rµ»ÙfÌ=Húä6cumL^HXSÆ7ÐÆx¡7Ysë”é•I²&S(/Dt¬±1Zäö—)ë[3UÌ™ O¯GÈØyÉ&Me˜Wø¤Ì9ÄÆsÜšÌzòH˜öœvr†tûBá$)œû4Ê÷~ÚïH¬ß²O4MW4Ç£$î–}6&K—9x.3¡À4“ñ'ì3µAzü)6Ì)ìD¹‹)ÐÙ¤eÅ”èo§Ê,H³YFAýCû¤õøµ“¦ωÉ6iétæd¾a§LÛ3ÄY–=†¤F€.¥Í¹xCSK4 ÊGõÏõjÔ©Ó¯kÀU(Œ_“a‹w}OsÊ)ŽØ–˜òòLs†¹O›!än‹z†N¶)·e†ÙÒ“Òæša ŒøZ+OxxÜÓøÓ~ëdýæEÉøä5 1a‰ÂÛÌ8g؃›DpÜYÕ}+ ,¸ ½×ãµôà’‘²/hƹDl#wlt*¦ä‰¦¶¢õ4 õbvÏSp‘Tªeõò<¶qþÚ=\cU'±üʹ=ÿSZ¦yùv¥’ðbXHPˆÂÙîW†’Uük,L£`+°w#Bö&5LÞ â‘dTº\5‰Z™—€{Ô÷ÐL}ƒRFO–ëšÎÇŽÃÍ™•Äú5Ø!Š”p–›öBC¥X0$‹>O7Á¨I¥·ê‘™Ö­?ƒ#u&ƒFQ%^‘• ä ê~õŒtëúˆSñ!Ì#ã‚^Ò¶«¼7X"×ïßÞf s.Ø;3ΚáÁ¼¢…YÒ»è°eÁ‚Bo[ +)žÝ ÙU¿`Ù zï¿¿X°B±ªP —ñúã¦ì„DQZ¦d ë>’~ŠuÄŒÒ7øÅн,áËLþÜŒ6C[Ù‡{ØÝ«Ûbü¶®\GÞ«šÏ¨¬¥f n}¯§4~~[% ¬XÅ¥à>¶[ sWt9§íåÑ#avSàn zòè˜G4¦îÇÄýX¸cûczý'Å,Ž»œÿI¿ãoô.tâ“ÙÁäžR £xr–Œp2¯YŽ©m$–8š½´ç#½Ú£p™¢SO /+¬ú…©7¾ ÐG\ºS5S,%¿‚ª0¼¡bâÚã‰rï¿É\¨ìôTDMW‡£pM˜Ífz©ä’”‚¬&\‡xöúô™Âj1y Ke‹¦H8¨™<^ßFSX™®¸¨`jÍ=5AÙ|)FÜ'C9øz(û;8ž)îmÔ®mÎm¤hûH=Èž~X lÓMÒqm[WÛØÊÎ$Çø*_`¾×9i-ÙÊÙ´ÁÅÁØ¿ÃÝ8iÞ,EyS‚[q±kmO牣y1>¶Ò$ôF7Ù†2!ïàÂñJÈX0 Ù²«Qš²‡c™Ù¶®á"®ˆ[ŸORÓç{¿˜ÔîxTõ€«»2ùrHô Â7ÞÔ½¡%YTåôé‹®K>à°¤—¤ü¥Kí°£Aè7š§{ j•—ÿ•÷'È•6íâT¯Oôx2p[½Kü¥r“NU×é?ذ¼LõÈŒ”í~@¸¡EÌhÔ‡cǨ#GÉ1Ås ü³ök ÚË´k ¹sÍEPo¹Óètà™'ž§-Ü=nÎÈ)@Æ7p†LXÚûc]-é±>Ús|ƒÃ«Q_ü }MMpÅ3M<¿*þsWŠ"¸ÆMk:6øÏ0„â†PÜ`‹m_2oqù€;Æ4BÀ‡ ‹4KÖ÷©<žù§DþEþs~Æß`ª&ø¶€–ôU¢—¾rØà䦕ŒÃ]))}¯A­}ƒÕ7·µÓò¶ôñ€ôç­E‚_yÖÈϲƒeο5¨85ÚÞ¥ÂÛg~Ã=ú¶÷™Ž@&ì¡É¬9àÒ¬/8íð7Üd©ûÔHƇcÌ ±µ€«sÖÀó”ì©®ÎxP`«ŸûÜ–ô<¿[ÞlÜq*®Ñ ·¹¬EŸMkT7Þ„©0¯'Z«†¾ñºÁe_-mA%zÖàÕƒ©aµhþœË÷™ñê`9±jtÄÏq îû\K‹îÎïèI4&Œr†Ï¥g£R½)ÝËÚù 7Ü{ØôµíÄŸãü4W‡5ÚBL«öeQ“ÂõÙÎ}2­àáù]pX;-<f²¾[áúÒ¢ŸHÉ‘’ßaê…«EH8š5¶=¡p…Æ»µèЉ­FôfÇGzÂ|:ÄmÛi¦;ám«£…p»ýC“_Ä¢0²mí-ò9¹ÂˆŽmqC´È<{°9¬M¦pZü”-òb ZCŒ î7VòÕÞ§< ¶c9˜€ g‹òܧJ.ïpÝè jاÛ3'Êo¼-ªjT«F‡ËÃ`Í,{´ÐÛy[…´“›×€£«AÛÉÇ9 –ƒ‡£þæ@…¼X„¦ÝÖ‚Y9XCCÚ{D³…œm1à|Š:ZýÙ¢íŸ$ißá°oRiàãÁfÂÐé÷<Ó›l-x Ôj·Ó’nº§ax]Ê oûW„r¸D']ö‘ùÀ—É·ƒ€ç¶– i‰Ë\ZÔ®z°Ÿûsƒ’›;…7ÒbÝbZjf–Ls÷Zƒ2å jÔÉL÷¹ÿÙ"»©:iìÏ9Î)³iQ FžÌBcaì¢)`mA'߬ÑçæRXüééhQÜ™³Fœ” 8Í m-ò¤}Ô(såÄA$p­OX[ÌÉ× zõ~a) K©n8é™XœŒðbÖ"?ã^¡LÖx¨æûÙ`VûL¾°‚öl³ÁÆök°þÃù«±Š§dºàm^y •Ò 7= pY-r>†{‰SÊ: [“ŸèÛt|Ò A<#¥œ¦Ü2;$Í5"ô; .dg€i‡dúï:“âMöÕNgêLYԵȄq®Ïa‡ýt¿âÔYs©•½F Bd°yâV ã~V#á'œ©ï¬“YÃfÞàºù ·æýÅÑÜL‰Y=;øÞ­F6[ÍàÀí¶ZàñÅU#=1$ÛÙ Z^AŸpÛgúï.ï]wÎwÛ[Ès‰{Ÿ…QΤÛÕ¢n¬•QûÞ¡*þLÜc5ª§Rnp¸ç¶22sÖÈT+ .ÛÚ ‘S[3q 7G%o¶jß+èû Îûf i±#ÝLA3¸ïk£j¿§Æ=œ8õtOTÏó˜ 5x`4á¶Sêýdè –Em;l‚`5HdôV£PŠÜæIµè”ú¬áMï48îäOÓbÛùjZìF¼®'±ŠiQ·õöú´ÜG°³EHÔÚ¬F9hˇF´ZtºXc(';©ˆm‘ÒðñØj[ ^V#ñÊ»ÕHf·¯](¦EÙ‘JõüðÔŸ'NÙ_wY78í›L[”ƒúÔ²ØW#› œ- WV£0uÌ„óÅÐ5®}«P=á|¸^ÁÚ‡¨ý¢yj³E»>é(6¸ìÛ’†Â¾­ÓØ$¬1 {ýjC! ʽz½,_ …]ŽI¨ž;ˆ)ðâ…DØ ³ƒø˜a„ÍN¨[ ï–‹0&»Žf( òÚævB0í„IàvBÜaS«g‹À´žÁSïoôŠù¥÷‡ ›Þ_÷i΃§âïÈa¸jŒ}?ajÍÄÑôì¶Žø;´f£,…Ek>ÌX!Äè jâM,Ή ÞT/Ï3gÅió÷p¿<À[J9Âß—gvÙ§vUσڙ‰K¡´ÌXà7ÌRŸª;á@ÃÕ!#ž–œ5ÌlpâZ¯‰ûÇjU\(W‹B»ÓjTîƒuÚÕ¢S„X œÝÞ#ç­ì}æpŽ‘-TlµH…V#“7\¨ý¯•>O«aŽuƒûóBrHïSSPÚÁ² º_Û!PI ÖË öÓ«9—^Í|Àu‰ŠùLUÂQè"ß·ì³ÀKD’Þ-Gcåßqªšç¡êãÑ—ãP¡ ÖÃÓÍMxa=ö؇G˜39ê±JFŸÁÔ…Ó5¡zå¬Aæ2a’ÌÖ"c%f²÷‰åýlQùMV£]ctèø«E&G´™c&Ìtö[‹€3kP5˜°`¬™QfVƒ"tÂ$Ý­EÛç¹àö1 XÞjPü ÔC…pQ^–£\Ó_2(kÂeF/Y‹:ÃÝP£ŸcTÇ€ÔÙB6á¾`æÀ˜0îTî-òsÿ ¹‡½Ï\m3˜Ì0·Õàé½E ûúªŒ¼Ö«¥²˜r|kQ!Äf¾ï;žcô°ã©‡£éh‘*¶Z”«F»zè×"JãFqÞnNM¸íIA™÷>À>pÜg‚’2î*¸ë„ÛN *÷ÜA¢âu{‹!)k9[dÆÍZºï •”íXqHômÁÄݰ“°}MÄ<Êlû‡'Þ«E }±œ-òbx<ºœcxȾ­•}~1D=ˆŒ;êpèg k´ míKiyŽP,,šêÆh ú&&ù&|}ƒÊÚÓ°Uãû8ž”úÄTz![âÞâgÉŠ¤Ùà2AŠU–gú˜&\:½Zò/«Án;Rô•Ÿ-:\ºgG:[dF$ÌþìÁ"o¶ñÄ"Ûn6˜g-[‹Bc5ê9UÙvûjÑÉŽš%ÎÜϸÏY½ðäwÖˆ; Ëy¾µ §± l°]X p-jÕèÏ}DIfuÔ¯áÀÂr&œ`an ÂjTJƒéÔÚZt9²Fó¼…`p¸[œÕ3 Øàr£$GúûGÉܽCA÷¶ë«í­Y£Á|"<,º½ºÆèôýçHEÄà4#ˆ­EÙ‰Dctê1@ß·/åVÛ6ŸÇ; œöi¡Ü:[Ôc%4bÿhxæiB`(¾Á3¡Üª{—é wʱÙ"Òv±]¼ƒiŸ9šx}"ÖƒA‰ ;ÈrAþiÜã&‚2ñIEÞ˜¸JF§ ‡«®¾¸êê媫—«®;RV!]ÖÇÉ©ËC®6€N’2 ¦6‡à­ÈÄœx¢µÁPB+“ SŽGBõÀધ…[:ög…ÏÝ„™îlµÈÌ"l52²ÔL§0[ -·áüªÌ †[ †€Í™Kg° £Õ‚÷…g ´Møœ¦Ü÷‰Ó.'¼¡ø Ñ”ý¨±AáAòVÝôO«Qq²4ᶯÓ7Sß\Mw7ØSm›-jÜGU®ø˜µo¦l;VrÀ¹c%7ŠÏ‰jƱ¬Æ> N½­6ß*² ÝQ²L;|µë3ûWŠ“mÇP.ÌœßÐÛ¾[ ù·†?k6[Ž µœpß‘þ†£È²M¤0È)áé#”ã3<²Ülp¿ˆ‚ :Q" c4'ãÝÔxå±ÊÎ$wR/ïz3„£>îPò\îô8ÌÇ¡_FzEúÓ\Åãrˆºë+«Å4€ Ñð™ºÃ ”LoD‹{ &ÅÜàîÏ|Ðjã¹àz4È 0Ÿ˜anÂiG’Έº#‘y°=áJ{lµh$«Ñ)n 9­Â[ö1J˜+ 8žÕÓþ[ž÷ Û>[ÕùŽÄ¬a»ÛàN»h¶¨î\:n“ x¾¶櫲™¼Ö`“9«E¥ýn5v`0b$ªá>#rj»CKû j‹LVg5pÈ>Áv/BÃV¡»£~7Ѭßïuƒ¨f7§5ƒË”:ae3õ¹á¬÷•¶ÕŠ;¾Z]ó}ëR\óm‡óZk*r‹Gh`¶¿Á‰÷Ÿf pØ+4l:úlÐâê2)[—“5i¦aT'ÞlB.Ü/¸ÞBæê¿áâ=Ç…/}4EJxçÝ%fÀÓåØ,Ù@2 ß¶ßéì6f«ºéüÝll‚éÚæÖâÏ™›š`ájÏê<8´ß)‚­ÕyfÇß%EÞö%Å_½“’ü X ¼P/fóg3îVGMŪáÏáøP<º³×fˆ¹ý^HY+mÝY™Yù{sGëÆgžfõf6çU÷5ù†ø¬½7¥tÔìnÛ ªÊÔmNz$OœÕ}ü=o;U Óvçs?ø]N ×+÷i{uïŽõ»²í %`u!SÏîpñ†·?• 5…]]£‹Ž²ÛEÙáqRö‚)lUtºŠ·òìÉ#E󋟽 ê]Øž³ër;ÇÉÛ }¹Õ=דҹ׈g}µSKÖòÓ=ÊË«w¿íàßyÏ-Êþæ]Ðëvë=k ÕeÎ ÷xaî¡Ñ$È®,àèMÏ´ÖƒÖÚ°À_€ëAkýåAkëÈ´æ0ÛƒÖLJWµgèLQ ”rLÉ’Ñ¥=Lj&:†gdL*€õu² Ï´fOÛƒÖl{ÐÚŽ)çãÔ×Ãç[Ͼ[„4JF§šÃf=h­Ã8Ojpò Ï^´¶Î¶­9àö¢µztø¦y+wÌ•©ckÉØl}>u,ÇÖZ AáEk6¤ÇÆg/Z[gÛ‹Öp{ÑZÌŒ^ÛAhïÇEZc󯧮ZmöF´Ö’ÂwºSǰ®=n4>yÑÚ:[/Zc¸íAkõÑÅ VãÊÏ—ž=]µ’ѧZjëAk-ÁÃâڧ­?.$>{ÐÕýAk°ìZkr¥[¦Î“`S‚’7Û«“G`=h=JÔ¾¶>ÎéqãñÙƒÖÖÛö 5GÜ´fæoZkºúqx¦—ÅèV l/ÄíAk-é´³â˜ÔwáñÙƒÖÖÛö 5GÜ´fê ?§–hfhhˆ*ÐWåxRPdïµî×{Ö£ “ÙåÖó¹·ÏÞ³FoeÏZG¬û“ÖR,–_ÅrÆ ¸öÔ³Ë36PKF¯>½ž´Ö’Î6>`\<9}àñÙ“ÖÖÛö¤5GÜž´–’Àûê-q<<Á'&X`Éè2Ûã¡™ëZô®ç{Ö Çõ‘†ÄgïY[oÛ{Öq{ÏZ½ï?Àó-¹8Nå:&ô:_wó&ó³:?¢>n,>{ÎZ‹óa6œô¥í­hx¾# êÙ|¼ÚEã9(ÑNÝzŽ(«Ö€êìcCã³ç¬ÑÛñœµŽXö笥ÄÞ·ë¬a;j6•Z¢šM›‚÷ÂöÑwûÎ…ÇgZ£íþ µÇ-Êõ µêZž²Ì×îÒœ ÃÐg™O3ûÊ{!Ï®ñq`Q¯çíŽÞŽ­=òäo/Z·ªöØ_{ Ú©/€8Fbëö¢5JìkÎbñ©€/Z£mÙ_´æ‘Åö¤5uÔ_¦³BÙ·’sœ¯Êp")ÿö¾,Ç’Çò?Vá+ph–Ñ_½€ hÀ½þy@î¾/y)Ê<¢Ýå/3²þ.u%3™FއeF@ME×5Ñ O²DA!„¯áSÀͦtÁ¾”sz‹fJÌ^5ÄôúZÅ‚€ôZ£ûqšæ0h¸6œ¦|Jú§€n€Íj´¤YE.ûíX‡,°…{Û4à d|¬«àjoÓ0ƒ'Ï›Æç †ç<‘÷Ltq29ñ) o*úµH„PÅíÄ̪cÔ?/1ë½€~JîI!ÃÔþ÷äüKNÎ3¿ßOÓ¿ä4ýÇ«SŸÿz–|¼J^ÊZ¢65Y<5^¼ã›ÖX;i 96Ûj*Eñš űÍè¸Ï…ëëÅýÝëM®XAŠâ(#‚Š(h¡ì’°ÿ«“V$5iQÇ)A°n£·®ñ~îkˆî%Ò/VqÞ-ºíÖ˜§WJ @òˆ-Ä12¶PˆñH &ÙÝBVô5Dav蜒r<ÞàU â¡‚²¸†Ml¡p§FF˜í¡)-¶`z„SnÄNÕuťŷ¾hÍnçd•O±~…î© Þ܇T¹>6h‹ÝjÐyíЊ[t˜2¼†öÄwHôýzqy¥CkH~h05zÿT îÉ¡5J34 ÙË+,`1—¡‘¼¼†À܇©ÉÈÉZdBžóú*b•Æù™L°X§K‰ŸE£SlPÙshD¹„æB¯Ñßvè¦*Ђ®ì^£+ÒA U>Ž-úµh4ºâêÕÏ¡š¼µ¬Æ¬±Zï¡’»3¶Xˆ;ô¼—ˆDW”øÈ hªCCC~ZhÎSA0»ûŠô|Œmºê© gì‚´@hÇ©!Èšñeà¾-ö5ú¥–k‰HÜæ¼FJ0ZâüÉ]t=¡!n7´ÀÍjL5S;ÝaU-Ä}vÇM-6‡C¡Ð¯ÓkЕóКD#¶-®3EDéñcÅ3à'QVì÷Ì×1"(óž ªæ¶îeÀoMQÖ…ÿYPx”šè)R™ ±h¾‘©ñ€²4!Ä~VV³2T°<—-VK8üdª”™ú$–‰†6 ©dD43—xÎÉ3ÕqõÕ%uS«¹a®è›W畇“É)8êõV¢l^%›·Èæm²ylÞt6¯‘Í“5lS Ó+3ðs[¿å¶ÄîÌQNIÁÌV¥*35¬Â¬ÊLÕBZõ jܰ‡j*ñ\‹´¾ú§ !ëjñš¹i›ÓbRl±ën¡}W ŽÅåȯw^ôkØK¿ZˆóO¬ñºBB‹,I*p§°Å«ŽÔ§FW/¯CêZÐ/ÄksïÐçói1y6²FI¼‡ŒZVhAïÜScݽ¬«õ´¨í=v¢Î÷`™KNƒVïÏ`^½C#D/´èå=L©ª¡S‰ôæ5ä-U¼¾@o”Þb^‡¬Á¨äCoò.ÞB¶z5Ö¸§c§÷{þvåynf\jºOW§2z„p„sšéÆB‹ÜÉ”Y} ¶Ä=ZãfX£&r"F7ÞlÞâ5Å3 ®ð`-’ý=õ«A[wƒ^îWôk fè§ÏߣÆu ˜Ákd…ÿjqœ` ô|ì>á¿vüj‘Úb $µ‹-v¾Gr?æFÏ®qR,|¦p`ñ»„[×@)z!·H\b…qd¡ÅcG+vÑãK ʬPKì6°ëÕ‹5ZºÐ ¹+oÐú5R¥Íkk)ÿuw/äâ­F»v S€]-v<ÁõHÃq<´&XñJدGƒý® °_ñ3œýòkùI¦ê&WÉ-­‰ï6øN‰cÚ‡ ³|A*­<‚æÓÒdz{Ûê¦ý¢Ø¦Z«Nè²@+?–:­-p$¼¸§œ˜6 ^{Â+! ê`úFôIAH›±ó[Ù.þ˵lΕÿµü×Q³µ¨f ü—§‡Ýîß™ÿ²[/Q»j¬´«âÔàìVWl›žHyf²g”¬ô°wl0GÂÿ³¤Œ¨Í"ݬŸ¨ˆò©éª!ép#ýÏG Á±š§†‚iDZð{l!.r¹‡¢Š´ø^ß-^7c(Q}Wd¡j‚ TßUW¬1xÌ­i}c‹l÷3k0‘å¡v[ØÀ%“q1ZÁ)Bƒ2îN„ä:]ï1ÖùÛNZÒ²’¯­Æ‚/~ é6oôÔ Ö¡7¯vo1â‡ð1õª>+•Ь1Ó@'ÎÐbÕ÷øÍkÞcºÓ{¿u7ÊûVcÆ>#ïzEfÒScQÓIÛ)¶È@ ;5¢ãt©¼á¼‘M¼FMw‹Šà¼Ð¢Îk¶3£ÔÝ©ñm‘Sb Ñs¬Hjl½E¿&Hy¯8Â{í{¬f¢î„5¦ñ‹FkòÏØb!ÚÒk¬F•¬Ñ“Ü›·Øvõ²Ænä9Œ^ï×gëÕÂÐ(ëµ#=߯±Î+Œ8¯éùX#D;ö ¥Þä êÔß(XC¯ø†ªö¬Ø¢ÎkÕ¢ÿÚÄ"oÑú5[Š7¿ª'jô¼q­N{d…-Øw¯ú¾æ·Œ|Ç(SP9¯k xF/ŠŒ§Å&¿Çóže½î 'ãåéYÆäþ•˜ÿÚ¡5¼\0R€7±«ª.zð ¯&2ë@kÔ6¦%̬–F$ZÈŽÚr'í„ܧYwˆòjUO&Aík lQ#¨lÓ·½é=+ª¯Áá´rFܬAfú·æZnæ“)긢º±éº2iP3íO·‡ߥ#.­¤—fRBš.m’K›®{˜äÒ¶saM•^}ò-{h?f··f*½h¥LàãdÜ"Ý™.ö´I¬1“èÐËÔdÞb›Í54ÂyZ„ö[ˆ>›5Ĺ2¶xI«ûn!‰…O åÒöŒt ÕU'†»Ýþž<¿ŒÞ”û½…¥X#·û ÌÈ[,žW¬Q2ïa£onoQ™(«±ßÃà “öìUí<á¬ÆŠÏTOéÇ;Z{Ô0Û éžx"z ‚?Ÿƒâ)鑨ùñ»ðÔ Dlä¦ÎÌLS.°Æï3ÒpüŽ-V¥’ÄjL2N¤wâAî-6Õ‰VaR:»Õˆ/iºj¬÷HæBe„7ÈýZsªÐ'aÕÊõݪí0”¹Ùâ8’S»´L[Ñý1PʩŽ\³©œÚ5PÊ©…U§œÚE¸®É©Å•­œZüŽiü†·Xù=Åg®FæÜhãÔ¼…sj¬±ÛµDTKv­[eÕB¯”U›‘žTÃx —ÃXCxµéù~͸*ÉÂg¨’,¾¢ ê¨O *ÉXÁ•dF›’̸’Œ5ÄJû(¼Ú5R¦¦PcÆg+¥·p+¥Õh×?VÊÓbÇ=^-Ž”ðjåj1Úu¶+¥Ñ+Žõe¥d™ïÁf¥ð«ÚöÑÄz¢´è¸”©¬l’¦oú‰Lâj†”¥¢™Ã ¶5ºðYE¸¡4D ¦žª€S¥Wï°ZµZBrœVÀÁwEfZ¼yôgšøº·@ßJ¯õà¥æƒ—ª_x©úPz­;E?ëKv*ƒ2féu6);eôêÆN™Mq ²S´J$”ÆGÙKÆ~C<—vC€Ž¤VH3 ó4nzÌÔºj¼Ž½ë ¢½Zˆ0 ¬kÈŠU¹Êh‰W 1ÄâÑÓ-Ýýj!Žý§DmŒ7]#M~ê®1q‡Måph‘‘—íÔ ‰ÓȾ[Ð{ÆjíÐ<ßO‹2!+[Š|u‡.\šÞ¢Bi}j,œRF·{I~ªÇ^I@P|Göuhñâ§V|&±¾œ&[h1p®yªJŒf–ŠÐ`Ö{:vèÅ û´-;±æ=Øû®Nˆ”ó7ô$$…™W2Ì¡†‚á:™É•œyPζû=¶'Àoh 0…¡Bxê¡&oP×5îÂKÍiDÝ…ngV£—k˜3!B büxØÉCÓYî´˜ L£Õ`B‘CÏÇÞÓŒq¤Vƒ‰ÚéW=y©8¹r¿­éõ~à¥B á¥f4ùÒÓBT a4•—Z‘¦çÚiAô~¯Qjœ1h¾îwähóµ€sš–¹Ó¢Îk?«æ+ö²!`h!« ¾ƒ2NSÿZôk-ƒ›Šïì×ö5n*̱rSq´‰ûZŒO.h¾â;Çz¬Dá¦ÂVnª]t‰ûE®úb3¤ 8¯í:QS©ØB–¶eˆI(ùa2\°Ô·8BÙ+ÅY‹Dª©ÞF\6ø)á.’ºù@ ¥Ì“f¾#;5ÕÔ¹Þ+õPJ"W‚Ó·bªÞÜ”‚‹Dnj}á¦Ö¥™B×ÅM!"ìß–›’‰6nª+7Å:q4!ö‹›R0ý¨(ècŸ`ì•ý¨è‡(7XR*ø§éA-ÐðÈ‚Ÿ˜Õx}R‹´ÀyÏØBa¼û©!ÙÉC£Š:-ºæµ85D†´Êc UFa¯0Ñr~hF¯„ƒç’ÕXP6M¹#´È”½FçYh4½]C DOzBŽÓý=_ Êä¡Ï 5½·ø€ZŸŸQù«±x‘nά§Ekï±×mÞ}ì9>ð'¢Ÿsìõ‹›ªql‡Ý§Þâu¯Ø‰AݟѦÍ8-æ£ÅœñC•šWƒe—¶U˜<žIï_I†jÄÏØëz…¡¯œüœc cNHgcN¼Eײ#hÄ¡K…šæ´(ÔªYš®¦ê*aªâ` SµâZk†LU¬Ð˵Ȅ§ª÷‡KoØš£à¢ç½n-EW˜4€:=É­z‹•ï«ÝOX‹´·Ø™ŒkìvÔ^q™KZ(K5"}-}c©b ¦“×Ê¿8*Ö(õAJ§…qT¬!I/"i •7p†ÊNÓup†Ê[8[m5&CFw„L‡ÎPY †ò8=â:ަD«1®c#0TÞÂL‰^c‰6zÅ1†*T˜ðUtò:Žå®¯T£¦æèµbT÷44ÐXÙ+…U؃Þçu3wiBH¥á ¥†eÀ¾v©Åè'\â1iéÄ¿˜"÷îN‘7êq5=RõTµRÙ¥B·ýé‹¡*†*?ªù…¡š†ª<*°ÿ;1Tt©7e¾”©›2zrSý6õ­Â$õùJWú»ƒs€® <\ÒÛK¹'5W=©ÿ ÷ª¾b Áß ´ØXêŒ-„Áß#Ô´÷±… ¹ö«… ëõPCÔ'‘ȈØBµQée1t…}P©š6¥AoØyì% &ùõ 2³jvüÆféh¥QëH!Sê@$ý®€ª©•Ô¥£¤‚3UÕeµh­D]²³hKƒÐQ™]q`˜xC¡Ç²bUMNåsQ‹‚¦SmêP‹’) oªbΜ&cd®ì…¶äa­UöºŸ»štØ×»ùƒJ¾… ©D4Ô ´”hhõ06'Xª9)-Ès»=œ’6®LuŽ¥‰Y ù‚”$¯K(Ì\ùÒ†ï¤>PŠ3º¾s˜ÚXÌâºö2LC¶¸’z6*|”NnOÔë o¹u°7áÔqNëôðš@ЂÅ3tÜ›ö á‹tí¬Í©VþOgR%„:0ˆ°Å½æ±™gù´ q± °Îʃª¥ άe%vëjWbLï½–þéZï‰ Ûð’RàJ]„e?á6_)wéÖ§\Ü ß)Ç4:Á–‘* OG·.„—&ðJò8×r‚‘:B¡>Hårô°Ö29Ñöâ ¬”@û¬!æR†ÕlôàV<&Ê››ðS¹+¡ÈX"ÛR‰ú [½ TiÐ2 0²\T‚¬ˆÂ”‰ËGÅrYNô°sÊ@X[ö¨“±&SÇ'î°·X³UÝRuJ¡yîH5 §uàÝœ&h“jbªãœ&Ä\h@`«Ñéëëôˆ¯4©æjÁ_§ Z´I9ˆ52%š"uhA¸=«!ÚñÃe÷Þ-j¦¸ÆeCèvzPžð¥ÆÁƒT¿ÜvÀi‘Û=V™~UF'è Ù^O|õJ¤š02&Õ\5"!°°W—ÔF?c„Üh ÏËW‹Yyw³†ÅB;=(){‹Q`ǰ’*¶pù«AG®L¯@ß¡ yZ´t­!‘i⊙&ÝïG˜Ø¢tŠjFÓ;ü´ÈëªL¬x§Óû=rUÅ©^‹Rdšv”˜>æUƒxIF ØâÕ©d:y¯‘㢃ÛýŽÉpJ¯‘È9“¶ÎÓbæÉ*˜“»Ó㱨DªÉñ‘mßl#.!J59Ö¨ûšq1žÍû3j…©Ák¤k‡KDÈã…Ö.¯ #³ Þ wŠ{V£^G›bß-dÇN$r¥N—¸°)Õ„5!>¦s’ÞtV_,²e„ÿå88Ää›ÖÕ@âz¬!ùÏ"-òÄÝBä‡PC{b‹)ø~W‹)+&Öxõúj!bôÝ¢^ý)&¥Hg“μEºû- øY-œìÕbˆò¾…bުݮƒJÓÙ¡DÕ©*ÕL“j¾#ðõ›éZòý¯GÃ×o¦„y|‡ðõq43ÝÒŒNÓ`¶HÍ3Ô€Ž¤²õ×t[g<ït}–röWƒu÷IûðygÂÙbVg.µÆØï+¶ãýúláë{ìS_δmfºW¡0ö=L_6¯§›s¯lÑÒݩ׆ñµ¸G$[”Mók”îlhº‹yÆÅ¯Œ}üŒœœ“dQ“Åq …«/×ó…«ã$.Oq· W_®‘®¾ÏX#ůT®¾^#+\ý¼j¤¸¬sw}„põ9|µfȑٓ”qAXÒêCÇì‰OÛÕâÅÖ_ßUGÜdëKŽ5RÜÂÕ§û3ʽÎn:~¸X¢òÕÂ2vyr-Jñ/\÷;ÒtÙ5Ú=¡©8›¿‘™né  ™Ùî5+ƉÑÃÿ)jb˜h-®1MÔ°ÓÔ41"-¡xw 9‘B)›$Ò¯j\-^çC.±†œ¬‘5ôÝBx’X#?ž ð´W‹!€¡ÆXfì -nw‹y˜z­!àõ¢ãÿ`ê!UÔ†tœ_˜úþ`êÿó|œªw;ÏPդίZáÚ¯\[3O–»äIÿnÒ’€)£_`ðÔ'?Xrý8 *wa®ƒ\yø‚’A?wØ¥ð×¢“dF,K Âyb,0tØ Z;ÀɬgÔ«_ø£ã„LÄà•éלW[¼0…L0V l`ðS1€ÎÝjÈcÈ ƒ5Mò‘‡…ìÑ5ÇA#¤}5 uÕYYî¯/ÌtKô=Ìï¼ð{4Ó©g–¨ê·e·@iœL#Î`2íkeÒ€îëûæ„äÖB›³É lyHo@¾ºš?Þ4¹¨.‡MÐWt\ÑÒ%ùb Ñ‘1^Ã>biÆ2´ü[íÕ¯ý@>œ¬?€hæÒyìÔÁïãF7K x¡kwÎ}ÑÚÒ‚%¬øë-8tä3Ò>M.¥.Ç¢Ò*r ÍÕš)_ºp Ö¦îLGB© Ò¡H½\ïÄÚi[d¢Âh¾e®-dÁë€L=32·aÌúoͨD„¸¨p±<–IF$©Vì'ÓÇm„CA"2…x¦ßðá—*8Ñ݉ƒÚvIVÿ¨O9œ¶…ÈÉìooIãÿé÷[êç§Ê¼0æüTOžêEFqq"ÇæüTïT4¡…ɬáÎOõNwsZtó<²f'¨'¥N½ZXÒC«Ñ¨X6’ø¡Ó­†eÚtÚÄ oáâk¸8a´™ ¼Ea6 ¯‘È TÏoäO(.NÄ0¦:Í3øÅʼnøá‡NZ剫EÞæd5Ò™° y¢]ß‘×õwºJ¥‰khó¬W—Dš€fÓèq†¾¸8¦KĉŸÐ™êá´èùî…ÁÉ:M°ßÓ¢1œÕ¨‹,”G¼Ác~Eš¸Æ­0|á´Þ8T2›±S®5öéÞL™'ŠÑ‰!X§…H­ÅùÚ*dqZ,3 Ytm‘(îu+Eß±q2¼~O ƒ.±–SÖéqŽ€bEür‘(Jt÷xD¶íhìUÝׄŠD‘ïwTóÃd²©ú0zœ…‰ż—¬Æc¬ò|UŠh¿Ãr¥m!K§E¢G‹× Ìid>¶R¢8ÿ‹·SXè"PÄ¥©³sø[`-P®×±¦ðe9<_ƒâ"]Œu·þHqØ­ ª6"-§Z<Ô*pÕ~<Ò’â©ÆwL1ÆÉ|@Q¼^-ŽÎŸ5dnc ñ¯ê×;"óÿàý¬?8‚ÑQ)Mô”*JdØ Uç›’ ?èl¸ù ^=¦ëÎ ²…ò N÷¶Y¹öû6ÞC]ö‡ò¢ð¢5åT-£*6•‘IjÅý ¯jͽLO&ù =lóƒù7ä›ázøì˜9‡ÉiÀPŠõæå¹Í|Ðàa!´šZBtåá]öפ~šŽ\‹ºÙvBÚ¡‰þ@ ³Â}ftˆ7 tQÙƒŒ8}Çw­Aö›¡¥Ó·¬˜ ĦL¹3I•Üi^LFŽ7óŠH ®\Õðd´ú@™‘Þ9Þd»bN:t{Bú÷$þßèí†{ñìRaé '«B¹¦Ów~/„ˆ*¿@ÖÒj‹‘^ÉÜTÚfüZUCe店Hâl³ââ§M9 ì+\™Âæ-f]Ö°a$±‰î( €p3¥Éöû¿›`÷œL9–/˜ "éž03m¾€²‰:'bi£Åà7Ð)JAØh¹Rô„Ñ!.}¡‘A^A/©½Ž°žº76<úÉGb?Lß?/tód7Uf|´ÄBL ¯ÏŒ÷æQäÑSü?ß|º6¤qéVÝ™tþo<:Icѽºqèø¿ŸÞäÈŸ[ugÏù¿qç$9·êΛãcÍI™¢ßk›žÿ»šŸd{TwçüïLIãÉ­z©d3ø?ätRÎ[mgÇùº†Ñ™q«î¼8ÿ7V\ÉɳúaÄù¿:€\ÇQ6.œ¦8äʃÇQÉ–º„ÿg@ð8ÿ¼üÿ¾Ü(•É}_=éÄ]æÿnË!ÙÂê1Îûü-ªP»ž[5ÛG­X ÉZÏ}þÎq6$ÛÉnÇw[´He¶Cmaµë gÚ@®EÆÏª (T ÿÓË‘¤xSÅM¤LöùÛÂ)áÕd°Ã”h èHc–­ºàðÛáåÊ[ϸ+„µn¡ë•hSFv×*dã«gøQ|‡ïq†„§îñïD :È<Ã0)CÝÞãß_2mçѲ1Ó}†ÿ™ ÙȾ i3÷YMšW³Ê\ˬòëÕç8jÁAŠÃ^X\ÂH÷YÏÿÕ8XÙÜýY]|kÖùŠcz ÅÌtU—=þ›O …•»ªKTø_Ä€CŠWÿU}ˆÖ)ü/ŒX eŒã0ÊùqÎha­{ºÈ4Fì̯´ì;ГqÛG˾¶ÓÊ'%‚¥5Tªïxg˜€cÁœ”#Y6ÝÓ±2îëûN&÷ 4‘ÍP-úÍôê]1‡±´u¾E\,~LE1‡æðVèÕ@ü+Õß2Ô¢ (ÎØ‹þ@øNÉUhIý}dÄìªúkv³õ˜B°¨'œqËK‚#ÑæHà-†olT0G£‹+­Aö›@k¸#Ñ#¾Ò8‹kœs ´9x‹pùh w$0ºø­k-’ß~Z£N¿Í@·÷y5¨ÙÙ%­ 7TìTα°E©~” Ó#ÏeÀWrºGÖEM¯žë€Ùï=¡…×W e6j¬‘üÊPzÿ5¶PM@¬‘œ!Qz¶-f½ß1ö5›Êw\ Æ=½ÊxÄNõþ˜ne=â+ÚŒÓû¢«ßlÑ,â”5ê9ôA¿ Ù¢ÜËTXë æ=ê òŒ›ëE_P6äÞJˆ´X#]ÛSY‘tí%eFr¬‘ùTZ4;w‹Õ\(@t·“é*aIÂt%÷1zøåËãÑí¾ïWö瓌I ‹J€möŠtw^‚-?4ö¢îk© w²®ÁödÄï„…‘ô½ö¥ºp…æyB:OgÙ"ÚÆkäká ŸropaTâq+œJ<·„U)±W«Ì3¡Â«Dª]Uů%ü+ðO-"}\¬Ôk t¤Å[çj!s9ÔKý¢‡Ez Á‰5êUC˜–üx‡Ç+¢†œ%Òë¢á0k¬!gR¿èrÍÂÌkRÙ´XÇÕ«ÿö…é±­Æn.Xj$\ð™„LÈîø¡¡dÎð€Srz2¯G0+¢g£Öì5ƒTÄQ­NcÁœŸ©y¡uŸP a}”Ãø½à4:˜öWC§šžqäS:tp 81+°¸Ю:8už‹À/¢sR'¸âI•ôjâûª¨BÕ¥úe«AÌŒêV©‰«Qך\)U²ãé2×ðÏâ'Æ„ Ú®aROg'èU§ÊGª+}XMŸóšGð‡ê<@­Ž8äJ¹¯6ƒH•[\ 2̰/÷µÞ°#’æ “«lØ éWºÙ…h1å¯$öÌáÊÅVTSªëø Û* wà2(d§ŠO½FÄQ/ø¿!&°¥ªˆíT¯!¬2›*w.<¡_RÜ…êšÅõ¦Àœ±ž a÷”׊±(J`àoàâ`Ýó1èK馪õb(öê,® ˜61Ó­²R ¾˜ß¬ˆaâwÌAjæ½@ojeñ1âT†Oz^«bŒ#nŽÐ«b[mÖØt³ÁŒtó’YýÀ^mÐ7¶…#c:SdC¼™¸ 2µ—±à?4c»@}2‚ÑuÁ å^2êôŇW‹ðº[{Å4*Dpw)MÍ1µÏÅ`U3]©Ë^ Î…ýNC}È «¹JYCÐì°â Ú–U߯Sa!r\iª•Ã,È aœá½”®­Zà>€ä4©Þîœí£d$.˜]ªHD«pþô'¤GÓfëÒßõIüXA–bDï™=׆ò¹!K´Üƒñ…îG‰ÛaºáBý£ L…ȼ¬>&®CÞU÷$pÃÄ4Ì ]ðW‡ þà½$£2m 9JæE6élúsBuµÁœ[q¸wxXw:TRyó©´ácxò‚ê\‘Yõkq«À°U±:£Â^/6~œlmèYp;N+5<Ínsڑع †‚•UƱ¨Rm8UÁ¤-ª¡£'„ ›bZ®þÍ•J:Ý+'YuÅ2M©­v-eµ+~ÚÖë3&eŸ&FˆŒâÎ~Û.wCÉâlŒs*ÆÁ·yð:[§R›žmÍüm¿çFéñvÍ·›IeCý]ëô 6Ê4nSuÅåâiÙáÈfa)D3‰ A´“€>†¶–Ô8¦ÐÇVb-ޱDkk èßù°— Æ1˜€>¶&­ql& ÑÄ«‰ÖfÐÍåd¶Z ­QŽÈz¸ÖŸ-ÜÉj­†Òy¾ß¯ÈñùA©¡tPj°zPj ÆQj•h•¨q”J¥[¥j$•žÏÉ‹J ­!BÉEû«U©_Ñ×ûŠdwY€ zvO­Ñæ{lß®.›J# ­ª4"YârƒF#ü]úÝÚœeOõ<ãò‚>cD:¹z‹-Ò¸¿9] Tô±º(3ÊŠg×â+½æcT™‘ct·˜ã¨?§)3âjJÁz¸Š™-F‰ë ÚŒHöǰª2#vª­kù¥ÖÝÔÁ­Äó©çâ@Ô;IeFc/ÊŒ¸XD›Q¯mªÚŒXáàï(´Ê‚ÐuÕÈ÷ä¥{*€Þþ®®²ïÓLñšœEF^¬ÔÓ{mQ=œ×o T´\$ñðÓÀækT‹F -fÂZü}?}—¥Õ"=žï˜í¨X´†HR‘çÐë«5¿[¨!.K9ÒË\˜¬Å˜W‰(/FXq[ñ<ûÕâu-¤XCÒgÜt»î;UfX¯Ä[#†1—‡.¦ëhÓ´Æ:WSW¼Ès)ë[Jlo&ÖàX&E. ×¼Y^Vd½e ¬-/Ì*ÂKû~b½S4-ü{ãág´ÉÓÀ®Ü 2 ‹ºgc˜æe¾(GU¦@ëŒbž`‹EÿvD•E¯£ÌqÚ鄿§Ë aŠ*#ömOž°0«%%“A"§6¢fJbøFô€ûÕ# ¼Š[‰ŠßpcQcÎoó+ÌëV-Ô—l|¯–é`–ÞkR ~F®XDôïôÄ_PÁ¨~d½f*àUFP0Ígš .“:Ê Nµ nDÃÈs[&’ _[©±(jLm‡¨S~8WS(d–†³ ®9‹L”àù„ERm v-¡7Ý&<ßÇ4O }‹»±4ZEgaƒD¨ª›L’C+*G `”hº ÖE6ðõ*|F¶šð±-,âµ&—jêÇøüZ?“-ˆGÖ¨ æI7‰­œ]åÓ>ŠÊ€+—ŽÄä°YÀÉac<º,¨8²˜ù¥i1)¦ÁÎÄI/IO†´š—@ÂÔ4“ ßÛ@ªÖ»œÓ€ß O“˜¥Ê9j_æH7õ(Ô¯1xe&è4‘þc½»<Ø(¼š˜Ì‚k ñ: é8ö4Ñ‹>ª yÓÓE¶7ÌÕŽ+É%† ³²-]4OŽ®J€æܨ!¢ó¡ ÊݤøF—c‹- ~kɈÏLTZ…YX¦Piº»bÚbœ7W …ïI}Háñ;,lÈõð–Ê/úoœÞ"jVÈ£3£ o0YË„cD2éî€ß!&‡x›Ë3p¨‹#÷FŸ2~‹‚…-ê¤Û$áÚ9[Ë«b)o? *~R`<©Ó^ÅÕæª[“kƧÇÔæ³ƒ`¨ÝšbLb›S#/²žAXkp¶²ME¶Ù:†Œmn6=ú%½RUƒ÷^Tâ¾0ï΂])~¦˜MÕÒ;T#rYV\–L­£œÑ›g«*$軀 EˆL#ÚéwÈ÷ðt+TéÑ ¼ÎÑ ëÆÞßÔ¾ÔÁË™ÜZ¦a4T™ºd€ÿ6p?òþ(¼Ð5•Ý´;§bý, ŠMÝëbô\¥z«â2ìÕö€ÏBµ“¹Œ–…Õ5Ëe´,޹o€í§t§úª±…)¼ˆ~Þr¹À=Èžéœ$°<’ Vçˆ\Òh@ÜGÁäé92—¹°ÑÁãàÒnÈ>$ªcÕíB).s &Q<6ýo«A~Ohß…I £„Ûm”€¿¡ t/t°t~/óŽi‰Lq Û™˜˜ÔYªåÒV2œ~Û;¢Î †¦ò if’XÕvhå,6;aÉGòoÆœ. Eh —IŽ;ÜûÑY¸•±äÔ2£NAɘӊݷAÎ3ó 3xZªÕJQ"±;'&¾ ›y¸^3q0{ÙÌбª¯§+.;ØÝEO«Îí»˜ ¸u@ùïbGaãGlÄ+×MíõÀQÚ­ÓD¥„êg=Š'´Z©ÞPÚ_¡Ñ©@š×#¤q9ª= ¬:¸Ëßõ¦|¦½j3Ì´“cÛ¼rz±µ²95jüYHÚ¡SÅX‰É'?u]-lÑmrIûdo[™’†jK>9Ÿ¼íúÀ„7ÒÓŽßšs%.c&&Ûì†î8Õ=—ŒHªz>#ý„BŽêy\);l^–Ù²ht„EÈ­œ°DòSYÁòrìb¸ rdH+{µi t•¬ ›ÑL‰e`å7øõêß@ëÀìaòH#XÑ&‡/CÂkC…ˆÑ™Q1uteÆ)t,«UxŸ^ÑühŒÌÒÎOçî®Ê™ÍdÒdÃZ  6ùÊF:Ì8¥¤FPH*²8fW©r&Ó—hª‘ѱÛ7SoK4Ĥ‚  Qåÿ} ^Ü.ÄÖà¸OÃ"Ë‘ñ•?oâya‘}\ˆç‹Œ5‚ ñ4,²|·8.ÄÓ°È⎠ñ»ç•EkA˜ŒX*ö6êéÕPD Ê0 o.º٨㗩3¹:±B¦ìŽEJÕÇäÿòÕø€ãJeWšÅ(D ña2_Nq£aí¢ÅÊ£9¸ïè­=Í#¡ƒHr¡’xj]¾Z_=)g#Ò •ûSÝ¡¸¶x˜)¢of1È¡Sq½ºkº 5†T^ti2Âd§»üh¡B§!x­w è4,h;5sk,¿ Dìék§Ý¤eñu3ñôË€ž½øã>ЏÐõSÆT ƒ È:cB–A‡K¸ð-|]TIœ„9†”¾lJ³ÅŠ5‚æö½¹”MgЋÈñ¦š¼É\aƒ)ÖÄX3ØãflÍâ7$†áAÏʪøÕŽlªi4½åf8ÈKúþªt³’·$/ÐËÉ¿Aö³„‚ñ£ôNÔ¸e1&à1„™Rø3uþP¹RY²‘m&©¾)«CƒfÌœ¤§9/öÄ’×°|èSý­k?º¥™M;ÞíÜEÅc%ùíúÒ9nzܰòzˆ§}>Ç WæUÐùÝa¤æc¤Ò—‘JçHeÀk¿FjÙH ŽTë6Rƒ#•,_#ªðµ)OϧÒx,ùàžš†›hFfÐé„ë½”à°&[†,c h }¹™±Z‹Ñ,4þ¬æèiЉƒÓtN)ZǾ¢]—ÚCa³’…:MôB­´áxx6,2²§Œ±+FñÞœV]Y$hÄUëŸAãš Q¤Àø{ì©Ï?qé´ÇÒ™¥³méX¢Ú–®¥s-¦¢‰¤¸©Ô¼vwüÆRÑÿÆùïS¿ªØÑѱ—埜ϯ*_¾ªüî«ÖýUxGf€õV[ÛýUâWÎ6 _…ïNê©w÷üŽ~oŸ8ˆ6{”xÚ8W¤Îb çJzä£ÚùUÞ¡I…EŸÃ·ô©=,ÝF#vñk—}üx®‰à—«}°VO/é‚Dòì™t°§b3ТUì«ÒÛ¡¬Ð‚aÙȦ³5õ+¼¸ ûjöˆ¢/Ù60™@H§“?¯Sglj^A,-  ù6y,z§š‰çrKKpðŒæ\ p‰cÒj7Í)h"6Knf­1!&+ÌÁ3Áá Ç¿uYòSºª Ó_#Þ7Ù}M¹^_4D¥“¢ù¼àCµÉrØ¡ .áì¡à-¯éµëû?ëíšl_£ mÖº:rõ쥢Yßå ÝèÆG´j7ý>%äbòò6à§?óÙõ'wŸÆ.¶ø|-yÝõZBÀ¹×ŠìšV9 GÝp޼¾¼—c­ËÛ=­Ë8½c/n6î~˜öðz¡ô°%âW“$HFTè9A³U]+ùЗäuÚlÍë3ý™Ú‰±Â7FÖ >M…ªë T}–(¦Ÿšºœ bzwÐ wEÑÓÜJ>ô5)³dâ&nöZ ØÅ^Ü×z|&9¾“Ü ¶ÈÒä„JOYÝ %ó¦™? Hõ¦Rƒ‘JÀ´¢ hb ¹íÆ^á³lwtÖOÃ,7Múf%(Òé‰ü©©ƒ¬ÒtŸ óà…†1C ní6–·Ùꦱü™÷WÙDóF~aÑä±Cà ^r…Âu!Õž`².:¶cc%Ë“­¾ ZÐ8—¸˜‘1 Q7Úö“Ž[{>˜Û—+~ÞWüÚ+~~¹âç㊟ß7ðÝN,U]ñ–™4Ðfî;†eMB§Ã®ŽC ÔmD“žÆ’ÈÈ{¼œèôÅuՃѴÚñÊ2cõB(„”Àc=qìÎ6–ïu_ôë1ôíËÐ÷ÇзÇз/C¿CŸ¯¡?NQß1%N†çåfÑ*±5g&xZetrºË­ÚxRu;fª-¶²=His-"c ¢¹„Îç¾YÔ†~±™ö%®ì'–;tÜï¢ç\ø^mÕæ\c,ú]‰Hg¾-$}¾<Ï´ÄrÎTÜ:…‹_/™æîqaËÙaôþ2W|ãÙ}v¶+߆~rSk„®O²Ê'ïg½jóË´c‰OGÔÐ3¿Xxvã¹ÒÿÌ¡ã`5_ &CuÁ­ÒÇo¬w‚ºƒqªÜSø kÜÛcÜë=îõ˸ÏǸ?9UúÖ~Ãð×uÿ°—`…ÝNnãþˆw&£Ëtü9XeËÃÉ*¶—/võ¦Í¥pxØÝR[ä^ !o˜/I?]E“üìÔô\b¶öû—99è÷ô/s°sP¾í×ÇÚ·`Ò~Ô(ýÑ~<šŸT[µÊð4œD³¼¹ï Þ’¼5›M‡-ƒãx僢dædæARhU†ÍÆŒ"wh¿+ý«ÇÆ ¶á.Û@ì¼6Å_ã02þÂBöà ֵFÇ ÷ò@d 'D/ºáeL,`ÙÝœ‰6Ž# óØ€ /ÂÃ'/‡Äážœ°ä× à™ sï•ÙŒË×±_¦Ýû¸Üy€R%dcýLzº¼XÈJ Iu í96?;ÎxÉÿó߃|ñS_ï©·©¶©/åšú pû›»[Ê®°SKwI9È—zfP3€D¤G› ÐÊÐåí‚å ÉîHUåÊ8…± L5 9zû¿àI˜÷=ú…ôTÍäÀã›ÎK¨X6›‰ß§MÖ cغºg2ÇZ·v6pZéeº„PN)i¼§tvÂØ›‡Òåœ\3ƒûò¯3øíü<ãàWõõÎHšk<@Çð+2ÀDÊ^Õ‰ˆcßí¸Ò;ê5Ö›C­Ë|0x˜§BÓ÷‘ŸRÇÕ$fŽ~Í}Éÿáã~àľcü9üô;Kë~Ó»;µÂù‹)ÞÐÕôP XÍê©JrÈmª³Î Âܱ}v˜»ù»o8ŸK‰¹Ùê~" Ø « ƒŸÓ¶±µŸÆ5øùŒ‘ŸÜk»rúŸM€”LiÃp §]ÝÓ†¾qqwf‚Г*WfîB¾ä¤È½á˜‘&[FÔ „nX‘xÓ{N×ùþ¥ÇÞþ›:1o} ¾)¡Nß«à›6áŠ:?2Yt–ÆZèHª®—Y8r&ú ŒÐ4ml@_Êình+#‰ â°Àƒ9]òeìÿT¾‡òÿåI˜ÇX‡IXåšÖ&z}÷UÚ3„=ì‡gUÀŸ¡–“$qÐu„‰\± 6`vp%ºjÁDçÌÔèî³,Äê«Dm¹¯ig°reP²DÕÅÅÁ dµÇ¤ýY†ØoÙ1ˆá“‚F¿³¬êòõØ™<Štóf¶Ä€P4~9âõ&Øv÷êe›™|`¦(§ [¬^=9™auI@JpPd ûg›É-gð'÷ÐzZÁÿÜó]fÍ{Ìd¤(j‹ZwsO7i˰» §[è.:Õ¦ a…k¤ë¦5-¨vÅÒò ©ÕX ¤Þc‰ qË Ù#$’Ô9µ=¶¨"« ±^¼Ì-Zwºb÷ËŽù3Y,¦ÀùŽI{l«`“–y÷PK¨i9[ÉùBƒ\ì¶±,LÀMÔñv®–4yJUü-4'Å(LP&9AWÒôÞš’IU›ï&“^ètajºæ hpi‡Þ?ʤþ-3g¦t›¹f3GçN% “_#,Œ(€%ÐIÊ<ܨÉßÀwÕ½ƒaT}g¢Ø¿é‘Ð{7¯185ÓZtÐ$¹’öàÄ“g”‰oØl‰f›F~®yL±qx_²¹þ©›íÛNH»•lÊLG6è ±ì„t”‰I³øçHn $ÉR‘²8ÁDØ/Ÿê·v‡À™ša#l ÁåT·À*#1¦¾Ðê¿Ý’ •²W—Š37˜]c­Ú´ž…æ´}פ »Ö&Í40ƒ–øA Ír©Ry¦‰ŠªÐ’€gYçkf£¦—Hb¦7Û*ÅÞ«/dÈc79< *ޏI_¦j30mº1ãÿ0í—øNÛ-eò§Í)flºm?)uRÕP¹•6(|@›*œSó­ÃAW-å¸XÚÄFÙÔ%§j2ï`éÓD¯vÇvÌ…|Å š§+(ÁÂfì9º4Z¨=(=äK\”£]Ý@=g2±‚ K6Å3²&rUÔ ÖD–†‚ŒL´K /Å©Ò`äcàÌ^¼Z³}7¾¢¹à1hýî„ö0Ãßvü\Oð\~ý›¼Ö¦3E¶ü’Ið q[á²#«Ïô­qÇKñ¸,r™¦o»šÍlëÔ\„l&3.“ú3=v2}«x'ê# ,S"Pˬg!üX6RŽ¥M\‹´»B'_F²Iw¯³7/r" oXU$Z„N›Zÿ¤"N"ú¡ØÑ5h‚¶î6·†ðkîÈâ )ǹ-¼—=ìàk#{¯éR¥4e:ÏJÉâKõtJ?i²½wróÅaWÍ›'ð#^u¶î9Ùà/VÃÊjÐDŒ@lc°ñq©âÈ™„½rrý"'[N^ë!(§ <‚òàJß§ŸªTèªI¢o*à¸.Fvé‹þ93aw׃µ­¾ eО´a_0ç¥ÌYÃL¯åŽ…´+ù¹Ü°ð³j‘&ì=zfð*i9®#µîÿfÕ×Ñ—E„kAܦÛPô•΋vZoUÌ j@âÓ[â¾ Oøº[»º{q‚º×øéÑ‰Ö Ãaç@ZÜfÛ‡C¿P§G›ŒÑ¯z®šg/®øˆ…´RdIv ,ÁjO[xÿ8ï³W§_E¿èác û}ùÿס˜¾‚ë d_IÙ7Øe<1£†'iùð£f±³Ø#‰éúÇ—wÀà?çÝ¿ƒ¼0iï& XX"˜¡: *¸{öw5ÀåD¼W¶ª30”íyÀ_n^;˜ì´º{³çušÛ Wo45Ò8|ÃþÏ:F‰ÐfÃttë‰gôAZÀ\ýx‚ ž§a à ¡‹ë-ÅÙ›Ýpö€»W6éd0¯ì^®Ó6oÙãÍ©tow/ì>è‚çiM{xÞh²î×È[;颀vkÐn½·om¾9-´$ÉvN-‘cnhÁûiŸ?/,`µ‚:¹g0z|­$ŸÂÿ²D‘R—#oƒ®moöH}« ?zq# &…¢³‡}z‰½0·Ž˜€P lE`¾+°ê&-EÔr¬×Îg‰9ÏTZ ñý¸Uº8Oûô{ã†UH½±¹—IgÐÉ7ÐG”¼žª¾€í›™%˜Ánôé‡Í´! Ƨ¡P?l&;†±ëºïrÖ5ÐiòD»á[wqJ¼¥ŒG­ ñîÅ ,x?íóÇã…øšqDšù;Néa»EÕÚ÷;Æ·Á ~a˜ŸZçÇ-û7ç5ºä7Sh&6Ñ…&ŠKÿx¼f¼ÜÖëŸ7Ú³Íç/Ú€Á=%Ùü"Êz›,h»½Ú36Kì£â½&Þ‡~ü¼Eßð´‚>æ¨$ÿ ôy©Éɇ:˜žÌÌkh§lÈÜöfÏdn}{öãç­R¹žöùãùƷ敪é[µ_ϸzXFMmv|Fãå×S¾Ò{¼=ûñóV»]Oûüñ|ãtŽõ²½ m4G”y÷QK€9[ì«u–:êj8ºûíÙ‡FVÝšíiŸ^rõ±?Tú4Í:ÊæšRpÛ¬gè®W¤bžá™JzS†~<´â×Ó><ßøã`¾”OóaÓ zúc꼋=û{1¿ùtôÝÖßî~¸FÅL×Ó><ßøA7±kÜvœÛìFêÐG-ÑPñô­–`=ê3õ½æœæý°}íæªëiŸ?žoüøq ã®ÖÌà.ï_‡<ù„L ãMíze–ó•Ö‹‡=>ÌN黪_«½U´êÝÁ…Ý1Ô‰îÕõ]u'MùIç9Cùuõâ¡j¾öùãùª££p˜v44¨ŠáÚ-(è’ø3W{‚"S8Pó‰J¯ó‘Ö‹/šÕó°Ï×}  =ú3/}EŽCLˆÐÄÒf-T›´ ZíØW/¾èÃÃ><_ø’’ï.µ›üªÙU¸ña07h¢o ¯OTº´·g/~>µŠyí ÌXîhU …;YhßI¤]»­‹`ÌTä3; ÝIÆ™8èãû1Þ¾j¶øß°.îy"U1ÉÇvCôëSJŽW´¶a§[qõŽÒýíêEß÷ }=l˜f¦ô{Kä}Ž®(ЮùqmRkxjÉþŒÍê“*G±¾=»ñóê-4uý[{b{ âS7õÀâB ØFïaÏ,©®ÝßÝøù õªz{}bï÷ úÉÉž.5îýžúÍL`vŸ,ôÍc¿º*º"½ðŠnÐÃtW±ñ?yîì%O–ÿüò¯ ÕÄ7_þÓzöŽ*ê;_“È»3Ùq%…Fñ’”è²&uù#ʳßQ‡…gUû7óõtx¾{ †lCËEF}éÛa¨ó½C×&9dVs|»;•WZ7ãÅ&†€Ñ­&?”Þ{˜'YqZ̶6†y­rî`öªOžÚ‚žÞµU×cÀÑŸGJòç >{0nsRv¨t¿ÉäÜm"óŽ$ŸÈŽãÊÚÔN¹Ï ¯jªç£><_GAA7ÀJôø&ãcY2·žòÊ”ÓZi+ùÀ{R mjãÊK`äï~DEž–ýi6Z¾ž¿U«%?ÊûL&G܃Y;–9ˆFÙJ>P2C8ÔŸGÞõTχQÖ/¤œP) ÖzbYÎ鎉è²Ç^WEÿ´íbF²æ­{Îyw#ª©ð0*Îê2Q£V/¡¨¡k\GÜë™”£ 0åÅ2b`¾h%zøm,g¶‘÷¦ž)ý˜þÖ; gYÎôO0y)aa£„l8î ­^ ´¤=Žã}Ç™h¡oYþÌﺵ¾žØe`Û5puìô4Êzhrd;<ôXˆîׄkëŸóößÝ[ÑÂýh‚K†×–ºìÊ%Ä;¨,<èí4Y‘ã´{ëîgPÂ=;ñåâ ûüñ|!ïžÉ‹K#OëôÜSj—CW„%«­ {ˆ¼ô§K’Ý÷êáÅD_·W|Ö§ØÛìb¢)5û×þn¦ :¯ýíLô(¹:ؤ±ðM­Þô~vÐî²þ0ž²/ìöxU(¬ O¢zîI:ó>`6J®.¶[ƒg^tz …{-?úx½ñƒ÷ ï…mŠ>ÓÁû€YQb>|DŽ^›xd C7æóZ+Q¯óùã~ã¶+)3³Óà¯÷º&¼™E‰a(¹†ñrHÁ3ÛMùF¿×®§}þx¾ñK祤::‰­n8ð'éJ{ Ä ]îÃɃHíÓ§ÛMñÑûb»ŸöùãùÆ\,ƒ×”Žc™@g‡Î®H„ì1ìâ|¿c™÷~)­Ü݋ǵöùãñ:}ºº· ISÿ;ët«|¯—ü×.µbÇù. Z7íÇ«çËîN»\ïråÞÒûmÜ¢O›«‚6•IΛ"¢Z+øøR ¡xÁóÍ8õj<7òÀ¸¹êYG_:5‡p¸2gJAÞÉc,H÷ÅcŸò•ŒÔÓéܶæc1º ú€¯ 2wËo®DF”+iÏ1ÚÞC:ô¤§Eq }ms0‘éÁÔfÞ‚%êr“NQ’Æ…  yÃ$ ò@v;#uÄcõÕ›~zEpKÞ©0³7Щ”–±Ü|z{öãb-õi;8õX‰ñ²(ÉänU: ,GÈÿ©´eׄ,KŽgÚ4÷ì±gšgϳkùxÚççõù™’;pf„.G•ІƔ£§]D@{ö° {ìæØóìÄÅX>žõé%±”’røÊÖ÷»eÿ¾²!¾.ð•,9~=ÖÆüzøHsëyöâb+ûüñ|¡>ž7ÙÊWg+›D“´ÈV²Ä\`ø 1©[ÏÀ3tZ‰9ùèÇÅV6"1¸[•¶²‰7~>l¥Ð–!4)­ÖƒÀW²ä8ö MuÇ<³¸cϳcùxÚçç•óYÐŒ‘µü{Î醠úöܯù6ßž¯gùãz¸ûõ·‡Éðžz šÜ\ÈÏwW'p;`KSZ¡TFÃ:tÉê]œ^òKÐ&ÒòÌH÷”­ðôQŸÆm]Ï¿nŸ>e^N8çgÆ9Pž3$Zr âTTœH÷qÓÅÔþ´·žêÓxŸÍŸ/%µ¡¤óþÚl³xÔwý@?9OÝ´fÆ÷¬õvÑòÌG?.»õãi¼ÏÂy_–Ìë†×Ѫ Á%)J’öHPw¶G‚Ÿæõiiy棗õÿñ´ÏÏ7òÂL¼1;/ 6Ñ({¹›¼Ÿ]Ô’û5;nj>òÑ˃âñ4ÞºyÅçë•YyeòþI¼Jåý4x?­»Zòq—”«x棗ÊãiŸ?žoüÀ-7ygªí¾#”Wî£lwÜæ}Uî>jÉÇ]’kìžùèÇåÌóxÚç絕ÇõD¸J‡£aÍcƒ2Ft$£\JâÁ“÷9'Ÿ9"ÍïüÕ8µ^©ŽC}¸­„—(êdðMa;„T×—hðZ µ‹Gi¡%ñäa›Hçxòॿ^Ž¥ÐkKÞ8½àµ D{¤ø‚JNƒÝ^ÜC-ù¸KæÛEÖ}ÓiþfG—Bã¾°yÉJ”ï("hÈØ®´ã!_‚Ò£ÞcX9 ±¤]cXÏöéþÖ_ŸŒxšöQrc„Ç7…YЂ•ѣΪ¼„@îwì¸}‹&˜~tá×—‹>‹½;ocï h=^šBã+­ñÍ’XiK‰Tží*©ñ”æ3ïNüúzÆÃ¨ /¤^n‘Óê]²6$v‰D‚<{8Ƴ‡ãîPt°µß09x{^Èj§ñ†¬1ÙÅÎgÌõìâ\Ï.ÎGgy{öãòåy<Íô©×ó/~õÁ¾~á^¿th¿=_òMþ÷w<³³Ùkˆ%¦]E„r'p«ˆÊ0+°/  ",NÿAâ ÖQÔwÝ8Ò~Ÿ¨G£Â_°ç{^PÙÑw6`guVz=M}J‰ê“^%¯$„Ä—¬bÒÂk ÝÑ9õ!Eè›3 ÓŠà".é­ºŒR±vR5Ý(M±àÛ^¯Ð KF¡Ö©˜Š[¶YÙŠáWÅ窮pŠ®†¶êùVÚP‘À[hJ<9Ž r«Ù”è°Ùô²’7ôB+†^Õ¯> ³!”èe¢O ôdÖ$PY†a¾é¨öÎQEƒ PP-ɨQ·×C‹þ¥O«Ó†9ZêWí£,øÐ ´ÀNé´„‚sgÀ ˜×¾ÒIÍ^ÓÔ§ÓTÔ„øµ;í¢}MÂʪHXÌnYäòDȱnK:¨¹TÄoóªI¸_ óÚlMd¹•)§PJJC‰|öjõZ©¬pL¤,ø¯½nÔ¬¶MrV:»Hã•5OØú×ßPÄ(?-µ3@AE?S}¡©œ:$Ù¸´d¯ ¥Òb6¨•ö¯|‡ìUwB…¥Ë bóu”wQúkf=³‹"MÈÔv®›°6~F°@]Sò×à­«Ë&³„Ëf ÐÀ.ô¹¸j-#ËoS_è½q½Î ݼ5ñûäª.$`¹ì s–´¨Xw²÷¤œ¯¤¤ñ€èºa¥<@´EµAßêûZ‰šˆcI,•ÿ4EW¦žâѸ°ÐÔÇBžhúVUœÞפây•{>M²g« í. 0¦#. «©`±0 ÀV¤dk jëáU®´êráÈ.ÄéZ5ëÊš1Z’¬îg=¢*ê+RºŠQY däÑvZ¾ ÁS²ŽRÇÒßÔoBv“í×Lßù¦wP5 äÒ(ôKÇQ_ ÛЕָxöu¦Mä€õ¶|Á3 ôÏ‹ª'–N«bËëâ옷ª[¬5¥¡¡’•% ¥šSÜü±–”†µ¦'PÍ8”E‰?°tïžCL€+=¾cñÔ1¨“¨ƒ[égO0vn$ã+I±¢ÊÔ£‚ç Þ¨]ÖCKgNÐue¦ð·ê qä`åCÑ•1µP]m•…¶ðh¸ÙkIGÉæbóÍô%xC}¹z4%¡,G=Ykâ9ªÆå ^ùØtrÇn[-OL Øú¨"N¶´(º ¹u}µwò@™Ã†´ß°|‹ø°K湡P6øŸë£mã4Ô \ O–ÉõQÎxVÔϽ‰"×Û ¡¿$GŒò,ºÑì jŒþ×Nºóõº×Ý'ù|ÀpÉÖX6'Ÿ†hºh®“E —¡‰ÐI‘q^ã«®¦ºý`™ò,Ç9©L³AêœU09°JA¦íLs¡5ªœãÄ«ÍNT†bpp%R¹¨_!Žá\g´ã×MŸ Jo®;9›WKTUoz—I šU`†ªxÁÖ¾"åpr☳jÇ(9/¼ê¢G5z`}3xð«Pe”¶ßï’,M yJ'îp4Ðó÷E/î_¹Óô«ôZ'·\HDd™nÇÞÐ –›8V²|ppe2‹{EJ*.ãÆô’¬Êûc¹Ò¦ @¿,ܶyd [Ê5®ÞÍÕG¿ q/žŽR¢÷GÓÄ1g‡4m!Ïh‘yõ™‹xpWf^0¸ú7˜죟1óŠn™… ýýáBÕåYið*ùvYTÜã»Û&SÏ7Õ[ÐŒ9i («|í¦LÙpG0oˆì2y§°*J{T€ì2Ü2™r+¿qƒ)l+—MÖ–¶…ò.Ÿ:È› \ëµÓùl’cÒòŠÕ°}¹ã¦¿c¼¸ qÛ6ȹºº¹Ò`öM,óïMu ”ñ hÜcø¸e¡ûâί„ò^DÈ4…ˆt¡Ò»§“6siòwÀ:£QJºšJà Ÿ2.•Zz%ƒ¾‰4V”›ÉÅù…J:“}pFTWgçr×a\WŽ®þn©éu-U–²©ôœ¤;h¨o7¾DKêFŽîÎRw}/&î;ï¼UÜWþ¨ß ~s 3w1O–.~^xµØv),°×mЃ\7냡ÕO®Ø©`³¨cËäË©|µµí•ÂѳX’P;¡ŒÆÊ8æ$û¨J·½¢×E¼‘6OÎÌU”—Y›¥ë²ôæ²&tåæ¡ ¤.^17“û`PÝ òõšÀ¸•Hû3 NÛ­ž^3øFÝ IØ„FV:)ѹ–íí¦UüÔGÙ”FÐ%UžAìƒl‘ .2™‰ˆÃkf2‰ ÖæÂ¯ÐïÙ܉›j¶¹ƒöQð©@ bœ¬<:sšf êO)Q+ |ã8'#¸‹Jîµõ§VªÂWÚ4è(™¬‘ß.ºuüC޵Åx÷h-ËåI;aŠ€µñÖœA*ÝgN䪄PÑ¢"9ÆZâÑÔ„h¯hEéãÒÛ¨Árû4žQx…nÂÊ1QñG¿0Æ*Mµ*D‚ªZ5®·ê:‡ÁúÍ£˜V5 à½Fu¸Ve’g,n;¤–‘aFlf Õ>UȵªÌFZ¨¿×5&p³c0Þ~§Ë¿,·ß: Oˆgg@2}›ÎmÛ!áíñhª«ÊÑwrä°f‰Õõ¢¯Ï¸ ¿ßü‰9ÎyZÇäwyÌ,@ü¢ÏeÔ2«7Ýý…àÒωuï?ÿ@ØV’£ñûÄ“tW6uóѱ‚޽‘G¬‡ïåz<+Óÿeï]’%בdÁùY…¯ „øë éz=8>©ÁÉÝ7MU GeTg¼›U"œœ œ#ˆÚŸ­ÒvásÃÅX‹” õPq1ëb¥J)^èÜfm@¾Óº·‡ý^¤Öý ¶)±¢î(Ü‹+Àð’ä7† {ÏñÒ;t饾ˢÓEY!U–€ò- ŒÐÉ ç}è2ˆÐ‘¶I#Ú6ì,¼Ãyt”§j·E€`] }Ò;xY°*¤•Ì9Gs¨IZ7tµIÃwP³U4¸ ½©O¹f ­ûô»DQ¨J‰&FÃ÷-RƇœÉZ/ÒSuûBåñÑÅßóÍó"(õ¸}Û£Ëôß"DõŠ!Ë’çš z7ÚKñÖIK¸ižœÚ±Oãø’€#kj`Ú©°™w€~ŽÝ£ã;éèÁü¾Ùƒ¦7GçEm\XÜúFÞó%·ÚîéÐöw”iRèág­‹Ü••ƼٶÐ6[¢}¤Üµõ…É’ì+a»dl|¥~†á+·ÚåÏ$/Un((ÙFÞ'´£>£D±DÇZ…a‹ë#e¾6-Å]të›'R³×Xª‹ó§b‘ð‰©ò¼~{±~‹<>Sì߉_¡Ú—×w‚Ê!VÉ\QOW—aéXHè§‹¶-³¢Ïl¤y<Í—baT½×§F¥rÓ^Ë•çIeÖKúkéÒ,Öee)ÄjB(¿ÌóI'¯¥ä”K·ßš>RÓ™‡dËüˆE`¨ö' =èÑ=[ƒ–žt¡É«’G£öoÝ?KÑ,±…sOH¸JжÉIý[ÒY¡ë"ÂX/Nß6¨-ö!u c}¢I¡ÐkýBÜa¨­ñÊ)*bÎzúîË,¬Ça{¨zƒÜÏ6'[u)²†3 ° §ÔºÝWÕÞ<ó¼ÖS†ÇMT<$LÖ‡â²Iý À+W}Ø,”ÚX›Ô 0Q ݼµôZ¢›€E«éšÈžmB”Ú½ØRÕEBŸÉJQ½=žCP9å~þ%‰ÅQ“5lв )qIš—$iz¦’n±p’¦O±Xl¡wß&†™ÕÑsרŠ~3ßÏ],qc=bÈ}ÆÒ|vüÃðÙÄ›½âŠ[¿Í³“§QÙš;Ò»öç`{ ªùÃèÞÍ’*ƒ{È-ÜV©LÈ\QتœqÅÔÔ]b²ü«TÑË–ä—yþs·¦ÑšæaŸt+†áÅᤠ«—ò]‡½»ä ®£ªžï›×é"HCÙ $’ºÆ‰á¯Àÿjk«–. àpÉòXãŽÂ‰^Ï3h®OVBWÓRž™±©v$C—©jhAº[xåÆ*¸vJ{iѪDº³»&AkÜÝUÞZ&ž'пçáæ}8ÁPzÚœõy j}žÆ^yRú¬«®E‘ÙC—'!«Â‘ØÒÍ÷ëY¨§eŽQ²Œ~Mb Œ°µfC×Þ¸Œx°ùyrcžr髈°º(.C.œ{îÕ~‡Ô½zúîëãëuaZÆnè:•%VÞÏçº]žØZ®J¸‡bb l^ó øxÝfëíòÌ­òҸ¯,Æ…Ü)¤Õ$7Uc‹ÿO¯0+×?÷µJÍNß'%|P¸U’ŠªÈC!hUã~ÊG÷qkíš é´4™Uí¢©¾}˜‰ÔÆ>‰ZêY²Dÿ[ ŽK—«†®/[^®ö^gëy}EE´ñ˜ËÔŸ3zM#×+â`ŽÏÕ &µß¸Á&ú ÐŽu¡ÙbNë¡ô–B;³<º[á–Ê®cš&ŸAsnÓ>‡–@ÖD/KUÉýþªB@P°” u&ˆR„pk÷“ÏE G6³¸´-*˜–s×ö¨*8û7-"…`Jf I“m9ûédë/‰¥Ýšt[€ÿÿà´4MKé4úÄõ æÇDj—ù:U†è<æ\¶$k ¯ì§ÕõÎÄu<ÄzU›ž¡+pÈëjÛ¦† ‹“ —í¤À Ýõ¥éŒuDö¡¸Çýô5rÇ+Yž®¬öŒÉÎ:”«ù¸Ç}×â;çB‹tXi:!K£‡hƒ½Ø¤DŤ6=ul°¬8§M–Ç>Mö]a=“•¢}ÈÉv³VÌ}d&§/óg bí¶¡Ñnr\„ޏaN4‘(wç+{FOoñZšýž§ì¸ç}þ¡0Œ>”ž®‡XW®Â”Š¢)|²°¼ºéù0û»éÈÁyÇLø…ëÑ>=R†R^«vbd…è¤åÌa²ÏgNXΜ…‹íÌ¡{RJ‚®(Ò® øšRM[A+"…ªC¨:2› õ‚; RUЇ2ƒU~¶æ ™Iæ(M~IzõèТ(ü´vÓK„ òh R$t©Õ\XRǯK·‰#(w!ÙI2©øèI‚̤W©,©y¼CÇ,D…ô³$Ê_¨ƒŒ9è)šèîQÕÖéÓ›ã&UÇ!Џš¦ß_ßmIVòGu?{Žº=‡]Ï{7‚˜éc·ž³twUJWÀÉË·P¾o”•_ßC|° ›©_ ÌŠ´®XôñΑiI ½íæjÚ¶ö]õ7EÖ™¬¯]qȵ­¥¡d=´KŽ®t-]YUº3¦ãé_”(e¶çAPj·~B~”r¦«¦‚b¦¾Ðú–îž«ÎUErn¾,]3qtÍ\9¤‘Õ=Qè‚Wẇ嫯ÔHЄ„ VêfK|½2{2XŒ«ëÈž>2Ë¿Âí¡Dа$ÉtQ‹w‚&ûz÷;h±»!À EexØÑBŸÕôÊöƒ×þV«Ã°WPÉø"˜ϘV›¯¤"ÁIà’…ÏËFì+sŒoâÖöòMrš¿ÉÂÅöM n¹‡‹Ú¤·nØuT{d™Ã¼Ô¾Y‡½BǬGÀŸvq®ñªÀÌ’x:×ÜýŠ®+;¸µ£ì,PU×<ÝeZ†ëLéyS*ÛQí<4Jü*C4){ø¾v`s=3S˜¦gZ©ÊÂ<žíh9øÉ‘ íCú¸5Y[ý||3CÉu|©ó»fÙ}¢˜(JìÒ~¼ó¼2oXSíÁõu€SCÙå_ €zë kêéGŸœ®°kŠR\§k‘q;J•|ý ê"<нw©¯â£a ¨•jÌ’L•6¥HEÙüuiÛò‘cj“}º¿FsÄÑÖj»Ñ^= ½Žuo6î,§u(Lß«˜ßzn ¯ÃG™¯½HóÕç½Y¶½9qñ×l%­NÙj}ç°2²±çà;×U몬Òd¾òqö•š7yÓs!2œð²%—1¬ßNÊ|ìH×Qqx0¡}¥”\¹ÛB¬mÈbÌ8Z«dE‚CuC”r¥J‘&ŒØA…š¯ÉÉ¢ 7õ1çí.ß¹g~Àó‰K&µ«~PE“õœ6ë[¬–m‰ÖU…žJ ¯ /þø!p$“þœ.íƒL/_E'ÏæÑž×T ëššÖØ_³ôeŸ»ö£5Åtè)\S1ÏklÉûˆEÅÂÔJ%Yeùìk¬8¦UXå*ØÃzøqøÙ7–)MºÔïï´ÌcºæÈ—Hórát¥»ÅqEÏ?¸=ÿÙ<ÖU1ñ'2^ÞJ y¯Š†Ôt«1¦ìû*ktGÊQõKôj]•}þâ ñªC4²Úÿ{¿åµßÊ$½wƾÙÑkùx–¼)ú!ºC£öÒµF3Žovt öˆµËU wã{)Ó²Ò{Ópà9ÞF±Ykgj±´8¯ÊBÜ•c ä >Iã×6 óµ•¥FËL œ]ã|³©²Hé¼ ÅzqT¹Õ“«ÌÚåÌ™m̭ͩ5ÛT¹vy)É2“K× ßl²b0 ÍZ»©î_À§*xŒO ßÍ©¾¬õD=cmÖq"Í™ƒ¥ËF Ü-Ã}³§¨œmCIzéjíÔ+µ¨¨WPåÖ^\6›ë×õˆ5³êßæ@~{mÛ½víF ,.‚EÄxê0ÖNªnëÔf±º^»63gÞT\ÖzêT¼ÖÆ á¢ií:½åTŒe#öþÚ‹EÅžXh¶¸^Œ…µk­ÝkÒ¿*§C õÚµ99Uå£×ÚÉ¥ ˆå×T»ºÑ{Ö™µv¯hßÙ*ÞÒ“ÔäXYýh”®Í±©äLÖ‡>¸ðDrcc)ŲPãæGäþõ…åbTˆöwÎcǺ…zbåÝZ´¶Nhy¾-/Ôñ¯[Ý?e7‡hN7Ç6ʸ¶þM£ßî­í™÷‡g>hrwMï']pÒáŸD#¨þx`âTÒp>6zÕY±÷èYX”~nÊ ãÚž&WžŠõ*úõýÕŸé…È:M*SÁÄÇܵP{í#~3È'Ì‚Rèm) –\¨<]!¾}€Ì^ŠŒ4õ‹–_;[¬÷Bíýµø­¨Å…'eŽ›Úióøì%ë!ƒ|³§×œ ÎúEi¯-ÅBíýµúÌ:xñÔ“9_í¶-ÇÊÅVªtlxF7‡Wló¡Úd9¼v>¶T µ÷×>"èÓ+b°ÔÖ½íŽy)ÀUïP «¢RzÃ=EšÊžÇôZÙØ=/Vjï¯}Äoö´2óäf¹Y²6{]Þ¬bz=Xޤ‰qž ¤ó1ªÛȹq¥öþÚG}¹ÂžI7ÚqÞB?¿zÏÄÚiðöˆÊš š¸M˜©tácËÇy†Tææl# ^Ö+NQô³å`é¡@i² c¼q1æ¦ôy y«¤M wÑ‹Ø{ôÌ,²Êâók™ŸÃoç$Šüý¥GÐA?RI¹0~kåâ“P'ö¾¹‰ü¼ýöÕWsúÏaæ?‰ÂUù›=Ge[½'œ6·êòÚÙ¸; ¸Aí=z—;Ž–‡µYËÎ"+Ð!¥³HŽB×%Ý‘tÛ¹¸ÛA:±Ô9jâUÆUš»±›Â¦3];àE5ºÆNEŠ‹´}8ÍÖ^+›‰p¡ÖÕ“’^ä—h·Í•¨1Æòè–æ3è‰z&¨6sz-\¤öú¤%±Áâ8óÆ,Ž ½šµ²5ã>‰E•ý˜DqàÓÐŽqÔ×ÎÄ'UÖ®¸OaÙQ¢ßÚwP/}xU¯ÖW/Õën§×ÆÆêê@…z)±Â>…5®s6ÕÐØ¬›žét×qþä¿+i úñ„†,2ªtwáDù…U’;*æ7!SÕRîú¯Ûðÿ[Æþ•š ¼?<@•’TLf1Ƚ © [;.•„Õß¿y²UYß]?¶¡ÜE ûû+M—ÕLE‰«Â É|LÃ(Ò>Œ&Ê6Z,ýšË£ç›=!ôLeÒúAs¹¦6RÒ—MÃI_&»Jî™e$ñÊ­ÝKÞ+åBLœÑa1ÇÝ®g”âsZÀÆlLšnªšÔeÓˆRu¹zÝÖκ;*TèâR>ƒ^+}BÎa®ßÛ˜q2Ü€‡ù§{j#¥òG›‰[O^:$§«³JWF~Ë(ì Ý;¬,ÛŸ^ÃÈ‚"?þ"¹±±\T ±ÚUecÀÚÕ\¼\iQ­a2A¶ù˨ÝP2õ9DFýñ Ê„‹&ø¨cÔ墵úšÌ,Êo?™YL‰ÄS—F9Ul§p—òx ËJ§'0J4ÿÐUµÕ·£¹®ËbyõÈq-áÖáõ×:Ƹ¨þþ?]SóïýÞ)2à3·1›„-k¦n4÷ýšZ= ¶KÛ5—3ªPLj¡Û=µ:Œ-#iŒg S»QÜê™I_Ýf¢»jQ…÷´û×,³úqãávY-6²u´~çÈf”ÇÑWîˆãŒ…zJ>º jX¬tíÅ:+]6.¶»«l>=Û€º‚„?Ç,™›¢Ve6ÓIÖBÏÆb^좹´kØyìרBíýµø­{D†ó>ñQzý6b´âl=8gÒœÚÊA:ó8î±…Úûkñ›=Q‡xV}Énÿ€ k 2¥w‘K= a±dŠæÒneç±ße µ÷×>â7/“ª»ËGê^¶„qDGSغԳð¨HÁ“_|¸6>¶Ël¡öþÚGýn£IšÇƒSI]^Çû¸K]êYx<¶-s\ šýkçc½Ì£n.Ñ1É\¨%5‰]¿uTJªe?w•íÇù~C¬ŒÍ¬úÆÈUmÅ-5¨Õž<­»Žo´©ã«^‘G¿‘T â~Ø÷»ðçœ{]TÿkgzÙBáZÏyˆ'ÅN§"·÷ªÜŸ=וõdé7ׂߕÿŒoÊ–èFÉÔ´¯”ŽªFhoÕT°ç-#–ŠcL|”:“5žå莫¿v¤›Šï8'Q’V}D[åÞ”-,*5($#ÖQ_Niu³ø‘‹Gìõá”0ê´QiÚËȈn …ÊzöÈ“SFªàe`ñÌ™nþôâñîµü¿flsýù¡°0ˆ3Rã+øCI˜#ƾ©>»JN*csÓGŽJ~ްà tH¼õÕ}%ÄÇ䬶À¯ªìÅÊ>•; ¨b¤ŠîÙ´ö¶kë´*âlžÖr›Ö²MkÙ¦5ݦU/2'BÓÔý5#²kZë±Ýš: ïšò1%UkUlrl=ç‰Wå·¨Ì.¾Ôº 3d±»Ú}D›+^•yº?ìa®OÒ0p»mí¹ÛÚÛ–^Ý–Þ’LN<0Œ9""¼þ¯ô©£ó2@¸6’ :IYûS‰|¸¯N¯b)QgR«W@vTâ«Ð«‘ªh»W"æ˜/ü¨ò¢™Éª»(ãëeû “LËiòš§+Véù!¢ª¥\•Ž»½Ê5K¤×,eÚ³+KUâÇXÚ®êUÄ­—‰¹ä5I<•ÊkeĸÏ’”ž*ªŸVøÐç¢Í §èèðtÛniñíø£§˜ê?®ñ׌‰¯ÿJ²CT¯s™vJ.ˆÐTj ³”€Wˆ?ös¸ÝÞ moж7(·7P²ýçÏ 6ÿš!óõ Ø{x…¬LÁù‡ä“ ÊBïx_/opÔÿ[ÁŒ;—Í€úú¿‘Îû(ÊÂXMÏé#$§P¼¤I׳—ù‘e÷ÐæRN\x>«Êî¨jd~´‚š<áäÚåGáûîþ¯-U$MÞ§âOÅ·Lð½ÞòñÆÕùòpž¬BŠI¹P¥cZ,‚Ê™þ×ò·zS]M?~ï?^pMm+ÎY®'➟#Ú¤÷(¦ç¡Â3ŒŽ¹h^ ,:«Òû±7þB\ù9–­'ÂVÌIïQ4LŽÓ3ŒŽ!ÍôÚùXôVµåó úSϨݠ¶m¹íÿ9‚PzBcJ›žq¬;šéµó±¨®6j õÆc]ç1ÕmËøÎªÉÅÊ´ù§ððTÅãÂÇ¢ºÚ¨-<–ý[³ Ï|Yµ´¶“¦1©° z¾ÙÓ|<ãâ@áµrÑ=¶:HX‰-òS[Îò´k))»BQz¢e’2¼VÇ3IÇ @ý%ç+z¥µp8¨O·KËëm“ÜÚ>ô«] ñµß×MrŠn•Kdã_Ë[\æß5è/î¯Éþ³üœ§wO`yº;µce;ªíµ'Ýïéw¦©§ôNwYoVGÏ…˜¢Ï¦;õªû€‘]^‰2‘ýŒg¿/b¿ÃJvLý~nØK:Íá+‡A‹¯ìFìýµ¨£¢³\Ô¬uÔ3Ê0rRS¯¥ž) EÏŒ€ÐÔ/xl,|,ǵ÷×>â7{RwS+<)ýâÐÉ•q²¸~?DÙÛßï‡CVýè^æhÙøX<·7jï¯}DÑoÒô0|T%˜Yrm^óIb¢z¦€=3Z@ó5âY66÷w{´ZïÞчûf ¤\7Rò¤¨½YGA£àúýàeCÏ#˜²(¼ò ¯W@9à‰‹-še#öþÚÔõSu=NªNh #²—|a:&õLÑ,zfD³ˆæˆfYøØ¢Y6jï¯}Äoö4ie-·Rñ½º ?Ø‘×u°Ì~ªž)šEÏŒhÑÑ,K4 ¨•Aí=zúˆ /,d^1/\P¡—\D»u÷6ò׸3F,‹±, ‡ÏÌX–‡mjï¯e¸o6“JN"‡˜Wž‹³ ¥WPza«” ¡S=S(‹ž±,¢9bY6&Ö…¸R{í#~³‡êLı6 ý)Š>8UíåÕ3³è™ÌR¨œÁ,ënŽî>#˜E=}ÄoöPñ §H´©—òÜD"h”íÕî¯|½Ðz;O·øÉ¢ž> È ~6MX’–¬ ‚±¤“JW= ûèz$‹^i8 ­÷×>œ¨wßÙšÄP×Ýö8ñþ„ë uƒÃÜ}šúKu§§üZÙÌÊŸ daSXH|í^É'›)cö)y¤p«Q9”œêâ^‘$mCôï 7D—kø‰›·2©¤*Eê›ÒãX„¯©ª0z«ÚÈzæg’»ž©»‹N ¤ÒkÒI1ÛÉD[éP†J*÷NR/)ɤ’JN1ÃCed=É_Ϥn¥‘JjccQImÔÞ_ûˆ 9i m JA2i¤”‘dÒH%ß«RtQòºýôŒµ}'™^;‹Fj£öþÚGTÜJUOPÔI”ÂiL]]#•,ÅüÕóÍqj¼ž±v¯YW>ÔFí=Ò±Lô‘)Eý HÅ¡´Ô“’dZSÀ`…x2ù C¹c"™ÓEoãaÑG˜Šô$Í¡ }”²¤ åM&}TN]‹ØõQ©Çø QꑜÔGÙ°Í_$ÁÆ/R©‡…”’ Lä™%e莔Deè–”feÒG%OCÙP¥wÖv=bíP.’©%~PG±^üìÐG–Så ¯,)]y”»a\º%¥,™ÔQÉ+¿òP%_FÍɆuW´î@r}¥EµÑzíã)…8”ª%eYÙÏçõx–2S`˜Aó]]Û1Ž+![dåi0yݯúýP ‰Ü¤šw×ß<ê¯.¯Iµ>À»gŠ™´vIŒ•§¿Bu?ø:+¤ôÌPH‰æPHmL,€m¡æÉà4b¿~ÊT*ÄÎv×#!uÖç^2'rÍË“~h¤ôÌÐH‰æÐHml, w£ö=“J gw{ •”µ“ÎzŸÙnªzTK¿ÃZ›URzf¨¤Ds¨¤6>Éa£öþÚGüæÒýbáy^õ‹C‡g?Ÿ‹ëWD¡J*1GêPI%/,.•ÔÆÇ"~mÔÞ_ûˆºƒŠ.¥ày\zݦ’J>ŽÊ|TI©gRIᩤ@³\:©EŠMÌ«8)¥Ô3i¥ìHwº·°v¼|!¤•²ÔI¡\¿%œ›µRzfh¥Dsh¥>6µÔFíýµøÍž¢b¦€”¾Œr§\凮€"4P~´Y)¥'†RJ‡RjábSJ­ÄÞ_Ûpß¼IF©]PWý ©¤ìàKý ä~ Š*)cŠ ¾ç1ç‘ÝvÙyôìèþoüòñL~ÝAþñÒ«‘'·&ô•gŠK7šÊP«ãˆBsãkNY…7¾5Udµç),]:°‰:tJäY ›ž^% +|Ü¥yNÖÒ<·Û€Êä b‹‚j&%éãŠx—iÄ’KÍ4BÍK†öÀôˆ2—=†aíóåA´Ô×ÎÄluXh%Mâ47I@¡pôØUat<8DVV´«ÚU“È;hœ^’Ï!s!Цµq¬|̦›ÚûkôQì7y‚]Ø óÌIÁÖq™†‘ÞaG`>qXÚ‰ 6н·21Û¾6Z:“cÃõÈ @SÆ©ò3+㤉AUëœä6u1 öôGìpÔˆäaýƒŠu gj”o¯ñÚUFgÚ¥±Ñ6U;K~rˆŽ#¢R¦(`Ê"nÛAÑÚ8¯&Öe¸Ðzm£}³ƒâw{I…ÿ‚Á G*L‹¿¬ùÉ´nò™Âì\KìÊfˆ¯‰uÇ<½ÕÔHßÉkì,^"›Ø/6œh¹³–@¥„E"²Ã…× hÿâÌã·íä«tJï«G£‰vñ£z+ÚU%1=›½ÜwèÜY‡ÑÌ®S¨â7éJ`;ˆâà"o÷Hd° ¨ùÎaSEÅ úEÈMeˆ¦ÓbeÛ‹ax(ŒûW±ž±K{ ’h‹å‰õ&^©½¿öE?h±Ûøêlg¶cœÊDŽÃ]ºŒõŒýÛŠhh[xí|¬hf¦6TTcÄN>ö•šÆäFéK¶ÃT+sôvPåÄJü"’h§×þN³Ák#öþÚÇëä{××ÖüÇõÿ+?£câh,ó®¡Zg29™ ‘6Á£ó}éRᢰð_·!® Ìÿ†¡¥"ÅýôôÒ(>\”.OîhÖöÝ´å» ÊZý“Ô˜¨áR:nmèšyø òúmkÁ1œëJ¤:å¶´v·µ¡Eq#û1“[ª‡X?uá’:Í..ì|lЍ‰š&q1 Rzug3k¿†'šép&OµŸ_½‡p?Š€„>ÍïNqaç`SI-¤Þ_ëp¹+•)¢P9$3•ŸR[ZÓÉÅÔ–ê!ØO]ï“% ¤W§Hy!½v.n𩉨ûkð[ª!Y”Zø¤´)Ã:À Žñ¬FP‘ Šà¢·9œˆ‘Ái8òYºÑF±+É ÛÐÉEF®AÁTÉ ×¥nç ^z>lùN4W.Öå·{ívWfÕ ‰K–Ê'ª­Û^,*˜Ùó;&øõ{ܘX7ïLªuµY¼zºÎK ¥@†ZW&IW…/dú}äþ’¹åÀò“Ë™`Üv‘ÜØXÏ¿•˜´?n!ý›T5ÎoÚ¤²j›¢ë,¶«G,–ék§NÓ½v>Ö{d¥&ËB0ÑKÒ­P¹X¤ò+Ô¹G{›põÈý×u,4ýÛ1Ó.šà#Nï9ßÅFÍjÒ®8?ÓÇ»«§ŠÇ ›LƒAsÔJç1]=â1õgä'š+¢ iÌy+ÇPgú‹I*/(­­-•ŽQjxÄc¹zº×õˆ5sºHnl,:*<ê±®¤r3ùEµ)Ñ·ûMÕ™I×=‡.ªßßQ­<–¾^8ó¯W}ÎÕË©ãëî³ä‡ÏRç*tÿïÿWø~wšºx“ÓTžv…Pש w -»m¶÷t%’ðýÈ &W¶‘,n¼ßñ}/w™ä&¹—†yâ)¦ï#—ÎŒ€HQ¢aýÍà—î:Âah¶:ͤ0Ì>jçã†ð'jï¯}D!t/tëÑnÈÏ‘è’ÖF/ªzÒÃìÏtåi†¡üÚùØPþBíýµ(„ž„x£|–l8·Ì¹uå‚tøŽ¢9:EÇ÷êeãK{í|l(¡öþÚGýÖ‘v%úE+lW¡Í  ßFÊZ:–½Ô}â{õz]üaGúµÜݖƈ‚sæ‘MÃq&þ-B×,¼t—‘¶÷ôˆE‘(ò…:üK$„_;ÜŸˆùî¶Ôˆ½ÊŒì<qL¯aV†uPˆÙqÙØE~>Ã(Ìöê41,Îî™°ãþ‰ZénKcÄØA{“¥ˆSIdX¶ã/ëÈŒ‚ýiÍ ÆG«Çav’=sgcþIJIböžÉÖ,™ù‹–cBà0–÷U7= VÒwÉ#•ÏôPLQ쑘;î_ˆ½¿ö…ÚS7G¡b¡àŽ@£Pvë¨Z—.t Myµp”’bÅܹ؀a›”ÔÓhÏ”ÐüØ6FÆö±“K똵—¹BSc…¬´[äpâ"îÈÿ"&¯ájÄq² ±c‡ÐåYl{OEîõHR‘ûN1©ÈýÆÃ õZ©óW‹7Ю¦€å!ð‹%’¼d¯í=#“Hí*ÈßC2ëõŠŸb07Zï¯}¸ŽÖ»AYÐ&èUÀXüêjfσÙé1˜dÁܸ¸áý˜±÷è™LÞºþÂ÷ð%0îÖÒ1…=,u¼dê1—ú IsèÛkeãÜÏý·ÃìÇx"Ÿ;T—ÄÓ›šÃš'¬E`ꉀ٠öÌ•÷ë_ÄÞJÔ/×Ƚ}©§Câ^û(Ö$=™d7+ïb`˜,çÃäÕ{¾ÜB=>àfžÜ5Wƒôß8ð/]Kwsôx¢3И,›·÷4ÔqD íS÷,u£CÊÿ*WÐCÊxщ>; 7¿Ò‹Öûk®‡4Tö¤ªX6›S(A ©Ö‡îWê¯éþkÏ [€HëÄxÇͳt¢&ctéÓ|e>î1Eæe…TÚj½ï¾¥¡ŒêÖù{Ú&h½‡›ki¸ˆË= 'st`G’ù¹y¶« µI†Z/ßצ¸(ôH±îâxfØDs£Õ¯j¥&{ô4¢ÌÝNöî$cr¹ÜOцw¬UÁmÝý5§Ñ#Uú4ÙO˜TM4w>6çÒ…ÚûkQé& x’ñ8éÚÐËp>íÞ¥Tè«G€þˆ ƒ€Hîllî¥ 1Ù̧e僚C%à Y“}uÙ˺\»,&…=rQ=Ô˘ ‚eÐÜùØÜKjï¯}DY¼s¡ÁØò#™=LJÊYûH²7Ë¿4]hnéÿõ̰ˆæ° Œ÷\CÁ I.üôæoêê ½¼IÃøÈ^10 (i3RŠE[n®3ØýS‡²}r˜|í/tó6-ƒ¸Ø î"Ž×½_¹9ôDˆD8MÜÄØ½$]=Ý_ÕghhƒæÆÅÍ×t"¦0åi@…WñœYê”Ùäš,b2ôìêÙÝUåYÅ‹›§éäÙ*§Å¡:JG…šÓ"“FŸGÏxÌ$½ö±£¿êõÌ­g,ð>ô½£OÆõÌè1AË]¯!9I{j7.¨Ñs½ÏèáB45å× Iuc’ú7Ùf YÌjY§3ôêáÚªE³ÕqDºã`µ±qˆºCIOÆ/<¤£~ˆ^í~ˆŽž1C'Õµú½çúíü¯”?õ\3mܧú©g:F/J}i^£õÅ1z®/Пº÷LKÓ™ðŸçCÊ uͯ1zÆ"rG¡¹òÞ3ŽMw4ïwï™f-²ÆÓ½g:HÝÙ‰Q3ú]±¯s¶ãk‹¹óȆ;Éxý«g¼˜³“&칞ÊbøÐs1Ñ?öL‹×Yª«¹ –}ö°DKQ _× =:ÛpW8Û0æ&L>W¢;g°ò¤·t¹®!+ÁùA=®®6|´ð{®7ì\Ü{lY0!»7±<}ê™žŠˆsúУїòg©±l!uþ­€²oó Z¡iœžš+‡Ê5Cƒ3ÎáÏ‹³kîûûÜ{ô¿FcZÅká›é".odn6xë#0~Á™^‡pC&n‡¼5öêGã¯4¥+³ž«ÃH0EÇôÓ ’VMÊADtr&Æ'îÞs½tPŠÝ{O‰I%EFÏù¡-gs` ö“7˶‘-ÕTiуõ€ãJµ3g¡‘Ø8#kúPiûÍ*¾jÆr=ø‰äAKñÄÆjð3sÖ”x½ZoóåAƒ=Ó:i0.|虣P° Ç4:x·Щ &4Xx¦+(ZõÌrý"zLõ+h´ÇÔ{†@qõPb"ÍKB£‰‰|¥éd›Óhuyi{M»ˆ\¤±o:eCÅǾGu\CæÞ3Ÿ1 ¬bÚ± ñ´Äc½T)gk:¾¸Ú(žiàÑs¶,"}î1ä­ƒ­kAlŒrZ= 5Rg>.c«çš©þÔ½gú‡ž1#ã©«‡F¥1¯é`ÒÙ>ïW[øqôLïÔ{ô};ÍþýÇ,tüxÍÔX0ÛÜq>3Si^ -Uæþ›žSÏôÖ­ý¨{.t“­ iþÔ3ÍLÎÛzê=󓡯\ðÎô«3âÉ™^x׋˜ì— È•aß'"F ¾ÜœîcX•œmvV¨©ˆÛ47øôõ£Ñ˜VÍôžÙ*$5ºË–Â8ìÑ®Š©=Vk7|ì¹&"7ä'™{*ÓÒ•ƒ€/Wf/+æ–gu† 3Ú-dLè1!C=ßœ“Ò²C©¢Â<Ö%Ð4ÚcE õúd¬%¤y¾÷àmè ‚ÒŸ–âñºFnãúˆ×™_hô™n…Âlý×/J¡è¢[a´Ç­Ð{J;dg° ß>ö\[«Àžvï¸wæÞs†ÙJùØ3Áß­çºÇFî±> ý–êótÝc}&Ç/4ÓºÈFsÜdÛÇÁ«§L×ü¼}jdІk‘öžkjbƒ{ϵëk߇žkict÷©g>j­ì‹jôhQµƒ9ú’iŸ]æEÕÌ­d’‡ÛyAÒ¢í±¨zÏÅ[ƒâSÏõñÛÁÜ¡÷žéÅý½gxÞ-Ì˨÷\k¸?u]³U·åôGŽ…E4ÜNÿ~hZ¨B סÙ*Ë6]‡fkÅšqh6¢ ~fšV8™£=ÎÌÞ3ØðÇyÆò©gú µÎ€=ÌsÞÏL8D×ëÌDƉ2Ÿ™Öãý|f6(NǙٳpô3s´û™Ù;®Óü±g:3½¥?n3¾z¸¼{b¶¾xiw÷Óòö¦šó/Êñc¨ƒêÔîË{ôŒò¤<¹zÆbb®°ò©gã©{ÏØ4|Ç=}™^ÞzÆ©yõðÔó 3qÌÔ85Ç\Ž_h®yj^Í~jÌ,«ËpsõˆçÓÉPã#ä˜im½©™(\ŒôæÅˆz®àÊ”÷žkîO¡ÿÖœ~PHâÖ1l¼Kð‘šÖçèÑú4MÐ$ÇyW˜ øZŸ¦ W7Õ¢\Ÿ£=Ögï{Ú»šußí=×*ræl>õLO%Äz虎_>7¿m>~GϵúS÷žéøõÞ =šQoî}Ót™ëÒ<Ÿ¨ç¦äÊã»Ïgo_ó©žkw[°ãcÏŽPÆ|è¹–TêÞs}ÏO=c6‡·žk¿m3Ìõ‡4O×&³y„ʶÿ@ó¬M6šc“mŸ†Ùú|Éž'U÷cÑ)ž‹y iþcϘ„ñÔ­çšÌ>ú‡ž±€ÇS£Ç7?£ï+c${NmÉž£gúÔ½G®5 y!ÃkºìyÍÔ8O¶¹cíÿ2w˜ÿü?_>›Wç+5K³Šx¢†Þ’šâMZÏ|Ç Ф"ÿ½R ýÊaùý{'LÕlnpG‘²68‹4ÈŠ”œIôòÕ_CÌ$?½B8NæU¯ úÓû°_篶ùhç>+1$¦S‰¡1[‚cªï¯™A;;záDS˜Ë²;³v¶<ï óSE(,BÃYÀ=JÌž‡’ÉFß*ÅÙ„éçîùÿ?–=xP½¬šÓßÿ”3ÕöðûÃÃùmdbHtY2Ojë@$I4Í+Î8{¥ ýÏAíKnD?Œ¿°"AÄì ðØImÎðár*‰ójg0sB~þ3¡R™œ /85tÌ„¹Çôë†sL\ud/Iõž4'pŽu“ùcf§3ÎÝÊ¿`&eZ”©÷ÃÈËÄ ´OR3\4cÈÒãT8 žíþƒãµ 1ØÈNÁÆDaþ¿÷j„yªÉ‡ðì8¤@A¶“¬pJE½zã:フS’ä_°R‘´Sý]VK…™Ñ$°Ãó?Xå$[9E n‹ï•s»é/Xi,ÙE¢¿ÉI<ö\“'a<}\4ŸíC¨ ys7Þ+)鯱ªqPý]^‚]=¤ô)Z9 Ñb€Û௿rŸ.fÎgøÌÌdï«åÓÚWñ_'CF¤1(ýì쀦úl² c5/ëúÚGí¬%ïõ¬MDýoOSˆ¾ ó´Ç8OdI‰æJ3*rŒo¼VRÐ_°²Rý]^¬.¨­Û˜GDXÖ0æC Ãk„ãÖ>Î`¦Fý3+Ùße†¥ßSµBñ…ÌÈÌb.êÆLd"‚›1¹Ó™9¯Dý3,aßÉþ63•¤s$tˆf/ÁàÙqð$MþùK07smò|ŽÉ¿d†I1Eöw™±ŒŽçCEõÇ£ƒ³¡LtŽl¡% ZÐ\YŒT¯¿`d!ù»|Öç®Õ3Tý$ÓØSàQ}¶ O›‚x¸e˜ëõ¬¬T›„n§Úw=R·U$q?Û´üš3X°yYÇÌĤ¿df!ûkf®ž9;m*Š<'xªqWž« ™‰Îq*lÝæ‡ó§d®.Ž;˜+YÁœ‘­"{Ÿ©ß= Ï *>*#BΕe< Æ9Û™\äçXßæš¸ó†Ñ_ò6SýMl›c=6T1BÇÁŒ.÷hFT”Œ±âµ r-'ó¶ç_02Ñt¿.bË 7ÿv íÔÙHâ³­êŒkÚ‡¼”¤¿ä%3@TsR̵Ó£Ξƒ %˜Åâ$Ë*ƒ–?ÅNže”ÎI;²þ' ÑßÞdé¼ QÊŒìH,zšàyr¶•q‡É­öa/¡è/y™¨ÞÁß\Æ&Ý$•ºbüƒ|,œ÷Ü0ç0éV˜q`öºº¶XÓ›©æ_¬žä‡~fÐA–mƒ>òlG¦¯¨…Ùxý¹žµÏ#"ÚâüM-ÔrœO±è´©fÏ¥A¼ßìŸd½ž1-ü¤a3ŽŠÂÄÇ/¦geä·7£à̵Î÷݆ì:Øã籂|± —Ä>Æç54“üoìòÊüªÎåÍ“=ÞÎ@@23pœÜYÿ¼·6ªÿ ÌB¨L‡Íð°4»£œy’eè›s¬ÌÃø_8 Õ߯•#œqý¦72–hÊó.…²Á#›Ã”>Ì/â™êo‹›¨Ðʘ‡ëX§L!ÎÌZá,¹„~ë0¿¸Õ߀\…."zàáž­gdLš‹¨~4ñ‹ë{&yÿ8¿š3ëÙ L#XÏhN:ÀÆÜíãÄ«)&ôq~tf²¿/ãÕ'M¨Õ‹Æ1»¤Y9?œ¥It GÞ>Î/ àJöw™ñÀjçSYk 9eô  $+|¢„tšë8õWÐx&ûß~Y Ìeßa•‡_áÙƒ">8-VÙ®sœ:Øÿ…À°’ýmµs+¸ÜÏÇêDfC‚ç’~¸‰Öa~!I±r©þW÷öª?j«1LšŠâPñr0½³TE¯•÷_I˜ ÑÿJÜý/aú]…j~Œ5±'ZÜeDAÛ™>r÷ç¿wÚCOs x9*K|x¡Mûyö8´µ@ÒS´9©T¹²¢^ÛÙö”Ikb&}ô ħÁXŽ6r”ï7>ú þÏåï× èÿ±,ÿkkæè/êÉ0Ÿ/L¡j¥ß…ó%‚é"Uç ¥A`€ 0TÓ¯CéhY¢ìq™Z°óŽÅ׉¨ò|$*es#„r0AsFÞnm/=Ü€çËõ|Á¼‚yV¢‰$^gS.?_å/d ÏfΫ,Øz®Æô1ñlÒËÎ|G‘X† µh¡‚…Lçͳ'‹©lAUX̉¾çÒa­/ë91–’+jŸ|ž+âÝUžüÜ¡ŽËÛc5ۆȣ§Ù-}\T9Ûú"¾Ñh'/‡àg§gp@®þ¢¢ÝñÏ6ÔØ–Èózn»(Ïaå° É|‘ЃLXRf'ȹ/å`3ÝSÁQÀC'L/ƒ2Òh‡h•»`¼Ç:ÆA›É ƒej[l-ÌåLˆff8˜ÕÍËh{~ê`9fèo\µüL€£—Pdâ­`!Yp+c™`O®¢ÆÆááœ2Ë=³ZÃó¨`ûœ4Ìn¸§Š8Ý`vk8¢Úžm©w•ÚòËœ=Т# 2˜ Þìâ-Â{ál#<îl#é»0AJ5áá †žDUiìí¬cŽLJás˜´³Ý˜pܵ1«z&È:{TÅG¿É6’@'$(=Û•E 226ã=Qû¡'H>{ •’Mu—ÏÙs<ìÂLÏ6sRšæÐö€‰Ž꺤wÜê²…W.Ó gê¶Î%Ìê,ÅÍy´‹º£CŒBÁ̯”ã KX:–ÌÊYŽF[* Ù¼CÏaƒ)‡,½—«Ž¥CÌÌ–ìªCŒzgOÁii–4ÈI$™`šIS&{ó!HÜ,ìÍá ÛÙl¦jñ’r°*S'{ËßmMægDmì;ÑæÜðΞ&Ïèvƒe¤Iײv³}x»Â¼N¤FóQŽp!™nÅ:x|Z¼“åƒ37H»ÒÎÛéN=•z¸– ¦ØÇªÉ Æy âËN;S X÷«ˆ¦g²žjçj@è©­ŸÃ/èÙ>73lÙd‘„Ý6ó «Åyá› ÄùIp˜»ìÞõvˆ[3‘'ïil ¸¸àr‡dRá#–ÀîUäá=›Xƒ€Hàá8è,Ê[G~ :®ßfâ`‰óèmBŽƒ=L¦bi vE2Ò`~^áóV •f²óRÊ„)ÑÈ8åt?*«x¹ÃÑ}ö¨@TƒûÌÙ.Le_Q!à„:r#e2>;2 m¥¾ª¥*WE™ófœ/*_U¼ÀQžÀQ°s†s[!ð=æžßZæÝbE©äéåh=GfÞq YË®kF­Lè}ŽbFîq8þ$_¨tá«|/uó4²CÛ.¬š•ÚÜèópð²ÿ&ÒHà4è“Dc[eZþsŽ ìêA(S£«„^5 òÞyE–ì æÍ‚žCx0÷W¦#²‰æwƒPhÄã‚tѬî³ÞxkÚŠoÄ¥µKìHyyˆ:ÉI(q— ¸äg¤y.ƒ‰v¬Z„U}ßeEEìH7°tÕÔÄ]†r%°l0ý'ÁïA¥1Ó·ž—_ãÍÔœª…¢&\%øÍE Î/aØ€»À-Œ‡Â\të ñÉ1Š”žü,=í¿¸Q˜ÇµbÏÕY1Àþ,º%r¡Û1C‡¥'<[*˜àÒ,’SéÇ+áq *ïâø}3+AHjêPÿƒúÔÿ þõ?¨ÿAýêPÿŸDýiÚž0*êˆS³ŠbÖà{©¶ÌŸYm*ãàuÀšV«Ž›’•Ü̩̰B®,}aáËÕ†RYÆÓÂJˆù ÇV¢B@嵂o¸BíÌÇ¥Í\yÏ£+ÓwÉÎéOö’íxÜMÏï🠿«ü‰»ÇnõÜ+Tí‡Lq‰¥Ä qKÃv¦i<löª¡g Ä>Êp¸7Ðÿ€þô? ÿýè@ÿúÐÿ€þ?úÒ´1 ‰f!Ñ*¬ê¬ô™uhÉùç¼Zprc—´+þ¹-YYÏ16›úp[ÍyVál5Œzð ”©I¨Îûþ°@¢À'jäUõt¾Êž÷Ÿû>+û,ìv¼$Uqîö1€ýÏ©ö?¼°¿å„9ù‚ó¦™Q-´ð]ÁyâJ´úMe+gÇð)ª#ÐdS=Ðÿþô ÿýèÿ@ÿú?Ðÿþ úOH ÿ ‰6aÕD¬Ú¸Ëà ˜±ç¼ ½¡„48ù°\÷qΤ0 ·sqv}zCEmǪk€Ï©ù7:íÞ ¶4G䥉»`Ý'ïÿœ:Ú7[²@õÞq;Øý¹¨üCÇýÞ_¿Ø ì# §àùágÇäLÁ2>BÁ_ðå¡òçQ‹${ÆèÖ¶À øGEeåæç“7?Ÿ¼ùù䛟Oºùù”Õϧ´ÍÑ'­Ž>þæèãWGŸÜ6OŸróôÉ7OŸxóô)7OŸ°yúäÍÓÇß<}ÂÍÓ'lž>qóô)7OŸ›£Û}âæèãnŽ>›ŸÏæäãW'¿;ùXVþÕËÇo^>›“Ïîã“o>>nóñq›»ùø¸›OÚ||úùÕ}|ÊÍÇ'Þ||6Ÿ¼¹ø„ÝÅǯ.>è}öò‰›—O¾yùÔÝËéûg7;Û7?Ÿ¼ùùøÍÏ'ì~>õîè“6GŸ¸9úÔ›£O½9úäÍÑ'lŽ>áæè“nŽ>iuô)móô‰7OŸtóôñ›§Ïæè“oŽ>õæèã6G¿9ú”›£¿9ú„ÍÑ'¬Ž>áæèoŽ>asôñ›£OÞ}½OŸÐ6W·¹úÄ›«O¼¹ú”›«O¼¹úÔÍÕ'Ímԣؼ}ówŸº¹ûÔÍÝ'ÞÜ}üÍÝgõö)›·ÏîìSoÞ>¾mî>eu÷©›»ÏÍ×§¬¾>†DgŸ›¯OÞ|}6GŸÕÏÇÝü|ÜÍÏ'o~>aóó‰7?Ÿróóéá‹ÝÏ'­~>¹íŽ>в®ž>~óô©›§Oºyú„›§OØ=}ÂÍÓ'­ž>v‡-®>õæêão®>esõ©›«O¸¹ú„›«Oš]}Twöö©7oŸtóöI›·[½}òÍÛ'ݼ}êêí³9ûÄ›³O‡‚ÝÙ'nÎ>LgD˜²*"áhm¬I€µup˜äçoÊG«#j‰2 Ž¢qÏ+C:e wH˜€• ¶u®t¯Ig¸õx.OôG/ÿšÙ†k¨›D*?Þ£8¿ ôÚõ?«ü×_Ü(ìcþÁÿÐáVÂOU<£ã’±£ îñö‘à}$†/„,¥ŽÁiȨÅS•ÑP‹@„:‚)õë¥ó/›Î¿n:ÿrÓù·Mç7¼éüÛMç_WÝtþõ¦ó/7[uþnSú—›Ò?îJÿ¸)ýݦõo7­ÿ•w¶Ãÿ|Óú·›Ö?mZÿºiýãMëŸnZÿ´iýó¦õo7­¿¿iýæõÏ›Ö?Ü´þþ¦õ÷›Ö?nZÿxÓú»›Ú?njÿ.tµ¿¿©ýëMí6µØÔþá¦ö7µYÕþ~Óú·›Ö?ß´þ~Óú×UëŸnZÿ¸iýaGYÿySü×Uñߥ€Këïnjÿ+wqê¦÷›Þ?Ýôþî¦ø/›â?¯Š·êý»p)ýë¦ôO›Ò?Ý”þå¦ô/›Òß­Zÿ|Óú—›Ö?nZ¿iýë®õ7¥ø'JÿvSúÇ›Ò?mJÿ´)ýÓMéŸoJÿ´)ýã¦ô¯7¥¿»iýݪö›Ú?ßÔþù¦öo7µÞÕþeÓú/íDýøªøw»æß¯Šÿ]ïŸw½¼éýý¦÷o›ÞßïzwSü»MóßVÍÿ]ñßE€Kñß6Åÿ¦ù÷7ͽiþý¦ù÷›æ?Ü4ÿá¦ù¯›æ?mšÿ|Óü·›æ?¬šÿ²iþÝ®úw7Ý\uÿ]èªÿ+~Ò®úO7Õº©þ˦úw‹îßÝTÿqWý·Uõ_6ͺiþÓMó_fÍ?NýYùŸnºÿ²ëþ˦û›î¿Þtÿe×ýçMõï7Õÿ¿ZI`œ€ÿ•3g€4o•Ë;ª>]Pž|Ëû#œYû_~ ‡ŸCÚÿÆmؾ °|¦>*±Ÿ_Kôò9s‘Ü€+æ&È‹‰: «q`g“÷¬zå¡5ø¤ú_~p{~Ðß1À×þ%ôO fFQ›7ý”’r÷V*5)k…wa3‘¶"±Xl+ôl²O?EÜí4¿Ïãïóøû<þ>¿Ïãïóøû<þ>¿Ïãïó/ùûÀd"¤¹ ѲaU¡BÈòG@”*òþãÆàu §!ï?«Äÿâ³ÓÜ*":ù°b²#<Ή‘µö†¨=ÍM¿@RýJ÷wkC%VÙêr¤!×–:òÛÌ;ZTÏ‘Yë¿þb¡à?ŒaÐß5Bû—Ð?0 ¢b—¾)³ Þ9eú'ÕÀ[;Àà F}ƒÊ©cÿra~‘†/òdöy2û<™}žÌ>OfŸ'³Ï“ÙçÉìódöy2ûüÉÌ>‚™tÕ™`hNM©Ã9½y*ûÍuÇ”ÿÂäQÕ»LLÞ6:ve ¢ö8¨±¼ Lðìžåº˜w‡VÉó0‚cíù„§¦dFñÒßO¿0š;…}  øLßû—(Þ+¹(|=â oÀ±Â-n|œ0pcÂR½V†«Z¥V¡Ñ%Þ Ý§Æ?0þñŒ`üãÿÀøÆ?0þÂø4¦/HiwÅÏž Ç')ð4þ‘!bæbmTp.½Ô=ÓYq üCŽ:Þ:g(ëppªÁU¥Ž÷ˆm9}üÁ4úÞŠv­øÊ·¹ü`{Ú¨+ÕoáUQ×õŠºöÚ•ƒóC¿ ê9¬Á"P½‚<“:§ \Àð 5ÃÞƒ8±·û Îã‚ó¸à<.8 Îã‚ó¸à<.8 Îã‚ó/¹àd!͇:Õ( JŸ¯¥@%·åè‰@Ⱥ`ͬ:,–eRÔâçBÍØö‘a¸LøÜ‹i)s&¶ ñÒ¡æ`.OœO®ôLHÐq£°a8þ8a8ÞþŽOЭž?Âê}Ù#¸<"éyü0gÁa§‰½¼ó,-æ{°ÍŸ¡ÓvNS‘CÅ†Ö†Ì O íH»aù'ö ¤}iŸ@Ú'ö ¤}iŸ@Ú?H;g$ o^€´CV'ÈÊM–…àøÇþ@)¨š¹?Î…¥ñ‘J¶¨àáf~ú ºa¸Té³_»!ÇZ‘NØÜ5ið±#?¡ùí7 ór7$/ÏÈ^óè¯ÔÆ'ÕºJ‰iôë•"ÊÞ×E­qdüÃŒx`Ý–#l} 70¦ôðCÍãPó8Ô<5CÍãPó8Ô<5CÍãPó'jÒ„6Þ±ˆzAÕ,¨J\˜+}OÎév‘[âÀÂr`ò|]‡”—Yú˜b¯Ò¾ú¨Cç¡%"VBÏD})‡ÝA%¥sÜ >PAqÏiÉüšã7 ûßÍ 'Ÿ”¹sdµILô{ôË2„Û[€ «ã[Ø”û¿iŒL¤Ì,Ókk§6(Âÿ@øÂ?þð„ üáÿ@ø?á;ÒLîµ"QO¨ ŸxVû"¯Ò?GÎýŸøóEá’£“ItJeyî}äÂd™8Ñ£]`cê{ÊDý^)ql©—âUS–¸Ö–g|Msì‹ìÆX•GÑ­„Ï6{ν3\CZ¯§Ò j…ve+›¥j¼¼`º½°®Ôë=i™IÎ%|©óÿ=)žŸš…µÌ‰(ÊÁs*“õ;ËøØhƒðQŽ `> Lô“P§&„þÞ‡ …™wncsõqL¼oCØÄY)Ö_ìö$åœ_ªK9ÙxΉ>/:H9þlqXç;–yœ¯ Ó¦+´Óx×S æÈmwõlþ4µÁlúH9”óH9”óH9”óH9”óH9”ó¥ÃS@šXà‘¥Ì²2yºÂRY†U¹Â]¥ŠÞayœGÖJ†ß,¦þ7KBÈS üz E1PH2°m0žB  *Àm)âî`$C¢”dy<‹m[wçÇ)¤òt:xŒŸ/•¥{þòÀkg&Þ±o‰—°]Ã…§3¿KJðÍ †$]†Zd^®ƒ‹þü…£ s²o<°,Ÿ^!Óªyúj;Ûrs,eèjëù; ”áÜÈ,‘l‹eÿ«ƒ˜À™Ë±qOcTXoØ(@X;1øZ5y{EøæãˆMôé ðŠB U¯TJðž?Ü’69­ƒçL{Ðõ¹Kà#¬Òn|T™Y¾¦:SÝ!2Ý÷^×Ó=êúƒÛóû’½ŽËÂÔËŠb˜ìeÂ+– zηVè‡k\>îBS‡¤¯Ä 'r9/zsÌ·-váë‰Ù~b¶_OÌö³ýÄl?1ÛOÌö³ýÄl?1Ûÿÿc¶'¤Ù‹GQ'¨êUU*™™I!o!ßjâq¾y.´•à— µ¢ ³#÷ D ûäZÇÚeöÿ¼ªåOÂE•prØn@´¡Ýp‘m¬C[]œþFYè\f˜m*aB6©ó³ÚQd÷…vy£ §AIrW¥íz/êøßRBÓvk‰ Y[¤aò•§"ÏÍOàÓ̶ßÉtEÀ·SÚÄ£M6ò›läwÙÈ·›pä7áh“n¢Q¾‰FnÜ&¹›hän¢QÚD£º‰Få&Å›h´IFy•ŒÂM2ò«d(êÌÂQÜ„£|ŽnYÂ}‘Žì&ÜÄ£¼‰G~Â.Õ»|Ô³tù(nòQ½ÉG÷Lay“Â&…›|”nòQZå#z‰_R¼ Hé& ùM@Úä£|“êM>r›|ä7ù¨Üä#“Â&…M> 7ù(Þ䣰ÉG~“ò.APY$¤Ëš$$·IHñ&!Å›„TnR¼IHu“ÒÜf,î*$Q&Z¤¤ºIIu“’â.%ù›”´ Ie’6©Þ„$ß6)©lRRݤ¤›ˆTVéh«Œt‘ò&"mòÑ&¹›xänâQÞÄ£°‰Gñ&•›xäVñ(­âôº³|ÛM@ò›€´' K7)ìR¸ Há& ¥U@²Kl–êMBò»„T6 ©nR¸IHá&!¥IB‚÷Ø*$Õ›”v!)mB’Û„¤|’ÒMHª›´ÉHñ&#åUFŠ›ŒTv —±l# ¯Rfy=Û:AhU¸P¹#ôÎtUƒPLO|)Þ‘‡@•·™0iÅ¥Ô*13•¡ò£ µ°—r£ÕâHÊdoˆÈE»ÛBÅcÊxcÒÏE¤…›Ã]S|÷,ƒÙUn$ç‚I+’N¼Êj†§è‚#4ÒoËÚ÷è+;#"…ù´.ÒÔ®¬¿x¤'ãõ¼+ôç…VáŸ÷Üg 0Yq£°!¡"Ž“€|"LŒÀÏ!ÈÁí ›ÌÓ€oãÑ·Ýx‡mw~+jŒÎBÜg›¥ow}ŽÂAÍÊÓ/Pö}£° !™âÜÓ”)°¡‹6´3™¢ÆDÛ‡ÑÈYƒsÁ96Týcÿ*Ã[ÎÜð •|ûNÚÀ‘Å'mkÿVí_7öo7ŒíZ³”ulଠ<öoÕþÍÚ¿ÚÀ§m˜^#uìßÄý[ß¿*l “IF¤ ·¯voÖî›7cóŽ[¹s_ž²ÔGuÚ¼nlÞÊÍËs¿“só&mÞ(¥@ÕîmÚ½Ã΃Q™·N»7Ëë&Umß íë´}ËlùÁöm—mÛ·¬¶£x)N7BûÚ?KA¡sn‘Ù·^è ÔåcSaÈ@f œ„†q`4îÞê„bj'Q‘Pãœ=Ï5«nˆX5¦F±±Ñ1Ñ‚Îp€ó7‡¼×F‡#G™c y¶K€AóÊGîûýV'ÙئÄQvö!²ëM¹®©ú«©DrQÚŽ#³~¬½‰×dHìFL¤îvMå#r?"÷#r?"÷#r?"÷#rÿ"w¦o’- )9,Ì™ñ™þ¦p!4Ú|ÏTe\%®ùD××èÀФ‚(¿Yn¬ Müdd5Ë´(ñÔÁÍj¹ƒíº‡2l?¸؇ èÏç]"пBø7±'Ìte0¹Ež8¡>pý)\‡Ã{-„ç¥Ðˆ”¼."qÚ‰µýË^jsד+Ô@q á˜+ÜG–?z¼z4›•MýèrÂ6µMI×–eHà×ø”qùXÛ9æc`8“L\¬½T·”ThlPܧ¾{ ”JO»#Ó%á<{P êºôû«cnÊ47Á}îO»ÇÓîñ´»ôÇÓîñ´{<íO»æiw¤d‰‚ V-‹+B|NÐ]<¹òÈcûM혰Œ¶&U%rµÅ`:¢Ãª‚`u‡Ð5â½Ö"’®ÞÚŽ•Õ}ëü0þñƒÿ¯½¯m¶ä¶Íü~Å­T¥*›*]7ßÉÞ××z[JòYÉ{Ï%’#oþ}øàK“Ýçô93š‘:UÎè಻ @ÈûcøŠ8b¨„Ä‘·qÄð<Þ¯»÷‹õmÃë›.ë9¾í#Ë…¬{¼;­ïOÐúFágr–GÐÔ¤ÑäL¡RÒD{Š1 qDZLqÜMX©œÇ·Àp_ˆ‘"WQsd+‰%Ù½²¬É‹=X±Ï§{Z±§{Z±§{Z±§»²b×@¢úÃ--Eå‚*ýuQ‹Šä+­†Öü€7üY ¥ Óo‰ã%¹V(%+Wƒ`èi÷D&gàÆÜVI¤Û¥(W\9<†ß‘Ò>ÒŽ‘ڼƆGÞô¥— D‰9(þq)ZŒÏn0dñ“ãÄ æDLªfתrç•,ÈPozÀÂFäMä6èAê±"Ã=ñoòBòÅ1mƒ›.~„áâ‡ZÝü(VksdÚñâGZ_üý7ÝûpÓ½Ðßû`ó®·\§›a¼ù†›f¸ù§›a¼ùᇋúq}ñc•@ö\\_ü’ bQ{¦˜­4«È¹D”aH¾'õ󎰜)µ¤´E®S ÅyYy¥"çÏ!N62ÜK‡ ëE ­xưø´TOKõ´TOKõ´TOKõçe©&ÇU– Ž"ˆâÒU¶$(yÞ§^{êã•éç¹ ÁŸŠ!¨Ø5›‰O†JŒ|4X"gç¢ y+M½IB¹úF®žDÖeÉqz°8“I\ÛT—Gä·~\eŒ“{¿ñ3Ö$szÔ‚Ö[1 Áx¼ä§Ëó4$OCò4$OCò4$†dPœ“š'¼ˆvLjé7¤,ÿ^ä‰À•Hù !=a<ÿ†‡Œ-/äÄmç[¦^heÉɬæyŽŠ+€£Ñ©çŒßÀE¥“§Â‘ÔN `ä:«÷bA°×UÄ ÙTG±m|+L±au:sÕê$ËWq «Óêüè­Nª³™Il©¦‹¢O¤EX( é$M~ö6’‘@7g¹¿n^>ÇW¹fs¶ —Bq\—”ÔæEqš«¬HsZ‘§yZ‘§yZ‘§ùÉY‘Yz° ¤Ú…÷ì0Ñ,ˆ.ŒÕWç±DœÒü’®.¡`{\¬ti‰5h\îXñ½ ê†ÈŒbýÌ6]æ_êv°°«‘4¼ /&€ŸM:]ï)­ 42éÙ[1rš\’`§Ó»·5–ȸХ^¼Š^ •¸äÄÄL¹®¢WwW’PŠ‹ý<€ÓX·"2É´¦²€‰“9óoº†–‰oìÚ2Z®äkÅj”) ¿-ßI@M*éµ8¾q ${i’–¤Ð¥`—ôIÅF o°E0zäªõf£¿j½QÁµhø’1®'¿FK·Ó~»Ÿý¦ùöMÆË7Íó¬¢çÞƒy+P_œð$ÕÅ›Ò(É,kcèΊTíƒk¤N­x¥³Dw*UÜ Oî4ßNóí4ßNóí4ßNóíÇ6ß G Y˜DnsJzDJý§HëeöH\‰NÑ3_«RÒ(D¾`›…0éŒ(–—õêÔ+Ûx¤ë_Ê_êõóPd¤SÎõÑÍjÑáÀ[tiÔá¹éÚ©¹Ç³ŸÅÊ¢KÞî#so¢ÃÂDâJ•1Õ%ØКíf+3F¶l’T b 6…¼®qãUñàóbÃiþœæÏiþœæÏiþ¼_ó'£¤F9 8¥yšŽjÁ#QËWVdê$*ô†t2M¸óÝÓ%Ñ„­Äñ5-FK‚+áýÔ3våY4'í@™.\ºW·Ž rŸx2¹öÜHÚîZ>¢°QKê8Ç=m©Óòi–'«ª‡]ê’Ãåx’“*¾Ô©Nžm%x‰¤=”“ZxÜ…6qÈ6–"¦T.ëm¹áäÖ‚²÷ÈTâˆqK±3,f½âå¬qý$>À3ÿ´›N»é´›N»é´›îl7q},˜A\Þ!J!A:ÞjÈ‘—2)²]d¤KIZùÆ›5¥É| l—,Ôõ N'Ë-ˆ²u¬ZÅkЫc²Œ:umö,£¼£¯YFãMÙ0"]l9Yê´‹:»ˆÌ%’©žÄ§ÅAo®°4§î'Ž!Ôœ+qk"ú-%ƒ!4ñ›s›òž1rgÖÒuFM"vS±rÈ{$ÙPš•€(é>E5âlj™ê}‹ÛÓ0: £Ó0: £Ó0: £·5Œ‚|W ©¶®—Ȭõí¢«=³5W‹¶^NTR¸,x~¡¼ÁþÍâÏ¢4)¡NV(ã_¸–¸íèa4¡o[Qš5g¢;Š\®Ÿ”³tL‘=PÎÒŠ³Ì#7¿fíîX»ëýzYtׂ¼+ÃjÔIp.Dv19Õô{üi™B–›hÎ@Ýþò'¹*ï"UßÄŸ‡Ä+¶Æ ôç, ;fOTy6Ñq) n°Ö]³Jzr¶¸Ù«ã7¢evS«>º]&ϯL¼÷ÈÅBE©±ÑÆÖÛ§™qš§™qš§™ñ³53²¬¤RJ†iî,ï©à&Ót’,cK ç7 µ¬]]¦í\蕳Òñ(w‡FoáLÍÜ¿‚SŸ§„zžž" ZlŒ€@a1ŽÐ¨{Ãj2=Y±ö¢Hå=©r(Z¿g“èT³iºëMl’ÅFÁf„bë‚ndõw™ZCr—©5Ôy\÷Ó)w™Ô–Åt' sgcbs%“Žý5ŽëÂoŶæÂ@ÎrR _¬s‘å•"QŠÒþêÐK|ô `׀ʿÉ}DÖ•—ê-/ ¯ 3>uÿ©ûOÝêþS÷ÿøºßЮ']ÏíÀ›ü®7“1ãæöŽÛºd8çÐGrv;(9Ô¡•¶e½Gý¬ Ýé¥j'¤’X#Éq:Kõ:˰_,÷[îOЦéaoöõ°‘b8”3r~wQæüž4±âôN¾"c EH³æÅ¢¸GþM’m$g¥ƒ°3A9!UàKÝ&ò Úöš8¾L¨lå+VÅDëLã¨Y+êxQëا">ñ©ˆOE|*âCƒaBfUúûÒ>¦k´t×ÕÅk©Ô0C¶«þ 7?ËÛÎi—çK Î-ÎXª’rRÇÒÒS™+ÈÖS¢ÕȾÒbÚôzN±z°¨oÛiJQߦ¦ ¬µñ3ÌùPëä`nX-¢9lÜt$g„HÙ.‹T8f½—©N7)àj'û"Y"¨ÙWÍÝo=ŸýæA“Ĭ1%‚¡#û»±5Lürª×S½žêõT¯§z}Wõ5g¾-\Ë¢]fBüÌ›$BÏ)S<ʼnÄ>A°F´,ÿ†pÂo%¿µ°ÍçNöTôËK›£Ç—Ô¡SIÄ“4#yƒÑT‹f´¬rlcDÇÔÔxº-¤8³÷ÝòäÅ(çÚ¬ö£zä¡b´à6ìOú$ >*í™Þ؉¸X0)M)3›Á¢¿â'¨€™•y(b;jDi!IA ¥m«Æ_¸ÅzDâuîIÙ©;+}ÃH KuÝ–¸p¾éã<í…Åæ­î0©$=×=ÿ!³3S/€V`4øä1'àí*ÞBœÌbDœüo!ŽŽ|¿68"”í,æxh'ÜÈ]œ’Ï$2™@ ω”ŸÉÈ+Öc¨(D¨ãC¤æ_ùV"Ȫ$‚'îá…êo@†ÜjV¶L=/"M=ÿËSwÄâ N11I—8[Z̼†!Tj:%Ñ>ŠzÇ‚<%]êFÃÚ&(®È ¿!ó|JÌóD_ ô@Tc’–°I‚ð¦`2%!SÙ­}"¥J¤[@I•¸Yd›Öð´oÀð@ÂK“3t‚FÀ‘ 1Ià"ƒÈp<Ñ,½÷B”¦f-Ä3ÄU°\ íHZS2ÌeIzë%RQ´µI|døR$§àPYFÁS$6Êi¡ï%;9.B­Ä¼h)ù·ååP‚kzÒl/°À¶²õ‹0¾<‹±ªf– B†$¤43 -R€÷8XÄ)š&òî‹ÄöI–ŸÎaDK[‰ŽB„".X¿€Qºd’]ò¿ÌŠ¥S¤ËYÏ|H¡ |â…à$j³MK¿q"^|({ çW¦‹å­Á;ÇòÎRNÆ[1 éÐc˜õù¼›Hëç½F™QÐ|üÄÂj‰„ ""58O–™ŠD*(`x©n +žó½°ÛH¦R¡ô›zí+›I09!70¾S8I­d:ÅšÆOò3¯‡7< ÒÆÑsR5L~%²/Š |_È&á#5¨ê¶6jWMб¢´üM²2úÕ«;<Ó–8ÿËK¼ð‹„’,1/©&“G–Òè›É²ŒhåË- |F ½™Ùµ,¼gEºÕk±7A Y*› ó~às<-Odò«JͤDKzAÝóˆ¸t yÅÉŽ‹er›.N68…½G¬ i„û]ªR´@ «®ÏL,2<7€më™XÔ,,4pc´*MÚ.ž @æUQ,Z•v©÷•q"+f$€Ff%¼¨é·œSBKìtü΀"±ô“6z¦ Ý0I”ßÉ´ªÄ±L-e‹b43›ðœì“hiÙ‘ð9~€‰ÙÒävC#„˜Aø,Ÿ-ÔD ŽøBWa‚n|#®üf‘§„ Èj³LoYk²P¶¬$o[ŠXXÇáÞŠfT©#¬.ÙR²ó ëãädå/ZaEö¹xâ\F˜þîá?´s–;Åk¶ÏnÅu?²Ó8’PoxK‘4õ0õM)°t8§Ó¤N‰Q°'y§sÂBÀÉŒœ|‘ˆvè)Ñ7yUý‹—k(ÿ»à¢Ã>D”3ìF¤›-?<¬"WÒ´V%©e’©‡'8Ò)eÄ‘pÿ§DO}. ÊÁ¶@\þ¢Egƒ(¬p`¶‹‰’ÍC©KÖhÅμ2OÁzÐG*×c=ÎQ8þjì÷üFgI¼:ïÉ-qyиڎY6Ȱ8—‡{|ó ¿ÉÿûS&«¢(xÅ3_eorMþ4L["çEiœ5jíP%gKîÄËð¸p^ç¹xònQá<õ©)U£PmhzLO¯f”Ö¯¡W¯_”ßœ2)‰—-òócô'Å'pòmÍ/šæóúA6>v±×Ó‹ž·(»šµž>F~–þ=Ljãó¶!™¡ksÏâ…Ž|2&*Ü’SÎI2»$Šqjº´,RW ê%¨T ¯*Õ‡•ö0Éunt’G¸aHE0‰Ó"É£Õ¤ .^S¤~¾XNq¡mkÄ(‘WHÒðºÒå1ô ” E6FòwåwêøèYt{½ˆ­ì¨¼‡Wð½áç6¸A¨dyþW«‚‡ðqüÞæ Vijkâªü¤–,%ˆ.H\yÌ¿(GÁ-Z-KöB<ìâÀOì|϶"e¶&øúa¤ü3‡ù¸ò»b·!ú¹SðË0Çð™Û!ÈÃQôÏðì.ä(D?oÚ”n@\iÄ”Â+|ii`‚:4yãñŠÈˆŠ” +!Ò×t¢¶ â Wd,>sl0IÄ‹{–ȕ؞Þ1ˆ¹ç‡b½Q\ÊK0½Ã²`|Ç%XÉÝxCîzY³õ o•´' ±ÍulÞ]óA"zÑT–îH=óÍh:™hrRg ¸ƒ”åRŒÁ%îÙÁŒÿêaÔ*Ï\‘™kKÖ‡ä–4”qæaM¸-d¥ò,%|(b"Eþ ɽÂñ(m½c-£ 1¸'Hž)뛨ÖtÖ)–¦WŒ«B«¦ÛªÍ¶ÃJo jKÏrw’ŽÀ!@ÿøDТø$¹?o<Èë8?– ÿZàqáˆ,QÜRqLÇ¡ÏĆWCs@ÛÄ%¾¹è¸MšCØ “"7öZßîmÂ噃W¤¿F"y&ÎËM;6ÖjX «]·Nï¢l^?¬HÆ2;3¹8„§‘È>7”v`U£Ä#3ÓÇzv5)”Z ˆLj‰™BOèª'vÞa)V™JpÓ±ZHÔ³× „¨ˆm?ìÿQ>¬>Èi.ý2 E~0^¦ØNKæÁ¨DF%³š•-ÔNÔ»F+>3ÓeJŒttבâ”R„YâX‘8~‡}`{Q+¾ë_0uÄÊ,çU•óâpîd0íªÄ×-À4(˜€\“M Dä-Ù#œÊªù,-M}¶çTV¤[”¡–I©-û‡•” õÅÏÄñAÜçìã~”´ sÆ)ˆNeKäŒçž„´'y×Á6•ö˜p%Ú¼ypÆ"¦ ÁlŒ|P7„ºº—±~ÆEv"á|8À$l¿¨P'‡ôSB¢…Zq±‡xfa"@2“EΡ1š÷~"ç%šPø‘Å'èâ·ò4‚³Y(%ƒyŒ;4RÌ$/„a²ZGkæ m?'k&Q@Î:M­¬¨8G>÷X¤cQ”E %,’ÀÈ,ǧü„…w V;’­–æòŠë…䔳¢×ð×X„>¨¯{"Z[xEY£Ž¹Ø.r*GÎu~£Bê5~*² G$°uƯfÄÞ°rùKã°ŸQq‹àa<Ü×á‘¿#—ÒÈ}d¿ñ•#3Pd JO³¬fªæÙ(ò?.jçC‰d4mŒîÇ 'þU ev'LV&5³ |KçÏGjޙɹyðÍ+MÇ€™zäÉ‚ R²mÞ”´GU l>žF’i°<2ßæô‰L冋°´XÚ ,;–Î_²Ù˜Mœþ—ìDM¯\¯ñz{̇aCäšÇçä`vfrž…/eÞÀ:ÏK„¬¬'zñŠ…Ê8¯6Wçƒí†áC_z¹¨Á~£œBd9mGÁØÅkpisw.\([j“·7ÆpX™(ç#ý¦:T‰*SÜA˜~BŽÃÓñ÷c8þN·ÝqÛ.·ër;=fŸ¤Ç ¸ÐÁœŽÂ¤¬Xê!͇ÊR?º=â-‹K¢¤¤FœN·êtëéO¤B{d]jf@p.+ªxxÏ—Ž(Ÿ;Ræõé·û ~»žè}n …˜•UœDï '!ó#ð½-Ú†CNßß÷ýõ `XIÇæD‰j^¼bH:Q% 0‰ì4³ûÐ9¾®ç× ámž×°˜èJØÆKÒì¡î˜NÒS¥-‘å|c•…,j4¾ŸY3•ŒdÜÄ‚<ˆ”e‰+\Ô3ÂKû¾F²5ÊÅʽ#±„°*nöËÜT`\Òag í6ìjΞ¦¦d*çw!á·žÈ_ä¨ ‹÷”vìÛ°8ŠsueÐ ( —rUM²¶£\gcÆÃí<2ZB»‚Ø‘úÕ”k3&¤˜£i4SÎ2à2â)£õ×ûøÛõø›ü¿??àåòøû_Ÿ‰GgâÑ™xtúÎÄ£ŸŠãL<úô¼ gâÑÏÓrú@ÎÄ£Ÿ–ãt>œ‰GgâÑ™xt&‰GgâÑ™xt&‰Ggâѧìø;ÝvgâÑOÐåvzÌ>IÙ™xô©9ÝÎÄ£OÁow&}r¾¿3ñèL<úh^?|N%©eôüà¨JhÊÿ}©ÿíW½ä1í¿_SU$Øêñ×òï7ÿñˆ–ÿ²–úÿ~õüø?¿xøÅïQïZ"‹¢/þø€’_Ÿáÿ¡Â±Ë¤%OqFë‹ç‡¿ûåÿøâÏ0÷Qqyü⫇¿ûg¡+U–ßý~~ðŸÊ«—,ˆô¯óƒ¿šAÿЯ¾xüdb}Çe 4 ²esnòÚjØÞYÃÃi–2Šß}ý‘òfÛ08Hfl4è"õˆÚt)3 Z@½c”˯G ÜĄßÔ#Ü ZSaå¼m;ºä ÅXü øfb¥Èw¡WlÞ¾ú ¼ý3?ôÿ}½. ¬€þP6ã²ð/Ô}EÏ ÏÖû¯¿Ì£hñP?ù2û¯Ûƒv^}=ú¾}Ñî¿þMñ<ø~½Î+™öêFù8j©Äùvç‹ù•ù*Œ£Ú$þ8?øóßÌóúa&ôq6Høý΃<Õ2 ÚKpXeu8¯cy×oùÁ,Õ*þŸò®P&ÿ/óúo,öµÕhäú;“§Í”÷XJzÜM‹¥öTPO¼›þ¿vñV™~ä}ŸmÕ<ƒ|ò©_˃ßÔQU }Í”[»Æ n{›†ú4=V¹åÍ4æ?'È3ã’íŽú±?l¿zùŽÉ¨Œ eFÄÔ¨j“î'°Æä;Æ$$ç·W|Õp1/˜Õ¥N¡²À·mPyÓ_™LŠ•*}³¡Ò?Hs¯üûåôÁ¯&ÈŸg*ÌDÿž!*[«¬ýqZóo÷—A‡ý)Íýµ0p>"N¬Y÷E¥&J€¯ #Q:žþêв9¿«csÓ/2q‚ó2˜aö# ­°þÅ5‚𙢅43çÍŒðf~ÓWóœ*Ým}ùŸ‘Ç3E_°ýŸªUÛ >/C,Zòý"°Ã .° õõ™ ÉÝßg“î ·!;:Å£6²Ãa’S­&‰^‚ðH´Ijê4¯ºYVHT}ê-¦¹)âj÷³übnD܆É[5M m²¤¦7Õ—ÿûöË÷dò™5zs€u¿/JÙVÙ¾³ŸÖ"dÿk òÍôýýµ!,¾nÏ™—¬Á† mj°ê í»FïËiê4ø~SŠ*^‘†?\[ªpeÕçuøf‚lêo˜0Fùj‚¾*SˆuÔNþažú†íó÷+™ñv‡Ò·–`èi–L:Ÿ­Þµþþ7‘R=-ÎMùÛy£ÿibƒ7byºGàòßÎïÉÆf>´ç“a^›f  ãw>0öÛÈ=Á×µâF¤W%WHüK¦§U«Ë,â¢âêÜG™>Y:á¿b$‚ÖA/ôUÿßéÿÏP^å?Cáj“ø•¦LÛTó^7L èoeF.fIÖ?~uFÓ„Ú»ùÛ3ò ”ú$¿<—_ˆÊÛy14V¶®›f© W¸á©™œý èdíV2~µýì´‹Ò¶)°b´ù=zµ«Úýzó¨©:œI .²r©,V¨Øú¥>Õ ïh0 =Ç>8°C»mù0»Ó0@ÖˆÅî7ÔËÓñóÚª#kk¬­šÖÖXÛyŒY¯-Ò·h•ÐŒ)uk[ ýÚ.RŸ*w^[C½„:bÎø(V[¥'\ºÄ í¼ÜéÈrÇy¹çmª§åž7î €ñÛË“–[ Ýr#Ú¾^î ¹×rwÔÔçzScÝõ>´½Ó¼ÞaB6Xï-qMtו[â¸Þ éÖ;p†R·Þr¯õî¨in¬·ò–¼áÝÔƒ =äÒ mêå©»M}t²ÅÓO}^‡y'~ ̫Р†ÌŠÜkÑp‹yõ̼~B6`ÞY4f^äÙxÕ3¯@:æ•uBîļ=5w™™·M½±j™h´©—§î6uaÞ~ê;ÖÞÇǼ¸iv™÷äÝдnB6`Þ™D³wÛÌë˜W 󢯰7=óVȽ˜·£æL‚‘yµb6¬S¯¬Z§^ mêå©»MÁìÌ´ýÔ›œ ûRdçðÔðC:/ZqUü4zN¢ÉjůB~å©{ᇞîF­ÐÛ?ѽLÖ®ñÕʇ»Œ¯AÖ„ëñ-Š]}ênøúåI¡•æ6ÂÅ]òv¦ðG!±%Ü`ÍnØ·Ž‚ènk,~Þ®³4š ’¶¥‘ô³ê¤‘@:i„̬µ4ª{I£ŽR³5±#ÚÔ«ì©S/6õòÔݦ^¤Q7u7K£Y-Ü”F‰U ¿&{ ~Òð+OÝ ?$ަ´Bo'Ç®I‘Š]•4»©¸Ô§î†]‘=z²gÆÏ|*²™[ÊïÉwDöøÙZz;õ3o‚b·å“u~Oéä“ ~Or/ùÔQsžúŽ|jS¯Ò¨N½@ÚÔËSw›z‘OÝÔí,ŸÞÂZª’¦àפQÁ¯B~å©{áWäS‡Þ¬9fUyS>!ý½Ã¥“O »©¸Ô§î†ºÇxƒñ®8ówÐû‘„‘CNð®02G„цO|Ç—}CͦA¸–³,4ÛAa"š|xJñ æNˆ¤"JH}ª@Þu'ºø²u»M…}‰¸#V2Eˆ4d*¤"SŸº2E¬l"Þ^MVQñ«B¤â× ¿úÔð+b¥Co'dûvb¥aW„HîB .í©{aWÄÊUô>±¢‘L½'U9ž7Lœ™s~ÙÛÅyGçt‘3¸Õ¼–N 餮ûÐK§ ¹—tÚ"æl.ÞN—*Š*.Òp)OÝ —"œ¶p©²iv —M½&‰ zÒÐ+OÝ ½"›v³çö|A ¹*ˆ*rRQ©OÝ ¹"š®a÷Éœ¾”EŠÉŽH&sD2‰Î{wÇ74K¦%3°ï3_ ¤I¦d<ÝÔK$”ɇŸ¥>êâþ1•4Ò¨Ù–ÿxuRtP %ŒR>%›'èæ2x=(¦p`Ð’n ll\ä¹=ÈYGw&¯².Ü„7i”s7©d ZÜíAèŸÕÄÕA E%2‡\¹.áæ*†h4± Ê@ø+NãT<Æ vÔó8&á®Jåc\A6`MÈ×"/ryæ ȃ,¯Ø<eÍË áp”ÓÄÖ-óU&sWZ3øÕ1ÆR/‚« ‹büpÆMkE;¤ ^l*ÔÖ&›KäáŠ(œ¿=fÀ Ûc¨ä¤©Û2æJÚK[ɶ¼1ˆ·åõA²-¯’my}lËëƒd[^$Ûòú Ù–×ɶ¼1ˆ·åõA²-¯*Ûòê Ù–Ûc„Q*ïn0J×®…8q*¦Î*rßZZT!O–Yýs©Sã¸æ êøZʇ±ž*¦È¥‡†tO D”i7è¦#o_ÏÃ.™¡¬êFÈ¥‡h†tO äú<®½}˜*6R-ñ:R —²0¤{J 7æqåíà å)ÌC¡‰P~6e‘ÞT!~±#Cų7 òÔMŒPù“jºVŒòÉb”´¼½b$‚Q:ÙrU<²Cb(Ù€”§ÞF(“,#ôB 5¯c6ü;’{8Û,Ô2B”ªMN¾}¾"åoVäÌ h¦e÷¼ÈŸ?\¢@ë ÝUÅë(pûQMøâp5ªŠ¦QX­FUÁ1Š’Õ¨º­Ç¾U·Ê¸yV£*û I£ê<÷[§Ñ«ŽrqŸªÔ´(ô£¤RT;:t£¤% €ºQÒBEøõ¨ éF™D ‡Ý¨ éF¡ÑzT…t£PöšÅÔQÒ ð ®FUH7 ­cP§¿ªn5–Yª6JSW’žª ÒÒÚ£*¤e,×Ín£*¤Uù¤ŽÚàœA`/̉ ÷Ìѧ\ — ±>-ÌÁ•[+dG(ý™OóäUøý¯»¯e”¿&\˜ß´R$o'šn|~üXco늼ý|‚5ö¶ï"FXco«Ñ„=­6A5ö¶oO«MP`½­ÊzD„ÙkìmÑ «Œ`½í’5H5À{÷âs„5ö¶Ëâë¨Ö±w¶â˨Ö±wòmÔëØ;Y×ÛÖî”z'÷=äÒAPU_²àÕrŒqÇYt mµ»y)¬Žw*Ì<°‚\*Ä¢7 1}yªA®ÎkyR¨žÊ™Õ˜_áF‡[jôW9o°Ðî¹±æi íØ½Ó¤#¬g÷hgvv`÷žEX'Í“5eaFX'Íc–`eÔë¤ylÌ7Â:v*•Q#¬cwÝ/£XÇîÁo³;\½…}éØ=Ø‘Ý+äel5Φcû`WlW¶zT¼ë*£¤èe/¦°ÉWy=À:FAÿ—Ât¬“‹ˆ,rQ`½\ì$Þë¥gºÖ3JÚ`”42JgŽQÐú¶—?¨)îM/œ =äR!ý°XþÈS rˆQò)EØ¥[-FZ-Z¾g´žÉðáŽ#L\&ŽXÇziz~€õ‘uúÄ ë9"ÆQSX¯)M]ktj8$õOAe}´*,Ÿù1¢k>4*I$¢ÈÙgèb„ œ(ê¢jqÎüôËëÃlŸ”dÁöÀàúfÿ’Áqo0zÒ¡B7 NªÅ¥7„dŒáù ¨\\Ccãy}àù:Y5Þ£ ·ÒÀò,u­>+ÿ±<¦ð¤£Šy­Ð‘Èvk…ùýy4ÚÃØäÚ—ëŸúy®Æ[-%Hõ±ñùý]ÉÒã©mJAûïwGç ½`:á…Ó‰/$gÚ¯žò.Viýú~µT?üÝ^±Ï«WdºûŠ}¾è_»»¯Øg•óØånÝ3‹6*í‘ÐjØùvé?pâ@tª$|Y·gí,ò_3¨–9nÕy7”^ ºÕëýËùz~ì;ž”Í{» +Å÷Õb+èÛjÅ—ÿʳÒù¬¸ê°²U(„4½ËÖQ_çõU¥î¾LB/7´çrH†’öHÿÈ+¥£ zUcZ7¨Zú‡º¢¾'A¬5=u ou¬Å–¿ß{2f½¸jxÁŸ¬˜¿ß`¬/7>úM{6¬zöHÃ¥oàŠµâŠu0"Qà*Y48 O)L¡¨ÑsëÑÎR+MþùÊ`‘c¤ŠZ\ÀZ¼- ÝR €Ã­š6vJfOîц-á?Ï,ùÝÄÊßάüMéù93òZõ̬œ÷k}}…õllžÕ´¾¯ë47 9£YÄÎ+äÈ»ÚS…”ýØtëãÀ[RíãñŠAhoW@¯çQofTú·IUŽîÞµ!æ É/óÿ  lÏ[]KèWúÖöAÝË ¿Ì"¦C1NKüVõ WÖH<ÝU_Ç}Ö'Y£ßÍ’ô—­ eší?C?MÜkšhç¨ÙÚû§yšéíÌ7zŸá¾ëð{YÄ\»è%zEƒ2â ZcæAzV×hBç¨yäC¨E—l4òÈ¥‡ˆ {*ì‡ÕÛ‰îÈW†ù$'Ç©:R —"‡µî©°^ߘϕ¯¬çcÕ2Œ,KæÓ Çæsí+Ã|ÐÂ’Ž®u¤@.=DœÖÝSa?ܾ1Ÿ+_æc—q¤@.=dœO…œÏ•¯ óqÜŽ¶)K)‰í©°Ÿ°1Ÿ+_YÏÇ!‹ƒÒ…÷ÐÚ“¢6•÷&Hy ó)î W8½©B\ifÑž4Sc"OÆ ýmI´WÌòÉc†6·kÌ2cŒ{iU =‹¤7tO…—ÌçÚWd>"Ìó©X\¦x—äKý‰Ã¤<õ(½Ÿ®Ð±Bät…lSSºBFñ½¤+Ìäç@>ןk(¾:ªª«Q­FU%2ª•~Tí£°_ªwÁ«QU Ž‚q5ª §Q\­FÕ>nýÕ¨ºiÆmÔšiß³òHéç^ÅÄÉ<Št4,wÕ«¤t|„—RÂb¿l,:…-[¬q#HYC™K-$ñ}‹Šêý¯Ä˜+ÐÔ]Á…¹p&–Š¿mñsß3 gt\A®#Am„7‚ÌÝ–,£ZtºNb#À[ ôH Ü@hêc§Œ†•œÙˆ‰¯ñÜ@½cˆpˆŒ±UÚñz"ãzáöƒÑ•¤ÞHFs%©@îFÒ|ˆŽRŠmN¦ÚPofÐ5ò©õ[sa{p˜5Ê®ƒêß=ü7͇ƒ#endstream endobj 84 0 obj 93459 endobj 4 0 obj <> /Annots[13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R]/Contents 30 0 R >> endobj 7 0 obj <> /Annots[43 0 R]/Contents 47 0 R >> endobj 9 0 obj <> /Contents 62 0 R >> endobj 73 0 obj <> /Contents 74 0 R >> endobj 11 0 obj <> /Contents 83 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 7 0 R 9 0 R 73 0 R 11 0 R ] /Count 5 /Rotate 0>> endobj 5 0 obj << /Count 4 /First 6 0 R /Last 12 0 R >> endobj 1 0 obj <> endobj 6 0 obj << /Title(Introduction to the Pdf995 Suite) /Dest [4 0 R /FitH] /Parent 5 0 R /Next 8 0 R >> endobj 10 0 obj << /Title(Hierarchical bookmark to Stamped Document) /Dest [9 0 R /FitH] /Parent 8 0 R >> endobj 8 0 obj << /Title(Sample Word document with links) /Dest [7 0 R /FitH] /Count 1 /Parent 5 0 R /Prev 6 0 R /Next 12 0 R /First 10 0 R /Last 10 0 R >> endobj 13 0 obj <> /Subtype/Link>>endobj 14 0 obj <> /Subtype/Link>>endobj 15 0 obj <> /Subtype/Link>>endobj 16 0 obj <> /Subtype/Link>>endobj 17 0 obj <> /Subtype/Link>>endobj 18 0 obj <> /Subtype/Link>>endobj 19 0 obj <> /Subtype/Link>>endobj 20 0 obj <> /Subtype/Link>>endobj 21 0 obj <> /Subtype/Link>>endobj 22 0 obj <> /Subtype/Link>>endobj 23 0 obj <> /Subtype/Link>>endobj 24 0 obj <> /Subtype/Link>>endobj 25 0 obj <> /Subtype/Link>>endobj 26 0 obj <> /Subtype/Link>>endobj 29 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 28 0 obj <>stream xœkhÙDÀ€ endstream endobj 27 0 obj <>stream xœc`Ù endstream endobj 43 0 obj <> /Subtype/Link>>endobj 46 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 45 0 obj <>stream xœkhÙDÀ€ endstream endobj 44 0 obj <>stream xœc`Ù endstream endobj 61 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 60 0 obj <>stream xœkhÙDÀ€ endstream endobj 59 0 obj <>stream xœc`Ù endstream endobj 72 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 71 0 obj <>stream xœkhÙDÀ€ endstream endobj 70 0 obj <>stream xœc`Ù endstream endobj 82 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 81 0 obj <>stream xœkhÙDÀ€ endstream endobj 80 0 obj <>stream xœc`Ù endstream endobj 55 0 obj <> endobj 54 0 obj <>stream xœUyXSWžk;ÆTRÛ¼7ÖªPÔÚÅeêTE­‚¢h%—ÉfBBÈB6^r“HX”=ÙDW\PÑ:µZꂊíWµ¶êt:íÔç>}ýfæ¢3í|ßü7ßûç¾{Î=Ëïœó;lTÆápƧ/ÏHZµ(.M®¤to,Õ‹òœ‘û8f"‡y)Šy9š}mzìy<û2¶¢~ô³Œh V÷Ò˜9ãMùõ£¨ç˜??ÿÔR€ÓÍ9…MNO];%..~¡ZcÒÊe¹zrÆìÙ³Élùo ™Héä29  ”B­QR*}¹š¢H}.EJå Š\¸*yÝÒ¤%ää%IéäJEiÅ 29?ÅF®çP*5…”ªµ¤â陣VIäz¹Z¥K çëH1©ÓP9rôˆ2æPšA<©¡´J¹N‡Î¤\GÊ´b•ž’z5)Wå(ò%#îѽT­Ò“­É•H‚L%«uz]ŽV®Ñ“Ècrââ§1êsÅú¿:9“j)Ò”¨sòG²ùY¦ËU:ROõ#~²)R"×ibò‹Li´ò'!äëä*Ù/ÞãI-%k% J÷Äî*¿äGþWÖbFazòVýDëgÿr½ŽRH’äÊì|™ªVŠUd’z6¹‚L¥dù ±–|ZèÿUø¥lÿ_!1 ã«rÔ %ÕÊt¹zy¾A!V¾a«°D,[„¥`‹±%Øjì, [Š¥c˰5ØZl%¶KÂÆbãQ'a£°2ì;ÎBÎ(Ô÷ц諣ڹӹ§x ¼ö˜¹1ø(¼~´d´ Ç2´£þíø8ØrÕ÷Åþ-& ޶¨¤&³Îòò2ªˆÓ0›Ëÿ¬4²µ±úÅÝšfÉò«Ø·^} Ut Ýn(yË,4Ç÷U¹ApûÜ>Oû ö*¯¾YÑxpðì½ãÇz^Sa7ÙÜ› b;›Ë¿eÍ -Å/RÕæ®C-‘{Ÿ‰Æ2ÉöÝ á€Û°ør4|ðP–,É_ðTùK·º¿øˆhßÙ[¿àM5N›Çë)q.«×¸®Æ²£5n9üa÷*v*K²“Øéñ'Óîê¸vY¦í&Y¾ [nFÃaf¥iMf§±3ÞH¿{á“§ÏÎ÷ÞWñ/SN¿#²Ú¤© 6¿¾i!]Ci³¾A±ûÔPû£—ˆ½ûw82k ›Ž0ãÃãÀWpåµ |#“£é+íŽB€;+¶Uw±]0Šh½ùü8Üà)]c—¹—»ñ˜SÞ2€Õç¶dlbgÅ:÷›j%g_`ßa“Ù©‰½Yçvþ0HØ3¼E@ó«4u¦æýýû®ô‹øì,xQ°Ó[c2œÿ-ûþ4¹®uï—Ç ~ᢨ­½§¡Í;Ÿ½™6¢ø ¾™À¿>ÀL4ñ¿¿*ÔbEÀ!c_Éec5¯ëâ]*ûF«-ˇ›¡¸&fCaE¤ºn8Düë^›Ï…µEoÖªÞÎZ)NÎT¬¸º ¦q×n8¡}ˆhýHĪà4Á®¯‡®x¤Ú¬We %!Í¥Lo𱰃͉07:¡±‘>e–|ÝÍ‚ox3š•OnN¡ÍYVôƒ¥ÄÖ+áSÁ`6éåÝšƒ__ü®Ø'º ¯p!‡ê䲯Îè¹4𪠋öyiQâðz€ 5£¹±©¡¾±GÚ¶~½$ƒL¤”lTÆáÓxc!3¯…9ðÙúἺ‡¯u ´uÔ(-)-./,÷„Þ^WßÑaŒ¨õš"Í"[œ“lαÈbO@%X`uxØ„…1;Jƒ  àUÅ& æ%Äö•œÍn„w"pÍÞêÆqàT×0Œ;»ùÆþ?3EÄ£'à iê7WR¨Ù¢gÌ{cm£òô"9ÇTtÀZnk°L^†ÎñÅ>ü wó£¯ÎeŒomÚ¶¥Ôà5M-UðEåÞj_Àù?ÞýãõtØ&ŽñøÙëì]|_ÐWI×znîQ#sé)9óænØóÉŽP]mƒ¨ªnW9züNf& ztrm›Œr-©|9À©ü¶¾{§??O ÄÐE˜ø&ÔÆ÷¯FSæß ' Ø™ÜZ^ym¨´lõ%aÎW¸ëèÚ‰7Ïž¼¶ÇppÂê3w€V¼+éîß)}¯RTË㿆×ÂsZœ%àÅc)zY®- ˜'.ÈÌú /’µ?Ø›Q— Tø‡Ê¼MiŠ}ßšEÿáJl¼Žf(Ä”éKlv3À®ŠŠÊÚsuýDû· C`Þ«i•,K\ʾ– ‚c˜4OiŠUâZåµÄøúüÕ¡…À,­CåóÑw>;ñ§ ƽ0¡jWïúo ~ܳÊf-¡­%f"ͱ®w)€M¸¥ÎÜz¼»õ+Äj°Ã~>îäÀ£Ìû‚¹¼¶þÀÈ\ Ëè ÇMûœn‘$cåº<‡Öér;ð¯ŸÆ‡x Ù6¯ÃGÓ¡CéÌNø>¬ô®`l’‹¦í™ÎU$ ÙX6]ξ¹hOö'tÁçïïÑV C¨©¶ÛÚz›î‰øUì\xY°ËÛ¨¹àÝuì3‹çë4òBÀsõí‡Oîypàc¢÷L_g/Z¤hØþÚÏß^‡ï܈~´U¼Øæ,¦KÔ2CaŠÊª,ÝZÚA ­þ­zîÖ¶Ê®"h}^væb6ªùZÍiЀwë›åI‹Ð8NXm3”Ì*š›cZª\EvýtË'ô³ébk~•wάéÙÕ?pëìÀ.Dîe³#}vk%FÆszøØñKGlø¶Šb»Çk󘈶Ð!-1‚b¡²ÚÜÒw°k脨´Œ;Þ†iç8°– X5ϲ‚ 5¼±a&1 7†yMÏ ÿª©bÌ û(»0 endstream endobj 89 0 obj 2844 endobj 51 0 obj <> endobj 50 0 obj <>stream xœV{TgŸˆd¦jÙ69YIÕdêVÅÅj{ìúèVíú¨o@¤ V”<&03Â3!<Ä~<¯ ’ƒ/E´j[¬ë[×Óm·õY¬=m·ÝÝoð£çì ¬íž³ÿí3sï|÷»¿û»¿{EØøq˜H$’lŒÝ½*2Ž6Pì«ËMz­ð5’›"⦎㦅 ·Ðã§yOãB§aö„>Ï)&a­SŸŸ.žû"÷óo¸û/ŒS!jõЏˆwcfGFÎYa2g3trŠ…|}ñâŤ:›ü…\I±t²‘œÉ?dRz“Ù@-sÉÍEZR(RGë)rEtÌÖµQ«ÉˆÕQï’«)#ŨôdL†ZOkÈ ´†2²ÔlRgbHýØ ©1µ´…6Ù¹äŸXRE²fJCó?QV e sH3Åh–åŸIš%“•ÑBiI‹‰¤}†VÏ×™ŒÒ̘x»·ðGŘX «ah³…ä#Ƭ|g쎖•EˆËÒ¼™4éxO­I“!dó‹Í¢¢,i¡¬!Žš"µ4kÖ«²ù¸üQf†½BK“>‡d¨d£ÕSìè¹*¿æGþWÖ*³YŸ=ú¯iÔë—ø´…¥ôº¹Q´AÁ’±&ƒÊHF™“È”–Î0ü¯á×rýÄ0,|C¶Q³Ñ¤¥˜d6ÖBo^“±V¯Š7¨0ìUl­Äæb1Ø*ìl3¶‹Ãæcïbë°7°ÙX<ö{l#¶[ˆEa+°E˜œ'6žÿü@´U´œlÜöq·B„T541´)ô{qŽáj¼ ¿Bh‰SÏžûdB,¬ žLÇ0Ü… &KÍØ%3ŠS—déSÒÔºÍÙKemèQrzÜnl¸WEÐßüÊ®=¹` 1bÅ¥N°¥À¾ÜAHcî6Æ•!Õyî®OàÄΩd(’÷ì®/,°ïv8˜Õ(.|ܘuP#õî@…·<Ü*Y¼µÌUærT‚ÞÙM*8 ÏŽÏÙšžfrGQ»T”W*ËåNPEìg}´ÎœN%v¥žïÜ_ßÒ¢hiõu| gs/‡7u×ÖvTaÜàç$—“ý’3P P9YÚ S„KmfÅNj݅@E >¨Š; Kü¸Îió€Ãôá ªº¶ÖMHï´îõ×·N9ØdÞ¬D¥8ÐäÒ»xg›×VÖƒnVáwã?\hŠÑ)¸˜üËœ¼ƒGàåî5(’éTéùj@¼wNýñÀů§ÈîR:<ªòm{,‡ѽÏtpÍÉùh꬗Ñ+Hñ0¾pç\Ç­ ʰ§+A`X=êæÚá¼á7¹ÊF\8Øœo{»˜`àW|Ima¸NpQ8¸áñÜtòErâhûˆmçô¡Èňo–x @1bÂAtmIÿ_A_ì²6ƒ[—ŠCçÈ£Ð61_¾ün‰p÷Yðu8+Vq’FLGSÑï¾yN†²'?ñP’‘?!™²\/»Ð‡¡¹Y ›b²NÙpåžA%{þ¹ŒVnÂ9¸Ú/0. Ïƒ_ÈN4œƒÕƒ5á­xbeAw¥±øåRw1H$Ðz<é„Á›4n1‰f(¥A4õ/ÿ8ôö÷)Ê>–’Â[A–%Óžˆxæc(…²¶.;XªQ)`F†otˆ¸™ðE™f›>; hqOæÁìEÁ]W è—|™×—v$õh¢/ŽóâÂ4Íü"¾ðù©C—”È—É*á¤=]§@;hέÑ;­¦Š-DÏïžQ¯û‹|’³BJW¡Q`Ó&žâ%u@3Ê&u¡}gOf?UekƒÜ„´÷kÜŹuŠf³Ç±‡÷µUJ_륃۷Ræ5ÛBï¨À08é^ÔŸqtHÀý·à4§è>›,•`\&7]vý—~ƒywš\š)hâµsè†ÔV“r/Û\Зõ–YC Þ“ý©…~kßàHeÔ/mºMC |óþÀww6ž˜¡X'þcVuûí{»”½ï÷€«Ó'—^Ãz÷µ;óè²}`j'–ŽÄˤ7íg÷å¤&Æ¥GÌOl=ÞR]×Þª”Fb8‡¬¯™š;ך¼ý½ìCC›÷ñÐËó;¹EAQÅ÷Pñ$ÁÏdpF^’WRj% °"×™Zg©â«öÚÚ ×Kü!IyÅÐ΀4BkHß±*±÷^¦Â„Äu-®j7p‚šÝµ»Úlgìí€xtqðáumOD·rõ~StÁöÀ‘}möÌ½Š–¬ºlÏN"lXÜÏL@r.€ëá²ÉÒ;Ã;²lPà*l@‰ðHøG͆öÀþ6oè% q­W Ûbi/ƒß*mÌ+ˆ¾…–.qð òè—Æ‚[Úp¨A…*±tËÈzî[pUy*]®Z¯3ˆ¯'M_Ÿ§MËT¦çÐÅËÞ'Âà]Ûuøô¸h*Càž"¯Â%Œ8êšëâ󺃯ëÑ\½ÜõÁÇL]•›Ÿ ä&{S—ž}Œ‡ÁŽQ–݆ó$Çá<4S ÚÔ T‹ã…ËávõÕŠ‹í<ÕŠüxŠÓÖŽÒVqÿ’%¥¤¨vSï ï¡& -i ¿ÔaõIÜPKàÄÉÒEœ•3É Á€§å°WfÔð‚çݞ梦 ©‹–"Éü pb¬òrÚ}•?$ÈßÙ¶c馭S”Â|8?˜s0"°_ì Ô¸½ Ô•í-îÏ9\ÜñýWPr;ñöúJ4ëæ›]pR>Ø}äJo·UwHÑ™â5úÖñukx¶vD_ñ…+ B8O”ƒƒm9ùË­ à+ܹ àÁYqÐïó^4nˆÁ¯•úrÁViP ÔŒZ® –‡ ~¹dOoáGØ–W°J(èþ¼&§‘?æà‚F]Ò·r ¿äÔ³Ù`…O d=Õ¥êÁj^ vVðÝÛCÀ”Èâý»êm ‰@‡piojj¦Ý4Eç;­„_£?VTãf‰ŸßŸð·ƒÞþ |?ËÇ”{ˆO †>‘­Ùù£’ýc_æ´6‚ÑtZ¼·*ùKÿÈà7J[òø¹:ZÿaÂ/:-ÐG=¼H†bYñÁ2o6Ð#ÕüÊÉ¢ËÆÊžZžÛ ºA¹}Üê¼ÚÎä%D¦Ái¼û¨¾Ÿž?áëÿPQ·e¯õèÞ#ÇxÒ¡„ó2³>ËÆÂÙÖu¡»û¯-J¾'³}ÃÓ}¢áMB4#¾^ê)i ·Ì–“„¤è‹p¤€÷¬½»êGZ=uG*œ ¡ÜSÎÃñ€Áû‹ÝE8èyÞ&†VîKÿ`cÃ@µA!ïér´:eìø¦Ÿ7ˆÁŽ5h2RÖ­W™;NòûA^ž[ëƒñ>ÑSZ8r#>[æ)zP°;¯4GOÂØån9ð{ÜÇ++x}u 0_bðc»}Ž:ö`d8š€>A“8¬Ô»»FðÜ_ï6¾>ï.©u4mƒ)#ß…·‹a——¤óÜÎ}×ÐÕÚ¬”‡eù8•&øÄÁ œ NšÉÖIÏcØ¿hÍ*˜ endstream endobj 90 0 obj 2961 endobj 39 0 obj <> endobj 38 0 obj <>stream xœyyX“ÇÞöCò:ýÝË/ 3ZÃŒÑ!Aû.^¼d³T¦JKŒOPßZ½zµ0Z%üçˆp‹HžŸ"|ɉ¥2‰(E±L¸O$*D¸D±H¸yo@øÎ=Û… ¶ï n¥ˆÒ¢Ä€ôhqbŒÐ?1F”"-ÆIÓ„âc¤)±‰ŠDiŠ|™p£\%”ËD1‰x‘H#’y–e¢4I¢\Ž¿ åÂø´¨…(V¨ SbÄ鱞íñïqÒ…P–&Åã<‚MHå yLZ¢L!Ä;lÙö⌊„(…g_y"JãðÌXiLºç6ÿSD%¦È… ‘RáÙ'Z$ŒM”ËÄQ*¼/6%KK?Bº<1%þ÷Ý—ÓDñQi±b‘|Ü®•ßï'ü·[GÉdbÕøZéø¬ퟨ‹ÄqËö$J¢ÓåÂqN…{¤«…þ Q|º8*í?G~çëÿA‚ 6øoT¥ÄìÞ¤–ÆîÙ,íÝ’°5-~›b1Ÿ&vo ˆââb!Jì"V‹ˆý„?ñ.Fì&6«ˆpb±™ð#¸Ä$b&Á ¦ˆ©“˜ML#|‰—‰9Ät› ˆÄDb#öd /9ÉxÑ9Ák‚ŒÉa†2¼^õ*a±Xy¬ïÙÑì/É`²—ZHõOäLüiRؤŸ_½ôódÝä§SÖOy25têµik§L»ôòÜ—OM_<ýÂôÿö®ó¦9Ù3V̰pyÜ®s挙³f†ÎtÎìšù|Vø,Ŭ¶Yç}^ñÑù\ç¼|ÞÇÐ2•†À¥™l;¦ß…ÞÐgEð”ð€‹ŒÈ´·TY¥vÁ0œÈ‚Nvÿâ*™5hy MZH)a99¦ƒ6.$a ¤P k*RÓ×Ý ZJ‡r‘¯†ÝQ•WhÎ7 ¡VDÂ2³#Ï*y Öi,¦œ(ZK6åÕÊÕ },9NIKxu<Ðð€FᯖhSÓ•Z`ÙÅÆR¥U]¢”"3SžÔ‘6pëÔ%8÷‚.£—Ø;*mÞ8éÙ=†[3«é׸e[Q% Z*4¨ˆAmX¥ N2¬DSº)xŒZ™'úªÛ»ùͮ涫ÔÔߦר—‹ñ|ˆ®a޾Kßᎅ“ÀO¯[›‹‘ït‘›Jµp—¢°ØíŸ•aˆ QêX1Ê¢‹Y耒ýU®]6Qc‹H0W«ô3ãuz¹®DÝ~¡èù$,;Ér°§Ž¾‰}­‡~Ò£ty?¹#ïArgQÍè".Ç©$çVÀFO:_>ÅIRÂ?‘ÁݺžcÝîàRõ‰[%ͲªªÏÙëluG|´ÞÙÓ?z­¸‚6òW£o¹ÏÁpn·/¿,oŽñŸ B2bcɪ蜀: ­èÀ~/ tµÂÉbsļ±âýÐÈ¥ 3h£g·1èw¡/WUb 7géÔ<­:1; PˆÏ†õôB–ýLæ£I¬ZvŧNç5@A>¹Æ²4ôû†±…^ÑÂßAÇwLh¡pÑÌå‹ùþù è ½ŸýäÃYoþ„ftRîã«‹Ñ+ˆuxû†Ø¸Æ¾ ô\Ö ÷O'oÜå{lÕô$lí)Ì|Ì„Ï\8ÿ«šT€|@ÅçT èÈÜâu‚q—š—E–•r@õT£h9)êUÆà³“Ë ½†fÜN¸Ôë>yL°‹„ /`2éUfš1P~Á_Àiuú³ÏÏŸ>*Àqlpg{ÜûÇÛC³8'hÚÀ¥HpÍÖã²;lŽ’Þìz%Ù›ïÈsf»µñ`7…¾#Ǹ´’…Ö+ÙƒÀ‘ÓwÛMrÂþÈ=æ;½;víý×>€s”Àq 3XlsF–>dESv :¼ü X üÄ»ƒ·î-hXÖ¶òlе~ý@øËðõ/)UíÆ-;%~€çö¹ôŸ “‚;ÿ 'Ây—ÏeÄôñ;’R×”'•HjÔµ*(1vÐS¯yßy ÓŸÎâäVЯp+Ь PǬƃ‚±ì7Ìç 5Ì%9‡kÉ EºJð!ß"»’Ø&ý½à<øòÖoí‹L ‰< ÍÅ! º`5.ÚÀm»Ô=üÙéõˆBÌ6 ênã{Bû6Lé€d7ƒ^ý¸ë¤ìAàHkÊeU¯©³à:¯³sn[Ó:$݇êöƒppP%J<-ÛVc¯¼·’?Ý¿ ‰>z—p+ë¹®ƒF©ý “¨í¦ÿ»Ãʦ×A6þcÔ‹ö¡9h.:´´cù…@Áÿoc¿Á§‡s úKÊ“àkÿÛ«ºcóêîä Ú—ôÐmËÜŸ¦NS(«BÁ!p¸6¡}ÿpÒ/c0Òò|à$u|ðtýEàÙû÷ˆÿf„fCÆ,NÑß ƒ 6ëuëqÍ+a )ð÷Ηn^íù<ßI_Ü~1ºÑ+ØoØœ9Jò‘©"çŽx¤“Û^YÞÿôfVâ)þÃþ•MŠ^õÞÁ°”@ý;€ŠÑã§Õ¡­A×iïo=Ygq4pŒ~Ÿ{¨YR‹-O_Œ¼0Þ¯øñÊŦSC„3Ï>•f >×i548Èજr0@Ñ?ÈMèk.çéŒ9éÊ$½ˆÌ–éNn͸ >Æ´ŸÿìÉö¤ü©ð)® ó;`T ãk¯7<åi¤ØW\í½ucJ-¿:µÊX¨WmCwdÓÞÝ¡²C©‚ÔÈœøÂ5Ôêä¯Ð-6ØdÐoöÔ»“\m1T‚û¼§âÔr¸`}<ãÁóñÌòà)†‡á·© ¦° <lƒ×:º¯ƒÁ€¶WÖ3ôNËR|Ù6§—í›l¦Æ¶’`UŽq½éE†_kÑ8À§\:ëÙjm†¾7Î]ŽÈLmQ±‚ÿB$ôÀÁ~XÑ«|¡ôð}®”Žˆ#rô: dì ªÔd͵T‚ ¸Œü 8uv?ªjlStžÆ Õ©¥9ñq–Á4vKYY3ú²qÔÖkjÞ¢Ž²óá묱6§è߯ÿÈ‹-Jº‡|ïûnÆÝÇL+=›ë°TUêhEV¤YHn2íÒcäLNr»Eí—)˜Nv ži.«È5Vò«µ•f; 5-îD¬Ì·ü€³ghz¼.@É—áÛn8ë(L:^Šóî˜õ ¹…I'Ñ>ÜãëÈLœ‡2­éå>2›¬4PË6n^îß,ú8I T©ÔæÜ¤]&ÈUúþÌ-ûeI Ž }ùÓý‡Mçø½í5 Ü88°Ñ‚¸e>¡Åi ¸;»šË+ ­…à*°–Ðçloîlqv3 5·AÛA!ÓØln§é ói@}ß©‹\‹Xo¶5Xíg¥ðÏÜ«-]ÃíMjI5¿6¡êˆ¥ö¥$Úuóÿ…ã\ÿ7úh9Ìâb^Hý•f fdž‡‘R#sþ€‘¿3‚}ÇÏà ÞqßYW‚ÕÁ= ¦Àyä— FSõN©:OÀ>ïâŠ,™¶”c(–ùܲ·Uu6w4¹ÀI0¨ëImõû5y‚¶•Í9¡$ïçØ `Ë àú žúÙ†/ÕÙ=À‡“—Ša6ºÎ‚+Ùœ°±ú)·¥²¼N¿rdixFT¼’(5Á¼¸`¼ôÑ¿öásæh8ü•‹ÊUìÁüªüªgv™¡Ð»dòÙf´j>dÃ=?¶|?tš?túFó'à8­<ß&­–ÝC5°s`<+mVª´À²,*ëaç¡òÃøÔÑëh>:²°yÃ¥Á­mÏDpx àô®¾. F’àj•ýJ)5¶ÏÑ“;¼ÌE»qr~Ëq²äÜ~gK[¡ÅÌ7e›³MFQ𑈬<ŠóÄ`2›rgƒü¢KŹ}]`¯j;rõtoã¹N¾®2#MmL¼8Mó‡xœä<ù…·ÀŒ¿äìrÃ)#Þ7FÞÅ»ünö²7ƒY¬”ªŠíE€×8ž>4$Øl4ló$^£“ÜYšcóà I3¸2…B*­W´´6Ô·¶(Rp‰9¯íNwÓ¨?ÑíÝúj™Å™CïÃÅ5ƒ§0ÔÜG”SœNG\\y²ï©NJI«¢À~°fhô ¸':}TT¡+ÍrjGø¡M+ü/©á|» %°êÙWQ•Ãé‹3jžË„-izûrú|!ùí£¿~|ùܼv%j\ .ôÞ81 Œïâ·';R«pìŽW_xzö¸ߌÀK#L(‚ˆ CIp¯²ò ·v%ùÀTiøŸ’`Ô¿ï ëv¹¡ {×] FÃKhÿxÚÿ´‚BÇõï• 7ý^Öá}ã1ÜöØ‹ü 7—}È€Å*|†VœN5y#¿ÊÂ)¤'4W«5ÈÒÅz  b“ 85ðzCKžÊwhÀ! •’kO…}Ús¼º¹™?8Èò#9þ%gÜÝ•g<Ì2J96ê5N2|wœå?Ãú7× éTX—9‹E6Àk¨PãPF‚õùi†L³Q›£`´ªëT ÚŠ,Üõ©ÔéÉ}Š pÂÕÏákÎ/a£ëÿˆ|\éÿ3À€F «u”àŽå“à]ƒÁÏÓ ¹ºDkÇ5•.¿@B6¨W5  T#Û ×±Æ®³Íh«‘Ý .è…e.j/š0l‹ô¨£ :ýª|lè 6dÉògÞŸ:ì=rûŒ’|ò¢WÂ`kÝôZܧz„†÷ÁùN#Pc1ϸUù̃fG¾TàN¸ÒÚeÁp˜†ì-°‡çÂɨϧØl1YrÊTe9e  XíÎ8~æÓúI™µÍB½Hš~NÆ}\oG™\.EªÓ¦‹Œe`EœŸ¿ÙSouN2³(¦ëˆ.ô'¡íµäçç[òyåF‹äRÙÙf=_©)Nv¤EìŠ:‹–ÂPŸÖæ»ßn-ç9KÅX•;Ñ-ûxaeЂœl­V»£©>´™W,Ò§äfñ$9žÜ+ŒºßÀ 1iHWqÁHUõW6 FI>4W§ƒùX<â”neId»ÄÀp QvRÕaêñˆöOÇø wciƼ‰B7I´ñËÕpdÜïúä8¿q b<Ï/pþã¬!™l& ³Ü { ¥ù¬‚ õ0ÀÎõ•Ö“VŒr¤†ìÉ«2¸C¬J«²LµEø,€Ž<[ Øx ®ªüX žµCC6”ëà/úɧJR®-Ã¥Ü^Õ„û“Ï÷Èàˆ+1—ž”VT÷áÆñ/>µ–R7Þ‚ÏoŒG™.ÌL»²¨ª7~6-îVRI¢Õùçbn NÒ¿Do)úGŒâ~µÈ¸M=þ¢p9è íÓèíú.øÒÓÜíù˜«Öês58 LŽ!Ä‘.·UÓ˜Þ}Ĩ¥ø+Ü™ uîú’ÂÒB«  ¢°X©æŽú¾ÓÍ)!ü=$Z¶[sD”ž©MI'Ì(òúPݹë|Ž}imF¿ï1|ù®^<„ÞÄ’Zœ›¡—k¥Ù€J”àÑß § Qãíçè7ct÷è".ŠR²/æ×€d™dz š?ÆôA‹á÷IŸæ4'¸¶ŽâPYä(”º”äé‡vp,öq²a}¥óQe婯7núm'¶Ï„‡œl1Ȭ¡0Ìçk8ÙÕÜVÝQÄs¢²­ÀfÆn¨×§§‰sÍz•.Sëö‘¨Ž;pØ­mE˜ÁMÙªuíDs}­–DMIù< œç$¥úR{™Õiw Áiß#a‰¹Ø Ì< 2å%yJ² G×+ç¸éô÷|˜.ú5®ÝRîyJjªÈŠ 2š}…˜Ç4'Z¬©Ç)ØE‚âr›Õz´a°¦ PCõ X¿Hp÷b0yê—ÂIijÀ –’mƒµÃ€º\+ó xåäšð$©“L-–ëjÁqŒ&á¤ØkëÃRCøªË‰Í! Hµ~þÔ}ÒT¦L4k<Èá&ù¥?†™ß0áÒÑ÷¹¹ÅQYÎA/Å#ˆÊŠJ€P}ÙQ‚±jRü$é è3'À×á´õ?Îß “êuüd÷¹‡gÞGS3b×êý‡Žò§þ¶åÛ¿ùyØ> dŸÍÅlË@†9Õ(EÓÑ>ÈþXPš]_háe×™] 46Ø.xØv+ÉË…¶ìck:WûQšKO6ÕæÕxÞÿêÖ³<¥@IžÍuªz–±c‡XF¯ïŒ­a9ÙO ÃÖð¤ë\eÅyÛxÒsÃùá>Ãv>\÷ZŒõò<:0’n²vÁch Éùå\3ÂF;>â"šà3Îå£sÝ ¸î)³må~vª­©gøîŸº~p"€3âž¿=}*µ~‡>Ëç ÿæ„– ;*׃ùàuŸlÔ_¿9p<­÷З1àÃ;L¸“þ‚ ÃØÕ ¤ØbíýÖ'ÛªÉ0æf± @!(àå–ä—wô™tý|HÆß P‹÷lx?Sm­—ð“6`)Z}šè¤üþã{ÍgφOÔ]Ÿƒ{Êáð3‘CA hR.Eü1»³þæýóñYœ#_£W¹·:O\ר3 Ç'ȉ|N]rƒ²»ÌZTTÆç)¶Pä[^fÎI–Æ…Ä 0Ù¿Ò1p ÷ÍÁY©8xç”-‰I™’ƒŠŠÕ•›ù{Ë<Í"|¬ïs% ¹XRŸÞÖÑPßÖ&?*ñØ€¡b¡ZÈ<m\Xø!ÖKèͰ€ÏÑ›¹Ö¾êÏ+®V^½²V!WªYÎ…5oñÑ‚™ÿŒ(4Ò^¸¡ûy5 ½ì]ŸœþÛç×áËúRpõ›p"⢗V¼|ÑÔ{ïAââ@uÿy~4Z…˜B´$•‚Wá(dæe²¥ò8]< ÖG܇/]®¾V×$¨q­lÔŸN¬Dkññ-|ÿé?s%i©â”£i­íMG[ÛS›<7k7@&,‚LœCGþ焼þh‘Ö=ÊÇ&û°ºÜÁFªlc}â‘·¢`!dzcƒzÌ׎_1_· ^û_阯ü¤zeÏ?ùJøß|õÒ¹Ùî‰]°iÔ»‰žAû3Äñãƒ(u\Bà>"š£M<¹¯'ò¬ü 8 kº»®\ì…€S(µ¾ŠfñóS¹O !Q¤påÊÈ_a,L8™O/”ÅyÇ]7cä)y¥v,giɪÒÊ’’âZkM ušdçA:)G‘•­ÉÖæGyRa«“\[”e§(ú¹çM€¾ý7ÆÏÇ™ÿEoýßÞú»«Z‹ñűÀÀ7O’Æ{<_±›þþš7l}$º7‹s.…_s¯‚†‚ÆìéǃÀ6jUÐe™ÖÆ8¾¤VmõüO@£ÍHL¿óàQSÿIÁÉþ¦+à8›u2¥=³^YéÂ}Êí“G{.Ìþr×¥7Ã#ÕÉñ|‰L“š¾×™çÓÿé‰ÎuóD¤¼&>-M ‘H5ÛåÔ?SÀ(œÂ(lŒ¤ÆÚòNÂüq9= ¿™×Ñ”~.¹ªÚg͇Ò.Ù}ù-ÃçàgðwûWÍ7Zn´uß»BMÍtÓ¡nìf·MzòR[ùäÉOj'O!ˆÿ Ö’ï endstream endobj 91 0 obj 6561 endobj 36 0 obj <> endobj 35 0 obj <>stream xœWw\SÉö¿riŠxQ’«O:²vЏŠRUEE]©I€h H+ö2XVQXABW`Wa)‚º êêOl°EñYöù|kÛµa9—ì~ÞÜÀªïßß!“™Ó¾ç|Ï™A@™ö£íì9³"溇(T™ ­R?zºZ%çOܹanx?ÎÁûãK¬ÿ#Tè@Í.|bÉI,¨ÊáÖ.ƒzVX÷X àî ìµµK |-øÝeÁ¼(Wwwê4]º2)YËŽõññatlß  Ð(“RY'²ÈT¨Ôi)ŠT­'©P°Úd›¨T)Øs"‡†³.Áá Ø`Eª"=^ÅFd$¨”2v¶R¦HÕ(\ÙDu:«êýÁÊÔ©r¥V©NÕx²þ6žÕ¤)dJ¢¤È’)Òø6M‘ž¢ÔhÈšUjؤôøT­BÎjÕ¬2U¦ÊóîÉ~¢:U˦¥«Éy 9!¦"Ô­F–®LÓ²ÄcD@PoŒÚäx-ïW£$Ǭ:‘HÊÕ² ͇3m¼2UÃjYZÞO‚‚•+5iªxñKL¥¥+!dh”©I½{°éФøt¹J¡1Úå³òû êø´4•Ψ«6J}ð¯ÔjªDÏpeJB††Œ'j³Y¾²ÿ³ó±Dÿ¿¢Q5Ö_—* SËÃg(æ$F¦'i’çi•‘óC3WªâfM˜8‰õòðöñôýlŒãØqã)j$µ„šCPžTH}F¢‚¨1”#L¥œ¨H*„r¦æS¡Ôxj5“š@-¤&RnTµˆ £¦S^ÔbŠ¡l©!”€²£,©¡”=5€F ¤¬)šDÙPƒ©q„”)5ÚFµ †  Jôsì·©ß“¹&Å&wL%¦a¦;Mÿº«„@gÑõô-ÑlÑVQ•èœè±X"ö·‰õÞ~ÿZ³ÑfcÌdf{ÍÌ÷˜Wš_1ÿ·…ÌâWK‘e‚åC¨¶êIDz°k8¬½€ÛÎÌ)ì,OïíIb_çý™"„Ñôi ÛkÀšÁóègP'´âZ±º»g Ñ’pµ 658`sÎAˆ=iˆ6\îm-RÈ—doÊÙ«“ŒoÏÛYˆŽ¡Æ}e¾-(,-½é=6vV =ç æ©úAXˆvˆMs;±h¨%?»D6]Wšo\ªZ6K‚¿D`z‹¦/I›#“Øxß‘H´ „  &\ôF[Ù<:W[`‰cçÑÉmKËCDÆÄ^ÓKüGIk£®)¯¡ëèdù±V16ã,™Nrý"80ð‹Ž/OuvJUïC-·ßÖÆÍ°™ÆÜfRC —CQ- âöÁ`^ؤçs.“ÙÚ¾®^ÕùóØ, Îð`쌳ñ:°ÁΤ|¡`ù&çJ±½Ñ3b¡'?…ñ0ñ‡ßÀìl“.ùˆ´`åþ¬\¹˜/Ü{ù¼pÅÉä䡽hjÛôݺº¤ç.|æMq(ö:FƒåóŽwÕR,¡WÅÉÓ!Z^¸²j~kÙŽ3â]O˜Ü{Ç.’Õ¬Ò«óW~™¹;‘Ô²H ƒ¹½½8'¯}ŽqD^ʰ™‰Žˆ¸Á‚ÚQWƒÚƒï-{ƒÞ {_·ßh¿þí;Ô€N|=³sV‡oÍH$ÎÁƒpÛî¾NØ[N~E‚}çXÓ Öœ¬‰½@uÙB &¨³âôÅïoT¿@ D`ªz1·cÉÅ rlJБs7Ã+†¨ 𼞈'Dúa¡Ô ƘðäÙ[Á-žC׸ Æ»•>’÷UE^ÁÎy’·¢»’s²Ø3&vŒtæTÏ[†`¹û"«žÏH[o&m­î æÏáLÈg` öž 8yßÁR|ÓHZŽ1%²¬èNmò4ÿÄäÉRÞÑŸK>>½6L@×x Öø5øp–`m(û3…k$ßRBú¡$X{övñ›Ú\/²‰¸×ÐpïÐÛ‹$0R´)g+Ú†f¡Èø”éb›1ïHÿNýõm/×D_CM8bÁ[%úHÉÓ`wl'c¿‡Ø†¶×]<+.š¹$&parIC¶;Ò9ñ©ÇSš’/­ºÄàõô'°‘rçDøKL1g§;». ™}ýùë–nHcN~ OËÃû‘Àû‘ìýE`åöõ3™.ýà-ô‘Ðæó=¸‹ëÇìz|v$¡9L Â&IUE™Ò¢¬ÂgWÁä(»cÙyÙ(C¼L¾rfR꾸¨¥¯W¾ÌªU£ˆ¡á‘‰cç5ÝÞ*!Ã+y?  •"Àä!iÑÜKxX…Ó%l±ªµ=wúX׳V™ÿ^‰qT›s~½õ‰å)RgËÕ’‰fÅÄÏI©¹*—$X 6¿ ¢ŸNW^ª—Ìõ—‡+øÉÄp¯PòÝ%hV^ñäQ÷kP’Âc·¿™It·ëÐm á\­»ÐX`âþœ”_Ã\C­Œ¿^!®ÇFóBŽ´ÁÊ—³b–_MäWŽ4xaE?à¬ï¬…Ÿ8å3Í;ey¾Ñÿ{ÙÂp0አ™ôÒ͇Ð1´Š ß´óØ ;M ÃÖ%0ŒÞw¾ôp·Uê’tW¯Ù$ÍÚ€PPvä;V5¹¡è|EyZõò“Y§Ð%t®âô¤Þ½!µh‚ià±bžDàdäípb°Óƒí"œ–±^)jØ{ä`eq}õWµè¶D}øÖ>ƒpò—ÃHKòM.”߹ќ-S–pßÁG+ ›P‹LÜïâ!ØÎÝ›‰»¢”ØtûÄ*xÙcûnOp—î'`ÿ‹²Íç„ÄæwlÌå&Åü±òð°Øoϵ5ÕµKmºwào˜Ž¦hÿàØ˜àà¸æÎO´\'×C«†cb(š jR>Ìn,x<¬Ð#ÔQ×øcm{É{ò>@Ý«î-o¹X?‰L–‘nŽØ… u†AÇ¿9PP"ÍÏÝŸ[Z!ÆÃ!~K”•Û%¿rs™ ½§ÄFÍš%;s÷^ýÙËÒOrËød¹a'có? Ûõ÷QÁÇ#®ÐôƒPõZÂpyO ƒþT ¯ÓУêc#w°¯Uå|'Wô$3SÑÌåq ó³Æ ì€°uḯ4†t(î£.Ô^}âR}›þ1;¶«*ÏÅߪõ&À„¦ÇÑÑ•…‰_¥ìŸBšÖoÓä êÕñ)ZJDê¢UÇ×Vmº‰ž¢ûûï8ZÐTUVOFý–+õ랃ߋ5Ïaò‹Aè|þâ-ÿgˆ>›Ä8—qòöqv¾ïóêå/÷žwûÞ%u1=Y—¸4F®ˆ^ª¨ki®«;)åF½g dú»hNJúÜ&){;î1ª:õ©¾ù[UñAµ…W5’VŸóÐ7rkÃZòx^ì)Ê𚇭ÈÓ‰§ÿjÓ‘*çÂ0ˆæ[6—ÿ/§•>\W¢s üz¼ ýF(:ú!vÅÎ'`·-hSN¶ìKéÖ¶\¹\0%]…Ç` ¶ðIœ½s™ôÇü‚.Âçþ<; :™Ó(wgÙ–“ëªP”8,6&<4©î§m<œÎÁ#ŸŒò¬÷ßÿ’ûIm“¿•ÚüëZCeóU{0;ø«£duòº/Ðlñz°åÔí.Úw8¿º¦¨‰Ï×(#’¼¥ëi+m)W«‡)ú/Ji03ƒæ`–ka#XXRÔšqK¹ endstream endobj 92 0 obj 3685 endobj 33 0 obj <> endobj 32 0 obj <>stream xœWyTS×ö¾1äÞ+2(éM"XE@fgÁ‰¹L‚`Á#ˆ&“0V¬S9Z;¨µjEQqh•ÁgµˆŠhª‚-Aƒ Ò¢Òj«}û¦'¬÷NB[Û·ÖïŸß"‹Üœ{ϰ¿ýíoW@Ù  Á¸äô„„pï(…ªP¡WfÊ-ƒÞ¼›€>€!ijpíïe¿Ç‰FP±;°ç%vTåpéèÓHGÞ0¸™‚JAµà™gJÒ¼±ÞÞ>³óòK´Êœ\½,`òäɲ%%²?îÈÂ:eŽF6š\*Tyùj…Fï+KV(dú\…,[©RÈf'$¦EÇGÊ<#ãSd‘ B+WÉ –¨”™²Xe¦B£SŒ•eçieªþ²ÌK²,¥._%/!û’¥òµJë tJMΫÝ}dZEŽ\›¥Rè¬ëZPyŸìoQËóóU%Ö¹yÖ§þÚ_©×)TÙ¾ñJõ’,YN¦ÅÊ’9*¹öƒ¯²ôÿËEQ±3K4™oÆÍ*ÍËš¯H[ž®Í™¡ËMŠÔ+“£ –Î.\–S¤’§«—Ì ;Þk‚l¢Ï¤qî“}§øMõ8äIQã(w*J Â¨É”/åAͧ©pj5‡Š ü©×©$*’  FSÉTH¡æRÑTåI¥P1T05–J¥Þ ÆS^Ô<*–š@ySoRqÔ,j"•FÅS³©IGÙRÎÔ Ê…PC){Ê•r „Ô0Ê‘r£Sé!”•K‰©×¨T$a4eCIÈ&;¨»‚1¹`ë€Q¢|0à¡0R¸Ï†²™oó™ÍO¢1"•h³è=Ÿ¾@÷0ÉÌ'Ìïl6[Á6 X8°và¶"[7ÛPÛ<ÛjÛÞAÒAã]ôÄNf·Ò®Å~ ýûåö×ìÍ*‡<‡_;NtŒs|Ëñ‰#ì<Øð¢ÁÇ·þyÈœ!ß: €Ã|#2š˜ êÂL“šóíSóiFl¦L~¨æxÿ ¯<îν ñf“Z„íh¼­O-ú™nƒ<|bàð ìàÈkŒ¦×Èœ¡ün¿nöÁÃxQ áæÊe“Vf—å"×·QÙÆ’Mì fçšïíAUèàæ=;öïÚ¾gÇq(39 µ«‚OjÍ­pBm¡÷áƒñ—7É‚æÝ÷á8#¾öïó7^?ž+ÁÿéàeLgÌùѱJS/œÅv1äú6Þ§M€:…ü2xνwfÕ—EsbÎB,é‡mˆ…tËÀ†´ß×¶H'ÒeËÃë7÷ —s†nžX2k‹Ô „)œDäÆÛrP ÂB'â:œu",¢á] x«ÙVäz\€ùø‚áíþ™¨‹ÿ¸KÈç:ƒœ‘ºLjÌ18·Ï«LŽ"Ìõ©»x !Ó "ËvFØd„F'Ôí=ñ=.â—íÎ`¤[Й]uÇ«k+΢ ¨+³Ñ·šó×=w{j,ªWQMÛNâk {ð V@s\·¯xÑgj”‰²ÊTË‹´ÅšuóÈCQø!› ˆ9‰­Ú£cÅ/÷è?]–3 å¾½¬@_ S¯Z„X$jåZ|‚}·Yp’Æ×Ív¢|h+60ð-oO’Þø'ÚÐØ)„}|5‡Çºã0ÖåcaL÷K˜ÑÁ/°·tC(÷ø|(vÆŽsBü|“Ú@ N =RË"ÞË¡–uÎvùµ„“ð^:·1ù€%¬áX€§âðN,€‘ß®ºvRq›Á¥¼œë¾0Áös¦ùÅßp¸|ï’¹l½‘ï5ZÈmòâ§`?FcÑ4UJBôì„m¶«Õv~ÎwùOD gO÷@ ëM¯M[­\¡Q'Ä)CÈÞ¯û 1Ð Œ¼ØT’wHZ¥Ý®ÚšB jÄš ˜m9|?[Ïtºˆ{Ïa wöÓ'Rt͈·G €©6`©Tü< %-ËŠcÛqo( ¥±Ü—¦ÅOñšsÁñ›»]VTÚ ª‚ÛüXÉ¡»ïœZQ§|8õìXrªÑã‘gà?Œ„1`×Ñ ônBd}Ä‚œ(”ŠíÍ;QthÝ¡ò³ìÆfîãÞ‹Wï#Öx5rüz´¾|=gןððÛ{„¼«©„à ìŽ}q1.ò Ù]íU§/JÛoÔƒÁ ÞÆR‡—J&Û@à/ØÇâ0wòå‹ý7Ž¿3õ½ŽÇ±ÓÇâQÒ¿#úœ¦Ò™áLVS⡺$‹H ‡>tIëéýê¤ø0ƒG›¦rœ°Ý_\°¿lüQꇉ¢ ÝZ7;„°•Ð9ØH­ø¼öãPù.I S¼iÕ†RĆ.̘! ¼i^ÐÁ/èdú…ð¸6[ÂG½BÉJè èäκ£'ŽíªG7X1¥ ’às}êšw³ÍʃÂÖ,.Ô¨—¼‰H¹EÿyñöµŸ½{˜@oölKGd@7ö9~ìÔöëY>†ÁÅq\wãt삇¤LòŸk-æó†GÿK-Óòrn\[Ë÷G#`\ ÜÁg“¿pí»K;Ž^”¼ a9ìä&ߎ[\´tmrÅ~£^‘Ëü^ÆEŽÓÎJ‰'T’œkÿÀžñs‚«Ìh.³$ã¯f°­Ö~Ã;på¿F~ƒí Ób½&Ï‚Áj©¡ø›²ÊB¤pMO_:k‘bÛžBÉÊíïl·† ¢7aûæ90‚ÔñÐûמ2¾òØ'º+r‡fªq=õÕáæÕš¹%ö-«ˆu¶%¼I4¬OÝAš–¥eUU­YQ!Ù[ºE‹²ÙþÖÕÛôúÌEú7Ò%pˆ±ÔMÔ[ôß áZ<%_GwÔdHËcТO2¶©]ATIçî]·}o9ØWO;b<öåÔÁ‚Ó´ì!Á¬$”Ù}/ -àÐÚÊ¢}…Û–¢ v|F–§ÄšxßUÖmV…¦4žãð…É -¢±³÷8ì:3ªª~±dþYM'êf!ò°_ÞMW!yB/OlóOEh¶>iÁÄðùX„° ‹õ0ûCÚÏí5í·$•^¢‹„чõ­¼W³à©º ÇèIxTXä-³ŒN­V_«¨ØøáÉMfÕû+ËßBlÎê-5RÀÐ,Ÿ¿tB÷'‘öß^dò$óîZüÀ¤¶™è~ßâQÍž{zxQ°þS®<Ævài$µÁž“ñÐÀúä§Z)DÏÿQw<%¹¢¬BbÌ5E W%¢i(eWîñü/Þ>ºá$Éñ†¨m3OGÞÏ!êD·*ê«ê_CWQwòuÏ*üFÃР½Ë óìík ?{-Õgƒ¤?c„€§HÅöø>æm-íš?Exˆô˜Ô¾¸Ù<š‰ÊgõÐEoåÓÉÓ°©cÆñs¾Ð™ß= ŸfdÉáÁÑòcW%<3ÉìÉ_KþE"¾Ü†ªZØYD°¦Õ´å¥ ‹Ë¢ ½Ì¼ÒÒ7ßGhC©$ŒÙ²þÃòmˆ}ÜP{Kj²g@n3ɽƒ¶–ˆ‰1 `)›Ü8Xk4·L†u}n=´U­å±R YÇ‘cZJÆ*C¨u†…ünÑ8{šC°Œ!—kÞ-²>bHò:ÒÒ©-4_Lß» á¸Fô+—ÂSÒ1£E2k±VdíÆ&‰Åj„|™cÞÌŒ KÀS2¶íË•ä(­AM,¿Ù—ŒcÏßü`&L‡a´„ßlõt“;™ÿ–“HZæoaМw––jKò”¥Ùˆ Ϫ ­÷yƒÁ¶†0Äííà$áOô–% þŒ3øZò0ûŒ"ÎôuzŒÙGF.ühð!q=¦Ÿó~¿™ýDVþY¼/²ÙÄ>õý?Òço•×m¤/}ÑÀ­Yÿz±š·¶ï—Âe¦'ò4æ¦ÇdåJtù«Õëç±÷é¿­=h@ìãyiÒ守^‹mW”¼·le¼VµE²>×~»ÞXyî¢ä£Ôýºsh'Ú¶±êcÒá!’CykKµz¥jÉ[éˆQnlª9ðh›´ëÓÏ7ØÆ¾ò§Ãá#âÎ=i¼È܇—ò}¢14l'>ýU:OÂ^Âà#KBpv‚$‘ ³ñ‡+DOhp……à‚ŠzûíëßLx¾åã">ú§72âß7]n¾rT%Á}–ËÏËÕYÑ–ŸüæqÊÙ±áòÂÄt‰ê¼|o$bÅþáháòE±ìmæ~¯Îv ÏY¥òÎ æX|£¦•H­¤›8†Y:þ%–Ì~3?1K ws=ý^)îŸ^é÷°~ L+œ!ŽáAãaæGx ÿˆ'ËäÒƒ†‚É/4LäŸÂ4óS‘UµÁ«]g»„pB9Ú¡/ÛÝùŤÉÝ1'‰|8ÛÎa- Z¸J¨ñДFÐqO؃s¹gàrb Œ…˜1àÂÎ¥»°G‘!â6qP: Âî¬5dè4€_'y=êòù¦4Î<€N5;‹îÑÿj8²³ ±O.Ÿ¿žçº în¡4ˆþtΖ¼ÝË¥|§ºK ñxö¼@æûOË\©^"=é"8EhéÊo%–‰*˜Àø!¶Y[œ”:"ðtÎÕž+¾gªÃu¨øâHŇ`#ê?Êe$,õTKó.Ik)°Ó[0…BP¸B›QDNÏ!<èóéÇck“®¨ #Ûû ¤04 ‹ÃçæÏSH7ÀÌóOŸ£+諬Ï"Y’—ñ܃ÆDŸÀ„˜)“ãšèºt¹Ób¿ú{ãÏ$ô–°5Á¼˜Æ!øì™ŠËØÇt=‚y JÖ¢J//8K% ŠXY´`=«`n=ùP výÔ/nƒŽîî˜n('ÿˆå&/h¹Ö{«-vLl ‚…Ñ{s¾[$ÿ:%+31dvþ)d û©¸öÌ‹“ë$â^ÌÂVîΩŒˆèôŒ™3ÓOÜhn8q[*þŸ¶éº”w¦•´ü‹º&y­¼vÞçQ(E-ËJÐ*Ve¬ŸÍvÑœúèà§••_}½¿±w/%MO^:?6Gê7{N\µû»ò*º_Òn·9Áº#º-–e9¸­tÍQïéŒ sSý¼œúõRÕ›’¶dï\Vy3·—”ÔèÇ0¬;÷ô„ƒRñƒëû¿<}k8LiÅnØczö~_ÒEoøjÓÞ­{*êNì%a¨_8#­Dõ–T·Zõ^\9û‡ ¡{BXE²6»ÄℼŠcž°›è ðH‡i‚5@HAÒWò»+ ®"¶’6Ø>døÐÎîÁf;{Šú/&±W endstream endobj 93 0 obj 4690 endobj 85 0 obj <> endobj 56 0 obj <> endobj 86 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 64 0 obj <> endobj 65 0 obj <> endobj 34 0 obj <> endobj 94 0 obj <> endobj 67 0 obj <> endobj 37 0 obj <> endobj 66 0 obj <> endobj 49 0 obj <> endobj 40 0 obj <> endobj 53 0 obj <> endobj 52 0 obj <> endobj 12 0 obj << /Title(Excel Chart and Spreadsheet) /Dest [11 0 R /FitH] /Parent 5 0 R /Prev 8 0 R >> endobj 2 0 obj <>endobj xref 0 95 0000000000 65535 f 0000387952 00000 n 0000431791 00000 n 0000387802 00000 n 0000386858 00000 n 0000387896 00000 n 0000388064 00000 n 0000387125 00000 n 0000388278 00000 n 0000387309 00000 n 0000388172 00000 n 0000387640 00000 n 0000431686 00000 n 0000388434 00000 n 0000388558 00000 n 0000388684 00000 n 0000388808 00000 n 0000388934 00000 n 0000389060 00000 n 0000389186 00000 n 0000389312 00000 n 0000389438 00000 n 0000389563 00000 n 0000389695 00000 n 0000389826 00000 n 0000389952 00000 n 0000390082 00000 n 0000390537 00000 n 0000390388 00000 n 0000390210 00000 n 0000000015 00000 n 0000014509 00000 n 0000411014 00000 n 0000410537 00000 n 0000422987 00000 n 0000406745 00000 n 0000406353 00000 n 0000425257 00000 n 0000399685 00000 n 0000399233 00000 n 0000428475 00000 n 0000390302 00000 n 0000390334 00000 n 0000390685 00000 n 0000391133 00000 n 0000390984 00000 n 0000390809 00000 n 0000014531 00000 n 0000109440 00000 n 0000427447 00000 n 0000396165 00000 n 0000395884 00000 n 0000430660 00000 n 0000429637 00000 n 0000392933 00000 n 0000392653 00000 n 0000416839 00000 n 0000390887 00000 n 0000390919 00000 n 0000391605 00000 n 0000391456 00000 n 0000391281 00000 n 0000109462 00000 n 0000202820 00000 n 0000420936 00000 n 0000421964 00000 n 0000426425 00000 n 0000424231 00000 n 0000391359 00000 n 0000391391 00000 n 0000392055 00000 n 0000391906 00000 n 0000391753 00000 n 0000387478 00000 n 0000202842 00000 n 0000293283 00000 n 0000418885 00000 n 0000419913 00000 n 0000391831 00000 n 0000391863 00000 n 0000392505 00000 n 0000392356 00000 n 0000392203 00000 n 0000293305 00000 n 0000386836 00000 n 0000415811 00000 n 0000417861 00000 n 0000392281 00000 n 0000392313 00000 n 0000395863 00000 n 0000399212 00000 n 0000406332 00000 n 0000410516 00000 n 0000415790 00000 n 0000424167 00000 n trailer << /Size 95 /Root 1 0 R /Info 2 0 R >> startxref 432014 %%EOF solr-2.8.1/tests/files/response_xml.1.xml0000664000175000017500000002504615001737315017303 0ustar biggibiggi 07215151321http-8983-3WAITINGorg.apache.tomcat.util.net.JIoEndpoint$Worker@1bf68a960.0000ms40.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)java.lang.Thread.run(Thread.java:595)20http-8983-2WAITINGorg.apache.tomcat.util.net.JIoEndpoint$Worker@1706eb70.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)java.lang.Thread.run(Thread.java:595)19http-8983-1RUNNABLE160.0000ms160.0000mssun.management.ThreadImpl.getThreadInfo0(Native Method)sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:142)org.apache.solr.handler.admin.ThreadDumpHandler.handleRequestBody(ThreadDumpHandler.java:73)org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)org.apache.solr.core.SolrCore.execute(SolrCore.java:1299)org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)java.lang.Thread.run(Thread.java:595)17TP-MonitorTIMED_WAITINGorg.apache.tomcat.util.threads.ThreadPool$MonitorRunnable@74db2c0.0000ms0.0000msjava.lang.Object.wait(Native Method)org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable.run(ThreadPool.java:565)java.lang.Thread.run(Thread.java:595)16TP-Processor4RUNNABLEtrue0.0000ms0.0000msjava.net.PlainSocketImpl.socketAccept(Native Method)java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)java.net.ServerSocket.implAccept(ServerSocket.java:450)java.net.ServerSocket.accept(ServerSocket.java:421)org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:306)org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:660)org.apache.jk.common.ChannelSocket$SocketAcceptor.runIt(ChannelSocket.java:870)org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)java.lang.Thread.run(Thread.java:595)15TP-Processor3WAITINGorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable@1e164830.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662)java.lang.Thread.run(Thread.java:595)14TP-Processor2WAITINGorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable@8ddb930.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662)java.lang.Thread.run(Thread.java:595)13TP-Processor1WAITINGorg.apache.tomcat.util.threads.ThreadPool$ControlRunnable@14ab51b0.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662)java.lang.Thread.run(Thread.java:595)12http-8983-Acceptor-0RUNNABLEtrue0.0000ms0.0000msjava.net.PlainSocketImpl.socketAccept(Native Method)java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)java.net.ServerSocket.implAccept(ServerSocket.java:450)java.net.ServerSocket.accept(ServerSocket.java:421)org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)java.lang.Thread.run(Thread.java:595)11ContainerBackgroundProcessor[StandardEngine[Catalina]]TIMED_WAITING1400.0000ms920.0000msjava.lang.Thread.sleep(Native Method)org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1579)java.lang.Thread.run(Thread.java:595)10pool-1-thread-1WAITING100.0000ms100.0000mssun.misc.Unsafe.park(Native Method)java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1841)java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:359)java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:470)java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:674)java.lang.Thread.run(Thread.java:595)4Signal DispatcherRUNNABLE0.0000ms0.0000ms3FinalizerWAITINGjava.lang.ref.ReferenceQueue$Lock@1b82d690.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)2Reference HandlerWAITINGjava.lang.ref.Reference$Lock@ad65130.0000ms0.0000msjava.lang.Object.wait(Native Method)java.lang.Object.wait(Object.java:474)java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)1mainRUNNABLEtrue3340.0000ms3180.0000msjava.net.PlainSocketImpl.socketAccept(Native Method)java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)java.net.ServerSocket.implAccept(ServerSocket.java:450)java.net.ServerSocket.accept(ServerSocket.java:421)org.apache.catalina.core.StandardServer.await(StandardServer.java:389)org.apache.catalina.startup.Catalina.await(Catalina.java:642)org.apache.catalina.startup.Catalina.start(Catalina.java:602)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)java.lang.reflect.Method.invoke(Method.java:585)org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) solr-2.8.1/tests/files/response_xml.2.xml0000664000175000017500000000070615001737315017300 0ustar biggibiggi parent_1 CHILD_1_1 parent_2 CHILD_2_1 CHILD_2_2 not_a_parent_1 solr-2.8.1/tests/files/response_xml.3.xml0000664000175000017500000000164715001737315017306 0ustar biggibiggi parent_1 Solr adds block join support CHILD_1_1 SolrCloud supports it too! parent_2 CHILD_2_1 Cool features CHILD_2_2 Cool features parent_3 CHILD_3_1 Cool features solr-2.8.1/tests/files/response_xml.4.xml0000664000175000017500000000372115001737315017302 0ustar biggibiggi 0 0 *:* 0 2 xml GB18030TEST Test with some GB18030 encoded characters No accents here 这是一个功能 This is a feature (translated) 这份文件是很有光泽 This document is very shiny (translated) 0.0 true 1513324811722424320 SP2514N Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133 Samsung Electronics Co. Ltd. samsung electronics hard drive 7200RPM, 8MB cache, IDE Ultra ATA-133 NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor 92.0 6 true 2006-02-13T15:26:37Z 35.0752,-97.032 1513324812366249984 solr-2.8.1/tests/files/sample.html0000775000175000017500000000035315001737315016050 0ustar biggibiggi Welcome to Solr

Here is some text

distinct
words

Here is some text in a div
This has a link.
solr-2.8.1/tests/files/sample_1.xlsx0000775000175000017500000001075115001737315016325 0ustar biggibiggiPKz©H _rels/.rels­’ÏJ1‡ï}Š{w¶Dd³½ˆÐ›H}€˜Ìþa7™0u}{ƒZ©¥I~óÍ7CšÝfõŠœGŠFoªZ+ŒŽü{£Ÿ÷ë½kWÍ#ÎVJ$cʪÔÄlô ’n²0Ø\QÂX^:â`¥¹‡dÝd{„m]_ÿdèöˆ©öÞhÞûV‡÷„—°©ëF‡wä^F9ÑâW¢-÷(F/3¼OÏDSU N»l/wù{N(Ö[±àˆq¸T³Œ˜¿u<¹‡r?ç„®þs9¸Fþ¼’MéËhÕÀÑ'h?PKfª‚·à;PKz©HdocProps/app.xmlÐMK1໿"„^7‰vYJÉnQÄSA«x[b2ÛF6$³eûï ¶gÃ;<¼3r·¸‰œ e|Ko™ ¼ÆúCK_û§jCIFåš‚‡–ž!Ó]w#_RˆÐB&Eð¹¥Gĸå<ë#8•Y‰}IÆœÂ2¦ãh5<=;ðÈï„h8,Þ€©âHÅí ÿ‹š ¿ûå·þ‹×É> šzë ’_yãdµÂr|·· ž4^³š5l½Ú[?/Ãû¦šš\- ¥í'häµpbõ0ÛÉTkɯ9É//ê¾PKôûi>âgPKz©HdocProps/core.xml•’ÁnÂ0 †ï{Š*÷6MݵᰉÓ&M4´[”š­I£$Pxû¥6qÙÑùvl³ƒj¢=X'[]"’¤(-ÚJêºD«å<~D‘ó\W¼i5”èÍØ]! ­…wÛ°^‚‹H;*L‰¶Þб[PÜ%Á¡ƒ¸i­â>„¶Æ†‹/^ÎÒ4Ç <¯¸ç¸Æf$¢²#Òìl3*¡Ú;L‚/^V¹› ƒråTÒ Ü´žÅÑ}pr4v]—t“Áú'xýöº¾KÝJbÅ©*,pUô§ÜYù˜<¿,çˆe)Éãt§OKò@É”f÷Ÿþ“ßiÃu½ cc ãÕ¢÷\žÆ‚*ìn#ÿS1§äºâÀú[ØËþ4)ðu8D¿€}PKpYoL/LPKz©Hxl/_rels/workbook.xml.rels­‘MkÃ0 †ïýF÷ÅIcŒ8½ŒA¯ýøÆQâÐÄ6’Öµÿ~.[ eìГÐ×ó¾Hõê4êˆÄC ª¢…ÁÅv½ýîíáVÍ¢Þàh%°«¼Ø€I/Z³ó8Y.bÂ;]¤ÉJN©×ɺƒíQ/ËòIÓœÍS­[´n+P»sÂÿ°c× _£{Ÿ0È Ír‘3ÑRbà+/2ômùå=å?"Ø#ʯƒŸR6w Õ_fïz o Û­P~ìü$óò·™E­¯ÞÝ|PKOðùzÒ%PKz©Hxl/sharedStrings.xmleŽA Â0E÷ž"ÌÞ¦ŠˆH’.O íhɤf¦RooEÑå{Ÿß4SŠêŽ…C& «ª…Ôæ.ÐÕÂùt\î@±xê|Ì„Èи…a5§Äz‘a¯5·=&ÏUæå’Kò2c¹j úŽ{DIQ¯ëz«“ªÍ#‰… ¨‘ÂmÄÇáàŒ8ÁIŒgô‹ßŽ}"þÙ˯ä¯ZÏŸÝPKáõò›£ñPKz©Hxl/worksheets/sheet1.xmlUKsÛ6¾÷W`xÈ©I9²]‡bÆ•¬&3Ž¥±œf¦7ˆXŠƒ€Rì_ßø´”C¦:PÄîâÛÝoL>þ(9€6\ÉyO¢€€Ìãr?¾>­þ¸ˆ±T2*”„yð&ø˜þ–•~6€% Í<(¬­nÂÐd”ÔLT5¹Ò%µxÔûÐT(ó—JN£è2,)—Aƒp£Cå9Ï`©²ºi ‚Z ß¼2AšxMr.,è/ŠaØ9PWÑ=lÁ~­¼Þ>© :u˜&a{9MGŽ¢!Ÿ·ñÍ2vÞàG3z'G.™:n´²YOeIL¡Ž+L Ô¼þ­9»çPjuÝ Õq¡Ä'¤ +2Vü ZõÍ÷†~¹í!-ÝmA s`ã{ëÚ t²})wJô rZ ëB@wJwò¦2¤ã[ ¤ªœ‹áòHæl?#þåû€¼*Un3*½8ŠFçýTêx¾§/ªö|µZ×D;¥žÈáF®z> Ç{E]õQ„¢ôM4wñøÜ\%滯Ô]<Òß»š­|Ka´L ïŸÀ±ŠM'×Aw§³KÌÝø§cAÐÊ8ž[î Î %/é—ßt†¯Ü •› G”K™3[ ,žÌ¦Ñûè:¾¼˜^Î.|ÈïxI-M­ŽD{€¬6V•M8ƒß.ÜÓë.£V¨šV¸‡ÊY"˜ŸsçJm¼^vuH£$<¸[‹¿Î-â·‹s‹é[‹å¹ÅEobæ] **Í¥]W~ÎI‚ j¨ý0L§œö®½ ¥ù«’–Š.Уâ´<;W„ÍÊøBõž£cáG.š\]_ÍÚ9ŽØ©~ƒÎ¦Wýk³S‹ñ3Máç|È®áö몮p*Ð[þŠ]ô'7¼œkcÝx=Ôåšvñ«í[Ûjí±oð€8صö¾qkɧäÀÑ  Í«”¶šr½ÚÀÆñzÙÌËÀóNÐìùV²o·ý"%LÓÑnÊpFªtÛ¸õ"ÁC®N?­Ò²âóàÂ娕gdªâ®Ü~Ø"Wž>Âxžc ¥õøCHxÍØÝa–4QŒ57}GËêÃÂ?ß}¯•ýð„CpÁ?ª’Êßa‹\7JoOýßm0± æÿ!:NˆßxØ+ Çyâ±ÿ§ÿPKï»K ŠÇPKz©H xl/styles.xmlí˜]OÛ0†ï÷+,ߤ¥˜Ò `tš4!Eš4íÂ$NbáÈv¡á×s§iR„¶v+R¯l¿9çñ›c[u-GOT¦äBŒ¨LTÊd>Á÷³é猌%2%\I:Á5ø,þ[qzWPj¤™àÂÚòK˜¤ ‚˜UR O2¥±0Ôy`JMIj\’àÁ0 Ç Lâ8’s1Ö DÍ¥­„|ó=q<ÂÈã.U V¾]]_ÝžÿÀA Ž2%WœöB™ôD8@B.‰ ~|®áNʈ`¼òâ°FúÄ-ÒÃI¯WÆy[”!öB•ÄZªå¨éϪ*+a©=¦ŽûCt®I5uêæ}P:…­Õ]V/¡”‘\IÂïË Î7·ÒWõ,—bqšYk–®µª ÄZ% ³ÌqS{rÛéÊùÛ§?³ÕÛ‡]do÷•¬°ý÷¦ëIÍ€”%¯¦ÊA¬žÓF¸¨CzÒ9g¹t-ðF+K[³ZŽ#² D…ÒìÐns*©†uu§Ò²ÄIþ}1²tao•%žžž5)g ¶Ed2­'†g¦ÐL>ÎÔ”µ¡Lekq•<Òti²`)¤v"ƒE¶V©pU§Á¶uj|®ª+w+µÜÇÌpoæ3[Ÿ­½™½™½™½™½™mÌŒwé—r4Ø)7£r3Ü%7§ÿÙLн¾ûË|ç?Øö¿ÈÞ:ïúùGëàN4¥ì| µe㎊ܧæ_»onÞ©ÜÜqËd3Jæ^äÂk¹Ö1—J²¤ Žz˜Ã 1èWø»E{¨ñ¨¹ÖT&UK:î‘F›“z¾Nz´ã¿§ÝPÀŠ· Óèè}ÐêÈÀâ«¿hâWPK¤µ»–çPKz©Hxl/workbook.xmlRMoÛ0 ½ïWº7¶Ó¢H‚(ÅТhûÀÚµgZ¢c-²dHLÜî×Vâ®vèI"õø©õÕKçÄc²Á+YÍJ)Ðë`¬ß*ùóñöl!E"ð\ð¨ä+&yµù´BÜÕ!ì¿÷IÉ–¨_EÒ-vf¡GÏHbÄaÜ©&µˆÔ¹b^–—EÖË#Ã*~„#4Õxô¾COG’ˆˆÕ§ÖöInÖuøt4$ ï¿BDz¯ÁiYlÞd¢½Û÷·\­d.!mÃð­þ…šØ8'…ÂjY^L%ÿPâJnÃÉ1ñdqHñ1ÌŒw!ÚßÁ¸ƒsJRÜŸº±P²úÈÃ8¨G¨Ó”|y¶Þ„AI^Ñë»û¯ÏÖPË ¼<_\L¹;´Û–”\T˹õqPJ.—çR46&ÊM2 °“r¿1bCÅ;GygÓ)|h~YRù¼7Ü9ÿbè`“­+Ž+Ë@¼7óÌ8Ѱ]Íó·„‘ë¯ÃÞ³„ªd›/Á0Ågf;áoË9Å7èXä¬,«L;Í{óPKû¯sg›ÌPKz©H[Content_Types].xml½”ÁKÃ0Æïû+J®Ò¦ó "ív<êÀy–˜¼­¡mÞ‹³ûï}©› ÛØðÒPò¾ï÷Þ—j>ô]¶$ë]-¦E)2pÚëÖµxY>ä·b>›TËmʸÖQ-šÔ¤è>€ã•Ç^Eþŵ J·j òº,o¤ö.‚‹yLbV=1­l¡0>ªj!_:’EúŠìþK˜µP!tV«ÈýÉ3¿hùŽ””c 56Ðù7Éx½@H²q‘êNÂùÕÊj`÷ž% ¬4`òÀ–€ÑÂqlíN‡ïgMê#‰C·‹öÃcûæ}›¨ÿ3ƒ©Qæ9"ß%:;j ÊPy‚ÞúH£:’ã2½p/ßþ‡òˆÛ.ÄhzDûÿè!ðZôʺRÉñ¡˜}PKbÃ4WPKz©Hfª‚·à; _rels/.relsPKz©Hôûi>âgdocProps/app.xmlPKz©HpYoL/L9docProps/core.xmlPKz©HOðùzÒ%§xl/_rels/workbook.xml.relsPKz©Háõò›£ñÁxl/sharedStrings.xmlPKz©Hï»K ŠÇ¦xl/worksheets/sheet1.xmlPKz©H¤µ»–ç v xl/styles.xmlPKz©Hû¯sg›ÌG xl/workbook.xmlPKz©HbÃ4W[Content_Types].xmlPK ?”solr-2.8.1/tests/files/solr-word.pdf0000775000175000017500000005107415001737315016332 0ustar biggibiggi%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x•RËNÃ@ ¼ç+渑`»Nóh®> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F1.0 8 0 R >> >> endobj 9 0 obj << /Length 10 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> endobj 11 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /Length 13 0 R /Length1 24324 /Filter /FlateDecode >> stream x¥¼ |\UÙ?~νwöíΚ̞ٗ™ÉL2IšICç¦Iº¥%.$•t£ MÓŠ”YJ ÒˆàB‹ÊòÚiJK (A+ŠZ©¯ˆ€/P}«‚­XyUHæÿ=wR(ïïýý~ÿÿç?wÎ~îYŸó<ÏyÎs¡„=!<‘Ö\½jˆüŽ>‰˜ŸÂüxÍö­Á¿¥ß¸‰z?!ª/ZõŸ/8ú%B4ƒ„(î]¿qÇå“7¬­%Äx–â¥Ö­ZûÏ„Ù@È…=x¿i"¬Iý·#ÙpõÖëV}^Ù0«cÃÆMkV{ä8!Ý6–ÿêU× )—‹"¼áà5«®^WnÖKoD¸fhÓ–­ÜF~ÂhY14¼nètó½ßDø !&+â(öÓ%ù.Ü Y9#GÊââ?óHVüY”rœŠ¨eWó?äÐ"N‡6ˆ>åy™Dý;èOˆ@¤ƒá#ÅmÓ§¦ÿ4ýay/QÊæc¶‘Ç1 ¡´!I¯¤[è¢å£ÜS¼‘ù0ßÈ·ñËø>þvþ^þGüÏ„aá á ÅBÅ*ŪUÓ×Lÿ¼ÜU¾cA±ªý€¤4i ³?—š®Bû†ð “ÈMd/¹ ðr79@ž@¿Ÿ'/‘_’7É{˜BChó¨ýj@Ý­ô.<Ð'é ôô%úú{¸j< ®‰+ríÜŒçq@âQò"pî¯ä¶¾O9ªÄ;iÐÆ¬é|ºÏzžåx.¡+ñ¬¢«é<»èý½™ÞB?O¿(?÷£oÓ£Gñ há/'w’2}‚û w–ûƒ`§Ë¸wiBø}šÛÄ·s2žVüB° 7+Þ!„ûiávÒ îüÍüÍåïŃômŃÜÏIP8ÅYÉÛXÕ»9P;ò3î îÒ+4(>$W`ÜÿMqÆ{w;­á_$¿ãÃÜßèz°Æ ºHˆp—qú0îõ“Iº™ Ñ/‰>Kߤã„ÒÇøGébNÙ*q: $뢯ðZÒdžƒÆ8;íáÎpËùç”'ùFJ%þ\OyšìœûM“k°îåâÀiÀ&¿ õ _¾?;ýÃØŠ×wÎâÓäb’#ýÜOH ÖÆïðô’ÛH=y0x;Éq÷“Ê#t-ðþàOŽŒÓ+I–ê€-«Ð¶] ®¸pUÿøÿÇÀú]ôÏäZÄÊš ¥Ü)t3 ÿÞg-éGè«änåÅ/H7u‚ÓÊÿƒ\šóŸ¨ßMZѾ•ä!!V™7ã¯N/ žÛÈO(Gv¢Ís°Î{„À¼÷•¯D¯Z šø¹¢ü%ÒŽ¹»¸|sù2P~¨|)YO––þÝ^#Md·¢[¡H À±/Ñã G¿¦wo/ oE©“üÏ·Ñþ9ŠgÉ^áWÀÅòå_‚&'H5Fh5¨èir5ù3Æm?AòÓr‡Êóø!P¨·ÉEåG˪%ÊyŸ#«À=#įx°K¤¹Ë—IÅ9´În)4ÏjjlÈ××å²µ™tª&™ˆÇ¢‘pu(ðû¼·ËYå°Y-fÑd4èuZZ¥TÎIÅ`+iͤƒá`éDG88NW^Ô ÿç;Â}ÁÒ¤ì_"ûGe¿þP/;:‚%:ì,ÍÛ¾aoç`G&Mé´íáöuÚLšÒêàÕÁWª ¢Us¨ìáª:[qDm@KîpGgÉÆ«(†v®Z[깨·³Ã õeÒ%Ú¾&¼ºDÂsK¦”œ…´ËÕ””í%•\MðŠzCîJOì½s\$«Súµáµ«.í-ñ«PFgÉœB½¥ªëO;? ¢pK{ïîóS=üÞNçA–yïÞÝÁÒ‹zÏ{×b%ôõ¡Œ7¸w*¾óÔµ4ˆº¸[ûzKôVTdý`}ªôn]¸“Å ^,iÂsÃö^9ˆ‰qï-‘‹w„ÆÜnéXùqw÷.ë ‡JEO¸oU‡÷ì½xÇa—t}:%“>$š+ÃzÈhšñè ç{ÖaÈ+i²OÎÎ|]<®”µ(¼°$žÖÑ’Þ0úÔ̬uÍdïšf ?~}o•Öb>®(iÚ÷Š-ˆÑEZRDÅppïß æ?<ùÞ§cVÍÄ(£âß KdPò1 •@Ðf€®”J•jj€¨Ú1£hã9ܘIoçJá!1ÃGz0¶«úZ²üPˆMïãY@iä¢ÞJ8HV{ƈ”Mõ•¸A–2q.žœ¥ŒœKùøõÁ0àø)yç`/©cÿM¢ÃÚ¹¡¥Dÿ‡äu•ô®¥á®‹Vö;÷ÎÀlײO…*él@1nH›ñÑÊ‹ð’-)£ ý‹WŽ¢ì¯ˆÎ w^1¸K m,YÛ{y‡˜óðrQ€ßKWž+zõ¬,!ª”áí¸J –chp^I\P±û´¡ÐÌòú¿½4^>ÃÞ’O^›és©%5Ó«JK³?þTóô{ù®eÀN\ײ•{÷j?•6xoïÞyá༽ƒ{W—GV‡ƒbxï1¾—ïÝ;Ô ŒU™þñò3wxJóîìCW6Ð9Gæ²Åؾ¬w¦Iòà¢Ql° p*ÛÊ)ØþOE–âè³ÜwÁ[ª¸çLjBç¾ûO´*æ9B‰K­T’äCp¨’’k¦ŸÀ^úGØE,•â}\_Õq¯©ttñJT‚`R[ÈQ‹¤× -&{À>bçíã´FÒL&Îär~õ›Îjí_2Õ?IŠ“§-j¶Têr´Ÿn¶66ÂÄcáj•2\klhÊ×;ì6å5ë7kT*]Ôb«kéjš»~ßôéê}=VƒÆ¦iÉ×ÍÛ2°þš‡ö}¡|šnÝÖ‘”ä%’RÇK©¥Q#4t¿æ †Óܪ¿òzÖÿÍékC].*×R©‘’¬ÔV[ÛÖö=Ù®ÍJ`µ°“ ŠØË:HˆòRŸÎ£óÝ&~Qü¥¨Ø.n·íï·>`Éó’ïQí4[l>?¯²ÓÝîÛý\B­ xH¨ZðBáª+0 œ+ápµ·µÛB‰E´-9‹dQXÆËo5¸å–…áñò„4§Ø(…i0L‡Â§Â|8T¥´Z¹åUz“‰Ù,kK/ŠÜr¥©t³HåƒÕ«ÖÈ#J¥0Ų-ö£Ë¤ú‡— Û­â$3æB!•ªËµï¼n¿É.Fm1¿É»‚ºí°|æÀ 걺VTŠ¢ˆÔM7‘þÍt¸s¾1_nÀÌ&+Ü »¨R†âŽ|=1‹ίˆ8¼ñ%y.}Ë/<ùÂô¶_ïZñ­ŸþÙ™•[¢³B[ø»‚éèÞéïþbúwß}eµ—ÎîÁE;|•¹ ãbòƒ ­9”ÈŽS¿4+º¶I#h´¥,ê™Ô‹©×ù_¤ÞÞÕ~(|¨Õ )†”»T»Ô#Šå>Õ>µZ¥ÕÔpª^?Nc’AíQùžªPµ2Äq,&©ð(#ö<±P8•NhÕzAÁq4Œ‘­ÊpŒ$Ä—ç~!Eãñç¨RÇS‰'I’’d.)%‡’BrT© ¨h·Š>¯¢ªqzDª%Fy’Œò|åI2Vû}ò$ùäHŸ4Er*k"¦Kkò$ibàj…¥Ê!¨ÍèóD§O§â"€×dLÖD-`uV™§cPeK&" "´Ÿ ÷·÷Jš5ºË ëÅ5)¡¿ô8… t?Ø=ðNSAÈ™ y‘ê£2J«VÚNós24Ç+UasÞÏU :‹Ä*|V!ÿDÔÒÿä¥nOÍy÷»wtýå¹Ù ï»]>U4êî=²qçfµÄ§¿yÏâSßÚ¸£¹ÊÒ*®šNí>pÙ®‹æä»v^~õ½}ùm¢èÏÒŸßý…Á[VÖ_žöëËîþE£+­Ð©9À{%ïýUjX‹[é[鿊^Å]å»Ê¯Î†Š¡îÐýŠ/yS<âQqÔçw¦9ªå-)ËN²3¹CwG£Ògq´ˆÅ‘¢ ñ.V,Vv;«·HÅ=>µÖ¨ ’ê…´K»P·°±kV{Ë .Ñ­×ݪ¹E{‹Î´Ìq³ƒ ŠÜ :OZk“™†g±õD_ž8ª)躺5!¹[EÀ7Ç€|PÏeg»^з:Ç˯II]¡Û9àÜää³Î]NÎyc@¤¬Ç¹V©•C·‡2#.ÓˆqççIfAW;‘¡™Á(Éôú† üG˜åòü³t=NC£¬FcDÑ‘èhT¢g¢ÜH”FE–)ú,×Q…K5P€D`½ä÷d u*ÉXâ`eDÅ‹*zFE{°‡jŸÓ~M…uÙ<<œZþ#…Û»‚:Í,@ì µ8;uº_œÜ\œo“2XžT*[Aoc¼ž’þ>Æv³é’y˜ù³½a…uVsS3§Ô¨µjNªVsÊF]!HÌ>«—X¬¦€ÁK«Ã³/iV7icƒÎâ½ÔX «EÙêe ‚å ÿTMMÍMàj†qR²l x˜Þ±¢…-ÍþÆ~ª=Dže稱0+ˆ¾—ßÓ3甤ÓœA]¡ ÔèŒäÖ´˜ÊY0Ú„®®®FfˆÔûõ¡ŸQ Y‚1«©i–7£Àö*™ç—å(l'h7Ûû?«i–å›ñ°¢¸ùŸ4]0ðYò'ï]²´qÙX4[Úý…³½m•IÔÛ[‡.¯k¡_Jww¬h^|ËÕf×ç®l¯ë¸nEdÏåÕÕé–Úú†ÌŠÑd`nêÖé—nžmSZ›ï븇ö·ºÒƒ…ì€4}^ù4¿k?Dÿ>¦è¹ÕϹ?%ÂW°Ò5iTƒ¡¡8aË>äÃz}Êjã–Ãó㣠øêx,P,¾Tñø$V$èqÐþCY‚²¥&Ó@Âí†þ¦*Ã% Îk]&,U,U.Sõzz½ªõŠíŠ2zÊóƒàÉà)ò;…fÎ*W8—{ƒÎAïvç°w¯å.ë¨yÔùý&w0|'®?TýÐõ®ú´÷Á³Ô©äY.±Ü¸#8>V™ƒô9ˆ½ƒ0L7ñaƒ0Oʉ!: q$$†‚¡žë×hè@¨š B—ûÞÆ¶é‡Ž¨F…î½6f+0Gj¶ÐI]è§=íÖïÓsú¬ˆã0‰ âØx””p ~ŠhXGßâ¾ÙÍõ¸é~7uS½d9£Ä©³¨ *sJI©P¶W·ã¾PÙ o^2Ù?¼yjsÿéÍÃL–J''7cϰyø´e†IÐ.õ­ñmññ÷ø°š6÷a577ã›Î~ì9±àxÑÉxª3G­…((£É"ƒë‰Cb\iª¯n¦Jר@*‚½p5˜G"« ™ü¢èk7õJŸÚýíºôl¿YÏY{ÁEíY}á¬zé‘ïSåÛ¯Qã¾%±l̾=à_´ú¡o~Ø^ ­ô¿£|ûлÀÃÿ–ø¢EȰ0^T´J#·Üj#QL]:Ͳ8Y|35™…‘AâMЇ ÎС A¹Ü!0 ŠÚ˜L&ØK ³µI9Ü9œW+³µLÌ:‘’T{"•ÂÌßìï?Qœdò› QLdÁÏŸße”bnª¶a0{ƒpƒb¯0’=˜Èª¤ìH–#YG=µ\±\½,uŸ Ê4˜¥¯]¡½_x´æ@V5‘=“â‚A =x׋u¶»ƒ—/×n ^ÜOöWS½X£‹©­q}›Åoí°ûâŽ6¯ß×Àk:!m—G-¦ét€×ˆ.¤ÇQÝzÉbtŒ8:ø€cÔÁ9þ”ìQ¢­‡µ Ì}z~£²½¶}׌ŒsÉäÔp?Ddìfmr]6WÄ¿O~DÿN*ŽLܱ” ŽGcêd¤X U4Hké ©0T²Œ .C8d›û±3ve³±Á’¯¯šžÄ£ùtZ¥7š!O;ÅÜÛGÝwêßßÑm :Ý)5gL!‡'£›>S«l]“ííüLiãgÖÏ»àÃü€Î_òo_[àÃC¾ùÐ|¯9¼ù%úZÇP¡{Ã~ü+¦g.åKгòñ;g`:¡vØìDoH§àÌÈí9‰Ð ÐG ¦…£ðò„Œ/™G2›ÍÈOtž¨YET¢ŠS±dö6óax‡åWå7àùñÓl=u:Œb\ØT°ßLMdOL0t;³¥°@Iï8k³¨iN=ªærê}ê·Õ¼¨–Ô艺¤>¥Vª7Ú²‡ÁŸ–,9£dì1òÄ(ƒFþŒ‘YK4Kc»¿½«²6ÁÄ-™ÚŒ}dÿæ~8“àÔDFl°DA«‡ÍŠ‚[Úd·¯•I¬6ƒÌ@¼ÐṲ̈Úí½O) å¸Í}2{ǘ™§:FT¨M.è¥LÁ£Fíc‰38 KŒy*!O%m&¤­„´•4’Œš‚]t\AsÁ##Æç}üëëë³*+R¥ª*là°GC ` aÊ7èÚµ»WÞš Ø|ÿÃúëÑ/¿8µ›>¦]kš–ÞÌÍþéÖ­k®³íù ¥¯ÿ‰ª~òxKo¤Yº åWß]MŸò«Æyµû÷ûŸ÷s~s$ZES=ؾäj’³?"|œ^|x¶,ãÜc´&5NEÉHR‹É,Þm2ÑÖà ²ÛÒRq‹ÅŠ©“]Éá 5Œ)ñãqÂxÒ¨4ºÒÏðJhcVv)lÏ‘Â> +ïNZáü¾ÿô°,/kmn-Nao¬)S K4nsÄ¢öXÔ‘ð’¸-â•÷ùL* bC`À('ÅÇ‘¨9ܘßâ3#Æ—™&ðîö¼>âÎY:õf21×56Ö{dó½- þªü¢@ V+yßãO=2RŽD«¹• Z÷|w[G¦ÙߺÚj­[ÿêÜŒ/7ÿ¾©‰Û7ƒ¾f·\Ôšµ2ÀivÊâDl ÿñNxNIzÆ9ŒkrÆTXD,ÔÐÏР׃q—Ëeœ¬ŒÌxù_O±Xx>xŠÁ.o ÈÞhû›'Š'N2ÜÈKÁ5¡ƒ‘¡Èhä@äLDŒôD8‰Y†Îëëd·¹¥âB,‡ÃQÙ•j]î,ë¢jCÒoÁ²ˆ»Ú‚þP‡Þ¥·Ž¢+Bªõ*«E;ŠÓ¶"ÇÚ™#™ŠüUz½Áeˆ8¥T ‡¼«©¥aÔI{œtÐ9äupžq*œcá±oÈË5Ttn…€íA×*û¶*buì¥ëçé¡X?†k¬eƒÁu²föìššÖÙ7ºêÚ¦ÛÛk=•ßíM©MqKh­©™=š ®(Ý­Ëéª/¦ƒ.Sd{ Šo gÜÚé*xþ©Â¤ÉPkÓ+©j†»À&<†’!i aâû2<ÂóGoÃSLx^•Űð¼u„½£W|Z £"V€¨Îj“±4v+*6©ú™†‡™ÐüÇy¸8n•aÏ&ov­x _îÌð2@QyÿËU%xéP2Qn”ôú*Çy „Zå=/ƒž§G«&ªÎTñU VŠó˜+µf7Ъ1ÃÚ¦ž**UõT V UV@F•>éW-ª¦I¿2¶Å mV¿­MR)µ„F ¨R.†¹’»qvèžöèé ~H?ª? ?£WèÇçC)[gp!¦‡ž2õ—gÿÓ3~‘}ÖÕ0ºX¬uNwÂLÍŠ»>l[Ñì“g——¾2ŸíÙÜêAÃÿ ²µ<÷‹^Õ(ÓðœL ëdÛ¨69 û£TËÐHØIªe\¥–g\-ϸÚ!“ú™“CYâ8G á©Þáù³câ >ùeŸ\O.—”)}R&âI†öXuðœ‘ñ<ÂÏ¿$-+%I¼\¢æßJš:‰ Wêê ߉0Õ0 ý’&bŠÔ«ÜiŽÑúb6+zÓ}>µÇ¦…0À×qÙ:Ÿ¿•.Ë:¢bC£\^'ûåÔUÊ7EÔ2ÊRË0§–‰ºÚ! ]r”b$eeùäœ>9Â''úäŽ22/{Xð¼ÿ4{%™ll˜Îÿ+áåoiåW72ÊŸkìiljmTd*Éþ„JÊRãÉF®ÔHG'yŸÚ‘ô›*L@2é,ªV'ýÆEa_Ò®0uñš¶œ¿®ÃKÂõyyD#á°ÉdÔV9"ªQ5-©© ›¾ýê—Õ‚š1ždÞ© ${’ƒLëi$9š,%y’“º6!ilކä`C…`Âúÿ—Œ€Åéâ•BÔÅWy©BéT¸Ï±à jÖ} 4 Üø¿å@ï»|Ž5ø„ÈÓ®‡îîÚtuus§g[¥¼Vh[rív±®kz¶m^8oÜDm)nò{]+Zo˜ÞqIÀ%ÓS7½vçæÏMûú>O$2-]öð7âé„<æÖ™‰ø8ýÌJóy2×˲B pz‘aéÝØxŸ•ÁŸy$+‹älBN¹Ä(#ÛUD×Òü‰@EÃÒY>7{ÙÃ`Ê-Ødˆ³éEï‰,RÂqBƼ‚à×ë²`›kPx,ñ„,œd[¯Nˈ>ê8êÀ‡Cšã¾×5JË´t¦Óq‰ýVz§féu* Õ7 ²@d€¾hÉÍIºP}®5T7!¥p Ù PèIf÷ƒÂ0*”¥ðDϺ¢¤ßqõDzvšÃ˜ÄTW)±´ êð+éý „…Ðþ;¿"L <ù[_{ïsÄÍ×CÂÆ×¿+¾ë9/"µ*y/ ÕÅ&ê³D1.êi£Ê˜Ùd u©CŸSŸÕ ©‡‡e×U‰K‹aˆ f>(Ráü°¨ƒÌA2oã¶)¯×^o¼Þrc›s›W •ŠvŠÆ+š H^ÎÒUTù–·gÆ™JSU5;]@VjåÈɯÚþò®—¯_¿ó§K¯š»ÿs«n¼b>ðÁÝ?ûÑÈÃw|ëÆ^ÛV|ð†M¿uàûgï©.ÿszÿ `-N \õ ¬%g˧¤õÚÆã±­ l§ÕE‚|Ò*ã`kP>$…ðú_2ÿÏG2Þ…ç¬d`€ä)‹`Tº™¸ Šj§ËY56õ)Uq   è†ÅÞ »+ \Y@†RÈ& 6#tâ ~ŒÔ—?:±^Ë`rtår­vv Z'íUÆ‘V´…ÑH±%ñ0$ "WBiŒê2¢1:ÖÖ6ÓE±²%bú¨ÈóäŒÈ|”GºQ;›‰ï âBñ3â³p[šÎNgw¥?“¾Ò|ez‹z‡yGúõêwÕÿÔr³{ó} i6ͪùDÒb &ý®Ûª­I¿3&ñPwÜO:8K*Á µbe-áp,mÔ¹œÆúº€vTË jG´µ¼öOAÎÊ$Öž`°Ç:Ü”§qÌS9ÚQ„[¾QÓé„f§¼=b‡-­èãÏ ©S)Þ(2ñµ¼? fUu´!¦å¢ªú Í`å5Mø RW<'¬f`˶KÐì’ä£yû91J†Ãø9¦"ï8o¤¨ Ll™Î©[sÔ›¿¯{拏oz|QS¢¾ªÐ5tÍŠ[íbØïŒÒñê¥kç\t©Ô›ËFøÂð«;Vm¼å•ɯ첛2Óï^–÷C‘Ô¡«[˯îË9»¦ßné½ðòcÿ¾ùB§eFÆÀ= XNÐ#3œ¨‘!Y¨2Çe"î P³ Âf9l–™ 3d±ñ<¾ž?KfÈ)dF±Aa ë!@EÞép= àvBó·’±;¾)¾+ÎÇ*§¢›â 0£ý“⃡Oól_ʆO@:Ø(.†w7ivAƒ8•h© Îfùx†µ‘-6årxþ(3¤Ì#Kšä'$¢°¤'Nô¼Å‡¾@ šê¹z“ÄI¦Ï *©†ÔЃÅjsÒ_u[8¶Åüñ¢ÕÕ˜mA‘ ζEõTßÇC’î¬Ò()¶eÊÚ¾Â%æH Ò‘àh#A1X NàˆSL>òñézëÃ8ý“eUâäðd?’­°ÂÌ¡‰¼Iz³3\Q#egŸP]vnwþÞ{ñ–³4D—Ø-öLÎj˜;g:5¯Ú¥U@¡8×R;ðg?kOÇ›:mÉ˦.ŽƒÄFbØÜC׸À+oV(Y[>ÍýðR'4ÌÀKýÊØWÄ{# ­ ŠÉÁüP~$¯4åÇiPÚ ùÃOŒÇ#Ç£¿ ¿y=ý{á÷áßGÞMë,ÅtúšÌÎô>ºÛÇØGÜ#žïžÌ¾ZÓæÕò½Ò«Mÿ¨ú¥°ÚË;l¯ÃçJzÒhÐ~%xOøžˆÎ’2$Ò‹ÒÝùüuÉëÒ· Ì¿ÃÿÞ«Oªëüä;œŸhª³ã45F¾Ej·d®qú]ßñøÝ7ÝALKt}ÇÁ«-Ht‚).; ?ý!©ÍÖÔás ªûF—ËÉŽ×mŽ,Xî§J-/‡ÞýB‘qÞ&é†LtÐ4d5ñ‚7I®¸ÛUPSuzœƇâ#q>ÏŹø34HêiðPåÔ¸šéÌʲ¬)v>Qá|¢ÅY÷X™ÂËN0N#„‰íðOŸ§L ÞA n:bÐÙ Ý9ÕÚ¾Šnmÿð§´k¡ÜR99{ª6¨14TŸŒþ½‰d (B=#`y©2©öb û½D•Px™F-¸蛀Cfzšª>?0˜€-ä™m¯äÚO÷sûùýº/Fí£îQϨ÷ê/…÷gô`bRPSŸƒlºl8¹#ý•ÈWÒŠþ>tN2'‚®‚&á*PI[à`˜¦ä˜¶ösBri µˆJËšF¢ßR4™B³Ùq"•'l3Ù¹6Çï@- =£u9f©”N*A‰&´°wÎ@x…l¦/P¡€ÎHê1 ŒÓ,›OËȬÛùƆéÃ0…aY@(+ ÏÈÍeU¨ ŸS‚‡¤oF9†) s£¡Øµ—Î[ Üý“ïl[¶1d¯2„BÞWw^²jú­Læ+ŸmZ’7‹=púG÷\¹(ÓœHÖÎ_óõøµn:ÿλ.*t^6ÚR¸dóýU&£{r[ù¯\«ðñЩõI°m>ù„G§—·Éz»•*¬²×*2ë9ù:ï'ô/%ŸÐ§Nö÷OˆBöŸ“‚aZ¡—`@Úô…:ÀqEßæ\ÏÛŸwŒ»Þq©öûè7T`º úÃߨ/Úq'ï°;]nž2Ëæ9@y{Ž ZËçð-RßÈíx£ÁçhëlžŸÝ8}OJA±çzÉžþ³à&qV )÷Ôiö!•8‰¤Óä“ÀX€›ÙÙ%ã̆e)vÞi³¼¬Kc§:PÕjšE½új>šcއG:j{k¾0kK¦*)¼0ý‹ySßL¬^“XÃm9®X[Gðƒn4d=À½*Íüû3p¥i 1!C¼t üS«È5Ãs”düf%¾,2‰ ´£'d«ÂÇ3 ²ÛÒ©¥û ûŒûÌ»c»^Õ½ZõFü¼ÆT‹Ý”.¢ÖnÓý¾^åm©5­lj‹Š¢X47ÇŠ‰BC®e¡®[ì6Ïó/Œ-Nt5H-+\+¢=-ÛT»t»Ä]æ]Ž]U_Tí÷›u>ó&Ñd6¥bÀH'µÉªl‹VlY®YÙÔÓ"̨DÐîÐ0bÙŽ¯_¡¶¶…iôe±¹eG%EÖ·YÇd›õéë1§Ó™@¼¡¡Q«ÓëóN耫\±|ÀÞµìsd!Hkä:ô¾®ÐÿltSx¾Ú¦aW´¶¶Ï¼ŸLÆó=í´Q¡PE]*U¤1jklŒêñx.¯·åóz¨ƒ85úª|<êÒ5gcN-¯oP5š¼ÔÀLdkÙ4ø‰Ål¦˜× 8Ìøý>->Jë<²ÉAµÑqj<tQ¬½ ,ñFÉUrrq ,â°ÉÒàz–k"yˆA×5ÖÆÇ©ú0ÉÓü³Ü ¤€+ –x2µå³àgSøÞcÐY9}égŸ±‡©Æ0Klígì ¦7FdEfãŒ"3uZ ;³Î÷ÄÓýlŒOËmÁée?bD9(Þð|*µØjlÝ=ËÎãÇ™s\}\GX1|$ÕG,²dåtƒÎ€Šè€×žÖ@õ4þwÃÅúIã5 Ø!Wç0Ì•¬ø®AÁä*¦ðÜÄ|-“§á&&VÚ™£¦B4h*`§ùÚ˜‰蟂Sç¨ 9†},‰á\? ƒ÷^ƒV%Ël©8fÙ|¥ bÌ0U L¢h*à:<{¡µ1{bOæàCÍ 8À›g$«½Ð¤¶9[! cV; -y…¤d†±ê™AÍU¬vöú!sá<áÃùì¿Ó·³É PCAá»BÖØzÜ!»ü¸ÊêpTUN°­‹Ë:u,ÌÌ,v€à¡“¡°ÎÑÖµ :F›ê"uËwž^¶ 0Ý“qY¥ÛîéÈd¦ñÄVN|{ÑEð÷F½UÎz±zÆ5n»/åÕÃNï¨ã#›±ªªÿøñϘq.QØ|×–?Ú8KÆMúéyüYà¦ú%6&UÓëâ4î³(mNÆ›Ûj2Ë^öAÇQNörÌ[/{ëá=ÄÐÖdj2õžböãÄå/;fp…_“">›™»¾w‡X€ Â׳:L6[ž†ü9,Þq|"cÄêr%¬Ÿ˜üƒ¸Êgˆb­È´¾ú<ÒfL}1ÉYjk›nVܪä4…EíR»5)›;¦‰X"Ð$k¦M–FÏ|ËÍí®ËÝk<Òשwhw¸®uoõ\—Þ£Ý㺟ܯù’û¾Ô³ädÃï”aFJ¥kj´T fØê²ù­$]ü 5û-1uÐåvçj´6dH§RÚ†‘Ã+5n UãÒ · k¨ÃV 8]¢ŒŽ$#Zφ >SCU•Ûü yöiéÛÚ3LD1¤ý D;‹šnÍ€†×ìTÛH¾Ô«¦ 5÷cß¹o M³ébšK»ò ÿb\|Öˆ„O÷o>=u”£^ع®_A,™:ª 6 ñîVW¾"q¦ðÙC.ÿÛT"ûÔ¡rìÁ#`¹ò¥‚Õ*Ë"*ÀÌ YV=Ÿ=›Å¾mÀ£§OØ3™ÐÛ'Ì*uuŠÖDNkúަƒÍ^<+*$´þù‘¶é§M!—X•Ç}ñÎézú¯d¢Ñá{WÁ2?ºæÖÛ;Ò5y‡iNß~îp 6¬q‚lÒª?ñáÐsºSëß1åˆ ämo>}Î…Tn¾L gD#çg xOšî$—ˆäíÓ‹-§°Tös+ Ô µ<ˆÉ50_Pü„…-$S 3"ü'™£ú<ñðŸ' aæ „tÀ]Ì=Nºá7pÒ süz˜N”ÿ‰4ï#koCœ‡¥¡ Ü|‚»„Æé0·ˆ_ ¼¨V]¦¹T{§îÃïM qÂâµjmßµŸ…JÛ°û/ñ_`7Ȱ¾»Éûhà&¢€-â~´ØjýwÓñ¬ÙÈa™é—‚rá‚íó§–]qõº-®»öâMW¯º¦gé’eÈÉrãWá&ÿéçF$¾Å=q’ukÂX-¸oknÜZ€›tºpC» ìbÜg³­¸„|÷»áÊŸeå þ7‡;;ë¥q¸©ZÙK$뱄1··þ;üo¸'Q,äÈüÛcœòܹ֨3ž¦æŠçpM¦þm(—¼EþÃñoñoãÊù-¨™ÖŸi3 ‚ò7BŠB£øÿ&)ÁpDâß8‰Õïžÿ)ÒÌ¿„>²×^3˜ëQàù§1Nܲud&åÈa£¹ž´mÁtR2û$Ì)˜30ÙÄ?JvÁìƒ9#ìL¦›ÅðOðO ã}ì,Ì&˜}0YÆ?Žø«˜Í?Æ_‰O±ü@Áv¸wð÷Èî7áºþ:âq9ÿÂÌÝ?þ \–þ噸v |ÿŒû%Ä{¾aæ~q&¼ß&¿·uÆ=ÀoóÄ6?Òƒ09¾{á»Cw/B6ŵUå‚[¯®¸Èc¡°Àgù"ßÍð Æ·¨ZòŒnÌW¶äGut%Ý„î¤NQRN(O*O)Ï(•z”ƒÊ!åˆrz¦•Ç ê†t#:^Ôu9¤ëÑ)póÁ¶[ùÕè&- ÁŒÂãÄùË`0¶ËO`„D˜“🂫@È„|&ä3!Ö„Xb l–Ò33ÃR¡t›¥ar0§`ÎÀ(aâH5"ÖH8ÄÌ"„ 2 ×Iî#´P„„éáå¸Sðj`ŸKËͤÂU–~’UØ,M‚ṤUñ‰$-%é$MR©µØV/U¢æ@x :xXØÞÝ”Øô°ÐîŽv'ºŠáb´˜(>,@Í&² p Hö->¸øùÅ//oZ¼k1? Swx,• ·:ÊÜ#c.wý,SÛlî º3{?ÌÛ0<>.>H²0E˜M0wv€ûb¿…Øo‘n˜ÞøÞ7Áfé,Åï‡QȾ·áã>•ΣãO޵ä»ÛåÀì‡Á°‹0,wÅwPŽ/Á>%ÇwÃfùÀ°V>ùñ;  üJÖØ˜"ÌÌŒ‚¼Ì_BÞ†Aɰ0C0a~%žKøK¸oáy’{*ʆ:{€à¦ÜTjV‹m"§ èc²}¿lï‘í¢lG$ã"Ë ß]d¸m‘!>¥nà ÷ÊvHÒµžj3t·’m”VEB ËvÙV2›þI¶/”í´d þ2ü-døkÈðµasÈpAˆ½çÅÚ5p6ÙÖ1Wï1{‘lÇp]ŽáŀᒀaVÀÐf R´Ì•m¿l{˜M¡SØa"šgéû œŽŽµ&ã‘Zkm ŒÓé±Öùp¦ÆZ„ó¯±Ö{ÏÑâ~4úÁXät ÍNÏÒ…¸˜4@ÿ6ãþ•.Ä%p\ ¸¬‡ûi¥Q¸ßk½‰åÿÞÿ2Â_'ÕjöÞC¸Þ޹ûqÉ#‹ÿÚÌ{_K¯F­_Kï@­_ÆÅ ,×—ÆÒ§{ÏXzœ»ÇÒá싲^9ÖZh3³O 9–w ‰r¬%‹gj\€’7"<¿òrçXš½ÕÁ*§ícá:8qÖÊçh˜ôÈÕÆÂr'}$,7:r£=$*»Fj’oƪT…oB)ʧ¢§ÿÕú,ë8î5=øÏçпþ–.{"ðócl¸Æ/§Çiôhàgág?ˆŒÓc‰ô¸ ϧÇ9z$pƒ\B^Ž L¯|+,§>F*¦zk&ð•ðÊÀQ„Ç7¥ŸcÍ W£Ç+Ü—žXÜúD`äH–ZQ™¤ ´„‡D7Ó…‡ŸÔEÆYSr(㉣Ô ËMY>뮲ƒmRZµ7X®P]¤š­Ê«2øŒÀ§òªlj‹ZTÕøJ^­††¿ æÔD/0NI)ÆïÙ”¸í[  m\ %ûE FŠÈlÜE¥æ°vJV¾‹ëZ:—–,]¤kÙÜÒ¬T׸ª|q©‡ýêžÏô¢ô®>„JÜíã”,ë§eu«7fA>@iöÖÏCüGé ·~ÂÛ®ÒÄÒµ:Xú`)ú¡½heIžë$ŽíEgÑ2Ç\˜×ñ?Xƒrä`Çy›ilfÎû9}¥ûº–ö–÷õ•ê™§ìëë*Íg×ÜÃ-²›:;ŽqCÌéë=F¯ç6w^Ìâéõ}gƒÂ粇ò&Õ,©¦‡ål‹åÒ¦Õ‡ªa±Lߣ Y&€Ï÷äLëåL€ñͬ¬æ ç'¹¬çgÙ•ÂLç¦'Ô$fÒ¹0/Ët(E}iX}½‡fE‘áPt–œüÄ'Éa9ùí#,Ã1\ Ü'×Cåz*E$*y3y85òœ7ˆÿÿ½ëæþ(ƒ^õk×tâ²ÁÁpç:˜ÁÒÛ78K#«ƒÁCkÿƒ%K|lpõš Ì]µ®ôáu¥µáŽà¡Uò{ÿ-y K^î8DÖt.ë=´FZ×1¶JZÕ^ÕÑwø‘]í]ŸªkÏÇuµïúêÚÅ kgu="¿÷ßêêbɰººX]]¬®G¤G人.žK»zz©É\vô"»‡qÁÖà'Ô7×!Í‘ÇìóFÏ3ÙÒá@=îŒ4À°u“iË´±$¬N–dD´i&ÉyãìçúØL’ˆhsx.Igçÿ·lÙ²•™mÛR°·nc‰ð`ц ¡3–ZK­¸O±£O–Cm›ùµ÷Jâó­/·r›ZwµîkÝßz°U±m”v$ËóÕ/WsÕ›ªwUï«Þ_}°ZÉ.í=*µî¯þK5¿ ÐD·â×ɪBÕpñgÁ­ÛИ-[*Ù“J±ÚRÛpVÕVMÖ€Û¥àÌ3Ð,Åå\0y˜¥0 ò}Ø¿€ùO˜¿ÁäfØ÷À|æ0‹ÁÀ\EØÁjìC‰ÇpGoýá\c=¤äõ‡W]^q—®¬¸VÜÖ¶z1ÖóÚ6oJžýc˜7`þó/_Ï×Ë…£Íì×·…lÁ1ݶmLf·•Y[R[q¹ zΆ{ëèù3ƒŠ`'zòð"<ó#tË6‚¡À„ÀA&9~ { uàÝs?òÿv{U endstream endobj 13 0 obj 17764 endobj 14 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 670 /Descent -216 /Flags 32 /FontBBox [-568 -307 2029 1006] /FontName /NHHCFL+TimesNewRomanPSMT /ItalicAngle 0 /StemV 0 /Leading 42 /MaxWidth 2000 /XHeight 454 /FontFile2 12 0 R >> endobj 15 0 obj [ 250 0 0 0 0 0 0 0 0 0 0 0 250 0 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 556 0 0 0 0 0 0 0 0 0 556 0 0 556 611 0 0 944 0 0 0 0 0 0 0 0 0 444 0 444 500 444 333 0 500 278 0 0 278 0 500 500 500 0 333 389 278 0 0 0 500 500 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NHHCFL+TimesNewRomanPSMT /FontDescriptor 14 0 R /Widths 15 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 1 0 obj << /Title (solr-word) /Author (Grant Ingersoll) /Subject (solr word) /AAPL:Keywords [ (solr, word, pdf) ] /Keywords (solr, word, pdf) /Creator (Microsoft Word) /Producer (Mac OS X 10.5.5 Quartz PDFContext) /CreationDate (D:20081113133551Z00'00') /ModDate (D:20081113133551Z00'00') >> endobj xref 0 16 0000000000 65535 f 0000020275 00000 n 0000000437 00000 n 0000001588 00000 n 0000000022 00000 n 0000000418 00000 n 0000000541 00000 n 0000001553 00000 n 0000020093 00000 n 0000000639 00000 n 0000001533 00000 n 0000001671 00000 n 0000001721 00000 n 0000019576 00000 n 0000019598 00000 n 0000019843 00000 n trailer << /Size 16 /Root 11 0 R /Info 1 0 R /ID [ <6b8708c3178614e61c264756c0036b1a> <6b8708c3178614e61c264756c0036b1a> ] >> startxref 20574 %%EOF solr-2.8.1/tests/docker/collections/collection1.json0000644000175000017500000003221515001737315021470 0ustar biggibiggi[ { "id": "GB18030TEST", "name": [ "Test with some GB18030 encoded characters" ], "features": [ "No accents here", "这是一个功能", "This is a feature (translated)", "这份文件是很有光泽", "This document is very shiny (translated)" ], "price": [ 0 ], "inStock": [ true ] }, { "id": "SP2514N", "name": [ "Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133" ], "manu": [ "Samsung Electronics Co. Ltd." ], "manu_id_s": "samsung", "cat": [ "electronics", "hard drive" ], "features": [ "7200RPM, 8MB cache, IDE Ultra ATA-133", "NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor" ], "price": [ 92 ], "popularity": [ 6 ], "inStock": [ true ], "manufacturedate_dt": "2006-02-13T15:26:37Z", "store": [ "35.0752,-97.032" ] }, { "id": "6H500F0", "name": [ "Maxtor DiamondMax 11 - hard drive - 500 GB - SATA-300" ], "manu": [ "Maxtor Corp." ], "manu_id_s": "maxtor", "cat": [ "electronics", "hard drive" ], "features": [ "SATA 3.0Gb/s, NCQ", "8.5ms seek", "16MB cache" ], "price": [ 350 ], "popularity": [ 6 ], "inStock": [ true ], "store": [ "45.17614,-93.87341" ], "manufacturedate_dt": "2006-02-13T15:26:37Z" }, { "id": "F8V7067-APL-KIT", "name": [ "Belkin Mobile Power Cord for iPod w/ Dock" ], "manu": [ "Belkin" ], "manu_id_s": "belkin", "cat": [ "electronics", "connector" ], "features": [ "car power adapter, white" ], "weight": [ 4 ], "price": [ 19.95 ], "popularity": [ 1 ], "inStock": [ false ], "store": [ "45.18014,-93.87741" ], "manufacturedate_dt": "2005-08-01T16:30:25Z" }, { "id": "IW-02", "name": [ "iPod & iPod Mini USB 2.0 Cable" ], "manu": [ "Belkin" ], "manu_id_s": "belkin", "cat": [ "electronics", "connector" ], "features": [ "car power adapter for iPod, white" ], "weight": [ 2 ], "price": [ 11.5 ], "popularity": [ 1 ], "inStock": [ false ], "store": [ "37.7752,-122.4232" ], "manufacturedate_dt": "2006-02-14T23:55:59Z" }, { "id": "MA147LL/A", "name": [ "Apple 60 GB iPod with Video Playback Black" ], "manu": [ "Apple Computer Inc." ], "manu_id_s": "apple", "cat": [ "electronics", "music" ], "features": [ "iTunes, Podcasts, Audiobooks", "Stores up to 15,000 songs, 25,000 photos, or 150 hours of video", "2.5-inch, 320x240 color TFT LCD display with LED backlight", "Up to 20 hours of battery life", "Plays AAC, MP3, WAV, AIFF, Audible, Apple Lossless, H.264 video", "Notes, Calendar, Phone book, Hold button, Date display, Photo wallet, Built-in games, JPEG photo playback, Upgradeable firmware, USB 2.0 compatibility, Playback speed control, Rechargeable capability, Battery level indication" ], "includes": [ "earbud headphones, USB cable" ], "weight": [ 5.5 ], "price": [ 399 ], "popularity": [ 10 ], "inStock": [ true ], "store": [ "37.7752,-100.0232" ], "manufacturedate_dt": "2005-10-12T08:00:00Z" }, { "id": "adata", "compName_s": "A-Data Technology", "address_s": "46221 Landing Parkway Fremont, CA 94538" }, { "id": "apple", "compName_s": "Apple", "address_s": "1 Infinite Way, Cupertino CA" }, { "id": "asus", "compName_s": "ASUS Computer", "address_s": "800 Corporate Way Fremont, CA 94539" }, { "id": "ati", "compName_s": "ATI Technologies", "address_s": "33 Commerce Valley Drive East Thornhill, ON L3T 7N6 Canada" }, { "id": "belkin", "compName_s": "Belkin", "address_s": "12045 E. Waterfront Drive Playa Vista, CA 90094" }, { "id": "canon", "compName_s": "Canon, Inc.", "address_s": "One Canon Plaza Lake Success, NY 11042" }, { "id": "corsair", "compName_s": "Corsair Microsystems", "address_s": "46221 Landing Parkway Fremont, CA 94538" }, { "id": "dell", "compName_s": "Dell, Inc.", "address_s": "One Dell Way Round Rock, Texas 78682" }, { "id": "maxtor", "compName_s": "Maxtor Corporation", "address_s": "920 Disc Drive Scotts Valley, CA 95066" }, { "id": "samsung", "compName_s": "Samsung Electronics Co. Ltd.", "address_s": "105 Challenger Rd. Ridgefield Park, NJ 07660-0511" }, { "id": "viewsonic", "compName_s": "ViewSonic Corp", "address_s": "381 Brea Canyon Road Walnut, CA 91789-0708" }, { "id": "TWINX2048-3200PRO", "name": [ "CORSAIR XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail" ], "manu": [ "Corsair Microsystems Inc." ], "manu_id_s": "corsair", "cat": [ "electronics", "memory" ], "features": [ "CAS latency 2,\t2-3-3-6 timing, 2.75v, unbuffered, heat-spreader" ], "price": [ 185 ], "popularity": [ 5 ], "inStock": [ true ], "store": [ "37.7752,-122.4232" ], "manufacturedate_dt": "2006-02-13T15:26:37Z", "payloads": [ "electronics|6.0 memory|3.0" ] }, { "id": "VS1GB400C3", "name": [ "CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail" ], "manu": [ "Corsair Microsystems Inc." ], "manu_id_s": "corsair", "cat": [ "electronics", "memory" ], "price": [ 74.99 ], "popularity": [ 7 ], "inStock": [ true ], "store": [ "37.7752,-100.0232" ], "manufacturedate_dt": "2006-02-13T15:26:37Z", "payloads": [ "electronics|4.0 memory|2.0" ] }, { "id": "VDBDB1A16", "name": [ "A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM" ], "manu": [ "A-DATA Technology Inc." ], "manu_id_s": "corsair", "cat": [ "electronics", "memory" ], "features": [ "CAS latency 3,\t 2.7v" ], "popularity": [ 0 ], "inStock": [ true ], "store": [ "45.18414,-93.88141" ], "manufacturedate_dt": "2006-02-13T15:26:37Z", "payloads": [ "electronics|0.9 memory|0.1" ] }, { "id": "USD", "name": [ "One Dollar" ], "manu": [ "Bank of America" ], "manu_id_s": "boa", "cat": [ "currency" ], "features": [ "Coins and notes" ], "price_c": "1,USD", "inStock": [ true ] }, { "id": "EUR", "name": [ "One Euro" ], "manu": [ "European Union" ], "manu_id_s": "eu", "cat": [ "currency" ], "features": [ "Coins and notes" ], "price_c": "1,EUR", "inStock": [ true ] }, { "id": "GBP", "name": [ "One British Pound" ], "manu": [ "U.K." ], "manu_id_s": "uk", "cat": [ "currency" ], "features": [ "Coins and notes" ], "price_c": "1,GBP", "inStock": [ true ] }, { "id": "NOK", "name": [ "One Krone" ], "manu": [ "Bank of Norway" ], "manu_id_s": "nor", "cat": [ "currency" ], "features": [ "Coins and notes" ], "price_c": "1,NOK", "inStock": [ true ] }, { "id": "3007WFP", "name": [ "Dell Widescreen UltraSharp 3007WFP" ], "manu": [ "Dell, Inc." ], "manu_id_s": "dell", "cat": [ "electronics and computer1" ], "features": [ "30\" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast" ], "includes": [ "USB cable" ], "weight": [ 401.6 ], "price": [ 2199 ], "popularity": [ 6 ], "inStock": [ true ], "store": [ "43.17614,-90.57341" ] }, { "id": "VA902B", "name": [ "ViewSonic VA902B - flat panel display - TFT - 19\"" ], "manu": [ "ViewSonic Corp." ], "manu_id_s": "viewsonic", "cat": [ "electronics and stuff2" ], "features": [ "19\" TFT active matrix LCD, 8ms response time, 1280 x 1024 native resolution" ], "weight": [ 190.4 ], "price": [ 279.95 ], "popularity": [ 6 ], "inStock": [ true ], "store": [ "45.18814,-93.88541" ] }, { "id": "0579B002", "name": [ "Canon PIXMA MP500 All-In-One Photo Printer" ], "manu": [ "Canon Inc." ], "manu_id_s": "canon", "cat": [ "electronics", "multifunction printer", "printer", "scanner", "copier" ], "features": [ "Multifunction ink-jet color photo printer", "Flatbed scanner, optical scan resolution of 1,200 x 2,400 dpi", "2.5\" color LCD preview screen", "Duplex Copying", "Printing speed up to 29ppm black, 19ppm color", "Hi-Speed USB", "memory card: CompactFlash, Micro Drive, SmartMedia, Memory Stick, Memory Stick Pro, SD Card, and MultiMediaCard" ], "weight": [ 352 ], "price": [ 179.99 ], "popularity": [ 6 ], "inStock": [ true ], "store": [ "45.19214,-93.89941" ] }, { "id": "9885A004", "name": [ "Canon PowerShot SD500" ], "manu": [ "Canon Inc." ], "manu_id_s": "canon", "cat": [ "electronics", "camera" ], "features": [ "3x zoop, 7.1 megapixel Digital ELPH", "movie clips up to 640x480 @30 fps", "2.0\" TFT LCD, 118,000 pixels", "built in flash, red-eye reduction" ], "includes": [ "32MB SD card, USB cable, AV cable, battery" ], "weight": [ 6.4 ], "price": [ 329.95 ], "popularity": [ 7 ], "inStock": [ true ], "manufacturedate_dt": "2006-02-13T15:26:37Z", "store": [ "45.19614,-93.90341" ] }, { "id": "SOLR1000", "name": [ "Solr, the Enterprise Search Server" ], "manu": [ "Apache Software Foundation" ], "cat": [ "software", "search" ], "features": [ "Advanced Full-Text Search Capabilities using Lucene", "Optimized for High Volume Web Traffic", "Standards Based Open Interfaces - XML and HTTP", "Comprehensive HTML Administration Interfaces", "Scalability - Efficient Replication to other Solr Search Servers", "Flexible and Adaptable with XML configuration and Schema", "Good unicode support: héllo (hello with an accent over the e)" ], "price": [ 0 ], "popularity": [ 10 ], "inStock": [ true ], "incubationdate_dt": "2006-01-17T00:00:00Z" }, { "id": "UTF8TEST", "name": [ "Test with some UTF-8 encoded characters" ], "manu": [ "Apache Software Foundation" ], "cat": [ "software", "search" ], "features": [ "No accents here", "This is an e acute: é", "eaiou with circumflexes: êâîôû", "eaiou with umlauts: ëäïöü", "tag with escaped chars: ", "escaped ampersand: Bonnie & Clyde", "Outside the BMP:ðŒˆ codepoint=10308, a circle with an x inside. UTF8=f0908c88 UTF16=d800 df08" ], "price": [ 0 ], "inStock": [ true ] }, { "id": "EN7800GTX/2DHTV/256M", "name": [ "ASUS Extreme N7800GTX/2DHTV (256 MB)" ], "manu": [ "ASUS Computer Inc." ], "manu_id_s": "asus", "cat": [ "electronics", "graphics card" ], "features": [ "NVIDIA GeForce 7800 GTX GPU/VPU clocked at 486MHz", "256MB GDDR3 Memory clocked at 1.35GHz", "PCI Express x16", "Dual DVI connectors, HDTV out, video input", "OpenGL 2.0, DirectX 9.0" ], "weight": [ 16 ], "price": [ 479.95 ], "popularity": [ 7 ], "store": [ "40.7143,-74.006" ], "inStock": [ false ], "manufacturedate_dt": "2006-02-13T00:00:00Z" }, { "id": "100-435805", "name": [ "ATI Radeon X1900 XTX 512 MB PCIE Video Card" ], "manu": [ "ATI Technologies" ], "manu_id_s": "ati", "cat": [ "electronics", "graphics card" ], "features": [ "ATI RADEON X1900 GPU/VPU clocked at 650MHz", "512MB GDDR3 SDRAM clocked at 1.55GHz", "PCI Express x16", "dual DVI, HDTV, svideo, composite out", "OpenGL 2.0, DirectX 9.0" ], "weight": [ 48 ], "price": [ 649.99 ], "popularity": [ 7 ], "inStock": [ false ], "manufacturedate_dt": "2006-02-13T00:00:00Z", "store": [ "40.7143,-74.006" ] } ] solr-2.8.1/tests/docker/collections/metal_store.json0000644000175000017500000000413015001737315021565 0ustar biggibiggi[ { "id": "1", "name_s": "Immortal - At the heart of winter", "cat": [ "tops", "tshirts" ], "artist_s": "Immortal", "content_type_s": "product", "_childDocuments_": [ { "id": "IMM-HOW-S", "size_s": "small", "inventory_i": 200, "content_type_s": "sku", "_version_": 1756623851107647500 }, { "id": "IMM-HOW-M", "size_s": "medium", "inventory_i": 120, "content_type_s": "sku", "_version_": 1756623851109744600 }, { "id": "IMM-HOW-L", "size_s": "large", "inventory_i": 100, "content_type_s": "sku", "_version_": 1756623851109744600 }, { "id": "IMM-HOW-XL", "size_s": "xlarge", "inventory_i": 50, "content_type_s": "sku", "_version_": 1756623851110793200 } ] }, { "id": "2", "name_s": "Korpiklaani - Spirit Of the Forest", "artist_s": "Korpiklaani", "cat": [ "tops", "tshirts" ], "content_type_s": "product", "_childDocuments_": [ { "id": "KOR-SOF-M", "size_s": "medium", "inventory_i": 120, "content_type_s": "sku" }, { "id": "KOR-SOF-L", "size_s": "large", "inventory_i": 100, "content_type_s": "sku" }, { "id": "KOR-SOF-XL", "size_s": "xlarge", "inventory_i": 50, "content_type_s": "sku" } ] }, { "id": "3", "name_s": "Satyricon - Nemesis Divina", "artist_s": "Satyricon", "cat": [ "tops", "tshirts" ], "content_type_s": "product", "_childDocuments_": [ { "id": "SATY-ND-M", "size_s": "medium", "inventory_i": 120, "content_type_s": "sku" }, { "id": "SATY-ND-L", "size_s": "large", "inventory_i": 100, "content_type_s": "sku" }, { "id": "SATY-ND-XL", "size_s": "xlarge", "inventory_i": 50, "content_type_s": "sku" } ] } ] solr-2.8.1/tests/docker/Dockerfile0000644000175000017500000000075515001737315016041 0ustar biggibiggiFROM solr:6.3 COPY collections collections RUN solr start &&\ solr create -c collection1 &&\ solr create -c metal_store &&\ solr create -c myfiles &&\ curl 'http://localhost:8983/solr/collection1/update/json?commit=true' --data-binary @collections/collection1.json -H 'Content-type:application/json' &&\ curl 'http://localhost:8983/solr/metal_store/update/json?commit=true' --data-binary @collections/metal_store.json -H 'Content-type:application/json' &&\ solr stop solr-2.8.1/tests/skip.if.server_not_configured.inc0000644000175000017500000000015615001737315021223 0ustar biggibiggi solr-2.8.1/tests/test.config.inc0000644000175000017500000000407015001737315015510 0ustar biggibiggi solr-2.8.1/tests/bootstrap.inc0000644000175000017500000000077615001737315015313 0ustar biggibiggigetCode(), $e->getMessage()). PHP_EOL; } /** * Prints a test case title * * @param int $case_id * @param string $title */ function case_title(int $case_id, string $title) { $caseTemplate = PHP_EOL . "case #%d: %s" . PHP_EOL; echo sprintf($caseTemplate, $case_id, $title); } solr-2.8.1/tests/000.solr_int_arg.phpt0000644000175000017500000000266115001737315016453 0ustar biggibiggi--TEST-- Solr - Accept int (non-strict mode --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); case_title(1, 'No arguments passed'); $client = new SolrClient($options); $updateResponse = $client->optimize(); print $updateResponse->getRawRequest(); case_title(2, 'int argument passed'); $updateResponse = $client->optimize(4, true, false); print $updateResponse->getRawRequest(); case_title(3, 'string argument passed'); $updateResponse = $client->optimize('5', true, false); print $updateResponse->getRawRequest(); case_title(4, 'object argument passed'); try { $updateResponse = $client->optimize(new StdClass()); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage() . PHP_EOL; } --EXPECTF-- case #1: No arguments passed case #2: int argument passed case #3: string argument passed case #4: object argument passed maxSegments must be of type int.solr-2.8.1/tests/000.solr_int_arg_strict.phpt0000644000175000017500000000261715001737315020044 0ustar biggibiggi--TEST-- Solr - Accept int (strict mode) --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); case_title(1, 'No arguments passed'); $updateResponse = $client->optimize(); print $updateResponse->getRawRequest(); case_title(2, 'int argument passed'); $updateResponse = $client->optimize(4, true, false); print $updateResponse->getRawRequest(); case_title(3, 'string argument passed'); try { $updateResponse = $client->optimize('5', true, false); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage() . PHP_EOL; } case_title(4, 'object argument passed'); try { $updateResponse = $client->optimize(new StdClass()); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage() . PHP_EOL; } ?> --EXPECTF-- case #1: No arguments passed case #2: int argument passed case #3: string argument passed case #4: object argument passed maxSegments must be of type int.solr-2.8.1/tests/000.solrclient_ping.phpt0000664000175000017500000000110215001737315017153 0ustar biggibiggi--TEST-- SolrClient::ping() - Ping Solr Server --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $pingResponse = $client->ping(); echo $pingResponse->getRawResponse(); ?> --EXPECT-- HTTP/1.1 200 OK Content-Type: application/xml; charset=UTF-8 Content-Length: 0solr-2.8.1/tests/000.solr_server_compat.phpt0000664000175000017500000000125015001737315017674 0ustar biggibiggi--TEST-- Solr Server 4+ Compatibility Test --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $query_response = $client->system(); $solrVersion = $query_response->getResponse()->lucene['solr-spec-version']; $match = preg_match('#([0-9]+)\.[0-9]+\.[0-9]+#', $solrVersion, $matches); var_dump($matches[1] >=4 ); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/001.solrclient_addDocument_partial.phpt0000664000175000017500000000711615001737315022175 0ustar biggibiggi--TEST-- SolrClient::addDocumnt() - Partial Update (integration) --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $printDocument = function() use ($client) { $response = $client->getById('testing_partials'); print_r($response->getResponse()); }; // clean up, before running the test $client->deleteById('testing_partials'); $client->commit(); $initialDoc = new SolrInputDocument(); $initialDoc->addField('id', 'testing_partials'); $initialDoc->addField('field1', 'existing value'); $initialDoc->addField('field1', 'remove me please'); $initialDoc->addField('field1', '15/01/2007'); $initialDoc->addField('field2_s', 'initialField'); $initialDoc->addField('field3_i', 0); $initialDoc->addField('field4', 'val1'); $initialDoc->addField('field5_s', 'unmodified field'); $client->addDocument($initialDoc); $client->commit(); separator('INITIAL'); $printDocument(); $doc = new SolrInputDocument(); $doc->addField('id', 'testing_partials'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_ADD, 'newly added value'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVE, 'remove me please'); $doc->updateField('field3_i', SolrInputDocument::UPDATE_MODIFIER_INC, 5); $doc->updateField('field2_s', SolrInputDocument::UPDATE_MODIFIER_SET, 'updated string'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVEREGEX, '[\d]{2}/[\d]{2}/[\d]{4}'); $response = $client->addDocument($doc); $client->commit(); separator('RAW REQUEST'); print_r($response->getRawRequest()); $client->commit(); separator('RESULT AFTER UPDATE'); $printDocument(); ?> --EXPECTF-- =================================== INITIAL ==================================== SolrObject Object ( [doc] => SolrObject Object ( [id] => testing_partials [field1] => Array ( [0] => existing value [1] => remove me please [2] => 15/01/2007 ) [field2_s] => initialField [field3_i] => 0 [field4] => Array ( [0] => val1 ) [field5_s] => unmodified field [_version_] => %d ) ) ================================= RAW REQUEST ================================== testing_partials newly added value remove me please [\d]{2}/[\d]{2}/[\d]{4} 5 updated string ============================= RESULT AFTER UPDATE ============================== SolrObject Object ( [doc] => SolrObject Object ( [id] => testing_partials [field1] => Array ( [0] => existing value [1] => newly added value ) [field2_s] => updated string [field3_i] => 5 [field4] => Array ( [0] => val1 ) [field5_s] => unmodified field [_version_] => %d ) ) solr-2.8.1/tests/001.solrclient_addDocument.phpt0000664000175000017500000000176415001737315020464 0ustar biggibiggi--TEST-- SolrClient::addDocument() - sending document to the Solr server --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc2 = new SolrInputDocument(); $doc2->addField('id', 12345); $doc->addField('cat', 'Category1'); $doc->addField('cat', 'Category2'); $updateResponse = $client->addDocument($doc, true, 500); $updateResponse = $client->addDocument($doc2, true, 500); print_r($updateResponse->getResponse()); ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => %d ) ) solr-2.8.1/tests/002.solrclient_addDocuments.phpt0000664000175000017500000000175315001737315020646 0ustar biggibiggi--TEST-- SolrClient::addDocuments() - sending multiple documents to the Solr server --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc2 = new SolrInputDocument(); $doc2->addField('id', 12345); $doc->addField('cat', 'Category1'); $doc->addField('cat', 'Category2'); $docs = array($doc, $doc2); $updateResponse = $client->addDocuments($docs); $client->commit(); print_r($updateResponse->getResponse()); ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => %d ) ) solr-2.8.1/tests/003.solrclient_addDocument_no_overwrite.phpt0000664000175000017500000000156015001737315023262 0ustar biggibiggi--TEST-- SolrClient::addDocument() - Overwrite an existing document --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Solr'); $updateResponse = $client->addDocument($doc, false); $client->commit(); print $updateResponse->getRawRequest(); ?> --EXPECT-- 334455 Software Solr solr-2.8.1/tests/003.solrclient_addDocuments_commitwithin.phpt0000664000175000017500000000174315001737315023441 0ustar biggibiggi--TEST-- SolrClient::addDocuments() - sending multiple documents to the Solr server --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc2 = new SolrInputDocument(); $doc2->addField('id', 12345); $doc->addField('cat', 'Category1'); $doc->addField('cat', 'Category2'); $docs = array($doc, $doc2); $updateResponse = $client->addDocuments($docs, true, 500); print_r($updateResponse->getResponse()); ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => %d ) ) solr-2.8.1/tests/003.solrclient_options.phpt0000644000175000017500000000543115001737315017723 0ustar biggibiggi--TEST-- SolrClient::__construct() - Test options --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'port' => SOLR_SERVER_PORT, 'password' => SOLR_SERVER_PASSWORD, 'path' => SOLR_SERVER_PATH, 'timeout' => 400 ); $client = new SolrClient($options); $pingResponse = $client->ping(); print_r($pingResponse->getRawResponse()); $options = array ( 'hostname' => SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'port' => strval(SOLR_SERVER_PORT), 'password' => SOLR_SERVER_PASSWORD, 'path' => '/'.SOLR_SERVER_PATH, 'timeout' => '400' ); $client = new SolrClient($options); $pingResponse = $client->ping(); print_r($pingResponse->getRawResponse()); $options = array ( 'hostname' => SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'port' => SOLR_SERVER_PORT, 'password' => SOLR_SERVER_PASSWORD, 'path' => SOLR_SERVER_PATH, 'proxy_host' => 'localhost', 'proxy_login' => 'test', 'proxy_password' => 'password', 'proxy_port' => 8181, 'query_string_delimiter' => '&' ); $client = new SolrClient($options); try { $pingResponse = $client->ping(); } catch (SolrClientException $e) { print_exception($e); } $options = array ( 'hostname' => SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'port' => SOLR_SERVER_PORT, 'password' => SOLR_SERVER_PASSWORD, 'path' => SOLR_SERVER_PATH, 'proxy_host' => 'localhost', 'proxy_login' => 'test', 'proxy_password' => 'password', 'proxy_port' => '8181', 'query_string_delimiter' => '&' ); $client = new SolrClient($options); try { $pingResponse = $client->ping(); } catch (SolrClientException $e) { print_exception($e); } try { $client = new SolrClient(array()); } catch (SolrIllegalArgumentException $e) { print_exception($e); } $options = array ( 'hostname' => SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'port' => SOLR_SERVER_PORT, 'password' => SOLR_SERVER_PASSWORD, 'path' => SOLR_SERVER_PATH, 'ssl_cert' => '/tmp/unavailable.crt', 'ssl_key' => 'test', 'ssl_keypassword' => 'test', 'ssl_cainfo' => 'test', 'ssl_capath' => '/tmp/' ); $client = new SolrClient($options); try { $pingResponse = $client->ping(); } catch (SolrClientException $e) { print_exception($e); } ?> --EXPECTF-- HTTP/1.1 200 OK Content-Type: application/xml; charset=UTF-8 Content-Length: 0 HTTP/1.1 200 OK Content-Type: application/xml; charset=UTF-8 Content-Length: 0 SolrClientException 1004: Solr HTTP Error 7: 'Couldn't connect to server' SolrClientException 1004: Solr HTTP Error 7: 'Couldn't connect to server' SolrIllegalArgumentException 4000: The SolrClient options cannot be an empty array solr-2.8.1/tests/004.solrclient_query_response.phpt0000664000175000017500000000201515001737315021311 0ustar biggibiggi--TEST-- SolrClient::query() - Sending a chained query request --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $response = $query_response->getResponse(); var_dump(get_class($response->responseHeader->params) == 'SolrObject'); var_dump(property_exists($response->responseHeader->params, 'q')); var_dump(property_exists($response->responseHeader->params, 'wt')); var_dump(property_exists($response->responseHeader->params, 'version')); ?> --EXPECTF-- bool(true) bool(true) bool(true) bool(true)solr-2.8.1/tests/004.solrclient_query_terms.phpt0000664000175000017500000000214615001737315020612 0ustar biggibiggi--TEST-- SolrClient::query() - Terms component --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $query->setTerms(true); $query->setTermsField('name'); $query->setTermsLowerBound('a'); $query->setTermsSort(SolrQuery::TERMS_SORT_INDEX); $query_response = $client->query($query); echo $query_response->getRequestUrl() .PHP_EOL; print_r($query_response->getResponse()); ?> --EXPECTF-- http://%s/solr/collection1/terms/?version=2.2&indent=on&wt=xml SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) [terms] => SolrObject Object ( [name] => SolrObject Object ( [iPod & iPod Mini USB 2.0 Cable] => %d ) ) ) solr-2.8.1/tests/005.solrclient_query_error.phpt0000664000175000017500000000133315001737315020607 0ustar biggibiggi--TEST-- SolrClient::query() - throw SolrClientException on Solr Server exception --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $query = new SolrQuery("lucene\\"); try { $query_response = $client->query($query); } catch (SolrServerException $e) { echo $e->getMessage(); } ?> --EXPECTF-- %s: Cannot parse 'lucene\': Lexical error at line 1, column 8. Encountered: after : ""solr-2.8.1/tests/006.solrclient_system.phpt0000664000175000017500000000120415001737315017553 0ustar biggibiggi--TEST-- SolrClient::system() - Retrieve Solr Server/System Info --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $genericResponse = $client->system(); var_dump(get_class($genericResponse->getResponse())) . PHP_EOL; var_dump(get_class($genericResponse->getResponse()->system)); ?> --EXPECTF-- string(10) "SolrObject" string(10) "SolrObject" solr-2.8.1/tests/007.solrclient_deleteById.phpt0000664000175000017500000000124615001737315020250 0ustar biggibiggi--TEST-- SolrClient::deleteById() - Testing deleting a document by ID --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->deleteById('334457'); $client->commit(); print_r($response->getResponse()); ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) ) solr-2.8.1/tests/007.solrclient_deleteByIds.phpt0000664000175000017500000000216615001737315020435 0ustar biggibiggi--TEST-- SolrClient::deleteByIds() - Test deleting documents by an array of IDS --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->deleteByIds(array('334455','334456')); $client->commit(); print_r($response->getResponse()); try { $client->deleteByIds(array(0)); } catch (SolrIllegalArgumentException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()). PHP_EOL; } try { $client->deleteByIds(array('334455', '')); } catch (SolrIllegalArgumentException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()). PHP_EOL; } ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) ) Exception 4000: Id number 1 is not a valid string Exception 4000: Id number 2 is not a valid stringsolr-2.8.1/tests/008.solrclient_commit.phpt0000664000175000017500000000153615001737315017531 0ustar biggibiggi--TEST-- SolrClient::commit() - Testing commit --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $updateResponse = $client->commit(); print $updateResponse->getRawRequest(); $updateResponse = $client->commit(true,false,true); print $updateResponse->getRawRequest(); $updateResponse = $client->commit(true,false,true); ?> --EXPECTF-- solr-2.8.1/tests/008.solrclient_rollback.phpt0000664000175000017500000000105115001737315020022 0ustar biggibiggi--TEST-- SolrClient::rollback() - Testing rollback --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $updateResponse = $client->rollback(); print $updateResponse->getRawRequest(); ?> --EXPECTF-- solr-2.8.1/tests/009.solrclient_optimize.phpt0000644000175000017500000000175415001737315020102 0ustar biggibiggi--TEST-- SolrClient::optimize() - Testing optimize --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $updateResponse = $client->optimize(); print $updateResponse->getRawRequest(); $updateResponse = $client->optimize(4,true,false); print $updateResponse->getRawRequest(); $updateResponse = $client->optimize('5',true,false); print $updateResponse->getRawRequest(); ?> --EXPECTF-- solr-2.8.1/tests/010.solrclient_getOptions.phpt0000664000175000017500000000140615001737315020361 0ustar biggibiggi--TEST-- SolrClient::getOptions - Returning all the default options --FILE-- false); $client = new SolrClient($options); var_dump($client->getOptions()); ?> --EXPECTF-- array(17) { ["timeout"]=> int(30) ["secure"]=> bool(false) ["hostname"]=> string(9) "localhost" ["wt"]=> string(3) "xml" ["port"]=> int(8983) ["proxy_host"]=> string(0) "" ["proxy_port"]=> int(0) ["path"]=> string(4) "solr" ["http_auth"]=> string(0) "" ["proxy_auth"]=> string(0) "" ["ssl_verify_peer"]=> bool(false) ["ssl_verify_host"]=> int(2) ["ssl_cert"]=> string(0) "" ["ssl_key"]=> string(0) "" ["ssl_keypassword"]=> string(0) "" ["ssl_cainfo"]=> string(0) "" ["ssl_capath"]=> string(0) "" } solr-2.8.1/tests/011.solrclient_phps_response.phpt0000664000175000017500000000074415001737315021123 0ustar biggibiggi--TEST-- SolrClient - PHPS response writer support --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient ( $options ); $client->setResponseWriter('phps'); $options = $client->getOptions(); var_dump($options['wt'] == 'phps'); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/012.solrclient_getById.phpt0000664000175000017500000000117015001737315017555 0ustar biggibiggi--TEST-- SolrClient::getById() - Testing Real Time Get by id --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->getById('GB18030TEST'); var_dump(isset($response->getArrayResponse()['doc'])).PHP_EOL; var_dump($response->getResponse()->doc->id) . PHP_EOL; ?> --EXPECTF-- bool(true) string(11) "GB18030TEST"solr-2.8.1/tests/013.solrclient_getByIds.phpt0000664000175000017500000000271615001737315017750 0ustar biggibiggi--TEST-- SolrClient::getByIds() - Testing Real Time Get by ids --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->getByIds(['GB18030TEST', '6H500F0']); var_dump(isset($response->getArrayResponse()['response']['docs'])) . PHP_EOL; var_dump($response->getResponse()->response->start) . PHP_EOL; try { $response = $client->getByIds(['GB18030TEST', '']); } catch (Exception $e) { printf("Exception %d: %s", $e->getCode(), $e->getMessage()); } echo PHP_EOL.PHP_EOL; // make sure request was reset $response = $client->getByIds(['GB18030TEST']); $headers = explode(PHP_EOL, trim($response->getRawRequestHeaders())); $headers = array_filter($headers, function($header) { return strstr($header, 'collection1') !== false; }); print_r(implode(PHP_EOL, $headers).PHP_EOL); echo PHP_EOL; try { $response = $client->getByIds([]); } catch (Exception $e) { printf("Exception %d: %s", $e->getCode(), $e->getMessage()); } ?> --EXPECTF-- bool(true) int(0) Exception 4000: Invalid id at position 1 GET /solr/collection1/get/?version=2.2&indent=on&wt=xml&ids=GB18030TEST HTTP/1.1 Exception 4000: Invalid parameter: at least 1 ID is required. Passed an empty array. solr-2.8.1/tests/014.solrclient_addDocument_nested_document.phpt0000664000175000017500000000407615001737315023727 0ustar biggibiggi--TEST-- SolrClient::addDocument() - Sending a document with child documents --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 'CTEST_1'); $doc->addField('title', 'Solr adds block join support'); $doc->addField('content_type', 'parentDocument'); $doc2 = new SolrInputDocument(); $doc2->addField('id', 'CTEST_2'); $doc2->addField('comment_t', 'SolrCloud supports it too!'); $doc3 = new SolrInputDocument(); $doc3->addField('id', 'CTEST_3'); $doc3->addField('comment_t', 'Lots of features'); $doc->addChildDocument($doc2); $doc->addChildDocument($doc3); $doc4 = new SolrInputDocument(); $doc4->addField('id', 'CTEST_4'); $doc4->addField('comment_t', 'Child Child'); $doc3->addChildDocument($doc4); $docs = $doc->getChildDocuments(); $docs[0]->addField('one_more_field_t', 'testing'); $updateResponse = $client->addDocument($doc); print_r($updateResponse->getRawRequest()); print_r($updateResponse->getResponse()); $client->commit(); ?> --EXPECTF-- CTEST_1 Solr adds block join support parentDocument CTEST_2 SolrCloud supports it too! testing CTEST_3 Lots of features CTEST_4 Child Child SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) )solr-2.8.1/tests/015.solrclient_addDocuments_nested_document.phpt0000664000175000017500000000403415001737315024105 0ustar biggibiggi--TEST-- SolrClient::addDocuments() - Sending multiple documents with child documents --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 'CTEST_1'); $doc->addField('title', 'Solr adds block join support'); $doc->addField('content_type', 'parentDocument'); $doc2 = new SolrInputDocument(); $doc2->addField('id', 'CTEST_2'); $doc2->addField('comment_t', 'SolrCloud supports it too!'); $doc3 = new SolrInputDocument(); $doc3->addField('id', 'CTEST_3'); $doc3->addField('content_type', 'parentDocument'); $doc3->addField('comment_t', 'Lots of features'); $doc4 = new SolrInputDocument(); $doc4->addField('id', 'CTEST_4'); $doc4->addField('comment_t', 'Cool features'); $doc->addChildDocument($doc2); $doc3->addChildDocument($doc4); $documents = [$doc, $doc3]; $updateResponse = $client->addDocuments($documents); print_r($updateResponse->getRawRequest()); print_r($updateResponse->getResponse()); $client->commit(); ?> --EXPECTF-- CTEST_1 Solr adds block join support parentDocument CTEST_2 SolrCloud supports it too! CTEST_3 parentDocument Lots of features CTEST_4 Cool features SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) )solr-2.8.1/tests/016.solrclient_request.phpt0000664000175000017500000000176215001737315017731 0ustar biggibiggi--TEST-- SolrClient::Request() - Sending custom update request --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $rawAtomicUpdateRequest = << IW-02 1 New Atomic Update Feature true REQ; $response = $client->request($rawAtomicUpdateRequest)->getResponse(); $client->commit(); print_r($response); ?> --EXPECTF-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) )solr-2.8.1/tests/016.solrclient_sendUpdateStream_bin.phpt0000664000175000017500000000207715001737315022341 0ustar biggibiggi--TEST-- SolrClient::sendUpdateStream - send SolrExtractRequest (bin) --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_FILES_PATH, ); $client = new SolrClient($options); $extractParams = new SolrModifiableParams(); $extractParams ->set(SolrExtractRequest::LITERALS_PREFIX . 'id', 'doc1') ->set(SolrExtractRequest::CAPTURE_ELEMENTS, 'p') ->set(SolrExtractRequest::FIELD_MAPPING_PREFIX . 'p', 'text') ; $binContent = file_get_contents(EXTRACT_FILE_1); $extractRequest = SolrExtractRequest::createFromStream($binContent, 'application/pdf', $extractParams); $response = $client->sendUpdateStream($extractRequest); $client->rollback(); echo $response->getHttpStatus() . PHP_EOL; echo $response->getRequestUrl() . PHP_EOL; ?> --EXPECTF-- 200 http://%s/update/extract/?version=2.2&indent=on&wt=xml&literal.id=doc1&capture=p&fmap.p=text solr-2.8.1/tests/016.solrclient_sendUpdateStream_file.phpt0000664000175000017500000000177415001737315022513 0ustar biggibiggi--TEST-- SolrClient::sendUpdateStream - send SolrExtractRequest (file) --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_FILES_PATH, ); $client = new SolrClient($options); $extractParams = new SolrModifiableParams(); $extractParams ->set(SolrExtractRequest::LITERALS_PREFIX . 'id', 'doc1') ->set(SolrExtractRequest::CAPTURE_ELEMENTS, 'p') ->set(SolrExtractRequest::FIELD_MAPPING_PREFIX . 'p', 'text') ; $extractRequest = SolrExtractRequest::createFromFile(EXTRACT_FILE_1, $extractParams); $response = $client->sendUpdateStream($extractRequest); $client->rollback(); echo $response->getHttpStatus() . PHP_EOL; echo $response->getRequestUrl() . PHP_EOL; ?> --EXPECTF-- 200 http://%s/update/extract/?version=2.2&indent=on&wt=xml&literal.id=doc1&capture=p&fmap.p=text solr-2.8.1/tests/017.solrclient_deletebyqueries.phpt0000664000175000017500000000210415001737315021424 0ustar biggibiggi--TEST-- SolrClient::deleteByQueries() - delete by multiple queries --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $serverOutput = $client->deleteByQueries([ 'id:3675', 'id:2548' ]); $response = $serverOutput->getResponse(); print_r($serverOutput->getRawRequest()); print_r($response); try { $client->deleteByQueries(array(0,'')); } catch (SolrIllegalArgumentException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()); } ?> --EXPECTF-- id:3675 id:2548 SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) ) Exception 4000: Query number 1 is not a valid query string solr-2.8.1/tests/017.solrclient_deletebyquery.phpt0000664000175000017500000000145615001737315021125 0ustar biggibiggi--TEST-- SolrClient::deleteByQuery() - delete by query --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $serverOutput = $client->deleteByQuery('id:3675'); $response = $serverOutput->getResponse(); print_r($serverOutput->getRawRequest()); print_r($response); ?> --EXPECTF-- id:3675 SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => %d [QTime] => %d ) ) solr-2.8.1/tests/017.solrclient_threads.phpt0000664000175000017500000000113015001737315017661 0ustar biggibiggi--TEST-- SolrClient::threads() - Solr Threads Info --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->threads()->getResponse(); print_r($response->system->threadCount); ?> --EXPECTF-- SolrObject Object ( [current] => %d [peak] => %d [daemon] => %d ) solr-2.8.1/tests/018.solrclient_setservlet.phpt0000664000175000017500000000144315001737315020437 0ustar biggibiggi--TEST-- SolrClient::setServlet() - set different servlet for a certain request type --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->ping(); echo $response->getRequestUrl().PHP_EOL; $client->setServlet(SolrClient::PING_SERVLET_TYPE, 'select'); $response = $client->ping(); echo $response->getRequestUrl().PHP_EOL; ?> --EXPECTF-- http://%s/solr/collection1/admin/ping/?version=2.2&indent=on&wt=xml http://%s/solr/collection1/select/?version=2.2&indent=on&wt=xml solr-2.8.1/tests/019.solrclient_clone.phpt0000664000175000017500000000124015001737315017333 0ustar biggibiggi--TEST-- SolrClient::__clone() - expect exception on clone --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); try { $failing = clone $client; } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } ?> --EXPECTF-- Exception 4001: Cloning of SolrClient objects is currently not supportedsolr-2.8.1/tests/019.solrclient_getdebug.phpt0000644000175000017500000000260215001737315020022 0ustar biggibiggi--TEST-- SolrClient::getDebug() - Get request debug logs for the last request --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $response = $client->ping(); $debug = $client->getDebug(); $lines = explode("\n",$debug); $print = false; sort($lines); foreach ( $lines as $line) { if ($line == '' || FALSE !== strpos($line, 'Trying') || 0 === strpos($line, 'Mark bundle') || 0 === strpos($line, 'Server') || 0 === strpos($line, 'Hostname') || 0 === strpos($line, 'TCP_NODELAY') || 0 === strpos($line, 'Accept-Encoding') || 0 === strpos($line, 'Curl_http_done') || 0 === strpos($line, 'processing:') ) { $print = false; } else { $print = true; } if ($print) { echo $line . "\n"; } } ?> --EXPECTF-- Accept-Charset: utf-8 Accept: */* Authorization: Basic %s Connected to %s Connection #0 to host %s left intact Connection: keep-alive Content-Length: 0 Content-Type: application/xml; charset=UTF-8 HEAD /solr/collection1/admin/ping/?version=2.2&indent=on&wt=xml HTTP/1.1 HTTP/1.1 200 OK Host: %s:%s Keep-Alive: 300 User-Agent: %s solr-2.8.1/tests/019.solrclient_serialize.phpt0000664000175000017500000000163715001737315020234 0ustar biggibiggi--TEST-- SolrClient - serialization --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); try { serialize($client); } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } try { $serializedString = 'O:10:"SolrClient":0:{}'; unserialize($serializedString); } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } ?> --EXPECTF-- Exception 1001: SolrClient objects cannot be serialized or unserialized Exception 1001: SolrClient objects cannot be serialized or unserialized solr-2.8.1/tests/020.solrdocument_adding_fields.phpt0000664000175000017500000000275415001737315021352 0ustar biggibiggi--TEST-- SolrDocument - checking dimension and magic property sets. --FILE-- addField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; print_r($doc->toArray()); ?> --EXPECT-- Array ( [document_boost] => 0 [field_count] => 3 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [1] => SolrDocumentField Object ( [name] => features [boost] => 0 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) [2] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Software [1] => Custom Search [2] => Information Technology ) ) ) ) solr-2.8.1/tests/020.solrdocument_update_field.phpt0000664000175000017500000000441115001737315021213 0ustar biggibiggi--TEST-- SolrInputDocument::updateField --FILE-- addField('id', 1123); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_ADD, 'val1'); $doc->updateField('field2_s', SolrInputDocument::UPDATE_MODIFIER_SET, 'val2'); $doc->updateField('field3_i', SolrInputDocument::UPDATE_MODIFIER_INC, 5); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVE, 'val0'); $doc->updateField('field1', SolrInputDocument::UPDATE_MODIFIER_REMOVEREGEX, '[\d]{2}/[\d]{2}/[\d]{4}'); try { $doc->updateField('arr2', 6, 'not gonna happen'); } catch (SolrIllegalArgumentException $e) { print_exception($e); } try { $doc->updateField('arr3', 0, 'not gonna happen'); } catch (SolrIllegalArgumentException $e) { print_exception($e); } print_r($doc->toArray()); ?> --EXPECT-- SolrIllegalArgumentException 4003: Invalid field value modifier. SolrIllegalArgumentException 4003: Invalid field value modifier. Array ( [document_boost] => 0 [field_count] => 4 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [1] => SolrDocumentField Object ( [name] => field1 [boost] => 0 [values] => Array ( [0] => val1 [1] => val0 [2] => [\d]{2}/[\d]{2}/[\d]{4} ) ) [2] => SolrDocumentField Object ( [name] => field2_s [boost] => 0 [values] => Array ( [0] => val2 ) ) [3] => SolrDocumentField Object ( [name] => field3_i [boost] => 0 [values] => Array ( [0] => 5 ) ) ) ) solr-2.8.1/tests/021.solrdocument_iterator.phpt0000664000175000017500000000176615001737315020432 0ustar biggibiggi--TEST-- SolrDocument - checking Iterator interface implementation --FILE-- addField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; foreach ($doc as $fieldname => $fieldvalues) { print "$fieldname\n"; print_r($fieldvalues); } ?> --EXPECT-- id SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) features SolrDocumentField Object ( [name] => features [boost] => 0 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) cat SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Software [1] => Custom Search [2] => Information Technology ) ) solr-2.8.1/tests/022.solrdocument_getInputDocument.phpt0000664000175000017500000000075415001737315022074 0ustar biggibiggi--TEST-- SolrDocument::getInputDocument() - creating SolrInputDocument from SolrDocument --FILE-- addField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; $input_doc = $doc->getInputDocument(); var_dump(get_class($input_doc)); ?> --EXPECT-- string(17) "SolrInputDocument" solr-2.8.1/tests/023.solrdocument_merge_no_overwrite.phpt0000664000175000017500000000304015001737315022467 0ustar biggibiggi--TEST-- SolrDocument::merge() - merging source document into current document without overwrite --FILE-- addField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; $second_doc->addField('cat', 'Lucene Search'); $second_doc->merge($doc, false); print_r($second_doc->toArray()); ?> --EXPECT-- Array ( [document_boost] => 0 [field_count] => 3 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Lucene Search ) ) [1] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [2] => SolrDocumentField Object ( [name] => features [boost] => 0 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) ) ) solr-2.8.1/tests/023.solrdocument_merge.phpt0000664000175000017500000000316315001737315017673 0ustar biggibiggi--TEST-- SolrDocument::merge() - merging source document into current document --FILE-- addField('id', 1123); $doc->features = "PHP Client Side"; $doc->features = "Fast development cycles"; $doc['cat'] = 'Software'; $doc['cat'] = 'Custom Search'; $doc->cat = 'Information Technology'; $second_doc->addField('cat', 'Lucene Search'); $second_doc->merge($doc, true); print_r($second_doc->toArray()); ?> --EXPECT-- Array ( [document_boost] => 0 [field_count] => 3 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Software [1] => Custom Search [2] => Information Technology ) ) [1] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [2] => SolrDocumentField Object ( [name] => features [boost] => 0 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) ) ) solr-2.8.1/tests/024.solrdocument_child_fetch.phpt0000664000175000017500000000242315001737315021027 0ustar biggibiggi--TEST-- SolrClient::query() - Query child documents SolrObject (Integ) --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_STORE_PATH, 'wt' => 'xml' ); $client = new SolrClient ( $options ); $query = new SolrQuery (); $query->setQuery ( 'id:1 AND {!parent which=$parentFilter}' ); $query->setParam ( 'parentFilter', 'content_type_s:product' ); $query->addFilterQuery('{!parent which=$parentFilter}'); $query->addField ( '*' ); $query->addField ( '[child parentFilter=$parentFilter]' ); $query->setStart ( 0 ); $query->setRows ( 50 ); $queryResponse = $client->query ( $query ); $response = $queryResponse->getResponse (); echo "----XML----" . PHP_EOL; var_dump($response->response->docs[0]->_childDocuments_[0]->id); echo "----JSON----" . PHP_EOL; $options['wt'] = 'json'; $client = new SolrClient ( $options ); $queryResponse = $client->query($query); $response = $queryResponse->getResponse (); var_dump($response->response->docs[0]->_childDocuments_[0]->id); ?> --EXPECT-- ----XML---- string(9) "IMM-HOW-S" ----JSON---- string(9) "IMM-HOW-S"solr-2.8.1/tests/025.solrdocument_haschilddocuments.phpt0000664000175000017500000000051415001737315022274 0ustar biggibiggi--TEST-- SolrDocument::hasChildDocuments() - Method test --FILE-- response->docs[0]->hasChildDocuments()); ?> --EXPECT-- bool(true)solr-2.8.1/tests/026.solrdocument_getchilddocscount.phpt0000664000175000017500000000052215001737315022300 0ustar biggibiggi--TEST-- SolrDocument::getChildDocumentsCount() - Method test --FILE-- response->docs[0]->getChildDocumentsCount()); ?> --EXPECT-- int(1)solr-2.8.1/tests/027.solrdocument_getinputdocument_children.phpt0000664000175000017500000000236015001737315024044 0ustar biggibiggi--TEST-- SolrDocument::getInputDocument() - Where document has child docs --FILE-- response->docs as $doc) { $childrenOfTheInput = $doc->getInputDocument()->getChildDocuments(); if ($childrenOfTheInput) { $firstChild = $childrenOfTheInput[0]; var_dump(get_class($firstChild)); var_dump(current($childrenOfTheInput)->toArray()); } } ?> --EXPECT-- string(17) "SolrInputDocument" array(3) { ["document_boost"]=> float(0) ["field_count"]=> int(1) ["fields"]=> array(1) { [0]=> object(SolrDocumentField)#9 (3) { ["name"]=> string(2) "id" ["boost"]=> float(0) ["values"]=> array(1) { [0]=> string(9) "CHILD_1_1" } } } } string(17) "SolrInputDocument" array(3) { ["document_boost"]=> float(0) ["field_count"]=> int(1) ["fields"]=> array(1) { [0]=> object(SolrDocumentField)#10 (3) { ["name"]=> string(2) "id" ["boost"]=> float(0) ["values"]=> array(1) { [0]=> string(9) "CHILD_2_1" } } } } solr-2.8.1/tests/028.solrdocument_clone.phpt0000664000175000017500000000233615001737315017702 0ustar biggibiggi--TEST-- SolrDocument - clone --FILE-- response->docs as $doc) { $clone = clone $doc; $childrenOfTheInput = $clone->getInputDocument()->getChildDocuments(); if ($childrenOfTheInput) { $firstChild = $childrenOfTheInput[0]; var_dump(get_class($firstChild)); var_dump(current($childrenOfTheInput)->toArray()); } } ?> --EXPECTF-- string(17) "SolrInputDocument" array(3) { ["document_boost"]=> float(0) ["field_count"]=> int(1) ["fields"]=> array(1) { [0]=> object(SolrDocumentField)#%d (3) { ["name"]=> string(2) "id" ["boost"]=> float(0) ["values"]=> array(1) { [0]=> string(9) "CHILD_1_1" } } } } string(17) "SolrInputDocument" array(3) { ["document_boost"]=> float(0) ["field_count"]=> int(1) ["fields"]=> array(1) { [0]=> object(SolrDocumentField)#%d (3) { ["name"]=> string(2) "id" ["boost"]=> float(0) ["values"]=> array(1) { [0]=> string(9) "CHILD_2_1" } } } } solr-2.8.1/tests/029.solrdocument_serialize.phpt0000644000175000017500000000204715001737315020567 0ustar biggibiggi--TEST-- SolrDocument - clone --SKIPIF-- = 80100) die("skip PHP < 8.1 only"); ?> --FILE-- response->docs[1]; $serializedString = serialize($doc); print_r($serializedString); echo PHP_EOL; print_r(unserialize($serializedString)->toArray()); ?> --EXPECT-- C:12:"SolrDocument":172:{ parent_2 } Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => parent_2 ) ) ) ) solr-2.8.1/tests/029.solrdocument_serialize_php81.phpt0000644000175000017500000000206615001737315021610 0ustar biggibiggi--TEST-- SolrDocument - clone --SKIPIF-- --FILE-- response->docs[1]; $serializedString = serialize($doc); print_r($serializedString); echo PHP_EOL; print_r(unserialize($serializedString)->toArray()); ?> --EXPECT-- O:12:"SolrDocument":1:{s:3:"xml";s:172:" parent_2 ";} Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => parent_2 ) ) ) ) solr-2.8.1/tests/030.solrdocument_magic.phpt0000664000175000017500000000073415001737315017653 0ustar biggibiggi--TEST-- SolrDocument - magic __isset/__unset/__get/__set --FILE-- check = 1; $doc->deleteMe = 1; var_dump(isset($doc->check)); var_dump(isset($doc->doesNotExist)); var_dump(isset($doc->deleteMe)); unset($doc->deleteMe); var_dump(isset($doc->deleteMe)); $doc->addField('id', 1); var_dump($doc->id instanceof SolrDocumentField); ?> --EXPECTF-- bool(true) bool(false) bool(true) bool(false) bool(true)solr-2.8.1/tests/031.solrdocument_clear.phpt0000664000175000017500000000063615001737315017663 0ustar biggibiggi--TEST-- SolrDocument::clear - Remove all fields from the document --FILE-- check = 1; var_dump($doc->getFieldCount()); $doc->clear(); var_dump($doc->getFieldCount()); ?> --EXPECTF-- int(1) int(0)solr-2.8.1/tests/032.solrdocument_fieldexists.phpt0000664000175000017500000000061415001737315021115 0ustar biggibiggi--TEST-- SolrDocument::fieldExists --FILE-- check = 1; var_dump($doc->fieldExists('check')); var_dump($doc->fieldExists('nonExistingField')); ?> --EXPECT-- bool(true) bool(false)solr-2.8.1/tests/033.solrdocument_sort.phpt0000664000175000017500000000304415001737315017562 0ustar biggibiggi--TEST-- SolrDocument::sort - Sort Document fields --FILE-- addField('z1', 'z1val'); $doc->addField('z1', 'z1val2'); $doc->addField('z1', 'z1val3'); $doc->addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); separator('unsorted'); print_r($doc->getFieldNames()); separator('field ASC'); $doc->sort(SolrDocument::SORT_FIELD_NAME, SolrDocument::SORT_ASC); print_r($doc->getFieldNames()); separator('field DESC'); $doc->sort(SolrDocument::SORT_FIELD_NAME, SolrDocument::SORT_DESC); print_r($doc->getFieldNames()); separator('value ASC'); $doc->sort(SolrDocument::SORT_FIELD_VALUE_COUNT, SolrDocument::SORT_ASC); print_r($doc->getFieldNames()); separator('value DESC'); $doc->sort(SolrDocument::SORT_FIELD_VALUE_COUNT, SolrDocument::SORT_DESC); print_r($doc->getFieldNames()); ?> --EXPECT-- =================================== unsorted =================================== Array ( [0] => z1 [1] => id [2] => cat ) ================================== field ASC =================================== Array ( [0] => cat [1] => id [2] => z1 ) ================================== field DESC ================================== Array ( [0] => z1 [1] => id [2] => cat ) ================================== value ASC =================================== Array ( [0] => id [1] => cat [2] => z1 ) ================================== value DESC ================================== Array ( [0] => z1 [1] => cat [2] => id ) solr-2.8.1/tests/034.solrdocument_deletefield.phpt0000664000175000017500000000037215001737315021043 0ustar biggibiggi--TEST-- SolrDocument::deleteField --FILE-- check = 1; var_dump($doc->getFieldCount()); $doc->deleteField('check'); var_dump($doc->getFieldCount()); ?> --EXPECTF-- int(1) int(0)solr-2.8.1/tests/035.solrdocument_getfieldnames.phpt0000664000175000017500000000050215001737315021400 0ustar biggibiggi--TEST-- SolrDocument::getFieldNames --FILE-- addField('id', 334455); $doc->addField('manu_id_s', 'apache'); $doc->addField('cat', 'Software'); print_r($doc->getFieldNames()); ?> --EXPECT-- Array ( [0] => id [1] => manu_id_s [2] => cat ) solr-2.8.1/tests/036.solrdocument_array_access.phpt0000664000175000017500000000205315001737315021234 0ustar biggibiggi--TEST-- SolrDocument - Array Access --FILE-- addField('id', 334455); $doc->addField('manu_id_s', 'apache'); // set $doc['cat'] = 'Software'; // get var_dump($doc['cat']->values[0]); // exists var_dump(isset($doc['cat'])); // unset unset($doc['cat']); print_r($doc->toArray()); ?> --EXPECT-- string(8) "Software" bool(true) Array ( [document_boost] => 0 [field_count] => 2 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 334455 ) ) [1] => SolrDocumentField Object ( [name] => manu_id_s [boost] => 0 [values] => Array ( [0] => apache ) ) ) ) solr-2.8.1/tests/037.solrdocument_getfield.phpt0000664000175000017500000000054615001737315020366 0ustar biggibiggi--TEST-- SolrDocument::getField --FILE-- check = 1; var_dump($doc->getField('check') instanceof SolrDocumentField); ?> --EXPECT-- bool(true)solr-2.8.1/tests/040.solrobject_xmlresponse.phpt0000664000175000017500000000504015001737315020576 0ustar biggibiggi--TEST-- SolrObject - checking xml response digest --FILE-- --EXPECT-- SolrObject Object ( [responseHeader] => SolrObject Object ( [status] => 0 [QTime] => 72 ) [system] => SolrObject Object ( [threadCount] => SolrObject Object ( [current] => 15 [peak] => 15 [daemon] => 13 ) [threadDump] => SolrObject Object ( [thread] => SolrObject Object ( [id] => 1 [name] => main [state] => RUNNABLE [native] => 1 [cpuTime] => 3340.0000ms [userTime] => 3180.0000ms [stackTrace] => Array ( [0] => java.net.PlainSocketImpl.socketAccept(Native Method) [1] => java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) [2] => java.net.ServerSocket.implAccept(ServerSocket.java:450) [3] => java.net.ServerSocket.accept(ServerSocket.java:421) [4] => org.apache.catalina.core.StandardServer.await(StandardServer.java:389) [5] => org.apache.catalina.startup.Catalina.await(Catalina.java:642) [6] => org.apache.catalina.startup.Catalina.start(Catalina.java:602) [7] => sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [8] => sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [9] => sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [10] => java.lang.reflect.Method.invoke(Method.java:585) [11] => org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) [12] => org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) ) ) ) ) ) solr-2.8.1/tests/041.solrobject_illegal_operation.phpt0000664000175000017500000000343715001737315021721 0ustar biggibiggi--TEST-- SolrObject - checking illegal operation of modifying object --FILE-- email = "iekpo@php.net"; } catch (Exception $e) { var_dump($e->getCode()); var_dump($e->getMessage()); } try { $solrObject['usingOffset'] = 'test'; } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } try { $solrObject['newprop2_dimension_access'] = 'test'; } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } // unset try { unset($solrObject->responseHeader); } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } try { unset($solrObject['responseHeader']); } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()) . PHP_EOL; } ?> --EXPECTF-- int(1006) string(83) "SolrObject instances are read-only. Properties cannot be added, updated or removed." Warning: main(): Attempting to set value for [usingOffset] property in a SolrObject instance in %s on line %d Exception 1006: SolrObject instances are read-only. Properties cannot be added, updated or removed. Warning: main(): Attempting to set value for [newprop2_dimension_access] property in a SolrObject instance in %s on line %d Exception 1006: SolrObject instances are read-only. Properties cannot be added, updated or removed. Exception 1006: SolrObject instances are read-only. Properties cannot be added, updated or removed. Warning: main(): Attempting to remove [responseHeader] property in a SolrObject instance in %s on line %d Exception 1006: SolrObject instances are read-only. Properties cannot be added, updated or removed. solr-2.8.1/tests/042.solrobject_magic_property.phpt0000664000175000017500000000236415001737315021253 0ustar biggibiggi--TEST-- SolrObject - testing the magic property access --FILE-- system->threadDump->thread->stackTrace); ?> --EXPECT-- Array ( [0] => java.net.PlainSocketImpl.socketAccept(Native Method) [1] => java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) [2] => java.net.ServerSocket.implAccept(ServerSocket.java:450) [3] => java.net.ServerSocket.accept(ServerSocket.java:421) [4] => org.apache.catalina.core.StandardServer.await(StandardServer.java:389) [5] => org.apache.catalina.startup.Catalina.await(Catalina.java:642) [6] => org.apache.catalina.startup.Catalina.start(Catalina.java:602) [7] => sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [8] => sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [9] => sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [10] => java.lang.reflect.Method.invoke(Method.java:585) [11] => org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) [12] => org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) ) solr-2.8.1/tests/043.solrobject_magic_properties.phpt0000664000175000017500000000062515001737315021562 0ustar biggibiggi--TEST-- SolrObject - test property access --FILE-- responseHeader; $system = $solrObject->system; var_dump(isset($solrObject['system'])); var_dump(property_exists($solrObject, 'system')); ?> --EXPECT-- bool(true) bool(true)solr-2.8.1/tests/044.solrobject_dimension_access_properties.phpt0000664000175000017500000000441115001737315024006 0ustar biggibiggi--TEST-- SolrObject - checking dimension access on properties. --FILE-- --EXPECT-- SolrObject Object ( [status] => 0 [QTime] => 72 ) SolrObject Object ( [threadCount] => SolrObject Object ( [current] => 15 [peak] => 15 [daemon] => 13 ) [threadDump] => SolrObject Object ( [thread] => SolrObject Object ( [id] => 1 [name] => main [state] => RUNNABLE [native] => 1 [cpuTime] => 3340.0000ms [userTime] => 3180.0000ms [stackTrace] => Array ( [0] => java.net.PlainSocketImpl.socketAccept(Native Method) [1] => java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) [2] => java.net.ServerSocket.implAccept(ServerSocket.java:450) [3] => java.net.ServerSocket.accept(ServerSocket.java:421) [4] => org.apache.catalina.core.StandardServer.await(StandardServer.java:389) [5] => org.apache.catalina.startup.Catalina.await(Catalina.java:642) [6] => org.apache.catalina.startup.Catalina.start(Catalina.java:602) [7] => sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [8] => sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [9] => sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [10] => java.lang.reflect.Method.invoke(Method.java:585) [11] => org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) [12] => org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) ) ) ) ) solr-2.8.1/tests/045.solrobject_array_access.phpt0000664000175000017500000000440715001737315020671 0ustar biggibiggi--TEST-- SolrObject - checking dimension access on properties. --FILE-- --EXPECT-- SolrObject Object ( [status] => 0 [QTime] => 72 ) SolrObject Object ( [threadCount] => SolrObject Object ( [current] => 15 [peak] => 15 [daemon] => 13 ) [threadDump] => SolrObject Object ( [thread] => SolrObject Object ( [id] => 1 [name] => main [state] => RUNNABLE [native] => 1 [cpuTime] => 3340.0000ms [userTime] => 3180.0000ms [stackTrace] => Array ( [0] => java.net.PlainSocketImpl.socketAccept(Native Method) [1] => java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) [2] => java.net.ServerSocket.implAccept(ServerSocket.java:450) [3] => java.net.ServerSocket.accept(ServerSocket.java:421) [4] => org.apache.catalina.core.StandardServer.await(StandardServer.java:389) [5] => org.apache.catalina.startup.Catalina.await(Catalina.java:642) [6] => org.apache.catalina.startup.Catalina.start(Catalina.java:602) [7] => sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [8] => sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [9] => sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [10] => java.lang.reflect.Method.invoke(Method.java:585) [11] => org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) [12] => org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) ) ) ) ) solr-2.8.1/tests/046.solrobject_getpropertynames.phpt0000664000175000017500000000067515001737315021646 0ustar biggibiggi--TEST-- SolrObject - SolrObject::getPropertyNames() --FILE-- getPropertyNames()); require_once "bootstrap.inc"; $xml_reponse = file_get_contents(EXAMPLE_RESPONSE_XML_1); $solrObject = SolrUtils::digestXMLResponse($xml_reponse); var_dump($solrObject->getPropertyNames()); ?> --EXPECT-- array(0) { } array(2) { [0]=> string(14) "responseHeader" [1]=> string(6) "system" } solr-2.8.1/tests/047.solrobject_offsetExists.phpt0000664000175000017500000000067315001737315020723 0ustar biggibiggi--TEST-- SolrObject::offsetExists --FILE-- --EXPECT-- bool(false) bool(true) bool(false)solr-2.8.1/tests/050.solrinputdocument_addchilddocument_01.phpt0000664000175000017500000000144115001737315023444 0ustar biggibiggi--TEST-- SolrInputDocument::addChildDocument() - add child document --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; $secondDoc->addField('cat', 'Lucene Search'); $secondDoc->cat = 'Custom Search'; $doc->addChildDocument($secondDoc); var_dump($doc->hasChildDocuments(), $secondDoc->hasChildDocuments()); $childs = $doc->getChildDocuments(); print_r($childs[0]->getField('cat')); ?> --EXPECT-- bool(true) bool(false) SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Lucene Search ) ) solr-2.8.1/tests/050.solrinputdocument_addchilddocument_02_error.phpt0000664000175000017500000000145115001737315024657 0ustar biggibiggi--TEST-- SolrInputDocument::addChildDocument()/SolrInputDocument::addChildDocuments() - Expected SolrIllegalArgumentException --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; try { $doc->addChildDocument($child1); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage(). PHP_EOL; } $children = array($child1, $child2); try { $doc->addChildDocuments($children); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage(). PHP_EOL; } ?> --EXPECT-- Child document has no fields SolrInputDocument number 1 has no fieldssolr-2.8.1/tests/051.solrinputdocument_getchilddocuments.phpt0000664000175000017500000000126515001737315023363 0ustar biggibiggi--TEST-- SolrInputDocument::getChildDocuments() - test --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; $secondDoc->addField('cat', 'Lucene Search'); $secondDoc->cat = 'Custom Search'; $doc->addChildDocument($secondDoc); $childs = $doc->getChildDocuments(); print_r($childs[0]->getField('cat')); ?> --EXPECT-- SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Lucene Search ) )solr-2.8.1/tests/052.solrinputdocument_haschilddocuments.phpt0000664000175000017500000000110415001737315023350 0ustar biggibiggi--TEST-- SolrInputDocument::hasChildDocuments() - test --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; $secondDoc->addField('cat', 'Lucene Search'); $secondDoc->cat = 'Custom Search'; $doc->addChildDocument($secondDoc); var_dump($doc->hasChildDocuments()); var_dump($secondDoc->hasChildDocuments()); ?> --EXPECT-- bool(true) bool(false)solr-2.8.1/tests/053.solrinputdocument_getchilddocumentscount.phpt0000664000175000017500000000111215001737315024425 0ustar biggibiggi--TEST-- SolrInputDocument::getChildDocumentsCount() - test --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; $secondDoc->addField('cat', 'Lucene Search'); $secondDoc->cat = 'Custom Search'; $doc->addChildDocument($secondDoc); var_dump($doc->getChildDocumentsCount()); var_dump($secondDoc->getChildDocumentsCount()); ?> --EXPECT-- int(1) int(0)solr-2.8.1/tests/054.solrinputdocument_addchilddocuments.phpt0000664000175000017500000000132715001737315023336 0ustar biggibiggi--TEST-- SolrInputDocument::addChildDocuments() - add child documents --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side"); $doc->addField('features', "Fast development cycles"); $doc->cat = 'Information Technology'; $doc2->addField('cat', 'Lucene Search'); $doc2->cat = 'Custom Search'; $doc2->addField('cat', 'Lucene Search'); $doc2->cat = 'Custom Search'; $doc3->addField('cat', 'Lucene Search'); $doc3->cat = 'Custom Search'; $docs = array($doc2, $doc3); $doc->addChildDocuments($docs); var_dump($doc->getChildDocumentsCount()); ?> --EXPECT-- int(2)solr-2.8.1/tests/055.solrinputdocument_serialization.phpt0000664000175000017500000000045215001737315022534 0ustar biggibiggi--TEST-- SolrInputDocument - serialize/unserialize Exception --FILE-- getMessage().PHP_EOL; } ?> --EXPECT-- SolrInputDocument objects cannot be serialized or unserializedsolr-2.8.1/tests/056.solrinputdocument_toArray.phpt0000664000175000017500000000161115001737315021277 0ustar biggibiggi--TEST-- SolrInputDocument::toArray - Array conversion --FILE-- addField('field_1', 4, 3.4); $doc->addField('field_2', 1); print_r($doc->toArray()); ?> --EXPECT-- Array ( [document_boost] => 0 [field_count] => 2 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => field_1 [boost] => 3.4 [values] => Array ( [0] => 4 ) ) [1] => SolrDocumentField Object ( [name] => field_2 [boost] => 0 [values] => Array ( [0] => 1 ) ) ) ) solr-2.8.1/tests/057.solrinputdocument_clone.phpt0000664000175000017500000000337715001737315020772 0ustar biggibiggi--TEST-- SolrInputDocument - clone --FILE-- setBoost(4); $doc->addField('id', 334455); $doc->addField('cat', 'Software', 4); $doc->addField('cat', 'Lucene'); $doc2 = clone $doc; $doc2->deleteField('id'); $doc2->addField('id', '88', 8); print_r($doc->toArray()); print_r($doc2->toArray()); ?> --EXPECTF-- Array ( [document_boost] => 4 [field_count] => 2 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 334455 ) ) [1] => SolrDocumentField Object ( [name] => cat [boost] => 4 [values] => Array ( [0] => Software [1] => Lucene ) ) ) ) Array ( [document_boost] => 4 [field_count] => 2 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => cat [boost] => 4 [values] => Array ( [0] => Software [1] => Lucene ) ) [1] => SolrDocumentField Object ( [name] => id [boost] => 8 [values] => Array ( [0] => 88 ) ) ) ) solr-2.8.1/tests/058.solrinputdocument_deletefield.phpt0000664000175000017500000000206215001737315022127 0ustar biggibiggi--TEST-- SolrInputDocument::deleteField - Delete a field from SolrInputDocument --FILE-- addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc->addField('deleteme', 'Lucene'); $doc->deleteField('deleteme'); print_r($doc->toArray()); ?> --EXPECT-- Array ( [document_boost] => 0 [field_count] => 2 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 334455 ) ) [1] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Software [1] => Lucene ) ) ) ) solr-2.8.1/tests/059.solrinputdocument_clear.phpt0000664000175000017500000000066115001737315020753 0ustar biggibiggi--TEST-- SolrInputDocument::clear - Clear document fields --FILE-- addField('id', 334455); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Lucene'); $doc->addField('z1', 'z1val'); $doc->clear(); var_dump($doc->toArray()); ?> --EXPECT-- array(3) { ["document_boost"]=> float(0) ["field_count"]=> int(0) ["fields"]=> array(0) { } } solr-2.8.1/tests/059.solrinputdocument_fieldexists.phpt0000664000175000017500000000040415001737315022203 0ustar biggibiggi--TEST-- SolrInputDocument::fieldExists --FILE-- addField('id', 1123); var_dump($doc->fieldExists('id')); var_dump($doc->fieldExists('features')); ?> --EXPECT-- bool(true) bool(false)solr-2.8.1/tests/059.solrinputdocument_getboost.phpt0000664000175000017500000000032315001737315021506 0ustar biggibiggi--TEST-- SolrInputDocument::getBoost - Test document fieldnames --FILE-- setBoost(4); var_dump($doc->getBoost()); ?> --EXPECT-- float(4)solr-2.8.1/tests/059.solrinputdocument_getfieldcount.phpt0000664000175000017500000000047615001737315022525 0ustar biggibiggi--TEST-- SolrInputDocument::getFieldCount --FILE-- addField('id', 123); $doc->addField('cat', 'Software'); $doc->addField('cat', 'Search Server'); $doc->addField('features', 'Software'); var_dump($doc->getFieldCount()); ?> --EXPECT-- int(3)solr-2.8.1/tests/059.solrinputdocument_getfieldnames.phpt0000664000175000017500000000054715001737315022477 0ustar biggibiggi--TEST-- SolrInputDocument::getFieldNames - Test document fieldnames --FILE-- addField('id', 334455); $doc->addField('manu_id_s', 'apache'); $doc->addField('cat', 'Software'); print_r($doc->getFieldNames()); ?> --EXPECT-- Array ( [0] => id [1] => manu_id_s [2] => cat ) solr-2.8.1/tests/059.solrinputdocument_getfield.phpt0000664000175000017500000000066615001737315021455 0ustar biggibiggi--TEST-- SolrInputDocument::getField --FILE-- addField('id', 123); $doc->addField('cat', 'Software'); var_dump($doc->getField('id')); var_dump($doc->getField('non_existing_field')); ?> --EXPECT-- object(SolrDocumentField)#2 (3) { ["name"]=> string(2) "id" ["boost"]=> float(0) ["values"]=> array(1) { [0]=> string(3) "123" } } bool(false) solr-2.8.1/tests/059.solrinputdocument_merge.phpt0000664000175000017500000000650415001737315020766 0ustar biggibiggi--TEST-- SolrInputDocument::merge - Merge 2 docs --FILE-- addField('id', 1123); $doc->addField('features', "PHP Client Side", 4); $doc->addField('features', "Fast development cycles"); $doc->addField('cat', 'Information Technology'); separator('original document'); print_r($doc->toArray()); $doc2 = new SolrInputDocument(); $doc2->addField('cat', 'Lucene Search'); $doc2->merge($doc, true); // merge doc into doc2, overwrite cat separator('merge overwrite (cat field merged ?)'); print_r($doc->getField('cat')->values); var_dump($doc->fieldExists('features')); print_r($doc2->toArray()); $doc3 = new SolrInputDocument(); $doc3->addField('manu_s_id', 'apache'); $doc3->addField('id', '124'); $doc3->merge($doc, false); // do not overwrite separator('merge without overwrite'); print_r($doc3->getField('id')->values); separator('END'); ?> --EXPECT-- ============================== original document =============================== Array ( [document_boost] => 0 [field_count] => 3 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [1] => SolrDocumentField Object ( [name] => features [boost] => 4 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) [2] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Information Technology ) ) ) ) ===================== merge overwrite (cat field merged ?) ===================== Array ( [0] => Information Technology ) bool(true) Array ( [document_boost] => 0 [field_count] => 3 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => cat [boost] => 0 [values] => Array ( [0] => Information Technology ) ) [1] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => 1123 ) ) [2] => SolrDocumentField Object ( [name] => features [boost] => 4 [values] => Array ( [0] => PHP Client Side [1] => Fast development cycles ) ) ) ) =========================== merge without overwrite ============================ Array ( [0] => 124 ) ===================================== END ======================================solr-2.8.1/tests/059.solrinputdocument_set_getfieldboost.phpt0000664000175000017500000000043015001737315023364 0ustar biggibiggi--TEST-- SolrInputDocument::getFieldBoost --FILE-- addField('id', 123); $doc->addField('cat', 'Software'); $doc->setFieldBoost('cat', 2.1); var_dump($doc->getFieldBoost('cat')); ?> --EXPECT-- float(2.1)solr-2.8.1/tests/059.solrinputdocument_setversion.phpt0000664000175000017500000000153115001737315022063 0ustar biggibiggi--TEST-- SolrInputDocument::setVersion - Set document version --SKIPIF-- --FILE-- addField('id', 'IW-02'); $doc->setVersion(SolrInputDocument::VERSION_ASSERT_EXISTS); var_dump($doc->getVersion()); $doc->setVersion(SolrInputDocument::VERSION_ASSERT_NOT_EXISTS); var_dump($doc->getVersion()); $doc->setVersion(SolrInputDocument::VERSION_ASSERT_NONE); var_dump($doc->getVersion()); $doc->setVersion(1498562624496861184); var_dump($doc->getVersion()); try { $doc->setVersion('AAAA-3333'); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage(); } catch (TypeError $e) { echo $e->getMessage(); } ?> --EXPECTF-- int(1) int(-1) int(0) int(1498562624496861184) %slrInputDocument::setVersion()%s, string given solr-2.8.1/tests/059.solrinputdocument_sort.phpt0000664000175000017500000000422115001737315020650 0ustar biggibiggi--TEST-- SolrInputDocument::sort - Sort Document fields --FILE-- addField('z1', 'z1val', 1); $doc->addField('z1', 'z1val2'); $doc->addField('z1', 'z1val3'); $doc->addField('id', 334455, 2); $doc->addField('cat', 'Software', 3); $doc->addField('cat', 'Lucene'); printf("---------------- %s --------------------\n", 'unsorted'); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'field ASC'); $doc->sort(SolrDocument::SORT_FIELD_NAME, SolrDocument::SORT_ASC); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'field DESC'); $doc->sort(SolrDocument::SORT_FIELD_NAME, SolrDocument::SORT_DESC); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'boost ASC'); $doc->sort(SolrDocument::SORT_FIELD_BOOST_VALUE, SolrDocument::SORT_ASC); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'boost DESC'); $doc->sort(SolrDocument::SORT_FIELD_BOOST_VALUE, SolrDocument::SORT_DESC); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'value ASC'); $doc->sort(SolrDocument::SORT_FIELD_VALUE_COUNT, SolrDocument::SORT_ASC); print_r($doc->getFieldNames()); printf("---------------- %s --------------------\n", 'value DESC'); $doc->sort(SolrDocument::SORT_FIELD_VALUE_COUNT, SolrDocument::SORT_DESC); print_r($doc->getFieldNames()); ?> --EXPECT-- ---------------- unsorted -------------------- Array ( [0] => z1 [1] => id [2] => cat ) ---------------- field ASC -------------------- Array ( [0] => cat [1] => id [2] => z1 ) ---------------- field DESC -------------------- Array ( [0] => z1 [1] => id [2] => cat ) ---------------- boost ASC -------------------- Array ( [0] => z1 [1] => id [2] => cat ) ---------------- boost DESC -------------------- Array ( [0] => cat [1] => id [2] => z1 ) ---------------- value ASC -------------------- Array ( [0] => id [1] => cat [2] => z1 ) ---------------- value DESC -------------------- Array ( [0] => z1 [1] => cat [2] => id ) solr-2.8.1/tests/060.solrquery_comon_query_params.phpt0000664000175000017500000000303315001737315022023 0ustar biggibiggi--TEST-- SolrQuery - testing CommonQueryParameters --FILE-- getQuery(), $query->getTimeAllowed(), $query->getStart(), $query->getRows(), $query->getFields(), $query->getFilterQueries(), $query->getSortFields() ); $nullOutput = ob_get_clean(); $query->setParam('a', 1); $query->setParam('b', 2); $query->setParam('c', 3); $query->setStart(4)->setQuery('solr')->setTimeAllowed(500)->setRows(17); $query->addField('israel')->addField('joshua')->addField('june'); $query->addSortField('cat', SolrQuery::ORDER_ASC); $query->addFilterQuery('solr')->addFilterQuery('solr1')->addFilterQuery('solr2'); $query ->setShowDebugInfo(true) ->setExplainOther('id:SOL*') ->setOmitHeader(false) ->setEchoHandler(true) ->setEchoParams('all') ; echo $query . PHP_EOL . PHP_EOL; var_dump( $query->getQuery(), $query->getTimeAllowed(), $query->getStart(), $query->getRows(), $query->getFields(), $query->getFilterQueries(), $query->getSortFields() ); echo $nullOutput; ?> --EXPECT-- a=1&b=2&c=3&start=4&q=solr&timeAllowed=500&rows=17&fl=israel,joshua,june&sort=cat asc&fq=solr&fq=solr1&fq=solr2&debugQuery=true&explainOther=id:SOL*&omitHeader=false&echoHandler=true&echoParams=all string(4) "solr" int(500) int(4) int(17) array(3) { [0]=> string(6) "israel" [1]=> string(6) "joshua" [2]=> string(4) "june" } array(3) { [0]=> string(4) "solr" [1]=> string(5) "solr1" [2]=> string(5) "solr2" } array(1) { [0]=> string(7) "cat asc" } NULL NULL NULL NULL NULL NULL NULLsolr-2.8.1/tests/061.solrquery_simpleFacetParameters.phpt0000664000175000017500000000363515001737315022411 0ustar biggibiggi--TEST-- SolrQuery - testing SimpleFacetParameters --FILE-- setFacet(0); $query->addFacetField('israel')->addFacetField('israel2'); $query->addFacetQuery('silk')->addFacetQuery('name:june'); $query->setFacetPrefix('A')->setFacetPrefix('C', 'june'); $query->setFacetSort(1)->setFacetSort(0, 'june'); $query->setFacetLimit(98)->setFacetLimit(44, 'june'); $query->setFacetOffset(110)->setFacetOffset(12, 'june'); $query->setFacetMinCount(4)->setFacetMinCount(30, 'june'); $query->setFacetMissing(1)->setFacetMissing(0, 'june'); $query->setFacetMethod('enum')->setFacetMethod('fc', 'june'); $query->setFacetEnumCacheMinDefaultFrequency(25); echo $query . PHP_EOL . PHP_EOL; var_dump( $query->getFacet(), $query->getFacetFields(), $query->getFacetQueries(), $query->getFacetPrefix(), $query->getFacetPrefix('june'), $query->getFacetSort(), $query->getFacetSort('june'), $query->getFacetLimit(), $query->getFacetLimit('june'), $query->getFacetOffset(), $query->getFacetOffset('june'), $query->getFacetMinCount(), $query->getFacetMinCount('june'), $query->getFacetMissing(), $query->getFacetMissing('june'), $query->getFacetMethod(), $query->getFacetMethod('june') ); ?> --EXPECTF-- facet=false&facet.field=israel&facet.field=israel2&facet.query=silk&facet.query=name:june&facet.prefix=A&f.june.facet.prefix=C&facet.sort=count&f.june.facet.sort=index&facet.limit=98&f.june.facet.limit=44&facet.offset=110&f.june.facet.offset=12&facet.mincount=4&f.june.facet.mincount=30&facet.missing=true&f.june.facet.missing=false&facet.method=enum&f.june.facet.method=fc&facet.enum.cache.minDf=25 bool(false) array(2) { [0]=> string(6) "israel" [1]=> string(7) "israel2" } array(2) { [0]=> string(4) "silk" [1]=> string(9) "name:june" } string(1) "A" string(1) "C" int(1) int(0) int(98) int(44) int(110) int(12) int(4) int(30) bool(true) bool(false) string(4) "enum" string(2) "fc" solr-2.8.1/tests/062.solrquery_date_facet_parameters.phpt0000664000175000017500000000370415001737315022431 0ustar biggibiggi--TEST-- SolrQuery - Testing Date facet parameters --FILE-- getFacetDateFields(), $query->getFacetDateStart(), $query->getFacetDateStart('june'), $query->getFacetDateEnd(), $query->getFacetDateEnd('israel'), $query->getFacetDateGap(), $query->getFacetDateGap('june'), $query->getFacetDateHardEnd(), $query->getFacetDateHardEnd('june'), $query->getFacetDateOther(), $query->getFacetDateOther('june') ); $nullOutput = ob_get_clean(); $query->addFacetDateField('israel') ->addFacetDateField('israel') ->removeFacetDateField('israel') ; $query->setFacetDateStart('January')->setFacetDateStart('Feb', 'june'); $query->setFacetDateEnd('Jan')->setFacetDateEnd('Febr', 'israel'); $query->setFacetDateGap('AOL')->setFacetDateGap('YAHOO', 'june'); $query->setFacetDateHardEnd(1)->setFacetDateHardEnd(0,'june'); $query->addFacetDateOther('Google') ->addFacetDateOther('Yahoos','june') ->addFacetDateOther('removeme') ->removeFacetDateOther('removeme'); echo $query. PHP_EOL . PHP_EOL; var_dump( $query->getFacetDateFields(), $query->getFacetDateStart(), $query->getFacetDateStart('june'), $query->getFacetDateEnd(), $query->getFacetDateEnd('israel'), $query->getFacetDateGap(), $query->getFacetDateGap('june'), $query->getFacetDateHardEnd(), $query->getFacetDateHardEnd('june'), $query->getFacetDateOther(), $query->getFacetDateOther('june') ); echo $nullOutput; ?> --EXPECTF-- facet.date=israel&facet.date.start=January&f.june.facet.date.start=Feb&facet.date.end=Jan&f.israel.facet.date.end=Febr&facet.date.gap=AOL&f.june.facet.date.gap=YAHOO&facet.date.hardend=true&f.june.facet.date.hardend=false&f.june.facet.date.other=Yahoos array(1) { [0]=> string(6) "israel" } string(7) "January" string(3) "Feb" string(3) "Jan" string(4) "Febr" string(3) "AOL" string(5) "YAHOO" bool(true) bool(false) NULL array(1) { [0]=> string(6) "Yahoos" } NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULLsolr-2.8.1/tests/063.solrquery_HighlightingParameters.phpt0000644000175000017500000001177615001737315022567 0ustar biggibiggi--TEST-- SolrQuery - testing HighlightingParameters --FILE-- getHighlight(), $query->getHighlightQuery(), $query->getHighlightFields(), $query->getHighlightSnippets(), $query->getHighlightSnippets('june'), $query->getHighlightFragsize(), $query->getHighlightFragsize('june'), $query->getHighlightMergeContiguous(), $query->getHighlightMergeContiguous('june'), $query->getHighlightRequireFieldMatch(), $query->getHighlightMaxAnalyzedChars(), $query->getHighlightAlternateField(), $query->getHighlightAlternateField('june'), $query->getHighlightMaxAlternateFieldLength(), $query->getHighlightMaxAlternateFieldLength('june'), $query->getHighlightFormatter(), $query->getHighlightFormatter('june'), $query->getHighlightSimplePre(), $query->getHighlightSimplePre('june'), $query->getHighlightSimplePost(), $query->getHighlightSimplePost('june'), $query->getHighlightFragmenter(), $query->getHighlightFragmenter('june'), $query->getHighlightUsePhraseHighlighter(), $query->getHighlightHighlightMultiTerm(), $query->getHighlightRegexSlop(), $query->getHighlightRegexPattern(), $query->getHighlightRegexMaxAnalyzedChars() ); $nullOutput = ob_get_clean(); $query->setHighlight(true); $query->setHighlightQuery('title:PHP OR description:Solr'); $query->addHighlightField('a')->addHighlightField('a')->addHighlightField('a') ->addHighlightField('b'); $query->removeHighlightField('a')->removeHighlightField('a')->removeHighlightField('a'); $query->setHighlightSnippets(4)->setHighlightSnippets(5, 'june'); $query->setHighlightFragsize(41)->setHighlightFragsize(52, 'june'); $query->setHighlightMergeContiguous(true)->setHighlightMergeContiguous(false, 'june'); $query->setHighlightRequireFieldMatch(true); $query->setHighlightMaxAnalyzedChars(44)->setHighlightMaxAnalyzedChars(53); $query->setHighlightAlternateField('pizza')->setHighlightAlternateField('bread', 'june'); $query->setHighlightAlternateField('blue')->setHighlightAlternateField('red','june'); $query->setHighlightAlternateField('a')->setHighlightAlternateField('b','june'); $query->setHighlightMaxAlternateFieldLength(300)->setHighlightMaxAlternateFieldLength(335, 'june'); $query->setHighlightFormatter('F')->setHighlightFormatter('G', 'june'); $query->setHighlightSimplePre('OO')->setHighlightSimplePre('PP', 'june'); $query->setHighlightSimplePost('ZZ')->setHighlightSimplePost('YY', 'june'); $query->setHighlightFragmenter('gap')->setHighlightFragmenter('space', 'june'); $query->setHighlightUsePhraseHighlighter(false); $query->setHighlightHighlightMultiTerm(1); $query->setHighlightRegexSlop(0.0025); $query->setHighlightRegexPattern("israel")->setHighlightRegexPattern("ekpo"); $query->setHighlightRegexMaxAnalyzedChars(444)->setHighlightRegexMaxAnalyzedChars(5.0); echo $query . PHP_EOL . PHP_EOL; var_dump( $query->getHighlight(), $query->getHighlightFields(), $query->getHighlightSnippets(), $query->getHighlightSnippets('june'), $query->getHighlightFragsize(), $query->getHighlightFragsize('june'), $query->getHighlightMergeContiguous(), $query->getHighlightMergeContiguous('june'), $query->getHighlightRequireFieldMatch(), $query->getHighlightMaxAnalyzedChars(), $query->getHighlightAlternateField(), $query->getHighlightAlternateField('june'), $query->getHighlightMaxAlternateFieldLength(), $query->getHighlightMaxAlternateFieldLength('june'), $query->getHighlightFormatter(), $query->getHighlightFormatter('june'), $query->getHighlightSimplePre(), $query->getHighlightSimplePre('june'), $query->getHighlightSimplePost(), $query->getHighlightSimplePost('june'), $query->getHighlightFragmenter(), $query->getHighlightFragmenter('june'), $query->getHighlightUsePhraseHighlighter(), $query->getHighlightHighlightMultiTerm(), $query->getHighlightRegexSlop(), $query->getHighlightRegexPattern(), $query->getHighlightRegexMaxAnalyzedChars() ); echo PHP_EOL.$nullOutput; ?> --EXPECT-- hl=true&hl.q=title:PHP OR description:Solr&hl.fl=b&hl.snippets=4&f.june.hl.snippets=5&hl.fragsize=41&f.june.hl.fragsize=52&hl.mergeContiguous=true&f.june.hl.mergeContiguous=false&hl.requireFieldMatch=true&hl.maxAnalyzedChars=53&hl.alternateField=a&f.june.hl.alternateField=b&hl.maxAlternateFieldLength=300&f.june.hl.maxAlternateFieldLength=335&hl.formatter=F&f.june.hl.formatter=G&hl.simple.pre=OO&f.june.hl.simple.pre=PP&hl.simple.post=ZZ&f.june.hl.simple.post=YY&hl.fragmenter=gap&f.june.hl.fragmenter=space&hl.usePhraseHighlighter=false&hl.highlightMultiTerm=true&hl.regex.slop=0.0025&hl.regex.pattern=ekpo&hl.regex.maxAnalyzedChars=5 bool(true) array(1) { [0]=> string(1) "b" } int(4) int(5) int(41) int(52) bool(true) bool(false) bool(true) int(53) string(1) "a" string(1) "b" int(300) int(335) string(1) "F" string(1) "G" string(2) "OO" string(2) "PP" string(2) "ZZ" string(2) "YY" string(3) "gap" string(5) "space" bool(false) bool(true) float(0.0025) string(4) "ekpo" int(5) NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL solr-2.8.1/tests/064.solrquery_StatsComponent.phpt0000664000175000017500000000154015001737315021106 0ustar biggibiggi--TEST-- SolrQuery - testing StatsComponent --FILE-- getStats(), $query->getStatsFields(), $query->getStatsFacets() ); $nullOutput = ob_get_clean(); $query->setStats(0); $query ->addStatsField('hello') ->removeStatsField('hello') ->addStatsField('june') ->addStatsField('july') ; $query ->addStatsFacet('world') ->removeStatsFacet('world') ->addStatsFacet('pear') ->addStatsFacet('pecl') ; echo $query . PHP_EOL . PHP_EOL; var_dump( $query->getStats(), $query->getStatsFields(), $query->getStatsFacets() ); echo $nullOutput; ?> --EXPECTF-- stats=false&stats.field=june&stats.field=july&stats.facet=pear&stats.facet=pecl bool(false) array(2) { [0]=> string(4) "june" [1]=> string(4) "july" } array(2) { [0]=> string(4) "pear" [1]=> string(4) "pecl" } NULL NULL NULLsolr-2.8.1/tests/065.solrquery_MoreLikeThis.phpt0000664000175000017500000000346415001737315020474 0ustar biggibiggi--TEST-- SolrQuery - testing MoreLikeThis component --FILE-- getMlt(), $query->getMltCount(), $query->getMltFields(), $query->getMltQueryFields(), $query->getMltMinTermFrequency(), $query->getMltMinDocFrequency(), $query->getMltMinWordLength(), $query->getMltMaxWordLength(), $query->getMltMaxNumTokens(), $query->getMltMaxNumQueryTerms(), $query->getMltBoost() ); $nullOutput = ob_get_clean(); $query->setMlt(1); $query->setMltCount(55)->setMltCount(90); $query->addMltField('june')->addMltField('joshua')->addMltField('mom')->removeMltField('joshua'); $query->addMltQueryField('june', 0.0)->addMltQueryField('israel', 9.558) ->addMltQueryField('removeme', 0.0) ->removeMltQueryField('removeme') ; $query->setMltMinTermFrequency(9); $query->setMltMinDocFrequency(5); $query->setMltMinWordLength(8); $query->setMltMaxWordLength(99); $query->setMltMaxNumTokens(6); $query->setMltMaxNumQueryTerms(2); $query->setMltBoost(true); echo $query . PHP_EOL . PHP_EOL; var_dump( $query->getMlt(), $query->getMltCount(), $query->getMltFields(), $query->getMltQueryFields(), $query->getMltMinTermFrequency(), $query->getMltMinDocFrequency(), $query->getMltMinWordLength(), $query->getMltMaxWordLength(), $query->getMltMaxNumTokens(), $query->getMltMaxNumQueryTerms(), $query->getMltBoost() ); echo $nullOutput; ?> --EXPECTF-- mlt=true&mlt.count=90&mlt.fl=june,mom&mlt.qf=june^0 israel^9.558&mlt.mintf=9&mlt.mindf=5&mlt.minwl=8&mlt.maxwl=99&mlt.maxntp=6&mlt.maxqt=2&mlt.boost=true bool(true) int(90) array(2) { [0]=> string(4) "june" [1]=> string(3) "mom" } array(2) { [0]=> string(6) "june^0" [1]=> string(12) "israel^9.558" } int(9) int(5) int(8) int(99) int(6) int(2) bool(true) NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULLsolr-2.8.1/tests/066.solrquery_TermsComponent.phpt0000664000175000017500000000345715001737315021115 0ustar biggibiggi--TEST-- SolrQuery - testing TermsComponent --FILE-- getTerms(), $query->getTermsField(), $query->getTermsLowerBound(), $query->getTermsUpperBound(), $query->getTermsIncludeLowerBound(), $query->getTermsIncludeUpperBound(), $query->getTermsMinCount(), $query->getTermsMaxCount(), $query->getTermsPrefix(), $query->getTermsLimit(), $query->getTermsReturnRaw(), $query->getTermsSort() ); }; ob_start(); $dumpVars(); $nullOutput = ob_get_clean(); $query->setTerms(true); $query->setTermsField('israel'); $query->setTermsLowerBound('june'); $query->setTermsUpperBound('joshua'); $query->setTermsIncludeLowerBound(false); $query->setTermsIncludeUpperBound(0); $query->setTermsMinCount(50); $query->setTermsMaxCount(200); $query->setTermsPrefix('A'); $query->setTermsLimit(45); $query->setTermsReturnRaw(false); $query->setTermsSort(SolrQuery::TERMS_SORT_INDEX); echo $query . PHP_EOL . PHP_EOL; $dumpVars(); $query->setTermsSort(SolrQuery::TERMS_SORT_COUNT); echo PHP_EOL . $query . PHP_EOL . PHP_EOL; var_dump( $query->getTermsSort() ); echo $nullOutput; ?> --EXPECTF-- terms=true&terms.fl=israel&terms.lower=june&terms.upper=joshua&terms.lower.incl=false&terms.upper.incl=false&terms.mincount=50&terms.maxcount=200&terms.prefix=A&terms.limit=45&terms.raw=false&terms.sort=index bool(true) string(6) "israel" string(4) "june" string(6) "joshua" bool(false) bool(false) int(50) int(200) string(1) "A" int(45) bool(false) int(0) terms=true&terms.fl=israel&terms.lower=june&terms.upper=joshua&terms.lower.incl=false&terms.upper.incl=false&terms.mincount=50&terms.maxcount=200&terms.prefix=A&terms.limit=45&terms.raw=false&terms.sort=count int(1) NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL solr-2.8.1/tests/067.solrquery__construct.phpt0000664000175000017500000000046715001737315020322 0ustar biggibiggi--TEST-- SolrQuery::_construct - Throws exception on illegal Argument --FILE-- getMessage(); } catch (TypeError $e) { echo $e->getMessage(); } ?> --EXPECTF-- SolrQuery::__construct()%s string, %s given solr-2.8.1/tests/068.solrquery_parameters_error.phpt0000664000175000017500000000142315001737315021505 0ustar biggibiggi--TEST-- SolrQuery - Invalid Parameters thorws exception Throws exception on illegal Argument --FILE-- setQuery(''); }catch (SolrIllegalArgumentException $e) { echo $e->getMessage().PHP_EOL; try { // simple list $query->addField(''); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage().PHP_EOL; try { // argument list $query->addSortField(''); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage().PHP_EOL; try { $params->addParam('',1); } catch (Exception $e) { echo $e->getMessage().PHP_EOL; } } } } ?> --EXPECT-- Invalid parameter value Invalid parameter value Invalid parameter value Invalid parameter name solr-2.8.1/tests/069.solrquery_GroupParameters.phpt0000644000175000017500000000443715001737315021260 0ustar biggibiggi--TEST-- SolrQuery - Result Grouping (Group Parameters) --FILE-- setGroup(true); $query->addGroupField('category')->addGroupField('featured'); $query->addGroupFunction('ceil(internalScore)'); $query->addGroupQuery('silk')->addGroupQuery('name:june'); $query->setGroupLimit(98); $query->setGroupOffset(110); $query->addGroupSortField('count', SolrQuery::ORDER_ASC); $query->addGroupSortField('name', SolrQuery::ORDER_DESC); $query->setGroupFormat('simple'); $query->setGroupMain(false); $query->setGroupNGroups(false); $query->setGroupTruncate(true); $query->setGroupFacet(true); $query->setGroupCachePercent(100); echo PHP_EOL . "-- Query String --".PHP_EOL; echo $query.PHP_EOL; echo PHP_EOL . "-- Integer --".PHP_EOL; var_dump($query->getGroupOffset(), $query->getGroupLimit(), $query->getGroupCachePercent()); echo PHP_EOL . "-- String --".PHP_EOL; var_dump($query->getGroupFormat()); echo PHP_EOL . "-- Array --".PHP_EOL; var_dump($query->getGroupFields()); var_dump($query->getGroupFunctions()); var_dump($query->getGroupQueries()); var_dump($query->getGroupSortFields()); echo PHP_EOL . "-- BOOL --".PHP_EOL; var_dump($query->getGroup(), $query->getGroupMain(), $query->getGroupNGroups(), $query->getGroupTruncate(), $query->getGroupFacet()); echo PHP_EOL; try { $query->setGroupCachePercent(-1); } catch (SolrIllegalArgumentException $e) { echo sprintf("Exception Caught %d: %s", $e->getCode(), $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- -- Query String -- group=true&group.field=category&group.field=featured&group.func=ceil(internalScore)&group.query=silk&group.query=name:june&group.limit=98&group.offset=110&group.sort=count asc,name desc&group.format=simple&group.main=false&group.ngroups=false&group.truncate=true&group.facet=true&group.cache.percent=100 -- Integer -- int(110) int(98) int(100) -- String -- string(6) "simple" -- Array -- array(2) { [0]=> string(8) "category" [1]=> string(8) "featured" } array(1) { [0]=> string(19) "ceil(internalScore)" } array(2) { [0]=> string(4) "silk" [1]=> string(9) "name:june" } array(2) { [0]=> string(9) "count asc" [1]=> string(9) "name desc" } -- BOOL -- bool(true) bool(false) bool(false) bool(true) bool(true) Exception Caught 4000: Group cache percent must be between 0 and 100solr-2.8.1/tests/070.solrquery_collapse.phpt0000664000175000017500000000046715001737315017733 0ustar biggibiggi--TEST-- SolrQuery::collapse - Collapse Using a SolrCollapseFunction --FILE-- setMax(5); $query->collapse($collapseFunction); echo $query; ?> --EXPECTF-- q=lucene&fq={!collapse field=ISBN max=5} solr-2.8.1/tests/071.solrquery_collapse_exception.phpt0000664000175000017500000000064415001737315022007 0ustar biggibiggi--TEST-- SolrQuery::collapse - throws SolrMissingMandatoryParameterException --FILE-- collapse($collapseFunction); } catch (SolrMissingMandatoryParameterException $e) { echo PHP_EOL.sprintf('Exception %d: %s', $e->getCode(), $e->getMessage()); } ?> --EXPECTF-- Exception 4100: Mandatory parameter Missing: field solr-2.8.1/tests/072.solrquery_expand.phpt0000664000175000017500000000217715001737315017412 0ustar biggibiggi--TEST-- SolrQuery - Expand Component --FILE-- setExpand(true); $query->setExpandRows(50); $query->setExpandQuery('text:product'); $query->addExpandFilterQuery('manu:apple')->addExpandFilterQuery('inStock:true'); $query->addExpandSortField('score', SolrQuery::ORDER_DESC)->addExpandSortField('title', SolrQuery::ORDER_ASC); // removal test $query->addExpandFilterQuery('extra')->removeExpandFilterQuery('extra'); $query->addExpandSortField('extra', SolrQuery::ORDER_ASC)->removeExpandSortField('extra'); echo $query.PHP_EOL; var_dump($query->getExpand()).PHP_EOL; var_dump($query->getExpandRows()).PHP_EOL; var_dump($query->getExpandQuery()).PHP_EOL; var_dump($query->getExpandFilterQueries()).PHP_EOL; var_dump($query->getExpandSortFields()).PHP_EOL; ?> --EXPECTF-- q=lucene&expand=true&expand.rows=50&expand.q=text:product&expand.fq=manu:apple&expand.fq=inStock:true&expand.sort=score desc,title asc bool(true) int(50) string(12) "text:product" array(2) { [0]=> string(10) "manu:apple" [1]=> string(12) "inStock:true" } array(2) { [0]=> string(5) "score" [1]=> string(5) "title" } solr-2.8.1/tests/080.solrutils_escapequerychars.phpt0000664000175000017500000000052315001737315021465 0ustar biggibiggi--TEST-- SolrUtils::escapeQueryChars() - Testing Lucene Reserved Characters --FILE-- --EXPECTF-- \+a \- q\{ \} \[\^test\] \|| \&& \(\) \^ \" \~ \* \? \: \\ \/solr-2.8.1/tests/081.solrutils_digest_json_response.phpt0000664000175000017500000000640615001737315022353 0ustar biggibiggi--TEST-- SolrUtils::digestJsonResponse() - Digest JSON Response --FILE-- response->docs[0]->_version_ == 1460602453694087168); ?> --EXPECTF-- bool(true) object(SolrObject)#%d (2) { ["responseHeader"]=> object(SolrObject)#4 (3) { ["status"]=> int(0) ["QTime"]=> int(1) ["params"]=> object(SolrObject)#5 (4) { ["indent"]=> string(2) "on" ["wt"]=> string(4) "json" ["q"]=> string(6) "lucene" ["version"]=> string(3) "2.2" } } ["response"]=> object(SolrObject)#%d (3) { ["numFound"]=> int(1) ["start"]=> int(0) ["docs"]=> array(1) { [0]=> object(SolrObject)#%d (11) { ["id"]=> string(8) "SOLR1000" ["name"]=> string(34) "Solr, the Enterprise Search Server" ["manu"]=> string(26) "Apache Software Foundation" ["cat"]=> array(2) { [0]=> string(8) "software" [1]=> string(6) "search" } ["features"]=> array(7) { [0]=> string(51) "Advanced Full-Text Search Capabilities using Lucene" [1]=> string(37) "Optimized for High Volume Web Traffic" [2]=> string(46) "Standards Based Open Interfaces - XML and HTTP" [3]=> string(44) "Comprehensive HTML Administration Interfaces" [4]=> string(64) "Scalability - Efficient Replication to other Solr Search Servers" [5]=> string(56) "Flexible and Adaptable with XML configuration and Schema" [6]=> string(61) "Good unicode support: hello (hello with an accent over the e)" } ["price"]=> float(0) ["price_c"]=> string(5) "0,USD" ["popularity"]=> int(10) ["inStock"]=> bool(true) ["incubationdate_dt"]=> string(20) "2006-01-17T00:00:00Z" ["_version_"]=> %s } } } } bool(true)solr-2.8.1/tests/082.solrutils_getsolrversion.phpt0000664000175000017500000000033015001737315021201 0ustar biggibiggi--TEST-- SolrUtils::getSolrVersion() - Returns solr dotted version --FILE-- --EXPECTF-- %d.%d.%d %d.%d.%dsolr-2.8.1/tests/083.solrutils_getsolrstats.phpt0000664000175000017500000000135215001737315020660 0ustar biggibiggi--TEST-- SolrUtils::getSolrStats() - Get Statistics about number of documents/clients..etc --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient ( $options ); $solrDoc = new SolrInputDocument(); $params = new SolrModifiableParams(); var_dump(SolrUtils::getSolrStats()); ?> --EXPECT-- array(3) { ["document_count"]=> int(0) ["client_count"]=> int(0) ["params_count"]=> int(0) } array(3) { ["document_count"]=> int(1) ["client_count"]=> int(1) ["params_count"]=> int(1) } solr-2.8.1/tests/084.solrutils_queryphrase.phpt0000664000175000017500000000030515001737315020470 0ustar biggibiggi--TEST-- SolrUtils::queryPhrase() - Escapes a query phrase --FILE-- --EXPECT-- "Book Title\: Apache Solr Server" solr-2.8.1/tests/090.solrserverexception_xml.phpt0000664000175000017500000000151415001737315021005 0ustar biggibiggi--TEST-- SolrServerException (xml) - Throw Exception on solr server exception using xml response writer --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, // 'wt' => 'xml' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene\\" ); try { $response = $client->query ( $query ); } catch ( SolrServerException $e ) { echo sprintf("code: %d", $e->getCode()).PHP_EOL; echo sprintf("message: %s", $e->getMessage()).PHP_EOL; print_r($e->getInternalInfo()); } ?> --EXPECTF-- code: %d message: %s Array ( [sourceline] => %d [sourcefile] => %s [zif_name] => %s ) solr-2.8.1/tests/091.solrserverexception_json.phpt0000664000175000017500000000136515001737315021163 0ustar biggibiggi--TEST-- SolrServerException (json) - Throw Exception on solr server exception using json response writer --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'json' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene\\" ); try { $response = $client->query ( $query ); print_r ( $response ); } catch ( SolrServerException $e ) { echo sprintf("code: %d", $e->getCode()).PHP_EOL; echo sprintf("message: %s", $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- code: %d message: %ssolr-2.8.1/tests/092.solrserverexception_php.phpt0000664000175000017500000000136515001737315021002 0ustar biggibiggi--TEST-- SolrServerException (phps) - Throw Exception on solr server exception using phps response writer --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'phps' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene\\" ); try { $response = $client->query ( $query ); print_r ( $response ); } catch ( SolrServerException $e ) { echo sprintf("code: %d", $e->getCode()).PHP_EOL; echo sprintf("message: %s", $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- code: %d message: %ssolr-2.8.1/tests/100.solrresponse_json.phpt0000664000175000017500000000111515001737315017554 0ustar biggibiggi--TEST-- SolrResponse::getResponse - JSON response writer --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'json' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene" ); $response = $client->query ( $query ); $x = $response->getResponse(); var_dump($x instanceof SolrObject); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/101.solrresponse_parseMode.phpt0000664000175000017500000000120015001737315020516 0ustar biggibiggi--TEST-- SolrResponse - ParseMode --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'xml' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene" ); $response = $client->query ( $query ); $response->setParseMode(SolrResponse::PARSE_SOLR_DOC); $x = $response->getResponse(); var_dump($x->response->docs[0] instanceof SolrDocument); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/102.solrresponse_phps.phpt0000664000175000017500000000111515001737315017557 0ustar biggibiggi--TEST-- SolrResponse::getResponse - PHPS response writer --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'phps' ); $client = new SolrClient ( $options ); $query = new SolrQuery ( "lucene" ); $response = $client->query ( $query ); $x = $response->getResponse(); var_dump($x instanceof SolrObject); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/103.solrresponse_get_array_response.phpt0000664000175000017500000000146415001737315022510 0ustar biggibiggi--TEST-- SolrResponse::getArrayResponse - For All response writers --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient ( $options ); $testArrayResponse = function ($writer) use ($client){ $client->setResponseWriter($writer); $q = new SolrQuery("lucene"); $response = $client->query ( $q ); $arrayResponse = $response->getArrayResponse(); return is_array($arrayResponse); }; var_dump($testArrayResponse('phps')); var_dump($testArrayResponse('xml')); var_dump($testArrayResponse('json')); ?> --EXPECTF-- bool(true) bool(true) bool(true)solr-2.8.1/tests/104.solrresponse_get_response_maxscore.phpt0000664000175000017500000000242015001737315023205 0ustar biggibiggi--TEST-- SolrResponse::getResponse() - maxScore --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt'=> 'xml' ); $client = new SolrClient ( $options ); $q = new SolrQuery("lucene"); $q->addField('score'); $response = $client->query ( $q ); $arrayResponse = $response->getArrayResponse(); var_dump($arrayResponse['response']['maxScore']); var_dump($response->getResponse()->response->maxScore); var_dump($response->getResponse()->response->start); var_dump($response->getResponse()->response->numFound); var_dump(is_array($response->getResponse()->response->docs)); echo "------ W/O maxScore ------".PHP_EOL; $q->removeField('score'); $response = $client->query ( $q ); var_dump($response->getResponse()->response->start); var_dump($response->getResponse()->response->numFound); var_dump(is_array($response->getResponse()->response->docs)); var_dump(property_exists($response->getResponse()->response, 'maxScore')); ?> --EXPECTF-- float(%f) float(%f) int(%d) int(%d) bool(true) ------ W/O maxScore ------ int(0) int(1) bool(true) bool(false)solr-2.8.1/tests/105.solrresponse_child_doc_response.phpt0000664000175000017500000000332615001737315022444 0ustar biggibiggi--TEST-- Response - Response with child documents --FILE-- --EXPECT-- SolrObject Object ( [response] => SolrObject Object ( [numFound] => 3 [start] => 0 [docs] => Array ( [0] => SolrObject Object ( [id] => parent_1 [_childDocuments_] => Array ( [0] => SolrObject Object ( [id] => CHILD_1_1 ) ) ) [1] => SolrObject Object ( [id] => parent_2 [_childDocuments_] => Array ( [0] => SolrObject Object ( [id] => CHILD_2_1 ) [1] => SolrObject Object ( [id] => CHILD_2_2 ) ) ) [2] => SolrObject Object ( [id] => not_a_parent_1 ) ) ) ) solr-2.8.1/tests/106.solrresponse_child_doc_response_solrdoc.phpt0000664000175000017500000000562415001737315024175 0ustar biggibiggi--TEST-- SolrDocument - Response parsed as SolrDocument with child documents --FILE-- response->docs as $doc) { echo '--- doc start ---'.PHP_EOL; print_r($doc->toArray()); if ($doc->hasChildDocuments()) { foreach ($doc->getChildDocuments() as $child) { print_r($child->toArray()); } } echo '--- doc end ---'.PHP_EOL; } ?> --EXPECT-- --- doc start --- Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => parent_1 ) ) ) ) Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => CHILD_1_1 ) ) ) ) --- doc end --- --- doc start --- Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => parent_2 ) ) ) ) Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => CHILD_2_1 ) ) ) ) Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => CHILD_2_2 ) ) ) ) --- doc end --- --- doc start --- Array ( [document_boost] => 0 [field_count] => 1 [fields] => Array ( [0] => SolrDocumentField Object ( [name] => id [boost] => 0 [values] => Array ( [0] => not_a_parent_1 ) ) ) ) --- doc end --- solr-2.8.1/tests/107.solrresponse_getrawresponseheaders.phpt0000644000175000017500000000177515001737315023230 0ustar biggibiggi--TEST-- SolrResponse::getRawResponseHeaders() - Get Raw Response Headers --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); $headers = $query_response->getRawResponseHeaders(); $filteredHeaders = implode( "\n", array_filter( explode("\r\n", $headers), function($header) { return strpos($header, 'HTTP') === 0 || strpos($header, 'Content-Type') === 0; } ) ); print_r($filteredHeaders); ?> --EXPECTF-- HTTP/%s 200 OK Content-Type: %s solr-2.8.1/tests/108.solrresponse_getdigestedresponse.phpt0000664000175000017500000000344515001737315022672 0ustar biggibiggi--TEST-- SolrResponse::getDigestedResponse() - Get Raw Response Headers --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); var_dump($query_response->getDigestedResponse()); $tmp = $query_response->getResponse(); $digestedResponse = $query_response->getDigestedResponse(); print_r($digestedResponse); ?> --EXPECTF-- string(1) " " O:10:"SolrObject":2:{s:14:"responseHeader";O:10:"SolrObject":3:{s:6:"status";i:0;s:5:"QTime";i:%d;s:%d:"params";O:10:"SolrObject":7:{s:1:"q";s:6:"lucene";s:6:"indent";s:2:"on";s:2:"fl";s:25:"cat,features,id,timestamp";s:5:"start";s:1:"0";s:4:"rows";s:2:"50";s:7:"version";s:3:"2.2";s:2:"wt";s:3:"xml";}}s:8:"response";O:10:"SolrObject":3:{s:8:"numFound";i:1;s:5:"start";i:0;s:4:"docs";a:1:{i:0;O:10:"SolrObject":3:{s:2:"id";s:8:"SOLR1000";s:3:"cat";a:2:{i:0;s:8:"software";i:1;s:6:"search";}s:8:"features";a:7:{i:0;s:51:"Advanced Full-Text Search Capabilities using Lucene";i:1;s:37:"Optimized for High Volume Web Traffic";i:2;s:46:"Standards Based Open Interfaces - XML and HTTP";i:3;s:44:"Comprehensive HTML Administration Interfaces";i:4;s:64:"Scalability - Efficient Replication to other Solr Search Servers";i:5;s:56:"Flexible and Adaptable with XML configuration and Schema";i:6;s:62:"Good unicode support: héllo (hello with an accent over the e)";}}}}}solr-2.8.1/tests/109.solrresponse_gethttpstatus.phpt0000664000175000017500000000142315001737315021541 0ustar biggibiggi--TEST-- SolrResponse::getHttpStatus() - getHttpStatusMessage() --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); var_dump($query_response->getHttpStatus()); var_dump($query_response->getHttpStatusMessage()); ?> --EXPECTF-- int(200) string(1) " "solr-2.8.1/tests/109.solrresponse_getrequesturl.phpt0000644000175000017500000000141115001737315021524 0ustar biggibiggi--TEST-- SolrResponse::getRequestUrl() - Get Raw Response Headers --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query->setStart(0); $query->setRows(50); $query->addField('cat')->addField('features')->addField('id')->addField('timestamp'); $query_response = $client->query($query); echo $query_response->getRequestUrl(); ?> --EXPECTF-- http://%s:%s/solr/collection1/select/?version=2.2&indent=on&wt=xmlsolr-2.8.1/tests/109.solrresponse_success.phpt0000664000175000017500000000111115001737315020260 0ustar biggibiggi--TEST-- SolrResponse::success() - Was the request successful --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, ); $client = new SolrClient($options); $query = new SolrQuery(); $query->setQuery('lucene'); $query_response = $client->query($query); var_dump($query_response->success()); ?> --EXPECTF-- bool(true)solr-2.8.1/tests/110.solrdismaxquery.phpt0000664000175000017500000000400315001737315017240 0ustar biggibiggi--TEST-- SolrDisMaxQuery - Methods --FILE-- addPhraseField('source', 55) ->addPhraseField('cat', 3, 1) ->addPhraseField('third', 4, 1) ->removePhraseField('third') ->addPhraseField('fourth', 0.5) ->addPhraseField('fifth',5.2, 7.8) ->setQueryAlt('*:*') ->addQueryField("price") ->addQueryField("location", 4) ->setPhraseSlop(2) ->setQueryPhraseSlop(3) ->setTieBreaker(0.5) ->setMinimumMatch(2) ; // reverse echo $dismaxQuery.PHP_EOL; $dismaxQuery = new SolrDisMaxQuery("lucene"); $dismaxQuery ->addQueryField("location", 4) ->addQueryField("price") ->addQueryField("sku") ->addQueryField("title",3.4) ->addPhraseField('cat', 3, 1) ->addPhraseField('third', 4, 1) ->addPhraseField('source', 55) ; echo $dismaxQuery.PHP_EOL; $dismaxQuery->setPhraseFields('source^55 cat~1^3'); echo $dismaxQuery.PHP_EOL; $dismaxQuery = new SolrDisMaxQuery('lucene'); $dismaxQuery->addPhraseField('first', 3, 1) ->addPhraseField('second', 4, 1) ->addPhraseField('cat', 55); echo $dismaxQuery. PHP_EOL; echo $dismaxQuery->removePhraseField('second').PHP_EOL; $dismaxQuery = new SolrDisMaxQuery('lucene'); $dismaxQuery->addQueryField('first', 3) ->addQueryField('second', 0.2) ->addQueryField('cat'); echo $dismaxQuery. PHP_EOL; echo $dismaxQuery->removeQueryField('second').PHP_EOL; $dismaxQuery = new SolrDisMaxQuery('lucene'); $dismaxQuery->setPhraseSlop(4); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=%s&pf=source^55 cat~1^3 fourth^0.5 fifth~7.8^5.2&q.alt=*:*&qf=price location^4&ps=2&qs=3&tie=0.5&mm=2 q=lucene&defType=%s&qf=location^4 price sku title^3.4&pf=cat~1^3 third~1^4 source^55 Notice: SolrDisMaxQuery::setPhraseFields(): Parameter pf value(s) was overwritten by this call in %s on line %d q=lucene&defType=%s&qf=location^4 price sku title^3.4&pf=source^55 cat~1^3 q=lucene&defType=%s&pf=first~1^3 second~1^4 cat^55 q=lucene&defType=%s&pf=first~1^3 cat^55 q=lucene&defType=%s&qf=first^3 second^0.2 cat q=lucene&defType=%s&qf=first^3 cat q=lucene&defType=%s&ps=4solr-2.8.1/tests/111.solrdismaxquery_boostquery.phpt0000664000175000017500000000125115001737315021537 0ustar biggibiggi--TEST-- SolrDisMaxQuery - Boost Query --FILE-- addBoostQuery('cat', 'electronics', 5.1) ->addBoostQuery('cat', 'hard drive') ; // reverse echo $dismaxQuery.PHP_EOL; $dismaxQuery ->removeBoostQuery('cat'); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setBoostQuery('cat:electronics manu:local^2'); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=edismax&bq=cat:electronics^5.1 cat:hard drive q=lucene&defType=edismax&bq=cat:hard drive Notice: SolrDisMaxQuery::setBoostQuery(): Parameter bq value(s) was overwritten by this call in %s on line %d q=lucene&defType=edismax&bq=cat:electronics manu:local^2 solr-2.8.1/tests/112.solrdismaxquery_query_parser.phpt0000664000175000017500000000056115001737315022050 0ustar biggibiggi--TEST-- SolrDisMaxQuery - QueryParser Switch --FILE-- useDisMaxQueryParser(); echo $dismaxQuery.PHP_EOL; $dismaxQuery->useEDisMaxQueryParser(); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=hard drive&defType=edismax q=hard drive&defType=dismax q=hard drive&defType=edismaxsolr-2.8.1/tests/113.solrdismaxquery_bigramfields.phpt0000664000175000017500000000153115001737315021756 0ustar biggibiggi--TEST-- SolrDisMaxQuery - BigramFields and slop (addBigramPhraseField, removeBigramPhraseField, setBigramPhraseFields) --FILE-- addBigramPhraseField('cat', 2, 5.1) ->addBigramPhraseField('feature', 4.5) ; echo $dismaxQuery.PHP_EOL; // reverse $dismaxQuery ->removeBigramPhraseField('cat'); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setBigramPhraseFields("cat~5.1^2 feature^4.5"); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setBigramPhraseSlop(2); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=%s&pf2=cat~5.1^2 feature^4.5 q=lucene&defType=%s&pf2=feature^4.5 Notice: SolrDisMaxQuery::setBigramPhraseFields(): Parameter pf2 value(s) was overwritten by this call in %s on line %d q=lucene&defType=%s&pf2=cat~5.1^2 feature^4.5 q=lucene&defType=%s&pf2=cat~5.1^2 feature^4.5&ps2=2 solr-2.8.1/tests/114.solrdismaxquery_trigramfields.phpt0000664000175000017500000000154315001737315022166 0ustar biggibiggi--TEST-- SolrDisMaxQuery - TrigramFields and slop (addTrigramPhraseField, removeTrigramPhraseField, setTrigramPhraseFields) --FILE-- addTrigramPhraseField('cat', 2, 5.1) ->addTrigramPhraseField('feature', 4.5) ; echo $dismaxQuery.PHP_EOL; // reverse $dismaxQuery ->removeTrigramPhraseField('cat'); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setTrigramPhraseFields('cat~5.1^2 feature^4.5'); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setTrigramPhraseSlop(2); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=%s&pf3=cat~5.1^2 feature^4.5 q=lucene&defType=%s&pf3=feature^4.5 Notice: SolrDisMaxQuery::setTrigramPhraseFields(): Parameter pf3 value(s) was overwritten by this call in %s on line %d q=lucene&defType=%s&pf3=cat~5.1^2 feature^4.5 q=lucene&defType=%s&pf3=cat~5.1^2 feature^4.5&ps3=2 solr-2.8.1/tests/115.solrdismaxquery_userfields.phpt0000664000175000017500000000120315001737315021471 0ustar biggibiggi--TEST-- SolrDisMaxQuery - UserFields (uf parameter) (addUserField) --FILE-- addUserField('cat') ->addUserField('text') ->addUserField('*_dt') ; echo $dismaxQuery.PHP_EOL; // // reverse $dismaxQuery ->removeUserField('text'); echo $dismaxQuery.PHP_EOL; $dismaxQuery->setUserFields('field1 field2 *_txt'); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=%s&uf=cat text *_dt q=lucene&defType=%s&uf=cat *_dt Notice: SolrDisMaxQuery::setUserFields(): Parameter uf value(s) was overwritten by this call in %s on line %d q=lucene&defType=edismax&uf=field1 field2 *_txtsolr-2.8.1/tests/116.solrdismaxquery_boostfunction.phpt0000664000175000017500000000052515001737315022227 0ustar biggibiggi--TEST-- SolrDisMaxQuery - setBoostFunction --FILE-- setBoostFunction($boostRecentDocsFunction); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=lucene&defType=%s&bf=recip(ms(NOW,mydatefield),3.16e-11,1,1)solr-2.8.1/tests/130.parameters_simple_list_separator.phpt0000664000175000017500000000062515001737315022624 0ustar biggibiggi--TEST-- simple_list_parameter type - Use of default, non-default separator --FILE-- addField("te")->addField("te2"); echo $query.PHP_EOL; $dismaxQuery = new SolrDisMaxQuery(); $dismaxQuery ->addUserField('cat') ->addUserField('text') ->addUserField('*_dt') ; echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- fl=te,te2 defType=edismax&uf=cat text *_dtsolr-2.8.1/tests/150.solrcollapsefunction.phpt0000664000175000017500000000153115001737315020244 0ustar biggibiggi--TEST-- SolrCollapseFunction - string conversion --FILE-- setField('field2'); $func->setMax('max'); $func->setMin('min'); $func->setSize(1000); $func->setHint('hint'); $func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND); var_dump($func->getField()); var_dump($func->getMax()); var_dump($func->getMin()); var_dump($func->getSize()); var_dump($func->getHint()); var_dump($func->getNullPolicy()); var_dump((string)$func); $func->setMax('with space'); var_dump((string)$func); ?> --EXPECTF-- string(6) "field2" string(3) "max" string(3) "min" string(4) "1000" string(4) "hint" string(6) "expand" string(78) "{!collapse field=field2 max=max min=min size=1000 hint=hint nullPolicy=expand}" string(87) "{!collapse field=field2 max='with space' min=min size=1000 hint=hint nullPolicy=expand}" solr-2.8.1/tests/151.solrcollapsefunction_illegal_operations.phpt0000664000175000017500000000136715001737315024210 0ustar biggibiggi--TEST-- SolrCollapseFunction - Illegal Operations --SKIPIF-- --FILE-- getCode(), $e->getMessage()).PHP_EOL; } $func->setMax('max'); try { // known issue, object corruption $tmp = serialize($func); } catch (SolrIllegalOperationException $e) { echo PHP_EOL . sprintf('Code %d: %s', $e->getCode(), $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- Code 4001: Cloning of SolrCollapseFunction objects is currently not supported Code 1001: Serialization of SolrCollapseFunction objects is currently not supported solr-2.8.1/tests/160.solr_update_document_block.phpt0000664000175000017500000000424615001737315021374 0ustar biggibiggi--TEST-- Solr - Fetch and Update nested documents --SKIPIF-- --FILE-- getChildDocuments(); $child = $children[0]; $child->deleteField('inventory_i'); $child->addField('inventory_i', $inventory); $document->deleteField('_version_'); }; $getInventory = function ($response) { return (int) current($response->response->docs[0]->getChildDocuments()[0]['inventory_i']->values); }; $options = array ( 'hostname' => SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_STORE_PATH, 'wt' => 'xml' ); $client = new SolrClient ( $options ); $query = new SolrQuery ('id:1 AND {!parent which=$parentFilter}'); $query->setParam ( 'parentFilter', 'content_type_s:product' ); $query->addFilterQuery('{!parent which=$parentFilter}'); $query->addField ( '*' ); $query->addField ( '[child parentFilter=$parentFilter]' ); $query->setStart ( 0 ); $query->setRows ( 1 ); // query existing inventory $queryResponse = $client->query ( $query ); $queryResponse->setParseMode(SolrResponse::PARSE_SOLR_DOC); $response = $queryResponse->getResponse(); $existingInventory = $getInventory($response); // update inventory to 300 $document = $response->response->docs[0]->getInputDocument(); $updateInventory($document, 300); $client->addDocument($document); $client->commit(); // fetch the document again after the update $queryResponse = $client->query ( $query ); $queryResponse->setParseMode(SolrResponse::PARSE_SOLR_DOC); $response = $queryResponse->getResponse(); $newInventory = $getInventory($response); assert($newInventory == 300); echo "------EXISTING------" . PHP_EOL; var_dump($existingInventory); echo "----AFTER UPDATE----" . PHP_EOL; var_dump($newInventory); // cleanup: restore document's original state $document = $response->response->docs[0]->getInputDocument(); $updateInventory($document, $existingInventory); $client->addDocument($document); $client->commit(); ?> --EXPECT-- ------EXISTING------ int(200) ----AFTER UPDATE---- int(300)solr-2.8.1/tests/180.solrdocumentfield_construct.phpt0000664000175000017500000000034715001737315021631 0ustar biggibiggi--TEST-- SolrDocumentField::__construct --FILE-- --EXPECT-- SolrDocumentField Object ( [name] => [boost] => 0 [values] => ) solr-2.8.1/tests/181.solrdocumentfield_write_property.phpt0000664000175000017500000000062215001737315022700 0ustar biggibiggi--TEST-- SolrDocumentField - exception - on write property --FILE-- myIllegalProperty = 1; } catch (SolrIllegalOperationException $e) { printf("Exception %d: %s", $e->getCode(), $e->getMessage()); } ?> --EXPECT-- Exception 1007: SolrDocumentField instances are read-only. Properties cannot be updated or removed. solr-2.8.1/tests/182.solrdocumentfield_unset_property.phpt0000664000175000017500000000061015001737315022702 0ustar biggibiggi--TEST-- SolrDocumentField - exception - on unset property --FILE-- name); } catch (SolrIllegalOperationException $e) { printf("Exception %d: %s", $e->getCode(), $e->getMessage()); } ?> --EXPECT-- Exception 1007: SolrDocumentField instances are read-only. Properties cannot be updated or removed.solr-2.8.1/tests/190.solrparams_setparam.phpt0000664000175000017500000000034315001737315020057 0ustar biggibiggi--TEST-- SolrParams::setParam() --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ; echo $params; ?> --EXPECTF-- q=lucene&start=0&rows=10 solr-2.8.1/tests/191.solrparams_addparam.phpt0000664000175000017500000000035515001737315020020 0ustar biggibiggi--TEST-- SolrParams::addParam() --FILE-- addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; echo $params; ?> --EXPECTF-- fq=popularity:[10 TO *]&fq=section:0 solr-2.8.1/tests/192.solrparams_getparam.phpt0000664000175000017500000000056515001737315020053 0ustar biggibiggi--TEST-- SolrParams::getParam() --FILE-- set('q', 'lucene') ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; var_dump($params->get('fq')); var_dump($params->get('q')); ?> --EXPECT-- array(2) { [0]=> string(20) "popularity:[10 TO *]" [1]=> string(9) "section:0" } string(6) "lucene"solr-2.8.1/tests/193.solrparams_getparams.phpt0000664000175000017500000000065015001737315020232 0ustar biggibiggi--TEST-- SolrParams::getParams() --FILE-- set('q', 'lucene') ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; var_dump($params->getParams()); ?> --EXPECT-- array(2) { ["q"]=> array(1) { [0]=> string(6) "lucene" } ["fq"]=> array(2) { [0]=> string(20) "popularity:[10 TO *]" [1]=> string(9) "section:0" } }solr-2.8.1/tests/194.solrparams_getpreparedparams.phpt0000664000175000017500000000057315001737315021762 0ustar biggibiggi--TEST-- SolrParams::getPreparedParams() --FILE-- set('q', 'lucene') ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; var_dump($params->getPreparedParams()); ?> --EXPECT-- array(2) { ["q"]=> string(8) "q=lucene" ["fq"]=> string(50) "fq=popularity%3A%5B10%20TO%20%2A%5D&fq=section%3A0" } solr-2.8.1/tests/195.solrparams_tostring.phpt0000664000175000017500000000071615001737315020125 0ustar biggibiggi--TEST-- SolrParams::toString() --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; echo $params->toString().PHP_EOL; echo $params->toString(true); ?> --EXPECTF-- q=lucene&start=0&rows=10&fq=popularity:[10 TO *]&fq=section:0 q=lucene&start=0&rows=10&fq=popularity%3A%5B10%20TO%20%2A%5D&fq=section%3A0solr-2.8.1/tests/196.solrparams_serialize.phpt0000644000175000017500000000217115001737315020237 0ustar biggibiggi--TEST-- SolrParams::serialize() - serialize params --SKIPIF-- = 80100) die("skip PHP < 8.1 only"); ?> --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; echo serialize($params); ?> --EXPECTF-- C:20:"SolrModifiableParams":727:{ lucene 0 10 popularity:[10 TO *] section:0 } solr-2.8.1/tests/196.solrparams_serialize_php81.phpt0000644000175000017500000000221015001737315021251 0ustar biggibiggi--TEST-- SolrParams::serialize() - serialize params --SKIPIF-- --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; echo serialize($params); ?> --EXPECTF-- O:20:"SolrModifiableParams":1:{s:3:"xml";s:727:" lucene 0 10 popularity:[10 TO *] section:0 ";} solr-2.8.1/tests/197.solrparams_unserialize.phpt0000664000175000017500000000067715001737315020616 0ustar biggibiggi--TEST-- SolrParams::unserialize() --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; $serializedString = serialize($params); $unserializedObject = unserialize($serializedString); echo $unserializedObject; ?> --EXPECTF-- q=lucene&start=0&rows=10&fq=popularity:[10 TO *]&fq=section:0 solr-2.8.1/tests/198.solrparams_clone.phpt0000664000175000017500000000077415001737315017363 0ustar biggibiggi--TEST-- SolrParams - clone [exception] --FILE-- setParam('q', 'lucene') ->setParam('start', 0) ->setParam('rows', 10) ->addParam('fq', 'popularity:[10 TO *]') ->addParam('fq', 'section:0') ; try { $params2 = clone $params; } catch (SolrIllegalOperationException $e) { echo sprintf("Exception %d: %s", $e->getCode(), $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- Exception 4001: Cloning of SolrParams object instances is currently not supported solr-2.8.1/tests/200.solrextractrequest_clone.phpt0000664000175000017500000000064715001737315021142 0ustar biggibiggi--TEST-- SolrExtractRequest - clone [exception] --FILE-- getCode(), $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- Exception 4001: Cloning of SolrExtractRequest objects is currently not supported solr-2.8.1/tests/201.solrextractrequest_serialize.phpt0000664000175000017500000000065415001737315022030 0ustar biggibiggi--TEST-- SolrExtractRequest - serialize [exception] --FILE-- getCode(), $e->getMessage()).PHP_EOL; } ?> --EXPECTF-- Exception 4001: SolrExtractRequest objects cannot be serialized or unserialized solr-2.8.1/tests/202.solrdocument_new_serialize.phpt0000644000175000017500000000172615001737315021434 0ustar biggibiggi--TEST-- SolrDocument - new serialize api --SKIPIF-- --FILE-- parent_2'; $xml_length = strlen($xml_contents); $old = sprintf('C:12:"SolrDocument":%d:{%s}', $xml_length, $xml_contents); $new = sprintf('O:12:"SolrDocument":1:{s:3:"xml";s:%d:"%s";}', $xml_length, $xml_contents); /** @var SolrDocument $docOld */ $docOld = unserialize($old); /** @var SolrDocument $docNew */ $docNew = unserialize($new); var_dump( json_encode($docOld->toArray()) === json_encode($docNew->toArray()) ); var_dump($docNew->__serialize()); ?> --EXPECT-- bool(true) array(1) { ["xml"]=> string(172) " parent_2 " } solr-2.8.1/tests/203.solrquery_strict_types.phpt0000644000175000017500000000215615001737315020656 0ustar biggibiggi--TEST-- SolrQuery - Strict type parameters without BC break --FILE-- setStart(1); $query->setRows(2); $query->setTimeAllowed(300); $query->setGroupOffset(1); $query->setExpandRows(1); echo $query . "\n"; // Now with strings $query = new SolrQuery('lucene'); $query->setStart('1anystring'); // we don't do any checking $query->setRows('2'); $query->setTimeAllowed('300'); $query->setGroupOffset('1'); $query->setExpandRows('1'); echo $query . "\n"; try { $query->setStart(true); } catch (SolrIllegalArgumentException $e) { echo $e->getMessage() . "\n"; } $collapse = new SolrCollapseFunction(); $collapse->setSize(1); echo $collapse . "\n"; $d = new SolrDisMaxQuery('lucene'); $d->setPhraseSlop(2); $d->setQueryPhraseSlop(3); $d->setBigramPhraseSlop(4); $d->setTrigramPhraseSlop(5); echo $d . "\n"; --EXPECT-- q=lucene&start=1&rows=2&timeAllowed=300&group.offset=1&expand.rows=1 q=lucene&start=1anystring&rows=2&timeAllowed=300&group.offset=1&expand.rows=1 Argument 1 must be an int {!collapse size=1} q=lucene&defType=edismax&ps=2&qs=3&ps2=4&ps3=5 solr-2.8.1/tests/bug_59511_error.phpt0000664000175000017500000000131515001737315016222 0ustar biggibiggi--TEST-- Solr bug #59511 - SolrClient::query() Timeout shall throw a SolrClientException --SKIPIF-- --FILE-- 'anyhost', 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'timeout' => 2 ); $client = new SolrClient($options); $query = new SolrQuery("lucene"); try { $query_response = $client->query($query); } catch (SolrClientException $e) { echo $e->getMessage().PHP_EOL; echo $e->getCode().PHP_EOL; } ?> --EXPECTF-- Solr HTTP Error %d: '%s' 1004solr-2.8.1/tests/bug_61836_error.phpt0000664000175000017500000000100415001737315016220 0ustar biggibiggi--TEST-- Solr bug #61836 - Extending SolrDocument --SKIPIF-- --FILE-- addField('testname', true); ?> --EXPECTF-- Fatal error: Class Model_SolrDocument %s final class %s solr-2.8.1/tests/bug_67394.phpt0000664000175000017500000000125015001737315015017 0ustar biggibiggi--TEST-- Solr Bug #67394 - Unable to parse response with NaN --FILE-- stats->stats_fields->date->stddev); $xmlFixture = file_get_contents(ROOT_DIRECTORY . '/files/bug67394.xml'); if (!json_decode($fixture)) { echo "PHP JSON DECODE failed with: ". json_last_error_msg().PHP_EOL; } $response = SolrUtils::digestXmlResponse($xmlFixture); var_dump($response->response->stats->stats_fields->currentPrice->mean); ?> --EXPECTF-- string(3) "NaN" float(NAN)solr-2.8.1/tests/bug_68179.phpt0000664000175000017500000000052515001737315015025 0ustar biggibiggi--TEST-- Solr Bug #68179 - Solr Params (Argument list) separator disappears --FILE-- addSortField('price', SolrQuery::ORDER_ASC); $dismaxQuery->addSortField('score', SolrQuery::ORDER_DESC); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- q=score&defType=%s&sort=price asc,score descsolr-2.8.1/tests/bug_68181.phpt0000664000175000017500000000110115001737315015005 0ustar biggibiggi--TEST-- Solr Bug #68181 - Conflict occurs when using SolrDisMax::addBoostQuery and setBoostQuery --FILE-- setBoostQuery("failing:val^3") ->addBoostQuery('category','software',2) ->setBoostQuery("end:result^4"); echo $dismaxQuery.PHP_EOL; ?> --EXPECTF-- Notice: SolrDisMaxQuery::addBoostQuery(): Parameter bq value(s) was overwritten by this call in %s on line %d Notice: SolrDisMaxQuery::setBoostQuery(): Parameter bq value(s) was overwritten by this call in %s on line %d q=lucene&defType=%s&bq=end:result^4solr-2.8.1/tests/bug_69156.phpt0000664000175000017500000000122315001737315015015 0ustar biggibiggi--TEST-- Solr Bug #69156 - segfault on 500 response from Solr --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => 'solr/collection44444', 'wt' => 'phps' ); $client = new SolrClient($options); $query = new SolrQuery("lucene"); try { $query_response = $client->query($query); } catch (Exception $e) { } ?> --EXPECTF-- Notice: SolrClient::query(): Unable to parse serialized php response in %s on line %d solr-2.8.1/tests/bug_70482.phpt0000664000175000017500000000170215001737315015011 0ustar biggibiggi--TEST-- Solr Bug #70482 - Segmentation fault on server 500 response with no msg field XML RW --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'xml' ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $func = new SolrCollapseFunction('manu_id_s'); $func->setMax('sum(cscore(),field(manu_id_s))'); $func->setSize(100); $func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND); $query->collapse($func); try { $queryResponse = $client->query($query); } catch (SolrServerException $e) { printf("Exception code %d", $e->getCode()); assert(strlen($e->getMessage()) > 0, 'Exception message is empty'); echo PHP_EOL; } ?> OK --EXPECTF-- Exception code %d OKsolr-2.8.1/tests/bug_70495.phpt0000664000175000017500000000174615001737315015025 0ustar biggibiggi--TEST-- Solr Bug #70495 - Failed to parse 500 error response when Solr it lacks msg JSON RW --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'json' ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $func = new SolrCollapseFunction('manu_id_s'); $func->setMax('sum(cscore(),field(manu_id_s))'); $func->setSize(100); $func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND); $query->collapse($func); try { $queryResponse = $client->query($query); } catch (SolrServerException $e) { printf("Exception code %d", $e->getCode()); assert(strlen($e->getMessage()) > 0, 'Exception message is empty'); } ?> OK --EXPECTF-- Exception code 500 OKsolr-2.8.1/tests/bug_70496.phpt0000664000175000017500000000164015001737315015017 0ustar biggibiggi--TEST-- Solr Bug #70496 - Failed to parse 500 error response when Solr it lacks msg PHPS RW --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'phps' ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $func = new SolrCollapseFunction('manu_id_s'); $func->setMax('sum(cscore(),field(manu_id_s))'); $func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND); $query->collapse($func); try { $queryResponse = $client->query($query); } catch (SolrServerException $e) { printf("Exception code %d", $e->getCode()); assert(strlen($e->getMessage()) > 0, 'Exception message is empty'); } ?> OK --EXPECTF-- Exception code 500 OKsolr-2.8.1/tests/bug_72033.phpt0000664000175000017500000000210515001737315015001 0ustar biggibiggi--TEST-- Solr Bug #72033 - Real Time Get requests fails if it wasn't the first request --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient($options); $doc = new SolrInputDocument(); $doc->addField('id', 'some_id'); $doc->addField('field1', 'val1'); $client->addDocument($doc); $client->commit(); $response = $client->getById('some_id'); var_dump(isset($response->getArrayResponse()['doc'])).PHP_EOL; var_dump($response->getResponse()->doc->id) . PHP_EOL; // pointless request just to fill the request buffer $client->commit(); $response = $client->getByIds(['GB18030TEST', '6H500F0']); var_dump($response->getResponse()->response->docs[0]->id, $response->getResponse()->response->docs[1]->id); ?> --EXPECTF-- bool(true) string(7) "some_id" string(11) "GB18030TEST" string(7) "6H500F0" solr-2.8.1/tests/bug_72740.phpt0000664000175000017500000000541115001737315015011 0ustar biggibiggi--TEST-- Solr Bug #72740 - addPhraseField return wrong query --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH ); $client = new SolrClient( $options ); $dismaxQuery = new SolrDisMaxQuery( '*:*' ); $dismaxQuery->addPhraseField( "phraseField1", 10, 5 ); $dismaxQuery->addPhraseField( "phraseField2", 5, 1 ); $dismaxQuery->addSortField('score', SolrQuery::ORDER_DESC); $dismaxQuery->addSortField('manufacturedate_dt', SolrQuery::ORDER_DESC); // Scenario 1: DisMax Query Parser - Adds Phrase Fields with both boost and slop. // Expect: // - pf parameter should list each phrase field with ~ and ^ prefix for slop and boost value respectively. $queryResponse = $client->query( $dismaxQuery ); print_r($queryResponse->getResponse()->responseHeader->params); // Scenario 2: Same as Scenario 1, now including explicit query fields too. // Expect: // - pf parameter should list each phrase field with ~ and ^ prefix for slop and boost value respectively. // - qf parameter should list each query field with a trailing ^ (no boost here). $dismaxQuery->addQueryField('score'); $dismaxQuery->addQueryField('manufacturedate_dt'); $queryResponse = $client->query( $dismaxQuery ); print_r($queryResponse->getResponse()->responseHeader->params); // Scenario 3: Same as Scenario 2, now including explicit boost value for the query fields. // Expect: // - pf parameter should list each phrase field with ~ and ^ prefix for slop and boost value respectively. // - qf parameter should list each query field with a ^ prefix for boost value. $dismaxQuery->removeQueryField('score'); $dismaxQuery->removeQueryField('manufacturedate_dt'); $dismaxQuery->addQueryField('score', 3); $dismaxQuery->addQueryField('manufacturedate_dt', 7); $queryResponse = $client->query( $dismaxQuery ); print_r($queryResponse->getResponse()->responseHeader->params); ?> --EXPECTF-- SolrObject Object ( [q] => *:* [defType] => edismax [indent] => on [pf] => phraseField1~5^10 phraseField2~1^5 [sort] => score desc,manufacturedate_dt desc [version] => 2.2 [wt] => xml ) SolrObject Object ( [q] => *:* [defType] => edismax [indent] => on [qf] => score^ manufacturedate_dt^ [pf] => phraseField1~5^10 phraseField2~1^5 [sort] => score desc,manufacturedate_dt desc [version] => 2.2 [wt] => xml ) SolrObject Object ( [q] => *:* [defType] => edismax [indent] => on [qf] => score^3 manufacturedate_dt^7 [pf] => phraseField1~5^10 phraseField2~1^5 [sort] => score desc,manufacturedate_dt desc [version] => 2.2 [wt] => xml )solr-2.8.1/tests/bug_unknown.phpt0000775000175000017500000000164215001737315016032 0ustar biggibiggi--TEST-- Solr Bug #70496 - Failed to parse 500 error response when Solr it lacks msg PHPS RW --SKIPIF-- --FILE-- SOLR_SERVER_HOSTNAME, 'login' => SOLR_SERVER_USERNAME, 'password' => SOLR_SERVER_PASSWORD, 'port' => SOLR_SERVER_PORT, 'path' => SOLR_SERVER_PATH, 'wt' => 'phps' ); $client = new SolrClient($options); $query = new SolrQuery('*:*'); $func = new SolrCollapseFunction('manu_id_s'); $func->setMax('sum(cscore(),field(manu_id_s))'); $func->setNullPolicy(SolrCollapseFunction::NULLPOLICY_EXPAND); $query->collapse($func); try { $queryResponse = $client->query($query); } catch (SolrServerException $e) { printf("Exception code %d", $e->getCode()); assert(strlen($e->getMessage()) > 0, 'Exception message is empty'); } ?> OK --EXPECTF-- Exception code 500 OKsolr-2.8.1/pecl-compat/src/misc.h0000664000175000017500000001602515001737315015534 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Compatibility between PHP versions | +----------------------------------------------------------------------+ | Copyright (c) 2015 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Francois Laupretre | +----------------------------------------------------------------------+ */ #ifndef __PECL_COMPAT_MISC_H #define __PECL_COMPAT_MISC_H 1 #ifdef PHP_7 /*============================================================================*/ typedef zend_string * OPENED_PATH_PTR; /* Type of stream opened_path argument */ typedef size_t COMPAT_ARG_SIZE_T; /* Size of string arguments */ typedef zend_long COMPAT_ARG_LONG_T; /* Type of long (integer) arguments */ #define compat_zval_ptr_dtor(zp) zval_ptr_dtor(zp) #include #else /*== PHP 5 ===================================================================*/ typedef char * OPENED_PATH_PTR; typedef off_t zend_off_t; typedef int COMPAT_ARG_SIZE_T; typedef long COMPAT_ARG_LONG_T; typedef long zend_long; #define compat_zval_ptr_dtor(zp) zval_dtor(zp) #endif /*============================================================================*/ #ifndef MIN # define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif #ifndef MAX # define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif /*---------------------------------------------------------------*/ /* (Taken from pcre/pcrelib/internal.h) */ /* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY is set. Otherwise, include an emulating function for those systems that have neither (there are some non-Unix environments where this is the case). This assumes that all calls to memmove are moving strings upwards in store, which is the case in this extension. */ #if ! HAVE_MEMMOVE # ifdef memmove # undef memmove /* some systems may have a macro */ # endif # if HAVE_BCOPY # define memmove(a, b, c) bcopy(b, a, c) # else static void *my_memmove(unsigned char *dest, const unsigned char *src, size_t n) { int i; dest += n; src += n; for (i = 0; i < n; ++i) *(--dest) = *(--src); } # define memmove(a, b, c) my_memmove(a, b, c) # endif /* not HAVE_BCOPY */ #endif /* not HAVE_MEMMOVE */ #ifdef _AIX # undef PHP_SHLIB_SUFFIX # define PHP_SHLIB_SUFFIX "a" #endif #ifndef ZVAL_IS_ARRAY #define ZVAL_IS_ARRAY(zp) (Z_TYPE_P((zp))==IS_ARRAY) #endif #ifndef ZVAL_IS_STRING #define ZVAL_IS_STRING(zp) (Z_TYPE_P((zp))==IS_STRING) #endif #ifndef ZVAL_IS_LONG #define ZVAL_IS_LONG(zp) (Z_TYPE_P((zp))==IS_LONG) #endif #ifndef ZVAL_IS_BOOL #define ZVAL_IS_BOOL(zp) (Z_TYPE_P((zp))==IS_BOOL) #endif #ifndef INIT_ZVAL #define INIT_ZVAL(z) memset(&z, 0, sizeof(z)) #endif #ifndef ZVAL_UNDEF #define ZVAL_UNDEF(z) INIT_ZVAL(*(z)) #endif #ifndef MAKE_STD_ZVAL #define MAKE_STD_ZVAL(zp) { zp = emalloc(sizeof(zval)); INIT_ZVAL(*zp); } #endif #ifndef ALLOC_INIT_ZVAL #define ALLOC_INIT_ZVAL(zp) MAKE_STD_ZVAL(zp) #endif #ifndef ZEND_ASSUME #if defined(ZEND_WIN32) && !defined(__clang__) # define ZEND_ASSUME(c) __assume(c) #else # define ZEND_ASSUME(c) #endif #endif #ifndef ZEND_ASSERT #if ZEND_DEBUG # define ZEND_ASSERT(c) assert(c) #else # define ZEND_ASSERT(c) ZEND_ASSUME(c) #endif #endif #ifndef EMPTY_SWITCH_DEFAULT_CASE /* Only use this macro if you know for sure that all of the switches values are covered by its case statements */ #if ZEND_DEBUG # define EMPTY_SWITCH_DEFAULT_CASE() default: ZEND_ASSERT(0); break; #else # define EMPTY_SWITCH_DEFAULT_CASE() default: ZEND_ASSUME(0); break; #endif #endif #ifndef ZEND_IGNORE_VALUE #if defined(__GNUC__) && __GNUC__ >= 4 # define ZEND_IGNORE_VALUE(x) (({ __typeof__ (x) __x = (x); (void) __x; })) #else # define ZEND_IGNORE_VALUE(x) ((void) (x)) #endif #endif #if PHP_API_VERSION >= 20100412 typedef size_t PHP_ESCAPE_HTML_ENTITIES_SIZE; #else typedef int PHP_ESCAPE_HTML_ENTITIES_SIZE; #endif /* Avoid a warning when compiling stream wrapper declarations for openfile/opendir/url_stat */ #if ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO # define COMPAT_STREAM_CONST_DECL const #else # define COMPAT_STREAM_CONST_DECL #endif #ifndef ZEND_MODULE_GLOBALS_ACCESSOR # ifdef ZTS # define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) \ TSRMG(module_name##_globals_id, zend_##module_name##_globals *, v) # else # define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) \ (module_name##_globals.v) # endif #endif #ifndef ZEND_MODULE_GLOBALS_BULK # ifdef ZTS # define ZEND_MODULE_GLOBALS_BULK(module_name) \ ((zend_##module_name##_globals *) \ (*((void ***) tsrm_ls))[module_name##_globals_id - 1]) # else # define ZEND_MODULE_GLOBALS_BULK(module_name) \ (&module_name##_globals) # endif #endif #ifndef ZEND_TSRMLS_CACHE_DEFINE # define ZEND_TSRMLS_CACHE_DEFINE() #endif #ifndef ZEND_TSRMLS_CACHE_UPDATE # define ZEND_TSRMLS_CACHE_UPDATE() #endif #ifndef PHP_FE_END # define PHP_FE_END { NULL, NULL, NULL } #endif #ifndef ZEND_MOD_END /* for php < 5.3.7 */ # define ZEND_MOD_END {NULL, NULL, NULL} #endif /*============================================================================*/ /* Duplicate a memory buffer */ /* Supports zero size (allocates 1 byte) */ static zend_always_inline void *_compat_dup(const void *ptr, size_t size, int persistent) { char *p; if (!ptr) return NULL; if (size) { p = pemalloc(size, persistent); memmove(p, ptr, size); } else { p = pemalloc(1,persistent); (*p) = '\0'; /* Ensures deterministic behavior */ } return p; } /*---------------------------------------------------------------*/ /* Duplicate a string and set terminating null. Input string does not have to be null-terminated */ static zend_always_inline void *_compat_dup_str(const void *ptr, size_t size, int persistent) { char *p; if (!ptr) return NULL; p = pemalloc(size + 1, persistent); if (size) memmove(p, ptr, size); p[size] = '\0'; return p; } /*-----------------------------------------------------*/ /* Fatal error - display message and abort process */ static zend_always_inline void compat_unsupported(char *msg) { php_error(E_CORE_ERROR, "This feature is not supported in this environment : %s", msg); exit(1); } /*============================================================================*/ #endif /* __PECL_COMPAT_MISC_H */ solr-2.8.1/pecl-compat/src/zend_hash.h0000664000175000017500000002605215001737315016545 0ustar biggibiggi/* +----------------------------------------------------------------------+ | zend_hash compatibility layer for PHP 5 & 7 | +----------------------------------------------------------------------+ | Copyright (c) 2005-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Francois Laupretre | +----------------------------------------------------------------------+ */ #ifndef _COMPAT_ZEND_HASH_H #define _COMPAT_ZEND_HASH_H #include "zend_hash.h" #ifdef PHP_7 /*============================================================================*/ #define compat_zend_hash_exists(ht, key) zend_hash_exists(ht, key) #define compat_zend_hash_str_exists(ht, str, len) zend_hash_str_exists(ht, str, len) #define COMPAT_HASH_PTR(_zp) (&(Z_PTR_P(_zp))) /*---------*/ /* Changes from original version: - If numeric key, returned (zend_string *) is set to NULL. - If non null, returned zend_string must be released. */ static zend_always_inline int compat_zend_hash_get_current_key_ex(const HashTable *ht , zend_string **str_index, zend_ulong *num_index, HashPosition *pos) { int status; if (str_index) (*str_index) = NULL; status = zend_hash_get_current_key_ex(ht, str_index, num_index, pos); if (*str_index) zend_string_addref(*str_index); return status; } /*---------*/ /* Added - This function is equivalent to the PHP 5 version of zend_hash_get_current_key_ex() */ static zend_always_inline int compat_zend_hash_str_get_current_key_ex(const HashTable *ht , char **str_index, size_t *str_length, zend_ulong *num_index , zend_bool duplicate, HashPosition *pos) { int status; zend_string *zp; zp = NULL; status = zend_hash_get_current_key_ex(ht, &zp, num_index, pos); if (zp) { if (duplicate) { (*str_index) = estrndup(ZSTR_VAL(zp), ZSTR_LEN(zp)); } else { (*str_index) = ZSTR_VAL(zp); } (*str_length) = ZSTR_LEN(zp); } return status; } /*---------*/ static zend_always_inline void *compat_zend_hash_get_current_data_ptr_ex(HashTable *ht , HashPosition *pos) { zval *zp; zp = zend_hash_get_current_data_ex(ht, pos); return Z_PTR_P(zp); } #define compat_zend_hash_get_current_data_ptr(ht) \ compat_zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer) /*---------*/ static zend_always_inline void *compat_zend_hash_get_current_data_ex(HashTable *ht , HashPosition *pos) { return (void *)zend_hash_get_current_data_ex(ht, pos); } #define compat_zend_hash_get_current_data(ht) \ compat_zend_hash_get_current_data_ex(ht, &(ht)->nInternalPointer) #define compat_zend_hash_get_current_zval_ex(ht, pos) \ (zval *)compat_zend_hash_get_current_data_ex(ht, pos) #define compat_zend_hash_get_current_zval(ht) \ compat_zend_hash_get_current_zval_ex(ht, &(ht)->nInternalPointer) #else /*= PHP 5 ====================================================================*/ #ifndef HASH_KEY_NON_EXISTENT #define HASH_KEY_NON_EXISTENT HASH_KEY_NON_EXISTANT #endif #define COMPAT_HASH_PTR(_zp) (_zp) /*------------------------------------------------*/ static zend_always_inline void *zend_hash_add_ptr(HashTable *ht , zend_string *key, void *pData) { int status; status = zend_hash_quick_add(ht, ZSTR_VAL(key), (uint)(ZSTR_LEN(key) + 1) , (ulong)ZSTR_HASH(key), &pData, sizeof(void *), NULL); return (status == SUCCESS ? pData : NULL); } #define zend_hash_add_new_ptr(ht, key, pData) zend_hash_add_ptr(ht, key, pData) #define zend_hash_add_mem(ht, key, pData, size) \ zend_hash_add_ptr(ht, key, _compat_dup(pData, size, ht->persistent)) /*---------*/ static zend_always_inline void *zend_hash_str_add_ptr(HashTable *ht , const char *str, size_t len, void *pData) { int status; char *strn = _compat_dup_str(str, len, 0); status = zend_hash_add(ht, strn, len + 1, &pData, sizeof(void *), NULL); efree(strn); return (status == SUCCESS ? pData : NULL); } #define zend_hash_str_add_new_ptr(ht, str, len, pData) zend_hash_str_add_ptr(ht, str, len, pData) #define zend_hash_str_add_mem(ht, str, len, pData, size) \ zend_hash_str_add_ptr(ht, str, len, _compat_dup(pData, size, ht->persistent)) /*---------*/ static zend_always_inline void *zend_hash_index_add_ptr(HashTable *ht , zend_ulong h, void *pData) { int status; status = zend_hash_index_update(ht, (ulong)h, &pData, sizeof(void *), NULL); return (status == SUCCESS ? pData : NULL); } #define zend_hash_index_add_new_ptr(ht, h, pData) \ zend_hash_index_add_ptr(ht, h, pData) #define zend_hash_index_add_mem(ht, h, pData, size) \ zend_hash_index_add_ptr(ht, h, _compat_dup(pData, size, ht->persistent)) /*---------*/ static zend_always_inline void *zend_hash_next_index_insert_ptr(HashTable *ht , void *pData) { int status; status = zend_hash_next_index_insert(ht, &pData, sizeof(void *), NULL); return (status == SUCCESS ? pData : NULL); } #define zend_hash_next_index_insert_mem(ht, pData, size) \ zend_hash_next_index_insert_ptr(ht, _compat_dup(pData, size, ht->persistent)) /*---------*/ static zend_always_inline void *zend_hash_update_ptr(HashTable *ht , zend_string *key, void *pData) { int status; status = zend_hash_quick_update(ht, ZSTR_VAL(key), (uint)(ZSTR_LEN(key) + 1) , (ulong)ZSTR_HASH(key), &pData, sizeof(void *), NULL); return (status == SUCCESS ? pData : NULL); } #define zend_hash_update_mem(ht, key, pData, size) \ zend_hash_update_ptr(ht, key, _compat_dup(pData, size, ht->persistent)) /*---------*/ static zend_always_inline void *zend_hash_str_update_ptr(HashTable *ht , const char *str, size_t len, void *pData) { int status; char *strn = _compat_dup_str(str, len, 0); status = zend_hash_update(ht, strn, len + 1, &pData, sizeof(void *), NULL); efree(strn); return (status == SUCCESS ? pData : NULL); } #define zend_hash_str_upate_mem(ht, str, len, pData, size) \ zend_hash_str_update_ptr(ht, str, len, _compat_dup(pData, size, ht->persistent)) #define zend_hash_index_update_ptr(ht, h, pData) \ zend_hash_index_add_ptr(ht, h, pData) #define zend_hash_index_update_mem(ht, h, pData, size) \ zend_hash_index_add_mem(ht, h, pData, size) /*---------*/ static zend_always_inline void *zend_hash_find_ptr(const HashTable *ht , zend_string *key) { int status; void **p; status = zend_hash_quick_find(ht, ZSTR_VAL(key), (uint)(ZSTR_LEN(key) + 1) , (ulong)ZSTR_HASH(key), (void **)(&p)); return (status == SUCCESS ? (*p) : NULL); } /*---------*/ static zend_always_inline void *zend_hash_str_find_ptr(const HashTable *ht , const char *str, size_t len) { int status; void **p; char *strn = _compat_dup_str(str, len, 0); status = zend_hash_find(ht, strn, len + 1, (void **)(&p)); efree(strn); return (status == SUCCESS ? (*p) : NULL); } /*---------*/ static zend_always_inline void *zend_hash_index_find_ptr(const HashTable *ht , zend_ulong h) { int status; void **p; status = zend_hash_index_find(ht, h, (void **)(&p)); return (status == SUCCESS ? (*p) : NULL); } /*---------*/ #define zend_hash_str_del(ht, arKey, nKeyLength) zend_hash_del(ht, arKey, nKeyLength) /*---------*/ static zend_always_inline zend_bool compat_zend_hash_exists(const HashTable *ht , zend_string *key) { return zend_hash_quick_exists(ht, ZSTR_VAL(key), (uint)(ZSTR_LEN(key) + 1) , (ulong)ZSTR_HASH(key)); } /*---------*/ static zend_always_inline zend_bool compat_zend_hash_str_exists(const HashTable *ht , const char *str, size_t len) { zend_bool status; char *strn = _compat_dup_str(str, len, 0); status = zend_hash_exists(ht, strn, (uint)(len + 1)); efree(strn); return status; } /*---------*/ /* Changes from original version: - Returns a zend_string - If key is a string, returned zend_string must be released. */ static zend_always_inline int compat_zend_hash_get_current_key_ex(const HashTable *ht , zend_string **str_index, zend_ulong *num_index, HashPosition *pos) { int status; char *str; uint32_t str_length; zend_ulong num; status = zend_hash_get_current_key_ex(ht, &str, &str_length, &num, 0, pos); if (status == HASH_KEY_IS_STRING) { (*str_index) = zend_string_init(str, str_length - 1, ht->persistent); } else if (status == HASH_KEY_IS_LONG) { (*num_index) = (zend_ulong)num; } return status; } /*---------*/ /* Diff with original : - Type casts - Return string length, without trailing null */ static zend_always_inline int compat_zend_hash_str_get_current_key_ex(const HashTable *ht , char **str_index, size_t *str_length, zend_ulong *num_index , zend_bool duplicate, HashPosition *pos) { int status; uint32_t length; zend_ulong num; status = zend_hash_get_current_key_ex(ht, str_index, &length, &num, duplicate, pos); if (status == HASH_KEY_IS_STRING) { (*str_length) = (size_t)(length - 1); } else if (status == HASH_KEY_IS_LONG) { (*num_index) = (zend_ulong)num; } return status; } /*---------*/ static zend_always_inline void *compat_zend_hash_get_current_data_ptr_ex(HashTable *ht , HashPosition *pos) { int status; void **p; status = zend_hash_get_current_data_ex(ht, (void **)(&p), pos); return ((status == SUCCESS) ? (*p) : NULL); } #define compat_zend_hash_get_current_data_ptr(ht) \ compat_zend_hash_get_current_data_ptr_ex(ht, NULL) /*---------*/ static zend_always_inline void *compat_zend_hash_get_current_data_ex(HashTable *ht , HashPosition *pos) { int status; void **p; status = zend_hash_get_current_data_ex(ht, (void **)(&p), pos); return ((status == SUCCESS) ? p : NULL); } #define compat_zend_hash_get_current_data(ht) \ compat_zend_hash_get_current_data_ex(ht, NULL) #define compat_zend_hash_get_current_zval_ex(ht, pos) \ *((zval **)compat_zend_hash_get_current_data_ex(ht, pos)) #define compat_zend_hash_get_current_zval(ht) \ compat_zend_hash_get_current_zval_ex(ht, NULL) /*------------------------------------------------------------*/ #define ZEND_HASH_FOREACH(_ht, indirect) do { \ HashPosition _pos; \ for (zend_hash_internal_pointer_reset_ex(_ht, &_pos) \ ;;zend_hash_move_forward_ex(_ht, &_pos)) { \ if (zend_hash_has_more_elements_ex(_ht, &_pos) != SUCCESS) break; #define ZEND_HASH_FOREACH_END() \ } \ } while (0) #define ZEND_HASH_FOREACH_PTR(_ht, _ptr) \ ZEND_HASH_FOREACH(_ht, 0); \ _ptr = compat_zend_hash_get_current_data_ptr_ex(_ht, &_pos); #define ZEND_HASH_FOREACH_NUM_KEY(_ht, _h) \ ZEND_HASH_FOREACH(_ht, 0); \ compat_zend_hash_get_current_key_ex(_ht, NULL, &_h, &_pos); #define ZEND_HASH_FOREACH_NUM_KEY_PTR(_ht, _h, _ptr) \ ZEND_HASH_FOREACH(_ht, 0); \ _ptr = compat_zend_hash_get_current_data_ptr_ex(_ht, &_pos); \ compat_zend_hash_get_current_key_ex(_ht, NULL, &_h, &_pos); /*============================================================================*/ #endif /* PHP_7 */ #endif /* _COMPAT_ZEND_HASH_H */ solr-2.8.1/pecl-compat/src/zend_string.h0000664000175000017500000001601215001737315017123 0ustar biggibiggi/* +----------------------------------------------------------------------+ | zend_string compatibility layer for PHP 5 & 7 | +----------------------------------------------------------------------+ | Copyright (c) 2005-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Francois Laupretre | +----------------------------------------------------------------------+ */ #ifndef _COMPAT_ZEND_STRING_H #define _COMPAT_ZEND_STRING_H #ifdef PHP_7 /*============================================================================*/ #include "zend_string.h" #ifndef ZSTR_IS_PERSISTENT # define ZSTR_IS_PERSISTENT(s) (GC_FLAGS(s) & IS_STR_PERSISTENT) #endif #else /*============================================================================*/ /*---- zend_string for PHP 5 ----*/ struct _zend_string { int persistent; int hash_is_set; /* needed because computed hash may be null */ zend_ulong h; /* hash value */ uint32_t refcount; size_t len; char val[1]; }; typedef struct _zend_string zend_string; /* Shortcuts */ #define ZSTR_VAL(zstr) (zstr)->val #define ZSTR_LEN(zstr) (zstr)->len #define ZSTR_H(zstr) (zstr)->h #define ZSTR_HASH(zstr) zend_string_hash_val(zstr) #define _ZSTR_HEADER_SIZE XtOffsetOf(zend_string, val) #define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1) #define ZSTR_IS_PERSISTENT(s) (s->persistent) /*---------*/ static zend_always_inline uint32_t zend_string_refcount(zend_string *s) { return (s->refcount); } /*---------*/ static zend_always_inline uint32_t zend_string_addref(zend_string *s) { return ++(s->refcount); } /*---------*/ static zend_always_inline uint32_t zend_string_delref(zend_string *s) { return --(s->refcount); } /*---------*/ static zend_always_inline zend_ulong zend_string_hash_val(zend_string *s) { char c, *p; if (! s->hash_is_set) { /* Compute with terminating null but preserve string */ p = &(ZSTR_VAL(s)[ZSTR_LEN(s)]); c = (*p); (*p) = '\0'; ZSTR_H(s) = zend_get_hash_value(ZSTR_VAL(s), ZSTR_LEN(s)+1); (*p) = c; s->hash_is_set = 1; } return ZSTR_H(s); } /*---------*/ static zend_always_inline void zend_string_forget_hash_val(zend_string *s) { s->hash_is_set = 0; ZSTR_H(s) = 0; /* Security */ } /*---------*/ static zend_always_inline zend_string *zend_string_alloc(size_t len, int persistent) { zend_string *ret = (zend_string *)pemalloc(ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent); ret->persistent = persistent; zend_string_forget_hash_val(ret); ret->refcount = 1; ZSTR_LEN(ret) = len; return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_safe_alloc(size_t n , size_t m, size_t l, int persistent) { zend_string *ret = (zend_string *)safe_pemalloc(n, m, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(l)), persistent); ret->persistent = persistent; zend_string_forget_hash_val(ret); ret->refcount = 1; ZSTR_LEN(ret) = l; return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_init(const char *str, size_t len, int persistent) { zend_string *ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), str, len); ZSTR_VAL(ret)[len] = '\0'; return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_dup(zend_string *s, int persistent) { zend_string *target; target = zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); if (s->hash_is_set) { ZSTR_H(target) = ZSTR_H(s); target->hash_is_set = 1; } return target; } /*---------*/ static zend_always_inline zend_string *zend_string_realloc(zend_string *s , size_t len, int persistent) { zend_string *ret; if (EXPECTED(s->refcount == 1)) { ret = (zend_string *)perealloc(s, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent); ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; } zend_string_delref(s); ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), MIN(len, ZSTR_LEN(s)) + 1); return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_extend(zend_string *s , size_t len, int persistent) { zend_string *ret; ZEND_ASSERT(len >= ZSTR_LEN(s)); if (EXPECTED(s->refcount == 1)) { ret = (zend_string *)perealloc(s, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent); ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; } zend_string_delref(s); ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), ZSTR_LEN(s) + 1); return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_truncate(zend_string *s , size_t len, int persistent) { zend_string *ret; ZEND_ASSERT(len <= ZSTR_LEN(s)); if (EXPECTED(s->refcount == 1)) { ret = (zend_string *)perealloc(s, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent); ZSTR_LEN(ret) = len; zend_string_forget_hash_val(ret); return ret; } zend_string_delref(s); ret = zend_string_alloc(len, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), len + 1); return ret; } /*---------*/ static zend_always_inline zend_string *zend_string_safe_realloc(zend_string *s , size_t n, size_t m, size_t l, int persistent) { zend_string *ret; if (EXPECTED(s->refcount == 1)) { ret = (zend_string *)safe_perealloc(s, n, m, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(l)), persistent); ZSTR_LEN(ret) = (n * m) + l; zend_string_forget_hash_val(ret); return ret; } zend_string_delref(s); ret = zend_string_safe_alloc(n, m, l, persistent); memcpy(ZSTR_VAL(ret), ZSTR_VAL(s), MIN((n * m) + l, ZSTR_LEN(s)) + 1); return ret; } /*---------*/ static zend_always_inline void zend_string_free(zend_string *s) { if (s) { pefree(s, s->persistent); } } /*---------*/ static zend_always_inline void zend_string_release(zend_string *s) { if (s) { s->refcount--; if (s->refcount == 0) { zend_string_free(s); } } } /*---------*/ static zend_always_inline zend_string *zend_string_copy(zend_string *s) { zend_string_addref(s); return (s); } /*---------*/ static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2) { return s1 == s2 || (s1->len == s2->len && !memcmp(s1->val, s2->val, s1->len)); } #define zend_string_equals_literal(str, literal) \ ((str)->len == sizeof(literal)-1 && !memcmp((str)->val, literal, sizeof(literal) - 1)) #endif /* PHP_7 */ #endif /* _COMPAT_ZEND_STRING_H */ solr-2.8.1/pecl-compat/compat.h0000644000175000017500000000514515001737315015274 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Compatibility macros for different PHP versions | +----------------------------------------------------------------------+ | Copyright (c) 2015 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Francois Laupretre | +----------------------------------------------------------------------+ */ #ifndef _COMPAT_H #define _COMPAT_H #define PECL_COMPAT_VERSION 1.2 #include #include #include #include "php.h" #include "zend.h" #include "zend_extensions.h" #include "zend_API.h" #define PHP_5_0_X_API_NO 220040412 #define PHP_5_1_X_API_NO 220051025 #define PHP_5_2_X_API_NO 220060519 #define PHP_5_3_X_API_NO 220090626 #define PHP_5_4_X_API_NO 220100525 #define PHP_5_5_X_API_NO 220121212 #define PHP_5_6_X_API_NO 220131226 #if PHP_MAJOR_VERSION >= 7 # define PHP_7 #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef PHP_WIN32 # include "win32/time.h" #elif defined(NETWARE) # include # include #else # include #endif #ifdef HAVE_SYS_RESOURCE_H # include #endif #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #if defined(PHP_WIN32) && PHP_MAJOR_VERSION < 8 # include #else # include #endif #if ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO #include "zend_virtual_cwd.h" #else #include "TSRM/tsrm_virtual_cwd.h" #endif #ifdef PHP_7 #include "Zend/zend_portability.h" #endif /*-- Include submodules */ #include "src/misc.h" #include "src/zend_string.h" #include "src/zend_hash.h" #endif /* _COMPAT_H */ solr-2.8.1/src/php_solr.h0000644000175000017500000011630015001737315014216 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #ifndef SOLRCLIENT_H #define SOLRCLIENT_H /* #define SOLR_MEM_DEBUG 1 */ #include
#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_SOLR #include #include #include
#include
#include
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern zend_module_entry solr_module_entry; #define phpext_solr_ptr &solr_module_entry /* {{{ Startup, Shutdown, Activation, Deactivation and Info functions */ PHP_MINIT_FUNCTION(solr); /* Module Startup Function */ PHP_MSHUTDOWN_FUNCTION(solr); /* Module Shutdown Function */ PHP_RINIT_FUNCTION(solr); /* Request Activation Function */ PHP_RSHUTDOWN_FUNCTION(solr); /* Request Deactivation Function */ PHP_MINFO_FUNCTION(solr); /* Module Information Display Function */ /* }}} */ #ifdef ZTS #include #endif /* List of constants */ #include "solr_constants.h" /* List of types */ #include "solr_types.h" #ifdef ZTS # define SOLR_GLOBAL(v) TSRMG(solr_globals_id, zend_solr_globals *, v) #else # define SOLR_GLOBAL(v) (solr_globals.v) #endif #include #include "php_solr_api.h" /* {{{ Variables declared elsewhere */ ZEND_EXTERN_MODULE_GLOBALS(solr) /* ZEND_EXTERN_MODULE_GLOBALS(json) */ extern zend_class_entry *solr_ce_SolrObject; extern zend_class_entry *solr_ce_SolrInputDocument; extern zend_class_entry *solr_ce_SolrDocument; extern zend_class_entry *solr_ce_SolrDocumentField; extern zend_class_entry *solr_ce_SolrClient; extern zend_class_entry *solr_ce_SolrParams; extern zend_class_entry *solr_ce_SolrModifiableParams; extern zend_class_entry *solr_ce_SolrCollapseFunction; extern zend_class_entry *solr_ce_SolrQuery; extern zend_class_entry *solr_ce_SolrResponse; extern zend_class_entry *solr_ce_SolrQueryResponse; extern zend_class_entry *solr_ce_SolrUpdateResponse; extern zend_class_entry *solr_ce_SolrPingResponse; extern zend_class_entry *solr_ce_SolrGenericResponse; extern zend_class_entry *solr_ce_SolrUtils; extern zend_class_entry *solr_ce_SolrException; extern zend_class_entry *solr_ce_SolrIllegalOperationException; extern zend_class_entry *solr_ce_SolrIllegalArgumentException; extern zend_class_entry *solr_ce_SolrClientException; extern zend_class_entry *solr_ce_SolrServerException; extern zend_class_entry *solr_ce_SolrMissingMandatoryParameterException; extern ZEND_API zend_class_entry *zend_ce_serializable; extern ZEND_API zend_class_entry *zend_ce_arrayaccess; extern ZEND_API zend_class_entry *zend_ce_iterator; /* {{{ Aliases for external class entries */ #define solr_ce_Serializable zend_ce_serializable #define solr_ce_ArrayAccess zend_ce_arrayaccess #define solr_ce_Iterator zend_ce_iterator #define solr_ce_Exception zend_exception_get_default() /* }}} */ extern zend_object_handlers solr_object_handlers; extern zend_object_handlers solr_document_field_handlers; extern zend_object_handlers solr_input_document_object_handlers; extern zend_object_handlers solr_client_object_handlers; extern zend_object_handlers solr_response_object_handlers; extern zend_object_handlers solr_collapse_function_object_handlers; /* }}} */ /******************************************************************************/ /** DECLARATIONS FOR EXTENSION METHODS AND FUNCTIONS **/ /******************************************************************************/ /* {{{ Extension functions */ PHP_FUNCTION(solr_get_version); /* }}} */ /* {{{ SolrObject methods */ PHP_METHOD(SolrObject, __construct); PHP_METHOD(SolrObject, __destruct); PHP_METHOD(SolrObject, __set); PHP_METHOD(SolrObject, __get); PHP_METHOD(SolrObject, __isset); PHP_METHOD(SolrObject, __unset); PHP_METHOD(SolrObject, offsetSet); PHP_METHOD(SolrObject, offsetGet); PHP_METHOD(SolrObject, offsetExists); PHP_METHOD(SolrObject, offsetUnset); PHP_METHOD(SolrObject, getPropertyNames); /* }}} */ /* {{{ SolException object methods */ PHP_METHOD(SolrException, getInternalInfo); PHP_METHOD(SolrClientException, getInternalInfo); PHP_METHOD(SolrIllegalOperationException, getInternalInfo); PHP_METHOD(SolrIllegalArgumentException, getInternalInfo); PHP_METHOD(SolrServerException, getInternalInfo); /* }}} */ /* {{{ SolrDocument methods declarations */ PHP_METHOD(SolrDocument, __construct); PHP_METHOD(SolrDocument, __destruct); PHP_METHOD(SolrDocument, __clone); PHP_METHOD(SolrDocument, __get); PHP_METHOD(SolrDocument, __set); PHP_METHOD(SolrDocument, __isset); PHP_METHOD(SolrDocument, __unset); /* Methods from Serializable */ PHP_METHOD(SolrDocument, serialize); PHP_METHOD(SolrDocument, unserialize); #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrDocument, __serialize); PHP_METHOD(SolrDocument, __unserialize); #endif /* Methods from ArrayAccess */ PHP_METHOD(SolrDocument, offsetExists); PHP_METHOD(SolrDocument, offsetGet); PHP_METHOD(SolrDocument, offsetSet); PHP_METHOD(SolrDocument, offsetUnset); /* Methods from Iterator */ PHP_METHOD(SolrDocument, current); PHP_METHOD(SolrDocument, key); PHP_METHOD(SolrDocument, next); PHP_METHOD(SolrDocument, rewind); PHP_METHOD(SolrDocument, valid); PHP_METHOD(SolrDocument, clear); PHP_METHOD(SolrDocument, addField); PHP_METHOD(SolrDocument, getFieldNames); PHP_METHOD(SolrDocument, getFieldCount); PHP_METHOD(SolrDocument, getField); PHP_METHOD(SolrDocument, toArray); PHP_METHOD(SolrDocument, fieldExists); PHP_METHOD(SolrDocument, deleteField); PHP_METHOD(SolrDocument, sort); PHP_METHOD(SolrDocument, merge); PHP_METHOD(SolrDocument, getInputDocument); PHP_METHOD(SolrDocument, hasChildDocuments); PHP_METHOD(SolrDocument, getChildDocuments); PHP_METHOD(SolrDocument, getChildDocumentsCount); /* }}} */ /* {{{ SolrExtractRequest methods */ PHP_METHOD(SolrExtractRequest, __construct); PHP_METHOD(SolrExtractRequest, createFromFile); PHP_METHOD(SolrExtractRequest, createFromStream); PHP_METHOD(SolrExtractRequest, __destruct); PHP_METHOD(SolrExtractRequest, __clone); PHP_METHOD(SolrExtractRequest, __sleep); PHP_METHOD(SolrExtractRequest, __wakeup); /* }}} */ /* {{{ SolrDocumentField methods */ PHP_METHOD(SolrDocumentField, __construct); PHP_METHOD(SolrDocumentField, __destruct); /* }}} */ /* {{{ SolrInputDocument methods declarations */ PHP_METHOD(SolrInputDocument, __construct); PHP_METHOD(SolrInputDocument, __destruct); PHP_METHOD(SolrInputDocument, __clone); PHP_METHOD(SolrInputDocument, __sleep); PHP_METHOD(SolrInputDocument, __wakeup); PHP_METHOD(SolrInputDocument, setBoost); PHP_METHOD(SolrInputDocument, getBoost); PHP_METHOD(SolrInputDocument, clear); PHP_METHOD(SolrInputDocument, addField); PHP_METHOD(SolrInputDocument, updateField); PHP_METHOD(SolrInputDocument, setFieldBoost); PHP_METHOD(SolrInputDocument, getFieldBoost); PHP_METHOD(SolrInputDocument, getFieldNames); PHP_METHOD(SolrInputDocument, getFieldCount); PHP_METHOD(SolrInputDocument, getField); PHP_METHOD(SolrInputDocument, toArray); PHP_METHOD(SolrInputDocument, fieldExists); PHP_METHOD(SolrInputDocument, deleteField); PHP_METHOD(SolrInputDocument, sort); PHP_METHOD(SolrInputDocument, merge); PHP_METHOD(SolrInputDocument, addChildDocument); PHP_METHOD(SolrInputDocument, getChildDocuments); PHP_METHOD(SolrInputDocument, hasChildDocuments); PHP_METHOD(SolrInputDocument, getChildDocumentsCount); PHP_METHOD(SolrInputDocument, addChildDocuments); PHP_METHOD(SolrInputDocument, setVersion); PHP_METHOD(SolrInputDocument, getVersion); /* }}} */ /* {{{ SolrClient methods declarations */ PHP_METHOD(SolrClient, __construct); PHP_METHOD(SolrClient, __destruct); PHP_METHOD(SolrClient, __sleep); PHP_METHOD(SolrClient, __wakeup); PHP_METHOD(SolrClient, __clone); PHP_METHOD(SolrClient, query); PHP_METHOD(SolrClient, getOptions); PHP_METHOD(SolrClient, getDebug); PHP_METHOD(SolrClient, addDocument); PHP_METHOD(SolrClient, addDocuments); PHP_METHOD(SolrClient, setServlet); PHP_METHOD(SolrClient, setResponseWriter); PHP_METHOD(SolrClient, request); PHP_METHOD(SolrClient, sendUpdateStream); PHP_METHOD(SolrClient, ping); PHP_METHOD(SolrClient, system); PHP_METHOD(SolrClient, threads); PHP_METHOD(SolrClient, deleteById); PHP_METHOD(SolrClient, deleteByIds); PHP_METHOD(SolrClient, deleteByQuery); PHP_METHOD(SolrClient, deleteByQueries); PHP_METHOD(SolrClient, getById); PHP_METHOD(SolrClient, getByIds); PHP_METHOD(SolrClient, optimize); PHP_METHOD(SolrClient, commit); PHP_METHOD(SolrClient, rollback); /* }}} */ /* {{{ SolrParams methods declarations */ PHP_METHOD(SolrParams, setParam); /* Parameter can only accept one value */ PHP_METHOD(SolrParams, addParam); /* Parameter can accept more than one value */ PHP_METHOD(SolrParams, getParams); /* Retrieves the parameters and their values */ PHP_METHOD(SolrParams, getParam); /* Retrieves a parameter value */ PHP_METHOD(SolrParams, __toString); /* Returns a string representation of the object */ PHP_METHOD(SolrParams, toString); /* Returns a string representation of the object */ PHP_METHOD(SolrParams, getPreparedParams); /* Returns the prepared parameters */ PHP_METHOD(SolrParams, serialize); /* used by serialize() */ PHP_METHOD(SolrParams, unserialize); /* used by unserialize() */ #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrParams, __serialize); /* used by serialize() */ PHP_METHOD(SolrParams, __unserialize); /* used by serialize() */ #endif PHP_METHOD(SolrParams, __clone); /* Used to enforce the cloning of SolrParams is currently unsupported */ /* }}} */ /* {{{ SolrModifiableParams methods declarations */ PHP_METHOD(SolrModifiableParams, __construct); PHP_METHOD(SolrModifiableParams, __destruct); /* }}} */ /* {{{ SolrQuery methods declarations */ /* Constructor and Destructor */ PHP_METHOD(SolrQuery, __construct); PHP_METHOD(SolrQuery, __destruct); /* CommonQueryParameters */ PHP_METHOD(SolrQuery, setQuery); PHP_METHOD(SolrQuery, getQuery); PHP_METHOD(SolrQuery, setStart); PHP_METHOD(SolrQuery, getStart); PHP_METHOD(SolrQuery, setRows); PHP_METHOD(SolrQuery, getRows); PHP_METHOD(SolrQuery, addField); PHP_METHOD(SolrQuery, removeField); PHP_METHOD(SolrQuery, getFields); PHP_METHOD(SolrQuery, addSortField); PHP_METHOD(SolrQuery, removeSortField); PHP_METHOD(SolrQuery, getSortFields); PHP_METHOD(SolrQuery, addFilterQuery); PHP_METHOD(SolrQuery, removeFilterQuery); PHP_METHOD(SolrQuery, getFilterQueries); PHP_METHOD(SolrQuery, setShowDebugInfo); PHP_METHOD(SolrQuery, setExplainOther); PHP_METHOD(SolrQuery, setTimeAllowed); PHP_METHOD(SolrQuery, getTimeAllowed); PHP_METHOD(SolrQuery, setOmitHeader); /* CoreQueryParameters */ PHP_METHOD(SolrQuery, setEchoHandler); PHP_METHOD(SolrQuery, setEchoParams); /* SimpleFacetParameters */ PHP_METHOD(SolrQuery, setFacet); PHP_METHOD(SolrQuery, getFacet); PHP_METHOD(SolrQuery, addFacetField); PHP_METHOD(SolrQuery, removeFacetField); PHP_METHOD(SolrQuery, getFacetFields); PHP_METHOD(SolrQuery, addFacetQuery); PHP_METHOD(SolrQuery, removeFacetQuery); PHP_METHOD(SolrQuery, getFacetQueries); PHP_METHOD(SolrQuery, setFacetPrefix); PHP_METHOD(SolrQuery, getFacetPrefix); PHP_METHOD(SolrQuery, setFacetSort); PHP_METHOD(SolrQuery, getFacetSort); PHP_METHOD(SolrQuery, setFacetLimit); PHP_METHOD(SolrQuery, getFacetLimit); PHP_METHOD(SolrQuery, setFacetOffset); PHP_METHOD(SolrQuery, getFacetOffset); PHP_METHOD(SolrQuery, setFacetMinCount); PHP_METHOD(SolrQuery, getFacetMinCount); PHP_METHOD(SolrQuery, setFacetMissing); PHP_METHOD(SolrQuery, getFacetMissing); PHP_METHOD(SolrQuery, setFacetMethod); PHP_METHOD(SolrQuery, getFacetMethod); PHP_METHOD(SolrQuery, setFacetEnumCacheMinDefaultFrequency); /* Date facet parameters */ PHP_METHOD(SolrQuery, addFacetDateField); PHP_METHOD(SolrQuery, removeFacetDateField); PHP_METHOD(SolrQuery, getFacetDateFields); PHP_METHOD(SolrQuery, setFacetDateStart); PHP_METHOD(SolrQuery, getFacetDateStart); PHP_METHOD(SolrQuery, setFacetDateEnd); PHP_METHOD(SolrQuery, getFacetDateEnd); PHP_METHOD(SolrQuery, setFacetDateGap); PHP_METHOD(SolrQuery, getFacetDateGap); PHP_METHOD(SolrQuery, setFacetDateHardEnd); PHP_METHOD(SolrQuery, getFacetDateHardEnd); PHP_METHOD(SolrQuery, addFacetDateOther); PHP_METHOD(SolrQuery, removeFacetDateOther); PHP_METHOD(SolrQuery, getFacetDateOther); /* GroupParameters */ PHP_METHOD(SolrQuery, setGroup); PHP_METHOD(SolrQuery, getGroup); PHP_METHOD(SolrQuery, addGroupField); PHP_METHOD(SolrQuery, getGroupFields); PHP_METHOD(SolrQuery, addGroupFunction); PHP_METHOD(SolrQuery, getGroupFunctions); PHP_METHOD(SolrQuery, addGroupQuery); PHP_METHOD(SolrQuery, getGroupQueries); PHP_METHOD(SolrQuery, setGroupLimit); PHP_METHOD(SolrQuery, getGroupLimit); PHP_METHOD(SolrQuery, setGroupOffset); PHP_METHOD(SolrQuery, getGroupOffset); PHP_METHOD(SolrQuery, addGroupSortField); PHP_METHOD(SolrQuery, getGroupSortFields); PHP_METHOD(SolrQuery, setGroupFormat); PHP_METHOD(SolrQuery, getGroupFormat); PHP_METHOD(SolrQuery, setGroupMain); PHP_METHOD(SolrQuery, getGroupMain); PHP_METHOD(SolrQuery, setGroupNGroups); PHP_METHOD(SolrQuery, getGroupNGroups); PHP_METHOD(SolrQuery, setGroupTruncate); PHP_METHOD(SolrQuery, getGroupTruncate); PHP_METHOD(SolrQuery, setGroupFacet); PHP_METHOD(SolrQuery, getGroupFacet); PHP_METHOD(SolrQuery, setGroupCachePercent); PHP_METHOD(SolrQuery, getGroupCachePercent); /* Collapse */ PHP_METHOD(SolrQuery, collapse); /* Expand Parameters */ PHP_METHOD(SolrQuery, setExpand); PHP_METHOD(SolrQuery, getExpand); PHP_METHOD(SolrQuery, addExpandSortField); PHP_METHOD(SolrQuery, removeExpandSortField); PHP_METHOD(SolrQuery, getExpandSortFields); PHP_METHOD(SolrQuery, setExpandRows); PHP_METHOD(SolrQuery, getExpandRows); PHP_METHOD(SolrQuery, setExpandQuery); PHP_METHOD(SolrQuery, getExpandQuery); PHP_METHOD(SolrQuery, addExpandFilterQuery); PHP_METHOD(SolrQuery, removeExpandFilterQuery); PHP_METHOD(SolrQuery, getExpandFilterQueries); /* HighlightingParameters */ PHP_METHOD(SolrQuery, setHighlight); PHP_METHOD(SolrQuery, getHighlight); PHP_METHOD(SolrQuery, setHighlightQuery); PHP_METHOD(SolrQuery, getHighlightQuery); PHP_METHOD(SolrQuery, addHighlightField); PHP_METHOD(SolrQuery, removeHighlightField); PHP_METHOD(SolrQuery, getHighlightFields); PHP_METHOD(SolrQuery, setHighlightSnippets); PHP_METHOD(SolrQuery, getHighlightSnippets); PHP_METHOD(SolrQuery, setHighlightFragsize); PHP_METHOD(SolrQuery, getHighlightFragsize); PHP_METHOD(SolrQuery, setHighlightMergeContiguous); PHP_METHOD(SolrQuery, getHighlightMergeContiguous); PHP_METHOD(SolrQuery, setHighlightRequireFieldMatch); PHP_METHOD(SolrQuery, getHighlightRequireFieldMatch); PHP_METHOD(SolrQuery, setHighlightMaxAnalyzedChars); PHP_METHOD(SolrQuery, getHighlightMaxAnalyzedChars); PHP_METHOD(SolrQuery, setHighlightAlternateField); PHP_METHOD(SolrQuery, getHighlightAlternateField); PHP_METHOD(SolrQuery, setHighlightMaxAlternateFieldLength); PHP_METHOD(SolrQuery, getHighlightMaxAlternateFieldLength); PHP_METHOD(SolrQuery, setHighlightFormatter); PHP_METHOD(SolrQuery, getHighlightFormatter); PHP_METHOD(SolrQuery, setHighlightSimplePre); PHP_METHOD(SolrQuery, getHighlightSimplePre); PHP_METHOD(SolrQuery, setHighlightSimplePost); PHP_METHOD(SolrQuery, getHighlightSimplePost); PHP_METHOD(SolrQuery, setHighlightFragmenter); PHP_METHOD(SolrQuery, getHighlightFragmenter); PHP_METHOD(SolrQuery, setHighlightUsePhraseHighlighter); PHP_METHOD(SolrQuery, getHighlightUsePhraseHighlighter); PHP_METHOD(SolrQuery, setHighlightHighlightMultiTerm); PHP_METHOD(SolrQuery, getHighlightHighlightMultiTerm); PHP_METHOD(SolrQuery, setHighlightRegexSlop); PHP_METHOD(SolrQuery, getHighlightRegexSlop); PHP_METHOD(SolrQuery, setHighlightRegexPattern); PHP_METHOD(SolrQuery, getHighlightRegexPattern); PHP_METHOD(SolrQuery, setHighlightRegexMaxAnalyzedChars); PHP_METHOD(SolrQuery, getHighlightRegexMaxAnalyzedChars); /* StatsComponent */ PHP_METHOD(SolrQuery, setStats); PHP_METHOD(SolrQuery, getStats); PHP_METHOD(SolrQuery, addStatsField); PHP_METHOD(SolrQuery, removeStatsField); PHP_METHOD(SolrQuery, getStatsFields); PHP_METHOD(SolrQuery, addStatsFacet); PHP_METHOD(SolrQuery, removeStatsFacet); PHP_METHOD(SolrQuery, getStatsFacets); /* MoreLikeThis */ PHP_METHOD(SolrQuery, setMlt); PHP_METHOD(SolrQuery, getMlt); PHP_METHOD(SolrQuery, setMltCount); PHP_METHOD(SolrQuery, getMltCount); PHP_METHOD(SolrQuery, addMltField); PHP_METHOD(SolrQuery, removeMltField); PHP_METHOD(SolrQuery, getMltFields); PHP_METHOD(SolrQuery, addMltQueryField); PHP_METHOD(SolrQuery, removeMltQueryField); PHP_METHOD(SolrQuery, getMltQueryFields); PHP_METHOD(SolrQuery, setMltMinTermFrequency); PHP_METHOD(SolrQuery, getMltMinTermFrequency); PHP_METHOD(SolrQuery, setMltMinDocFrequency); PHP_METHOD(SolrQuery, getMltMinDocFrequency); PHP_METHOD(SolrQuery, setMltMinWordLength); PHP_METHOD(SolrQuery, getMltMinWordLength); PHP_METHOD(SolrQuery, setMltMaxWordLength); PHP_METHOD(SolrQuery, getMltMaxWordLength); PHP_METHOD(SolrQuery, setMltMaxNumTokens); PHP_METHOD(SolrQuery, getMltMaxNumTokens); PHP_METHOD(SolrQuery, setMltMaxNumQueryTerms); PHP_METHOD(SolrQuery, getMltMaxNumQueryTerms); PHP_METHOD(SolrQuery, setMltBoost); PHP_METHOD(SolrQuery, getMltBoost); /* TermsComponent */ PHP_METHOD(SolrQuery, setTerms); PHP_METHOD(SolrQuery, getTerms); PHP_METHOD(SolrQuery, setTermsField); PHP_METHOD(SolrQuery, getTermsField); PHP_METHOD(SolrQuery, setTermsLowerBound); PHP_METHOD(SolrQuery, getTermsLowerBound); PHP_METHOD(SolrQuery, setTermsUpperBound); PHP_METHOD(SolrQuery, getTermsUpperBound); PHP_METHOD(SolrQuery, setTermsIncludeLowerBound); PHP_METHOD(SolrQuery, getTermsIncludeLowerBound); PHP_METHOD(SolrQuery, setTermsIncludeUpperBound); PHP_METHOD(SolrQuery, getTermsIncludeUpperBound); PHP_METHOD(SolrQuery, setTermsMinCount); PHP_METHOD(SolrQuery, getTermsMinCount); PHP_METHOD(SolrQuery, setTermsMaxCount); PHP_METHOD(SolrQuery, getTermsMaxCount); PHP_METHOD(SolrQuery, setTermsPrefix); PHP_METHOD(SolrQuery, getTermsPrefix); PHP_METHOD(SolrQuery, setTermsLimit); PHP_METHOD(SolrQuery, getTermsLimit); PHP_METHOD(SolrQuery, setTermsReturnRaw); PHP_METHOD(SolrQuery, getTermsReturnRaw); PHP_METHOD(SolrQuery, setTermsSort); PHP_METHOD(SolrQuery, getTermsSort); /* TODO : TermVectorComponent */ /* {{{ TermVectorComponent methods not yet defined */ PHP_METHOD(SolrQuery, setTermVector); PHP_METHOD(SolrQuery, setTermVectorTermFrequency); PHP_METHOD(SolrQuery, setTermVectorDocFrequency); PHP_METHOD(SolrQuery, setTermVectorPositions); PHP_METHOD(SolrQuery, setTermVectorOffsets); PHP_METHOD(SolrQuery, setTermVectorTfIdfProduct); PHP_METHOD(SolrQuery, setTermVectorAll); PHP_METHOD(SolrQuery, addTermVectorField); PHP_METHOD(SolrQuery, addTermVectorLuceneDocId); /* }}} */ /* }}} */ /* {{{ SolrResponse methods declarations */ PHP_METHOD(SolrResponse, getHttpStatus); PHP_METHOD(SolrResponse, getHttpStatusMessage); PHP_METHOD(SolrResponse, success); PHP_METHOD(SolrResponse, getRequestUrl); PHP_METHOD(SolrResponse, getRawRequestHeaders); PHP_METHOD(SolrResponse, getRawRequest); PHP_METHOD(SolrResponse, getRawResponseHeaders); PHP_METHOD(SolrResponse, getRawResponse); PHP_METHOD(SolrResponse, getDigestedResponse); PHP_METHOD(SolrResponse, setParseMode); PHP_METHOD(SolrResponse, getArrayResponse); PHP_METHOD(SolrResponse, getResponse); /* }}} */ /* {{{ SolrQueryResponse methods */ PHP_METHOD(SolrQueryResponse, __construct); PHP_METHOD(SolrQueryResponse, __destruct); /* }}} */ /* {{{ SolrUpdateResponse methods */ PHP_METHOD(SolrUpdateResponse, __construct); PHP_METHOD(SolrUpdateResponse, __destruct); /* }}} */ /* {{{ SolrPingResponse methods declarations */ PHP_METHOD(SolrPingResponse, __construct); PHP_METHOD(SolrPingResponse, __destruct); PHP_METHOD(SolrPingResponse, getResponse); /* }}} */ /* {{{ SolrGenericResponse methods */ PHP_METHOD(SolrGenericResponse, __construct); PHP_METHOD(SolrGenericResponse, __destruct); /* }}} */ /* {{{ SolrCollapseFunction methods */ PHP_METHOD(SolrCollapseFunction, __construct); PHP_METHOD(SolrCollapseFunction, __destruct); PHP_METHOD(SolrCollapseFunction, setField); PHP_METHOD(SolrCollapseFunction, getField); PHP_METHOD(SolrCollapseFunction, setMin); PHP_METHOD(SolrCollapseFunction, getMin); PHP_METHOD(SolrCollapseFunction, setMax); PHP_METHOD(SolrCollapseFunction, getMax); PHP_METHOD(SolrCollapseFunction, setNullPolicy); PHP_METHOD(SolrCollapseFunction, getNullPolicy); PHP_METHOD(SolrCollapseFunction, setHint); PHP_METHOD(SolrCollapseFunction, getHint); PHP_METHOD(SolrCollapseFunction, setSize); PHP_METHOD(SolrCollapseFunction, getSize); PHP_METHOD(SolrCollapseFunction, __toString); PHP_METHOD(SolrCollapseFunction, __sleep); PHP_METHOD(SolrCollapseFunction, __wakeup); /* }}} */ /* {{{ SolrUtils methods declarations */ PHP_METHOD(SolrUtils, escapeQueryChars); PHP_METHOD(SolrUtils, queryPhrase); PHP_METHOD(SolrUtils, digestXmlResponse); PHP_METHOD(SolrUtils, digestJsonResponse); PHP_METHOD(SolrUtils, getSolrVersion); PHP_METHOD(SolrUtils, getSolrStats); /* }}} */ /******************************************************************************/ /** DECLARATIONS FOR HELPERS AND EXTENSION-SPECIFIC FUNCTIONS **/ /******************************************************************************/ /* {{{ HTTP request function declarations */ size_t solr_curl_write(solr_char_t *data, size_t size, size_t nmemb, void *ctx); size_t solr_curl_write_header(solr_char_t *data, size_t size, size_t nmemb, void *ctx); int solr_curl_debug_callback(CURL *curl_handle, curl_infotype infotype, solr_char_t *debug_data, size_t size, void *ctx); PHP_SOLR_API int solr_init_options(solr_client_options_t *options); PHP_SOLR_API int solr_init_handle(solr_curl_t *sch, solr_client_options_t *options); PHP_SOLR_API int solr_make_request(solr_client_t *client, solr_request_type_t request_type); PHP_SOLR_API int solr_make_update_stream_request(solr_client_t *client, solr_ustream_t* stream_data, solr_string_t *request_params); PHP_SOLR_API void solr_free_handle(solr_curl_t *sch); PHP_SOLR_API void solr_free_option(solr_client_options_t *options); /* }}} */ PHP_SOLR_API void solr_extension_register_constants(int type, int module_number); PHP_SOLR_API void solr_document_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_extract_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_client_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_query_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_collapse_function_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_response_register_class_properties(zend_class_entry *ce); PHP_SOLR_API void solr_response_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_exception_register_class_properties(zend_class_entry *ce); PHP_SOLR_API void solr_input_document_register_class_constants(zend_class_entry *ce); PHP_SOLR_API void solr_set_response_object_properties(zend_class_entry *scope, zval *response_object, const solr_client_t *client, const solr_string_t *request_url, zend_bool success); PHP_SOLR_API void solr_throw_exception_ex(zend_class_entry *exception_ce, long code, const char *filename, int file_line, const char *function_name, char *format, ...); PHP_SOLR_API void solr_throw_exception(zend_class_entry *exception_ce, char *message, long code, const char *filename, int file_line, const char *function_name); PHP_SOLR_API void solr_throw_solr_server_exception(solr_client_t *client,const char *requestType); /* {{{ init functions called in constructors - allocate/initialize params_t */ PHP_SOLR_API int solr_params_obj_ctor(zval *obj); PHP_SOLR_API void solr_params_obj_dtor(zval *obj); PHP_SOLR_API int solr_init_params(solr_params_t *solr_params, long int index); zend_object *solr_extract_create_object_handler(zend_class_entry *ce); /* }}} */ PHP_SOLR_API int solr_init_ustream(zval *obj); PHP_SOLR_API void solr_destroy_ustream_ex(solr_ustream_t *stream); PHP_SOLR_API void solr_destroy_ustream_zv(zval *obj); PHP_SOLR_API int solr_fetch_ustream_entry(zval *objptr, solr_ustream_t **stream_entry); #ifdef PHP_7 #define solr_destroy_ustream solr_destroy_ustream_zv #else #define solr_destroy_ustream solr_destroy_ustream_ex #endif /* {{{ solr_document_t based objects methods*/ PHP_SOLR_API solr_document_t *solr_init_document(long int document_index); PHP_SOLR_API solr_document_t *solr_input_doc_ctor(zval *objptr); #if PHP_VERSION_ID < 80000 PHP_SOLR_API zend_object *solr_document_object_handler_clone(zval *zobject); #else PHP_SOLR_API zend_object *solr_document_object_handler_clone(zend_object *zobject); #endif /* }}} */ /* {{{ zend_hash_free functions */ PHP_SOLR_API void solr_destroy_field_list_ht_dtor(zval *zv_field_entry); PHP_SOLR_API void solr_destroy_field_list(solr_field_list_t *field_entry); PHP_SOLR_API void solr_destroy_client(zval *client); PHP_SOLR_API void solr_destroy_document_zv(zval *document); PHP_SOLR_API void solr_destroy_document_ex(solr_document_t *document); #ifdef PHP_7 #define solr_destroy_document solr_destroy_document_zv #else #define solr_destroy_document solr_destroy_document_ex #endif PHP_SOLR_API void solr_destroy_params(zval *solr_params); PHP_SOLR_API void solr_destroy_function(zval *solr_function); PHP_SOLR_API void solr_destory_param_ht_dtor(zval *param_zv); PHP_SOLR_API void solr_destroy_param(solr_param_t **param); /* dead */ PHP_SOLR_API void solr_destroy_param_value(solr_param_t *param, solr_param_value_t *param_value); /* }}} */ #ifdef PHP_7 #define field_copy_constructor field_copy_constructor_zv #else #define field_copy_constructor field_copy_constructor_ex #endif /* {{{ used for SolrDocument field manipulations */ PHP_SOLR_API int solr_document_insert_field_value_ex(solr_field_list_t *queue, const solr_char_t *field_value, double field_boost, int modifier); PHP_SOLR_API void field_copy_constructor_ex(solr_field_list_t **original_field_queue); PHP_SOLR_API void field_copy_constructor_zv(zval *field_queue_zv); /* }}} */ /* {{{ Used for comparison of document fields */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_compare_field_name (const void *a, const void *b); PHP_SOLR_API int solr_rcompare_field_name(const void *a, const void *b); PHP_SOLR_API int solr_compare_field_value_count (const void *a, const void *b); PHP_SOLR_API int solr_rcompare_field_value_count(const void *a, const void *b); PHP_SOLR_API int solr_compare_field_boost_value (const void *a, const void *b); PHP_SOLR_API int solr_rcompare_field_boost_value(const void *a, const void *b); #else PHP_SOLR_API int solr_compare_field_name (Bucket *a, Bucket *b); PHP_SOLR_API int solr_rcompare_field_name(Bucket *a, Bucket *b); PHP_SOLR_API int solr_compare_field_value_count (Bucket *a, Bucket *b); PHP_SOLR_API int solr_rcompare_field_value_count(Bucket *a, Bucket *b); PHP_SOLR_API int solr_compare_field_boost_value (Bucket *a, Bucket *b); PHP_SOLR_API int solr_rcompare_field_boost_value(Bucket *a, Bucket *b); #endif /* }}} */ /* {{{ Functions for SolrParams Parameters */ PHP_SOLR_API solr_param_t *solr_create_new_param(const solr_char_t *param_name, size_t param_name_len, solr_param_type_t param_type, solr_bool allow_multiple, solr_param_value_equal_func_t value_equal_func, solr_param_fetch_func_t param_fetch_func, solr_param_value_free_func_t value_free_func, solr_char_t delimiter, solr_char_t arg_separator); PHP_SOLR_API int solr_params_insert_param_value(solr_param_t *param, solr_param_value_t *param_value); PHP_SOLR_API int solr_params_delete_param_value(solr_param_t *param, const solr_param_value_t *target_value); PHP_SOLR_API int solr_delete_solr_parameter(zval *objptr, solr_char_t *name, size_t name_length); PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, zend_bool allow_multiple); PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length); PHP_SOLR_API int solr_add_simple_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *separator); PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator); PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator, solr_char_t delimiter_override); PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t *delimiter_override, solr_bool delimiter_overriden); #define solr_set_normal_param(objptr, pname, pname_length, pvalue, pvalue_length) solr_add_or_set_normal_param((objptr), (pname), (pname_length), (pvalue), (pvalue_length), 0) #define solr_add_normal_param(objptr, pname, pname_length, pvalue, pvalue_length) solr_add_or_set_normal_param((objptr), (pname), (pname_length), (pvalue), (pvalue_length), 1) PHP_SOLR_API int solr_normal_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b); PHP_SOLR_API int solr_simple_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b); PHP_SOLR_API int solr_arg_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b); PHP_SOLR_API void solr_normal_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer); PHP_SOLR_API void solr_simple_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer); PHP_SOLR_API void solr_arg_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer); PHP_SOLR_API void solr_normal_param_value_display(solr_param_t *solr_param, zval *param_value_array); PHP_SOLR_API void solr_simple_list_param_value_display(solr_param_t *solr_param, zval *param_value_array); PHP_SOLR_API void solr_arg_list_param_value_display(solr_param_t *solr_param, zval *param_value_array); /* Used to display values where allow_multiple is false */ PHP_SOLR_API void solr_normal_param_value_display_string(solr_param_t *solr_param, zval *param_value); PHP_SOLR_API void solr_normal_param_value_display_integer(solr_param_t *solr_param, zval *param_value); PHP_SOLR_API void solr_normal_param_value_display_double(solr_param_t *solr_param, zval *param_value); PHP_SOLR_API void solr_normal_param_value_display_boolean(solr_param_t *solr_param, zval *param_value); PHP_SOLR_API void solr_normal_param_value_display_sort_type(solr_param_t *solr_param, zval *param_value); PHP_SOLR_API int solr_param_find(zval *objptr, solr_char_t *pname, size_t pname_length, solr_param_t **solr_param); PHP_SOLR_API solr_string_t solr_params_to_string(solr_params_t * solr_params, zend_bool url_encode); PHP_SOLR_API void solr_normal_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode); PHP_SOLR_API void solr_simple_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode); PHP_SOLR_API void solr_arg_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode); PHP_SOLR_API void solr_normal_param_value_free(solr_param_value_t *param_value); PHP_SOLR_API void solr_simple_list_param_value_free(solr_param_value_t *param_value); PHP_SOLR_API void solr_arg_list_param_value_free(solr_param_value_t *param_value); /* Used for removing parameter values from the list of values for that param */ PHP_SOLR_API int solr_delete_normal_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length); PHP_SOLR_API int solr_delete_simple_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length); PHP_SOLR_API int solr_delete_arg_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length); /* }}} */ /* {{{ Debugging functions */ /* Debug function used to print field values in the field queue */ PHP_SOLR_API void solr_debug_print_fields(const solr_field_list_t *queue); /* Used when debugging is enabled to run in verbose mode */ PHP_SOLR_API void solr_debug_printf(const char *format, ...); /* }}} */ /* {{{ Document utility functions */ PHP_SOLR_API void solr_generate_document_xml_from_fields(xmlNode *solr_doc_node, HashTable *document_fields); PHP_SOLR_API void solr_create_document_field_object(solr_field_list_t *field_values, zval **field_obj); PHP_SOLR_API void solr_add_doc_node(xmlNode *root_node, solr_document_t *doc_entry); PHP_SOLR_API xmlDocPtr solr_xml_create_xml_doc(const xmlChar *root_node_name, xmlNode **root_node_ptr); /* }}} */ /* {{{ identical functions used on both SolrDocument and SolrInputDocument */ PHP_SOLR_API void solr_document_get_field_names(INTERNAL_FUNCTION_PARAMETERS); /* }}} */ /* {{{ Utility functions */ PHP_SOLR_API long solr_get_json_last_error(void); PHP_SOLR_API solr_char_t *solr_get_json_error_msg(solr_json_error_codes_t error_code); PHP_SOLR_API int solr_json_to_php_native(solr_string_t *buffer, const solr_char_t *json_string, size_t json_string_length); PHP_SOLR_API int solr_is_supported_response_writer(const solr_char_t * response_writer, size_t length); PHP_SOLR_API int solr_hashtable_get_new_index(HashTable *ht); #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_fetch_document_entry(zval *objptr, solr_document_t **doc_entry); #else PHP_SOLR_API int solr_fetch_document_entry(zend_object *objptr, solr_document_t **doc_entry); #endif PHP_SOLR_API int solr_fetch_client_entry(zval *objptr, solr_client_t **solr_client); PHP_SOLR_API int solr_fetch_params_entry(zval *objptr, solr_params_t **solr_params); PHP_SOLR_API int solr_fetch_function_entry(zval *objptr, solr_function_t **solr_params); PHP_SOLR_API void solr_encode_generic_xml_response(solr_string_t *buffer, const solr_char_t *serialized, size_t size, long int parse_mode); PHP_SOLR_API void solr_set_return_solr_params_object(zval *return_value_ptr, zval *current_objptr); PHP_SOLR_API void solr_escape_query_chars(solr_string_t *sbuilder, solr_char_t *unescaped, size_t unescaped_length); /* serialized array to serialized SolrObject */ PHP_SOLR_API int solr_sarray_to_sobject(solr_string_t *buffer); PHP_SOLR_API int solr_sobject_to_sarray(solr_string_t *buffer); PHP_SOLR_API void solr_response_get_response_impl(INTERNAL_FUNCTION_PARAMETERS, int return_array); /* }}} */ /* {{{ SolrFunction Helpers (solrfunc to avoid confusion with solr_function) */ PHP_SOLR_API int solr_solrfunc_update_string(zval *obj, solr_char_t *key, size_t key_len, solr_char_t *value, size_t value_len); PHP_SOLR_API int solr_solrfunc_fetch_string(zval *obj, solr_char_t *key, size_t key_len, solr_string_t **string); PHP_SOLR_API int solr_solrfunc_return_string(zval *obj, solr_char_t *key, size_t key_len, zval **return_value); PHP_SOLR_API void solr_solrfunc_to_string(solr_function_t *function, solr_string_t **dest); PHP_SOLR_API int solr_solrfunc_display_string(zval *obj, solr_char_t *key, size_t key_len, zval **return_value); #if PHP_VERSION_ID < 80000 zend_object *solr_collapse_function_object_handler_clone(zval *object); #else zend_object *solr_collapse_function_object_handler_clone(zend_object *object); #endif /* }}} */ /* {{{ Solr Server Exception Handling */ PHP_SOLR_API int solr_get_xml_error(solr_string_t buffer, solr_exception_t *exceptionData); PHP_SOLR_API int solr_get_json_error(solr_string_t buffer, solr_exception_t *exceptionData); PHP_SOLR_API int solr_get_phpnative_error(solr_string_t buffer, solr_exception_t *exceptionData); PHP_SOLR_API int hydrate_error_zval(zval *response, solr_exception_t *exceptionData); /* }}} */ /* {{{ Solr Object Handlers */ #if PHP_VERSION_ID < 80000 #define OBJ_FOR_PROP(zv) (zv) #if PHP_VERSION_ID < 70400 PHP_SOLR_API void solr_object_write_property(zval *object, zval *member, zval *value, void **cache_slot); PHP_SOLR_API void solr_document_field_write_property(zval *object, zval *member, zval *value, void **cache_slot); #else PHP_SOLR_API zval *solr_object_write_property(zval *object, zval *member, zval *value, void **cache_slot); PHP_SOLR_API zval *solr_document_field_write_property(zval *object, zval *member, zval *value, void **cache_slot); #endif PHP_SOLR_API zval *solr_object_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); PHP_SOLR_API void solr_object_unset_property(zval *object, zval *member, void **cache_slot); PHP_SOLR_API void solr_object_write_dimension(zval *object, zval *offset, zval *value); PHP_SOLR_API void solr_object_unset_dimension(zval *object, zval *offset); PHP_SOLR_API void solr_document_field_unset_property(zval *object, zval *member, void **cache_slot); #else #define OBJ_FOR_PROP(zv) Z_OBJ_P(zv) PHP_SOLR_API zval *solr_document_field_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot); PHP_SOLR_API zval *solr_object_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot); PHP_SOLR_API zval *solr_object_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv); PHP_SOLR_API void solr_object_unset_property(zend_object *object, zend_string *member, void **cache_slot); PHP_SOLR_API void solr_object_write_dimension(zend_object *object, zval *offset, zval *value); PHP_SOLR_API void solr_object_unset_dimension(zend_object *object, zval *offset); PHP_SOLR_API void solr_document_field_unset_property(zend_object *object, zend_string *member, void **cache_slot); #endif /* }}} */ int add_phrase_field(zval *obj, solr_char_t *pname, zval *boost, zval *slop, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_len); #define ZVAL_LONG_ASSIGN_TO_LONG(long_var,zval_in) \ do { \ zend_long zl_input = Z_LVAL_P(zval_in); \ if (zl_input >= LONG_MIN && zl_input <= LONG_MAX) { \ long_var = (long int) zl_input; \ } else { \ solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, "Internal Error: zend long conversion failed."); \ } \ } while(0) #include "solr_macros.h" #include "php_solr_dismax_query.h" #endif /* HAVE_SOLR */ #endif /* SOLRCLIENT_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_api.h0000644000175000017500000000332615001737315015052 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Israel Ekpo | +----------------------------------------------------------------------+ */ /** * Declaring Macro for function attributes * * This is for functions on GNU systems and Win32 systems * * On Win32 systems __declspec(dllexport) adds the export directive to the * object file so you do not need to use a .def file * * Using __declspec(dllexport) in addition to using a .def file should * not cause build errors. */ #ifndef PHP_SOLR_API_H #define PHP_SOLR_API_H #ifdef PHP_WIN32 #define PHP_SOLR_API __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 #define PHP_SOLR_API __attribute__ ((visibility("default"))) #else #define PHP_SOLR_API #endif #endif /* PHP_SOLR_API_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_version.h0000644000175000017500000000463115001737315015766 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_version.h" #ifndef PHP_SOLR_VERSION_H #define PHP_SOLR_VERSION_H #define PHP_SOLR_MAJOR_VERSION 2 #define PHP_SOLR_MINOR_VERSION 8 #define PHP_SOLR_PATCH_VERSION 1 #define PHP_SOLR_RELEASE_VERSION PHP_SOLR_PATCH_VERSION #define PHP_SOLR_VERSION "2.8.1" #define PHP_SOLR_DOTTED_VERSION PHP_SOLR_VERSION /** * Extension version numbers using hexadecimal numbers * * This is the numeric version of the extension, meant for easier * parsing and comparisons by programs. The PHP_SOLR_VERSION_ID define will * always follow this syntax: * * 0xXXYYZZ * * Where XX, YY and ZZ are the main version, minor version and patch numbers in * hexadecimal (using 8 bits each). All three numbers are always represented * using two digits. 1.2 would appear as "0x010200" while version 9.11.7 * appears as "0x090b07". * * This 6-digit (24 bits) hexadecimal number does not show pre-release number, * and it is always a greater number in a more recent release. It makes * comparisons with greater than and less than work. */ #define PHP_SOLR_VERSION_ID 0x020801 #define SOLR_CLIENT_USER_AGENT "PHP Solr Client 2.8.1" #endif /* PHP_SOLR_VERSION_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_constants.h0000644000175000017500000002001515001737315015440 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #ifndef SOLR_CONSTANTS_H #define SOLR_CONSTANTS_H #include "php_solr_version.h" #define SOLR_SPACE_STRING " " /* {{{ Constants for the SolrClient with*/ #define SOLR_DEFAULT_UPDATE_SERVLET "update" #define SOLR_DEFAULT_EXTRACT_SERVLET "update/extract" #define SOLR_DEFAULT_SEARCH_SERVLET "select" #define SOLR_DEFAULT_THREADS_SERVLET "admin/threads" #define SOLR_DEFAULT_PING_SERVLET "admin/ping" #define SOLR_DEFAULT_TERMS_SERVLET "terms" #define SOLR_DEFAULT_SYSTEM_SERVLET "admin/system" #define SOLR_DEFAULT_GET_SERVLET "get" #define SOLR_PHP_SERIALIZED_RESPONSE_WRITER "phps" #define SOLR_PHP_NATIVE_RESPONSE_WRITER "phpnative" #define SOLR_XML_RESPONSE_WRITER "xml" #define SOLR_JSON_RESPONSE_WRITER "json" #define SOLR_REQUEST_DEFAULT_HOST "localhost" #define SOLR_REQUEST_DEFAULT_PATH "solr" #define SOLR_REQUEST_DEFAULT_QS_DELIMITER "&" #define SOLR_REQUEST_DEFAULT_PORT 8983L #define SOLR_CURL_MAX_WRITE_SIZE CURL_MAX_WRITE_SIZE #define SOLR_CURL_OPTIONS_LENGTH 512 /* }}} */ /* {{{ Names of Objects */ #define PHP_SOLR_OBJECT_CLASSNAME "SolrObject" #define PHP_SOLR_DOCUMENT_CLASSNAME "SolrDocument" #define PHP_SOLR_DOCUMENT_FIELD_CLASSNAME "SolrDocumentField" #define PHP_SOLR_INPUT_DOCUMENT_CLASSNAME "SolrInputDocument" #define PHP_SOLR_EXTRACTREQUEST_CLASSNAME "SolrExtractRequest" #define PHP_SOLR_CLIENT_CLASSNAME "SolrClient" #define PHP_SOLR_PARAMS_CLASSNAME "SolrParams" #define PHP_SOLR_QUERY_CLASSNAME "SolrQuery" #define PHP_SOLR_COLLAPSE_FUNCTION_CLASSNAME "SolrCollapseFunction" #define PHP_SOLR_MODIFIABLE_PARAMS_CLASSNAME "SolrModifiableParams" #define PHP_SOLR_RESPONSE_CLASSNAME "SolrResponse" #define PHP_SOLR_QUERY_RESPONSE_CLASSNAME "SolrQueryResponse" #define PHP_SOLR_UPDATE_RESPONSE_CLASSNAME "SolrUpdateResponse" #define PHP_SOLR_PING_RESPONSE_CLASSNAME "SolrPingResponse" #define PHP_SOLR_GENERIC_RESPONSE_CLASSNAME "SolrGenericResponse" #define PHP_SOLR_UTILS_CLASSNAME "SolrUtils" #define PHP_SOLR_EXCEPTION_CLASSNAME "SolrException" #define PHP_SOLR_ILLEGAL_OPERATION_EXCEPTION_CLASSNAME "SolrIllegalOperationException" #define PHP_SOLR_ILLEGAL_ARGUMENT_EXCEPTION_CLASSNAME "SolrIllegalArgumentException" #define PHP_SOLR_CLIENT_EXCEPTION_CLASSNAME "SolrClientException" #define PHP_SOLR_SERVER_EXCEPTION_CLASSNAME "SolrServerException" #define PHP_SOLR_MISSING_MANDATORY_PARAMETER_EXCEPTION_CLASSNAME "SolrMissingMandatoryParameterException" /* }}} */ /* {{{ Informational constants */ #define PHP_SOLR_EXTENSION_NAME "solr" #define PHP_CURL_EXTENSION_NAME "curl" #define PHP_LIBXML_EXTENSION_NAME "libxml" #define PHP_JSON_EXTENSION_NAME "json" /* }}} */ /* {{{ Property names */ #define SOLR_INDEX_PROPERTY_NAME "_hashtable_index" #define SOLR_FIELD_NAME_PROPERTY_NAME "name" #define SOLR_FIELD_BOOST_PROPERTY_NAME "boost" #define SOLR_FIELD_VALUES_PROPERTY_NAME "values" #define SOLR_SOURCELINE_NO_PROPERTY_NAME "sourceline" #define SOLR_SOURCEFILE_PROPERTY_NAME "sourcefile" #define SOLR_ZIFNAME_PROPERTY_NAME "zif_name" #define SOLR_DISMAX_DEFAULT_PARSER "edismax" #ifdef PHP_WIN32 #define __func__ __FUNCTION__ #endif #define SOLR_FILE_LINE_FUNC __FILE__, __LINE__, __func__ /* }}} */ /* {{{ Constants for Method/Function arguments and return styles */ #define SOLR_ARG_PASS_BY_REF_FALSE 0 #define SOLR_ARG_PASS_BY_REF_TRUE 1 #define SOLR_ARG_PASS_REMAINING_BY_REF_FALSE 0 #define SOLR_ARG_PASS_REMAINING_BY_REF_TRUE 1 #define SOLR_ARG_ALLOW_NULL_FALSE 0 #define SOLR_ARG_ALLOW_NULL_TRUE 1 #define SOLR_METHOD_RETURN_REFERENCE_FALSE 0 #define SOLR_METHOD_RETURN_REFERENCE_TRUE 1 /* }}} */ /* {{{ Constants for Sorting SolrDocument Fields */ #define SOLR_SORT_ASC 1 #define SOLR_SORT_DESC 2 #define SOLR_SORT_FIELD_NAME 1 #define SOLR_SORT_FIELD_VALUE_COUNT 2 #define SOLR_SORT_FIELD_BOOST_VALUE 4 /* }}} */ /* {{{ Constants for document encoding formats */ #define SOLR_XML_ENCODE_OBJ 0L #define SOLR_XML_ENCODE_DOC 1L /* }}} */ /** * Setting this to 8 gets rid of the extra while loops in _zend_hash_init() * * _zend_hash_init loops 3 times to increase the value of the size to 8 */ #define SOLR_INITIAL_HASH_TABLE_SIZE (1<<3) /* {{{ Memory Allocation Related Constants */ #define SOLR_HASHTABLE_PERSISTENT 0 #define SOLR_DOCUMENT_PERSISTENT 0 #define SOLR_DOCUMENT_FIELD_PERSISTENT 0 #define SOLR_CLIENT_PERSISTENT 0 #define SOLR_PARAMS_PERSISTENT 0 #define SOLR_FUNCTIONS_PERSISTENT 0 /* }}} */ /* {{{ SolrException Codes : Internal and UserSpace */ /* {{{ Error codes and messages */ #define SOLR_ERROR_1000 1000L #define SOLR_ERROR_1000_MSG "Error un-serializing response" #define SOLR_ERROR_1001 1001L #define SOLR_ERROR_1001_MSG "SolrClient objects cannot be serialized or unserialized" #define SOLR_ERROR_1002 1002L #define SOLR_ERROR_1002_MSG "The '%s' property cannot be removed or set to NULL. SolrObject properties cannot be unset or set to NULL." #define SOLR_ERROR_1003 1003L #define SOLR_ERROR_1003_MSG "Error building HTTP query from parameters" #define SOLR_ERROR_1004 1004L #define SOLR_ERROR_1004_MSG "Unsuccessful HTTP request" #define SOLR_ERROR_1005 1005L #define SOLR_ERROR_1005_MSG "SolrInputDocument objects cannot be serialized or unserialized" #define SOLR_ERROR_1006 1006L #define SOLR_ERROR_1006_MSG "SolrObject instances are read-only. Properties cannot be added, updated or removed." #define SOLR_ERROR_1007 1007L #define SOLR_ERROR_1007_MSG "SolrDocumentField instances are read-only. Properties cannot be updated or removed." #define SOLR_ERROR_1008 1008L #define SOLR_ERROR_1008_MSG "Internal Error 1008 generated from %s %d %s. The observed error is a possible side-effect of an illegal/unsupported operation in userspace. Please check the documentation and try again later." #define SOLR_ERROR_1009 1009L #define SOLR_ERROR_1009_MSG "The observed error is a possible side-effect of an illegal/unsupported operation in userspace. This object cannot be cloned. Cloning of this object type is not yet supported." #define SOLR_ERROR_1010 1010L #define SOLR_ERROR_1010_MSG "Unsuccessful %s request : Response Code %ld. %s" #define SOLR_ERROR_4000 4000L #define SOLR_ERROR_4000_MSG "Invalid argument" #define SOLR_ERROR_4001 4001L #define SOLR_ERROR_4001_MSG "Illegal Operation" #define SOLR_ERROR_4002 4002L #define SOLR_ERROR_4002_MSG "Return value requested without processing output" #define SOLR_ERROR_4003 4003L #define SOLR_ERROR_4003_MSG "Invalid field value modifier." #define SOLR_ERROR_4004 4004L #define SOLR_ERROR_4004_MSG "Cannot add and modify the same field." /* }}} */ /* {{{ UserSpace Errors */ #define SOLR_ERROR_4100 4100L #define SOLR_ERROR_4100_MSG "Mandatory parameter Missing: %s" /* }}} */ /* {{{ Compile time errors */ /* }}} */ /* }}} */ #endif /* SOLR_CONSTANTS_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_macros.h0000644000175000017500000002241315001737315014714 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #ifndef SOLR_MACROS_H #define SOLR_MACROS_H #ifndef bool #include #endif #include /* Macros for Object constructors and destructors declaration */ #define SOLR_CTOR(class_name, func_name, arginfo) PHP_ME(class_name, func_name, arginfo, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) #define SOLR_DTOR(class_name, func_name, arginfo) PHP_ME(class_name, func_name, arginfo, ZEND_ACC_PUBLIC) /* Retrieve a unique hash index for this SolrDocument. Unique for this thread */ #define SOLR_UNIQUE_DOCUMENT_INDEX() solr_hashtable_get_new_index(SOLR_GLOBAL(documents)) /* Retrieve a unique hash index for this SolrClient. Unique for this thread */ #define SOLR_UNIQUE_CLIENT_INDEX() solr_hashtable_get_new_index(SOLR_GLOBAL(clients)) /* Retrieve a unique hash index for this SolrParams instance. Unique for this thread */ #define SOLR_UNIQUE_PARAMS_INDEX() solr_hashtable_get_new_index(SOLR_GLOBAL(params)) /* Retrieve a unique hash index for this SolrFunction instance. Unique for this thread */ #define SOLR_UNIQUE_FUNCTION_INDEX() solr_hashtable_get_new_index(SOLR_GLOBAL(functions)) /* Retrieve a unique hash index for this update stream instances. Unique for this thread */ #define SOLR_UNIQUE_USTREAM_INDEX() solr_hashtable_get_new_index(SOLR_GLOBAL(ustreams)) /* Iterates through the HashTable pointer */ #define SOLR_HASHTABLE_FOR_LOOP(HashTablePtr) \ if (HashTablePtr) for ( zend_hash_internal_pointer_reset((HashTablePtr)); \ SUCCESS == zend_hash_has_more_elements((HashTablePtr)); \ zend_hash_move_forward((HashTablePtr)) ) #define SOLR_HASHTABLE_FOR_LOOP_EX(HashTablePtr, pos) \ if (HashTablePtr) for ( zend_hash_internal_pointer_reset_ex(HashTablePtr, &pos); \ SUCCESS == zend_hash_has_more_elements_ex((HashTablePtr), &pos); \ zend_hash_move_forward_ex((HashTablePtr), &pos) ) #define SOLR_HASH_FOREACH_PTR(HashTablePtr, ptr) \ if (HashTablePtr) ZEND_HASH_FOREACH_PTR(HashTablePtr, ptr) #define SOLR_HASH_FOREACH_END() \ ZEND_HASH_FOREACH_END() /* Gets a random number between 1 and SHRT_MAX */ #define SOLR_GET_RANDOM_NUMBER() abs(rand() % SHRT_MAX + 1) /* {{{ Memory Allocation Macros */ /* Used only to release truly persistent allocations */ #define SOLR_FREE_PTR(ptr) { if (ptr != NULL) { pefree(ptr,SOLR_HASHTABLE_PERSISTENT); ptr = NULL; } else { printf("\nSOLR_FREE_PTR double free() from function %s() called in %s on line %d\n", __func__, __FILE__, __LINE__); } } /* }}} */ /** * Used to retrieve xmlAttr and xmlNode values * * At this time, I am not sure if the next and previous sibling links * are guaranteed to be document order 100% of the time. * This is why I am requiring matches for the attribute and element names before * copying values from the attributes or element nodes. * Since I am not 100%, I believe it is better to be safe than sorry. * There may be a slight performance hit but at least correctness is guaranteed. */ #define solr_xml_match_node(solrXmlNode, solrXmlNodeName) ( \ xmlStrEqual(solrXmlNode->name, (xmlChar *) solrXmlNodeName) && \ solrXmlNode->children && solrXmlNode->children->content ) /* Checks if children is a valid struct */ #define solr_xml_child_content_is_valid(solrXmlNode) (solrXmlNode && solrXmlNode->children) /* Checks to prevent segmentation fault. Ensures that children is a valid struct before attempting to get content */ #define solr_xml_get_node_contents(solrXmlNode) (solr_xml_child_content_is_valid(solrXmlNode)? (solrXmlNode->children->content) : ((xmlChar *) "")) #define solr_xml_get_node_contents_int(solrXmlNode) atoi((char *)solr_xml_get_node_contents(solrXmlNode)) #define solr_xml_get_node_contents_double(solrXmlNode) xmlXPathCastStringToNumber(solr_xml_get_node_contents(solrXmlNode)) /* hack for optional value modifier */ #define solr_document_insert_field_value(queue, field_value, field_boost, ...) solr_document_insert_field_value_ex( queue, field_value, field_boost, (0, ##__VA_ARGS__)) /** * Used to manage SolrQuery parameters that allow overrides by field name. * * Many parameters may be overridden on a per-field basis with the following syntax * * f..= * f..= * * @buf pointer to a solr_string_t object * @fname field name * @fname_len length of the field name * @pname a string constant representing the name of the parameter. */ #define solr_query_field_override(buf, fname, fname_len, pname) { \ if ((fname_len)) { \ solr_string_append_const((buf), "f."); \ solr_string_appends((buf), (fname), (fname_len)); \ solr_string_appendc((buf), '.'); \ } \ solr_string_append_const((buf), (pname)); \ } /* Macro for returning SolrParams objects if requested */ #define solr_return_solr_params_object() { \ solr_set_return_solr_params_object(return_value, getThis()); \ } /* client macros */ #define SOLR_RESPONSE_CODE_BODY (client->handle.response_header.response_code), (client->handle.response_body.buffer.str) #define SOLR_SHOW_CURL_WARNING { \ if (client->handle.err.str) \ { \ php_error_docref(NULL, E_WARNING, "%s", ((solr_char_t *) client->handle.err.str)); \ } \ } /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception */ #define HANDLE_SOLR_SERVER_ERROR(clientPtr,requestType){ \ if(clientPtr->handle.result_code == CURLE_OK){ \ solr_throw_solr_server_exception(clientPtr, (const char *)requestType);\ } \ } /* solr_throw_exception_ex(solr_ce_SolrClientException, SOLR_ERROR_1010, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1010_MSG, requestType, SOLR_RESPONSE_CODE_BODY); \ */ #define SOLR_RETURN_THIS() { \ RETURN_ZVAL(getThis(), 1, 0); \ } /* Used to release the (solr_document_t **) pointers */ #define SOLR_FREE_DOC_ENTRIES(ptr) { \ if ((ptr) != NULL)\ { \ pefree(ptr, SOLR_DOCUMENT_PERSISTENT); \ ptr = NULL; \ } \ } /* }}} */ /* Used to release the (solr_document_t **) pointers */ #define SOLR_FREE_DOC_ENTRIES(ptr) { \ if ((ptr) != NULL)\ { \ pefree(ptr, SOLR_DOCUMENT_PERSISTENT); \ ptr = NULL; \ } \ } /* }}} */ static inline solr_ustream_t *solr_get_ustream_object(zend_object *obj) { return (solr_ustream_t *) ((char *) obj - XtOffsetOf(solr_ustream_t, std)); } #define Z_USTREAM_P(zv) solr_get_ustream_object(Z_OBJ_P(zv)); /** * Handles strict/non-strict integer parsing * * usage: * SOLR_PARSE_PARAM_INT_DEF(maxSegmentsZval, maxSegments, maxSegmentsLen, "1"); * if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &maxSegmentsZval) == FAILURE) { * RETURN_THROWS(); * } * SOLR_PARSE_PARAM_INT(maxSegmentsZval, maxSegments, maxSegmentsLen, "maxSegments"); */ #define SOLR_DEFINE_PARSE_PARAM_INT(zval_ptr, solrparam, solrparam_len, default_value) \ zval *zval_ptr = NULL; \ char *solrparam = default_value; \ size_t solrparam_len = sizeof(default_value)-1; /* * SOLR_PARSE_PARAM_INT(zval * zval_ptr, char * solrparam, size_t solrparam_len, const char * param_name, bool is_optional) */ #define SOLR_PARSE_PARAM_INT(zval_ptr, solrparam, solrparam_len, param_name) \ do { \ if (zval_ptr == NULL) { \ continue; \ } \ bool is_strict = ZEND_ARG_USES_STRICT_TYPES(); \ bool is_int = Z_TYPE_P(zval_ptr) == IS_LONG; \ bool is_str = Z_TYPE_P(zval_ptr) == IS_STRING; \ /* strict mode check, skipped to avoid BC Break */ \ /* if (is_strict && !is_int) { \ solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "%s must be of type int.", param_name); \ RETURN_NULL(); \ } else */ \ if (is_int) { \ convert_to_string(zval_ptr); \ is_str = Z_TYPE_P(zval_ptr) == IS_STRING; \ } \ if (is_str) { \ solrparam = Z_STRVAL_P(zval_ptr); \ solrparam_len = Z_STRLEN_P(zval_ptr); \ } else { \ solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "%s must be of type int.", param_name); \ RETURN_NULL(); \ } \ } while (0) #endif /* SOLR_MACROS_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_string.h0000644000175000017500000001202515001737315014734 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Israel Ekpo | +----------------------------------------------------------------------+ */ #ifndef SOLR_STRING_H #define SOLR_STRING_H #include
#include #define SOLR_STRING_PERSISTENT 0 #define SOLR_STRING_START_SIZE 64 #define SOLR_STRING_INCREMENT_SIZE 128 #define SOLR_STRING_LONG_BUFFER_SIZE 16 #define SOLR_STRING_UNSIGNED_LONG_BUFFER_SIZE 32 #include "php_solr_api.h" #ifdef SOLR_DEBUG /* #define SOLR_MEM_DEBUG 1 Uncomment if you need memdebug enabled */ #endif #ifdef SOLR_MEM_DEBUG #define SOLR_MEM_DEBUG_DC , const char * mm_function, char * mm_filename, int mm_line #define SOLR_MEM_DEBUG_CC , mm_function, mm_filename, mm_line #define SOLR_MEM_DEBUG_RC , __func__, __FILE__, __LINE__ #else #define SOLR_MEM_DEBUG_DC #define SOLR_MEM_DEBUG_CC #define SOLR_MEM_DEBUG_RC #endif /** * solr_char_t * * iekpo 2009/08/28 * * Decided to create this type just in case there is a special need in the * future to use unsigned char instead of plain char to transport character * arrays within the library. * * Having this typedef will allow us to toggle easily between plain char and * unsigned char, without having to do a massive search and replace. * * There may be a few cases where casting may be needed to handle cases where * the sign of the variable is now the opposite. */ typedef char solr_char_t; /* Structure to store solr strings */ typedef struct _solr_string { solr_char_t *str; /* The buffer to store the character array. */ size_t len; /* The current length of the solr_string_t object */ size_t cap; /* The current capacity of the solr_string_t object */ } solr_string_t; #define SOLR_STRING_INITIALIZER {.str = ((solr_char_t *)0), .len = 0U, .cap = 0U} /* Appends a string constant to a solr_string_t */ #define solr_string_append_const(dest, str) solr_string_appends((dest), (solr_char_t *) str, sizeof(str)-1) /* Appends one solr_string_t to another */ #define solr_string_append_solr_string(dest, src) solr_string_appends((dest), (src)->str, (src)->len) /* Initializes the solr_string_t structure to empty values */ #define solr_string_init(dest) \ { \ (dest)->str = (solr_char_t *) 0x00; \ (dest)->len = 0U; \ (dest)->cap = 0U; \ } #define solr_strndup estrndup #define solr_strdup estrdup #define solr_strlen strlen #define solr_string_appends(dest, src, len) solr_string_appends_ex((dest), (src), (len) SOLR_MEM_DEBUG_RC) #define solr_string_appendc(dest, ch) solr_string_appendc_ex((dest), (ch) SOLR_MEM_DEBUG_RC) #define solr_string_append_long(dest, long_val) solr_string_append_long_ex((dest), (long_val) SOLR_MEM_DEBUG_RC) #define solr_string_append_unsigned_long(dest, long_val) solr_string_append_unsigned_long((dest), (long_val) SOLR_MEM_DEBUG_RC) #define solr_string_set(dest, value, length) solr_string_set_ex((dest), (value), (length) SOLR_MEM_DEBUG_RC) #define solr_string_free(dest) solr_string_free_ex((dest) SOLR_MEM_DEBUG_RC) PHP_SOLR_API void solr_string_appends_ex(solr_string_t *dest, const solr_char_t *src, size_t length SOLR_MEM_DEBUG_DC); PHP_SOLR_API void solr_string_appendc_ex(solr_string_t *dest, solr_char_t ch SOLR_MEM_DEBUG_DC); PHP_SOLR_API void solr_string_append_long_ex(solr_string_t *dest, long int long_val SOLR_MEM_DEBUG_DC); PHP_SOLR_API void solr_string_append_unsigned_long_ex(solr_string_t *dest, unsigned long int long_val SOLR_MEM_DEBUG_DC); PHP_SOLR_API void solr_string_remove_last_char(solr_string_t *dest); PHP_SOLR_API int solr_string_equal(const solr_string_t *a, const solr_string_t *b); PHP_SOLR_API void solr_destory_solr_string_zv(zval *solr_string_zv); PHP_SOLR_API void solr_string_free_ex(solr_string_t *dest SOLR_MEM_DEBUG_DC); PHP_SOLR_API void solr_string_set_ex(solr_string_t *dest, const solr_char_t *value, size_t length SOLR_MEM_DEBUG_DC); /* destroy data element of hashtable of solr_string_t */ #ifdef PHP_7 #define solr_destroy_solr_string solr_destory_solr_string_zv /* frees a solr_string_t within a zval */ #else #define solr_destroy_solr_string solr_string_free #endif #endif /* SOLR_STRING_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_types.h0000644000175000017500000003477415001737315014611 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #ifndef SOLR_TYPES_H #define SOLR_TYPES_H #include
#include #include #include #include /* Declaring workarounds for SSL private key constants */ #if LIBCURL_VERSION_NUM >= 0x071700 /* Use CURLOPT_KEYPASSWD as is */ #elif LIBCURL_VERSION_NUM >= 0x070903 #define CURLOPT_KEYPASSWD CURLOPT_SSLKEYPASSWD #else #define CURLOPT_KEYPASSWD CURLOPT_SSLCERTPASSWD #endif /* Declaring workarounds for ACCEPT ENCODING constants */ #if LIBCURL_VERSION_NUM >= 0x071506 /* Use CURLOPT_ACCEPT_ENCODING as is */ #else #define CURLOPT_ACCEPT_ENCODING CURLOPT_ENCODING #endif #include #include #include #include #include #include typedef unsigned char solr_bool; #include "solr_string.h" /* {{{ types for the http client */ typedef enum { SOLR_REQUEST_BEGIN = 0, SOLR_REQUEST_SEARCH = 1, /** 1 **/ SOLR_REQUEST_UPDATE = 2, /** 2 **/ SOLR_REQUEST_THREADS = 3, /** 3 **/ SOLR_REQUEST_PING = 4, /** 4 **/ SOLR_REQUEST_TERMS = 5, /** 5 **/ SOLR_REQUEST_SYSTEM = 6, /** 6 **/ SOLR_REQUEST_GET = 7, SOLR_REQUEST_EXTRACT = 8, SOLR_REQUEST_END } solr_request_type_t; typedef enum { SOLR_SERVLET_TYPE_BEGIN = 0, SOLR_SERVLET_TYPE_SEARCH = 1, SOLR_SERVLET_TYPE_UPDATE = 2, SOLR_SERVLET_TYPE_THREADS = 4, SOLR_SERVLET_TYPE_PING = 8, SOLR_SERVLET_TYPE_TERMS = 16, SOLR_SERVLET_TYPE_SYSTEM = 32, SOLR_SERVLET_TYPE_GET = 64, SOLR_SERVLET_TYPE_EXTRACT = 128, SOLR_SERVLET_TYPE_END } solr_servlet_type_t; typedef enum { SOLR_PARAM_TYPE_BEGIN = 0, SOLR_PARAM_TYPE_NORMAL = 1, SOLR_PARAM_TYPE_SIMPLE_LIST = 2, SOLR_PARAM_TYPE_ARG_LIST = 4, SOLR_PARAM_TYPE_END } solr_param_type_t; typedef enum { SOLR_SORT_DIR_ASC = 0, SOLR_SORT_DIR_DESC = 1 } solr_sort_dir_t; typedef enum { SOLR_JSON_ERROR_NONE = 0, SOLR_JSON_ERROR_DEPTH, SOLR_JSON_ERROR_STATE_MISMATCH, SOLR_JSON_ERROR_CTRL_CHAR, SOLR_JSON_ERROR_SYNTAX, SOLR_JSON_ERROR_UTF8, SOLR_JSON_ERROR_SERIALIZATION } solr_json_error_codes_t; /* document field value modifier */ typedef enum { SOLR_FIELD_VALUE_MOD_NONE = 0, SOLR_FIELD_VALUE_MOD_ADD = 1, SOLR_FIELD_VALUE_MOD_SET = 2, SOLR_FIELD_VALUE_MOD_INC = 3, SOLR_FIELD_VALUE_MOD_REMOVE = 4, SOLR_FIELD_VALUE_MOD_REMOVEREGEX = 5, } solr_fvm_t; /* solr input document optimistic concurrency */ typedef enum { SOLR_VERSION_ASSERT_NONE = 0, SOLR_VERSION_ASSERT_EXISTS = 1, SOLR_VERSION_ASSERT_NOT_EXISTS = -1 } solr_input_document_version_t; typedef struct curl_slist solr_http_header_list_t; typedef struct { solr_string_t buffer; /* Stores the HTTP request headers */ } solr_curl_send_headers_t; typedef struct _solr_curl_send_data { solr_string_t buffer; /* Stores the HTTP request data */ } solr_curl_send_data_t; typedef struct { solr_string_t buffer; /* Stores the HTTP response headers */ long int response_code; /* Stores the HTTP response code */ } solr_curl_response_headers_t; typedef struct { solr_string_t buffer; /* Stores the HTTP response data */ } solr_curl_response_data_t; typedef struct { char str[CURL_ERROR_SIZE + 1]; /* Stores the error message */ uint32_t number; /* Stores the error number */ } solr_curl_error_t; typedef struct { solr_curl_send_headers_t request_header; solr_curl_send_data_t request_body; solr_curl_send_data_t request_body_debug; solr_curl_response_headers_t response_header; solr_curl_response_data_t response_body; solr_curl_error_t err; solr_string_t debug_data_buffer; /* Stores all the debug data */ size_t handle_status; /* Whether or not the handle is still usable */ CURLcode result_code; CURL *curl_handle; } solr_curl_t; typedef struct { long int host_port; /* HTTP port for Solr server */ long int proxy_port; /* Proxy port for Solr server */ long int timeout; /* maximum time in seconds allowed for the http data transfer operation */ long int secure; /* Whether to connect to Solr Server using SSL/HTTPS */ long int ssl_verify_peer; /* Determines whether libcurl verifies the peer certificate */ long int ssl_verify_host; /* Determines how libcurl verifies the server certificate */ solr_string_t hostname; /* IP address or domain name */ solr_string_t path; /* Path to solr */ solr_string_t http_auth_credentials; /* HTTP Auth username:password */ solr_string_t proxy_hostname; /* IP address of domain name for the proxy server */ solr_string_t proxy_auth_credentials; /* Proxy Auth username:password */ solr_string_t ssl_cert; /* File name to a PEM-formatted private key + private certificate (concatenated in that order) */ solr_string_t ssl_key; /* File name to a PEM-formatted private key */ solr_string_t ssl_keypassword; /* The pass phrase/password for the private ssl_key */ solr_string_t ssl_cainfo; /* Name of file holding one or more certificates to verify peer with */ solr_string_t ssl_capath; /* Name of directory holding multiple CA certificates to verify peer with */ solr_string_t qs_delimiter; /* The query string delimiter */ solr_string_t response_writer; /* The response writer type (wt parameter) */ solr_string_t update_url; /* URL used for updates */ solr_string_t extract_url; /* URL used for file indexing using extract */ solr_string_t search_url; /* URL used for queries */ solr_string_t thread_url; /* URL used for thread monitoring */ solr_string_t ping_url; /* URL for sending ping requests */ solr_string_t terms_url; /* URL for sending terms requests */ solr_string_t system_url; /* URL for sending system requests */ solr_string_t get_url; /* URL for sending realtime get requests */ solr_string_t update_servlet; /* The update servlet */ solr_string_t extract_servlet; /* The update servlet appended with extract Req. handler */ solr_string_t search_servlet; /* The search servlet */ solr_string_t thread_servlet; /* The thread servlet */ solr_string_t ping_servlet; /* The ping servlet */ solr_string_t terms_servlet; /* The terms servlet */ solr_string_t system_servlet; /* The system info servlet */ solr_string_t get_servlet; /* The realtime get servlet */ } solr_client_options_t; typedef struct { zend_ulong client_index; /* Unique for the SolrClient instance. Used as index in HashTables */ uint32_t request_count; /* The number of requests made from this client */ solr_client_options_t options; /* The connection options for this client */ solr_curl_t handle; /* The Solr handle for this client */ } solr_client_t; /* }}} */ /* Types for documents and collections */ /* {{{ Types for documents and collections */ /* {{{ Types for SolrDocument fields */ typedef struct _solr_field_value_t { solr_char_t *field_value; /* The value for this field */ solr_fvm_t modifier; /* field value modifier for partial updates */ struct _solr_field_value_t *next; /* The next entry in the queue */ } solr_field_value_t; /** * List of Fields in a Solr Document * * @field_boost stores the boost value * @count stores how many fields there are in the list * @field_name stores the name of the field * @head the first entry in the list (if any) * @last the last entry in the list (if any) */ typedef struct { double field_boost; /* The boost value for this field */ uint32_t count; /* The number of values in this field */ uint32_t modified; /* marks field as getting modified */ solr_char_t *field_name; /* The name of the field */ solr_field_value_t *head; /* The first value in the queue */ solr_field_value_t *last; /* The last value in the queue */ } solr_field_list_t; /* }}} */ /* {{{ Types for Documents and Document Collections */ typedef struct { zend_ulong document_index; /* Unique for the SolrInputDocument instance. Used as index in HashTables */ uint32_t field_count; /* Number of fields in this document */ double document_boost; /* The boost value for this document */ HashTable *fields; /* HashTable for storing all the solr_field_list_t fields */ HashTable *children; /* Hashtable for storing child documents(zval *) */ } solr_document_t; /* }}} */ /* {{{ Types for Solr Query Parameters */ typedef struct { solr_string_t value; /* The value for this parameter */ solr_string_t arg; /* The argument for this value*/ solr_char_t *delimiter_override; /* overrides the arg_list delimiter for this particular argument */ solr_bool delimiter_overriden; /* is delimiter overriden */ } solr_arg_list_value_t; typedef union { solr_string_t normal; /* Stores normal parameters */ solr_string_t simple_list; /* Stores delimited list parameters */ solr_arg_list_value_t arg_list; /* Stores parameters that have arguments */ } solr_pvc_t; typedef struct _solr_param_value_t { solr_pvc_t contents; /* A union for the contents of this value */ struct _solr_param_value_t *prev; /* The previous value in the list */ struct _solr_param_value_t *next; /* The next value in the list */ } solr_param_value_t; /* Checks if two parameter values are equal */ typedef int (*solr_param_value_equal_func_t)(const solr_param_value_t *a, const solr_param_value_t *b); /* Used to retrieve all the values for this parameter as a single solr string */ typedef void (*solr_param_fetch_func_t)(void *solr_param, solr_string_t *buffer); /* Frees the parameter value and its contents. */ typedef void (*solr_param_value_free_func_t)(solr_param_value_t *param_value); typedef struct { solr_param_type_t type; /* What type of query parameter this is */ uint32_t count; /* The number of values for this parameter */ solr_char_t *param_name; /* The name of the parameter */ size_t param_name_length; /* The length of name of the parameter */ solr_bool allow_multiple; /* Whether this parameter should store more than one value */ solr_param_value_t *head; /* The first value in the list */ solr_param_value_t *last; /* The last value in the list */ solr_param_fetch_func_t fetch_func; /* Retrieves all the value contents as a single solr_string_t */ solr_param_value_free_func_t value_free_func; /* Frees the value and its contents */ solr_param_value_equal_func_t value_equal_func; /* Checks if two values are equal */ solr_char_t delimiter; /* Default is "," Used to separate list parameter values */ solr_char_t arg_separator; /* Used only be arg_lists to separate arguments from values */ } solr_param_t; /* Used to retrieve parameter values just for display purposes */ typedef void (*solr_param_display_func_t)(solr_param_t *solr_param, zval *param_value_array); /* Used to retrieve parameter values just for the toString() method */ /* The url_encode parameter will be ignored for now */ typedef void (*solr_param_tostring_func_t)(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode); typedef struct { zend_ulong params_index; /* The index for this object in the HashTable */ uint32_t params_count; /* The number of parameters for the query object */ HashTable *params; /* The HashTable for storing query parameters */ } solr_params_t; /* }}} */ /* {{{ solr function/localparams type */ typedef struct { zend_ulong function_index; /* The index for this object in the HashTable */ solr_char_t *name; size_t name_length; solr_char_t *argument; size_t argument_length; HashTable *params; /* The HashTable for storing function key-val parameters */ } solr_function_t; /* }}} */ /* {{{ content stream/extract types */ #define SOLR_EXTRACT_CONTENT_FILE 0 #define SOLR_EXTRACT_CONTENT_STREAM 1 typedef struct { solr_string_t binary_content; /* actual contents */ solr_string_t mime_type; /* mime type */ } solr_cuv_binary_t; typedef union { solr_string_t filename; solr_cuv_binary_t stream_info; } solr_cuv_t; typedef struct { solr_cuv_t *content_info; /* stores the content data whether filename or stream_info */ int content_type; /* stores the content type from the constants above */ zval *params; zend_object std; } solr_ustream_t; /* }}} */ /* }}} */ /* {{{ Extension Global : This should be the last data type declared. More members may be added later. */ ZEND_BEGIN_MODULE_GLOBALS(solr) uint32_t request_count; /* The number of times PHP_RINIT has been called */ uint32_t document_count; /* The number of active SolrDocuments in this request */ uint32_t client_count; /* The number of active SolrClients in this request */ uint32_t functions_count; /* The number of active Functions in this request */ HashTable *documents; /* HashTable for storing solr_document_t documents */ HashTable *clients; /* HashTable for storing solr_client_t clients */ HashTable *params; /* HashTable for storing solr_params_t parameter containers */ HashTable *functions; /* HashTable for storing solr_function_t */ HashTable *ustreams; /* HashTable for storing solr_ustream_t */ ZEND_END_MODULE_GLOBALS(solr) /* }}} */ typedef struct { int code; solr_char_t *message; } solr_exception_t; #endif /* SOLR_TYPES_H */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr.c0000644000175000017500000021452315001737315014217 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" #ifdef HAVE_SOLR #if LIBCURL_VERSION_NUM < 0x070F00 #error libcurl 7.15.0 or later is required. Please upgrade your libcurl version. #endif #if LIBXML_VERSION < 20616 #error libxml2 2.6.16 or later is required. Please upgrade your libxml2 version. #endif /******************************************************************************/ /** GLOBAL VARIABLE FOR THE EXTENSION **/ /******************************************************************************/ /* {{{ ZEND_DECLARE_MODULE_GLOBALS(solr) */ ZEND_DECLARE_MODULE_GLOBALS(solr) /* }}} */ /******************************************************************************/ /** OBJECT HANDLERS AND DECLARATIONS FOR CLASS ENTRIES **/ /******************************************************************************/ /* {{{ zend_class_entry declarations of the classes */ zend_class_entry *solr_ce_SolrObject; zend_class_entry *solr_ce_SolrInputDocument; zend_class_entry *solr_ce_SolrDocument; zend_class_entry *solr_ce_SolrDocumentField; zend_class_entry *solr_ce_SolrExtractRequest; zend_class_entry *solr_ce_SolrClient; zend_class_entry *solr_ce_SolrParams; zend_class_entry *solr_ce_SolrModifiableParams; zend_class_entry *solr_ce_SolrCollapseFunction; zend_class_entry *solr_ce_SolrQuery; zend_class_entry *solr_ce_SolrResponse; zend_class_entry *solr_ce_SolrQueryResponse; zend_class_entry *solr_ce_SolrUpdateResponse; zend_class_entry *solr_ce_SolrPingResponse; zend_class_entry *solr_ce_SolrGenericResponse; zend_class_entry *solr_ce_SolrUtils; zend_class_entry *solr_ce_SolrException; zend_class_entry *solr_ce_SolrIllegalOperationException; zend_class_entry *solr_ce_SolrIllegalArgumentException; zend_class_entry *solr_ce_SolrClientException; zend_class_entry *solr_ce_SolrServerException; zend_class_entry *solr_ce_SolrMissingMandatoryParameterException; /* }}} */ /* {{{ zend_object_handlers */ zend_object_handlers solr_object_handlers; zend_object_handlers solr_document_field_handlers; zend_object_handlers solr_input_document_object_handlers; zend_object_handlers solr_client_object_handlers; zend_object_handlers solr_response_object_handlers; zend_object_handlers solr_collapse_function_object_handlers; zend_object_handlers solr_extract_request_object_handlers; /* }}} */ /* {{{ static void php_solr_globals_ctor(zend_solr_globals *solr_globals_arg) Global variable initializer. In ZTS mode, called once for each thread spawned. */ static void php_solr_globals_ctor(zend_solr_globals *solr_globals_arg) { /* Initializing the counters to Zero */ solr_globals_arg->request_count = 0U; solr_globals_arg->document_count = 0U; solr_globals_arg->client_count = 0U; solr_globals_arg->functions_count = 0U; solr_globals_arg->documents = NULL; solr_globals_arg->clients = NULL; solr_globals_arg->params = NULL; solr_globals_arg->functions = NULL; solr_globals_arg->ustreams = NULL; } /* }}} */ /******************************************************************************/ /** DECLARING STRUCTURES FOR METHOD ARGUMENTS TYPE HINTING **/ /******************************************************************************/ /* {{{ arg_info vectors for functions and methods */ #if PHP_VERSION_ID < 70200 #undef ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, class_name, allow_null) \ static const zend_internal_arg_info name[] = { \ { (const char*)(zend_uintptr_t)(required_num_args), ( #class_name ), 0, return_reference, allow_null, 0 }, #endif #ifndef ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX #define ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, type, allow_null) \ ZEND_BEGIN_ARG_INFO_EX(name, 0, return_reference, required_num_args) #endif ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(SolrObject__get_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, IS_MIXED, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, property_name) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrObject__set_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2, IS_VOID, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, property_name) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, property_value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrObject_offsetExists_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, _IS_BOOL, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, property_name) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrObject_offsetUnset_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, IS_VOID, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, property_name) ZEND_END_ARG_INFO() /* {{{ SolrDocument arguments */ ZEND_BEGIN_ARG_INFO_EX(SolrDocument__construct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_addField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_getField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_fieldExists_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_deleteField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_sort_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, sortOrderBy) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, sortDirection) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_merge_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, sourceDoc, SolrDocument, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, overwrite) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(SolrDocument_current_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(SolrDocument_key_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_next_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_valid_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_rewind_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDocument_getInputDocument_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(SolrDocument_unserialize_args, 0) ZEND_ARG_INFO(0, serialized) ZEND_END_ARG_INFO() #if PHP_VERSION_ID >= 80100 ZEND_BEGIN_ARG_INFO(SolrDocument___unserialize_args, 0) ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0) ZEND_END_ARG_INFO() #endif ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_offsetSet_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2, IS_VOID, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(SolrDocument_offsetGet_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, IS_MIXED, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_offsetExists_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, _IS_BOOL, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(SolrDocument_offsetUnset_args, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1, IS_VOID, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() /* }}} */ /* {{{ SolrInputDocument arguments */ ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument__construct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_setBoost_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, documentBoostValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_addField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldValue) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldBoostValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_getFieldBoost_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_getField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_setFieldBoost_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldBoostValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_fieldExists_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_deleteField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_sort_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, sortOrderBy) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, sortDirection) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_merge_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, sourceDoc, SolrInputDocument, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, overwrite) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_addChildDocument_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, child, SolrInputDocument, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_addChildDocuments_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_ARRAY_INFO(SOLR_ARG_PASS_BY_REF_TRUE, docs, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_updateField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 3) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, modifier) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrInputDocument_setVersion_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, version) ZEND_END_ARG_INFO() /* }}} */ /* {{{ SolrClient arguments */ ZEND_BEGIN_ARG_INFO_EX(SolrClient_constructor_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_ARRAY_INFO(SOLR_ARG_PASS_BY_REF_FALSE, clientOptions, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_query_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, query, SolrParams, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_addDocument_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, doc, SolrInputDocument, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, overwrite) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, commitWithin) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_addDocuments_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_ARRAY_INFO(SOLR_ARG_PASS_BY_REF_TRUE, docs, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, overwrite) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, commitWithin) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_sendUpdateStream_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, request, SolrExtractRequest, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_request_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, raw_request) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_setResponseWriter_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, responseWriter) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_commit_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, softCommit) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, waitSearcher) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, expungeDeletes) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_optimize_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, maxSegments) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, softCommit) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, waitSearcher) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_rollback_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_deleteById_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, id) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_deleteByIds_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_ARRAY_INFO(SOLR_ARG_PASS_BY_REF_FALSE, ids, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_deleteByQuery_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, query) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_deleteByQueries_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_ARRAY_INFO(SOLR_ARG_PASS_BY_REF_FALSE, queries, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_ping_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_threads_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_info_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrClient_setServlet_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, type) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() /* }}} */ /* {{{ SolrParams arguments */ ZEND_BEGIN_ARG_INFO_EX(SolrParams_setParam_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, name) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrParams_addParam_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, name) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrParams_toString_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, url_encode) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrParams_getParam_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, param_name) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(SolrParams_unserialize_args, 0) ZEND_ARG_INFO(0, serialized) ZEND_END_ARG_INFO() #if PHP_VERSION_ID >= 80100 ZEND_BEGIN_ARG_INFO(SolrParams___unserialize_args, 0) ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0) ZEND_END_ARG_INFO() #endif /* }}} */ /* {{{ SolrQuery arguments */ ZEND_BEGIN_ARG_INFO_EX(SolrQuery_constructor_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, q) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setQuery_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, q) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setStart_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, start) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setRows_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, rows) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_addField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_addSortField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, order) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_addFilterQuery_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fq) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setShowDebugInfo_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, flag) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setExplainOther_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, flag) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setTimeAllowed_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, timeAllowed) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setOmitHeader_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, flag) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setEchoHandler_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, flag) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setEchoParams_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, type) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_facet_get_1_0_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field_override) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_facet_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_facet_2_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field_override) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_group_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_hl_get_1_0_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field_override) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_hl_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_hl_2_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field_override) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_stats_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_mlt_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_mlt_2_2_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, boost) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_terms_1_1_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_setGroupCachePct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, percent) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrQuery_collapse_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, collapseFunction, SolrCollapseFunction, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() /* }}} */ /* {{{ Solr Generic arguments */ ZEND_BEGIN_ARG_INFO_EX(Solr_no_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() /* }}} */ /* {{{ */ ZEND_BEGIN_ARG_INFO_EX(SolrResponse_setParseMode_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, parser_mode) ZEND_END_ARG_INFO() /* }}} */ /* {{{ SolrUtils */ ZEND_BEGIN_ARG_INFO_EX(SolrUtils_escapeQueryChars_arg, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, str) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrUtils_digestXML_arg, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, xmlresponse) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, parse_mode) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrUtils_digestJson_arg, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, jsonResponse) ZEND_END_ARG_INFO() /* }}} */ ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_construct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, field) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_size_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, size) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_hint_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, hint) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_max_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, max) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_min_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, min) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_field_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, fieldName) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrCollapseFunction_set_null_policy_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, policy) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrExtractRequest_createFromFile_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, filename) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, params, SolrModifiableParams, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrExtractRequest_createFromStream_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 3) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, content) ZEND_ARG_INFO(SOLR_ARG_PASS_BY_REF_FALSE, mime_type) ZEND_ARG_OBJ_INFO(SOLR_ARG_PASS_BY_REF_TRUE, params, SolrModifiableParams, SOLR_ARG_ALLOW_NULL_FALSE) ZEND_END_ARG_INFO() #if PHP_VERSION_ID >= 80200 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(Solr_toString_args, 0, 0, IS_STRING, 0) #else ZEND_BEGIN_ARG_INFO_EX(Solr_toString_args, 0, 0, 0) #endif ZEND_END_ARG_INFO(); /* }}} */ /* {{{ solr_functions[] */ static zend_function_entry solr_functions[] = { PHP_FE(solr_get_version, Solr_no_args) PHP_FE_END }; /* }}} */ /* {{{ solr_object_methods */ static zend_function_entry solr_object_methods[] = { SOLR_CTOR(SolrObject, __construct, Solr_no_args) SOLR_DTOR(SolrObject, __destruct, Solr_no_args) /** Temporarily disconnected for now. May be brought back in the future. PHP_ME(SolrObject, __set, SolrObject__set_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, __get, SolrObject__get_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, __isset, SolrObject_one_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, __unset, SolrObject_one_args, ZEND_ACC_PUBLIC) */ PHP_ME(SolrObject, offsetSet, SolrObject__set_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, offsetGet, SolrObject__get_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, offsetExists, SolrObject_offsetExists_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, offsetUnset, SolrObject_offsetUnset_args, ZEND_ACC_PUBLIC) PHP_ME(SolrObject, getPropertyNames, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_document_methods */ static zend_function_entry solr_document_field_methods[] = { SOLR_CTOR(SolrDocumentField, __construct, Solr_no_args) SOLR_DTOR(SolrDocumentField, __destruct, Solr_no_args) PHP_FE_END }; /* }}} */ /* {{{ solr_collapse_function_methods for the SolrCollapseFunction ce */ static zend_function_entry solr_collapse_function_methods[] = { SOLR_CTOR(SolrCollapseFunction, __construct, SolrCollapseFunction_construct_args) SOLR_DTOR(SolrCollapseFunction, __destruct, Solr_no_args) PHP_ME(SolrCollapseFunction, setField, SolrCollapseFunction_set_field_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getField, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, setMax, SolrCollapseFunction_set_max_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getMax, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, setMin, SolrCollapseFunction_set_min_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getMin, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, setSize, SolrCollapseFunction_set_size_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getSize, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, setHint, SolrCollapseFunction_set_hint_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getHint, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, setNullPolicy, SolrCollapseFunction_set_null_policy_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, getNullPolicy, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, __toString, Solr_toString_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, __sleep, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrCollapseFunction, __wakeup, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_document_methods */ static zend_function_entry solr_document_methods[] = { SOLR_CTOR(SolrDocument, __construct, SolrDocument__construct_args) SOLR_DTOR(SolrDocument, __destruct, Solr_no_args) PHP_ME(SolrDocument, __clone, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, __set, SolrDocument_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, __get, SolrDocument_getField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, __isset, SolrDocument_fieldExists_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, __unset, SolrDocument_deleteField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, offsetSet, SolrDocument_offsetSet_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, offsetGet, SolrDocument_offsetGet_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, offsetExists, SolrDocument_offsetExists_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, offsetUnset, SolrDocument_offsetUnset_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, current, SolrDocument_current_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, key, SolrDocument_key_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, next, SolrDocument_next_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, rewind, SolrDocument_rewind_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, valid, SolrDocument_valid_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, serialize, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, unserialize, SolrDocument_unserialize_args, ZEND_ACC_PUBLIC) #if PHP_VERSION_ID >= 80100 PHP_ME(SolrDocument, __serialize, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, __unserialize, SolrDocument___unserialize_args, ZEND_ACC_PUBLIC) #endif PHP_ME(SolrDocument, clear, Solr_no_args, ZEND_ACC_PUBLIC) PHP_MALIAS(SolrDocument, reset, clear, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, addField, SolrDocument_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getFieldNames, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getFieldCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getField, SolrDocument_getField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, toArray, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, fieldExists, SolrDocument_fieldExists_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, deleteField, SolrDocument_deleteField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, sort, SolrDocument_sort_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, merge, SolrDocument_merge_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getInputDocument, SolrDocument_getInputDocument_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getChildDocumentsCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, hasChildDocuments, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDocument, getChildDocuments, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_input_document_methods */ static zend_function_entry solr_input_document_methods[] = { SOLR_CTOR(SolrInputDocument, __construct, SolrInputDocument__construct_args) SOLR_DTOR(SolrInputDocument, __destruct, Solr_no_args) PHP_ME(SolrInputDocument, __clone, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, __sleep, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, __wakeup, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, setBoost, SolrInputDocument_setBoost_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getBoost, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, clear, Solr_no_args, ZEND_ACC_PUBLIC) PHP_MALIAS(SolrInputDocument, reset, clear, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, addField, SolrInputDocument_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, updateField, SolrInputDocument_updateField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getFieldBoost, SolrInputDocument_getFieldBoost_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, setFieldBoost, SolrInputDocument_setFieldBoost_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getFieldNames, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getFieldCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getField, SolrInputDocument_getField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, toArray, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, fieldExists, SolrInputDocument_fieldExists_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, deleteField, SolrInputDocument_deleteField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, sort, SolrInputDocument_sort_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, merge, SolrInputDocument_merge_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, addChildDocument, SolrInputDocument_addChildDocument_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getChildDocuments, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, hasChildDocuments, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getChildDocumentsCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, addChildDocuments, SolrInputDocument_addChildDocuments_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, setVersion, SolrInputDocument_setVersion_args, ZEND_ACC_PUBLIC) PHP_ME(SolrInputDocument, getVersion, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_client_methods */ static zend_function_entry solr_client_methods[] = { SOLR_CTOR(SolrClient, __construct, SolrClient_constructor_args) SOLR_DTOR(SolrClient, __destruct, Solr_no_args) PHP_ME(SolrClient, __sleep, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, __wakeup, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, __clone, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, getOptions, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, getDebug, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, setServlet, SolrClient_setServlet_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, query, SolrClient_query_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, addDocument, SolrClient_addDocument_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, addDocuments, SolrClient_addDocuments_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, sendUpdateStream, SolrClient_sendUpdateStream_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, request, SolrClient_request_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, setResponseWriter, SolrClient_setResponseWriter_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, deleteById, SolrClient_deleteById_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, deleteByIds, SolrClient_deleteByIds_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, deleteByQuery, SolrClient_deleteByQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, deleteByQueries, SolrClient_deleteByQueries_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, getById, SolrClient_deleteById_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, getByIds, SolrClient_deleteByIds_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, commit, SolrClient_commit_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, optimize, SolrClient_optimize_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, rollback, SolrClient_rollback_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, ping, SolrClient_ping_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, system, SolrClient_info_args, ZEND_ACC_PUBLIC) PHP_ME(SolrClient, threads, SolrClient_threads_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_exception_methods. None. */ static zend_function_entry solr_exception_methods[] = { PHP_ME(SolrException, getInternalInfo, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_exception_methods. None. */ static zend_function_entry solr_client_exception_methods[] = { PHP_ME(SolrClientException, getInternalInfo, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_exception_methods. None. */ static zend_function_entry solr_server_exception_methods[] = { PHP_ME(SolrServerException, getInternalInfo, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_exception_methods. None. */ static zend_function_entry solr_illegal_operation_exception_methods[] = { PHP_ME(SolrIllegalOperationException, getInternalInfo, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_exception_methods. None. */ static zend_function_entry solr_illegal_argument_exception_methods[] = { PHP_ME(SolrIllegalArgumentException, getInternalInfo, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* PHP_MALIAS(SolrInputDocument, reset, clear, Solr_no_args, ZEND_ACC_PUBLIC) */ /* {{{ solr_params_methods. */ static zend_function_entry solr_params_methods[] = { PHP_ME(SolrParams, setParam, SolrParams_setParam_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, addParam, SolrParams_addParam_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, __toString, Solr_toString_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, toString, SolrParams_toString_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, getParams, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, getParam, SolrParams_getParam_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, getPreparedParams, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, __clone, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, serialize, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, unserialize, SolrParams_unserialize_args, ZEND_ACC_PUBLIC) #if PHP_VERSION_ID >= 80100 PHP_ME(SolrParams, __serialize, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrParams, __unserialize, SolrParams___unserialize_args, ZEND_ACC_PUBLIC) #endif PHP_MALIAS(SolrParams, add, addParam, SolrParams_addParam_args, ZEND_ACC_PUBLIC) PHP_MALIAS(SolrParams, set, setParam, SolrParams_setParam_args, ZEND_ACC_PUBLIC) PHP_MALIAS(SolrParams, get, getParam, SolrParams_getParam_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_modifiable_params_methods. */ static zend_function_entry solr_modifiable_params_methods[] = { SOLR_CTOR(SolrModifiableParams, __construct, Solr_no_args) SOLR_DTOR(SolrModifiableParams, __destruct, Solr_no_args) PHP_FE_END }; /* }}} */ static zend_function_entry solr_extract_request_methods[] = { PHP_ME(SolrExtractRequest, __construct, Solr_no_args, ZEND_ACC_PRIVATE | ZEND_ACC_CTOR) PHP_ME(SolrExtractRequest, __destruct, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrExtractRequest, createFromFile, SolrExtractRequest_createFromFile_args, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrExtractRequest, createFromStream, SolrExtractRequest_createFromStream_args, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrExtractRequest, __clone, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrExtractRequest, __sleep, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrExtractRequest, __wakeup, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* {{{ solr_query_methods. */ static zend_function_entry solr_query_methods[] = { SOLR_CTOR(SolrQuery, __construct, SolrQuery_constructor_args) SOLR_DTOR(SolrQuery, __destruct, Solr_no_args) /* CommonQueryParameters */ PHP_ME(SolrQuery, setQuery, SolrQuery_setQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getQuery, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setStart, SolrQuery_setStart_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getStart, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setRows, SolrQuery_setRows_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getRows, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addField, SolrQuery_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeField, SolrQuery_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addSortField, SolrQuery_addSortField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeSortField, SolrQuery_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getSortFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addFilterQuery, SolrQuery_addFilterQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeFilterQuery, SolrQuery_addFilterQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFilterQueries, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setShowDebugInfo, SolrQuery_setShowDebugInfo_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setExplainOther, SolrQuery_setExplainOther_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTimeAllowed, SolrQuery_setTimeAllowed_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTimeAllowed, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setOmitHeader, SolrQuery_setOmitHeader_args, ZEND_ACC_PUBLIC) /* CoreQueryParameters */ PHP_ME(SolrQuery, setEchoHandler, SolrQuery_setEchoHandler_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setEchoParams, SolrQuery_setEchoParams_args, ZEND_ACC_PUBLIC) /* SimpleFacetParameters */ PHP_ME(SolrQuery, setFacet, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacet, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addFacetField, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeFacetField, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addFacetQuery, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeFacetQuery, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetQueries, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetPrefix, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetPrefix, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetSort, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetSort, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetLimit, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetLimit, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetOffset, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetOffset, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetMinCount, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetMinCount, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetMissing, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetMissing, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetMethod, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetMethod, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetEnumCacheMinDefaultFrequency, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) /* Date Faceting Parameters */ PHP_ME(SolrQuery, addFacetDateField, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeFacetDateField, SolrQuery_facet_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetDateStart, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateStart, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetDateEnd, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateEnd, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetDateGap, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateGap, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setFacetDateHardEnd, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateHardEnd, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addFacetDateOther, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeFacetDateOther, SolrQuery_facet_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getFacetDateOther, SolrQuery_facet_get_1_0_args, ZEND_ACC_PUBLIC) /* SimpleGroupParameters */ PHP_ME(SolrQuery, setGroup, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroup, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addGroupField, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addGroupFunction, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupFunctions, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addGroupQuery, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupQueries, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupLimit, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupLimit, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupOffset, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupOffset, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addGroupSortField, SolrQuery_addSortField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupSortFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupFormat, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupFormat, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupMain, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupMain, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupNGroups, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupNGroups, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupTruncate, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupTruncate, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupFacet, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupFacet, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setGroupCachePercent, SolrQuery_setGroupCachePct_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getGroupCachePercent, Solr_no_args, ZEND_ACC_PUBLIC) /* Collapse Function */ PHP_ME(SolrQuery, collapse, SolrQuery_collapse_args, ZEND_ACC_PUBLIC) /* Expand Componenet */ PHP_ME(SolrQuery, setExpand, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getExpand, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addExpandSortField, SolrQuery_addSortField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeExpandSortField, SolrQuery_addField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getExpandSortFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setExpandRows, SolrQuery_group_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getExpandRows, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setExpandQuery, SolrQuery_setQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getExpandQuery, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addExpandFilterQuery, SolrQuery_addFilterQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeExpandFilterQuery, SolrQuery_addFilterQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getExpandFilterQueries, Solr_no_args, ZEND_ACC_PUBLIC) /* HighlightingParameters */ PHP_ME(SolrQuery, setHighlight, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlight, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightQuery, SolrQuery_setQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightQuery, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addHighlightField, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeHighlightField, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightSnippets, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightSnippets, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightFragsize, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightFragsize, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightMergeContiguous, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightMergeContiguous, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightRequireFieldMatch, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightRequireFieldMatch, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightMaxAnalyzedChars, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightMaxAnalyzedChars, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightAlternateField, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightAlternateField, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightMaxAlternateFieldLength, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightMaxAlternateFieldLength, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightFormatter, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightFormatter, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightSimplePre, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightSimplePre, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightSimplePost, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightSimplePost, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightFragmenter, SolrQuery_hl_2_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightFragmenter, SolrQuery_hl_get_1_0_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightUsePhraseHighlighter, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightUsePhraseHighlighter, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightHighlightMultiTerm, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightHighlightMultiTerm, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightRegexSlop, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightRegexSlop, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightRegexPattern, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightRegexPattern, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setHighlightRegexMaxAnalyzedChars, SolrQuery_hl_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getHighlightRegexMaxAnalyzedChars, Solr_no_args, ZEND_ACC_PUBLIC) /* StatsComponent */ PHP_ME(SolrQuery, setStats, SolrQuery_stats_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getStats, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addStatsField, SolrQuery_stats_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeStatsField, SolrQuery_stats_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getStatsFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addStatsFacet, SolrQuery_stats_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeStatsFacet, SolrQuery_stats_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getStatsFacets, Solr_no_args, ZEND_ACC_PUBLIC) /* MoreLikeThis */ PHP_ME(SolrQuery, setMlt, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMlt, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltCount, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addMltField, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeMltField, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, addMltQueryField, SolrQuery_mlt_2_2_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, removeMltQueryField, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltQueryFields, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMinTermFrequency, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMinTermFrequency, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMinDocFrequency, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMinDocFrequency, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMinWordLength, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMinWordLength, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMaxWordLength, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMaxWordLength, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMaxNumTokens, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMaxNumTokens, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltMaxNumQueryTerms, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltMaxNumQueryTerms, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setMltBoost, SolrQuery_mlt_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getMltBoost, Solr_no_args, ZEND_ACC_PUBLIC) /* TermsComponent */ PHP_ME(SolrQuery, setTerms, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTerms, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsField, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsField, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsLowerBound, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsLowerBound, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsUpperBound, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsUpperBound, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsIncludeLowerBound, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsIncludeLowerBound, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsIncludeUpperBound, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsIncludeUpperBound, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsMinCount, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsMinCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsMaxCount, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsMaxCount, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsPrefix, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsPrefix, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsLimit, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsLimit, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsReturnRaw, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsReturnRaw, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, setTermsSort, SolrQuery_terms_1_1_args, ZEND_ACC_PUBLIC) PHP_ME(SolrQuery, getTermsSort, Solr_no_args, ZEND_ACC_PUBLIC) /* TODO : TermVectorComponent */ PHP_FE_END }; /* }}} */ /* {{{ solr_response_methods. */ static zend_function_entry solr_response_methods[] = { PHP_ME(SolrResponse, getHttpStatus, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getHttpStatusMessage, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, success, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getRequestUrl, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getRawRequestHeaders, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getRawRequest, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getRawResponseHeaders, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getRawResponse, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getDigestedResponse, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, setParseMode, SolrResponse_setParseMode_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getResponse, Solr_no_args, ZEND_ACC_PUBLIC) PHP_ME(SolrResponse, getArrayResponse, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_query_response_methods. */ static zend_function_entry solr_query_response_methods[] = { SOLR_CTOR(SolrQueryResponse, __construct, Solr_no_args) SOLR_DTOR(SolrQueryResponse, __destruct, Solr_no_args) PHP_FE_END }; /* }}} */ /* {{{ solr_update_response_methods. */ static zend_function_entry solr_update_response_methods[] = { SOLR_CTOR(SolrUpdateResponse, __construct, Solr_no_args) SOLR_DTOR(SolrUpdateResponse, __destruct, Solr_no_args) PHP_FE_END }; /* }}} */ /* {{{ solr_ping_response_methods. */ static zend_function_entry solr_ping_response_methods[] = { SOLR_CTOR(SolrPingResponse, __construct, Solr_no_args) SOLR_DTOR(SolrPingResponse, __destruct, Solr_no_args) PHP_ME(SolrPingResponse, getResponse, Solr_no_args, ZEND_ACC_PUBLIC) PHP_FE_END }; /* }}} */ /* {{{ solr_generic_response_methods. */ static zend_function_entry solr_generic_response_methods[] = { SOLR_CTOR(SolrGenericResponse, __construct, Solr_no_args) SOLR_DTOR(SolrGenericResponse, __destruct, Solr_no_args) PHP_FE_END }; /* }}} */ /* {{{ solr_utils_methods. */ static zend_function_entry solr_utils_methods[] = { PHP_ME(SolrUtils, escapeQueryChars, SolrUtils_escapeQueryChars_arg, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrUtils, queryPhrase, SolrUtils_escapeQueryChars_arg, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrUtils, digestXmlResponse, SolrUtils_digestXML_arg, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrUtils, digestJsonResponse, SolrUtils_digestJson_arg, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrUtils, getSolrVersion, Solr_no_args, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_ME(SolrUtils, getSolrStats, Solr_no_args, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_FE_END }; /* }}} */ /* {{{ solr_module_deps */ static zend_module_dep solr_module_deps[] = { ZEND_MOD_REQUIRED(PHP_LIBXML_EXTENSION_NAME) ZEND_MOD_REQUIRED(PHP_JSON_EXTENSION_NAME) ZEND_MOD_END }; /* }}} */ /* {{{ solr_module_entry */ zend_module_entry solr_module_entry = { STANDARD_MODULE_HEADER_EX, NULL, solr_module_deps, PHP_SOLR_EXTENSION_NAME, solr_functions, PHP_MINIT(solr), PHP_MSHUTDOWN(solr), PHP_RINIT(solr), PHP_RSHUTDOWN(solr), PHP_MINFO(solr), PHP_SOLR_DOTTED_VERSION, /* The current extension version number. */ STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_SOLR ZEND_GET_MODULE(solr) #endif /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(solr) { #ifdef ZTS /* As of ZE 2.2.0, this has to be NULL. */ /* It causes a segmentation fault, if it points to an actual function */ /* Probably a bug in the Zend Engine API */ ts_allocate_dtor php_solr_globals_dtor = NULL; #endif zend_class_entry ce; memcpy(&solr_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcpy(&solr_document_field_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcpy(&solr_input_document_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcpy(&solr_client_object_handlers, &solr_input_document_object_handlers, sizeof(zend_object_handlers)); memcpy(&solr_collapse_function_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcpy(&solr_extract_request_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); solr_extract_request_object_handlers.offset = XtOffsetOf(solr_ustream_t, std); solr_collapse_function_object_handlers.clone_obj = solr_collapse_function_object_handler_clone; solr_input_document_object_handlers.clone_obj = solr_document_object_handler_clone; /* solr_object_handlers.read_property = solr_object_read_property; */ solr_object_handlers.write_property = solr_object_write_property; solr_object_handlers.write_dimension = solr_object_write_dimension; solr_object_handlers.unset_property = solr_object_unset_property; solr_object_handlers.unset_dimension = solr_object_unset_dimension; solr_document_field_handlers.write_property = solr_document_field_write_property; solr_document_field_handlers.unset_property = solr_document_field_unset_property; #ifdef ZTS ZEND_INIT_MODULE_GLOBALS(solr, php_solr_globals_ctor, php_solr_globals_dtor); #else php_solr_globals_ctor(&solr_globals); #endif /* Register extension constants */ solr_extension_register_constants(type, module_number); /* Register the SolrObject class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_OBJECT_CLASSNAME, solr_object_methods); solr_ce_SolrObject = zend_register_internal_class(&ce); solr_ce_SolrObject->ce_flags |= ZEND_ACC_FINAL; #if PHP_VERSION_ID >= 80200 solr_ce_SolrObject->ce_flags |= ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES; #endif /* SolrObject implements ArrayAccess */ zend_class_implements(solr_ce_SolrObject, 1, solr_ce_ArrayAccess); /* Register the SolrDocument class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_DOCUMENT_CLASSNAME, solr_document_methods); solr_ce_SolrDocument = zend_register_internal_class(&ce); solr_ce_SolrDocument->ce_flags |= ZEND_ACC_FINAL; /* This internal property will be used to map to this SolrDocument instance */ zend_declare_property_long(solr_ce_SolrDocument, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) -1, 0L, ZEND_ACC_PRIVATE); /* Register SolrDocument class constants */ solr_document_register_class_constants(solr_ce_SolrDocument); /* SolrDocument implements ArrayAccess, Iterator, Serializable */ zend_class_implements(solr_ce_SolrDocument, 3, solr_ce_ArrayAccess, solr_ce_Iterator, solr_ce_Serializable); /* Register the SolrDocumentField class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_DOCUMENT_FIELD_CLASSNAME, solr_document_field_methods); solr_ce_SolrDocumentField = zend_register_internal_class(&ce); solr_ce_SolrDocumentField->ce_flags |= ZEND_ACC_FINAL; /* Register the name, boost and values properties */ zend_declare_property_stringl(solr_ce_SolrDocumentField, SOLR_FIELD_NAME_PROPERTY_NAME, sizeof(SOLR_FIELD_NAME_PROPERTY_NAME)-1, SOLR_SPACE_STRING, sizeof(SOLR_SPACE_STRING)-1, ZEND_ACC_PUBLIC); zend_declare_property_double(solr_ce_SolrDocumentField, SOLR_FIELD_BOOST_PROPERTY_NAME, sizeof(SOLR_FIELD_BOOST_PROPERTY_NAME)-1, 0.0f, ZEND_ACC_PUBLIC); zend_declare_property_null(solr_ce_SolrDocumentField, SOLR_FIELD_VALUES_PROPERTY_NAME, sizeof(SOLR_FIELD_VALUES_PROPERTY_NAME)-1, ZEND_ACC_PUBLIC); /* Register the SolrInputDocument class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_INPUT_DOCUMENT_CLASSNAME, solr_input_document_methods); solr_ce_SolrInputDocument = zend_register_internal_class(&ce); solr_ce_SolrInputDocument->ce_flags |= ZEND_ACC_FINAL; #if PHP_VERSION_ID >= 80200 solr_ce_SolrInputDocument->ce_flags |= ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES; #endif /* This internal property will be used to map to this SolrDocument instance */ zend_declare_property_long(solr_ce_SolrInputDocument, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) -1, 0L, ZEND_ACC_PRIVATE); /* Register SolrInputDocument class constants */ solr_input_document_register_class_constants(solr_ce_SolrInputDocument); /* Register SolrClient Class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_CLIENT_CLASSNAME, solr_client_methods); solr_ce_SolrClient = zend_register_internal_class(&ce); /* solr_ce_SolrClient->ce_flags |= ZEND_ACC_FINAL; */ /* This internal property will be used to map to this SolrClient instance */ zend_declare_property_long(solr_ce_SolrClient, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) -1, 0L, ZEND_ACC_PRIVATE); /* Register SolrClient class constants */ solr_client_register_class_constants(solr_ce_SolrClient); /* Register the SolrParams class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_PARAMS_CLASSNAME, solr_params_methods); solr_ce_SolrParams = zend_register_internal_class(&ce); solr_ce_SolrParams->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; zend_class_implements(solr_ce_SolrParams, 1, solr_ce_Serializable); /* This internal property will be used to map to this SolrParams instance */ zend_declare_property_long(solr_ce_SolrParams, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) -1, 0L, ZEND_ACC_PROTECTED); /* Register the SolrModifiableParams class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_MODIFIABLE_PARAMS_CLASSNAME, solr_modifiable_params_methods); solr_ce_SolrModifiableParams = zend_register_internal_class_ex(&ce, solr_ce_SolrParams); /* Register the SolrQuery class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_QUERY_CLASSNAME, solr_query_methods); solr_ce_SolrQuery = zend_register_internal_class_ex(&ce, solr_ce_SolrModifiableParams); init_solr_dismax_query(); solr_query_register_class_constants(solr_ce_SolrQuery); /* Register SolrExtractRequest */ INIT_CLASS_ENTRY(ce, PHP_SOLR_EXTRACTREQUEST_CLASSNAME, solr_extract_request_methods); solr_ce_SolrExtractRequest = zend_register_internal_class(&ce); solr_ce_SolrExtractRequest->ce_flags |= ZEND_ACC_FINAL; solr_ce_SolrExtractRequest->create_object = solr_extract_create_object_handler; zend_declare_property_long(solr_ce_SolrExtractRequest, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME)-1, 0L, ZEND_ACC_PRIVATE); solr_extract_register_class_constants(solr_ce_SolrExtractRequest); /* Register the SolrCollapseFunction class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_COLLAPSE_FUNCTION_CLASSNAME, solr_collapse_function_methods); solr_ce_SolrCollapseFunction = zend_register_internal_class_ex(&ce, solr_ce_SolrCollapseFunction); zend_declare_property_long(solr_ce_SolrCollapseFunction, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME)-1, 0l, ZEND_ACC_PROTECTED); solr_collapse_function_register_class_constants(solr_ce_SolrCollapseFunction); /* Register the SolrResponse base class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_RESPONSE_CLASSNAME, solr_response_methods); solr_ce_SolrResponse = zend_register_internal_class(&ce); solr_ce_SolrResponse->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; /* Register all the properties for the SolrResponse object */ solr_response_register_class_properties(solr_ce_SolrResponse); /* Register all the constants for the SolrResponse object */ solr_response_register_class_constants(solr_ce_SolrResponse); /* Register the SolrQueryResponse class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_QUERY_RESPONSE_CLASSNAME, solr_query_response_methods); solr_ce_SolrQueryResponse = zend_register_internal_class_ex(&ce, solr_ce_SolrResponse); solr_ce_SolrQueryResponse->ce_flags |= ZEND_ACC_FINAL; /* Register the SolrUpdateResponse class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_UPDATE_RESPONSE_CLASSNAME, solr_update_response_methods); solr_ce_SolrUpdateResponse = zend_register_internal_class_ex(&ce, solr_ce_SolrResponse); solr_ce_SolrUpdateResponse->ce_flags |= ZEND_ACC_FINAL; /* Register the SolrPingResponse class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_PING_RESPONSE_CLASSNAME, solr_ping_response_methods); solr_ce_SolrPingResponse = zend_register_internal_class_ex(&ce, solr_ce_SolrResponse); solr_ce_SolrPingResponse->ce_flags |= ZEND_ACC_FINAL; /* Register the SolrGenericResponse class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_GENERIC_RESPONSE_CLASSNAME, solr_generic_response_methods); solr_ce_SolrGenericResponse = zend_register_internal_class_ex(&ce, solr_ce_SolrResponse); solr_ce_SolrGenericResponse->ce_flags |= ZEND_ACC_FINAL; /* Register the SolrUtils class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_UTILS_CLASSNAME, solr_utils_methods); solr_ce_SolrUtils = zend_register_internal_class(&ce); solr_ce_SolrUtils->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; /* Register the SolrException class */ INIT_CLASS_ENTRY(ce, PHP_SOLR_EXCEPTION_CLASSNAME, solr_exception_methods); solr_ce_SolrException = zend_register_internal_class_ex(&ce, solr_ce_Exception); solr_exception_register_class_properties(solr_ce_SolrException); INIT_CLASS_ENTRY(ce, PHP_SOLR_ILLEGAL_OPERATION_EXCEPTION_CLASSNAME, solr_illegal_operation_exception_methods); solr_ce_SolrIllegalOperationException = zend_register_internal_class_ex(&ce, solr_ce_SolrException); INIT_CLASS_ENTRY(ce, PHP_SOLR_ILLEGAL_ARGUMENT_EXCEPTION_CLASSNAME, solr_illegal_argument_exception_methods); solr_ce_SolrIllegalArgumentException = zend_register_internal_class_ex(&ce, solr_ce_SolrException); INIT_CLASS_ENTRY(ce, PHP_SOLR_CLIENT_EXCEPTION_CLASSNAME, solr_client_exception_methods); solr_ce_SolrClientException = zend_register_internal_class_ex(&ce, solr_ce_SolrException); INIT_CLASS_ENTRY(ce, PHP_SOLR_SERVER_EXCEPTION_CLASSNAME, solr_server_exception_methods); solr_ce_SolrServerException = zend_register_internal_class_ex(&ce, solr_ce_SolrException); INIT_CLASS_ENTRY(ce, PHP_SOLR_MISSING_MANDATORY_PARAMETER_EXCEPTION_CLASSNAME, NULL); solr_ce_SolrMissingMandatoryParameterException = zend_register_internal_class_ex(&ce, solr_ce_SolrException); return SUCCESS; } /* }}} */ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(solr) { zend_bool persistent = SOLR_HASHTABLE_PERSISTENT; /* Initial size of the HashTable */ uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; ALLOC_HASHTABLE(SOLR_GLOBAL(documents)); ALLOC_HASHTABLE(SOLR_GLOBAL(clients)); ALLOC_HASHTABLE(SOLR_GLOBAL(params)); ALLOC_HASHTABLE(SOLR_GLOBAL(functions)); ALLOC_HASHTABLE(SOLR_GLOBAL(ustreams)); /* Initialize the HashTable for directory for SolrInputDocuments */ zend_hash_init(SOLR_GLOBAL(documents), nSize, NULL, solr_destroy_document, persistent); zend_hash_init(SOLR_GLOBAL(clients), nSize, NULL, solr_destroy_client, persistent); /* Initialize the HashTable for directory of SolrParams */ zend_hash_init(SOLR_GLOBAL(params), nSize, NULL, solr_destroy_params, persistent); zend_hash_init(SOLR_GLOBAL(functions), nSize, NULL, solr_destroy_function, persistent); zend_hash_init(SOLR_GLOBAL(ustreams), nSize, NULL, solr_destroy_ustream, persistent); return SUCCESS; } /* }}} */ /* {{{ PHP_RSHUTDOWN_FUNCTION */ PHP_RSHUTDOWN_FUNCTION(solr) { zend_hash_destroy(SOLR_GLOBAL(documents)); zend_hash_destroy(SOLR_GLOBAL(clients)); zend_hash_destroy(SOLR_GLOBAL(params)); zend_hash_destroy(SOLR_GLOBAL(functions)); zend_hash_destroy(SOLR_GLOBAL(ustreams)); FREE_HASHTABLE(SOLR_GLOBAL(documents)); FREE_HASHTABLE(SOLR_GLOBAL(clients)); FREE_HASHTABLE(SOLR_GLOBAL(params)); FREE_HASHTABLE(SOLR_GLOBAL(functions)); FREE_HASHTABLE(SOLR_GLOBAL(ustreams)); return SUCCESS; } /* }}} */ /* {{{ PHP_MSHUTDOWN_FUNCTION */ PHP_MSHUTDOWN_FUNCTION(solr) { return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(solr) { php_info_print_table_start(); php_info_print_table_header(2, "Solr Support", "enabled"); php_info_print_table_row(2, "Version", PHP_SOLR_DOTTED_VERSION); php_info_print_table_row(2, "Last Build Date", __DATE__); php_info_print_table_row(2, "Last Build Time", __TIME__); php_info_print_table_end(); } /* }}} */ #endif /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_client.c0000644000175000017500000017270215001737315015557 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ Macros */ /* resets the key_str with key and tries to find the zv */ static inline int solr_opt_check(HashTable *options_ht, const char * key, zend_string * key_str, zval ** zv) { int result = 0; key_str = zend_string_init(key, strlen (key), 0); result = (*zv = zend_hash_find(options_ht, key_str)) != NULL; zend_string_release(key_str); return result; } /* {{{ static void solr_client_init_urls(solr_client_t *solr_client) */ static void solr_client_init_urls(solr_client_t *solr_client) { solr_string_t url_prefix; solr_client_options_t *options = &(solr_client->options); memset(&url_prefix, 0, sizeof(solr_string_t)); /* Release all previously allocated URL values, if any */ solr_string_free(&(options->update_url)); solr_string_free(&(options->extract_url)); solr_string_free(&(options->search_url)); solr_string_free(&(options->thread_url)); solr_string_free(&(options->ping_url)); solr_string_free(&(options->terms_url)); solr_string_free(&(options->system_url)); solr_string_free(&(options->get_url)); /* Making http://hostname:host_port/path/ */ if (options->secure) { solr_string_append_const(&url_prefix, "https://"); } else { solr_string_append_const(&url_prefix, "http://"); } solr_string_append_solr_string(&url_prefix, &(options->hostname)); solr_string_appendc(&url_prefix, ':'); solr_string_append_long(&url_prefix, options->host_port); solr_string_appendc(&url_prefix, '/'); solr_string_append_solr_string(&url_prefix, &(options->path)); solr_string_appendc(&url_prefix, '/'); /* Copying over the prefixes */ solr_string_append_solr_string(&(options->update_url), &url_prefix); solr_string_append_solr_string(&(options->extract_url), &url_prefix); solr_string_append_solr_string(&(options->search_url), &url_prefix); solr_string_append_solr_string(&(options->thread_url), &url_prefix); solr_string_append_solr_string(&(options->ping_url), &url_prefix); solr_string_append_solr_string(&(options->terms_url), &url_prefix); solr_string_append_solr_string(&(options->system_url), &url_prefix); solr_string_append_solr_string(&(options->get_url), &url_prefix); /* Making http://hostname:host_port/path/servlet/ */ solr_string_append_solr_string(&(options->update_url), &(options->update_servlet)); solr_string_append_solr_string(&(options->extract_url), &(options->extract_servlet)); solr_string_append_solr_string(&(options->search_url), &(options->search_servlet)); solr_string_append_solr_string(&(options->thread_url), &(options->thread_servlet)); solr_string_append_solr_string(&(options->ping_url), &(options->ping_servlet)); solr_string_append_solr_string(&(options->terms_url), &(options->terms_servlet)); solr_string_append_solr_string(&(options->system_url), &(options->system_servlet)); solr_string_append_solr_string(&(options->get_url), &(options->get_servlet)); solr_string_append_const(&(options->update_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->extract_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->search_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->thread_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->ping_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->terms_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->system_url), "/?version=2.2&indent=on&wt="); solr_string_append_const(&(options->get_url), "/?version=2.2&indent=on&wt="); solr_string_append_solr_string(&(options->update_url), &(options->response_writer)); solr_string_append_solr_string(&(options->extract_url), &(options->response_writer)); solr_string_append_solr_string(&(options->search_url), &(options->response_writer)); solr_string_append_solr_string(&(options->thread_url), &(options->response_writer)); solr_string_append_solr_string(&(options->ping_url), &(options->response_writer)); solr_string_append_solr_string(&(options->terms_url), &(options->response_writer)); solr_string_append_solr_string(&(options->system_url), &(options->response_writer)); solr_string_append_solr_string(&(options->get_url), &(options->response_writer)); solr_string_free(&url_prefix); } /* }}} */ /* {{{ static int solr_http_build_query(solr_string_t *buffer, zval *params_objptr, const solr_char_t *delimiter, int delimiter_length) */ static int solr_http_build_query(solr_string_t *buffer, solr_params_t *solr_params, const solr_char_t *delimiter, int delimiter_length) { HashTable *params = NULL; solr_param_t *solr_param = NULL; params = solr_params->params; ZEND_HASH_FOREACH_PTR(params, solr_param) { solr_string_t tmp_values_buffer; memset(&tmp_values_buffer, 0, sizeof(solr_string_t)); solr_param->fetch_func(solr_param, &tmp_values_buffer); solr_string_append_solr_string(buffer, &tmp_values_buffer); solr_string_appends(buffer, delimiter, delimiter_length); solr_string_free(&tmp_values_buffer); } ZEND_HASH_FOREACH_END(); solr_string_remove_last_char(buffer); return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API solr_client_t* solr_init_client(zval * objptr) inititialize solr_client_t and update zval's index */ PHP_SOLR_API solr_client_t *solr_init_client(zval *objptr) { long int client_index = SOLR_UNIQUE_CLIENT_INDEX(); solr_client_t *solr_client = NULL; zend_update_property_long(solr_ce_SolrClient, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, client_index); solr_client = (solr_client_t *) pemalloc(sizeof(solr_client_t), SOLR_CLIENT_PERSISTENT); memset(solr_client, 0, sizeof(solr_client_t)); solr_client->client_index = client_index; if ((solr_client = zend_hash_index_update_ptr(SOLR_GLOBAL(clients), client_index, (void *)solr_client)) == NULL) { pefree(solr_client, SOLR_CLIENT_PERSISTENT); php_error_docref(NULL, E_ERROR, "Error while registering client in HashTable"); return NULL; } return solr_client; } /* }}} */ /******************************************************************************/ /** DEFINITIONS FOR SOLR CLIENT METHODS **/ /******************************************************************************/ /* {{{ proto SolrClient::__construct(array options ) Constructor for SolrClient */ PHP_METHOD(SolrClient, __construct) { zval *options = NULL; zval *objptr = getThis(); HashTable *options_ht = NULL; zval *tmp1 = NULL, *tmp2 = NULL; solr_client_t *solr_client_dest = NULL; solr_client_options_t *client_options = NULL; solr_curl_t *handle = NULL; zend_string *key_str; /* tmp storage to use with zend_hash_find */ key_str = zend_string_init("", 0, 0); size_t num_options = 0; zend_long secure = 0L; long int verify_peer = 0L; long int verify_host = 2L; long int timeout = 30L; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &options) == FAILURE) { zend_string_release(key_str); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter. The client options array is required for a SolrClient instance. It must also be passed as the only parameter"); return; } options_ht = Z_ARRVAL_P(options); num_options = zend_hash_num_elements(options_ht); if (!num_options) { zend_string_release(key_str); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "The SolrClient options cannot be an empty array"); return; } solr_client_dest = solr_init_client(objptr); if (!solr_client_dest) { zend_string_release(key_str); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Unable to initialize solr_client_t "); return; } /* Release the original pointer */ client_options = &(solr_client_dest->options); handle = &(solr_client_dest->handle); solr_init_options(client_options); solr_string_append_const(&(client_options->response_writer), SOLR_XML_RESPONSE_WRITER); solr_string_append_const(&(client_options->update_servlet), SOLR_DEFAULT_UPDATE_SERVLET); solr_string_append_const(&(client_options->extract_servlet), SOLR_DEFAULT_EXTRACT_SERVLET); solr_string_append_const(&(client_options->search_servlet), SOLR_DEFAULT_SEARCH_SERVLET); solr_string_append_const(&(client_options->thread_servlet), SOLR_DEFAULT_THREADS_SERVLET); solr_string_append_const(&(client_options->ping_servlet), SOLR_DEFAULT_PING_SERVLET); solr_string_append_const(&(client_options->terms_servlet), SOLR_DEFAULT_TERMS_SERVLET); solr_string_append_const(&(client_options->system_servlet), SOLR_DEFAULT_SYSTEM_SERVLET); solr_string_append_const(&(client_options->get_servlet), SOLR_DEFAULT_GET_SERVLET); if ( solr_opt_check(options_ht, "wt", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { if (solr_is_supported_response_writer((solr_char_t *)Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1))) { solr_string_set(&(client_options->response_writer), (const solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } else { php_error_docref(NULL, E_WARNING, "Unsupported response writer %s. This value will be ignored", Z_STRVAL_P(tmp1)); } } if (solr_opt_check(options_ht, "secure", key_str, &tmp1)) { if (Z_TYPE_P(tmp1) == IS_TRUE) { secure = (zend_long) 1L; } else if (Z_TYPE_P(tmp1) == IS_LONG) { secure = Z_LVAL_P(tmp1); } } client_options->secure = secure; /** * FOR NOW LET'S LEAVE IT AT 2 : This will force and require a match on the common name * if (secure && zend_hash_find(options_ht, "ssl_verifyhost", sizeof("ssl_verifyhost"), (void**) &tmp1) == SUCCESS && Z_TYPE_P(tmp1) == IS_LONG) { verify_host = ((Z_LVAL_P(tmp1) > 0L && Z_LVAL_P(tmp1) < 3L) ? Z_LVAL_P(tmp1) : verify_host); } */ client_options->ssl_verify_host = verify_host; if (secure && solr_opt_check(options_ht, "ssl_cert", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { verify_peer = 1L; solr_string_appends(&(client_options->ssl_cert), Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } if (secure && solr_opt_check(options_ht, "ssl_key", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { verify_peer = 1L; solr_string_appends(&(client_options->ssl_key), (solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } if (secure && solr_opt_check(options_ht, "ssl_keypassword", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { verify_peer = 1L; solr_string_appends(&(client_options->ssl_keypassword), (solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } // ssl_cainfo if (secure && solr_opt_check(options_ht, "ssl_cainfo", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { verify_peer = 1L; solr_string_appends(&(client_options->ssl_cainfo), (solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } // ssl_capath if (secure && solr_opt_check(options_ht, "ssl_capath", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { verify_peer = 1L; solr_string_appends(&(client_options->ssl_capath), (solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } client_options->ssl_verify_peer = verify_peer; // hostname if (solr_opt_check(options_ht, "hostname", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { solr_string_appends(&(client_options->hostname), (solr_char_t *) Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } else { solr_string_append_const(&(client_options->hostname), SOLR_REQUEST_DEFAULT_HOST); } // port if (solr_opt_check(options_ht, "port", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_LONG) { ZVAL_LONG_ASSIGN_TO_LONG(client_options->host_port, tmp1); } else if (solr_opt_check(options_ht, "port", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { long int host_port = atol(Z_STRVAL_P(tmp1)); if (host_port) { client_options->host_port = host_port; } else { client_options->host_port = SOLR_REQUEST_DEFAULT_PORT; } } else { client_options->host_port = SOLR_REQUEST_DEFAULT_PORT; } if (solr_opt_check(options_ht, "timeout", key_str, &tmp1)) { long int timeout_value = 30L; if (Z_TYPE_P(tmp1) == IS_LONG) { timeout_value = Z_LVAL_P(tmp1); } else if (Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { timeout_value = atol(Z_STRVAL_P(tmp1)); } timeout = ((timeout_value > 0L) ? timeout_value : timeout); } client_options->timeout = timeout; if (solr_opt_check(options_ht, "path", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { char *path_to_solr = Z_STRVAL_P(tmp1); size_t path_to_solr_start = 0; size_t length_adjustment = 0; if (path_to_solr[0] == '/') { path_to_solr_start = length_adjustment = 1; } if (path_to_solr[Z_STRLEN_P(tmp1)] == '/') { length_adjustment++; } solr_string_appends(&(client_options->path), Z_STRVAL_P(tmp1) + path_to_solr_start, Z_STRLEN_P(tmp1) - length_adjustment); } else { solr_string_append_const(&(client_options->path), SOLR_REQUEST_DEFAULT_PATH); } if ( solr_opt_check(options_ht, "query_string_delimiter", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING) { solr_string_appends(&(client_options->qs_delimiter), Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } else { solr_string_append_const(&(client_options->qs_delimiter), SOLR_REQUEST_DEFAULT_QS_DELIMITER); } if ( solr_opt_check(options_ht, "login", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && solr_opt_check(options_ht, "password", key_str, &tmp2) && Z_TYPE_P(tmp2) == IS_STRING) { solr_string_appends(&(client_options->http_auth_credentials), Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); solr_string_appendc(&(client_options->http_auth_credentials), ':'); solr_string_appends(&(client_options->http_auth_credentials), Z_STRVAL_P(tmp2), Z_STRLEN_P(tmp2)); } if (solr_opt_check(options_ht, "proxy_host", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING) { solr_string_appends(&(client_options->proxy_hostname), Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); } if (solr_opt_check(options_ht, "proxy_port", key_str, &tmp1)) { long int proxy_port_value = 0L; if (Z_TYPE_P(tmp1) == IS_LONG) { ZVAL_LONG_ASSIGN_TO_LONG(proxy_port_value, tmp1); } else if (Z_TYPE_P(tmp1) == IS_STRING && Z_STRLEN_P(tmp1)) { proxy_port_value = atol(Z_STRVAL_P(tmp1)); } if (proxy_port_value > 0L) { client_options->proxy_port = proxy_port_value; } } if (solr_opt_check(options_ht, "proxy_login", key_str, &tmp1) && Z_TYPE_P(tmp1) == IS_STRING && solr_opt_check(options_ht, "proxy_password", key_str, &tmp2) && Z_TYPE_P(tmp2) == IS_STRING) { solr_string_appends(&(client_options->proxy_auth_credentials), Z_STRVAL_P(tmp1), Z_STRLEN_P(tmp1)); solr_string_appendc(&(client_options->proxy_auth_credentials), ':'); solr_string_appends(&(client_options->proxy_auth_credentials), Z_STRVAL_P(tmp2), Z_STRLEN_P(tmp2)); } solr_init_handle(handle, client_options); zend_string_free(key_str); SOLR_GLOBAL(client_count)++; } /* }}} */ /* {{{ proto SolrClient::__destruct(void) Destructor for SolrClient */ PHP_METHOD(SolrClient, __destruct) { solr_client_t *solr_client = NULL; if (solr_fetch_client_entry(getThis(), &solr_client) == SUCCESS) { zend_hash_index_del(SOLR_GLOBAL(clients), solr_client->client_index); /* Keep track of how many SolrClient instances we have. */ SOLR_GLOBAL(client_count)--; return ; } } /* }}} */ /* {{{ proto SolrClient::__sleep(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrClient, __sleep) { solr_init_client(getThis()); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1001_MSG); } /* }}} */ /* {{{ proto SolrClient::__wakeup(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrClient, __wakeup) { solr_init_client(getThis()); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1001_MSG); } /* }}} */ /* {{{ proto SolrClient::__clone(void) Should not be called directly. Cloning is not supported. */ PHP_METHOD(SolrClient, __clone) { solr_init_client(getThis()); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "Cloning of SolrClient objects is currently not supported"); } /* }}} */ /* {{{ proto bool SolrClient::setServelet(int servlet_type, string new_value) Changes the specified servlet type to a new value */ PHP_METHOD(SolrClient, setServlet) { long int servlet_type_value = 0L; solr_char_t *new_servlet_value = NULL; COMPAT_ARG_SIZE_T new_servlet_value_length = 0; solr_client_t *client = NULL; solr_servlet_type_t servlet_type = SOLR_SERVLET_TYPE_BEGIN; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &servlet_type_value, &new_servlet_value, &new_servlet_value_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter."); RETURN_FALSE; } if (!new_servlet_value_length) { php_error_docref(NULL, E_WARNING, "Invalid servlet value."); RETURN_FALSE; } /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); RETURN_FALSE; } servlet_type = (solr_servlet_type_t) servlet_type_value; switch(servlet_type) { case SOLR_SERVLET_TYPE_SEARCH : { solr_string_set(&(client->options.search_servlet), new_servlet_value, new_servlet_value_length); } break; case SOLR_SERVLET_TYPE_TERMS : { solr_string_set(&(client->options.terms_servlet), new_servlet_value, new_servlet_value_length); } break; case SOLR_SERVLET_TYPE_UPDATE : { solr_string_set(&(client->options.update_servlet), new_servlet_value, new_servlet_value_length); } break; case SOLR_SERVLET_TYPE_THREADS : { solr_string_set(&(client->options.thread_servlet), new_servlet_value, new_servlet_value_length); } break; case SOLR_SERVLET_TYPE_PING : { solr_string_set(&(client->options.ping_servlet), new_servlet_value, new_servlet_value_length); } break; case SOLR_SERVLET_TYPE_SYSTEM : { solr_string_set(&(client->options.system_servlet), new_servlet_value, new_servlet_value_length); } break; default : { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid Servlet type %ld specified. Value discarded.", servlet_type_value); RETURN_FALSE; } } RETURN_TRUE; } /* }}} */ // client->handle.err.str client->handle.request_body_debug.buffer.str /* {{{ proto SolrQueryResponse SolrClient::query(SolrParams query) Sends a name-value pair request to the Solr server. */ PHP_METHOD(SolrClient, query) { zval *solr_params_obj = NULL; solr_client_t *client = NULL; solr_params_t *solr_params = NULL; solr_string_t *buffer = NULL; solr_char_t *delimiter = NULL; COMPAT_ARG_SIZE_T delimiter_length = 0; zend_bool success = 1; solr_request_type_t solr_request_type = SOLR_REQUEST_SEARCH; solr_string_t *request_url = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &solr_params_obj, solr_ce_SolrParams) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_4000_MSG); return; } /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } /* Make sure the SolrParams object passed is a valid one */ if (solr_fetch_params_entry(solr_params_obj, &solr_params) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrParams parameter passed is not a valid one."); return ; } /* The SolrParams instance must contain at least one parameter */ if (zend_hash_num_elements(solr_params->params) < 1) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrParams parameter passed contains no parameters."); return ; } buffer = &(client->handle.request_body.buffer); /* Get rid of all the data from the previous request */ solr_string_free(buffer); delimiter = client->options.qs_delimiter.str; delimiter_length = client->options.qs_delimiter.len; /* Remove wt if any */ zend_hash_str_del(solr_params->params, "wt", sizeof("wt")-1); if (solr_http_build_query(buffer, solr_params, delimiter, delimiter_length) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1003, SOLR_FILE_LINE_FUNC, "Error building HTTP query from parameters"); return; } /* Always reset the URLs before making any request */ solr_client_init_urls(client); request_url = &(client->options.search_url); /* terms.fl is a required parameter for the TermsComponent */ if (zend_hash_str_exists(solr_params->params, "terms.fl", sizeof("terms.fl")-1)) { /* Change the request type to a TermsComponent request */ solr_request_type = SOLR_REQUEST_TERMS; request_url =&(client->options.terms_url); } /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, solr_request_type) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"query"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrQueryResponse); solr_set_response_object_properties(solr_ce_SolrQueryResponse, return_value, client, request_url, success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::addDocument(SolrInputDocument doc [, bool overwrite [, int commitWithin]]) Adds a document to the Solr server. */ PHP_METHOD(SolrClient, addDocument) { zval *solr_input_doc = NULL; zend_bool overwrite = 1; long int commitWithin = 0L; solr_document_t *doc_entry = NULL; solr_client_t *client = NULL; HashTable *document_fields; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; char *overwriteValue = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|bl", &solr_input_doc, solr_ce_SolrInputDocument, &overwrite, &commitWithin) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter."); return; } if (solr_fetch_document_entry(OBJ_FOR_PROP(solr_input_doc), &doc_entry) == FAILURE) { php_error_docref(NULL, E_WARNING, "SolrInputDocument is not valid. Object not present in HashTable"); return; } document_fields = doc_entry->fields; /* Document must contain at least one field */ if (0 == zend_hash_num_elements(document_fields)) { php_error_docref(NULL, E_WARNING, "SolrInputDocument has no fields"); return; } /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "add", &root_node); overwriteValue = (overwrite)? "true" : "false"; xmlNewProp(root_node, (xmlChar *) "overwrite", (xmlChar *) overwriteValue); if (commitWithin > 0L) { auto char commitWithinBuffer[32]; memset(commitWithinBuffer, 0, sizeof(commitWithinBuffer)); php_sprintf(commitWithinBuffer, "%ld", commitWithin); xmlNewProp(root_node, (xmlChar *) "commitWithin", (xmlChar *) commitWithinBuffer); } solr_add_doc_node(root_node, doc_entry); xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::addDocuments(array docs [, bool overwrite [, int commitWithin]]) Adds an array of SolrInputDocuments to the Solr server. */ PHP_METHOD(SolrClient, addDocuments) { zval *docs_array = NULL; zend_bool overwrite = 1; long int commitWithin = 0L; HashTable *solr_input_docs; size_t num_input_docs = 0; solr_client_t *client = NULL; solr_document_t **doc_entries = NULL; size_t curr_pos = 0U; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; xmlChar *overwriteValue = NULL; size_t pos = 0U; solr_document_t *current_doc_entry = NULL; int format = 1; int size = 0; zend_bool success = 1; xmlChar *request_string = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|bl", &docs_array, &overwrite, &commitWithin) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } solr_input_docs = Z_ARRVAL_P(docs_array); num_input_docs = zend_hash_num_elements(solr_input_docs); if(!num_input_docs) { php_error_docref(NULL, E_WARNING, "The array parameter passed is empty"); return; } /* This should be released if there is an error */ doc_entries = (solr_document_t **) pemalloc((sizeof(solr_document_t *) * (num_input_docs + 1)), SOLR_DOCUMENT_PERSISTENT); memset(doc_entries, 0, sizeof(solr_document_t *) * (num_input_docs + 1)); /* Please check all the SolrInputDocument instances passed via the array */ SOLR_HASHTABLE_FOR_LOOP(solr_input_docs) { zval *solr_input_doc = NULL; solr_document_t *doc_entry = NULL; HashTable *document_fields; solr_input_doc = zend_hash_get_current_data(solr_input_docs); if (Z_TYPE_P(solr_input_doc) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(solr_input_doc), solr_ce_SolrInputDocument)) { SOLR_FREE_DOC_ENTRIES(doc_entries); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u is not a valid SolrInputDocument instance", (curr_pos + 1U)); return; } if (solr_fetch_document_entry(OBJ_FOR_PROP(solr_input_doc), &doc_entry) == FAILURE) { SOLR_FREE_DOC_ENTRIES(doc_entries); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u is not valid. Object not present in HashTable", (curr_pos + 1U)); return; } document_fields = doc_entry->fields; /* SolrInputDocument must contain at least one field */ if (0 == zend_hash_num_elements(document_fields)) { SOLR_FREE_DOC_ENTRIES(doc_entries); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u has no fields", (curr_pos + 1U)); return; } doc_entries[curr_pos] = doc_entry; curr_pos++; } /* Mark the end of the list */ doc_entries[curr_pos] = NULL; /* All the input documents have been validated. We can now retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { SOLR_FREE_DOC_ENTRIES(doc_entries); php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "add", &root_node); overwriteValue = (overwrite) ? (xmlChar *) "true" : (xmlChar *) "false"; xmlNewProp(root_node, (xmlChar *) "overwrite", overwriteValue); if (commitWithin > 0L) { auto char commitWithinBuffer[32]; memset(commitWithinBuffer, 0, sizeof(commitWithinBuffer)); php_sprintf(commitWithinBuffer, "%ld", commitWithin); xmlNewProp(root_node, (xmlChar *) "commitWithin", (xmlChar *) commitWithinBuffer); } /* Grab the first (solr_document_t *) pointer */ current_doc_entry = doc_entries[pos]; while(current_doc_entry != NULL) { solr_add_doc_node(root_node, current_doc_entry); pos++; /* Grab the next (solr_document_t *) pointer */ current_doc_entry = doc_entries[pos]; } /* We are done with the doc_entries pointer */ SOLR_FREE_DOC_ENTRIES(doc_entries); xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::request(string request_string) Allows the user to send a manual XML update request */ PHP_METHOD(SolrClient, request) { solr_char_t *request_string = NULL; COMPAT_ARG_SIZE_T request_length = 0; solr_client_t *client = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &request_string, &request_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (!request_length) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Invalid request length. Request string is empty.", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } /* The update request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), request_string, request_length); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::sendUpdateStream(SolrExtractRequest request) sends an update stream request. */ PHP_METHOD(SolrClient, sendUpdateStream) { zval *request_zv = NULL, *params_zv = NULL; solr_ustream_t *stream = NULL; solr_client_t *client = NULL; solr_string_t *qs_buffer; /* query string buffer */ solr_char_t *delimiter = NULL; size_t delimiter_length = 0L; solr_params_t *params = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &request_zv) == FAILURE) { return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { return; } stream = Z_USTREAM_P(Z_REFVAL_P(request_zv)); params_zv = stream->params; if (params_zv && IS_NULL != Z_TYPE_P(params_zv)) { solr_fetch_params_entry(params_zv, ¶ms); } /* Always reset the URLs before making any request */ solr_client_init_urls(client); qs_buffer = &(client->handle.request_body.buffer); /* Get rid of all the data from the previous request */ solr_string_free(qs_buffer); delimiter = client->options.qs_delimiter.str; delimiter_length = client->options.qs_delimiter.len; if (solr_http_build_query(qs_buffer, params, delimiter, delimiter_length) == FAILURE){ solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1003, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1003_MSG); return; } if (solr_make_update_stream_request(client, stream, qs_buffer) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"extract"); } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.extract_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::deleteById(string id) Allows the user to delete a document by id */ PHP_METHOD(SolrClient, deleteById) { solr_char_t *id = NULL; COMPAT_ARG_SIZE_T id_length = 0L; solr_client_t *client = NULL; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; xmlChar *escaped_id_value = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &id, &id_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (!id_length) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Invalid id parameter", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "delete", &root_node); escaped_id_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) id); xmlNewChild(root_node, NULL, (xmlChar *) "id", escaped_id_value); xmlFree(escaped_id_value); xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::request(array ids) Allows the user to delete a set of documents by ids. This should be an array of strings */ PHP_METHOD(SolrClient, deleteByIds) { zval *ids_array = NULL; HashTable *doc_ids = NULL; size_t num_ids = 0; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; zend_bool invalid_param = 0; size_t error_pos = 1, current_position = 1; solr_client_t *client = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; HashPosition loop_pos; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &ids_array) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } doc_ids = Z_ARRVAL_P(ids_array); num_ids = zend_hash_num_elements(doc_ids); if(!num_ids) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "The array parameter passed is empty", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "delete", &root_node); if (doc_ids->nNumOfElements) { SOLR_HASHTABLE_FOR_LOOP_EX(doc_ids, loop_pos) { zval *id_zval = NULL; id_zval = zend_hash_get_current_data_ex(doc_ids, &loop_pos); if (Z_TYPE_P(id_zval) == IS_STRING && Z_STRLEN_P(id_zval) > 0) { xmlChar *escaped_id_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) Z_STRVAL_P(id_zval)); xmlNewChild(root_node, NULL, (xmlChar *) "id", escaped_id_value); xmlFree(escaped_id_value); } else { invalid_param = 1; /* This id is not a valid string */ error_pos = current_position; goto end_doc_ids_loop; } current_position++; } } end_doc_ids_loop : if (invalid_param) { xmlFreeDoc(doc_ptr); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Id number %u is not a valid string", error_pos); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::deleteByQuery(string query) Allows the user to delete a set of documents matching the query */ PHP_METHOD(SolrClient, deleteByQuery) { solr_char_t *query = NULL; COMPAT_ARG_SIZE_T query_length = 0L; solr_client_t *client = NULL; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; xmlChar *escaped_query_value = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &query, &query_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (!query_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "The query parameter is not a valid id"); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "delete", &root_node); escaped_query_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) query); xmlNewChild(root_node, NULL, (xmlChar *) "query", escaped_query_value); xmlFree(escaped_query_value); xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrQueryResponse SolrClient::getById(string id) Get Document By Id. Utilizes Solr Realtime Get (RTG) */ PHP_METHOD(SolrClient, getById) { solr_client_t *client; solr_char_t *id; COMPAT_ARG_SIZE_T id_len = 0; solr_string_t query_string; int success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &id, &id_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } /* Always reset the URLs before making any request */ solr_client_init_urls(client); solr_string_init(&query_string); solr_string_appends(&query_string, "id=", sizeof("id=")-1); solr_string_appends(&query_string, id, id_len); solr_string_set_ex(&(client->handle.request_body.buffer), query_string.str, query_string.len); if (solr_make_request(client, SOLR_REQUEST_GET) == FAILURE) { /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"get"); success = 0; } object_init_ex(return_value, solr_ce_SolrQueryResponse); solr_set_response_object_properties(solr_ce_SolrQueryResponse, return_value, client, &(client->options.get_url), success); solr_string_free(&query_string); } /* }}} */ /* {{{ proto SolrQueryResponse SolrClient::getByIds(array ids) Get Documents by their Ids. Utilizes Solr Realtime Get (RTG) */ PHP_METHOD(SolrClient, getByIds) { solr_client_t *client; HashTable *ids = NULL; zval *ids_z = NULL; zend_bool invalid_param = 0; solr_string_t query_string; size_t current_position = 0; int success = 1; HashPosition loop_pos; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &ids_z) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_WARNING, "Internal Error: Cannot fetch client object"); return; } ids = Z_ARRVAL_P(ids_z); if (ids->nNumOfElements < 1) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, 4000, SOLR_FILE_LINE_FUNC, "Invalid parameter: at least 1 ID is required. Passed an empty array.", current_position); } /* Always reset the URLs before making any request */ solr_client_init_urls(client); solr_string_init(&query_string); solr_string_appends(&query_string, "ids=", sizeof("ids=")-1); if (ids->nNumOfElements) { SOLR_HASHTABLE_FOR_LOOP_EX(ids, loop_pos) { zval *id_zv = NULL; id_zv = zend_hash_get_current_data_ex(ids, &loop_pos); if (Z_TYPE_P(id_zv) == IS_STRING && Z_STRLEN_P(id_zv) > 0) { solr_string_appends(&query_string, Z_STRVAL_P(id_zv), Z_STRLEN_P(id_zv)); solr_string_appendc(&query_string, ','); } else { invalid_param = 1; goto solr_getbyids_exit; } current_position++; } } solr_getbyids_exit: if (invalid_param) { solr_string_free(&query_string); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, 4000, SOLR_FILE_LINE_FUNC, "Invalid id at position %ld", current_position); return; } solr_string_remove_last_char(&query_string); solr_string_set_ex(&(client->handle.request_body.buffer), query_string.str, query_string.len); if (solr_make_request(client, SOLR_REQUEST_GET) == FAILURE) { /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"get"); success = 0; } object_init_ex(return_value, solr_ce_SolrQueryResponse); solr_set_response_object_properties(solr_ce_SolrQueryResponse, return_value, client, &(client->options.get_url), success); solr_string_set_ex(&(client->handle.request_body.buffer),(solr_char_t *)0x00, 0); solr_string_free(&query_string); } /* }}} */ /* {{{ proto void SolrClient::setResponseWriter(string responseWriter) Allows the user to specify which response writer to use */ PHP_METHOD(SolrClient, setResponseWriter) { solr_char_t *wt = NULL; COMPAT_ARG_SIZE_T wt_length = 0L; solr_client_t *client = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &wt, &wt_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } if (!wt_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "The response writer is not a valid string"); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } if (solr_is_supported_response_writer((const solr_char_t *) wt, wt_length)) { /* The response writer used to present the response from Solr */ solr_string_set(&(client->options.response_writer), (solr_char_t *) wt, wt_length); } else { php_error_docref(NULL, E_WARNING, "Unsupported response writer %s. This value will be ignored", wt); } } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::deleteByQueries(array queries) Allows the user to delete a set of documents matching the queries specified */ PHP_METHOD(SolrClient, deleteByQueries) { zval *queries_array = NULL; HashTable *doc_queries = NULL; size_t num_queries = 0; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; zend_bool invalid_param = 0; size_t error_pos, current_position = 1; solr_client_t *client = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; HashPosition loop_pos; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &queries_array) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } doc_queries = Z_ARRVAL_P(queries_array); num_queries = zend_hash_num_elements(doc_queries); if(!num_queries) { php_error_docref(NULL, E_WARNING, "The array parameter passed is empty"); return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "delete", &root_node); SOLR_HASHTABLE_FOR_LOOP_EX(doc_queries, loop_pos) { zval *query_zval = NULL; query_zval = zend_hash_get_current_data_ex(doc_queries, &loop_pos); if (Z_TYPE_P(query_zval) == IS_STRING && Z_STRLEN_P(query_zval)) { xmlChar *escaped_query_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) Z_STRVAL_P(query_zval)); xmlNewChild(root_node, NULL, (xmlChar *) "query", escaped_query_value); xmlFree(escaped_query_value); } else { invalid_param = 1; /* This query is not a valid string */ error_pos = current_position; goto end_doc_queries_loop; } current_position++; } end_doc_queries_loop : if (invalid_param) { xmlFreeDoc(doc_ptr); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Query number %u is not a valid query string", error_pos); return; } if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::optimize([string maxSegments [, bool softCommit [, bool waitSearcher]]) Sends an optimize XML request to the server. */ PHP_METHOD(SolrClient, optimize) { SOLR_DEFINE_PARSE_PARAM_INT(maxSegmentsZval, maxSegments, maxSegmentsLen, "1"); zend_bool softCommit = 0, waitSearcher = 1; char *softCommitValue, *waitSearcherValue; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; solr_client_t *client = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zbb", &maxSegmentsZval, &softCommit, &waitSearcher) == FAILURE) { #if PHP_MAJOR_VERSION >= 8 RETURN_THROWS(); #else php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; #endif } SOLR_PARSE_PARAM_INT(maxSegmentsZval, maxSegments, maxSegmentsLen, "maxSegments"); softCommitValue = (softCommit)? "true" : "false"; waitSearcherValue = (waitSearcher)? "true" : "false"; doc_ptr = solr_xml_create_xml_doc((xmlChar *) "optimize", &root_node); xmlNewProp(root_node, (xmlChar *) "maxSegments", (xmlChar *) maxSegments); xmlNewProp(root_node, (xmlChar *) "softCommit", (xmlChar *) softCommitValue); xmlNewProp(root_node, (xmlChar *) "waitSearcher", (xmlChar *) waitSearcherValue); if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::commit( [bool softCommit [, bool waitSearcher [, bool expungeDeletes]]]) Sends a commit XML request to the server. */ PHP_METHOD(SolrClient, commit) { zend_bool softCommit = 0, waitSearcher = 1, expungeDeletes = 0; char *softCommitValue, *waitSearcherValue, *expungeDeletesValue; xmlNode *root_node = NULL; xmlDoc *doc_ptr = NULL; solr_client_t *client = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; zend_bool success = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|bbb", &softCommit, &waitSearcher, &expungeDeletes) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); return; } softCommitValue = (softCommit)? "true" : "false"; waitSearcherValue = (waitSearcher)? "true" : "false"; expungeDeletesValue = (expungeDeletes)? "true": "false"; doc_ptr = solr_xml_create_xml_doc((xmlChar *) "commit", &root_node); xmlNewProp(root_node, (xmlChar *) "softCommit", (xmlChar *) softCommitValue); xmlNewProp(root_node, (xmlChar *) "waitSearcher", (xmlChar *) waitSearcherValue); xmlNewProp(root_node, (xmlChar *) "expungeDeletes", (xmlChar *) expungeDeletesValue); if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrUpdateResponse SolrClient::rollback(void) Sends a rollback XML request to the server. */ PHP_METHOD(SolrClient, rollback) { xmlNode *root_node = NULL; zend_bool success = 1; xmlDoc *doc_ptr = NULL; solr_client_t *client = NULL; int format = 1; int size = 0; xmlChar *request_string = NULL; doc_ptr = solr_xml_create_xml_doc((xmlChar *) "rollback", &root_node); if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client from HashTable"); return; } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, &request_string, &size, "UTF-8", format); /* The XML request we are sending to Solr */ solr_string_set(&(client->handle.request_body.buffer), (solr_char_t *) request_string, size); xmlFree(request_string); xmlFreeDoc(doc_ptr); /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_UPDATE) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"update"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrUpdateResponse); solr_set_response_object_properties(solr_ce_SolrUpdateResponse, return_value, client, &(client->options.update_url), success); } /* }}} */ /* {{{ proto SolrPingResponse SolrClient::ping() Sends a HEAD request to check if the server is still up and running. */ PHP_METHOD(SolrClient, ping) { solr_client_t *client = NULL; zend_bool success = 1; /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_PING) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"ping"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrPingResponse); solr_set_response_object_properties(solr_ce_SolrPingResponse, return_value, client, &(client->options.ping_url), success); } /* }}} */ /* {{{ proto SolrGenericResponse SolrClient::threads() Sends a request to get info about threads. */ PHP_METHOD(SolrClient, threads) { zend_bool success = 1; solr_client_t *client = NULL; /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_THREADS) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"threads"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrGenericResponse); solr_set_response_object_properties(solr_ce_SolrGenericResponse, return_value, client, &(client->options.thread_url), success); } /* }}} */ /* {{{ proto SolrGenericResponse SolrClient::info() Sends a request to get system info. */ PHP_METHOD(SolrClient, system) { zend_bool success = 1; solr_client_t *client = NULL; /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } /* Always reset the URLs before making any request */ solr_client_init_urls(client); /* Make the HTTP request to the Solr instance */ if (solr_make_request(client, SOLR_REQUEST_SYSTEM) == FAILURE) { success = 0; /* if there was an error with the http request solr_make_request throws an exception by itself * if it wasn't a curl connection error, throw exception (omars) */ HANDLE_SOLR_SERVER_ERROR(client,"system"); /* SOLR_SHOW_CURL_WARNING; commented by: omars */ } object_init_ex(return_value, solr_ce_SolrGenericResponse); solr_set_response_object_properties(solr_ce_SolrGenericResponse, return_value, client, &(client->options.system_url), success); } /* }}} */ /* {{{ proto array SolrClient::getOptions() Returns all the options for this client. */ PHP_METHOD(SolrClient, getOptions) { solr_client_t *client = NULL; solr_client_options_t *options = NULL; /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } options = &(client->options); array_init(return_value); add_assoc_long(return_value, "timeout", options->timeout); add_assoc_bool(return_value, "secure", (int) options->secure); add_assoc_stringl(return_value, "hostname", options->hostname.str, options->hostname.len); add_assoc_stringl(return_value, "wt", options->response_writer.str, options->response_writer.len); add_assoc_long(return_value, "port", options->host_port); add_assoc_stringl(return_value, "proxy_host", options->proxy_hostname.str, options->proxy_hostname.len); add_assoc_long(return_value, "proxy_port", options->proxy_port); add_assoc_stringl(return_value, "path", options->path.str, options->path.len); add_assoc_stringl(return_value, "http_auth", options->http_auth_credentials.str, options->http_auth_credentials.len); add_assoc_stringl(return_value, "proxy_auth", options->proxy_auth_credentials.str, options->proxy_auth_credentials.len); add_assoc_bool(return_value, "ssl_verify_peer", (int) options->ssl_verify_peer); add_assoc_long(return_value, "ssl_verify_host", options->ssl_verify_host); add_assoc_stringl(return_value, "ssl_cert", options->ssl_cert.str, options->ssl_cert.len); add_assoc_stringl(return_value, "ssl_key", options->ssl_key.str, options->ssl_key.len); add_assoc_stringl(return_value, "ssl_keypassword", options->ssl_keypassword.str, options->ssl_keypassword.len); add_assoc_stringl(return_value, "ssl_cainfo", options->ssl_cainfo.str, options->ssl_cainfo.len); add_assoc_stringl(return_value, "ssl_capath", options->ssl_capath.str, options->ssl_capath.len); } /* }}} */ /* {{{ proto string SolrClient::getDebug() Returns all debug data captured in the process of making the request. */ PHP_METHOD(SolrClient, getDebug) { solr_client_t *client = NULL; solr_curl_t *handle = NULL; /* Retrieve the client entry */ if (solr_fetch_client_entry(getThis(), &client) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to retrieve client"); return; } handle = &(client->handle); if (!handle->debug_data_buffer.len) { RETURN_NULL(); } RETVAL_STRINGL(handle->debug_data_buffer.str, handle->debug_data_buffer.len); } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_collapse_function.c0000644000175000017500000002535015001737315020004 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ proto void SolrFunction::__construct([string field]) Constructor. */ PHP_METHOD(SolrCollapseFunction, __construct) { long int index = SOLR_UNIQUE_FUNCTION_INDEX(); uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; solr_function_t *solr_function_dest = NULL; zval *objptr = getThis(); #ifdef PHP_7 solr_function_dest = pemalloc(sizeof(solr_function_t), SOLR_FUNCTIONS_PERSISTENT); #endif solr_char_t *param_name = (solr_char_t *)"field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("field"); solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if ((solr_function_dest = zend_hash_index_update_ptr(SOLR_GLOBAL(functions),index,(void *) solr_function_dest)) == NULL) { php_error_docref(NULL, E_ERROR, "Error while registering query parameters in HashTable"); return ; } zend_update_property_long(solr_ce_SolrCollapseFunction, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, index); solr_function_dest->function_index = index; solr_function_dest->name_length = strlen("collapse"); solr_function_dest->name = (solr_char_t *)"collapse"; /* Allocated memory for the params HashTable using fast cache for HashTables */ ALLOC_HASHTABLE(solr_function_dest->params); zend_hash_init(solr_function_dest->params, nSize, NULL, (dtor_func_t) solr_destroy_solr_string, SOLR_FUNCTIONS_PERSISTENT); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error Parsing Parameters"); return; } if (field_name_len > 0 ) { solr_solrfunc_update_string(getThis(), param_name, param_name_len, field_name, field_name_len); } Z_OBJ_HT_P(getThis()) = &solr_collapse_function_object_handlers; } /* }}} */ /* {{{ proto void SolrFunction::__destruct(void) Destructor. */ PHP_METHOD(SolrCollapseFunction, __destruct) { solr_function_t *function = NULL; /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_function_entry(getThis(), &function) == SUCCESS ) { zend_hash_index_del(SOLR_GLOBAL(functions), function->function_index); } return; } /* {{{ proto string SolrFunction::setField(string field) Set the field that is being collapsed on. The field must be a single valued String, Int or Float. */ PHP_METHOD(SolrCollapseFunction, setField) { solr_char_t *key = "field", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("field"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getField(void) Get Collapse Field */ PHP_METHOD(SolrCollapseFunction, getField) { solr_char_t *key = "field"; COMPAT_ARG_SIZE_T key_len = sizeof("field"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setMin(string value) Selects the group heads by the min value of a numeric field or function query. */ PHP_METHOD(SolrCollapseFunction, setMin) { solr_char_t *key = "min", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("min"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::setMax(string value) Selects the group heads by the max value of a numeric field or function query. */ PHP_METHOD(SolrCollapseFunction, setMax) { solr_char_t *key = "max", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("max"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getMin(void) Get min parameter */ PHP_METHOD(SolrCollapseFunction, getMin) { solr_char_t *key = "min"; COMPAT_ARG_SIZE_T key_len = sizeof("min"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::getMax(void) Get max parameter */ PHP_METHOD(SolrCollapseFunction, getMax) { solr_char_t *key = "max"; COMPAT_ARG_SIZE_T key_len = sizeof("max"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setSize(void) Sets the initial size of the collapse data structures when collapsing on a numeric field only */ PHP_METHOD(SolrCollapseFunction, setSize) { solr_char_t *key = "size", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("size"), arg_len; zval *tmp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } arg = Z_STRVAL_P(tmp); arg_len = Z_STRLEN_P(tmp); if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getSize(void) Get size parameter */ PHP_METHOD(SolrCollapseFunction, getSize) { solr_char_t *key = "size"; COMPAT_ARG_SIZE_T key_len = sizeof("size"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setHint(void) Set collapse hint Currently there is only one hint available "top_fc", which stands for top level FieldCache */ PHP_METHOD(SolrCollapseFunction, setHint) { solr_char_t *key = "hint", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("hint"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getHint(void) Get Hint */ PHP_METHOD(SolrCollapseFunction, getHint) { solr_char_t *key = "hint"; COMPAT_ARG_SIZE_T key_len = sizeof("hint"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setNullPolicy(void) Sets the NULL Policy. Accepts ignore, expand, or collapse */ PHP_METHOD(SolrCollapseFunction, setNullPolicy) { solr_char_t *key = "nullPolicy", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("nullPolicy"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getNullPolicy(void) Get NullPolicy */ PHP_METHOD(SolrCollapseFunction, getNullPolicy) { solr_char_t *key = "nullPolicy"; COMPAT_ARG_SIZE_T key_len = sizeof("nullPolicy"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::__toString(void) String value of the function object */ PHP_METHOD(SolrCollapseFunction, __toString) { solr_function_t *collapse_func; solr_string_t *buffer = NULL; if(solr_fetch_function_entry(getThis(), &collapse_func) == FAILURE) { RETURN_NULL(); } buffer = (solr_string_t *)emalloc(sizeof(solr_string_t)); memset(buffer, 0, sizeof(solr_string_t)); solr_solrfunc_to_string(collapse_func, &buffer); ZVAL_STRINGL(return_value, buffer->str, buffer->len); solr_string_free(buffer); efree(buffer); } /* }}} */ /* {{{ proto SolrClient::__sleep(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrCollapseFunction, __sleep) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, "Serialization of SolrCollapseFunction objects is currently not supported"); } /* }}} */ /* {{{ proto SolrClient::__wakeup(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrCollapseFunction, __wakeup) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, "Unserialization of SolrCollapseFunction objects is currently not supported"); } /* }}} */ /* {{{ throw exception on cloning (clone handler) */ #if PHP_VERSION_ID < 80000 zend_object* solr_collapse_function_object_handler_clone(zval *object) #else zend_object* solr_collapse_function_object_handler_clone(zend_object *object) #endif { zend_object *fake; fake = zend_objects_new(zend_standard_class_def); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "Cloning of SolrCollapseFunction objects is currently not supported"); return fake; } /* }}} */ solr-2.8.1/src/php_solr_document.c0000644000175000017500000011643115001737315016114 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /** ************************************************************************ **/ /** DEFINITIONS FOR SOLR DOCUMENT METHODS **/ /** ************************************************************************ **/ /* {{{ static int solr_document_set_field(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length, solr_char_t *field_value, COMPAT_ARG_SIZE_T field_value_length) */ static int solr_document_set_field(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length, solr_char_t *field_value, COMPAT_ARG_SIZE_T field_value_length) { double field_boost = 0.0f; solr_document_t *doc_entry = NULL; if (!field_name_length) { return FAILURE; } if (!field_value_length) { return FAILURE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(objptr), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; zval *tmp; /* If the field already exists in the SolrDocument instance append the value to the field list queue */ if ((field_values = zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) != NULL) { if (solr_document_insert_field_value(field_values, field_value, field_boost) == FAILURE) { return FAILURE; } } else { /* Otherwise, create a new one and add it to the hash table */ field_values = (solr_field_list_t *) pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); memset(field_values, 0, sizeof(solr_field_list_t)); field_values->count = 0L; field_values->field_boost = 0.0; field_values->field_name = (solr_char_t *) pestrdup(field_name,SOLR_DOCUMENT_FIELD_PERSISTENT); field_values->head = NULL; field_values->last = NULL; if (solr_document_insert_field_value(field_values, field_value, field_boost) == FAILURE) { solr_destroy_field_list(field_values); return FAILURE; } if ((tmp = zend_hash_str_add_ptr(doc_entry->fields, field_name, field_name_length, field_values)) == NULL) { solr_destroy_field_list(field_values); return FAILURE; } /* Increment field count only when HEAD is added */ doc_entry->field_count++; } return SUCCESS; } return FAILURE; } /* }}} */ /* {{{ static int solr_document_get_field(zval *objptr, zval *return_value, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) */ static int solr_document_get_field(zval *objptr, zval *return_value, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) { solr_document_t *doc_entry = NULL; if (!field_name_length) { return FAILURE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(objptr), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; if ((field_values = zend_hash_str_find_ptr(doc_entry->fields, (char *)field_name, field_name_length)) != NULL) { solr_create_document_field_object(field_values, &return_value); /* The field was retrieved, so we're done here */ return SUCCESS; } return FAILURE; } return FAILURE; } /* }}} */ /* {{{ static int solr_document_remove_field(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) */ static int solr_document_remove_field(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) { solr_document_t *doc_entry = NULL; if (!field_name_length) { return FAILURE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(objptr), &doc_entry) == SUCCESS) { if (zend_hash_str_del(doc_entry->fields, field_name, field_name_length) == SUCCESS) { doc_entry->field_count--; return SUCCESS; } return FAILURE; } return FAILURE; } /* }}} */ /* {{{ static int solr_document_field_exists(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) */ static int solr_document_field_exists(zval *objptr, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_length) { solr_document_t *doc_entry = NULL; if (!field_name_length) { return FAILURE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(objptr), &doc_entry) == SUCCESS) { if (zend_hash_str_exists(doc_entry->fields, field_name, field_name_length)) { return SUCCESS; } else { return FAILURE; } } return FAILURE; } /* }}} */ /* {{{ static void solr_serialize_document_object(HashTable *document_fields, xmlChar **buffer, int *size) */ static void solr_serialize_document_object(HashTable *document_fields, xmlChar **buffer, int *size) { xmlNode *root_node = NULL, *fields_node = NULL; xmlDoc *doc_ptr = NULL; int format = 1; if(!buffer) { return; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "solr_document", &root_node); fields_node = xmlNewChild(root_node, NULL, (xmlChar *) "fields", NULL); SOLR_HASHTABLE_FOR_LOOP(document_fields) { solr_field_list_t *field = NULL; solr_char_t *doc_field_name = NULL; solr_field_value_t *doc_field_value = NULL; xmlNode *field_node = NULL; field = zend_hash_get_current_data_ptr(document_fields); doc_field_name = field->field_name; doc_field_value = field->head; field_node = xmlNewChild(fields_node, NULL, (xmlChar *) "field", NULL); xmlNewProp(field_node, (xmlChar *) "name", (xmlChar *) doc_field_name); /* Loop through all the values for this field */ while(doc_field_value != NULL) { xmlChar *escaped_field_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) doc_field_value->field_value); xmlNewChild(field_node, NULL, (xmlChar *) "field_value", escaped_field_value); /* Release the memory allocated by xmlEncodeEntitiesReentrant */ xmlFree(escaped_field_value); /* Grab the next value for this field if any */ doc_field_value = doc_field_value->next; } /* while(doc_field_value != NULL) */ } /* SOLR_HASHTABLE_FOR_LOOP(document_fields) */ xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, buffer, size, "UTF-8", format); xmlFreeDoc(doc_ptr); } /* }}} */ /* {{{ static void solr_unserialize_document_field(HashTable *document_fields, xmlNode *field_node) */ static void solr_unserialize_document_field(HashTable *document_fields, xmlNode *field_node) { solr_char_t *field_name = NULL; xmlNode *xml_curr_value = NULL; solr_field_list_t *field_values = (solr_field_list_t *) pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); zend_string *field_str; memset(field_values, 0, sizeof(solr_field_list_t)); field_name = (solr_char_t *) solr_xml_get_node_contents(field_node->properties); field_values->count = 0L; field_values->field_boost = 0.0f; field_values->field_name = (solr_char_t *) pestrdup(field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); field_values->head = NULL; field_values->last = NULL; /* Grab the first field node */ xml_curr_value = field_node->children; /* Looping through all the field_value nodes */ while(xml_curr_value != NULL) { /* No assumptions. It must be the field value nodes */ if (xml_curr_value->type == XML_ELEMENT_NODE && solr_xml_match_node(xml_curr_value, "field_value")) { solr_char_t *field_value = (solr_char_t *) solr_xml_get_node_contents(xml_curr_value); /* Add this value to the list of values */ if (solr_document_insert_field_value(field_values, field_value, 0.0f) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error adding field value during SolrDocument unserialization"); } } /* Move to the next field_value */ xml_curr_value = xml_curr_value->next; } field_str = zend_string_init(field_name, strlen(field_name), SOLR_DOCUMENT_FIELD_PERSISTENT); /* All the values have been retrieved for this field. Now let's drop the field in the HashTable */ if ((field_values = zend_hash_add_new_ptr(document_fields, field_str, (void *) field_values)) == NULL) { zend_string_release(field_str); solr_destroy_field_list(field_values); php_error_docref(NULL, E_WARNING, "Error adding field values to HashTable during SolrDocument unserialization"); return; } zend_string_release(field_str); } /* }}} */ /* {{{ static int solr_unserialize_child_documents(xmlDoc *doc, solr_document_t *doc_entry) * 1. retrieve doc hashes * 2. base64_decode * 3. unserialize (call php method) * 4. add child to solr_doc_t.children */ static int solr_unserialize_child_documents(xmlDoc *doc, solr_document_t *doc_entry) { xmlXPathContext *xp_ctx = NULL; xmlXPathObject *xp_obj = NULL; xmlNodeSet *result = NULL; xmlChar *hash, *xp_expression; int num_nodes = 0, idx = 0; /* unserialize vars */ php_unserialize_data_t var_hash; zval solr_doc_zv; xp_expression = (xmlChar *)"/solr_document/child_docs/dochash"; xp_ctx = xmlXPathNewContext(doc); xp_obj = xmlXPathEvalExpression(xp_expression, xp_ctx); result = xp_obj->nodesetval; num_nodes = result->nodeNr; if (num_nodes > 0) { for (;idx < num_nodes; idx++) { zend_string *sdoc_str; /* serialized document string */ unsigned char *sdoc_copy, *str_end; hash = result->nodeTab[idx]->children->content; sdoc_str = (zend_string *)php_base64_decode((const unsigned char*)hash, strlen((char *)hash)); memset(&var_hash, 0, sizeof(php_unserialize_data_t)); PHP_VAR_UNSERIALIZE_INIT(var_hash); sdoc_copy = (unsigned char *)sdoc_str->val; str_end = (unsigned char *) (sdoc_copy + strlen((const char *)sdoc_copy)); if (!php_var_unserialize(&solr_doc_zv, (const unsigned char **)&sdoc_copy, str_end, &var_hash)){ PHP_VAR_UNSERIALIZE_DESTROY(var_hash); php_error_docref(NULL, E_ERROR, "Unable to unserialize child document"); xmlXPathFreeContext(xp_ctx); xmlXPathFreeObject(xp_obj); zend_string_release(sdoc_str); return FAILURE; } zend_string_release(sdoc_str); if (zend_hash_next_index_insert(doc_entry->children, &solr_doc_zv) == NULL) { php_error_docref(NULL, E_ERROR, "Unable to add child document to parent document post-unserialize"); } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } } xmlXPathFreeContext(xp_ctx); xmlXPathFreeObject(xp_obj); return SUCCESS; } /* }}} */ static int solr_unserialize_document_fields(xmlDoc *doc, HashTable *document_fields) { xmlXPathContext *xpathctxt = NULL; xmlChar *xpath_expression = NULL; xmlXPathObject *xpathObj = NULL; xmlNodeSet *result = NULL; register size_t num_nodes = 0U; register size_t i = 0U; xpathctxt = xmlXPathNewContext(doc); if (!xpathctxt) { xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "A valid XML xpath context could not be created"); return FAILURE; } xpath_expression = (xmlChar *) "/solr_document/fields/field/@name"; xpathObj = xmlXPathEval(xpath_expression, xpathctxt); if (!xpathObj) { xmlXPathFreeContext(xpathctxt); xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "A valid XML xpath object could not be created from the expression"); return FAILURE; } result = xpathObj->nodesetval; if (!result) { xmlXPathFreeContext(xpathctxt); xmlXPathFreeObject(xpathObj); xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Document has no fields"); return FAILURE; } num_nodes = result->nodeNr; i = 0U; if (!num_nodes) { xmlXPathFreeContext(xpathctxt); xmlXPathFreeObject(xpathObj); xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Document has no fields"); return FAILURE; } for (i = 0U; i < num_nodes; i++) { xmlNode *currNode = result->nodeTab[i]; /* Absolutely No assumptions. I have to make sure that this is the name attribute */ if (currNode->type == XML_ATTRIBUTE_NODE && solr_xml_match_node(currNode, "name")) { /* Get the field node */ xmlNode *field_xml_node = currNode->parent; /* Retrieve all the values for this field and put them in the HashTable */ solr_unserialize_document_field(document_fields, field_xml_node); } } xmlXPathFreeContext(xpathctxt); xmlXPathFreeObject(xpathObj); return SUCCESS; } /* {{{ static int solr_unserialize_document_object(HashTable *document_fields, char *serialized, int size) */ static int solr_unserialize_document_object(solr_document_t *doc_entry, char *serialized, int size) { xmlDoc *doc = NULL; doc = xmlReadMemory(serialized, size, NULL, "UTF-8", 0); if (!doc) { php_error_docref(NULL, E_WARNING, "The serialized document string is invalid"); return FAILURE; } if (solr_unserialize_document_fields(doc, doc_entry->fields) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to unserialize document fields"); return FAILURE; } if (solr_unserialize_child_documents(doc, doc_entry) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to unserialize document fields"); return FAILURE; } xmlFreeDoc(doc); return SUCCESS; } /* }}} */ /* {{{ proto void SolrDocument::__construct(void) SolrDocument constructor */ PHP_METHOD(SolrDocument, __construct) { zval *objptr = getThis(); zend_ulong document_index = SOLR_UNIQUE_DOCUMENT_INDEX(); if (solr_init_document(document_index) == NULL) { return; } /* Set the value of the internal id property */ zend_update_property_long(solr_ce_SolrDocument, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, document_index); /* Overriding the default object handlers */ Z_OBJ_HT_P(objptr) = &solr_input_document_object_handlers; } /* }}} */ /* {{{ proto void SolrDocument::__destruct(void) Destructor for SolrDocument */ PHP_METHOD(SolrDocument, __destruct) { solr_document_t *doc_entry = NULL; /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { zend_hash_index_del(SOLR_GLOBAL(documents), doc_entry->document_index); /* Keep track of how many SolrDocument instances we currently have */ SOLR_GLOBAL(document_count)--; return ; } } /* }}} */ /* {{{ proto SolrDocument::__clone(void) Clone method for SolrDocument */ PHP_METHOD(SolrDocument, __clone) { RETURN_NULL(); } /* }}} */ /* {{{ proto SolrDocument::__set(string fieldname, string field_value) Magic method for setting field names. */ PHP_METHOD(SolrDocument, __set) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_char_t *field_value = NULL; COMPAT_ARG_SIZE_T field_value_length = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &field_name, &field_name_length, &field_value, &field_value_length) == FAILURE) { RETURN_FALSE; } if (solr_document_set_field(getThis(), field_name, field_name_length, field_value, field_value_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto SolrDocumentField SolrDocument::__get(string fieldname) Magic method for getting a field. */ PHP_METHOD(SolrDocument, __get) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_get_field(getThis(), return_value, field_name, field_name_length) == FAILURE) { RETURN_NULL(); } } /* }}} */ /* {{{ proto bool SolrDocument::__isset(string field_name) Checks if a field exists */ PHP_METHOD(SolrDocument, __isset) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_field_exists(getThis(), field_name, field_name_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrDocument::__unset(string fieldname) Removes a field from the document. */ PHP_METHOD(SolrDocument, __unset) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_remove_field(getThis(), field_name, field_name_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto void SolrDocument::offsetSet(string field_name, string field_value) Sets the specified field in the document */ PHP_METHOD(SolrDocument, offsetSet) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_char_t *field_value = NULL; COMPAT_ARG_SIZE_T field_value_length = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &field_name, &field_name_length, &field_value, &field_value_length) == FAILURE) { return; } if (solr_document_set_field(getThis(), field_name, field_name_length, field_value, field_value_length) == SUCCESS) { return; } } /* }}} */ /* {{{ proto SolrDocumentField SolrDocument::offsetGet(string field_name) Returns the request field. */ PHP_METHOD(SolrDocument, offsetGet) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_get_field(getThis(), return_value, field_name, field_name_length) == FAILURE) { RETURN_NULL(); } } /* }}} */ /* {{{ proto bool SolrDocument::offsetExists(string fieldname) Checks if the request field exists in the document */ PHP_METHOD(SolrDocument, offsetExists) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_field_exists(getThis(), field_name, field_name_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto void SolrDocument::offsetUnset(string fieldname) Removes the specified field from the document */ PHP_METHOD(SolrDocument, offsetUnset) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { return; } if (solr_document_remove_field(getThis(), field_name, field_name_length) == SUCCESS) { return; } } /* }}} */ /* {{{ proto void SolrDocument::rewind(void) Resets the internal pointer. */ PHP_METHOD(SolrDocument, rewind) { solr_document_t *doc_entry = NULL; HashTable *doc_fields = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } doc_fields = doc_entry->fields; zend_hash_internal_pointer_reset(doc_fields); } /* }}} */ /* {{{ proto SolrDocumentField SolrDocument::current(void) Retrieves the current field. */ PHP_METHOD(SolrDocument, current) { solr_document_t *doc_entry = NULL; HashTable *doc_fields = NULL; solr_field_list_t *field_values = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } doc_fields = doc_entry->fields; field_values = zend_hash_get_current_data_ptr(doc_fields); if(field_values && field_values ) { solr_create_document_field_object(field_values, &return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrDocument::key(void) Retrieves the current key. */ PHP_METHOD(SolrDocument, key) { solr_document_t *doc_entry = NULL; zend_ulong num_index = 0L; HashTable *doc_fields = NULL; zend_string *field_name_str; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } doc_fields = doc_entry->fields; if (zend_hash_get_current_key(doc_fields, &field_name_str, &num_index)) { RETURN_STR_COPY(field_name_str); } } /* }}} */ /* {{{ proto void SolrDocument::next(void) Moves the internal pointer to the next field. */ PHP_METHOD(SolrDocument, next) { solr_document_t *doc_entry = NULL; HashTable *doc_fields = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } doc_fields = doc_entry->fields; zend_hash_move_forward(doc_fields); } /* }}} */ /* {{{ proto bool SolrDocument::valid(void) Checks if the current internal pointer position is still valid. */ PHP_METHOD(SolrDocument, valid) { solr_document_t *doc_entry = NULL; HashTable *doc_fields = NULL; zend_bool is_valid = 0; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } doc_fields = doc_entry->fields; is_valid = (zend_bool) ( SUCCESS == zend_hash_has_more_elements(doc_fields) ); RETURN_BOOL(is_valid); } /* }}} */ /* {{{ proto string SolrDocument::serialize(void) Custom SolrDocument serializer. Returns an XML document string representing the object. */ PHP_METHOD(SolrDocument, serialize) { solr_document_t *doc_entry = NULL; HashTable *doc_fields = NULL; char *serialized = NULL; int size = 0; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { /* todo error here */ RETURN_NULL(); } doc_fields = doc_entry->fields; solr_serialize_document_object(doc_fields, (xmlChar **) &serialized, &size); if (size) { RETVAL_STRINGL(serialized, size); xmlFree(serialized); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto array SolrDocument::__serialize(void) New serializer. Returns an array with xml=>self::serialize() */ #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrDocument, __serialize) { zend_object *object = Z_OBJ_P(getThis()); zval serialized; zend_call_method_with_0_params(object, object->ce, NULL, "serialize", &serialized); if (Z_TYPE(serialized) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Internal serialize call failed", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } array_init(return_value); add_assoc_zval(return_value, "xml", &serialized); } #endif /* }}} */ /* {{{ proto void SolrDocument::__unserialize(array data) New unserializer. */ #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrDocument, __unserialize) { HashTable *data_hash; zend_string *key_str = zend_string_init("xml", sizeof("xml") -1, 1); zend_object *object = NULL; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", &data_hash) == FAILURE) { zend_string_release(key_str); solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Invalid unserialize data", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } if ((tmp = zend_hash_find(data_hash, key_str)) == NULL) { zend_string_release(key_str); solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Failed to find xml in serialized data", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } zend_string_release(key_str); object = Z_OBJ_P(getThis()); zend_call_method_with_1_params(object, object->ce, NULL, "unserialize", NULL, tmp); } #endif /* }}} */ /* {{{ proto void SolrDocument::unserialize(string serialized_xml) Custom SolrDocument unserializer. Brings the object back to life. */ PHP_METHOD(SolrDocument, unserialize) { solr_char_t *serialized = NULL; COMPAT_ARG_SIZE_T serialized_length = 0; zval *objptr = getThis(); zend_ulong document_index = SOLR_UNIQUE_DOCUMENT_INDEX(); solr_document_t *doc_entry = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &serialized, &serialized_length) == FAILURE) { RETURN_FALSE; } doc_entry = solr_init_document(document_index); /* Set the value of the internal id property */ zend_update_property_long(solr_ce_SolrDocument, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, document_index); /* Overriding the default object handlers */ Z_OBJ_HT_P(objptr) = &solr_input_document_object_handlers; if (solr_unserialize_document_object(doc_entry, serialized, serialized_length) == FAILURE) { return; } doc_entry->field_count = zend_hash_num_elements(doc_entry->fields); } /* }}} */ /* {{{ proto bool SolrDocument::clear(void) Resets the current object. Discards all the fields and resets the document boost to zero. */ PHP_METHOD(SolrDocument, clear) { solr_document_t *doc_entry = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { doc_entry->document_boost = 0.0; doc_entry->field_count = 0L; zend_hash_clean(doc_entry->fields); RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrDocument::addField(string fieldname, string value) Adds a field to the document */ PHP_METHOD(SolrDocument, addField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_char_t *field_value = NULL; COMPAT_ARG_SIZE_T field_value_length = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &field_name, &field_name_length, &field_value, &field_value_length) == FAILURE) { RETURN_FALSE; } if (solr_document_set_field(getThis(), field_name, field_name_length, field_value, field_value_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto array SolrDocument::getFieldNames(void) Returns an array of fields names in the document. */ PHP_METHOD(SolrDocument, getFieldNames) { solr_document_get_field_names(INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ /* {{{ proto int SolrDocument::getFieldCount(void) Returns the number of fields in this document. Multi-value fields are only counted once. */ PHP_METHOD(SolrDocument, getFieldCount) { solr_document_t *doc_entry = NULL; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { RETURN_LONG(zend_hash_num_elements(doc_entry->fields)); } RETURN_FALSE; } /* }}} */ /* {{{ proto SolrDocumentField SolrDocument::getField(string fieldname) Retrieves the requested field */ PHP_METHOD(SolrDocument, getField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_get_field(getThis(), return_value, field_name, field_name_length) == FAILURE) { RETURN_FALSE; } } /* }}} */ /* {{{ proto array SolrDocument::toArray(void) Returns an array representation of the SolrDocument object. */ PHP_METHOD(SolrDocument, toArray) { solr_document_t *doc_entry = NULL; zval arr_tmp; zval *fields_array = &arr_tmp; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { HashTable *fields_ht; #ifndef PHP_7 MAKE_STD_ZVAL(fields_array); #endif array_init(return_value); array_init(fields_array); add_assoc_double(return_value, "document_boost", doc_entry->document_boost); add_assoc_long(return_value, "field_count", doc_entry->field_count); add_assoc_zval(return_value, "fields", fields_array); fields_ht = doc_entry->fields; SOLR_HASHTABLE_FOR_LOOP(fields_ht) { solr_field_list_t *field = NULL; zval current_field_tmp; zval *current_field = ¤t_field_tmp; #ifndef PHP_7 MAKE_STD_ZVAL(current_field); #endif field = zend_hash_get_current_data_ptr(fields_ht); solr_create_document_field_object(field, ¤t_field); add_next_index_zval(fields_array, current_field); } /* We are done */ return; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrDocument::fieldExists(string fieldname) Checks if the field exists. */ PHP_METHOD(SolrDocument, fieldExists) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_field_exists(getThis(), field_name, field_name_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrDocument::deleteField(string field_name) Removes the requested field. */ PHP_METHOD(SolrDocument, deleteField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (solr_document_remove_field(getThis(), field_name, field_name_length) == SUCCESS) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrDocument::sort(int sort_criterion [, int sort_direction]) Sorts the fields in the document */ PHP_METHOD(SolrDocument, sort) { long int order_by = 0L; long int sort_direction = SOLR_SORT_ASC; solr_document_t *doc_entry = NULL; int renumber = 0; /* The pointer to the comparison function used by zend_qsort */ #if PHP_VERSION_ID < 80000 compare_func_t comparison_function = NULL; #else bucket_compare_func_t comparison_function = NULL; #endif if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &order_by, &sort_direction) == FAILURE) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { RETURN_FALSE; } /* {{{ Select the appropriate comparison function */ switch(order_by) { case SOLR_SORT_FIELD_NAME : /* Sorting by field name */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_name; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_name; break; } } break; /* case SOLR_SORT_FIELD_NAME */ case SOLR_SORT_FIELD_VALUE_COUNT : /* Sorting by number of values per field */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_value_count; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_value_count; break; } } break; /* case SOLR_SORT_FIELD_VALUE_COUNT */ case SOLR_SORT_FIELD_BOOST_VALUE : /* Sorting by field boost values */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_boost_value; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_boost_value; break; } } break; /* case SOLR_SORT_FIELD_BOOST_VALUE */ default : /* Undefined sort criteria */ RETURN_FALSE; break; } /* }}} switch(order_by) */ /* Undefined sort direction. It was not ASC or DESC */ if (!comparison_function) { RETURN_FALSE; } zend_hash_sort(doc_entry->fields, comparison_function, renumber); RETURN_TRUE; } /* }}} */ /* {{{ proto bool SolrDocument::merge(SolrDocument source [, bool override]) Merges source to the current SolrDocument. */ PHP_METHOD(SolrDocument, merge) { solr_document_t *destination_document = NULL; solr_document_t *source_document = NULL; copy_ctor_func_t p_copy_ctor = (copy_ctor_func_t) field_copy_constructor; /* The destination SolrDocument instance */ zval *destination_document_zval = getThis(); /* The source SolrDocument instance */ zval *source_document_zval = NULL; /* Should we skip fields that already exist in destination */ zend_bool overwrite = (zend_bool) 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|b", &source_document_zval, solr_ce_SolrDocument, &overwrite) == FAILURE) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(source_document_zval), &source_document) == FAILURE) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(destination_document_zval), &destination_document) == FAILURE) { RETURN_FALSE; } if (zend_hash_num_elements(source_document->fields) == 0) { php_error_docref(NULL, E_WARNING, "Source SolrDocument has no fields. Source"); RETURN_FALSE; } /* TODO child documents */ /* Copy the fields in the source HashTable to the destination HashTable */ zend_hash_merge(destination_document->fields, source_document->fields, p_copy_ctor, (int) overwrite); /* Update the field count */ destination_document->field_count = (uint32_t) zend_hash_num_elements(destination_document->fields); RETURN_TRUE; } /* }}} */ static void solr_add_child_input_documents_from_documents(HashTable * children, solr_document_t *new_doc_entry) { SOLR_HASHTABLE_FOR_LOOP(children) { zval solr_input_doc; zval *solr_doc = zend_hash_get_current_data(children); zend_call_method_with_0_params(OBJ_FOR_PROP(solr_doc), Z_OBJCE_P(solr_doc), NULL, "getinputdocument", &solr_input_doc); if (zend_hash_next_index_insert(new_doc_entry->children, &solr_input_doc) == NULL) { php_error_docref(NULL, E_ERROR, "Unable to convert child SolrDocument to SolrInputDocument"); } } } /* {{{ proto SolrInputDocument SolrDocument::getInputDocument(void) Returns a SolrInputDocument equivalent of the object. */ PHP_METHOD(SolrDocument, getInputDocument) { zval *objptr = getThis(); solr_document_t new_solr_doc; solr_document_t *new_doc_entry = NULL, *old_doc_entry = NULL; memset(&new_solr_doc, 0, sizeof(solr_document_t)); new_doc_entry = &new_solr_doc; /* Retrieve the document entry for the original SolrDocument */ if (solr_fetch_document_entry(OBJ_FOR_PROP(objptr), &old_doc_entry) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrDocument could not be fetched."); return; } object_init_ex(return_value, solr_ce_SolrInputDocument); if ((new_doc_entry = solr_input_doc_ctor(return_value))== NULL) { php_error_docref(NULL, E_ERROR, "SolrInputDocument could not be created."); } /* Duplicate the doc_entry contents */ new_doc_entry->field_count = old_doc_entry->field_count; new_doc_entry->document_boost = old_doc_entry->document_boost; /* Initializing the hash table used for storing fields in this SolrDocument */ /* Copy the contents of the old fields HashTable to the new SolrDocument */ zend_hash_copy(new_doc_entry->fields, old_doc_entry->fields, (copy_ctor_func_t) field_copy_constructor); /* call getInputDocument on each child SolrDocument and store children */ if (zend_hash_num_elements(old_doc_entry->children) > 0) { solr_add_child_input_documents_from_documents(old_doc_entry->children, new_doc_entry); } } /* }}} */ /* {{{ proto array SolrInputDocument::getChildDocuments( void ) Returns child documents or null if none */ PHP_METHOD(SolrDocument, getChildDocuments) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); return; } if (zend_hash_num_elements(solr_doc->children) > 0) { array_init(return_value); zend_hash_init(Z_ARRVAL_P(return_value), zend_hash_num_elements(solr_doc->children), NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(Z_ARRVAL_P(return_value), solr_doc->children, (copy_ctor_func_t)zval_add_ref); } } /* }}} */ /* {{{ proto bool SolrInputDocument::hasChildDocuments( void ) Checks whether this document has child documents */ PHP_METHOD(SolrDocument, hasChildDocuments) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); return; } if (zend_hash_num_elements(solr_doc->children) > 0) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto int SolrInputDocument::getChildDocumentsCount( void ) Returns the number of child documents */ PHP_METHOD(SolrDocument, getChildDocumentsCount) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); return; } ZVAL_LONG(return_value, zend_hash_num_elements(solr_doc->children)); } /* }}} */ /* {{{ proto SolrDocumentField::__construct(void) Constructor */ PHP_METHOD(SolrDocumentField, __construct) { Z_OBJ_HT_P(getThis()) = &solr_document_field_handlers; } /* }}} */ /* {{{ proto SolrDocumentField::__destruct(void) Destructor */ PHP_METHOD(SolrDocumentField, __destruct) { } /* }}} */ /* {{{ PHP_SOLR_API void solr_document_field_write_property(zval *object, zval *member, zval *value) */ #if PHP_VERSION_ID < 70400 PHP_SOLR_API void solr_document_field_write_property(zval *object, zval *member, zval *value, void **cache_slot) #elif PHP_VERSION_ID < 80000 PHP_SOLR_API zval *solr_document_field_write_property(zval *object, zval *member, zval *value, void **cache_slot) #else PHP_SOLR_API zval *solr_document_field_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1007_MSG, SOLR_ERROR_1007, SOLR_FILE_LINE_FUNC); /* if (Z_TYPE_P(member) == IS_STRING) { php_error_docref(NULL, E_WARNING, "Attempting to set value for [%s] property in a SolrDocumentField instance", Z_STRVAL_P(member)); } */ #if PHP_VERSION_ID >= 70400 return value; #endif } /* }}} */ /* {{{ PHP_SOLR_API void solr_document_field_unset_property(zval *object, zval *member) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API void solr_document_field_unset_property(zval *object, zval *member, void ** cache_slot) #else PHP_SOLR_API void solr_document_field_unset_property(zend_object *object, zend_string *member, void ** cache_slot) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1007_MSG, SOLR_ERROR_1007, SOLR_FILE_LINE_FUNC); /* if (Z_TYPE_P(member) == IS_STRING) { php_error_docref(NULL, E_WARNING, "Attempting to remove [%s] property in a SolrDocumentField instance", Z_STRVAL_P(member)); } */ } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_exception.c0000644000175000017500000001452415001737315016274 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ static void solr_prepare_internal_info(zval *object, zval *return_value) */ static void solr_prepare_internal_info(zval *object, zval *return_value) { zval *rv = NULL; zval *line_no = zend_read_property(Z_OBJCE_P(object), OBJ_FOR_PROP(object), SOLR_SOURCELINE_NO_PROPERTY_NAME, sizeof(SOLR_SOURCELINE_NO_PROPERTY_NAME)-1, 0, rv); zval *solr_file = zend_read_property(Z_OBJCE_P(object), OBJ_FOR_PROP(object), SOLR_SOURCEFILE_PROPERTY_NAME, sizeof(SOLR_SOURCEFILE_PROPERTY_NAME)-1, 0, rv); zval *solr_zif_name = zend_read_property(Z_OBJCE_P(object), OBJ_FOR_PROP(object), SOLR_ZIFNAME_PROPERTY_NAME, sizeof(SOLR_ZIFNAME_PROPERTY_NAME)-1, 0, rv); long int source_line = Z_LVAL_P(line_no); char *solr_source_file = Z_STRVAL_P(solr_file); char *solr_zifname = Z_STRVAL_P(solr_zif_name); array_init(return_value); add_assoc_long(return_value, SOLR_SOURCELINE_NO_PROPERTY_NAME, source_line); add_assoc_string(return_value, SOLR_SOURCEFILE_PROPERTY_NAME, solr_source_file); add_assoc_string(return_value, SOLR_ZIFNAME_PROPERTY_NAME, solr_zifname); } /* }}} */ /* {{{ void solr_throw_exception_ex(zend_class_entry *exception_ce, long code, const char *filename, int file_line, const char *function_name, char *format, ...) */ PHP_SOLR_API void solr_throw_exception_ex(zend_class_entry *exception_ce, long code, const char *filename, int file_line, const char *function_name, char *format, ...) { char *message = NULL; zval object; zend_object *object_val = NULL; va_list args; va_start(args,format); /* Preparing the message string from the format and variable argument list, if any. */ ap_php_vasprintf(&message, format, args); va_end(args); /* Retrieves the thrown object and updates the properties */ object_val = zend_throw_exception(exception_ce, message, code); ZVAL_OBJ(&object, object_val); /* This is the line number in the source file where it was thrown */ zend_update_property_long(exception_ce, OBJ_FOR_PROP(&object), SOLR_SOURCELINE_NO_PROPERTY_NAME, sizeof(SOLR_SOURCELINE_NO_PROPERTY_NAME)-1, file_line); /* This is the line source file where it was thrown */ zend_update_property_string(exception_ce, OBJ_FOR_PROP(&object), SOLR_SOURCEFILE_PROPERTY_NAME, sizeof(SOLR_SOURCEFILE_PROPERTY_NAME)-1, (char *) filename); /* This is the C function where it was thrown */ zend_update_property_string(exception_ce, OBJ_FOR_PROP(&object), SOLR_ZIFNAME_PROPERTY_NAME, sizeof(SOLR_ZIFNAME_PROPERTY_NAME)-1, (char *) function_name); /* message must be freed */ if (message != NULL) { free(message); } } /* }}} */ /* {{{ void solr_throw_exception(zend_class_entry *exception_ce, char *message, long code, const char *filename, int file_line, const char *function_name) */ PHP_SOLR_API void solr_throw_exception(zend_class_entry *exception_ce, char *message, long code, const char *filename, int file_line, const char *function_name) { /* Retrieves the thrown object and updates the properties */ zend_object *object_val = NULL; zval object; object_val = zend_throw_exception(exception_ce, message, code); ZVAL_OBJ(&object, object_val); /* This is the line number in the source file where it was thrown */ zend_update_property_long(exception_ce, OBJ_FOR_PROP(&object), SOLR_SOURCELINE_NO_PROPERTY_NAME, sizeof(SOLR_SOURCELINE_NO_PROPERTY_NAME)-1, file_line); /* This is the line source file where it was thrown */ zend_update_property_string(exception_ce, OBJ_FOR_PROP(&object), SOLR_SOURCEFILE_PROPERTY_NAME, sizeof(SOLR_SOURCEFILE_PROPERTY_NAME)-1, (char *) filename); /* This is the C function where it was thrown */ zend_update_property_string(exception_ce, OBJ_FOR_PROP(&object), SOLR_ZIFNAME_PROPERTY_NAME, sizeof(SOLR_ZIFNAME_PROPERTY_NAME)-1, (char *) function_name); } /* }}} */ /* Macro for preparing the return value array */ #define solr_exception_return_internal_info() { \ solr_prepare_internal_info(getThis(), return_value); \ } /* {{{ proto array SolrException::getInternalInfo(void) Returns the internal API information where the exception was generated */ PHP_METHOD(SolrException, getInternalInfo) { solr_exception_return_internal_info() } /* }}} */ /* {{{ proto array SolrClientException::getInternalInfo(void) Returns the internal API information where the exception was generated */ PHP_METHOD(SolrClientException, getInternalInfo) { solr_exception_return_internal_info() } /* }}} */ /* {{{ proto array SolrIllegalOperationException::getInternalInfo(void) Returns the internal API information where the exception was generated */ PHP_METHOD(SolrIllegalOperationException, getInternalInfo) { solr_exception_return_internal_info() } /* }}} */ /* {{{ proto array SolrIllegalArgumentException::getInternalInfo(void) Returns the internal API information where the exception was generated */ PHP_METHOD(SolrIllegalArgumentException, getInternalInfo) { solr_exception_return_internal_info() } /* }}} */ /* {{{ proto array SolrServerException::getInternalInfo(void) Returns the internal API information where the exception was generated */ PHP_METHOD(SolrServerException, getInternalInfo) { solr_exception_return_internal_info() } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_extract.c0000644000175000017500000001373015001737315015746 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" extern zend_class_entry *solr_ce_SolrExtractRequest; extern zend_object_handlers solr_extract_request_object_handlers; extern zend_class_entry *solr_ce_SolrIllegalArgumentException; extern zend_class_entry *solr_ce_SolrIllegalOperationException; extern HashTable *ustreams; #define SOLR_EXTRACT_OBJ_CTOR() { \ do { \ object_init_ex(return_value, solr_ce_SolrExtractRequest); \ stream_entry = Z_USTREAM_P(return_value); \ stream_entry->params = Z_REFVAL_P(params); \ Z_ADDREF_P(stream_entry->params); \ } while(0); \ } PHP_SOLR_API int solr_init_ustream(zval *obj) { zend_ulong index = SOLR_UNIQUE_USTREAM_INDEX(); solr_ustream_t *ustream_entry = NULL; ustream_entry = pemalloc(sizeof(solr_ustream_t), 0); if (zend_hash_index_update_ptr(SOLR_GLOBAL(ustreams), index, ustream_entry) == NULL) { return FAILURE; } return SUCCESS; } /* {{{ solr_extract_obj_handlers */ static void solr_extract_free_object_handler(zend_object *obj) { solr_ustream_t *intern = solr_get_ustream_object(obj); solr_string_free(&(intern->content_info->filename)); solr_string_free(&(intern->content_info->stream_info.binary_content)); solr_string_free(&(intern->content_info->stream_info.mime_type)); Z_DELREF_P(intern->params); efree(intern->content_info); zend_object_std_dtor(obj); efree(intern); } zend_object *solr_extract_create_object_handler(zend_class_entry *ce) { solr_ustream_t *intern = ecalloc(1, sizeof(solr_ustream_t)+zend_object_properties_size(ce)); memset(intern, 0, sizeof(solr_ustream_t)); zend_object_std_init(&intern->std, ce); object_properties_init(&intern->std, ce); intern->content_info = emalloc(sizeof(solr_cuv_t)); solr_string_init(&(intern->content_info->stream_info.mime_type)); solr_string_init(&(intern->content_info->stream_info.binary_content)); solr_extract_request_object_handlers.free_obj = solr_extract_free_object_handler; intern->std.handlers = &solr_extract_request_object_handlers; return &intern->std; } /* }}} */ PHP_METHOD(SolrExtractRequest, __construct) { } PHP_METHOD(SolrExtractRequest, __destruct) { } /* {{{ proto SolrExtractRequest::createFromFile(string filename, SolrModifiableParams params) Create request from file */ PHP_METHOD(SolrExtractRequest, createFromFile) { char *filename; COMPAT_ARG_SIZE_T filename_length = 0; solr_ustream_t *stream_entry = NULL; zval *params = NULL; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, solr_ce_SolrIllegalArgumentException, &error_handling); if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &filename, &filename_length, ¶ms) == FAILURE) { zend_restore_error_handling(&error_handling); return; } SOLR_EXTRACT_OBJ_CTOR(); stream_entry->content_type = SOLR_EXTRACT_CONTENT_FILE; solr_string_set_ex(&(stream_entry->content_info->filename), filename, filename_length); } /* {{{ proto SolrExtractRequest::createFromStream(string content, string contentType, SolrModifiableParams params) Create request from binary stream */ PHP_METHOD(SolrExtractRequest, createFromStream) { char *content, *content_type; COMPAT_ARG_SIZE_T content_length = 0, content_type_length = 0; solr_ustream_t *stream_entry = NULL; zval *params = NULL; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, solr_ce_SolrIllegalArgumentException, &error_handling); if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssz", &content, &content_length, &content_type, &content_type_length, ¶ms) == FAILURE) { zend_restore_error_handling(&error_handling); return; } SOLR_EXTRACT_OBJ_CTOR(); stream_entry->content_type = SOLR_EXTRACT_CONTENT_STREAM; solr_string_set_ex(&(stream_entry->content_info->stream_info.mime_type), content_type, content_type_length); solr_string_set_ex(&(stream_entry->content_info->stream_info.binary_content), content, content_length); } /* }}} */ /* {{{ proto SolrExtractRequest::__clone(void) Should not be called directly. Cloning is not supported. */ PHP_METHOD(SolrExtractRequest, __clone) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "Cloning of SolrExtractRequest objects is currently not supported"); } /* }}} */ /* {{{ proto SolrExtractRequest::__sleep(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrExtractRequest, __sleep) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "SolrExtractRequest objects cannot be serialized or unserialized"); } /* }}} */ /* {{{ proto SolrExtractRequest::__wakeup(void) Should not be called directly. Deserialization is not supported. */ PHP_METHOD(SolrExtractRequest, __wakeup) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "SolrExtractRequest objects cannot be serialized or unserialized"); } /* }}} */ solr-2.8.1/src/php_solr_input_document.c0000644000175000017500000006741715001737315017344 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /** ************************************************************************ **/ /** DEFINITIONS FOR SOLR INPUT DOCUMENT METHODS **/ /** ************************************************************************ **/ /* {{{ proto void SolrInputDocument::__construct() SolrInputDocument constructor */ PHP_METHOD(SolrInputDocument, __construct) { zval *objptr = getThis(); if (solr_input_doc_ctor(objptr) == NULL) { return; } } /* }}} */ /* {{{ proto void SolrInputDocument::__destruct(void) Destructor for SolrInputDocument */ PHP_METHOD(SolrInputDocument, __destruct) { solr_document_t *doc_entry = NULL; /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { zend_hash_index_del(SOLR_GLOBAL(documents), doc_entry->document_index); /* Keep track of how many SolrDocument instances we currently have */ SOLR_GLOBAL(document_count)--; return ; } } /* }}} */ /* {{{ proto void SolrInputDocument::__clone(void) Clones the current object. Not to be called directly. */ PHP_METHOD(SolrInputDocument, __clone) { RETURN_NULL(); } /* }}} */ /* {{{ proto void SolrInputDocument::__sleep(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrInputDocument, __sleep) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1005, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1005_MSG); } /* }}} */ /* {{{ proto void SolrInputDocument::__wakeup(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrInputDocument, __wakeup) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1005, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1005_MSG); } /* }}} */ /* {{{ proto bool SolrInputDocument::setBoost(float document_boost) Sets the boost for the document. */ PHP_METHOD(SolrInputDocument, setBoost) { double boost_value = 0.0f; solr_document_t *doc_entry = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &boost_value) == FAILURE) { RETURN_FALSE; } /* If the submitted boost_value is negative. */ if (boost_value < 0.0) { RETURN_FALSE; } /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { doc_entry->document_boost = boost_value; RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto float SolrInputDocument::getBoost(void) Retrieves the boost for the document. */ PHP_METHOD(SolrInputDocument, getBoost) { solr_document_t *doc_entry = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { RETURN_DOUBLE(doc_entry->document_boost); } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::clear(void) Discards all the fields and resets the document boost to zero. */ PHP_METHOD(SolrInputDocument, clear) { solr_document_t *doc_entry = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { doc_entry->document_boost = 0.0; doc_entry->field_count = 0L; zend_hash_clean(doc_entry->fields); RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::addField(string field_name, field_value [, float field_boost]) Adds a field to the document. Can be called multiple times. */ PHP_METHOD(SolrInputDocument, addField) { solr_char_t *field_name = NULL, *field_value = NULL; COMPAT_ARG_SIZE_T field_name_length = 0, field_value_length = 0; solr_document_t *doc_entry = NULL; double field_boost = 0.0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|d", &field_name, &field_name_length, &field_value, &field_value_length, &field_boost) == FAILURE) { RETURN_FALSE; } if (!field_name_length) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; /* If the field already exists in the SolrDocument instance append the value to the field list queue */ if ((field_values = (solr_field_list_t *)zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) != NULL) { if (solr_document_insert_field_value(field_values, (solr_char_t *)field_value, field_boost) == FAILURE) { RETURN_FALSE; } } else { /* Otherwise, create a new one and add it to the hash table */ field_values = (solr_field_list_t *) pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); memset(field_values, 0, sizeof(solr_field_list_t)); field_values->count = 0L; field_values->field_boost = 0.0; field_values->field_name = (solr_char_t *) pestrdup((char *)field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); field_values->head = NULL; field_values->last = NULL; if (solr_document_insert_field_value(field_values, field_value, field_boost) == FAILURE) { solr_destroy_field_list(field_values); RETURN_FALSE; } if (zend_hash_str_add_ptr(doc_entry->fields, field_name, field_name_length,(void *) field_values) == NULL) { solr_destroy_field_list(field_values); RETURN_FALSE; } /* Increment field count only when HEAD is added */ doc_entry->field_count++; } RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::updateField(string fieldName, int modifier, string value) */ PHP_METHOD(SolrInputDocument, updateField) { solr_char_t *field_name = NULL, *field_value = NULL; COMPAT_ARG_SIZE_T field_name_length = 0, field_value_len = 0; solr_document_t *doc_entry; solr_field_list_t *field; long modifier = 0L; if (zend_parse_parameters(ZEND_NUM_ARGS(), "sls", &field_name, &field_name_length, &modifier, &field_value, &field_value_len) == FAILURE) { return; } if (!field_name_length || !field_value_len) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } switch (modifier) { case SOLR_FIELD_VALUE_MOD_ADD: case SOLR_FIELD_VALUE_MOD_REMOVE: case SOLR_FIELD_VALUE_MOD_REMOVEREGEX: case SOLR_FIELD_VALUE_MOD_SET: case SOLR_FIELD_VALUE_MOD_INC: break; default: solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4003, SOLR_FILE_LINE_FUNC, SOLR_ERROR_4003_MSG); RETURN_FALSE; } if ((field = zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) == NULL){ field = (solr_field_list_t *)pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); memset(field, 0, sizeof(solr_field_list_t)); field->field_name = pestrdup(field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); field->count = 1; field->head = NULL; field->last = NULL; if (modifier > 0) { field->modified = 1; } doc_entry->field_count++; if (zend_hash_str_add_ptr(doc_entry->fields, field_name, field_name_length, field) == NULL) { RETURN_FALSE; } } else if (field->modified == 0) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4004, SOLR_FILE_LINE_FUNC, SOLR_ERROR_4004_MSG); RETURN_FALSE; } solr_document_insert_field_value_ex(field, field_value, 0.0, modifier); } /* }}} */ /* {{{ proto bool SolrInputDocument::setFieldBoost(string fieldname, float boost_value) Sets the boost for the specified field. */ PHP_METHOD(SolrInputDocument, setFieldBoost) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; double field_boost = 0.0; solr_document_t *doc_entry = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sd", &field_name, &field_name_length, &field_boost) == FAILURE) { RETURN_FALSE; } if (!field_name_length) { RETURN_FALSE; } if (field_boost < 0.0) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; /* If the field already exists in the SolrDocument instance append the value to the field list queue */ if ((field_values = zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) != NULL) { field_values->field_boost = field_boost; RETURN_TRUE; } RETURN_FALSE; } RETURN_FALSE; } /* }}} */ /** * {{{ proto bool SolrInputDocument::setVersion(int version) * Enable optimistic concurrency using assertions */ PHP_METHOD(SolrInputDocument, setVersion) { long version = 0; solr_document_t *doc_entry = NULL; solr_field_list_t *field = NULL; solr_char_t *field_name = "_version_"; COMPAT_ARG_SIZE_T field_name_length = sizeof("_version_"); char version_str[80]; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, solr_ce_SolrIllegalArgumentException, &error_handling); if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &version) == FAILURE) { zend_restore_error_handling(&error_handling); return; } zend_restore_error_handling(&error_handling); if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { return; } if (zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) { zend_hash_str_del(doc_entry->fields, field_name, field_name_length); } field = pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); field->count = 0L; field->field_boost = 0.0f; field->field_name = pestrdup(field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); field->head = field->last = NULL; snprintf(version_str, 80, "%ld", version); solr_document_insert_field_value(field, version_str, 0.0); if (zend_hash_str_update_ptr(doc_entry->fields, field_name, field_name_length, field) == NULL) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1008_MSG); solr_destroy_field_list(field); return; } RETURN_TRUE; } /* }}} */ /* {{{ proto int SolrInputDocument::getVersion( void ) */ PHP_METHOD(SolrInputDocument, getVersion) { solr_document_t *doc_entry = NULL; solr_char_t *field_name = "_version_"; COMPAT_ARG_SIZE_T field_name_length = sizeof("_version_"); solr_field_list_t *field = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { RETURN_NULL(); } if ((field = zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) != NULL) { RETURN_LONG(atol(field->head->field_value)); } RETURN_NULL(); } /* }}} */ /* {{{ proto float SolrInputDocument::getFieldBoost(string fieldname) Returns the boost value for the specified field. */ PHP_METHOD(SolrInputDocument, getFieldBoost) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_document_t *doc_entry = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (!field_name_length) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; if ((field_values = zend_hash_str_find_ptr(doc_entry->fields, field_name, field_name_length)) != NULL) { RETURN_DOUBLE(field_values->field_boost); } RETURN_FALSE; } RETURN_FALSE; } /* }}} */ /* {{{ proto array SolrInputDocument::getFieldNames(void) Returns an array of all the field names in the document. */ PHP_METHOD(SolrInputDocument, getFieldNames) { solr_document_get_field_names(INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ /* {{{ proto int SolrInputDocument::getFieldCount(void) Returns the number of fields in document. Multivalued fields are only counted once. */ PHP_METHOD(SolrInputDocument, getFieldCount) { solr_document_t *doc_entry = NULL; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { RETURN_LONG(zend_hash_num_elements(doc_entry->fields)); } RETURN_FALSE; } /* }}} */ /* {{{ proto SolrDocumentField SolrInputDocument::getField(string fieldname) Returns the requested field. */ PHP_METHOD(SolrInputDocument, getField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_document_t *doc_entry = NULL; zend_string *field_str = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (!field_name_length) { RETURN_FALSE; } field_str = zend_string_init(field_name, field_name_length, SOLR_DOCUMENT_FIELD_PERSISTENT); /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { solr_field_list_t *field_values = NULL; if ((field_values = zend_hash_find_ptr(doc_entry->fields, field_str)) != NULL) { solr_create_document_field_object(field_values, &return_value); /* The field was retrieved, so we're done here */ zend_string_release(field_str); return ; } goto return_false; } return_false: zend_string_release(field_str); RETURN_FALSE; } /* }}} */ /* {{{ proto array SolrInputDocument::toArray(void) Returns an array representation of the object. */ PHP_METHOD(SolrInputDocument, toArray) { solr_document_t *doc_entry = NULL; zval fields_array; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { HashTable *fields_ht; array_init(return_value); array_init(&fields_array); zend_hash_init(Z_ARRVAL(fields_array), zend_hash_num_elements(doc_entry->fields), NULL, ZVAL_PTR_DTOR, 0); add_assoc_double(return_value, "document_boost", doc_entry->document_boost); add_assoc_long(return_value, "field_count", doc_entry->field_count); add_assoc_zval(return_value, "fields", &fields_array); fields_ht = doc_entry->fields; SOLR_HASHTABLE_FOR_LOOP(fields_ht) { solr_field_list_t *field = NULL; zval current_field; zval *current_field_ptr = ¤t_field; field = zend_hash_get_current_data_ptr(fields_ht); /* create SolrDocumentField */ solr_create_document_field_object(field, ¤t_field_ptr); /* create SolrDocumentField to the fields HT */ add_next_index_zval(&fields_array, current_field_ptr); } /* We are done */ return; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::fieldExists(string field_name) Checks if the field name exists in the document. */ PHP_METHOD(SolrInputDocument, fieldExists) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_length = 0; solr_document_t *doc_entry = NULL; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_length) == FAILURE) { RETURN_FALSE; } if (!field_name_length) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { if (zend_hash_str_exists(doc_entry->fields, field_name, field_name_length)) { RETURN_TRUE; } else { RETURN_FALSE; } } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::deleteField(string field_name) Removes the request field from the document. */ PHP_METHOD(SolrInputDocument, deleteField) { solr_document_t *doc_entry = NULL; char *field_name; COMPAT_ARG_SIZE_T field_name_len = 0; /* Process the parameters passed to the default constructor */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { RETURN_FALSE; } if (!field_name_len) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { if (zend_hash_str_del(doc_entry->fields, field_name, field_name_len) == SUCCESS) { doc_entry->field_count--; RETURN_TRUE; } RETURN_FALSE; } RETURN_FALSE; } /* }}} */ /* {{{ proto bool SolrInputDocument::sort(int sort_criterion [, int sort_direction]) Sorts the document fields by the specified criterion. */ PHP_METHOD(SolrInputDocument, sort) { long int order_by = 0L; long int sort_direction = SOLR_SORT_ASC; solr_document_t *doc_entry = NULL; int renumber = 0; /* The pointer to the comparison function used by zend_qsort */ #if PHP_VERSION_ID < 80000 compare_func_t comparison_function = NULL; #else bucket_compare_func_t comparison_function = NULL; #endif if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &order_by, &sort_direction) == FAILURE) { RETURN_FALSE; } /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == FAILURE) { RETURN_FALSE; } /* {{{ Select the appropriate comparison function */ switch(order_by) { case SOLR_SORT_FIELD_NAME : /* Sorting by field name */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_name; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_name; break; } } break; /* case SOLR_SORT_FIELD_NAME */ case SOLR_SORT_FIELD_VALUE_COUNT : /* Sorting by number of values per field */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_value_count; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_value_count; break; } } break; /* case SOLR_SORT_FIELD_VALUE_COUNT */ case SOLR_SORT_FIELD_BOOST_VALUE : /* Sorting by field boost values */ { switch(sort_direction) { case SOLR_SORT_ASC : comparison_function = solr_compare_field_boost_value; break; case SOLR_SORT_DESC : comparison_function = solr_rcompare_field_boost_value; break; } } break; /* case SOLR_SORT_FIELD_BOOST_VALUE */ default : /* Undefined sort criteria */ RETURN_FALSE; break; } /* }}} switch(order_by) */ /* Undefined sort direction. It was not ASC or DESC */ if (!comparison_function) { RETURN_FALSE; } zend_hash_sort(doc_entry->fields, comparison_function, renumber); RETURN_TRUE; } /* }}} */ /* {{{ proto bool SolrInputDocument::merge(SolrInputDocument source [, bool override]) Merges the source document to the current object. */ PHP_METHOD(SolrInputDocument, merge) { solr_document_t *destination_document = NULL; solr_document_t *source_document = NULL; /* The destination SolrDocument instance */ zval * destination_document_zval = getThis(); /* The source SolrDocument instance */ zval *source_document_zval = NULL; /* Should we skip fields that already exist in destination */ zend_bool overwrite = (zend_bool) 0; copy_ctor_func_t p_copy_ctor = (copy_ctor_func_t) field_copy_constructor; if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|b", &source_document_zval, solr_ce_SolrInputDocument, &overwrite) == FAILURE) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(source_document_zval), &source_document) == FAILURE) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(destination_document_zval), &destination_document) == FAILURE) { RETURN_FALSE; } if (zend_hash_num_elements(source_document->fields) == 0) { php_error_docref(NULL, E_WARNING, "Source SolrInputDocument has no fields. Source documentId"); RETURN_FALSE; } /* Copy the fields in the source HashTable to the destination HashTable */ zend_hash_merge(destination_document->fields, source_document->fields, p_copy_ctor, overwrite); /* Update the field count */ destination_document->field_count = (uint32_t) zend_hash_num_elements(destination_document->fields); RETURN_TRUE; } /* }}} */ /* {{{ proto void SolrInputDocument::addChildDocument(SolrInputDocument child) Adds a child document */ PHP_METHOD(SolrInputDocument, addChildDocument) { zval *child_obj = NULL; solr_document_t *solr_doc = NULL, *child_doc_entry = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &child_obj, solr_ce_SolrInputDocument) == FAILURE) { RETURN_FALSE; } if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, "Internal Error: Unable to fetch document_entry."); return; } if (solr_fetch_document_entry(OBJ_FOR_PROP(child_obj), &child_doc_entry) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, "Internal Error: Unable to fetch document_entry for child document."); return; } /* SolrInputDocument must contain at least one field */ if (0 == zend_hash_num_elements(child_doc_entry->fields)) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Child document has no fields"); return; } if (zend_hash_next_index_insert(solr_doc->children, child_obj) == NULL) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Internal Error: Unable to add child to the hashtable."); } else { Z_ADDREF_P(child_obj); } } /* }}} */ /* {{{ proto void SolrInputDocument::addChildDocuments(array) Adds a child documents */ PHP_METHOD(SolrInputDocument, addChildDocuments) { HashTable *solr_input_docs; solr_document_t *solr_doc = NULL; zval *docs_array = NULL; int num_input_docs = 0, curr_pos = 0; size_t pos = 0U; zval **input_docs = NULL, *current_input_doc = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &docs_array) == FAILURE) { return; } if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1008, SOLR_FILE_LINE_FUNC, "Internal Error: Unable to fetch document_entry."); } solr_input_docs = Z_ARRVAL_P(docs_array); num_input_docs = zend_hash_num_elements(solr_input_docs); if(!num_input_docs) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "The array parameter passed is empty"); return; } /* This should be released if there is an error */ input_docs = (zval **) pemalloc((sizeof(zval *) * (num_input_docs + 1)), SOLR_DOCUMENT_PERSISTENT); memset(input_docs, 0, sizeof(zval *) * (num_input_docs + 1)); /* Please check all the SolrInputDocument instances passed via the array */ SOLR_HASHTABLE_FOR_LOOP(solr_input_docs) { zval *solr_input_doc = NULL; solr_document_t *doc_entry = NULL; HashTable *document_fields; solr_input_doc = zend_hash_get_current_data(solr_input_docs); if (Z_TYPE_P(solr_input_doc) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(solr_input_doc), solr_ce_SolrInputDocument)) { SOLR_FREE_DOC_ENTRIES(input_docs); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u is not a valid SolrInputDocument instance", (curr_pos + 1U)); return; } if (solr_fetch_document_entry(OBJ_FOR_PROP(solr_input_doc), &doc_entry) == FAILURE) { SOLR_FREE_DOC_ENTRIES(input_docs); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u is not valid. Object not present in HashTable", (curr_pos + 1U)); return; } document_fields = doc_entry->fields; /* SolrInputDocument must contain at least one field */ if (0 == zend_hash_num_elements(document_fields)) { SOLR_FREE_DOC_ENTRIES(input_docs); solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u has no fields", (curr_pos + 1U)); return; } input_docs[curr_pos] = solr_input_doc; curr_pos++; } /* Grab the first (solr_document_t *) pointer */ current_input_doc = input_docs[pos]; while(current_input_doc != NULL) { if (zend_hash_next_index_insert(solr_doc->children, current_input_doc) == NULL) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "SolrInputDocument number %u has no fields", (pos + 1U)); SOLR_FREE_DOC_ENTRIES(input_docs); return; } /* todo possible leak */ Z_ADDREF_P(current_input_doc); pos++; current_input_doc = input_docs[pos]; } SOLR_FREE_DOC_ENTRIES(input_docs); } /* }}} */ /* {{{ proto array SolrInputDocument::getChildDocuments( void ) Returns child documents or null if none */ PHP_METHOD(SolrInputDocument, getChildDocuments) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); } if (zend_hash_num_elements(solr_doc->children) > 0) { array_init(return_value); zend_hash_init(Z_ARRVAL_P(return_value), zend_hash_num_elements(solr_doc->children), NULL, ZVAL_PTR_DTOR, 0); zend_hash_copy(Z_ARRVAL_P(return_value), solr_doc->children, (copy_ctor_func_t)zval_add_ref); } } /* }}} */ /* {{{ proto bool SolrInputDocument::hasChildDocuments (void) Checks whether this document has got child documents */ PHP_METHOD(SolrInputDocument, hasChildDocuments) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc)) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); } if (zend_hash_num_elements(solr_doc->children) > 0) { RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */ /* {{{ proto int SolrInputDocument::getChildDocumentsCount (void) Returns the number of child documents */ PHP_METHOD(SolrInputDocument, getChildDocumentsCount) { solr_document_t *solr_doc = NULL; if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &solr_doc)) { php_error_docref(NULL, E_ERROR, "Unable to fetch document entry for current object"); } ZVAL_LONG(return_value, zend_hash_num_elements(solr_doc->children)); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_object.c0000644000175000017500000002407315001737315015544 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ PHP_SOLR_API void solr_object_write_property(zval *object, zval *member, zval *value) */ #if PHP_VERSION_ID < 70400 PHP_SOLR_API void solr_object_write_property(zval *object, zval *member, zval *value, void **cache_slot) #elif PHP_VERSION_ID < 80000 PHP_SOLR_API zval *solr_object_write_property(zval *object, zval *member, zval *value, void **cache_slot) #else PHP_SOLR_API zval *solr_object_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1006_MSG, SOLR_ERROR_1006, SOLR_FILE_LINE_FUNC); #if PHP_VERSION_ID >= 70400 return value; #endif } /* }}} */ /* {{{ PHP_SOLR_API void solr_object_write_dimension(zval *object, zval *offset, zval *value) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API void solr_object_write_dimension(zval *object, zval *offset, zval *value) #else PHP_SOLR_API void solr_object_write_dimension(zend_object *object, zval *offset, zval *value) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1006_MSG, SOLR_ERROR_1006, SOLR_FILE_LINE_FUNC); if (Z_TYPE_P(offset) == IS_STRING) { php_error_docref(NULL, E_WARNING, "Attempting to set value for [%s] property in a SolrObject instance", Z_STRVAL_P(offset)); } } /* }}} */ /* {{{ PHP_SOLR_API void solr_object_unset_property(zval *object, zval *member) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API void solr_object_unset_property(zval *object, zval *member, void **cache_slot) #else PHP_SOLR_API void solr_object_unset_property(zend_object *object, zend_string *member, void **cache_slot) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1006_MSG, SOLR_ERROR_1006, SOLR_FILE_LINE_FUNC); } /* }}} */ /* {{{ PHP_SOLR_API void solr_object_unset_dimension(zval *object, zval *offset) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API void solr_object_unset_dimension(zval *object, zval *offset) #else PHP_SOLR_API void solr_object_unset_dimension(zend_object *object, zval *offset) #endif { solr_throw_exception(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1006_MSG, SOLR_ERROR_1006, SOLR_FILE_LINE_FUNC); if (Z_TYPE_P(offset) == IS_STRING) { php_error_docref(NULL, E_WARNING, "Attempting to remove [%s] property in a SolrObject instance", Z_STRVAL_P(offset)); } } /* }}} */ /* {{{ PHP_SOLR_API zval *solr_object_read_property(zval *object, zval *member, int type) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API zval *solr_object_read_property(zval *object, zval *member, int type, void **cache_slot, zval* rv) #else PHP_SOLR_API zval *solr_object_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval* rv) #endif { zval *value = &EG(uninitialized_zval); char *name = NULL; HashTable *properties = NULL; #if PHP_VERSION_ID < 70000 if (Z_TYPE_P(member) != IS_STRING) { return value; } #endif SOLR_HASHTABLE_FOR_LOOP(properties) { char *property_name = NULL; /* If the property name is in the HashTable */ if (property_name && !strcmp(property_name, name)) { value = zend_hash_get_current_data(properties); } } return value; } /* }}} */ /* {{{ proto SolrObject::__construct(void) Constructor for SolrObject */ PHP_METHOD(SolrObject, __construct) { Z_OBJ_HT_P(getThis()) = &solr_object_handlers; } /* }}} */ /* {{{ proto SolrObject::__destruct(void) Destructor for SolrObject. */ PHP_METHOD(SolrObject, __destruct) { } /* }}} */ /* {{{ proto void SolrObject::__set(string property_name, mixed value) Magic method for setting/updating property values. */ PHP_METHOD(SolrObject, __set) { } /* }}} */ /* {{{ proto mixed SolrObject::__get(string property_name) Magic method for retrieving properties. */ PHP_METHOD(SolrObject, __get) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; zval *property = NULL, rv; zend_bool copy_value = 1; void *dtor = NULL; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } property = zend_read_property(solr_ce_SolrObject, OBJ_FOR_PROP(getThis()), name, name_len, 0, &rv); if (property) { RETURN_ZVAL(property, copy_value, dtor); } } /* }}} */ /* {{{ proto bool SolrObject::__isset(string property_name) Magic method for checking if a property exists in the object. */ PHP_METHOD(SolrObject, __isset) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; zend_object *zobject = NULL; zval *value = NULL; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } zobject = Z_OBJ_P(getThis()); value = zend_hash_str_find(zobject->properties, name, name_len); if (value) { RETURN_TRUE; } RETURN_FALSE; } /* }}} */ /* {{{ proto void SolrObject::__unset(string property_name) Magic method for removing the specified property. */ PHP_METHOD(SolrObject, __unset) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { return; } solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1002, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1002_MSG, name); RETURN_FALSE; } /* }}} */ /* {{{ proto void SolrObject::offsetSet(string key, mixed value) Sets the specified key to value. */ PHP_METHOD(SolrObject, offsetSet) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; zval *prop = NULL; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &name, &name_len, &prop) == FAILURE) { RETURN_FALSE; } if (prop && Z_TYPE_P(prop) == IS_NULL) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1002, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1002_MSG, name); return ; } zend_update_property(Z_OBJCE_P(getThis()), OBJ_FOR_PROP(getThis()), name, name_len, prop); } /* }}} */ /* {{{ proto mixed SolrObject::offsetGet(string key) Retrieves the requested key. */ PHP_METHOD(SolrObject, offsetGet) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; zend_object *zobject = Z_OBJ_P(getThis()); HashTable *properties = zobject->properties; zval *property_value = NULL; zend_bool copy_value = 1; void *dtor = NULL; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } if ((property_value = zend_hash_str_find(properties, name, name_len)) != NULL) { goto job_complete; } else { RETURN_NULL(); } job_complete : if (property_value && (property_value)) { RETURN_ZVAL((property_value), copy_value, dtor); } } /* }}} */ /* {{{ proto bool SolrObject::offsetExists(string key) Checks if the key exists. */ PHP_METHOD(SolrObject, offsetExists) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; zend_object *zobject = Z_OBJ_P(getThis()); HashTable *properties = zobject->properties; zend_bool property_exists = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } if (!properties) { RETURN_FALSE; } property_exists = zend_hash_str_exists(properties, name, name_len); zend_hash_internal_pointer_reset(properties); RETURN_BOOL(property_exists); } /* }}} */ /* {{{ proto void SolrObject::offsetUnset(string key) Removes the specified key. */ PHP_METHOD(SolrObject, offsetUnset) { solr_char_t *name = NULL; COMPAT_ARG_SIZE_T name_len = 0; /* Process the parameters passed to the method */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { return; } solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1002, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1002_MSG, name); RETURN_FALSE; } /* }}} */ /* {{{ proto array SolrObject::getPropertyNames(void) Returns an array of all the properties/keys in the object. */ PHP_METHOD(SolrObject, getPropertyNames) { zend_object *zobject = Z_OBJ_P(getThis()); zval new_val; zend_ulong num_idx; zend_string *str_idx; HashTable *properties = zobject->properties; if (! properties || !zend_hash_num_elements(properties)) { array_init_size(return_value, 0); zend_hash_real_init(Z_ARRVAL_P(return_value), 1); return; } array_init_size(return_value, zend_hash_num_elements(properties)); zend_hash_real_init(Z_ARRVAL_P(return_value), 1); ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { /* Go through input array and add keys to the return array */ ZEND_HASH_FOREACH_KEY(properties, num_idx, str_idx) { if (str_idx) { ZVAL_STR_COPY(&new_val, str_idx); } else { ZVAL_LONG(&new_val, num_idx); } ZEND_HASH_FILL_ADD(&new_val); } ZEND_HASH_FOREACH_END(); } ZEND_HASH_FILL_END(); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_params.c0000644000175000017500000007174415001737315015570 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ static void solr_serialize_xml_set_param_props(xmlNode *xml_param_node, solr_param_t *param) */ static void solr_serialize_xml_set_param_props(xmlNode *xml_param_node, solr_param_t *param) { char tmp_buffer[32]; /* This should be enough to hold any value */ memset(tmp_buffer, 0, sizeof(tmp_buffer)); /* Set the name attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "name", (xmlChar *) param->param_name); php_sprintf(tmp_buffer, "%d", param->type); /* Set the type attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "type", (xmlChar *) tmp_buffer); php_sprintf(tmp_buffer, "%d", param->allow_multiple); /* Set the allow_multiple attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "allow_multiple", (xmlChar *) tmp_buffer); php_sprintf(tmp_buffer, "%u", param->count); /* Set the count attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "count", (xmlChar *) tmp_buffer); php_sprintf(tmp_buffer, "%d", param->delimiter); /* Set the delimiter attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "delimiter", (xmlChar *) tmp_buffer); php_sprintf(tmp_buffer, "%d", param->arg_separator); /* Set the arg_separator attribute on the param node */ xmlNewProp(xml_param_node, (xmlChar *) "arg_separator", (xmlChar *) tmp_buffer); } /* }}} */ /* {{{ static void solr_serialize_normal_param_value(xmlNode *xml_params_node, solr_param_t *param) */ static void solr_serialize_normal_param_value(xmlNode *xml_params_node, solr_param_t *param) { xmlNode *xml_param_node = xmlNewChild(xml_params_node, NULL, (xmlChar *) "param", NULL); solr_param_value_t *curr_value = param->head; solr_serialize_xml_set_param_props(xml_param_node, param); while(curr_value != NULL) { xmlChar *param_value_txt = xmlEncodeEntitiesReentrant(xml_params_node->doc, (xmlChar *) curr_value->contents.normal.str); xmlNewChild(xml_param_node, NULL, (xmlChar *) "param_value", param_value_txt); xmlFree(param_value_txt); curr_value = curr_value->next; /* Go to the next value in the list */ } } /* }}} */ /* {{{ static void solr_serialize_simple_list_param_value(xmlNode *xml_params_node, solr_param_t *param) */ static void solr_serialize_simple_list_param_value(xmlNode *xml_params_node, solr_param_t *param) { xmlNode *xml_param_node = xmlNewChild(xml_params_node, NULL, (xmlChar *) "param", NULL); solr_param_value_t *curr_value = param->head; solr_serialize_xml_set_param_props(xml_param_node, param); while(curr_value != NULL) { xmlChar *param_value_txt = xmlEncodeEntitiesReentrant(xml_params_node->doc, (xmlChar *) curr_value->contents.simple_list.str); xmlNewChild(xml_param_node, NULL, (xmlChar *) "param_value", param_value_txt); xmlFree(param_value_txt); curr_value = curr_value->next; /* Go to the next value in the list */ } } /* }}} */ /* {{{ static void solr_serialize_arg_list_param_value(xmlNode *xml_params_node, solr_param_t *param) */ static void solr_serialize_arg_list_param_value(xmlNode *xml_params_node, solr_param_t *param) { xmlNode *xml_param_node = xmlNewChild(xml_params_node, NULL, (xmlChar *) "param", NULL); solr_param_value_t *curr_value = param->head; solr_serialize_xml_set_param_props(xml_param_node, param); while(curr_value != NULL) { xmlChar *param_value_txt = xmlEncodeEntitiesReentrant(xml_params_node->doc, (xmlChar *) curr_value->contents.arg_list.value.str); xmlChar *arg_value_txt = xmlEncodeEntitiesReentrant(xml_params_node->doc, (xmlChar *) curr_value->contents.arg_list.arg.str); xmlNode *xml_param_value = xmlNewChild(xml_param_node, NULL, (xmlChar *) "param_value", param_value_txt); xmlNewProp(xml_param_value, (xmlChar *) "argument", arg_value_txt); xmlFree(param_value_txt); xmlFree(arg_value_txt); curr_value = curr_value->next; /* Go to the next value in the list */ } } /* }}} */ /* {{{ static int solr_serialize_solr_params_object(xmlChar **serialized, int *size, zval *objptr) */ static int solr_serialize_solr_params_object(xmlChar **serialized, int *size, zval *objptr) { solr_params_t *solr_params = NULL; xmlNode *xml_solr_params = NULL, *xml_params = NULL; xmlDoc *doc_ptr = NULL; HashTable *params = NULL; int format = 1; if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { return FAILURE; } if (!serialized || !size || !objptr) { return FAILURE; } doc_ptr = solr_xml_create_xml_doc((xmlChar *) "solr_params", &xml_solr_params); xml_params = xmlNewChild(xml_solr_params, NULL, (xmlChar *) "params", NULL); params = solr_params->params; SOLR_HASHTABLE_FOR_LOOP(params) { solr_param_t *solr_param_ptr = NULL; solr_param_ptr = zend_hash_get_current_data_ptr(params); switch(solr_param_ptr->type) { case SOLR_PARAM_TYPE_NORMAL : { solr_serialize_normal_param_value(xml_params, solr_param_ptr); } break; case SOLR_PARAM_TYPE_SIMPLE_LIST : { solr_serialize_simple_list_param_value(xml_params, solr_param_ptr); } break; case SOLR_PARAM_TYPE_ARG_LIST : { solr_serialize_arg_list_param_value(xml_params, solr_param_ptr); } break; default : { php_error_docref(NULL, E_WARNING, "Invalid Solr Param Type %d", solr_param_ptr->type); } } } xmlIndentTreeOutput = 1; xmlDocDumpFormatMemoryEnc(doc_ptr, serialized, size, "UTF-8", format); xmlFreeDoc(doc_ptr); return SUCCESS; } /* }}} */ /* {{{ static void solr_unserialize_get_param_normal(xmlNode *normal_param, HashTable *params_ht) */ static void solr_unserialize_get_param_normal(xmlNode *normal_param, HashTable *params_ht) { solr_char_t *param_name = NULL; size_t param_name_len = 0U; solr_bool allow_multiple = 0; solr_param_type_t param_type = SOLR_PARAM_TYPE_NORMAL; xmlAttr *currAttr = normal_param->properties; solr_param_t *param = NULL; xmlNode *currNode = normal_param->children; solr_param_value_equal_func_t equal_func = solr_normal_param_value_equal; solr_param_fetch_func_t fetch_func = (solr_param_fetch_func_t) solr_normal_param_value_fetch; solr_param_value_free_func_t free_func = solr_normal_param_value_free; /* Grab the name and setting for this parameter */ while(currAttr != NULL) { if (solr_xml_match_node(currAttr, "name")) { param_name = (solr_char_t *) solr_xml_get_node_contents(currAttr); param_name_len = solr_strlen(param_name); } if (solr_xml_match_node(currAttr, "allow_multiple")) { allow_multiple = solr_xml_get_node_contents_int(currAttr); } currAttr = currAttr->next; } param = solr_create_new_param(param_name, param_name_len, param_type, allow_multiple, equal_func, fetch_func, free_func, '&', 0); /* Retrieve all the values for this parameter */ while(currNode != NULL) { if (solr_xml_match_node(currNode, "param_value")) { xmlChar *pvalue = solr_xml_get_node_contents(currNode); size_t pvalue_length = solr_strlen((char *)pvalue); solr_param_value_t *parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.normal), (solr_char_t *) pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); } currNode = currNode->next; } /* Add this parameter to the hash table */ if (zend_hash_str_add_ptr(params_ht, (char *) param_name, param_name_len, (void *) param) == NULL) { /* Release all the memory allocated to this paramter */ solr_destroy_param(¶m); php_error_docref(NULL, E_WARNING, "Error from %s %s", __func__, (char *) param_name); return; } } /* }}} */ /* {{{ static void solr_unserialize_get_param_simple_list(xmlNode *list_param, HashTable *params_ht) */ static void solr_unserialize_get_param_simple_list(xmlNode *list_param, HashTable *params_ht) { solr_char_t *param_name = NULL; size_t param_name_len = 0U; solr_bool allow_multiple = 0; solr_param_type_t param_type = SOLR_PARAM_TYPE_SIMPLE_LIST; solr_param_t *param = NULL; xmlNode *currNode = list_param->children; xmlAttr *currAttr = list_param->properties; solr_param_value_equal_func_t equal_func = solr_simple_list_param_value_equal; solr_param_fetch_func_t fetch_func = (solr_param_fetch_func_t) solr_simple_list_param_value_fetch; solr_param_value_free_func_t free_func = solr_simple_list_param_value_free; /* Grab the name and setting for this parameter */ while(currAttr != NULL) { if (solr_xml_match_node(currAttr, "name")) { param_name = (solr_char_t *) solr_xml_get_node_contents(currAttr); param_name_len = solr_strlen(param_name); } if (solr_xml_match_node(currAttr, "allow_multiple")) { allow_multiple = solr_xml_get_node_contents_int(currAttr); } currAttr = currAttr->next; } param = solr_create_new_param(param_name, param_name_len, param_type, allow_multiple, equal_func, fetch_func, free_func, ',', 0); /* Retrieve all the values for this parameter */ while(currNode != NULL) { if (solr_xml_match_node(currNode, "param_value")) { solr_char_t *pvalue = (solr_char_t *) solr_xml_get_node_contents(currNode); size_t pvalue_length = solr_strlen(pvalue); solr_param_value_t *parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.simple_list), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); } currNode = currNode->next; } /* Add this parameter to the hash table */ if (zend_hash_str_add_ptr(params_ht, (char *) param_name, param_name_len, (void *) param) == NULL) { /* Release all the memory allocated to this paramter */ solr_destroy_param(¶m); php_error_docref(NULL, E_WARNING, "Error from %s %s", __func__, (char *) param_name); return; } } /* }}} */ /* {{{ static void solr_unserialize_get_param_arg_list(xmlNode *sort_param, HashTable *params_ht) */ static void solr_unserialize_get_param_arg_list(xmlNode *sort_param, HashTable *params_ht) { solr_char_t *param_name = NULL; size_t param_name_len = 0U; solr_bool allow_multiple = 0; solr_char_t delimiter = 0; solr_char_t separator = 0; xmlAttr *currAttr = sort_param->properties; solr_param_type_t param_type = SOLR_PARAM_TYPE_ARG_LIST; solr_param_t *param = NULL; xmlNode *currNode = sort_param->children; solr_param_value_equal_func_t equal_func = solr_arg_list_param_value_equal; solr_param_fetch_func_t fetch_func = (solr_param_fetch_func_t) solr_arg_list_param_value_fetch; solr_param_value_free_func_t free_func = solr_arg_list_param_value_free; /* Grab the name and setting for this parameter */ while(currAttr != NULL) { if (solr_xml_match_node(currAttr, "name")) { param_name = (solr_char_t *) solr_xml_get_node_contents(currAttr); param_name_len = solr_strlen(param_name); } if (solr_xml_match_node(currAttr, "allow_multiple")) { allow_multiple = solr_xml_get_node_contents_int(currAttr); } if (solr_xml_match_node(currAttr, "delimiter")) { delimiter = solr_xml_get_node_contents_int(currAttr); } if (solr_xml_match_node(currAttr, "arg_separator")) { separator = solr_xml_get_node_contents_int(currAttr); } currAttr = currAttr->next; } param = solr_create_new_param(param_name, param_name_len, param_type, allow_multiple, equal_func, fetch_func, free_func, delimiter, separator); /* Retrieve all the values for this parameter */ while(currNode != NULL) { if (solr_xml_match_node(currNode, "param_value")) { solr_char_t *pvalue = (solr_char_t *) solr_xml_get_node_contents(currNode); xmlAttr *argument = currNode->properties; /* the argument is the only property */ solr_char_t *avalue = (solr_char_t *) solr_xml_get_node_contents(argument); size_t pvalue_length = solr_strlen(pvalue); size_t avalue_length = solr_strlen(avalue); solr_param_value_t *parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.arg_list.value), pvalue, pvalue_length); solr_string_appends(&(parameter_value->contents.arg_list.arg), avalue, avalue_length); solr_params_insert_param_value(param, parameter_value); } currNode = currNode->next; } /* Add this parameter to the hash table */ if (zend_hash_str_add_ptr(params_ht, (char *) param_name, param_name_len, (void *) param) == NULL) { /* Release all the memory allocated to this paramter */ solr_destroy_param(¶m); php_error_docref(NULL, E_WARNING, "Error from %s %s", __func__, (char *) param_name); return; } } /* }}} */ /* {{{ static int solr_unserialize_solr_params_object(const char *serialized, int size, zval *objptr) */ static int solr_unserialize_solr_params_object(const char *serialized, int size, zval *objptr) { solr_params_t *solr_params = NULL; long int params_index = SOLR_UNIQUE_PARAMS_INDEX(); solr_params_t tmp_solr_params; uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; HashTable *params_ht = NULL; xmlDoc *doc = NULL; xmlXPathContext *xpathctxt; const xmlChar *xpath_expression = (xmlChar *) "/solr_params/params/param/@type"; xmlXPathObject *xpathObj; xmlNodeSet *result = NULL; register size_t num_nodes; register size_t i = 0U; int return_status = SUCCESS; #ifdef PHP_7 solr_params = pemalloc(sizeof(solr_params_t), SOLR_PARAMS_PERSISTENT); #endif zend_update_property_long(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, params_index); memset(&tmp_solr_params, 0, sizeof(solr_params_t)); if ((solr_params = zend_hash_index_update_ptr(SOLR_GLOBAL(params), params_index, (void *) solr_params)) == NULL) { php_error_docref(NULL, E_WARNING, "Error while registering SolrParam object in HashTable"); return FAILURE; } solr_params->params_index = params_index; /* Allocate memory for the parameters HashTable using fast cache for HashTables */ ALLOC_HASHTABLE(solr_params->params); zend_hash_init(solr_params->params, nSize, NULL, (dtor_func_t) solr_destory_param_ht_dtor, SOLR_PARAMS_PERSISTENT); params_ht = solr_params->params; doc = xmlReadMemory(serialized, size, NULL, "UTF-8", 0); if (doc == NULL) { php_error_docref(NULL, E_WARNING, "Error while parsing serialized XML string"); return FAILURE; } xpathctxt = xmlXPathNewContext(doc); if (xpathctxt == NULL) { xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Error while creating XML Xpath context"); return FAILURE; } xpathObj = xmlXPathEval(xpath_expression, xpathctxt); if (xpathObj == NULL) { xmlXPathFreeContext(xpathctxt); xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Error while evaluation XML Xpath expression"); return FAILURE; } result = xpathObj->nodesetval; if (result == NULL) { xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathctxt); xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Error while extracting result from XML xpath object during unserialization"); return FAILURE; } num_nodes = result->nodeNr; /* Number of parameter nodes matches in the xmlDocument */ /* Loop through all the parameter nodes and create an entry in the HashTable for each one */ for (i = 0U; i < num_nodes; i++) { xmlNode *currNode = result->nodeTab[i]; /* Absolutely No assumptions. I have to make sure that this is an attribute node */ if (currNode->type == XML_ATTRIBUTE_NODE) { /* Find out what type of parameter this is */ const solr_param_type_t param_type = solr_xml_get_node_contents_int(currNode); /* Get the /solr_params/params/param node */ xmlNode *param_xml_node = currNode->parent; /* Handle each parameter type separately */ switch(param_type) { case SOLR_PARAM_TYPE_NORMAL : { solr_unserialize_get_param_normal(param_xml_node, params_ht); } break; case SOLR_PARAM_TYPE_SIMPLE_LIST : { solr_unserialize_get_param_simple_list(param_xml_node, params_ht); } break; case SOLR_PARAM_TYPE_ARG_LIST : { solr_unserialize_get_param_arg_list(param_xml_node, params_ht); } break; default : { php_error_docref(NULL, E_WARNING, "Invalid parameter type"); return_status = FAILURE; goto loop_complete; } } /* End switch */ } /* End if (currNode->type == XML_ATTRIBUTE_NODE) */ } /* End for */ loop_complete: xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathctxt); xmlFreeDoc(doc); return return_status; } /* }}} */ /* {{{ SolrParams object constructor inner */ PHP_SOLR_API int solr_params_obj_ctor(zval *obj) { long int params_index = SOLR_UNIQUE_PARAMS_INDEX(); solr_params_t solr_params; if (solr_init_params(&solr_params, params_index) == FAILURE) { return FAILURE; } zend_update_property_long(Z_OBJCE_P(obj), OBJ_FOR_PROP(obj), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, params_index); return SUCCESS; } /* }}} */ /* {{{ SolrParams object destructor inner */ PHP_SOLR_API void solr_params_obj_dtor(zval *obj) { solr_params_t *solr_params = NULL; /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_params_entry(obj, &solr_params) == SUCCESS) { zend_hash_index_del(SOLR_GLOBAL(params), solr_params->params_index); return ; } } /* }}} */ /* {{{ proto SolrParams::__clone(void) Should never be called directly. Throws exceptions whenever there is an attempt to clone a SolrParams instance */ PHP_METHOD(SolrParams, __clone) { long int params_index = SOLR_UNIQUE_PARAMS_INDEX(); solr_params_t solr_params; if (solr_init_params(&solr_params, params_index) == FAILURE) { return; } zend_update_property_long(solr_ce_SolrQuery, OBJ_FOR_PROP(getThis()), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, params_index); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "Cloning of SolrParams object instances is currently not supported"); } /* }}} */ /* {{{ proto SolrParams::setParam(string param_name, string param_value) Sets the parameter to the specified value */ PHP_METHOD(SolrParams, setParam) { solr_char_t *param_name = NULL; COMPAT_ARG_SIZE_T param_name_length = 0; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", ¶m_name, ¶m_name_length, ¶m_value, ¶m_value_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_length, param_value, param_value_length) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrParams::addParam(string param_name, string param_value) Adds another param_name to the object. */ PHP_METHOD(SolrParams, addParam) { solr_char_t *param_name = NULL; COMPAT_ARG_SIZE_T param_name_length = 0; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", ¶m_name, ¶m_name_length, ¶m_value, ¶m_value_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_length, param_value, param_value_length) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrParams::getParam(string param_name) Retrieves a parameter value */ PHP_METHOD(SolrParams, getParam) { solr_char_t *param_name = NULL; COMPAT_ARG_SIZE_T param_name_length = 0; solr_param_t *solr_param = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", ¶m_name, ¶m_name_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_FALSE; } if (!param_name_length) { php_error_docref(NULL, E_WARNING, "Invalid parameter name"); RETURN_NULL(); } if (solr_param_find(getThis(), param_name, param_name_length, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } if (!solr_param) { /* This should never happen unless there is a logic error in solr_param_find() */ php_error_docref(NULL, E_ERROR, "Very severe internal error while fetching (solr_param_t **) from solr_param_find() %s", __func__); return; } switch(solr_param->type) { case SOLR_PARAM_TYPE_NORMAL : { if (solr_param->allow_multiple) { array_init(return_value); solr_normal_param_value_display(solr_param, return_value); return; } else { solr_normal_param_value_display_string(solr_param, return_value); return; } } break; case SOLR_PARAM_TYPE_SIMPLE_LIST : { array_init(return_value); solr_simple_list_param_value_display(solr_param, return_value); return; } break; case SOLR_PARAM_TYPE_ARG_LIST : { array_init(return_value); solr_arg_list_param_value_display(solr_param, return_value); return; } break; default : { /* This should never happen. However, never say never! */ php_error_docref(NULL, E_ERROR, "Invalid parameter type in switch case %s", __func__); } } /* END switch(solr_param->type) */ } /* }}} */ /* {{{ proto array SolrParams::getPreparedParams(void) Returns an array of all the parameters (url-encoded) as they will be sent in the name-value pair POST request. */ PHP_METHOD(SolrParams, getPreparedParams) { solr_params_t *solr_params = NULL; array_init(return_value); /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_params_entry(getThis(), &solr_params) == SUCCESS) { HashTable *params = solr_params->params; SOLR_HASHTABLE_FOR_LOOP(params) { solr_param_t *solr_param = NULL; solr_string_t tmp_buffer; solr_param = zend_hash_get_current_data_ptr(params); memset(&tmp_buffer, 0, sizeof(solr_string_t)); solr_param->fetch_func(solr_param, &tmp_buffer); add_assoc_stringl(return_value, solr_param->param_name, tmp_buffer.str, tmp_buffer.len); solr_string_free(&tmp_buffer); } return; } php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); RETURN_NULL(); } /* }}} */ /* {{{ proto array SolrParams::getParams(void) Returns an array of the parameters in the object. The values are not url-encoded. */ PHP_METHOD(SolrParams, getParams) { solr_params_t *solr_params = NULL; array_init(return_value); /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_params_entry(getThis(), &solr_params) == SUCCESS) { HashTable *params = solr_params->params; SOLR_HASHTABLE_FOR_LOOP(params) { solr_param_t *solr_param_ptr = NULL; solr_param_display_func_t display_func = NULL; zval *current_param = NULL; solr_param_ptr = zend_hash_get_current_data_ptr(params); switch(solr_param_ptr->type) { case SOLR_PARAM_TYPE_NORMAL : { display_func = solr_normal_param_value_display; } break; case SOLR_PARAM_TYPE_SIMPLE_LIST : { display_func = solr_simple_list_param_value_display; } break; case SOLR_PARAM_TYPE_ARG_LIST : { display_func = solr_arg_list_param_value_display; } break; default : { php_error_docref(NULL, E_WARNING, "Invalid parameter type"); } } MAKE_STD_ZVAL(current_param); array_init(current_param); add_assoc_zval(return_value, solr_param_ptr->param_name, current_param); display_func(solr_param_ptr, current_param); #ifdef PHP_7 efree(current_param); #endif } return; } php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrParams::__toString(void) Returns a string representation of the object */ PHP_METHOD(SolrParams, __toString) { solr_params_t *solr_params = NULL; /* Retrieve the params entry */ if (solr_fetch_params_entry(getThis(), &solr_params) == SUCCESS) { solr_string_t params_str = solr_params_to_string(solr_params, 0); if (params_str.str && params_str.len) { RETVAL_STRINGL((char *) params_str.str, params_str.len); solr_string_free(&(params_str)); return; } } RETVAL_STRINGL(SOLR_SPACE_STRING, sizeof(SOLR_SPACE_STRING)-1); } /* }}} */ /* {{{ proto string SolrParams::toString([bool urlEncode=false]) Returns a string representation of the object */ PHP_METHOD(SolrParams, toString) { solr_params_t *solr_params = NULL; zend_bool url_encode = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &url_encode) == FAILURE) { return; } /* Retrieve the params entry */ if (solr_fetch_params_entry(getThis(), &solr_params) == SUCCESS) { solr_string_t params_str = solr_params_to_string(solr_params, url_encode); if (params_str.str && params_str.len) { RETVAL_STRINGL((char *) params_str.str, params_str.len); solr_string_free(&(params_str)); return; } } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrParams::serialize(void) Returns a string representation of the object. Used for custom serialization. */ PHP_METHOD(SolrParams, serialize) { xmlChar *serialized = NULL; int size = 0; if (solr_serialize_solr_params_object(&serialized, &size, getThis()) == FAILURE || !serialized || !size) { php_error_docref(NULL, E_WARNING, "Unable to serialize object"); RETURN_NULL(); } RETVAL_STRINGL((char *) serialized, size); xmlFree(serialized); } /* }}} */ /* {{{ proto array SolrParams::__serialize(void) New serializer. Returns an array with xml=>self::serialize(). */ #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrParams, __serialize) { zend_object *object = Z_OBJ_P(getThis()); zval serialized; zend_call_method_with_0_params(object, object->ce, NULL, "serialize", &serialized); if (Z_TYPE(serialized) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Internal serialize call failed", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } array_init(return_value); add_assoc_zval(return_value, "xml", &serialized); } #endif /* }}} */ /* {{{ proto void SolrParams::__unserialize(array data) New unserializer. */ #if PHP_VERSION_ID >= 80100 PHP_METHOD(SolrParams, __unserialize) { HashTable *data_hash; zend_string *key_str = zend_string_init("xml", sizeof("xml") -1, 1); zend_object *object = NULL; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", &data_hash) == FAILURE) { zend_string_release(key_str); solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Invalid unserialize data", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } if ((tmp = zend_hash_find(data_hash, key_str)) == NULL) { zend_string_release(key_str); solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Failed to find xml in serialized data", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_THROWS(); } zend_string_release(key_str); object = Z_OBJ_P(getThis()); zend_call_method_with_1_params(object, object->ce, NULL, "unserialize", NULL, tmp); } #endif /* }}} */ /* {{{ proto void SolrParams::unserialize(string serialized) Brings the serialized object back to life. */ PHP_METHOD(SolrParams, unserialize) { char *serialized_object = NULL; COMPAT_ARG_SIZE_T serialized_object_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &serialized_object, &serialized_object_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if(serialized_object_len == 0) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_unserialize_solr_params_object(serialized_object, serialized_object_len, getThis()) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error during unserialization"); } } /* }}} */ /* {{{ proto void SolrModifiableParams::__construct(void) Constructor. */ PHP_METHOD(SolrModifiableParams, __construct) { solr_params_obj_ctor(getThis()); } /* }}} */ /* {{{ proto void SolrModifiableParams::__destruct(void) Destructor. */ PHP_METHOD(SolrModifiableParams, __destruct) { solr_params_obj_dtor(getThis()); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_query.c0000644000175000017500000046743715001737315015462 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* Outstanding Work/Changes */ /* TODO: Change SolrQuery::getTermsSort() to return integer */ /* TODO: Change SolrQuery::getFacetSort() to return integer */ /** * Note about methods implementation: * * One reason why each SolrQuery has custom code is because each method * could require separate tweaking. * * At this point in time, even though most of the SolrQuery methods share * basic features, I still believe that is a better idea to write separate code * for each method implementation. * * This will make the methods easier to maintain because * * from time to time, Solr modifies the way some of the request parameters are * submitted or processed. * * Hence, it is currently more logical to make each method an independent entity. */ /* {{{ proto SolrQuery::__construct([string q]) Constructor for SolrQuery */ PHP_METHOD(SolrQuery, __construct) { long int params_index = SOLR_UNIQUE_PARAMS_INDEX(); solr_char_t *q = NULL; COMPAT_ARG_SIZE_T query_length = 0; solr_params_t solr_params; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, solr_ce_SolrIllegalArgumentException, &error_handling); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &q, &query_length) == FAILURE) { zend_restore_error_handling(&error_handling); return; } zend_restore_error_handling(&error_handling); if (solr_init_params(&solr_params, params_index) == FAILURE) { return; } zend_update_property_long(solr_ce_SolrQuery, OBJ_FOR_PROP(getThis()), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, params_index); if (query_length) { if (solr_set_normal_param(getThis(), (solr_char_t *) "q", sizeof("q")-1, q, query_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error while setting query parameter"); return; } } } /* }}} */ /* {{{ proto SolrQuery::__destruct() Destructor for SolrQuery */ PHP_METHOD(SolrQuery, __destruct) { solr_params_t *solr_params = NULL; /* Retrieve the entry for this SolrParams instance */ if (solr_fetch_params_entry(getThis(), &solr_params) == SUCCESS) { zend_hash_index_del(SOLR_GLOBAL(params), solr_params->params_index); return ; } /* This would only happen if user attempted an illegal operation */ php_error_docref(NULL, E_ERROR, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); } /* }}} */ /* {{{ CommonQueryParameters */ /* {{{ proto SolrQuery SolrQuery::setQuery(string q) Sets the q parameter */ PHP_METHOD(SolrQuery, setQuery) { solr_char_t *param_name = (solr_char_t *) "q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("q")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setStart(int start) Sets the start parameter */ PHP_METHOD(SolrQuery, setStart) { solr_char_t *param_name = (solr_char_t *) "start"; COMPAT_ARG_SIZE_T param_name_len = sizeof("start")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zval *tmp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } param_value = Z_STRVAL_P(tmp); param_value_len = Z_STRLEN_P(tmp); if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setRows(int rows) Sets the rows parameter */ PHP_METHOD(SolrQuery, setRows) { solr_char_t *param_name = (solr_char_t *) "rows"; COMPAT_ARG_SIZE_T param_name_len = sizeof("rows")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } param_value = Z_STRVAL_P(tmp); param_value_len = Z_STRLEN_P(tmp); if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addField(string fl) Adds another fl parameter */ PHP_METHOD(SolrQuery, addField) { solr_char_t *param_name = (solr_char_t *) "fl"; size_t param_name_len = sizeof("fl")-1; solr_char_t *param_value = NULL; size_t param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_simple_list_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addSortField(string fl [, int sort_direction]) Adds another sort parameter */ PHP_METHOD(SolrQuery, addSortField) { solr_char_t *param_name = (solr_char_t *) "sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("sort")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; long int sort_direction = 1L; solr_sort_dir_t sort_order = SOLR_SORT_DIR_DESC; solr_char_t *avalue = NULL; COMPAT_ARG_SIZE_T avalue_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", ¶m_value, ¶m_value_len, &sort_direction) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } sort_order = (sort_direction < 0L || sort_direction > 1L) ? SOLR_SORT_DIR_DESC : (solr_sort_dir_t) sort_direction; avalue = (sort_order) ? "desc" : "asc"; avalue_length = solr_strlen(avalue); if (solr_add_arg_list_param(getThis(), param_name, param_name_len, param_value, param_value_len, avalue, avalue_length, ',', ' ') == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addFiterQuery(string fq) Adds another fq parameter */ PHP_METHOD(SolrQuery, addFilterQuery) { solr_char_t *param_name = (solr_char_t *) "fq"; COMPAT_ARG_SIZE_T param_name_len = sizeof("fq")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setShowDebugInfo(bool flag) Sets the debugQuery parameter */ PHP_METHOD(SolrQuery, setShowDebugInfo) { solr_char_t *param_name = (solr_char_t *) "debugQuery"; COMPAT_ARG_SIZE_T param_name_len = sizeof("debugQuery")-1; zend_bool show_debug_info = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &show_debug_info) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (!show_debug_info) { solr_delete_solr_parameter(getThis(), param_name, param_name_len); solr_return_solr_params_object(); return; } if (solr_set_normal_param(getThis(), param_name, param_name_len, "true", sizeof("true")-1) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error adding debugging info "); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setExplainOther(string explainOther) Sets the explainOther parameter */ PHP_METHOD(SolrQuery, setExplainOther) { solr_char_t *param_name = (solr_char_t *) "explainOther"; COMPAT_ARG_SIZE_T param_name_len = sizeof("explainOther")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTimeAllowed(int milliseconds) Sets the maximum time in milliseconds allowed for the query */ PHP_METHOD(SolrQuery, setTimeAllowed) { solr_char_t *param_name = (solr_char_t *) "timeAllowed"; COMPAT_ARG_SIZE_T param_name_len = sizeof("timeAllowed")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } param_value = Z_STRVAL_P(tmp); param_value_len = Z_STRLEN_P(tmp); if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setOmitHeader(bool flag) Sets the omitHeader parameter */ PHP_METHOD(SolrQuery, setOmitHeader) { solr_char_t *param_name = (solr_char_t *) "omitHeader"; COMPAT_ARG_SIZE_T param_name_len = sizeof("omitHeader")-1; COMPAT_ARG_SIZE_T param_value_len = 0; zend_bool omit_header = 0; solr_char_t *omit_header_str = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &omit_header) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } omit_header_str = (omit_header)? "true" : "false"; param_value_len = solr_strlen(omit_header_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, omit_header_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, omit_header_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} END OF CommonQueryParameters */ /* {{{ CoreQueryParameters */ /* {{{ proto SolrQuery SolrQuery::setEchoHandler(bool flag) Sets the echoHandler parameter */ PHP_METHOD(SolrQuery, setEchoHandler) { solr_char_t *param_name = (solr_char_t *) "echoHandler"; COMPAT_ARG_SIZE_T param_name_len = sizeof("echoHandler")-1; COMPAT_ARG_SIZE_T param_value_len = 0; zend_bool echo_handler = 0; solr_char_t *echo_handler_str = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &echo_handler) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } echo_handler_str = (echo_handler)? "true" : "false"; param_value_len = solr_strlen(echo_handler_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, echo_handler_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, echo_handler_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setEchoParams(string value) Sets the echoParams parameter */ PHP_METHOD(SolrQuery, setEchoParams) { solr_char_t *param_name = (solr_char_t *) "echoParams"; COMPAT_ARG_SIZE_T param_name_len = sizeof("echoParams")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} END OF CoreQueryParameters */ /* {{{ SimpleFacetParameters */ /* {{{ proto SolrQuery SolrQuery::setFacet(bool value) Sets the facet parameter */ PHP_METHOD(SolrQuery, setFacet) { solr_char_t *param_name = (solr_char_t *) "facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addFacetField(string value) Sets the facet.field parameter */ PHP_METHOD(SolrQuery, addFacetField) { solr_char_t *param_name = (solr_char_t *) "facet.field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.field")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addFacetQuery(string value) Adds another facet.query parameter */ PHP_METHOD(SolrQuery, addFacetQuery) { solr_char_t *param_name = (solr_char_t *) "facet.query"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.query")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetPrefix(string value [, string field_override]) Sets the facet.prefix parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetPrefix) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.prefix"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetSort(int value [, string field_override]) Sets the facet.sort parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetSort) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; long int sort_type = 0L; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|s", &sort_type, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.sort"); param_value = ((sort_type)? "count" : "index"); param_value_len = solr_strlen(param_value); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetLimit(string value [, string field_override]) Sets the facet.limit parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetLimit) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.limit"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetOffset(string value [, string field_override]) Sets the facet.offset parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetOffset) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.offset"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetMinCount(string value [, string field_override]) Sets the facet.mincount parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetMinCount) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.mincount"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetMissing(bool value [, string field_override]) Sets the facet.missing parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetMissing) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zend_bool bool_flag = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "b|s", &bool_flag, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.missing"); param_value = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(param_value); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetMethod(string value [, string field_override]) Sets the facet.method parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetMethod) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.method"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetEnumCacheMinDefaultFrequency(string value [, string field_override]) Sets the facet.enum.cache.minDf parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetEnumCacheMinDefaultFrequency) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.enum.cache.minDf"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ Date facet parameters */ /* {{{ proto SolrQuery SolrQuery::addFacetDateField(string value) Adds another facet.date parameter. */ PHP_METHOD(SolrQuery, addFacetDateField) { solr_char_t *param_name = (solr_char_t *) "facet.date"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.date")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetDateStart(string value [, string field_override]) Sets the facet.date.start parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetDateStart) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.start"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetDateEnd(string value [, string field_override]) Sets the facet.date.end parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetDateEnd) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.end"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetDateGap(string value [, string field_override]) Sets the facet.date.gap parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetDateGap) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.gap"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setFacetDateHardEnd(bool value [, string field_override]) Sets the facet.date.hardend parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setFacetDateHardEnd) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zend_bool bool_flag = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "b|s", &bool_flag, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.hardend"); param_value = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(param_value); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addFacetDateOther(string value [, string field_override]) Sets the facet.date.other parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, addFacetDateOther) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.other"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* }}} End of date facet parameters */ /* }}} End of SimpleFacetParameters */ /* {{{ SimpleGroupParameters */ /* {{{ proto SolrQuery SolrQuery::setGroup(bool value) Enable result grouping (group parameter) */ PHP_METHOD(SolrQuery, setGroup) { solr_char_t *param_name = (solr_char_t *) "group"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getGroup() Returns true if grouping is enabled */ PHP_METHOD(SolrQuery, getGroup) { solr_char_t *param_name = (solr_char_t *) "group"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addGroupField(string value) Adds a group.field parameter */ PHP_METHOD(SolrQuery, addGroupField) { solr_char_t *param_name = (solr_char_t *) "group.field"; int param_name_len = sizeof("group.field")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getGroupFields() Returns all the group fields (group.field parameter values) */ PHP_METHOD(SolrQuery, getGroupFields) { solr_char_t *param_name = (solr_char_t *) "group.field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.field")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addGroupFunction(string value) Adds a group function (group.func parameter) */ PHP_METHOD(SolrQuery, addGroupFunction) { solr_char_t *param_name = (solr_char_t *) "group.func"; int param_name_len = sizeof("group.func")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getGroupFunctions() Returns all the group functions (group.func parameters) */ PHP_METHOD(SolrQuery, getGroupFunctions) { solr_char_t *param_name = (solr_char_t *) "group.func"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.func")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addGroupQuery(string value) Sets the group.query parameter */ PHP_METHOD(SolrQuery, addGroupQuery) { solr_char_t *param_name = (solr_char_t *) "group.query"; int param_name_len = sizeof("group.query")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getGroupQueries() Returns all the group.query parameter values */ PHP_METHOD(SolrQuery, getGroupQueries) { solr_char_t *param_name = (solr_char_t *) "group.query"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.query")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupLimit(string value) Sets the group.limit parameter. */ PHP_METHOD(SolrQuery, setGroupLimit) { solr_char_t *param_name = (solr_char_t *) "group.limit"; int param_name_len = sizeof("group.limit")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto int SolrQuery::getGroupLimit() Returns the group.limit value */ PHP_METHOD(SolrQuery, getGroupLimit) { solr_char_t *param_name = (solr_char_t *) "group.limit"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.limit")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupOffset(int offset) Sets the group.offset parameter. */ PHP_METHOD(SolrQuery, setGroupOffset) { solr_char_t *param_name = (solr_char_t *) "group.offset"; int param_name_len = sizeof("group.offset")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } param_value = Z_STRVAL_P(tmp); param_value_len = Z_STRLEN_P(tmp); if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto int SolrQuery::getGroupOffset() Returns the group.offset value */ PHP_METHOD(SolrQuery, getGroupOffset) { solr_char_t *param_name = (solr_char_t *) "group.offset"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.offset")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addGroupSortField(string sort[, integer direction]) Add a group sort field (group.sort parameter). */ PHP_METHOD(SolrQuery, addGroupSortField) { solr_char_t *param_name = (solr_char_t *) "group.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.sort")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; long int sort_direction = 1L; solr_sort_dir_t sort_order = SOLR_SORT_DIR_DESC; solr_char_t *avalue = NULL; COMPAT_ARG_SIZE_T avalue_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", ¶m_value, ¶m_value_len, &sort_direction) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } sort_order = (sort_direction < 0L || sort_direction > 1L) ? SOLR_SORT_DIR_DESC : (solr_sort_dir_t) sort_direction; avalue = (sort_order) ? "desc" : "asc"; avalue_length = solr_strlen(avalue); if (solr_add_arg_list_param(getThis(), param_name, param_name_len, param_value, param_value_len, avalue, avalue_length, ',', ' ') == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto array SolrQuery::getGroupSortFields() Returns the group.sort value */ PHP_METHOD(SolrQuery, getGroupSortFields) { solr_char_t *param_name = (solr_char_t *) "group.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.sort")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_arg_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupFormat(string value) Sets the group.format parameter. */ PHP_METHOD(SolrQuery, setGroupFormat) { solr_char_t *param_name = (solr_char_t *) "group.format"; int param_name_len = sizeof("group.format")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s ", param_value, param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getGroupFormat() Returns the group.format value */ PHP_METHOD(SolrQuery, getGroupFormat) { solr_char_t *param_name = (solr_char_t *) "group.format"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.format")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupMain(bool value) Sets the group.main parameter */ PHP_METHOD(SolrQuery, setGroupMain) { solr_char_t *param_name = (solr_char_t *) "group.main"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.main")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getGroupMain() Returns the group.main value */ PHP_METHOD(SolrQuery, getGroupMain) { solr_char_t *param_name = (solr_char_t *) "group.main"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.main")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupNGroups(bool value) Sets the group.ngroups parameter */ PHP_METHOD(SolrQuery, setGroupNGroups) { solr_char_t *param_name = (solr_char_t *) "group.ngroups"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.ngroups")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getGroupNGroups() Returns the group.ngroups value */ PHP_METHOD(SolrQuery, getGroupNGroups) { solr_char_t *param_name = (solr_char_t *) "group.ngroups"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.ngroups")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupTruncate(bool value) Sets the group.truncate parameter */ PHP_METHOD(SolrQuery, setGroupTruncate) { solr_char_t *param_name = (solr_char_t *) "group.truncate"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.truncate")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getGroupTruncate() Returns the group.truncate value */ PHP_METHOD(SolrQuery, getGroupTruncate) { solr_char_t *param_name = (solr_char_t *) "group.truncate"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.truncate")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupFacet(bool value) Sets the group.facet parameter */ PHP_METHOD(SolrQuery, setGroupFacet) { solr_char_t *param_name = (solr_char_t *) "group.facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.facet")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getGroupFacet() Returns the group.facet value */ PHP_METHOD(SolrQuery, getGroupFacet) { solr_char_t *param_name = (solr_char_t *) "group.facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.facet")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setGroupCachePercent(int value) sets the group cache percent group.cache.percent value */ PHP_METHOD(SolrQuery, setGroupCachePercent) { solr_char_t *param_name = (solr_char_t *) "group.cache.percent"; COMPAT_ARG_SIZE_T param_name_len = sizeof ("group.cache.percent")-1; long cache_pct = 0; solr_char_t pval[4]; int pval_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &cache_pct)) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } if (cache_pct < 0 || cache_pct > 100) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Group cache percent must be between 0 and 100", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } snprintf (pval, sizeof(pval), "%ld", cache_pct); pval_len = strlen(pval); if (solr_add_or_set_normal_param(getThis(), param_name, param_name_len, pval, pval_len, 0)) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, pval); efree(pval); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto int SolrQuery::getGroupCachePercent() Gets the group cache percent group.cache.percent value */ PHP_METHOD(SolrQuery, getGroupCachePercent) { solr_char_t *param_name = (solr_char_t *) "group.cache.percent"; COMPAT_ARG_SIZE_T param_name_len = sizeof("group.cache.percent")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* }}} End of SimpleGroupParameters */ /* {{{ proto SolrQuery SolrQuery::collapse(SolrCollapseFunction collapseFunction) Collapse a Solr Query */ PHP_METHOD(SolrQuery, collapse) { solr_char_t *param_name = (solr_char_t *) "fq"; COMPAT_ARG_SIZE_T param_name_len = sizeof("fq")-1; zval *collapse_func_obj, *obj_ref; solr_function_t *collapse_func; solr_string_t *buffer = NULL; zend_string *field_str = zend_string_init("field", sizeof("field"), SOLR_FUNCTIONS_PERSISTENT); if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &obj_ref) == FAILURE) { RETURN_NULL(); } if (Z_TYPE_P(obj_ref) == IS_REFERENCE) { collapse_func_obj = Z_REFVAL_P(obj_ref); } else { collapse_func_obj = obj_ref; } if(solr_fetch_function_entry(collapse_func_obj, &collapse_func) == FAILURE) { php_error_docref(NULL, E_ERROR, "Internal Error Unable to fetch function from functions global"); RETURN_NULL(); } /* validate */ if (!zend_hash_exists(collapse_func->params, field_str)) { solr_throw_exception_ex(solr_ce_SolrMissingMandatoryParameterException,SOLR_ERROR_4100, SOLR_FILE_LINE_FUNC, SOLR_ERROR_4100_MSG, "field"); } buffer = (solr_string_t *)pemalloc(sizeof(solr_string_t), SOLR_STRING_PERSISTENT); memset(buffer, 0, sizeof(solr_string_t)); solr_solrfunc_to_string(collapse_func, &buffer); if (solr_add_or_set_normal_param(getThis(), param_name, param_name_len, buffer->str, buffer->len, 1) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, buffer->str); } solr_string_free(buffer); pefree(buffer, SOLR_STRING_PERSISTENT); zend_string_release(field_str); solr_return_solr_params_object(); } /* }}} */ /* {{{ Expand Parameters */ /* {{{ proto SolrQuery SolrQuery::setExpand(bool value) Sets the expand parameter. This enables or disables group expanding. */ PHP_METHOD(SolrQuery, setExpand) { solr_char_t *param_name = (solr_char_t *) "expand"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto bool SolrQuery::getExpand() Returns true if group expanding is enabled */ PHP_METHOD(SolrQuery, getExpand) { solr_char_t *param_name = (solr_char_t *) "expand"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addExpandSortField(string sort[, integer direction]) Orders the documents within the expanded groups (expand.sort parameter). */ PHP_METHOD(SolrQuery, addExpandSortField) { solr_char_t *param_name = (solr_char_t *) "expand.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.sort")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; long int sort_direction = 1L; solr_sort_dir_t sort_order = SOLR_SORT_DIR_DESC; solr_char_t *avalue = NULL; COMPAT_ARG_SIZE_T avalue_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", ¶m_value, ¶m_value_len, &sort_direction) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } sort_order = (sort_direction < 0L || sort_direction > 1L) ? SOLR_SORT_DIR_DESC : (solr_sort_dir_t) sort_direction; avalue = (sort_order) ? "desc" : "asc"; avalue_length = solr_strlen(avalue); if (solr_add_arg_list_param(getThis(), param_name, param_name_len, param_value, param_value_len, avalue, avalue_length, ',', ' ') == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeExpandSortField(string field) Removes an expand sort field from the expand.sort parameter. */ PHP_METHOD(SolrQuery, removeExpandSortField) { solr_char_t *pname = (solr_char_t *) "expand.sort"; int pname_length = sizeof("expand.sort")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getExpandSortFields() returns an array of fields */ PHP_METHOD(SolrQuery, getExpandSortFields) { solr_char_t *param_name = (solr_char_t *) "expand.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.sort")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setExpandRows(int rows) Sets the number of rows to display in each group (expand.rows). Server Default 5 */ PHP_METHOD(SolrQuery, setExpandRows) { solr_char_t *param_name = (solr_char_t *) "expand.rows"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.rows")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); RETURN_NULL(); } param_value = Z_STRVAL_P(tmp); param_value_len = Z_STRLEN_P(tmp); if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto int SolrQuery::getExpandRows() Returns The number of rows to display in each group (expand.rows) */ PHP_METHOD(SolrQuery, getExpandRows) { solr_char_t *param_name = (solr_char_t *) "expand.rows"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.rows")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setExpandQuery(string q) Sets the expand.q parameter. Overrides the main q parameter, determines which documents to include in the main group. */ PHP_METHOD(SolrQuery, setExpandQuery) { solr_char_t *param_name = (solr_char_t *) "expand.q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.q")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto string SolrQuery::getExpandQuery() Returns the expand query expand.q parameter */ PHP_METHOD(SolrQuery, getExpandQuery) { solr_char_t *param_name = (solr_char_t *) "expand.q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.q")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addExpandFilterQuery(string fq) Overrides main fq's, determines which documents to include in the main group. */ PHP_METHOD(SolrQuery, addExpandFilterQuery) { solr_char_t *param_name = (solr_char_t *) "expand.fq"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.fq")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeExpandFilterQuery(string fq) Removes an expand filter query. */ PHP_METHOD(SolrQuery, removeExpandFilterQuery) { solr_char_t *pname = (solr_char_t *) "expand.fq"; int pname_length = sizeof("expand.fq")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto array SolrQuery::getExpandFilterQueries() Returns the expand filter queries */ PHP_METHOD(SolrQuery, getExpandFilterQueries) { solr_char_t *param_name = (solr_char_t *) "expand.fq"; COMPAT_ARG_SIZE_T param_name_len = sizeof("expand.fq")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* }}} */ /* {{{ HighlightingParameters */ /* {{{ proto SolrQuery SolrQuery::setHighlight(bool value) Sets the hl parameter. This enables or disables highlighting. */ PHP_METHOD(SolrQuery, setHighlight) { solr_char_t *param_name = (solr_char_t *) "hl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightQuery(string q) Sets the hl.q parameter */ PHP_METHOD(SolrQuery, setHighlightQuery) { solr_char_t *param_name = (solr_char_t *) "hl.q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.q")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addHighlightField(string value) Adds another hl.fl parameter. */ PHP_METHOD(SolrQuery, addHighlightField) { solr_char_t *list_param_name = (solr_char_t *) "hl.fl"; COMPAT_ARG_SIZE_T list_param_name_len = sizeof("hl.fl")-1; solr_char_t *list_param_value = NULL; COMPAT_ARG_SIZE_T list_param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &list_param_value, &list_param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_simple_list_param(getThis(), list_param_name, list_param_name_len, list_param_value, list_param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s list ", list_param_value, list_param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightSnippets(string value [, string field_override]) Sets the hl.snippets parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightSnippets) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.snippets"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightFragsize(string value [, string field_override]) Sets the hl.fragsize parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightFragsize) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.fragsize"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightMergeContiguous(bool flag [, string field_override]) Sets the hl.mergeContiguous parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightMergeContiguous) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; zend_bool bool_flag = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "b|s", &bool_flag, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.mergeContiguous"); param_value = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(param_value); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightRequireFieldMatch(bool flag) Sets the hl.requireFieldMatch. */ PHP_METHOD(SolrQuery, setHighlightRequireFieldMatch) { solr_char_t *param_name = (solr_char_t *) "hl.requireFieldMatch"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.requireFieldMatch")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightMaxAnalyzedChars(string value) Sets the hl.maxAnalyzedChars parameter */ PHP_METHOD(SolrQuery, setHighlightMaxAnalyzedChars) { solr_char_t *param_name = (solr_char_t *) "hl.maxAnalyzedChars"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.maxAnalyzedChars")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightAlternateField(string value [, string field_override]) Sets the hl.alternateField parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightAlternateField) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.alternateField"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightMaxAlternateFieldLength(string value [, string field_override]) Sets the hl.maxAlternateFieldLength parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightMaxAlternateFieldLength) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.maxAlternateFieldLength"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightFormatter(string value [, string field_override]) Sets the hl.formatter parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightFormatter) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = "simple"; COMPAT_ARG_SIZE_T param_value_len = sizeof("simple")-1; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.formatter"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightSimplePre(string value [, string field_override]) Sets the hl.simple.pre parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightSimplePre) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = ""; COMPAT_ARG_SIZE_T param_value_len = sizeof("")-1; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.simple.pre"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightSimplePost(string value [, string field_override]) Sets the hl.simple.post parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightSimplePost) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = ""; COMPAT_ARG_SIZE_T param_value_len = sizeof("")-1; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.simple.post"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightFragmenter(string value [, string field_override]) Sets the hl.fragmenter parameter. Accepts an optional field override. */ PHP_METHOD(SolrQuery, setHighlightFragmenter) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "hl.fragmenter"); if (solr_set_normal_param(getThis(), fbuf.str, fbuf.len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", fbuf.str, param_value); solr_string_free(&fbuf); RETURN_NULL(); } solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightUsePhraseHighlighter(bool flag) Sets the hl.usePhraseHighlighter parameter. */ PHP_METHOD(SolrQuery, setHighlightUsePhraseHighlighter) { solr_char_t *param_name = (solr_char_t *) "hl.usePhraseHighlighter"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.usePhraseHighlighter")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightHighlightMultiTerm(bool flag) Sets the hl.highlightMultiTerm parameter. */ PHP_METHOD(SolrQuery, setHighlightHighlightMultiTerm) { solr_char_t *param_name = (solr_char_t *) "hl.highlightMultiTerm"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.highlightMultiTerm")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightRegexSlop(string value) Sets the hl.regex.slop parameter. */ PHP_METHOD(SolrQuery, setHighlightRegexSlop) { solr_char_t *param_name = (solr_char_t *) "hl.regex.slop"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.slop")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightRegexPattern(string value) Sets the hl.regex.pattern parameter. */ PHP_METHOD(SolrQuery, setHighlightRegexPattern) { solr_char_t *param_name = (solr_char_t *) "hl.regex.pattern"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.pattern")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setHighlightRegexMaxAnalyzedChars(string value) Sets the hl.regex.maxAnalyzedChars parameter. */ PHP_METHOD(SolrQuery, setHighlightRegexMaxAnalyzedChars) { solr_char_t *param_name = (solr_char_t *) "hl.regex.maxAnalyzedChars"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.maxAnalyzedChars")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} End of HighlightingParameters */ /* {{{ StatsComponent */ /* {{{ proto SolrQuery SolrQuery::setStats(bool flag) Sets the stats parameter. Enables or disables stats */ PHP_METHOD(SolrQuery, setStats) { solr_char_t *param_name = (solr_char_t *) "stats"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addStatsField(string value) Adds another stats.field parameter. */ PHP_METHOD(SolrQuery, addStatsField) { solr_char_t *param_name = (solr_char_t *) "stats.field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats.field")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error adding parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addStatsFacet(string value) Adds another stats.facet parameter. */ PHP_METHOD(SolrQuery, addStatsFacet) { solr_char_t *param_name = (solr_char_t *) "stats.facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats.facet")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error adding parameter %s=%s ", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} End of StatsComponent */ /* {{{ MoreLikeThis */ /* {{{ proto SolrQuery SolrQuery::setMlt(bool flag) Sets the mlt parameter. Enables or disables the moreLikeThis component */ PHP_METHOD(SolrQuery, setMlt) { solr_char_t *param_name = (solr_char_t *) "mlt"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltCount(string value) Sets the mlt.count parameter. */ PHP_METHOD(SolrQuery, setMltCount) { solr_char_t *param_name = (solr_char_t *) "mlt.count"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.count")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addMltField(string field) Adds another field name to the mlt.fl parameter. */ PHP_METHOD(SolrQuery, addMltField) { solr_char_t *list_param_name = (solr_char_t *) "mlt.fl"; COMPAT_ARG_SIZE_T list_param_name_len = sizeof("mlt.fl")-1; solr_char_t *list_param_value = NULL; COMPAT_ARG_SIZE_T list_param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &list_param_value, &list_param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_simple_list_param(getThis(), list_param_name, list_param_name_len, list_param_value, list_param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add param value %s to %s list ", list_param_value, list_param_name); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::addMltQueryField(string value, string boost) Adds another query field and boost value to the mlt.qf parameter. */ PHP_METHOD(SolrQuery, addMltQueryField) { solr_char_t *param_name = (solr_char_t *) "mlt.qf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.qf")-1; solr_char_t *query_field = NULL; COMPAT_ARG_SIZE_T query_field_length = 0; solr_char_t *boost_value = "1.0"; COMPAT_ARG_SIZE_T boost_value_length = sizeof("1.0"); /* TODO: make boost optional parameter. */ /* If boost is not sent, then the index time boost is used */ /* This will involve re-doing all the arg_list functions to allow optional args. */ /* Temporary solution is to use SolrQuery::add("mlt.qf", "value"). This should be documented. */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &query_field, &query_field_length, &boost_value, &boost_value_length) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_add_arg_list_param(getThis(), param_name, param_name_len, query_field, query_field_length, boost_value, boost_value_length, ' ', '^') == FAILURE) { RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMinTermFrequency(string value) Sets the mlt.mintf parameter. */ PHP_METHOD(SolrQuery, setMltMinTermFrequency) { solr_char_t *param_name = (solr_char_t *) "mlt.mintf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.mintf")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMinDocFrequency(string value) Sets the mlt.mindf parameter. */ PHP_METHOD(SolrQuery, setMltMinDocFrequency) { solr_char_t *param_name = (solr_char_t *) "mlt.mindf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.mindf")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMinWordLength(string value) Sets the mlt.minwl parameter. */ PHP_METHOD(SolrQuery, setMltMinWordLength) { solr_char_t *param_name = (solr_char_t *) "mlt.minwl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.minwl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMaxWordLength(string value) Sets the mlt.maxwl parameter. */ PHP_METHOD(SolrQuery, setMltMaxWordLength) { solr_char_t *param_name = (solr_char_t *) "mlt.maxwl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxwl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMaxNumTokens(string value) Sets the mlt.maxntp parameter. */ PHP_METHOD(SolrQuery, setMltMaxNumTokens) { solr_char_t *param_name = (solr_char_t *) "mlt.maxntp"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxntp")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltMaxNumQueryTerms(string value) Sets the mlt.maxqt parameter. */ PHP_METHOD(SolrQuery, setMltMaxNumQueryTerms) { solr_char_t *param_name = (solr_char_t *) "mlt.maxqt"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxqt")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setMltBoost(bool flag) Sets the mlt.boost parameter. */ PHP_METHOD(SolrQuery, setMltBoost) { solr_char_t *param_name = (solr_char_t *) "mlt.boost"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.boost")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} End of MoreLikeThis */ /* {{{ TermsComponent */ /* {{{ proto SolrQuery SolrQuery::setTerms(bool flag) Sets the terms parameter. This flag enables or disables the TermsComponent */ PHP_METHOD(SolrQuery, setTerms) { solr_char_t *param_name = (solr_char_t *) "terms"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsField(string field) Sets the terms.fl parameter. */ PHP_METHOD(SolrQuery, setTermsField) { solr_char_t *param_name = (solr_char_t *) "terms.fl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.fl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsLowerBound(string value) Sets the terms.lower parameter. */ PHP_METHOD(SolrQuery, setTermsLowerBound) { solr_char_t *param_name = (solr_char_t *) "terms.lower"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.lower")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsUpperBound(string value) Sets the terms.upper parameter. */ PHP_METHOD(SolrQuery, setTermsUpperBound) { solr_char_t *param_name = (solr_char_t *) "terms.upper"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.upper")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsIncludeLowerBound(string value) Sets the terms.lower.incl parameter. */ PHP_METHOD(SolrQuery, setTermsIncludeLowerBound) { solr_char_t *param_name = (solr_char_t *) "terms.lower.incl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.lower.incl")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsIncludeUpperBound(string value) Sets the terms.upper.incl parameter. */ PHP_METHOD(SolrQuery, setTermsIncludeUpperBound) { solr_char_t *param_name = (solr_char_t *) "terms.upper.incl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.upper.incl")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsMinCount(string value) Sets the terms.mincount parameter. */ PHP_METHOD(SolrQuery, setTermsMinCount) { solr_char_t *param_name = (solr_char_t *) "terms.mincount"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.mincount")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsMaxCount(string value) Sets the terms.maxcount parameter. */ PHP_METHOD(SolrQuery, setTermsMaxCount) { solr_char_t *param_name = (solr_char_t *) "terms.maxcount"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.maxcount")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsPrefix(string value) Sets the terms.prefix parameter. */ PHP_METHOD(SolrQuery, setTermsPrefix) { solr_char_t *param_name = (solr_char_t *) "terms.prefix"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.prefix")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsLimit(string value) Sets the terms.limit parameter. */ PHP_METHOD(SolrQuery, setTermsLimit) { solr_char_t *param_name = (solr_char_t *) "terms.limit"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.limit")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (solr_set_normal_param(getThis(), param_name, param_name_len, param_value, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s", param_name, param_value); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsReturnRaw(bool flag) Sets the terms.raw parameter. */ PHP_METHOD(SolrQuery, setTermsReturnRaw) { solr_char_t *param_name = (solr_char_t *) "terms.raw"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.raw")-1; zend_bool bool_flag = 0; solr_char_t *bool_flag_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &bool_flag) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } bool_flag_str = ((bool_flag)? "true" : "false"); param_value_len = solr_strlen(bool_flag_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, bool_flag_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, bool_flag_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::setTermsSort(int sort) Sets the terms.sort parameter. */ PHP_METHOD(SolrQuery, setTermsSort) { solr_char_t *param_name = (solr_char_t *) "terms.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.sort")-1; long int sort_type = 0L; solr_char_t *sort_type_str = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &sort_type) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter"); RETURN_NULL(); } sort_type_str = ((sort_type)? "count" : "index"); param_value_len = solr_strlen(sort_type_str); if (solr_set_normal_param(getThis(), param_name, param_name_len, sort_type_str, param_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Error setting parameter %s=%s ", param_name, sort_type_str); RETURN_NULL(); } solr_return_solr_params_object(); } /* }}} */ /* }}} End of TermsComponent */ /* {{{ Value removal methods */ /* {{{ proto SolrQuery SolrQuery::removeField(string fl) Removes a field from the fl parameter */ PHP_METHOD(SolrQuery, removeField) { solr_char_t *pname = (solr_char_t *) "fl"; int pname_length = sizeof("fl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_simple_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeSortField(string fl) Removes a sort field from the sort parameter. */ PHP_METHOD(SolrQuery, removeSortField) { solr_char_t *pname = (solr_char_t *) "sort"; int pname_length = sizeof("sort")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeFilterQuery(string fq) Removes one of the fq parameter. */ PHP_METHOD(SolrQuery, removeFilterQuery) { solr_char_t *pname = (solr_char_t *) "fq"; int pname_length = sizeof("fq")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeFacetField(string field) Removes one of fields from the facet.field parameter. */ PHP_METHOD(SolrQuery, removeFacetField) { solr_char_t *pname = (solr_char_t *) "facet.field"; int pname_length = sizeof("facet.field")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeFacetQuery(string facet_query) Removes one of the facet.query parameters. */ PHP_METHOD(SolrQuery, removeFacetQuery) { solr_char_t *pname = (solr_char_t *) "facet.query"; int pname_length = sizeof("facet.query")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeFacetDateField(string date_field) Removes one of the facet.date parameters. */ PHP_METHOD(SolrQuery, removeFacetDateField) { solr_char_t *pname = (solr_char_t *) "facet.date"; int pname_length = sizeof("facet.date")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeFacetDateOther(string value [, string field_override]) Removes one of the facet.date.other parameters. Also accepts an optional field override. */ PHP_METHOD(SolrQuery, removeFacetDateOther) { solr_string_t fbuf; /* Field name buffer to prepare field override */ /* Parameter value */ solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; /* Field name override,f if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; memset(&fbuf, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", ¶m_value, ¶m_value_len, &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&fbuf, field_name, field_name_len, "facet.date.other"); solr_delete_normal_param_value(getThis(), fbuf.str, fbuf.len, param_value, param_value_len); solr_string_free(&fbuf); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeHighlightField(string field) Removes one of the fields from the hl.fl parameter. */ PHP_METHOD(SolrQuery, removeHighlightField) { solr_char_t *pname = (solr_char_t *) "hl.fl"; int pname_length = sizeof("hl.fl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_simple_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeStatsField(string field) Removes one of the stats.field parameters. */ PHP_METHOD(SolrQuery, removeStatsField) { solr_char_t *pname = (solr_char_t *) "stats.field"; int pname_length = sizeof("stats.field")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeStatsFacet(string value) Removes one of the stats.facet parameters. */ PHP_METHOD(SolrQuery, removeStatsFacet) { solr_char_t *pname = (solr_char_t *) "stats.facet"; int pname_length = sizeof("stats.facet")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_normal_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeMltField(string field) Removes one of the fields from the mlt.fl parameter. */ PHP_METHOD(SolrQuery, removeMltField) { solr_char_t *pname = (solr_char_t *) "mlt.fl"; int pname_length = sizeof("mlt.fl")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_simple_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* {{{ proto SolrQuery SolrQuery::removeMltQueryField(string field) Removes one of the values from the mlt.qf parameter. */ PHP_METHOD(SolrQuery, removeMltQueryField) { solr_char_t *pname = (solr_char_t *) "mlt.qf"; int pname_length = sizeof("mlt.qf")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value(getThis(), pname, pname_length, param_value, param_value_len); solr_return_solr_params_object(); } /* }}} */ /* }}} End of Value removal methods */ /* {{{ Begin getter methods */ /* {{{ proto string SolrQuery::getQuery() Returns the query */ PHP_METHOD(SolrQuery, getQuery) { solr_char_t *param_name = (solr_char_t *) "q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("q")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getStart() Returns the start parameter */ PHP_METHOD(SolrQuery, getStart) { solr_char_t *param_name = (solr_char_t *) "start"; COMPAT_ARG_SIZE_T param_name_len = sizeof("start")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getRows() Returns the rows parameter */ PHP_METHOD(SolrQuery, getRows) { solr_char_t *param_name = (solr_char_t *) "rows"; COMPAT_ARG_SIZE_T param_name_len = sizeof("rows")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getFields() Returns the fields */ PHP_METHOD(SolrQuery, getFields) { solr_char_t *param_name = (solr_char_t *) "fl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("fl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_simple_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getSortFields() Returns all the sort fields */ PHP_METHOD(SolrQuery, getSortFields) { solr_char_t *param_name = (solr_char_t *) "sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("sort")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_arg_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getFilterQueries() Returns all the filter queries */ PHP_METHOD(SolrQuery, getFilterQueries) { solr_char_t *param_name = (solr_char_t *) "fq"; COMPAT_ARG_SIZE_T param_name_len = sizeof("fq")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getTimeAllowed() Returns the maximum time in milliseconds allowed for the search query */ PHP_METHOD(SolrQuery, getTimeAllowed) { solr_char_t *param_name = (solr_char_t *) "timeAllowed"; COMPAT_ARG_SIZE_T param_name_len = sizeof("timeAllowed")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getFacet() Returns true is faceting is enabled */ PHP_METHOD(SolrQuery, getFacet) { solr_char_t *param_name = (solr_char_t *) "facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getFacetFields() Returns all the facet fields */ PHP_METHOD(SolrQuery, getFacetFields) { solr_char_t *param_name = (solr_char_t *) "facet.field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.field")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getFacetQueries() Returns all the facet queries */ PHP_METHOD(SolrQuery, getFacetQueries) { solr_char_t *param_name = (solr_char_t *) "facet.query"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.query")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getFacetPrefix([string field_override]) Returns the prefix for the facet */ PHP_METHOD(SolrQuery, getFacetPrefix) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.prefix"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getFacetSort([string field_override]) Returns the facet sort state (for the field, if it was overridden) */ PHP_METHOD(SolrQuery, getFacetSort) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.sort"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_sort_type(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getFacetLimit([string field_override]) Returns the maximum number of items for the facet */ PHP_METHOD(SolrQuery, getFacetLimit) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.limit"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getFacetOffset([string field_override]) Returns the offset into the list of constraints */ PHP_METHOD(SolrQuery, getFacetOffset) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.offset"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getFacetMinCount([string field_override]) Returns the minimum count for the facet */ PHP_METHOD(SolrQuery, getFacetMinCount) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.mincount"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getFacetMissing([string field_override]) Returns the facet.missing parameter */ PHP_METHOD(SolrQuery, getFacetMissing) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.missing"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_boolean(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getFacetMethod([string field_override]) Returns the facet.method parameter */ PHP_METHOD(SolrQuery, getFacetMethod) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.method"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto array SolrQuery::getFacetDateFields() Returns all the facet.date fields */ PHP_METHOD(SolrQuery, getFacetDateFields) { solr_char_t *param_name = (solr_char_t *) "facet.date"; COMPAT_ARG_SIZE_T param_name_len = sizeof("facet.date")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getFacetDateStart([string field_override]) Returns the facet.date.start parameter */ PHP_METHOD(SolrQuery, getFacetDateStart) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.date.start"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getFacetDateEnd([string field_override]) Returns the facet.date.end parameter */ PHP_METHOD(SolrQuery, getFacetDateEnd) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.date.end"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getFacetDateGap([string field_override]) Returns the facet.date.gap */ PHP_METHOD(SolrQuery, getFacetDateGap) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.date.gap"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getFacetDateHardEnd([string field_override]) Returns the facet.date.hardend parameter */ PHP_METHOD(SolrQuery, getFacetDateHardEnd) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.date.hardend"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_boolean(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getFacetDateOther([string field_override]) Returns the facet.date.other parameter */ PHP_METHOD(SolrQuery, getFacetDateOther) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "facet.date.other"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { array_init(return_value); solr_normal_param_value_display(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getHighlight() Returns the state of the hl parameter */ PHP_METHOD(SolrQuery, getHighlight) { solr_char_t *param_name = (solr_char_t *) "hl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightQuery() Returns the query */ PHP_METHOD(SolrQuery, getHighlightQuery) { solr_char_t *param_name = (solr_char_t *) "hl.q"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.q")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getHighlightFields() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightFields) { solr_char_t *param_name = (solr_char_t *) "hl.fl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.fl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_simple_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getHighlightSnippets([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightSnippets) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.snippets"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getHighlightFragsize([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightFragsize) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.fragsize"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getHighlightMergeContiguous([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightMergeContiguous) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.mergeContiguous"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_boolean(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getHighlightRequireFieldMatch() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightRequireFieldMatch) { solr_char_t *param_name = (solr_char_t *) "hl.requireFieldMatch"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.requireFieldMatch")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getHighlightMaxAnalyzedChars() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightMaxAnalyzedChars) { solr_char_t *param_name = (solr_char_t *) "hl.maxAnalyzedChars"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.maxAnalyzedChars")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightAlternateField([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightAlternateField) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.alternateField"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto int SolrQuery::getHighlightMaxAlternateFieldLength([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightMaxAlternateFieldLength) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.maxAlternateFieldLength"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_integer(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightFormatter([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightFormatter) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.formatter"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightSimplePre([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightSimplePre) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.simple.pre"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightSimplePost([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightSimplePost) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.simple.post"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightFragmenter([string field_override]) Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightFragmenter) { solr_param_t *solr_param = NULL; solr_string_t field_override_buffer; /* Field name buffer to prepare field override */ /* Field name override, if any */ solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; /* Set if the parameter was found in the HashTable and off otherwise */ zend_bool param_is_set = 1; memset(&field_override_buffer, 0, sizeof(solr_string_t)); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_query_field_override(&field_override_buffer, field_name, field_name_len, "hl.fragmenter"); if (solr_param_find(getThis(), field_override_buffer.str, field_override_buffer.len, (solr_param_t **) &solr_param) == FAILURE) { param_is_set = 0; } solr_string_free(&field_override_buffer); if (param_is_set) { solr_normal_param_value_display_string(solr_param, return_value); return; } RETURN_NULL(); } /* }}} */ /* {{{ proto bool SolrQuery::getHighlightUsePhraseHighlighter() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightUsePhraseHighlighter) { solr_char_t *param_name = (solr_char_t *) "hl.usePhraseHighlighter"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.usePhraseHighlighter")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getHighlightHighlightMultiTerm() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightHighlightMultiTerm) { solr_char_t *param_name = (solr_char_t *) "hl.highlightMultiTerm"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.highlightMultiTerm")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto float SolrQuery::getHighlightRegexSlop() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightRegexSlop) { solr_char_t *param_name = (solr_char_t *) "hl.regex.slop"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.slop")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_double(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getHighlightRegexPattern() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightRegexPattern) { solr_char_t *param_name = (solr_char_t *) "hl.regex.pattern"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.pattern")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getHighlightRegexMaxAnalyzedChars() Returns the parameter */ PHP_METHOD(SolrQuery, getHighlightRegexMaxAnalyzedChars) { solr_char_t *param_name = (solr_char_t *) "hl.regex.maxAnalyzedChars"; COMPAT_ARG_SIZE_T param_name_len = sizeof("hl.regex.maxAnalyzedChars")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getStats() Returns the status of the stats parameter */ PHP_METHOD(SolrQuery, getStats) { solr_char_t *param_name = (solr_char_t *) "stats"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getStatsFields() Returns the stats.field parameters */ PHP_METHOD(SolrQuery, getStatsFields) { solr_char_t *param_name = (solr_char_t *) "stats.field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats.field")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getStatsFacets() Returns all the stats facets */ PHP_METHOD(SolrQuery, getStatsFacets) { solr_char_t *param_name = (solr_char_t *) "stats.facet"; COMPAT_ARG_SIZE_T param_name_len = sizeof("stats.facet")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_normal_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getMlt() Returns the parameter */ PHP_METHOD(SolrQuery, getMlt) { solr_char_t *param_name = (solr_char_t *) "mlt"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltCount() Returns the parameter */ PHP_METHOD(SolrQuery, getMltCount) { solr_char_t *param_name = (solr_char_t *) "mlt.count"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.count")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getMltFields() Returns the parameter */ PHP_METHOD(SolrQuery, getMltFields) { solr_char_t *param_name = (solr_char_t *) "mlt.fl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.fl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_simple_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto array SolrQuery::getMltQueryFields() Returns the parameter */ PHP_METHOD(SolrQuery, getMltQueryFields) { solr_char_t *param_name = (solr_char_t *) "mlt.qf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.qf")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } array_init(return_value); solr_arg_list_param_value_display(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMinTermFrequency() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMinTermFrequency) { solr_char_t *param_name = (solr_char_t *) "mlt.mintf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.mintf")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMinDocFrequency() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMinDocFrequency) { solr_char_t *param_name = (solr_char_t *) "mlt.mindf"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.mindf")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMinWordLength() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMinWordLength) { solr_char_t *param_name = (solr_char_t *) "mlt.minwl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.minwl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMaxWordLength() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMaxWordLength) { solr_char_t *param_name = (solr_char_t *) "mlt.maxwl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxwl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMaxNumTokens() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMaxNumTokens) { solr_char_t *param_name = (solr_char_t *) "mlt.maxntp"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxntp")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getMltMaxNumQueryTerms() Returns the parameter */ PHP_METHOD(SolrQuery, getMltMaxNumQueryTerms) { solr_char_t *param_name = (solr_char_t *) "mlt.maxqt"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.maxqt")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getMltBoost() Returns the parameter */ PHP_METHOD(SolrQuery, getMltBoost) { solr_char_t *param_name = (solr_char_t *) "mlt.boost"; COMPAT_ARG_SIZE_T param_name_len = sizeof("mlt.boost")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getTerms() Returns the parameter */ PHP_METHOD(SolrQuery, getTerms) { solr_char_t *param_name = (solr_char_t *) "terms"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getTermsField() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsField) { solr_char_t *param_name = (solr_char_t *) "terms.fl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.fl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getTermsLowerBound() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsLowerBound) { solr_char_t *param_name = (solr_char_t *) "terms.lower"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.lower")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getTermsUpperBound() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsUpperBound) { solr_char_t *param_name = (solr_char_t *) "terms.upper"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.upper")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getTermsIncludeLowerBound() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsIncludeLowerBound) { solr_char_t *param_name = (solr_char_t *) "terms.lower.incl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.lower.incl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getTermsIncludeUpperBound() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsIncludeUpperBound) { solr_char_t *param_name = (solr_char_t *) "terms.upper.incl"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.upper.incl")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getTermsMinCount() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsMinCount) { solr_char_t *param_name = (solr_char_t *) "terms.mincount"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.mincount")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getTermsMaxCount() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsMaxCount) { solr_char_t *param_name = (solr_char_t *) "terms.maxcount"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.maxcount")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto string SolrQuery::getTermsPrefix() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsPrefix) { solr_char_t *param_name = (solr_char_t *) "terms.prefix"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.prefix")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_string(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getTermsLimit() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsLimit) { solr_char_t *param_name = (solr_char_t *) "terms.limit"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.limit")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_integer(solr_param, return_value); } /* }}} */ /* {{{ proto bool SolrQuery::getTermsReturnRaw() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsReturnRaw) { solr_char_t *param_name = (solr_char_t *) "terms.raw"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.raw")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_boolean(solr_param, return_value); } /* }}} */ /* {{{ proto int SolrQuery::getTermsSort() Returns the parameter */ PHP_METHOD(SolrQuery, getTermsSort) { solr_char_t *param_name = (solr_char_t *) "terms.sort"; COMPAT_ARG_SIZE_T param_name_len = sizeof("terms.sort")-1; solr_param_t *solr_param = NULL; if (solr_param_find(getThis(), param_name, param_name_len, (solr_param_t **) &solr_param) == FAILURE) { RETURN_NULL(); } solr_normal_param_value_display_sort_type(solr_param, return_value); } /* }}} */ /* }}} End of getter methods */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_response.c0000644000175000017500000002647015001737315016137 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ Macro for extracting property values using string constants */ #define solr_read_response_object_property(objptr, name, silent, rv) zend_read_property(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), name, sizeof(name)-1, silent, rv) /* }}} */ /* {{{ proto int SolrResponse::getHttpStatus(void) Returns the value of the http_status property. */ PHP_METHOD(SolrResponse, getHttpStatus) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *http_status = NULL; http_status = solr_read_response_object_property(objptr, "http_status", silent, &rv); RETURN_LONG(Z_LVAL_P(http_status)); } /* }}} */ /* {{{ proto string SolrResponse::getHttpStatusMessage(void) Returns the http_status_message property. */ PHP_METHOD(SolrResponse, getHttpStatusMessage) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *http_status_message = NULL; http_status_message = solr_read_response_object_property(objptr, "http_status_message", silent, &rv); RETURN_STRINGL(Z_STRVAL_P(http_status_message), Z_STRLEN_P(http_status_message)); } /* }}} */ /* {{{ proto bool SolrResponse::success(void) Returns whether the request was successful or not. */ PHP_METHOD(SolrResponse, success) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *success = NULL; success = solr_read_response_object_property(objptr, "success", silent, &rv); RETURN_ZVAL(success, 0, 0); } /* }}} */ /* {{{ proto string SolrResponse::getRequestUrl(void) Returns the URL used for the request. */ PHP_METHOD(SolrResponse, getRequestUrl) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_request_url", silent, &rv); RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } /* }}} */ /* {{{ proto string SolrResponse::getRawRequestHeaders(void) Returns the raw http request headers sent to the server. */ PHP_METHOD(SolrResponse, getRawRequestHeaders) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_raw_request_headers", silent, &rv); RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } /* }}} */ /* {{{ proto string SolrResponse::getRawRequest(void) Returns the raw http request sent to the server. */ PHP_METHOD(SolrResponse, getRawRequest) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_raw_request", silent, &rv); RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } /* }}} */ /* {{{ proto string SolrResponse::getRawResponseHeaders(void) Returns the raw http response headers from the server. */ PHP_METHOD(SolrResponse, getRawResponseHeaders) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_raw_response_headers", silent, &rv); RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } /* }}} */ /* {{{ proto string SolrResponse::getRawResponse(void) Returns the raw http response from the server. */ PHP_METHOD(SolrResponse, getRawResponse) { zend_bool silent = 1; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_raw_response", silent, &rv); if (Z_STRLEN_P(prop)) { RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrResponse::getDigestedResponse(void) Returns the serialized object string derived from the XML response. */ PHP_METHOD(SolrResponse, getDigestedResponse) { zend_bool silent = 0; zval rv; zval *objptr = getThis(); zval *prop = NULL; prop = solr_read_response_object_property(objptr, "http_digested_response", silent, &rv); if (Z_STRLEN_P(prop)) { RETURN_STRINGL(Z_STRVAL_P(prop), Z_STRLEN_P(prop)); } RETURN_NULL(); } /* }}} */ /* {{{ proto string SolrReponse::setParseMode([bool parse_mode]) Sets the parsing mode. This determines whether documents will be parsed as SolrObjects or SolrDocuments. */ PHP_METHOD(SolrResponse, setParseMode) { long int parse_mode = 0L; zval *objptr = getThis(); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &parse_mode) == FAILURE) { RETURN_FALSE; } parse_mode = ((parse_mode < 0L) ? 0L : ((parse_mode > 1L) ? 1L : parse_mode)); zend_update_property_long(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), "parser_mode", sizeof("parser_mode")-1, parse_mode); RETURN_TRUE; } /* }}} */ /* {{{ proto SolrObject SolrResponse::getResponse(void) Returns the response object from the server. */ PHP_METHOD(SolrResponse, getResponse) { solr_response_get_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU,0); } /* }}} */ /* {{{ proto array SolrResponse::getArrayResponse(void) Returns the response array from the server. */ PHP_METHOD(SolrResponse, getArrayResponse) { solr_response_get_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU,1); } /* }}} */ /** * Digest solr server raw response * and return SolrObject or array */ PHP_SOLR_API void solr_response_get_response_impl( INTERNAL_FUNCTION_PARAMETERS, int return_array) { zend_bool silent = 0; zval *objptr = getThis(); zval rv; zval *response_writer = solr_read_response_object_property(objptr, "response_writer", silent, &rv); zval *raw_response = solr_read_response_object_property(objptr, "http_raw_response", silent, &rv); zval *success = solr_read_response_object_property(objptr, "success", silent, &rv); zval *parser_mode = solr_read_response_object_property(objptr, "parser_mode", silent, &rv); if (Z_TYPE_P(success) == IS_TRUE && Z_STRLEN_P(raw_response)) { solr_string_t buffer; php_unserialize_data_t var_hash; const unsigned char *raw_resp; size_t raw_res_length; const unsigned char *str_end; int successful = 1; memset(&buffer, 0, sizeof(solr_string_t)); if (Z_STRLEN_P(response_writer)) { if (0 == strcmp(Z_STRVAL_P(response_writer), SOLR_XML_RESPONSE_WRITER)) { /* SOLR_XML_RESPONSE_WRITER */ /* Convert from XML serialization to PHP serialization format */ solr_encode_generic_xml_response(&buffer, Z_STRVAL_P(raw_response), Z_STRLEN_P(raw_response), Z_LVAL_P(parser_mode)); if(return_array) { solr_sobject_to_sarray(&buffer); } } else if (0 == strcmp(Z_STRVAL_P(response_writer), SOLR_PHP_NATIVE_RESPONSE_WRITER) || 0 == strcmp(Z_STRVAL_P(response_writer), SOLR_PHP_SERIALIZED_RESPONSE_WRITER)) { /* SOLR_PHP_NATIVE_RESPONSE_WRITER */ /* Response string is already in Native PHP serialization format */ solr_string_set(&buffer, Z_STRVAL_P(raw_response), Z_STRLEN_P(raw_response)); if(!return_array) { solr_sarray_to_sobject(&buffer); } } else if (0 == strcmp(Z_STRVAL_P(response_writer), SOLR_JSON_RESPONSE_WRITER)) { int json_translation_result = solr_json_to_php_native(&buffer, Z_STRVAL_P(raw_response), Z_STRLEN_P(raw_response)); /* SOLR_JSON_RESPONSE_WRITER */ /* Convert from JSON serialization to PHP serialization format */ if (json_translation_result > 0) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, solr_get_json_error_msg(json_translation_result)); php_error_docref(NULL, E_WARNING, "Error in JSON->PHP conversion. JSON Error Code %d", json_translation_result); } if(!return_array) { solr_sarray_to_sobject(&buffer); } } } if (buffer.len) { zend_update_property_stringl(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), "http_digested_response", sizeof("http_digested_response")-1, buffer.str, buffer.len); } memset(&var_hash, 0, sizeof(php_unserialize_data_t)); PHP_VAR_UNSERIALIZE_INIT(var_hash); raw_resp = (unsigned char *) buffer.str; raw_res_length = buffer.len; str_end = (unsigned char *) (raw_resp + raw_res_length); if (!php_var_unserialize(return_value, &raw_resp, str_end, &var_hash)) { successful = 0; solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1000_MSG); php_error_docref(NULL, E_WARNING, "Error unserializing raw response."); } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); solr_string_free(&buffer); if (successful && !return_array) { /* Overriding the default object handlers */ Z_OBJ_HT_P(return_value) = &solr_object_handlers; } return ; } RETURN_NULL(); } /* {{{ proto string SolrPingResponse::getResponse(void) Ping responses are always empty. Returns null. */ PHP_METHOD(SolrPingResponse, getResponse) { /* Ping responses are not serialized */ RETURN_NULL(); } /* }}} */ /* {{{ proto SolrPingResponse::__construct(void) Constructor */ PHP_METHOD(SolrPingResponse, __construct) { } /* }}} */ /* {{{ proto SolrPingResponse::__destruct(void) Destructor */ PHP_METHOD(SolrPingResponse, __destruct) { } /* }}} */ /* {{{ proto SolrQueryResponse::__construct(void) Constructor */ PHP_METHOD(SolrQueryResponse, __construct) { } /* }}} */ /* {{{ proto SolrQueryResponse::__destruct(void) Destructor */ PHP_METHOD(SolrQueryResponse, __destruct) { } /* }}} */ /* {{{ proto SolrUpdateResponse::__construct(void) Constructor */ PHP_METHOD(SolrUpdateResponse, __construct) { } /* }}} */ /* {{{ proto SolrUpdateResponse::__destruct(void) Destructor */ PHP_METHOD(SolrUpdateResponse, __destruct) { } /* }}} */ /* {{{ proto SolrGenericResponse::__construct(void) Constructor */ PHP_METHOD(SolrGenericResponse, __construct) { } /* }}} */ /* {{{ proto SolrGenericResponse::__destruct(void) Destructor */ PHP_METHOD(SolrGenericResponse, __destruct) { } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_utils.c0000644000175000017500000001653215001737315015437 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ proto string SolrUtils::escapeQueryChars(string unescaped) Escapes the lucene string */ PHP_METHOD(SolrUtils, escapeQueryChars) { solr_char_t *unescaped = NULL; solr_string_t sbuilder; COMPAT_ARG_SIZE_T unescaped_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &unescaped, &unescaped_length) == FAILURE) { RETURN_FALSE; } memset(&sbuilder, 0, sizeof(solr_string_t)); solr_escape_query_chars(&sbuilder, unescaped, unescaped_length); RETVAL_STRINGL(sbuilder.str, sbuilder.len); solr_string_free(&sbuilder); } /* }}} */ /* {{{ proto string SolrUtils::queryPhrase(string unescaped) Prepares a phrase from an unescaped lucene string. */ PHP_METHOD(SolrUtils, queryPhrase) { solr_char_t *unescaped = NULL; solr_string_t sbuilder; COMPAT_ARG_SIZE_T unescaped_length = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &unescaped, &unescaped_length) == FAILURE) { RETURN_FALSE; } memset(&sbuilder, 0, sizeof(solr_string_t)); solr_string_appendc(&sbuilder, '"'); solr_escape_query_chars(&sbuilder, unescaped, unescaped_length); solr_string_appendc(&sbuilder, '"'); RETVAL_STRINGL(sbuilder.str, sbuilder.len); solr_string_free(&sbuilder); } /* }}} */ /* {{{ proto string SolrUtils::digestXMLResponse(string xml_response [, int parse_mode]) Digests the xml response into a php serialize string. */ PHP_METHOD(SolrUtils, digestXmlResponse) { solr_char_t *xmlresponse = NULL; COMPAT_ARG_SIZE_T xmlresponse_len = 0; long int parse_mode = 0L; solr_string_t sbuilder; unsigned char *raw_resp = NULL, *str_end = NULL; size_t raw_res_length = 0; php_unserialize_data_t var_hash; int successful = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &xmlresponse, &xmlresponse_len, &parse_mode) == FAILURE) { RETURN_FALSE; } if (!xmlresponse_len) { php_error_docref(NULL, E_WARNING, "Raw response is empty"); RETURN_NULL(); } parse_mode = ((parse_mode < 0L) ? 0L : ((parse_mode > 1L) ? 1L : parse_mode)); memset(&sbuilder, 0, sizeof(solr_string_t)); solr_encode_generic_xml_response(&sbuilder, xmlresponse, xmlresponse_len, parse_mode); if (sbuilder.str == NULL || sbuilder.len == 0) { php_error_docref(NULL, E_WARNING, "Raw response was not valid"); RETURN_NULL(); } memset(&var_hash, 0, sizeof(php_unserialize_data_t)); PHP_VAR_UNSERIALIZE_INIT(var_hash); raw_resp = (unsigned char *) sbuilder.str; raw_res_length = sbuilder.len; str_end = (unsigned char *) (raw_resp + raw_res_length); if (!php_var_unserialize(return_value, (const unsigned char **) &raw_resp, str_end, &var_hash)) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1000_MSG); php_error_docref(NULL, E_WARNING, "Error unserializing raw response."); successful = 0; } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); solr_string_free(&sbuilder); if (successful) { /* Overriding the default object handlers */ Z_OBJ_HT_P(return_value) = &solr_object_handlers; } } /* }}} */ /* {{{ proto string SolrUtils::digestJsonResponse(string jsonResponse) Digests the json response into a php serialize string. */ PHP_METHOD(SolrUtils, digestJsonResponse) { solr_char_t *jsonResponse = NULL; COMPAT_ARG_SIZE_T jsonResponse_len = 0; unsigned char *raw_resp = NULL, *str_end = NULL; solr_string_t buffer; php_unserialize_data_t var_hash; COMPAT_ARG_SIZE_T raw_res_length; int successful = 1; int json_translation_result; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &jsonResponse, &jsonResponse_len) == FAILURE) { RETURN_FALSE; } memset(&buffer, 0, sizeof(solr_string_t)); json_translation_result = solr_json_to_php_native(&buffer, jsonResponse, jsonResponse_len); if (json_translation_result > 0) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, solr_get_json_error_msg(json_translation_result)); php_error_docref(NULL, E_WARNING, "Error in JSON->PHP conversion. JSON Error Code %d", json_translation_result); }else{ solr_sarray_to_sobject(&buffer); } memset(&var_hash, 0, sizeof(php_unserialize_data_t)); PHP_VAR_UNSERIALIZE_INIT(var_hash); raw_resp = (unsigned char *) buffer.str; raw_res_length = buffer.len; str_end = (unsigned char *) (raw_resp + raw_res_length); if (!php_var_unserialize(return_value, (const unsigned char **)&raw_resp, str_end, &var_hash)) { solr_throw_exception_ex(solr_ce_SolrException, SOLR_ERROR_1000, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1000_MSG); php_error_docref(NULL, E_WARNING, "Error unserializing raw response."); successful = 0; } solr_string_free(&buffer); PHP_VAR_UNSERIALIZE_DESTROY(var_hash); if (successful) { /* Overriding the default object handlers */ Z_OBJ_HT_P(return_value) = &solr_object_handlers; } } /* }}} */ /* {{{ proto string SolrUtils::getSolrVersion(void) Returns the current extension version */ PHP_METHOD(SolrUtils, getSolrVersion) { #ifdef SOLR_DEBUG char * version; asprintf(&version,"%s (DEBUG)", PHP_SOLR_DOTTED_VERSION); ZVAL_STRING(return_value, version); #else RETURN_STRING(PHP_SOLR_DOTTED_VERSION); #endif } /* }}} */ /* {{{ proto array SolrUtils::getSolrStats(void) Returns the number of active documents, clients and SolrParam objects in the current thread. */ PHP_METHOD(SolrUtils, getSolrStats) { int document_count = zend_hash_num_elements(SOLR_GLOBAL(documents)); int client_count = zend_hash_num_elements(SOLR_GLOBAL(clients)); int params_count = zend_hash_num_elements(SOLR_GLOBAL(params)); array_init(return_value); add_assoc_long(return_value, "document_count", document_count); add_assoc_long(return_value, "client_count", client_count); add_assoc_long(return_value, "params_count", params_count); } /* }}} */ /* {{{ proto string solr_get_version(void) Returns the current extension version */ PHP_FUNCTION(solr_get_version) { #ifdef SOLR_DEBUG char * version; asprintf(&version,"%s (DEBUG)", PHP_SOLR_DOTTED_VERSION); ZVAL_STRING(return_value, version); #else RETURN_STRING(PHP_SOLR_DOTTED_VERSION); #endif } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_client.c0000644000175000017500000010046215001737315016772 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ PHP_SOLR_API int solr_init_options(solr_client_options_t *options) */ PHP_SOLR_API int solr_init_options(solr_client_options_t *options) { solr_string_init(&(options->hostname)); solr_string_init(&(options->path)); solr_string_init(&(options->http_auth_credentials)); solr_string_init(&(options->proxy_hostname)); solr_string_init(&(options->proxy_auth_credentials)); solr_string_init(&(options->ssl_cert)); solr_string_init(&(options->ssl_key)); solr_string_init(&(options->ssl_keypassword)); solr_string_init(&(options->ssl_cainfo)); solr_string_init(&(options->ssl_capath)); solr_string_init(&(options->qs_delimiter)); solr_string_init(&(options->response_writer)); solr_string_init(&(options->update_url)); solr_string_init(&(options->search_url)); solr_string_init(&(options->thread_url)); solr_string_init(&(options->ping_url)); solr_string_init(&(options->terms_url)); solr_string_init(&(options->system_url)); solr_string_init(&(options->get_url)); solr_string_init(&(options->update_servlet)); solr_string_init(&(options->search_servlet)); solr_string_init(&(options->thread_servlet)); solr_string_init(&(options->ping_servlet)); solr_string_init(&(options->terms_servlet)); solr_string_init(&(options->system_servlet)); solr_string_init(&(options->get_servlet)); return SUCCESS; } /* }}} */ /* {{{ static void solr_set_initial_handle_options(solr_curl_t **sch, solr_client_options_t *options) */ static void solr_set_initial_curl_handle_options(solr_curl_t **sch_ptr, solr_client_options_t *options) { solr_curl_t * sch = *sch_ptr; /** Setup all the required CURL options here **/ curl_easy_setopt(sch->curl_handle, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_VERBOSE, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_ERRORBUFFER, sch->err.str); curl_easy_setopt(sch->curl_handle, CURLOPT_WRITEFUNCTION, solr_curl_write); curl_easy_setopt(sch->curl_handle, CURLOPT_WRITEDATA, (void *) sch); curl_easy_setopt(sch->curl_handle, CURLOPT_HEADERFUNCTION, solr_curl_write_header); curl_easy_setopt(sch->curl_handle, CURLOPT_HEADERDATA, (void *) sch); curl_easy_setopt(sch->curl_handle, CURLOPT_DEBUGFUNCTION, solr_curl_debug_callback); curl_easy_setopt(sch->curl_handle, CURLOPT_DEBUGDATA, (void *) sch); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); /** #if LIBCURL_VERSION_NUM >= 0x071304 curl_easy_setopt(sch->curl_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP); #endif */ curl_easy_setopt(sch->curl_handle, CURLOPT_DNS_CACHE_TIMEOUT, 120L); curl_easy_setopt(sch->curl_handle, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_MAXREDIRS, 16L); /* prevent infinite redirects */ curl_easy_setopt(sch->curl_handle, CURLOPT_UNRESTRICTED_AUTH, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_ACCEPT_ENCODING, ""); #ifdef ZTS curl_easy_setopt(sch->curl_handle, CURLOPT_NOSIGNAL, 1L); /** Needed in multi-threaded environments **/ #endif curl_easy_setopt(sch->curl_handle, CURLOPT_TIMEOUT, options->timeout); curl_easy_setopt(sch->curl_handle, CURLOPT_USERAGENT, SOLR_CLIENT_USER_AGENT); /* If the login and password options are passed, send the authentication headers */ if (options->http_auth_credentials.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_easy_setopt(sch->curl_handle, CURLOPT_USERPWD, options->http_auth_credentials.str); } /* If there is proxy info, send it too */ if (options->proxy_hostname.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_PROXY, options->proxy_hostname.str); if (options->proxy_port) { curl_easy_setopt(sch->curl_handle, CURLOPT_PROXYPORT, options->proxy_port); } if (options->proxy_auth_credentials.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_PROXYUSERPWD, options->proxy_auth_credentials.str); } } /* * When negotiating an SSL connection, the server sends a certificate indicating its identity. * cURL verifies whether the certificate is authentic */ if (options->secure) { /* The name of the PEM-formatted private key and private certificate concatenated */ if (options->ssl_cert.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_SSLCERT, options->ssl_cert.str); curl_easy_setopt(sch->curl_handle, CURLOPT_SSLCERTTYPE, "PEM"); } /* The name of the PEM-formatted private key, if certificate and private key are separate */ if (options->ssl_key.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_SSLKEY, options->ssl_key.str); curl_easy_setopt(sch->curl_handle, CURLOPT_SSLKEYTYPE, "PEM"); } /* Password for the PEM-formatted private key */ if (options->ssl_keypassword.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_KEYPASSWD, options->ssl_keypassword.str); } /* The file holding one or more CA certificates to verify the peer with */ if (options->ssl_cainfo.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_CAINFO, options->ssl_cainfo.str); } /* The directory holding multiple CA certificates to verify the peer with */ if (options->ssl_capath.len) { curl_easy_setopt(sch->curl_handle, CURLOPT_CAPATH , options->ssl_capath.str); } /* * Whether curl verifies the authenticity of the host name of server * Based on the Common name section of the certificate */ if (options->ssl_verify_peer && options->ssl_verify_host) { curl_easy_setopt(sch->curl_handle, CURLOPT_SSL_VERIFYHOST, options->ssl_verify_host); } /* * Verify the authenticity of the peer's certificate * This authentication is based on a chain of digital signatures, * rooted in certification authority (CA) certificates. * * If something is not right, the connection will not be valid */ curl_easy_setopt(sch->curl_handle, CURLOPT_SSL_VERIFYPEER, options->ssl_verify_peer); } } /* }}} */ /* {{{ PHP_SOLR_API int solr_init_handle(solr_curl_t *sch, solr_client_options_t *options) */ PHP_SOLR_API int solr_init_handle(solr_curl_t *sch, solr_client_options_t *options) { sch->response_header.response_code = 0L; memset(sch->err.str, 0, sizeof(sch->err.str)); sch->curl_handle = curl_easy_init(); if (NULL == sch->curl_handle) { return FAILURE; } sch->result_code = CURLE_OK; sch->handle_status = 1; solr_string_init(&(sch->request_header.buffer)); solr_string_init(&(sch->request_body.buffer)); solr_string_init(&(sch->request_body_debug.buffer)); solr_string_init(&(sch->response_header.buffer)); solr_string_init(&(sch->response_body.buffer)); solr_string_init(&(sch->debug_data_buffer)); solr_set_initial_curl_handle_options(&(sch), options); return SUCCESS; } /* }}} */ /** * solr_curl_write * * Called by libcurl as soon as there is response body data received that needs to be saved. * * The size of the data pointed to by *data is size multiplied with nmemb, it will not be zero terminated * * The *ctx parameter is the solr_curl pointer */ /* {{{ size_t solr_curl_write(solr_char_t *data, size_t size, size_t nmemb, void *ctx) */ size_t solr_curl_write(solr_char_t *data, size_t size, size_t nmemb, void *ctx) { size_t length = (size * nmemb); solr_curl_t *sch = (solr_curl_t *) ctx; solr_string_appends(&(sch->response_body.buffer), data, length); return length; } /* }}} */ /** * solr_curl_write_header * * Called by libcurl as soon as it has received header data * * It will be called once for each header and only complete header lines are passed on to the callback. * * Note: header lines may not be null-terminated so beware. * * The *ctx parameter is the solr_curl pointer */ /* {{{ size_t solr_curl_write_header(solr_char_t *data, size_t size, size_t nmemb, void *ctx) */ size_t solr_curl_write_header(solr_char_t *data, size_t size, size_t nmemb, void *ctx) { size_t length = (size * nmemb); solr_curl_t *sch = (solr_curl_t *) ctx; solr_string_appends(&(sch->response_header.buffer), data, length); return length; } /* }}} */ /** * solr_curl_debug_callback * * The infotype parameter is one of : * * 0 = CURLINFO_TEXT * 1 = CURLINFO_HEADER_IN (Response Headers) * 2 = CURLINFO_HEADER_OUT (Request Headers) * 3 = CURLINFO_DATA_IN (Response Body) * 4 = CURLINFO_DATA_OUT (Request Body) * 5 = CURLINFO_SSL_DATA_IN * 6 = CURLINFO_SSL_DATA_OUT * * The debug_data parameter is not null-terminated but is exactly size characters * * The ctx parameter is a solr_curl * pointer */ /* {{{ int solr_curl_debug_callback(CURL *curl_handle, curl_infotype infotype, solr_char_t *debug_data, size_t size, void *ctx) */ int solr_curl_debug_callback(CURL *curl_handle, curl_infotype infotype, solr_char_t *debug_data, size_t size, void *ctx) { solr_curl_t *sch = (solr_curl_t *) ctx; /* TODO : Check why this function is still called after destructor has been called */ if (!sch->handle_status) { return 0; } switch(infotype) { case CURLINFO_HEADER_OUT : /* Capture the Actual Request Headers Sent to Server */ { solr_string_appends(&(sch->request_header.buffer), debug_data, size); } break; case CURLINFO_DATA_OUT : /* Capture the Actual Request Body Sent to Server */ { solr_string_appends(&(sch->request_body_debug.buffer), debug_data, size); } break; default : { /* do nothing */ } break; } /* Captures ALL debug information */ solr_string_appends(&(sch->debug_data_buffer), debug_data, size); return 0; } /* }}} */ PHP_SOLR_API void solr_curl_request_reset(solr_curl_t *sch, solr_client_options_t *options) { /* Reset the buffers */ solr_string_free(&sch->request_header.buffer); solr_string_free(&sch->request_body_debug.buffer); solr_string_free(&sch->response_body.buffer); solr_string_free(&sch->response_header.buffer); solr_string_free(&sch->debug_data_buffer); curl_easy_reset(sch->curl_handle); solr_set_initial_curl_handle_options(&(sch), options); /* Reset the CURL options if the handle is reused */ curl_easy_setopt(sch->curl_handle, CURLOPT_HEADER, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_POST, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPGET, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_NOBODY, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDSIZE, 0L); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDS, NULL); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, NULL); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, NULL); } PHP_SOLR_API solr_http_header_list_t *solr_curl_init_header_list() { solr_http_header_list_t *header_list = NULL; header_list = curl_slist_append(header_list, "Accept-Charset: utf-8"); header_list = curl_slist_append(header_list, "Keep-Alive: 300"); header_list = curl_slist_append(header_list, "Connection: keep-alive"); /* Disable the Expect: 100-continue header. Jetty gets confused with this header */ header_list = curl_slist_append(header_list, "Expect:"); return header_list; } PHP_SOLR_API int solr_is_request_successful(CURLcode info_status, solr_curl_t *sch) { int return_status = SUCCESS; if (info_status != CURLE_OK) { solr_throw_exception_ex( solr_ce_SolrClientException, SOLR_ERROR_1004, SOLR_FILE_LINE_FUNC, "HTTP Transfer status could not be retrieved successfully" ); return_status = FAILURE; } if (sch->result_code != CURLE_OK) { solr_throw_exception_ex( solr_ce_SolrClientException, SOLR_ERROR_1004, SOLR_FILE_LINE_FUNC, "Solr HTTP Error %d: '%s' ", sch->result_code, curl_easy_strerror(sch->result_code) ); return_status = FAILURE; } if (sch->response_header.response_code != 200L) { return_status = FAILURE; } return return_status; } PHP_SOLR_API int solr_make_update_stream_request(solr_client_t *client, solr_ustream_t* stream_data, solr_string_t *request_params) { solr_curl_t *sch = &(client->handle); solr_client_options_t *options = &(client->options); int return_status = SUCCESS; CURLcode info_status = CURLE_OK; struct curl_httppost *formpost = NULL, *lastptr = NULL; int is_binary = stream_data->content_type == SOLR_EXTRACT_CONTENT_STREAM; solr_string_t content_type_header; solr_http_header_list_t *header_list = solr_curl_init_header_list(); solr_curl_request_reset(sch, options); solr_string_appendc(&(options->extract_url), '&'); solr_string_append_solr_string(&(options->extract_url), request_params); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->extract_url.str); if (is_binary) { solr_string_init(&content_type_header); solr_string_appends(&content_type_header, "Content-Type: ", sizeof("Content-Type: ")-1); solr_string_append_solr_string(&content_type_header, &(stream_data->content_info->stream_info.mime_type)); header_list = curl_slist_append(header_list, content_type_header.str); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDS, stream_data->content_info->stream_info.binary_content.str); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDSIZE, stream_data->content_info->stream_info.binary_content.len); solr_string_free_ex(&content_type_header); } else{ curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "PHPSOLRCLIENT", CURLFORM_FILE, (const char *) stream_data->content_info->filename.str, CURLFORM_END ); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPPOST, formpost); } curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); sch->result_code = curl_easy_perform(sch->curl_handle); info_status = curl_easy_getinfo(sch->curl_handle, CURLINFO_RESPONSE_CODE, &(sch->response_header.response_code)); return_status = solr_is_request_successful(info_status, sch); curl_slist_free_all(header_list); if (!is_binary) { curl_formfree(formpost); } return return_status; } /* {{{ PHP_SOLR_API int solr_make_request(solr_client_t *client, solr_request_type_t request_type) */ PHP_SOLR_API int solr_make_request(solr_client_t *client, solr_request_type_t request_type) { solr_curl_t *sch = &(client->handle); solr_client_options_t *options = &(client->options); solr_http_header_list_t *header_list = NULL; int return_status = SUCCESS; CURLcode info_status = CURLE_OK; solr_curl_request_reset(sch, options); header_list = solr_curl_init_header_list(); switch(request_type) { case SOLR_REQUEST_SEARCH : /* HTTP FORM POST */ { header_list = curl_slist_append(header_list, "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"); curl_easy_setopt(sch->curl_handle, CURLOPT_POST, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->search_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDSIZE, sch->request_body.buffer.len); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDS, sch->request_body.buffer.str); } break; case SOLR_REQUEST_TERMS : /* HTTP FORM POST */ { header_list = curl_slist_append(header_list, "Content-Type: application/x-www-form-urlencoded;charset=UTF-8"); curl_easy_setopt(sch->curl_handle, CURLOPT_POST, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->terms_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDSIZE, sch->request_body.buffer.len); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDS, sch->request_body.buffer.str); } break; case SOLR_REQUEST_UPDATE : /* HTTP XML POST */ { header_list = curl_slist_append(header_list, "Content-Type: text/xml;charset=UTF-8"); curl_easy_setopt(sch->curl_handle, CURLOPT_POST, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->update_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDSIZE, sch->request_body.buffer.len); curl_easy_setopt(sch->curl_handle, CURLOPT_POSTFIELDS, sch->request_body.buffer.str); } break; case SOLR_REQUEST_THREADS : /* HTTP GET */ { curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPGET, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->thread_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); } break; case SOLR_REQUEST_PING : /* HTTP HEAD REQUEST. */ { curl_easy_setopt(sch->curl_handle, CURLOPT_HEADER, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_NOBODY, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->ping_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); } break; case SOLR_REQUEST_SYSTEM: /* HTTP GET to fetch system info */ { curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPGET, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->system_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); } break; case SOLR_REQUEST_GET: solr_string_appendc(&(options->get_url), '&'); solr_string_append_solr_string(&(options->get_url), &(sch->request_body.buffer)); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPGET, 1L); curl_easy_setopt(sch->curl_handle, CURLOPT_URL, options->get_url.str); curl_easy_setopt(sch->curl_handle, CURLOPT_HTTPHEADER, header_list); break; default : { return_status = FAILURE; } break; } sch->result_code = curl_easy_perform(sch->curl_handle); info_status = curl_easy_getinfo(sch->curl_handle, CURLINFO_RESPONSE_CODE, &(sch->response_header.response_code)); return_status = solr_is_request_successful(info_status, sch); curl_slist_free_all(header_list); return return_status; } /* }}} */ /** Deallocates memory associated with the Solr CURL Handle. **/ /* {{{ PHP_SOLR_API void solr_free_handle(solr_curl_t *sch) */ PHP_SOLR_API void solr_free_handle(solr_curl_t *sch) { solr_string_free(&((sch)->request_header.buffer)); solr_string_free(&((sch)->request_body.buffer)); solr_string_free(&((sch)->request_body_debug.buffer)); solr_string_free(&((sch)->response_header.buffer)); solr_string_free(&((sch)->response_body.buffer)); solr_string_free(&((sch)->debug_data_buffer)); sch->handle_status = 0; curl_easy_cleanup((sch)->curl_handle); sch->curl_handle = NULL; } /* }}} */ /* {{{ PHP_SOLR_API void solr_free_options(solr_client_options_t *options) */ PHP_SOLR_API void solr_free_options(solr_client_options_t *options) { solr_string_free(&((options)->hostname)); solr_string_free(&((options)->http_auth_credentials)); solr_string_free(&((options)->path)); solr_string_free(&((options)->proxy_auth_credentials)); solr_string_free(&((options)->ssl_cert)); solr_string_free(&((options)->ssl_key)); solr_string_free(&((options)->ssl_keypassword)); solr_string_free(&((options)->ssl_cainfo)); solr_string_free(&((options)->ssl_capath)); solr_string_free(&((options)->proxy_hostname)); solr_string_free(&((options)->qs_delimiter)); solr_string_free(&((options)->response_writer)); solr_string_free(&((options)->update_url)); solr_string_free(&((options)->search_url)); solr_string_free(&((options)->thread_url)); solr_string_free(&((options)->ping_url)); solr_string_free(&((options)->terms_url)); solr_string_free(&((options)->system_url)); solr_string_free(&((options)->get_url)); solr_string_free(&((options)->extract_url)); solr_string_free(&((options)->update_servlet)); solr_string_free(&((options)->search_servlet)); solr_string_free(&((options)->thread_servlet)); solr_string_free(&((options)->ping_servlet)); solr_string_free(&((options)->terms_servlet)); solr_string_free(&((options)->system_servlet)); solr_string_free(&((options)->get_servlet)); solr_string_free(&((options)->extract_servlet)); } /* }}} */ /* {{{ PHP_SOLR_API void solr_destroy_client(void *client) */ PHP_SOLR_API void solr_destroy_client(zval *client) { solr_client_t *solr_client = (solr_client_t *) Z_PTR_P(client); if (solr_client) { solr_free_options(&(solr_client->options)); solr_free_handle(&(solr_client->handle)); pefree(solr_client, SOLR_CLIENT_PERSISTENT); solr_client = NULL; } } /* }}} */ /* {{{ PHP_SOLR_API int solr_get_xml_error(solr_string_t buffer, solr_exception_t *exceptionData) */ PHP_SOLR_API int solr_get_xml_error(solr_string_t buffer, solr_exception_t *exceptionData) { xmlDoc *doc = xmlReadMemory((const char *)buffer.str, buffer.len, NULL, "UTF-8", XML_PARSE_RECOVER); xmlXPathContext *xpathContext = NULL; xmlXPathObject *xpathObject = NULL; xmlChar *xpathExpression = (unsigned char *)"/response/lst[@name='error']"; xmlNode * nodeCurser; const unsigned char * nodePropName = (const unsigned char *)"name"; if (!doc) { php_error_docref(NULL, E_WARNING, "Error loading XML document"); return 1; } /* Create xpath evaluation context */ xpathContext = xmlXPathNewContext(doc); if(xpathContext == NULL) { php_error_docref(NULL, E_WARNING, "Error creating xml xpath context"); xmlFreeDoc(doc); return 1; } /* Evaluate xpath expression */ xpathObject = xmlXPathEvalExpression(xpathExpression, xpathContext); if(xpathObject == NULL){ php_error_docref(NULL, E_WARNING, "Error evaluating xml xpath expression"); xmlFreeDoc(doc); return 1; } if(!xpathObject->nodesetval){ php_error_docref(NULL, E_WARNING, "Xpath Error: no elements found"); xmlXPathFreeObject(xpathObject); xmlFreeDoc(doc); return 1; } nodeCurser = xpathObject->nodesetval->nodeTab[0]->children; while (nodeCurser != NULL) { if (xmlHasProp(nodeCurser, nodePropName)) { if (strcmp((const char *)xmlGetProp(nodeCurser,nodePropName), (const char *)"msg") == 0) { exceptionData->message = (solr_char_t *)estrdup((const char *)nodeCurser->children->content); } else if(strcmp((const char *)xmlGetProp(nodeCurser,nodePropName),"code") == 0) { exceptionData->code = atoi((const char *)nodeCurser->children->content); } else if(strcmp( (const char *)xmlGetProp(nodeCurser, nodePropName), (const char *) "trace") == 0) { exceptionData->message = (solr_char_t *)estrdup((const char *)nodeCurser->children->content); } } nodeCurser = nodeCurser->next; } xmlXPathFreeObject(xpathObject); xmlXPathFreeContext(xpathContext); xmlFreeDoc(doc); return 0; } /* }}} */ /* {{{ PHP_SOLR_API int hydrate_error_zval(zval *response, solr_exception_t *exceptionData) */ PHP_SOLR_API int hydrate_error_zval(zval *response, solr_exception_t *exceptionData) { zval *error_p; zval *msg_zv_p=(zval *) NULL, *code_zv_p = (zval *) NULL; zend_string *msg_key_str = zend_string_init("msg", sizeof("msg")-1, 1); zend_string *code_key_str = zend_string_init("code", sizeof("code")-1, 1); zend_string *error_key_str = zend_string_init("error", sizeof("error")-1, 1); zend_string *trace_key_str = zend_string_init("trace", sizeof("trace")-1, 1); int return_code = 0; if ( (error_p = zend_hash_find( Z_ARRVAL_P(response), error_key_str)) != NULL) { if (zend_hash_exists(HASH_OF(error_p), msg_key_str)) { if ((msg_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), msg_key_str)) != NULL) { exceptionData->message = (solr_char_t *)estrdup(Z_STRVAL(*msg_zv_p)); } else { php_error_docref(NULL, E_NOTICE, "Undefined variable: %s", "msg"); return_code = 1; goto solr_error_func_return_end; } } else if (zend_hash_exists(HASH_OF(error_p), trace_key_str)) { if ((msg_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), trace_key_str)) != NULL) { exceptionData->message = (solr_char_t *)estrdup(Z_STRVAL(*msg_zv_p)); } else { php_error_docref(NULL, E_NOTICE, "Undefined variable: %s", "trace"); return_code = 1; goto solr_error_func_return_end; } } else{ php_error_docref(NULL, E_NOTICE, "Unable to find %s in error response zval", "message or trace" ); return_code = 1; goto solr_error_func_return_end; } if ((code_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), code_key_str)) != NULL) { exceptionData->code = (int)Z_LVAL_P(code_zv_p); } else { php_error_docref(NULL, E_NOTICE, "Unable to find element with key %s in error response zval","code" ); return_code = 1; goto solr_error_func_return_end; } } else { php_error_docref(NULL, E_NOTICE, "Unable to find %s in error response", "error element" ); return_code = 1; goto solr_error_func_return_end; } solr_error_func_return_end: zend_string_release(msg_key_str); zend_string_release(code_key_str); zend_string_release(error_key_str); zend_string_release(trace_key_str); return return_code; } /* }}} */ /* {{{ PHP_SOLR_API int solr_get_json_error(solr_string_t buffer, solr_exception_t *exceptionData) */ PHP_SOLR_API int solr_get_json_error(solr_string_t buffer, solr_exception_t *exceptionData) { zval json_response; zval *error_p; zval *msg_zv_p=(zval *)NULL,*code_zv_p=(zval *)NULL; HashTable *errorHashTable; char * key = "error"; long nSize = 1000; int return_code = 0; zend_string *msg_key_str = zend_string_init("msg", sizeof("msg")-1, 1); zend_string *code_key_str = zend_string_init("code", sizeof("code")-1, 1); zend_string *error_key_str = zend_string_init("error", sizeof("error")-1, 1); zend_string *trace_key_str = zend_string_init("trace", sizeof("trace")-1, 1); php_json_decode(&json_response, (char *) buffer.str, buffer.len, 1, 1024L); if (Z_TYPE(json_response) == IS_NULL) { zval_ptr_dtor(&json_response); php_error_docref(NULL, E_WARNING, "Unable to parse Solr Server Error Response. JSON serialization error"); return 1; } ALLOC_HASHTABLE(errorHashTable); zend_hash_init(errorHashTable, nSize, NULL, NULL, 0); if ( (error_p = zend_hash_find( Z_ARRVAL(json_response), error_key_str)) != NULL) { if ((code_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), code_key_str)) != NULL) { exceptionData->code = (int)Z_LVAL_P(code_zv_p); } else { php_error_docref(NULL, E_NOTICE, "Unable to find %s in json error response","code" ); } if (zend_hash_exists(HASH_OF(error_p), msg_key_str)) { if ((msg_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), msg_key_str)) != NULL) { exceptionData->message = (solr_char_t *)estrdup(Z_STRVAL_P(msg_zv_p)); } } else if (!exceptionData->message && zend_hash_exists(HASH_OF(error_p), trace_key_str)) { if ((msg_zv_p = zend_hash_find(Z_ARRVAL_P(error_p), trace_key_str)) != NULL) { exceptionData->message = (solr_char_t *)estrdup(Z_STRVAL_P(msg_zv_p)); } else { php_error_docref(NULL, E_NOTICE, "Undefined variable: %s","trace" ); } } else { php_error_docref(NULL, E_NOTICE, "Unable to find %s in error response zval","message" ); return_code = 1; goto solr_error_func_return_end; } }else{ php_error_docref(NULL, E_NOTICE, "Undefined variable: %s",key ); } solr_error_func_return_end: zend_string_release(msg_key_str); zend_string_release(code_key_str); zend_string_release(error_key_str); zend_string_release(trace_key_str); zval_ptr_dtor(&json_response); zend_hash_destroy(errorHashTable); FREE_HASHTABLE(errorHashTable); return return_code; } /* }}} */ /* {{{ PHP_SOLR_API int solr_get_phpnative_error(solr_string_t buffer, solr_exception_t *exceptionData) */ PHP_SOLR_API int solr_get_phpnative_error(solr_string_t buffer, solr_exception_t *exceptionData) { zval *response_obj; php_unserialize_data_t var_hash; const unsigned char * raw_resp = (const unsigned char *) buffer.str; const unsigned char * str_end = (const unsigned char *) (buffer.str + buffer.len); ALLOC_INIT_ZVAL(response_obj); PHP_VAR_UNSERIALIZE_INIT(var_hash); if(!php_var_unserialize(response_obj, &raw_resp, str_end, &var_hash)) { /* There is a known issue, that solr responses will not always be * with the dictated response format, as jetty or tomcat may return errors in their format */ PHP_VAR_UNSERIALIZE_DESTROY(var_hash); zval_ptr_dtor(response_obj); #ifdef PHP_7 efree(response_obj); #endif return 1; } hydrate_error_zval(response_obj, exceptionData); PHP_VAR_UNSERIALIZE_DESTROY(var_hash); zval_ptr_dtor(response_obj); #ifdef PHP_7 efree(response_obj); #endif return 0; } /* }}} */ /* {{{ PHP_SOLR_API void solr_throw_solr_server_exception(solr_client_t *client,const char * requestType) parse the solr server response and throw a SolrServerException */ PHP_SOLR_API void solr_throw_solr_server_exception(solr_client_t *client,const char * requestType) { const char * response_writer = (char *) client->options.response_writer.str; solr_exception_t *exceptionData; exceptionData = (solr_exception_t*) emalloc(sizeof(solr_exception_t )); exceptionData->code = 0; memset(exceptionData, 0, sizeof(solr_exception_t)); if( 0 == strcmp(response_writer, SOLR_XML_RESPONSE_WRITER)){ if(solr_get_xml_error(client->handle.response_body.buffer, exceptionData) != SUCCESS) { /* fallback to normal exception */ solr_throw_exception_ex(solr_ce_SolrClientException, SOLR_ERROR_1010, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1010_MSG, requestType, SOLR_RESPONSE_CODE_BODY); return; } } if( 0 == strcmp(response_writer, SOLR_JSON_RESPONSE_WRITER)) { if(solr_get_json_error(client->handle.response_body.buffer, exceptionData) != SUCCESS) { solr_throw_exception_ex(solr_ce_SolrClientException, SOLR_ERROR_1010, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1010_MSG, requestType, SOLR_RESPONSE_CODE_BODY); } } if( 0 == strcmp(response_writer, SOLR_PHP_NATIVE_RESPONSE_WRITER) || 0 == strcmp(response_writer, SOLR_PHP_SERIALIZED_RESPONSE_WRITER)) { if(solr_get_phpnative_error(client->handle.response_body.buffer,exceptionData) != SUCCESS) { php_error_docref(NULL, E_NOTICE, "Unable to parse serialized php response" ); } } if(exceptionData->code == 0){ solr_throw_exception_ex(solr_ce_SolrClientException, SOLR_ERROR_1010, SOLR_FILE_LINE_FUNC, SOLR_ERROR_1010_MSG, requestType, SOLR_RESPONSE_CODE_BODY); }else if (exceptionData->code > 0 && exceptionData->message){ solr_throw_exception_ex(solr_ce_SolrServerException, exceptionData->code, SOLR_FILE_LINE_FUNC, exceptionData->message); } else { php_error_docref(NULL, E_ERROR, "Unable to parse solr exception message, Internal Error" ); } if(exceptionData->message != NULL) { efree(exceptionData->message); } efree(exceptionData); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_debug.c0000644000175000017500000001062015001737315016576 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Omar Shaban | | Israel Ekpo | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ void solr_debug_printf(const char *format, ...) */ PHP_SOLR_API void solr_debug_printf(const char *format, ...) { #ifdef SOLR_DEBUG va_list args; va_start(args,format); vprintf(format,args); va_end(args); #endif } /* }}} */ /* {{{ void solr_debug_print_fields(const solr_field_list_t *field_list) */ PHP_SOLR_API void solr_debug_print_fields(const solr_field_list_t *field_list) { /* Used to debug field inserted */ } /* }}} */ /** * print_xpath_nodes: * @nodes: the nodes set. * @output: the output file handle. * * Prints the @nodes content to @output. */ /* {{{ void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) */ PHP_SOLR_API void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) { xmlNodePtr cur; int size; int i; assert(output); size = (nodes) ? nodes->nodeNr : 0; fprintf(output, "Result (%d nodes):\n", size); for(i = 0; i < size; ++i) { assert(nodes->nodeTab[i]); if(nodes->nodeTab[i]->type == XML_NAMESPACE_DECL) { xmlNsPtr ns; ns = (xmlNsPtr)nodes->nodeTab[i]; cur = (xmlNodePtr)ns->next; if(cur->ns) { fprintf(output, "= namespace \"%s\"=\"%s\" for node %s:%s\n", ns->prefix, ns->href, cur->ns->href, cur->name); } else { fprintf(output, "= namespace \"%s\"=\"%s\" for node %s\n", ns->prefix, ns->href, cur->name); } } else if(nodes->nodeTab[i]->type == XML_ELEMENT_NODE) { cur = nodes->nodeTab[i]; if(cur->ns) { fprintf(output, "= element node \"%s:%s\"\n", cur->ns->href, cur->name); } else { fprintf(output, "= element node \"%s\"\n", cur->name); } } else { cur = nodes->nodeTab[i]; fprintf(output, "= node \"%s\": type %d\n", cur->name, cur->type); } } } /* }}} */ /* {{{ void print_children (xmlNode * node) */ PHP_SOLR_API void print_children (xmlNode * node) { fprintf(stdout,"\n================- start print children -=================\n"); while (node != NULL) { if(node->ns) { fprintf(stdout, "= element node \"%s:%s\"\n", node->ns->href,node->name); } else { fprintf(stdout, "= element node \"%s\"\n", node->name); } if(node->type == XML_ELEMENT_NODE){ xmlNode * cur2 = node->children; while (cur2 != NULL) { if(strcmp((const char *)cur2->name,"text")==0) { fprintf(stdout, "= element node \"%s\", text: %s\n",cur2->name,cur2->content); }else{ fprintf(stdout, "= element node \"%s\"\n", cur2->name); } cur2 = cur2->next; } } if(node->children != NULL) { print_children(node->children); } node = node->next; } fprintf(stdout,"\n======================- end -=====================\n"); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_document.c0000644000175000017500000004524115001737315017335 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Israel Ekpo | +----------------------------------------------------------------------+ */ #include "php_solr.h" #if PHP_VERSION_ID < 80000 PHP_SOLR_API zend_object *solr_document_object_handler_clone(zval *zobject) { zend_object *old_object = Z_OBJ_P(zobject); #else PHP_SOLR_API zend_object *solr_document_object_handler_clone(zend_object *old_object) { #endif zend_object *new_object; solr_document_t *doc_entry, *old_doc_entry; long document_index = SOLR_UNIQUE_DOCUMENT_INDEX(); new_object = zend_objects_new(old_object->ce); object_properties_init(new_object, old_object->ce); zend_objects_clone_members(new_object, old_object); #if PHP_VERSION_ID < 80000 if (solr_fetch_document_entry(zobject, &old_doc_entry) == FAILURE) { #else if (solr_fetch_document_entry(old_object, &old_doc_entry) == FAILURE) { #endif php_error_docref(NULL, E_ERROR, "Clone Failed: Unable to fetch document entry of the source document"); } doc_entry = solr_init_document(document_index); ZVAL_LONG(&(new_object->properties_table[0]), document_index); /* Add the document entry to the directory of documents */ doc_entry->field_count = old_doc_entry->field_count; doc_entry->document_boost = old_doc_entry->document_boost; zend_hash_copy(doc_entry->fields, old_doc_entry->fields, (copy_ctor_func_t) field_copy_constructor); zend_hash_copy(doc_entry->children, old_doc_entry->children, (copy_ctor_func_t) zval_add_ref); return new_object; } PHP_SOLR_API void field_copy_constructor_ex(solr_field_list_t **original_field_queue_ptr) { solr_field_list_t *original_field_queue = *original_field_queue_ptr; solr_field_value_t *ptr = original_field_queue->head; if (ptr == NULL) { return; } solr_field_list_t *new_field_queue = (solr_field_list_t *) pemalloc(sizeof(solr_field_list_t), SOLR_DOCUMENT_FIELD_PERSISTENT); new_field_queue->count = 0L; new_field_queue->field_name = (solr_char_t *) pestrdup((char *) (original_field_queue)->field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); new_field_queue->head = NULL; new_field_queue->last = NULL; new_field_queue->field_boost = original_field_queue->field_boost; while(ptr != NULL) { if (solr_document_insert_field_value(new_field_queue, ptr->field_value, 0.0) == FAILURE) { php_error_docref(NULL, E_ERROR, "Unable to insert field value"); } ptr = ptr->next; } *original_field_queue_ptr = new_field_queue; } /* {{{ void field_copy_constructor_zv(zval *field_queue_zv) */ PHP_SOLR_API void field_copy_constructor_zv(zval *field_queue_zv) { solr_field_list_t *original_field_queue = NULL; original_field_queue = Z_PTR_P(field_queue_zv); field_copy_constructor_ex(&original_field_queue); ZVAL_PTR(field_queue_zv, original_field_queue); } /* }}} */ /* {{{ PHP_SOLR_API int solr_document_insert_field_value(solr_field_list_t *queue, const solr_char_t *field_value, double field_boost, int modifier) */ PHP_SOLR_API int solr_document_insert_field_value_ex(solr_field_list_t *queue, const solr_char_t *field_value, double field_boost, int modifier) { solr_field_value_t *new_entry = (solr_field_value_t *) pemalloc(sizeof(solr_field_value_t), SOLR_DOCUMENT_FIELD_PERSISTENT); if (new_entry == NULL) { return FAILURE; } new_entry->field_value = (solr_char_t *) pestrdup((char *) field_value, SOLR_DOCUMENT_FIELD_PERSISTENT); if (new_entry->field_value == NULL) { return FAILURE; } new_entry->next = NULL; new_entry->modifier = modifier; if (queue->head == NULL) { /* This is the first and only item in the field list */ queue->head = new_entry; queue->last = new_entry; /* Update the field boost value */ if (field_boost > 0.0) { queue->field_boost = field_boost; } } else { /* There are already entries in the list. */ /* Append to the end of the queue */ queue->last->next = new_entry; /* Set the last item in the queue to the latest entry */ queue->last = new_entry; /* Update the field boost value */ if (field_boost > 0.0) { if (queue->field_boost > 0.0) { queue->field_boost *= field_boost; } else { queue->field_boost = field_boost; } } } queue->count++; return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API solr_document_t *solr_init_document(long int document_index) * create and allocate a solr_document_t with the specified index */ PHP_SOLR_API solr_document_t *solr_init_document(long int document_index) { uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; solr_document_t *doc_ptr = NULL; solr_document_t *doc_entry; #ifdef PHP_7 doc_entry = pemalloc(sizeof(solr_document_t), SOLR_DOCUMENT_PERSISTENT); #endif doc_entry->document_index = document_index; doc_entry->field_count = 0L; doc_entry->document_boost = 0.0f; /* Allocated memory for the fields HashTable using fast cache for HashTables */ ALLOC_HASHTABLE(doc_entry->fields); ALLOC_HASHTABLE(doc_entry->children); /* Initializing the hash table used for storing fields in this SolrDocument */ zend_hash_init(doc_entry->fields, nSize, NULL, (dtor_func_t) solr_destroy_field_list_ht_dtor, SOLR_DOCUMENT_FIELD_PERSISTENT); zend_hash_init(doc_entry->children, nSize, NULL, ZVAL_PTR_DTOR, SOLR_DOCUMENT_FIELD_PERSISTENT); /* Let's check one more time before insert into the HashTable */ if (zend_hash_index_exists(SOLR_GLOBAL(documents), document_index)) { /* todo call dtor ? */ pefree(doc_entry->fields, SOLR_DOCUMENT_FIELD_PERSISTENT); pefree(doc_entry->children, SOLR_DOCUMENT_FIELD_PERSISTENT); return NULL; } /* Add the document entry to the directory of documents */ doc_ptr = zend_hash_index_update_ptr(SOLR_GLOBAL(documents), document_index, (void *) doc_entry); /* Keep track of how many SolrDocument instances we currently have */ SOLR_GLOBAL(document_count)++; return doc_ptr; } /* }}} */ /* {{{ PHP_SOLR_API solr_document_t *solr_input_doc_ctor(zval *objptr) * constructor populate/allocate the new document after object instantiation * and allocates hashtables for fields and children */ PHP_SOLR_API solr_document_t *solr_input_doc_ctor(zval *objptr) { zend_ulong document_index = SOLR_UNIQUE_DOCUMENT_INDEX(); solr_document_t *solr_doc = NULL; if ((solr_doc = solr_init_document(document_index)) == NULL) { return NULL; } /* Set the value of the internal id property */ zend_update_property_long(solr_ce_SolrInputDocument, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, document_index); /* Overriding the default object handlers */ Z_OBJ_HT_P(objptr) = &solr_input_document_object_handlers; return solr_doc; } /* }}} */ /* {{{ PHP_SOLR_API void solr_destroy_document_zv(zval *document) * destory a solr_document within a zval (ZE 3) */ PHP_SOLR_API void solr_destroy_document_zv(zval *document) { solr_document_t *doc_entry = (solr_document_t *) Z_PTR_P(document); solr_destroy_document_ex(doc_entry); pefree(doc_entry, SOLR_DOCUMENT_PERSISTENT); } /* }}} */ /* {{{ void solr_destroy_document(void *document) * destory a solr_document_t */ PHP_SOLR_API void solr_destroy_document_ex(solr_document_t *doc_entry) { /* Release all the field_lists one at a time with solr_destroy_field_list */ zend_hash_destroy(doc_entry->fields); /* Deallocate memory for the fields HashTable */ pefree(doc_entry->fields, SOLR_DOCUMENT_FIELD_PERSISTENT); if (doc_entry->children) { zend_hash_destroy(doc_entry->children); pefree(doc_entry->children, SOLR_DOCUMENT_FIELD_PERSISTENT); } } /* }}} */ PHP_SOLR_API void solr_destroy_field_list_ht_dtor(zval *zv_field_entry) { solr_field_list_t *field_entry = Z_PTR_P(zv_field_entry); solr_destroy_field_list(field_entry); } /* {{{ void solr_destroy_field_list(solr_field_list_t **field_entry_ptr) */ PHP_SOLR_API void solr_destroy_field_list(solr_field_list_t *field_entry) { solr_field_value_t *tmp = NULL; solr_field_value_t *current_field_value = field_entry->head; /* Go through the list and free all the values */ while(current_field_value != NULL) { tmp = current_field_value->next; pefree(current_field_value->field_value, SOLR_DOCUMENT_FIELD_PERSISTENT); pefree(current_field_value, SOLR_DOCUMENT_FIELD_PERSISTENT); current_field_value = tmp; } field_entry->head = NULL; field_entry->last = NULL; pefree(field_entry->field_name, SOLR_DOCUMENT_FIELD_PERSISTENT); pefree(field_entry, SOLR_DOCUMENT_FIELD_PERSISTENT); } /* }}} */ /* Comparison functions for field entries */ /* {{{ int solr_compare_field_name(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_compare_field_name(const void *a, const void *b) { const Bucket *x = (Bucket *) a; const Bucket *y = (Bucket *) b; #else PHP_SOLR_API int solr_compare_field_name(Bucket *x, Bucket *y) { #endif const solr_field_list_t *first = (solr_field_list_t *) Z_PTR(x->val); const solr_field_list_t *second = (solr_field_list_t *) Z_PTR(y->val); const int diff = strcmp((char *) first->field_name, (char *) second->field_name); const int result = ((diff > 0) ? 1 : ((diff < 0) ? -1 : 0)); return result; } /* }}} */ /* {{{ int solr_rcompare_field_name(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_rcompare_field_name(const void *a, const void *b) #else PHP_SOLR_API int solr_rcompare_field_name(Bucket *a, Bucket *b) #endif { return (solr_compare_field_name(a, b) * -1); } /* }}} */ /* {{{ int solr_compare_field_value_count(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_compare_field_value_count(const void *a, const void *b) { const Bucket *x = (Bucket *) a; const Bucket *y = (Bucket *) b; #else PHP_SOLR_API int solr_compare_field_value_count(Bucket *x, Bucket *y) { #endif const solr_field_list_t *first = (solr_field_list_t *) Z_PTR(x->val); const solr_field_list_t *second = (solr_field_list_t *) Z_PTR(y->val); const int diff = first->count - second->count; const int result = ((diff > 0) ? 1 : ((diff < 0) ? -1 : 0)); return result; } /* }}} */ /* {{{ int solr_rcompare_field_value_count(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_rcompare_field_value_count(const void *a, const void *b) #else PHP_SOLR_API int solr_rcompare_field_value_count(Bucket *a, Bucket *b) #endif { return (solr_compare_field_value_count(a, b) * -1); } /* }}} */ /* {{{ int solr_compare_field_boost_value(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_compare_field_boost_value(const void *a, const void *b) { const Bucket *x = (Bucket *) a; const Bucket *y = (Bucket *) b; #else PHP_SOLR_API int solr_compare_field_boost_value(Bucket *x, Bucket *y) { #endif const solr_field_list_t *first = (solr_field_list_t *) Z_PTR(x->val); const solr_field_list_t *second = (solr_field_list_t *) Z_PTR(y->val); const double diff = first->field_boost - second->field_boost; const int result = ((diff > 0.0) ? 1 : ((diff < 0.0) ? -1 : 0)); return result; } /* }}} */ /* {{{ int solr_rcompare_field_boost_value(const void *a, const void *b) */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_rcompare_field_boost_value(const void *a, const void *b) #else PHP_SOLR_API int solr_rcompare_field_boost_value(Bucket *a, Bucket *b) #endif { return (solr_compare_field_boost_value(a, b) * -1); } /* }}} */ /* {{{ PHP_SOLR_API void solr_create_document_field_object(solr_field_list_t *field_values, zval **field_obj) */ PHP_SOLR_API void solr_create_document_field_object(solr_field_list_t *field_values, zval **field_obj) { zval *doc_field = *field_obj; solr_field_value_t *curr_ptr = NULL; zval field_values_array_tmp; zval *field_values_array = &field_values_array_tmp; array_init(field_values_array); curr_ptr = field_values->head; while(curr_ptr != NULL) { solr_char_t *current_value = curr_ptr->field_value; add_next_index_string(field_values_array, current_value); curr_ptr = curr_ptr->next; } object_init_ex(doc_field, solr_ce_SolrDocumentField); zend_update_property_string(solr_ce_SolrDocumentField, OBJ_FOR_PROP(doc_field), SOLR_FIELD_NAME_PROPERTY_NAME, sizeof(SOLR_FIELD_NAME_PROPERTY_NAME)-1, field_values->field_name); zend_update_property_double(solr_ce_SolrDocumentField, OBJ_FOR_PROP(doc_field), SOLR_FIELD_BOOST_PROPERTY_NAME, sizeof(SOLR_FIELD_BOOST_PROPERTY_NAME)-1, field_values->field_boost); zend_update_property(solr_ce_SolrDocumentField, OBJ_FOR_PROP(doc_field), SOLR_FIELD_VALUES_PROPERTY_NAME, sizeof(SOLR_FIELD_VALUES_PROPERTY_NAME)-1, field_values_array); zval_ptr_dtor(field_values_array); Z_OBJ_HT_P(doc_field) = &solr_document_field_handlers; } /* }}} */ /* {{{ PHP_SOLR_API void solr_create_document_field_object(solr_field_list_t *field_values, zval **field_obj) constructs the element when adding a document to the index */ PHP_SOLR_API void solr_add_doc_node(xmlNode *root_node, solr_document_t *doc_entry) { HashTable *document_fields = NULL; xmlNode *solr_doc_node = NULL; document_fields = doc_entry->fields; solr_doc_node = xmlNewChild(root_node, NULL, (xmlChar *) "doc", NULL); if (doc_entry->document_boost > 0.0f) { auto char tmp_buffer[256]; /* Scratch pad for converting numeric values to strings */ memset(tmp_buffer, 0, sizeof(tmp_buffer)); php_gcvt(doc_entry->document_boost, EG(precision), '.', 'e' , tmp_buffer); xmlNewProp(solr_doc_node, (xmlChar *) "boost", (xmlChar *) tmp_buffer); } solr_generate_document_xml_from_fields(solr_doc_node, document_fields); if (zend_hash_num_elements(doc_entry->children) > 0) { SOLR_HASHTABLE_FOR_LOOP(doc_entry->children) { zval *doc_obj = NULL; solr_document_t *child_doc_entry = NULL; doc_obj = zend_hash_get_current_data(doc_entry->children); if (solr_fetch_document_entry(OBJ_FOR_PROP(doc_obj), &child_doc_entry) == SUCCESS) { solr_add_doc_node(solr_doc_node, child_doc_entry); } } } } /* }}} */ /* {{{ static void solr_generate_document_xml_from_fields(xmlNode *solr_doc_node, HashTable *document_fields) */ PHP_SOLR_API void solr_generate_document_xml_from_fields(xmlNode *solr_doc_node, HashTable *document_fields) { xmlDoc *doc_ptr = solr_doc_node->doc; solr_char_t *doc_field_name; zend_string *field_str = NULL; solr_field_value_t *doc_field_value; solr_field_list_t *field = NULL; zend_ulong num_idx = 0L; ZEND_HASH_FOREACH_KEY_PTR(document_fields, num_idx, field_str, field) { (void)num_idx; zend_bool is_first_value = 1; /* Turn on first value flag */ xmlChar *modifier_string = NULL; doc_field_name = field_str->val; doc_field_value = field->head; /* Loop through all the values for this field */ while(doc_field_value != NULL) { xmlChar *escaped_field_value = xmlEncodeEntitiesReentrant(doc_ptr, (xmlChar *) doc_field_value->field_value); xmlNode *solr_field_node = xmlNewChild(solr_doc_node, NULL, (xmlChar *) "field", escaped_field_value); xmlNewProp(solr_field_node, (xmlChar *) "name", (xmlChar *) doc_field_name); if (field->modified) { switch (doc_field_value->modifier) { case SOLR_FIELD_VALUE_MOD_ADD: modifier_string = (xmlChar *)"add"; break; case SOLR_FIELD_VALUE_MOD_REMOVE: modifier_string = (xmlChar *)"remove"; break; case SOLR_FIELD_VALUE_MOD_REMOVEREGEX: modifier_string = (xmlChar *)"removeregex"; break; case SOLR_FIELD_VALUE_MOD_SET: modifier_string = (xmlChar *)"set"; break; case SOLR_FIELD_VALUE_MOD_INC: modifier_string = (xmlChar *)"inc"; break; case SOLR_FIELD_VALUE_MOD_NONE:default: break; } if (modifier_string) { xmlNewProp(solr_field_node, (xmlChar *) "update", modifier_string); } } /* Set the boost attribute if this is the first value */ if (is_first_value && field->field_boost > 0.0f) { auto char tmp_boost_value_buffer[256]; memset(tmp_boost_value_buffer, 0, sizeof(tmp_boost_value_buffer)); php_gcvt(field->field_boost, EG(precision), '.', 'e' , tmp_boost_value_buffer); xmlNewProp(solr_field_node, (xmlChar *) "boost", (xmlChar *) tmp_boost_value_buffer); is_first_value = 0; /* Turn off the flag */ } /* Release the memory allocated by xmlEncodeEntitiesReentrant */ xmlFree(escaped_field_value); /* Grab the next value for this field if any */ doc_field_value = doc_field_value->next; } /* while(doc_field_value != NULL) */ } ZEND_HASH_FOREACH_END(); /* end fields loop */ } /* }}} */ PHP_SOLR_API void solr_document_get_field_names(INTERNAL_FUNCTION_PARAMETERS) { solr_document_t *doc_entry = NULL; /* Retrieve the document entry for the SolrDocument instance */ if (solr_fetch_document_entry(OBJ_FOR_PROP(getThis()), &doc_entry) == SUCCESS) { HashTable *fields_ht = doc_entry->fields; array_init(return_value); SOLR_HASHTABLE_FOR_LOOP(fields_ht) { solr_field_list_t *field = NULL; field = zend_hash_get_current_data_ptr(fields_ht); add_next_index_string(return_value, (char *) field->field_name); } return; } RETURN_FALSE; } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_helpers.c0000644000175000017500000015777615001737315017202 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" #ifndef PHP_WIN32 ZEND_EXTERN_MODULE_GLOBALS(json) #endif /** ************************************************************************ **/ /** FUNCTIONS FOR DECLARING CONSTANTS **/ /** ************************************************************************ **/ /* {{{ void solr_extension_register_constants(int type, int module_number) */ PHP_SOLR_API void solr_extension_register_constants(int type, int module_number) { REGISTER_LONG_CONSTANT("SOLR_MAJOR_VERSION", PHP_SOLR_MAJOR_VERSION, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOLR_MINOR_VERSION", PHP_SOLR_MINOR_VERSION, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOLR_PATCH_VERSION", PHP_SOLR_PATCH_VERSION, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("SOLR_EXTENSION_VERSION", PHP_SOLR_DOTTED_VERSION, CONST_CS | CONST_PERSISTENT); } /* }}} */ /* {{{ void solr_document_register_class_constants(zend_class_entry * ce) */ PHP_SOLR_API void solr_document_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_long(ce, "SORT_DEFAULT", sizeof("SORT_DEFAULT")-1, SOLR_SORT_ASC); zend_declare_class_constant_long(ce, "SORT_ASC", sizeof("SORT_ASC")-1, SOLR_SORT_ASC); zend_declare_class_constant_long(ce, "SORT_DESC", sizeof("SORT_DESC")-1, SOLR_SORT_DESC); zend_declare_class_constant_long(ce, "SORT_FIELD_NAME", sizeof("SORT_FIELD_NAME")-1, SOLR_SORT_FIELD_NAME); zend_declare_class_constant_long(ce, "SORT_FIELD_VALUE_COUNT", sizeof("SORT_FIELD_VALUE_COUNT")-1, SOLR_SORT_FIELD_VALUE_COUNT); zend_declare_class_constant_long(ce, "SORT_FIELD_BOOST_VALUE", sizeof("SORT_FIELD_BOOST_VALUE")-1, SOLR_SORT_FIELD_BOOST_VALUE); } /* }}} */ PHP_SOLR_API void solr_input_document_register_class_constants(zend_class_entry *ce) { solr_document_register_class_constants(ce); zend_declare_class_constant_long(ce, "UPDATE_MODIFIER_ADD", sizeof("UPDATE_MODIFIER_ADD")-1, SOLR_FIELD_VALUE_MOD_ADD); zend_declare_class_constant_long(ce, "UPDATE_MODIFIER_SET", sizeof("UPDATE_MODIFIER_SET")-1, SOLR_FIELD_VALUE_MOD_SET); zend_declare_class_constant_long(ce, "UPDATE_MODIFIER_INC", sizeof("UPDATE_MODIFIER_INC")-1, SOLR_FIELD_VALUE_MOD_INC); zend_declare_class_constant_long(ce, "UPDATE_MODIFIER_REMOVE", sizeof("UPDATE_MODIFIER_REMOVE")-1, SOLR_FIELD_VALUE_MOD_REMOVE); zend_declare_class_constant_long(ce, "UPDATE_MODIFIER_REMOVEREGEX", sizeof("UPDATE_MODIFIER_REMOVEREGEX")-1, SOLR_FIELD_VALUE_MOD_REMOVEREGEX); zend_declare_class_constant_long(ce, "VERSION_ASSERT_NONE", sizeof("VERSION_ASSERT_NONE")-1, SOLR_VERSION_ASSERT_NONE); zend_declare_class_constant_long(ce, "VERSION_ASSERT_EXISTS", sizeof("VERSION_ASSERT_EXISTS")-1, SOLR_VERSION_ASSERT_EXISTS); zend_declare_class_constant_long(ce, "VERSION_ASSERT_NOT_EXISTS", sizeof("VERSION_ASSERT_NOT_EXISTS")-1, SOLR_VERSION_ASSERT_NOT_EXISTS); } /* {{{ void solr_collapse_function_register_class_constants(zend_class_entry * ce) */ PHP_SOLR_API void solr_collapse_function_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_string(ce, "NULLPOLICY_IGNORE", sizeof("NULLPOLICY_IGNORE")-1, "ignore"); zend_declare_class_constant_string(ce, "NULLPOLICY_EXPAND", sizeof("NULLPOLICY_EXPAND")-1, "expand"); zend_declare_class_constant_string(ce, "NULLPOLICY_COLLAPSE", sizeof("NULLPOLICY_COLLAPSE")-1, "collapse"); } /* }}} */ /* {{{ void solr_client_register_class_constants(zend_class_entry *ce) */ PHP_SOLR_API void solr_client_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_long(ce, "SEARCH_SERVLET_TYPE", sizeof("SEARCH_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_SEARCH); zend_declare_class_constant_long(ce, "UPDATE_SERVLET_TYPE", sizeof("UPDATE_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_UPDATE); zend_declare_class_constant_long(ce, "THREADS_SERVLET_TYPE", sizeof("THREADS_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_THREADS); zend_declare_class_constant_long(ce, "PING_SERVLET_TYPE", sizeof("PING_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_PING); zend_declare_class_constant_long(ce, "TERMS_SERVLET_TYPE", sizeof("TERMS_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_TERMS); zend_declare_class_constant_long(ce, "SYSTEM_SERVLET_TYPE", sizeof("SYSTEM_SERVLET_TYPE")-1, SOLR_SERVLET_TYPE_SYSTEM); zend_declare_class_constant_string(ce, "DEFAULT_SEARCH_SERVLET", sizeof("DEFAULT_SEARCH_SERVLET")-1, SOLR_DEFAULT_SEARCH_SERVLET); zend_declare_class_constant_string(ce, "DEFAULT_UPDATE_SERVLET", sizeof("DEFAULT_UPDATE_SERVLET")-1, SOLR_DEFAULT_UPDATE_SERVLET); zend_declare_class_constant_string(ce, "DEFAULT_THREADS_SERVLET", sizeof("DEFAULT_THREADS_SERVLET")-1, SOLR_DEFAULT_THREADS_SERVLET); zend_declare_class_constant_string(ce, "DEFAULT_PING_SERVLET", sizeof("DEFAULT_PING_SERVLET")-1, SOLR_DEFAULT_PING_SERVLET); zend_declare_class_constant_string(ce, "DEFAULT_TERMS_SERVLET", sizeof("DEFAULT_TERMS_SERVLET")-1, SOLR_DEFAULT_TERMS_SERVLET); zend_declare_class_constant_string(ce, "DEFAULT_SYSTEM_SERVLET", sizeof("DEFAULT_SYSTEM_SERVLET")-1, SOLR_DEFAULT_SYSTEM_SERVLET); } /* }}} */ /* {{{ void solr_response_register_class_properties(zend_class_entry *ce) */ PHP_SOLR_API void solr_response_register_class_properties(zend_class_entry *ce) { zend_declare_property_long(ce, "http_status", sizeof("http_status")-1, 0L, ZEND_ACC_PROTECTED); zend_declare_property_long(ce, "parser_mode", sizeof("parser_mode")-1, 0L, ZEND_ACC_PROTECTED); zend_declare_property_bool(ce, "success", sizeof("success")-1, 0L, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "response_writer", sizeof("response_writer")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_status_message", sizeof("http_status_message")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_request_url", sizeof("http_request_url")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_raw_request_headers", sizeof("http_raw_request_headers")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_raw_request", sizeof("http_raw_request")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_raw_response_headers", sizeof("http_raw_response_headers")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_raw_response", sizeof("http_raw_response")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, "http_digested_response", sizeof("http_digested_response")-1, SOLR_SPACE_STRING, ZEND_ACC_PROTECTED); } /* }}} */ /* {{{ void solr_exception_register_class_properties(zend_class_entry *ce) */ PHP_SOLR_API void solr_exception_register_class_properties(zend_class_entry *ce) { zend_declare_property_long(ce, SOLR_SOURCELINE_NO_PROPERTY_NAME, sizeof(SOLR_SOURCELINE_NO_PROPERTY_NAME)-1, __LINE__, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, SOLR_SOURCEFILE_PROPERTY_NAME, sizeof(SOLR_SOURCEFILE_PROPERTY_NAME)-1, __FILE__, ZEND_ACC_PROTECTED); zend_declare_property_string(ce, SOLR_ZIFNAME_PROPERTY_NAME, sizeof(SOLR_ZIFNAME_PROPERTY_NAME)-1, (char *) __func__, ZEND_ACC_PROTECTED); } /* }}} */ /* {{{ void solr_response_register_class_constants(zend_class_entry *ce) */ PHP_SOLR_API void solr_response_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_long(ce, "PARSE_SOLR_OBJ", sizeof("PARSE_SOLR_OBJ")-1, 0L); zend_declare_class_constant_long(ce, "PARSE_SOLR_DOC", sizeof("PARSE_SOLR_DOC")-1, 1L); } /* }}} */ /* {{{ void solr_query_register_class_constants(zend_class_entry *ce) */ PHP_SOLR_API void solr_query_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_long(ce, "ORDER_ASC", sizeof("ORDER_ASC")-1, SOLR_SORT_DIR_ASC); zend_declare_class_constant_long(ce, "ORDER_DESC", sizeof("ORDER_DESC")-1, SOLR_SORT_DIR_DESC); zend_declare_class_constant_long(ce, "FACET_SORT_INDEX", sizeof("FACET_SORT_INDEX")-1, 0L); zend_declare_class_constant_long(ce, "FACET_SORT_COUNT", sizeof("FACET_SORT_COUNT")-1, 1L); zend_declare_class_constant_long(ce, "TERMS_SORT_INDEX", sizeof("TERMS_SORT_INDEX")-1, 0L); zend_declare_class_constant_long(ce, "TERMS_SORT_COUNT", sizeof("TERMS_SORT_COUNT")-1, 1L); } /* }}} */ PHP_SOLR_API void solr_extract_register_class_constants(zend_class_entry *ce) { zend_declare_class_constant_string(ce, "CAPTURE_ELEMENTS", sizeof("CAPTURE_ELEMENTS")-1, "capture"); zend_declare_class_constant_string(ce, "CAPTURE_ATTRIBUTES", sizeof("CAPTURE_ATTRIBUTES")-1, "captureAttr"); zend_declare_class_constant_string(ce, "COMMIT_WITHIN", sizeof("COMMIT_WITHIN")-1, "commitWithin"); zend_declare_class_constant_string(ce, "DATE_FORMATS", sizeof("DATE_FORMATS")-1, "date.formats"); zend_declare_class_constant_string(ce, "DEFAULT_FIELD", sizeof("DEFAULT_FIELD")-1, "defaultField"); zend_declare_class_constant_string(ce, "EXTRACT_ONLY", sizeof("EXTRACT_ONLY")-1, "extractOnly"); zend_declare_class_constant_string(ce, "EXTRACT_FORMAT", sizeof("EXTRACT_FORMAT")-1,"extractFormat"); zend_declare_class_constant_string(ce, "IGNORE_TIKA_EXCEPTION", sizeof("IGNORE_TIKA_EXCEPTION")-1, "ignoreTikaException"); zend_declare_class_constant_string(ce, "LITERALS_OVERRIDE", sizeof("LITERALS_OVERRIDE")-1, "literalsOverride"); zend_declare_class_constant_string(ce, "LOWERNAMES", sizeof("LOWERNAMES")-1, "lowernames"); zend_declare_class_constant_string(ce, "MULTIPART_UPLOAD_LIMIT", sizeof("MULTIPART_UPLOAD_LIMIT")-1, "multipartUploadLimitInKB"); zend_declare_class_constant_string(ce, "PASSWORD_MAP_FILE", sizeof("PASSWORD_MAP_FILE")-1, "passwordsFile"); zend_declare_class_constant_string(ce, "RESOURCE_NAME", sizeof("RESOURCE_NAME")-1, "resource.name"); zend_declare_class_constant_string(ce, "RESOURCE_PASSWORD", sizeof("RESOURCE_PASSWORD")-1, "resource.password"); zend_declare_class_constant_string(ce, "TIKE_CONFIG", sizeof("TIKE_CONFIG")-1, "tika.config"); zend_declare_class_constant_string(ce, "UNKNOWN_FIELD_PREFIX", sizeof("UNKNOWN_FIELD_PREFIX")-1, "uprefix"); zend_declare_class_constant_string(ce, "XPATH_EXPRESSION", sizeof("XPATH_EXPRESSION")-1, "xpath"); zend_declare_class_constant_string(ce, "FIELD_MAPPING_PREFIX", sizeof("FIELD_MAPPING_PREFIX")-1, "fmap."); zend_declare_class_constant_string(ce, "FIELD_BOOST_PREFIX", sizeof("FIELD_BOOST_PREFIX")-1, "boost."); zend_declare_class_constant_string(ce, "LITERALS_PREFIX", sizeof("LITERALS_PREFIX")-1, "literal."); } /** ************************************************************************ **/ /** UTILITY FUNCTIONS **/ /** ************************************************************************ **/ /* {{{ int solr_hashtable_get_new_index(HashTable *ht) Retrieves a unique index for this HashTable */ PHP_SOLR_API int solr_hashtable_get_new_index(HashTable *ht) { int new_index = SOLR_GET_RANDOM_NUMBER(); /* If the key already exists in the HashTable, create another one. */ while(zend_hash_index_exists(ht, new_index)) { new_index = SOLR_GET_RANDOM_NUMBER(); } return new_index; } /* }}} */ /* {{{ static inline int solr_fetch_document_entry(zval *objptr, solr_document_t **doc_entry) Retrieves a Document from the HashTable */ #if PHP_VERSION_ID < 80000 PHP_SOLR_API int solr_fetch_document_entry(zval *objptr, solr_document_t **doc_entry) { zval *rv = NULL; zval *id = zend_read_property(Z_OBJCE_P(objptr), objptr, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, 1, rv); #else PHP_SOLR_API int solr_fetch_document_entry(zend_object *objptr, solr_document_t **doc_entry) { zval *rv = NULL; zval *id = zend_read_property(objptr->ce, objptr, SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, 1, rv); #endif /* Retrieving the value of the document index from the zval */ long int document_index = 0L; ZVAL_LONG_ASSIGN_TO_LONG(document_index, id); *doc_entry = NULL; /* Retrieve the doc_entry from the HashTable */ if ((*doc_entry = (solr_document_t *)zend_hash_index_find_ptr(SOLR_GLOBAL(documents), document_index)) == NULL) { php_error_docref(NULL, E_WARNING, "Invalid Document Index %ld. HashTable index does not exist.", document_index); php_error_docref(NULL, E_WARNING, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_fetch_client_entry(zval *objptr, solr_client_t **solr_client) */ PHP_SOLR_API int solr_fetch_client_entry(zval *objptr, solr_client_t **solr_client) { zval rv; zval *id = zend_read_property(solr_ce_SolrClient, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, 1, &rv); /* Retrieving the value of the client index from the zval */ long int client_index = Z_LVAL_P(id); *solr_client = NULL; /* Retrieve the doc_entry from the HashTable */ if ((*solr_client = zend_hash_index_find_ptr(SOLR_GLOBAL(clients), client_index)) == NULL) { php_error_docref(NULL, E_WARNING, "Invalid SolrClient Index %ld. HashTable index does not exist.", client_index); php_error_docref(NULL, E_WARNING, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_fetch_params_entry(zval *objptr, solr_params_t **solr_params) */ PHP_SOLR_API int solr_fetch_params_entry(zval *objptr, solr_params_t **solr_params) { zval rv; zval *id = zend_read_property(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, 1, &rv); long int params_index = Z_LVAL_P(id); *solr_params = NULL; if ((*solr_params = zend_hash_index_find_ptr(SOLR_GLOBAL(params), params_index)) == NULL) { php_error_docref(NULL, E_WARNING, "Invalid SolrParams Index %ld. HashTable index does not exist.", params_index); php_error_docref(NULL, E_WARNING, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); return FAILURE; } return SUCCESS; } /* }}} */ PHP_SOLR_API int solr_fetch_function_entry(zval *objptr, solr_function_t **solr_function) { zval rv; zval *id = zend_read_property(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, 1, &rv); long int params_index = Z_LVAL_P(id); *solr_function = NULL; if ((*solr_function = zend_hash_index_find_ptr(SOLR_GLOBAL(functions), params_index)) == NULL) { php_error_docref(NULL, E_WARNING, "Invalid solr_function Index %ld. HashTable index does not exist.", params_index); php_error_docref(NULL, E_WARNING, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); return FAILURE; } return SUCCESS; } /* {{{ PHP_SOLR_API void solr_destroy_function(zval *solr_function) */ PHP_SOLR_API void solr_destroy_function(zval *solr_function) { solr_function_t *function = (solr_function_t *) Z_PTR_P(solr_function); zend_hash_destroy(function->params); pefree(function->params, SOLR_FUNCTIONS_PERSISTENT); #ifdef PHP_7 pefree(function, SOLR_FUNCTIONS_PERSISTENT); #endif } /* }}} */ /* {{{ PHP_SOLR_API xmlDocPtr solr_xml_create_xml_doc(const xmlChar *root_node_name, xmlNode **root_node_ptr) */ PHP_SOLR_API xmlDocPtr solr_xml_create_xml_doc(const xmlChar *root_node_name, xmlNode **root_node_ptr) { xmlNs *ns = NULL; xmlDoc *doc_ptr = xmlNewDoc((xmlChar *) "1.0"); xmlNode *root_node = xmlNewNode(ns, root_node_name); xmlDocSetRootElement(doc_ptr, root_node); if (root_node_ptr) { *root_node_ptr = root_node; } return doc_ptr; } /* }}} */ /** * escapes strings with characters that are part of the Lucene query syntax * * @sbuilder is a solr_string_t pointer used to store the escape char sequence * @unescaped is the unescaped string. It must be null terminated * @unescaped_length is the original length of the unescaped_string */ /* {{{ PHP_SOLR_API void solr_escape_query_chars(solr_string_t *sbuilder, solr_char_t *unescaped, size_t unescaped_length) */ PHP_SOLR_API void solr_escape_query_chars(solr_string_t *sbuilder, solr_char_t *unescaped, size_t unescaped_length) { register int i = 0; /** * Lucene supports escaping special characters that are part of the query syntax. * * The current list special characters are * + - && || ! ( ) { } [ ] ^ " ~ * ? : \ / * * These characters are part of the query syntax and must be escaped */ for (i = 0; i < unescaped_length; i++) { enter_switchboard : switch(unescaped[i]) { case '\\' : case '+' : case '-' : case '!' : case '(' : case ')' : case ':' : case '/' : case '^' : case '[' : case ']' : case '"' : case '{' : case '}' : case '~' : case '*' : case '?' : case ';' : { solr_string_appendc(sbuilder, '\\'); } break; case '|' : /* || */ { if ('|' == unescaped[i+1]) { solr_string_appendc(sbuilder, '\\'); solr_string_append_const(sbuilder, "||"); i += 2; goto enter_switchboard; } } break; case '&' : /* && */ { if ('&' == unescaped[i+1]) { solr_string_appendc(sbuilder, '\\'); solr_string_append_const(sbuilder, "&&"); i += 2; goto enter_switchboard; } } break; default : /* The current character is not a special character */ { /* Do nothing. Just append the character as is */ } } /* END switch(unescaped[i]) */ solr_string_appendc(sbuilder, unescaped[i]); } /* END for (i = 0; i < unescaped_length; i++) { */ } /* }}} */ /******************************************************************************/ /* SOLR XML RESPONSE DIGEST DATA TYPES AND FUNCTIONS */ /******************************************************************************/ /* {{{ solr_doc_encode_t, solr_php_encode_t, solr_encoding_type_t, solr_php_encode_func_t, solr_document_field_encode_func_t */ typedef enum { SOLR_DOC_ENCODE_START = 0, SOLR_DOC_ENCODE_FIELDS = 1, SOLR_DOC_ENCODE_FIELD = 2, SOLR_DOC_ENCODE_END } solr_doc_encode_t; typedef enum { SOLR_ENCODE_START = 0, SOLR_ENCODE_NULL = 1, SOLR_ENCODE_BOOL = 2, SOLR_ENCODE_INT = 3, SOLR_ENCODE_FLOAT = 4, SOLR_ENCODE_STRING = 5, SOLR_ENCODE_ARRAY = 6, SOLR_ENCODE_OBJECT = 7, SOLR_ENCODE_DOC = 8, SOLR_ENCODE_RESULT = 9, SOLR_ENCODE_END } solr_php_encode_t; typedef enum { SOLR_ENCODE_STANDALONE = 0, SOLR_ENCODE_OBJECT_PROPERTY = 1, SOLR_ENCODE_ARRAY_KEY = 2, SOLR_ENCODE_ARRAY_INDEX = 3 } solr_encoding_type_t; typedef void (*solr_php_encode_func_t)(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); typedef void (*solr_document_field_encode_func_t)(const xmlNode *node, xmlNode *field); /* }}} */ /* {{{ Macros for XML transcoding */ /* Serializes the current XML node */ #define solr_encode_xml_node(__node, __buf, __enc_type, __arr_idx, __mode) solr_encoder_functions[solr_get_xml_type((__node))]((__node),(__buf), (__enc_type), (__arr_idx), (__mode)) #define solr_write_object_closer(__buf) solr_string_append_const((__buf), "}") #define solr_write_array_closer(__buf) solr_string_append_const((__buf), "}") #define solr_write_root_object_closer(__buf) solr_string_append_const((__buf), "}") /* }}} */ /* {{{ static void solr_encode_* prototypes */ static void solr_encode_null(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_bool(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_int(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_float(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_string(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_array(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_object(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_result(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_encode_document_field_simple(const xmlNode *fieldNode, xmlNode *field); static void solr_encode_document_field_complex(const xmlNode *fieldNode, xmlNode *field); /* }}} */ /* {{{ global variables solr_encoder_functions[], solr_document_field_encoders[] */ static solr_php_encode_func_t solr_encoder_functions[] = { solr_encode_string, solr_encode_null, solr_encode_bool, solr_encode_int, solr_encode_float, solr_encode_string, solr_encode_array, solr_encode_object, solr_encode_document, solr_encode_result, NULL }; static solr_document_field_encode_func_t solr_document_field_encoders[] = { solr_encode_document_field_simple, /* maps to SOLR_SIMPLE_FIELD */ solr_encode_document_field_complex, /* maps to SOLR_COMPLEX_FIELD */ NULL }; /* }}} */ /* {{{ Constants and Macros for handling node types */ #define SOLR_SIMPLE_FIELD 0 #define SOLR_COMPLEX_FIELD 1 #define solr_xml_field_node_type(node) (xmlStrEqual((node)->name, (xmlChar *)"arr")? SOLR_COMPLEX_FIELD : SOLR_SIMPLE_FIELD) #define solr_encode_document_field(field_in, field_out) solr_document_field_encoders[solr_xml_field_node_type((field_in))]((field_in), (field_out)) /* }}} */ /* Used to figure out now many properties or elements there are in an object or an array */ /* {{{ static inline int solr_get_node_size(const xmlNode *data_node) */ static inline int solr_get_node_size(const xmlNode *data_node) { register int size = 0; xmlNode *curr_node = data_node->children; while(curr_node != NULL) { if (XML_ELEMENT_NODE == curr_node->type) { size++; } curr_node = curr_node->next; } return size; } /* }}} */ /* {{{ static inline int solr_get_xml_type(xmlNode *node) */ static inline int solr_get_xml_type(xmlNode *node) { solr_char_t *node_name = (solr_char_t *) node->name; if (!node_name) { return SOLR_ENCODE_STRING; } if (!strcmp(node_name, "str")) { return SOLR_ENCODE_STRING; } else if (!strcmp(node_name, "int") || !strcmp(node_name, "long") || !strcmp(node_name, "short") || !strcmp(node_name, "byte")) { return SOLR_ENCODE_INT; } else if (!strcmp(node_name, "double") || !strcmp(node_name, "float")) { return SOLR_ENCODE_FLOAT; } else if (!strcmp(node_name, "lst")) { return SOLR_ENCODE_OBJECT; } else if (!strcmp(node_name, "arr")) { return SOLR_ENCODE_ARRAY; } else if (!strcmp(node_name, "bool")) { return SOLR_ENCODE_BOOL; } else if (!strcmp(node_name, "null")) { return SOLR_ENCODE_NULL; } else if (!strcmp(node_name, "result")) { return SOLR_ENCODE_RESULT; }else if (!strcmp(node_name, "doc")) { return SOLR_ENCODE_OBJECT; } else { return SOLR_ENCODE_STRING; } } /* }}} */ /* {{{ static inline void solr_write_variable_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) */ static inline void solr_write_variable_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) { switch(enc_type) { case SOLR_ENCODE_OBJECT_PROPERTY : /* fall through */ case SOLR_ENCODE_ARRAY_KEY : { solr_char_t *object_name = "_undefined_property_name"; xmlAttr *name_attr = node->properties; /* get the contents of the name attribute */ if (name_attr) { object_name = (solr_char_t *) solr_xml_get_node_contents(name_attr); } solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, strlen(object_name)); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, object_name, strlen(object_name)); solr_string_append_const(buffer, "\";"); } break; case SOLR_ENCODE_ARRAY_INDEX : { solr_string_append_const(buffer, "i:"); solr_string_append_long(buffer, array_index); solr_string_appendc(buffer, ';'); } break; default : { /* do nothing */ } break; } } /* }}} */ /* {{{ static void solr_write_object_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) */ static void solr_write_object_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) { int size = solr_get_node_size(node); solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "O:10:\"SolrObject\":"); solr_string_append_long(buffer, size); solr_string_append_const(buffer, ":{"); } /* }}} */ /* {{{ static void solr_write_solr_document_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, int size) */ static void solr_write_solr_document_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, int size) { solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "C:12:\"SolrDocument\":"); solr_string_append_long(buffer, size); solr_string_append_const(buffer, ":{"); } /* }}} */ /* {{{ static void solr_write_array_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) */ static void solr_write_array_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) { int size = solr_get_node_size(node); solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "a:"); solr_string_append_long(buffer, size); solr_string_append_const(buffer, ":{"); } /* }}} */ static void solr_serialize_solr_document(const xmlNode *node, solr_string_t *dest); static void solr_encode_solr_document_children(const xmlNode *node, xmlNode* builder_node, int child_docs_found); static void solr_encode_solr_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode); static void solr_serialize_solr_document(const xmlNode *node, solr_string_t *dest) { xmlChar *doc_txt_buffer = NULL; int doc_txt_len = 0; xmlNode *solr_document_node = NULL; xmlDoc *doc_ptr = solr_xml_create_xml_doc((xmlChar *) "solr_document", &solr_document_node); xmlNode *fields_node = xmlNewChild(solr_document_node, NULL, (xmlChar *) "fields", NULL); xmlNode *curr_node = node->children; int format = 1; int child_docs_found = 0; while(curr_node != NULL) { if (XML_ELEMENT_NODE == curr_node->type) { if (strcmp((const char *)curr_node->name, "doc") == 0) { child_docs_found++; } else { xmlNode *field = xmlNewChild(fields_node, NULL, (xmlChar *)"field", NULL); solr_encode_document_field(curr_node, field); } } curr_node = curr_node->next; } if (child_docs_found > 0) { solr_encode_solr_document_children(node, solr_document_node, child_docs_found); } /* We have written all the fields to the document */ /* Dumping the document from memory to the buffer */ xmlDocDumpFormatMemoryEnc(doc_ptr, &doc_txt_buffer, &doc_txt_len, "UTF-8", format); solr_string_appends_ex(dest, (solr_char_t *)doc_txt_buffer, doc_txt_len); xmlFreeDoc(doc_ptr); xmlFree(doc_txt_buffer); } /* {{{ static void solr_encode_document_children(const xmlNode *node, solr_string_t* buffer, int child_docs_found, long int parse_mode) encodes the doc/doc child/nested documents */ static void solr_encode_solr_document_children(const xmlNode *node, xmlNode* builder_node, int child_docs_found) { int current_index = 0; xmlXPathContext *xpathctxt = NULL; const xmlChar *xpath_expression = (xmlChar *) "child::doc"; xmlXPathObject *xpathObj = NULL; xmlNodeSet *result = NULL; xmlNode *child_docs_node = NULL; xpathctxt = xmlXPathNewContext(node->doc); xpathctxt->node = (xmlNodePtr) node; xpathObj = xmlXPathEval(xpath_expression, xpathctxt); result = xpathObj->nodesetval; child_docs_found = result->nodeNr; child_docs_node = xmlNewChild(builder_node, NULL, (xmlChar *)"child_docs", NULL); for (current_index=0; current_index < child_docs_found; current_index++) { zend_string *encoded_str = NULL; solr_string_t tmp_buffer; solr_string_t tmp_s_buffer; memset(&tmp_buffer, 0, sizeof(solr_string_t)); memset(&tmp_s_buffer, 0, sizeof(solr_string_t)); solr_serialize_solr_document(result->nodeTab[current_index], &tmp_buffer); solr_string_append_const(&tmp_s_buffer, "C:12:\"SolrDocument\":"); solr_string_append_long(&tmp_s_buffer, tmp_buffer.len); solr_string_append_const(&tmp_s_buffer, ":{"); solr_string_appends_ex(&tmp_s_buffer, tmp_buffer.str, tmp_buffer.len); solr_write_object_closer(&tmp_s_buffer); encoded_str = php_base64_encode((const unsigned char*)tmp_s_buffer.str, tmp_s_buffer.len); xmlNewChild(child_docs_node, NULL, (const xmlChar *) "dochash", (xmlChar *)encoded_str->val); solr_string_free_ex(&tmp_buffer); solr_string_free_ex(&tmp_s_buffer); zend_string_free(encoded_str); } } /* }}} */ /** * * The @enc_type parameter must be SOLR_ENCODE_ARRAY_INDEX */ /* {{{ static void solr_encode_solr_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_solr_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { solr_string_t doc_serialized_buffer; memset(&doc_serialized_buffer, 0, sizeof(solr_string_t)); solr_serialize_solr_document(node, &doc_serialized_buffer); solr_write_solr_document_opener(NULL, buffer, enc_type, array_index, doc_serialized_buffer.len); solr_string_appends(buffer, (char *) doc_serialized_buffer.str, doc_serialized_buffer.len); solr_write_object_closer(buffer); solr_string_free(&doc_serialized_buffer); } /* }}} */ /* {{{ static void solr_write_object_opener(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) */ static void solr_write_object_opener_child_doc(const xmlNode *node, int num_child_docs ,solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index) { int size = solr_get_node_size(node) - num_child_docs + 1; solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "O:10:\"SolrObject\":"); solr_string_append_long(buffer, size); solr_string_append_const(buffer, ":{"); } /* }}} */ /* {{{ static void solr_encode_document_children(const xmlNode *node, solr_string_t* buffer, int child_docs_found, long int parse_mode) encodes the doc/doc child/nested documents ONLY FOR SolrObject */ static void solr_encode_document_children(const xmlNode *node, solr_string_t* buffer, int child_docs_found, long int parse_mode) { int current_index = 0; xmlXPathContext *xpathctxt = NULL; const xmlChar *xpath_expression = (xmlChar *) "child::doc"; xmlXPathObject *xpathObj = NULL; xmlNodeSet *result = NULL; solr_php_encode_func_t document_encoder_functions[] = { solr_encode_document, solr_encode_solr_document, NULL }; solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, sizeof("_childDocuments_")-1); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, "_childDocuments_", sizeof("_childDocuments_")-1); solr_string_append_const(buffer, "\";"); solr_string_append_const(buffer, "a:"); solr_string_append_long(buffer, child_docs_found); solr_string_append_const(buffer, ":{"); xpathctxt = xmlXPathNewContext(node->doc); xpathctxt->node = (xmlNodePtr) node; xpathObj = xmlXPathEval(xpath_expression, xpathctxt); result = xpathObj->nodesetval; child_docs_found = result->nodeNr; for (current_index=0; current_index < child_docs_found; current_index++) { document_encoder_functions[parse_mode](result->nodeTab[current_index], buffer, SOLR_ENCODE_ARRAY_INDEX, current_index, parse_mode); } solr_write_array_closer(buffer); } /* }}} */ /* {{{ static void solr_encode_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) encodes/serializes the element result/doc */ static void solr_encode_document(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { xmlNode *curr_node = NULL; int child_docs_found = 0; solr_string_t inner_buffer; memset(&inner_buffer, 0, sizeof(solr_string_t)); curr_node = node->children; while(curr_node != NULL) { if (XML_ELEMENT_NODE == curr_node->type) { if (strcmp((const char*) curr_node->name, "doc") == 0) { /* skip doc/doc elements to be processed later */ child_docs_found++; } else { solr_encode_xml_node(curr_node, &inner_buffer, SOLR_ENCODE_OBJECT_PROPERTY, 0L, parse_mode); } } curr_node = curr_node->next; } if (child_docs_found > 0){ solr_encode_document_children(node, &inner_buffer, child_docs_found, parse_mode); /** * write and calculate proper object opener * because the object number of properties depends on whether there are child documents involved */ solr_write_object_opener_child_doc(node, child_docs_found, buffer, enc_type, array_index); } else { solr_write_object_opener(node, buffer, enc_type, array_index); } solr_string_appends_ex(buffer, inner_buffer.str, inner_buffer.len); solr_write_object_closer(buffer); solr_string_free_ex(&inner_buffer); } /* }}} */ /** * Handles simple data types like strings, integers, booleans etc. */ /* {{{ static void solr_encode_document_field_simple(const xmlNode *fieldNode, xmlNode *field) */ static void solr_encode_document_field_simple(const xmlNode *fieldNode, xmlNode *field) { xmlChar *fieldname = solr_xml_get_node_contents(fieldNode->properties); xmlChar *field_value = xmlEncodeEntitiesReentrant(fieldNode->doc, solr_xml_get_node_contents(fieldNode)); xmlNewChild(field, NULL, (xmlChar *) "field_value", field_value); xmlNewProp(field, (xmlChar *) "name", fieldname); xmlFree(field_value); } /* }}} */ /* Handles complex data types like arrays */ /* {{{ static void solr_encode_document_field_complex(const xmlNode *fieldNode, xmlNode *field) */ static void solr_encode_document_field_complex(const xmlNode *fieldNode, xmlNode *field) { xmlChar *fieldname = solr_xml_get_node_contents(fieldNode->properties); xmlNode *current_value = fieldNode->children; while(current_value != NULL) { if (current_value->type == XML_ELEMENT_NODE) { xmlChar *field_value = xmlEncodeEntitiesReentrant(fieldNode->doc, solr_xml_get_node_contents(current_value)); xmlNewChild(field, NULL, (xmlChar *) "field_value", field_value); xmlFree(field_value); } current_value = current_value->next; } xmlNewProp(field, (xmlChar *) "name", fieldname); } /* }}} */ /* {{{ static void solr_encode_result(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_result(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { xmlAttr *properties = node->properties; solr_char_t *object_name = (solr_char_t *) node->name; solr_char_t *num_found = NULL; solr_char_t *start = NULL; solr_char_t *max_score = NULL; solr_php_encode_func_t document_encoder_functions[] = { solr_encode_document, solr_encode_solr_document, NULL }; xmlAttr *curr_prop = properties; xmlXPathContext *xpathctxt = NULL; const xmlChar *xpath_expression = (xmlChar *) "child::doc"; xmlXPathObject *xpathObj = NULL; xmlNodeSet *result = NULL; long int document_count = 0; while(curr_prop != NULL) { if (solr_xml_match_node(curr_prop, "numFound")) { num_found = (solr_char_t *) solr_xml_get_node_contents(curr_prop); } if (solr_xml_match_node(curr_prop, "start")) { start = (solr_char_t *) solr_xml_get_node_contents(curr_prop); } if (solr_xml_match_node(curr_prop, "name")) { object_name = (solr_char_t *) solr_xml_get_node_contents(curr_prop); } if (solr_xml_match_node(curr_prop, "maxScore")) { max_score = (solr_char_t *) solr_xml_get_node_contents(curr_prop); } curr_prop = curr_prop->next; } xpathctxt = xmlXPathNewContext(node->doc); xpathctxt->node = (xmlNodePtr) node; xpathObj = xmlXPathEval(xpath_expression, xpathctxt); result = xpathObj->nodesetval; document_count = result->nodeNr; solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, strlen(object_name)); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, object_name, strlen(object_name)); solr_string_append_const(buffer, "\";"); solr_string_append_const(buffer, "O:10:\"SolrObject\":"); if (max_score) { solr_string_append_long(buffer, 4); /* numFound, start, docs, maxScore properties */ } else { solr_string_append_long(buffer, 3); /* numFound, start, docs properties */ } solr_string_append_const(buffer, ":{"); /* Object Opener for response */ /* Writing the numFound property */ solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, sizeof("numFound")-1); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, "numFound", sizeof("numFound")-1); solr_string_append_const(buffer, "\";"); solr_string_append_const(buffer, "i:"); solr_string_appends(buffer, num_found, solr_strlen(num_found)); solr_string_appendc(buffer, ';'); /* Writing the start property */ solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, sizeof("start")-1); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, "start", sizeof("start")-1); solr_string_append_const(buffer, "\";"); solr_string_append_const(buffer, "i:"); solr_string_appends(buffer, start, solr_strlen(start)); solr_string_appendc(buffer, ';'); /* writing max score property */ if (max_score) { solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, sizeof("maxScore")-1); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, "maxScore", sizeof("maxScore")-1); solr_string_append_const(buffer, "\";"); solr_string_append_const(buffer, "d:"); solr_string_appends(buffer, max_score, solr_strlen(max_score)); solr_string_appendc(buffer, ';'); } /* Writing the docs property */ solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, sizeof("docs")-1); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, "docs", sizeof("docs")-1); solr_string_append_const(buffer, "\";"); if (document_count) { /* Grab all the first /response/result/doc node */ xmlNode *curr_doc = node->children; long int curr_doc_index = 0L; /* Array opener */ solr_string_append_const(buffer, "a:"); solr_string_append_long(buffer, document_count); solr_string_append_const(buffer, ":{"); while(curr_doc != NULL) { /* Absolutely no assumptions. At least for now. */ if (XML_ELEMENT_NODE == curr_doc->type && solr_xml_match_node(curr_doc, "doc")) { /* This is where you decided whether to use SolrDocument or StdClass */ /* parse_mode value of 0 creates SolrObject; 1 creates SolrDocument */ document_encoder_functions[parse_mode](curr_doc, buffer, SOLR_ENCODE_ARRAY_INDEX, curr_doc_index, parse_mode); curr_doc_index++; } curr_doc = curr_doc->next; } solr_write_array_closer(buffer); /* Array closer */ } else { solr_string_append_const(buffer, "b:0;"); /* This means there are no docs */ } solr_write_object_closer(buffer); /* Object closer */ xmlXPathFreeContext(xpathctxt); xmlXPathFreeObject(xpathObj); } /* }}} */ /* {{{ static void solr_encode_null(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_null(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { /* SolrObject should not contain nulls because of how magic functionality is implemented */ solr_write_variable_opener(node, buffer, enc_type, array_index); /* Setting nulls to boolean false */ solr_string_append_const(buffer, "b:0;"); } /* }}} */ /* {{{ static void solr_encode_bool(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_bool(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { solr_char_t *data_value = (solr_char_t *) solr_xml_get_node_contents(node); long int boolean_value = (!strcmp("true", data_value))? 1 : 0; solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "b:"); solr_string_append_long(buffer, boolean_value); solr_string_appendc(buffer, ';'); } /* }}} */ /* {{{ static void solr_encode_int(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_int(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { solr_char_t *data_value = (solr_char_t *) solr_xml_get_node_contents(node); size_t data_value_len = solr_strlen(data_value); solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "i:"); solr_string_appends(buffer, data_value, data_value_len); solr_string_appendc(buffer, ';'); } /* }}} */ /* {{{ static void solr_encode_float(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_float(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { solr_char_t *data_value = (solr_char_t *) solr_xml_get_node_contents(node); size_t data_value_len = solr_strlen(data_value); solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "d:"); if (strcmp(data_value, "NaN" ) == 0) { data_value = (solr_char_t *)"NAN"; } solr_string_appends(buffer, data_value, data_value_len); solr_string_appendc(buffer, ';'); } /* }}} */ /* {{{ static void solr_encode_string(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_string(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { solr_char_t *data_value = (solr_char_t *) solr_xml_get_node_contents(node); size_t data_value_len = solr_strlen(data_value); solr_write_variable_opener(node, buffer, enc_type, array_index); solr_string_append_const(buffer, "s:"); solr_string_append_long(buffer, data_value_len); solr_string_append_const(buffer, ":\""); solr_string_appends(buffer, data_value, data_value_len); solr_string_append_const(buffer, "\";"); } /* }}} */ /* {{{ static void solr_encode_array(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_array(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { xmlNode *curr_node = NULL; long int current_index = 0L; solr_write_array_opener(node, buffer, enc_type, array_index); curr_node = node->children; while(curr_node != NULL) { if (XML_ELEMENT_NODE == curr_node->type) { solr_encode_xml_node(curr_node, buffer, SOLR_ENCODE_ARRAY_INDEX, current_index, parse_mode); current_index++; } curr_node = curr_node->next; } solr_write_array_closer(buffer); } /* }}} */ /* {{{ static void solr_encode_object(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) */ static void solr_encode_object(const xmlNode *node, solr_string_t *buffer, solr_encoding_type_t enc_type, long int array_index, long int parse_mode) { xmlNode *curr_node = NULL; solr_write_object_opener(node, buffer, enc_type, array_index); curr_node = node->children; while(curr_node != NULL) { if (XML_ELEMENT_NODE == curr_node->type) { solr_encode_xml_node(curr_node, buffer, SOLR_ENCODE_OBJECT_PROPERTY, 0L, parse_mode); } curr_node = curr_node->next; } solr_write_object_closer(buffer); } /* }}} */ /** * Used to digest Xml response messages from Solr * */ /* {{{ PHP_SOLR_API void solr_encode_generic_xml_response(solr_string_t *buffer, const solr_char_t *serialized, size_t size, long int parse_mode) */ PHP_SOLR_API void solr_encode_generic_xml_response(solr_string_t *buffer, const solr_char_t *serialized, size_t size, long int parse_mode) { xmlDoc *doc = xmlReadMemory(serialized, size, NULL, "UTF-8", XML_PARSE_RECOVER); xmlNode *root = NULL; if (!doc) { php_error_docref(NULL, E_WARNING, "Error loading XML document"); return; } root = xmlDocGetRootElement(doc); if (!root) { xmlFreeDoc(doc); php_error_docref(NULL, E_WARNING, "Error loading root of XML document"); return; } parse_mode = ((parse_mode < 0L) ? 0L : ((parse_mode > 1L) ? 1L : parse_mode)); solr_encode_object(root, buffer, SOLR_ENCODE_STANDALONE, 0L, parse_mode); if (buffer->len == 0) { php_error_docref(NULL, E_WARNING, "Error parsing XML document"); } xmlFreeDoc(doc); } /* }}} */ /* {{{ PHP_SOLR_API int solr_is_supported_response_writer(const solr_char_t * response_writer, size_t length) */ PHP_SOLR_API int solr_is_supported_response_writer(const solr_char_t * response_writer, size_t length) { if (length < 1) { return 0; } if (0 == strcmp(response_writer, SOLR_PHP_SERIALIZED_RESPONSE_WRITER)) { return 1; } if (0 == strcmp(response_writer, SOLR_XML_RESPONSE_WRITER)) { return 1; } if (0 == strcmp(response_writer, SOLR_JSON_RESPONSE_WRITER)) { return 1; } return 0; } /* }}} */ /* {{{ PHP_SOLR_API solr_char_t *solr_get_json_error_msg(solr_json_error_codes_t error_code) */ PHP_SOLR_API solr_char_t *solr_get_json_error_msg(solr_json_error_codes_t error_code) { switch(error_code) { case SOLR_JSON_ERROR_DEPTH: return "JSON maximum recursion depth was exceeded"; break; case SOLR_JSON_ERROR_STATE_MISMATCH: return "JSON error state mismatch"; break; case SOLR_JSON_ERROR_CTRL_CHAR: return "JSON control character was encountered"; break; case SOLR_JSON_ERROR_SYNTAX: return "JSON syntax error"; break; case SOLR_JSON_ERROR_UTF8: return "JSON UTF8 error"; break; default : return "JSON unknown error"; break; } } /* }}} */ /* {{{ PHP_SOLR_API int solr_json_to_php_native(solr_string_t *buffer, const solr_char_t *json_string, size_t json_string_length) */ PHP_SOLR_API int solr_json_to_php_native(solr_string_t *buffer, const solr_char_t *json_string, size_t json_string_length) { /* todo php7 review if we ever need that indirection with ret_val */ /* JSON recursion depth. default is 512 */ long recursion_depth = 1024L; long json_error = 0L; php_serialize_data_t var_hash; smart_str serialize_buffer = {0}; /* return value for the function */ zval json_decode_ret_val, *json_decode_ret_val_ptr; zend_uchar json_decode_ret_val_type = IS_NULL; json_decode_ret_val_ptr = &json_decode_ret_val; php_json_decode(&json_decode_ret_val, (char *) json_string, json_string_length, 1, recursion_depth); json_error = solr_get_json_last_error(); /* Why ? todo investigate */ /* solr_string_set(buffer, "i:99;", sizeof("i:99;")); */ if (json_error > 0) { zval_dtor(&json_decode_ret_val); php_error_docref(NULL, E_WARNING, "JSON error. JSON->PHP serialization error"); return (int) json_error; } memset(&var_hash, 0, sizeof(php_serialize_data_t)); PHP_VAR_SERIALIZE_INIT(var_hash); php_var_serialize(&serialize_buffer, &json_decode_ret_val, &var_hash); json_decode_ret_val_type = Z_TYPE_P(json_decode_ret_val_ptr); zval_dtor(&json_decode_ret_val); solr_string_set(buffer, serialize_buffer.s->val, serialize_buffer.s->len); PHP_VAR_SERIALIZE_DESTROY(var_hash); smart_str_free(&serialize_buffer); /* return value should not be of NULL type. NULL means an error has occurred */ if (json_decode_ret_val_type == IS_NULL) { php_error_docref(NULL, E_WARNING, "JSON error. Error occurred in php_json_decode(). Raw JSON string is \n %s \n", (char *) json_string); /* json_error always fails to detect an error. * todo investigate */ return (int) SOLR_JSON_ERROR_SERIALIZATION; } return (int) json_error; } /* }}} */ PHP_SOLR_API long solr_get_json_last_error(void) { long json_error; zval json_last_error_ret_val, *object_p; zval *json_last_error_params = NULL; zval json_last_error_function_name; ZVAL_STRING(&json_last_error_function_name, "json_last_error"); /* object instance to perform the method call */ object_p = (zval *) NULL; call_user_function(EG(function_table), object_p, &json_last_error_function_name, &json_last_error_ret_val, 0, json_last_error_params); json_error = Z_LVAL(json_last_error_ret_val); zval_dtor(&json_last_error_ret_val); #ifdef PHP_7 zval_dtor(&json_last_error_function_name); #endif return json_error; } static inline int solr_pcre_replace_into_buffer(solr_string_t *buffer, char * search, char *replace) { zend_string *result; int limit = -1; #if PHP_VERSION_ID >= 70300 size_t replace_count = -1; #else int replace_count = -1; #endif zend_string *regex_str = zend_string_init(search, strlen(search), 0); zend_string *subject_str = zend_string_init(buffer->str, buffer->len, 0); #if PHP_VERSION_ID >= 70200 zend_string *replace_str = zend_string_init(replace, strlen(replace), 0); #else zval replace_val; ZVAL_STRING(&replace_val, replace); #endif result = php_pcre_replace( regex_str, subject_str, buffer->str, buffer->len, #if PHP_VERSION_ID >= 70200 replace_str, #else &replace_val, 0, #endif limit, &replace_count ); solr_string_set_ex(buffer, (solr_char_t *)result->val, (size_t)result->len); /* fprintf(stdout, "%s", buffer->str); */ efree(result); #if PHP_VERSION_ID >= 70200 zend_string_release(replace_str); #else zval_ptr_dtor(&replace_val); #endif zend_string_release(regex_str); zend_string_release(subject_str); return SUCCESS; } /* serialized array to serialized object */ PHP_SOLR_API int solr_sarray_to_sobject(solr_string_t *buffer) { return solr_pcre_replace_into_buffer(buffer, "/a\\:([0-9]+):{s/i", "O:10:\"SolrObject\":\\1:{s"); } /* serialized object to serialized array */ PHP_SOLR_API int solr_sobject_to_sarray(solr_string_t *buffer) { return solr_pcre_replace_into_buffer(buffer, "/O:10:\"SolrObject\":([0-9]+):{s/i", "a:\\1:{s"); } /* }}} */ /* todo document and block this */ PHP_SOLR_API int solr_solrfunc_update_string(zval *obj, solr_char_t *key, size_t key_len, solr_char_t *value, size_t value_len) { solr_function_t *function; solr_string_t *string; #ifdef PHP_7 string = pemalloc(sizeof(solr_string_t), SOLR_FUNCTIONS_PERSISTENT); #endif memset(string, 0, sizeof(solr_string_t)); if (solr_fetch_function_entry(obj, &function) == FAILURE) { return FAILURE; } solr_string_set(string, (solr_char_t *)value, value_len); if (zend_hash_str_update_ptr(function->params, key, key_len, (void *)string) == NULL ) { solr_string_free(string); return FAILURE; } return SUCCESS; } PHP_SOLR_API int solr_solrfunc_fetch_string(zval *obj, solr_char_t *key, size_t key_len, solr_string_t **string) { solr_function_t *function; if (solr_fetch_function_entry(obj, &function) == FAILURE) { return FAILURE; } if ((*string = zend_hash_str_find_ptr(function->params, key, key_len)) == NULL) { return FAILURE; } return SUCCESS; } PHP_SOLR_API int solr_solrfunc_display_string(zval *obj, solr_char_t *key, size_t key_len, zval **return_value) { solr_string_t *field_string_ptr = NULL; memset(&field_string_ptr, 0, sizeof(solr_string_t *)); if (solr_solrfunc_fetch_string(obj, key, key_len, &field_string_ptr) == SUCCESS) { ZVAL_STRINGL(*return_value, field_string_ptr->str, field_string_ptr->len); return SUCCESS; } else { php_error_docref(NULL, E_ERROR, "Unable to fetch string"); return FAILURE; } } PHP_SOLR_API void solr_solrfunc_to_string(solr_function_t *function, solr_string_t **dest) { solr_string_t *buffer = *dest; solr_string_appends(buffer, (solr_char_t *)"{!", sizeof("{!")-1); solr_string_appends(buffer, function->name, function->name_length); solr_string_appendc(buffer, ' '); solr_string_t *value; zend_string *key; zend_ulong num_idx; ZEND_HASH_FOREACH_KEY_PTR(function->params, num_idx, key, value) { (void)num_idx; /* silent -Wunused-but-set-variable */ /* key is only maintained internally */ if (key) { solr_string_appends(buffer, key->val, key->len-1); } solr_string_appendc(buffer, '='); if (strpbrk(value->str, " ") != NULL && strpbrk(value->str,"'") == NULL) { solr_string_appendc(buffer, '\''); solr_string_append_solr_string (buffer, value); solr_string_appendc(buffer, '\''); } else { solr_string_append_solr_string (buffer, value); } solr_string_appendc(buffer, ' '); } ZEND_HASH_FOREACH_END(); solr_string_remove_last_char(buffer); solr_string_appendc(buffer, '}'); /* todo handle localParams argument */ } PHP_SOLR_API void solr_destroy_ustream_ex(solr_ustream_t *stream) { if (stream->content_info->filename.len > 0) { solr_string_free(&stream->content_info->filename); } pefree(stream->content_info, 0); pefree(stream, 0); } PHP_SOLR_API void solr_destroy_ustream_zv(zval *obj) { solr_ustream_t *entry = Z_PTR_P(obj); solr_destroy_ustream_ex(entry); } PHP_SOLR_API int solr_fetch_ustream_entry(zval *objptr, solr_ustream_t **stream_entry) { zval rv, *index_zv; zend_ulong index = 0; index_zv = zend_read_property(Z_OBJCE_P(objptr), OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME)-1, 1, &rv); index = Z_LVAL_P(index_zv); if ((*stream_entry = zend_hash_index_find_ptr(SOLR_GLOBAL(ustreams), index)) == NULL) { php_error_docref(NULL, E_WARNING, "Invalid Update Stream Index %ld. HashTable index does not exist.", index); php_error_docref(NULL, E_WARNING, SOLR_ERROR_1008_MSG, SOLR_FILE_LINE_FUNC); return FAILURE; } return SUCCESS; } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_params.c0000644000175000017500000013142515001737315017002 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" PHP_SOLR_API int solr_init_params(solr_params_t *solr_params, long int index) { uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; solr_params = (solr_params_t *)pemalloc( sizeof(solr_params_t), SOLR_PARAMS_PERSISTENT); memset(solr_params, 0, sizeof(solr_params_t)); if ((solr_params = zend_hash_index_update_ptr(SOLR_GLOBAL(params), index, (void *) solr_params)) == NULL) { php_error_docref(NULL, E_ERROR, "Error while registering query parameters in HashTable"); return FAILURE; } solr_params->params_index = index; solr_params->params_count = 0U; /* Allocated memory for the parameters HashTable using fast cache for HashTables */ ALLOC_HASHTABLE(solr_params->params); zend_hash_init(solr_params->params, nSize, NULL, (dtor_func_t) solr_destory_param_ht_dtor, SOLR_PARAMS_PERSISTENT); return SUCCESS; } /* {{{ PHP_SOLR_API void solr_destroy_params(zval *solr_params) */ PHP_SOLR_API void solr_destroy_params(zval *solr_params) { solr_params_t *params = (solr_params_t *) Z_PTR_P(solr_params); zend_hash_destroy(params->params); pefree(params->params, SOLR_PARAMS_PERSISTENT); pefree(params, SOLR_PARAMS_PERSISTENT); } /* }}} */ /* {{{ PHP_SOLR_API void solr_destroy_param(solr_param_t **param) */ PHP_SOLR_API void solr_destroy_param(solr_param_t **param) { solr_param_value_t *temp_ptr = NULL; solr_param_value_t *current_ptr = (*param)->head; while(current_ptr != NULL) { temp_ptr = current_ptr->next; (*param)->value_free_func(current_ptr); current_ptr = temp_ptr; } (*param)->head = NULL; (*param)->last = NULL; pefree((*param)->param_name, SOLR_PARAMS_PERSISTENT); (*param)->param_name = NULL; pefree((*param), SOLR_PARAMS_PERSISTENT); (*param) = NULL; } /* }}} */ PHP_SOLR_API void solr_destory_param_ht_dtor(zval *param_zv) { solr_param_t *param = (solr_param_t *) Z_PTR_P(param_zv); solr_destroy_param(¶m); } /* {{{ PHP_SOLR_API int solr_params_delete_param_value(solr_param_t *param, const solr_param_value_t *target_value) */ PHP_SOLR_API int solr_params_delete_param_value(solr_param_t *param, const solr_param_value_t *target_value) { solr_param_value_t *curr_value = param->head; int match_found = 0; if (!target_value) { php_error_docref(NULL, E_NOTICE, "Invalid pointer. Submitted target cannot be used for the delete search\n"); return FAILURE; } while(!match_found && curr_value != NULL) { match_found = param->value_equal_func(curr_value, target_value); /* If the target was found */ if (match_found) { /* If the target is not the head */ if (curr_value->prev) { curr_value->prev->next = curr_value->next; } else { param->head = curr_value->next; } /* If the target is not the tail */ if (curr_value->next) { curr_value->next->prev = curr_value->prev; } else { param->last = curr_value->prev; } /* Destroy target value */ param->value_free_func(curr_value); goto dpv_end; } curr_value = curr_value->next; } dpv_end : if (!match_found) { php_error_docref(NULL, E_NOTICE, "Target parameter value could not be found in '%s'. No value was deleted ", param->param_name); return FAILURE; } param->count--; /* Reduce the value count by one */ return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_params_insert_param_value(solr_param_t *param, solr_param_value_t *param_value) */ PHP_SOLR_API int solr_params_insert_param_value(solr_param_t *param, solr_param_value_t *param_value) { if (!param_value) { return FAILURE; } param_value->next = param_value->prev = NULL; if (!param->allow_multiple) { param->value_free_func(param->head); param->head = param_value; param->last = param_value; param->count = 1U; return SUCCESS; } if (param->head == NULL) { param->head = param_value; param->last = param_value; } else { param_value->prev = param->last; param->last->next = param_value; param->last = param_value; } param->count++; return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API solr_param_t *solr_create_new_param(const solr_char_t *param_name, size_t param_name_len, solr_param_type_t param_type, solr_bool allow_multiple, solr_param_value_equal_func_t value_equal_func, solr_param_fetch_func_t param_fetch_func, solr_param_value_free_func_t value_free_func, solr_char_t delimiter, solr_char_t arg_separator) */ PHP_SOLR_API solr_param_t *solr_create_new_param(const solr_char_t *param_name, size_t param_name_len, solr_param_type_t param_type, solr_bool allow_multiple, solr_param_value_equal_func_t value_equal_func, solr_param_fetch_func_t param_fetch_func, solr_param_value_free_func_t value_free_func, solr_char_t delimiter, solr_char_t arg_separator) { solr_param_t *query_param = (solr_param_t *) pemalloc(sizeof(solr_param_t), SOLR_PARAMS_PERSISTENT); /* Always initialize linked list containers to NULL. */ /* Member pointers may contain unallocated addresses */ /* This notice applies to all solr_param_t member pointers here */ memset(query_param, 0, sizeof(solr_param_t)); query_param->type = param_type; query_param->count = 0L; query_param->param_name = solr_strndup(param_name, param_name_len); query_param->param_name_length = param_name_len; query_param->allow_multiple = allow_multiple; query_param->head = query_param->last = NULL; query_param->value_equal_func = value_equal_func; query_param->fetch_func = param_fetch_func; query_param->value_free_func = value_free_func; query_param->delimiter = delimiter; query_param->arg_separator = arg_separator; return query_param; } /* }}} */ /* {{{ PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, zend_bool allow_multiple) parameter value addition functions */ PHP_SOLR_API int solr_add_or_set_normal_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, zend_bool allow_multiple) { solr_params_t *solr_params = NULL; HashTable *params = NULL; solr_param_type_t param_type = SOLR_PARAM_TYPE_NORMAL; solr_param_t *param = NULL; solr_param_value_t *parameter_value = NULL; if (!pname_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter name"); /* php_error_docref(NULL, E_ERROR, "Invalid parameter name"); */ return FAILURE; } if (!pvalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter value"); /* php_error_docref(NULL, E_ERROR, "Invalid parameter value"); */ return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params = solr_params->params; if ((param = zend_hash_str_find_ptr(params, (char *) pname, pname_length)) != NULL) { parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.normal), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); return SUCCESS; } param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, solr_normal_param_value_equal, (solr_param_fetch_func_t) solr_normal_param_value_fetch, solr_normal_param_value_free, '&', 0); parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.normal), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); if (zend_hash_str_add_ptr(params, pname, pname_length, (void *) param) == NULL) { php_error_docref(NULL, E_ERROR, "Error from %s %s=%s", __func__, (char *) pname, pvalue); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) */ PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) { zend_bool allow_multiple = 1; /* This value type by definition allows multiple. add parameters can be added more than once */ solr_params_t *solr_params = NULL; HashTable *params = NULL; solr_param_type_t param_type = SOLR_PARAM_TYPE_SIMPLE_LIST; solr_param_t *param = NULL; solr_param_value_t *parameter_value = NULL; if (!pname_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter value"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params = solr_params->params; if ((param = zend_hash_str_find_ptr(params, pname, pname_length)) != NULL) { parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.simple_list), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); return SUCCESS; } param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, solr_simple_list_param_value_equal, (solr_param_fetch_func_t) solr_simple_list_param_value_fetch, solr_simple_list_param_value_free, ',', 0); parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.simple_list), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); if (zend_hash_str_add_ptr(params, pname, pname_length, (void *) param) == NULL) { php_error_docref(NULL, E_ERROR, "Error from %s %s=%s", __func__, (char *) pname, pvalue); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_add_simple_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) */ PHP_SOLR_API int solr_add_simple_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length,solr_char_t *separator) { zend_bool allow_multiple = 1; /* This value type by definition allows multiple. add parameters can be added more than once */ solr_params_t *solr_params = NULL; HashTable *params = NULL; solr_param_type_t param_type = SOLR_PARAM_TYPE_SIMPLE_LIST; solr_param_t *param = NULL; solr_param_value_t *parameter_value = NULL; if (!pname_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter value"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params = solr_params->params; if ((param = zend_hash_str_find_ptr(params, pname, pname_length)) != NULL) { parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.simple_list), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); return SUCCESS; } param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, solr_simple_list_param_value_equal, (solr_param_fetch_func_t) solr_simple_list_param_value_fetch, solr_simple_list_param_value_free, *separator, 0); parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.simple_list), pvalue, pvalue_length); solr_params_insert_param_value(param, parameter_value); if (zend_hash_str_add_ptr(params, pname, pname_length, (void *) param) == NULL) { php_error_docref(NULL, E_ERROR, "Error from %s %s=%s", __func__, (char *) pname, pvalue); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator) */ PHP_SOLR_API int solr_add_arg_list_param(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator) { zend_bool allow_multiple = 1; /* This value type by definition allows multiple */ solr_params_t *solr_params = NULL; solr_param_type_t param_type = SOLR_PARAM_TYPE_ARG_LIST; solr_param_t *param = NULL; /* holds a pointer to the param structure e.g. sort */ solr_param_value_t *parameter_value = NULL; HashTable *params = NULL; if (!pname_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter value"); return FAILURE; } /* if (!avalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid argument value"); return FAILURE; } */ if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params = solr_params->params; /* if parameter exists add the new value argument(param_value) */ if ((param = zend_hash_str_find_ptr(params, pname, pname_length)) != NULL) { parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, "", 0); solr_params_insert_param_value(param, parameter_value); return SUCCESS; } param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, solr_arg_list_param_value_equal, (solr_param_fetch_func_t) solr_arg_list_param_value_fetch, solr_arg_list_param_value_free, delimiter, arg_separator); parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, (solr_char_t*)"", 0); solr_params_insert_param_value(param, parameter_value); if (zend_hash_str_add_ptr(params, pname, pname_length, (void *) param) == NULL) { php_error_docref(NULL, E_ERROR, "Error from %s %s=%s", __func__, (char *) pname, pvalue); return FAILURE; } return SUCCESS; } /* }}} */ PHP_SOLR_API solr_param_value_t* create_parameter_value_arg_list(solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t *delimiter_override, solr_bool delimiter_overriden) { solr_param_value_t *parameter_value = NULL; parameter_value = (solr_param_value_t *) pemalloc(sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); memset(parameter_value, 0, sizeof(solr_param_value_t)); solr_string_appends(&(parameter_value->contents.arg_list.value), pvalue, pvalue_length); solr_string_appends(&(parameter_value->contents.arg_list.arg), avalue, avalue_length); if(delimiter_overriden){ parameter_value->contents.arg_list.delimiter_override = solr_strndup(delimiter_override, sizeof(delimiter_override)); parameter_value->contents.arg_list.delimiter_overriden = delimiter_overriden; } return parameter_value; } PHP_SOLR_API int solr_add_arg_list_param_ex(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length, solr_char_t *avalue, size_t avalue_length, solr_char_t delimiter, solr_char_t arg_separator, solr_char_t delimiter_override) { zend_bool allow_multiple = 1; /* This value type by definition allows multiple */ solr_params_t *solr_params = NULL; solr_param_type_t param_type = SOLR_PARAM_TYPE_ARG_LIST; solr_param_t *param = NULL; /* holds a pointer to the param structure e.g. sort */ solr_param_value_t *parameter_value = NULL; HashTable *params = NULL; if (!pname_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid parameter value"); return FAILURE; } /* * commented for the favor of having empty value if (!avalue_length) { solr_throw_exception_ex(solr_ce_SolrIllegalArgumentException, SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC, "Invalid argument value"); return FAILURE; } */ if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params = solr_params->params; /* if parameter exists add the new value argument(param_value) */ if ((param = zend_hash_str_find_ptr(params, pname, pname_length)) != NULL) { parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, &delimiter_override, 1); solr_params_insert_param_value(param, parameter_value); return SUCCESS; } param = solr_create_new_param(pname, pname_length, param_type, allow_multiple, solr_arg_list_param_value_equal, (solr_param_fetch_func_t) solr_arg_list_param_value_fetch, solr_arg_list_param_value_free, delimiter, arg_separator); parameter_value = create_parameter_value_arg_list(pvalue, pvalue_length, avalue, avalue_length, &delimiter_override, 1); solr_params_insert_param_value(param, parameter_value); if (zend_hash_str_add_ptr(params, pname, pname_length, (void *) param) == NULL) { php_error_docref(NULL, E_ERROR, "Error from %s %s=%s", __func__, (char *) pname, pvalue); return FAILURE; } return SUCCESS; } /* {{{ Parameter value EQUALITY FUNCTIONS */ /* {{{ PHP_SOLR_API int solr_normal_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) */ PHP_SOLR_API int solr_normal_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) { return solr_string_equal(&(a->contents.normal), &(b->contents.normal)); } /* }}} */ /* {{{ PHP_SOLR_API int solr_simple_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) */ PHP_SOLR_API int solr_simple_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) { return solr_string_equal(&(a->contents.simple_list), &(b->contents.simple_list)); } /* }}} */ /* {{{ PHP_SOLR_API int solr_arg_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) */ PHP_SOLR_API int solr_arg_list_param_value_equal(const solr_param_value_t *a, const solr_param_value_t *b) { return solr_string_equal(&(a->contents.arg_list.value), &(b->contents.arg_list.value)); } /* }}} */ /* }}} */ /* {{{ Parameter values retrieval functions */ /* {{{ PHP_SOLR_API void solr_normal_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) */ PHP_SOLR_API void solr_normal_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) { zend_string *url_encoded_param_value; solr_param_value_t *current_ptr = solr_param->head; solr_char_t glue = '&'; if (!solr_param->allow_multiple) { url_encoded_param_value = php_raw_url_encode((char *) current_ptr->contents.normal.str, current_ptr->contents.normal.len); solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_free(url_encoded_param_value); } else { zend_ulong n_loops = solr_param->count - 1; while(n_loops) { url_encoded_param_value = NULL; url_encoded_param_value = php_raw_url_encode(current_ptr->contents.normal.str, current_ptr->contents.normal.len); solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_release(url_encoded_param_value); solr_string_appendc(buffer, glue); n_loops--; current_ptr = current_ptr->next; } url_encoded_param_value = NULL; url_encoded_param_value = php_raw_url_encode(current_ptr->contents.normal.str, current_ptr->contents.normal.len); solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_free(url_encoded_param_value); } } /* }}} */ /* {{{ PHP_SOLR_API void solr_simple_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) */ PHP_SOLR_API void solr_simple_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) { solr_param_value_t *current_ptr = solr_param->head; solr_char_t list_delimiter = ','; /* Comma 0x2C */ zend_ulong n_loops = solr_param->count - 1; auto solr_string_t tmp_buffer; zend_string *url_encoded_list = NULL; solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); memset(&tmp_buffer, 0, sizeof(solr_string_t)); while(n_loops) { solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.simple_list)); solr_string_appendc(&tmp_buffer, list_delimiter); n_loops--; current_ptr = current_ptr->next; } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.simple_list)); url_encoded_list = php_raw_url_encode(tmp_buffer.str, tmp_buffer.len); solr_string_appends(buffer, url_encoded_list->val, url_encoded_list->len); zend_string_release(url_encoded_list); url_encoded_list = NULL; solr_string_free(&tmp_buffer); } /* }}} */ /* {{{ PHP_SOLR_API void solr_arg_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) */ PHP_SOLR_API void solr_arg_list_param_value_fetch(solr_param_t *solr_param, solr_string_t *buffer) { solr_param_value_t *current_ptr = solr_param->head; solr_char_t list_delimiter = solr_param->delimiter; solr_char_t separator = solr_param->arg_separator; zend_ulong n_loops = solr_param->count - 1; solr_string_t tmp_buffer; zend_string *url_encoded_list = NULL; solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); memset(&tmp_buffer, 0, sizeof(solr_string_t)); while(n_loops) { solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.value)); if (current_ptr->contents.arg_list.delimiter_override && *current_ptr->contents.arg_list.delimiter_override) { solr_string_appendc(&tmp_buffer, *current_ptr->contents.arg_list.delimiter_override); } else { solr_string_appendc(&tmp_buffer, separator); } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg)); solr_string_appendc(&tmp_buffer, list_delimiter); n_loops--; current_ptr = current_ptr->next; } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.value)); if (current_ptr->contents.arg_list.delimiter_override && *current_ptr->contents.arg_list.delimiter_override) { solr_string_appendc(&tmp_buffer, *current_ptr->contents.arg_list.delimiter_override); } else { solr_string_appendc(&tmp_buffer, separator); } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg)); url_encoded_list = php_raw_url_encode(tmp_buffer.str, tmp_buffer.len); solr_string_appends(buffer, url_encoded_list->val, url_encoded_list->len); zend_string_release(url_encoded_list); url_encoded_list = NULL; solr_string_free(&tmp_buffer); } /* }}} */ /* }}} */ /* {{{ Parameter retrieval functions. Only used for display. */ /* {{{ PHP_SOLR_API void solr_normal_param_value_display_string(solr_param_t *solr_param, zval *param_value) */ PHP_SOLR_API void solr_normal_param_value_display_string(solr_param_t *solr_param, zval *param_value) { solr_param_value_t *current_ptr = solr_param->head; ZVAL_STRINGL(param_value, current_ptr->contents.normal.str, current_ptr->contents.normal.len); } /* }}} */ /* {{{ PHP_SOLR_API void solr_normal_param_value_display_integer(solr_param_t *solr_param, zval *param_value) */ PHP_SOLR_API void solr_normal_param_value_display_integer(solr_param_t *solr_param, zval *param_value) { solr_param_value_t *current_ptr = solr_param->head; long int return_value = atol(current_ptr->contents.normal.str); ZVAL_LONG(param_value, return_value); } /* }}} */ /* {{{ PHP_SOLR_API void solr_normal_param_value_display_double(solr_param_t *solr_param, zval *param_value) */ PHP_SOLR_API void solr_normal_param_value_display_double(solr_param_t *solr_param, zval *param_value) { solr_param_value_t *current_ptr = solr_param->head; double return_value = zend_strtod(current_ptr->contents.normal.str, (const char **) NULL); ZVAL_DOUBLE(param_value, return_value); } /* }}} */ /* Checks if current_ptr->contents.normal.str matches str_const */ #define solr_npvdb_strcmp(str_const) (0 == strcmp(str_const, current_ptr->contents.normal.str)) /* {{{ PHP_SOLR_API void solr_normal_param_value_display_boolean(solr_param_t *solr_param, zval *param_value) */ PHP_SOLR_API void solr_normal_param_value_display_boolean(solr_param_t *solr_param, zval *param_value) { solr_param_value_t *current_ptr = solr_param->head; zend_bool return_value = (zend_bool) (solr_npvdb_strcmp("true") || solr_npvdb_strcmp("on") ); ZVAL_BOOL(param_value, return_value); } /* }}} */ /* {{{ PHP_SOLR_API void solr_normal_param_value_display_sort_type(solr_param_t *solr_param, zval *param_value) */ PHP_SOLR_API void solr_normal_param_value_display_sort_type(solr_param_t *solr_param, zval *param_value) { solr_param_value_t *current_ptr = solr_param->head; long int return_value = (long int) (solr_npvdb_strcmp("count")); ZVAL_LONG(param_value, return_value); } /* }}} */ /* {{{ PHP_SOLR_API void solr_normal_param_value_display(solr_param_t *solr_param, zval *param_value_array) */ PHP_SOLR_API void solr_normal_param_value_display(solr_param_t *solr_param, zval *param_value_array) { solr_param_value_t *current_ptr = solr_param->head; while (current_ptr != NULL) { add_next_index_stringl(param_value_array, current_ptr->contents.normal.str, current_ptr->contents.normal.len); current_ptr = current_ptr->next; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_simple_list_param_value_display(solr_param_t *solr_param, zval *param_value_array) */ PHP_SOLR_API void solr_simple_list_param_value_display(solr_param_t *solr_param, zval *param_value_array) { solr_param_value_t *current_ptr = solr_param->head; while (current_ptr != NULL) { add_next_index_stringl(param_value_array, current_ptr->contents.simple_list.str, current_ptr->contents.simple_list.len); current_ptr = current_ptr->next; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_arg_list_param_value_display(solr_param_t *solr_param, zval *param_value_array) */ PHP_SOLR_API void solr_arg_list_param_value_display(solr_param_t *solr_param, zval *param_value_array) { solr_param_value_t *current_ptr = solr_param->head; while (current_ptr != NULL) { solr_string_t tmp_buffer; memset(&tmp_buffer, 0, sizeof(solr_string_t)); solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.value)); solr_string_appendc(&tmp_buffer, solr_param->arg_separator); solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg)); add_next_index_stringl(param_value_array, tmp_buffer.str, tmp_buffer.len); solr_string_free(&tmp_buffer); current_ptr = current_ptr->next; } } /* }}} */ /* }}} */ /* {{{ Parameter retrieval functions. Only used for toString() */ /* {{{ PHP_SOLR_API void solr_normal_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) */ PHP_SOLR_API void solr_normal_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) { solr_param_value_t *current_ptr = solr_param->head; solr_char_t glue = '&'; if (!solr_param->allow_multiple) { zend_string *url_encoded_param_value = NULL; if (url_encode) { url_encoded_param_value = php_raw_url_encode((char *) current_ptr->contents.normal.str, current_ptr->contents.normal.len); } else { url_encoded_param_value = zend_string_init(current_ptr->contents.normal.str, current_ptr->contents.normal.len, 0); } solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_release(url_encoded_param_value); } else { zend_ulong n_loops = solr_param->count - 1; zend_string *url_encoded_param_value = NULL; while(n_loops) { if (url_encode) { url_encoded_param_value = php_raw_url_encode(current_ptr->contents.normal.str, current_ptr->contents.normal.len); } else { url_encoded_param_value = zend_string_init(current_ptr->contents.normal.str, current_ptr->contents.normal.len, 0); } solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_free(url_encoded_param_value); url_encoded_param_value = NULL; solr_string_appendc(buffer, glue); n_loops--; current_ptr = current_ptr->next; } if (url_encode) { url_encoded_param_value = php_raw_url_encode(current_ptr->contents.normal.str, current_ptr->contents.normal.len); } else { url_encoded_param_value = zend_string_init(current_ptr->contents.normal.str, current_ptr->contents.normal.len, 0); } solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); solr_string_appends(buffer, url_encoded_param_value->val, url_encoded_param_value->len); zend_string_free(url_encoded_param_value); url_encoded_param_value = NULL; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_simple_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) */ PHP_SOLR_API void solr_simple_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) { solr_param_value_t *current_ptr = solr_param->head; solr_char_t list_delimiter = solr_param->delimiter; /* Comma 0x2C */ zend_ulong n_loops = solr_param->count - 1; auto solr_string_t tmp_buffer; zend_string *url_encoded_list = NULL; solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); memset(&tmp_buffer, 0, sizeof(solr_string_t)); while(n_loops) { solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.simple_list)); solr_string_appendc(&tmp_buffer, list_delimiter); n_loops--; current_ptr = current_ptr->next; } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.simple_list)); if (url_encode) { url_encoded_list = php_raw_url_encode(tmp_buffer.str, tmp_buffer.len); } else { url_encoded_list = zend_string_init(tmp_buffer.str, tmp_buffer.len, 0); } solr_string_appends(buffer, url_encoded_list->val, url_encoded_list->len); zend_string_free(url_encoded_list); url_encoded_list = NULL; solr_string_free(&tmp_buffer); } /* }}} */ /* {{{ PHP_SOLR_API void solr_arg_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) */ PHP_SOLR_API void solr_arg_list_param_value_tostring(solr_param_t *solr_param, solr_string_t *buffer, zend_bool url_encode) { solr_param_value_t *current_ptr = solr_param->head; solr_char_t list_delimiter = solr_param->delimiter; solr_char_t separator = solr_param->arg_separator; zend_ulong n_loops = solr_param->count - 1; solr_string_t tmp_buffer; zend_string *url_encoded_list = NULL; solr_string_appends(buffer, solr_param->param_name, solr_param->param_name_length); solr_string_appendc(buffer, '='); memset(&tmp_buffer, 0, sizeof(solr_string_t)); while(n_loops) { solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.value)); if(current_ptr->contents.arg_list.delimiter_overriden) { if(strlen(current_ptr->contents.arg_list.delimiter_override) > 0) { solr_string_appendc(&tmp_buffer, (*current_ptr->contents.arg_list.delimiter_override)); } }else{ solr_string_appendc(&tmp_buffer, separator); } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg)); solr_string_appendc(&tmp_buffer, list_delimiter); n_loops--; current_ptr = current_ptr->next; } /* process last parameter value */ solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.value)); /* check for separator override */ if(current_ptr->contents.arg_list.delimiter_overriden) { if(strlen(current_ptr->contents.arg_list.delimiter_override) > 0) { solr_string_appendc(&tmp_buffer, (*current_ptr->contents.arg_list.delimiter_override)); } }else{ solr_string_appendc(&tmp_buffer, separator); } solr_string_append_solr_string(&tmp_buffer, &(current_ptr->contents.arg_list.arg)); if (url_encode) { url_encoded_list = php_raw_url_encode(tmp_buffer.str, tmp_buffer.len); } else { url_encoded_list = zend_string_init(tmp_buffer.str, tmp_buffer.len, 0); } solr_string_appends(buffer, url_encoded_list->val, url_encoded_list->len); zend_string_free(url_encoded_list); url_encoded_list = NULL; solr_string_free(&tmp_buffer); } /* }}} */ /* }}} */ /* {{{ Memory deallocation functions for parameter values */ /* {{{ PHP_SOLR_API void solr_normal_param_value_free(solr_param_value_t *param_value) */ PHP_SOLR_API void solr_normal_param_value_free(solr_param_value_t *param_value) { if (param_value) { solr_string_free(&(param_value->contents.normal)); pefree(param_value, SOLR_PARAMS_PERSISTENT); param_value = NULL; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_simple_list_param_value_free(solr_param_value_t *param_value) */ PHP_SOLR_API void solr_simple_list_param_value_free(solr_param_value_t *param_value) { if (param_value) { solr_string_free(&(param_value->contents.simple_list)); pefree(param_value, SOLR_PARAMS_PERSISTENT); param_value = NULL; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_arg_list_param_value_free(solr_param_value_t *param_value) */ PHP_SOLR_API void solr_arg_list_param_value_free(solr_param_value_t *param_value) { if (param_value) { solr_string_free(&(param_value->contents.arg_list.value)); solr_string_free(&(param_value->contents.arg_list.arg)); if(param_value->contents.arg_list.delimiter_override != NULL){ efree(param_value->contents.arg_list.delimiter_override); } pefree(param_value, SOLR_PARAMS_PERSISTENT); param_value = NULL; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_set_return_solr_params_object(zval *return_value_ptr, zval *current_objptr) */ PHP_SOLR_API void solr_set_return_solr_params_object(zval *return_value_ptr, zval *current_objptr) { #ifdef PHP_7 ZVAL_COPY(return_value_ptr, current_objptr); #else zval_ptr_dtor(return_value_ptr); ZVAL_MAKE_REF(current_objptr); Z_ADDREF_P(current_objptr); return_value_ptr = current_objptr; #endif } /* }}} */ /* {{{ PHP_SOLR_API int solr_delete_solr_parameter(zval *objptr, solr_char_t *name, size_t name_length) */ PHP_SOLR_API int solr_delete_solr_parameter(zval *objptr, solr_char_t *name, size_t name_length) { solr_params_t *solr_params = NULL; HashTable *params_ht = NULL; if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params_ht = solr_params->params; if (zend_hash_str_del(params_ht, name, name_length) == FAILURE) { php_error_docref(NULL, E_NOTICE, "parameter '%s' was not set. Attempting to remove an undefined parameter.", name); return FAILURE; } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_delete_normal_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) */ PHP_SOLR_API int solr_delete_normal_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) { solr_params_t *solr_params = NULL; HashTable *params_ht = NULL; solr_param_t *param_ptr = NULL; solr_param_value_t *target_value = NULL; if (!pname_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter value"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params_ht = solr_params->params; if ((param_ptr = zend_hash_str_find_ptr(params_ht, pname, pname_length)) == NULL) { php_error_docref(NULL, E_WARNING, "parameter could not be retrieved from HashTable"); return FAILURE; } target_value = (solr_param_value_t *) pecalloc(1, sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); solr_string_appends(&(target_value->contents.normal), pvalue, pvalue_length); solr_params_delete_param_value(param_ptr, target_value); /* We are done with target_value. */ param_ptr->value_free_func(target_value); if (param_ptr->count < 1U) { zend_hash_str_del(params_ht, pname, pname_length); #if SOLR_DEBUG php_error_docref(NULL, E_NOTICE, "Deleted last value from parameter. Removing parameter '%s' from object instance.", pname); #endif } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_delete_simple_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) */ PHP_SOLR_API int solr_delete_simple_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) { solr_params_t *solr_params = NULL; solr_param_t *param_ptr = NULL; HashTable *params_ht = NULL; solr_param_value_t *target_value = NULL; if (!pname_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter value"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params_ht = solr_params->params; if ((param_ptr = zend_hash_str_find_ptr(params_ht, pname, pname_length)) == NULL) { php_error_docref(NULL, E_WARNING, "parameter could not be retrieved from HashTable"); return FAILURE; } target_value = (solr_param_value_t *) pecalloc(1, sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); solr_string_appends(&(target_value->contents.simple_list), pvalue, pvalue_length); solr_params_delete_param_value(param_ptr, target_value); /* We are done with target_value. */ param_ptr->value_free_func(target_value); if (param_ptr->count < 1U) { zend_hash_str_del(params_ht, pname, pname_length); #if SOLR_DEBUG php_error_docref(NULL, E_NOTICE, "Deleted last value from parameter. Removing parameter '%s' from object instance.", pname); #endif } return SUCCESS; } /* }}} */ /* {{{ PHP_SOLR_API int solr_delete_arg_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) */ PHP_SOLR_API int solr_delete_arg_list_param_value(zval *objptr, solr_char_t *pname, size_t pname_length, solr_char_t *pvalue, size_t pvalue_length) { solr_params_t *solr_params = NULL; HashTable *params_ht = NULL; solr_param_t *param_ptr = NULL; solr_param_value_t *target_value = NULL; if (!pname_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter name"); return FAILURE; } if (!pvalue_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter value"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_WARNING, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params_ht = solr_params->params; if ((param_ptr = zend_hash_str_find_ptr(params_ht, pname, pname_length)) == NULL) { php_error_docref(NULL, E_WARNING, "parameter could not be retrieved from HashTable"); return FAILURE; } target_value = (solr_param_value_t *) pecalloc(1, sizeof(solr_param_value_t), SOLR_PARAMS_PERSISTENT); solr_string_appends(&(target_value->contents.arg_list.value), pvalue, pvalue_length); solr_params_delete_param_value(param_ptr, target_value); /* We are done with target_value. */ param_ptr->value_free_func(target_value); if (param_ptr->count < 1U) { zend_hash_str_del(params_ht, pname, pname_length); #if SOLR_DEBUG php_error_docref(NULL, E_NOTICE, "Deleted last value from parameter. Removing parameter '%s' from object instance.", pname); #endif } return SUCCESS; } /* }}} */ /* }}} */ /* {{{ PHP_SOLR_API int solr_param_find(zval *objptr, solr_char_t *pname, size_t pname_length, solr_param_t **solr_param) */ PHP_SOLR_API int solr_param_find(zval *objptr, solr_char_t *pname, size_t pname_length, solr_param_t **solr_param) { solr_params_t *solr_params = NULL; HashTable *params_ht = NULL; solr_param_t *solr_param_tmp = NULL; if (!pname_length) { php_error_docref(NULL, E_ERROR, "Invalid parameter name"); return FAILURE; } if (solr_fetch_params_entry(objptr, &solr_params) == FAILURE) { php_error_docref(NULL, E_ERROR, "SolrParams instance could not be retrieved from HashTable"); return FAILURE; } params_ht = solr_params->params; if ((solr_param_tmp = zend_hash_str_find_ptr(params_ht, pname, pname_length)) == NULL) { return FAILURE; } (*solr_param) = solr_param_tmp; return SUCCESS; } /* }}} */ PHP_SOLR_API solr_string_t solr_params_to_string(solr_params_t * solr_params, zend_bool url_encode) { HashTable *params = solr_params->params; solr_string_t tmp_buffer; memset(&tmp_buffer, 0, sizeof(solr_string_t)); SOLR_HASHTABLE_FOR_LOOP(params) { solr_param_t *solr_param_ptr = NULL; solr_param_tostring_func_t tostring_func = NULL; solr_param_ptr = zend_hash_get_current_data_ptr(params); switch(solr_param_ptr->type) { case SOLR_PARAM_TYPE_NORMAL : tostring_func = solr_normal_param_value_tostring; break; case SOLR_PARAM_TYPE_SIMPLE_LIST : tostring_func = solr_simple_list_param_value_tostring; break; case SOLR_PARAM_TYPE_ARG_LIST : tostring_func = solr_arg_list_param_value_tostring; break; default : php_error_docref(NULL, E_WARNING, "Invalid parameter type"); } tostring_func(solr_param_ptr, &(tmp_buffer), url_encode); solr_string_appendc(&(tmp_buffer), '&'); } if (tmp_buffer.str && tmp_buffer.len) { solr_string_remove_last_char(&(tmp_buffer)); } return tmp_buffer; } /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_functions_response.c0000644000175000017500000000705015001737315017351 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Israel Ekpo | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* Used to set the properties of the SolrResponse instance after a call to the server */ /* {{{ PHP_SOLR_API void solr_set_response_object_properties(zend_class_entry *scope, zval *response_object, const solr_client_t *client, const solr_string_t *request_url, zend_bool success) */ PHP_SOLR_API void solr_set_response_object_properties(zend_class_entry *scope, zval *response_object, const solr_client_t *client, const solr_string_t *request_url, zend_bool success) { const solr_curl_t *handle = &(client->handle); const solr_string_t *raw_request_headers = &(handle->request_header.buffer); const solr_string_t *raw_request = &(handle->request_body_debug.buffer); const solr_string_t *raw_response_headers = &(handle->response_header.buffer); const solr_string_t *raw_response = &(handle->response_body.buffer); const solr_string_t *response_writer = &(client->options.response_writer); long int http_status = handle->response_header.response_code; zend_update_property_long(scope, OBJ_FOR_PROP(response_object), "http_status", sizeof("http_status")-1, http_status); zend_update_property_bool(scope, OBJ_FOR_PROP(response_object), "success", sizeof("success")-1, success); if (response_writer->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "response_writer", sizeof("response_writer")-1, (char *)response_writer->str, response_writer->len); } if (request_url->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "http_request_url", sizeof("http_request_url")-1, (char *)request_url->str, request_url->len); } if (raw_request_headers->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "http_raw_request_headers", sizeof("http_raw_request_headers")-1, (char *)raw_request_headers->str, raw_request_headers->len); } if (raw_request->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "http_raw_request", sizeof("http_raw_request")-1, (char *)raw_request->str, raw_request->len); } if (raw_response_headers->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "http_raw_response_headers", sizeof("http_raw_response_headers")-1, (char *)raw_response_headers->str, raw_response_headers->len); } if (raw_response->str) { zend_update_property_stringl(scope, OBJ_FOR_PROP(response_object), "http_raw_response", sizeof("http_raw_response")-1, (char *)raw_response->str, raw_response->len); } } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: t * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/solr_string.c0000644000175000017500000001613115001737315014731 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Israel Ekpo | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ static inline void solr_string_alloc(solr_string_t *dest, size_t length, size_t *new_length SOLR_MEM_DEBUG_DC) */ static inline void solr_string_alloc(solr_string_t *dest, size_t length, size_t *new_length SOLR_MEM_DEBUG_DC) { /* If buffer is empty */ if (!dest->str) { (*new_length) = length; dest->cap = ((*new_length) < SOLR_STRING_START_SIZE) ? SOLR_STRING_START_SIZE : (length + SOLR_STRING_INCREMENT_SIZE); dest->str = (solr_char_t *) perealloc(dest->str, dest->cap * sizeof(solr_char_t), SOLR_STRING_PERSISTENT); } else { (*new_length) = dest->len + length; /* If the buffer full, get more space */ if ((*new_length) >= dest->cap) { dest->cap = (*new_length) + SOLR_STRING_INCREMENT_SIZE; dest->str = (solr_char_t *) perealloc(dest->str, dest->cap * sizeof(solr_char_t), SOLR_STRING_PERSISTENT); } } #ifdef SOLR_MEM_DEBUG php_printf("solr_string_alloc() [Re]allocated %u bytes at %p in %s(), %s Line %d \n", dest->cap, dest->str SOLR_MEM_DEBUG_CC); #endif } /* }}} */ /* {{{ PHP_SOLR_API void solr_string_appends(solr_string_t *dest, const solr_char_t *src, size_t length SOLR_MEM_DEBUG_DC) */ PHP_SOLR_API void solr_string_appends_ex(solr_string_t *dest, const solr_char_t *src, size_t length SOLR_MEM_DEBUG_DC) { auto size_t __new_length = 0U; /* (Re)allocates memory and increases the capacity if necessary */ solr_string_alloc(dest, length, &__new_length SOLR_MEM_DEBUG_CC); /* Copy the data from the source to the destination */ memcpy(dest->str + dest->len, src, length); /* Reset the length of the solr_string to the new value */ dest->len = __new_length; /* Always make it a null-terminated string */ dest->str[__new_length] = (solr_char_t) 0x00; } /* }}} */ /* {{{ PHP_SOLR_API void solr_string_appendc(solr_string_t *dest, solr_char_t ch SOLR_MEM_DEBUG_DC) */ PHP_SOLR_API void solr_string_appendc_ex(solr_string_t *dest, solr_char_t ch SOLR_MEM_DEBUG_DC) { auto size_t __new_length = 0U; /* (Re)allocates memory and increases the capacity if necessary */ solr_string_alloc(dest, 1, &__new_length SOLR_MEM_DEBUG_CC); dest->str[dest->len] = ch; /* Reset the length of the solr_string to the new value (dest->len + 1) */ dest->len = __new_length; /* Always make it a null-terminated string */ dest->str[__new_length] = (solr_char_t) 0x00; } /* }}} */ /* {{{ PHP_SOLR_API void solr_string_remove_last_char(solr_string_t *dest) */ PHP_SOLR_API void solr_string_remove_last_char(solr_string_t *dest) { if (dest->str && dest->len) { dest->str[dest->len - 1] = (solr_char_t) 0x00; dest->len--; } } /* }}} */ /* {{{ PHP_SOLR_API void solr_string_append_long(solr_string_t *dest, long int long_val) */ PHP_SOLR_API void solr_string_append_long_ex(solr_string_t *dest, long int long_val SOLR_MEM_DEBUG_DC) { auto size_t __new_length = 0U; auto char tmp_buffer[SOLR_STRING_LONG_BUFFER_SIZE]; size_t length = 0; /* Write the formated long to the buffer */ php_sprintf(tmp_buffer, "%ld", long_val); length = strlen(tmp_buffer); /* (Re)allocates memory and increases the capacity if necessary */ solr_string_alloc(dest, length, &__new_length SOLR_MEM_DEBUG_CC); /* Copy the data from the source to the destination */ memcpy(dest->str + dest->len, tmp_buffer, length); /* Reset the length of the solr_string to the new value */ dest->len = __new_length; /* Always make it a null-terminated string */ dest->str[__new_length] = (solr_char_t) 0x00; } /* }}} */ /* {{{ PHP_SOLR_API void solr_string_append_unsigned_long(solr_string_t *dest, unsigned long int long_val) */ PHP_SOLR_API void solr_string_append_unsigned_long_ex(solr_string_t *dest, unsigned long int long_val SOLR_MEM_DEBUG_DC) { auto size_t __new_length = 0U; auto char tmp_buffer[SOLR_STRING_UNSIGNED_LONG_BUFFER_SIZE]; size_t length = 0; /* Write the formated unsigned long to the buffer */ php_sprintf(tmp_buffer, "%lu", long_val); length = strlen(tmp_buffer); /* (Re)allocates memory and increases the capacity if necessary */ solr_string_alloc(dest, length, &__new_length SOLR_MEM_DEBUG_CC); /* Copy the data from the source to the destination */ memcpy(dest->str + dest->len, tmp_buffer, length); /* Reset the length of the solr_string to the new value */ dest->len = __new_length; /* Always make it a null-terminated string */ dest->str[__new_length] = (solr_char_t) 0x00; } /* }}} */ /** * Checks if both strings are equal OR have same exact content. * * Returns 1 if they are equal, 0 if they are different. */ /* {{{ PHP_SOLR_API int solr_string_equal(const solr_string_t *a, const solr_string_t *b) */ PHP_SOLR_API int solr_string_equal(const solr_string_t *a, const solr_string_t *b) { const solr_char_t *str1 = a->str; const solr_char_t *str2 = b->str; if (str1 == str2) return 1; if (str1 == NULL) return 0; if (str2 == NULL) return 0; do { if (*str1++ != *str2) return(0); } while (*str2++); return 1; } /* }}} */ /* Deallocates memory for the buffer */ /* {{{ PHP_SOLR_API void solr_string_free(solr_string_t *dest SOLR_MEM_DEBUG_DC) */ PHP_SOLR_API void solr_string_free_ex(solr_string_t *dest SOLR_MEM_DEBUG_DC) { /* Only attempt this if the buffer is still valid */ if (dest->str) { #ifdef SOLR_MEM_DEBUG php_printf("solr_string_free_ex() Releasing %u bytes at %p in %s(), %s Line %d \n", dest->cap, dest->str SOLR_MEM_DEBUG_CC); #endif pefree(dest->str, SOLR_STRING_PERSISTENT); dest->str = (solr_char_t *) 0x00; dest->cap = dest->len = 0U; } } /* }}} */ PHP_SOLR_API void solr_destory_solr_string_zv(zval *solr_string_zv) { solr_string_t *string = (solr_string_t *) Z_PTR_P(solr_string_zv); solr_string_free_ex(string); pefree(string, SOLR_STRING_PERSISTENT); } /* Update the contents of the dest solr_string */ /* {{{ PHP_SOLR_API void solr_string_set(solr_string_t *dest, const solr_char_t *value, size_t length SOLR_MEM_DEBUG_DC) */ PHP_SOLR_API void solr_string_set_ex(solr_string_t *dest, const solr_char_t *value, size_t length SOLR_MEM_DEBUG_DC) { solr_string_free(dest); solr_string_appends(dest, value, length); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/src/php_solr_dismax_query.c0000644000175000017500000011021115001737315016776 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: | | Israel Ekpo | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* extern function_entry; */ zend_class_entry *solr_ce_SolrDixMaxQuery; ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_zero_arg_info, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addQueryField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, field) ZEND_ARG_INFO(0, boost) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery__construct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0) ZEND_ARG_INFO(0, q) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery__queryAlt_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, q) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_remove_field_arg, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, field) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addPhraseField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(0, field) ZEND_ARG_INFO(0, boost) ZEND_ARG_INFO(0, slop) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addBoostQuery_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2) ZEND_ARG_INFO(0, field) ZEND_ARG_INFO(0, value) ZEND_ARG_INFO(0, boost) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setPhraseSlop_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, slop) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setBoostFunction_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, function) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setMinimumMatch_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setTieBreaker_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, tieBreaker) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setFields_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, fields) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_uf_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, field) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setufs_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1) ZEND_ARG_INFO(0, fields) ZEND_END_ARG_INFO() static zend_function_entry solr_dismax_query_methods[] = { PHP_ME(SolrDisMaxQuery, __construct, SolrDisMaxQuery__construct_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setQueryAlt, SolrDisMaxQuery__queryAlt_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addQueryField, SolrDisMaxQuery_addQueryField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removeQueryField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removePhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setQueryPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setBoostQuery, SolrDisMaxQuery__queryAlt_args , ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addBoostQuery, SolrDisMaxQuery_addBoostQuery_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removeBoostQuery, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setBoostFunction, SolrDisMaxQuery_setBoostFunction_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setMinimumMatch, SolrDisMaxQuery_setMinimumMatch_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setTieBreaker, SolrDisMaxQuery_setTieBreaker_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, useDisMaxQueryParser, SolrDisMaxQuery_zero_arg_info, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, useEDisMaxQueryParser, SolrDisMaxQuery_zero_arg_info, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setBigramPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addBigramPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removeBigramPhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setBigramPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setTrigramPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addTrigramPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removeTrigramPhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setTrigramPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, addUserField, SolrDisMaxQuery_uf_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, removeUserField, SolrDisMaxQuery_uf_args, ZEND_ACC_PUBLIC) PHP_ME(SolrDisMaxQuery, setUserFields, SolrDisMaxQuery_setufs_args, ZEND_ACC_PUBLIC) PHP_FE_END }; void init_solr_dismax_query(void){ zend_class_entry ce; INIT_CLASS_ENTRY(ce, "SolrDisMaxQuery", solr_dismax_query_methods); solr_ce_SolrDixMaxQuery = zend_register_internal_class_ex( &ce, solr_ce_SolrQuery ); } /* {{{ proto SolrQuery::__construct([string q]) Constructor for SolrDisMaxQuery */ PHP_METHOD(SolrDisMaxQuery, __construct) { zval *param_value = NULL; solr_char_t *deftype_param_name = "defType", *deftype_param_value = SOLR_DISMAX_DEFAULT_PARSER; COMPAT_ARG_SIZE_T deftype_param_name_len = strlen("defType"), deftype_param_value_len = strlen(SOLR_DISMAX_DEFAULT_PARSER); if(zend_parse_parameters(ZEND_NUM_ARGS(), "|z", ¶m_value) == FAILURE){ php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } if(param_value == NULL){ zend_call_method_with_0_params(OBJ_FOR_PROP(getThis()), solr_ce_SolrDixMaxQuery, &solr_ce_SolrDixMaxQuery->parent->constructor, "__construct", NULL); }else{ zend_call_method_with_1_params(OBJ_FOR_PROP(getThis()), solr_ce_SolrDixMaxQuery, &solr_ce_SolrDixMaxQuery->parent->constructor, "__construct", NULL, param_value); } solr_add_or_set_normal_param( getThis(), deftype_param_name, deftype_param_name_len, deftype_param_value, deftype_param_value_len, 0 ); } /* }}} */ /* {{{ proto SolrQuery::useDisMaxQueryParser() Switch Query Parser to dismax */ PHP_METHOD(SolrDisMaxQuery, useDisMaxQueryParser) { solr_char_t *param_name = "defType", *param_value = "dismax"; COMPAT_ARG_SIZE_T param_name_len = strlen("defType"), param_value_len = strlen("dismax"), result=1; result = solr_add_or_set_normal_param( getThis(), param_name, param_name_len, param_value, param_value_len, 0 ); if(result != SUCCESS) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrQuery::useDisMaxQueryParser() Switch Query Parser to edismax */ PHP_METHOD(SolrDisMaxQuery, useEDisMaxQueryParser) { solr_char_t *pname = "defType", *param_value = "edismax"; COMPAT_ARG_SIZE_T pname_len = strlen("defType"), param_value_len = strlen("edismax"), result=1; result = solr_add_or_set_normal_param( getThis(), pname, pname_len, param_value, param_value_len, 0 ); if(result != SUCCESS) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrQuery::setQueryAlt(string q) SetQueryAlt uses q.alt if the q param is not defined */ PHP_METHOD(SolrDisMaxQuery, setQueryAlt) { solr_char_t *pname = "q.alt"; COMPAT_ARG_SIZE_T pname_len = sizeof("q.alt")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0, set_param_return = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE){ php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0); if(set_param_return == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrQuery::addQueryField(string field[, bool boost]) SetQueryAlt uses q.alt if the q param is not defined */ PHP_METHOD(SolrDisMaxQuery, addQueryField) { solr_char_t *pname = "qf"; COMPAT_ARG_SIZE_T pname_len = sizeof("qf")-1; solr_char_t *boost_str = NULL; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; int add_result = 0; solr_char_t *delimiter = " "; solr_char_t *separator = "^"; solr_char_t *separator_override=""; zval * boost = NULL; int boost_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &field_name, &field_name_len, &boost) == FAILURE) { php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } if(boost != NULL) { convert_to_string(boost); boost_str = Z_STRVAL_P(boost); boost_len = Z_STRLEN_P(boost); add_result = solr_add_arg_list_param( getThis(), pname, pname_len, field_name, field_name_len, boost_str, boost_len, *delimiter, *separator ); }else{ boost_str = ""; add_result = solr_add_arg_list_param_ex( getThis(), pname, pname_len, field_name, field_name_len, boost_str, boost_len, *delimiter, *separator, *separator_override ); } if(add_result == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field) Removes a sort field from the sort parameter. */ PHP_METHOD(SolrDisMaxQuery, removeQueryField) { solr_char_t *pname = (solr_char_t*) "qf"; COMPAT_ARG_SIZE_T pname_len = sizeof("qf")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value( getThis(), pname, pname_len, field_name, field_name_len ); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addPhraseField(string field, float boost [, float slop]) * Adds a new phrase field */ PHP_METHOD(SolrDisMaxQuery, addPhraseField) { solr_char_t *pname = (solr_char_t*) "pf"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; zval *boost = NULL; zval *slop = NULL; solr_char_t *boost_str = NULL; solr_char_t *slop_str = NULL; int add_result = 0; char * separator = "^"; solr_char_t * delimiter_override = ""; solr_string_t boost_slop_buffer; if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if(boost != NULL) { convert_to_string(boost); boost_str = Z_STRVAL_P(boost); } if (slop != NULL) { convert_to_string(slop); slop_str = Z_STRVAL_P(slop); } if (slop != NULL && boost !=NULL) { delimiter_override = "~"; memset(&boost_slop_buffer, 0, sizeof(solr_string_t)); solr_string_appends(&boost_slop_buffer, (solr_char_t *)slop_str , Z_STRLEN_P(slop)); solr_string_appendc(&boost_slop_buffer, '^'); solr_string_appends(&boost_slop_buffer, boost_str , Z_STRLEN_P(boost)); add_result = solr_add_arg_list_param_ex( getThis(), pname, pname_len, field_name, field_name_len, boost_slop_buffer.str, boost_slop_buffer.len, ' ', *separator, *delimiter_override ); solr_string_free(&boost_slop_buffer); } else { add_result = solr_add_arg_list_param( getThis(), pname, pname_len, field_name, field_name_len, boost_str, Z_STRLEN_P(boost),' ',*separator ); } if(add_result == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field) Removes a phrase field from pf. */ PHP_METHOD(SolrDisMaxQuery, removePhraseField) { solr_char_t *pname = (solr_char_t*) "pf"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value( getThis(), pname, pname_len, field_name, field_name_len ); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrQuery::setPhraseFields(string fields) setPhraseFields uses pf parameter */ PHP_METHOD(SolrDisMaxQuery, setPhraseFields) { solr_char_t *pname = "pf"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setPhraseSlop(integer slop) sets Phrase Slop ps argument. */ PHP_METHOD(SolrDisMaxQuery, setPhraseSlop) { solr_char_t *pname = (solr_char_t*) "ps"; COMPAT_ARG_SIZE_T pname_len = sizeof("ps")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; zval *tmp; if(zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } pvalue = Z_STRVAL_P(tmp); pvalue_len = Z_STRLEN_P(tmp); add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter value"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setQueryPhraseSlop(integer slop) sets QueryPhrase Slop qs argument. */ PHP_METHOD(SolrDisMaxQuery, setQueryPhraseSlop) { solr_char_t *pname = (solr_char_t*) "qs"; COMPAT_ARG_SIZE_T pname_len = sizeof("qs")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; zval *tmp; if(zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } pvalue = Z_STRVAL_P(tmp); pvalue_len = Z_STRLEN_P(tmp); add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter value"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setBoostQuery(string q) sets Boost Query bq parameter. */ PHP_METHOD(SolrDisMaxQuery, setBoostQuery) { solr_char_t *pname = (solr_char_t*) "bq"; COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addBoostQueryField(string field, string value [, float boost]) * Adds a new boost query field using the bq parameter */ PHP_METHOD(SolrDisMaxQuery, addBoostQuery) { solr_char_t *pname = (solr_char_t*) "bq"; COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; zval *boost = NULL; solr_char_t *field_value = NULL; COMPAT_ARG_SIZE_T field_value_len = 0; solr_char_t *boost_str = NULL; int add_result = 0; char * separator = ":"; solr_char_t *boost_separator = "^"; solr_string_t *value_boost_str = NULL; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "ss|z", &field_name, &field_name_len, &field_value, &field_value_len, &boost) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_ARG_LIST) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } if(boost != NULL) { convert_to_string(boost); boost_str = Z_STRVAL_P(boost); } if(boost !=NULL) { value_boost_str = emalloc(sizeof(solr_string_t)); memset(value_boost_str, 0, sizeof(solr_string_t)); solr_string_appends(value_boost_str, field_value, field_value_len); solr_string_appendc(value_boost_str, *boost_separator); solr_string_appends(value_boost_str, boost_str, Z_STRLEN_P(boost)); add_result = solr_add_arg_list_param( getThis(),pname, pname_len, field_name, field_name_len, value_boost_str->str, value_boost_str->len,' ',*separator ); solr_string_free(value_boost_str); efree(value_boost_str); }else{ add_result = solr_add_arg_list_param( getThis(),pname, pname_len, field_name, field_name_len, field_value, field_value_len,' ',*separator ); } if(add_result == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeBoostQuery(string field) Removes a sort field from the sort parameter. */ PHP_METHOD(SolrDisMaxQuery, removeBoostQuery) { solr_char_t *pname = (solr_char_t*) "bq"; COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value( getThis(), pname, pname_len, field_name, field_name_len ); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setBoostFunction(string function) sets Boost Query bf parameter. */ PHP_METHOD(SolrDisMaxQuery, setBoostFunction) { solr_char_t *pname = (solr_char_t*) "bf"; COMPAT_ARG_SIZE_T pname_len = sizeof("bf")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setMinimumMatch(string value) sets Minimum Match (mm) parameter. */ PHP_METHOD(SolrDisMaxQuery, setMinimumMatch) { solr_char_t *pname = (solr_char_t*) "mm"; COMPAT_ARG_SIZE_T pname_len = sizeof("mm")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setTieBreaker(float tieBreaker) sets Tie Breaker (tie) parameter. */ PHP_METHOD(SolrDisMaxQuery, setTieBreaker) { solr_char_t *pname = (solr_char_t*) "tie"; COMPAT_ARG_SIZE_T pname_len = sizeof("tie")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setBigramPhraseFields(string bigramFields) setBigramPhraseFields uses pf2 parameter */ PHP_METHOD(SolrDisMaxQuery, setBigramPhraseFields) { solr_char_t *pname = "pf2"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf2")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; int set_param_return = 0; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE){ php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0); if(set_param_return == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addBigramPhraseField(string field, float boost [, float slop]) * Adds a new bigram phrase field (pf2) to the list of fields */ PHP_METHOD(SolrDisMaxQuery, addBigramPhraseField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; zval *boost = NULL; zval *slop = NULL; int add_result = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = add_phrase_field(getThis(), "pf2", boost, slop, field_name, field_name_len); if(add_result == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field) Removes a bigram phrase field. */ PHP_METHOD(SolrDisMaxQuery, removeBigramPhraseField) { solr_char_t *pname = (solr_char_t*) "pf2"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf2")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value( getThis(), pname, pname_len, field_name, field_name_len ); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setBigramPhraseSlop(integer slop) sets Bigram Phrase Slop ps argument. */ PHP_METHOD(SolrDisMaxQuery, setBigramPhraseSlop) { solr_char_t *pname = (solr_char_t*) "ps2"; COMPAT_ARG_SIZE_T pname_len = sizeof("ps2")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; zval *tmp; if(zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } pvalue = Z_STRVAL_P(tmp); pvalue_len = Z_STRLEN_P(tmp); add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter value"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setTrigramPhraseFields(string fields) setTrigramPhraseFields uses pf3 parameter */ PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseFields) { solr_char_t *pname = "pf3"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf3")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; int set_param_return = 0; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE){ php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0); if(set_param_return == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addTrigramPhraseField(string field, float boost [, float slop]) * Adds a new trigram phrase field (pf3) to the list of fields */ PHP_METHOD(SolrDisMaxQuery, addTrigramPhraseField) { solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; zval *boost = NULL; zval *slop = NULL; int add_result = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = add_phrase_field(getThis(), "pf3", boost, slop, field_name, field_name_len); if(add_result == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field) Removes a trigram phrase field. */ PHP_METHOD(SolrDisMaxQuery, removeTrigramPhraseField) { solr_char_t *pname = (solr_char_t*) "pf3"; COMPAT_ARG_SIZE_T pname_len = sizeof("pf3")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_arg_list_param_value( getThis(), pname, pname_len, field_name, field_name_len ); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setTrigramPhraseSlop(integer slop) sets Trigram Phrase Slop ps3 argument. */ PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseSlop) { solr_char_t *pname = (solr_char_t*) "ps3"; COMPAT_ARG_SIZE_T pname_len = sizeof("ps3")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; zval *tmp; if(zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } pvalue = Z_STRVAL_P(tmp); pvalue_len = Z_STRLEN_P(tmp); add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameter value"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addUserField(string field) Adds a userfield rule to uf parameter. */ PHP_METHOD(SolrDisMaxQuery, addUserField) { solr_char_t *pname = (solr_char_t*) "uf"; COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1; int add_result = -1; solr_char_t *pvalue = NULL; COMPAT_ARG_SIZE_T pvalue_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } add_result = solr_add_simple_list_param_ex(getThis(), pname, pname_len, pvalue, pvalue_len, " "); if(add_result == FAILURE) { php_error_docref(NULL, E_WARNING, "Unable to add user field: Invalid parameter value"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::removeUserField(string field) Removes a userfield rule from uf parameter. */ PHP_METHOD(SolrDisMaxQuery, removeUserField) { solr_char_t *pname = (solr_char_t*) "uf"; COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1; solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_WARNING, "Invalid parameters"); RETURN_NULL(); } solr_delete_simple_list_param_value(getThis(), pname, pname_len, field_name, field_name_len); SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setUserFields(string fields) Sets user fields (uf parameter) */ PHP_METHOD(SolrDisMaxQuery, setUserFields) { solr_char_t *pname = "uf"; COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1; solr_char_t *param_value = NULL; COMPAT_ARG_SIZE_T param_value_len = 0; int set_param_return = 0; solr_param_t *param = NULL; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", ¶m_value, ¶m_value_len) == FAILURE){ php_error_docref(NULL, E_ERROR, "Invalid parameters"); RETURN_NULL(); } /* if the parameter is registered with a different type, remove it first */ if(solr_param_find(getThis(), pname, pname_len, ¶m) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL) { php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname); solr_delete_solr_parameter(getThis(), pname, pname_len); } set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0); if(set_param_return == FAILURE) { RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ int add_phrase_field(zval *obj, solr_char_t *pname, zval *boost, zval *slop, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_len) { COMPAT_ARG_SIZE_T pname_len = strlen(pname); int add_result = 0; solr_char_t *boost_str = NULL; solr_char_t *slop_str = NULL; char * separator = "^"; solr_char_t * delimiter_override = ""; solr_string_t boost_slop_buffer; if(boost != NULL) { convert_to_string(boost); boost_str = Z_STRVAL_P(boost); } if (slop != NULL) { convert_to_string(slop); slop_str = Z_STRVAL_P(slop); } if (slop != NULL && boost !=NULL) { delimiter_override = "~"; memset(&boost_slop_buffer, 0, sizeof(solr_string_t)); solr_string_appends(&boost_slop_buffer, (solr_char_t *)slop_str , Z_STRLEN_P(slop)); solr_string_appendc(&boost_slop_buffer, '^'); solr_string_appends(&boost_slop_buffer, boost_str , Z_STRLEN_P(boost)); add_result = solr_add_arg_list_param_ex( obj, pname, pname_len, field_name, field_name_len, boost_slop_buffer.str, boost_slop_buffer.len, ' ', *separator, *delimiter_override ); solr_string_free(&boost_slop_buffer); } else { add_result = solr_add_arg_list_param( obj, pname, pname_len, field_name, field_name_len, boost_str, Z_STRLEN_P(boost),' ',*separator ); } return add_result; } solr-2.8.1/src/php_solr_dismax_query.h0000644000175000017500000000464115001737315017014 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Omar Shaban | +----------------------------------------------------------------------+ */ #ifndef SOLR_DISMAX_QUERY_H_ #define SOLR_DISMAX_QUERY_H_ void init_solr_dismax_query(void); PHP_METHOD(SolrDisMaxQuery, __construct); PHP_METHOD(SolrDisMaxQuery, setQueryAlt); PHP_METHOD(SolrDisMaxQuery, addQueryField); PHP_METHOD(SolrDisMaxQuery, removeQueryField); PHP_METHOD(SolrDisMaxQuery, addPhraseField); PHP_METHOD(SolrDisMaxQuery, removePhraseField); PHP_METHOD(SolrDisMaxQuery, setPhraseFields); PHP_METHOD(SolrDisMaxQuery, setPhraseSlop); PHP_METHOD(SolrDisMaxQuery, setQueryPhraseSlop); PHP_METHOD(SolrDisMaxQuery, setBoostQuery); PHP_METHOD(SolrDisMaxQuery, addBoostQuery); PHP_METHOD(SolrDisMaxQuery, removeBoostQuery); PHP_METHOD(SolrDisMaxQuery, setBoostFunction); PHP_METHOD(SolrDisMaxQuery, setMinimumMatch); PHP_METHOD(SolrDisMaxQuery, setTieBreaker); PHP_METHOD(SolrDisMaxQuery, useDisMaxQueryParser); PHP_METHOD(SolrDisMaxQuery, useEDisMaxQueryParser); PHP_METHOD(SolrDisMaxQuery, setBigramPhraseFields); PHP_METHOD(SolrDisMaxQuery, addBigramPhraseField); PHP_METHOD(SolrDisMaxQuery, removeBigramPhraseField); PHP_METHOD(SolrDisMaxQuery, setBigramPhraseSlop); PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseFields); PHP_METHOD(SolrDisMaxQuery, addTrigramPhraseField); PHP_METHOD(SolrDisMaxQuery, removeTrigramPhraseField); PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseSlop); PHP_METHOD(SolrDisMaxQuery, addUserField); PHP_METHOD(SolrDisMaxQuery, removeUserField); PHP_METHOD(SolrDisMaxQuery, setUserFields); #endif /* SOLR_DISMAX_QUERY_H_ */ solr-2.8.1/src/php_solr_collapse_function.c0000644000175000017500000002535015001737315020004 0ustar biggibiggi/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: | | Omar Shaban | +----------------------------------------------------------------------+ */ #include "php_solr.h" /* {{{ proto void SolrFunction::__construct([string field]) Constructor. */ PHP_METHOD(SolrCollapseFunction, __construct) { long int index = SOLR_UNIQUE_FUNCTION_INDEX(); uint32_t nSize = SOLR_INITIAL_HASH_TABLE_SIZE; solr_function_t *solr_function_dest = NULL; zval *objptr = getThis(); #ifdef PHP_7 solr_function_dest = pemalloc(sizeof(solr_function_t), SOLR_FUNCTIONS_PERSISTENT); #endif solr_char_t *param_name = (solr_char_t *)"field"; COMPAT_ARG_SIZE_T param_name_len = sizeof("field"); solr_char_t *field_name = NULL; COMPAT_ARG_SIZE_T field_name_len = 0; if ((solr_function_dest = zend_hash_index_update_ptr(SOLR_GLOBAL(functions),index,(void *) solr_function_dest)) == NULL) { php_error_docref(NULL, E_ERROR, "Error while registering query parameters in HashTable"); return ; } zend_update_property_long(solr_ce_SolrCollapseFunction, OBJ_FOR_PROP(objptr), SOLR_INDEX_PROPERTY_NAME, sizeof(SOLR_INDEX_PROPERTY_NAME) - 1, index); solr_function_dest->function_index = index; solr_function_dest->name_length = strlen("collapse"); solr_function_dest->name = (solr_char_t *)"collapse"; /* Allocated memory for the params HashTable using fast cache for HashTables */ ALLOC_HASHTABLE(solr_function_dest->params); zend_hash_init(solr_function_dest->params, nSize, NULL, (dtor_func_t) solr_destroy_solr_string, SOLR_FUNCTIONS_PERSISTENT); if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_name, &field_name_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error Parsing Parameters"); return; } if (field_name_len > 0 ) { solr_solrfunc_update_string(getThis(), param_name, param_name_len, field_name, field_name_len); } Z_OBJ_HT_P(getThis()) = &solr_collapse_function_object_handlers; } /* }}} */ /* {{{ proto void SolrFunction::__destruct(void) Destructor. */ PHP_METHOD(SolrCollapseFunction, __destruct) { solr_function_t *function = NULL; /* Retrieve the document entry for this SolrDocument */ if (solr_fetch_function_entry(getThis(), &function) == SUCCESS ) { zend_hash_index_del(SOLR_GLOBAL(functions), function->function_index); } return; } /* {{{ proto string SolrFunction::setField(string field) Set the field that is being collapsed on. The field must be a single valued String, Int or Float. */ PHP_METHOD(SolrCollapseFunction, setField) { solr_char_t *key = "field", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("field"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getField(void) Get Collapse Field */ PHP_METHOD(SolrCollapseFunction, getField) { solr_char_t *key = "field"; COMPAT_ARG_SIZE_T key_len = sizeof("field"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setMin(string value) Selects the group heads by the min value of a numeric field or function query. */ PHP_METHOD(SolrCollapseFunction, setMin) { solr_char_t *key = "min", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("min"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::setMax(string value) Selects the group heads by the max value of a numeric field or function query. */ PHP_METHOD(SolrCollapseFunction, setMax) { solr_char_t *key = "max", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("max"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getMin(void) Get min parameter */ PHP_METHOD(SolrCollapseFunction, getMin) { solr_char_t *key = "min"; COMPAT_ARG_SIZE_T key_len = sizeof("min"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::getMax(void) Get max parameter */ PHP_METHOD(SolrCollapseFunction, getMax) { solr_char_t *key = "max"; COMPAT_ARG_SIZE_T key_len = sizeof("max"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setSize(void) Sets the initial size of the collapse data structures when collapsing on a numeric field only */ PHP_METHOD(SolrCollapseFunction, setSize) { solr_char_t *key = "size", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("size"), arg_len; zval *tmp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &tmp) == FAILURE) { RETURN_NULL(); } if (Z_TYPE_P(tmp) == IS_LONG) { convert_to_string(tmp); } if (Z_TYPE_P(tmp) != IS_STRING) { solr_throw_exception(solr_ce_SolrIllegalArgumentException, "Argument 1 must be an int", SOLR_ERROR_4000, SOLR_FILE_LINE_FUNC); } arg = Z_STRVAL_P(tmp); arg_len = Z_STRLEN_P(tmp); if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getSize(void) Get size parameter */ PHP_METHOD(SolrCollapseFunction, getSize) { solr_char_t *key = "size"; COMPAT_ARG_SIZE_T key_len = sizeof("size"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setHint(void) Set collapse hint Currently there is only one hint available "top_fc", which stands for top level FieldCache */ PHP_METHOD(SolrCollapseFunction, setHint) { solr_char_t *key = "hint", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("hint"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getHint(void) Get Hint */ PHP_METHOD(SolrCollapseFunction, getHint) { solr_char_t *key = "hint"; COMPAT_ARG_SIZE_T key_len = sizeof("hint"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::setNullPolicy(void) Sets the NULL Policy. Accepts ignore, expand, or collapse */ PHP_METHOD(SolrCollapseFunction, setNullPolicy) { solr_char_t *key = "nullPolicy", *arg; COMPAT_ARG_SIZE_T key_len = sizeof("nullPolicy"), arg_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE) { RETURN_NULL(); } if (solr_solrfunc_update_string(getThis(), key, key_len, (solr_char_t *)arg, arg_len) == FAILURE) { php_error_docref(NULL, E_ERROR, "Error assigning field"); RETURN_NULL(); } SOLR_RETURN_THIS(); } /* }}} */ /* {{{ proto string SolrFunction::getNullPolicy(void) Get NullPolicy */ PHP_METHOD(SolrCollapseFunction, getNullPolicy) { solr_char_t *key = "nullPolicy"; COMPAT_ARG_SIZE_T key_len = sizeof("nullPolicy"); solr_solrfunc_display_string(getThis(), key, key_len, &return_value); } /* }}} */ /* {{{ proto string SolrFunction::__toString(void) String value of the function object */ PHP_METHOD(SolrCollapseFunction, __toString) { solr_function_t *collapse_func; solr_string_t *buffer = NULL; if(solr_fetch_function_entry(getThis(), &collapse_func) == FAILURE) { RETURN_NULL(); } buffer = (solr_string_t *)emalloc(sizeof(solr_string_t)); memset(buffer, 0, sizeof(solr_string_t)); solr_solrfunc_to_string(collapse_func, &buffer); ZVAL_STRINGL(return_value, buffer->str, buffer->len); solr_string_free(buffer); efree(buffer); } /* }}} */ /* {{{ proto SolrClient::__sleep(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrCollapseFunction, __sleep) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, "Serialization of SolrCollapseFunction objects is currently not supported"); } /* }}} */ /* {{{ proto SolrClient::__wakeup(void) Should not be called directly. Serialization is not supported. */ PHP_METHOD(SolrCollapseFunction, __wakeup) { solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_1001, SOLR_FILE_LINE_FUNC, "Unserialization of SolrCollapseFunction objects is currently not supported"); } /* }}} */ /* {{{ throw exception on cloning (clone handler) */ #if PHP_VERSION_ID < 80000 zend_object* solr_collapse_function_object_handler_clone(zval *object) #else zend_object* solr_collapse_function_object_handler_clone(zend_object *object) #endif { zend_object *fake; fake = zend_objects_new(zend_standard_class_def); solr_throw_exception_ex(solr_ce_SolrIllegalOperationException, SOLR_ERROR_4001, SOLR_FILE_LINE_FUNC, "Cloning of SolrCollapseFunction objects is currently not supported"); return fake; } /* }}} */ solr-2.8.1/CREDITS0000664000175000017500000000004215001737315012445 0ustar biggibiggisolr Israel Koko Ekpo Omar Shaban solr-2.8.1/README.CONTRIBUTORS0000664000175000017500000000633715001737315014256 0ustar biggibiggi================================================================================ Omar Shaban (omars@php.net) ================================================================================ - Lead Maintainer ================================================================================ Thanks to all our [contributors](https://github.com/php/pecl-search_engine-solr/graphs/contributors). ================================================================================ These are the people that made version 1.0 release of the Apache Solr PECL extension possible. If I have left anyone out or mis-stated your contributions, please let me know so that it can be correct to reflect your contributions accurately. Thanks again for making this possible. ================================================================================ Israel Ekpo (iekpo@php.net) ================================================================================ - Orignal Author of the Apache Solr PECL extension - Orignal Extension Concept and Design - Lead Maintainer ================================================================================ Pierre-Alain Joye (pajoye@php.net) ================================================================================ - Fine tuned and created the final version of the config.w32 script (291135) - Compiled and made available several versions of the .dll binaries for Windows. - Currently hosting the windows .dll binaries for the Apache Solr PECL extension. ================================================================================ Kalle Sommer Nielsen (kalle@php.net) ================================================================================ - Significant refactoring of the config.w32 script for Windows (288890) - Corrected Windows C++ compiler bugs (288890) ================================================================================ Pierrick Charron (pierrick@php.net) ================================================================================ - Assisted in the testing of the extension using various test cases. - Uncovered and reported several bugs due to his insight of the extension internals. - Discovered bugs 16943 and 16924 - Patched the config.w32 for its first successful compilation on Windows (291101). ================================================================================ Felipe Pena (felipe@php.net) ================================================================================ - Participated significantly after the intial release and uncovered a serious bug that lead to segfaults. - Discovered bugs 16855 thru 16859 - Contributed to development of UNIX config.m4 script (289148) ================================================================================ Alex Samorukov (alexey.samorukov@varien.com) ================================================================================ - Lowered minimum supported version for libcurl to 7.15.0 - Lowered minimum supported version for libxml2 to 2.6.26 ================================================================================ (trevor at blubolt dot com, max at blubolt dot com) ================================================================================ - Fixed PECL Bug# 17172 MoreLikeThis only parses one doc solr-2.8.1/LICENSE0000644000175000017500000000620415001737315012436 0ustar biggibiggi-------------------------------------------------------------------- The PHP License, version 3.01 Copyright (c) 1999 - 2024 The PHP Group. All rights reserved. -------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net. 4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo" 5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License. 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP software, freely available from ". THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED 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 PHP DEVELOPMENT TEAM OR ITS 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. -------------------------------------------------------------------- This software consists of voluntary contributions made by many individuals on behalf of the PHP Group. The PHP Group can be contacted via Email at group@php.net. For more information on the PHP Group and the PHP project, please see . PHP includes the Zend Engine, freely available at . solr-2.8.1/README.ABOUT_SOLR_EXTENSION0000664000175000017500000001407415001737315015463 0ustar biggibiggi================================================================================ Introducing the Solr PHP Extension ================================================================================ The Solr extension is an extremely fast, light-weight, feature-rich library that allows PHP developers to communicate effectively with Solr server instances. There are tools to add documents and make updates to the solr server. It also contains tools that allows you to build advanced queries to the server when searching for documents. There are also special objects that simplifies the sending of name-value requests to the server. This includes the SolrParams class and all its child classes. The SolrClient object allows one to communicate with Solr containers that are behind proxy servers or that require HTTP Authentication to proceed. The SolrClient constructor accepts options such as http authentication username and passwor, proxy server name, port, login and passwords etc. Using an advanced http client like libcurl allows us to leverage the features available with the library. We can reuse the HTTP connections without having to create a separate one for each request. ================================================================================ How to Install ================================================================================ Please refer to the README.INSTALLATION file. ================================================================================ Magic Methods and Interfaces Implemented ================================================================================ SolrDocument implements the following interfaces. (1) ArrayAccess - to access the fields as array keys using field names. (2) Iterator - to iterate over the document fields using foreach() (3) Serializable - provides custom serialization of the object. SolrDocument also contains the __get and __set magic methods which allows developers to access the fields directly. When setting fields, if the field already has a value the new value will be appended to the list of values for that field. Each field is a SolrDocumentField object with the following public properties : (a) name - a string with name of the field. (b) boost - a double representing the boost value of the field (intentionally empty) (c) values - an array of all the field values as strings. Custom Serialization string SolrDocument::serialize(void) returns an XML document representing a SolrDocument as shown below : A0F43D Israel Ekpo Israel.Ekpo@israel.ekpo.com Reading Writing Soccer Teaching Inglés Espanól Here is a complete example of a serialized SolrDocument object: C:12:"SolrDocument":679:{ A0F43D Israel Ekpo Israel.Ekpo@israel.ekpo.com Reading Writing Soccer Teaching Inglés Espanól } One of the items on my todo list is to create a response writer to return serialized SolrDocument objects instead of document arrays. SolrDocument::unserialize(string $serialized) accepts an XML document representing the SolrDocument object. It will the bring the object back to live. The SolrDocument class also has the method SolrDocument::getInputDocument() to allow one do get the SolrInputDocument version of a SolrDocument instance. This method may be helpful if one needs to resubmit the document to the server to updates. The Solr extension has the SolrQuery object (a child of SolrParams) that enables the developer to send custom advanced name-value requests to the solr server. The SolrQuery object can also be serialized and reused later, which makes it very helpful to saving the state of the application across multiple requests. This may be very useful in cases such as facet browsing where additional parameters may need to be added to the current object or removed from it to get the desired results without having to start over from scratch. ================================================================================ Parsing of XML Responses from the Solr Server ================================================================================ XML responses from the solr server are expected to be formatted using version 2.2 These xml documents are parsed into serialized php code and returned as read-only SolrObject instances whose properties can also be accessed as array keys in addition to being accessible directly via the object->member notation. Having the properties accessible via object[member] notation is helpful in cases where the property name is not valid (contains dots and other characters not legal in php. ================================================================================ How to Report Bugs ================================================================================ Please report bugs to http://bugs.php.net If you experience a crash due to a segmentation fault, please follow the instructions on the link below to get a gdb backtrace and then submit the trace in your bug report as well http://bugs.php.net/bugs-generating-backtrace.php Thank you for using PHP solr-2.8.1/README.INSTALLATION0000644000175000017500000001655215001737315014220 0ustar biggibiggi================================================================================ PHP VERSION Dependencies ================================================================================ PHP version 7.0 or later is needed ================================================================================ Extension Dependencies ================================================================================ LIBXML extension JSON extension ================================================================================ Library Dependencies ================================================================================ libxml2 2.6.26 or later is required libcurl 7.15.5 or later is required ================================================================================ On Linux/UNIX ================================================================================ As mentioned before, the libxml and curl extensions must be enabled for the Apache Solr extension to be functional. Do not attempt to hack the code to make it compile. It will fail, possibly with errors that could be hard to debug To install the Apache Solr extension directly from PECL, please enter the following command, then follow the prompts pecl install solr 4A. To compile from source, please follow the following steps $ phpize $ ./configure $ make && make install This should compile the code and install it in the extension_dir specified in the ini file. Then open your php.ini file and add the following line to it extension=solr.so Then restart your webserver. For CLI only, you do not have to restart your webserver. 4B. If your system does not have the minimum version of the libcurl or libxml libraries, you can download the libraries and compile them from source into a separate install prefix. wget http://curl.haxx.se/download/curl-7.19.6.tar.gz tar -zxvf curl-7.19.6.tar.gz cd curl-7.19.6 configure --prefix=/root/custom/software make && make install cd .. wget ftp://xmlsoft.org/libxml2/libxml2-2.7.6.tar.gz tar -zxvf libxml2-2.7.6.tar.gz cd libxml2-2.7.6 configure --prefix=/root/custom/software make && make install This example assumes that the libxml2 and libcurl libraries were compiled from source and installed using "/root/custom/software" as the --prefix So the absolute path to the easy.h header file will be /root/custom/software/include/curl/easy.h And the absolute path to the libxml/parser.h header file wil be /root/custom/software/include/libxml2/libxml/parser.h The absolute path to the xml2-config script will be /root/custom/software/bin/xml2-config And the absolute path to the curl-config script will be /root/custom/software/bin/curl-config Then you can pass libcurl prefix to the configure script for CURL and LIBXML respectively during the configuration phase as shown here : export PKG_CONFIG_PATH=/root/custom/software/lib/pkgconfig ./configure --enable-solr If you already have the latest versions of the libraries then the step listed in 4A alone is sufficient. 5. make && make install This should compile the code and install it in the extension_dir specified in the ini file. Then open your php.ini file and add the following line to it extension=solr.so If you would prefer to compile the Solr extension statically into php, you will need to follow the following steps. 1. copy the solr_xxx folder into the ext folder in the php source 2. Include the --enable-solr flag as one of the options when configuring php This will build the Solr extension statically into php. After the installation is completed, you will have to restart your webserver for the changes to take effect. For CLI only use, you do not have to restart your webserver. ================================================================================ On Windows ================================================================================ If you are using a pre-compiled dll, simply copy the php_solr.dll file to your extension_dir specified in the ini file. Then open your php.ini file and add the following line to it extension=php_solr.dll Then restart your webserver. For CLI only, you do not have to restart your webserver. If you are building from source, you will need to download the library dependencies for libxml and libcurl from the following link to the deps folder before running buildconf.bat http://wiki.php.net/internals/windows/libs http://pecl2.php.net/downloads/php-windows-builds/php-libs/ More details are avialable here http://wiki.php.net/internals/windows Windows DLLs are now available here http://downloads.php.net/pierre/ If you are building from source, you will need to download the library dependencies for libxml and libcurl from the following link to the deps folder before running buildconf.bat The Apache Solr extension can be compiled statically or shared. - Shared compilation creates a php_solr.dll file. - Static compilation puts the Solr extension directly into PHP (therefore it does not need to be loaded and cannot be unloaded). You can toggle between compiling statically or as library by adding =static or =shared to the configure.js command during the compilation. configure --with-solr=static configure --with-solr=shared - In the first configure command, the Apache Solr extension will be included in PHP - In the second configure command, the Apache Solr extension will be compiled as separate DLL Here is a more detail list of steps to follow : 1. Get visual studio 2008 ((express edition or professional) and install it. 2. Get and install windows sdk 6.1. 3. Get a php 5.3 snapshot (do not extract yet!). 4. Create the folder "c:\php-sdk" 5. Unpack the binary tools archive into this directory, there should be one sub-directory called "bin" and one called "script" 6. Open the "windows sdk 6.1 shell" (which is available from the start menu group) and execute the following commands in it: setenv /x86 /xp /release cd c:\php-sdk\ bin\phpsdk_setvars.bat bin\phpsdk_buildtree.bat php53dev 7. Now extract the snapshot from Step 3 to C:\php-sdk\php53dev\vc9\x86 with your favourite unpacker so that the following directory gets created: C:\php-sdk\php53dev\vc9\x86\php5.3-xyz 8. run in the windows-sdk-shell: cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz buildconf 9. now run configure --help, to get an overview of the compiling flags 10. configure --disable-all --enable-cli --with-solr=yes --with-curl=yes --with-libxml=yes 11. nmake If you are using Visual Studio 2005, use vc8 wherever you see vc9. If you are on a 64-bit system, use x64 instead of x86. The following resources can provide you with more information : http://wiki.php.net/internals/windows/libs http://pecl2.php.net/downloads/php-windows-builds/php-libs/ More details are avialable here : http://wiki.php.net/internals/windows The binary tools archive is available at : http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip Windows SDK 6.1 is available at : http://www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&displaylang=en The PHP 5.3 shapshot is available at: http://windows.php.net/downloads/snaps/php-5.3/php-5.3-src-latest.zip ================================================================================ How to Report Bugs ================================================================================ Please report bugs to omars@php.net You can also register bugs here http://pecl.php.net/bugs/report.php?package=solr Thank you for using PHP solr-2.8.1/README.SUBMITTING_CONTRIBUTIONS0000664000175000017500000000431515001737315016122 0ustar biggibiggi================================================================================ Submitting contributions ================================================================================ A lot of time has been put into designing, implementing and documenting this extension. A lot of work has also been put into ensuring that users of the extension experience very minimal defects during usage. New ideas, corrections, bug fixes, feature improvements are always welcome. However, you must discuss any changes you are about to make to any of the source files prior to making or submitting such changes either in the PECL developers mailing list (pecl-dev@lists.php.net) or by contacting the current author(s) or maintainer(s) of this extension directly. Test scripts should be included when making the submissions. Also explain thoroughly what has been fixed/added/changed by your patch. If your patch is easy to review and has obviously no side-effects, it might take up to a few hours until it is committed. Since this is a volunteer-driven effort, more complex patches will require more patience on the part of the submitter. ================================================================================ Testing thoroughly before submissions ================================================================================ This is a fairly large library and each component is dependent on another component either directly or indirectly. As a consequence, any and all changes must be tested thoroughly before commiting them. It is only polite to the users, author(s) or maintainer(s) that you do so. ================================================================================ Checklist for making submissions ================================================================================ - Did you run "make test" to check if your patch didn't break other features? - Did you compile PHP with --enable-debug and check the PHP and web server error logs when you test your patch? - Did you build PHP for multi-threaded web servers. - Did you create test script for "make test"? (Recommended) - Did you check your patch is unified format and it does not contain white space changes? - Did you read the patch again? solr-2.8.1/README.MEMORY_ALLOCATION0000664000175000017500000000530115001737315015024 0ustar biggibiggi================================================================================ Solr Notes about Memory Allocation and interaction with HashTables ================================================================================ The following notes are for C-space PHP developers. If you are not really familiar with how the Zend HashTable API or the memory allocation marcros really works, please take sometime to read the notes below : This is correct as of Zend Engine version 2.3.0 - If memory was allocated with emalloc(), it has to be freed with efree(). - If memory was allocated using pemalloc(), the same value for the persistent parameter must be used during pefree() to deallocated the allocated memory. The memory manager for the Zend API will then decide whether to use free() or efree() depending on whether persistent is 1 or 0 respectively. The same principle applies to pestrdup(), pecalloc() and the other memory allocation macros. - When inserting values into the HashTables, if the value for the persistent parameter is set, then the memory allocation for the entered item should be persistent to i.e. pemalloc() with persistent set to 1. The following will apply when adding new values into a HashTable for items that were dynamically allocated : (a) If the value for the nDataSize parameter is the size of that of a pointer sizeof(void *), the HashTable API copies the contents of the pData parameter into the Bucket->pDataPtr member for that data Bucket. Then it sets the Bucket->pData member to the address of the Bucket->pDataPtr member for that data Bucket. (b) If the value for the nDataSize parameter is not equal to sizeof(void *), the HashTable API allocates new memory for the Bucket->pData member using the size equivalent to nDataSize and the same value for the persistent flag set for the target HashTable. The the contents of the pData parameter is copied into the Bucket->pData member in this newly allocated memory location. Then the Bucket->pDataPtr member for this Bucket is set to NULL. Do not worry about the newly allocated memory allocated by the HashTable API; if the nDataSize parameter was not equal to sizeof(void *), then during the cleanup process, the Zend API will free the new memory it allocated during the insert process. It will also call the destructor function if a valid one was passed when the HashTable was initialized with zend_hash_init(). In the extension, I have used the p* version of the memory allocation functions to allow me toggle if there is any need to do so in the future. This will prevent a massive search and replace effort. For all the HashTables, I set the intial size to 8 to reduce the looping when zend_hash_init() is setting up the HashTable pointer to use. solr-2.8.1/TODO0000664000175000017500000000145215001737315012123 0ustar biggibiggi2014-02-17 ================================================================================ Features and things to do in the library ================================================================================ - Set up php.ini entries for default servlet values. This will allow developers to set custom values for the servlets. - Ability to send custom requests to Solr (custom url, custom request contents) - Ability to add files (pdf, office documents, etc) - Ensure the SolrQuery::getFields(), SolrQuery::getFacets() et all returns an array consistently. - More frequent compilations of releases for PHP 5.3 on Windows - Support JSON Writer - Support Solr Spatial Features Natively - Introduce SolrServerException to parse and return Solr Server error messages instead of dumping xml docs solr-2.8.1/docs/documentation.php0000644000175000017500000026153315001737315015753 0ustar biggibiggi | | Omar Shaban | +----------------------------------------------------------------------+ */ define('SOLR_MAJOR_VERSION', 2); define('SOLR_MINOR_VERSION', 8); define('SOLR_PATCH_VERSION', 1); define('SOLR_EXTENSION_VERSION', '2.8.1'); /** * Returns the current version of the Apache Solr extension * * @return string */ function solr_get_version() { return SOLR_EXTENSION_VERSION; } /** * This is the base class for all exception thrown by the Solr extension classes. * * @author Israel Ekpo */ class SolrException extends Exception { /* Properties */ protected $sourceline; protected $sourcefile; protected $zif_name; /** * Returns internal information where the Exception was thrown * @return array * @link https://www.php.net/manual/en/solrexception.getinternalinfo.php */ public function getInternalInfo() {} } /** * An exception thrown when there is an error while making a request to the server from the client. * @author Israel Ekpo */ class SolrClientException extends SolrException { /** * Returns internal information where the Exception was thrown * * @return array * @link https://www.php.net/manual/en/solrclientexception.getinternalinfo.php */ public function getInternalInfo() {} } /** * Used for Solr Related Exceptions * * @author Omar Shaban */ class SolrServerException extends SolrException { /** * Returns internal information where the Exception was thrown * * @return array * @link https://www.php.net/manual/en/solrserverexception.getinternalinfo.php */ public function getInternalInfo() {} } /** * This object is thrown when an illeglal or invalid argument is passed to a method. * * @link https://www.php.net/manual/en/class.solrillegalargumentexception.php * @author Israel Ekpo */ class SolrIllegalArgumentException extends SolrException { /** * Returns internal information where the Exception was thrown * @return string * @link https://www.php.net/manual/en/solrillegalargumentexception.getinternalinfo.php */ public function getInternalInfo() {} } /** * @link https://www.php.net/manual/en/class.solrillegaloperationexception.php * @author Israel Ekpo */ class SolrIllegalOperationException extends SolrException { /** * Returns internal information where the Exception was thrown * * @return string * @link https://www.php.net/manual/en/solrillegaloperationexception.getinternalinfo.php */ public function getInternalInfo() {} } /** * @author Omar Shaban */ class SolrMissingMandatoryParameterException extends SolrException { } /** * * @author Israel Ekpo * @author Omar Shaban */ abstract class SolrUtils { /** * Parses an response XML string into a SolrObject * * @param string $xmlresponse * @param int $parse_mode * @return SolrObject * @link https://www.php.net/manual/en/solrutils.digestxmlresponse.php */ public static function digestXmlResponse($xmlresponse, $parse_mode = 0) {} /** * Escapes a lucene query string * * @param string $str String to be escaped * @return string * @link https://www.php.net/manual/en/solrutils.escapequerychars.php */ public static function escapeQueryChars($str) {} /** * Returns the current version of the Solr extension * @return string * @link https://www.php.net/manual/en/solrutils.getsolrversion.php */ public static function getSolrVersion() {} /** * Prepares a phrase from an unescaped lucene string * * @param string $str * @return string * @link https://www.php.net/manual/en/solrutils.queryphrase.php */ public static function queryPhrase($str) {} } /** * Represents a field in a Solr document. All its properties are read-only. * * @author Israel Ekpo */ class SolrDocumentField { /** * The name of the field * * @var string */ public $name; /** * The boost value for the field * * @var float */ public $boost; /** * An array of values for this field * @var array */ public $values; /** * Constructor */ public function __construct() {} /** * Destructor */ public function __destruct() {} } /** * Represents a Solr document that is about to be submitted to the Solr index * * @link https://www.php.net/manual/en/class.solrinputdocument.php * @author Israel Ekpo * @author Omar Shaban */ final class SolrInputDocument { /** * Sorts the fields in ascending order */ const SORT_DEFAULT = 1 ; /** * Sorts the fields in ascending order */ const SORT_ASC = 1 ; /** * Sorts the fields in descending order */ const SORT_DESC = 2 ; /** * Sorts the fields by name */ const SORT_FIELD_NAME = 1 ; /** * Sorts the fields by number of values */ const SORT_FIELD_VALUE_COUNT = 2 ; /** * Sorts the fields by boost value */ const SORT_FIELD_BOOST_VALUE = 4 ; /** * Adds a new value to a multivalued field */ const UPDATE_MODIFIER_ADD = 1; /** * Sets a field value */ const UPDATE_MODIFIER_SET = 2; /** * Increments a field value */ const UPDATE_MODIFIER_INC = 3; /** * Removes a value from a multivalued field */ const UPDATE_MODIFIER_REMOVE = 4; /** * Removes values matching a java regular expression */ const UPDATE_MODIFIER_REMOVEREGEX = 5; /** * Concurrency default * @var int */ const VERSION_ASSERT_NONE = 0; /** * Assert that a document does not exist, will fail if the document exists * @var int */ const VERSION_ASSERT_NOT_EXISTS = -1; /** * Assert that the document already exists * if the document does not exist, the updates will be rejected. * * @var int */ const VERSION_ASSERT_EXISTS = 1; /** * Adds a field to the document * * @param string $fieldName The name of the field * @param string $fieldValue The value for the field * @param float $fieldBoostValue The index time boost for the field. Though this cannot be negative, you can still pass values less than 1.0 but they must be greater than zero. * @link https://www.php.net/manual/en/solrinputdocument.addfield.php */ public function addField($fieldName, $fieldValue, $fieldBoostValue = 0.0) {} /** * Resets the document by dropping all the fields and resets the document boost to zero * * @link https://www.php.net/manual/en/solrinputdocument.clear.php * @return bool Returns TRUE on success or FALSE on failure */ public function clear() {} /** * Removes a field from the document * @param string $fieldName * @link https://www.php.net/manual/en/solrinputdocument.deletefield.php */ public function deleteField($fieldName) {} /** * Checks if a field exists * * @param $fieldName * @return bool * @link https://www.php.net/manual/en/solrinputdocument.fieldexists.php */ public function fieldExists($fieldName) {} /** * Retrieves the current boost value for the document * * @return float * @link https://www.php.net/manual/en/solrinputdocument.getboost.php */ public function getBoost() {} /** * Retrieves a field by name * * @param string $fieldName * @return SolrDocumentField */ public function getField($fieldName) {} /** * Retrieves the boost value for a particular field * * @param string $fieldName * @return float * @link https://www.php.net/manual/en/solrinputdocument.getfieldboost.php */ public function getFieldBoost($fieldName) {} /** * Returns the number of fields in the document * * @return int * @link https://www.php.net/manual/en/solrinputdocument.getfieldcount.php */ public function getFieldCount() {} /** * Returns an array containing all the fields in the document * * @return array * @link https://www.php.net/manual/en/solrinputdocument.getfieldnames.php */ public function getFieldNames() {} /** * Merges one input document into another * * @param SolrInputDocument $sourceDoc * @param bool $overwrite * @link https://www.php.net/manual/en/solrinputdocument.merge.php */ public function merge(SolrInputDocument $sourceDoc, $overwrite = true) {} /** * This is an alias of SolrInputDocument::clear * * @return bool * @link https://www.php.net/manual/en/solrinputdocument.reset.php */ public function reset() {} /** * Sets the boost value for this document * * @param float $documentBoostValue * @link https://www.php.net/manual/en/solrinputdocument.setboost.php */ public function setBoost($documentBoostValue) {} /** * Sets the index-time boost value for a field * * @param string $fieldName * @param float $fieldBoostValue * @link https://www.php.net/manual/en/solrinputdocument.setfieldboost.php */ public function setFieldBoost($fieldName, $fieldBoostValue) {} /** * Sorts the fields within the document * * @param int $sortOrderBy * @param int $sortDirection One of the SolrInputDocument::SORT_* constants * @link https://www.php.net/manual/en/solrinputdocument.sort.php */ public function sort($sortOrderBy, $sortDirection = SolrInputDocument::SORT_ASC) {} /** * Returns an array representation of the input document * * @return array * @link https://www.php.net/manual/en/solrinputdocument.toarray.php */ public function toArray() {} /** * Adds a child document * * @param SolrInputDocument $child * @return void * @throws SolrIllegalArgumentException * @throws SolrException */ public function addChildDocument(SolrInputDocument $child) {} /** * Adds child documents * * @param array $children * @return void * @throws SolrIllegalArgumentException * @throws SolrException */ public function addChildDocuments(array $children) {} /** * Whether this input document has child documents * * @return bool */ public function hasChildDocuments() {} /** * Returns an array of child documents (SolrInputDocument) * * @return array */ public function getChildDocuments() {} /** * Returns the number of child documents * * @return int */ public function getChildDocumentsCount() {} /** * Set document version to enable optimistic concurrency mode using self::VERSION_* constants * or asserting version match * * @param int $version */ public function setVersion($version) {} /** * @return int */ public function getVersion() {} public function __clone() {} public function __construct() {} public function __destruct() {} } /** * Represents a Solr document retrieved from a query response * * @link https://www.php.net/manual/en/class.solrdocument.php * @author Israel Ekpo * @author Omar Shaban */ final class SolrDocument implements ArrayAccess, Iterator, Serializable { const SORT_DEFAULT = 1 ; const SORT_ASC = 1 ; const SORT_DESC = 2 ; const SORT_FIELD_NAME = 1 ; const SORT_FIELD_VALUE_COUNT = 2 ; const SORT_FIELD_BOOST_VALUE = 4 ; public function __construct() {} public function __clone() {} public function __destruct() {} /** * Adds a field to the document * * @param string $fieldName * @param string $fieldValue * @return Returns TRUE on success or FALSE on failure * @link https://www.php.net/manual/en/solrdocument.addfield.php */ public function addField($fieldName, $fieldValue) {} /** * Drops all the fields in the document * * @return Returns TRUE on success or FALSE on failure * @link https://www.php.net/manual/en/solrdocument.addfield.php */ public function clear() {} /** * Retrieves the current field * * @return SolrDocumentField * @link https://www.php.net/manual/en/solrdocument.current.php */ public function current() {} /** * Removes a field from the document * * @param string $fieldName * @link https://www.php.net/manual/en/solrdocument.deletefield.php */ public function deleteField($fieldName) {} /** * Checks if a field exists in the document * @param string $fieldName * @return Returns TRUE if the field is present and FALSE if it does not * @link https://www.php.net/manual/en/solrdocument.fieldexists.php */ public function fieldExists($fieldName) {} /** * Magic method for accessing the field as a property * * @param string $fieldName * @link https://www.php.net/manual/en/solrdocument.get.php */ public function __get($fieldName) {} /** * Retrieves a field by name * * @param string $fieldName * @return SolrDocumentField */ public function getField($fieldName) {} /** * Returns the number of fields in this document. Multi-value fields are only counted once. * * @return int * @link https://www.php.net/manual/en/solrdocument.getfieldcount.php */ public function getFieldCount() {} /** * Returns an array of fields names in the document * * @return array * @link https://www.php.net/manual/en/solrdocument.getfieldcount.php */ public function getFieldNames() {} /** * Returns a SolrInputDocument equivalent of the object * * @return SolrInputDocument * @link https://www.php.net/manual/en/solrdocument.getinputdocument.php */ public function getInputDocument() {} public function __isset($fieldName) {} public function key() {} /** * Merges source to the current SolrDocument * * @param SolrDocument $sourceDoc * @param bool $overwrite * @link https://www.php.net/manual/en/solrdocument.merge.php */ public function merge(SolrDocument $sourceDoc, $overwrite = true) {} public function next() {} public function offsetExists($fieldName) {} public function offsetGet($fieldName) {} public function offsetSet($fieldName, $fieldValue) {} public function offsetUnset($fieldName) {} public function reset() {} public function rewind() {} public function serialize() {} public function __set($fieldName, $fieldValue) {} public function sort($sortOrderBy, $sortDirection) {} public function toArray() {} public function unserialize($serialized) {} public function __unset($fieldName) {} public function valid() {} /** * Checks whether this document contains child documents * * @return bool */ public function hasChildDocuments() {} /** * Returns an array of child documents (SolrDocument) * * @return array */ public function getChildDocuments() {} /** * Returns the number of child documents * * @return int */ public function getChildDocumentsCount() {} } /** * * @author Israel Ekpo */ class SolrObject implements ArrayAccess { /* Methods */ public function __construct() {} public function __destruct() {} public function getPropertyNames() {} public function offsetExists($property_name) {} public function offsetGet($property_name) {} public function offsetSet($property_name, $property_value) {} public function offsetUnset($property_name) {} } /** * * @author Israel Ekpo * @author Omar Shaban */ final class SolrClient { /* Constants */ const SEARCH_SERVLET_TYPE = 1 ; const UPDATE_SERVLET_TYPE = 2 ; const THREADS_SERVLET_TYPE = 4 ; const PING_SERVLET_TYPE = 8 ; const TERMS_SERVLET_TYPE = 16 ; const SYSTEM_SERVLET_TYPE = 32; const DEFAULT_SEARCH_SERVLET = 'select' ; const DEFAULT_UPDATE_SERVLET = 'update' ; const DEFAULT_THREADS_SERVLET = 'admin/threads' ; const DEFAULT_PING_SERVLET = 'admin/ping' ; const DEFAULT_TERMS_SERVLET = 'terms' ; const DEFAULT_SYSTEM_SERVLET = 'admin/system' ; /** * Constructor * * @param array $clientOptions */ public function __construct(array $clientOptions) {} public function __destruct() {} /** * Adds a document to the index * * @param SolrInputDocument $doc * @param bool $overwrite * @param int $commitWithin 0 means disabled * @return SolrUpdateResponse */ public function addDocument(SolrInputDocument &$doc, $overwrite = true, $commitWithin = 0) {} /** * Adds a collection of SolrInputDocument instances to the index * * @param array $docs An array of SolrInputDocument objects * @param bool $overwrite * @param int $commitWithin * @return SolrUpdateResponse */ public function addDocuments(array &$docs, $overwrite = true, $commitWithin = 0) {} /** * Finalizes all add/deletes made to the index * * @param bool $softCommit * @param bool $waitSearcher * @param bool $expungeDeletes * @return SolrUpdateResponse */ public function commit($softCommit = false, $waitSearcher = true, $expungeDeletes = false) {} /** * Get Document By Id. Utilizes Solr Realtime Get (RTG). * * @param string $id * @return SolrQueryResponse */ public function getById($id) {} /** * Get Documents by their Ids. Utilizes Solr Realtime Get (RTG). * * @param array $ids * @return SolrQueryResponse */ public function getByIds(array $ids) {} /** * Deletes the document with the specified ID. * * Where ID is the value of the uniqueKey field declared in the schema * * @param string $id * @return SolrUpdateResponse */ public function deleteById($id) {} /** * Deletes a collection of documents with the specified set of ids * * @param array $ids * @return SolrUpdateResponse */ public function deleteByIds(array $ids) {} /** * Removes all documents matching any of the queries * * @param array $queries * @return SolrUpdateResponse */ public function deleteByQueries(array $queries) {} /** * Deletes all documents matching the given query * * @param string $query * @return SolrUpdateResponse */ public function deleteByQuery($query) {} /** * Returns the debug data for the last connection attempt * * @return string */ public function getDebug() {} /** * Returns the client options set internally * * @return array */ public function getOptions() {} /** * Defragments the index for faster search performance * * @param int $maxSegments * @param bool $softCommit * @param bool $waitSearcher * @return SolrUpdateResponse */ public function optimize($maxSegments = 1, $softCommit = false, $waitSearcher = true) {} /** * Checks if Solr server is still up * * @return SolrPingResponse */ public function ping() {} /** * Sends a query to the server * * @param SolrParams $query * @return SolrQueryResponse */ public function query(SolrParams $query) {} /** * Sends a raw XML update request to the server * * @param string $raw_request * @return SolrUpdateResponse */ public function request($raw_request) {} /** * Rollbacks all add/deletes made to the index since the last commit * * @return SolrUpdateResponse */ public function rollback() {} /** * Changes the specified servlet type to a new value * * @param int $type * @param string $value * * @return bool * @link https://www.php.net/manual/en/solrclient.setservlet.php */ public function setServlet($type, $value) {} /** * Checks the threads status * * @return SolrGenericResponse * @link https://www.php.net/manual/en/solrclient.threads.php */ public function threads() {} /** * Retrieve Solr Server System Information * * @return SolrGenericResponse */ public function system() {} } /** * @author Omar Shaban * * @link https://cwiki.apache.org/confluence/display/solr/Uploading+Data+with+Solr+Cell+using+Apache+Tika */ class SolrExtractRequest { /** * Capture the specified fields (and everything included below it that isn't capture by some other capture field) separately from the default. This is different * from the case of passing in an XPath expression. *

* The Capture field is based on the localName returned to the SolrContentHandler * by Tika, not to be confused by the mapped field. The field name can then * be mapped into the index schema. *

* For instance, a Tika document may look like: *

     *  <html>
     *    ...
     *    <body>
     *      <p>some text here.  <div>more text</div></p>
     *      Some more text
     *    </body>
     * 
* By passing in the p tag, you could capture all P tags separately from the rest of the t * Thus, in the example, the capture of the P tag would be: "some text here. more text" * */ const CAPTURE_ELEMENTS = 'capture'; /** * Capture attributes separately according to the name of the element, instead of just adding them to the string * buffer. */ const CAPTURE_ATTRIBUTES = 'captureAttr'; /** * Commit document within X number of milliseconds. */ const COMMIT_WITHIN = 'commitWithin'; /** * Defines the date format patterns to identify in the documents. */ const DATE_FORMATS = 'date.formats'; /** * If specified and the name of a potential field cannot be determined, the default Field specified will be used * instead. */ const DEFAULT_FIELD = 'defaultField'; /** * Only extract and return the content, do not index it. */ const EXTRACT_ONLY = 'extractOnly'; /** * Content output format if extractOnly is true. (accepts: xml|text, default xml) */ const EXTRACT_FORMAT = 'extractFormat'; /** * If true, exceptions found during processing will be skipped. Any metadata available, however, will be indexed. */ const IGNORE_TIKA_EXCEPTION = 'ignoreTikaException'; /** * Literal field values will by default override other values such as metadata and content. */ const LITERALS_OVERRIDE = 'literalsOverride'; /** * Map all generated attribute names to field names with lowercase and underscores. */ const LOWERNAMES = 'lowernames'; /** * Useful if uploading very large documents, this defines the KB size of documents to allow. */ const MULTIPART_UPLOAD_LIMIT = 'multipartUploadLimitInKB'; /** * If specified, loads the file as a source for password lookups for Tika encrypted documents. * * File format is Java properties format with one key=value per line. The key is evaluated as a regex against * the file name, and the value is the password The rules are evaluated top-bottom, * i.e. the first match will be used If you want a fallback password to be always used, * supply a .*= at the end */ const PASSWORD_MAP_FILE = 'passwordsFile'; /** * The file name. If specified, Tika can take this into account while guessing the MIME type. */ const RESOURCE_NAME = 'resource.name'; /** * The password for this resource. Will be used instead of the rule based password lookup mechanisms. */ const RESOURCE_PASSWORD = 'resource.password'; /** * Tika config path */ const TIKE_CONFIG = 'tika.config'; /** * If specified, the prefix will be prepended to all Metadata, such that it would be possible to setup a * dynamic field to automatically capture it. */ const UNKNOWN_FIELD_PREFIX = 'uprefix'; /** * Restrict the extracted parts of a document to be indexed by passing in an XPath expression. */ const XPATH_EXPRESSION = 'xpath'; /** * Mapping Tika metadata to Solr fields. (parameter prefix) */ const FIELD_MAPPING_PREFIX = 'fmap.'; /** * Boost value for the name of the field. (parameter prefix) */ const FIELD_BOOST_PREFIX = 'boost.'; /** * Pass in literal values to be added to the document, as is. (parameter prefix) */ const LITERALS_PREFIX = 'literal.'; private function __construct(); /** * @param string $filename * @param SolrModifiableParams $params * * @return SolrExtractRequest */ public static function createFromFile($filename, SolrModifiableParams $params); /** * Create request from a binary stream * * @param string $content * @param string $contentType * @param SolrModifiableParams $params * * @return SolrExtractRequest */ public static function createFromStream($content, $contentType, SolrModifiableParams $params); } /** * * @author Israel Ekpo */ class SolrResponse { /* Constants */ const PARSE_SOLR_OBJ = 0 ; const PARSE_SOLR_DOC = 1 ; /* Properties */ protected $http_status; protected $parser_mode; protected $success; protected $http_status_message; protected $http_request_url; protected $http_raw_request_headers; protected $http_raw_request; protected $http_raw_response_headers; protected $http_raw_response; protected $http_digested_response; /* Methods */ public function __construct() {} public function __destruct() {} /** * Returns the XML response as serialized PHP data * * @return string * @link https://www.php.net/manual/en/solrresponse.getdigestedresponse.php */ public function getDigestedResponse() {} /** * @return int * @link https://www.php.net/manual/en/solrresponse.gethttpstatus.php */ public function getHttpStatus() {} /** * @return string * @link https://www.php.net/manual/en/solrresponse.gethttpstatusmessage.php */ public function getHttpStatusMessage() {} /** * @return string * @link https://www.php.net/manual/en/solrresponse.getrawrequest.php */ public function getRawRequest() {} /** * @return string * @link https://www.php.net/manual/en/solrresponse.getrawrequestheaders.php */ public function getRawRequestHeaders() {} /** * @return string * @link https://www.php.net/manual/en/solrresponse.getrawresponse.php */ public function getRawResponse() {} /** * Returns the raw response headers from the server * * @return string * @link https://www.php.net/manual/en/solrresponse.getrawresponseheaders.php */ public function getRawResponseHeaders() {} /** * Returns the full URL the request was sent to * * @return string * @link https://www.php.net/manual/en/solrresponse.getrequesturl.php */ public function getRequestUrl() {} /** * Returns a SolrObject representing the XML response from the server * * @return SolrObject * @link https://www.php.net/manual/en/solrresponse.getresponse.php */ public function getResponse() {} /** * @param int $parser_mode * @return bool * @link https://www.php.net/manual/en/solrresponse.setparsemode.php */ public function setParseMode($parser_mode) {} /** * @return bool * @link https://www.php.net/manual/en/solrresponse.success.php */ public function success() {} } /** * * @author Israel Ekpo */ class SolrQueryResponse extends SolrResponse { } /** * * @author Israel Ekpo */ class SolrUpdateResponse extends SolrResponse { } /** * * @author Israel Ekpo */ class SolrPingResponse extends SolrResponse { } /** * * @author Israel Ekpo */ class SolrGenericResponse extends SolrResponse { } /** * * @author Israel Ekpo */ abstract class SolrParams implements Serializable { /** * This is an alias for SolrParams::addParam * * @param $name * @param $value * @return SolrParams */ public function add($name, $value) {} /** * Adds a parameter to the object * * @param string $name Param name * @param string $value Param value * @return SolrParams */ public function addParam($name, $value) {} /** * This is an alias for SolrParams::getParam * * Returns an array or string depending on the type of parameter * * @param string $param_name * * @return mixed */ public function get($param_name) {} /** * Returns an array or string depending on the type of parameter * * @param string $param_name * * @return mixed */ public function getParam($param_name) {} /** * Returns an array of non URL-encoded parameters * * @return array */ public function getParams() {} /** * Returns an array on URL-encoded parameters * * @return array */ public function getPreparedParams() {} /** * Used for custom serialization * * @return string */ public function serialize() {} /** * * @param $name * @param $value * @return SolrParams */ public function set($name, $value) {} /** * * @param $name * @param $value * @return SolrParams */ public function setParam($name, $value) {} /** * Returns all the name-value pair parameters in the object * * @param bool $url_encode Whether to return URL-encoded values * * @return string */ public function toString($url_encode) {} /** * Used for Custom serialization * * @param string $serialized * @return void */ public function unserialize($serialized) {} } /** * Represents a collection of name-value pairs sent to the Solr server during a request * * @author Israel Ekpo */ class SolrModifiableParams extends SolrParams implements Serializable { public function __construct() {} public function __destruct() {} /** * This is an alias for SolrParams::addParam * * @param $name * @param $value * @return SolrModifiableParams */ public function add($name, $value) {} /** * Adds a parameter to the object * * @param string $name Param name * @param string $value Param value * @return SolrParams */ public function addParam($name, $value) {} /** * Returns an array on URL-encoded parameters * * @return array */ public function getPreparedParams() {} /** * Used for custom serialization * * @return string */ public function serialize() {} /** * * @param $name * @param $value * @return SolrModifiableParams */ public function set($name, $value) {} /** * * @param $name * @param $value * @return SolrModifiableParams */ public function setParam($name, $value) {} /** * Returns all the name-value pair parameters in the object * * @param bool $url_encode Whether to return URL-encoded values * * @return string */ public function toString($url_encode) {} /** * Used for Custom serialization * * @param string $serialized * @return void */ public function unserialize($serialized) {} } /** * * @author Israel Ekpo * @author Omar Shaban */ class SolrQuery extends SolrModifiableParams implements Serializable { /* Constants */ const ORDER_ASC = 0 ; const ORDER_DESC = 1 ; const FACET_SORT_INDEX = 0 ; const FACET_SORT_COUNT = 1 ; const TERMS_SORT_INDEX = 0 ; const TERMS_SORT_COUNT = 1 ; /** * * @param string $q Query string */ public function __construct($q = null) {} public function __destruct() {} /** * This is an alias for SolrParams::addParam * * @param $name * @param $value * @return SolrQuery */ public function add($name, $value) {} /** * Adds a parameter to the object * * @param string $name Param name * @param string $value Param value * @return SolrParams */ public function addParam($name, $value) {} /** * This is an alias for SolrParams::getParam * * Returns an array or string depending on the type of parameter * * @param string $param_name * * @return mixed */ public function get($param_name) {} /** * Returns an array or string depending on the type of parameter * * @param string $param_name * * @return mixed */ public function getParam($param_name) {} /** * Returns an array of non URL-encoded parameters * * @return array */ public function getParams() {} /** * Returns an array on URL-encoded parameters * * @return array */ public function getPreparedParams() {} /** * Used for custom serialization * * @return string */ public function serialize() {} /** * * @param $name * @param $value * @return SolrQuery */ public function set($name, $value) {} /** * * @param $name * @param $value * @return SolrQuery */ public function setParam($name, $value) {} /** * Returns all the name-value pair parameters in the object * * @param bool $url_encode Whether to return URL-encoded values * * @return string */ public function toString($url_encode) {} /** * Used for Custom serialization * * @param string $serialized * @return void */ public function unserialize($serialized) {} /** * @param string $dateField * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfacetdatefield.php */ public function addFacetDateField($dateField) {} /** * Adds another facet.date.other parameter * * @param string $value * @param string $field_override [optional] Field name for the override * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfacetdateother.php */ public function addFacetDateOther($value, $field_override = null) {} /** * Adds another field to the facet * * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfacetfield.php */ public function addFacetField($field) {} /** * @param string $facetQuery * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfacetquery.php */ public function addFacetQuery($facetQuery) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfield.php */ public function addField($field) {} /** * @param string $fq * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addfilterquery.php */ public function addFilterQuery($fq) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addhighlightfield.php */ public function addHighlightField($field) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addmltfield.php */ public function addMltField($field) {} /** * @param string $field * @param float $boost * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addmltqueryfield.php */ public function addMltQueryField($field, $boost) {} /** * @param string $field * @param int $order * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addsortfield.php */ public function addSortField($field, $order) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addstatsfacet.php */ public function addStatsFacet($field) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.addstatsfield.php */ public function addStatsField($field) {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.getfacet.php */ public function getFacet() {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.getfacetdateend.php */ public function getFacetDateEnd($field_override = null) {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getfacetdatefields.php */ public function getFacetDateFields() {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.getfacetdategap.php */ public function getFacetDateGap($field_override = null) {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.getfacetdatehardend.php */ public function getFacetDateHardEnd($field_override = null) {} /** * @param string $field_override [optional] * @return array * @link https://www.php.net/manual/en/solrquery.getfacetdateother.php */ public function getFacetDateOther($field_override = null) {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.getfacetdatestart.php */ public function getFacetDateStart($field_override = null) {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getfacetfields.php */ public function getFacetFields() {} /** * @param string $field_override [optional] * @return int * @link https://www.php.net/manual/en/solrquery.getfacetlimit.php */ public function getFacetLimit($field_override) {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.getfacetmethod.php */ public function getFacetMethod($field_override) {} /** * @param string $field_override [optional] * @return int * @link https://www.php.net/manual/en/solrquery.getfacetmincount.php */ public function getFacetMinCount($field_override) {} /** * @param string $field_override [optional] * * @return bool * @link https://www.php.net/manual/en/solrquery.getfacetmissing.php */ public function getFacetMissing($field_override) {} /** * @param string $field_override [optional] * * @return int * @link https://www.php.net/manual/en/solrquery.getfacetoffset.php */ public function getFacetOffset($field_override) {} /** * @param string $field_override [optional] * * @return string * @link https://www.php.net/manual/en/solrquery.getfacetprefix.php */ public function getFacetPrefix($field_override) {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getfacetqueries.php */ public function getFacetQueries() {} /** * @param string $field_override [optional] * * @return int * @link https://www.php.net/manual/en/solrquery.getfacetsort.php */ public function getFacetSort($field_override) {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getfields.php */ public function getFields() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getfilterqueries.php */ public function getFilterQueries() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gethighlight.php */ public function getHighlight() {} /** * Returns hl.q param * * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightquery.php */ public function getHighlightQuery() {} /** * @param string $field_override [optional] * * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightalternatefield.php */ public function getHighlightAlternateField($field_override = null) {} /** * @return array * @link https://www.php.net/manual/en/solrquery.gethighlightfields.php */ public function getHighlightFields() {} /** * @param string $field_override [optional] * * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightformatter.php */ public function getHighlightFormatter($field_override = null) {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightfragmenter.php */ public function getHighlightFragmenter($field_override = null) {} /** * @param string $field_override [optional] * @return int * @link https://www.php.net/manual/en/solrquery.gethighlightfragsize.php */ public function getHighlightFragsize($field_override = null) {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gethighlighthighlightmultiterm.php */ public function getHighlightHighlightMultiTerm() {} /** * @param string $field_override [optional] * @return int * @link https://www.php.net/manual/en/solrquery.gethighlightmaxalternatefieldlength.php */ public function getHighlightMaxAlternateFieldLength($field_override = null) {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gethighlightmaxanalyzedchars.php */ public function getHighlightMaxAnalyzedChars() {} /** * @param string $field_override [optional] * @return bool * @link https://www.php.net/manual/en/solrquery.gethighlightmergecontiguous.php */ public function getHighlightMergeContiguous($field_override = null) {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gethighlightregexmaxanalyzedchars.php */ public function getHighlightRegexMaxAnalyzedChars() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightregexpattern.php */ public function getHighlightRegexPattern() {} /** * @return float * @link https://www.php.net/manual/en/solrquery.gethighlightregexslop.php */ public function getHighlightRegexSlop() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gethighlightrequirefieldmatch.php */ public function getHighlightRequireFieldMatch() {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightsimplepost.php */ public function getHighlightSimplePost($field_override = null) {} /** * @param string $field_override [optional] * @return string * @link https://www.php.net/manual/en/solrquery.gethighlightsimplepre.php */ public function getHighlightSimplePre($field_override = null) {} /** * @param string $field_override [optional] * @return int * @link https://www.php.net/manual/en/solrquery.gethighlightsnippets.php */ public function getHighlightSnippets($field_override = null) {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gethighlightusephrasehighlighter.php */ public function getHighlightUsePhraseHighlighter() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.getmlt.php */ public function getMlt() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.getmltboost.php */ public function getMltBoost() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltcount.php */ public function getMltCount() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getmltfields.php */ public function getMltFields() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltmaxnumqueryterms.php */ public function getMltMaxNumQueryTerms() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltmaxnumtokens.php */ public function getMltMaxNumTokens() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltmaxwordlength.php */ public function getMltMaxWordLength() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltmindocfrequency.php */ public function getMltMinDocFrequency() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltmintermfrequency.php */ public function getMltMinTermFrequency() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getmltminwordlength.php */ public function getMltMinWordLength() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getmltqueryfields.php */ public function getMltQueryFields() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.getquery.php */ public function getQuery() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getrows.php */ public function getRows() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getsortfields.php */ public function getSortFields() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.getstart.php */ public function getStart() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.getstats.php */ public function getStats() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getstatsfacets.php */ public function getStatsFacets() {} /** * @return array * @link https://www.php.net/manual/en/solrquery.getstatsfields.php */ public function getStatsFields() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.getterms.php */ public function getTerms() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.gettermsfield.php */ public function getTermsField() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gettermsincludelowerbound.php */ public function getTermsIncludeLowerBound() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gettermsincludeupperbound.php */ public function getTermsIncludeUpperBound() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gettermslimit.php */ public function getTermsLimit() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.gettermslowerbound.php */ public function getTermsLowerBound() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gettermsmaxcount.php */ public function getTermsMaxCount() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gettermsmincount.php */ public function getTermsMinCount() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.gettermsprefix.php */ public function getTermsPrefix() {} /** * @return bool * @link https://www.php.net/manual/en/solrquery.gettermsreturnraw.php */ public function getTermsReturnRaw() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gettermssort.php */ public function getTermsSort() {} /** * @return string * @link https://www.php.net/manual/en/solrquery.gettermsupperbound.php */ public function getTermsUpperBound() {} /** * @return int * @link https://www.php.net/manual/en/solrquery.gettimeallowed.php */ public function getTimeAllowed() {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefacetdatefield.php */ public function removeFacetDateField($field) {} /** * @param string $value * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefacetdateother.php */ public function removeFacetDateOther($value, $field_override) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefacetfield.php */ public function removeFacetField($field) {} /** * @param string $value * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefacetquery.php */ public function removeFacetQuery($value) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefield.php */ public function removeField($field) {} /** * @param string $fq * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removefilterquery.php */ public function removeFilterQuery($fq) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removehighlightfield.php */ public function removeHighlightField($field) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removemltfield.php */ public function removeMltField($field) {} /** * @param string $queryField * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removemltqueryfield.php */ public function removeMltQueryField($queryField) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removesortfield.php */ public function removeSortField($field) {} /** * @param string $value * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removestatsfacet.php */ public function removeStatsFacet($value) {} /** * @param string $field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.removestatsfield.php */ public function removeStatsField($field) {} /** * @param bool $flag * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setechohandler.php */ public function setEchoHandler($flag) {} /** * @param string $type * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setechoparams.php */ public function setEchoParams($type) {} /** * @param string $query * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setexplainother.php */ public function setExplainOther($query) {} /** * @param bool $flag * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacet.php */ public function setFacet($flag) {} /** * @param string $value * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetdateend.php */ public function setFacetDateEnd($value, $field_override) {} /** * @param string $value * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetdategap.php */ public function setFacetDateGap($value, $field_override) {} /** * @param bool $value * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetdatehardend.php */ public function setFacetDateHardEnd($value, $field_override) {} /** * @param string $value * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetdatestart.php */ public function setFacetDateStart($value, $field_override) {} /** * @param int $frequency * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetenumcachemindefaultfrequency.php */ public function setFacetEnumCacheMinDefaultFrequency($frequency, $field_override = null) {} /** * @param int $limit * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetlimit.php */ public function setFacetLimit($limit, $field_override = null) {} /** * @param string $method * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetmethod.php */ public function setFacetMethod($method, $field_override = null) {} /** * @param int $mincount * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetmincount.php */ public function setFacetMinCount($mincount, $field_override = null) {} /** * @param bool $flag * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetmissing.php */ public function setFacetMissing($flag, $field_override = null) {} /** * @param int $offset * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetoffset.php */ public function setFacetOffset($offset, $field_override = null) {} /** * @param string $prefix * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetprefix.php */ public function setFacetPrefix($prefix, $field_override = null) {} /** * @param int $facetSort * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.setfacetsort.php */ public function setFacetSort($facetSort, $field_override = null) {} /** * Enables or disables highlighting * * @param bool $flag * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlight.php */ public function setHighlight($flag) {} /** * A query to use for highlighting. This parameter allows you to highlight different terms than those being used to retrieve documents. * * @param string $q * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightquery.php */ public function setHighlightQuery($q) {} /** * Specifies the highlithing backup field to use * * @param string $field * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightalternatefield.php */ public function setHighlightAlternateField($field, $field_override = null) {} /** * Specify a formatter for the highlight output * * @param string $formatter * @param string $field_override [optional] * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightformatter.php */ public function setHighlightFormatter($formatter, $field_override) {} /** * Sets a text snippet generator for highlighted text * * @param string $fragmenter * @param string $field_override * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightfragmenter.php */ public function setHighlightFragmenter($fragmenter, $field_override = null) {} /** * The size of fragments to consider for highlighting * * @param int $size Size (in characters) of fragments to consider for highlighting * @param string $field_override Name of the field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightfragsize.php */ public function setHighlightFragsize($size, $field_override = null) {} /** * @param bool $flag * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlighthighlightmultiterm.php */ public function setHighlightHighlightMultiTerm($flag) {} /** * Sets the maximum number of characters of the field to return * * @param int $fieldLength Length of the field * @param string $field_override Name of the field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightmaxalternatefieldlength.php */ public function setHighlightMaxAlternateFieldLength($fieldLength, $field_override = null) {} /** * Specifies the number of characters into a document to look for suitable snippets * * @param int $value The number of characters into a document to look for suitable snippets * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightmaxanalyzedchars.php */ public function setHighlightMaxAnalyzedChars($value) {} /** * Sets whether or not to collapse contiguous fragments into a single fragment * * @param bool $flag Whether or not to collapse contiguous fragments into a single fragment * @param null $field_override * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightmergecontiguous.php */ public function setHighlightMergeContiguous($flag, $field_override = null) {} /** * Specify the maximum number of characters to analyze * * @param int $maxAnalyzedChars * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightregexmaxanalyzedchars.php */ public function setHighlightRegexMaxAnalyzedChars($maxAnalyzedChars) {} /** * Specify the regular expression for fragmenting * * @param string $value The regular expression for fragmenting. This could be used to extract sentences * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightregexpattern.php */ public function setHighlightRegexPattern($value) {} /** * Sets the factor by which the regex fragmenter can stray from the ideal fragment size * * @param float $factor The factor by which the regex fragmenter can stray from the ideal fragment size * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightregexslop.php */ public function setHighlightRegexSlop($factor) {} /** * Sets whether field matching is required when highlighting * * @param bool $flag If TRUE, then a field will only be highlighted if the query * matched in this particular field. This will only work if * SolrQuery::setHighlightUsePhraseHighlighter() was set to TRUE * * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightrequirefieldmatch.php */ public function setHighlightRequireFieldMatch($flag) {} /** * Sets the text which appears after a highlighted term * * @param string $simplePost * @param string $field_override [optional] Name of the field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightsimplepost.php */ public function setHighlightSimplePost($simplePost, $field_override = null) {} /** * Sets the text which appears before a highlighted term * * @param string $simplePre * @param string $field_override [optional] Name of the field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightsimplepre.php */ public function setHighlightSimplePre($simplePre, $field_override = null) {} /** * @param int $value Maximum number of highlighted snippets to generate per field * @param string $field_override [optional] Name of the field * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightsnippets.php */ public function setHighlightSnippets($value, $field_override = null) {} /** * Whether to highlight phrase terms only when they appear within the query phrase * * @param bool $flag * @return SolrQuery * @link https://www.php.net/manual/en/solrquery.sethighlightusephrasehighlighter.php */ public function setHighlightUsePhraseHighlighter($flag) {} /** * Enables or disables moreLikeThis * * @param bool $flag TRUE enables it and FALSE turns it off * * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmlt.php */ public function setMlt($flag) {} /** * Set if the query will be boosted by the interesting term relevance * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltboost.php */ public function setMltBoost($flag) {} /** * Set the number of similar documents to return for each result * * @param int $count * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltcount.php */ public function setMltCount($count) {} /** * Sets the maximum number of query terms included * * @param int $value The maximum number of query terms that will be included in any generated query * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltmaxnumqueryterms.php */ public function setMltMaxNumQueryTerms($value) {} /** * Specifies the maximum number of tokens to parse * * @param int $value The maximum number of tokens to parse * * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltmaxnumtokens.php */ public function setMltMaxNumTokens($value) {} /** * Sets the maximum word length * * @param int $maxWordLength The maximum word length above which words will be ignored * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltmaxwordlength.php */ public function setMltMaxWordLength($maxWordLength) {} /** * The frequency at which words will be ignored which do not occur in at least this many docs * * @param int $minDocFrequency * * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltmindocfrequency.php */ public function setMltMinDocFrequency($minDocFrequency) {} /** * Sets the frequency below which terms will be ignored in the source docs * * @param int $minTermFrequency * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltmintermfrequency.php */ public function setMltMinTermFrequency($minTermFrequency) {} /** * Sets the minimum word length below which words will be ignored * * @param int $minWordLength * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setmltminwordlength.php */ public function setMltMinWordLength($minWordLength) {} /** * Exclude the header from the returned results * * @param bool $flag TRUE excludes the header from the result * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setomitheader.php */ public function setOmitHeader($flag) {} /** * Sets the search query * * @param string $q * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setquery.php */ public function setQuery($q) {} /** * Specifies the maximum number of rows to return in the result * * @param int $rows * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setrows.php */ public function setRows($rows) {} /** * Flag to show debug information * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setshowdebuginfo.php */ public function setShowDebugInfo($flag) {} /** * Specifies the number of rows to skip * * @param int $start * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setstart.php */ public function setStart($start) {} /** * Enables or disables the Stats component * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setstats.php */ public function setStats($flag) {} /** * Enables or disables the TermsComponent * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.setterms.php */ public function setTerms($flag) {} /** * Sets the name of the field to get the Terms from * * @param string $fieldname * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsfield.php */ public function setTermsField($fieldname) {} /** * Sets whether to include the lower bound term in the result set * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsincludelowerbound.php */ public function setTermsIncludeLowerBound($flag) {} /** * Include the upper bound term in the result set * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsincludeupperbound.php */ public function setTermsIncludeUpperBound($flag) {} /** * Sets the maximum number of terms to return * * @param int $limit * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermslimit.php */ public function setTermsLimit($limit) {} /** * Specifies the Term to start from * * @param string $lowerBound * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermslowerbound.php */ public function setTermsLowerBound($lowerBound) {} /** * Sets the maximum document frequency * * @param int $frequency * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsmaxcount.php */ public function setTermsMaxCount($frequency) {} /** * Sets the minimum document frequency * * @param int $frequency * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsmincount.php */ public function setTermsMinCount($frequency) {} /** * Restrict matches to terms that start with the prefix * * @param string $prefix * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsprefix.php */ public function setTermsPrefix($prefix) {} /** * Return the raw characters of the indexed term * * @param bool $flag * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsreturnraw.php */ public function setTermsReturnRaw($flag) {} /** * Specifies how to sort the returned terms * * @param int $sortType If SolrQuery::TERMS_SORT_COUNT, sorts the terms by the term frequency (highest count first). If SolrQuery::TERMS_SORT_INDEX, returns the terms in index order * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermssort.php */ public function setTermsSort($sortType) {} /** * Sets the term to stop at * * @param string $upperBound * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settermsupperbound.php */ public function setTermsUpperBound($upperBound) {} /** * The time allowed for search to finish * * @param int $timeAllowed Time in milliseconds * @return SolrQuery Returns the current SolrQuery object * @link https://www.php.net/manual/en/solrquery.settimeallowed.php */ public function setTimeAllowed($timeAllowed) {} /** * Collapses the result set to a single document per group before it forwards * the result set to the rest of the search components. * So all downstream components (faceting, highlighting, etc...) will work with * the collapsed result set. * * A collapse function object is passed to collapse the query * * @param SolrCollapseFunction $function * @throws SolrMissingMandatoryParameterException * @return SolrQuery */ public function collapse(SolrCollapseFunction $function) {} /** * Enable/Disable result grouping (group parameter) * * @param bool $value * @return SolrQuery */ public function setGroup($value) {} /** * Returns true if grouping is enabled * @return bool */ public function getGroup() {} /** * The name of the field by which to group results. The field must be single-valued, and either be indexed * or a field type that has a value source and works in a function query, * such as ExternalFileField. It must also be a string-based field, such as StrField or TextField * * @param string $value * @return SolrQuery */ public function addGroupField($value) {} /** * Returns group fields (group.field parameter values) * * @return array */ public function getGroupFields() {} /** * Adds a group function (group.func parameter) * Allows grouping results based on the unique values of a function query. * * @param string $value * @return SolrQuery */ public function addGroupFunction($value) {} /** * Returns group functions (group.func parameter values) * * @return array */ public function getGroupFunctions () {} /** * Adds query to the group.query parameter * Allows grouping of documents that match the given query. * * @param string $value * @return SolrQuery */ public function addGroupQuery($value) {} /** * Returns all the group.query parameter values * * @return array */ public function getGroupQueries() {} /** * Specifies the number of results to return for each group. The server default value is 1. * * @param integer $value * @return SolrQuery */ public function setGroupLimit($value) {} /** * Returns the group.limit value * @return integer */ public function getGroupLimit() {} /** * Sets the group.offset parameter. * @param integer $offset * @return SolrQuery */ public function setGroupOffset($offset) {} /** * Returns the group.offset value * * @return integer */ public function getGroupOffset() {} /** * Adds a group sort field (group.sort parameter). * * @param string $sort * @param integer $direction * @return SolrQuery */ public function addGroupSortField($sort, $direction) {} /** * Returns the group.sort value * * @return array */ public function getGroupSortFields() {} /** * Sets the group.format parameter. * If this parameter is set to simple, the grouped documents are presented in a single flat list, and the start and * rows parameters affect the numbers of documents instead of groups. * * @param string $value * @return SolrQuery */ public function setGroupFormat($value) {} /** * Returns the group.format value * * @return string */ public function getGroupFormat() {} /** * If true, the result of the first field grouping command is used as the main result list in the response, using group.format=simple. * * @param bool $value * @return SolrQuery */ public function setGroupMain($value) {} /** * Returns the group.main value * * @return bool */ public function getGroupMain() {} /** * If true, Solr includes the number of groups that have matched the query in the results. * The default value is false. (group.ngroups parameter) * * @param bool $value * @return SolrQuery */ public function setGroupNGroups($value) {} /** * Returns the group.ngroups value * @return bool */ public function getGroupNGroups() {} /** * If true, facet counts are based on the most relevant document of each group matching the query. * The server default value is false. * group.truncate parameter * * @param bool $value * @return SolrQuery */ public function setGroupTruncate($value) {} /** * Returns the group.truncate value * * @return bool */ public function getGroupTruncate() {} /** * Determines whether to compute grouped facets for the field facets specified in facet.field parameters. * Grouped facets are computed based on the first specified group. * group.facet parameter * * @param bool $value * @return SolrQuery */ public function setGroupFacet($value) {} /** * Returns the group.facet parameter value * * @return bool */ public function getGroupFacet() {} /** * Setting this parameter to a number greater than 0 enables caching for result grouping. * Result Grouping executes two searches; this option caches the second search. The default value is 0. * * Testing has shown that group caching only improves search time with Boolean, wildcard, and fuzzy queries. For simple queries like term or "match all" queries, group caching degrades performance. * group.cache.percent parameter * * @param integer * @throws SolrIllegalArgumentException * @return SolrQuery */ public function setGroupCachePercent($value) {} /** * Returns the group cache percent group.cache.percent value * * @return integer */ public function getGroupCachePercent() {} /** * Sets the expand parameter. This enables or disables group expanding. * * @param bool $value * @return SolrQuery */ public function setExpand($value) {} /** * Returns true if group expanding is enabled * @return bool */ public function getExpand() {} /** * Orders the documents within the expanded groups (expand.sort parameter). * * @param string $sort * @param integer $direction defaults to DESC * @return SolrQuery */ public function addExpandSortField($sort, $direction = SolrQuery::ORDER_DESC) {} /** * Removes an expand sort field from the expand.sort parameter. * * @param string $field * @return SolrQuery */ public function removeExpandSortField($field) {} /** * Returns an array of fields * * @return array */ public function getExpandSortFields() {} /** * Sets the number of rows to display in each group (expand.rows). Server Default 5 * @param integer $rows * @return SolrQuery */ public function setExpandRows($rows) {} /** * Returns The number of rows to display in each group (expand.rows) * * @return integer */ public function getExpandRows() {} /** * Sets the expand.q parameter. Overrides the main q parameter, * determines which documents to include in the main group. * * @param string $q * @return SolrQuery */ public function setExpandQuery($q) {} /** * Returns the expand query expand.q parameter * * @return string */ public function getExpandQuery() {} /** * Overrides main fq's, determines which documents to include in the main group. * * @param string $fq * @return SolrQuery */ public function addExpandFilterQuery($fq) {} /** * Removes an expand filter query. * * @param string $fq * @return SolrQuery */ public function removeExpandFilterQuery($fq) {} /** * Returns the expand filter queries * * @return array */ public function getExpandFilterQueries() {} } /** * SolrDisMaxQuery Makes use of the Solr's DisMax query parser * and eases the use of it using class methods * * @author Omar Shaban */ class SolrDisMaxQuery extends SolrQuery { public function __construct($q = null) {} /** * Switch Query Parser to dismax */ public function useDisMaxQueryParser() {} /** * Switch Query Parser to edismax */ public function useEDisMaxQueryParser() {} /** * Set Query Alternate (q.alt parameter) * When the main q parameter is not specified or is blank. The q.alt parameter is used * * @param string $q */ public function setQueryAlt($q) {} /** * Add a query field with optional boost (qf parameter) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Theqf%28QueryFields%29Parameter * @param string $field * @param string $boost * @return SolrDisMaxQuery */ public function addQueryField ($field, $boost=null) {} /** * Remove query field (qf parameter) * * @param string $field * @return SolrDisMaxQuery */ public function removeQueryField($field) {} /** * Add a phrase field (pf parameter) * output format: field~slop^boost * * Sample output: title~2^4 * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thepf%28PhraseFields%29Parameter * @param string $field * @param float $boost * @param integer $slop * @return SolrDisMaxQuery */ public function addPhraseField($field, $boost, $slop=null) {} /** * Removes a phrase field (pf parameter) * @param string $field * @return SolrDisMaxQuery */ public function removePhraseField($field) {} /** * Set Phrase Fields (pf parameter) * @param string $fields * @return SolrDisMaxQuery */ public function setPhraseFields($fields) {} /** * Set Phrase Slop (ps parameter) * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Theps%28PhraseSlop%29Parameter * @param integer $slop * @return SolrDisMaxQuery */ public function setPhraseSlop($slop) {} /** * Set Query Phrase Slop (qs parameter) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Theqs%28QueryPhraseSlop%29Parameter * @param integer $slop * @return SolrDisMaxQuery */ public function setQueryPhraseSlop($slop) {} /** * Add a boost query field with value and boost * Sample Output: type:lucene^2 * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thebq%28BoostQuery%29Parameter * * @param string $field * @param string $value * @param string $boost * @return SolrDisMaxQuery */ public function addBoostQuery($field, $value, $boost=null) {} /** * Remove a boost query field * * @param string $field * @return SolrDisMaxQuery */ public function removeBoostQuery($field) {} /** * Sets Boost Query Parameter (bq) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thebq%28BoostQuery%29Parameter * * @param string $q * @return SolrDisMaxQuery * */ public function setBoostQuery($q) {} /** * Sets the boost function (bf) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thebf%28BoostFunctions%29Parameter * * @param string $function * @return SolrDisMaxQuery */ public function setBoostFunction($function) {} /** * Set Tie Minimum *Should* Match parameter (mm) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Themm%28MinimumShouldMatch%29Parameter * * @param mixed $value * @return SolrDisMaxQuery */ public function setMinimumMatch($value) {} /** * Set Tie Breaker parameter (tie) * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thetie%28TieBreaker%29Parameter * @param float $tieBreaker * @return SolrDisMaxQuery */ public function setTieBreaker($tieBreaker) {} /** * Set Bigram Phrase Slop (ps2 parameter) * * @see https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser * * @param integer $slop * @return SolrDisMaxQuery */ public function setBigramPhraseSlop($slop) {} /** * Add a phrase Bigram field (pf2 parameter) * output format: field~slop^boost * * Sample output: title~2^4 * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thepf%28PhraseFields%29Parameter * * @param string $field * @param float $boost * @param integer $slop * @return SolrDisMaxQuery */ public function addBigramPhraseField($field, $boost, $slop=null) {} /** * Removes phrase bigram field (pf2 parameter) * * @param string $field * @return SolrDisMaxQuery */ public function removeBigramPhraseField($field) {} /** * Sets pf2 parameter * * @param string $fields * @return SolrDisMaxQuery */ public function setBigramPhraseFields($fields) {} /** * Add a Trigram Phrase Field (pf3 parameter) * output format: field~slop^boost * * Sample output: title~2^4 * * @see https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Thepf%28PhraseFields%29Parameter * @param string $field * @param float $boost * @param integer $slop * @return SolrDisMaxQuery */ public function addTrigramPhraseField($field, $boost, $slop=null) {} /** * Removes a Trigram Phrase Field (pf3 parameter) * @param string $field * @return SolrDisMaxQuery */ public function removeTrigramPhraseField($field) {} /** * Sets pf3 parameter * * @param string $fields * @return SolrDisMaxQuery */ public function setTrigramPhraseFields($fields) {} /** * Set Trigram Phrase Slop (ps3 parameter) * * @see https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser * * @param integer $slop * @return SolrDisMaxQuery */ public function setTrigramPhraseSlop ($slop) {} /** * Adds a field to User Fields Parameter (uf) * * Specifies which schema fields the end user shall be allowed to query for explicitly. * This parameter supports wildcards. * * @param string $field * @return SolrDisMaxQuery */ public function addUserField($field){} /** * Removes a field from User Fields Parameter (uf) * * @param string $field * @return SolrDisMaxQuery */ public function removeUserField($field){} /** * Sets User Fields parameter (uf) * * Specifies which schema fields the end user shall be allowed to query for explicitly. * This parameter supports wildcards. * * @param string $fields * @return SolrDisMaxQuery */ public function setUserFields($fields){} } /** * Collapses the result set to a single document per group before it forwards * the result set to the rest of the search components. * So all downstream components (faceting, highlighting, etc...) will work with * the collapsed result set. * * @see https://cwiki.apache.org/confluence/display/solr/Collapse+and+Expand+Results * * @author Omar Shaban */ class SolrCollapseFunction { const NULLPOLICY_IGNORE = 'ignore'; const NULLPOLICY_EXPAND = 'expand'; const NULLPOLICY_COLLAPSE = 'collapse'; /** * Accepts the field to collapse on. * * @param string $field */ public function __construct($field = null) {} /** * Set the field that is being collapsed on. * In order to collapse a result. The field type must be a single valued String, Int or Float. * * @param string $field * @return SolrCollapseFunction */ public function setField($field) {} /** * Get the field that is being collapsed on. * * @return string */ public function getField() {} /** * Selects the group heads by the max value of a numeric field or function query. * * @param string $max * @return SolrCollapseFunction */ public function setMax($max) {} /** * Get max * * @return string */ public function getMax() {} /** * Sets the initial size of the collapse data structures when collapsing on a numeric field only. * * @param string $min * @return SolrCollapseFunction */ public function setMin($min) {} /** * Return min parameter * * @return string */ public function getMin() {} /** * Currently there is only one hint available "top_fc", which stands for top level FieldCache. * * @param string $hint * @return SolrCollapseFunction */ public function setHint($hint) {} /** * Get collapse hint. * * @return string */ public function getHint() {} /** * Sets the NULL Policy. * Accepts ignore, expand, or collapse. * * @param string $policy * @return SolrCollapseFunction */ public function setNullPolicy($policy) {} /** * Returns null policy * * @return string */ public function getNullPolicy() {} /** * Sets the initial size of the collapse data structures when collapsing on a numeric field only. * * @param integer $size * @return SolrCollapseFunction */ public function setSize($size) {} /** * Gets the initial size of the collapse data structures when collapsing on a numeric field only. * * @return integer */ public function getSize() {} /** * A string representation (Solr LocalParams) of the function. * @return string */ public function __toString() {} } /* phpdoc -f documentation.php --title Solr --parseprivate on --defaultpackagename Solr --output "HTML:frames:phphtmllib" -t solr_phpdoc */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: fdm=marker * vim: noet sw=4 ts=4 */ solr-2.8.1/config.m40000644000175000017500000000531415001737315013141 0ustar biggibiggidnl config.m4 for the solr extension PHP_ARG_ENABLE([solr], [whether to enable the Solr extension], [AS_HELP_STRING([--enable-solr], [Enable solr support])]) PHP_ARG_ENABLE([solr-debug], [whether to compile with solr in verbose mode], [AS_HELP_STRING([--enable-solr-debug], [Compile with solr in verbose mode])], [no], [no]) PHP_ARG_ENABLE([coverage], [whether to enable code coverage], [AS_HELP_STRING([--enable-coverage], [Enable developer code coverage information])],, [no]) dnl Setting up the apache Solr extension if test "$PHP_SOLR" != "no"; then PKG_CHECK_MODULES([CURL], [libcurl >= 7.15.5]) PHP_CHECK_LIBRARY(curl, curl_easy_perform, [ AC_DEFINE(HAVE_CURL, 1, [ ]) ],[ AC_MSG_ERROR(There is something wrong. Please check config.log for more information.) ],[ $CURL_LIBS ]) PHP_EVAL_INCLINE($CURL_CFLAGS) PHP_EVAL_LIBLINE($CURL_LIBS, SOLR_SHARED_LIBADD) if test "$PHP_LIBXML" = "no"; then AC_MSG_ERROR([Solr extension requires LIBXML extension, add --enable-libxml]) fi AC_MSG_CHECKING(for JSON) if test -f "$phpincludedir/ext/json/php_json.h" || test "$HAVE_JSON" != "no"; then AC_DEFINE(HAVE_JSON, 1, [JSON support]) AC_MSG_RESULT(Yes) else AC_MSG_ERROR([Solr extension requires json or jsonc support]) fi PHP_SETUP_LIBXML(SOLR_SHARED_LIBADD) AC_DEFINE(HAVE_SOLR, 1, [Setting the value of HAVE_SOLR to 1 ]) if test "$PHP_SOLR_DEBUG" != "no"; then AC_DEFINE(SOLR_DEBUG, 1, [Setting the value of SOLR_DEBUG to 1 ]) else AC_DEFINE(SOLR_DEBUG_OFF, 1, [Setting the value of SOLR_DEBUG_OFF to 1 ]) fi if test "$PHP_COVERAGE" = "yes"; then AX_CHECK_COMPILE_FLAG([-fprofile-arcs], [COVERAGE_CFLAGS="$COVERAGE_CFLAGS -fprofile-arcs"]) AX_CHECK_COMPILE_FLAG([-ftest-coverage], [COVERAGE_CFLAGS="$COVERAGE_CFLAGS -ftest-coverage"]) EXTRA_LDFLAGS="$COVERAGE_CFLAGS" fi export OLD_CPPFLAGS="$CPPFLAGS" export CPPFLAGS="$CPPFLAGS $INCLUDES" subdir=src PHP_SOLR_SRC_FILES="$subdir/php_solr.c \ $subdir/php_solr_object.c \ $subdir/php_solr_document.c \ $subdir/php_solr_input_document.c \ $subdir/php_solr_client.c \ $subdir/php_solr_params.c \ $subdir/php_solr_query.c \ $subdir/php_solr_response.c \ $subdir/php_solr_exception.c \ $subdir/php_solr_utils.c \ $subdir/php_solr_dismax_query.c \ $subdir/php_solr_collapse_function.c \ $subdir/php_solr_extract.c \ $subdir/solr_string.c \ $subdir/solr_functions_document.c \ $subdir/solr_functions_client.c \ $subdir/solr_functions_helpers.c \ $subdir/solr_functions_params.c \ $subdir/solr_functions_response.c \ $subdir/solr_functions_debug.c" PHP_NEW_EXTENSION(solr, $PHP_SOLR_SRC_FILES, $ext_shared,, [$COVERAGE_CFLAGS]) PHP_ADD_BUILD_DIR($abs_builddir/$subdir, 1) PHP_SUBST(SOLR_SHARED_LIBADD) fi solr-2.8.1/config.w320000644000175000017500000001003115001737315013224 0ustar biggibiggi// vim:ft=javascript // config.w32 for solr extension ARG_ENABLE('solr', 'Whether to enable Apache Solr support', 'no'); if (typeof PHP_SOLR_DEBUG == 'undefined') PHP_SOLR_DEBUG = 'no'; if(PHP_SOLR != 'no') { if(!CHECK_LIB('libcurl_a.lib;libcurl.lib', 'solr', PHP_SOLR) || !CHECK_HEADER_ADD_INCLUDE('curl/easy.h', 'CFLAGS_SOLR')) { WARNING('solr was not enabled; curl libraries and/or headers not found'); PHP_SOLR = "no"; } if(!CHECK_LIB('libssh2_a.lib;libssh2.lib', 'solr', PHP_SOLR)) { WARNING('solr was not enabled; libssh2 library not found'); PHP_SOLR = "no"; } if(!CHECK_LIB('nghttp2_a.lib;nghttp2.lib', 'solr', PHP_SOLR)) { WARNING('solr was not enabled; nghttp2 library not found'); PHP_SOLR = "no"; } if(!CHECK_LIB('crypt32.lib', 'solr', PHP_SOLR)) { WARNING('solr was not enabled; crypt32 library not found'); PHP_SOLR = "no"; } if(!CHECK_LIB('normaliz.lib', 'solr', PHP_SOLR)) { WARNING('solr was not enabled; IDN libraries (normaliz.lib) not found'); PHP_SOLR = "no"; } if (typeof SETUP_OPENSSL === "function") { var ret = SETUP_OPENSSL('solr', PHP_SOLR); if (ret < 1) { WARNING('solr was not enabled; openssl libraries not found'); PHP_SOLR = "no"; } } else { if (!CHECK_LIB('ssleay32.lib;libssl.lib', 'solr', PHP_SOLR) || !CHECK_LIB('libeay32.lib;libcrypto.lib', 'solr', PHP_SOLR)) { WARNING('solr was not enabled; openssl libraries not found'); PHP_SOLR = "no"; } } if(!CHECK_LIB('winmm.lib', 'solr', PHP_SOLR) || !CHECK_LIB('wldap32.lib', 'solr', PHP_SOLR)) { WARNING('solr not enabled; ldap libraries not found'); PHP_SOLR = "no"; } if (PHP_ZLIB == 'true') { var zlib_files_found = false; var require_dynamic_zlib = PHP_ZLIB_SHARED == 'true'; if (require_dynamic_zlib) { zlib_files_found = CHECK_LIB('zlib.lib', 'solr', PHP_SOLR); } else { // statically built zlib zlib_files_found = CHECK_LIB('zlib_a.lib', 'solr', PHP_SOLR); } if (!zlib_files_found) { WARNING("zlibs not found"); WARNING('solr not enabled; zlib libraries not found, ensure zlib.lib, zlib_a.lib are present.'); PHP_SOLR = "no"; } } if(PHP_LIBXML == 'no' || !ADD_EXTENSION_DEP('solr', 'libxml')) { WARNING('solr was not enabled; libxml is not enabled'); PHP_SOLR = "no"; } else { if (!CHECK_LIB("libxml2_a_dll.lib;libxml2_a.lib", "solr", PHP_SOLR) || !CHECK_LIB("libiconv_a.lib;iconv_a.lib;libiconv.lib;iconv.lib", "solr", PHP_SOLR) || !CHECK_HEADER_ADD_INCLUDE('libxml/parser.h', 'CFLAGS_SOLR', PHP_PHP_BUILD + "\\include\\libxml2") || !CHECK_HEADER_ADD_INCLUDE('libxml/tree.h', 'CFLAGS_SOLR', PHP_PHP_BUILD + "\\include\\libxml2") ) { WARNING('solr was not enabled; libxml or iconv not found'); PHP_SOLR = "no"; } } if(PHP_JSON == 'no' || !ADD_EXTENSION_DEP('solr', 'json')) { WARNING('solr was not enabled; json is not enabled'); PHP_SOLR = "no"; } if(PHP_SOLR != 'no') { if(PHP_SOLR_DEBUG == 'yes') { AC_DEFINE('SOLR_DEBUG', 1, 'Solr debugging set to on'); } else { AC_DEFINE('SOLR_DEBUG_OFF', 1, 'Solr debugging set to off'); } /* XXX tricky job here, override configure_module_dirname, define the basic extension, then set it back*/ var old_conf_dir = configure_module_dirname; configure_module_dirname = configure_module_dirname + "\\src"; EXTENSION('solr', 'php_solr.c php_solr_client.c php_solr_document.c php_solr_exception.c ' + 'php_solr_input_document.c php_solr_object.c php_solr_params.c php_solr_query.c ' + 'php_solr_response.c php_solr_utils.c solr_functions_client.c solr_functions_debug.c ' + 'solr_functions_document.c solr_functions_helpers.c solr_functions_params.c ' + 'solr_functions_response.c solr_string.c php_solr_dismax_query.c ' + 'php_solr_collapse_function.c php_solr_extract.c' ); configure_module_dirname = old_conf_dir; ADD_FLAG('CFLAGS_SOLR', '/I"' + configure_module_dirname + '" /D CURL_STATICLIB /D LIBXML_STATICLIB'); AC_DEFINE('HAVE_SOLR', 1, 'Solr support'); if (!PHP_SOLR_SHARED) { ADD_FLAG("CFLAGS_SOLR", "/D LIBXML_STATIC"); } ADD_EXTENSION_DEP('solr', 'libxml'); } } solr-2.8.1/solr.dsp0000664000175000017500000001407615001737315013130 0ustar biggibiggi# Microsoft Developer Studio Project File - Name="Solr" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=Solr - Win32 Debug_TS !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "Solr.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "Solr.mak" CFG="Solr - Win32 Debug_TS" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Solr - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "Solr - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "Solr - Win32 Release_TS" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release_TS" # PROP BASE Intermediate_Dir "Release_TS" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release_TS" # PROP Intermediate_Dir "Release_TS" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLR_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D "WIN32" /D "PHP_EXPORTS" /D "COMPILE_DL_SOLR" /D ZTS=1 /D HAVE_SOLR=1 /D ZEND_DEBUG=0 /D "NDEBUG" /D "_WINDOWS" /D "ZEND_WIN32" /D "PHP_WIN32" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386 # ADD LINK32 wsock32.lib php5ts.lib libcurl.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /machine:I386 /out:"..\..\Release_TS/php_solr.dll" /implib:"..\..\Release_TS/php_solr.lib" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\bindlib_w32\Release" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "Solr - Win32 Debug_TS" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug_TS" # PROP BASE Intermediate_Dir "Debug_TS" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug_TS" # PROP Intermediate_Dir "Debug_TS" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLR_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\main" /D ZEND_DEBUG=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PHP_EXPORTS" /D "COMPILE_DL_SOLR" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_SOLR=1 /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386 # ADD LINK32 php5ts_debug.lib libcurl.lib ws2_32.lib resolv.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /debug /machine:I386 /nodefaultlib:"msvcrt" /out:"..\..\Debug_TS\php_solr.dll" /implib:"..\..\Debug_TS/php_solr.lib" /libpath:"..\..\Debug_TS" /libpath:"..\..\..\bindlib_w32\Release" !ENDIF # Begin Target # Name "Solr - Win32 Release_TS" # Name "Solr - Win32 Debug_TS" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=./php_solr.c # End Source File # Begin Source File SOURCE=./php_solr_exception.c # End Source File # Begin Source File SOURCE=./php_solr_object.c # End Source File # Begin Source File SOURCE=./php_solr_response.c # End Source File # Begin Source File SOURCE=./php_solr_document.c # End Source File # Begin Source File SOURCE=./php_solr_input_document.c # End Source File # Begin Source File SOURCE=./php_solr_query.c # End Source File # Begin Source File SOURCE=./php_solr_client.c # End Source File # Begin Source File SOURCE=./php_solr_functions.c # End Source File # Begin Source File SOURCE=./php_solr_params.c # End Source File # Begin Source File SOURCE=./php_solr_utils.c # End Source File # Begin Source File SOURCE=./solr_functions_debug.c # End Source File # Begin Source File SOURCE=./solr_functions_params.c # End Source File # Begin Source File SOURCE=./solr_functions_document.c # End Source File # Begin Source File SOURCE=./solr_functions_response.c # End Source File # Begin Source File SOURCE=./solr_functions_client.c # End Source File # Begin Source File SOURCE=./solr_functions_helpers.c # End Source File # Begin Source File SOURCE=./solr_string.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\php_solr.h # End Source File # Begin Source File SOURCE=.\php_solr_api.h # End Source File # Begin Source File SOURCE=.\solr_constants.h # End Source File # Begin Source File SOURCE=.\solr_macros.h # End Source File # Begin Source File SOURCE=.\solr_string.h # End Source File # Begin Source File SOURCE=.\solr_types.h # End Source File # End Group # End Target # End Project