From b51765300c670f33bb7f93880602a9b94ffd3fa1 Mon Sep 17 00:00:00 2001 From: sander Date: Fri, 18 Jan 2019 13:33:47 +0100 Subject: [PATCH 01/16] Adding changed placeholder prefix to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1bbfbe9..dfcacf8 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Upgrading to 2.0.0 from 1.* is highly recommended, but it does introduce some ri Important changes from 1.* to 2.0.0: - The namespace has been changed from `sisea` to `simplesearch`. If you're using custom System Settings, then please migrate them. +- The placeholder prefix has also been changed from `sisea` to `simplesearch`. - The ElasticSearch and SOLR drivers have been removed, because they were in need of improvements. Future drivers should be seperate addons. Feel free to ask us for help here. ## Autosuggest From 3a40d6283c9502c64effff9f8bfd0a4a6d79c211 Mon Sep 17 00:00:00 2001 From: Sander Drenth Date: Mon, 18 Feb 2019 14:43:16 +0100 Subject: [PATCH 02/16] Add all placeholders to noresults tpl --- .../simplesearch/elements/snippets/simplesearch.snippet.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php index 2eaec21..b35ee91 100644 --- a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php +++ b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php @@ -174,11 +174,9 @@ $modx->setPlaceholders($placeholders, $placeholderPrefix); if (empty($response['results'])) { - $output = $search->getChunk($noResultsTpl, array( - 'query' => $searchString, - )); + $output = $search->getChunk($noResultsTpl, $placeholders); } else { $output = $search->getChunk($containerTpl, $placeholders); } -return $search->output($output, $toPlaceholder); \ No newline at end of file +return $search->output($output, $toPlaceholder); From 2607052c48f342b3beb29a2ce761e82bde2f80d4 Mon Sep 17 00:00:00 2001 From: Sander Drenth Date: Mon, 18 Feb 2019 16:28:54 +0100 Subject: [PATCH 03/16] Pagination fix when using faceted search Pagination fix when using faceted search --- .../simplesearch/elements/snippets/simplesearch.snippet.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php index 2eaec21..b4f2b96 100644 --- a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php +++ b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php @@ -152,7 +152,7 @@ $placeholders['page'] = isset($_REQUEST[$offsetIndex]) ? ceil((int) $_REQUEST[$offsetIndex] / $perPage) + 1 : 1; $placeholders['pageCount'] = !empty($resultsTpl[$activeFacet]['total']) ? ceil($resultsTpl[$activeFacet]['total'] / $perPage) : 1; -if (!empty($response['results'])) { +if (!empty($placeholders['results'])) { /* add results found message */ $placeholders['resultInfo'] = $modx->lexicon('simplesearch.results_found', array( 'count' => $placeholders['total'], @@ -181,4 +181,4 @@ $output = $search->getChunk($containerTpl, $placeholders); } -return $search->output($output, $toPlaceholder); \ No newline at end of file +return $search->output($output, $toPlaceholder); From a99ae9b6bb23c39eafc3b04101f0f46d01eb1c0a Mon Sep 17 00:00:00 2001 From: Sander Drenth Date: Mon, 18 Feb 2019 16:35:57 +0100 Subject: [PATCH 04/16] Fixing setting correct parameters for paging links Fixing setting correct parameters for paging links --- .../simplesearch/model/simplesearch/simplesearch.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/components/simplesearch/model/simplesearch/simplesearch.class.php b/core/components/simplesearch/model/simplesearch/simplesearch.class.php index 8577f54..80ec831 100644 --- a/core/components/simplesearch/model/simplesearch/simplesearch.class.php +++ b/core/components/simplesearch/model/simplesearch/simplesearch.class.php @@ -267,7 +267,7 @@ public function getPagination($searchString = '', $perPage = 10, $separator = ' $pagination .= $this->getChunk($currentPageTpl,$pageArray); } else { - $parameters = []; + $parameters = $this->modx->request->getParameters(); $parameters = array_merge( $parameters, array( From a430c904754d6ad2d5d902e8bff92f01467fc7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20=C5=A0mahel?= Date: Fri, 22 Feb 2019 14:23:20 +0100 Subject: [PATCH 05/16] FIX: Pagination Next and Last links do not render while using pageLimit parameter --- .../simplesearch/model/simplesearch/simplesearch.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/components/simplesearch/model/simplesearch/simplesearch.class.php b/core/components/simplesearch/model/simplesearch/simplesearch.class.php index 8577f54..8a772b5 100644 --- a/core/components/simplesearch/model/simplesearch/simplesearch.class.php +++ b/core/components/simplesearch/model/simplesearch/simplesearch.class.php @@ -230,7 +230,7 @@ public function getPagination($searchString = '', $perPage = 10, $separator = ' $pageArray['offset'] = $i * $perPage; $currentOffset = intval($this->modx->getOption($searchOffset,$_GET,0)); - if ($pageLimit > 0 && $i + 1 === 1 && $pageArray['offset'] !== $currentOffset && !empty($pageFirstTpl)) { + if (!empty($pageFirstTpl) && $pageLimit > 0 && $i + 1 === 1 && (int)$pageArray['offset'] !== $currentOffset) { $parameters = $this->modx->request->getParameters(); $parameters = array_merge( $parameters, @@ -260,7 +260,7 @@ public function getPagination($searchString = '', $perPage = 10, $separator = ' $pagination .= $this->getChunk($pagePrevTpl,$pageArray); } } - if (empty($pageLimit) || ($pageArray['offset'] >= $currentOffset - ($pageLimit * $perPage) && $pageArray['offset'] <= $currentOffset + ($pageLimit * $perPage))) { + if (empty($pageLimit) || ((int)$pageArray['offset'] >= $currentOffset - ($pageLimit * $perPage) && (int)$pageArray['offset'] <= $currentOffset + ($pageLimit * $perPage))) { if ($currentOffset === $pageArray['offset']) { $pageArray['text'] = $i + 1; $pageArray['link'] = $i + 1; @@ -281,7 +281,7 @@ public function getPagination($searchString = '', $perPage = 10, $separator = ' $pagination .= $this->getChunk($pageTpl,$pageArray); } } - if ($pageLimit > 0 && $i + 1 === $pageLinkCount && $pageArray['offset'] !== $currentOffset && !empty($pageLastTpl)) { + if (!empty($pageLastTpl) && $pageLimit > 0 && $i + 1 === (int)$pageLinkCount && (int)$pageArray['offset'] !== $currentOffset) { if (!empty($pageNextTpl) && ($currentOffset + $perPage) <= $total) { $parameters = $this->modx->request->getParameters(); $parameters = array_merge( From 09bcb7c41b70fc4fc677aaf79f75389f095fe151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20=C5=A0mahel?= Date: Wed, 6 Mar 2019 11:13:27 +0100 Subject: [PATCH 06/16] FIX: Bad characters in extract due to preg_replace with php 7.0 and lower --- .../simplesearch/model/simplesearch/simplesearch.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/components/simplesearch/model/simplesearch/simplesearch.class.php b/core/components/simplesearch/model/simplesearch/simplesearch.class.php index 8577f54..5a2cc08 100644 --- a/core/components/simplesearch/model/simplesearch/simplesearch.class.php +++ b/core/components/simplesearch/model/simplesearch/simplesearch.class.php @@ -344,7 +344,7 @@ public function sanitize($text) { * @return string The generated extract. */ public function createExtract($text, $length = 200, $search = '', $ellipsis = '...') { - $text = trim(preg_replace('/\s+/', ' ', $this->sanitize($text))); + $text = trim(preg_replace('/\s+/u', ' ', $this->sanitize($text))); if (empty($text)) { return ''; } From 6619fe520d17ccfdb1ea0e259feed0033bca901e Mon Sep 17 00:00:00 2001 From: Roel Zeilstra Date: Fri, 8 Mar 2019 09:40:20 +0100 Subject: [PATCH 07/16] Fix search on tvs --- .../driver/simplesearchdriverbasic.class.php | 27 ++++++++++++++----- .../model/simplesearch/simplesearch.class.php | 2 -- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverbasic.class.php b/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverbasic.class.php index d4c66f3..1589379 100644 --- a/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverbasic.class.php +++ b/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverbasic.class.php @@ -44,6 +44,8 @@ public function search($str, array $scriptProperties = array()) { $docFields = explode(',', $this->modx->getOption('docFields', $scriptProperties, 'pagetitle,longtitle,alias,description,introtext,content')); $includeTVs = $this->modx->getOption('includeTVs', $scriptProperties, false); $includeTVList = $this->modx->getOption('includeTVList', $scriptProperties, ''); + $includedTVIds = array(); + $c = $this->modx->newQuery('modResource'); if ($includeTVs) { @@ -51,10 +53,16 @@ public function search($str, array $scriptProperties = array()) { if (!empty($includeTVList)) { $includeTVList = explode(',', $includeTVList); $includeTVList = array_map('trim', $includeTVList); - $c->leftJoin('modTemplateVar', 'TemplateVar', array('TemplateVarResources.tmplvarid = TemplateVar.id')); - $c->where(array( - 'TemplateVar.name:IN' => $includeTVList - )); + $tv = $this->modx->newQuery('modTemplateVar', [ + 'name:IN' => $includeTVList + ]); + $tv->select('id'); + $tv->prepare(); + $result = $this->modx->query($tv->toSQL()); + $tvIds = $result->fetchAll(PDO::FETCH_ASSOC); + foreach ($tvIds as $row) { + $includedTVIds[] = $row['id']; + } } } @@ -109,6 +117,9 @@ public function search($str, array $scriptProperties = array()) { if ($includeTVs) { $whereArray[] = array('TemplateVarResources.value:LIKE', $term, xPDOQuery::SQL_OR, $whereGroup); + if (!empty($includeTVList)) { + $whereArray[] = array('TemplateVarResources.tmplvarid:IN', $includedTVIds, xPDOQuery::SQL_AND, $whereGroup); + } } if (is_array($customPackages) && !empty($customPackages)) { @@ -131,8 +142,12 @@ public function search($str, array $scriptProperties = array()) { foreach ($docFields as $field) { $whereArray[] = array($field.':LIKE', $term,xPDOQuery::SQL_OR, $whereGroup); } - - $whereArray[] = array('TemplateVarResources.value:LIKE', $term, xPDOQuery::SQL_OR, $whereGroup); + if ($includeTVs) { + $whereArray[] = array('TemplateVarResources.value:LIKE', $term, xPDOQuery::SQL_OR, $whereGroup); + if (!empty($includeTVList)) { + $whereArray[] = array('TemplateVarResources.tmplvarid:IN', $includedTVIds, xPDOQuery::SQL_AND, $whereGroup); + } + } if (is_array($customPackages) && !empty($customPackages)) { foreach ($customPackages as $package) { $fields = explode(',', $package[1]); diff --git a/core/components/simplesearch/model/simplesearch/simplesearch.class.php b/core/components/simplesearch/model/simplesearch/simplesearch.class.php index 8577f54..4050260 100644 --- a/core/components/simplesearch/model/simplesearch/simplesearch.class.php +++ b/core/components/simplesearch/model/simplesearch/simplesearch.class.php @@ -177,8 +177,6 @@ public function getSearchResults($str = '', array $scriptProperties = array()) { } $this->loadDriver($scriptProperties); -// var_dump($this->driver->search($str, $scriptProperties)); -// exit; $this->response = $this->driver->search($str, $scriptProperties); $this->searchResultsCount = $this->response['total']; $this->docs = $this->response['results']; From db921cae47a8f6b4387d48c87bbc775092fa145e Mon Sep 17 00:00:00 2001 From: Roel Zeilstra Date: Fri, 8 Mar 2019 09:45:12 +0100 Subject: [PATCH 08/16] Add new package --- _build/config.json | 2 +- _packages/simplesearch-2.1.1-pl.transport.zip | Bin 0 -> 80380 bytes core/components/simplesearch/docs/changelog.txt | 6 +++++- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 _packages/simplesearch-2.1.1-pl.transport.zip diff --git a/_build/config.json b/_build/config.json index 52d888e..7248caa 100644 --- a/_build/config.json +++ b/_build/config.json @@ -3,7 +3,7 @@ "lowCaseName": "simplesearch", "description": "A simple search solution for MODX Revolution. Loosely based on AjaxSearch for Evolution (minus the ajax). Only searches Resources; does not search dynamic content.", "author": "Sterc", - "version": "2.1.0-pl", + "version": "2.1.1-pl", "package":{ "elements": { "chunks": [{ diff --git a/_packages/simplesearch-2.1.1-pl.transport.zip b/_packages/simplesearch-2.1.1-pl.transport.zip new file mode 100644 index 0000000000000000000000000000000000000000..ee9f00f0a464d74921b8c3db2a040f5efcfc0efc GIT binary patch literal 80380 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/core/components/simplesearch/docs/changelog.txt b/core/components/simplesearch/docs/changelog.txt index 9805e2d..52332d6 100644 --- a/core/components/simplesearch/docs/changelog.txt +++ b/core/components/simplesearch/docs/changelog.txt @@ -1,5 +1,9 @@ Changelog for SimpleSearch. +SimpleSearch 2.1.0 +======================================================================== +- Fix includeTVList bug to show normal search results as well. + SimpleSearch 2.1.0 ======================================================================== - Added pdoParser support @@ -52,7 +56,7 @@ SimpleSearch 1.8.0 - Added support to ElasticSearch driver for using search fields - Added support to ElasticSearch driver for boosting results by a field value - Updated Elastica to v0.90.7.0 -- Added outputSeparator option +- Added outputSeparator option SimpleSearch 1.7.0 ======================================================================== From b4181b4cdf27901631f6096e9ace2e3ebd81d34b Mon Sep 17 00:00:00 2001 From: Roel Zeilstra Date: Fri, 15 Mar 2019 09:25:35 +0100 Subject: [PATCH 09/16] Fix no results when facet has result but default does not --- .../elements/snippets/simplesearch.snippet.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php index 2eaec21..e9b4bc5 100644 --- a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php +++ b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php @@ -60,6 +60,7 @@ $outputSeparator = $modx->getOption('outputSeparator', $scriptProperties, "\n"); $addSearchToLink = (int) $modx->getOption('addSearchToLink', $scriptProperties, 0); $searchInLinkName = $modx->getOption('searchInLinkName', $scriptProperties, 'search'); +$noResults = true; /* Get results */ $response = $search->getSearchResults($searchString, $scriptProperties); @@ -145,6 +146,10 @@ $placeholders[$facetKey.'.results'] = $resultSet; $placeholders[$facetKey.'.total'] = !empty($facetResults['total']) ? $facetResults['total'] : 0; $placeholders[$facetKey.'.key'] = $facetKey; + + if ($placeholders[$facetKey.'.total'] !== 0) { + $noResults = false; + } } $placeholders['results'] = $placeholders[$activeFacet . '.results']; /* Set active facet results. */ @@ -173,7 +178,7 @@ $modx->setPlaceholder($placeholderPrefix . 'count', $response['total']); $modx->setPlaceholders($placeholders, $placeholderPrefix); -if (empty($response['results'])) { +if ($noResults) { $output = $search->getChunk($noResultsTpl, array( 'query' => $searchString, )); @@ -181,4 +186,4 @@ $output = $search->getChunk($containerTpl, $placeholders); } -return $search->output($output, $toPlaceholder); \ No newline at end of file +return $search->output($output, $toPlaceholder); From 7f11ae3bde701c842d7c1599a7211f74636ec30f Mon Sep 17 00:00:00 2001 From: Roel Zeilstra Date: Fri, 15 Mar 2019 09:32:05 +0100 Subject: [PATCH 10/16] Fix coding standards --- .../simplesearch/elements/snippets/simplesearch.snippet.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php index 70049bc..1a0ab81 100644 --- a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php +++ b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php @@ -132,7 +132,7 @@ foreach ($facetResults['results'] as $r) { $r['idx'] = $idx; $fTpl = !empty($scriptProperties['tpl' . $facetKey]) ? $scriptProperties['tpl' . $facetKey] : $tpl; - $resultsTpl[$facetKey]['results'][] = $search->getChunk($fTpl,$r); + $resultsTpl[$facetKey]['results'][] = $search->getChunk($fTpl, $r); $idx++; } } @@ -142,7 +142,7 @@ /* Set faceted results to placeholders for easy result positioning. */ $output = array(); foreach ($resultsTpl as $facetKey => $facetResults) { - $resultSet = implode($outputSeparator,$facetResults['results']); + $resultSet = implode($outputSeparator, $facetResults['results']); $placeholders[$facetKey.'.results'] = $resultSet; $placeholders[$facetKey.'.total'] = !empty($facetResults['total']) ? $facetResults['total'] : 0; $placeholders[$facetKey.'.key'] = $facetKey; @@ -179,7 +179,7 @@ $modx->setPlaceholders($placeholders, $placeholderPrefix); if ($noResults) { - $output = $search->getChunk($noResultsTpl, $placeholders); + $output = $search->getChunk($noResultsTpl, $placeholders); } else { $output = $search->getChunk($containerTpl, $placeholders); } From 9241ec28ab898b1951739c775e62d052680a9f77 Mon Sep 17 00:00:00 2001 From: Roel Zeilstra Date: Fri, 15 Mar 2019 09:38:54 +0100 Subject: [PATCH 11/16] Fix some more coding standards --- .../elements/snippets/simplesearch.snippet.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php index 1a0ab81..2adccf5 100644 --- a/core/components/simplesearch/elements/snippets/simplesearch.snippet.php +++ b/core/components/simplesearch/elements/snippets/simplesearch.snippet.php @@ -7,10 +7,10 @@ * @package simplesearch */ require_once $modx->getOption( - 'simplesearch.core_path', - null, - $modx->getOption('core_path') . 'components/simplesearch/' - ) . 'model/simplesearch/simplesearch.class.php'; + 'simplesearch.core_path', + null, + $modx->getOption('core_path') . 'components/simplesearch/' +) . 'model/simplesearch/simplesearch.class.php'; $search = new SimpleSearch($modx, $scriptProperties); /* Find search index and toplaceholder setting */ @@ -54,7 +54,7 @@ $offsetIndex = $modx->getOption('offsetIndex', $scriptProperties, 'simplesearch_offset'); $idx = isset($_REQUEST[$offsetIndex]) ? (int) $_REQUEST[$offsetIndex] + 1 : 1; $postHooks = $modx->getOption('postHooks', $scriptProperties, ''); -$activeFacet = $modx->getOption('facet',$_REQUEST,$modx->getOption('activeFacet', $scriptProperties, 'default')); +$activeFacet = $modx->getOption('facet', $_REQUEST, $modx->getOption('activeFacet', $scriptProperties, 'default')); $activeFacet = $modx->sanitizeString($activeFacet); $facetLimit = $modx->getOption('facetLimit', $scriptProperties, 5); $outputSeparator = $modx->getOption('outputSeparator', $scriptProperties, "\n"); @@ -88,7 +88,7 @@ $text = $modx->runSnippet($extractSource, $resourceArray); } - $extract = $search->createExtract($text,$extractLength,$extract,$extractEllipsis); + $extract = $search->createExtract($text, $extractLength, $extract,$extractEllipsis); /* Cleanup extract */ $extract = strip_tags(preg_replace("#\%=+j2uW*!@esemAP#2S-Rer(*WV62UscK(Zt-{1$T<%r z@Wk;WGc>$ICr08)fl<}7(4zUH9>)FiZ6h+uI06}I37k+U+fod;**@2 zkEk5Qr<8sIs4!|I*}?clbzX4d{#T0&@SL}p#8mI?0RcJ3(w~_Ul6LQjpn;pvm?2HS zJEwSnzMq|w0=0DIv7=@V;0b8&Ef7Wk_r#~xq(UBwoztDdh4v2e$%+gb5xR@U?DxrF zd5T}@&>(c@l&@XtY2>mU_J|4CN9Rv?Q8@UCwq1kfKl#Koj~3t5Z1;AdHu4)!*HvUg!K7 z)oQ{Ixzvyi{b_V+`9lS16F4>I^$|_wNBXXUfW6W!s7n!8hLK|KU0irM3+;ppz~oK( z*iGmjdgALnZ)jbtElKf?D?wV}J#qMlcuQhKRso*U|+p9Kw7O@jM*U0yDVggnfay=W8w6Fi=eX4+>^xVRu z1_6R~(F(w}Y>0Y9az#ZKB7bFg#j0%5uNhb8(yHfCy>>W|)dgARew$+6C=uXR3t+s@%w@fq znSnx~=&gBn)@?IajBDaBbA0+LE*pF+S%NBsrN`_!<_OHDr(*38VbqbQX1B{6lX8Q5mv)sZ^*~QZcP`q=}*q2E2M5p z+P^C#eCFyu8D+-DRqh#OD+1yzh=U&)yG&>I*ZEAp#j+Amh$VmIr!{ z>y=6(ZYI;)`q~S1)E`snngR6lmYvB{rjx^e?E!kcB^)B6!d1~0Pmd#|eH==yV)8NOQD8}0Y_Gh-E7~3y4Xwb21@Yev6U8U61ETYy2r5sR4aNmEOU-mpK zRKT4)TqKUw0N*GaM!Bd$1Y%{%4a*T|m={UjUX8V?^vk+YMM3k(ew#mV-o~pD<&Psn ztKxECBcy##_MEIIX)oM%m4|qcrcdEkX+hKpds$FyU1(&fQc*m_(a7tj zy(Z)BxIw8#V^T(0DtACPY9R_^vUGhi*{F6GAr)Qlb3s|S_p4&^AMzJ=&+1=Cvy1Oi$fq* z7h@q#YQ%)2VNlD+Qy6G8rnhX<8Oc{5KmJy^oO9@lRkZ=FzGuBJu4HQ0-UCJVwcPkf z5&t!*;1q%z_IIt;+q6WTwnqBffrGKwnbW$=*P`jKzEYjJc;;M3q+iZNKj7i*D338d zBL-G9zE7H-&#kl)7Pn=a*8J|3q9)VsUKO6nBgdex_t%GV{4ef~Ck`kEiziDC4WYk@ z6Ad~;JKU~(DN5o^Vg_TQCHohB=64~BSUniLZw+&!Gd?Tk(Oq5Whbebw;n zl{QBOZuMkIucM8j|&0~B_Z8z5MdL!9<(78H`)KQ1Oa;ukS;ll%_cdXB)WF(amvco2JT7Y|JU z0zy(!VylY(MI87m^B5%ng?;}0iiBGhLq^B1>$j42hFP=O^@bh5BE3cyP6&vXb&mK@dXxcDw(V= zAY@T~iR6$#8c1VhPnWY8OJnG=*`+)3m(CRmw^$+5xy8Jq(v60dB`jzA)4{HQjt-BK z&gc2*cSB{hr4Wl*xz3w#@ADGXRrABk#r!5th{P|v^aSU$--0hf;2`O)80~)r8lu;h zoKtut!bSnqAZT3ekLu6!MLs)z$&Yp@NVF6Onx;0b%sXwV(}DaMGTz%eG?3w{xj@M6 zL{N#Qby1Qrnrjum2y=!BQv(x$m?d_9Eti#$Lq<+oE-wOmtI>{1mAbJg#!>V1lt3G#5voL}zP{62oE^~hx~XR^8nFb$JbF%{aJtxl zOmyGr2Lr}kTMsgJpWu#LKO}f#2K8xMqRagb``A9OScF^!f2QXql;yG88CxUU-* zoaihA46491iKnXd8qf-cHL9}}MX5w4W^ek3wy8UKGk1G>gl+zh_6d?tsWcaL_wp4? z#zN+Cf>>BHm8+TyvikQf#5={pZ^P!(j02GpTeeXb|bcGKuL z*c*!YG(q%cCkG3|6r~F3Hc+4apx@5~Hq!(y)J49x`-F?X4|i+h7fN4D{)V4X6qoV& zGwp#MR)UE!8Z>0Zm7_|QfeyRKyjSvUrRHNNLe|nCG(H2spA~Z=6}D4r$`T*%MVA3M zfflunR(Xi8QpcZcu~e{#o_1UQskBH)QQTz^HQkHq#XH=DJj59Cnuyuhf+Rfo1BqCN zf|P6yuD)^(xnWX=-iX;0x{(k*h993eh_9!oQLpZAV2$-xDr80^QHAJ8Y4OnC7K{b> z#~L+VY1--6`J$Z5K>i8dwBP&8n>!;*+J+66o^_rkm#tg3VS3=W|9tpfSC0j7M5fxM z>BgiD2l?wGMc+Abj%0>?1%G(li{mF zncITKczNe03I|xR-%>PxHp7rsZ5s&;uMSzQAAGGm<%lJl`)~t$LC23z;*i}f!kC1X zUcLj=+CmB^bwjRt)O%7ofsKZ!GwLXQQ`1Tur>4}%1<{51J=h{>5L%l!9iAr%r z6H(GaE8YI&j`H(td6szM#PcT$DL0gl8)de2lTmkc`@_HS1%~UM;CbSpdjk44!jdZk zO_HJIjNi4JG*K9_^EdvSflf(R+2TR7dgC+B5<}&C)z-RJ!Acj`7NeRN6`RB>ZOx?} zmEMy%nB-*-#wT(8E)&(7TY}Ne+toLJYYHTWZbI$+@kBsh zIzj=;*j`a9zX9K{jFr69EK({#fVSVlc}v8Lv~M*uof37b^m;RzV$Xn zGOd`M*cYjDuQov@nX&!--+)l3|J?}4!P?2u^*=zee`&|l+Ckz1f7)u4KU15e|1%Ht zzeHvs$~OP9DE!LSa}YF_kcWETPLA%DKG*C66<=7CjZefLOg94C$P+>N_Aw*NbJk?@ z3rE^d-M#7yn30ilh*pdla*_N82R ziKa!=6$=!dk!~fOGzlNIq$-A)R{Dn~KhtVVlKWEP{_XghQ(~W;H{f=Upzwq|%0N8h z&Le6j(W+ZS#@n6sQ95*xg&PV}btI~q`@Ww5sR1Fh^dM0rtp_6L1Rp@N+r9;~_a2)W za+5LbDmM=x?HHBCOdrMCa?izf)l65VG8=naCyChDAG6GT13I9 z4(rT&QhLe_zrB$_RW3vOx)#SKxjH7|d?E8U^*!$+I^<^iU%7DHHu&7a+s@>{<*GqO z5g6|y%M9>49Sg}z-~ty=A%{yT7EGHel0r!c<9Z(4x2|#}0T|sSMki@)y%QZRy5z|= zuIO!+Xig6J7z^TDolnufPNy4z84C_&_azH=m{*fV1O0Lc38VR>^;@T7}Z@w@emyWha2nKmLJG#E&sp+o!dk(#+<&74t5C-0i zJ)w-;cenyw4-QnhbW~SXe`F(H|BYjt#%ViYkGs- zDzhb1`bFQN%MB;+>*K1jAB}t0|Lb7;uf2tK(v(sEqM*eF0|02k1ON#C-@Lc~byxqr zTQ#Kq|IzSJM1N>_TfQ>KjRFyXfXl_^LHhjZMUBE6+E1zpdZE9} zX%yUMaAIe+;y<25n#xEM-@d*;t_l)K(4fhHNHC7Et0Y4yRk!DpP_2>{wUapZK^lyM z6h-YIgqUj>6A}gW1ttP#h$B8;>ifsYI!VK+AgVy{j*%|c-D|pg)OPeJCdXDF0{QGA zx;lp@#laCt5V7`sS90}51(lx|3n0=hFT`lAb&LI8cNbgHK)W}e`00(@ zBV{2U$v8!j zN|FG9!aWM=mLK5UF|u@*SSt_Mou7lgOQ0^Q1(vmk-!arF)qf%MJSH5rO~d&?M$BCW z?RWn8l+3&^gERaKwDD!W^92Gy7Q?+ACB8e@h$#!27wsDjgoLU41@Yr7|1^thB2qJH zo&$j`4}DVYWBZZKs~cbLl!h2!B(*!q?sw&2`MEp;w3m|LI^aO-MnbWy{f4HI`zGkd zQ}xXXmyiOINat_@4LDIu(Ked?-MP2KpZP@fXhCD#^cS|G zxV&LOnVK;d$ir@>!qg?HUgHi4eiwN-><~r=%%0h{adX@$Y~TZ`!Ug^jDD)EFPmX>h zQL4LUs?2(M7|^EM2mv9?M*!W~azbEN^5m`4JTzWr-{FF4n!gacKXFTdMRabnC@bx+$aR<_Eg+S;)DI*pO zd&YcwB*3s6-nxe7(ctz#EN3nJe+kz>KRwv@Oik}Uu*5l@8s;ast{m1qp<``FTnK?T zKmpHw3F43lj2XMFzIY_%x|;pDDUh06pRSf{TB8lO5zR$et=ijlmkHjs2@W7Z9TcKs zfW%j?&jyWO;+toDlZlt@rpb*|)ksUA4<{K8FZv1ZfCX2Ik7uWfZ1N3cjPb}sq=BVp zu$KqDl^v|l?z_ehw;r)pb&iHnGXOxI?z@+*=G?sZf-gr%CsnuYF9IL?XCS+c0}uQSMyp14lL4f%6zo}QS$tY8l9iU~8- zH6${P2~eJVXW7=%6x$nx4Q#tMV-{`JQm%kjY1R2lomoYc=2KRFuvwlX!e!Sm_38FY zj)EntFv4%4n+mWTB};~El<+NR4u3$7)U9N95K)jyXBw zYE6J`01!;I{`msSY&ll9_{!xD^l~gT z()`rd3-D6tc@1mm-xF8ViLsX0lUv%ny8;fROL-zXmblr!%7fhDg4$FYTGD(3v3NHS zmSpzF_ak#ox4Rm|FgksYb9TCRYQz9@XhZYX>^#^TUB2DNWh~;2T_kB~{lK<;{XCrX zUCZqpQKV@fO=>vVarvzXI(f1M^4w=X*(9)_3qySg1@Q-pO`NCtD69$ z(ZX<`24||^cXUYn>(NqE*(-i)%%9$Q-XU2H$1X*KS&sNA@`bV(kCYQ)aai+TT|;|G zpx=qiw84y4QX+f02?+t{-Irq3eo3DG^g&?FSS&^jMeSf>y&D*@oQpVJ#Q;U1dmjM{ z`n9vEr*$2^HS#&O$2aPaJ!O(cy@(b^BWy&HYCZiASVLs^rtl@aAmx+&KcJtN3K6l2 z@^ebNE6raN0}))($`ocD?eQ6kLS(lM47bM7IdoAKo~P8~!-+!lgzNEgL@cl+6+Ym;41q zWG8dA#f5zblX025!qe5piVE;*52F`m;{KYG{p4=W5J017{e1xJFp7d*fRQ(==UFn zn(I<_vaO|wIehRxlWduPYB>8p8Grr9Pxrrnw6C-;oHm9LzN>roFD;>G1IanA!j_qj zS|jfNC|EBgEKG}Iq7ugtTf*}L$k$_a_<6bA0B#}`8kb0Hup?o`c5QWS?Oa`N?Y&-l zv{Adk;__`1#EuOmBv@!GF;48alRo4Vo}86Wo^nK2tRafWolh`kcSWNiSHroo7l}SC zzy|R3CU|=wsTr#f`w?~AzHk+es2zEx7cqTV7b1o-LYDKfQTg^$DPn5`GWgI_`t`i{sQuSQ0pNYB zz7)&Xg4s&1HM!bc2bBY0#eA7p4cQFj!Q}^Q6OtuDJ)gwJXoRkVY?9=HHWyWs=8|=TN1wXjrja^TnCM;5p4Wix6=YUQ zUc#tdQ7x#aG;OSoEI*!J!pzg)0;;gN&{ffYuO-42MqGkbv+pr|)PW?nR~Y;q^ScBh zYXrWAxSscV6mU#~hjhoEA2HFWk?QwD@Z|nl!ZNXqDDm`p;N$^y1;NbZb^_@2eAKnk zyo9)rfb8b1W_>@1@BwECeZuUSXPv)1J2D-~RO%fx4PmJFdt+3E`;zDkx2{6U)~W~t z8H_d)Of;zBVo;itCJRMrbXAg;@|dmmoT<){Vy1bZr9e$@91Q;ui3*gejd-BKP`F^R zYoWzKl+ambFg2W9ubqohm_Qmbnn?T-Ju04nexTM!9AC+j3}*pl(>Tg^xGw?l@?c3S zqA4%sA44N3Vxv=Zi*sIagg<%E0M^jDjNL0Kh%{INJb)s!?|Fe z9j*x1AMubA0Au7y3By~*fRhHrh!Zgc=IKeK&Jy0-qs(i{qyUGyqlS+k9Y*|4>akrz zd3Jx;e^4qr@Q{Jh52)Ol>>4qytQ*uNEh$r=)uHcVE+xyhKLj(`hybE&Q|3ca<^E)l zVtmvBnnnVPk&=~4ics=08j3%EjdfAr0oUmV1ryme`Eh`m-D22;?pK&6z~h35@IMIp z;+_mwlhVR)RQdEuZrt?)E;zJ>HqaU22Gv?EgUOlj$8d3_4ZIiF?YLrLCa;0*PvnD1 z5h!+DTr!qv_)Nd^aGP2IlO)G6Qxr-#7Rz+#fUCk2{xE_9!V)?AM_G8!YSbCTm=CID z$n&bfPuK4hX%cF~^)1W9qqH<4=7%bJkV(@#9XH!L>N9ZGP749nqA4WC|J#qdOnb#Qe;v;g5M_HXulY- z29a#2opr7Sn`oCt(pVrsT;hIUjQ>efjiH*?aB+h>bFAJ~6i6;278WXp(X7#QTyze( zVo@#BbeX}z1GyfZ-tk3YV_5b&A;~IovOnD7%$6o=GC#X+i%-$ubd_p;=k0RWo4*do zOKaq3wDG5=Pb?U4JT5Sx0;VoWA2Ys1dR z5ZU6&mi8L}Pz1lLDQW*#?m%?4cFq06P!ZFQ`eZLI{tbzY07VCd?UrFMP55i~Hn)3UWG5Lz*qY^_)RZqYyP_5?f=0VB1;{bIvVq z?Tf++$4RA07S#f&6rRxQNH&8lb+BP>vaXA>nt}K2pU!cL0EA5dVgl+r4sW6efM)d2 zV{}RE_mDsXQj`!)FVa-6zzHemttS`y@IouR&uck3(Mvk-UuZpebv4QT-o06XbY-Q;fEwl(ws$p@dq6Z9vVBJiz zP8}mcyU7rYDu0%RuB5QBrI_-`ir=)?{0O*OrpKe#{eXNdJ*_NF(41TyYA?yOsWBu+ zHJvQ*zwg}bizCe*^fNuJa{zFK5%gN1JeOu8m4hW(!oJP+-c`tS8LR^uk~F+qZV_B+ z-i}gr*`;_s)>5+EW(P}5sv<~MkzrA~o%T&7d)x};&=50UVc4%?-P@1VojQpV^x{B^ z8l2EbOOj?UBLx-kQZUWt2qqMT=M>I0lT-4+utB3-f*fCF>f4@CBXh3hy9TGGxS-?; zdu-0nXtaZ{0eqJOZ9gEWz$9tgcQA1*KXQPIAEv)Gb@@&jrS^Qqd^~&_)7#F>)YC3s z?ZAyY8GMM~wsF(Jc{O8AuJaXLkdA2za$QWf-%}xPX=&~oC!Zfo18fzej6X@U>&KU& zrp_*|Xj}t|h?;gh&KtYFXe`GHz43KTnBFG`3okOGezl!v>c-k>h}gCsP@A=xdLi*? zN$w7;j;-O82$;>Rp8@E-W7n94XCd_R>L_Dj)P&XnwIKvwb>;Wsx^IRjxYWca4ml)o zu%uzR?M11hjXQjx+vU+AnIY-So;s7FVuFdQRHxv>-+hn+XzAWhaK7 zsLSr?$+W(xZLDrx9V%kh5b(74q0GB|RM2?!{>qhJrBoz~GW&`fC6`c|-aB+SeD#Kqn*)=Ijn4+C|Fh2x4#4(T zKaKw>Xu%Be9IH2X>0=8{E8vBHFkXIay=m|_SV43&FP~zINJXy>pZdFNR5E7;Oa<`$ z9x%kGz@xeKyOKq9VT6Dmv#%+``U8Vwwbz}D3(u#%zuV|JhE4O02X9;Cj!2N#n?lVb zTkE_^-gv&G!j(=gUr90NT&ha}P}|j}{MeaNZ&@{Mq|R(EuGK-!m=|3ZC_)ZoM0V z!udS7!{oL!=ym*eT8F=m6J}dI1Tv@8X#dmqTHAUc&bFO4isOURS5z&ud_0rlz{48Vt+=KbIigt65`^ z7A2yCzG%&qyPDjW7wrV3v|QcSchpV)T=Oxj(Y!M;*&zp!Lt?q5HHe|ecsQ6;dU19; znV3T-OE0WsB(NX!uk3@9gLl|eGJYeUe`u6T=RXqjnLx^dop7{%B1)JUX(n&u+O z@AuZWGgfJfiZ&!F5uA9mYP9=ivId3QIUBLSQ?br0@XR}=sCiUy5^8llt3|WQCa^b=YjE!7CI1Leb zPhtGJ+>F`+#P_a%R(SDSrFf%@*Lwl7JAK-o8^VvZO&}YZ-p%(MI}?y;B3>(Zr)70{ zMdqbke_xOv58e$9cXxY4sGOJ@T+qZt4)53J+(5ivL0{caFTEor4;A!dW@8rOw%t1u zzTEG>!yo5}Ju@mP*FwM3eeR9YM7o$|r}kX=a+(DjWI93WOU+r=O4qjX)sWL_52B@rC2|M}kuz3IvT?Go9BM zHUU~$gNO`Spsm%=d*7|!9NSYd7~nY1N?JWhC~>~Ue)G4hoB+!bEZg+_J7`91bVYBH z?BLqFD4Fs4u@RX?Ecx7+fy-#R2A1R}!lF|k>A>x3-R<=5nykB6%TX{iXFy&X8UMAZ zmWWuiWp7GHQNUmPfPOyjQ)CZTS1dfG@X~}~NficSj7anXh_g#-SB<3i5&2`7!f{Uu68}t{OoRU2P_8lwl1&NGubUzGgr(j ztx0D;(0pP=13IRV`}x7q^q_Y#F&-vgPfp>ft}*)z=u=t0&W#xB7cJk7q#aLEz#d^q zr{vAFlHKXA2akzVOy6STMh>J;>@zc{Sm#8pSS!xJ8Kl-Oh4)mrrRVze-6JgluXth> zjp9fX&~LW=3Qvxl=h;jjtsfC`ffz5R3(Z;A8Q5A6?KSllt0^@moOPJJsSlMYui zn)M-V#%$67mu5S34N;`GURZSLxl|8@*mH`MY@xOAw}HIpuX;aQQhT z?k<~%W5!^Vic7(52X^lmmEAOqA*u)ypAeM5;q9wS9I9Ca!d%SKai5D;pO?^H|bF>uZkdHNF!{oe}Le-2SHFrR?&l z4*EOP;E@^#=|uxd>4*CcH&A6i@b8~EE&}s?%(X`xNeHwlk^5E)Gith?YhI)D^nq9} zVAmV*TKTo=XLGin@kLIB3vILfh;#Gd^1t*H_kV@HKbHAIs+U^$%2eP;Ez1@@3zAcz zUaI9}^YZvSO&vZSh9xeHja{tN=nk~@D8o7EB_0@NkzD42l^1jH-s(@jiUh@uW3slu ze4`P<+$8!uDkAQ$Y0N!5k5+zS@&0v1wxUA#a5&ldchdR4CbxRWVkHGXlZh~#e@Ybb zKkaM$D_H7>Z~kx29##Je^SGF{_Z@w1J;8mUYKG<(zHjZG1xOUEZuD~$o^n6xMdK$1CEN-W~fH?GXN8$C}ZX_ ztD9s*Kr5R}`}v=nRH{QYt1zN!Mh0sL(yS#^SkOd_v`#l4`J@a#U;TcQsN?*(K;74Q}c+ju1qZ)5^= zq?|?Q*dRz`%dC0WrUDphQlqfZWAQ407rE6ZkxM48EcFh#X&fgRMT&I2)wbb1z_Ub^ z0rD9t>)tx~8#s8IzVLEA9!%xYmknVdWFV%R{VTd8e_z;~@%PPr>A zLPE3zMd{?@cn(UC-I69Pj4mu-yyF_#lqcyuC3pz0434d;e@WiE7AQ2VUVy$*Shv9L z{fA+7Fmx10CR8*Pxw=7;p*=*LXeOx?##acHuvrbl8dGR&*f-H5i(^z@nmJ7+L?SFh zd(t~Orvv}`=zQ8^qo??C_z`2YI@Qv%Y`nb=(Xl_Ga7m4%`zqxSQQ9Ptmeot*(<}VO z3vhY!@XQqo2VA1Nj#Rp*m7JdxIMJ|iu@nLwY1Vc3w;IUsv8hdKDkGA-fE`Mb|9FQS zd=4vliV3SOlJ%`miQ+EEYl4|(rYA(VSp^7%Mahdf?X&Uo2P_gKo*WKPIBgy-!7Y^( z@FpE{l)izO%0s7B^{Wd>1XNVZOD*(**H0f9VEsjt6zVSXTrg}nw3HGoEXUc1GVx?d7|_6czNg zAJi9KRNiTRS=AQ z&Uv?#rXdp;JJ@}S>EXb|KOS;5=5DsenujL;0GN{Ie#DG5SV(Lk9_f=6Qxo<>YMm5c zirheErL8YvOeMUeti_J5W}AkVj#o#UmbSX4rkX(N_!`}F#5b8FhM2yHW+5}i&zetP zNz1>4dNl{M+9mom^b$!(DL|&IeZ`=7O;NGyqKxG0ZaJ1qGtv@4$k#lXiEe}XXgjKz z(R^Z4-*Keae%}C;Xkwd-f|;d7tA;FZ%XMdu0NN|5&fliAv9C_Tw%LO8T(=<4%(S0% zrsllm_vn1|S>iE8NCPbM+P*}1W*WixxowW0xIfS7P$xXc2XXgMP*69$@E*>d9&V8fz<5sNEC}29PDV8`N0Toam&|G2atL> zah6b`C$z`|@+jIT{3!RwWzAsLDbXo4W<^E2GwGkh5 z44l7^oMO{kZ8D7el4>xNeefK!BlMET6xM9{653dqw}4UjF;SP zld)68l=leyYS*e6Vs4hvweqn|!C`D>&)8>PLDPJ+nwHGowGuvB(w=IhH4x);z;a>{BVFc?tOB0pbA=xz?AS}S*Fp24Pso`i{P`+G+L`PA${IoL20#d2%)nb9l4SZ zqqBH0aw;L1BS{Jx_cde}vXIzWU($b5f=l=; z&YtRO#1&gQUt5+P;~_aEIIlPeUbPcGx*rEDVg1Rr?#cWsmO37z5k^A1wvI7i0nKV! z1g&erIz>-73jVOlhwdJwcVK9>^Cz_$W~u72%Op)KYY%|SEw}3Ollu+t|2a1Na2NiI z3`+AKAv9Q0%>Fkjq<_YS?cdh5H26;(H!oJ2Cc2;OP1K*$(mx}B`VUJRo0uB> z2%~9#vOxc3mz1omBZs5_?{lJN9WH@_~%7o#o=^3$?ahp99_MgolRRN=9z~s zsm#P;!4E|-CNAiS!{n?2Ikcak=VvC&+*3TbMBnas<13`FLphLc9KqG#LiUs~mba`U zj5W8UuKb5c(wTiM+76lf#dRyO&1Ck(=bIce@gV*8n2a93C*@l^7#Lo+oaJ3?06$xt z4p+~mvM;-rhL;J3_*)}A1Tma3;weZRW*kW_6F;jzHGoD4a`Glv?|5%aKv96K)>~tj zG6L?eT;x&pg7kV=D1K7e$X^CIK=q);u%qOmw>;NTi=VCJThuEatWXI;b;iu6yuIbh z+$2DNWe$ygW%Olo`zB+y!DOHg@8h}JKu;DsYwvgpuEsM`VU5MApXbOzfryLhJCPB-?8;_hND_Ky zh~gtHYYxelTw`x7pyq1zqWXXRY7PKO)O?jv#VL8mf<2YNXIzCUQ9T@xWb)2+Fpg&l z9l7c60V#}7&+782&<1{9LU~+r;AKACD1=0BS{wi@%y{1GcwM^9BUgfP*W>BIfkark zn7OtDb*$iy!{E?$KNUeZJmo1%dVS6KT#U7o6<^L%H^13)Re?GhmFoex3VVZsbpVoh zuVFb?uF3!{XjK;}zF;eFd*T#8s@U0He)$G`;eH-Ccs!wSH_)6CY|_6`>GwZE9LWSx zmcyT-jr}2C+5MyMs-JhpkCmdmiKDZHiPOK;Zq^UB!EQnM!8Z880JhP|hAg*2OT^Kb zWlfq~4pmJL@W`NUp&bJeLa^d7u53NLI~<3T(=p5yDgXnk1RmAgsW-iOfTlHP-oU}VrwPh1;&%RmZvXD7I~s45T}rZ93wdSo9Ld|a=7 zKHyYx2ApzyF_P1qyYrH)R&Z@{yCYs|eiHP!S5lBzo(|J7R-h-UX9SL*##Tne-I!>U z7}JJ|s&>glmTDqO&RbCC;MD5CJWyO*B8U0JH5uu~+m^n_O{TyC6N79luA3O{EC2CyT{%T4ZowB$8;Q|?lf--9-zs0ye>fqy>4j{h=JKl9ry|QcTXKH7cefS0$%JfI#bWTHUPT!lvI57u8w~QvX zh?wV*eXe{5vuV1q3Pway|0uoe7M`8muNo*St04;wN5mK9q=oSnfy=k{J{Z?a*Q>m)bwxNhEcvEt5FAvOLzt zpe;>{Ab-%3YpdG@aL%1t8CD%hXF=bqN77{6RskdP=ZgnP?<8GvYVH9uU}2r<0j1x! zQ`Q{I<-dJrak*mB+~?&dXehSfx;%`ebb2GT)s7)Y?(Q@^9q42tRSpfTB+uv4Ixh=Z zxGE`cidYlsWBwLOtEGGSn6~M;q|Sp-Pbo;11~NJahgrdnYHm~X$8>je>ThDw1_lO` zx2>XsiQb-lJUFlFmw~*@OtECZ#2J7s0T^h%ZiU#_|OWWkKP zy$8QrVMJ;(Z$He8Ib}3G9JQ+IYpmGtoceo5bf(#vB7-~w- z?$(yAh>X}97qbKp($Io!nAkG<9GGcwqNM+B&z55fDffqhvtDpD-T+XRH+ApQr0|PM zH9*WQZ7y1m$^%Yb^;W^F`F=mcJik8LfyaWQci3mAi1U0j5GA|q`G~fk{~NT&V>X!&IfcmQDDH!plyk_A8!PbBjd>@2C}|ghj@DW@QYb@ z3y;D-#&RX}1gg%zRSYt(U2z^!2+?1RCF)zac` z!v}+lsz<#OV*5?YCvI&JHQ=K}Hzv(Gjvmt-H=;9D7ONRDw ziAY-<0@F9AeYxYcEnK!bfTpGq`MjoY5Brrq_)|Pk1DXK{uGXwRsIU7iDgkT??u~!S z0G`ch*(pDu1ifw^@||pU#$VWOdF50=sL7)zyK?Ww#P48^v%q!+K5gTn-gfJ@atEGb zypNb8>6P_5W~6|t=Z`3ToO@!J`XVVc5v@ep(^c+{O}8mNuM97)1anPzLgv^8Fb5Vf zMwk^3pczbOq`QaV-Cb{O>)8Hop31#C77~=w7yEI;jjkmc{L5;-pu*enQZEYuxf`84 z`!H|VbjA0A#eR;VQxDC87aROZw8%%sdMYH$RfjMefxod=0B&*?FO_1w1nCoM$k`rZ z#Bd5a-wb&gpbURfc0o<7A>&AT+F4m`qykkiT~5$nU0XDARO?sTixM8#IJvoQKPmcjSg zmXnV0eF&!UajD|3U)~W~`vGd=UIsLOB<$p+I|5rPA$;rtz^+$*U_+!@m&w`Yn zrT+^^>66{0hwpkoAyT#on75~^iWtW&hippxwpH-e(?%Uo*z3jU~xrZE9uUF-Kt;XuhTLe{PupurU zg|6|=Vv^Pv!$ysByVXDkEU_m2HG)Zd>bwYD60E1t6(%3Pa*5psO6xV_V!Yv(|ZY~DU* zjD>uh1u{gen-_Rw#}i!(8|RsNL38VG&P~1&m1*h|8g3C{<$zQTilkZ;Sjds~<@4**RHS)NRPo-4`4|aB-P880 ze8RJB;&n#xIgY&PtKsNj_2#)cdc#oCgM_u@$2fln@m>dUY~CDVs@eNdXKe(KK9&B! zg;`Ay&=7JdW@1!AbVBwubzi#=X?P^(_K-IFB~ebx_fhIDtl|hU$FdYqS8-V`lBR$n zL#7?SYMCpcy#D;W{jEb0VAe?$IZY9`q`oobMS3T z^)BGJkPi`;(04FGL|pd8_+sE#IlT~`NRA1rHMWDmk$Y0e@y;TkZ41R-)pR1+YoKl9 zzx*cuFgQ`0EmGk`1YhV*cOK8RGx3>A2*25X*`GvZT2%GeVlK^RCK<-e!*AxreP4cQ zjXiFR0kl9|zA7CS_P52&b4h$YAKbrAEiA4Ky1fm@s&j*Q&yCT_yrcd9H!l9!+H`dJ zPYs0Wf)^nDA0IM@pZfe~Yx8I6|5Tek3R<%L^6;N#C`g9$ATS^A;ohf^x3O`>%Rtdh zHk#?T5>m)W;@W`@U??IHoz3(OL^DP3(EBQsGqFiMjz+ z9d#KZM^5LXw`K_$y4-Z16E4*$MxX|mVnQ{afld}p)DSG{O#@|^f(x8ub)AjJO__Cu zP1V8#f#6m}_F0wU>d(bg9XYs4_~X3gT&DTgG_^q^*`s)}&N$w?Bqd#`ST)27`>`}= z|1OIC1hR8+kKvn98V?mx6+*PziboI9--OY3GV%m_QSQ-(FTH&1O6Yv1=T)wWM1wZJJ>w>YI%~BD*SqJiMLPE z?+rUPys>3t_wN3KiRJ(O7UnG*Q2TM(9>xBr5$De@{a+F1&=2Co8u=IEL0NjD7oy#xJJbFY@!%VWyEF$G+ z@PhZmW#*d7Rj8Vu-x|X2;6`gU{poG?+QH|%v4wTB+3q5=iRku`@|@r74iBn>GMpVT z$kTMi5kQA2u;L`l1U}Tha%S07ZG75T_xssrHF;XCzDRh`Nr9J)H_8+1Et56LU0teY zsi3bm?8VLY<5&vw?P2QvixYKZ{-IA?&F`#ywCxS;&dY)6jRS+YCh@m8>6k@(4u8!;=MNL&IfrroZb=EzL*EyNuWZ5lCLg*|-Z70YWnoDr&Dh1Gy}c3mY4TQUTZtr6nJ zpjeJriFmTynB!4P2I-;6%w34L6N8)|Q*Q%mBS95V3Z{hg%qtk&Y7!p|7=4Z~MRyL) zBU7%RRaM=os_ItL^6@L8#k8SA)XH8SI&ZCllw?L}@i@Kyp(~VCRd%-!##O7Dd$FuI zkY}k|T)7a&0@6bPBtb?`~MwYyvF+nGQ z;cL71AA%c|qoMyXbxP^m4UJueh^6P-AH`M%V*;&5`t#x=kE2rzQT35>)t%(M+r7$b zID#{8;B#z0s+5F&Rf=Q63t8<(Qg?1C6ZLQmX6p`s9xXqHOM2W)(@-kBBIxrPwEK{kQ zjH(hC3I4TAD$a@JNLU6 zysi_mC<@<_N?>fP8#AG*b%4aBDXQxD7ZnR`NbKU`P>qbe%r3vE-4$0!F^~*~B0HRc z${;=m=O?)m)u~Av2ylt+2Ugy}=f3-1Ld$@=k2R2aze)yAjUP~$BPE(*4y5|Vnh173(+HUB<#A`LXF zataE&+4SPY_;O=pq3V;COMY@?Cb*nD0j>lJNlh|-O8cXxM7 zceiv(gOXC;VxQ|acAWEk_ptBlvs~~8bNuEQW5zpUjLoiI`;QueMqOXu<}CLxPQOcZ zZ?M##t+Xwf6$`Cn5I60!3sPksBv~pEXk-`ae%!8|VPSd=d1Qf}m`-6JxmQF*-_sdgyiGqlQRTNCv~)2h!)xIN@MIvyoybC|U^Tf$`_cm;3r2BGkpQv!9G(y?O- zu4xYO2cMon&q$oiPKVd2_Aw}#Dv5eGRB$)U$r&V;MXCloZKkAGpE7Z(v{U3Bray;Q z8vB?Opvux69ZiRCCQ2vHEnA~V%T7R|&C7GCU7f$Oo$gM#LvWF6qJ+&!?eA)Q?fIbv zdpkRjGJpqNgXhutWFoY3E4T3Yj-CFeYpGfls)UW50mCHll31D?z5c!M_Zrij%}`XS ztME3k#}$$D%KaRe@P%a)iv5d;w9f0gR?k28zN7Le!W_9C-$+jFJVCj+fGu~Jr?!$_ zD1d2$yJk$qLh!waWRLG$HO7Hr=x%Hn_Z=U+RXaxDp@rXENr{jz&>(f_!bwtB4D2}_ z@&h#k%{^3bq(nhO^9#w7AxJqDF6}Yfc0;Fi zmUzDaA&+l?y8mnk@O~%K7Qfz9U#YS9atPvR1x=>!cOnfE{p&wH8EI1ZwIqac)K8alQJ|8|MGbX@IjpkT9*N+6k0xN*#Qf5XT z>WEd@$eU8amGBiTiPh7BUU{hNl-kZpmEs;NkpUdRlh)IVoB`#zcshW5Rb*0MYi)Am zb>FqExn_M8sOPZnjRlJ%EFiS{L&YE@v3wkKm5{YZxlaL%boK&7K(?ohIWI!Qi{cOK z1+h&$xJ-_+hMG5JfW0>noQFES$t-=dh%PY*PB*GO<5(R$N~>$leL)oRdP5%76$_po4ckqXL?i14pd2i#;p3F);t0<@24PEEEKgI-rh zn^h)+yiQl=p^miDaq=`Oe(xtM^czVi7REArrAP-Q^KFb9?%m=rK#Pc?1&~&R#*TEl69sdxg!$25OlJg%uL&k-l+=Zjc2_LR1h_WxBhS| zM%h)Olntj;^h!vLqPrE{NI1Gsxt4@5@Tg$I-HxeH!H|xPAZvt<2UAIs4`LRr7l{qm zQ8Yg*={a4_$pqLg2Cb~u?JU%z(!>Ox$<_*#p0BkyZRl{9IVx1;S;jeB0_d1m)M|M6 zF)G@$OI~nqv*>a&$dBK=;wcR4sfQ#b|1u_HlEpp@EUI^hQchr`nI^4Nqg`vhL`nkZ z6=lk;c>0PjXJO}hKPFn>OxnpIf9%{n@~V8=U@`SvII+B*#a+)8#rcJd;fo=I7ei-A z9Zc*6fpom8D5NCUErK7A&vA}QtS!B7hfY0XSHE0n%Q!Cy>6l+3!FgCHZ}Jgg<5usl}d6hljD(Y!`{9#p{BhRS2RfN@lvZo(L?1qRmMNYPL0jjId z#!Pn|>noTH*8p6d?yy7C`~Z(qO}$FBy^;iH7F~!zPUnIrbu?<0=W7b;Gq=*%RDok4 zKg<&57=_(C9)a|b96SAIxpT*e!LK9(GBm;)(^DGtH7Rx`HJ+xAoPMvR%g6 zlJvC%`^QNBt!!}Ar|Ag0kea4a0~54nkF!TV$At)%)^JbGqIijsV~uX+9wxlRXEA!c zMc!wxfe-zDB2D8sakKRp_2o7PYZ2qlQb3bXE0|S*aF4F5M~eSt8EM09yAcn52Yb+` ziTaJFAvMe$0`)`BifJR!3HcL}nBIaezE~S;qmBZ6Oa zwdI4c7jvPT4GjrN&u@7yR*S>O$_4YZxxD+DvGkAUeZWiuU!Fa;pra#v z*TCxVCZhJSl}G4j!Iru;vIb~Ynf`Xz<)C?8YqOE~(AN+5xHnhi9N_!+1j^$TM!Syn zUKgs!pGoBlTL)R1Z)J4ZSv3+B$&Un4DKbKil6+WteVjUCB z$9)sh2f*u@IsRmId~x?NflL5)EyhWr3GQ@_oe9ihma)k@$~C88Y646k-2n%X~&3w{lu(^$a8g{T@EU}q2?Q_j(qYn29HP29$^ zu(A89`q5%!!h$9tqD9aohgj+5o)BDIr{o-4FysE*bO-*2i(ZdqN7HPK5DQpCDAr^v zroM$3IZBC(C^nX?Eyq~N5p3U0Cg=|fbJ7J>UGiBY8F|=#jMkROFI@uA$ud7OC)Js8 zG|6v6J0u;h4zp2GwRr+6TT=ln4QD z{0@!gC4M6Ur7_VR?~8abXckvz`_r%H>YTX{VX^DA`O(P4o`)_^!Ozsvq;hMdd{vqW z&*+Gyit1mi!)FHI6%i0M2B=_u;&u^3?_-sT5Bx$!$M4%_%o%&Cl9(I|*;~AWbP#~k zKP9DN@EX^XbRlkk7$du~R%rLYI?kSM9WH)M@Y72ipGF#$%1eeD=>MywN`2rjOO>^; zRY~KZWy+j;-$nq5{$+-hsW@P9m*w${%J-#!YZT|1{j>VC`QgIp4cC8DlZ-S5}>JhDtqH^O@eB$w#oB8RO4y^JC~zSM={ zpjW!77U6m^!G$ZWbvOA0bw{N=FIh0CX6LLhudAeLh*B%OE=Q{~yI^|pHTi&7;(T3q z`u%&mMC^))IV7w@IByEfsLDwsHd;9o&qoTnd6|_k9UGGG%_8zRDWr~rG#Ra_p-!Ys~1L(_(r9D!sn;vrK8kahLl*J{ZOIYVck zD*B5b!IhulKCHKYG)!(#2>aRJG>v$h0mAVibT&p88hyemrZ>fUGFzgm>J(wy1R9z& z5b1rhzLQ~+pC&D~bHjojGQhgn_LaDi!8X~IO@`%u#Yj0<3-q4rdOp=Mh4P|OSjI$^ zRFk7587|a0=QiRUs`FD9vzQuLRIT_54Z$LTj4EY1hOeZ4fN>uJTMiOVJqa0AcuU!J zJLh3XEn5JwLq1GN6d>$#rYp#IDn&Iz1 z&ebgQwYVTb%Xl4}1fLoOAqO)0Minh`GsTQnf&v@YjI|ioL;%u+auv3n{QND!@H>WI z;t#^>bQgq)YQr3DmYaXvch`DIde9^Cc6Q0cRw0-E#S$u>BlGpR&j9#aB?Brt2;APw z*^&*7s^$+aL~hU{F{~G`KOabn$*D)ug98H-BfjrhG^lm`aTZ;u25MlUXib|`xUFCp zZW(0U-2j$)ZoRI-q4q&X5(+4XQW$kzzg>(Ovby-Fy)S&7V75IhYZ39jId*)deGL*PyW5|%PPSY#V5~uwg=r`# zCZ|BuSZK5#ZFkwc8QrETgb8-%ZTX4i3YLcS&f=(5*xLkg{OBu25|_6w2R<@aYdU8i zFS~3u#<>R81Lv}RcXw}^I~F^xA%sc#SVocjdm$N68JvRBOC4Xpy1Mz3p$Uu7iW;Nk z-){R#=IU7|#iy!>2_@YV=Jq4nW9QY;ZBph0yK^B z5ed}^_@*EyYe0&thOtE3VIaDvkyDZG7W$R)cK5B7r13-erPFhpBFgy%!rMMo34w*-^?%W;X3qmPfXXw@fl(@{K)F z7P{OPj6*<1<#}FS#Cm#0(qm+Llu}F@W(<;dh#u)s&#vCEAL1}Cu{^6R+#{K0#1b3$uN*0jDEx#4Mt9NPMUwFf*(B{!J<)ekKM zQAw>1MZnIXWN6@RFpsLH%4p||Y|B4K1^Zc7JEWFyWuL0zl@#=*ocClWIYLc%IbNyi zx99-6qiTv@!d%p@iuiWsbf*sPmYIu5^XRCmcBxdXJ+_*FC0g~6`%v(O=OpsrYb8h8 zyk3lZThc9OL~hvW#TW&G5CNqtI>o}g65DE92sd7(C#i1whHWbI5t_fhpzUZ1 z)c0=^>Z~z?O&ng=YScf)MNm0eDXlYzLu3mvaS3A(uS?(+xn1gXYMcHLWHff4`5q5 zU`)PZPDk-$coIIMpx&ApD&s_4ZqF*VhD=3@Rnw>tO#Bc`t3V3h z10TWD9D9i}wERFva;pS9(@-@#d9CKUWv%O(D@;Rhe}|0H40MUsBMpTtZ!0rD%b1ZY za0FcZhv_oCY`T-?3VS$F+|~8Fy@G|)S-ZfdODaII9qU(^#Xe(P`G5&yrzUOv2h}1j zWNloXW z`9cjHf0LP;>YSQBtHck=ErZgEs)}Z}ugD&5p`5x{dOKaauNxb0L{ZviNgZzdOc#aD zFrUHO>5Yezr1;b>=4t$>5|`aV-=H5%3D@4W5(E5Z&+>xsg}Ks&m!O;L3Y6~Rm>t? z3t6Rq(>BKAeS=XK+W7i5+S8P_MSeVK=@(MoGlkOouWwJ|`A@14@yau`?CgE|JaUE! zmHX`ioF>P-gOkv>pk_Pi+JojhIjSnS4IV5`cbB!)f@e-g^bQ_^Te5OXeBoSm^279b zjCZZkKzxfVo-t>#C>+o_e34iQ26^bKH1NDh11HE~f3VkxOTvZ4hC=JzWs;R>bi9_? zC-jbJrjO-cy-`m(42vG%h8a4v9vMuLE)*DI0t!aU$EjkyGbyeh)uw7=5Hv2>yPMOI zFrFYs?|3{NU&iTv>3{88P+K<*tbZiSe1+bClYJ2ZnVjOTW38|c%~vSq-#QbULu1UV zRR^nLqfu#oqcD_5HiWf@yQBe~`n5x>@FGCB^hBlxO3Ry^q_cIA_nsF#WFkzlc0YdzL?VB+UE_uvqFQgC;(kWrL| zP{ntKY`k&bu`<{g;_M+gL4K;^CNd}c8 za-QMqzdK@-7WCPGw|l#kZVgso#zC_@&?cg=tl@XqlseIAfx}x-$|E~o){eGo?^{b{ zQua2p0ur&17XM5y+&-Gh{)4-Ngg^BoPdQgP4C5TD_~WH(qvjXDi99UZn;;V!0~$Sk&ir85MM7^_pJo@`^SDCNXZZPp z`CuHTt%X|lc^W5;m7m)jojHcjEP+*vm#l3elVk<48OURrUCWOo*z=agKM{mPJXr_p znO%NM#5;vyiMEGdulZ(TQs$7qfge}OvDSqi?eHq~Hb9q`Va$$l4V@5imc*5V8GX$_ zugVlnn`gXuU#Ki?_$p+5q~jA|tmZIuIG-aYCNu(5;0@x#*D9&@!_yNI_4geG@}#1VtL)TXVD?cj~AHyrdYU$15mYq)%wqwkmw0 z$~^HEh8=xd$wpo{L$vv9Q(VQ99iiG7b}D4y^*+Wh=kq`=tBmW9oNI@H+M<33M2d9U zylCS_ABgva7)LdXx&(tDm=--ok_0UAsRdcoR*w|ov!k2qW7~GuP@R0x7j?Ehj`Bvd zCu|ku628dRmhl90R~q)=G9@mlYnfB6iIU1c#Py;x(ba8IDWtRz_F8J?h;IHsGd1v;1B2X4kKAtJi1_nm z`HT0>pL-U&-rP{3Iuoi|L)STRq1zUG){d3V5|rc@gH0$)PwZt5 z*YWhXrs&-5){+e`3SWkz3o4^vr?5)kYZnj44r0PAknBGpH%V!yCAanr)c0BbJQozN z?_UJ)8cF*yumi(e1UC^mZMzakvdFrU`;1x3ar8yx-iQ8L?6g{a(5-SufQ3{zJXAgv zULsF&LPJ8rl_RTHe4G$!LhtylMATZ;;>g;kwRKckzTlWQb0(I;%W_mRPq_-1 zHw(unEVL+sHHQTcEcRd#)fR{w;p{8J9VheZ4ZNdP6~{?b4d<)MYGQKB!oZ4XNuCR$ ze%z{%8;EdJs`B zrfB1K2(C_=t6Z~A!ZLLoF1fDp|Vj=ze4onPsk;Sz3JFu_aYe3PY2RF5__&*9YxtY5Q+)h~FgP zc*})Cu8)ui)wJfURH@@F1{Pl`t4asp0n}iG~61+OYh0p9Cp2T9mw;r8v zA5b($6gt*t2mlZ(zQ`W;Nu+k-e{#xfYFgbQLF=jLULX7_!k0?QncZ(L@ya%Jjx!=P zJq&7xi2UQk0I3h%r*v*B^(s2=R8`sI9_e(7MnoO)7v2S5m=U5fGVpvgNL@nfuHQJ~ zWopm`(fLS8ca?3$EmXlN;(4Qw3f{EBfR8XA!U<;f%PtsqyTAs9Att|%mngL8y*0jh z2WG5sJljh9>1x$y=W!CkTg|yZcya~fF4xugafrp&@i7v!y?H{;(Ujp5o{Jgu)@+(z zcpfX{717^(wG-UfXO$+DJ$vfP)wnl%L*Pi-x@w?%{yY_auWvL#Ddan5i()j$Ns&mh#T8AYFSy9hLTG>n zLW1u}(=Kq%Xh<)o=T`FqCBP_ng5=bmeQM>k1Cwv*VZ^0%2Oy(8M9>Lbcrg9ECuP{a zBE8@$+Ct(i#^tCPnpKd%k4gowVt9(UsHY~>CN z`ilW#4x`ok?rEBb}x`36^8BOr<-%#x!eBs42juj2SR+~5t*BErITl2@S& zDh)i~^5e0PPhvu|S=6b0|I1GYA;6|W+rG7=B1d^&zVU^#aG{zv3y7y#5f~bt=&{cH z7lD|8N<}$a(kw=yGAai|uJ0Gd%%?bq8Gog7!m{ft2+cL z@%CzGM1FQN`wAw%+R6OcV}ZvGT3-|0Z@d;XCUbl)xy{-RNfo_tJ%%pvF5>olEi~7w zdGYj{%> z@NFso$F0lv=3@j2NeOr@ur5pzg)R^Zd8K0yHma1!$0t8X7OG3J2&u5|QVnj>MOD|3 z9io1LfZA-Lfs!0cq%QO`2r`)Q3te-0eMpVfH=vJ~j1$lO*`+p_b_qgq1Ch%;$ORj| z2ln;*7&Rj!M#6=;hMTd_kMx*6IGV;nGAMJHPmBA}l%vF=^t)5N1uWKyRoOi~k27Z0 zcDMRRReGsmj}i=rBBrWXl;D>7#reECz+LAlhKy(hKO@<7EiE@weTiD%@e*T2p*u)| zSIA1MZ&3EG7k@*obNT4GtY_$sxjp6Bz z*P&vfK=2vF&N0UTp7D8yox;YTk&J;(>8~ZK5Apn1NF+nS#heVj?p!856HgBTiAo>K1>Y@=Z)u#*=cJtWw z=@|^vD5&%AgJ}2H#Qjb)OvSpqR8raG zo>K^|PwH-I1yxVZjG<)GWimWsk)uW)B(HIrDx$_S(e$-UtdDQL+PAg`Xhh7mS_a|l zXjGmeHRz+8ng^;1R13@{syfdIXn7P{5!&{ud&e5BiEH4nT_Nv1M>Jik@W9QHLeSf~ zV2e+b_Ln%1)E}<@;hwMWNETDw@Q9hPkz#7JdgRzsGLd0TsjnYGPZA`ajX>xHRgJmQ zD?Q48u)32u44h*ZCpr|gwtFl_yDW&-@-WTLwC_Ekl2su?2$gp3bqX0QOuxE^JLxD6 zZ4pCTg?N#XDOwC`-7X=;V7?S!Rvt01=H2FwdJ+`m1kjTQT^HR#tS4mL3tV44OR6^h zkx1dj%G&P9?(V?u?#J-jnoQguuK6~R-CgsY0bTQTOhCD)m>fx8iD0UOeVqU#er>LD z>6A!S=V?%TSxZs)>718*in4wdo=2?GyiqpkN>MSa@(UnZEuz1>p#L2+JanXI*D1BR zJo6cNx+y+Ihx~!4`6pKU;K9kFu9^sYHuYz>L3w(M$d+05!@Utf9>g6EDIJIu8_ETd z+Df53$iUOfE=^5yGV7;?Zm1XqgUzvG=|E0?=R`DpVZ`Idb{s)2nPo$C^5Ks)Sn+e_ z6^0&mBM|^M!mHj%jV8HDCgj@X%JS^BOfJ$uV!alZ-KlA6^e?P_L*=8`iE(lpOc0zL zFooywZqZ2l?CB@388)yApYr8bvQfQA{I{fUwK>=J!r=^W#5RZ2rY)DQ$bex9FpE#< zg40MFZJx^JX<@TSmE|D-#R2-*(fcwS9PW#E*L;C$HmGNcioad+4RgH7$ZQLp?<(huCR0yWx%WkXQN zIUcXJ!0 zB~#NJRoX4J%6pr@Q?16W6YLDBy;D~R{U}5xl*3kE#JD9p{=8 z&+9hoT6PF3e522>`)6%bwe|@P_^%vnB@j0@^FJDA$zoV7yP3}hn>~I9mxoZSLbLw< zh*=UGeWFS+p2;o+Gyd7h(ROokQOdsdHDc)z*dvPIaByQ0es4vB&irK{0!+O5Hkz>( zl}Sw$CSe3PVcBQx;xIdR`Gr_3*&Eb%Is}Mc{Fdb}QQm8ko|}zca*;5e21g3KNM=Ym z+P)EeV5eBm&ZFZC+0H8uga4)qEaQ2S?cjURD@@a)3R&yI2>f#Xh^MaA+;6&(#|+b> zviSRu6$~ROxG7REZ>A3(aCf5#B(Ir*9n%=fQu|KJzo+48)b}Y4)DR_wLN^xHG8-%D zF?UsufX89_QVfwzy}5t7VlgwdoTc>LuYQn^|W?h-5*~a}?SZYiq^cwpn zbMLpH7xlQtf*cy+{8}8Gn?y>G?87i;Ml)qcvc<6M%#!B!>z9)o2g>n?j)n!gV+^m9U7rHEmTy*Jlpz>a#1HC&`yk2G&u$ z3_E?-i1T-vpRo23L5-o!r36VmC|gsR>dXofgW*~*`_jpmjy~|p&So03o`wot9qRaF zMUZqJ1PfST7YYWv#Bm|+KD9)|`U2wkeqH6FcHL)E3mJ4LUyX7O1u)=hYZdOjSt7RUDk3(24LFXr_@X?afRA`gZyEg9n90B?`_m)e` zLR@_-i)l$u_a%_GEae~8Zfy|cvX2{lbr9dvKsvj4_9{D91y8A)OTQyMXrlyL!%|2t z_ca0x-y0W-QJ)(I$jvnHgt(*IY3JxdCKh6>bH8b^y4`qK40xO8vmVWPTD4r)Zpxi9 z3s-vw*OUF{6gu52gi{31_E76&922}T-MFeQLWp&q@`m9M)@MVY%Pz*U8~6w8Z-GI^ zCQ9FCCpM{trOGxe8FXH+uAN--eOTYWsOSG7CB)rQR)e*P*7-v)Flb~jFrEKOToHO( zJD`mo(9zBYKyL%IwKM}IKmYxQN|k@*YAVtZMDL`8cFhe)o!{k3+@$nl>N+LM)Ifd6 zOv+M)t2RnWZLJOplPKEQS2l(j!>9V>Vs8G~=OogTkC!hWQ3k!6M%I@aK>@VQK+&^N z0#2cjBShLY$q2A#tq44?Eu!~1NdXjV5i|HhdtohGe5ZAO;TX%$v7tOe%_$LJ_14tP zkSe|^_QteIK0h#nkVLAI;r)87@_eS;pV%J@if3!&$S_{ZHG=5fUq3IJSQ(8-H6g zR6HE*ITvRWK38ieQl;2YS<#dh>J~-6%qq#Klks4f_ z!@#q(hu1fv*m=a@>h>yIx8X(dW(H}HTK$=6I`Zc5Y-Vb(Eqy+mY-`@g=$iz&kc(2s z!lQH$@L)KK9hsV)QsaU(9?NGi@@vJEgi2?L%K=r)0mw5|JLci~kCb%)EAQFLkvNY% zIbtr|^j1Hb?UyA+=nN+8@l|+PajYtMj%h7@rJJw zC`x!x_5d2^CnIQRP+_iYwa73t2d5ueO$AG-s)(B4*i|gtrEG$H*UQdrQDkIZt_Dix zK8cPwzG^VM!R(?*G)MoNz_zUv`&^AhQ$qdAKfv>$nD=yJDtY+ zd<9a4zvc=|nVskbU{eX!DD|k4FOfkKUONOZY>($)92X#g*j{8vZjXKxG?Xx8-pmOU3|4bu)_n0}=VehBb%9oY6}nnf@OC{~J*^DOK!G@u6`K;FUF6Zc zghE}qgBj&u5<1h-{x$l8Y%hobJhBB`JwBQ`)I9`}db25H-8elWKMq5q<{KOlke7 z3roEbW4&H3s{0@e(itT#igA(a#K8`NgP4kF6&OsX$FFK^2#-^n@6lubuoQ(^f7gj9 zvvZO)rKF0!tBN#$zf5OCyMpF_H~4VDa}@O<;(g!#mhRLl}?J_^l~h{ zx||M%gGS@7?U!*#e2LoptK!yVKlRY2w2RUT(vskUJJmu6h+Z$j<*Id9 z4?G-J)R%J;H``r`=<6BK(Ho17vyXit6hGD5zT-;KM|c=vG5c~W7eIL7&$f%0gTPFa zYW$H{qn09<$gZ4+T&)(EPE?2J&dnYrPKj9p0mIU~g=?WZO7=D0Bu{@NJ?9)Pvl@I~ ztf1Fyy2q|N397USS`#sXgrBG9o#$1gF%*6Ut$C6 zYKDsyo|8evop3Z{E76g&={CmaV3z~+kw{lWPTz&`_BsnaOwgL*jSkWYz6>E zW)@aG4rYBOMtuWjb|AAJ3o|Rd1JKA=&kXpjMt5qu6YdLNx~K{g{_YRLYeDIL|HB$_ z0ri*+^x1Xw03cypKz%knJph11k3)}(l}R56H25pw=AE|(cfu|HAlwyXwf|7KE(ZrE zhXI!!3o9#=t}Z(#K$kVf`R1%K_2>(&B5URQaHfE*Z^p2 zcNa7An;HMiF+s)t{@e=M(f?(6mip2FbD*siK=1B|`1j^>=NI`*+*tx3?RbK;Bk_B2 zU|>~lmH%0RAeUg#XJ_Xy;9%4RvH^4rfVu{3`nrq&03$1ai|r3)xs&m06Z=s!w}RS? ze^ZlZ06UJkiB6hirno8qs(sRi_1<%Vv5&ziZz z0odDF+S(f$f~H}=y;1(2e>i{ayzfXiyk1GE;3u%C zft+m=^eXi3CsKE}e@1sdk{VdrnEx5=pSj$Ro!G6QljptC>KWNvn11)XJMDb{X-^~u zkR$+tyL+eoxv5_KBRsZ1fQ_CJXsI0(Yv0V6{x?c`J1etqP4ye6d9mwS3W#y>0T`GQ z==B=Pw4GOPEgvUJ7xYECa=JF0uPAo?j^?g8zbnu$_>WnpTN|!x3K~BFjfH2 zpl%F8{7XHPjwxykzdbBzD;&A-;9QWV@<1`rz)=<~D5-}wJ?lopo%;`|%m3|C!UxmzUwO}4>6 zvx48BDmUSPe**Nco$?Ol*J+IE?|gUjaFW3LApBQiv~OL_pHTpRqKLUiiXR7&-zQXm zhV-^uR!g3ep|{!{_glz&#ie?hfLg@ ze~9`=+&>4sYk@ky9@DD16t`hxgPX8*IB{~FHzyOOj< z?-}JUl=RKbCw>XP{+;Z__&t;TZ`_<_{yyP;i=z6o1%HjB`dv?1_l@#zEck1j(eGqL zpk;#}N6-Jx+W)svS|po2X9! literal 0 HcmV?d00001 diff --git a/core/components/simplesearch/docs/changelog.txt b/core/components/simplesearch/docs/changelog.txt index 52332d6..b0f69b0 100644 --- a/core/components/simplesearch/docs/changelog.txt +++ b/core/components/simplesearch/docs/changelog.txt @@ -1,6 +1,12 @@ Changelog for SimpleSearch. -SimpleSearch 2.1.0 +SimpleSearch 2.1.2 +======================================================================== +- Show facet results when default has none. +- Have all placeholders in no result page +- Fix pagination for pageLimit & facet search + +SimpleSearch 2.1.1 ======================================================================== - Fix includeTVList bug to show normal search results as well. From 3b447dbb6cd805c11e3cc1b48b46802d092c7be8 Mon Sep 17 00:00:00 2001 From: Gauke Pieter Sietzema Date: Tue, 2 Jul 2019 20:13:21 +0200 Subject: [PATCH 13/16] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index dfcacf8..449b9b5 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,8 @@ $('.simplesearch-search-form input[type="text"]').on('keyup', function () { ## Bugs and feature requests We value your feedback, feature requests and bug reports. Please issue them on [Github](https://github.com/Sterc/SimpleSearch/issues/new). + +# Free Extra +This is a free extra and the code is publicly available for you to change. The extra is being actively maintained and you're free to put in pull requests which match our roadmap. Please create an issue if the pull request differs from the roadmap so we can make sure we're on the same page. + +Need help? [Approach our support desk for paid premium support.](mailto:service@sterc.com) From 42fbde99b82002f52a3eb9a97723a3f1668af450 Mon Sep 17 00:00:00 2001 From: Tobias Vollert Date: Mon, 6 Jul 2020 18:12:05 +0200 Subject: [PATCH 14/16] Fixed wrong driver call --- .../simplesearch/model/simplesearch/simplesearch.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/components/simplesearch/model/simplesearch/simplesearch.class.php b/core/components/simplesearch/model/simplesearch/simplesearch.class.php index 66c660a..0e99a46 100644 --- a/core/components/simplesearch/model/simplesearch/simplesearch.class.php +++ b/core/components/simplesearch/model/simplesearch/simplesearch.class.php @@ -565,7 +565,7 @@ public function prepareResourceForIndex(array $resourceArray = []) */ public function indexAllResources($scriptProperties) { - $search = $this->loadDriver($scriptProperties); + $this->loadDriver($scriptProperties); $includeTVs = $this->modx->getOption('includeTVs', $scriptProperties, true); $processTVs = $this->modx->getOption('processTVs', $scriptProperties, true); @@ -591,7 +591,7 @@ public function indexAllResources($scriptProperties) } } - if ($search->driver->index($resourceArray, false)) { + if ($this->driver->index($resourceArray, false)) { $this->modx->log(modX::LOG_LEVEL_INFO, '[SimpleSearch] Indexing Resource: ' . $resourceArray['pagetitle']); $total++; } From 602a566c8f094b977ba048979657e5bb489d191a Mon Sep 17 00:00:00 2001 From: Tobias Vollert Date: Mon, 6 Jul 2020 18:12:31 +0200 Subject: [PATCH 15/16] Modified some elastica calls --- .../simplesearchdriverelastic.class.php | 276 ++++++++++-------- 1 file changed, 147 insertions(+), 129 deletions(-) diff --git a/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverelastic.class.php b/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverelastic.class.php index 1566acd..8827458 100644 --- a/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverelastic.class.php +++ b/core/components/simplesearch/model/simplesearch/driver/simplesearchdriverelastic.class.php @@ -55,35 +55,37 @@ public function initialize() protected function defaultSetup() { return [ - 'number_of_shards' => 5, - 'number_of_replicas' => 1, - 'analysis' => array( - 'analyzer' => array( - 'index' => array( - "type" => "custom", - "tokenizer" => "whitespace", - "filter" => array( - "asciifolding", - "lowercase", - "haystack_edgengram" + 'settings' => array( + 'number_of_shards' => 5, + 'number_of_replicas' => 1, + 'analysis' => array( + 'analyzer' => array( + 'index' => array( + "type" => "custom", + "tokenizer" => "whitespace", + "filter" => array( + "asciifolding", + "lowercase", + "haystack_edgengram" + ) + ), + 'default_search' => array( + "type" => "custom", + "tokenizer" => "whitespace", + "filter" => array( + "asciifolding", + "lowercase" + ) ) ), - 'default_search' => array( - "type" => "custom", - "tokenizer" => "whitespace", - "filter" => array( - "asciifolding", - "lowercase" + "filter" => array( + "haystack_ngram" => array( + "type" => "nGram" + ), + "haystack_edgengram" => array( + "type" => "edgeNGram" ) ) - ), - "filter" => array( - "haystack_ngram" => array( - "type" => "nGram" - ), - "haystack_edgengram" => array( - "type" => "edgeNGram" - ) ) ) ]; @@ -108,9 +110,11 @@ public function autoLoad($class) * @param array $scriptProperties The scriptProperties array from the SimpleSearch snippet * @return array */ - public function search($string, array $scriptProperties = []) - { - $fields = $this->modx->getOption('simplesearch.elastic.search_fields', null, 'pagetitle^20,introtext^10,alias^5,content^1'); + public function search($string,array $scriptProperties = array()) { + ini_set('display_errors', 1); + ini_set('error_reporting', E_ALL); + + $fields = $this->modx->getOption('sisea.elastic.search_fields', null, 'pagetitle^20,introtext^10,alias^5,content^1'); $fields = explode(',', $fields); $fields = array_map('trim', $fields); @@ -121,40 +125,38 @@ public function search($string, array $scriptProperties = []) return false; } - /** @var \Elastica\Query\MultiMatch $query */ - $query = new \Elastica\Query\MultiMatch(); - $query->setFields($fields); - $query->setQuery($string); + // $query = $this->getBoolRegexpQuery($string, $fields); + $query = $this->getMultiMatchQuery($string, $fields); + + + $customFilterScore = new \Elastica\Query\FunctionScore(); + $customFilterScore->setQuery($query); - $functionScore = new \Elastica\Query\FunctionScore(); - $functionScore->setQuery($query); - $searchBoosts = $this->modx->getOption('simplesearch.elastic.search_boost', null, ''); + $searchBoosts = $this->modx->getOption('sisea.elastic.search_boost', null, ''); $searchBoosts = explode('|', $searchBoosts); $searchBoosts = array_map('trim', $searchBoosts); $searchBoosts = array_keys(array_flip($searchBoosts)); $searchBoosts = array_filter($searchBoosts); - $boosts = []; + $boosts = array(); + + foreach ($searchBoosts as $boost) { - $arr = ['field' => '', 'value' => '', 'boost' => 1.0]; + $arr = array('field' => '', 'value' => '', 'boost' => 1.0); $field = explode('=', $boost); $field = array_map('trim', $field); $field = array_keys(array_flip($field)); $field = array_filter($field); - if (count($field) !== 2) { - continue; - } + if (count($field) != 2) continue; $value = explode('^', $field[1]); $value = array_map('trim', $value); $value = array_keys(array_flip($value)); $value = array_filter($value); - if (count($value) !== 2) { - continue; - } + if (count($value) != 2) continue; $arr['field'] = $field[0]; $arr['value'] = $value[0]; @@ -163,137 +165,134 @@ public function search($string, array $scriptProperties = []) $boosts[] = $arr; } - - if (!empty($boosts)) { - $weightQuery = new \Elastica\Query\AbstractQuery; + if (empty($boosts)) { + $customFilterScore->addWeightFunction(1, new \Elastica\Query\Term(array('type' => 'document'))); + } else { foreach ($boosts as $boost) { - $functionScore->addWeightFunction($boost['boost'], $weightQuery->addParam($arr['field'], $arr['value'])); + $customFilterScore->addWeightFunction($boost['boost'], new \Elastica\Filter\Query(array($boost['field'] => $boost['value']))); } } + /** @var \Elastica\Query $elasticaQuery */ $elasticaQuery = new \Elastica\Query(); - $elasticaQuery->setQuery($functionScore); - - /* Set limit. */ - $perPage = $this->modx->getOption('perPage', $scriptProperties, 10); - if (!empty($perPage)) { - $offset = $this->modx->getOption('start', $scriptProperties, 0); - $offsetIndex = $this->modx->getOption('offsetIndex', $scriptProperties, 'simplesearch_offset'); - - if (isset($_REQUEST[$offsetIndex])) { - $offset = (int)$_REQUEST[$offsetIndex]; - } - + $elasticaQuery->setQuery($customFilterScore); + + /* set limit */ + $perPage = $this->modx->getOption('perPage',$scriptProperties,10); + if (!empty($perPage)) { + $offset = $this->modx->getOption('start',$scriptProperties,0); + $offsetIndex = $this->modx->getOption('offsetIndex',$scriptProperties,'sisea_offset'); + if (isset($_REQUEST[$offsetIndex])) $offset = (int)$_REQUEST[$offsetIndex]; $elasticaQuery->setFrom($offset); $elasticaQuery->setSize($perPage); - } + } $elasticaFilterAnd = new \Elastica\Query\BoolQuery(); - /* Handle hidemenu option. */ - $hideMenu = (int) $this->modx->getOption('hideMenu', $scriptProperties, 2); - if ($hideMenu !== 2) { + /* handle hidemenu option */ + $hideMenu = $this->modx->getOption('hideMenu',$scriptProperties,2); + if ($hideMenu != 2) { $elasticaFilterHideMenu = new \Elastica\Query\Term(); $elasticaFilterHideMenu->setTerm('hidemenu', ($hideMenu ? 1 : 0)); - $elasticaFilterAnd->addFilter($elasticaFilterHideMenu); + $elasticaFilterAnd->addMust($elasticaFilterHideMenu); } - /* Handle contexts. */ - $contexts = $this->modx->getOption('contexts', $scriptProperties, ''); + /* handle contexts */ + $contexts = $this->modx->getOption('contexts',$scriptProperties,''); $contexts = !empty($contexts) ? $contexts : $this->modx->context->get('key'); - $contexts = explode(',', $contexts); - + $contexts = explode(',',$contexts); $elasticaFilterContext = new \Elastica\Query\Terms(); $elasticaFilterContext->setTerms('context_key', $contexts); - $elasticaFilterAnd->addFilter($elasticaFilterContext); - - /* Handle restrict search to these IDs. */ - $ids = $this->modx->getOption('ids', $scriptProperties, ''); - if (!empty($ids)) { - $idType = $this->modx->getOption('idType', $this->config, 'parents'); - $depth = $this->modx->getOption('depth', $this->config, 10); - $ids = $this->processIds($ids, $idType, $depth); - - $elasticaFilterId = new \Elastica\Query\Term(); - $elasticaFilterId->setTerm('id', $ids); - $elasticaFilterAnd->addFilter($elasticaFilterId); + $elasticaFilterAnd->addMust($elasticaFilterContext); + + /* handle restrict search to these IDs */ + $ids = $this->modx->getOption('ids',$scriptProperties,''); + if (!empty($ids)) { + $idType = $this->modx->getOption('idType',$this->config,'parents'); + $depth = $this->modx->getOption('depth',$this->config,10); + $ids = $this->processIds($ids,$idType,$depth); + + $elasticaFilterId = new \Elastica\Query\Terms(); + $elasticaFilterId->setTerms('id', $ids); + $elasticaFilterAnd->addMust($elasticaFilterId); } - /* Handle exclude IDs from search */ - $exclude = $this->modx->getOption('exclude', $scriptProperties, ''); + /* handle exclude IDs from search */ + $exclude = $this->modx->getOption('exclude',$scriptProperties,''); if (!empty($exclude)) { - $exclude = $this->cleanIds($exclude); - $exclude = explode(',', $exclude); - $elasticaFilterExcludeId = new \Elastica\Query\Term(); + $idType = $this->modx->getOption('idType',$this->config,'parents'); + $depth = $this->modx->getOption('depth',$this->config,10); + $exclude = $this->processIds($exclude,$idType,$depth); - $elasticaFilterExcludeId->setTerm('id', $exclude); - - $elasticaFilterNotId = new \Elastica\Filter\BoolNot($elasticaFilterExcludeId); - $elasticaFilterAnd->addFilter($elasticaFilterNotId); + $elasticaFilterExcludeId = new \Elastica\Query\Terms(); + $elasticaFilterExcludeId->setTerms('id', $exclude); + $elasticaFilterAnd->addMustNot($elasticaFilterExcludeId); } - /* Basic always-on conditions. */ - $elasticaFilterPublished = new \Elastica\Query\Term(); - $elasticaFilterPublished->setTerm('published', 1); - $elasticaFilterAnd->addFilter($elasticaFilterPublished); + /* basic always-on conditions */ + $elasticaFilterPublished = new \Elastica\Query\Term(); + $elasticaFilterPublished->setTerm('published', true); + $elasticaFilterAnd->addMust($elasticaFilterPublished); - $elasticaFilterSearchable = new \Elastica\Query\Term(); - $elasticaFilterSearchable->setTerm('searchable', 1); - $elasticaFilterAnd->addFilter($elasticaFilterSearchable); + $elasticaFilterSearchable = new \Elastica\Query\Term(); + $elasticaFilterSearchable->setTerm('searchable', true); + $elasticaFilterAnd->addMust($elasticaFilterSearchable); - $elasticaFilterDeleted = new \Elastica\Query\Term(); - $elasticaFilterDeleted->setTerm('deleted', 0); - $elasticaFilterAnd->addFilter($elasticaFilterDeleted); + $elasticaFilterDeleted = new \Elastica\Query\Term(); + $elasticaFilterDeleted->setTerm('deleted', false); + $elasticaFilterAnd->addMust($elasticaFilterDeleted); $elasticaQuery->setPostFilter($elasticaFilterAnd); - /* Sorting. */ + /* sorting */ if (!empty($scriptProperties['sortBy'])) { - $sortDir = $this->modx->getOption('sortDir', $scriptProperties, 'desc'); - $sortDirs = explode(',', $sortDir); - $sortBys = explode(',', $scriptProperties['sortBy']); - $dir = 'desc'; - $amountSortBys = count($sortBys); - - $sortArray = []; - for ($i = 0; $i < $amountSortBys; $i++) { + $sortDir = $this->modx->getOption('sortDir',$scriptProperties,'desc'); + $sortDirs = explode(',',$sortDir); + $sortBys = explode(',',$scriptProperties['sortBy']); + $dir = 'desc'; + $sortArray = array(); + for ($i=0;$i $dir); - $sortArray[] = [$sortBys[$i] => $dir]; } - - $elasticaQuery->setSort($sortArray); + //$elasticaQuery->setSort($sortArray); + $elasticaQuery->addSort( + ['publishedon' => 'desc'] + ); } - /* Prepare response array. */ - $response = [ - 'total' => 0, - 'start' => !empty($offset) ? $offset : 0, - 'limit' => $perPage, - 'status' => 0, + + /* prepare response array */ + $response = array( + 'total' => 0, + 'start' => !empty($offset) ? $offset : 0, + 'limit' => $perPage, + 'status' => 0, 'query_time' => 0, - 'results' => [], - ]; - $elasticaResultSet = $this->index->search($query); + 'results' => array(), + ); - $elasticaResults = $elasticaResultSet->getResults(); - $totalResults = $elasticaResultSet->getTotalHits(); + $elasticaResultSet = $this->index->search($elasticaQuery); + + $elasticaResults = $elasticaResultSet->getResults(); + $totalResults = $elasticaResultSet->getTotalHits(); if ($totalResults > 0) { - $response['total'] = $totalResults; + $response['total'] = $totalResults; $response['query_time'] = $elasticaResultSet->getTotalTime(); - $response['status'] = 1; - $response['results'] = []; + $response['status'] = 1; + $response['results'] = array(); foreach ($elasticaResults as $doc) { - $document = $doc->getData(); + $d = $doc->getData(); /** @var modResource $resource */ - $resource = $this->modx->newObject($document['class_key']); + $resource = $this->modx->newObject($d['class_key']); if ($resource->checkPolicy('list')) { - $response['results'][] = $document; + $response['results'][] = $d; } } } @@ -372,4 +371,23 @@ public function removeIndex($id) $type->getIndex()->refresh(); } + + /** + * It's multi match query realisations + * @author Robert Kuznetsov + * @param $string + * @param $fields + * @return \Elastica\Query\MultiMatch $query + */ + private function getMultiMatchQuery($string, $fields) { + /** @var \Elastica\Query\MultiMatch $query */ + $query = new \Elastica\Query\MultiMatch(); + $query->setFields($fields); + + $query->setQuery($string); + $query->setType('phrase'); + $query->setOperator('and'); + + return $query; + } } From 4ddb505cd40bfe1949f101f59ad7b4ee7d62801f Mon Sep 17 00:00:00 2001 From: Tobias Vollert Date: Mon, 6 Jul 2020 18:13:27 +0200 Subject: [PATCH 16/16] Fixed wrong inclusion --- .../driver/mysql/simplesearchdriverbasic.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/components/simplesearch/model/simplesearch/driver/mysql/simplesearchdriverbasic.class.php b/core/components/simplesearch/model/simplesearch/driver/mysql/simplesearchdriverbasic.class.php index 60d4ac9..06c9636 100644 --- a/core/components/simplesearch/model/simplesearch/driver/mysql/simplesearchdriverbasic.class.php +++ b/core/components/simplesearch/model/simplesearch/driver/mysql/simplesearchdriverbasic.class.php @@ -5,6 +5,5 @@ * * @package simplesearch */ -require_once __DIR__ . '/simplesearchdriverbasic.class.php'; - +require_once strtr(realpath(dirname(__DIR__)), '\\', '/') . '/simplesearchdriverbasic.class.php'; class SimpleSearchDriverBasic_mysql extends SimpleSearchDriverBasic {} \ No newline at end of file