From 7af0861305b1fdc97d463e96c7b18bf1f0f25016 Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Thu, 25 May 2023 17:39:41 +0200 Subject: [PATCH 1/9] update tab info --- Block/Adminhtml/Config/Credentials/Button.php | 4 +- Block/Adminhtml/Config/Support/Tab.php | 2 +- .../Adminhtml/Config/Support/TabTest.php | 6 +- composer.json | 4 +- etc/adminhtml/system/configuration.xml | 41 +-- etc/adminhtml/system/countries.xml | 11 +- etc/config.xml | 16 +- .../templates/config/parsing/streets.phtml | 21 +- .../templates/config/support/tab.phtml | 268 +++++++++--------- .../web/css/adminhtml_config_postcode.css | 12 +- 10 files changed, 179 insertions(+), 206 deletions(-) diff --git a/Block/Adminhtml/Config/Credentials/Button.php b/Block/Adminhtml/Config/Credentials/Button.php index bcbd242..9feb493 100644 --- a/Block/Adminhtml/Config/Credentials/Button.php +++ b/Block/Adminhtml/Config/Credentials/Button.php @@ -39,7 +39,7 @@ class Button extends Template implements RendererInterface { public const MODULE_NAME = 'TIG_Postcode'; - public const CREDENTIALS_URL = 'https://postcodeservice.nl'; + public const CREDENTIALS_URL = 'https://postcodeservice.com/#compare-packages'; // @codingStandardsIgnoreLine protected $_template = 'TIG_Postcode::config/credentials/button.phtml'; @@ -64,7 +64,7 @@ public function render(AbstractElement $element) */ public function getLabel() { - return __('Request Credentails'); + return __('Get Credentials'); } /** diff --git a/Block/Adminhtml/Config/Support/Tab.php b/Block/Adminhtml/Config/Support/Tab.php index 19e5ff7..512bc1d 100644 --- a/Block/Adminhtml/Config/Support/Tab.php +++ b/Block/Adminhtml/Config/Support/Tab.php @@ -40,7 +40,7 @@ class Tab extends Template implements RendererInterface { const MODULE_NAME = 'TIG_Postcode'; - const EXTENSION_VERSION = '1.5.5'; + const EXTENSION_VERSION = '1.5.6'; // @codingStandardsIgnoreLine protected $_template = 'TIG_Postcode::config/support/tab.phtml'; diff --git a/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php b/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php index eda0626..ba47bed 100644 --- a/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php +++ b/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php @@ -47,7 +47,7 @@ class TabTest extends TestCase public function testGetVersionNumber() { $instance = $this->getInstance(); - $this->assertSame('1.5.5', $instance->getVersionNumber()); + $this->assertSame('1.5.6', $instance->getVersionNumber()); } /** @@ -60,7 +60,7 @@ public function testGetSupportedMagentoVersions() 'moduleConfiguration' => $this->getConfigurationMock() ]); - $this->assertSame('2.3.7, 2.4.6', $instance->getSupportedMagentoVersions()); + $this->assertSame('2.4.4, 2.4.5, 2.4.6', $instance->getSupportedMagentoVersions()); } /**+ @@ -71,7 +71,7 @@ private function getConfigurationMock() $mock = $this->getFakeMock(ModuleConfiguration::class)->getMock(); $mockExpects = $mock->expects($this->once()); $mockExpects->method('getSupportedMagentoVersions'); - $mockExpects->willReturn('2.3.7, 2.4.6'); + $mockExpects->willReturn('2.4.4, 2.4.5, 2.4.6'); return $mock; } diff --git a/composer.json b/composer.json index 778c0fc..7a13dad 100644 --- a/composer.json +++ b/composer.json @@ -2,12 +2,12 @@ "name": "tig/postcode-magento2", "description": "TIG Magento 2 Postcode extension", "require": { - "php": "~7.0|~7.1|~7.2|~7.3|~7.4|~8.0|~8.1|~8.2", + "php": "~8.1|~8.2", "magento/module-checkout": ">=100.2.6,<=100.2.11|~100.3|~100.4", "magento/module-quote": ">=101.0.5,<=101.0.11|~101.1|~101.2" }, "type": "magento2-module", - "version": "1.5.5", + "version": "1.5.6", "license": "CC-BY-NC-ND-3.0", "authors": [ { diff --git a/etc/adminhtml/system/configuration.xml b/etc/adminhtml/system/configuration.xml index 40feb4c..209abfd 100644 --- a/etc/adminhtml/system/configuration.xml +++ b/etc/adminhtml/system/configuration.xml @@ -50,8 +50,8 @@ - The Client ID can be requested through the - 'Request Credentials' button below. For support contact TIG. + The Client ID can be requested via the + 'Request Credentials' button. tig_postcode/configuration/client_id 1 @@ -59,9 +59,9 @@ - - The Api key can be requested through the - 'Request Credentials' button below. For support contact TIG. + + The Client Secret can be requested via the + 'Request Credentials' button. Magento\Config\Model\Config\Backend\Encrypted tig_postcode/configuration/api_key @@ -69,11 +69,19 @@ + + TIG\Postcode\Block\Adminhtml\Config\Credentials\Button + + 1 + + + - 1177]]> + 1177]]> + Test credentials are limited to 50 requests per month. tig_postcode/configuration/client_id_test 2 @@ -82,22 +90,15 @@ - - 9SRLYBCALURPE2B]]> - Our test credentials are limited to 50 request per month. + + 9SRLYBCALURPE2B]]> + Test credentials are limited to 50 requests per month. Magento\Config\Model\Config\Backend\Encrypted tig_postcode/configuration/api_key_test 2 - - - TIG\Postcode\Block\Adminhtml\Config\Credentials\Button - - 1 - - @@ -113,7 +114,7 @@ + sortOrder="20" showInDefault="0" showInWebsite="0" showInStore="0"> TIG\Postcode\Block\Adminhtml\Config\Form\Field\Disable TIG\Postcode\Config\Source\Parser @@ -121,7 +122,7 @@ + sortOrder="30" showInDefault="0" showInWebsite="0" showInStore="0"> TIG\Postcode\Block\Adminhtml\Config\Form\Field\Disable TIG\Postcode\Config\Source\Parser @@ -129,8 +130,8 @@ - + sortOrder="30" showInDefault="0" showInWebsite="0" showInStore="0"> + TIG\Postcode\Block\Adminhtml\Config\Form\Field\Disable TIG\Postcode\Config\Source\Parser tig_postcode/configuration/fieldparsing_addition diff --git a/etc/adminhtml/system/countries.xml b/etc/adminhtml/system/countries.xml index 2c06087..35f7547 100644 --- a/etc/adminhtml/system/countries.xml +++ b/etc/adminhtml/system/countries.xml @@ -41,14 +41,21 @@ - + Magento\Config\Model\Config\Source\Yesno tig_postcode/countries/enable_nl_check - + + Magento\Config\Model\Config\Source\Yesno + tig_postcode/countries/enable_be_check + + + + Magento\Config\Model\Config\Source\Yesno tig_postcode/countries/enable_be_check diff --git a/etc/config.xml b/etc/config.xml index 9df1770..d5d5052 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -34,7 +34,7 @@ xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> - 2.3.7, 2.4.6 + 2.4.4, 2.4.5, 2.4.6 0 @@ -45,17 +45,23 @@ https://api.postcodeservice.com/nl - v3 + v5 json https://api.postcodeservice.com/be - v2 - v2 + v3 + v3 + + https://api.postcodeservice.com/de + v1 + v1 + 1 - 0 + 1 + 1 diff --git a/view/adminhtml/templates/config/parsing/streets.phtml b/view/adminhtml/templates/config/parsing/streets.phtml index c1fa191..f44019b 100644 --- a/view/adminhtml/templates/config/parsing/streets.phtml +++ b/view/adminhtml/templates/config/parsing/streets.phtml @@ -34,27 +34,8 @@

- - escapeHtml(__('Back-end merging')); ?> - + escapeHtml(__('No advanced settings in this version.')); ?>

- escapeHtml( - __('These settings have impact on how street address data is stored in the database.') - ); -?> -
- escapeHtml( - __('Tampering with the settings may affect the workflow of' . - ' third party extensions. Use at your own risk.') - ); -?> -
- - escapeHtml( - __('Note: These settings are disabled in this new release. ' . - 'If you still need this functionality please contact support') - );?> -
diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index 1256389..dddd043 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -34,96 +34,177 @@
-

escapeHtml(__('Legend'));?>

+

escapeHtml(__('Legend')); ?>

  • - escapeHtml(__('Extension status'));?>: - escapeHtml(__('Disabled'));?> + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Disabled')); ?>
  • - escapeHtml(__('Extension status'));?>: - escapeHtml(__('Test Mode'));?> + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Test Mode')); ?>
  • - escapeHtml(__('Extension status'));?>: - escapeHtml(__('Live Mode'));?> + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Live Mode')); ?>
-

escapeHtml(__('Documentation'));?>

- +

escapeHtml(__('Documentation')); ?>

+

escapeHtml(__('Postcode Service USP')); ?>

+
+
+
    +
  • + + + +
  • escapeHtml(__('No analytic data collection')); ?> +
  • +
+
    +
  • + + + +
  • +
  • escapeHtml(__('Super fast, made for webshops')); ?>
  • +
+
    +
  • + + + +
  • +
  • escapeHtml(__('Logistic vendors independent')); ?>
  • +
+
    +
  • + + + +
  • +
  • escapeHtml(__('Support by phone')); ?>
  • +
+
+
-

escapeHtml(__('Extension version'));?>

+

escapeHtml(__('Extension version')); ?>

  • - escapeHtml(__('Postcode Service version'));?>: + escapeHtml(__('Postcode Service version')); ?>: - getVersionNumber() . - $block->getStability(); + getVersionNumber() . + $block->getStability(); ?>
-

escapeHtml(__('Magento & 3rd party version compatibility'));?>

+

escapeHtml(__('Magento version compatibility')); ?>

  • - escapeHtml(__('Magento Enterprise Edition version'));?>: + escapeHtml(__('Magento Community Edition')); ?>: - getSupportedMagentoVersions(); ?> + getSupportedMagentoVersions(); ?>
  • - escapeHtml(__('Magento Community Edition version'));?>: + escapeHtml(__('Magento Commerce Edition')); ?>: - getSupportedMagentoVersions(); ?> + getSupportedMagentoVersions(); ?> +
  • +
+
+

escapeHtml(__('Third party compatibility')); ?>

+
+
    +
  • + + escapeHtml(__('One Step Checkout (OneStepCheckout.com)')); ?>: + + Not supported +
  • +
  • + + escapeHtml(__('MagePlaza')); ?>: + + Not supported +
  • +
  • + + escapeHtml(__('Amasty')); ?>: + + Not supported
@@ -133,13 +214,10 @@
-

escapeHtml(__('Support'));?>

+

escapeHtml(__('Support')); ?>

- -
-
-

escapeHtml(__('Advantages of the Postcode Service'));?>

-
- -
+
diff --git a/view/adminhtml/web/css/adminhtml_config_postcode.css b/view/adminhtml/web/css/adminhtml_config_postcode.css index a26d598..c878adf 100644 --- a/view/adminhtml/web/css/adminhtml_config_postcode.css +++ b/view/adminhtml/web/css/adminhtml_config_postcode.css @@ -292,17 +292,7 @@ float: left; height: 45px; margin-left: 60px; - background-size: auto 35px; -} - -.postcode-config-page .page-main-actions .page-actions .page-actions-inner:after { - background-image: url(../images/TIG_Logo.svg) !important; - background-repeat: no-repeat; - content: ' '; - width: 50px; - float: left; - height: 45px; - background-size: auto 35px; + background-size: 35px; } /* Identity - Content =============================================================================================== */ From dd1a58f453cf54374ef3991399a25e3cdd161d27 Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Mon, 19 Jun 2023 17:03:18 +0200 Subject: [PATCH 2/9] simplify header tab --- .../templates/config/support/tab.phtml | 111 +++--------------- 1 file changed, 17 insertions(+), 94 deletions(-) diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index dddd043..ffc54af 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -90,6 +90,22 @@
+

escapeHtml(__('Support')); ?>

+
+
    +
  • + support@postcodeservice.com'); ?> +
  • +
+ +
+

escapeHtml(__('Postcode Service USP')); ?>

@@ -132,21 +148,9 @@
  • escapeHtml(__('Logistic vendors independent')); ?>
  • -
      -
    • - - - -
    • -
    • escapeHtml(__('Support by phone')); ?>
    • -
    +
    @@ -210,85 +214,4 @@
    - - -
    -
    -

    escapeHtml(__('Support')); ?>

    -
    - -
    - - From 0a0e65ef76a25463f08d093146f96d2db80e01bc Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Tue, 20 Jun 2023 10:06:32 +0200 Subject: [PATCH 3/9] minor text changes --- etc/adminhtml/system/support.xml | 2 +- .../templates/config/support/tab.phtml | 40 ++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/etc/adminhtml/system/support.xml b/etc/adminhtml/system/support.xml index ad20f0d..a01eebb 100644 --- a/etc/adminhtml/system/support.xml +++ b/etc/adminhtml/system/support.xml @@ -35,7 +35,7 @@ - + TIG\Postcode\Block\Adminhtml\Config\Form\Field\Fieldset tig_postcode-section 1 diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index ffc54af..e5bf19e 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -34,7 +34,7 @@
    -

    escapeHtml(__('Legend')); ?>

    +

    escapeHtml(__('Legend of colors')); ?>

      @@ -133,7 +155,7 @@ fill="#009f3e"/> -
    • escapeHtml(__('Super fast, made for webshops')); ?>
    • +
    • escapeHtml(__('Superfast performance with our core architecture designed for webshops')); ?>
    • @@ -146,7 +168,7 @@ fill="#009f3e"/>
    • -
    • escapeHtml(__('Logistic vendors independent')); ?>
    • +
    • escapeHtml(__('Always available because we are independent of logistics vendors')); ?>
    @@ -159,7 +181,7 @@
    • - escapeHtml(__('Postcode Service version')); ?>: + escapeHtml(__('Postcode Service')); ?>: getVersionNumber() . @@ -194,7 +216,7 @@
      • - escapeHtml(__('One Step Checkout (OneStepCheckout.com)')); ?>: + escapeHtml(__('OneStepCheckout.com')); ?>: Not supported
      • From aa370220013d9ab3bedf8fbac37d1903c7c8a037 Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Tue, 20 Jun 2023 13:06:25 +0200 Subject: [PATCH 4/9] changed usp order --- view/adminhtml/templates/config/support/tab.phtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index e5bf19e..c360523 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -141,8 +141,8 @@ 0.4,1 0,1.4l0,0-16,16.6c-0.2,0.2-0.4,0.3-0.7,0.3-0.3,0-0.5-0.1-0.7-0.3l-7.8-8.4-.2-.3z" fill="#009f3e"/> -
      • escapeHtml(__('No data is collected for analytics or sales')); ?>
      • +
      • escapeHtml(__('Superfast performance with our core architecture designed for webshops')); ?>
      • @@ -155,7 +155,7 @@ fill="#009f3e"/>
      • -
      • escapeHtml(__('Superfast performance with our core architecture designed for webshops')); ?>
      • +
      • escapeHtml(__('Always available because we are independent of logistics vendors')); ?>
      • @@ -167,8 +167,8 @@ 0.4,1 0,1.4l0,0-16,16.6c-0.2,0.2-0.4,0.3-0.7,0.3-0.3,0-0.5-0.1-0.7-0.3l-7.8-8.4-.2-.3z" fill="#009f3e"/> +
      • escapeHtml(__('No data is collected for analytics or sales')); ?>
      • -
      • escapeHtml(__('Always available because we are independent of logistics vendors')); ?>
    From 3c7dfa986ebe36e4d143154ba8cdea7cb8ab0d7c Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Tue, 20 Jun 2023 16:13:36 +0200 Subject: [PATCH 5/9] changed order of legend colors --- .../templates/config/support/tab.phtml | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index c360523..a07af7c 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -34,27 +34,6 @@
    -

    escapeHtml(__('Legend of colors')); ?>

    -
    -
      -
    • - - escapeHtml(__('Extension status')); ?>: - escapeHtml(__('Disabled')); ?> -
    • -
    • - - escapeHtml(__('Extension status')); ?>: - escapeHtml(__('Test Mode')); ?> -
    • -
    • - - escapeHtml(__('Extension status')); ?>: - escapeHtml(__('Live Mode')); ?> -
    • -
    -
    -

    escapeHtml(__('Documentation')); ?>

      @@ -90,6 +69,27 @@
    +

    escapeHtml(__('Legend of colors')); ?>

    +
    +
      +
    • + + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Disabled')); ?> +
    • +
    • + + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Test Mode')); ?> +
    • +
    • + + escapeHtml(__('Extension status')); ?>: + escapeHtml(__('Live Mode')); ?> +
    • +
    +
    +

    escapeHtml(__('Support')); ?>

    diff --git a/view/adminhtml/web/css/adminhtml_config_postcode.css b/view/adminhtml/web/css/adminhtml_config_postcode.css index c878adf..630131e 100644 --- a/view/adminhtml/web/css/adminhtml_config_postcode.css +++ b/view/adminhtml/web/css/adminhtml_config_postcode.css @@ -35,19 +35,33 @@ * * =================================================================================================================== */ -#section { float: left; width: 100%; clear: both; } -#supporttab { margin-left: 4rem; } -#supporttab #section { border-bottom: 1px solid #cccccc; } -#supporttab #section:last-child { border-bottom: none; } +#section { + float: left; + width: 100%; + clear: both; +} + +#supporttab { + margin-left: 4rem; +} + +#supporttab #section { + border-bottom: 1px solid #cccccc; +} + +#supporttab #section:last-child { + border-bottom: none; +} /* Default styling collapsible tabs */ .collapse-title[aria-expanded=true] h3:before { - font-family:'Admin Icons'; + font-family: 'Admin Icons', serif; content: '\e615'; } + .collapse-title h3:before { - font-family:'Admin Icons'; + font-family: 'Admin Icons', serif; font-weight: lighter; content: '\e616'; padding-right: 10px; @@ -56,15 +70,16 @@ .collapse-content { box-sizing: border-box; - padding:0 15px 15px 15px; - height:auto !important; - float:left; width: 100%; + padding: 0 15px 15px 15px; + height: auto !important; + float: left; + width: 100%; } #supporttab h3 { font-size: 1.7rem; - margin:0 !important; - padding:1.9rem 2.7rem 1.9rem 1rem; + margin: 0 !important; + padding: 1.9rem 2.7rem 1.9rem 1rem; color: black; font-weight: 600; cursor: pointer; @@ -72,9 +87,9 @@ #supporttab h4 { font-size: 1.1em; - margin:20px 0 5px 0; - padding:0; - color: rgba(0,136,204,1); + margin: 20px 0 5px 0; + padding: 0; + color: rgba(0, 136, 204, 1); } #supporttab p { @@ -83,7 +98,7 @@ #supporttab ol, ul { margin-left: 20px; - position :relative; + position: relative; } #supporttab ul li { @@ -93,7 +108,7 @@ } .postcode-config-page .section-config { - box-sizing:border-box; + box-sizing: border-box; padding-left: 20px; margin-left: 10px; position: relative; @@ -124,7 +139,6 @@ } - /* SupportTab - Legend ============================================================================================== */ #block { @@ -140,13 +154,13 @@ .block-legend { padding: 10px; - float:left; - width:100%; + float: left; + width: 100%; } -@media screen and (min-width: 1200px){ +@media screen and (min-width: 1200px) { .block-legend { - float:left; + float: left; width: 50%; } } @@ -155,32 +169,33 @@ .live span.text, .test span.text { margin-right: 15px; - font-weight: 600; + font-weight: 400; } -.disabled{ - border-left: 5px solid #CCCCCC; - padding-left: 10px; +.disabled { + border-left: 30px solid #CCCCCC; + padding-left: 15px; } .live { - border-left: 5px solid #49AB43; - padding-left: 10px; + border-left: 30px solid #49AB43; + padding-left: 15px; } .test { - border-left: 5px solid #FFC107; - padding-left: 10px; + border-left: 30px solid #FFC107; + padding-left: 15px; } .advanced span.img { - display:block; - float:left; - margin-top: 2px; margin-right:10px; + display: block; + float: left; + margin-top: 2px; + margin-right: 10px; border: 6px solid; border-color: transparent transparent transparent #ff2e31; - width:0; - height:0; + width: 0; + height: 0; } /* SupportTab - 3rd Party | Version compatibility =================================================================== */ @@ -190,40 +205,44 @@ } .block-version { - padding:10px; + padding: 10px; background: #F8F8F8; - float:left; + float: left; width: calc(100% - 20px); box-sizing: border-box; } -@media screen and (min-width: 1200px){ +@media screen and (min-width: 1200px) { .block-version { - float:left; + float: left; width: 45%; } } + #supporttab .version-compatibility { - float:left; + float: left; width: calc(100% - 30px); - clear:both; + clear: both; } + #supporttab .version-compatibility li { clear: both; margin-bottom: 15px; - float:left; + float: left; width: 100%; } -#supporttab .version-compatibility span.text { + +#supporttab .version-compatibility span.text { font-weight: 600; - float:left; + float: left; width: calc(50% - 20px); } -#supporttab .version-compatibility span.version { - float:left; + +#supporttab .version-compatibility span.version { + float: left; width: calc(50% - 30px); - text-align:right; + text-align: right; margin-left: 10px; } @@ -266,15 +285,15 @@ } .postcode-section .admin__page-nav-link:after { - float:right; + float: right; width: 30px; height: 45px; - margin-top:-10px; + margin-top: -10px; margin-right: 3px; background-image: url(../images/postcode_service_logo_monogram.svg) !important; background-size: 25px !important; - background-repeat:no-repeat; + background-repeat: no-repeat; content: ' '; } @@ -307,14 +326,14 @@ content: ' '; width: 150px; - float:right; + float: right; height: 50px; background-size: auto 50px; } -.postcode-config-page #container:before { +.postcode-config-page #container:before { content: 'Postcode Service International'; - text-indent: 0px; + text-indent: 0; float: left; height: 50px; background-size: auto 50px; @@ -328,16 +347,17 @@ /* SupportTab - Support ============================================================================================= */ .support-postcode-tig ul { - float:left; - width:100%; - clear:both; + float: left; + width: 100%; + clear: both; margin-bottom: 0; } .support-postcode-tig li.first { - font-weight :600; + font-weight: 600; width: 300px; } + .support-postcode-tig li.last { width: 200px; } @@ -345,26 +365,34 @@ .support-postcode-tig li.first, .support-postcode-tig li.last { line-height: normal; - float:left; + float: left; +} + +.support-postcode-tig .block_contact svg { + height: 16px; + position: absolute; + top: 5px; } -.support-postcode-tig .block_contact svg { height: 16px; position: absolute; top: 5px; } -.support-postcode-tig .block_contact span { margin-left:26px; } +.support-postcode-tig .block_contact span { + margin-left: 26px; +} /* SupportTab - Advantages ============================================================================================= */ .advantages-postcode-tig ul { - float:left; - width:100%; - clear:both; + float: left; + width: 100%; + clear: both; margin-bottom: 0; } .advantages-postcode-tig li.first { - font-weight :600; + font-weight: 400; width: 40px; } + .advantages-postcode-tig li.last { width: 300px; } @@ -372,35 +400,46 @@ .advantages-postcode-tig li.first, .advantages-postcode-tig li.last { line-height: normal; - float:left; + float: left; + margin-right: 5px; } -.advantages-postcode-tig .block_usp svg { height: 16px; position: absolute; top: 5px; left: -250px;} -.advantages-postcode-tig .block_usp span { margin-left:26px; } - - +.advantages-postcode-tig .block_usp svg { + height: 16px; + position: absolute; + top: 5px; + left: -240px; +} +.advantages-postcode-tig .block_usp span { + margin-left: 30px; +} /* Specific Select element fix ====================================================================================== */ -#tig_postcode_productoptions_supported_options option { white-space: normal; } -#tig_postcode_productoptions_supported_options option:before { content: ''; } +#tig_postcode_productoptions_supported_options option { + white-space: normal; +} + +#tig_postcode_productoptions_supported_options option:before { + content: ''; +} /* TIG Admin 2 Columns col-set ====================================================================================== */ .tig-admin-col-set.box { background: #F8F8F8; padding: 10px; - box-sizing:border-box; + box-sizing: border-box; } .tig-admin-col-set { - float:left; - width:100%; + float: left; + width: 100%; } .tig-admin-col-set .col { - float:left; + float: left; width: 50%; padding: 20px; } @@ -408,10 +447,9 @@ /* From buttons ===================================================================================================== */ .tig-form-button { background-color: #eb5202; - border-color: #eb5202; color: #ffffff; text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.25); - border: 1px solid; + border: 1px solid #eb5202; border-radius: 0; display: inline-block; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; @@ -431,13 +469,13 @@ text-decoration: none; } -.tig-form-button a{ +.tig-form-button a { font-size: 1.6rem; letter-spacing: .025em; color: #ffffff; padding: 0.6rem 1em 0.6rem; } -.tig-form-button a:hover{ +.tig-form-button a:hover { text-decoration: none; } From 418c2a8d22cb8dc62c4c2dbee806a5b922108ca6 Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Thu, 5 Oct 2023 11:24:30 +0200 Subject: [PATCH 7/9] 1.6.0 rc1 --- .github/issue_template.md | 2 +- Block/Adminhtml/Config/Credentials/Button.php | 4 +- Block/Adminhtml/Config/Support/Tab.php | 2 +- Config/Provider/ApiConfiguration.php | 57 +-- Config/Provider/ClientConfiguration.php | 2 +- Config/Source/Modus.php | 2 +- Config/Source/Parser.php | 2 +- Helper/TigFieldsHelper.php | 4 +- NEWS.md | 148 ++++++++ .../GuestPaymentInformationManagement.php | 2 +- .../Model/PaymentInformationManagement.php | 2 +- .../Model/Checkout/LayoutProcessorPlugin.php | 81 ++-- README.md | 152 ++++++-- SECURITY.md | 22 +- Services/Converter/Factory.php | 8 +- Services/Converter/Request.php | 26 +- Services/Converter/Response.php | 2 +- Services/Validation/Factory.php | 8 +- Services/Validation/Request.php | 67 ++-- Services/Validation/Response.php | 132 ++----- Services/Validation/ValidationInterface.php | 2 +- .../Config/Credentials/ButtonTest.php | 4 +- .../Adminhtml/Config/Support/TabTest.php | 2 +- .../Config/Provider/ApiConfigurationTest.php | 6 +- .../Provider/ClientConfigurationTest.php | 4 +- Test/Unit/Services/Converter/FactoryTest.php | 8 +- Test/Unit/Services/Converter/ResponseTest.php | 12 +- Test/Unit/Services/Validation/FactoryTest.php | 8 +- Test/Unit/Services/Validation/RequestTest.php | 4 +- .../Unit/Services/Validation/ResponseTest.php | 2 +- Test/Unit/Webservice/ApiTest.php | 8 +- .../Webservice/Endpoints/GetAddressTest.php | 2 +- Webservices/Api.php | 21 +- Webservices/Endpoints/GetAddress.php | 6 +- Webservices/Endpoints/GetBePostcode.php | 6 +- Webservices/Endpoints/GetBeStreet.php | 4 +- composer.json | 2 +- etc/adminhtml/system.xml | 2 +- etc/adminhtml/system/configuration.xml | 29 +- etc/adminhtml/system/support.xml | 2 +- etc/config.xml | 15 + i18n/en_US.csv | 25 +- i18n/fr_FR.csv | 25 +- i18n/nl_BE.csv | 28 +- i18n/nl_NL.csv | 30 +- .../templates/config/credentials/button.phtml | 2 +- .../templates/config/parsing/streets.phtml | 2 +- .../templates/config/support/tab.phtml | 285 ++++++++------ .../web/css/adminhtml_config_postcode.css | 21 +- view/adminhtml/web/images/TIG_Logo.svg | 1 - .../adminhtml/web/images/external_link_32.png | Bin 1557 -> 0 bytes .../postcode_service_external_link_32.svg | 1 + .../postcode_service_green_arrow_32.svg | 1 + .../images/postcode_service_logo_color.svg | 31 +- .../images/postcode_service_logo_monogram.svg | 7 +- .../js/form/element/helpers/countryHelper.js | 51 +-- view/base/web/js/helper/postcode-api.js | 42 ++- view/base/web/js/helper/reorder-fields.js | 7 +- .../web/js/postcode-handler/postcode-be.js | 357 +++++++++++------- .../js/postcode-handler/postcode-handler.js | 4 +- .../web/js/postcode-handler/postcode-nl.js | 143 +++---- view/frontend/web/css/postcode_main.css | 2 - view/frontend/web/images/indicator.gif | Bin 1553 -> 1434 bytes .../action/create-shipping-address-mixin.js | 34 +- .../template/form/element/postcode-field.html | 2 +- 65 files changed, 1194 insertions(+), 781 deletions(-) create mode 100644 NEWS.md delete mode 100644 view/adminhtml/web/images/TIG_Logo.svg delete mode 100644 view/adminhtml/web/images/external_link_32.png create mode 100644 view/adminhtml/web/images/postcode_service_external_link_32.svg create mode 100644 view/adminhtml/web/images/postcode_service_green_arrow_32.svg diff --git a/.github/issue_template.md b/.github/issue_template.md index a8b4ac1..7f28397 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -44,4 +44,4 @@ Issues with outdated version will be rejected. ### TIG support -- Please ask your question in English to ensure that your issue can help other people internationally. Nevertheless we will respond in English. +- Please ask your question in English to ensure that your issue can help other people internationally. Nevertheless, we will respond in English. diff --git a/Block/Adminhtml/Config/Credentials/Button.php b/Block/Adminhtml/Config/Credentials/Button.php index 9feb493..143d22a 100644 --- a/Block/Adminhtml/Config/Credentials/Button.php +++ b/Block/Adminhtml/Config/Credentials/Button.php @@ -62,9 +62,9 @@ public function render(AbstractElement $element) * * @return \Magento\Framework\Phrase */ - public function getLabel() + public function getSignUpLabel() { - return __('Get Credentials'); + return __('Sign Up For A Paid Account'); } /** diff --git a/Block/Adminhtml/Config/Support/Tab.php b/Block/Adminhtml/Config/Support/Tab.php index 512bc1d..0404a8a 100644 --- a/Block/Adminhtml/Config/Support/Tab.php +++ b/Block/Adminhtml/Config/Support/Tab.php @@ -40,7 +40,7 @@ class Tab extends Template implements RendererInterface { const MODULE_NAME = 'TIG_Postcode'; - const EXTENSION_VERSION = '1.5.6'; + const EXTENSION_VERSION = '1.6.0'; // @codingStandardsIgnoreLine protected $_template = 'TIG_Postcode::config/support/tab.phtml'; diff --git a/Config/Provider/ApiConfiguration.php b/Config/Provider/ApiConfiguration.php index 7b3e711..d4e2c54 100644 --- a/Config/Provider/ApiConfiguration.php +++ b/Config/Provider/ApiConfiguration.php @@ -29,26 +29,31 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Config\Provider; class ApiConfiguration extends AbstractConfigProvider { - public const XPATH_API_BASE = 'tig_postcode/api/base'; - public const XPATH_API_VERSION = 'tig_postcode/api/version'; - public const XPATH_API_TYPE = 'tig_postcode/api/type'; + public const XPATH_API_BASE = 'tig_postcode/api/base'; + + public const XPATH_API_VERSION = 'tig_postcode/api/version'; + + public const XPATH_API_TYPE = 'tig_postcode/api/type'; + + public const XPATH_API_BE_BASE = 'tig_postcode/api_be/base'; - public const XPATH_API_BE_BASE = 'tig_postcode/api_be/base'; - public const XPATH_API_BE_POSTCODE_VERSION = 'tig_postcode/api_be/postcode_version'; - public const XPATH_API_BE_STREET_VERSION = 'tig_postcode/api_be/street_version'; + public const XPATH_API_BE_POSTCODE_VERSION = 'tig_postcode/api_be/postcode_version'; + + public const XPATH_API_BE_STREET_VERSION = 'tig_postcode/api_be/street_version'; /** * Get base Uri * * @return string */ - public function getBaseUri() + public function getBaseUri(): string { - return $this->getBase() . '/' . $this->getVersion() . '/' . $this->getType() . '/'; + return $this->getBase() . '/' . $this->getVersion() . '/'; } /** @@ -58,7 +63,7 @@ public function getBaseUri() * * @return string */ - public function getBeBaseUri($endpoint) + public function getBEBaseUri(string $endpoint): string { return $this->getBase('BE') . '/' . $this->getVersion('BE', $endpoint) . '/'; } @@ -66,12 +71,12 @@ public function getBeBaseUri($endpoint) /** * Get base path via country and store ID * - * @param string $country - * @param string|int|null $store + * @param string $country + * @param int|string|null $store * * @return mixed */ - public function getBase($country = 'NL', $store = null) + public function getBase(string $country = 'NL', int|string $store = null): mixed { $xpath = static::XPATH_API_BASE; if ($country == 'BE') { @@ -82,23 +87,27 @@ public function getBase($country = 'NL', $store = null) } /** - * Versioning for BE is not live yet. Implement this function in getBeBaseUri when this goes live. + * Versioning handling for multiple countries * - * @param string $country - * @param string|null $endpoint - * @param string|int|null $store + * @param string $country + * @param string|null $endpoint + * @param int|string|null $store * * @return mixed */ - public function getVersion($country = 'NL', $endpoint = null, $store = null) + public function getVersion(string $country = 'NL', string $endpoint = null, int|string $store = null): mixed { $xpath = static::XPATH_API_VERSION; - if ($country == 'BE' && $endpoint == 'postcode-find/') { - $xpath = static::XPATH_API_BE_POSTCODE_VERSION; - } - if ($country == 'BE' && $endpoint == 'street-find/') { - $xpath = static::XPATH_API_BE_STREET_VERSION; + if ($country == 'BE') { + switch ($endpoint) { + case 'zipcode-find/': + $xpath = static::XPATH_API_BE_POSTCODE_VERSION; + break; + case 'street-find/': + $xpath = static::XPATH_API_BE_STREET_VERSION; + break; + } } return $this->getConfigFromXpath($xpath, $store); @@ -107,11 +116,11 @@ public function getVersion($country = 'NL', $endpoint = null, $store = null) /** * Get type via store ID * - * @param string|int|null $store + * @param int|string|null $store * * @return mixed */ - public function getType($store = null) + public function getType(int|string $store = null): mixed { return $this->getConfigFromXpath(static::XPATH_API_TYPE, $store); } diff --git a/Config/Provider/ClientConfiguration.php b/Config/Provider/ClientConfiguration.php index a3ca8ba..8fef429 100644 --- a/Config/Provider/ClientConfiguration.php +++ b/Config/Provider/ClientConfiguration.php @@ -88,7 +88,7 @@ public function getClientId($store = null) * @return string * @throws \Exception */ - public function getApiKey($store = null) + public function getSecureCode($store = null) { $modusXpath = $this->getModusXpath(static::XPATH_CONFIGURATION_API_KEY, $store); $key = $this->getConfigFromXpath($modusXpath, $store); diff --git a/Config/Source/Modus.php b/Config/Source/Modus.php index f9d05ee..54449e9 100644 --- a/Config/Source/Modus.php +++ b/Config/Source/Modus.php @@ -40,7 +40,7 @@ class Modus implements ArrayInterface * * @return array */ - public function toOptionArray() + public function toOptionArray(): array { // @codingStandardsIgnoreStart $options = [ diff --git a/Config/Source/Parser.php b/Config/Source/Parser.php index 6dee860..6d53e88 100644 --- a/Config/Source/Parser.php +++ b/Config/Source/Parser.php @@ -44,7 +44,7 @@ class Parser implements ArrayInterface * * @return array */ - public function toOptionArray() + public function toOptionArray(): array { // @codingStandardsIgnoreStart $options = [ diff --git a/Helper/TigFieldsHelper.php b/Helper/TigFieldsHelper.php index ae4b973..64a46f7 100644 --- a/Helper/TigFieldsHelper.php +++ b/Helper/TigFieldsHelper.php @@ -64,7 +64,7 @@ public function __construct( * @param mixed $extensionAttributes * @param mixed $object */ - public function copyFieldsFromExtensionAttributesToObject($extensionAttributes, $object) + public function copyFieldsFromExtensionAttributesToObject($extensionAttributes, $object): void { if (empty($extensionAttributes)) { return; @@ -87,7 +87,7 @@ public function copyFieldsFromExtensionAttributesToObject($extensionAttributes, public function copyFieldsFromQuoteAddressToCustomerAddress( QuoteAddressInterface $quoteAddress, CustomerAddressInterface $customerAddress - ) { + ): void { try { foreach (self::TIG_FIELDS as $fieldName) { $value = $quoteAddress->getData($fieldName); diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..0f03194 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,148 @@ +# Postcode Service 1.6.0 Release + +## New features + +- Switched from Netherlands V3 API to Netherlands V5 API for quicker responses: + +from: + +```text +V3: https://api.postcodeservice.com/nl/v3/getAddress?postcode=4201KB&huisnummer=63 +``` + +to: + +```text +V5: https://api.postcodeservice.com/nl/v5/find?zipcode=4201KB&houseno=63 +``` + +- Added support for Belgium bilingual results in bilingual municipalities, + see https://developers.postcodeservice.com/#belgium-api-GETbe-v3-zipcode-find +- Switched from Belgium V2 API to Belgium V3 API, also enabling bilingual results for zipcodes, for + example: + +```text +V3: https://api.postcodeservice.com/be/v3/zipcode-find?zipcodezone=1050&multiresults=1 +``` + +```json +[ + { + "zipcode": 1050, + "city": "Brussel", + "latitude": 50.8222854, + "longitude": 4.3815707 + }, + { + "zipcode": 1050, + "city": "Bruxelles", + "latitude": 50.8222854, + "longitude": 4.3815707 + } + ... +] +``` + +- Added Germany as a configuration option in the Magento Admin panel, expanding geographical + support. +- Added Germany V1 API support in the Magento extension, for example this returns all zipcodes + starting with 4072XX when the end-user starts typing `4072..` in the zipcode field: + +```text +https://api.postcodeservice.com/de/v1/zipcode-find?zipcodezone=4072 +``` + +```json +[ + { + "zipcode": 40721, + "city": "Hilden" + }, + { + "zipcode": 40723, + "city": "Hilden" + }, + { + "zipcode": 40724, + "city": "Hilden" + } +] +``` + +- Added console logging and info message display when the Postcode Service API is called and an + issue occurs, for example when the authorization is failed, improving overal debuggability. The + code can be found in the folder `view/base/web/js/postcode-handler` in files `postcode-nl.js` + and `postcode-be.js`: + +```js +if (data.error_code) { + // show error in console + console.error('Postcodeservice.com extension: ' + JSON.stringify(data)); + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } +} + ``` + +- Added handling of rate limiting errors from api.postcodeservice.com in JSON format instead of + plain text. +- Revised and updated the Magento User manual to ensure it matches the latest changes. +- Updated `SECURITY.md` with GitHub’s private reporting option, providing a secure channel for issue + reporting. +- Successfully tested the extension with the new Magento 2.4.7-beta1, confirming compatibility and + performance. + +## UX/UC improvements + +- Substantially decreased the loading speed of the address results for the Netherlands, reducing the + wait time from 500 milliseconds to a mere 30 milliseconds by default. This can be changed + in `postcode-nl.js`, + see comment `// The last parameter is the delay in millisecond` in the file. +- Similarly, decreased the loading speed of the address results for Belgium from 500 milliseconds to + 50 milliseconds for + streets and 30 milliseconds for zipcodes by default. This can be changed in `postcode-be.js`, see + twice + the comment `// Parameter for the results delay in milliseconds`. +- Eliminated the redundant loading screen for Nederlands in Magento Checkout, enhancing the overall + user experience in the vanilla Magento Luma checkout theme. You can still turn this on in the + file `postcode-api.js` in the method `getPostCodeNL` by setting the variable `showLoader: false` to `true`. +- Deactivated advanced settings that were not being utilized, thereby simplifying the user + interface. +- Added new documentation links from within the extension to the Magento User manual and underlying + API. +- Integrated direct support form links to the Postcode Service support team in the Magento Admin + panel, ensuring more efficient assistance when required. +- Transitioned inline SVG images to external links, resulting in a cleaner codebase and smaller svg + files. +- Modified the external image link to align with the Postcode Service color scheme. +- Introduced explanatory text for test credentials in the Magento Admin panel to prevent confusion, + improving user comprehension. +- Revised info messages such as `Loading streets ...`, `Cannot find street, is it correct?` to be + more clear and consistent, enhancing + end-user communication clarity. +- Renamed menu item in `Stores -> Configuration -> Sales` name from `Postcode Service International` + to `Postcode Service` to make it more intuitive. + +## Fixed bugs + +- Rectified a typo error in the sign-up button. +- Undertook code refactoring in `tab.phtml`, `postcode-nl.js`, `postcode-be.js`, + and `postcode-handler.js` to improve readability and maintainability. +- Resolved a z-index/overlap issue on Belgium data fields that occurred when more than 7 results + were returned, ensuring proper display of the result set in the checkout. +- Addressed a bug where info messages such as `Loading zipcodes ...` could inadvertently be copied + into + the postcode, street, or city field. + +## Language changes + +- Updated the language files `nl_NL.csv`, `be_BE.csv`, and `fr_FR.csv` by adding new + JavaScript and PHP output strings for improved localization support. + +## Release credits + +- Thanks go out to the following people for contributing to this release: Robert, Tim S., Vincent, Erik de + Groot, Viktoriia and Peter S. diff --git a/Plugin/Checkout/Model/GuestPaymentInformationManagement.php b/Plugin/Checkout/Model/GuestPaymentInformationManagement.php index 78b77ae..718a29c 100644 --- a/Plugin/Checkout/Model/GuestPaymentInformationManagement.php +++ b/Plugin/Checkout/Model/GuestPaymentInformationManagement.php @@ -69,7 +69,7 @@ public function beforeSavePaymentInformation( $email, $paymentMethod, $address - ) { + ): void { if (!$address) { return; } diff --git a/Plugin/Checkout/Model/PaymentInformationManagement.php b/Plugin/Checkout/Model/PaymentInformationManagement.php index 4881e0e..f9004e4 100644 --- a/Plugin/Checkout/Model/PaymentInformationManagement.php +++ b/Plugin/Checkout/Model/PaymentInformationManagement.php @@ -37,7 +37,7 @@ public function beforeSavePaymentInformation( $cartId, $paymentMethod, $address - ) { + ): void { if (!$address) { return; } diff --git a/Plugin/Model/Checkout/LayoutProcessorPlugin.php b/Plugin/Model/Checkout/LayoutProcessorPlugin.php index fe872e3..f85c69a 100644 --- a/Plugin/Model/Checkout/LayoutProcessorPlugin.php +++ b/Plugin/Model/Checkout/LayoutProcessorPlugin.php @@ -41,8 +41,11 @@ class LayoutProcessorPlugin { private const MAGENTO_POSTCODE_COMPONENT_JS = "Magento_Ui/js/form/element/post-code"; + private const TIG_POSTCODE_COMPONENT_JS = "TIG_Postcode/js/form/element/tig-postcode-field"; + private const TIG_POSTCODE_COMPONENT_TEMPLATE = 'TIG_Postcode/form/element/postcode-field'; + private const COUNTRY_CODE_PATH = 'general/country/default'; /** @@ -61,14 +64,14 @@ class LayoutProcessorPlugin private $scopeConfig; /** - * @param ArrayManager $arrayManager - * @param NotifierInterface $notifier - * @param ScopeConfigInterface $scopeConfig + * @param ArrayManager $arrayManager + * @param NotifierInterface $notifier + * @param ScopeConfigInterface $scopeConfig */ public function __construct( - ArrayManager $arrayManager, - NotifierInterface $notifier, - ScopeConfigInterface $scopeConfig + ArrayManager $arrayManager, + NotifierInterface $notifier, + ScopeConfigInterface $scopeConfig ) { $this->arrayManager = $arrayManager; $this->notifier = $notifier; @@ -78,18 +81,19 @@ public function __construct( /** * Adds tracked fields, so we can dynamically add classes or visibility * - * @param string|int|array $jsLayout - * @param string|int|array $fieldsetChildren + * @param string|int|array $jsLayout + * @param string|int|array $fieldsetChildren * * @return array */ public function addTrackedFields($jsLayout, $fieldsetChildren): array { - foreach ([ + foreach ( + [ 'street', 'city', 'postcode' - ] as $key) { + ] as $key) { $jsLayout = $this->arrayManager->set( $fieldsetChildren . '/' . $key . '/tracks/additionalClasses', $jsLayout, @@ -103,10 +107,10 @@ public function addTrackedFields($jsLayout, $fieldsetChildren): array /** * Create the base field configuration for the checkout provider * - * @param string $dataScope - * @param string $index - * @param string $label - * @param array $options + * @param string $dataScope + * @param string $index + * @param string $label + * @param array $options * * @return array */ @@ -136,14 +140,17 @@ private function createBaseFieldConfig($dataScope, $index, $label, $options = [] * * @return array[] */ - public function createHousenumberFieldsDefinition($dataScope) + public function createHousenumberFieldsDefinition(string $dataScope): array { return [ 'tig_housenumber' => $this->createBaseFieldConfig( $dataScope, 'tig_housenumber', 'Housenumber', - ["sortOrder" => 51, "validation" => ["required-entry" => true, "validate-number" => true]] + [ + "sortOrder" => 51, + "validation" => ["required-entry" => true, "validate-number" => true] + ] ), 'tig_housenumber_addition' => $this->createBaseFieldConfig( $dataScope, @@ -156,20 +163,20 @@ public function createHousenumberFieldsDefinition($dataScope) 'tig_street', 'Street Address', ["sortOrder" => 53] - ), + ) ]; } /** * Split string and remove last n element(s) * - * @param array|string $path - * @param string $delimiter - * @param int $count + * @param array|string $path + * @param string $delimiter + * @param int $count * * @return string */ - private function getParentPath($path, $delimiter = '/', $count = 1) + private function getParentPath(array|string $path, string $delimiter = '/', int $count = 1): string { $splitPath = !empty($path) ? explode($delimiter, $path) : []; for ($i = 0; $i < $count; $i++) { @@ -186,7 +193,7 @@ private function getParentPath($path, $delimiter = '/', $count = 1) * * @param mixed $message */ - public function addAdminErrorMessage($message) + public function addAdminErrorMessage($message): void { $this->notifier->addMajor( "TIG Postcode", @@ -204,24 +211,21 @@ public function addAdminErrorMessage($message) * * @see LayoutProcessor::process() */ - public function afterProcess( - $subject, - $jsLayout - ) { + public function afterProcess($subject, $jsLayout) { $postalCodePaths = $this->arrayManager->findPaths('postcode', $jsLayout); foreach ($postalCodePaths as $postalCodePath) { $fieldsetChildren = $this->getParentPath($postalCodePath, '/'); if ($this->arrayManager->get( - $postalCodePath . '/component', - $jsLayout - ) !== self::MAGENTO_POSTCODE_COMPONENT_JS + $postalCodePath . '/component', + $jsLayout + ) !== self::MAGENTO_POSTCODE_COMPONENT_JS xor $this->arrayManager->get( $postalCodePath . '/component', $jsLayout ) === self::TIG_POSTCODE_COMPONENT_JS) { $this->addAdminErrorMessage('Incompatible postcode field found @ ' . $postalCodePath . ': ' . - $this->arrayManager->get($postalCodePath . '/component', $jsLayout)); + $this->arrayManager->get($postalCodePath . '/component', $jsLayout)); continue; } @@ -244,6 +248,13 @@ public function afterProcess( // Change default sortOrder of PostcodeField if country is set to NL or BE // @TODO use a better way to set sort order for postcode field, // tried in branch "tryout_billing_address_sortorder_mixin" + + // $TODO remove debug data + /* $file = fopen('test.txt', 'a+'); + fwrite($file, $defaultCountry . "--"); + fclose($file); + */ + if ($defaultCountry === "NL" || $defaultCountry === "BE") { $jsLayout = $this->arrayManager->set($postalCodePath . '/config/sortOrder', $jsLayout, 50); } @@ -253,7 +264,7 @@ public function afterProcess( $this->arrayManager->get($postalCodePath . '/dataScope', $jsLayout), "." ); - $jsLayout = $this->arrayManager->merge( + $jsLayout = $this->arrayManager->merge( $fieldsetChildren, $jsLayout, $this->createHousenumberFieldsDefinition($postcodeParentDataScope) @@ -263,6 +274,14 @@ public function afterProcess( $jsLayout = $this->addTrackedFields($jsLayout, $fieldsetChildren); } + /* Robert + if (isset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step'] + ['children']['shippingAddress']['children']['shipping-address-fieldset']['children']['city'])) { + $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step'] + ['children']['shippingAddress']['children']['shipping-address-fieldset']['children']['city']['sortOrder'] = 49; // your desired sort order + } + */ + return $jsLayout; } } diff --git a/README.md b/README.md index 18a03b3..95ab027 100644 --- a/README.md +++ b/README.md @@ -1,113 +1,183 @@ # Postcode Service Magento 2 extension + [![Latest Stable Version](https://img.shields.io/github/v/release/postcodeservice/postcode-magento2?style=for-the-badge&color=227cff)](https://github.com/postcodeservice/postcode-magento2/releases/latest) +![TIG Postcode Service 2.4.7 versions](https://img.shields.io/badge/Tested%20with%20Magento-2.4.7beta1-%2300cf00?style=for-the-badge) ![TIG Postcode Service 2.4.6 versions](https://img.shields.io/badge/Tested%20with%20Magento-2.4.6-%2300cf00?style=for-the-badge) ![TIG Postcode Service 2.4.5 versions](https://img.shields.io/badge/Tested%20with%20Magento-2.4.5-%2300cf00?style=for-the-badge) ![TIG Postcode Service 2.4.4 versions](https://img.shields.io/badge/Tested%20with%20Magento-2.4.4-%2300cf00?style=for-the-badge) [![Total Extension downloads](https://img.shields.io/packagist/dt/tig/postcode-magento2?style=for-the-badge&color=227cff)](https://packagist.org/packages/tig/postcode-magento2/stats) +## Introduction + +With the Postcode Service you can auto complete a partly given address and check its validity. + +This code base is an extension (plugin) for the Adobe Magento platform using the Postcode Service +API https://api.postcodeservice.com. The extension is available +and maintained free or charge. However, there is a fee +associated with using the Postcode Service, which is integrated with the extension. The +exact cost depends on the amount of usage. You can find detailed pricing information on the website +at https://postcodeservice.com/#compare-packages + +3 Reasons for using the Postcode Service Adobe Magento extension: + +* Superfast performance due to specific code and design optimizations for Adobe + Magento webshops +* Accurate and reliable data, ahead of the market +* Secure: Independent of logistics companies + ## Installation -We strongly recommend that you use a staging environment for the installation, and to also make a backup of your environment. + +We strongly recommend that you use a staging environment for the installation, and to also make a +backup of your environment. ### Installation using composer (Recommended) + To install the extension login to your environment using SSH. -Then navigate to the Magento 2 root directory and run the following commands in the same order as described: +Then navigate to the Magento 2 root directory and run the following commands in the same order as +described: Enable maintenance mode: -~~~~shell + +```shell php bin/magento maintenance:enable -~~~~ +``` Install the extension: -~~~~shell + +```shell composer require tig/postcode-magento2 -~~~~ +``` Enable the Postcode Service Magento 2 extension -~~~~shell + +```shell php bin/magento module:enable TIG_Postcode -~~~~ +``` Update the Magento 2 environment: -~~~~shell + +```shell php bin/magento setup:upgrade -~~~~ +``` + +--- ----------------------------------- -When your Magento environment is running in production mode, you also need to run the following commands: +When your Magento environment is running in production mode, you also need to run the following +commands: Compile DI: -~~~~shell + +```shell php bin/magento setup:di:compile -~~~~ +``` Deploy static content: -~~~~shell + +```shell php bin/magento setup:static-content:deploy -~~~~ ----------------------------------- +``` + +--- Disable maintenance mode: -~~~~shell + +```shell php bin/magento maintenance:disable -~~~~ + +``` ## How to update the extension + To update the Postcode Service Extension run the following commands: -~~~~shell + +```shell composer update tig/postcode-magento2 php bin/magento setup:upgrade -~~~~ +``` ## Alternatively, install the extension manually -- Download the extension directly from [github](https://github.com/postcodeservice/postcode-magento2) by clicking on *Code* and then *Download ZIP*. + +- Download the extension directly + from [github](https://github.com/postcodeservice/postcode-magento2) by clicking on *Code* and then + *Download ZIP*. - Create the directory *app/code/TIG/Postcode* (Case-sensitive) - Extract the zip and upload the code into *app/code/TIG/Postcode* - Enable the Postcode Service Magento 2 extension -~~~~shell + +```shell php bin/magento module:enable TIG_Postcode -~~~~ -- Update the Magento 2 environment -~~~~shell +``` + +- Update the Magento 2 environment + +```shell php bin/magento setup:upgrade -~~~~ +``` ## Configuration -After completing the installation process, the extension should be readily available in the backend of your Magento webshop. From there, you can configure the extension according to your requirements: -1. Go to Stores -> Configuration -> Sales -> Postcode Service International +After completing the installation process, the extension should be readily available in the backend +of your Magento webshop. From there, you can configure the extension according to your requirements: + +1. Go to Stores -> Configuration -> Sales -> Postcode Service 2. Open the Configuration tab 3. Change the Modus from "Off" to "Test" or "Live" -4. Insert your Client ID and Api key (Secure Code). When you selected “Test” at the Modus, you can find test credentials below the fields - keep in mind there is a daily limit -.\ -To sign up for a paid account and get your Client ID and Api key, simply visit https://postcodeservice.com and subscribe. +4. Insert your Client ID and Api key (Secure Code). When you selected “Test” at the Modus, you can + find test credentials below the fields - keep in mind there is a daily limit -.\ + To sign up for a paid account and get your Client ID and Api key, simply + visit https://postcodeservice.com and subscribe. -5. In the 'Countries' section, select the country for which you wish to enable the Postcode Service. +5. In the 'Countries' section, select the country for which you wish to enable the Postcode Service. 6. Flush your cache ## Visual representation of the Postcode Service Magento extension during the checkout process + ### For Dutch postcodes - + +postcode_service_magento2-nl>
 
 ### For Belgium postcodes
-<img src= + +postcode_service_magento2-be ## Further documentation -You can find the underlying Postcode Service API documentation here: https://developers.postcodeservice.com + +You can find the underlying Postcode Service API documentation +here: https://developers.postcodeservice.com ## Frequently Asked Questions -Q: What are the costs for using the Postcode Service?\ -A: The Adobe Magento extension can be used free of charge. The fee for using the Postcode Service can be found at our website https://postcodeservice.com -\ -Q: Which third party extensions are supported and compatible?\ -A: At this time, we do not support third-party checkout extensions, including OneStepCheckout.com, Amasty, and MagePlaza. While we understand the importance of these third party extensions for some webshops, we cannot guarantee their compatibility with our extension and therefore cannot provide support for any issues that may arise as a result of their use. We have received reports from some users about compatibility issues with OneStepCheckout and MagePlaza, but this experience may vary from agency to agency, depending on the custom implementations. However, we are constantly working to improve our extension's functionality and compatibility, and we may revisit this decision in the future. + +### Q: Which third party extensions are supported and compatible? + +A: While our extension is compatible with many third-party checkout extensions, we do not provide +support for third-party checkout extensions from OneStepCheckout.com, Amasty, and MagePlaza. +Although there are numerous webshops that successfully use these extensions in combination with our +Postcode Service extension, we cannot guarantee their compatibility due to potential issues arising +from custom implementations. As a result, we are unable to offer support for any issues that may +arise from their use. ## Requirements + Adobe Magento Open Source (Community edition) or Adobe Commerce (Enterprise version). ## Version support -We follow the release support lines dates from Adobe https://experienceleague.adobe.com/docs/commerce-operations/release/versions.html for the version support of this extension. + +We follow the release support lines dates from +Adobe https://experienceleague.adobe.com/docs/commerce-operations/release/versions.html for the +version support of this extension. + +## Technical Support with the extension + +See https://postcodeservice.com/support/ ## Release history + See https://github.com/postcodeservice/postcode-magento2/releases + +## About + +The Postcode Service is a trademark of the Total Internet Group B.V. diff --git a/SECURITY.md b/SECURITY.md index d9b64a4..8974dfd 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,10 +1,24 @@ # Security Policy -## Supported Versions +# How to report security vulnerabilities in this Magento extension -We will dive into any security related issue as long as your Magento version is still supported by Magento. If you are running a Magento version that is not supported by Magento and you wish to upgrade to the latest version, you can contact us for a quote at sales@tig.nl +GitHub has +a [mechanism for private disclosure of vulnerabilities](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability) +to repository owners and authorized persons such as maintainers. This repository has this feature +enabled. ## Reporting a Vulnerability -Please e-mail us directly at security@tig.nl or use the security issue template on GitHub. -A security issue gets the highest priority assigned and a reply regarding the vulnerability is given within a typical 24 hours. Thank you! +See [Privately Reporting a Security Vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability). +Go +to [`postcodeservice/postcode-magento2`](https://github.com/postcodeservice/postcode-magento2/security)' +s [Security page](https://github.com/postcodeservice/postcode-magento2/security) and click +on [Report a vulnerability](https://github.com/postcodeservice/postcode-magento2/security/advisories/new). +This will notify the owners and maintainers. + +## Supported Versions + +We are committed to addressing any security-related issues, provided your Magento version continues +to receive support from Magento. If your Magento version is no longer supported, we strongly +recommend instructing your development team or agency to update to the most recent version. + diff --git a/Services/Converter/Factory.php b/Services/Converter/Factory.php index afc982d..e09c2c1 100644 --- a/Services/Converter/Factory.php +++ b/Services/Converter/Factory.php @@ -38,16 +38,14 @@ class Factory /** * @var array|ConverterInterface[] */ - private $converters; + private array $converters; /** * Factory constructor. * * @param ConverterInterface[] $converters */ - public function __construct( - $converters = [] - ) { + public function __construct(array $converters = []) { $this->converters = $converters; } @@ -61,7 +59,7 @@ public function __construct( * @return mixed * @throws PostcodeException */ - public function convert($type, $data, $keys = null) + public function convert($type, $data, $keys = null): mixed { foreach ($this->converters as $converter) { $this->checkImplementation($converter); diff --git a/Services/Converter/Request.php b/Services/Converter/Request.php index ed5c7f4..1d625eb 100644 --- a/Services/Converter/Request.php +++ b/Services/Converter/Request.php @@ -38,7 +38,7 @@ class Request implements ConverterInterface /** * @var ValidationRequest */ - private $validation; + private ValidationRequest $validation; /** * Request constructor. @@ -49,34 +49,44 @@ class Request implements ConverterInterface * * @param ValidationRequest $validation */ - public function __construct( - ValidationRequest $validation - ) { + public function __construct(ValidationRequest $validation) { $this->validation = $validation; } /** * @inheritdoc */ - public function setValidationKeys($keys) + public function setValidationKeys($keys): void { - $this->validation->setKeys($keys); + $this->validation->setRequestFields($keys); } /** + * Converts the provided data into a new format. + * + * This function first validates the input data. If the data is invalid, + * it returns false. If the data is valid, it constructs a new array + * containing only the keys specified by the getRequestFields method of + * the validation object, with corresponding values from the input data. + * + * @param mixed $data The data to convert. + * @return bool|array Returns the converted data if the input was valid, false otherwise. * @inheritDoc */ - public function convert($data) + public function convert($data): bool|array { + // Validate the input data if (!$this->validation->validate($data)) { return false; } + // Iterate over each key specified by the getRequestFields method $converted = []; - foreach ($this->validation->getKeys() as $key) { + foreach ($this->validation->getRequestFields() as $key) { $converted[$key] = $data[$key]; } + // Return the converted data return $converted; } } diff --git a/Services/Converter/Response.php b/Services/Converter/Response.php index 25e5fc3..41cf007 100644 --- a/Services/Converter/Response.php +++ b/Services/Converter/Response.php @@ -56,7 +56,7 @@ public function __construct( */ public function setValidationKeys($keys) { - $this->validation->setKeys($keys); + $this->validation->setRequestFields($keys); } /** diff --git a/Services/Validation/Factory.php b/Services/Validation/Factory.php index 8f424a6..458be72 100644 --- a/Services/Validation/Factory.php +++ b/Services/Validation/Factory.php @@ -29,6 +29,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Services\Validation; use TIG\Postcode\Exception as PostcodeException; @@ -38,16 +39,15 @@ class Factory /** * @var array|ValidationInterface[] */ - private $validators; + private array $validators; /** * Factory constructor. * * @param ValidationInterface[] $validators */ - public function __construct( - $validators = [] - ) { + public function __construct(array $validators = []) + { $this->validators = $validators; } diff --git a/Services/Validation/Request.php b/Services/Validation/Request.php index cceffe7..5218878 100644 --- a/Services/Validation/Request.php +++ b/Services/Validation/Request.php @@ -29,37 +29,22 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Services\Validation; class Request implements ValidationInterface { - /** @var string[] */ - private $keysToContain = ['postcode', 'huisnummer']; - - /** - * @inheritDoc - */ - public function validate($data) - { - if (!is_array($data)) { - return false; - } - - if (!$this->checkKeys($data)) { - return false; - } - - return true; - } + /** @var string[] */ + private array $requestKeys = []; // set in GetAddress, GetBeStreet, GetNlStreet, etc. /** * @inheritdoc * * @param string[] $keys */ - public function setKeys($keys) + public function setRequestFields($keys): void { - $this->keysToContain = $keys; + $this->requestKeys = $keys; } /** @@ -67,25 +52,47 @@ public function setKeys($keys) * * @return string[] */ - public function getKeys() + public function getRequestFields(): array { - return $this->keysToContain; + return $this->requestKeys; } /** - * Check keys + * @inheritDoc + */ + public function validate($data): bool + { + // if the response is not an array, it's invalid + if (!is_array($data)) { + return false; + } + + return $this->validateRequestFields($data); + + } + + /** + * Validates that all request keys are present in the provided data. * - * @param mixed $data + * This function iterates over each key in $this->requestKeys and checks if it exists in the provided data array. + * If any key is missing, the function immediately returns false. If all keys are present, it returns true. * - * @return bool + * @param array $data The data to validate. + * + * @return bool Returns true if all request keys are present in the data, false otherwise. */ - private function checkKeys($data) + public function validateRequestFields(array $data): bool { - $check = 0; - foreach ($this->keysToContain as $key) { - array_key_exists($key, $data)?: $check++; + // Check if all keys are present in the request keys + foreach ($this->requestKeys as $key) { + // If a key is missing, return false immediately + if (!array_key_exists($key, $data)) { + return false; + } } - return $check == 0; + // If all keys were present, return true + return true; } + } diff --git a/Services/Validation/Response.php b/Services/Validation/Response.php index f3ab328..f01081c 100644 --- a/Services/Validation/Response.php +++ b/Services/Validation/Response.php @@ -29,6 +29,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Services\Validation; class Response implements ValidationInterface @@ -36,137 +37,64 @@ class Response implements ValidationInterface /** * @var string[] */ - private $keysToContain = ['success', 'straatnaam', 'woonplaats']; - /** - * @inheritDoc - */ - public function validate($data) - { - if (!is_array($data)) { - return false; - } - - if ($this->checkIfRecursive($data)) { - return $this->validateElements($data); - } - - if (!$this->validateResult($data)) { - return false; - } - - if (!$this->checkStreetNameValue($data)) { - return false; - } - - return true; - } - - /** - * Get the Keys - * - * @return array - */ - public function getKeys() - { - return $this->keysToContain; - } + private array $responseKeys = []; // set in GetAddress, GetBeStreet, GetBePostcode, etc. /** * Set the keys * * @param mixed $keys */ - public function setKeys($keys) + public function setRequestFields($keys): void { - $this->keysToContain = $keys; + $this->responseKeys = $keys; } /** - * Check the keys - * - * @param mixed $data - * - * @return bool + * @inheritDoc */ - private function checkKeys($data) + public function validate($data): bool { - $check = 0; - foreach ($this->keysToContain as $key) { - array_key_exists($key, $data)?: $check++; + // if the response is not an array, it's invalid + if (!is_array($data)) { + return false; } - return $check == 0; - } - - /** - * Important note : Before using this method, first trigger the checkKeys method. - * - * @param mixed $data - * - * @return bool - */ - private function checkStreetNameValue($data) - { - if (strpos($data['straatnaam'] ?? '', 'limiet bereikt') !== false) { - return false; + // allow succes === false request to be processed at front-end side + if (array_key_exists("success", $data) && $data["success"] === false) { + return true; } - return true; + return $this->validateResponseFields($data); } /** - * Validate Result + * Check if the required response fields are present * - * @param array $result + * @param mixed $data * * @return bool */ - private function validateResult($result) + private function validateResponseFields(array $data): bool { - if (!$this->checkKeys($result)) { - return false; + // If $data is a single-level array (NL) instead of multi-level array (BE), + // wrap it in another array for compatibility with the code in this method + if (!is_array(reset($data))) { + $data = [$data]; } - return true; - } - - /** - * Check if multiple results are returned - * - * BE returns multiple results whereas NL always returns one result. - * This method is to determine if multiple results were returned. - * - * @param array $data - * - * @return bool - */ - private function checkIfRecursive($data) - { - return count($data) != count($data, COUNT_RECURSIVE); - } + // Iterate over each element (which is now guaranteed to be an array) in the data array + foreach ($data as $item) { + // Check if all keys in $this->responseKeys are present in the item + $missingKeys = array_diff($this->responseKeys, array_keys($item)); - /** - * Validate elements - * - * @param mixed $data - * - * @return bool - */ - private function validateElements($data) - { - $success = false; - array_walk( - $data, - function ($result) use (&$success) { - if (!$this->checkKeys($result)) { - $success = false; - return; - } - $success = true; + // If any keys are missing, return false + if (!empty($missingKeys)) { + return false; } - ); + } - return $success; + // If all items passed the check, return true + return true; } } diff --git a/Services/Validation/ValidationInterface.php b/Services/Validation/ValidationInterface.php index b212f16..442a7fe 100644 --- a/Services/Validation/ValidationInterface.php +++ b/Services/Validation/ValidationInterface.php @@ -47,5 +47,5 @@ public function validate($data); * * @param mixed $keys */ - public function setKeys($keys); + public function setRequestFields($keys); } diff --git a/Test/Unit/Block/Adminhtml/Config/Credentials/ButtonTest.php b/Test/Unit/Block/Adminhtml/Config/Credentials/ButtonTest.php index 0a57d9e..5a11ae7 100644 --- a/Test/Unit/Block/Adminhtml/Config/Credentials/ButtonTest.php +++ b/Test/Unit/Block/Adminhtml/Config/Credentials/ButtonTest.php @@ -56,10 +56,10 @@ public function testGetCredentialsUrl() * @return void * @throws \Exception */ - public function testGetLabel() + public function testGetSignUpLabel() { $instance = $this->getInstance(); - $label = $instance->getLabel(); + $label = $instance->getSignUpLabel(); $this->assertTrue(is_string($label->render())); } diff --git a/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php b/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php index ba47bed..ccc1784 100644 --- a/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php +++ b/Test/Unit/Block/Adminhtml/Config/Support/TabTest.php @@ -47,7 +47,7 @@ class TabTest extends TestCase public function testGetVersionNumber() { $instance = $this->getInstance(); - $this->assertSame('1.5.6', $instance->getVersionNumber()); + $this->assertSame('1.6.0', $instance->getVersionNumber()); } /** diff --git a/Test/Unit/Config/Provider/ApiConfigurationTest.php b/Test/Unit/Config/Provider/ApiConfigurationTest.php index ee0d194..4956723 100644 --- a/Test/Unit/Config/Provider/ApiConfigurationTest.php +++ b/Test/Unit/Config/Provider/ApiConfigurationTest.php @@ -51,7 +51,7 @@ class ApiConfigurationTest extends AbstractConfigurationTest private $streetVersion = 'v2'; /** @var string */ - private $postcodeEndpoint = 'postcode-find/'; + private $postcodeEndpoint = 'zipcode-find/'; /** @var string */ private $streetEndpoint = 'street-find/'; @@ -149,7 +149,7 @@ public function testGetBeBasePostcodeUri() ); $expected = $this->beBase . '/' . $this->postcodeVersion . '/'; - $this->assertEquals($expected, $this->instance->getBeBaseUri($this->postcodeEndpoint)); + $this->assertEquals($expected, $this->instance->getBEBaseUri($this->postcodeEndpoint)); } /** @@ -171,6 +171,6 @@ public function testGetBeBaseStreetUri() ); $expected = $this->beBase . '/' . $this->streetVersion . '/'; - $this->assertEquals($expected, $this->instance->getBeBaseUri($this->streetEndpoint)); + $this->assertEquals($expected, $this->instance->getBEBaseUri($this->streetEndpoint)); } } diff --git a/Test/Unit/Config/Provider/ClientConfigurationTest.php b/Test/Unit/Config/Provider/ClientConfigurationTest.php index 0f82b2a..9809b14 100644 --- a/Test/Unit/Config/Provider/ClientConfigurationTest.php +++ b/Test/Unit/Config/Provider/ClientConfigurationTest.php @@ -105,7 +105,7 @@ public function testGetModusXpath($testModus, $value, $expected) $this->assertEquals($expected, $instance->getModusXpath($value)); } - public function testGetApiKey() + public function testGetSecureCode() { $this->setModuleMock(true); $instance = $this->getInstance(); @@ -116,7 +116,7 @@ public function testGetApiKey() $returnCryped = $this->getRandomSyntax(); $this->setDecryptedKey($value, $returnCryped); - $this->assertEquals($returnCryped, $instance->getApiKey()); + $this->assertEquals($returnCryped, $instance->getSecureCode()); } public function testGetDomainUrl() diff --git a/Test/Unit/Services/Converter/FactoryTest.php b/Test/Unit/Services/Converter/FactoryTest.php index e5b3f48..575ede9 100644 --- a/Test/Unit/Services/Converter/FactoryTest.php +++ b/Test/Unit/Services/Converter/FactoryTest.php @@ -108,7 +108,7 @@ public function testCorrectConvertion() { $requestMock = $this->getFakeMock(Request::class)->getMock(); $requestMock->expects($this->once())->method('convert')->willReturn( - ['success' => true, 'straatnaam' => 'Kabelweg', 'woonplaats' => 'Amsterdam'] + ['street' => 'Kabelweg', 'city' => 'Amsterdam'] ); $instance = $this->getInstance( @@ -122,10 +122,10 @@ public function testCorrectConvertion() $this->assertEquals( $instance->convert( 'correct', - ['postcode' => '1014BA', 'huisnummer' => 37], - ['success', 'straatnaam', 'woonplaats'] + ['zipcode' => '1014BA', 'houseno' => 37], + ['street', 'city'] ), - ['success' => true, 'straatnaam' => 'Kabelweg', 'woonplaats' => 'Amsterdam'] + ['street' => 'Kabelweg', 'city' => 'Amsterdam'] ); } } diff --git a/Test/Unit/Services/Converter/ResponseTest.php b/Test/Unit/Services/Converter/ResponseTest.php index f5cd5c7..87d354b 100644 --- a/Test/Unit/Services/Converter/ResponseTest.php +++ b/Test/Unit/Services/Converter/ResponseTest.php @@ -44,14 +44,14 @@ public function responseDataProvider() { return [ 'Correct Response Data' => [ - '{"success":true,"straatnaam":"Kabelweg","woonplaats":"Amsterdam"}', - ['success' => true, 'straatnaam' => 'Kabelweg', 'woonplaats' => 'Amsterdam'], - ['success' => true, 'straatnaam' => 'Kabelweg', 'woonplaats' => 'Amsterdam'], + '{"street":"Kabelweg","city":"Amsterdam"}', + ['street' => 'Kabelweg', 'city' => 'Amsterdam'], + ['street' => 'Kabelweg', 'city' => 'Amsterdam'], true ], 'In correct Response Data' => [ - '{"success":true,"woonplaats":"Amsterdam"}', - ['success' => true, 'woonplaats' => 'Amsterdam'], + '{"city":"Amsterdam"}', + ['city' => 'Amsterdam'], false, false ] ]; @@ -71,7 +71,7 @@ public function testResponseConverter($dataString, $data, $expected, $validation 'validation' => $this->validationResponseMock($data, $validation) ]); - $instance->setValidationKeys(['success', 'straat', 'woonplaats']); + $instance->setValidationKeys(['street', 'city']); $this->assertSame($expected, $instance->convert($dataString)); } diff --git a/Test/Unit/Services/Validation/FactoryTest.php b/Test/Unit/Services/Validation/FactoryTest.php index a9f10e8..7c93869 100644 --- a/Test/Unit/Services/Validation/FactoryTest.php +++ b/Test/Unit/Services/Validation/FactoryTest.php @@ -138,11 +138,11 @@ public function responseDataProvider() { return [ 'Correct Data array' => [ - ['success' => true, 'straatnaam' => 'kabelweg', 'woonplaats' => 'Amsterdam'], + ['street' => 'kabelweg', 'city' => 'Amsterdam'], true ], 'Incorrect keys in Data array' => [ - ['success' => true, 'straatnaam' => 'kabelweg', 'stad' => 'Amsterdam'], + ['street' => 'kabelweg', 'city' => 'Amsterdam'], false ], 'Incorrect format of Data' => [ @@ -150,7 +150,7 @@ public function responseDataProvider() false ], 'Limit calls response' => [ - ['success' => true, 'straatnaam' => 'Opvraag limiet bereikt', 'woonplaats' => 'Amsterdam'], + ['street' => 'Opvraag limiet bereikt', 'city' => 'Amsterdam'], false ] ]; @@ -193,7 +193,7 @@ public function testResponseValidator($data, $expected) public function testResponseValidatorForBECall($data, $expected) { $object = $this->getObject(Validation\Response::class); - $object->setKeys(['postcode', 'plaats']); + $object->setKeys(['zipcode', 'city']); $instance = $this->getInstance([ 'validators' => [ diff --git a/Test/Unit/Services/Validation/RequestTest.php b/Test/Unit/Services/Validation/RequestTest.php index 70655c4..c090eaf 100644 --- a/Test/Unit/Services/Validation/RequestTest.php +++ b/Test/Unit/Services/Validation/RequestTest.php @@ -54,7 +54,7 @@ public function testWhenRequestHasNoData() public function testSetAndGetKeys() { $instance = $this->getInstance(); - $instance->setKeys(['postcode', 'huisnummer']); - $this->assertEquals($instance->getKeys(), ['postcode', 'huisnummer']); + $instance->setKeys(['zipcode', 'houseno']); + $this->assertEquals($instance->getKeys(), ['zipcode', 'houseno']); } } diff --git a/Test/Unit/Services/Validation/ResponseTest.php b/Test/Unit/Services/Validation/ResponseTest.php index b993a10..e6a1577 100644 --- a/Test/Unit/Services/Validation/ResponseTest.php +++ b/Test/Unit/Services/Validation/ResponseTest.php @@ -53,7 +53,7 @@ public function testWhenResponseHasNoData() */ public function testDefaultGetKeys() { - $expected = ['success', 'straatnaam', 'woonplaats']; + $expected = ['street', 'city']; $this->assertEquals($expected, $this->getInstance()->getKeys()); } } diff --git a/Test/Unit/Webservice/ApiTest.php b/Test/Unit/Webservice/ApiTest.php index 47e034a..9d48175 100644 --- a/Test/Unit/Webservice/ApiTest.php +++ b/Test/Unit/Webservice/ApiTest.php @@ -199,7 +199,7 @@ public function testApiInstanceForVersionAbove4() $resetZendParams->method('resetParameters'); //SetUri - $uri = 'https://api.fakelocation.com/v4/json/'; + $uri = 'https://api.fakelocation.com/v4/'; $apiConfigUri = $this->apiConfiguration->expects($this->once()); $apiConfigUri->method('getBaseUri')->willReturn($uri); @@ -259,7 +259,7 @@ public function testApiInstanceForVersionAbove4AsPost() $resetZendParams->method('resetParameters'); //SetUri - $uri = 'https://api.fakelocation.com/v4/json/'; + $uri = 'https://api.fakelocation.com/v4/'; $apiConfigUri = $this->apiConfiguration->expects($this->once()); $apiConfigUri->method('getBaseUri')->willReturn($uri); @@ -324,13 +324,13 @@ public function testApiInstanceForBePostcode() $apiConfigUri->method('getBeBaseUri')->willReturn($uri); $endpointGetEndpoint = $this->endpoint->expects($this->exactly(3)); - $endpointGetEndpoint->method('getEndpoint')->willReturn('postcode-find/'); + $endpointGetEndpoint->method('getEndpoint')->willReturn('zipcode-find/'); $endpointGetEndpointCountry = $this->endpoint->expects($this->exactly(2)); $endpointGetEndpointCountry->method('getCountry')->willReturn('BE'); $zendClientUri = $this->zendClient->expects($this->once()); - $zendClientUri->method('setUri')->with($uri.'postcode-find/'); + $zendClientUri->method('setUri')->with($uri.'zipcode-find/'); $requestData = ['zipcodezone' => '1000']; $requestDataWithHeader = ['zipcodezone' => '1000']; diff --git a/Test/Unit/Webservice/Endpoints/GetAddressTest.php b/Test/Unit/Webservice/Endpoints/GetAddressTest.php index fbbcefb..02b3d14 100644 --- a/Test/Unit/Webservice/Endpoints/GetAddressTest.php +++ b/Test/Unit/Webservice/Endpoints/GetAddressTest.php @@ -96,6 +96,6 @@ public function testGetResponseKeys() { $instance = $this->getInstance(); $result = $instance->getResponseKeys(); - $this->assertEquals(['success', 'straatnaam', 'woonplaats'], $result); + $this->assertEquals(['street', 'city'], $result); } } diff --git a/Webservices/Api.php b/Webservices/Api.php index 4f1f4f7..6c6b733 100644 --- a/Webservices/Api.php +++ b/Webservices/Api.php @@ -29,6 +29,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Webservices; use Laminas\Http\Client as HttpClient; @@ -127,28 +128,29 @@ public function getRequest(EndpointInterface $endpoint) * Add headers to request * * Set the headers, but only if the api version is 4 or higher. Before version 4 user data is parsed within the - * requestData array as ['client_id' => 'xxxx', 'secure_code' => 'xxxx'] + * requestData array as ['ClientId' => 'xxxx', 'SecureCode' => 'xxxx'] * * @param EndpointInterface $endpoint + * * @throws \Zend_Http_Client_Exception */ private function setHeaders(EndpointInterface $endpoint) { $version = str_replace('v', '', $this->apiConfiguration->getVersion()); - if ((int)$version >= 4 || $endpoint->getCountry() === 'BE') { + if ((int) $version >= 4 || $endpoint->getCountry() === 'BE') { $this->httpClient->setOptions(['strict' => false]); $this->httpClient->setHeaders([ - 'X-Client_Id' => $this->clientConfiguration->getClientId(), - 'X-Secure_Code' => $this->clientConfiguration->getApiKey() + 'X-ClientId' => $this->clientConfiguration->getClientId(), + 'X-SecureCode' => $this->clientConfiguration->getSecureCode() ]); return; } - $params = $endpoint->getRequestData(); + $params = $endpoint->getRequestData(); $params['client_id'] = $this->clientConfiguration->getClientId(); - $params['secure_code'] = $this->clientConfiguration->getApiKey(); + $params['secure_code'] = $this->clientConfiguration->getSecureCode(); $endpoint->setRequestData($params); } @@ -162,7 +164,7 @@ private function setParameter(EndpointInterface $endpoint) { $this->httpClient->setMethod($endpoint->getMethod()); - $params = $endpoint->getRequestData(); + $params = $endpoint->getRequestData(); $params['domain'] = $this->clientConfiguration->getDomainUrl(); $params['remote_ip'] = $this->serverAddress->getServerAddress(); @@ -184,9 +186,10 @@ private function setParameter(EndpointInterface $endpoint) */ private function setUri(EndpointInterface $endpoint) { - $uri = $this->apiConfiguration->getBaseUri() . $endpoint->getEndpoint(); + $uri = $this->apiConfiguration->getBaseUri() . $endpoint->getEndpoint(); // NL + if ($endpoint->getCountry() == 'BE') { - $uri = $this->apiConfiguration->getBeBaseUri($endpoint->getEndpoint()) . $endpoint->getEndpoint(); + $uri = $this->apiConfiguration->getBEBaseUri($endpoint->getEndpoint()) . $endpoint->getEndpoint(); // BE } $this->httpClient->setUri($uri); diff --git a/Webservices/Endpoints/GetAddress.php b/Webservices/Endpoints/GetAddress.php index 8782d3d..bf04d48 100644 --- a/Webservices/Endpoints/GetAddress.php +++ b/Webservices/Endpoints/GetAddress.php @@ -34,10 +34,10 @@ // @codingStandardsIgnoreFile class GetAddress extends EndpointAbstract { - protected $endpoint = 'getAddress/'; + protected $endpoint = 'find/'; protected $country = 'NL'; - protected $requestKeys = ['postcode', 'huisnummer']; - protected $responseKeys = ['success', 'straatnaam', 'woonplaats']; + protected $requestKeys = ['zipcode', 'houseno']; // NL V5 + protected $responseKeys = ['street', 'city']; // NL V5 } diff --git a/Webservices/Endpoints/GetBePostcode.php b/Webservices/Endpoints/GetBePostcode.php index a043622..4f3641d 100644 --- a/Webservices/Endpoints/GetBePostcode.php +++ b/Webservices/Endpoints/GetBePostcode.php @@ -35,10 +35,10 @@ // @codingStandardsIgnoreFile class GetBePostcode extends EndpointAbstract { - protected $endpoint = 'postcode-find/'; + protected $endpoint = 'zipcode-find/'; protected $country = 'BE'; - protected $requestKeys = ['zipcodezone']; - protected $responseKeys = ['postcode', 'plaats']; + protected $requestKeys = ['zipcodezone', 'multiresults']; // BE V3 + protected $responseKeys = ['zipcode', 'city']; // BE V3 } diff --git a/Webservices/Endpoints/GetBeStreet.php b/Webservices/Endpoints/GetBeStreet.php index f6c77db..d4c7f99 100644 --- a/Webservices/Endpoints/GetBeStreet.php +++ b/Webservices/Endpoints/GetBeStreet.php @@ -39,6 +39,6 @@ class GetBeStreet extends EndpointAbstract protected $country = 'BE'; - protected $requestKeys = ['zipcode', 'city', 'street']; - protected $responseKeys = ['straat']; + protected $requestKeys = ['zipcode', 'city', 'street']; // BE V3 + protected $responseKeys = ['street']; // BE V3 } diff --git a/composer.json b/composer.json index 7a13dad..f3d4170 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "magento/module-quote": ">=101.0.5,<=101.0.11|~101.1|~101.2" }, "type": "magento2-module", - "version": "1.5.6", + "version": "1.6.0", "license": "CC-BY-NC-ND-3.0", "authors": [ { diff --git a/etc/adminhtml/system.xml b/etc/adminhtml/system.xml index 73d2536..664d766 100644 --- a/etc/adminhtml/system.xml +++ b/etc/adminhtml/system.xml @@ -35,7 +35,7 @@
    - + sales Sales_Postcode::configuration postcode-section diff --git a/etc/adminhtml/system/configuration.xml b/etc/adminhtml/system/configuration.xml index 209abfd..261097e 100644 --- a/etc/adminhtml/system/configuration.xml +++ b/etc/adminhtml/system/configuration.xml @@ -51,7 +51,8 @@ sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1"> The Client ID can be requested via the - 'Request Credentials' button. + 'Sign Up For A Paid Account' button. + tig_postcode/configuration/client_id 1 @@ -59,9 +60,10 @@ - - The Client Secret can be requested via the - 'Request Credentials' button. + + The Secure Code can be requested via the + 'Sign Up For A Paid Account' button. + Magento\Config\Model\Config\Backend\Encrypted tig_postcode/configuration/api_key @@ -69,7 +71,8 @@ - + TIG\Postcode\Block\Adminhtml\Config\Credentials\Button 1 @@ -80,8 +83,11 @@ - 1177]]> - Test credentials are limited to 50 requests per month. + + 1177 for testing purposes.
    Please note that these test credentials have limitations, including daily usage limits and added delays.]]>
    + The Client ID consists of a number, for example 1177, and can be found in the + details of your subscription plan. + tig_postcode/configuration/client_id_test 2 @@ -90,9 +96,12 @@ - - 9SRLYBCALURPE2B]]> - Test credentials are limited to 50 requests per month. + + + 9SRLYBCALURPE2B for testing purposes.]]> + The Secure Code contains alphanumeric and non-alphanumeric characters, for + example 9SRLYBCALURPE2B, and can be found in the details of your subscription plan. + Magento\Config\Model\Config\Backend\Encrypted tig_postcode/configuration/api_key_test diff --git a/etc/adminhtml/system/support.xml b/etc/adminhtml/system/support.xml index a01eebb..00878c2 100644 --- a/etc/adminhtml/system/support.xml +++ b/etc/adminhtml/system/support.xml @@ -35,7 +35,7 @@ - + TIG\Postcode\Block\Adminhtml\Config\Form\Field\Fieldset tig_postcode-section 1 diff --git a/etc/config.xml b/etc/config.xml index d5d5052..e9cb92a 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -63,6 +63,21 @@ 1 1 + + 30 + + + 30 + 10 + 50 + 6 + + + 30 + 10 + 50 + 6 + diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 7150460..210352b 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -1,16 +1,15 @@ -Live,Live -Test,Test -Off,Off -Legend,Legend -Disabled,Off -Extension status,Extension status +"Live","Live" +"Test","Test" +"Off","Off" +"Legend","Legend" +"Disabled","Off" +"Extension status","Extension status" "Test Mode","Test Mode" "Live Mode","Live Mode" "Magento & 3rd party version compatibility","Magento & 3rd party version compatibility" "Magento Community Edition version","Magento Community Edition version" "Magento Enterprise Edition version","Magento Enterprise Edition version" "Support","Support" - "Documentation","Documentation" "Documents regarding the Postcode Magento 2 extension:","Documents regarding the Postcode Magento 2 extension:" "View the user manual. Currently the manual is only available in Dutch.","View the user manual. Currently the manual is only available in Dutch." @@ -19,9 +18,7 @@ Extension status,Extension status "Full Release Notes","Full Release Notes" "Extension version","Extension version" "Postcode Service version","Postcode Service version" -"This extension is developed by Total Internet Group (
    TIG).","This extension is developed by Total Internet Group (TIG)." -"support@postcodeservice.com","support@postcodeservice.com" - +"This extension is developed by Total Internet Group BV / Postcode Service:","This extension is developed by Total Internet Group BV / Postcode Service:" "Advantages of the Postcode Service","Advantages of the Postcode Service" "No analytic data collection","No analytic data collection" "Super fast","Super fast" @@ -38,9 +35,8 @@ Extension status,Extension status "Enable Belgium check","Enable Belgium check" "No results found.","No results found." "No results found. Please fill in manually.","No results found. Please fill in manually." -"Busy with loading zipcodes...","Busy with loading zipcodes..." -"Busy with loading streets...","Busy with loading streets..." -"Supporting Dutch and Belgian addresses","Supporting Dutch and Belgian addresses" +"Loading zipcodes ...","Loading zipcodes ..." +"Loading streets ...","Loading streets ..." "Countries","Countries" "Using MagePlaza OneStepCheckout","Using MagePlaza OneStepCheckout" "The codes to support the MagePlaza OneStepCheckout extension has been moved to a new extension.","The codes to support the MagePlaza OneStepCheckout extension has been moved to a new extension." @@ -52,3 +48,6 @@ Extension status,Extension status "Change the sort order of the Country field in the checkout.","Change the sort order of the Country field in the checkout." "Unexpected error occurred. Please fill in the address details manually.","Unexpected error occurred. Please fill in the address details manually." "Please enter a valid zip code and house number.","Please enter a valid zip code and house number." +"Could not perform address validation.","Could not perform address validation." +"Address validation temporarily unavailable.","Address validation temporarily unavailable." +"Address not found with provided zipcode and house number. If correct, please enter address details manually.","Address not found with provided zipcode and house number. If correct, please enter address details manually." \ No newline at end of file diff --git a/i18n/fr_FR.csv b/i18n/fr_FR.csv index 1f69f62..3f5fc29 100644 --- a/i18n/fr_FR.csv +++ b/i18n/fr_FR.csv @@ -1,8 +1,8 @@ -Live,Production -Test,Test -Off,Inactif -Legend,Légende -Disabled,Désactivé +"Live","Production" +"Test","Test" +"Off","Inactif" +"Legend","Légende" +"Disabled","Désactivé" "Extension status","Status de l'extension" "Test Mode","Mode Test" "Live Mode","Mode Production" @@ -10,7 +10,6 @@ Disabled,Désactivé "Magento Community Edition version","Version Magento Community Edition" "Magento Enterprise Edition version","Version Magento Enterprise Edition" "Support","Assistance" - "Documentation","Documentation" "Documents regarding the Postcode Magento 2 extension:","Documents relatifs à l'extension code postal de Magento 2:" "View the user manual. Currently the manual is only available in Dutch.","Consulter le manuel utilisateur. Uniquement disponible en néerlandais." @@ -19,9 +18,7 @@ Disabled,Désactivé "Full Release Notes","Intégralité de la note de version" "Extension version","Version de l'extension" "Postcode Service version","Version du service code-postal" -"This extension is developed by Total Internet Group (TIG).","Cette extension est développée par Total Internet Group (TIG)." -"support@postcodeservice.com","support@postcodeservice.com" - +"This extension is developed by Total Internet Group BV / Postcode Service:","Cette extension est développée par Total Internet Group BV / Postcode Service:" "Advantages of the Postcode Service","Avantages du service code-postal" "No analytic data collection","Aucune collecte des données à caractère analytique" "Super fast","Extrémenent rapide" @@ -37,11 +34,13 @@ Disabled,Désactivé "Enable Netherlands check","Activer la vérification pour les Pays-Bas" "Enable Belgium check","Activer la vérification pour la Belgique" "No results found.","Aucun résultat." -"No results found. Please fill in manually.","Aucun résultat. Veuillez saisir la donnée manuellement." -"Busy with loading zipcodes...","Chargement des codes-postaux en cours..." -"Busy with loading streets...","Chargement des rues en cours..." -"Supporting Dutch and Belgian addresses","Compatible avec les adresses néerlandaise et belges." +"Cannot find street, is it correct?","Aucun résultat. Veuillez saisir la donnée manuellement." +"Loading zipcodes ...","Chargement des codes-postaux en cours ..." +"Loading streets ...","Chargement des rues en cours ..." "Countries","Pays" "Using MagePlaza OneStepCheckout","Utilisation de MagePlaza OneStepCheckout" "Unexpected error occurred. Please fill in the address details manually.","Une erreur inattendue s'est produite. Veuillez remplir les coordonnées manuellement." "Please enter a valid zip code and house number.","Veuillez saisir un code postal et un numéro de maison valides." +"Could not perform address validation.","Impossible d'effectuer la validation de l'adresse." +"Address validation temporarily unavailable.","Validation de l'adresse temporairement indisponible." +"Address not found with provided zipcode and house number. If correct, please enter address details manually.","Adresse introuvable avec le code postal et le numéro de maison fournis. Si correct, veuillez saisir les coordonnées manuellement." \ No newline at end of file diff --git a/i18n/nl_BE.csv b/i18n/nl_BE.csv index 6e3c058..2aa5967 100644 --- a/i18n/nl_BE.csv +++ b/i18n/nl_BE.csv @@ -1,16 +1,15 @@ -Live,Live -Test,Test -Off,Off -Legend,Legenda -Disabled,Uit -Extension status,Extensie status +"Live","Live" +"Test","Test" +"Off","Off" +"Legend","Legenda" +"Disabled","Uit" +"Extension status","Extensie status" "Test Mode","Test Modus" "Live Mode","Live Modus" "Magento & 3rd party version compatibility","Magento & 3rd party versie compatibiliteit" "Magento Community Edition version","Magento Community Edition versie" "Magento Enterprise Edition version","Magento Enterprise Edition versie" Support,Support - "Documentation","Documentatie" "Documents regarding the Postcode Magento 2 extension:","Documenten met betrekking tot de Postcode Magento 2 extensie:" "View the user manual. Currently the manual is only available in Dutch.","Bekijk de gebruikershandleiding. Momenteel enkel beschikbaar in Nederlands." @@ -19,9 +18,7 @@ Support,Support "Full Release Notes","Volledige Release Notes" "Extension version","Extensie versie" "Postcode Service version","Postcode Service versie" -"This extension is developed by Total Internet Group (TIG).","Deze extensie is ontwikkeld door Total Internet Group (TIG)." -"support@postcodeservice.com","support@postcodeservice.com" - +"This extension is developed by Total Internet Group BV / Postcode Service:","Deze extensie is ontwikkeld door Total Internet Group BV / Postcode Service:" "Advantages of the Postcode Service","Voordelen van de Postcode Service" "No analytic data collection","Geen analytische gegevensverzameling" "Super fast","Super snel" @@ -47,7 +44,7 @@ Support,Support "The Api key can be requested through the 'Request Credentials' button below. For support contact TIG.","De 'Api key' kan opgevraagd worden door middel van de 'Opvragen gegevens' knop. Voor support contacteer TIG." "Request Credentials","Opvragen Gegevens" "Advanced Configuration","Geavanceerde opties" -"Sorry, we could not find the address on the given zip code and house number combination. If you are sure that the zip code and house number are correct, please fill in the address details manually.","Sorry, wij konden geen adresgegevens vinden met de opgegeven postcode en huisnummer combinatie. Indien u er zeker van bent dat de opgegeven postcode en huisnummer correct zijn, vul dan adresinformatie handmatig aan." +"Address not found with provided zipcode and house number. If correct, please enter address details manually.","Adres niet gevonden met opgegeven postcode en huisnummer. Als deze correct zijn, voer dan de adresgegevens handmatig in." "Zip/Postal Code","Postcode" "You can use our test credentials if needed : 1177","U kunt gebruik maken van onze testgegevens : 1177" "You can use our test credentials if needed : 9SRLYBCALURPE2B","U kunt gebruik maken van onze testgegevens : 9SRLYBCALURPE2B" @@ -57,9 +54,11 @@ Support,Support "Enable Belgium check","Zet Belgische check aan" "No results found.","Geen resultaten gevonden." "No results found. Please fill in manually.","Wij kunnen uw straat niet automatisch ophalen. Zijn de postcode en plaats correct ingevuld?" -"Busy with loading zipcodes...","Bezig met ophalen van postcodes..." -"Busy with loading streets...","Bezig met ophalen van straatnamen..." -"Supporting Dutch and Belgian addresses","Ondersteuning voor Nederlandse en Belgische addressen" +"Loading zipcodes ...","Ophalen van postcodes ..." +"Loading streets ...","Ophalen van straatnamen ..." +"Cannot find street, is it correct?","Controleer uw straatnaam, is het juist?" +"Zipcode not found.","Postcode niet gevonden." +"Address validation temporarily unavailable.","Adresvalidatie tijdelijk niet beschikbaar." "Countries","Landen" "Using MagePlaza OneStepCheckout","Gebruik van MagePlaza OneStepCheckout" "The codes to support the MagePlaza OneStepCheckout extension has been moved to a new extension.","De codes om de MagePlaza OneStepCheckout te ondersteunen zijn verhuist naar een losse extensie." @@ -71,3 +70,4 @@ Support,Support "Change the sort order of the Country field in the checkout.","Verander de sorteer volgorde van het veld 'Land' in de checkout." "Unexpected error occurred. Please fill in the address details manually.","Er is een onverwachte fout opgetreden. Vul s.v.p. handmatig uw adresgegevens in." "Please enter a valid zip code and house number.","Vul s.v.p. een valide postcode en huisnummer in." +"Could not perform address validation.","Adresvalidatie niet beschikbaar." diff --git a/i18n/nl_NL.csv b/i18n/nl_NL.csv index d775d4a..2c9d607 100644 --- a/i18n/nl_NL.csv +++ b/i18n/nl_NL.csv @@ -1,16 +1,15 @@ -Live,Live -Test,Test -Off,Off -Legend,Legenda -Disabled,Uit -Extension status,Extensie status +"Live,"Live" +"Test","Test" +"Off","Off" +"Legend","Legenda" +"Disabled","Uit" +"Extension status","Extensie status" "Test Mode","Test Modus" "Live Mode","Live Modus" "Magento & 3rd party version compatibility","Magento & 3rd party versie compatibiliteit" "Magento Community Edition version","Magento Community Edition versie" "Magento Enterprise Edition version","Magento Enterprise Edition versie" -Support,Support - +"Support","Support" "Documentation","Documentatie" "Documents regarding the Postcode Magento 2 extension:","Documenten met betrekking tot de Postcode Magento 2 extensie:" "View the user manual. Currently the manual is only available in Dutch.","Bekijk de gebruikershandleiding. Momenteel enkel beschikbaar in Nederlands." @@ -19,9 +18,7 @@ Support,Support "Full Release Notes","Volledige Release Notes" "Extension version","Extensie versie" "Postcode Service version","Postcode Service versie" -"This extension is developed by Total Internet Group (TIG).","Deze extensie is ontwikkeld door Total Internet Group (TIG)." -"support@postcodeservice.com","support@postcodeservice.com" - +"This extension is developed by Total Internet Group BV / Postcode Service:","Deze extensie is ontwikkeld door Total Internet Group BV / Postcode Service:" "Advantages of the Postcode Service","Voordelen van de Postcode Service" "No analytic data collection","Geen analytische gegevensverzameling" "Super fast","Super snel" @@ -47,7 +44,7 @@ Support,Support "The Api key can be requested through the 'Request Credentials' button below. For support contact TIG.","De 'Api key' kan opgevraagd worden door middel van de 'Opvragen gegevens' knop. Voor support contacteer TIG." "Request Credentials","Opvragen Gegevens" "Advanced Configuration","Geavanceerde opties" -"Sorry, we could not find the address on the given zip code and house number combination. If you are sure that the zip code and house number are correct, please fill in the address details manually.","Sorry, wij konden geen adresgegevens vinden met de opgegeven postcode en huisnummer combinatie. Indien u er zeker van bent dat de opgegeven postcode en huisnummer correct zijn, vul dan adresinformatie handmatig aan." +"Address not found with provided zipcode and house number. If correct, please enter address details manually.","Adres niet gevonden met opgegeven postcode en huisnummer. Als deze correct zijn, voer dan de adresgegevens handmatig in." "Zip/Postal Code","Postcode" "You can use our test credentials if needed : 1177","U kunt gebruik maken van onze testgegevens : 1177" "You can use our test credentials if needed : 9SRLYBCALURPE2B","U kunt gebruik maken van onze testgegevens : 9SRLYBCALURPE2B" @@ -57,9 +54,11 @@ Support,Support "Enable Belgium check","Zet Belgische check aan" "No results found.","Geen resultaten gevonden." "No results found. Please fill in manually.","Wij kunnen uw straat niet automatisch ophalen. Zijn de postcode en plaats correct ingevuld?" -"Busy with loading zipcodes...","Bezig met ophalen van postcodes..." -"Busy with loading streets...","Bezig met ophalen van straatnamen..." -"Supporting Dutch and Belgian addresses","Ondersteuning voor Nederlandse en Belgische addressen" +"Loading zipcodes ...","Ophalen van postcodes ..." +"Loading streets ...","Ophalen van straatnamen ..." +"Cannot find street, is it correct?","Controleer uw straatnaam, is het juist?" +"Zipcode not found.","Postcode niet gevonden." +"Address validation temporarily unavailable.","Adresvalidatie tijdelijk niet beschikbaar." "Countries","Landen" "Using MagePlaza OneStepCheckout","Gebruik van MagePlaza OneStepCheckout" "The codes to support the MagePlaza OneStepCheckout extension has been moved to a new extension.","De codes om de MagePlaza OneStepCheckout te ondersteunen zijn verhuist naar een losse extensie." @@ -71,3 +70,4 @@ Support,Support "Change the sort order of the Country field in the checkout.","Verander de sorteer volgorde van het veld 'Land' in de checkout." "Unexpected error occurred. Please fill in the address details manually.","Er is een onverwachte fout opgetreden. Vul s.v.p. handmatig uw adresgegevens in." "Please enter a valid zip code and house number.","Vul s.v.p. een valide postcode en huisnummer in." +"Could not perform address validation.","Adresvalidatie niet beschikbaar." diff --git a/view/adminhtml/templates/config/credentials/button.phtml b/view/adminhtml/templates/config/credentials/button.phtml index caa1b0c..884a3b6 100644 --- a/view/adminhtml/templates/config/credentials/button.phtml +++ b/view/adminhtml/templates/config/credentials/button.phtml @@ -36,7 +36,7 @@ diff --git a/view/adminhtml/templates/config/parsing/streets.phtml b/view/adminhtml/templates/config/parsing/streets.phtml index f44019b..df37395 100644 --- a/view/adminhtml/templates/config/parsing/streets.phtml +++ b/view/adminhtml/templates/config/parsing/streets.phtml @@ -34,7 +34,7 @@

    - escapeHtml(__('No advanced settings in this version.')); ?> + escapeHtml(__('No advanced settings to display.')); ?>

    diff --git a/view/adminhtml/templates/config/support/tab.phtml b/view/adminhtml/templates/config/support/tab.phtml index a75d926..a07dd7e 100644 --- a/view/adminhtml/templates/config/support/tab.phtml +++ b/view/adminhtml/templates/config/support/tab.phtml @@ -34,38 +34,75 @@
    -

    escapeHtml(__('Support')); ?>

    -
    - +
      +
    • + <?= $block->escapeHtml(__('High reliability: 99.99% uptime in the chain')); ?> +
    • +
    • escapeHtml(__('High reliability: 99.99% uptime in the chain')); ?>
    • +
    +
      +
    • + <?= $block->escapeHtml(__('Secure: Independent of logistics companies')); ?> +
    • +
    • escapeHtml(__('Secure: Independent of logistics companies')); ?>
    • +
    +
      +
    • + <?= $block->escapeHtml(__('Phone support available')); ?> +
    • +
    • escapeHtml(__('Phone support available')); ?>
    • +
    +
    -
    @@ -178,7 +257,7 @@
    • - escapeHtml(__('Postcode Service')); ?>: + escapeHtml(__('Postcode Service Extension Version')); ?>: getVersionNumber() . @@ -208,29 +287,7 @@
    -

    escapeHtml(__('Third party compatibility')); ?>

    -
    -
      -
    • - - escapeHtml(__('OneStepCheckout.com')); ?>: - - Not supported -
    • -
    • - - escapeHtml(__('MagePlaza')); ?>: - - Not supported -
    • -
    • - - escapeHtml(__('Amasty')); ?>: - - Not supported -
    • -
    -
    + diff --git a/view/adminhtml/web/css/adminhtml_config_postcode.css b/view/adminhtml/web/css/adminhtml_config_postcode.css index 630131e..3efef31 100644 --- a/view/adminhtml/web/css/adminhtml_config_postcode.css +++ b/view/adminhtml/web/css/adminhtml_config_postcode.css @@ -76,13 +76,17 @@ width: 100%; } +#section_support .collapse-title h3, +#section_benefits .collapse-title h3 { + cursor: pointer !important; +} + #supporttab h3 { font-size: 1.7rem; margin: 0 !important; padding: 1.9rem 2.7rem 1.9rem 1rem; color: black; font-weight: 600; - cursor: pointer; } #supporttab h4 { @@ -105,6 +109,7 @@ line-height: 2em; list-style-type: none; margin-bottom: 10px; + margin-left: -10px; } .postcode-config-page .section-config { @@ -268,7 +273,7 @@ /* SupportTab - Documentation ======================================================================================= */ .external_link { - margin-left: 5px; + margin-bottom: 3px; vertical-align: middle; } @@ -288,11 +293,11 @@ float: right; width: 30px; height: 45px; - margin-top: -10px; + margin-top: -5px; margin-right: 3px; background-image: url(../images/postcode_service_logo_monogram.svg) !important; - background-size: 25px !important; + background-size: 20px !important; background-repeat: no-repeat; content: ' '; } @@ -304,14 +309,14 @@ } .postcode-config-page .page-main-actions .page-actions .page-actions-inner:before { - background-image: url(../images/postcode_service_logo_monogram.svg) !important; + background-image: url(../images/postcode_service_logo_color.svg) !important; background-repeat: no-repeat; content: ' '; - width: 50px; + width: 150px; float: left; height: 45px; margin-left: 60px; - background-size: 35px; + background-size: auto 50px; } /* Identity - Content =============================================================================================== */ @@ -332,7 +337,7 @@ } .postcode-config-page #container:before { - content: 'Postcode Service International'; + content: 'Postcode Service .com'; text-indent: 0; float: left; height: 50px; diff --git a/view/adminhtml/web/images/TIG_Logo.svg b/view/adminhtml/web/images/TIG_Logo.svg deleted file mode 100644 index e024072..0000000 --- a/view/adminhtml/web/images/TIG_Logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/view/adminhtml/web/images/external_link_32.png b/view/adminhtml/web/images/external_link_32.png deleted file mode 100644 index 39ca80e30985cfc098ce3ee6e3b1afe486b63779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1557 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~Nw~nVGm5x;VPJnK-!`8oHV~TDY3KS{fLcIa#sq3r@ZIK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*tr|-vokO-wR^fahE&{o zGW~qEu%pQF`zhsYh0Yb$ibyA%s2mS?B1Lkd+fhWU3b6EbIRrt&KK=GG0}?A5o+ohWa8@@eKPtPXGi%<)+y_!G zm^}||6z^#;f51>7pz6d`&iaPIzhUjW(?KcR=bqk?JpWf)^$}l$;4V%_#wk-i7Z!-s zcqk;CGFNkrVQUU#N_lauIsO61k2RUbr@|vBG*KRoEK8wR+_mX`pWVSw(;#=)&CzpKHYPm`21FtJA2U$hA zE49A9cmDqPb)m)b(Ad^ChG&ASFSq3U{5Uv6yo*0jdRfbUCs{5DVF`nNmiabo5V zzu0`1*(O{T3+whbL`6v11eBLJjvFf!aJo)mT~Moyz@uMhP4ML zer9LiWt|%}gZJI1n@_&*{GBszs?wc}PZwyrwud;{)f)4J-QBQB!gA){@BjP$a~Uv* XFl=JyOz7GVDyThO{an^LB{Ts539eEp diff --git a/view/adminhtml/web/images/postcode_service_external_link_32.svg b/view/adminhtml/web/images/postcode_service_external_link_32.svg new file mode 100644 index 0000000..c14bd09 --- /dev/null +++ b/view/adminhtml/web/images/postcode_service_external_link_32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/view/adminhtml/web/images/postcode_service_green_arrow_32.svg b/view/adminhtml/web/images/postcode_service_green_arrow_32.svg new file mode 100644 index 0000000..75c4ca2 --- /dev/null +++ b/view/adminhtml/web/images/postcode_service_green_arrow_32.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/view/adminhtml/web/images/postcode_service_logo_color.svg b/view/adminhtml/web/images/postcode_service_logo_color.svg index f3c952a..6078b35 100644 --- a/view/adminhtml/web/images/postcode_service_logo_color.svg +++ b/view/adminhtml/web/images/postcode_service_logo_color.svg @@ -1,30 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/view/adminhtml/web/images/postcode_service_logo_monogram.svg b/view/adminhtml/web/images/postcode_service_logo_monogram.svg index 74f756f..99be6fc 100644 --- a/view/adminhtml/web/images/postcode_service_logo_monogram.svg +++ b/view/adminhtml/web/images/postcode_service_logo_monogram.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/view/base/web/js/form/element/helpers/countryHelper.js b/view/base/web/js/form/element/helpers/countryHelper.js index 0824beb..86779d9 100644 --- a/view/base/web/js/form/element/helpers/countryHelper.js +++ b/view/base/web/js/form/element/helpers/countryHelper.js @@ -28,93 +28,94 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + define([ 'underscore', 'knockout', '../../../helper/field-types', - + '../../../postcode-handler/postcode-nl', '../../../postcode-handler/postcode-be' -], function (_,ko, FieldTypes, postcodeNL, postcodeBE) { +], function (_, ko, FieldTypes, postcodeNL, postcodeBE) { 'use strict'; - + const KnownHandlers = { 'NL': postcodeNL, 'BE': postcodeBE }; - + return { defaults: { imports: { updateCountry: '${ $.parentName }.country_id:value', - updateCountryOptions: '${ $.parentName }.country_id:indexedOptions', + updateCountryOptions: '${ $.parentName }.country_id:indexedOptions' }, modules: { - city: '${ $.parentName }.city', + city: '${ $.parentName }.city' } }, - + /** * Called when Country is updated (ISO Value) * * @param value */ - updateCountry: function(value){ + updateCountry: function (value) { if (!value) { return; } this.countryISO = value; this.changeHandlerAfterUpdate(); }, - + /** * Called when Country Options are updated (contains Postcode Config) * * @param value */ - updateCountryOptions: function(value) { + updateCountryOptions: function (value) { if (!value) { return; } this.countryOptions = value; this.changeHandlerAfterUpdate(); }, - + /** - * Change PostCode Handler after update + * Change Postcode Handler after update */ - changeHandlerAfterUpdate: function() { + changeHandlerAfterUpdate: function () { if (!this.countryOptions || !this.countryISO) { return; } - + if ( this.currentPostcodeHandler && this.currentPostcodeHandler.getISOCode() === this.countryISO ) { return; } - + if (this.currentPostcodeHandler) { this.currentPostcodeHandler.destroy(); this.currentPostcodeHandler = null; } - - if(!(this.countryISO in KnownHandlers)) { + + if (!(this.countryISO in KnownHandlers)) { return; } - + var isoOptions = {}; - if (this.countryOptions && this.countryISO in this.countryOptions){ - isoOptions = this.countryOptions[this.countryISO]; + if (this.countryOptions && this.countryISO in this.countryOptions) { + isoOptions = this.countryOptions[this.countryISO]; } - + this.currentPostcodeHandler = new KnownHandlers[this.countryISO](isoOptions, this); - - if(this.uiInitialized) { + + if (this.uiInitialized) { this.currentPostcodeHandler.reset(); this.currentPostcodeHandler.handle(); } - }, - } + } + }; }); diff --git a/view/base/web/js/helper/postcode-api.js b/view/base/web/js/helper/postcode-api.js index aff5518..dd8a349 100644 --- a/view/base/web/js/helper/postcode-api.js +++ b/view/base/web/js/helper/postcode-api.js @@ -28,42 +28,46 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ -define(['jquery', './postcode-config'], function($, postcodeConfig){ +define(['jquery', './postcode-config'], function ($, postcodeConfig) { + return { getPostCodeNL: function (postcode, house_number) { return $.ajax( { method: 'GET', url: postcodeConfig.getWebserviceURL_NL(), - showLoader: true, + showLoader: false, // If you prefer a loader, set this value to true data: { - huisnummer: house_number, - postcode: postcode + houseno: house_number, + zipcode: postcode } }); }, - + getPostCodeBE: function (postcode) { + // Multiresults = 1 enables support for bilingual cities such as Brussel, see + // https://developers.postcodeservice.com/#belgium-api-GETbe-v3-zipcode-find return $.ajax({ - method : 'GET', - url : postcodeConfig.getWebserviceURL_BE_Postcode(), - data : { - zipcodezone : postcode + method: 'GET', + url: postcodeConfig.getWebserviceURL_BE_Postcode(), + data: { + zipcodezone: postcode, + multiresults: 1 } }); }, - - getStreetBe: function (postcode, street, city) { + + getStreetBE: function (postcode, street, city) { return $.ajax({ - method : 'GET', - url : postcodeConfig.getWebserviceURL_BE_Street(), - data : { - zipcode : postcode, - city : city, - street : street - }, + method: 'GET', + url: postcodeConfig.getWebserviceURL_BE_Street(), + data: { + zipcode: postcode, + city: city, + street: street + } }); } - } + }; }); diff --git a/view/base/web/js/helper/reorder-fields.js b/view/base/web/js/helper/reorder-fields.js index 04829b2..494fd0e 100644 --- a/view/base/web/js/helper/reorder-fields.js +++ b/view/base/web/js/helper/reorder-fields.js @@ -28,6 +28,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + define([ 'underscore', 'knockout' @@ -57,13 +58,13 @@ define([ /** * Normalize Sort Orders * - * To sort the fields dynamically we need to have an numeric sort order. + * To sort the fields dynamically we need to have a numeric sort order. * Some fields have a 'before: element-x' or 'after: element-y' we solve this * * By adding .01 to the related field, some One Step Checkouts have low - * numeric values 1 - 10 so we add a very small number instead of integers. + * numeric values 1 - 10, so we add a very small number instead of integers. * - * This loops max 5 times so we can resolve up to 5 dependency layers + * This loops max 5 times, so we can resolve up to 5 dependency layers * For Example: element x after element y, element y after element z ... * * @param elementArray diff --git a/view/base/web/js/postcode-handler/postcode-be.js b/view/base/web/js/postcode-handler/postcode-be.js index 01b1bd6..5c9293d 100644 --- a/view/base/web/js/postcode-handler/postcode-be.js +++ b/view/base/web/js/postcode-handler/postcode-be.js @@ -1,25 +1,50 @@ +/** + * + * ..::.. + * ..::::::::::::.. + * ::'''''':''::''''':: + * ::.. ..: : ....:: + * :::: ::: : : :: + * :::: ::: : ''' :: + * ::::..:::..::.....:: + * ''::::::::::::'' + * ''::'' + * + * + * NOTICE OF LICENSE + * + * This source file is subject to the Creative Commons License. + * It is available through the world-wide-web at this URL: + * http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + * If you are unable to obtain it through the world-wide-web, please send an email + * to servicedesk@totalinternetgroup.nl so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please contact servicedesk@totalinternetgroup.nl for more information. + * + * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright + * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + */ + define( [ + // Importing required modules and dependencies 'jquery', 'knockout', 'underscore', './postcode-handler', '../helper/field-types', '../helper/postcode-api', - 'jquery-ui-modules/autocomplete' + 'jquery-ui-modules/autocomplete', + 'mage/translate' ], - function ( - $, - ko, - _, - PostcodeHandler, - FieldTypes, - PostcodeApi - ) { + function ($, ko, _, PostcodeHandler, FieldTypes, PostcodeApi) { 'use strict'; - - const postcodeBeRegex = /^[1-9][0-9]{3}$/i; - + + // Defining states for the postcode handler const states = Object.seal({ INIT: PostcodeHandler.INIT, IDLE: 'postcode_idle', @@ -28,213 +53,291 @@ define( POSTCODE_SHOW_FIELDS_SUGGESTION: 'postcode_show_fields_suggestion', POSTCODE_SHOW_FIELDS_EDIT: 'postcode_show_fields_edit' }); - - function PostcodeHandlerBE( - config, - postcodeService - ) { + + // Constructor for PostcodeHandlerBE + function PostcodeHandlerBE(config, postcodeService) + { this.debounceBeforeCall = null; - this.data = { - - }; - PostcodeHandler.call( - this, - config, - postcodeService - ); - + this.data = {}; + PostcodeHandler.call(this, config, postcodeService); + return (this); } - + + // Setting up prototype chain PostcodeHandlerBE.prototype = Object.create(PostcodeHandler.prototype); - - PostcodeHandlerBE.prototype.getISOCode = function(){ return "BE";} - - PostcodeHandlerBE.prototype.destroy = function(){ + + // Method to get ISO code + PostcodeHandlerBE.prototype.getISOCode = function () { return 'BE';}; + + // Method to destroy autocomplete + PostcodeHandlerBE.prototype.destroy = function () { this.deleteAutoComplete(); PostcodeHandler.prototype.destroy.call(this); - } - - PostcodeHandlerBE.prototype.getAutoCompleteResultCity = function() { - var currentPostcodeService = this.getPostcodeService(); - var postcodeField = currentPostcodeService.getElement(FieldTypes.postcode); - var domPostcodeField = $('#' + postcodeField.uid); - - if ($('.tig-autocomplete-result-city', domPostcodeField.parent()).length === 0) { - domPostcodeField.parent().append(''); - } - - return $('.tig-autocomplete-result-city', domPostcodeField.parent()); - } - - PostcodeHandlerBE.prototype.deleteAutoComplete = function() { + }; + + // Method to delete autocomplete + PostcodeHandlerBE.prototype.deleteAutoComplete = function () { var currentPostcodeService = this.getPostcodeService(); - + var postcodeField = currentPostcodeService.getElement(FieldTypes.postcode); var domPostcodeField = $('#' + postcodeField.uid); if (domPostcodeField.length > 0 && domPostcodeField.data('uiAutocomplete')) { - domPostcodeField.autocomplete("destroy"); + domPostcodeField.autocomplete('destroy'); } - + var streetField = currentPostcodeService.getElement(FieldTypes.street); var domStreetField = $('#' + streetField.uid); if (domStreetField.length > 0 && domStreetField.data('uiAutocomplete')) { - domStreetField.autocomplete("destroy"); + domStreetField.autocomplete('destroy'); } - - $('.tig-autocomplete-result-city', domPostcodeField.parent()).remove(); - } - + }; + + // Method to add autocomplete to postcode field PostcodeHandlerBE.prototype.addAutoCompleteToPostcode = function () { var self = this; - + var currentPostcodeService = this.getPostcodeService(); var postcodeField = currentPostcodeService.getElement(FieldTypes.postcode); var domPostcodeField = $('#' + postcodeField.uid); - + if (domPostcodeField.length === 0) { return; } - - domPostcodeField.attr('autocomplete', 'off'); - - self.getAutoCompleteResultCity(); + + domPostcodeField.attr('autocomplete', 'off'); // When autocomplete is off, the browser + // does not automatically complete + // entries based on earlier typed values. + domPostcodeField.autocomplete({ - delay: 500, + delay: 30, // Parameter for the results delay in milliseconds source: function (zipcodezone, response) { - this.menu.element.addClass(this.customScope + ".tigAutocomplete"); + + if (zipcodezone.term.length <= 1) { + // Only make requests when more than 2 numbers are keyed in: + // It reduces the amount of API calls and keeps the result list more + // compact + this.menu.element.removeClass('tigJqueryUiClass'); + return; + } + + this.menu.element.addClass(this.customScope + '.tigAutocomplete'); this.menu.element.addClass('tigJqueryUiClass'); - + domPostcodeField.addClass('auto-complete-running'); - - self.getAutoCompleteResultCity().text(''); - - response([{ - label: $.mage.__('Busy with loading zipcodes...'), - data: false - }]); - - PostcodeApi.getPostCodeBE(zipcodezone.term).done(function(data){ - // If no results are found, a success = false is returned + + response([ + { + label: $.mage.__('Loading zipcodes ...'), + data: false + }]); + + PostcodeApi.getPostCodeBE(zipcodezone.term).done(function (data) { + if (data.success === false) { - response({label: $.mage.__('No results found.')}); + // If no results are found, a success === false is returned + let errorMessage = 'Zipcode not found.'; + + if (data.error_code) { + // show error in console + console.error( + 'Postcodeservice.com extension: ' + JSON.stringify(data)); + + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } + } + + response( + { + label: $.mage.__(errorMessage), + data: false + }); return; } - + + // Add elements to selection box var selectBoxArr = []; $.each(data, function (key) { + if (selectBoxArr.length >= 10) { + return false; // Break the loop if more than 10 results are in the + // list + } selectBoxArr.push({ - label: data[key].postcode + ' - ' + data[key].plaats, - value: data[key].postcode, + label: data[key].zipcode + ' - ' + data[key].city, + value: data[key].zipcode, data: data[key] }); }); - + response(selectBoxArr); }); }, select: function (event, ui) { - if (ui.item.value == $.mage.__('Busy with loading zipcodes...')) { + // If the loader / info messages are selected, do not copy them to the street + // field + if ((ui.item.value === $.mage.__('Loading zipcodes ...')) || + (ui.item.value === $.mage.__('Zipcode not found.'))) { ui.item.value = ''; return false; } - + if (typeof ui.item.data === 'undefined') { return false; } - + var data = ui.item.data; - self.getPostcodeService().setFieldValue(FieldTypes.city, data.plaats); - self.getPostcodeService().setFieldValue(FieldTypes.postcode, data.postcode); - - self.getAutoCompleteResultCity().text(data.plaats); + self.getPostcodeService().setFieldValue(FieldTypes.city, data.city); + self.getPostcodeService().setFieldValue(FieldTypes.postcode, data.zipcode); + }, - close: function() { + close: function () { domPostcodeField.removeClass('auto-complete-running'); } }); - } - + }; + + // Method to add autocomplete to street field PostcodeHandlerBE.prototype.addAutoCompleteToStreet = function () { var self = this; - + var currentPostcodeService = this.getPostcodeService(); var streetFieldZero = currentPostcodeService.getElement(FieldTypes.street); var streetField = $('#' + streetFieldZero.uid); - + if (streetField.length === 0) { return; } - + streetField.attr('autocomplete', 'yes'); - + streetField.autocomplete({ - delay: 500, - source : function (street, response) { - this.menu.element.addClass('tigJqueryUiClass'); - this.menu.element.appendTo(this.element.closest('.tig_street_autocomplete')); - - response([{ - label: $.mage.__('Busy with loading streets...'), - data: false - }]); - + delay: 50, // Parameter for the results delay in milliseconds + source: function (street, response) { var postcode = currentPostcodeService.getElement(FieldTypes.postcode).value(); var city = currentPostcodeService.getElement(FieldTypes.city).value(); - - PostcodeApi.getStreetBe(postcode, street.term, city).done(function(data){ - // If no results are found, a success = false is returned - if (data.success == false) { - response([{ - label: $.mage.__('No results found.'), - data: false - }]); + + if (city === '' || postcode === '' || postcode === null) { + // If the required fields are empty, do not make an API request + this.menu.element.removeClass('tigJqueryUiClass'); + this.menu.element.css('display', 'none'); + return; + } + + this.menu.element.addClass('tigJqueryUiClass'); + this.menu.element.appendTo(this.element.closest('.tig_street_autocomplete')); + + response([ + { + label: $.mage.__('Loading streets ...'), + data: false + }]); + + PostcodeApi.getStreetBE(postcode, street.term, city).done(function (data) { + if (data.success === false) { + // If no results are found, a success === false is returned + let errorMessage = 'Cannot find street, is it correct?'; + + if (data.error_code) { + // show error in console + console.error( + 'Postcodeservice.com extension: ' + JSON.stringify(data)); + + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } + } + + response([ + { + label: $.mage.__(errorMessage), + data: false + }]); return; } - + + // Belgium sometimes has a street that lays within two + // postkantons, e.g. Rue de l'Aur in Bruxelles/Ixelles/Brussel. Filter + // double street names because for this usage we do not the separate + // postkantons items. + if (Array.isArray(data)) { + var uniqueStreets = data.reduce((unique, item) => { + return unique.includes(item.street) ? unique : [ + ...unique, + item.street]; + }, []); + } else { + // If data is not an array, it means no data was found. Possibly the + // city field was not filled in hence the validation could not occur. + response([ + { + data: false + }]); + } + var selectBoxArr = []; - $.each(data, function (key, value) { + $.each(uniqueStreets, function (index, value) { + if (selectBoxArr.length >= 6) { + return false; // Break the loop if more than 6 results are in the + // list + } selectBoxArr.push({ - label: data[key].straat, - value: data[key].straat + label: value, + value: value }); }); - + response(selectBoxArr); }); }, - select : function (event, ui) { - if (ui.item.value == $.mage.__('Busy with loading streets...')) { + select: function (event, ui) { + // If the loader / info messages are selected by the end user, do not copy them + // to the street field + if ((ui.item.value === $.mage.__('Loading streets ...')) || + (ui.item.value === $.mage.__('Cannot find street, is it correct?'))) { ui.item.value = ''; return false; } - + if (typeof ui.item.data === false) { return false; } - + + // User selected street, update the street fieldValue var data = ui.item.value; self.getPostcodeService().setFieldValue(FieldTypes.street, data); } }); - } - + }; + + // Method to handle field type and value PostcodeHandlerBE.prototype.handle = function (field_type, field_value) { if (field_type === FieldTypes.postcode) { this.data.postcode = field_value; } - + switch(this.getCurrentState()) { case states.INIT: this.setCurrentState(states.IDLE); - this.getPostcodeService().addClassesToField(FieldTypes.street,{'tig_street_autocomplete': true}); - this.getPostcodeService().addClassesToField(FieldTypes.postcode,{'tig_zipcodezone_autocomplete': true}); - this.addAutoCompleteToPostcode(this.getPostcodeService().getElement(FieldTypes.postcode)); - this.addAutoCompleteToStreet(this.getPostcodeService().getElement(FieldTypes.street)); + this.getPostcodeService() + .addClassesToField(FieldTypes.street, {'tig_street_autocomplete': true}); + this.getPostcodeService() + .addClassesToField(FieldTypes.postcode, {'tig_zipcodezone_autocomplete': true}); + this.addAutoCompleteToPostcode( + this.getPostcodeService().getElement(FieldTypes.postcode)); + this.addAutoCompleteToStreet( + this.getPostcodeService().getElement(FieldTypes.street)); break; } PostcodeHandler.prototype.handle.call(this, field_type, field_value); - } + return true; + }; return PostcodeHandlerBE; } ); diff --git a/view/base/web/js/postcode-handler/postcode-handler.js b/view/base/web/js/postcode-handler/postcode-handler.js index 19b76c8..0d708ba 100644 --- a/view/base/web/js/postcode-handler/postcode-handler.js +++ b/view/base/web/js/postcode-handler/postcode-handler.js @@ -82,7 +82,7 @@ define([ * @param message */ PostcodeHandler.prototype.log = function(message){ - console.log('PostcodeService[' + this.id + '][' + this.getISOCode() + ']: ' + message); + console.log('Postcodeservice.com extension: [' + this.id + '][' + this.getISOCode() + ']: ' + message); } /** @@ -97,7 +97,7 @@ define([ var street = this.getPostcodeService().getFieldValue(FieldTypes.street); var house_number = this.getPostcodeService().getFieldValue(FieldTypes.house_number); var house_number_addition = this.getPostcodeService().getFieldValue(FieldTypes.house_number_addition); - this.log("Updating magento street" , [street, house_number, house_number_addition]) + this.log("Updating Magento street field" , [street, house_number, house_number_addition]) this.getPostcodeService().setFieldValue(FieldTypes.magento_street, street + (house_number ? ' ' + house_number : '') + (house_number_addition ? ' ' + house_number_addition : '') diff --git a/view/base/web/js/postcode-handler/postcode-nl.js b/view/base/web/js/postcode-handler/postcode-nl.js index 741694c..6b5a8ce 100644 --- a/view/base/web/js/postcode-handler/postcode-nl.js +++ b/view/base/web/js/postcode-handler/postcode-nl.js @@ -28,25 +28,24 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ -define([ + +define( + [ + // Importing required modules and dependencies 'jquery', 'underscore', './postcode-handler', '../helper/field-types', '../helper/postcode-api', 'mage/translate' - ], function ( - $, - _, - PostcodeHandler, - FieldTypes, - PostcodeApi, - $t - ) { + ], + function ($, _, PostcodeHandler, FieldTypes, PostcodeApi, $t) { 'use strict'; - - const postcodeNlRegex = /^[0-9]{4}\s?[A-Z]{2}$/i; - + + // Regular expression for validating Dutch postcodes + const postcodeNLRegex = /^[0-9]{4}\s?[A-Z]{2}$/i; + + // Define the possible states of the postcode handler const states = Object.seal({ INIT: PostcodeHandler.INIT, IDLE: 'postcode_idle', @@ -55,80 +54,102 @@ define([ POSTCODE_SHOW_FIELDS_SUGGESTION: 'postcode_show_fields_suggestion', POSTCODE_SHOW_FIELDS_EDIT: 'postcode_show_fields_edit' }); - - function PostcodeHandlerNL( - config, - postcodeService - ) { + + // Constructor function for the Dutch postcode handler + function PostcodeHandlerNL(config, postcodeService) + { this.debounceBeforeCall = null; - this.data = { - - }; - PostcodeHandler.call( - this, - config, - postcodeService - ); - + this.data = {}; + PostcodeHandler.call(this, config, postcodeService); + return (this); } - + + // Inherit from the generic PostcodeHandler PostcodeHandlerNL.prototype = Object.create(PostcodeHandler.prototype); - - PostcodeHandlerNL.prototype.getISOCode = function(){ return "NL";} - - PostcodeHandlerNL.prototype.callApi = _.debounce(function(postcode, house_number){ + + // Method to get the ISO code for Netherlands + PostcodeHandlerNL.prototype.getISOCode = function () { return 'NL';}; + + // Method to call the API and handle the response + PostcodeHandlerNL.prototype.callApi = _.debounce(function (postcode, house_number) { const self = this; this.setCurrentState(states.POSTCODE_CALL_MADE); - - PostcodeApi.getPostCodeNL(postcode, house_number).done(function(data){ + + // Call the API and handle the response + PostcodeApi.getPostCodeNL(postcode, house_number).done(function (data) { self.getPostcodeService().getElement(FieldTypes.postcode).error(''); - - if (data.success !== true) { + + if (data.success === false) { + let errorMessage = 'Address not found with provided zipcode and house number. If correct, please enter address details manually.'; + + if (data.error_code) { + // show error in console + console.error('Postcodeservice.com extension: ' + JSON.stringify(data)); + + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } + } + self.setCurrentState(states.POSTCODE_CALL_FAILED); - self.getPostcodeService().getElement(FieldTypes.postcode).error($t('Sorry, we could not find the address on the given zip code and house number combination. If you are sure that the zip code and house number are correct, please fill in the address details manually.')); + self.getPostcodeService() + .getElement(FieldTypes.postcode) + .error($t(errorMessage)); return; } - - self.getPostcodeService().setFieldValue(FieldTypes.street, data.straatnaam); - self.getPostcodeService().setFieldValue(FieldTypes.city, data.woonplaats); + + // Set the field values based on the API response + self.getPostcodeService().setFieldValue(FieldTypes.street, data.street); + self.getPostcodeService().setFieldValue(FieldTypes.city, data.city); self.concatenateFieldsToStreet(FieldTypes.street); - + self.setCurrentState(states.POSTCODE_SHOW_FIELDS_SUGGESTION); - }).fail(function(){ + }).fail(function () { self.setCurrentState(states.POSTCODE_CALL_FAILED); - }).always(function(){ + }).always(function () { self.getPostcodeService().showHideField(FieldTypes.street, true); self.getPostcodeService().showHideField(FieldTypes.city, true); }); - },500); - + }, 30); // The last parameter is the delay in milliseconds for the _.debounce function from + // Underscore.js. + + // Method to handle changes to the postcode or house number fields PostcodeHandlerNL.prototype.handle = function (field_type, field_value) { if (this.getCurrentState() !== states.INIT) { if (field_type === FieldTypes.postcode) { this.data.postcode = field_value; } - + if (field_type === FieldTypes.house_number) { this.data.house_number = field_value; } - - // Do validation and call, state change is handled in callApi due to debouncing - if ((field_type === FieldTypes.postcode || field_type === FieldTypes.house_number) && - typeof this.data.postcode !== 'undefined' && - typeof this.data.house_number !== 'undefined' && - this.data.postcode.match(postcodeNlRegex) && + + // Validate the input and call the API if valid, state change is handled in callApi + // due to debouncing + if ((field_type === FieldTypes.postcode || field_type === + FieldTypes.house_number) && + // Ensure that this.data.postcode & this.data.house_number exists, and they are + // strings so that the regex match doesn't fail + typeof this.data.postcode === 'string' && + typeof this.data.house_number === 'string' && + this.data.postcode.match(postcodeNLRegex) && this.data.house_number.match(/[0-9]+/)) { this.callApi(this.data.postcode, this.data.house_number); } } - + + // Handle changes to the state based on the current state and input switch(this.getCurrentState()) { case states.INIT: this.setCurrentState(states.IDLE); var postcodeField = this.getPostcodeService().getElement(FieldTypes.postcode); - var housenumberField = this.getPostcodeService().getElement(FieldTypes.house_number); - + var housenumberField = this.getPostcodeService() + .getElement(FieldTypes.house_number); + if (postcodeField) { this.handle(FieldTypes.postcode, postcodeField.value()); } @@ -143,15 +164,11 @@ define([ } break; } - - // Important, concatenates all values to Magento street value - PostcodeHandler.prototype.handle.call( - this, - field_type, - field_value - ); - } - + + // Concatenate all values to Magento street value + PostcodeHandler.prototype.handle.call(this, field_type, field_value); + }; + return PostcodeHandlerNL; } ); diff --git a/view/frontend/web/css/postcode_main.css b/view/frontend/web/css/postcode_main.css index c9de9b9..28ff2a3 100644 --- a/view/frontend/web/css/postcode_main.css +++ b/view/frontend/web/css/postcode_main.css @@ -22,8 +22,6 @@ display: none; } - - /*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Copyright jQuery Foundation and other contributors; Licensed MIT */ diff --git a/view/frontend/web/images/indicator.gif b/view/frontend/web/images/indicator.gif index 085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb..8a15096a2be5e8c8987fe5d78188fdc0e917661b 100644 GIT binary patch literal 1434 zcmZvbe^AnQ7{@Vb-J$F7evJ$ zGeR@1wgCHaAfg70p@c#_C$FYmKfet=n#c-PpC={(YXi=l#5%_xmZ3 z_18UUcSwzjyqxT>nk;c%EtrpJ#Ti^XC#n+*a@ z!1{xzlx!%<%T-CzQ~4MuPUF5FXBfq+LVv60Ou%$HYW(sHI zzz2rRFv>29Q)LnhY!`^U2!lN-vXDw2!)mR^8I}6+3g>YUcW%i1T}QHFNL^b}qssD- zww=O$^txSN{`*mS97H6nN(+m6mlcYmlxFA=1cNbCX#ZY<;$H&5n|-bqBulH3a|{;S zWkVi;u!z(fl_^%~rf4gS+Gt6atjPfQ4C%x_Yd@iwcFkC!7!7knzczoa+Xq zDIsC#OYRH;Fi(psCax{rtw45v$UM9w@jr@GKR_&34_=h&b6J9$wR>4HD1N zNWQeujJDbFSZmaq;jCyPAb#co{e>~97JVuh-PadZU-IpK=T}ii`^|7Vt`&OeuyBD7 zi?)Tiy_D>Q*6||tzX1bR25_0rm5lk?bGEj74dyu>cb_%Oq2Is3&d91%t{2z6);bQ8P&0fB2HYDp?6s_Sm0d4Jmtk!$M&Ga+<M-eo4W&FA@ zKAxZIFp506qg4@DIa#$mG8`M5SdD#~(S9IE_DWy@yvgqzu&T+7kny?0br42AmY$<9 zlwR*3m7r2L4|>0m8tT4d$i2jAP2%c>aL1U!z@pNX9eM1Q`8CuuGc;M3vda)@v(}Y; zV7+=&+P0byJCb&QYD^C5`FSA#`EwFTO38!_88OQqYJL^o{%P~*y_7RJm2#`VX_FGs z#zx<+h11?6TRIHU?ZWNCEyTZhi*** zM`lw6{C_D4yuplJ{e39Pd<|C?A8VYxv#0e=`LVacn@_?FCQ{dqU9kjfG`hn-w zBz_;OSM^{m9d5X`o>~{DhYe5gnN*8&ibI{=J1DD|Jiuh;jBG?$_gBiZUx5RDxWC`P zZ{~~z-BEpSR#7MI3>{y zh0WJ};gwI;q8f(8(_GlQZQP3q4b^K$7b8wc4Ep|JvgL?augifCvhR9{NKzwOiO`mj z@Sv+eYhMC!r0r;G%as9oB=qVvgU0z^JQuyP*zOrPQgCQr;R2BS2wktn-Mw&L?Io2i zPYxO8e!>9S?R5Q@wo_SxI$ip3y;sJyDv=?+0#=@%GV)bYT33^jCtTw`Xe{6V-Z!TX Mu1HQ876Y*QPxw;lMF0Q* literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? diff --git a/view/frontend/web/js/action/create-shipping-address-mixin.js b/view/frontend/web/js/action/create-shipping-address-mixin.js index cd0c951..043375e 100644 --- a/view/frontend/web/js/action/create-shipping-address-mixin.js +++ b/view/frontend/web/js/action/create-shipping-address-mixin.js @@ -1,4 +1,36 @@ +/** + * + * ..::.. + * ..::::::::::::.. + * ::'''''':''::''''':: + * ::.. ..: : ....:: + * :::: ::: : : :: + * :::: ::: : ''' :: + * ::::..:::..::.....:: + * ''::::::::::::'' + * ''::'' + * + * + * NOTICE OF LICENSE + * + * This source file is subject to the Creative Commons License. + * It is available through the world-wide-web at this URL: + * http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + * If you are unable to obtain it through the world-wide-web, please send an email + * to servicedesk@totalinternetgroup.nl so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please contact servicedesk@totalinternetgroup.nl for more information. + * + * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright + * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + */ + define([ + // Importing required modules and dependencies 'jquery', 'mage/utils/wrapper', 'Magento_Checkout/js/model/quote' @@ -8,7 +40,7 @@ define([ return function (setShippingInformationAction) { return wrapper.wrap(setShippingInformationAction, function (originalAction, messageContainer) { - if (messageContainer.custom_attributes != undefined) { + if (messageContainer.custom_attributes !== undefined) { $.each(messageContainer.custom_attributes , function( key, value ) { messageContainer['custom_attributes'][key] = value; }); diff --git a/view/frontend/web/template/form/element/postcode-field.html b/view/frontend/web/template/form/element/postcode-field.html index ed75025..ce6be20 100644 --- a/view/frontend/web/template/form/element/postcode-field.html +++ b/view/frontend/web/template/form/element/postcode-field.html @@ -10,4 +10,4 @@ 'aria-invalid': error() ? true : 'false', id: uid, disabled: disabled - }" autocomplete="no" > + }" autocomplete="no"> From 5e33e0bb1e5faf51e99666eafb14abce3e10d47a Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Fri, 13 Oct 2023 12:43:35 +0200 Subject: [PATCH 8/9] RC2 --- Config/CheckoutConfiguration/ActionUrl.php | 10 +- Config/Provider/ApiConfiguration.php | 40 ++- Config/Provider/ModuleConfiguration.php | 38 +- Controller/Address/Service.php | 76 ++-- NEWS.md | 2 +- .../Model/Checkout/LayoutProcessorPlugin.php | 6 +- .../Country/CollectionPlugin.php | 92 ++++- README.md | 10 +- Services/Validation/Request.php | 1 - Services/Validation/Response.php | 6 +- .../CheckoutConfiguration/ActionUrlTest.php | 12 +- .../Config/Provider/ApiConfigurationTest.php | 62 +++- .../Provider/ModuleConfigurationTest.php | 8 + Test/Unit/Controller/Address/ServiceTest.php | 80 +++++ Webservices/Api.php | 6 +- Webservices/Endpoints/EndpointAbstract.php | 8 +- Webservices/Endpoints/EndpointInterface.php | 1 + Webservices/Endpoints/GetAddress.php | 9 +- Webservices/Endpoints/GetBePostcode.php | 7 +- Webservices/Endpoints/GetBeStreet.php | 2 - Webservices/Endpoints/GetDePostcode.php | 43 +++ Webservices/Endpoints/GetDeStreet.php | 43 +++ etc/adminhtml/system/countries.xml | 2 +- etc/config.xml | 7 +- etc/di.xml | 40 ++- i18n/en_US.csv | 1 + i18n/nl_BE.csv | 1 + i18n/nl_NL.csv | 1 + media/postcode_service_magento_2_be.gif | Bin 0 -> 303712 bytes media/postcode_service_magento_2_nl.gif | Bin 0 -> 208410 bytes .../js/form/element/helpers/countryHelper.js | 8 +- view/base/web/js/helper/postcode-api.js | 22 ++ view/base/web/js/helper/postcode-config.js | 31 +- .../web/js/postcode-handler/postcode-be.js | 5 +- .../web/js/postcode-handler/postcode-de.js | 338 ++++++++++++++++++ .../web/js/postcode-handler/postcode-nl.js | 1 - view/frontend/requirejs-config.js | 14 +- view/frontend/web/css/amasty_checkout.css | 10 +- .../web/css/mageplaza_onestepcheckout.css | 21 ++ view/frontend/web/css/postcode_de.css | 41 +++ .../action/create-shipping-address-mixin.js | 1 - .../action/set-shipping-information-mixin.js | 2 +- .../web/js/view/hide-tig-attributes-mixin.js | 12 +- 43 files changed, 992 insertions(+), 128 deletions(-) create mode 100644 Webservices/Endpoints/GetDePostcode.php create mode 100644 Webservices/Endpoints/GetDeStreet.php create mode 100644 media/postcode_service_magento_2_be.gif create mode 100644 media/postcode_service_magento_2_nl.gif create mode 100644 view/base/web/js/postcode-handler/postcode-de.js create mode 100644 view/frontend/web/css/postcode_de.css diff --git a/Config/CheckoutConfiguration/ActionUrl.php b/Config/CheckoutConfiguration/ActionUrl.php index f7d174c..29abb4b 100644 --- a/Config/CheckoutConfiguration/ActionUrl.php +++ b/Config/CheckoutConfiguration/ActionUrl.php @@ -52,7 +52,7 @@ public function __construct( } /** - * Get value and return belgium postcode URLs + * Get value and return NL, Belgium and German postcode URLs * * @return array */ @@ -67,6 +67,14 @@ public function getValue() 'postcode_be_getstreet' => $this->urlBuilder->getUrl( 'postcode/address/service/be/getstreet', ['_secure' => true] + ), + 'postcode_de_getpostcode' => $this->urlBuilder->getUrl( + 'postcode/address/service/de/getpostcode', + ['_secure' => true] + ), + 'postcode_de_getstreet' => $this->urlBuilder->getUrl( + 'postcode/address/service/de/getstreet', + ['_secure' => true] ) ]; } diff --git a/Config/Provider/ApiConfiguration.php b/Config/Provider/ApiConfiguration.php index d4e2c54..7216a77 100644 --- a/Config/Provider/ApiConfiguration.php +++ b/Config/Provider/ApiConfiguration.php @@ -46,6 +46,12 @@ class ApiConfiguration extends AbstractConfigProvider public const XPATH_API_BE_STREET_VERSION = 'tig_postcode/api_be/street_version'; + public const XPATH_API_DE_BASE = 'tig_postcode/api_de/base'; + + public const XPATH_API_DE_POSTCODE_VERSION = 'tig_postcode/api_de/postcode_version'; + + public const XPATH_API_DE_STREET_VERSION = 'tig_postcode/api_de/street_version'; + /** * Get base Uri * @@ -68,6 +74,18 @@ public function getBEBaseUri(string $endpoint): string return $this->getBase('BE') . '/' . $this->getVersion('BE', $endpoint) . '/'; } + /** + * Get German base Uri + * + * @param string $endpoint + * + * @return string + */ + public function getDEBaseUri(string $endpoint): string + { + return $this->getBase('DE') . '/' . $this->getVersion('DE', $endpoint) . '/'; + } + /** * Get base path via country and store ID * @@ -78,11 +96,16 @@ public function getBEBaseUri(string $endpoint): string */ public function getBase(string $country = 'NL', int|string $store = null): mixed { - $xpath = static::XPATH_API_BASE; - if ($country == 'BE') { + $xpath = static::XPATH_API_BASE; // NL + + if ($country == 'BE') { // BE $xpath = static::XPATH_API_BE_BASE; } + if ($country == 'DE') { // DE + $xpath = static::XPATH_API_DE_BASE; + } + return $this->getConfigFromXpath($xpath, $store); } @@ -97,7 +120,7 @@ public function getBase(string $country = 'NL', int|string $store = null): mixed */ public function getVersion(string $country = 'NL', string $endpoint = null, int|string $store = null): mixed { - $xpath = static::XPATH_API_VERSION; + $xpath = static::XPATH_API_VERSION; // NL if ($country == 'BE') { switch ($endpoint) { @@ -110,6 +133,17 @@ public function getVersion(string $country = 'NL', string $endpoint = null, int| } } + if ($country == 'DE') { + switch ($endpoint) { + case 'zipcode-find/': + $xpath = static::XPATH_API_DE_POSTCODE_VERSION; + break; + case 'street-find/': + $xpath = static::XPATH_API_DE_STREET_VERSION; + break; + } + } + return $this->getConfigFromXpath($xpath, $store); } diff --git a/Config/Provider/ModuleConfiguration.php b/Config/Provider/ModuleConfiguration.php index f8ecdb7..3fc94e4 100644 --- a/Config/Provider/ModuleConfiguration.php +++ b/Config/Provider/ModuleConfiguration.php @@ -29,17 +29,25 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Config\Provider; class ModuleConfiguration extends AbstractConfigProvider { public const XPATH_CONFIGURATION_MODUS = 'tig_postcode/configuration/modus'; + public const XPATH_CHECKOUT_COMPATIBILITY = 'tig_postcode/configuration/checkout_compatible'; + public const XPATH_MODULE_STABILITY = 'tig_postcode/stability'; + public const XPATH_SUPPORTED_MAGENTO_VERSION = 'tig_postcode/supported_magento_version'; + public const XPATH_NETHERLANDS_CHECK = 'tig_postcode/countries/enable_nl_check'; + public const XPATH_BELGIUM_CHECK = 'tig_postcode/countries/enable_be_check'; + public const XPATH_GERMANY_CHECK = 'tig_postcode/countries/enable_de_check'; + /** * Should return on of these values * '1' => live || @@ -50,7 +58,7 @@ class ModuleConfiguration extends AbstractConfigProvider * * @return mixed */ - public function getModus($store = null) + public function getModus(int|string|null $store = null) { if (!$this->isModuleOutputEnabled()) { return '0'; @@ -66,7 +74,7 @@ public function getModus($store = null) * * @return bool */ - public function isModusLive($store = null) + public function isModusLive(int|string|null $store = null): bool { if ($this->getModus($store) == '1') { return true; @@ -78,11 +86,11 @@ public function isModusLive($store = null) /** * Checks if the extension is on status test via store ID * - * @param string|int|null $store + * @param int|string|null $store * * @return bool */ - public function isModusTest($store = null) + public function isModusTest(int|string|null $store = null): bool { if ($this->getModus($store) == '2') { return true; @@ -98,9 +106,9 @@ public function isModusTest($store = null) * * @return bool */ - public function isModusOff($store = null) + public function isModusOff(int|string|null $store = null): bool { - if ($this->getModus($store) == '0' || false == $this->getModus()) { + if ($this->getModus($store) == '0' || empty($this->getModus())) { return true; } @@ -114,7 +122,7 @@ public function isModusOff($store = null) * * @return string */ - public function getStability($store = null) + public function getStability(int|string|null $store = null) { return $this->getConfigFromXpath(static::XPATH_MODULE_STABILITY, $store); } @@ -151,7 +159,7 @@ public function getCheckoutCompatibility($store = null) * * @return bool */ - public function isNLCheckEnabled($store = null) + public function isNLCheckEnabled($store = null): bool { return (bool) $this->getConfigFromXpath(static::XPATH_NETHERLANDS_CHECK, $store); } @@ -163,8 +171,20 @@ public function isNLCheckEnabled($store = null) * * @return bool */ - public function isBECheckEnabled($store = null) + public function isBECheckEnabled($store = null): bool { return (bool) $this->getConfigFromXpath(static::XPATH_BELGIUM_CHECK, $store); } + + /** + * Check if DE is enabled via store ID + * + * @param string|int|null $store + * + * @return bool + */ + public function isDECheckEnabled($store = null): bool + { + return (bool) $this->getConfigFromXpath(static::XPATH_GERMANY_CHECK, $store); + } } diff --git a/Controller/Address/Service.php b/Controller/Address/Service.php index 1a30f9d..6ae09cf 100644 --- a/Controller/Address/Service.php +++ b/Controller/Address/Service.php @@ -29,6 +29,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Controller\Address; use Magento\Framework\App\Action\Context; @@ -37,6 +38,8 @@ use TIG\Postcode\Webservices\Endpoints\GetAddress; use TIG\Postcode\Webservices\Endpoints\GetBePostcode; use TIG\Postcode\Webservices\Endpoints\GetBeStreet; +use TIG\Postcode\Webservices\Endpoints\GetDePostcode; +use TIG\Postcode\Webservices\Endpoints\GetDeStreet; use TIG\Postcode\Services\Converter\Factory; class Service extends Action @@ -52,29 +55,41 @@ class Service extends Action private $converter; /** - * @var GetAddress + * @var GetAddress // NL */ private $getAddress; /** - * @var GetBePostcode + * @var GetBePostcode // BE */ private $getBePostcode; /** - * @var GetBeStreet + * @var GetBeStreet // BE */ private $getBeStreet; + /** + * @var GetDePostcode // DE + */ + private $getDePostcode; + + /** + * @var GetDeStreet // DE + */ + private $getDeStreet; + /** * Service constructor. * - * @param Context $context - * @param JsonFactory $jsonFactory - * @param Factory $converterFactory - * @param GetAddress $getAddress - * @param GetBePostcode $getBePostcode - * @param GetBeStreet $getBeStreet + * @param Context $context + * @param JsonFactory $jsonFactory + * @param Factory $converterFactory + * @param GetAddress $getAddress + * @param GetBePostcode $getBePostcode + * @param GetBeStreet $getBeStreet + * @param GetDePostcode $getDePostcode + * @param GetDeStreet $getDeStreet */ public function __construct( Context $context, @@ -82,15 +97,19 @@ public function __construct( Factory $converterFactory, GetAddress $getAddress, GetBePostcode $getBePostcode, - GetBeStreet $getBeStreet + GetBeStreet $getBeStreet, + GetDePostcode $getDePostcode, + GetDeStreet $getDeStreet ) { parent::__construct($context); - $this->jsonFactory = $jsonFactory; - $this->converter = $converterFactory; - $this->getAddress = $getAddress; - $this->getBePostcode = $getBePostcode; - $this->getBeStreet = $getBeStreet; + $this->jsonFactory = $jsonFactory; + $this->converter = $converterFactory; + $this->getAddress = $getAddress; + $this->getBePostcode = $getBePostcode; + $this->getBeStreet = $getBeStreet; + $this->getDePostcode = $getDePostcode; + $this->getDeStreet = $getDeStreet; } /** @@ -103,10 +122,10 @@ public function execute() $params = $this->getRequest()->getParams(); $country = $this->getCountry($params); - $method = $this->getMethod($params, $country); + $method = $this->getMethod($params, $country); $endpoint = $this->getEndpoint($country, $method); - $params = $this->converter->convert('request', $params, $endpoint->getRequestKeys()); + $params = $this->converter->convert('request', $params, $endpoint->getRequestKeys()); if (!$params) { return $this->returnFailure(__('Request validation failed')); } @@ -146,7 +165,11 @@ private function getMethod($params, $country) */ private function getCountry($params): string { - if (key($params) == 'be') { + if (key($params) == 'be') { // BE + return key($params); + } + + if (key($params) == 'de') { // DE return key($params); } @@ -178,6 +201,7 @@ private function returnFailure($error) private function returnJson($data) { $response = $this->jsonFactory->create(); + return $response->setData($data); } @@ -187,18 +211,26 @@ private function returnJson($data) * @param string $country * @param string $method * - * @return GetAddress|GetBePostcode|GetBeStreet + * @return GetAddress|GetBePostcode|GetBeStreet|GetDePostcode|GetDeStreet */ private function getEndpoint($country, $method) { - if ($country == 'be' && $method == 'getpostcode') { + if ($country == 'be' && $method == 'getpostcode') { // BE return $this->getBePostcode; } - if ($country == 'be' && $method == 'getstreet') { + if ($country == 'be' && $method == 'getstreet') { // BE return $this->getBeStreet; } - return $this->getAddress; + if ($country == 'de' && $method == 'getpostcode') { // DE + return $this->getDePostcode; + } + + if ($country == 'de' && $method == 'getstreet') { // DE + return $this->getDeStreet; + } + + return $this->getAddress; // NL } } diff --git a/NEWS.md b/NEWS.md index 0f03194..091c70d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -92,7 +92,7 @@ if (data.error_code) { - Revised and updated the Magento User manual to ensure it matches the latest changes. - Updated `SECURITY.md` with GitHub’s private reporting option, providing a secure channel for issue reporting. -- Successfully tested the extension with the new Magento 2.4.7-beta1, confirming compatibility and +- Successfully tested the extension with the new Magento 2.4.7-beta1, Magento 2.4.7-beta2, confirming compatibility and performance. ## UX/UC improvements diff --git a/Plugin/Model/Checkout/LayoutProcessorPlugin.php b/Plugin/Model/Checkout/LayoutProcessorPlugin.php index f85c69a..6ab8892 100644 --- a/Plugin/Model/Checkout/LayoutProcessorPlugin.php +++ b/Plugin/Model/Checkout/LayoutProcessorPlugin.php @@ -245,17 +245,17 @@ public function afterProcess($subject, $jsLayout) { self::COUNTRY_CODE_PATH, ScopeInterface::SCOPE_WEBSITE ); - // Change default sortOrder of PostcodeField if country is set to NL or BE + // Change default sortOrder of PostcodeField if country is set to NL or BE or DE // @TODO use a better way to set sort order for postcode field, // tried in branch "tryout_billing_address_sortorder_mixin" - // $TODO remove debug data + // @TODO remove debug data /* $file = fopen('test.txt', 'a+'); fwrite($file, $defaultCountry . "--"); fclose($file); */ - if ($defaultCountry === "NL" || $defaultCountry === "BE") { + if ($defaultCountry === "NL" || $defaultCountry === "BE" || $defaultCountry === "DE") { $jsLayout = $this->arrayManager->set($postalCodePath . '/config/sortOrder', $jsLayout, 50); } diff --git a/Plugin/Model/ResourceModel/Country/CollectionPlugin.php b/Plugin/Model/ResourceModel/Country/CollectionPlugin.php index 84e42d2..3cf4a1a 100644 --- a/Plugin/Model/ResourceModel/Country/CollectionPlugin.php +++ b/Plugin/Model/ResourceModel/Country/CollectionPlugin.php @@ -38,9 +38,11 @@ class CollectionPlugin { + // Constants for sort order base and increment private const SORT_ORDER_BASE = 'sortOrderBase'; private const SORT_ORDER_INCREMENT = 'sortOrderIncrement'; + // Configuration for sort order for Mageplaza OSC private const SORT_ORDER_CONFIG = [ 'Mageplaza_OSC' => [ self::SORT_ORDER_BASE => 10, @@ -59,6 +61,8 @@ class CollectionPlugin private $fullModuleList; /** + * Constructor to initialize module configuration and full module list + * * @param ModuleConfiguration $moduleConfiguration * @param FullModuleList $fullModuleList */ @@ -80,6 +84,7 @@ public function __construct( */ private function getPostcodeNLConfig($sortOrderBase, $sortOrderIncrement): array { + // Returns an array of configurations for the postcode fields return [ 'enabled' => $this->moduleConfiguration->isNLCheckEnabled() && !$this->moduleConfiguration->isModusOff(), 'postcode' => [ @@ -198,7 +203,70 @@ private function getPostcodeBEConfig($sortOrderBase, $sortOrderIncrement) } /** - * Aad Postcode configuration + * Get postcode configuration for DE + * + * @param string|int $sortOrderBase + * @param string|int $sortOrderIncrement + * + * @return array + */ + private function getPostcodeDEConfig($sortOrderBase, $sortOrderIncrement) + { + return [ + 'enabled' => $this->moduleConfiguration->isDECheckEnabled() && !$this->moduleConfiguration->isModusOff(), + 'postcode' => [ + 'sortOrder' => $sortOrderBase, + 'classes' => [ + 'tig_postcode_field' => true, + 'tig_postcode_de' => true + ], + 'visible' => true, + ], + 'tig_housenumber' => [ + 'sortOrder' => $sortOrderBase + $sortOrderIncrement, + 'visible' => true, + 'classes' => [ + 'tig_housenumber_field' => true, + 'tig_postcode_de' => true + ] + ], + 'tig_housenumber_addition' => [ + 'sortOrder' => $sortOrderBase + 2 * $sortOrderIncrement, + 'visible' => true, + 'classes' => [ + 'tig_housenumber_addition_field' => true, + 'tig_postcode_de' => true + ] + ], + 'tig_street' => [ + 'sortOrder' => $sortOrderBase + 3 * $sortOrderIncrement, + 'visible' => true, + 'classes' => [ + 'tig_street_field' => true, + 'tig_postcode_de' => true + ], + ], + 'street' => [ + 'sortOrder' => $sortOrderBase + 4 * $sortOrderIncrement, + 'visible' => false, + 'classes' => [ + 'tig_street_fields' => true, + 'tig_postcode_de' => true + ] + ], + 'city' => [ + 'sortOrder' => $sortOrderBase + 5 * $sortOrderIncrement, + 'visible' => true, + 'classes' => [ + 'tig_city_field' => true, + 'tig_postcode_de' => true + ] + ], + ]; + } + + /** + * Add postcode configuration based on country * * @param mixed $countryOption * @param string $country @@ -207,6 +275,7 @@ private function getPostcodeBEConfig($sortOrderBase, $sortOrderIncrement) */ private function addPostcodeConfig(&$countryOption, $country, $sortOrderBase, $sortOrderIncrement) { + // Check country and add respective configuration if ($country === "NL") { $countryOption['tig_postcode'] = $this->getPostcodeNLConfig($sortOrderBase, $sortOrderIncrement); } @@ -214,18 +283,24 @@ private function addPostcodeConfig(&$countryOption, $country, $sortOrderBase, $s if ($country === "BE") { $countryOption['tig_postcode'] = $this->getPostcodeBEConfig($sortOrderBase, $sortOrderIncrement); } + + if ($country === "DE") { + $countryOption['tig_postcode'] = $this->getPostcodeDEConfig($sortOrderBase, $sortOrderIncrement); + } } /** - * Get sortOrder and increment + * Get sortOrder base and increment * * @return int[] */ private function getSortOrderAndIncrement() { + // Initialize base and increment $sortOrderBase = 81; $sortOrderIncrement = 1; + // Loop through the sort order config and update base and increment if module exists foreach (self::SORT_ORDER_CONFIG as $module => $config) { if (!$this->fullModuleList->has($module)) { continue; @@ -238,7 +313,7 @@ private function getSortOrderAndIncrement() } /** - * After Plugin function check the @see + * Main method that is executed after the `toOptionArray` method of the `Collection` class * * @param Collection $subject * @param mixed $result @@ -246,12 +321,12 @@ private function getSortOrderAndIncrement() * @return mixed * @see Collection::toOptionArray */ - public function afterToOptionArray( - $subject, - $result - ) { - list($sortOrderBase, $sortOrderIncrement) = $this->getSortOrderAndIncrement(); + public function afterToOptionArray($subject, $result): mixed + { + // Get sort order base and increment + [$sortOrderBase, $sortOrderIncrement] = $this->getSortOrderAndIncrement(); + // Loop through the result and add postcode configuration foreach ($result as &$countryOption) { $this->addPostcodeConfig( $countryOption, @@ -261,6 +336,7 @@ public function afterToOptionArray( ); } + // Return the modified result return $result; } } diff --git a/README.md b/README.md index 95ab027..ff087b8 100644 --- a/README.md +++ b/README.md @@ -137,12 +137,16 @@ of your Magento webshop. From there, you can configure the extension according t ### For Dutch postcodes -postcode_service_magento2-nl>
+<img src= ### For Belgium postcodes -postcode_service_magento2-be +postcode_service_magento2-be + +### For German postcodes + +The functionality for Germany is similar to that for Belgium. Please refer to the preceding example +for a demonstration of its operation. ## Further documentation diff --git a/Services/Validation/Request.php b/Services/Validation/Request.php index 5218878..86d347f 100644 --- a/Services/Validation/Request.php +++ b/Services/Validation/Request.php @@ -68,7 +68,6 @@ public function validate($data): bool } return $this->validateRequestFields($data); - } /** diff --git a/Services/Validation/Response.php b/Services/Validation/Response.php index f01081c..583300c 100644 --- a/Services/Validation/Response.php +++ b/Services/Validation/Response.php @@ -65,6 +65,10 @@ public function validate($data): bool return true; } + if (count($data) === 0) { // empty array + return true; + } + return $this->validateResponseFields($data); } @@ -77,7 +81,7 @@ public function validate($data): bool */ private function validateResponseFields(array $data): bool { - // If $data is a single-level array (NL) instead of multi-level array (BE), + // If $data is a single-level array (NL) instead of multi-level array (BE), (DE), // wrap it in another array for compatibility with the code in this method if (!is_array(reset($data))) { $data = [$data]; diff --git a/Test/Unit/Config/CheckoutConfiguration/ActionUrlTest.php b/Test/Unit/Config/CheckoutConfiguration/ActionUrlTest.php index cbd12fe..2f1b7c4 100644 --- a/Test/Unit/Config/CheckoutConfiguration/ActionUrlTest.php +++ b/Test/Unit/Config/CheckoutConfiguration/ActionUrlTest.php @@ -49,15 +49,19 @@ public function testGetValue() $expectsPostcodeNLUrl = 'http://test.nl/postcode/address/service/'; $expectsPostcodeBEUrl = 'http://test.nl/postcode/address/service/be/getpostcode'; $expectsStreetBEUrl = 'http://test.nl/postcode/address/service/be/getstreet'; + $expectsPostcodeDEUrl = 'http://test.nl/postcode/address/service/de/getpostcode'; + $expectsStreetDEUrl = 'http://test.nl/postcode/address/service/de/getstreet'; $urlInterfaceMock = $this->getFakeMock(UrlInterface::class)->getMock(); $expects = $urlInterfaceMock->expects($this->exactly(3)); $expects->method('getUrl')->withConsecutive( ['postcode/address/service', ['_secure' => true]], ['postcode/address/service/be/getpostcode', ['_secure' => true]], - ['postcode/address/service/be/getstreet', ['_secure' => true]] + ['postcode/address/service/be/getstreet', ['_secure' => true]], + ['postcode/address/service/de/getpostcode', ['_secure' => true]], + ['postcode/address/service/de/getstreet', ['_secure' => true]] ); - $expects->willReturnOnConsecutiveCalls($expectsPostcodeNLUrl, $expectsPostcodeBEUrl, $expectsStreetBEUrl); + $expects->willReturnOnConsecutiveCalls($expectsPostcodeNLUrl, $expectsPostcodeBEUrl, $expectsStreetBEUrl, $expectsPostcodeDEUrl, $expectsStreetDEUrl); $instance = $this->getInstance( [ @@ -68,7 +72,9 @@ public function testGetValue() $returns = [ 'postcode_service' => $expectsPostcodeNLUrl, 'postcode_be_getpostcode' => $expectsPostcodeBEUrl, - 'postcode_be_getstreet' => $expectsStreetBEUrl + 'postcode_be_getstreet' => $expectsStreetBEUrl, + 'postcode_de_getpostcode' => $expectsPostcodeDEUrl, + 'postcode_de_getstreet' => $expectsStreetDEUrl ]; $this->assertEquals($returns, $instance->getValue()); diff --git a/Test/Unit/Config/Provider/ApiConfigurationTest.php b/Test/Unit/Config/Provider/ApiConfigurationTest.php index 4956723..a686892 100644 --- a/Test/Unit/Config/Provider/ApiConfigurationTest.php +++ b/Test/Unit/Config/Provider/ApiConfigurationTest.php @@ -42,13 +42,14 @@ class ApiConfigurationTest extends AbstractConfigurationTest private $base = 'https://api.postcodeservice.com/nl/'; /** @var string */ private $beBase = 'https://api.postcodeservice.com/be/'; - /** @var string */ - private $version = 'v3'; + private $deBase = 'https://api.postcodeservice.com/de/'; + /** @var string */ + private $version = 'v5'; /** @var string */ - private $postcodeVersion = 'v2'; + private $postcodeVersion = 'v3'; /** @var string */ - private $streetVersion = 'v2'; + private $streetVersion = 'v3'; /** @var string */ private $postcodeEndpoint = 'zipcode-find/'; @@ -90,6 +91,15 @@ public function testBeGetBase() $this->assertEquals($this->beBase, $this->instance->getBase('BE')); } + /** + * @return void + */ + public function testDeGetBase() + { + $this->setXpath(ApiConfiguration::XPATH_API_DE_BASE, $this->deBase); + $this->assertEquals($this->deBase, $this->instance->getBase('DE')); + } + /** * @return void */ @@ -152,6 +162,28 @@ public function testGetBeBasePostcodeUri() $this->assertEquals($expected, $this->instance->getBEBaseUri($this->postcodeEndpoint)); } + /** + * @return void + */ + public function testGetDeBasePostcodeUri() + { + $this->setXpathConsecutive( + [ + ApiConfiguration::XPATH_API_DE_BASE, + ApiConfiguration::XPATH_API_DE_POSTCODE_VERSION, + ApiConfiguration::XPATH_API_DE_STREET_VERSION, + ], + [ + $this->deBase, + $this->postcodeVersion, + $this->streetVersion + ] + ); + + $expected = $this->deBase . '/' . $this->postcodeVersion . '/'; + $this->assertEquals($expected, $this->instance->getDEBaseUri($this->postcodeEndpoint)); + } + /** * @return void */ @@ -173,4 +205,26 @@ public function testGetBeBaseStreetUri() $expected = $this->beBase . '/' . $this->streetVersion . '/'; $this->assertEquals($expected, $this->instance->getBEBaseUri($this->streetEndpoint)); } + + /** + * @return void + */ + public function testGetDeBaseStreetUri() + { + $this->setXpathConsecutive( + [ + ApiConfiguration::XPATH_API_DE_BASE, + ApiConfiguration::XPATH_API_DE_POSTCODE_VERSION, + ApiConfiguration::XPATH_API_DE_STREET_VERSION, + ], + [ + $this->deBase, + $this->postcodeVersion, + $this->streetVersion + ] + ); + + $expected = $this->deBase . '/' . $this->streetVersion . '/'; + $this->assertEquals($expected, $this->instance->getDEBaseUri($this->streetEndpoint)); + } } diff --git a/Test/Unit/Config/Provider/ModuleConfigurationTest.php b/Test/Unit/Config/Provider/ModuleConfigurationTest.php index 8638cf4..8e80a43 100644 --- a/Test/Unit/Config/Provider/ModuleConfigurationTest.php +++ b/Test/Unit/Config/Provider/ModuleConfigurationTest.php @@ -210,6 +210,14 @@ public function checkBEEnabledProvider() ]; } + public function checkDEEnabledProvider() + { + return [ + 'de_on' => [ModuleConfiguration::XPATH_GERMANY_CHECK, 1, 1], + 'de_off' => [ModuleConfiguration::XPATH_GERMANY_CHECK, 0, 0] + ]; + } + /** * @param $xpath * @param $enabled diff --git a/Test/Unit/Controller/Address/ServiceTest.php b/Test/Unit/Controller/Address/ServiceTest.php index 6a9a81f..e2d1760 100644 --- a/Test/Unit/Controller/Address/ServiceTest.php +++ b/Test/Unit/Controller/Address/ServiceTest.php @@ -39,6 +39,8 @@ use TIG\Postcode\Webservices\Endpoints\GetAddress; use TIG\Postcode\Webservices\Endpoints\GetBePostcode; use TIG\Postcode\Webservices\Endpoints\GetBeStreet; +use TIG\Postcode\Webservices\Endpoints\GetDePostcode; +use TIG\Postcode\Webservices\Endpoints\GetDeStreet; use Magento\Framework\Controller\Result\JsonFactory; use Magento\Framework\Controller\Result\Json; @@ -86,6 +88,28 @@ public function dataProvider() 'zipcode' => '1000', 'street' => 'Zandstraat' ] + ], + 'de postcode succeeds' => [ + [ + 'de' => 'getpostcode', 'zipcodezone' => '40723' + ], + [ + 'de' => 'getpostcode', 'zipcodezone' => '40723' + ] + ], + 'de street succeeds' => [ + [ + 'de' => 'getstreet', + 'city' => 'Hilden', + 'zipcode' => '40723', + 'street' => 'Kalstert' + ], + [ + 'de' => 'getstreet', + 'city' => 'Hilden', + 'zipcode' => '40723', + 'street' => 'Kalstert' + ] ] ]; } @@ -106,6 +130,8 @@ public function testExecuteShouldAlwaysReturnJsonObject($converterFails, $params 'getAddress' => $this->getAddressCallMock($converterFails, $params), 'getBePostcode' => $this->getBePostcodeCallMock($converterFails, $params), 'getBeStreet' => $this->getBeStreetCallMock($converterFails, $params), + 'getDePostcode' => $this->getDePostcodeCallMock($converterFails, $params), + 'getDeStreet' => $this->getDeStreetCallMock($converterFails, $params), ]); $result = $instance->execute(); @@ -128,6 +154,8 @@ public function testExecuteWithEmptyResultShouldAlwaysReturnJsonObject($converte 'getAddress' => $this->getAddressCallMock($converterFails, $params, true), 'getBePostcode' => $this->getBePostcodeCallMock($converterFails, $params), 'getBeStreet' => $this->getBeStreetCallMock($converterFails, $params), + 'getDePostcode' => $this->getDePostcodeCallMock($converterFails, $params), + 'getDeStreet' => $this->getDeStreetCallMock($converterFails, $params), ]); $result = $instance->execute(); @@ -204,6 +232,32 @@ private function getBePostcodeCallMock($params, bool $returns = false) return $addressMock; } + /** + * @param $params + * @param bool $returns + * @return mixed + */ + private function getDePostcodeCallMock($params, bool $returns = false) + { + $addressMock = $this->getFakeMock(GetDePostcode::class)->setMethods([ + 'setRequestData', 'call', 'getCountry', 'getMethod' + ])->getMock(); + + $setExpects = $addressMock->expects($this->any()); + $setExpects->method('setRequestData')->with($params); + + $callExpects = $addressMock->expects($this->any()); + $callExpects->method('call')->willReturn($returns); + + $countryExpects = $addressMock->expects($this->any()); + $countryExpects->method('getCountry')->willReturn('de'); + + $methodExpects = $addressMock->expects($this->any()); + $methodExpects->method('getMethod')->willReturn('getpostcode'); + + return $addressMock; + } + /** * @param $params * @param bool $returns @@ -230,6 +284,32 @@ private function getBeStreetCallMock($params, bool $returns = false) return $addressMock; } + /** + * @param $params + * @param bool $returns + * @return mixed + */ + private function getDeStreetCallMock($params, bool $returns = false) + { + $addressMock = $this->getFakeMock(GetDeStreet::class)->setMethods([ + 'setRequestData', 'call', 'getCountry', 'getMethod' + ])->getMock(); + + $setExpects = $addressMock->expects($this->any()); + $setExpects->method('setRequestData')->with($params); + + $callExpects = $addressMock->expects($this->any()); + $callExpects->method('call')->willReturn($returns); + + $countryExpects = $addressMock->expects($this->any()); + $countryExpects->method('getCountry')->willReturn('de'); + + $methodExpects = $addressMock->expects($this->any()); + $methodExpects->method('getMethod')->willReturn('getstreet'); + + return $addressMock; + } + /** * @param $returns * @param $params diff --git a/Webservices/Api.php b/Webservices/Api.php index 6c6b733..798dc64 100644 --- a/Webservices/Api.php +++ b/Webservices/Api.php @@ -138,7 +138,7 @@ private function setHeaders(EndpointInterface $endpoint) { $version = str_replace('v', '', $this->apiConfiguration->getVersion()); - if ((int) $version >= 4 || $endpoint->getCountry() === 'BE') { + if ((int) $version >= 4 || $endpoint->getCountry() === 'BE' || $endpoint->getCountry() === 'DE') { $this->httpClient->setOptions(['strict' => false]); $this->httpClient->setHeaders([ 'X-ClientId' => $this->clientConfiguration->getClientId(), @@ -192,6 +192,10 @@ private function setUri(EndpointInterface $endpoint) $uri = $this->apiConfiguration->getBEBaseUri($endpoint->getEndpoint()) . $endpoint->getEndpoint(); // BE } + if ($endpoint->getCountry() == 'DE') { + $uri = $this->apiConfiguration->getDEBaseUri($endpoint->getEndpoint()) . $endpoint->getEndpoint(); // DE + } + $this->httpClient->setUri($uri); } } diff --git a/Webservices/Endpoints/EndpointAbstract.php b/Webservices/Endpoints/EndpointAbstract.php index 0295a10..d2faf1c 100644 --- a/Webservices/Endpoints/EndpointAbstract.php +++ b/Webservices/Endpoints/EndpointAbstract.php @@ -30,6 +30,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Webservices\Endpoints; use TIG\Postcode\Webservices\Api; @@ -38,13 +39,9 @@ abstract class EndpointAbstract implements EndpointInterface { protected $endpoint; - protected $method = 'GET'; - - protected $data = []; - + protected $data = []; protected $country; - protected $requestKeys; protected $responseKeys; @@ -119,6 +116,7 @@ public function getRequestKeys() { return $this->requestKeys; } + /** * {@inheritDoc} */ diff --git a/Webservices/Endpoints/EndpointInterface.php b/Webservices/Endpoints/EndpointInterface.php index da95dc1..09adea6 100644 --- a/Webservices/Endpoints/EndpointInterface.php +++ b/Webservices/Endpoints/EndpointInterface.php @@ -29,6 +29,7 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Webservices\Endpoints; interface EndpointInterface diff --git a/Webservices/Endpoints/GetAddress.php b/Webservices/Endpoints/GetAddress.php index bf04d48..0df0019 100644 --- a/Webservices/Endpoints/GetAddress.php +++ b/Webservices/Endpoints/GetAddress.php @@ -29,15 +29,14 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Webservices\Endpoints; // @codingStandardsIgnoreFile class GetAddress extends EndpointAbstract { - protected $endpoint = 'find/'; - - protected $country = 'NL'; - - protected $requestKeys = ['zipcode', 'houseno']; // NL V5 + protected $endpoint = 'find/'; + protected $country = 'NL'; + protected $requestKeys = ['zipcode', 'houseno']; // NL V5 protected $responseKeys = ['street', 'city']; // NL V5 } diff --git a/Webservices/Endpoints/GetBePostcode.php b/Webservices/Endpoints/GetBePostcode.php index 4f3641d..934646b 100644 --- a/Webservices/Endpoints/GetBePostcode.php +++ b/Webservices/Endpoints/GetBePostcode.php @@ -30,15 +30,14 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ + namespace TIG\Postcode\Webservices\Endpoints; // @codingStandardsIgnoreFile class GetBePostcode extends EndpointAbstract { - protected $endpoint = 'zipcode-find/'; - - protected $country = 'BE'; - + protected $endpoint = 'zipcode-find/'; + protected $country = 'BE'; protected $requestKeys = ['zipcodezone', 'multiresults']; // BE V3 protected $responseKeys = ['zipcode', 'city']; // BE V3 } diff --git a/Webservices/Endpoints/GetBeStreet.php b/Webservices/Endpoints/GetBeStreet.php index d4c7f99..7993e18 100644 --- a/Webservices/Endpoints/GetBeStreet.php +++ b/Webservices/Endpoints/GetBeStreet.php @@ -36,9 +36,7 @@ class GetBeStreet extends EndpointAbstract { protected $endpoint = 'street-find/'; - protected $country = 'BE'; - protected $requestKeys = ['zipcode', 'city', 'street']; // BE V3 protected $responseKeys = ['street']; // BE V3 } diff --git a/Webservices/Endpoints/GetDePostcode.php b/Webservices/Endpoints/GetDePostcode.php new file mode 100644 index 0000000..9158596 --- /dev/null +++ b/Webservices/Endpoints/GetDePostcode.php @@ -0,0 +1,43 @@ + Magento\Config\Model\Config\Source\Yesno - tig_postcode/countries/enable_be_check + tig_postcode/countries/enable_de_check
    diff --git a/etc/config.xml b/etc/config.xml index e9cb92a..a9a9216 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -1,4 +1,5 @@ - + - \TIG\Postcode\Services\Validation\Request - \TIG\Postcode\Services\Validation\Response + \TIG\Postcode\Services\Validation\Request + + \TIG\Postcode\Services\Validation\Response + - + - \TIG\Postcode\Services\Converter\Request - \TIG\Postcode\Services\Converter\Response + \TIG\Postcode\Services\Converter\Request + + \TIG\Postcode\Services\Converter\Response + - + - + + type="TIG\Postcode\Plugin\Model\ResourceModel\Country\CollectionPlugin"/> + sortOrder="10" + type="TIG\Postcode\Plugin\Checkout\Model\PaymentInformationManagement"/> + sortOrder="10" + type="TIG\Postcode\Plugin\Checkout\Model\GuestPaymentInformationManagement"/> @@ -92,6 +101,7 @@ - + diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 210352b..426dbd4 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -33,6 +33,7 @@ "Please select a postcode before filling the street field.","Please select a postcode before filling the street field." "Enable Netherlands check","Enable Netherlands check" "Enable Belgium check","Enable Belgium check" +"Enable Germany check","Enable Germany check" "No results found.","No results found." "No results found. Please fill in manually.","No results found. Please fill in manually." "Loading zipcodes ...","Loading zipcodes ..." diff --git a/i18n/nl_BE.csv b/i18n/nl_BE.csv index 2aa5967..52ebc1a 100644 --- a/i18n/nl_BE.csv +++ b/i18n/nl_BE.csv @@ -52,6 +52,7 @@ Support,Support "Please select a postcode before filling the street field.","Selecteer eerst een postcode voor u de straatnaam invult." "Enable Netherlands check","Zet Nederlandse check aan" "Enable Belgium check","Zet Belgische check aan" +"Enable Germany check","Zet Duitse check aan" "No results found.","Geen resultaten gevonden." "No results found. Please fill in manually.","Wij kunnen uw straat niet automatisch ophalen. Zijn de postcode en plaats correct ingevuld?" "Loading zipcodes ...","Ophalen van postcodes ..." diff --git a/i18n/nl_NL.csv b/i18n/nl_NL.csv index 2c9d607..0cd172c 100644 --- a/i18n/nl_NL.csv +++ b/i18n/nl_NL.csv @@ -52,6 +52,7 @@ "Please select a postcode before filling the street field.","Selecteer eerst een postcode voor u de straatnaam invult." "Enable Netherlands check","Zet Nederlandse check aan" "Enable Belgium check","Zet Belgische check aan" +"Enable Germany check","Zet Duitse check aan" "No results found.","Geen resultaten gevonden." "No results found. Please fill in manually.","Wij kunnen uw straat niet automatisch ophalen. Zijn de postcode en plaats correct ingevuld?" "Loading zipcodes ...","Ophalen van postcodes ..." diff --git a/media/postcode_service_magento_2_be.gif b/media/postcode_service_magento_2_be.gif new file mode 100644 index 0000000000000000000000000000000000000000..8622a8043f063938bfc10ddc3f9c2a5fa0dc5ef6 GIT binary patch literal 303712 zcmZ6Sc|26#|HtpWGs9S7?1RDBx5*OOl4h)f(u9P>*w=)FPgFBwO~sIbA5AfZ*O~NZ);^|a5(+F{SW{V zt%=LumUj~_tX#gNr>o~f_MvCcRh3mc+Bzo2Cf>h$@9N@;k-})PR76MwEsh2N;J?`aF2!FeE4_C+|Mr);FQz7@ zW20l!AE%v8I1RlT(ooaL&B?Q}usV149Q6t{&_B?EU@sne|>U;6> z!^DR(r_a>a)*BldD_|9j42*KJa}Meo#9WAd^7zT`y}g~?-KC!Aot@0BwUsxM^WXON z)_!gNT3y{*`?0q6E9YkJ=Elb8$GM;1SJu~lefqw=x4rvye*Vwj?WLvVxWe{~hrQo^ z{_Y)}UHtYfxq4vc+iGfMH?6eu=g(hjn}6$Hj9$p8W-vdjZ~U%*F*dodGdlO>Glt>gOx8!`T@mHDZCXS#KL%Sc6gg1)Z0RHuKL7E~ ze@4FjjGX^$prBx~vSPQo;)nCG6|(zIZuWA1?q27k_hgUnO%1!&=6k0cCU0g9#9yqu zl+fel@y^(=$;7DA#bw;y_MxBmlq_aRL*?IU`G1!@htI*v*~x-HvO1up0|Wovmj44s zzyJ(@``@Gg`%C~N2jD|ui1m!FM5Ks@M{j*ecPdKJu8`PJ`urMNFJ!8>q3mTQ)*>CJ z#whQ*speGW(bsryAYaF~ztFbn{;NAi=f6$$H9Z(A#wYU1*fp#5XAy5|oat|_eD{D< zW_Q=_Lg|}o*QSt<{VmmFb>!}Jnb4-HiKd`;Rc8iTAAV@#>g&I2-&Xtaaon$OAMXg) zPCui-_+*c^>sUWc6Vdb>Y;XAdlCEf9bhM*!e&Ci~=%>MsrmsUO7T08tJ!)QjcN`%~ zy78!Gskugy*C+xjzm#2fe#x`_X6v_`2mvfm|F`MqXT4L~T6>N7G}It$0s$&0Xy$)PDdi@ zkrY_hPgObq)T;qEjGwj_-+0!7F8r_OBT@PWH%gt9Ve-gT_{s;+jSdrYw!H__|9*d- zAm;$UQAd|!eXs9-o#%(--$Gfym5mvnL3uo2DX0{F%MT2ntSHR*(1*O2QN40i>B>b1 zL$!=&8%Cd_-*pi062wSugs{`!Q=B5?lfWcM>=yR}VLXFf8Y^se>O<<#8T!Y{Plr$W zRLkdZLOicS<#t7}mjWJyREM+dy3V(l*~mq+XT*KE>RCu)0{2%@e4J1ylDN)H7W7!Bbf?Rsbe;>FF;`h)N+~1+{~><)L=kz4P@*tt zhn*@6(7NbPH=ZM|8oC;2yF{RUW2< z>FOB;QlH%vIO-Pbg6~D3{=VmWAmG5nM+)-zUNaYiwVP6qLzQ?KO23A}dM-cCVI~Ti zMeABVkjDsh^W&JzU}^jM)uc(?5me=W@}@FJa2^<%SVG~uXY`Eh`Rar1tfAf8EK3F5ba#_wwE z8?15s$m$g8RVEOQJjT9jA@crOyBAVDp~I5@m7do{}fOY z47G;i(*`O^cliN&sY>VQdr{> za3dK!gij+O8TTlNWC{}B3#P=Z-jme9o7gRP-VVwf}Z=6`qs_2PA9yKY7 z=&bK?w=DMq1TIvZfWWvaOs$a_Zy6^bY=Gn>C73U#6`JA^2k4*;29Wv1v^g|FrJVXi z%zv@yAWFfvVP4?io(j~M+V}R@dN!9a1-yg;R3&&zproA7vG|-_7Qm7Q5@RAOfP{$qC_QmRpdbztFytHUct-kv%d)Sd_4 zk{GfK$uvlQEG>HQdE#GU#Xfu*6s^<)$2yaa`>ORAFVBobju7}IUByrSiOLc*7Uq|4 zC%hCVRc|Nv#a)4$OXID^_&D{w_Z6A)@|tm=kvf1xn}_jQV;x#@*@tdb6>+~$ahZ$` zyn+_K$4iXfzvy1ynEFsSsDqFaHDUq#h6KknPO2MytP8$$=iT|aqyunvn&;a8FU7(67Hwc@B6eEYM}S zcwgN_-o;5BD^yrsF%3EQF}{&fP4(-q8*g3f?3l2PwZp>DrJnF+E1q8`gBe|bSQAz{o=8Aq`I?s?jB!ziO=EO04Aq?R@bfKL+2D)& z#f;*v@ca_BH?Gv@ztVdJ!$pJRTrEsC44nRa%(Sg?#viB%5eTvtD12*^j6?nQp6Z@K z1js;7CjlPwDZz&_wyFx!ZXnXhRbX+{Yj@ZLGz0vRK1eHGVj8GJ2}WA}nG7Yg4xk2$ zDxSH5e5BbtS(3|`<6X4TiLQ7rJ3~|qi7FLkXH+Z7i7^el zVnR7|9m{tct=GN>BQX!3NHmX3=u1iS$?_-JzAXTJVYlzIlE*bFe!nYt`=dev=U#i` z&eRje%=h%AUlglKwPWPLLSUu^|X{KK4Laf z?N{*ca*E(+K~`itC}&5ayBG{T|Kr-D8**guZoiexJGCk@qh4VDFfdXI zJBde}e3351zJ^jv=koz_(U8zEq`aCgfkmtY$qJyr)mzt^)6o6-nSa|e1HQ=k(lh60 zWuOa(I^Jo>>Tt=EkIJuRmTzMEzRGacG9L=lg|5<}#mv39Ly{A8o{mh}KUrAGYz50aJ{}PEuJjCzU;4`>0;O{ zi9ZmR zZWj(q-hFF)cf{@P=zn*|Z{MBlxH~m*_tT%dY{{Zoj&aePThW*QiWY7ced{P%o+$eM zr)X8OxQ)km-A MDdoSZqyqwf87Qd| zVUrS3_Y(1oCFp_@sYfN4$r9PWC0MCag>MWiQmKkNoQDZ0I~HgPVfe`aPekbflQMnx zGJ}g{Mg?UikIGCZ%gp|k;ibyWP0CFQ07HfbZc@zK74Cup9R8M*r0zMI+;eun=W_9$ zYr#GDNB2A??|J^cN0z$p^S7KIbx*qh$U|c#*bIM@`{94@M@T)0GIQJ`^Z43{W*Hk}g)HYE+~@sz~EZR$TjAaU;DVv%ezCz2c@xMQ%vt&4S7T z-pbsImFWeQjP%N4-l{^As?w0E%8Qi`s;aU~s>(Gg`57=IInyQ*;2}XN{gs`Q)ldIc zGo@-+CN(|oH7_pK^cK{-lmht}u<9!ESuEr{jCF}>!E>aK044u zLvb;I29tXJ5A_1u^?mN};DWl#lXa;02K1c<$;W`zs#;`LDPMJi!l6c`rCK2p{4-G< zl_hf7y-{nsQRmu2%z$?C?NVJ%e3Q|grU&lu%~`R_kE%_io6VOR^)w5xhnk6Zn$hu% zhvP+dIus??HT%d7cBflh`07U8n>Dtj4eVP^ZMTrCAHtc<^ZlYE%@*%Fts$CCGV!;S zBAY{{+oCjU{Hhym-!#e}YP*eY1ngW>hy^$+bC+wFAe zj_gAnIj1}F;yZ5L=_q*IQTU;wXuE?E-w{R!kc(M7DBzm(qpHV`YCb%w-F{Rr{g|=D z#lz;>|6evvx+U@PUzV_rT*yw5h^xIOs??BTRN0B!dJC_bULoc-< zOP;LXc?OFc zKm1fJ#^z(@e(Oq;s%2$&@eJ0S9T47I%+I|G0OyE}D~<%6m8UuFfFK0THoc6_k9 zl1Q|84tPvGhd6J#-4lSbBUV)kfCLH{wF8t|fU2mgr*~dHu6{v@@4DfBX!w97=9jWM z8HhD)0VBXF5ZFh4ehLGCZBnB6zCw>D)G*O_SNOAnbORkotsCH@0LTcqH;F5Y=#s$? zhmnkMC@vGyzsWQ0C;%4;;XMoic+f6kz-y^b-Q!TgJp~C8+#5)M=~VEMwO{o@c6b0X zY=N@@Wh{ikLN09J#ZLLj(&{V;~Sn$kuBy*GUfVfmDtG00}nEQM45P_@;Mh z2xJxW^$$G#Ht9G@Jq*ub3Bfk?O7V$Zg)`TNsM-YV*VF~=^fz7#m)t*hn*;2<8Z%zTwz)T$*bdd_UV!5`itrJ#XV{M`iEF%?823@70luT1A? z8IWZV+!*mO)#1dk%ipeP&3K*tn56Mq-CThWj}Undd;Vl(LJwn9e?%P%h}IwRwUV|L zgPjUn?y>)1#`ihlDCoj8qZvRtjDIz+IDm$Y!?>C@7sarH3GFVHMxXc`j$SBSn7!PT zf48y}XK799zcc&2-PO%p6gJh2Fd=t8P_%?aSeh~5-1W2Ikq`WxV*Bq@c3(%h)d$+H zPT>;3eQd-K3}#A(akD4(*TWBUnDe);!~Z$yscgg<3W6mIIiO%e`&OmBo?b5!p1}df zhb=u&Fwq1{~h>A~9R%3Bynbk$_| zScTb+j3GUpX!@$FtJe3L;!=q0eY2L9hTpz|O>U>JXQ-nVw!5}3XbznK9G}*LI*M_; zs_|Fe@@vTd+WdWT;LChQD^_s84a0K7RqQXE2=;st=kda~voBAsDgW4nhv_|M>A#}G zEZ?JjQ&WE`hkl;DEGA|@4Ro?P>sW0^nnS{v{hl>XIbDI69ovECAJt-Vbvt;Ebv50d zVZq+H@XndjyP#>)ehy)G^4t@Dj)=g{?w`kh=Z-v^84{`fx%0K|>E#a#Jwtz2iaQsl zMV60nrb73&hMsH)q9C|9)^(UoNP^5ghTmY#VQE6j4&|7eYYUeWU`<%`Y$9J2A58RB_@S z&F|uY`4dzgPlx%*_e-bh#2h7q7aUba?$( zY$J61mT{s35nauh9q+inIeDphBb?pU9o2fKP$zt*FZamGjkd<6`8W5@eK8*2B2DsS z9sm02V_66T^2pxw{FK1{cDHHziJ5+I)~}!QHm-EGhRegXjr>eHo3^nD^?ax7Z0hMe zLWZl!>v!6zQ9EIZgEyYSmxWi&f1`=)l2)a4R0|TRrT_u&9x>7o*qsQg3I6tyo~2RW zeSoGg5({C@k3`zY#;^ah!6u4E5f!fKuMw4QI!D>6TnWPh`TVE*s6aHC0rD1%MA>US zUSG4<>9%Y%+fK-C!18mO;Je}J5x>;J{Lqu@l`t}HfC@8GVmmuKoxE_;<@AM( zlditG7hK#!TQ*!g&cDAfc2c?>(A_+6>>U-AesI&(@8-!Ew}3krHr;~Ca%0>>s#`YQ z!FQpr4;_|p;HVzC}k0|$Rkg<6TloQe5x;rE%i&$+Rl7nfRodnWvPAM17b@%(Qu z3QRnXOye`yA}9SkeBL`nI%dl|O))RdCtb63%jde@Xq<1xp;{wvx`p_Ee%ba0fBbTs zT>kUVJ00`K|CaBI*S-azt$zXv&yW5WSQNkcCvezL{9;h)HG{uF$}C{!x{$+w!@m=xx}As{SdQ#w*7NneE6fK*6r}l zU!#Z4GPXCj&oN;V2@xzl!<~p8ky8ngFQj8TzdTXQPl)Q*Y}<(%)Ei4U|N7AHo%6#M z5|^Ui+8gdhk2syWbYb*#?CyneoAbsHoRf z4BGUa*iUDG?6uMq(q}7dk_;tIAqke(#-z=2YcPer6dQ7O0Pvrflq55-@X3<}cRx%a z7#}YK(Z?@uzK8cdp_C^vxh6js;qxTS)|H3<+vns3T&_?0eXkr)S06=)`rwMO)vC|! zcq)yyIA);muol8q_RkBt>CeLs$(nxNd}p>;Ghz>@M_dW;m9GFd3Pk9yQlWYjTx$Uf zSD=6*DfN(41OWmm(_qT2B)MTS4{n%-6iTD=M#E$e3nijOx2$x;tuFB~yy5KBN>n+3 z#HWG06g&(KbRi%NxQ{}CgvT3r0Mayk6q%^C#m>N^%#o(`ru=DC>7T?@)3=e3?w~h6 zH@~m)kl~91214=pRRTIaIZ+Id=e9vo<)}JIKFZ7+2FR{`vuOAR$m9vd%^{!Dsm8rN zvg;Mxhs^0zUV42(p3?mv0j}M8DP#aoo(F5c(lFO4IhQfO?@y-^g*Zek+ybCM=4{GR zG9FY=B1((_g7M83vZ}~0V5-~ExEJ4V8SsPr36#zWt4wY@-5iMp;5yC#=uiWp8c~ou zKt=MYGZE$_Sd=)k@E@`}tQNx3?Qtq=IdorAeJfGUb>{k;Q0U06Z7+&nAAU+F2*CuB zq{^Lvv4KyUk0g$Alga#3*hG=Xy$^42y}xj4?w?SLpe{**NN3kHi-)T)EPbt*K&%vT zD@f+m0sk>_CW0`&=n~xKS^t zccUdyh~XS-Dc_43x#&7tnF;DJy7)U8keKKU2MYHfpo&n5hSnS9=BSF38&WjM8eKj; zMm09{s_O{Lp+N_^EJbD8$_!t)p#~uA?_x9TkM^#P%LE14@rqFv(8w9{q>; z0TVn;ps+fTuRY7!I7dZNOg2$B=|Jn5f zdhYh^u2bF8Um{Wu?|7q9U3(N&BCj4x@DY9B`aJVa#I^U2e9$jlU+4wYT|1lLi}~vM z^3a#axu6|iEVoF)IJb zj=#7Zf5pF!d*t@E^FKKcYYX(PIgQTa#^3hgIEhNdVG5@>_ze2-$%ciNo)=M zC(z8uEd2^y`}z9vi}SbVJHO~H{TWVH`NfbpwrDKk{`SWG<^r)B!S;tHU(@e5mH+8n zv_5rlq|#cyK=5OTSz^KayDArojy()=Zt8el6mYOK^vTk(&w>>4zYnNH#v`f-Cd4p+GZoYjGDx9DZ)E}2l)qb zU{Va2CLI5n&z155#*CyVPJLFKj_b8>Sj)QOF{k#sz2ErtTHa&K7rEH~UV3}}y8X^$ zUazj>m0QO7q5;!|L(hzduV}58itH{BZ93lMhp!bLx;y7sZ1V0-_(qP?;V*Vq{`RE` zY?LP+UiOsR?tkpCS)JJlH$eiVKVpY@>(3lL{~-S3%H`P3uV;S5e~q8s-TN(LoMg7| zME(OK{!LJ~{#pCr(#lzm#Q5jXLv3F#{kX&t%$u6F-*~2a`R9!*H`yOTw_XNb z{&n|R*4&4b*~eEdZ#*2@dG{dD8(q4$@q}~fLtrs(J7mF~dFAqYo7vy>Z~mij&LV1vyu2XNoLxr z@eL>Db$r#tH6#>K!575G<%dUN2*Ptno&*VAKfXncymGeD4F;e@hhRNv0zIG@lPb83 zuQLaD+bJk@0+yeZW<-c}GfQ7!YE)3=(KIOvW%)1jDhaPLNyE?~I1_($p%w=~Y83!i zJD@a9lQe=v$q>Lamp^L3QDnvFvN$6s%Kqs6STt3FqQ%w8%<$z^F$aSmvAB9I@O~6P z4N#y^rPKf}BR~kCDUqokH7JtK7PcPU>*ErJIcW$KaL@-5LMF;HaXgeB1W>|pO@sJB zGgAoe3Y6KY`&_L>F(?R%9BB09pJLV|0GNd?Vxgti&S8Cz^lM~`m<~&Uk)C_*X($p+ zh{8bNDZ;lvMOT_O5>f&v-)Ai(+W+}7K$=8Br-7=&R7p07L17hd0hVw;A`TFBg@mz? z7taf?nwRgpvphX`g=&yK9umGDcq2GXgCWd4Ox;|>%WOedI#rntVkw|hC=I^*Ws}a`d$&zy-X*;wf_FX>aGAzN<+a8KeoJz!}L>p)HUbjg_Q>QVi;P5{Skt zf3&2GjZjhGYck7Wj{hr{(rWit%&@~%%C{Vc4j)La{q^$5Yde1WqEq@c z9gS5#DxVH8C#kCJYN_Z7C~XbHBS0aP!dX$k@Da_$&JvbZHWN0e3eY5j09=rk3<*+h z&-$W7k~y3SyFpc2rO6>_jwLTAj6}ZcANet2`*SDnU#tU*qQZuW_cg>7+(8_v-DOjHa?l)_SzdyZFoq=}-b=n7DrsD>rkv_w0d zI7t64OjU2E^1Zp)=NJP|1DygF^E!MoMo z_Ud$lmD}euQq$dZXx;6J%+z<(U!ME=&otfOA5A7@9vz?m! zc;*Gn;pxezoDNZsPcoi+TOTjp#tvXT=Wn2R2^4gJM6O!VK3y?^a)Qh4;ic!FJl}Yp zZ1}XY@p{?n)hc58$6?mbgVSqP)8FSmIeU9K|NOKeHobnM@7E31-+R-4o=?=`HNwEyg7*Hp-U$&l~+kNYZRZpmjz%U`Bj&2KB;Q@XL&B#*D<~ zjO3>*DXv+JxR0pytenfN^8Fe4fLVpnEX9~vY|5xR1AUjagBiX?mwnIwGBAGXYx2V2P?4|c3tz(kUo*4MW=}sK8U1Yf z=`$hkv-#zAe88M##%C+DIfLNOHsXF3TyrLQb9Q^ahOMHyn|VGk25gv|)+_XOJIpe4gAo@6GkaCvV<&bl$V* zuy+v>>-NRV`itL}`QT0epr>C#TEB#41o&^xBk=$O5?4GU0kGuHn*~NY1YYnAj0q2n zy&M>q5%^zG;Kka&_@{vhuLCcA3cUP1@XB5wMIeYO8+37R4tFRh$ss7&GbklIDD`qs zT1L=SYd(%nb`u*aUID4ti5cK4e7E zBtiYX4GV5d&FMwu86@pEsH+Ivk5cD(q?3n|D@RdzBGfi|>-&f$y)MPlbWke|+hdKy zxXWTfLWU8HVKrnMUwSUdx=$-O`~+qL4E&j``@H}C!8K}tRA_PpWk)ydPs2(VFKG9k z%9(Y)`a!&iqn^eQ`ra)Y`Yf6vy$T}jigqejKA0h2i>t)0h4K5+JI&7OpO8~v)5b9+ z=>~Z`CV4$4iWN~dq8GLKgRy8fgdqYrEKLYa)!g?06=d~Y9=XVSisP6TnXNe!&{e)( zcT6b4r|-uj1950e99jkazSVKH*X2}DP)69VvM_QK5Nodat|UyBLaUBYP+EX`cfNJj zE=}=(A9&S18tcG+6^k4GEROsB7`=oVlc~Rd9itkK8M@p0DH68*t^NL4siE*V^&%}c zO&L$!?@CjqP$ku{5{9+Kl%Eedn|FDcM`=P1cabW`lBQipH>#cp4BS0uY~)*{f&|h1 zyLXqyktO^z_4`_}Z$t4yvfMTl{)xcvdsSATQCt6j_^Mfqf1S4fbX5C&evfJG8z<5b zBtQ`h64F88En4+pG3>W?-&UQ^@y$7c$fq~OQQB!c#^R3Nzmr$Ax8Fb+Ijg?G^|{zs zPU8m4?T4Wk$OTZi;?%IWXcmIXa<^U_tO9wDAC+Y|W7}yQJ|dK=Pt!_UQ>0Xh#es&U zUK21iT5`%!=<6DPRVFC$nV~;fPzH{wL#B!wZNeEeH_vfZdsJ`{*lgH4OqZBM$?1`=QlngU*agFw^#cig_+sU14EXin3qxVX{4 zx5%PC{P7n+?<5;RGHh`r)bY<$fYY15-5N;M!OP-MRE}!_mruBF2_>6GK{2W&&|7ES z6&)QF@q(ZNK$B3*i!^cae=ExyXpar5=2NpxlqkwKS5YHQ4g`X!*FlwR080cH3n)T# zFu}d3aEx-E$(;ZoMLzbBD@X)@mBcG?AZ%e(z9&ss)v+e%=d3yK4}IbzXPC)+@*Y62 za49nnV`7dmLY4BMl;s0}1|fwW0XaoVj>mt@UZlKn97K&Gd=|mtTpu}uQMLrM#C(4LQ(_n$5X8U2W}i9qweV@`lmHIk*`xO0*aqtqO(wm@NAjAxP96e zI`*wU-z`fojwnwTgcQt^Qm+AKead}`coR~v_}m}~p$KiGiN1HXj@n{Gf%ZzEmtV@V zNuLt0#QWyKX-YHs>TknUh?Od$9o|W?=F;)=v&~968>*z(Zn?E|VDTnOou<%kT+;sv z#M7sGAU|8`Gu4wvc}ft(?3+kTQZH{8Y@ei&IX1!=PUM%s)fW=ili6^TMZF&#Emq-l z{Lso&Sr-~{G6It#8PYDFDsyp5K21J7t;8C0Hc}+rBuA76SohWo16o&AMUEL{&2{sO zbOM&4+^b9{af7(7Jd~lbSc;!~^G|1_-4>9pP+)#piq*y`RY37 zdA|2|{jOsMfG$haU~qNrbOP8w6Uhg4e9|CMtfSj0o%wMGb(AjbjP_IxAh9|@>drhp zXn2cHEKQUP#hb){MIVjx?)i^@DksVL;4&#s&}ORnuHf+z{7C`DIHBBo@@n<(_zX}d z+yuqKEXTw>b$|vJmKdV+GrH1g+ccnPdJlANY6@^tyRlP4Wq8E6tWuC-mvmS(ja z>5YCTaH!JSv4&w@@-GOh^H><2n;xx!(jN~tSP%{sWeR%aM09!Lpn~LcS|?7ZpE7UW z|NgQ(KTumMf_WX@sOA9nxP`{PjFQ%{HYf(<(e!R!0gTWxuO_achu162JD>11g+%B+ zZ=~}AU2^S+*&jw|dADH4yft*~bm!LB>v|iP_V2UQ7l&Z6yFr`~qI`lbt@2`CIfL*V zvE_4>NTkvHuEGN!>M{j`P{2k6oXe1uDG-H9zNje(y0+^{3&0y-NkF5O36!NBfq{Oa_(E# z!#z--7M@fS{s4AnCd`w2;W*NgQqDntgOEYq$F#68xn+LvCNzw&W5duGCb;{Kiqt|< zl0=!%g?17bjtwMY%5T&r%xl^!B`UWwIC*wV>i44x!0+3GF}hjB$9UPvE`1bk1HwQi zxjbvE*OC&gM0SoNfhG!68(fs_!DBuMIh?mPuv&g<^oy`&PA&9EnjrA@_UpTyD+onk z=!`<_^2b@=ABmxuV63fpRE)?2l*f#1=?P$8t0)Z# zsFme=_mRW!9WS@ofYra;@1qMMa(~GI3_B_{nsghD!@|FtUK_ov1KsY-$&pSdCldn_hjDUF=!L_;kV>eqale^87&-g4tm5aW@iKQ7>J@WS^Y;#k%R> z^u<1ltm-x_1`ptdYmFzBSrA2!`%qL&G^kFd1dxx6viaMN)ijN~24ENuQlbrqTc5UA z*jXlOMGL>=^7BF#vJ#a{u=e_>V^?pkK{xanXSZhv0#e;4NPTneo}S+vcyA@D?Nk;# z>}rS}=e!&Texe(7QGv*CM#znvd)$>GA`&4t=Z0T5B`cCnuWcDnloTi`X4uT{d1Q^A zm2&=XLL#?Cm4xM@2oKzeKc?uEk&ZJ}2PPKZ=3DwC|7#wUfw@{TO>+_l`+#Hmm$JVO z(?W;uRwH@Z->cSxuNPo=0i<>7Cv~Fdr~nDELE)+ zsr%Q3IZ|+bhTM1}fAy8N0G{-Ep)slbq3*KxLGecprK+%cj?OLi$_QHe${bym%J1W(Rjg{V?VHYjxE=Ri=H zq$geq45Tx704&o&&IsKEXa;fb}@%#8n z&j2E|cz!&!vgc;JJ}6Pc1aMXpq7;}CgZHRN)bL9Ied@Xrn4RQxvy;i|ffXv}9`0cB zk&cUCzyS|Y;b=nE>Yzm2F}^B*m)`?94hUKbijtU_5fY--J{%#w6s3V7l24D{m|CQl zd)RbGPp^u2s&a~g>fZGtdND6mLB&o%v$a(7sZYur=2}=W&b-L|hFtpk>!G{Tcc(0q z=Y959<&NHX)qzekzg|r3z4_-&scxg3N9XmC-9lB?Yy^LqYWlQZW0L6~1)Zwltt|N{ zTp2a2R4?RX=6}KhMtNJx&x`KL?HV%;N|CS;2Z2vL!WA62JL&VTo7|DjvLksX?R6}# zgn3<0^0LpF$SiT`X|^;ka>mD;vd5Pj?H(NgnRtyJE0rEAfpS-bpUtP|YArpJJ;YO1 zO87iCYaJ!q?6(-IA6~0R{>^Fom}!xWQ>IqsPnZCI+^b`jOmf&&BJWH4j4?%JpNNTl z_rivcXem1x+;d8Kjeb4(*Vxk8+VW&T&&CVcy@sjgLYiyiWmA3>}gzpp&=%vPD%<~^@HWir=&a@4$jx=&A7+HU1AT8dje z(o0!fCHWH3N8n2X_KUaKmq^io0NH>w4`v`L8A{{4O)ZqUJ@?|Yhn)ZY`ysU|p{@5r z58Mx6DTF*#IU7X`JD^fDTq>9W7lL>3`@Is$P_a*<^1?wOGIjHPK)^-i^9B#jo2f=; zXPREkJfQGWr>Gck@5#J9{rkOp^kvn!lm~GkU*lMBqaEj+LzL|m;I?LS=bFFTySV=M zTJ_TCgMXMJA}7;z<$?3;gDZQg6s`)2fErc2f-0*mb7sU;dzB$}xuX(bVi;F>MM z7S3uZ?iEP^6)B!-spjz1n1z%8wd9nFG=-$AMHN7K(ADe(izKzQ%L~`~D^giONuSg* zvWJo~)HGiaESxEdKqZ|k*j=!pz@~dVm73n>`+N} z3C{8irfXE@8K~!9T+GmbYbLAb-%lnaRp!tHw~SbrxWFr4)b5T3TOAFGX|a@9RxjSH zEZ$RRa8)q`G)ly)N@O)kRjNw0G|CLB%GMSYcLyk^-jfZ(vHJ?JNMnkG+HR{rtzNuZ8Gx|mRK?p0_suk$rQkpu9_wl@m&B6p?2;_(Qi`r_yR6xsQr(`R*^yV> zQKb3ke)XeT&Bv|PkDqFGI(*NCGOOt_z;!F&dd!x4Jj0&LEvh5P+J*JTg!R?d z^j!|?PG9c5hB*ZLY$`}Hy>ydZnV)m>{LuXeFW>)ZYCf^S!AP7F360cD^@7R8d; zAt)fia_D`w0RfTguHGX_QaBj_{Zrwq9!=-M+ zQ+qR@ZZll_x0JRTnI*H@rHo|_XO|tg=*Xjl7pl?TZmrvXs=f1~Zs)c3?r7caC+)qr z=b#)s9J>-Aj)%Dt_5^f5iF#0O6;uUa9>B!9vZfnF$(5yqWXW7NS1YGVMs!R4`*$j~ zp8JXpGPNF=sl$_B&r__!`=Fk;PKU3pp6|Sl;g&hK4xly#$~ym(Dv;~d(#b{UzJD|x zM?ned3Q05w$>|EKavFrSbwvytM2s<)iN7ZoeqFOkxM2? zFde**KA>y^sK0E)4IS7&wuWe|ufzKs@o>!!!` ztxiR&i2z_dh((#Jd$8m^m}tM_HD~aUYqM?fx~d2suEcyD6tITFL#Fz6L(R4#c$g?b z;G3f6dn#rDl-;3%xN1$sXbbJ=6CxK>ZPri7=^ry}aT;nob`Fn0v#@HA0+D6d^_eI^ zJ$j_&)XiUZr{0IDI3K;z;`XvhV2*v(e8%jzzU)+&Y&j_1Lr^YmIWv9Gb0`W^51u@I zLH;^5q9$84@`9&C%>L?VDD9wcmGjXL&E7|1a1UB)#I9K`R}kU=XuVl(hagwZAz)DJ z2P|5HGGm-1qA_831%8@5o+d52Uvr;9@XHv-rghu__#PU6Y9J=;v%Yp>hW{xbAaqk^ zyo;Lx1T7gvss7f#6T^+7g~&nDN$a6rfVXCBm|~3mD|K`Bao^KzVZT~qGUrqOB}?IL z$EOK_(y@ei!}zvXT(QB)x=kC8G_q4$eCDQI+q#b)-fh~@?{hTl*{uJsX4$PSnJFfB zPgihi>lMTH#M5iR4_Xr>_Di}j$zL}Uk6gGcqWD|a0O1$snP}*5({nB!pq`5fys~*Q z(dgQM!TFcJ<-;hU((tghEjK6N?2y07mG&EV4#s5;ox77A@!)slwMO6H9HZ>w=HMpk z`MOqVqT!7XvDt?X#{4#TH=&2X{K*+w&*X5W(%T}In%+DM5O#(uIJCAPA^*8%?@^ zsEC5*=6miwd+hzYr;c&%i#zW52Qu>Fv!1o)TyxFY?CcICxZ~kw{voD6@@9NO4O>O4 z*xc>}JTPsEE%r=stcts%aJyU$!q#!B`WvIIf1%ohXcH+JdcMr==kIv{FSiD`; zG@ufT6NvH5xN8OS~LDIYl zl0&U@h3SDKV1dp?Z6l(c*w;iZyDm}0ak${9~c(m0Ah1ger?+uELG6hJz z-}%|vI-~*c0J4_a3wzRDgaG6nE-t3*6K z&k7q#?n5)6Nle||Q-z`TZ~cz6bb7MY)0cdq+%I@%D|GYLK=#vHAg;(1&O;By3lY^V zGCB>-R8{v*b#xg9caQ%NGYJ&;>+M@^H`8$3;G}LGsYs-?%_l4MyB79x{bZW}yMx^Lyr&FW-Sq!93Pzv08w~;Oaj*WnF zA-TZzPz;Q-VuC=Ud?^Nvw}!LM-j_2#sPiZVqEDx-n0I)4HVI+CA``hFv?lq8vti)j z#rqtg;(({!Gj=hoqpMma|3$y;;B~<6X>_O*We~vH%&98$JYv~gf&3Ec%8Hv68j*`N{ge-b~ z7@s4pCvlo0EuBj|LwOE=3oM$(={$7Tdh}qV;xe99V!!3NqYqoYZq(bA_7aO*Ff&~X{XW$S@SMeggsBPF7loQ zIo1B=ure`!pJ|YX-cxwzGgT^Y>J?UdMhikp)HgesDilkE)C~znv-?-zBJ1?OPP`0f z;CG@vF~q%6kbOI(%B9KqRm1Hf9Wwgx>GINhvyPMBufO^_&_z%6T?dzl4h zK3kl;z?1HPG4I3-F3i`=UE~d0GHX0Xj|AzLte0*_oa0fg=!YSZL{P?)`P{Xtm%NP; zQq3nIWw`>ao!w_V4bGIr_tlNxZi<3eQdW&>2nj=n_&hU2xeEbQ$=z_c-Q&&s>dk@r zl~l*xVb&nKk9P9is=TZSi@QaE$El4&CB-||QTsbCpdM~&LESf*H#{tJNrK0BCLj?q zq{fImowfTWOcI}mmRGp6M^29vyG3(&kmLEld%*`wBmHQF9A1t0{_ovFj}_sw8BeGI z9WF7d)@|N~GUKDH768C(WQP5|`La;k=KvoyzW9}@u6jHF9d#>k`>osdXF_U^#F-eu zc0wpf)8(cwll&t*lCG9o-XOTwHr)|lhF4ubaZU}{o>n9yNEbg)m*p1Oq z9m+~u<40hPF6gSp-4E1|-C#D1XKQ3mBDNL}vy-FV=xE&gm3`?9T}ecE&=QY{&*eCy zt9Ki=^x*H?G3RPO--8M+Jx?+lR2EB(bBVND{IiZZx9^b@6{$^(Y?q}Qs||{$`rPW* z^=XQ}bTy3uhf8o-qUZ~1-a2@?oQ!E;v;DFYUTD0uuH48>H;NO&^%aRRd6jXZV7~js zrRqE9bXyx6GT2)*cz9A?+*_rkxmQLSgO<|qR%#t@)XV99EtWr zthv+-N^mVd``m-bR6r`!Is`!5tydz$lK}qsr-FM6i1U0)V5=ZY5Mv6Fgp&s;UQ2?E zMNYh*6mq0Lfw=`NOc;qSG3GQx^59dha#uiUp*G_hspE7*>pdQs%XW142VK@%&1pBrEUfIb}}W4w{|*N2=>HcWN{ z=iXZX=;7@7lIb4Ax@YlQB4BQELcS~S~9n{NbBth>%5)j}XuKcXc&TNGRQl?m9Co}|+eTWM(;1RRXfvk>q z4$@)VqqZDhbB3)P&lGaMbiVO5Z|>cy!dF|i$h|fG3;4L53tt9f7q2ECzPo*q$~{5i z_(n$EbkY#uc@-0F^@#hulh#F^*Qp0r)0N=BP%xP(hNvlg?!B{N7|&!8$M*`In=aQ2 zd8R6Fe6KQp?_%1kJef|^6xzq4&`1hcuJ~JB!23H?8!FFi-{l5rhb0h`J)R|CNJC&{ z0&)9d*W6f=LUYm0yUv#R^E1=FtsUp@y5Bl_`wHtn&bLZXsijUrJ zCHb}HOU9@M69;|&NHzX^?;b|wT>x<&Qc%_&5xl`s7xOeua9JaCjQXe3QVs`BTYKKO z;aldOIUH2_;F%o8w}RvRIizFl6*uEwiQqVRVgA7@yO(eENwndpv$c0Vgcnfg`8gKw z!Ml+9PVvvGH;gFgTr6;6L&x;j>s+^QHvD{>SF?XjR$AYywh6h5pZPW2@!?*5*okdh z&ZF63Yv1O=6Q7+;kLKq-__p<)*zwFhdbeTi*Y%NlVmDys=)=zse!X8$Y>_yR7f?3- zPX+kD#F-v1aZ9iCUgY0T%|2eaH|alO!~ZpR=6F@#M+lM^TitSwjF}^y@{m6P*y$hX{)Y0MrCX!06{O6T*>z+!0rD5u@Ee zB8{<74520q0$`1xT1MN@9X&F^JcG6#q3@)sE$jmC1%<3I z`YxM)!i|tIDabSRsTBHi?F92kGB{iU+A9R5ggea>;ISP?K30P1AuPA>os(M~iq zW$dc`>tyIShT-{+o-2UN!y>W>=t3E&84+QRhi4ICu>^<)1?XIWRT1g4$j}=T^fxGs zR|!ZD4~8xx+@6T2AcNi*v7AcX?h!%}$#hKstLdJeJqDSDr3)rNGom1=M7S3gLB!H= zVWHLl(g_cGL@*C0I{5_{LLLdo-DZu}~H~JQV99he0MV zKa7RT(`55L6oeO+w>J_&T%i4FCl>%&fQ5E@!UtubA^@KT=7a!?V3Z{E&nsAL84XC& z#}1;1MA(gnA$7vZFU+W5BE9ki$c+FqZbao_>EL+tJS?NK=R4+a)RF1PN~4D zANr|Q0P+Tzt_qKO2q4oaf+Q?j^_r;=fk{gaF1Dbji$~oepzJ7OT@>U)f)N^v%zz>N z@d%y<f;7g%G8}*&Aq@fn{tzo%PKM*ItKwdN>{$`KLk8=w0Mo4UVy{7t z1d(h9csE}9yDZ$pL#`GJ`yhuXz=HP#AsBq#+va*bK|5sg)W{58;J(_ z5W&HbB35`5{0rEJ47wpx-3g~-z@w~)?89SJiUzQg(!s#|q2_452b9 zGkG|%l*7W_z&!*Hq_ACiV|-;MV8G7PpR4R+ZKzZx5Q zkE4G~8lD>e^2gW+k!eK#co+Qr(?QJ!N9I-DsjC9)*G`&TJC%7&eCnF?)T_PpRZ2C; zjSRiOZmeNqtd(i3H)U){8=6f_OfyX^r%Y_vZ`?AuaXa(Iov9n{?55r(rhb{GL767* z1pEG~Py5w9!Bb|*?B?kv=GmF%`BUbF>=woB=Cx!fb#vs@FP|ZybTd6XHf_|hm)+{A ziPiH=tC1GH6Rh=DC9Uumn==xwO;$4gI$4Fz4*w&2(pN=KAN%-jsvdIS>C!| z@Mns^bR*785S)XarQ@&_;II>j6&B0*#HU~<&2cO7d9|qTCkcgH7dh<59qqUeW>gjI z4LKZ`9B=7N&*&>S*l;+S+dGK2CfZFqx*uG0Y`t}d<95*WZSPz5&IbyiSx)ykWPEPS zT1`7;XE~dIopD-nTHzWY70%VuE&_IrKP49xzPWTw-@z?8^Jd-Y&2k-?#&*Z&HJoyJ zKJEH8%e6Uc_J+30`z*I73a)xtceif1XCJs(X5FDy`np4YIK0YoSa!IpWK3f@ZZ95e zI$rh^m~o7_aYtC&88_o~Qo+g3*GW3tTej6bsMbrx)Mw+ncYvgi7Uw-?G4J%O+t+9A zkzDRYeD<-)_I0lG@w@AL$JCE~!}oOUkb<9I#EkEK;w^JOmnhDFi*X*#9G=Bu0fnZ~ zz9%#672S(w0-K!z{8|I*vxCC41MhRXJoa_#$`1B+3OF?rI@lIG;};RAXu0g`2Feau z^Yi7J*<1j7ZkUFRKM(z)?N;p<1~I$$jNYg|nOLMLSM>em3lz@TP{n9> zGe7S|hFW+a#Ojnsp zzsQ}T!JY9kBSUX4!>~g}(>$}8DbsQ;(?&_n)I6)2DeKN$mb*Ffwt03jQ+Ci?b{Ka~ zgn3R(Zq7aL?Bsx-A1=|%By;oUatpchip}$=<+*v)b9wdL`OW6}ZMpefbNRj81!1t< z=eY$Va|Pqv58jwRn8|(cw&Qa=_rqoLhwsN9Y|TB~?a*5@FZ_{PIL=f^7QcDpN1)|uo@8$DIMR}1CkE+8%HSs7k(a8r! z=R}Y=sjS3^?)KNi%g+}x&r`YZsE^m+YIxKuA(u%Jb!2&p&+h@Tc}%y6 zh}YL!Tkk50C|uR_7nt#jHn|ziBM2!crZ^IS05SaiiKG(plc|K-3JNO=#bW6v^V=(p(F0g02Z?VG1F=_bsrP9KBfz)- zkkpFUL;T}ASGhm#({}>M*|)48uYuaHA}R>xO=yw!JQ{Pa_ulJ|m-D5= znh}=)Lbs>XO{{o0?QofZ@FGAj11#oPaYr(eg~Dok25LcQKv7ES0c0ycFGT>$bZdOE zfV*PBx`dN$6siy((s5xJ#qw1A^_kpD2o^HDNgW=We}RNWa*;vu9_9~;AS52*Oeryp zR*+hNZj$)7Nql029`548GdJH9kJW}z;8+6kfECU{EHA}EjrKsleyI?N?b4p`(B^Sx zES8&sxB=*|?uk+jVPxXulT>(28IT1aeQ3wa%&OFJ4sWvH*{jIVbR93+4DfhK@#a+! zJj%(c@$4mWAu%!|P2;-S$6rSVI_ZUaoZgIwyfLjPD`l2Sq`=^xSk}Ch*SyYO5){rP zgWK_N_|+;Hk=~08n{S*hm4oWyXS;}~1|m8juRXn!y;m0c=Y7dcda2{%Rx!f0S5d=#7E_yEB|0PZVnqE>_|J0tI2bX)guHd*A`| z7xlCY(keaurTcon3eJGU;3Oi-H&u331=>mCYqw<_AgofILr=vV>l_~`7J7>;y+2D@ zcrT3|Y7K=_JYkm!63k&j1YqH(#{wvxo|OVmBS71U?A1NsP1!9C@)sEEmqJZE#JX>7 zKSEPrX`^{%h95cqN3TL==h7Xo77xZew)cL8KfZTqJNNfO$o3M$RH;{!Q2^361AlbwO z3jokk@ugUZ6>-w&H4&zbG;=*3x+)kM&MZY01MnCyU5Xek$zH$jDmaBt&MFeW1kuhC z6AahSux(5nPDQ9s=ERf5n6dho=?*Q5!hvv`k-YQw6>8@nyT0uVp;xSX*Wt4@|Kz@6 z{f8&PN56h|`H>g;BI%jrxd;QvNF0>q+h2lK37ops>7Q4f*|4T!k;DlZ@02t_jf$Zf z!N}}Ufjj;RU`-tu(>a^%no%(Pj;IZhuhI%O7(3ccGLmH&7}>7UPm945zqZ8FA<&k+ zN$0x`KELYU9(JppO8%CYxC%h{M3sid$2LVuR8^%3k8e z8LLHt*xSkd?%$)ZQFIv~LJGZptZ|{a?Hs}^^)i2)eVVS+uzkA01(bs&RPB&pZqLmY z4!LDwV(wt3AOd9Hj6Y3;*eHmUWy6A%rt@yP&6Q?nDj5+W&I$^S+2J7@T!r=z&KhNe zGwM1OMf1lyJ&Lc&%nTug-lM?4YJq^yl!>x)4#G8%2$)fmxaqC*=r+4q(AJcPxa`1sSyX)7^h>ZM?anPsK-;ri)haQ7DN3nWSC8Y=OB;!sONM3FnzOUg30<`!y<(V zUN6MzN4-X*dePpaa^w2mFBLu}c#kRXj(U$@prU;y)S0gMyt*uq=<`}v`lZhsgNqFJ zCa)P@xi@tq|7;4x!u{pF8S5|x-&wolE537%g^9lNF7+>c-@5fO_`UNQzvB1a_haIZ z`7n+uVUVI3$bTW6$-sXxS|G`PDPDTae>v$QW57z9p+Uf>ESsc&)japHfVGE;*8Siq z?o9xU5;9WXtg0Uiq;A#qG6roojT;1gZvB`Pw9~me7PQ+#WencyXEF@_GAIys!~kdW zBxP}&G#X%F(8Q}jr)`o$4(8p*Lwk-aYLxxGm_Mu%oBKWq+ zh!ffX-S&8Zkr;7(S4o^krFk5~(l&qQ@S>q#oZNh2s-WTVb4pW+j{vCmaEJ(GjCPl6XkpNmetN{*B$!7;@RX^QRNCrvKG zhT4a;b-mIuYD$C!kV8sx&MDd3C8sW;UKrKMf|Z?C(&_fJuU2_w*0`36pUlxwE8EX( zsVS9ocOEuVW=U(`E|m^Ljb0tRn*Ni;FxQcL)LzUxcXW~fpx~W1SyOfvR58+- zu$I%^U8dNJ8Z%{C$lY3UJU1RU=3|{!0KYFHH-#Gae{nr|j%`_GEp9w`(>wZm$@2Lh zs0kvSe8lezJu}AmiAXVdiSg6@aDKX1vARBw*lH^-NyooRaPcYT`&^-Qk?wU$yibXc zWTlQFHU4!*l~1X}-3{&cDS%=mp-A3D)Vf4zqF~dfoK9jr&Ev%zGM!2J1rrvdnE1(( zvE~XL<*I9ibW`qf>^c?Oj>h%zQ_cq8wGCcYnfAJj)bdnT6C|t6)s)6;KRD#upRcz3 zD5m3EHd5eGTYYo6>W0&NX|3PqYMb|>(}G{V*GEdaGC-<1TK~LhNVr>r{OARHtezYnw2w+|-HvmfTvG7sbic9_RHFBOJAA6sKeg7k zck2dqr;fdAL9+f@ZT0L_p5GJ0OOk%ZBOeYgn{)>W*9Y&?8~vJgi241rKFqJmrgQc* zX!*FF1Pgr1x7h%N$5N<_Xxo732|D=f+tWp+;TtCPp?o_HF&EKGnEU<%LQ;)!hNFv{ z?}4z1_d;NF3UPece^9=zG0{C?nQzPgx$2H*B6q@5j;Ehgec~w$DKRTT;sL|@ZcXWh z=ue`00WWlVKoF#dxclSl()X4uvRXLG&&5fOdeiadj-Xr5gekqet>B&iUVl}#H}|D& zmUqFT)os=LxnlvVUmyN{C#*vKdB=rDnm)PVgfGsW@OJ$6fc@?|e#`uIy!Dw!ydfJ} zD%8&L{4)8XCytBNae@xQDD6w#-HXr(5bCQ!EmIE;c)we&BPWqB?CwQ4}xBdA=#{HE0!7D=29m9r6`x({2pCsHn zMuh8Db4G$!t_nJE)TUNWBGrf!l4fjK~?WMcs#*+?OszW}zx_7;C_lQ6Yh3xp$cfH?D z`q8}=vKzch<4ze5DfFRxk<#6ZOv#4>;-Oy>+`E?rn0^lF_3VH^f3sVM01^VgRlorx z1NzHu9r5qlt#j}a{%*IyN9Z{@HF_ueIhM?AAS&|G{p3q^pZ*7S>*Rm6Td%lYZT*sFw?0EN$$NOEtM&8ScJHkZFT2`yKT;y-1q`~|zbp@> zi`$HKcYIx&DAp@9c+&ZOYqt5$$FV0}KXwkAQ>%c6^sY&V=1qqrO^7Nhxmk+}eW zG)>whDEJ8~a+2!7`f@TJetIQElf!u>Ra>NT zB~4#pVhR<_t-B``{7(BgJ z;4|&K_P~F&a_wR8!Nyu45iYh)j^uDzFNzhZT7Q(VqXU3oYRV!YW;D%$7b=6VEU~pV z!Xt5545$Kz#X15wp}tEPbmYV!haQwl1j=tpVTtsbHJAvny#Cc^pv?H6l@LAP6}W;8 zjjzt8H)HN+y&37D0gQytZL(dCq)>8eFEmEAzPoVrxz({%S)+9&tpkAJREgmLr>d@F zwK@QTGT|gJH8~kH1w9>Zz|sx57H;`D`+X9xRO>?4Fdp>>Jc{qMWdSxBWD<;E72qJ$ z1{jCmBQgn{lU1iXYlQ)oAZ+4X=u{^?@JNYn!T|V0*s#=dY=rVw4m}hv2~tO-i131O z@7F_4cXx>7PfAJNOFS~T`+dsncJ23RE5Fa*X9zKp2ebCscMs;A%4-kiUE4k%y!Ci4 z`Qx3>%-tXF{nu)LdQF@hW<5|fL18>mq8-`SuVldU48Sv5hPSV;ARAN9!tQh&>CQ0tWfNzytIc%0>=nB-y33D%yioSsqU1?gy?; zk~c9|5gA}+Vvf)%LA9sIYZbb*=`w}(#BugTc%)*WIusbE=!7P;ep9@x zQZW*^#IbWNNTh4M=e|fgb>GDim~|w%p+FNy4n0+J3$&B38oKI!D;6xke&%pu0HBpG z3}}ef!6Q}4WH1=)|K%A6%t^wrs>&L#R*fte9t68KFax~2t_wa>#_p8ClK*<4i2QS* zoT@uqN>JQ6Tu#yAKZ$WuIDb3eJ?qdB|F<540wm07Jw_b#1^BDSu>RYnBd7sz{6nP2 z|MnPyJ&5n$?J=~{!A6TN#R_FPE&Z2!OcILtU+Xbtm5xrlt`ihmkC`LJ+#NJ8FYru@ zEiX8^lUp7OmB9cYcPR=0fnt7%#L{lw)RAmZ3;<4+lDQq5D23N#XH<20hQUNO5M$~2 zjQTlcYRHkC7bsXYBwF(sunxk#+v`Wlp=A*z!f+mS(1ml%>QGR(4n7VYiGeUb?sv9p z(rW>26`mB~jo^GE74M4F^S=s$Or}+BGrqJ|wtK{=N{iO8wSQX;Q5$Li)8p9gNR>fp zAry2f!Stt!hzfvY>q7KV5#ii<`u0FtJ-v2H`?Yi)u)1G&TY) z=86gD<)hs!fb@G{oU{D%eh(sKTaUS0jbBzo0 zx0lWI&rLz#-+tMDh1DP!|FJ2QTmt`ZQ}}nLC)&&ID}vHqwp|Q9PKTZNKRZ2@#k~WG zRneLP{J+r@N-{3b(pX<>-IOv(yS$WG8|%$VHK?YCUB#m$iwUsyY(^EnvWl8#Thqki zL8O-#@&Hvxzv8KmX{igWMk{agq}TU(t&6MCqb()sC2{#R(a>03Jnj2E0)VA3ceWc} zzsR$N(#zv1FvgNSGpR?2_m7SqJ!5$L5QRP)i6Ks& z2YLcFMPxDRTyg_48c2oU)CfA9%-$jsEh0&s-8kl|)(Hgw1YwtFqi5xHn>DDBFQkrYFY8MDs4E?=Het=Xox3*x=RZ>KdB*n56*b zc7Wk>bi1kN5NK6y1`H)OVfcua5>IdHj@|>ok|Y3`w?-Y;9uolxawOU#3vTK~$~B?f zeFV;;sh(Yu)uX2k!gMKMtgD(|Fxz#2&m&T(27pV*^fSRJ zV0`px0B02bOfaPhWv@oB&-P}(z_*>Ayq#*H`)-?`sD8Ezm7PgfCKIDGYRB_6XGp(H zE_-;?QTc1`L_(Q-xz0-$i?4aJqh$(h!!O+ezveHX%g;U68S~2fT5yqvl+Q>sz@YF3 z|2P@{BZU0-C*%KxkpCZqkS~Py<8U#q_*HnCFU=)19Jvw;V8eAzBYC+5F+y%!GFs)g zti@7zZ;h&nAmOppPM2!CYc3RcRoc8*m31hO%c)#CAD5igrd082@0yJbcmvPtVSHB- zYO@h;Y~)x0$#jv-9kdg})Uvy7RpN8A@*EppCCy2;)EVT(wykE(fjZy=maCDdy*`Yx9NirY2hkQS3b_T|HQ=`D z{MQ_;E02ZWy1m>&|U~74jOxdwAgWCBAhXq9uv-}g?%aGl=88aHkTh_ zo-r$<_cYLe=EPw(ln+B~__>>c`f5lV8G!7v`5Zeypk}ssCb~#M)W`gY z%Bx5tp>bfxRt|Xb?Y4zL2oi12;RAj49@7tz_Hd_cX8b%sDrsPB0{|&5T38uBW+K)h zQ8Q)GGe43hHp8#0!4!(P&+**`vtw;wSTgSNxjhmlfebyR-A8A!7tX{sbV_?MQi#0B zm>)3UiN;0q3-vK)@97Jm_dvR4cxiDqZ8U?-Qy#{FXu0kpM(-gFo}G!9^94ot*Me6; ztjdCHAt@S;`vjt@wmM629}!fd{p_?wW4u}SBaY^wXOe-9_f6Qev2@H}7#9u-M`~sR zltG22R6m6w5XOa~qBx(Lm?WF$-v8`59q^aPOO4SO59KBUbh!0m!TQybOeL=?xSW2p z2Sw#X1+D#=y*VjRDf}U70YL1P%=Y*I(3By7tVt0aF3~x6H!a;_DMRA6&WO3&MrIP< z^%-Q7-sPYB*%b7D_z}F05469I2mUteu>dqvae6=jtO))K#R$`8JtK8e_!e5YAghAwAX+dX8m4U|)(4s-dDpo-;j*i~ENlJrmnsp9GpXmui@({0K_=CT`!+n# z^Am)UZrHc>3yJxpK;$`o4A#XTUS-yU!HFE9;o}R_+w|` zbSRZ6xeGXmSbd&ullXxg7`r;Nn`9&NBzW%mhUH{fn8J?_yWjmRf;eF`y6ij3eu0#= z(MHx_k~^FWqtiV{2<5rt^cPe1-$yZ(CJ+`)@=BVnE>TEb|8g!S?W){Qp$wDDWFv^V zLV&Q^O_w-Krnz#ZQMP5Yvq+XhQm%cj4P!}JzU|=Y+xb4a&MW^mQ}(X}KuN|8myOaK zN7{^7;Jdj|PL3AatSHHH*{rN6o3{bzE0m2m>!PW`cn}hbsn)D}U&YEUvA(%gPl1bX zH{=+{@Ocv}h4?;cZ2E6AWsh_lf)3{G{6-Fv*LwaBri}Ve z1i%umuKk6lw86v47^Oc&O=+fXKR@N%Ht=K4^V|8kMvjsCwO*3#_G=@DnXIt+zEX-`hCjcJw*pV_i_Y!)L}k)*giP@w-H(i;ubn$D@Mxr8&lrzfNdL|Nb^<>i+xt z?CtvB2k-oLfB#sBk^XbIlI{NI=XyCUc4oV6_s`MZb7|`Fw;6Zp@58lv>Yw8uyELvA zO$HF!6fn;o5vflGa}H79%6lZ{qGX5{tdFkA@x}uk;}w0dN~8w@DAUnK-j!2-qEcrv zeIvtJl+}v7_9EFo)w$orykwx-LD@03A>j1~c5pl?hn<34oU^;>d)UhH`cmSVFKXIc zctyp!(lZHMCMT_;LD~5e_S4s0Nqb27bn*KG0Qn0=!P;R+1Zsm%HVVyh`XY4 zUnuI4W-Xc}x^LM~i&60MpwBfAL*)J%?hM-Vb;R$~GT3wT z5<1`uZdFr9`DBwpb_?r+HKAdZ6LRC(ztgY}I@a*}!_@I$v68|+R!IE!xN*|uXJkP> zQ8lIF2`+`nBINJenyhpa5jQd(u}aR_>KA8>xn__V9zF!;Gpw+URXZ6 z&-AFJxSJjJb2uWSWos50uKVNo#~L)$^_N)k4+lgI8skkzmpGdJaZ|NY=cE<-!1{_N z@64X^yd%R?KYfk#;F?Mk#g;L#K|%GAITq?_u_Ri{tgw6PNbj|rFomnD41x6SWnknb z2S#o$$>o1zTNTSRAN7;_n*B;Y<=g;{isN740+QrVq-`8SqBc6GYjjm!It~}aeV zEF>D7QQvS3ymKg8_V`KY)ku8g@9pSIZ$X|SvGv!_-XWp;F{8e|ZQPCzQ3f*a(vr?<)rpF_ zj#y&*>L?;lB#HM7EV0vBlqZUI)t}g_-m#o(s}&~Ri35@Sy7_f*?4_=#67gJAP&1XyQ0bX9Vt@2^pi8C2_3`d?|eqvwqOXe=N>1AroUk5DTAXWZf3=Bp^6BDLlUUiee{RRbrBBP!wa|!KyN5gWtJq6 zZUXItGi$Ti4B>b&cfQ@g%yP)GFMvoBh`2ojtTDv&OO$8D3GF3Ea5m}#JTpw53`92Ly1d=iOXC`EB;BV$Ruzda(*Z&d4d1|CGWQ< zeRE1UIG6mxEcviK`PXdn&%@+nWXd0|6sS@PJU4ky`|iC{AZ{5sZY+ugi-@IgWE!P% za0{klF?M*=say6=T&Z9j0(&}5NGVOkJWVtpO)NJ}qJyULr5$Ue%biZc%^|SP>4Ma_ z^g7>k)!g*+9qAXiGw@0o%H|mtoio(qGBg7+^m8+=bYvK8q_ga$vS5&eMgG$#QFcJ8 z)oIYppPAO&Sp=mlJM%32fGo${EHDn`I+tZznQGda%0jyd(aGj>&h|FX4h+Z+%FPb` znH|cVglx884^!UI;Lfnj5LTqsnG6;YJy zjku1`W%)t^XlB*S9sqTYd}WH8nF1`#0a_q3hgg9)C&0Djb7*pKvxEQk^o`H7E5Rq7Yl(DtDtzJ5*b~9c5TThR&tIGdXi8gn^&T% z%%ZVbV)*M3j#$E9^+;j9#4xZ_h6ix?QheQo*`%uY5?v{j2w1ulAw0`2DTC!wAaXJw zbFor~JesM`<@{GmPm>`s)V)UtELh5e7MxfV+sW*%3o=cC zGGf5AXz(i@fbIhLoJ^&^X(bc$Be(|$iK&z_Dlzo{q41!-%lG%v9|`vXC=A#P4->?K z=m6+>3|MhO@^0RFz^F!UfE#KAR$c(V)CE`ps1hw}ig2$ij~PY_i=zOSJc{8&sA39O z!vkO=y8gZe;B70a0s&?slqVjb@ri8s>X~^=djRNTAk=gLteB$pEnU|jRZaX90N_C% zT>ucKXc-laig%C6VSQdyhx7oR$JdNUoRCj}$O7y?Z5!Wwz4YCMg_L@UfmDa9#@KxW zPHnNAU(kZcCc>D(HyWBgU#()N+BS*nm5JZ4{d@|e>A{IwY*MjgHYQ^x{+iaN5A~Pf(e7)wuK(G5qaCgRoWvh+oOZpWAoeNyW0PgU_#!`M=G5q zmYromofY~26inEp($!+w)f&{*p5N8k)z$sBtLLbT!rR@i(mi0=Js8wIRLv=q-_2nW zHhR<@)ZD0Q8#0lv^lg)s-|~s$t^4zDpRC@hwhN>0vF<7$=0Eum)U%%7v)R?N{kCW4 zsArG2cRvV^6>6VT?mav@i{osE6MBADtL*>k1*=k^Rup(J1zA9$>!zUJQ5cUY7`{Fh z)jl?>K91l%u7WwO`1pUu5*mpZgUEBh9e<{@8dm6210Pe)-?2 zN1A$tlZMH~!Ds&klf%$l+70Bsi2n&p&Q?r$q@5lOm055Cl^PXasKGw2GNBzmf`1^3}!`B?B_ILHl`F&(R1lIlf!_B4vJVKWAmES=1%-hG$ zY_<%>3YPa*OA9p$4X!GG9|il+kGlQ-wf^}^mkM=s=Yf1c#JiE^gTNlUpzoR40_;qM zXZ-Jf+v3c+DAW7r>F1x%Q;1a1pv`rdF9+c=ROH`Mul%Q&oaM3%9-?|Mv^gf@>*i*4!yr{`i)=XRvQ^uz&Orgp zT@^44a%j9p-9YO%fbE$`*EM7ZUHNviEDreGGMTqx6H$N7=&qLjPUq*gg&j?Y_LZzV zJ00s~)pdr;bz3w{J}AEXcTB$9bA0gsGA6J6_F7-@^S3ufM>KQQtERQhmN%MX@BRns z74PnQ?|go2xxPpJQUI*|IjP$B{-$1eTBETT`wvTbsh=wu|ANUi`1-(Rw`rJM=^{YG z_xpYCq4s)L~FeotwbynU_iXs7$f&e1M~hROE^INguG44tY!-XB%m z{cmIPao(zfwPZ7xe`a7g@aI0t?b}T5Jo_dT@(K@^Fd{9_R>G8WDF9lA2;_Z&yUX;04x2pgBv>6b}T1~O~?Xf^5^=}9<-mm_uLm(aH`-X-FuSaz9lI74!ePUJI(wQ zPwZ_?B(N5KF}tME-thFTE3XeP9}dahdK+M9_#yq_zK2!t=Sl41dEoZbuL{SN+kER&_d>euO4*nUpQ_M2?{YP}YO+k^d!=@w*!3c1lS<{OD&r?ECb?Bp zHH>(425@H{z)v@&olOW^Niv^#G2NPVw$}MxwbdsvVr&2RWbc>N)}R#a@X^P28Id&v z2rqv-he9ncca0ruKIR!?mQYei%@W@P<%PvTQ|7&~o8w-lKCQLQsnFWnDxKXw(PxtH z9}BY;Y3n~tYEAQu6a+xCmu;wy2$Po2)snaJd7JnNt&d+i@H2UU0HXzP*h(qh%Nqoz zQOVC=Cc520;pyHHL1&0kUe_&0x&aw5O)HC}7?IY?#M&p>@lcitKmd(Lvd2<<%a2~D z(uAN8034j0Z)G{3{p14Bk0fHCpLI>!H(?D#68R$rL+ENdc8560biwFx(EUr&5&=OU z0lnxx=(JS0%IL!J3q1VfP+f4BrJ8Xn7hKeFia}JANPnD_6=o$3BVr)pDFBjyBq6O9 zz$YXCkcE$fFC_>96T(8za)Hn+M3^wPZ)j{l78c*2E@Wj3vI4-Y>SV}I!Q5w4QzVEF zo_008Kta4ZO6N{f(-@6vm&TG~N7h=z#nZS2$qYsB;Z9P9;?uH&6eFT`=DF}nT zaNgquq+xqM=h$Af%JCv5xqaZ2!IyZ;<0Y=~_Cdw5FG)ei%UGt4AuWUbwEW{0(ICT) z7p7xgM^l}jh9SO}>>0o2y**xiW-mDAH|Bj^xMMAAL~tU;;M*f!TJDu$=j-gTZ)GaK zH;j@4TbNFLud@8TX*S+D-8S~UF6j3bfvIcuxxqnG{_kxk!>;+6v4hsG-=95_yWXuC z{OEl9d&hsg>ke9b^aPK0)H5{lZ#x1yK!O9Hi9*0<{$(CvNAkrI{&5~bi=QKEH~ysu z`Mc8TWb|J<0-Z>lL6t4Twl5^eTqlqDI7CCMse9HI`8H9--*p?Ee2DoA$i@p~B5}UT9Y~qiz zY5yLN27bN~ls_r2{27l_HeC6PM<&WAt2^HObR+0hmN7mC=T%JA ziIz-G)r)QDGCbn8<7wlyfQqM0w{}m;@W|&I!Qb%6h&Oyz`99TloOs-5E0M{N-3av6 zh2Xn4j)fVYP_i2V96lsYMaXUhm3q?+f8LGYCp>b^jTw`)*yyz$a6;2x;Nra{x3PKi z{L8y+x8N6L!nS7bKZ1p2W-5N`!Rn2LeY3!dgCQ;Aj&0hIJ>$A3XudAhX0H}T{#Hs? z0QmhqSF8XTW61bKB4(Yau$0{hIz6#vA^V#q81W(1KvCSPQQuQXtKUDVY<~8BQZQij zVXEQtji6;)Y9g%tVQ8jm=yZlN0=}QR!X{V{_R%_NfeepWga~5HWp`=JW3jsSN({`w&(qn2>*kmxA48|I^V(Vzv0nfnR8b?yNMr5rap;V7x?N)t1NQ&{!z;tA9D(K z7oI+VYdP^&iND(NX~@b)a6YUgKv&gg?W(Sm)DNhaXP+S1v1n(l85@lNO~1_M;_0!QuK08^bi%j%FyjMHp@&2Ers4`kot&E9;Lb{QOW6%XO_9G z1J@Uvgd~9$vyNw`Sd5*7^f@cdhn;yzPQ{ukhf9_-US{&rinVu5C)vyJh(sQ)vuK%V z5-7>$f0WJtO2f>~;vD|R{4uvyhg_%h+{$RIfp_xIk9b7qR9j1z3GSdFQhG|t>7~VB zF6|CB7lNAN=1sClD7*&~lugK+=Bxt%1_$0Cj3rHt9BEld0a8dXGH@3|^ALg=%i87Q zIT#!#MqzZQhPWy_)QOZd%ZE7=Bb(U^n%cKvULKB<|HwK%h6sFm%bt1SBj*I6G~f+F zhEi7K91o1xWQ;E7#LD@fAO}K;*UHRNcDquS@j+4xn+vmoimtkHmft-LHv)VC9O*L5 zg2TbHLiWPGhmp3k<1-w(08J*KT*(Fx=#A|H?1T_85tsweFffuio+lg&n0R*BjYNi( z3pupjSE#@Z(E1pC62RR6IJCs#DXdFsT*wtp3!30y0hBDP!B96A50DVZXb=D)h;ib* z8Nd|curk%}P8Oh2%)#l^y1zj%Nwa5D0go2Q>=X|;apa&K&;rTx_y~CkwMcdUoJ<6h zvvo$ZPZmXLI0EF65T+8;I^R@a8Yzgnmlm-`^(Zh;!D*w}+g5RU_0H3dx1V^uZM$}^ zdUx~4?PpPM+a<)B$mhAh`1x9dRIMiJOA_hZGt%^$=!cHqy}$9cbNXD(fwv>yeR}`) zEFdS~pq(Tz^=TnytsquKBtb2o?jmIfxbvOv;=HH3Ddz4EbYE?6l(HY$Hh$xZz!9*v2#l7Drt|k{BOcjmKTmEi{nNgQ> z+UbG5_q#JbR>knV=m$pomMwGxULI=SfVh+KP87Jd{>W9)#FF-ROV6=0>I)t^Jv6)d z?tJ9=`r~g!4_AG7cY!0z;Y6=_WTF0EoV2!K&jahe9>$RrBpcXLV}ElQ3h}pI3IYb| z014Oz-u*(jrz8Hf*&fUKpF+4FXn`OAd6T9h6Tha(qS!L!ZRVCrQSQ0^7 z=t^n%2l}mlRwbWVDZe1jTK&mC19ARmt7I-^+mYQ@g1wMriONr3v22g4Df^1E|MnGs zU4=+S{=Ev(J^@@??(^4I{0~%!zx&oJ=eVRVxjn4_GyOMJh`&EKx$S|#E4M-_3GbH{r=;jxl~+GuR#bo9zwM!EAg`lVA)WtM^e?{L&og2KI*VdHMZr-Wx&jgE+n~y%F!e1PnY{ATx z(yL|BATfRIt3=i49G8?GXjqsdSUcrVu%iiarh?uHJ0YU0>&&7qtho{H_`G`j{G?$| zOPztZU*$W8m%zM;j*1R>#T9ktYwsU<1uUOz1I?c$0E-09-OE9?_Z6sx*9@nh2dw$c2!yI`LMLgcCvDbU<<`@Pc44o8X$>sB}- zW;@k(jmD{B8jI=_+HoG3R8`1<*QK8(P!JawqrHK%sh@_He*Q=@aBFWCFNa4_+ z)uwdw9o~57pLv+Fj;AM6lX-*3|5?ZTOR@Y16w8D8fZFcBo8TPW1L$8vS&V+W`a~Rt+9t8*=qc6 z6Q~T8{HR+MeEIplf=d36=vKe|!$04DLbpo#2`S26e@|IS>Hn>yzB2Fl^?<+95=UuM z|9ARTr2OIEgdeFrTc#xrrwJwY$Q8fwtN2}{_`7};%Vv{k*{W)QY)e6Vhd?3#*^8$s zYtGpq{!4TI`irOdS9AUY&H0O+$X9-zHCW*ORwa?$6>v$`1L)tj6Z!q-{K*4wibHMJ zU28HYB@@8tMmZN{xFLdy6|htxGH0!SP>Ir-;m4N85BwsM_%eTwuL1&%R}eGYt=*BE^qP%D=x|TGb*Ny=)6|4 zhEEM7+C;DDfK}XJ3nk@k=9+TeqU~rUG}WYH*lo(7d;G|h!P(N#;JVfdIrVTrK?dak zRrMXDGZiIM;qAr8rxLV~!YO@mId1>!`u?VmJ1d4=Di(AjTAjg4x$zGD5~ud}RimfF zmoFN5A*b}F%;Z(a?z1|ZH&$phy8*i@KfEdbY$xLMtEG+UT`R4zXZKQ;uG$Lb*%<8| zMVTA5j$=Fzyt|DE$#`deJaNw6O!-5b+AK>DFuWbI*W?tJI+J1HQ&s$Mh zPx=v37;2*kceWe}#0e7vr zYZwsB>G$2We!m_5ky&-v(*{}U0hPl1bNtF+@oGhuXr%$Y3f89kf)gJpi)#?jxL7L0j!%{+ zjOzP5J-dt`3~j$`!+Dl~h4YPsQxg!Jw3)(&5a=x)VP{zc2u{#~!T>mmN$N(bh*EsJ ze=q|P_$6slINVP6E=+Ez4?C+><-l?d$%)JE!9k1|4#tCev7vMINCg{)kZSZJ*Yl$} zAjo8!S1Qe73LE^j_z1F{gxVv!HE>8mXqET$WCMXgMar4ANFZfMTOI~Smk!^pq01t( zVDi*1h|JVI4^+?nWCmP7-!g~?4m$b*Fxq*X0n$v{5T*e3;&vt6{#4EY%^tC=;TX=D zZ>m%?Lq8-H53k&ABR6>C$=5W4`+q7*8A<2IlZnxn7Ahm@e1$Yj!0Z0@WTN!f$>bjw zrSBfS{kr#j|3fE}&nr7dD}>NjrkhQZ9ZQo~ly?G3@;qXaPmK{Eh=c2BQ;=55Al zP<-3X@SqUzLjnsyTJ%vJ5_);jfi`lmjCp7BamRwr4V#WWQ^t)$wcUix%h(+o0po7W z+(ZGpZo~FPhF$7(Myv>$W?Q$QO@#)zaswl^FbG&#tBkZ_gpQoU0nhst*A*ZrOs6ma zP~sXq7&NmYSm9Oxg%(H{AcWv5KGc_WkMsq-c=8y4AYhY72?`#!WVA?C?+T6_W~!bP zBZm?Ky(EC;DkaCHJD;&jLcb>Dy|wx0MKI|{ zDC`aXSjV)l*0J2*9gV`bz%ii1Uq_>_)NzQ~{y=v?DT(6jFmLz)^ru=^mbBghk)=Ts z2oeP_KN|Y`)|LO-BKYfd{F!WbMa8cUgA*7WMmE@Q1J9>CmQ|<*Ak2p`_jQ3POaM5x z*=!#KsBk$DVzUk2ycta)#S-nfVkqfyXi&8rtymz#Xa(b^>X914=Ws~M{sun&#G7$; zEdX-m-`bEudfcC>$10M>8L(Lh45_QhOCea=52Z0Iy5%vDu*IVZyP$XW9#Oauw$kx| zNc}3IYj_2d2_;i(^K!|rxD3)M%G4=sW7wE;)7{Y+Oi6t!P9zr4(BH+x-wyT>jV4*|T?$ z$sWg*`Qvl;zxawEpY;(2``dE$%ch74`2MYWzrHC_`ujoF-~O*b_G^ReXK1X};QXhb zas2bJnt<+M&v}UL|DJT`AKPjCgDz}ltiY*m$MsIubfRuf3WN&u;M&1C6_vH3c{iu( z&fDOhHe7I{S2d1pq8rw*pHBgwA@d@SGSHI_kPy)r0M9h_DB6AMjfw)C#%oA zzT^G8^ZlEn&(BVyL<@v)d~~QUg^(kF@My8L2WKl1^vbO#yy&I47rf|G+ar20pq$tt z`-|CxmxH>83SJKB@45B#XFHAh2(3_8VG;``i8!(n%^3v)VNV~Nry)o%z!xWT)m_}d zw~_(<*~0VQb7T%?Hl&zX(DB={M%-GigiE6NK#MMVCJL>T$pSuvq>XKS3tGK$I(0>n zG9w>LUJ*&-Di9$~+-=~|Y@H*t7EbqFT|UE-utNKyHQ96#=}iv6WdjOm0@D&>FCum0 z;amonkh_@_dvWdVP!4Rfe}7YU7%oL*)9@u>^6#UAyK*$BbPK+h`+Lsc%wPjTte#sOyoe)*V6U{WSR+_pA-o*g&bir|G5MS zcaCWx>NPx$s0LZmPhn+hQREpYT4YO!ZjG6KfecUxU&tvw8c(0lZ8#tGr+y}lfkw}FH?OQKe@O+ZJZ9}nIkjxo26%o!lQ#!_|u~r-5T!mLwht{ zM==Hz*Q-b&8SpnA!mdlKYJ%+*W&)auDngjHEME+|S<>NyL6gMByC=7&6%aLjs5^&@ zMn|mEOn1~(-e{i|gS=w(9arNnBU&yz|E}e`!5wYvO+zRni zt!<~@UK%`f;`W0;%M(+Skqq!`Ey+9Yi}6p%M7Z=Y1#^A_&U$EMoqFD-W zlPxtyc?lK_h78fxBAJ<1q;%S@Pv0vnMP26kwnUJyn1E2qjPwB=ba{`D zarXshvee{^NlqPII1QGNNPz~-ZoJ5d6rG&&c5q@~_9F7J zA<5keIhYvj`H#)6h6#auC(h3=6+#ESQ=*J@fF%`7_sreRigSA=`5lpAh!9ktj)6x? zICDt8$+OrDn3y{csR_m44J4?gx-mbSJdTx+n}XuiJ?OiF-f&WY3-8E$n?!%*bZLd!;(#xDIQ#eO%ye=_4SGHCrGKBl^ z3G&nv-WGg>hHUXAXIJiWXn3r|?E5lidb#Uqhs)(&-VR^+xJ!M^a`Jc4p-Z5d|w?Y6B)i8zS{YIarN>Sd8{*i7xkG`gul~> zXQ~>^!SqcnFTK)#zT@@JBE$T1l>tjfuAh&3Q_m+>1=>1#4S4b8He3Vzkdt|ReuXd^ zn;X2%@#c-08*iFg&Q*o(8M%4q{hMYXv6`LecC0RTNy_mf5jD)TZ3sB|pOE@nlq&>64|n=^ID?a&{iZTQ zy{_LU^`|Z-;DhWu8k4P4k^0bg+x#PYG!9tPxlZFW_0~bVRdrd}qH&$&twYQMbvY-U z9_V?u4tsRg<<*NG818EwVSRd;xj8IFZM|lr(t%W@hWX|||LGZWbrP~*qxtWX`uRh_ z6DE?D17=N(gmvJyW%T!>`R5x-mY#dOcHjF;Q2`B$be&O4a~iu>elpJ7-1Wq*{rzP@ zMq}l+HIrU9-(P7t-&nop+~lSY@2?8wmeh=_c;YhPelF{c@u~YOwlRMa89ohi&b~1Q zTJ0`B6cV(3--nwLx#pJTAt75HP8;m#6x7jgPlbIE8SZHrNe{6*d2}GVWd3*Ry61hC$#nXV$^|vMxLahzhVVg7IKRmJ>Xzd>94$E7u z@i;yqLO(JyR!OQ!W?pC;3F{1tuKDoTYu2K}+q&?cqPxm19`SV3k1qu68*g2)c{MsT zx^wGfyF{=Xc_(PLzdPx^vKO1HA4*Fn*7%XNPE6lXxiEcZ^2`gLgZQ3fcixz$`aC-H zO<&;y4g9%vM@75x7FG;>LfA^oDP1iK^tX56n)V$(e{608k3O?|Roti1`a>-Z&a2+m zj@`bml-QcE?k>(%JV(r4`{|kWozSvZ_mCMaR&p6(1j;QKrCE2?i^I2{SWkAo`St*E z=GD4SA#O|6Zknwd8Q(W&a=oBP^?K5`9}As{K|;Ul?Q8oN@-GrDE?A{p!5}t4LHBHf z1WddS33F6{P@|$uSnv!!(9GGbF@X~ZaAJUHzGR2_Zd@aScmt9>Djc4BEW>@vCHA*M zo8aqGf(?2vdRyq5CiW02I_wJW*&%$O1ixZ1E`v{O;O_}T`CBdtqn7v%kce9tm{O|0 zh7C95A$Lyy_BjFD*0uQNEy3U55qlxdX%?Y_jqi}cQzRIBK7z(hph*EeKG-ZIs0H9h z8R#sjuSgkhW$J&LN4UZSw=!a*+~Y+7{k^6kWE-&V+Wy3nosU(5Ze9s5 zPQtZuP&@&?oR4b7(k`HqnO4aPs%51O58_Jfi1k7oJ0Pu^nYO2Y`&bgLFEG8o zWq)sC`ar2~B_9_E5PMlcH2}PTNw8O$nMke(& zr=RBF@>$>*e|ukGCUP1#T)K~{O1Q*9@u}hH)^y~IY1Z}Wh`P79hlc_}U+i18CvI61 z>IQ?bs0lZhgBoSwFX<8oA>t)YWTYw4ZEx-+DzS=6^tz6# zP7%*BW&h0P3<;hFUz$eyiKxeUtwJgE~37E@t&axuHF%i8SVg?m+blLV80S=V{{-B4N zE6i(ya3ySv9LIwv`+4R^l~7=bRBXlf1o$BC8i`o{J$MDchbN=R!op%Eu^%9A5f+kJ z-(DBQbM;OcEx;`wj*D6rR!fOf zo4+^Mjj(dhp6n#tFe~RO^~eQ2ks`(Rb6p+rL3Q9*qY%s_~ArJ~L=w-~$zEg?iU6_w1~LZPA}CD_Gm426Nq zUxwoHPs}C33Z&TOGP7C;-_IfX@eNNfPKuvo)(EP4Z{UWY6I>SI`V13vJ<85LyIL2@-ION0>(XZlf0V zLWB$D_*M#WfWte*K;IA&Ob55$)JI(+5zgzQ3fP=I5LV2=UzdW{7;TLlbcAF}IfN54 z+7bDLAppLd36|sma5iYqL0E{FSogo691+tw0MnxB+Qfq+Ps#iA73VM1s;bf$%z;F#UZ;a|OO_m|H5wP9Co6 zeTxfw503KB4pOl^UgNV=Tn|U~nFx!4D)clqLEIimMO|YNL{$DUQrATuahQry@xpiU zaET1mISwI%fh`5_y=>wZDsJHj7%T1U7ZWH{+LF z6ZDBOGXS=7UKNGiQz^mftsoRJG9uE5QS5=UjEo*2%8pL762Rsv!BCQ#H5~XXCVU?R zFSErUIYbeJ3m5MVFFh#`4nzbIud{H0JWM}}sLH@qJ7!;?4v48J9=mP}1E*z2xWEHj z#oU|8xKmI^7rSIuS|s@B$UbqsNQy6}wm+MnVf!v=UlL*e^4KO;b1@%xQGC8q5_67& zDq+ZqA3*Yn*I3`$im^v zAEFq#&`jA3S3~|pUs%rYY5}U2UGY| z)b)?J10pnqL-f|*CpyJ8N&AZ!{yl<=ZM?Kr(x8Znws?X`>WlM9I@crlc5VwAM?z)@ zK^+Mq6hQ5U5KF}PZj$gM6BIaIu$-4Dy^d=Fh{cTBP9}lE!_3teIXuB{89R|h!p%Z$8Ei2)acQqWQ**OU$dPBv>Eoq=+SN>g+PJI>5kB z-6pv0y)juyxXL7C@Ge!(3`T1X>`gtNeXA-&P`>@c8*VB8_*83F1r-Nl6MG~C3Zn>< zOqAuiUWIO#^EOv9`vmIeTT*e+(Cr_7sI!}WA;U?MS$U|RjvXTr`nC~|VZ`GeLc1N! zbA^P}04h@n#-zfJ@?jk;f>u)PIR^g2qwm@V30YC->0K?Vk`cIP{Z+=G%TVV9W2&j?pO!Z- zt|Wp!_@1N0eh!)5|Jk9YLuegm*XyRhywDsz@9KyEE4OEI`7!!zJaVZzm41OQ5s3R_}mF zLBoI)&g8*xQh2ujMrRZ5K==@EY{=?De|SwUWIxxZwN58QROotcXQV{JhmjY}P4bKo zmXRx#hnvjVZ#JB}FZLWrM9nFNWj;^JBJ>wMj)pbkKHZB+=zlR*Br^;+RuP;3n^_ z+L<;kYp4#x?E6%-k;w}yrS-1zCvkaq2erohlEbu{52*SdTDx0zCGcjwE6w$Abw*{c zE4D8YYz!4S+iuK%_dq4UEpy_K=k92B*;ql{)`794ppv1keCHBXzqMi3c1{koOS$Wh zx80wmWv(X5rK-O3SCQ4Jl@jd*rTC18m$S7BHRQSrnR>WzCVtQ}>7Df<*K${#MlTmt zM7Awym(Jk@hxL-zGn^w%bl*3x~LFOMK;(X02Ee(>JhWeJgy{R@7x3 zWq19jh=cAS*oNG#N4KIp=NA%ObA9}lO+3_N z^;4JjFq~~0XOUg~j29|@n9{m@AM$K*wMdCI+#?7a7Nl~(2IPs;0yrbAEI z>a1W>_qna{Yse%gPmZm{M)u+ytRf@MFL%FSop9le*z#n3==Rs65482ZUl02sFh97L zr+qY7pFiGlX~T{krYRpTZ+voT^PBxU?|qseDckk(`jzkT=8%KOQfv)(Jx)&Td^dOH z`0U1~$qyORyt=v7?}sB2l~s-BWp-FTb<9%xzB2R5u^;AcQ2DffR{WmTdtAQzF6#T1 z$3{^%)la-#wTKk6Yi$hP#~D;|BLqhJZy}%bK^jJOC7$V4uE1E%C9!4_-kZ*f)6%|+ zNw!q7O!6Z)4JxENOj}U;nF%{x*7(YGCA0b%p$o@-XYG%)K=`eVAZYu^YZV=jx926S zN~0xys!!Qad~bEQpC5U%&HRv|ns~QyKb0T8ua+i>Q@3bqVPhyo@~Y11JN)fzpwm`~ zxi4aup7i)Mu4{R+RhqGHoR;`{&=!h%kp{EGs1xmb(Fvi+F(2LWCkN~(E~KpN4wi=A zUVGK!wN&_W|M@E)CZ$^mHs|>l&(=w{cP(+rt?<_rqUwe$qFnM&5%*JV_BudqJewB( ztqbBNe>W7i*>^q)_Uw_h94Ur)R46tMj1-gVK#FOJpbY+LP_)4OwGJs+;~ z2){Up^zFPH>u)sVJ`kpvNj9!Uil+jt4WpdX0$fk3KM1s4`QAAtC7ajlTDokm?(nS` z*HiSZL5>^WyX5yPm1xcmuz!$z9;@tndim`#`oPe-qni{@r;Z0Xrw^|^k+G3543@`R^McKLRddV1e}@7B`4 zp*rH!j*U;F+&d;V)a-k(WAhL1-G!*8fJTpaiuj0Ip;@=}b$DgvPD`E4EY($O{7sXrAG60*slUC2*{(ZspB`YQB?WKZWj=9PR?)GU8tA?WW1wsAv87P2`tf zLO=W_Qs}T3A0|3yp3&JyVeK!6>7R}a)d)`)+#A+I(+$}4S_0dVQAJ=d^5y4FIq0{% z<_{S5Qlh0pDmp9tyU?e*Q*jZc;f_7EV;XoNVgo_`Y*lFowR>UTz1k54QCBj9xU>V; zyZCJP)`7XNMjbIpAK4>){Zc zA$x?{Es4eJ`^!x4#d`4cE-XF3-F4cfN+Ux}pWZi$>#i7!bu?T}GC^Z4le&78G8nWT zqYiDjqjhXO%+zz$rM$Mqv%inV8FgrAiDn&(gb;Z67|8~?6%oU^qj)Au1Z*J)Q?4nW z%8J_4w}oqNQ9}Aoe!P1+MhKW_%Xhy)2XF3r0|z2RkL2y)E|>(R*X9=E`?hsi2Osc* zqYls)4eDN>_ZrvNJ$26xxmaS3B*`d(214R47Dr1CAgrjgpg!M`L~*f51Dyoao=G{n z=0$p%t6;D4GHU}j=L9mN5T?oyzTHG6VIT=8=V7(rHG|_ypngkAme?i4C^OkMVdTBm zhBGBJ^gOW;`5hg?*ilJ_fgp}%YC(9(;CK$+rCo@ypQ|CS-2X$o0({wR%jkJFX$5Nu zhde-rvdk}18$_G4HI+_4u{+NB0pZXcryKKmq5cnGNA2Pb8)UFfu0*v7D01orlDB;1 z6O~JQfJkcm9D*;J`6!OCD#nODT$q;ac|$+g9RJODU#gX=<-$l>oD+c$^Af<REu|pw>SMrYRC^{FPLX!t(FQdy-J{O)4-%q%8JM0-HBM#l`qsod2kM7)gxn z=@ilCZ`~P3dC!Q`QQD%I8VQoP%sAa?3u>b@jfU>F9W;2ZWwsA74<+3nM;2wEPe@{C zal;ZXHo}zKn0vId2Wq0I>0UtS7K4=2YYHYB(rW#H%{^r)%I_~7xQ*Dxa5>zy+v{Yy z;f6J)mikAEqSjH6KfTB@-q?=h6c|3?I%f1Hi+9~OZAUSRpZz{V&_`xWcc z%L9(^-L4nzrs3LM^6MC;FTAm~9C~%{%%fpCC^Vy|3Od7wt4|B2hw0UoE{;Hl&}BzT zEdrP_=oq6S7L;8ppGp$+znrA^-Wp9`&`eTHrPp#Rf-5yQ9j!9R(145d+v~jPt#bNOq+O2C5pmhxN*&S+Rh@II~A_kw%2bunTeju29%-a!&uO zNFfex%ZHM+mq{dpD&0Vj<3ccBQ%Y}IaS}F5+y6y8o^0xys6C6q?1C>*iWpfi=XmU} zZgDTu3CRQstub=04D=Y;wW`-p6irQloC?D3())+QFe-Ii5^UCbF1t%3!UvE=j&Z55 zD`0TdT|I%FB22RzGh=BB?54`c;#d0ctP!jnXAsd`Dq92bF!Z~XO$b@~yy7g@Zh)q1 z3?Nr5;>9bINyZHt#eJijL4Z*BMY4N29hV3Fy7oH}c>Pm7TDvil# zvr90qtbj5;jnM^Lc5jek8VJKpv6@JaAZ2nSjFIo$Djx)!6?ZLumXH;LdBj3$d7zXc zjq!WSEL5uOt|Ulwc>a=Zw2jP2@%@{)xe}RMh+jNroqQ*O9PD0Iid+y{o4Sq!S80)0 z8_s9Fs3Bd~_o=nBF=6;7xn6@QGYu#yYzk*Xv?KMbi~N+|hMpgOW^y5ZvJUz2?ZAGO z$wl}}o%{#X$^V0`L-L7MGt>&38lyn#e`wE|)><@Gx6w#_q~51fvx!3+>74sm6`H7Cd?_zfPMz z>S1|qk?2-Yyq2DjH>CXeQ5h=ZhYe=?aV2)f-vL_Y;5vWj7@Uvjg^gS{Mr$}b@U^q$ zf^O~1SQuFV*j(F!7WSZ7GC3srFzE#fWj7}lH0*foVovd?BtaOA(hLI)Ajh2Tkn0fg zu~{`j6Cx_HIMz|odb4?tJk9kPgh6ttGV0%J0Mi4d)exV%ZgrE0o{P2FYVW^uS;b`i&0B7NbqpVGEN|7U9-0 z;3~_QT@-y4n4Yi@W)qliw6oA8wz7MxjUQ4!h}nhnkcrHq@+~o?3>b2phMITZL+C^6 zyMry>XkljEUL9|wq+O`OAlXp9W#YXx(r8#Eh32$Ej*5&H(J$<~kQQ0R4#B6|g~!Wh zXQqYrS?p`#^fgv0;oUpBc@v}esI|ogz^{?ZkJ9bmMJ_Vw_WuPpm_LqOBr%w;@ksw0 z++hBFbLiifZXf?*Ty!Ik-1HC4p&gwKYSOL;=U>QD4LQ^y>UPL)Ce=F}=|V(=_1Vtji+=gD z1C9@9{Cn$<|051Kf66DTi-f>L>Mwrgf0o<8#71P=yHfxQ#}OV5I<6-~Zo+Zq9o=~( z=;5)*iL!@3WuCTO(ulP=Y*Uytul&)EVEfdM`OXZ$Wlc0>j!;ewaU>R|l z*J3Qxh}d+!3<^z~F@KaxC9w4?>%7Vy1L_?|$}6iJ%7V%gcD^iwDrFjH_0E1X+rzGM zJ9f;6gN{3DO3S^>^Gf83L-IsX`pjx_@X<2pMEQ*ewO2N&hBnr3YBkrqSAKLW`jH&# zo4jKs>iW&iPt^4r+&U}1srK;ldJatZsY-#TPqs7bJl@dRf(_3mWxgCFkxpOr6?Ogo z^}F$tXFuMEVs|L)^9Bp$7NzMFP`}Zu7?9oUjD`Jjt_yQfmLDUA-kE(krNwfimLIxc z@kExd^2LKyKO;^C260dz~k=;f#}Ua zBT&l1GOMS!V_ENjV#QwEU7G_h#CpAoInkN+9gK^QY&u`ILycpw)I4!>(GM>TfA;=B z|0G;q^raeSeI35y1-}(8|K;`i6*qz3c)hxVf2!B(XW{ad|7PLxuhIp0bg_lwglte& zNTqLWdpWFEk)#^ZSS1^7>8I`RCG;{$R<}_{aZw1psw14&v7s{yx8T035N}jfpy1f? z+E3bbR@&t9lwMo#Qd_@QYQfcNy;V1?H+H;83e}Q!*5%AM`_Ux=(^DFUqy3V!qu5~>m~j#_W|qDwEPhtA z)7>P zBu(IKi`?rYuvy?*Fq#5UpgIS`RQj@hu&VbZd_IyZwpu^~NZlGV?wt2?&S2_rO|aQ8 zNBU(0&lo6kt}{5>fGg=&3N57~5zDz8Yo$Y#Sz+eN3_&sS(wLvfaE+;^8OGb7h@-F& zTwftzwzmk#yaB#KU-i0D1J2TtmCkLT0CNU5eaH*e~J? ziXm_{2}NKE@qVmIuG@BN!_cliZ>itjW=w)1;w8=?z*u>Rkzkw!;=K!`{_2+$y7bWt zQokQb^M3DcPr0NYW`MtI;L#n@3R>y&VDXYI`TjKlQqO68f7|?&G zviessChgbgW1W5_^lNP{^O~x5-gGeVbD12bpKb|vXdRm~hRc1p+q>GZ>sGg;!R>PV zNGrTjeS|)_BpFAaP>2{YQIPtLoV~9wj-yxdv!po{0u#c5PIg49(U?bsgFz!f+C}p) zyO*@&oFqI|DT4sTQ^8H8G?Hi{z5hPuz@0!9>7{b>wT1g^;(Fg1nQHKB))f~B?Z08D& zUez@iG3$yPBLS)vE^pS>OM|SDG%mCc*^mf;3wjBNy2a!bdf(#`DhGQ=G(oKpL}A#L zYP4&@570%%egC7^2vU)vv24ax<8Xzsic56?*^BIdZp5I-aq|)LHY6$pngHnjHXFD6uYKYzJ zVd2Bz`XZK(86h_0bF}J&?QX0|2luo-V-yLonZiMuT=QDM_Qliv%DijXNaINJI5N8n z-AwAA6)jy#ns<@Y1)vtZwj*qj#Hut3tclHIRUSf39%o1VnDl{8__2zOOPyvPdSg8_ zw!vlfuT40AoSK*Zleg$E!?Ux0U}yKmQSg6_;n^>4Ei%w^wza6T&b!k@NUycJnPM&` zFrH>#(%(1SbeiJI(H1m>S7lWanAP;th@KIkF=ro1f1-cXzoCX5Gi21gV&OS`xa@1x zTW>=b(K3RaMHKj=^{G%GfoYx{M__U^Dz4RWX-NMUvATXx_j9x=#;RA<&JPmn&{&pf zjBic(-GO)f&aCgewV>AVdyor!s4)g) zw#oD&ibhrnGzX#g9EuYu5C}r91T(3r%f!rz?*L-7j$_t4-uPjj-g9F($r+-ZI}3r> z_`z5M4Upg)>`1Nl$fBop;f;d3K^npVAQ61tyiB9tJQij5#` z3x&j8=aScglERg8)=;{qLFE%Vr?wh1Da{h3QU747Z*LK~R?5#Vc#tyJ>}lfaN+juG zsm*-*FfVBQO4AdHU}fjMgF8Fc{p=|tyDt7{*!JUV^Ofu3XTvtwUxsZnGXP3gBD*{X z%64@B8N)Wxe}iG$lgFojxh}pvqscUwUw#8u0Y5h5qNxuG-lxz75}7MS!?1&#m%el0Td7R_xYr6CydzVdqj$rPWe!*} zjECa=2v(Ez;50~BdKJZsU3yO1ZI8KvSWhxJXA@~>{z5Jr!>BVI<;v&t1u)8rQW8)l zn^y1!0-XPFTve$WM_Vk_95ym{6~ieRb|h=0YZ~AL^gG2R=vC>`nH|&}>cHF*Db)!$ zQ_PGZZsM}w@}PtlueDM-N>Jlr#yMOhrWdEri}b6)tco^HfFii0SRf!#f>>~tFTV!3 z&Vs}XU*M+rNPV6xOJOT}#@Pac0c75cu$C~+a0f#2h5BBn={)pgI(aJYZefsWYtoL_Sd%}O;ip1L=Pr1|^ykk&Q`r0w^+? z7=0cq3`dNzi^Eybq%h9PkjA1U8$>3m5xsiDW2Tj=s7U#w#|aMbx1mYKIr-66?#H3& zE6&uip^5OJjw8hYSo)cm)PF$MgwkNwWa z_;=oDGMn_6zXEl>Ho@Qh$BTQ^A(u4cbFwU*MH8j6AksfMP{(}^6F9-?l&ySG;&F(d z)cJZ_kph_wo|HGlJ+{nRJIn-;lEBBOazo3R|Bt=*erx*O_C7x)2_Xp*dMHW)sPu#? z0%8(+5rZNiphQ4LL=8p7o`hlq#84DO)KH|C(4>eOnp71L6#+GNRMdc|s3?=Yzvt{{ zpXWMz=FBtC%r!rpzW}&G?sea5t@rCydPxTnSyp^5@}DumYa$mBA1c{@7o-0*YicVY zCFpbANWhR!BrFFAX*vKwXBbrRr5e^p$5DCIlR}W%SY~T9j2ynCAp;B@*ZkDje?a_^ zq)9c}Q#M*p>mxqh`>Uq3&+ytOl)5iVzg;fvZ)lR%-H}bdAYx_t>=GwVXPN0l6?IvJ zo~ZNE0V2OazTtg!M~O$U7CU-K^Cix# z;wgo2SGuSKb1&~D_9bHU;yyhUa`vkO=v1lbdY8$kfO;cPnX2Z*U z0U6UW(TV^{vJ4ZU_plzD%gmmi|w`Z z3m_~Dg0-kgI%4VKCX=IU2qdj6$yguX(q)`R!d+SYVlUtZ0+9g9*lFA8Rmwb5s0ZVx z^-^^WtGfsohB@eM#6w~Th~i*4RfQ@*?iT3fXo{aQ9_Xi_t+Tt-M(Q7k;a z4v=)pIN*~hM^~l=QP%H2ceuwO3Iu}1orGIx7YbDa8@|`@!tx}facK0=*{eDSE*(zt z3X%Tef6YcU0Apq8Y?K9}|L%IW`j^uff|B)ruZI8gQ{i8Y^R*8A9Sb!k0CdiwpMWbI z{&(Xi|4w4x90vaH@KgTt5i9(koMqS!gJDPkVf1fUs9wc)Y+y*L(}iW7g1Z0R^?ae4 zuSS`OLd&2hL@lqZsm856>AS01`!LvW!X_;SyBSgzvtiP!%6&J!f2-Vg^G`A$ya}sK z?mL4<17=aL#j}MItV1ZunyKQ z4W1dYygwa=+~w=j+phm;`paE~F9fdorT`$e-)&`eW8WG>ZnCk=9ByuO?XNPdLH+y& z4$}AF$Jq4B_RbXZfZey79z|?C8fH}89WyYtec#1zleA|9PosTV7n>&IzAx^ndlKJu zy&35#J!1P-*Izt1x%1b>tLX>H4)f2m{nNuypbc4pt7A5*2Ze|}EijQRPY-!Y_a!{cTh{KVs( zComHW&GbKWd#(i;&B}-ZoYL87FCr*MNL_p&mC^bN5G&m}{0Wp3r92|?AI`Gp2+cA3 z+fTfYQ$0P5867FjRt#dOV-jxX7!_L>dbo@=LG{bMt`#Xv7)uo!EqaqWbk=MS%W9($>dNa8Iue+-E%aRGb`f}t;kmln)7pr0)$L0c`)0HgE zpE&gCsBE)@QZ~}M(M&F=@yrpZeA`!Vh15;qu*T!m9!ozkbz`{X%->wkE8W-htiBti z??v*d*qOR>r~`Z=K^iQ(M-QcTDco?oLe?@n9as!$sJLxk+BlQ??lz=Ba=W4%ai|C7 z%|DFtbwmc9at$ERfiVh-_A}=?>6`qCPcO9SPIADegOnVMjMj$O3Ig82b*^cTJeMsFOY|v-=1!1C$ zx;%iB;=?3rUK>kVWzI+YdNpuW)1;yRs@L}p9feGRi_NoJ3_oF~${yWf_jP$4FVAMH z)CM@4phGvj@1ScS&z9>;Hm9cMeJQ0bU1{5Jpwr8ApZ@Le9{pjaTv!#Pa+a{eq^3kJ zc!;lpic2PxDB!Lxh2%!cka|}Gu>sxmCCojq}I?qM2Zf?G>N zq^)pbg2qFp?vGHC+-?S}{=>I~TCz=Ux0mjbRc8@;^|G?=#3J=Nw_;?S+Ncx@mEV|f z+2>~R=)(3`m8)e*mJV$2e5Q$JBM_zj%TQ+Zq8nUO$8bVd(QuZzIw~y>5&*se&NXzD z9fMD>3lEHZ&32QdnxS*AZ{G&8o zm18Oi`nlUMzP5Dvva#u%-v>ivpROYoF8#QW(zzKfq-z9L0V{CxXv>H_+lz(Ck!HZD zCklnYXs$Eu;6bn5%HJ~_t5*CFo}9$l>(-9OqpS)!U?k$DLb1?EE}J9ct}Hmq7Xiy` z>tGK)SG8+6nGiWF>+MTKh{l|WL?X`qC|y3(t$W=);MC?}x{L}T$<*7U-}K0j!6!$w zUyk*A7vhIAN^l%qx9HOav(H5HC-w^o(H9fe*< zwG2=8`m$5xkSKscd6uYdK3Of6zU00z(&UYYT$n2UhKL09J3Wp%^*|by z^-{G3eakRlBF*}2EuBv&YTVWeRz6S+WFeEdz@(57yJ-h8_5v|N>zh2cqDu%lWdZmDixX*u1slWFmiutm`b_~s=yKWe| ztNV?eG%`fE^`cm~sP7Ec)6xP)I}7&>A~os@Fos5^s;6uKlNvc$>doqB%UrCDoqV=t zAJV;f%Dz&sI0Kh#n}dh&?~E)&<`%iqWX28`tCoT$h+3rH6wqTnB&t7e@lqA$(9xNq zq|j+PVKW1%Yj$Vu+!Fj){P$^wnL$j`*@xUw_N_h7{N8U2d#Rpww8DHCI31SDRZch= ziRROAt8-tZSJ^nCMCUuM(tasC65S&6KVe>_7o4qRy>bP`p$s0VcqJEQhR6WvrN>nt zGC{3wD%w}zr;*m@A}3&_1tCZXdOQ_f!sp^!n27TcbV~9ca945XqeFKc7~dV*Z#YI} zEvrT>nkUqC`tS;7_+{*q>ki9?Yd9)rON5{A@nyuF+Unc4AW>0RY`f3CWO7bOOk!|& zQq%<(*^4Wr0sLT9q->aY&$vLYhK;#Jk&9)?Hc~Nn8Q3N~PM--IP+@l>%8dw-sCYac z@)lt$0SuOa(|r?dZj&$t#{^oSp87|9nmcikjVh*K;`fIKC&`2|F;c4D13q{T?{`U@ zaE6K*ptJd2eDVI761g8-x$a?^w`%(y zv%w-EwwR47V&mE=NL3j`s-@ya z*+8rqO=6=?01;ghTsjd*XMpzv7}yCXg>FQ?K|iM8;=@vmi*{6&t=Sr}1`c0?3YXom zot+{&e2Z%RL)U_(`2dl z^pu?&ZOwzYtls3P38fq}bWU8qL;9Sz27ApB*__`>p}MNM^;2tW`M4G$UX_ne5X08H z&Lp2o&s?35PFVZ2RCSj-?K_O^l&-4*JOl^1nTUm>51v1i=as#o@BX=siK=A=v~NXV zuRx`&Ka2D|>qLWUZ8`NSA0LWWDQ!L1@`JLc?n2tREf}+njEr-gtMfC^YBg-7l>PX? zi2R4L^sD^`@3`y4%;X*2g=@j@?q3w-e~-QRMmDfB?EGpQwZ|KkuB_ZzN5l*9ZY75< zeLGLR-FmV5`R=iUm;dxf)ZEXi`eE16W#>?SSr8_eIDf$^^KwhM?%7tsHUZK$ z>dv8pG~EJb)+O|NCHK{iI<|#+frTp$7wYE~8nzW0j~AN$ETm`@ncEf_4>0^=FUVt* z`-DaI<3$cXi>MmKblYO5z+#uf#cp}U9&N>5Gi=~(k&mQQ8Btok~$wUfk5?%=& zzq0k`6{bc>sBKAjV9AcdB@uZgk!>YW<0X6BN>r$pt~)4kfu#oym&Oe!c}Q=gRN3P{ zOW7J_T-&n5z_R4SWxTwyl(w?8#qqNApJjZF^7KGZlY#VOK)HG4d2QwSrrmJ9Nf z04d8#0|JNzWqB19cJ^E(GMLz}{%GKdY)TuX?<#TFIhf*rR%%8QGVOC>f}JbGWAR zef1_Gz#`SWI$SZOQ9GM*!9=NA0bc`AYF^vcE{xX}sZ>p;)c(ZO{s|PKuGs<;H9vmV z$V>>AT(Fik65@Udm4oUmmFo6BulW^Or!`Uclv}r_pbqh&PS3MWy`ctUCtQB5US6|G zoL7gvR%dM2@H?=Uy!b&Cpa^fbHP}xyI2^IL+g9`ar|N3EI?E%Cv*Q(@XQN?iqxX@T zuWgN_pvID)4Sq+O0vS3S9d0IVY>uC(JaD0j>uDQw?dm2w^RGIx{cP-n~8SaR+}D@jag4Y6R(*cVL z92HtG?Om}zYY~w4s~wN69;sA)ky5SDWwvA(c91|8cqD}Zli1SHCEzfO)LB5_s zXf0p*Bar%HNIctSB|_Q@MAe>VBr0Ua-d_5?V?7l%21NW{Ee%0r8m@J2L$~9QaYj&E z(P21v_$Wz&2xi`}8WK6Ytgq5EL$Xth`LH*ijKd?%7|@SQ#1^RqfC?(JfifF}g8&-t zL#_c#NdkBc00&b5%LR)MUy*Nu+RAKT>9!RRd~In$%C8aQ+Qmw;WWem#3!tnI@EnHc zM_?mHRp0I&->`QTDB z2AO?Gf?i=-+w71DLoG`f$gOz9MgdYr3>3YG4DkpVx+&Qr6>hZq9E5Z z;WkYuv+4kz0+>>F$!Bj`dPsl~s>)PJEl>c9*_}3WyFhcsftXfb8g?cNVKwKZGJ0FzEn z0o3*ZX(UG2uwY{eGFX5B@i3YAfFy(+m@t3?014D$U!OYEH}?X-2%!+hMAH+bzVuJ^ zLRtt!Kg?kY1NET^v55+jn8@uS=|4rMhv1qU1F6PZ95?QW}X_cW8Fq%7wnEhz}`B(zLx#8M#j8jTl!yrm?O(m=-p*IiR0g6oM0CUL;A zebAK!fnK^K!xImU`0MMnA%7Dgm96-4g%nn280KY`ph?*S->`8 z*JcS6=kUT*@MLl+bk6G*=HmDK!O7KcjhM)R>9VO=JEI&jqk3Y7aCt`K=8W<)<27r{ivpo_ z0KA?8G6CrqnpDw zq^Qe5(nZXNtf>fl;l1hKQsvj2mFRV1TBrQ*+!i6CupM5@M0hb_G8OJU2pcYgm=c&Q zgn_iSz4GQ2SYySB7fxD`4IeTR&90I35*;Qy*^mVr;A=sy5=db$!diUe=?H}(0IHt0 zrOBBIClQycdTL} zn5=M9(d*l9CEq@XqGx9GzO|ZkX|a=@2)5FG=JZY z>AU@{&6$XlTjY~lQ~N*`LY7TF|6#hMfeBlh@$f|u)M1;#3q#9j{6G`mJ#4k-z z7Gx586ZEW(E5FNlW@hGP!;<5Ze~vBu*nTtTS&03i-;gqk3jOk^;dCu* z9I~A4Q#po+aW745S8&%aGUhj;^qI2*SMn2=IGJ9X zn;o2UGVV&z6k2}KH;K-US!cc7qFksrV6QZ2Inns#&SN*n2ya_Q#tV0QSY^~=WQj)H zRa^N@i*Y^^JRRP>M~X>t8(iFVd3TNOBVspt+kI6oEvNv1`(D2h*&BS3$2N{aZd*3o zUmtdM|3f)PtI-GA%h&Dqw=>zJ;;+8#%Km`R)QhI0uAI|8{#!4c9`WCvW3}Hitg`9b zcryP9E{L4;`dbjo?tvdWVqN&d&2fi}=N`q7wZg{D4EYDQ9{$kuee2OL4-SSL|Mm5I z2pd+7XL7MiY!KEJ5@O;3Gy7FrctLYkFK#X?nSWt$%3S&7b>lblVG9qDhfL16T5oRI zw928ia@T|4AKS+Sd*W&Px|)9Mkng>?xg&Gix7C&zCqDhyS-3Lm(Az(ew+`(px!Z77 zw>WEWYedDC3yT3$<&_Wf7_N49ha$4xJ<$+W9z#u3*0tAr*1#isgUnA(#Y}yC{OY#b zQ+P=kGwS9*a_ie%WkoEBr|2IV>_Z-hc4zd3BBw70XnoTN4G2y8?9-y~4S#rw%i%HoLjhAi3It94!O%FSaebI? z>P)mQqAjFhLJ!p~kddWzDt%+NU;B7EcH~#!!&{166b?XHpdICp;}L((p20H2MCE+u z;@Yt-L^LIWt72XTD;smrb`%I##?YI<0Z5`U0MRK)+Cuh;eP+tR2XdNk{lKpPSk$L& zv(_!S;R;4J?Kb_iN1Of;6PKaRfmeHxL`VI(4wpli;?1v0yi zilph(wT6cL*vhtS)n8pbKXZ$bUToa-1|d{6MMNp0L8N_Vvx^1?YZc$2x)+~;$BEE5 zmPmV}5TT;ZJL7C~ib|&>P%jlD4Es8PObG&?%#^u(l!F;w$%Ys4&yjE+UG5LsZmB&< z7K4Vu=_2-W>holMUI#W(bklJ5bk_82aXhtL^}F6Dz&e1Yir0Y%b0S&Ttpl&YWotAN z5e8G8CU?~n^oq#{LpDuiuBEklX#G(c9)LvSxhr2u@)fMCP)b>{ng`|cMX+}G z^D{PDRQao7*e_Xx3}Vw%Hvq7*egWji3`Hm669{}ZI=w7mOm(d3@W9(k^9YglZs~qe z9B5?p6;w;(ClTfW+%3;wRgFA8!kC0q>C^PzKW1IK=@y6)OOyMD9}%j6l0UUrSa*u`6b3CnoIzq%UD(ZM$je z%#&;&jdg-7-4@Pf<59t4z=ubZvW)qfHdL8lHyWrR1Y~>_WzkPVEcyDBRx310P zm$k0i_yps%VjQXFD?a1O<|xr60McpZ4CF`SG(|mB6we~{`C;fxHso=^ zdY?<&(hIxhcVxI+P48WxscSLej!Rjx@D0(DV3s0m&q3KysO8wVT-jhEka>XoQ_Hof zXxHKUs|Nbjw)5{pHXSmKXpj&tPO>zof)obbuQ8u%(w%qY_c}Bdiu}B1ol}cR!R5u@ zXy}@On;&R4Ow*`kb5#XJ_Y5Ty8AChX}pk)VC!A%L#imKd(Ek= z+GlfHMMsB-bYO^-^2D(I7zJE6Pg6}~LxgzJakM)fH@B3FY$uj@i|IIJ54#(QM9lUo z5uLdbp)T5oav0;{kM}2N&p*Hh%X5$T;NKJHiI}Y`3x1aoL-pApa&7$1rbmYz*RI`m zd-#KvZ;-<$)5B&61qKI-=O=26;Sb2-p`-@jW?Fs^Xu+b-cn`8yGFoKr`fYxt>#tt) zO_b=D^9GxE7$oZxF_{Enxov_;?KB;$QIB3A&xZ;SQ z^e`z3!hV0YDfZdvTvZ+AVG3=@W&k*`T}R_#-&b%NOk<&ZC-?P{WPd0CS&1yeO=w5O z&f`<@Ycs6h1)IS&F{Vw$3YdhvFB|VSG)J5Q!Zl4^Hf`-%(K4RatS|a=D*rmAu&e)q z>#hqrTx>w+iYyVenw>hQkczAl$sN4_ELgKXXcVezq>B_!_~6T@F@GICFbPd*9Yl zQjV>bqiJ@R=21ufDM#v@I&FbKH}1|^?Ue5BPS8T7=hcJ_735tvB zaM_oQImyCD;9UK+dSfhI0jlf%#PgpbddmQQe6afRg5DBg?-9%M6K?op;VH4WlH*!V zf6#p^IK5m;w*yXnCGoD@V7K&s*OPN{yiu3MQ^Bs2JT_{|?aYE3ALpK-<(_Hmo@MWz z?bV;2)}Cs7#{Q`L0#;?d%&j=0KW(&oZ?XH82>0A+_cg_C7hkzw)*85y;eIg=ccHz1 zy&i@=>VDjJfCmnw9Q7#k%1N*vC@KSFPN^ll^Qc|$5aK-Rv^?uyT~<(QrgVv=@f|CWiS)+j3Zu<~tm$6E#2>-nci;}_%dyYjm|Sfg0i$owau>8Dit z*d3`qLoebCNs5R$aUK>q<= z_At~DL(6L6EG1ZcyauS|vSFv}#bGTdX%-DJoXV^El<&EW$-;slu68^}zrLXQ3#cIh z)!CfSwk8;U0Z~&HynjvPiycz{wR4NFf&vpBC@#k~qtlz-rPQ*Q8uoFl(Hv|pc-_d$ z(KxN7xc@Gqlt2Yl-Pjsa2DcZM>y&}0rO>{HdObF%sK0bp9a2y#nlZ+HeGd6~+>MRo zngnRwK2)6Jb}FmP(>YS_1};BSf4w%5ix+{W1md6U-eljwVnphbLh!&B-Um(^I)b}` z<@IUTWde_j^JJgjO~U=ge&ujvrj`e^arCFS2|`&El?&kW6Pdu$z8j8)93A52B=jl7 z*a*&i{R(vBA|W0~)4K3oKcgtvJ7-8$V;f+|Yf2;*>34FZ)Egjz6JVqxLj`mrAca2e z(JyEdHpf7~)s7gs9KV6$rps$#uOL?GRDg0o$>o$}Nhd(inN&70fJ=bWw|;%_Dy~n<84C!!)y1}pv9pi{UeNi4 zqnCTT{yn$I6RjqCh|<$KJ0=P|4Vun_=eBPqNDLAB0N!ZXf+e&J-5AG3>$`EVfIif9 zSC3$1AT9K4^l~=nXC6RU$KK?TuV+k~WDjz>`|h_vnz@|i6z=CxaHX*9%oM0S20n?D zbv|u1Vh3d+Q#IWHm^pFU;I0b8pPU=Cf&nU{eZUqFg=Z_WI7{cb7p?=ZGug7d!bHXu z0v=LDKfnvYG$k$;j%mX(LGKOc@w~PX|4`hFvKh_X{;hWH!=68P=XTTN{ zcW6QGuX$VZR#l~dcO3JJsz*ClvsX+(nmT|=1hhEav1}Rpq9Jf?l?PZ5IobLP9Qtj_ z`F%;e#}>taG}t~`qTt9~0dw=4y3+z`@MHxZyF&5ezK<7msqFhPpm7#&e4x3CBKzox zT{4xeKE;t?L9!H^+xFx74{CC+Z0J;EpZDad4?|i6w#hL0Sw8oW-L?1&07=}s!UkB8 zD==h&xDv>a1z4T-nSKy#v)!Zo>(=abHmQbpwFyQ-!z=#B?pa~MNGm-f&xvZ`sm|z& zEB9}d-_F*jf){njp4-`E3S^hbR`Wos2tZ96XeC3R1HjrgT#5jUPv9M^-lQF{Q7>X# z2iLu;%B5-{I6vZ!wi|bZ20b1jEvD_~qVxd;W@&bizHZC%4-NHhueCXjRN1szx$4mb zK=9^vU-y`n~R~c?`#8j zyEQla8JiM0D+H@TcfTgjgCt>rjHICu+jfq1M>_(_^>~FTgNTw!6a&zn2Q~R2H;#C= z_`YtU^33D8%W}bvilv%(?lLB%Q=n;bpQ|BoP&ehM$CD;;90Y?CRFZ)ua5dOVp)ydG z&(??lmgjO7Uxag3vbignoD_W>6a8y!hkI0A?#UVs;{iwAZL8Ms-7R|@_q%u<*n$1x ziEcT}o3u*pEnasXzs&FHB#TWnB5QomeL*^vJEnM6RBF;uI2BxaK+bMWdh6c7 zvX_&-er{v&mwt(NUwfMR9SAE;+kLMu>}A=9n_E*)gugG>i)!7w`-Y^We(YTLrwdoM z?lc5$J(BFc%a1zBoxXWvpeRb~dd>6}g^#P9dpB(T7%6*pF=~3mdXF!M*u@X*J@?T= zJ>z`T`>|Vl7TsD4A02Ru8jX6kHT#@{$IheoU);(PE!lg_{?_XQ3fsHy1*CnV73?vZ za;|E3eE8{;ju9?&^3(gPd+j%?B$n|4tK6nme3muH=7=mOT4a!1`?(P4riz*mr1$#Hj9?*>WgazxMQSr^i>)nBKUb>E{^oVhlw- z)=WFroE&ShHa6aJeXLbTto3({OaNf~!m%liQyt@FcQe-hZtR+8u@0YO*Dl6V<>P4D zaddLrnwx;(RIr>IL4gT7pO_n!jK~fHt2;boB?hwbz`AE~-k;;vFUB$C_xot?-$35K zaqWKJ_4_x4?DyNZe^U;yG9L85yg#t^>qdF>zbzw5b4$9?#5NOr`}dUOzsM~~!w0G= z%*npGqTat8mFC6l%>Q;&{)>HY^f18drT@PT)RG(iH%@Im$WqLUS|NIK zfpzQuO{cxl0bts8TP>_2+;Lt8ttS%R_@~77;4&=BkNB}^Y=`EAQC+)Y5Hd{bO*Qr9 zIbT!H8X~GDcr;uIuza;4&I72#eI2-t>Ua@?QfYlY+^W2p&uGJ5G~WkQcPn~!K3#@; z+_rzUc?JyC(TB}W@iMY{>JXBYjxT}6{H|15us>R1zZV__>fQG+(&<>hcYs6-ym2L> z%aejUHDpeIa=?f`{O(HOKH3Z19PYa8me7y1vjSyPx}vrd#;Ro!>QHpE-y)@`Iwf50 zLlktLq=xZ2$W}`V=)=5a>W)~AW8ow2PM6X$X%Di87A16A6Iu^r0VY0nUwd@>S)F*Uk*$;J$r3c=VuIp}rzjocYTC zD6KSY5pS6Fs@PrU&>YPZ@KWYO1Za-w1Z)THrBbe<*Iu4r*`X(cpRX+$)j_QTk}35} z4rz!8EWvS<;~5-fLXm3Wyy(0Aw@WWo^wdF-=nEvlyr;2hRhLWg-yI z;4DMyMe+vMw^fjmSskZU%qtyz79ZjPAf6<E=^Y^3IK+&l!Ys;X<|s_I6mRg z+)K=tXo0XwKjG=(PPEqwS4Q%L#MXAIP|gaH8sHid|NXD~QN zB%Ru-98rLxp{YuD=97T2&@<4FEysTHvNjG!>6Atw&Gz0yx`tDE-fSvxiJbr@iWQ&T z&*>Rw9V zyREf-5i3G&RVQxUwN2lo{Hovoa8&N}xc?7F<-q+*Kj%uRa_>)hjo}MT-2qW1&*!`{ zwLt2q+^`wSza(^Cn6zNHui3b9uyNDMLm-YJXSD4qUU^md6m(0`D7CHPKR7C%mLdFX zvQ#{n{u1M+TDDvjQ^s?wQ{$VEx2`HwZE)JA>fxr9tXLX{MD-A@_0qZAMX{Hi4oT?R) zkjSZL_wS*Pvy_)l`_V3JL1Qa^t_Xi{&hyIkz2`i3mslP0uN-i$iT@`@<)gu;-`c)k zmz=IW`quN=&++d!{&G}?cqBF7EGyhgFPtb=I6Z|qbgb_Lh&!JpX!3PJ1F`B+TG6u+ z9f%+Kv~0Wrx>4ZDh~gnG+39`U>kbf5?(pI8P?M&4kKV&(t}Us$8qM9etW)aJ$ckah zp2zF0{1JWnV6XxyME~D;BvNjtk#yC5GbsLhb^F)cPC4+OtD7{<^xqWr|BS+3;0#9n z7Yxk*chgLk7~suc)h*(GmH8X_?#h4J72ontcZP7D5qbax=-naF2oF~c%V0?P}T9m&ocZWI(rFR_hR3XDm=TEn#}V#NgtictXY2? zFBmYXw}EhEMeP`Kn&2pL_}155*?1EKlge%wc&{f1cH^bq_KWQjoOO&Z+siPNH{#I& zay>;_qm%@WMO}8~eUa8sCzgQp0vr`ZI4Ln?f1eru_I%T|;a)_`llw@BnJ@^Dv=*Ot zsSE-NiNsE?49L)TBBtsHtTr0GJl0b0mL=q#^~vxm;$x;YRKOirc|t4J3&(RCK`N?L ziRnmkHw7m5hrhG{>jHjXGJu_H7`+G{ZGftZYn=Bau*^?eiKumh7zdUjS8lltK$BIW zin(NjSZCnaT^pS@PAW$yQ{I>?Pr!X6*>rZTQ1LbE#LXvDT+wqUrB$n$kRXG4Hn{5R z#sOkCu?0YxC9-8V5&<}yB|WeO$g-}GdwCh=ez?19YKb8mygQ6{J}E?{O9)aDXcE?m z1bUZ&V0bikN5m%;n_n6A@nAyeQ7;*oDgqRVoT5X|RU3xK>J}~MbwfKkRVg;fWML_+ z7|c8=PoSe2qEuhX?qFwbff0*@Ba1y{mPc`ymq0bkx-Bo3F5T9h{prnXviI`)WXM~+-l;JjHELg<Jd@k?4QltOa!??CRW-rd3UC1J{=| zW@4*g9bd-yN{Dc zTaF-fwBzwyEA>=!e1{~7!Z(2HVs3d8hd4vzkbDxAOo;;144Wsp$y$}TQ7@pc(^b|S zs(w+^THWV_p`94YxJ|x(RFRHx35dbT<<0>;rng3QFdDN3ij-mK$D%RgA*F!k2J~q` zvZhm?Ui9G%Z0Oyp=>g`QaEoNaDbcqiao@ArKIJrOtS^IRrauiyfhsmJ-AmG2gpSB_ zQV5=TGrG|{ZS$EIuFBVf#eINflp-CiVnbgTSTYrZwYVu!pc>b;&tr@RVvL;uoD<0z zX*(%EDK29^_e5SpCwzUz?y?y&@v(WqM(#}{A`~`JGp>_KQoz0N-T~7v;Z-zB?tl*m z9wi~x3oif86JuQkACzk&oQ+1l>x6^4fIo{$#JeF3$H*8Gy2~V8VNI2f(0N$N4~V~) z1mnnPLv$CmN|dn9n4{LsJC_bkC5)CYky%dV>P}=2Cuoa0RXaxR)uxkh%Y2#fq+G7C zAuIKF!Ft!a`QRnVM5F;?8^UO~6U{+ZE&cIXmBQ|juh7S7OhRg#j$B&Yi>L}wht@;J9}nrinuPA*00y3!@V|8ykb>JAGOsI!{`~`fZL?>EX;+MQx_j#Xs6N*+bj9>w|KQf2vpFJM3FV~w zP^iY2+&-@o^PK*n9kyT252uw_mb(9kbNLnu_$2%9T^6Yg$Uu4z4FX60e%}3S8_<9A z_y>uY7oLco z9)|G90}4d&9mFjieAhOqhPM#06Cd5l&^iFxd_ck~mX_5^A0Bzkted>g*%MoG)Mqg| z=7B}gwdRnYic6PXxokM027fAiGI_JiPgntefBInWko?Aj9c3*q_P0KNP(FV3?IQ@B ze`J+<-T#_Nw_wkkJ70eqy*;k5`^jC#{fm|RUEnn{IqAI3;4`M_k*S%!m9-1AL#sY7 zd>M8n|DKaZK7W55+gU4(d>;J#`|pv@`Byp8$mi2mDVd)zZVsRv3v~Eaa7(90Vjlsy z4!v+vwB0zZ54qBu#K++fa&T@B5GNo;E)*_VJCi_-x`(7lPn{+_8j_pkAnv_52J^MO z=@L6%JzWBdA_W^B1T7k}Kv!adx@KYz zU>i@&&j=-!<#sRG9)saJF#$76?(#PxI9Ob${;;gaPzyW-hO>axQO;aFFgudch34iu zD(;QOF~ty}IY8Nv0buae<5Z3fW?2p^&o5^@ui>L~zeL8SJIO;e8FhGSTs+Jj_K z@q0V4+i*mL9lH~V;wOoJGu0~yB7N(4J*y?J>@}~8Q?br^+pHl6vZACk(?iDU3tv?V8Y#Q2;5jv9+Kx|N{W+$z5WC3XJ zZ9qMN3b={UdvO4v)CNgEpUCi+5&6e-9P;ZeqEvdgU$6V%pD!Co1X1Q~?9+R~5Z*-<`N zZ9NiNp4TCNT)<9+8jBc*OR1S23EGku>76Y-lnUPM@V5IZ)jVg)w>JNp!eQ05)g$Y_ zL^4k6_zE^3E;T}X3{&dv)=Z^Vg|GB{JP`P;KKFLjj#Yz?rIF7Dfn0TjtLOMg-nYiG zb=8sngX0g|zDdc28H=Hw6XUVt->$aYuHJiaaN_CDZ_OgP8rDhA$rl>mTl&`3#N-T4 zzOnt@I()h&uGI6%`@rvQW4CJ#G!JeW3D^c){P17uvON3q^ZQLe+QpOc5;v#0IsAj} zB1I3V0$9Kp^8O1wpgc?!3OW+dN`}FG!h)`ocwLWtw>oLJpJ4G%_ip$9Nj1H*JAh6{4YEdn6f%`*}68% zEr^13YN*1trrmr})s3e?tnTTFmRNsNfp5~MXQBjHmBMJ5dD)k-wPs9*1j+PddG0%; zTkCcGe#35ghg-yNANz_Dq*(S1_J^Loxm)=*_xQ0-&dVp8+=BqJaHiM%5UpazqM z4|(sRmw?h4`}V0xFH!_t`xMEdwF5@A>*5U}yFJC6@isp6^fM-&TKrdi49^$M4VBGN$uloMDIQ zbKZTqeJ@-Lhvr}MT}^+y%J$#;<8|(Tq`Pdj^ZxnH{6hNALl0!L$KPu~m|xS4kM{oh z7^%kj^{M^)r(d5%GUNqGx7xmizv__B;GKmpBj>PxuS3^eD?-lbbdQJh9Q$syL;lZS zb?7hjK=bE6za+in#f7;?`xbxCzpY*Tv+(`1l#_=O05WbONJAn;4+tQ&J`u`R!ojEg z9X)^vlyC_{0@Ody0|jWam)bJu-HH06xM*r@dG{*>P^;vDJ5^uxGk{Hh@!|17ym?pZ z9G|#$?m1`COJH!9k;q)$;R!jwSy~&45!S0oC%h@;TJ{CbiSHEOjt}P%HC&KREti4f zN4cO)HQ<8gt1Z5OIvxz0?#@3YAMyQG6FYg^(oLz^yosrIX8Rwitv7zTL;#6+BP%R002NGK67i*P8OJ8v4D>z+6rv*yOoI6FD>5_9}**5B^k&beoI z1uB{EYWb@lav)MpgORXm9i0=Mmt`7lQ)>HYa~`U=ACFLXMArA+IhAX05xKe>WlmYV zd-(V(NJdb)b|rT`cdB6tv~ya3N-TEHOLbZ2gDDfds-mT}X&1pBC1Mh1ETZ`eu zvMEQS;iW|`;jm-UF6u>FgMSV1C=+v0F{XXNlI|p9$^($Cv z;})`IFgd~aVN+^rOVk?dl#5$$UpyzYtf;Tk=)`FN z;57{zdp7TT`_#JH!~aRQzX!czvtRFf3e)fSFhI&z$aqzO%Q_(hY0CCFz6JzR*fHLw zf%7ZrNQ}^bB(rs>2qEWNfVq{qiO?wk4Sl;4^<8FYzU`r282>;fEwn{BcIf%ja~Gey ztELHFPBOmD-&(Vzo`2Hom5%0*J~!|BObh)~(yIOajP&|!$2Td4O5Fn*qL{N=W-uq) z3kRLSFALtJH;MUlc)JVF2$%Ur&{DXl@%s!*{ zQCZeX-NQd)6UmnNhyoQ68OpwVjbB7YP5 z0#SQdWc(>O(#wCJ%GKO&P4ecaIppxCQh(y|A*Iy)>tEeNk&=WrmAD>}V)eOfl!g<> zUrqqs2|zuoua3o=Q7xY!7CFcqm6#7DdPTY&@lLd{pPa~Z?c+#}jq%kC(CsLf$egii zjrHaS%m*F$XxgVM4p#9T6DU*3=-%@+oYlj0`1^6Bq0P4FY*A2Cc|@|_EI%a>p(}R0 z*^Elw%ID{-2gX{HX*eIPm=pQL;ND~u)G=k%z{OjC?yHv7*&L~>m)eo*f?nctdhObm zc;X)I|-_B5oD zQbQ$5H5j`zq%5IPvM(b&y_M?NC8gJM8R+seBLf*Vm`!gauQu(MHyjn>s9Bx)R(lDnDN zwQT525VOU>#RlR-%WulhJ`kOdF)A|Lo_rE~ws`}tc+jLqYR{FB?}Y!s6r5Nk&E0(7hTCl*9e$p{QdN2r(atgUkH}*FvKeIB8DEI z_wET;T`XB3Sl>fBB>Mu8<%yO7m{x|EITxEEfSwg#>hNO1j=?e}It=fgB(TUWjB<0` zhYJg+0^+y~^k#XfPCBMcAgXT?9{vfHBM==RW6QzF>jGF72(@Hj>X&(#hCxg_4U<|3 zff&WTkjB^+K?e7L*(mAC!GtHHdy#}hl{hrsB(MxG*3QMGk>TEa%sLV@i!FM#8>1$F zaIPl7G&QJ-y*C`Wr(g^nEf?7YV(S5HIv(T12i&>PT_BV+2rFe^MmKN2@F}U2huMaQ zSTHbD2E-Lg5HyGc01?J&H{(S$G@z^az$t*uI~FL32!yv`HgZJZQ^MROOp6YflSQ|1-~-sz24*cE<$oDLqa(JEMVp!M zTX-ywy%#!u4w;H=Ag}pq0@0$2n1iThKGd9n=_DubKm?W`F~YCaH4tjdgs0KqvSg99 zd{`YFLv(Z7ZzTLhz}(qqw+i4XoO41l{f=j7E`YHB5H28c8yjXof;rmmnJaP=6T!B# zVTO2Y4+_@PfZic@K6D?pi-~Cfu|0Hb8zb~J)!o%KvyPUT?3#IOHuTiTq#|JNG1rT? zW8M94?7MU8+_p~_c?vl~)_{+d?00AHbUC0Eqqi`mJu#eQx1>9^JcU1UX8CMk#nZ^xvUBGd>0NTpSKjIhBfss&E2>} zaM`BhpZ6`?^Q{60?#V$O=b*AV=td6qAxC_PvmqEpJL0`+a6Pz00gmS@Hs&io%vV{; z$17g`kLZDVh~i8FIq_YNh`tp}QI@n`);QbZOSOq~uw{mCUKISwEy*j0Bf#x1V5K2A z+AhU$62^8FmJ&9~*{udV1oatf6ea!CBH{35rxhCjd0Tw+ zL9|6Me226hxCW44OS>Wyxn0W_uono)xlni;e20F?>kpgZ`7%2gCHic{j@#A-4bsM7 zDdQcHWLRMK&`esp2<_{2Jh()082loMSVeJG#Fru|S9)QD2w!S@HuR$h7?Ta!`-8!@ zQu~Bbd^UJm+guo^UJen4iIJj^P1}xxVMAbEwp6d@m78d@bJn02Npi=FE1Aco)(T*| z8B&X$7BBOm=NGCps;lH?0JuHaWe28w)T`Qsz!G*%xDbByl$dvx%MqZ}iTPRAqg2yX zl4Yt|pHuQv394VWsS+tRrFhGkU2+$%Nw7+Zi&i}^FB>hNs4=-%v;O8U=z*^_WTje5 zvs!Df+IvpbHWzE{Zq_dBuPWrl^&Q4Paf9MPiQL5xjFmF zy5P&j+vu*~8(Qfdw#`pSFfO>mbI#n9+R*LjETFE?Jm9X7bu z6y0jv|Fw~;bn}|o&DxvV%edEv2URxtl#nO|4~3 z&3#RG?VI|D%>(w$Ll?o@m}af#O%qB@%aHnp?Mf}vW-T*bEzeK1%wBAHb+cuDqUFuk z7Qx)s=h~13uU07@_-TLZ;>Fg_H^FcAtzY|EA?2+~c<6Vn-!Fpb2;Rpz9^lRU zf@#Avfg3n$|Mb$9_}TxC0fa~$>G_0pEP!n;g87Yi5g10YvvS1iief|8Lk z_h=P&6n(DkibuzuO{(XU#Hs`C+4<|UwYL-oKJCpFzO?N{TwlL>)K_2iq?HN7s5mrm zr#j*h9b1G?p7<`d+NCD8Tgb!P7uH_!2O2DQ4{)r6FYWB7u4}GtEAu&dA2RoVyX!OD z>m8~ch6w0;9CWRd{D2hsLB-L#X5#v-opX+Nnx4LYe)*EsB_F5tNBf`wnEr#`*U!G* za?^OZ|ILP_kT=h^N3S}RdUC11@oeI0iPo35zARvFuZ-Wg?ECqQ&kAkiYd#@TAmzWt*Jm?S`P}9)6j%3D!$;PnU+5 zGpbig-MeP+8jCE1{9&X{VH@ot>y-2rfO>xHe(Cem7xuroFr&&%GneET%_wiOW35%A#h2Lx@X)#ZYAtns|yH^`scpI+L>{sj5^S6|v&@=*bH zK}QE}_?+>(?s@F>#|QK{-A`lw89|@M1Bxm>Jv>nV`qKpC_JH1lkOwE<)`Wh2F#!vE zw)}eM{Zl_*+AMjCYvQr1D;KAejoc-=jvlE^0I#0mLEFX%q(;1c*SleLYtv% zR)=3L9ma&H0OZ<9PL#eu8;nE-k#CYc81`*2+PT$hNWQ|*x*U3k-$hxAPNJTF{0mZu zWh#&BXPddhCK2qoAmGMH1Owb<=4_g*cPEDA#Elb7s?0AO)Rr#K7oAqginPI?6l^dyIyvQ__9+-ylaJ6@1)w4pg?hy9+kjOG(^gB{dwz z++r_37Pstv8_J4DXulBv+vvOScHg@dW#7x}LaD+Z@{qb5eWaN=P;?nbT}Aeqc=^Sz zSb`6%MOuz$HmthZ-)*zvx>Qs^aeGq!tR7`#!u->8o3!Zew+^1cXd$amHiFlIcNS6! z%Pkd3`mgp>rRRM*{Y^ESuKgrf@Y_Y34U{gv^4%(-m58Q6JrR^9oEF!&-YGkCJ zx=WJgw%`su%x96lDGhGVv201HeFuv_@KpJdiEKlFB?R9VLl;2nR)pTtatwCXFn+(> zb*(u#%}qI3wz~~V0=n?5U<`fovRqwpaY}U#HLiEOYrl;y7Ujg$7y%$&)W|hWco;&M5i*bp{U z-&<%^Z2+J;49L#pDWSX(94{XpAoHYggaAV2-`KqdSv*LJ0HK%mn&$DqgmWsEsiy9P z#AJGktV2ah?GZB4I+l7_d#)eYNx}Lse5FHW$tWs63NOSht`TyO4+bZTVocIS>SArTG85D4!AilwObIESsc@7lC-~s6%Too{f+b=WqFK!z5M?d%~Vu!Or z?P0Q3&?utT!X|UNZ_>7hI61DcfGy?3Yfza0zcpJEZLhU=TuMkO2BYhm0hXf9Q@IZM zruvL6J(oSxZ&}dDQo^K{?>7M9zH=?nmk@}XjFO)?b;3Y=(#~^mTE3Ta3pU?!Y`;10 z?diR{k;T(;tFH~iRJzGX6KNjz{{zw>(`ToJtrQrw+H+6!L?^q9K{@84|=cr`U3ve3% zd*V-hR%_siUC0w49(l|87UOB7=5ua}S4 z1jIE``$C_N#gZTP=I;Nf`{-uahgY|7^uL<+-pNt_tgGC(_N?!xuF`*_=EdD#roG16 zm-mW=)80U1-Op*SFK^4u>#v2n%G~3DoAqynx(a5cW7AJv4<##0g*XnM=e1y<}*juKS*yci&U;?1Fdb%V+-w{7iF|O`ra%YpVM%QWQd6WyE#=&lE-3>+6%DbFYQd z9`Q}X%%7&c`Rj8(r@gPch1|3KRiV_!Kc_v*S2LCd3q%3$U?ExU-#hKC*oTlkAWBZ( z{@s4M)A5+hN6I#Pu}o2D>bq@`?mRez?f|Q++qoKx?>eD|s`h3T?eSfRM9*Lf0k43u zs5^#D8_L9w3w0IaZL9h}9Xfk@qs;YdP-UM*@-D5Gzn=Dfq2}KKRbb46Hxv%~tF)0< z2HZg^W!Jp^GI#C}HuUzN|jwV=Ii-K=+$5{rdLyivkE zNx*k+d|Np8QTOf=xx+1YPpp{#%4YICx0MlDw&Q!vKf}~l6k#JixHW!FJGAqw;Pt&_ z69R1V&=+KEX5I%lr}b8KFY)+T)!BphT|LyQ(1rfzTpMv@3`^olzAwb*g8_&nG$wYXkJ z5pGK?_x?BRYXUu?kY6is>hN|lHN_kNntjDTeanCGnJ81iMBFg7eLdC zPY!0ud7{+eNz{0R-0Ij%v#Nx2;YH^NG454kd1Df@Z=P zo1QpQ23(t&Gh>uyl!`AR*Ub`GNw}ZfP!i47e$<8m#0@R0V z6Q6&`(~P04?BYdx2`{=XK4OheuVcdK$obF0Y{3o)%+Z~X@Y1wd6CsF`L9N3*)X643 z9#8ZXsN(9!ZsAyL=;mUkh{9kSDu;*h?%!5GUb~NWOlZReb^&h16ofU2g`S6CWd~zO zW2Sc5@B0hdO>7V&bk<4$y3a&35@87n|AuKf(u!=&m!equ0Y7a1B2>zf8+TuU2VF1N zgqpP*%Mbb})6ozE)w~#sS!R)gbi#Nl$EV`a%CO5HWgc4WjC59rumnUhtx!B#G-QDX zY!Sq$t@j%7K)%jhiHIeokbnuKFA8L|t7L;wq{(RY(-g;B5_jiG?%RSNn}AxmzSj}qau>jls-Ud6@%qxUsTeS@*SP2`sJk5L%qU`)JR zifpmaV{F4r@WWG3YGerfU}Taz=iZ@i99f1{&BCG75a#X>Qi$YJ$im_w)#6CDkjJ=c zo-EgbpPtYph=S=HxG^38CIJyLwH=xs<_%HiGZpl@`p((sWZw4f^*VzP$$Wb4IhwYI z7F9kua4@AN=Y_+I^%Gz2gx#sh``rJ+;_DY7F};=}vSrp%NzvQRqV}@Erqq@1-7@Dn zu{7Fnr>^qYz?{q4e1EOTnmekG=Jwt%8xyM5*D?m?_n3VhA56JkTeRhMpx4)jV|T7! zuOE1Q@Wj^%zIc7Z?JaLYE`FVyb*yiEFz_Z+jX0E~cKxQ)ssmf3d=Cp!l&6Nv*>x@~ z#E-{WaQ6~P?WT&yA3lw=tl6v{iGcqWn-pI7N&pD#g-HE!;S;g{w)KuEy?E#f_1r(c z@H-M${CeTvE8Wp|y<(!C@#}i$mka-I*E`b0zc5n#n=ky^4MKlCVuB#QEVi|!>C1=N zdu2QCwlshJEO^>?X=`iC_pgf|=APXBBZj^|w%#%M@7Lt)dj$P=bT|a=5;tK4o`uSA zwNqBhET>ag(pWa&rqNU?yzo_z@N!xk!^zwrDX#-nFvX<#UyKwrgEoKk!v7c6JNnnt z56lON$Gxrhn~~yg);r}VHk(iHPBMM`?hmYY`ZP}OB>#3i|5T~=tKasYv{+$)zb(86 zbWD1#{W6dD=GfL04qP-j{A#kNrs(da-{$fEM~>&eIFJ81U+}lvSKnh=CpD*iG1eqi zYhtcRhRwgV@ZN)t5HHqZ!-CREC`dqtHys6H)p;(shL|-u&J2&B@@rn>%%{0~~u{hZ$pO`<9&~j%Fw(PWkkg+n|?96 z|C59FKlO2cxXbYWSbZE_K@cvfKp>g?+9BuShgE0VMEQK#TOcDWlDjIsC2^m1_Q6*_ zi{xfs7Uib&(n<=oS%IbHe<^zi51yN4;#?&Fw9i%XkiQ;0o!nULWt3_RK)PKfW(e?* z2>?BwEaF0oEF0t-e_Gq+FGjqBs?pdZYsw!>VVRXxZ_Gf1be~;C9Wo7^B$8siK`ULZ&ere5LdTW% zI_=-4nD8d*;oc8r>1zfTGSi-X36+E@383 z6}WtjiPGb=pO~7sx3CAoR6L?4s)n~j&GKWxF^UwSfdZcan4V)$z_#-oYKMNZmw*e^ z45Oe%8!CiLWO$tW&Sn1X)ox(4ye2am#vnz4a5@r2qe#{Q5P%E?+DuedeDP26{D#Ni z7}oiAbe0&KgP>$W05~Mtz4lP*iNH-d3_`M^I~p*?@sMfE7=?a3JXdH7XS-Vo2>>$3 zydzhk`OHl&A%M`hBi|1I^iIDByV_^OC=nRlq+JrjXh-rm(TekU(Rv(`Xnxe*HIpr} zhtUbKq(yFU;nPfHrchp~*jorYA+28O+cf@IWbBFC3 zoEoR!wk~%`0jtxS=*hZM=t;YJ+og+x4Y@8HOW-;;q_?4{K`M#oWM}q9Kc#!RL-+mr zc6(Bp_cyznHtW6FtwrTf2jD3F9SpvA20&=2e{k;8suJ8RAYwX_?14U$YcW!?I+8Yk zuwc1gmpfQi&{`r0Nd_TCdm)lm%N2zQC2e@fp8x8t(ZB3YDAjy!xmT5K< zHh3PW>hmA0Waz;pPkb1p0D5prC)m!vMr!!kcq(Bf!-z!5D^JCX>wII{8@#yk*3O_| zhHix*pqQxRAh3}K$U+$7=L&XX+)-AzKKEE1R{&0!SKWb2?$d6JPVyS0``2fVON2#M z0(hF<>Jf2+fHv%QqFx7u80YbC+M@q#gif6k!DvO+b;9vEnl)fy?3H_^{`r^XUSN~x^`vWf{ zt5PB4A^<(pcHw~(2LmaSk?A{M3DOSgHo>EVQs(w7?Bd-dxN_;pG3(WX00{QM~}NK?79AXQXip_f<&Kiqc@P9~Gl z(5v_;+*T9c9yDalz|3$bNKRQpOXgXlm?KV+>PK1pE=ULp#ywX#uT+PVHGF4@g0tS! zD5!|f8wT6$yWS@fD+=2C(Ca}uAPa|soe0ZW5=#v3pqflxtETXlh4=}b&f8%fnt{cvo9xg35;%Iyam&84P(x01M)GRVS;GSQl^@+lgQ?8 zLD-Z*sZ|ENcC2uGkmCZYgv3+DJ(xcS!NdR^4`Cpg_*)=Z>F;;Ys#*bZ|K%W9?f)zL z%YR`(LidL#|AWuKZymJ%RRBYZD03#w!RY18xqti__=$b{SHL)lo``f;Jniavv|(4F ziZZ{XNF@vafXoYtB~eFlhT2dO8L<7QJxwtRCNeS=iGU`gmZ{5h9S2}~E^X~_Fg>3o zF5j^9iuJ&7ZVPP8kS(T|KZd7BTO6lSc~s0AhV;U7lxYC5U%%VE#xA-{I4Ky83W6P)Hmd7WHNw&_Cm6JT8+KUR zIyl|4QYIs<9Sylc#u(k}ltDey<=S;8FF6Ul;f498W z0Apb0Kiw&z#^Yd&hKnQYU=`nvCHCG+h9+Z87r3x>t&8O$#0nuzLaPe3fF3WZH8AY& zO*ZI2t1*J#Yn6NFemX_0T24NrXF3DK$aNP)+3EOatmu1;PW^7D6Sr|ghlJ4;tUWCG z$%{{Y19Yo))Q)-j7J~y@U-w!Qcdke>ctF;FyYe0{*LVLY}K_<(fo_;VTE z6eFGLZ*6fBrsgX!_mg&so1bXE5{1<@?dHX46xT*w-|XD#oMfnDsBbAZG8T2?;oYje zUkx2*xKOyT0ONY^ORr8NV!sgcD1JLxm3IH#xUzNtWrNIu-l3u^xztJ|#$g_cLTg@% z7!FOG*sUs}NpI8k|D3pV6dt^9Ez(GZ*SeoG9lV0&BjTZtIWPktoA)zcIUAUZKq;u| z37-?6o{RYc6wGk(txwC@d!Mj2kN*sa!dhgH^=gjqq*%vdNmsL zjf{&RUli$3Gk5(KrAVei)+OuLX%v!H;jLrzRD9R&=UqPVYClht^$zC1WF%|ody&eg z)_Z=lJmGJ@Rkx53DQRvgUmll)ulH}*W7|iZv>Dl-GlAPKC9E(I5yabeaZK{{4Qq!C4zv7a82w-7aqsjv#&$)|t}}1v=I_su~P3oeiTEwQvxlcnX_ToDX5q z3dx2;Oq-^e-Pr&VYZJW5IBIVynnS6DOW8*DQ}7RQRNZgP)C*0?k`f&-kLFz^k;_MX zMa6Kjo*09~9m3`ZpYvC={b`BYGzZNP!jyXhofVns=K-hKz~D5m$e9`f>k;blk#|YT z5ztFdY-0@-nF)^kNQ^nI!Vsy?7K=4xmk%QNElGWEytm+^t*h1r4kZrTx%vhfQkjzN zNtc8CgO7i|74c{;cX(B_B5|yJ7FjO29aV5<_f=}d&99I4g^IKlQDfK9z-ZAT-3|k- zD-nkocX@#?WUg~9WsATZEYltahNJiWjW0BW$JiTZp1nT)Nndkj3GN(k^ z%9#~dgPxfWl64RToRv&y5_{E%WoW$yRkeBV8J|UZHU48tBBTiF)$*XHl8V%$b4FE* z&qL?|#NNS|Xp`4k^4 zS;yIBI{RrwpS0h8bqLD#`8#WGNn2k-{0%X#r8JoXD4Y8t3Cm3Cg0RbDCEvIAd1Q=X zdMUnG^P?($?n_ z^zCI`)E3`lMFW8V%YJXC^O1@mL?b#C?LddC7gsKyctwu{)jx?6#@24qq$DKDsKV`l zC^03isQDVOS9G0e0jL5UprkJ~F9a8R}g zoJNCJO>3=mlLQ2(2{d3G9=6XK*fF*e!Hy*`VK5R@7&KZ%ixnC4Tu+UGy^HHPAB#01 zN;9Eb17N#R@k_ojRm*-bA^iB%yGT`tU$jo88zR+u4(Ak2mhm*BzOKvv&y9KRdS3QH1WKtPZ9>S16{16x8B zfU;vzOaMnnTG_3AGCox`Eg?%&OCvl@Gb>H|Mw-ren%<_x}|BlwMV*5cseyJ-R?%Z!+5&mmvoxKd1uq}E*|Gy!_T{Co%g(P z-h2GK&zJLbg$sVB7yLag> zDd2-7_-BFAL--8WhTQvSI*DHgu-ysAZ-xgv1w*uuq z&`G*9pC%iQ20T6U5B&qCD?q|I1x4V0pJ7nz@}@ye82X~#3lZQF8KR~Qe1q~poxBh` zV*c^v&vxa#19o#2K6xQvc_lz6R`QyKz{%#8F*{GV0|cDkQbF2TjnACD#EA1R$4A9iV(DoP|+FOT)zU zkqJYW4S?dZH;Fdb+TPWOAp2=F6!9Ujv!xML*12KRMU~r9!KtWKT8M8eB=Dw6P@G7X zd1~Kdk8{?&#Bk+2Y3g?fvqoZ=3HFPgM06L+-(2D1zK?JPCZ1b(#duDpM zu#}6eArXSA1F4Lzds!S{oCI%i!xj?VaJc-{EAqak zW$n50-}dW)dsQ#tLb{Q=0Q@VY5_S+mi2e!v$`rmFQA#*fQ2i(BtLT!H0j;hg1zk}K z4K_PatrTDe)Q$Sh&DIQsUM?p;h_#ys4rC_1QI0y*TS>^prdQTKbDZmf$fhg4z7Egu zJai3u)r->h9<7e5D{cAuw)mrze??n@ut>UO1@&8XNw?!XvIZG##_NI3Cy@3_cY_JKVkmmNx#;JMz+zM>^_?LnQg{V&_5(BD7cV<-1BhGhA3K<8B- z?uU|5Rk6|=MEeaot#8FS3w{1`P1kEwlgdifDqRN;lrFw1{VP-oOa5Tk=5rdq1-Pbz zomGEBrDVK)+5J4{*qiVd$6eKyW`8}Q6A8V)Iee~I?j`<$N)evWo3DeezfXM2Th@yZ zbV?kGc-P$;RY?5P2_+6~dux|9{1e$VYPI!yW)*AAZ>W?JuR|6ersHmW|A|UzzVKd% zO8L6*q^k9Y*X3VODfF-J>sz66Tsx!#e!0AWhkSU*PCOa^qd>h4eekTETt9uGK%FOk zToC;<+WEV;0Y&4MgvKg=XJFrStHzhg6ICXgUi;;nXB7yj#dHMGJJn*vl0c>^{+8CV zUs|)q7MRiq8>z!YC2hw?`XAT@l;UHI;=|fhZ~5WJn8MOL@)^3OAAV#u z%fT~D-Bg^ZBy5mdmquZOZ2r~fs7Em4vvYlX-mwOk&3Hi zvT((1*r0$bu`obQ%RRnD?MAr}8el`oqk@JEzqIGu(g5Wtra7$*3YYA7j+DagUsQz? zigy{Nj$k7PqZB$8H?56_VD@4C@D=WtbzdA)cjczY7L5_WU2V&a4{d{0+ln{o>WA2? z-lD}80e+VE>QlE*`pHATys+uor!HpkR;E2biDI9np5m%5R{?gd6h_F;hSgq1oTn0z zP)G_-!d9ypB^Fwpv=S@)VcEr2eu@Q3HZ0jV?4A5{8X-i)0dKa?PQB<2E(i!80ttQwboZX1+QTi@;^cqwo z7aJ14Y6M!j+WMvUYG)QGlaIH=@xV~f(YN+vnTX^S`qtx;!~?#7I*tqq13y+gd@*LK z#Q9}U>LxY-x8=3TxBy+b&aSrUyYbg`uP7qzS#X(N!snw8$?Rc=qq-Nc1JecxS3v3aUEvDjsDr#j`B!>%>& z7H^Zq4N`6{Osgu5-=eR-mX;AwufFz6kAa4CdJ*=ifzy}XfJTG#@q%Y+^(B3qVx=>c z;)?Xmwm5pKq_cyt+Fdc4kl%soLV%czaBe*W5&ab)_V@S3KLKL0Qkv{P)rI_=TNU9P z@BcB@{nJ=;vC3wR!s6*fo$IsHNu>XLZvDf1V@m|nE~rb$KnfY%_aZm!dC7~sh);jO zSa*Ck>{t27h)mANzYwSmmCXDb`ACXX8dw{e*a?*c*}waHLKWK(B_YS>0(j0mri7ae zmt6fz(52Rf$CRNKD7MuXe79rP7+9O>UY{+T(}w89^UA92G~3A6E37+T)ya;U+Hgmvf21RCTxx5B!Ix(n|YURL`lKtGfugmR# z0}lZa_69;A)-+4eg~x0%R4ys-+5=I>>mx9kN&33c=EibsIHs0ngE3CWd!j`6X1V}@ zwG5D9_m%?ZASahADuzr~S2WbwyLnet$*iS^NUFLxZNjPIDYs;;iB6jod})!^&CWE) zaoNp$dosp_oPeeyCpjIN~79RFa&6b~WK4*tD4Jt6N1-4P>Z~26;>$fS7hd7MFi~zJ|mDqQ2xP z>?TCEk+8ZG%OInfbk>S_rU<#)5^@lX5&<9xD=tKo$zfs`gV6!y=UuFkk3e#BI|B?xDf%#+F`B0>LJ{&tnP_`Fb+cky9x^s9?>upS!zl5lP zAX0p353sVEj24p7Btn?cExJsM8W<^2%&0YNG;lq0FA}oHw2#Oe0{Ay^MVd@|c_SXW zKKhYl`*r5Rv%3gU4iAw+v(PrVmvy10U5xjlo5bh)T^Vvk#R4o579WX4Q9$A58FT

    B?*S_XJX17CW$XRwA=K>*qXakWTEtBgdia(usLTGp~!*Bd*@@_*c=0Cd`$0s zMi$I03X?*1(xDT8JKx@1sp35nKFnA8Dcy}b{`Q;FhiMqB3 zyE*-_?sDm56G=$0TAt*2)F%Z#3oJ83qnzq5e0U=6ySdtcKIL_kwc;L6gzDX19(QqD zJJg83{SG!C`nne4&=Gz|!G(#MfmZ;fg9DAzGS}Cy;z`bIszNr9eKasUNo(>GIrpjN z6=t}T=h+U->vL#?!zcnfSh=)E7ivti^cyPNxhg*Pq7MoZ=Js%{NW5XYk^7v-m9gQ~ znQnQrSBnfN>&$oGDu<+D6#4*-p826UcQF(%ann@?XgAKokN8e6V{_zCrV;$`nYQ;J z1CRkC(F8`M5b^_*#o~okaOC}Wm8Nrk^ml$S7~i;k@0#lHUN_~h2AR#tyQPT^h8xLI zO0Vdwx;Jgh;{NNRMB2y6s|VY}*WxHx966fEVu~pVi%Wh9x-1RGJN_1QSsIFYvm)g2 zl9l8)0A@;tY6S5Sa)`g633z$0)6o~2<( zLD`u+gaY^&Ei6-n!k=GIc73*|qt~^&XB-L+*0&JI59NzPQ6ST=bGL0ChE!tPrh70a z)gC_FE7g&>NAKv1#DJ5I#ur96K($TiX&-)^zfR-80sh3J8FkaEy^e>^8&5wsu9sB`&5K=kgpN;`wNmM#L2hPR;`1~+)Irg>LbLBLX=fWpiX1h2Ve z<$Z4X`u#0aqKPlEb+KLPhai4y)3p5E#V)fS?@m66)Of>-v!11hM{+uGUBKr%SBiB- z*l;|UA7>3lNt_*otGTu=ZEpDSk$bjze($fb=7zh?Z;svl`uOXQ&%EUgD{Uz8_GCYa zl^hmAoA(WU#6nM{xI^SUAWC(ylsMnr@~Qsr_cte&zw#wom;XA}eCo|ssAOul6~2?4 zfR^EWxEq%QJSU6VI&73Ui5EFZV!||;La_%G&lCw@A~KoSVy0LFQ`{s{$~{stEE3F& zlxT>QiH}qch*TVlB%q>J&PJ-bN2vuwsfR_OGDX4#kgN=d0u3Tg0}y;*T|o4u2Xc(P z!aor?iWe2enyuYgHeoDkCd;mYT>jKF2bsaiPM9b7tI$%(&x=F%j``q0~4i z7=O|vE-F4gE+95$7BaBx21((^K=BET_i{$4SjOIHllbV*@^RS>3Bpi62bGvR7JH>3 zffbf$LX9&nPAm^g%$QB!b|+R)6E7DhUd@axodrr}6R*uC1-U0(q()!uj#wX-yuSE! zUR?6+#rU(`$pf>=U8pnunrAwxXGX)$^t+!K&W!HQJTq7v&Bvt(4H;7bDc#*??#!Nf znR#YDEcw-9{9DbGQEJM1YW!m6*`ypgIro~rUC6|az{YMLf5D*q|$@9m8fl6$FXCd8v&i&jQ_nh6}@#np9e^|Qx-`gAi7)y8geQ#_OaNhs#?TsVGGfsWUV3uU; z>AAr2$czoo)OmR!@Swp0FF5FW9u&zpzWODbYnmDn4O>fsi{P^ZsV1sdp%bxZPov_i6>@_2CakBL(D-CK zrtxRZtdmwI4gg$I_%9s0NMM{!)dEhc0lDD`{V##kge<;7-rnVsaO z!gK(irhUK;0dzYLVNZjGJw*`lFayBmzAa}58D_wPQ9oUTW?yF7n%DyH?R3g^rZEfV zL*~Mr_^{(hcvAvgJR3#^5mO6LG8u*jb}Pz3%>cL>34k$k!meDVy~=o20y70*6L9zj z5IPOKQKc@IYBAg->5>Tq&Kp2G)C3oUqv31LAQ7rOD)ekT&355Tto{u!TO8@Q#t zW)nRCPNbXKkzH+Rr9$vbxgu1GbA`Z!TYxZGvI!Cl)aSzWNtHY3 z@U1i<^$wtL%W$=}hg9>X;uGE^05Z&k_t{l5#ivJXT;*rT7BstUfUv#csyx}my`Xrq z5q_$}*b9JDIaf#aAl$gNrwgubX5?sb@`P=)cMRO2^h-V2XBiMcoC(~tgM)OK5f5r< z2Pfd6YHV2hL)VAPy%mqOfss*1Em{zq?!RX@+yY-x`sK>j(yBpC0K)|~^I)IGfyKmH zXN)|{3ei*=M4;E%3>rT*gnHoNyN>MBCKVd;xDQ_fVgiIq0aTk?1|yr$0XT^S+e$Cn zHh9rX6oBx6^+Jrfz*x;b{!o4mVGyQ9gUK?uWH_Knf);oJYZ?2*4Picl(qu*0eUEqo z9kFeOY|4jAg3z%Ns3HHxR$fw;W?e?u=@UtC-(HvqrY^L!ak}KRI1Rd1Ol0(pFHJgKpxH$xv2DGoaX}=$&0LNA_JJ>vLdzYqONR+mlV( z#I0dkgD?+vlzA+V%%nX_HTy)$H(H>nI5l?}L{g-k=^?whycu^HjZYNiij5z-w1AaDxL z=}ys&kQL) z8XA+5m)QYV*)XiWLPt?|cvbGO_G|6c&BJ=%hdIN;qz(7qL#!81Dur`cEo*YXQ8w;);O8Pz~#v5_oGRpq`AZ^E<^Jm5wsiRpH<7ZCZcN-nQ z+%w_la$} zW9_d;+jdOao}BE?oxG?!*0*Cc;N-)*D@KP_JiNDIGT6yhl>X?!>yeMk~iEG(Y6_&jqx^~^o*nP7K{W5B_-0PmM*py_6I0DCl{FEph)I);&x0kLxR`3|Z#^0wbFgp1BeAk&uDo)tK`*!5$5v$S)s4zrYq`FC0m+9Mz(7X# zr5`X0GTe%f5Q_Tt_rZJPan>DY|`FQs_hH-bWS|-6u=hn>Y(ixokub6EGTtU9>i_ z1L2Z89j);Y3=_72ZA%}7o!aB*$c9UCOD5pRO+vh?0J@d`I(vBzs(1;yjsaK+07W~K z&A>YkG91B$NpN7|c&OH(-UbffNP7>m5q59)wrU~$Kxh(Kd^{GCTiJ?Oh7ko;_*+{L zeS(uUu~#M4pC#ZC__q~Pt% z*#C>YH}R)x@58^>T6@ICHj7UhA5&5lmm&=bv-te?bSWH=XgkcG0gM*ffpN0zgCBW*Q4fP{K(u zQuxVl$iwhSJlPECBwEpo&Io9pWjYV<-Ap7%IRIv^bX+`EN*I_COh;P8VHPt0bc?Ph z>mo4>0cjqxl;U-u?T{Q(jLJ>FXhW}eZsU^T6IP_M4VL@Qy?Rt*%`w0ctd^6rcHW<` zE!c70_vOI-*Y?G`*T%>>KA7B5?s5OxzQG4mgQXYC60*foAMV(epm^j|U^!t)hS99AE2(_pIuYWJj0 zQzj&w)5v&0x(E}z#RaQGLFyxTA_dt1*1a(e5pg3@v6$7*pOq&Y=hT;WcmknZ&1!o` zjMKP_w~^KujD=HtUvW5kvgd95%;b~%u5D1vh>yF8I~mYQ1+g`6i^wsRbZu;O63=xJ z;~ps{51GLm-fG~$IK?fYp$JOGiHC5wZ((6WK0`(COie>7C!*hAEVP5CTxH2(9rY~F zB-{8fDUEjp?sT*w@QUnw_G-hsx$SgAks~(w*_!WdY}$ejo&vBi2L@pwQ!ObZ0F;v+ zOP9tfA`B>NmEcY^P>|#r62ayc%!$^U9nfI%UYfd2xWcWZ7IAR}Ak7oc$Qxg0;uT}l zz5I|rNmt;CpWm*dgGUl-ZJu99xCuBrNJFBVP7*sSpweH26!r)ZGcsn zc&A^AsRYvTauSKH1Y&VePitGU!Fbg=QC*CMQemO6L{`r9YB4_ad7Q zEqf`O-aBO!{P6%g%-3&s`sw}3h`>qCLr%IL5rpp;R2sO}ltwNYXkMWrUDv3x7gew# zlh)7H)yRKn>uA)QE|lFb7nOKuOD zsJQjzOe=B)q++^0!bD?ws1Vk2ul#74id^)Gknt|MI(8{v<*_mCjQ-OQGP@qqRHRvG zq=hv18u(9*Yh9}b?zze}kZWpjokK1KK|4!oo98{T4(R_ zsQ?qbS61hCT-v+x5yk|@TeHGs-K2N}O^vGWo;z)E2X#f7ni^ZjWx2Y^J&H56*l&G4 z`GuRphR5j z*#qml0=M~RZ@>K7?SSs%&)Wi;x2Mi#Dr~3-v@COO0g0wCWIk<);B8R6jJrN>5S=M+ zlg6{p-EjFlJ<`}FUFi0K&1-4WSm9@Q-ber^J#EDbx5<=|^Dx^QWF4Pvlcl`RW6Q32 z>%?Z8>^0XFH=5W$%0_Gu>keC7d+d{8>UXG9F?JApXuN}_v+BFqqU;E0o z=(rr>aD7~2IbvHJCg<(Kd)y&={(X@cQN?xnfGpwq8&LA%^XA zwte2nTIs+L2?W53)WymHIA+84*>^TK7d9&$9~^wl7B#xM@wPpYx&`482O#rGAoOnL zp0CCZIbYYh8n0uxkoF|<`Z|Yk@8<{&zQ z?d!A}1aR|<6Pv_Td#qnI@cWa&Px}L50V)9b4`an!5j;8w@u$;6weL_jYoee=J~Dzq z-7@N|dQmFi2~jwBW40D4n}Kc)INcQ!`pn>IjIb=bzUVBYAWF*%-#5U$V6z=M$vK6m zY02I{tKaKKA0xYW5V+Z0OWgj$$R!|+3xEv7A&szVO&5Ua8QRkBoKNl?_Sq8Iz|+U; za`fuM$3~dq9UfB{IjTOlH5^LB8v(n0jJ5cjL0+Vo$-wLSLziOVxKrm*vI;jmU4PAh zjs-TP`Q1?JB6rFoU_|gOnFO)gwcE97R6?NmdNg15`J4!PAvyd=A0uBDRvV8ck;G5) zwv(Yt*CqC-0S#i-U!b*97C4+U(l@yEeZU31_OOefIFrhx>OBM34?{pa{UcPntV5?Y zq~5StgIYi()<~ZrIzJB+?x#wNDYl6vIZrBjgG9|rPS4EAK(t-CbMlJLu$5eZ{$UWm zf1T+CiKW#L)w>=%Xk5(a#yMrZMHP1#G~gBo4lhU2o*p@-4{9}>l5_h8w}xgQs7CXB zI@!r1lDJ{2-fO|;S?YsLumMJVI+#L=EYZw)mm{VTD}ZUvNG=h4=bt*pQ^fRF(2J{L$)B-tGT zSJI#%F7WDcfG`%Cu1utegTgsTRAfkuVx%w-y27FQ;ozl2Vn|LIXR-m_9#XMWLsP|T zS+Fi@{epy9$cp0i%^CoAK&&b~L{9+HfdV8&Eb4A%dYRsSq%>R)iXV zfd!=cT~{bx&vhuIxwuRvK#Lo|FlRtz%z8bh+J<;R#o1M|Fr>Mq%zm;I!v@3@F?bAO zFI#401_;nYB?08JCjcsfa%6CM&gMBk07C|q;Lv7ggy;-_FRnB0fwDcIjm2hLr_G8U zw^Pl}vnBYhR4dhMBQ)K#%SvTNQoNdtrIxSZFX}}S1Lw7#EB10$2gGRjq81Zx{`%S6 zGDt}svtE5x{RE|1)6g{3$kax!Rb9w*&ETr?=-VeJo0q*Hyq6KNap!Yr>}IjUmh~QK4xB2U{-9wQ>xTZ zlG0v^D*Uw(EW5nCv;Df>>11_a_vtNFDIFyNE58|0JeRbJL$au+STv|uH0pI;?A=n@ zqkyF$*c^q{7>l+Pi}nJGj#`UA>rSzeG>;U;JBt=Qq^)-;TYFWyB6>SdM_&-Amw({B z^Wfb*OXeHlor^zuWoLV%tlnZLhqy zjRtSy=HB)^W!pr-wvj%I*R9*8hPJ(#-1c^H+ce2?hGO|n#d229a?Zl?y_4mK$!&w^ zmOjSvbBg7Bf#pK2OYBxUZWkTDi{96?f_R3` zb(zkMW{=#Yle*}bm&40aGpeK2ZCv?dsbrlO6*rg5N*s(PCc=$7w2gUDT49*@w5g4 ze{pdm?A95<#5gXrd5 zV;2-aV|Bi@QU~OgkpPqiJ!y*olyQ5o7h0p5fZ>}vaJb6m-vi|e?~(vuU76V|CmW?a1mK+0|SGeeoL}222W#!aR<%blpp44rG<(~Opd4)|?sAf~SC)_S}*nh!gEVcipzODw`Q?ePK)0Rt>MZ2k3#__8;f zalGs;8WX#WH&*ele?c~eOsN75fEas={4f?MfkcggHHJiUQ>o1YSksl6PZRlBft!;Z zT>$>>;~-XyRLRDQ>ZnlbVn_D~>kA00u)~P>PpAT67+9|9?4x|Q`!!!Fr`WmMW7(rU zL=uc`576RyHmx+WjvH+>)ZhjI5*yoVtB)QGoWBMcZOrasN&DUl z5kZ@O6(@jO-x+|GAjT%CsOd-z8L0s^)(sx26evXmXG0Hcl-@8MExv59pPK>TsUQLM zge(c>P^i;5rirkNpaP^1Ib$z~V_PGNxu3lP@aDh-^PbQ+ch95gGO5_yY?WbVnuaG^zom=` zi**foY>1Xn6uA1M^+xb4vp)1d>qW%80{oygb zp%?92%pa5{y)SUzn!od5byn;HF0iWlywM}`ht&h`uLX4F@BY~SunwJP5Z(gkgR@A3 z#EoM2AL%m702Ps+>HIW)N9QNnN~319{8ZOvx!fF(e*k)a5MNT5%N&VLQze6^rAn|e z&XQff=TG_5I=_F%M3m~I3&?;!qx1VECL%A3muRk^7g{0LEd&Esj*Q2GQp@y0uLw$w=`|3oGyqP&{;dlH+4GU1SL9Uvd9nS@jSM3q zmO@Pc4wL3W;1jJ&Yv@nES?H=5UIuIo7>-{uM~x&$d1SfdW_UNufrNrTEo8y3hB8X9BfU@y0mli4t6nC!E-e-BLvIZ2TFc4A7GdywnX-cy_c9mj1ZiQxg z%8GC!jDr+#XXL#2OC~&=dv}{F)8R^=LgB{wnR6Pk87tn(woZJGIuX_+BRy3fOVWuu zcf=r5YCNFMWT#-9k5Z=WDDmpn8|Th@zjIq~aA@1I^W9dmklcbgwZ$UOnsqt&rR>AZ zHhXk?#kRPI2B5TSt?iA!s<%>U-!cW~RO<-$2D#-pyv62gr3nZc6nfRH%X8;!Qh(>a zfP&F7Oi77V=JwUXJTz|1QHTv2Tnt$sfb0$+B?7+OiWf@fbT@v<{d09a=zYF3Z@$CN z>w5cx8`bX%8E5jHMt`-g6Hdny#6J{AZY^*X>*#OR`B1_-g9cVF^#9nvbA6j!KnHxk zZ{US~yU+`9x3>Ny=zh_P=YkUd5p@4iPL-|XWpM{UIA<)@T0 z+1frJkCCz|3FXI7V^8rr^^+k?(+4FSH(Y>t6a5<`LV4g~GE^L(#y~gX&WDgPzv>Qz zq%BNSNySnb2kRDk%{Vx@Rt6RT@0h_w>axYYHN<$95uYqo3T|MOT16~Ju{}mO@dKU3 zjo#(v#r4GG#iF{v0cDKf?2Vdf5!hYdx7Ak%fJK~orW>(hOtOATPw8+Y|0*)j%&$o* zQBC0i*o{~nCIcqoVStf>1)SFwlc?l|+lLz@iXZ9mxf0VwUOWQzQKuFm-?Hv9X8;Lh z98>VxzQh1hsotzsDi=KRF@;x?Y(fYRNGHnr0#rEq;J3dcZ?bi?bcFY?K2C)GWWR)m za09U7q?0Q*1R#9#Nl`8O!1zkap%%sS!BjJlefmlE_>MLe~`$4@4hd>j=c*UkIdPJhI4 zy;wtEiD|391%G}0bV-m5f1B=()nh}rRv4p23*k3nW5vce+y*_NLNQd_>ehOaDh zB$a5AQ%~eJ5=3L(IATQT29YwPlNs2Sw{5m%`+Qv;tbiBn#!>1(Z;C#BsBkXN;ZmVs!Dd(4+ z(%z`uwVLjuCzIN2TA?#Ab2gweW5vhTmTwC^Ldv8P%>F33psj6N(7W@fT13&rtlc{4 zU3`v3mXdv2yIu9W3&k;6DhJGd%BgDW*ggL)fkVosMf_Gy)z1pO&yAAgVcA!_&*MW( z+U{;u^XJ51Awb{One#|%zvI1^DhQl_8(YFdAWo+KdZT!CZPQGynkx$uhm?| zK4Ua3W+YPfZ)LFUw*uIj*%!$vxv%~rgYE2Q00U||k7t5TXu(5EsXhQQBp}e%cL3&f zA@;1o=)x%b#YS)m0Wgl7;!r`9XcHzRMWerj2y;odiRyiHm?%c|7)RmpgJ^N~pD^T? zG9m-HCOY|3rPv`d#I3|+gvAZ&Y(cW_Hj}RvnO&^$seY|Ceywc0yGQx_ta=Sh+|$Qc zUHAEoE{1nY@$~8{FoMb?IaRi+HE?}APHUQdpnIt1voTqCmJS_z`{m zRG8oFsD#CcL^kmA(OL1I*G=5TZ&3c4grd{ z=Do|utCLi#@8N6nS|RwTYb)HS+}aD5dCv9jC9=o6^Q)h!J}7!X(d_cRnlyD2vO1&G-8*o?^A0UyY58mM zs%t*VoO;pkUiWS}5ZiAKpNTe6`_4FCWdj&tIk(Z4je|x*Jo$V(Eurr7SgO}o>sRE< z8>`2&Z+%@qQC{|yHFbSGP>iYl_-5g4HD>kVblqFN+L>E2d-P^HS3a$sZBSmSox5XV zsdv3)@18FoI$j&sWDiH|;d~qkvpo6vK*rg+&l5%8Y@C0au=3WY*|JUZ^GQ0ilcTsX z%i{~vhL2z3O*y~wx;xpZL8ty(<2aR+Ml>;P5KNk8Dq5s*+qX7|R!^Uz#iWrAm^Mlb zOowZCrtuwXZCo)w9RZWl$qyn-o1`UXB26vQ1ru7EdDlm+$ocT|`7TeG#wE?xa`cto#1#wbN{BT9k-h)ck4 zUVoT?n&;5Z8=1EA|CG8=wA48t1^+&Z&G*BjSt4Nl7h~@f4)Ox)>;K!~@q60;lb;wF zKbE@hY5$WYe;0SHrtd%b@q3`C`K5Hw?yn_1MpttNzQ`Bz+v7ZKV;rwXYB#v(&ak8|l*OZfI-@^cLcY7=I_%vnV$uppEkAcwo z%wnLdTZh3ESYHbR)mrK-pyKp?U772ebVT)Rn35C*SO|TM5I0hKkef7L76;FU?m|W0 zePiJjI~Q3n$=rsMACns16VAVhc*sz2(;{Ot@ttus463<@>;t8Soec#D;)AYOz7^CS z2nsmOIE}1G0@yd_J?8G3DiqH3TCAIzyGJ+q_fP(}bG?6&EYtMA=-me|>raP@&=CwD zKw}X^hR~!0kr@5pXV9G9@AvLszs15VEzY4>m@l73ip>io zYyhN-G60<2x9?o{6U#^h%@c@a^6N4=z*Qb9y#c$UwZ}_TC?4TJDO#-j91UPiSPs!U zX#yfq*kL3c3I{2(mpBd!sLL{d5(mMaaR{(@ty;Nbqf#MhGX?RdsFZXmQQM!GM%@RJyh6Ah{(V4JeCuN_gy%;eNI7!+>|i)Q3Sv%P$`GyZ^<*CZKKm zUnH^>eVv~?XseH#x@Cu4nko8l@(&;O&xi6q)wZ`9aGAoJf85P|7pwAZKEl5MH@`i- z|C5jKXJS>*V8{R4^ARipIX__EzA734Qt`h4-2D3C`)_Y)|4Ndx`b}3GRu+a&n2ub9 zz+oUkWN7kTf_jlk65u|sGS_1y=JR*_-;WVLbDkngs;=<&)KY#xMFO4olEJL+7S}6( zbG0ST3;q09_)qgI|6ipBe8j=vZ&OSE`mxae7izy1wlJIdRTfTL!G!?nl;!R2#%DKr z#sZKNbv!e6x4Bhzl6jNIzcUfh)mEOSNq+IhrFi2Xn26@0AP<(zfv^QAXNj|$0b~)J zILes%xPjN`6_Ei$YEDw2Ja~XSg=-2Q@B*c%R*gKg7eG@L{DQNYTX&2M0k=HcfpQyJ zmp8;Uio@tnd5*^69&KlZ3Q92?QCWvKAPj;`q>*P-tHh9}$JlEIr`A_|yJ~~50ECH@ zrZkXW)v=9my?h-=5s8-X1KN;)CVny#@MdE*=`b1Qa14mhr)n5uB=#66x}`(s@TteJ zL%X^@L@~e(z+EON^~rPYf#bpig9Piv9$^s|`e=8|DCm0Lsp95Z3_x?nl6S{^k!kRq zZsN4s?O9^z0|E>b;O?YRtkv(*|9I~sT~!7ksJ_VJ3LS^!2r3g#u~!ATesJ zp)en|r$-3N1q{`Sp_y5 zbkc|z8k2UM=HVb}%wS?-?nvR;se_TC0Ko<%8U*Y)Cwy^(R==e@mH~(@RSq|tBO?%r z1@ik>W@vlEC+CiHj9m>79tV9q=2QP`Jp%+%3E^os7>*$~b0&Q_n9}W0&rw{q;;@onxzNx7_&mx?RNul?xFkz&L)&q#W81wP}628O}3rNo!vwP0nRBA zx@F87og|^dr2s(%#EWT5h^=NJ6gPo$Ih zPCOAC&CduUP#9fg_YmI~l-4I_X%L0!EX9k#kQ-W-wo>Y?sf0u>Nws3a$|h&haW|sy zKqXnL(goZU86v60qOT}PW0nNFSxCIXQWq^)_(Kk4`f%8?PXNxqVGq%h+8xkLba^Nl zsdKMVuw^+&H2$>Dz?F)XWo{v^fm3Jk_4=aU|HK~A;a)HaaW`JAq93Jiu*?TPB z&cX9sp_WU(xe4kva-w2QNwCY>YP z?3N6bB=9#UX?aY%kNNE{o2TO*A0qG#vj?rDULC}%wp0Rk=`F&*o4 zblZ?0whAB-WriVsVK%VB{k@YSy`EQP@Xm^xf*CwzKGTX6WX zr_=1f!;0)9g+8h%a9(=XodgjY{-4?dL5&H#P1iqx-1+f#!{}t>Zp>79MrW zAFa$SoZ4eAIhdu!Ve^%~2@O~n8qQvuJi7I5(BQ(8Pu&%DAG_Y3Tv&Jt@KV?YKB1ey6f|UH8n{eo23tO&VN$rG2NW z`&jpE>cZkE%wOFTv28A0^2?a1Wp!^t_uOyOpPcz?`dhYrC{6w{>26sw@UZ*CjhZi0 zjB_=6cXs(!8MgKvy-F`S-SwaJC%vZ_==<)38&KgxS92NPx9%dp-JQsYIq&G1X+q0i9Sb&`O^@+s03H3 zJkum>?_C1m0MuD<#D8+8g&Lvq?#FGkUptz?1UHGbsLXb1&gPX6j+k1TN(4H%a#1%d zsFe4>VwWTC8Y*;^$!)nBJ9lsE$H}>S1}0tpJvMs^-}mk~sCwk#M#rhS{t)^|2=3{F z0(64k;uJza|570Jgwea^W#@;_e3T9Txb%w&{>jH>2Wmr1R|X0jw1H5{X)jP<@7eXu zNypw)jh3ENn;*NLluXGmzl&g1JBooA?i3*&((s~Ms zgk$}67SF54u zE5<1;qcrWMaBU;WC)202c#QFB2kyOkcLs>v7YJJaZY8DzL;mbm#{Y!|uvELou z*2oXXxEt+V)>zrB6^&MB@8@EVD~+|AOJWXZ%B+}5G}$m8d+tC%#>&^NCi;B6F?b@U zLpx%92$6$1H5Rslc!;n`){Z6TiQzWU3{Vm;b}@q5<0?&-Vp8yF7P1L^Z3vB8BdcAMJd`ZC}xQB;TiN zVpm}`2p5Nd8K1(aWUEMw#c4adGi(~s{*z{P%cJ(4A4;%_4LEhXDsBfvaAg2S?!t5k zuRpaQy2O+4fEsPhFc1cFFo2FOxo62^4T!BQ@IBTs_+MKFv|hZR7B{({dOs#fSe{?x7P@2zqoN(2wlvv!-kVS){bp03Oc?8A)*eLmitaP zGL^7l_!<9EQ$q@j3^dtPVEi~ntKgCdrRaxX4C!saY1ZI-olo`Tv(tftj-irG_J`;0 zhpqhT9HoaKw(QerAGU1zsN6MJJ(`A@hM(QKXz*i>%pZRT?k(}+t%ELN5dLe z-&}N3-(uH2NL=VjYgyxy(T(r;=6e&jX(ZHO6?tuSirAT6fQjH>HjD|zid#LE zdKfni=-(&|!>_AdH@SncvVKj;Ro`l8ih%je~>%D(Z_ zDYeLbd`EH*)=s!iA(t(kCLXQ$Y)d+bY$XF9&OdP+Qt=JEur~JTm*!ef^xS+GZWgVN zwQulTt8Z>OYn?nc4DBXtOM8C0Br;<|x264}v)N?^4UrbOrG@ zC=YR%R-V3jGwqwTv5-_TQ1#viqkpu|@2F4(=oN9&*W}1amm?2FL$7{Nl64PVU5{pQ z<3Bw-Q9X0Qj^P*;vk$L$8VVO9=Pt-0|{0KWh$N(1ci}0#`MI_u++AwyUrVm}u3Nq@K zEIbe#8gW#wnMrX7vq+242oIZnu(8G@utQvkKn4m#&$@>nygVAH^FhO2?)d2gf@@J` zCkV8OLXRDUZ)tn7S%5eI9EMNme{|hxDl{U_+KLZ<-mEY7DbW69#Bz7R^*v+|25S3u z^Mvd_b2VJ*nDaoT^G0zY=uxcZ4Uf`*v#%7as}zw9V5D(==$jXbG!EPS2A zfhqfAmu)@d9L}SeM!NT7UNrk7WKhHXkoZUDYx{Wn1lJwMj$KRN{B`Vt->L-cj-$=$ z;d+55C&IBtoPa|nr{XTg7efh$cO>pMW0ic08SRf)mE}9B6{Jpt@DcI8RmUAY5);Q` zwL}BVBZ5C)NVtP%hCTBYT@_juckI%oq`X(2$|k;_Ubu=CPo&j&Gm zqk)p5XQ&+U>r3{oA0mC;hzIf{cn(yhZnJYIHh&YW7&dun_j9foshlJDdZnuMR~DDK zAfrlq$Nax6bGmPQOw~*|GA9L7&7Q!8+YQHDkntK03?NlIrW;3o^jLpw1Vx=(5}8kX zg$rL7t~$4t>*IBT2MkCO(-UlW#a-e$32D$ecvd(V?Np$R(O-8dHu#(IjHBC@q z5!8v+!g*O*x1*%9Y?nLZ!x@B7Dz`Ta+)Kk(S11W!06P|7U~Lnslf&GZ6CRWknUoV< zofEU9lY?bo5)QD`0)aSZlz7dxvci&@WvgwQ3M-K=e{V+6-Xy6gR`=q1B9NO z4?#trl8WZ5ix!i%C%;c6$*79b34vrTHjVojhiJ&+(xqYfUKjJ~Vg+OvJ;vN~P2 zI@7WGLgSiK)8KM>!U<0GwZZD*h3ZntnsVKm8;&)V$7`ySYiet1>IQ3W4!W!)6XTr0 z6?9eJl8W}4+D@Kq-h1lnWw?5EZ}vIfd~p0`fAYA68);rx>bNOq!y%Hp>s^@ENEe_uLx^N31=`K2yW1TqoV9vS) zCAqXZ(h!Glk<;K;N7kz!OI8vMt`|?Km#D3$4Ark#tfx{Mr1ctPof_nW8x&I-lxiDP zh8ols8)%e9b-hMSr$(*dM(vbFo!Umdp~j7ijWDIjK(EQjsmVCF$uyWMxFsN^C8)L~c&O#%VhciP4b^L9I<d&cVKq5y7fce(Z1 zv+L2-#ow+OesT;3LqsL+VQo-YOj@|s#8?K)SZO>n{#REQNsnZ6k|qQd63g2?zl&p5 zHY<1#9aUKQBq-ldQ=Z7D{S3R%Tht`V<6Yc}_wp_gIECppyd|HkV#Jl>`BFm8C0S0= z!@Fk+Kb&1}Y~(?Gp;|c>G;8nrG2yWC_`l6LI z6}mv@=fSCcN)A_^YZBX(Gi)ekDI2ey;=|8u5Yk~5m)|*d@5@J6UZ$^V^a@WOD$Tg( zb)XUZX_rp2(%`PZE+L+j15=<(%)*%Go3972)a^}qvGN-SsI_w4)SJxZFDI}i=bIek zj467{RODvge4W!df6wtX>If*3gP*2`ulV};2S>nPQ5F4V@xiZZhAaLX&G4ctzE_bA z33I>~804xF4bKx(zunhO22rAe8~&#*tZq!WStp_RM2(L84)Ck z`zIpkPx~J#sU~WFV?@xup#!!8IsT)ma{8RnE5Gk3Egx@_m4^;V0P-n_l4nk)t7~3v zS}Llb$TzkDfZd@>GOr8D!uP%|e1-^h8`fffI_~?zUVFg8jy})7GPSi)ld$A(?ic8h#$eX=xPr7dqDdPmU)D}AR{Fam>3Z??FjT&3H076~B)rmpoc(_4onzM0S=laX92iK_A_JIJ zL1qX>N*LxqJi;u`NGG+WVT8x1k{k+2^-P3fvOL>hBAM~5kw>R?7$Zhza**5#rIJu+ zOC`O&&;?I65P{K_7PxsbP#=PJk%2^BW&r0>5=13eK0X-;2y%}xt|juSkPT9D)Hve_ zJQTW-;Ck6u4mjoesE7~qf(8pJNYS^**XmH=)mJww0&f!EOQX7Ayc2tMqGWM> zIHaP8YI)=j4!^|vGHJ%*POY5HBKLfUOB1v{O&ju);F&Of=Nr*sygEaYp?q3YDY)ML zh6Gfv45G5A;-ljpxjc;I?5MpB+*;Xg2|gbl{f=<=>o3lJ-v_n+&HtOl*&dVCUw++9 zyV^J8vUqVns!k+kUV{z?&_fa-RHq2MOI`)1yllMj%@RQRHAVjaS?_!gMGL>@B7Uy~ zK*#BCOTr(I(3wYPC!JX@i4r~^k)akvjky%;#%OD0g;!CC}H>%pJ6Jxbi6$QsYtjH6!t%@)GV=* z5z>+^2&nUl`CAm{zL3^$yz%%N#q)-an^dEaK#Yn;jg(^jWwz)F24s|SHWz=7h4xzkJm%J#`f9>xgNCao{|^%k@) z1CS_0&-WQg+%>QN&(hVu)$&)o{a=jJEI0P4>H5A&JOtRGSPxNg4C!YUT*v=roc?VK zE($e?n*b4#EOnjm52ipopt1_pMgQO(;{8qK5lQkF_2wT_;P8KT-2b_|l@$>H_A&jK3cX7SVgzj4oVO?!~{5)R2 zfg=zv@e&fFur`bFQhTnIY*Qj($rzGTUhcMPiBKUcCcWhL=Qo3I+pO_=8ad<+N&~O< z!-Cbq#-vUF+!;=W_%;Fp;djNHt6-vGCe=_>KZeB=BN{PY-diQRCgiSdCL1ZYw|4d? z^6GVI-gQt%`>;Ixu-4$Y2Rb4{j;ulcegudh z$Pm18Odj~1k>ppEh}l0g5zX60`6W5z7aq(TlRsTEGN2sg59yBLn?xNClr-aYM^eh4 zR2P&WX*V`>*4uG#>zkP{Nq|6B6=}1A0dQ_?T>rAR#_^D0R;1-EGB)9;T3-34EXxjqe39>K#=8V6Ji(i*^dM1Fbs%kV%$9A#H#J0iBVK zWG^BZoo*HN7WoL%$)x+nEOqfU=R5F{K6qz@?W*qcfY(l91==eYY`hJV9By>m%*%wlUEE12Ew^@`c5Op)*osQ)R{_9DQFMfWZ0I34(OQq1DL(A#+BboMt6$Hw{zbsg|Dyl+ zcLa#3YYvbSdO(+-#N2f_55aiE*eeV^W~{5!{aX+q{{dC&2t=gCJ_D0j>`&9r4zwFl z{(UF2v>_m>@eh?_X$in94kK7mcV{<{@?W{MG#~s1yZ0;?^7{ay{a)SdfEM6HW{InO zc4B?{3XDH{MDd$3PWsBduX0CIgFmcCBObJRIB1{=Bb^;4NCq*cMs(@)P&^sp+2k~> zm>E|Jhh@nc48YkN89LJGJXjP=uEGpj1roFYPG;WGC36nW97WoS2sP;_VWboRELpLi zogc}of+AZDV#t%lQrsvn0Qy7@D^3?Y?arlX(V-FF86& z8^Cj|`gxtQ@71Yn-M5jF-kfkr(kJpHzi)iv+d9$<&M97?sM=j<)sUBJI>f0~t6-%j zO*DB)8IhG?ur6th(a_6=$Os1z${vj3og6s1902hgyxnM?Fag%;$6GCkiUw%)c&fIlC8x?w*vMfB**P zP36^%(oML8$Ix1%(J#o4f1X>pJ#2Y9y*qQ0{c0z_k6XQhlO)CCp<$CTco>Bs(^fTN41jmi5eI9X2it28nt(Xp#>D1hM=8 z(8u~B$lgHh2e{S)1|mx&I$n-a4+z695r8uS_QNGX4K=*Tb=?F0b906g^SW5S!XFwO&gX($YDI4=I6vA zR7vfO;OK0kPEWniSsH++I|GrKWWXaJ1Ou=^>qwYbz+htg7(m@1>x*8L8CD$NVi*~` z_cTE{X&i2@O8qoOfV6}(azU{@4W=v9xJvweO!kC7fpm;(hSoK}@@s9tWfE=~E2JMs z2OY5L@Gt)jq@#9M?zX?mWdD)fYj+XdRCWHisUia^JJ3#1>HFoi)US7nu8rW&YITq- zwe~geL`$=(z&2WDoL23PRvefxy62R}@YW90QEg$2;9)AJKtnlLqWC)VI zr=?e%WD3fx@cP~5^&fVM-)*YqvjFH>yDRuDEbhGGh!Ur`@m0HPNt0-eYiZkx4waHs z+^A7R-uTn&>-F0fyrUi*Jw8<=W1g>CCVN)br}9-Qk81@vcu?&I$1m~P4QXlJgH<20 z9am##C-S^*ez};lx>P!7LA7$`WdCGkb9w-yK_PB1{W@mG^Yv}@ zwQ1UClC;URX(6UXn=lcIA|z?iWG#hh(I%QU+8d;z(zIwV)1rlB>}{B=QB)+Ydam5J zdv`D2ulx5r-{#evU&%K9-XwDG&oBQuwsJPhtzdykUQ7USW2<5~ zA-S0qFY}XZ!!`F!Y0rWFH)Xs~wYTMel;u{JMa-!|Jo6Y#KQM@w&u`>^Y2|ZObW1fQT}nRHr&;>?E6%KYPAiJi+zzp;A#O>Rry~V5^&YIBK1MuvzBFT?-+W?P)?Ey$-;|v-aK+ zuwD7#v>wUWSj14qdHG$z2%`_D2|OA@NG+aK+Ag%t>qE!prkTTl1eHZ^0AUmOfe!yG z5A_7G9Eu4K1304}nJ*N`dVKOFU`8N7tH#q3qe+K&>wVLA_CPB$$|U#q0Kg@H2Zg{ddZZ(qa zV6z#QdsRFv-Q)!wsUT+;8MT}Q01rz5WFHBfM}eClX=q`62FTaJO2I+Ei~tF+)HlHq zNC=5c?rIDtNF;}ckj33tO&DScatOToWx~!NNF&#r`tM^a;Yp-*0U>#a5;!pcL6@4B*G7FmblV1`jMitol6EG@X@6Y*t+`PE^&gg?*+W44P}5 zYFT*p>T%*fehP~{4Lpkn9aGnW7w%-kJR&W!4!j$*_mca5;DlPpnk&IG@&&d_{JPMkqBh>20^WQ; zcAMG^9?_c)9_XK3f8_DDqtgY4v8e$-JLd6n)SQka24Wt3$C^s`=*$??)jty`?D~v% z?AJr>SGro|r(bI~P;?S-hU#K%G$M>+ak?ryOsuRs72|C;N(Pz;xV=(5h4HJHXR^+H zJkw(1ryrV+(leIv~H4#w2E?OiW<48#pJHR z*_|pE*GU88d3Ir%S zLk*C{R9wBt2G8NE#GQG=O)>|6YYG0(r7%15KiqemP3tp@#2h%YE!rt(uj^Msz4p%J zG;$7OKaExfz3=nx4WIutZ9vLl- zP#k1Tw#yC?A&sd$C|UrVwEgtbq4(VRi@itU4UFNmzHXyKqjTr9)ogflbnwaOlivaJ ze>1J`&wzQ8=!eZgn2+a87LOHi*hVtspX$O&`H!g9!2 zPSeHgk$$ZCBOCBhEF2m7N?f97HCD3M#a@xG64B$XbaudH@YIl)wvxH3waQuBwgYoE z@S~$P4ZE0F@>R|33n4|=5H#jnFy{%jko9_Ks?W7-g3SWSH%gL3g0)s^Y!oGHjvUu; zT5}`I;n-=)1y?MCbyC%CM#Bxqi zOwE9l*fz|KMT?40J6Z13T@kYswRg`ZYle7N@p6Joy_jr=I;MjY8Z@IbLefB^q=CBb zM_oD!Wy^8i2fH^>X^H}My5YNzU*8n1e!Ak?{&ran%}wpP&c_Ay&&pA_Ae8!26ce%Q zS?NAx-Zq{P5jOu)*s$$58%gAZ$Wu6gl`{+RV!upc(JLBNdEw$m3&Le_kp^nv!r4_Z zrpBY}3Pp#lXS6hjOkUtgHa(yi5f}1e)ZcVu6h!tLtycQP!Ud|Y^$}b;B%tCbuM<_i zSAfL{mfptqG}b~OPc2Yg;9VdThZW7>(EB!SUmonXjdOWFPVsPDSg`)tmeZo!P4D7k z7MUd4Xzk_-gT0%>#;E!l=H8*jMI|#6&p5L6!^W%HijDRt&iE?$P%sCUJeJNRw@$>M zQoP0N1#ev@yUOt$MZd$2?CCU`qtTL{Kc_ExiElI73Yl6L7qLt@FczgI7Qe5Wx$JI- zksB#qeAMl^!g+g=#lY|h;i5jN@j}()CPuu(o@a|QECi`XE`(G4V(-hLwqy_7iINT4 z89K$eQ5`sVd|V7s5(tu48mD9sdc>90%B~BHgNf)h+pK(frt5nzTj50VU!o>0_sHQk z3+(ZHoMT)^gtU?t$3H%)&s%@Vuhf_bG4|iFT=hw*-F5GRv-H&)6`fSdsO(T4<#kSU0UZR>4xz(DFlaw@J+&z0724s`l8|u6#&ywW74Gz zidvT`f>mLm;hd;8c3}lBrjXb#AnaAOxb~Q=FyfPp2w9O)N9?Ev+iyrL+waGbk8LR0 z%76BJb|ZFaGtd(DEHuP<(o~ijd`wd&+;4BoGs$s;nf0BZ`2?27;EP3=k<^NP1*wa6 z9rcl~mZgiJ8NDYX3-fZfc>&Lj9x1)8YBP$*+Qgsje%#(8cfQ9L*yYrg7RL^|y}Ng} z_wILmoGEmC5Bmx~fe%Bj|qxQBWIu_NoS_j}1`*52%GrpP+TlMODEkkKFI3*`|M-W_BrEDm;+m0u5~+ymwl zWdZ;NNLjU85n36833GA!nka zeUEKQJmxrdY%?*`Nk7!tGIX1LsGD!7dkz%k4DtDrHO5r-LpbGike59a%?iyksmA4chvV_~M!1%B`z&_5vx! ze0K{&Bsq&wH#(yDhog+bO>YxV+}1yV_BqiJ?%tIHoxSB(b62iQ`Q!up z)yHg4cIce^aQ6hC&&hk`D+X|0!yyrgcUBD)9u{XtPlRt7ZIPQSkDl&WHIow!zKTXV zfanMlYy=aGh(;#K2vjg3NoL1}m^pqi#H1LhiWr&B7`gEnl4PucL9C)ftdd`>a#E~n zMXY*ftj2gOMKVtE7DG!?xW6nmduHB3BE?g;Gj8d4992amNi5#XA>Q0C-ZClP46)j} zGk(>0JWVoTjX{E)L&EwbeP}+g;ANbIGhEr}rMnHi&ES-a!zow4Q*KG8+$&CbcAnZj zeu^%6dXK^BeGaD&_?`AmI(=yT6ww)2PmOacN>DHX<6gRk_$7u{SVUALMs+5h98Y9Q zCdC>g#XBUO@=HpDy}uPnshvsb<4FlBP*8<}Fcp}3p$c*Uxbpqxd}z^FvYxMQp`XI} zR{$A8lAc)LMfSi5V-PDhW+xqRSkBMr?X*tCFG>(A0^T%Rt^JO&{n?e=8X)%v0wh zAu$YK)Gyl?coUnZ!JkexNE0R@C3tC4ug|vg z#m-Sh8Zyr;xOi@{dnT5C1_Pa0VVz0oiplZ=EJ?`abb!E3Mi`!vH=v*xK-nuam4hma zI7g(@?KYm5RyjwcqF0fS{3PTm9^Ktq$&Np^&H$ywMTtU)jSyOkjl6C(Zy|q{T*W+z z8Guq|m0sPMv#yCnRyn8Nb>8U^D8@T~Lo$6X-;z4yMG-J%gTv33;JmJjmnJT^}U%%aI= zbMUrs)!dv=@*?Z4mvDjp^E*S7{eXA9sD>9l=&j=S@4%tY;8uxja#EZq`5;yk$sZQ8 zV>_TrVI$5UH|fM8kfW*1}#<|8QAG9tFsaFMAUynm*q6Oze$M=bCQ$($$VbC#! z_Z88q47BL2;#a2otZ!NRJhL`J$vj6zy(tb}8xyr{0~8W`!rDa+O}Zpdq;V}!dPj`R zTzzq2upHw;oUxVa)IE_hEL);g(dh<7<7F;wEqi#VGAE_-VpU~ccjcwYO15-W(TaS9 zoOm>;yf~%mK*K)ET|icD)su6`H`waNP1Q~Q)h#L2vzFlQ>h{TMu5``MmS7KcZA!NG ziui{qHN449x+tmIXPatY_}9Xg;MY~P1KqQhVBL3Bl72w#{kR;gjO>bd=kZuQPHNt$ z38OFtLGVEaqzG-`prSZ%q$56%!`H?U$m0kv;oxoRL_O>HdpQ#79Pzd~>FN|&Pma8L zy`*~GJVG7cnYy`C9Aav{@<9Ed@|)+g+@Uc8sPR)~UPiIdmlIoBy9 zUAt=DQS3Iqh-81+^-c+0_~eNdWtW`d1zC?CUN0+ne1(C;%h{B(dtp34;s6LTHeY2L zpA5ID(7J|?UXY!ZSFzU`6R74gYExPA>Q2rw_Ybj^m-`>Ew_i_R+5Idg1j`?gf1}%l zFG$b@Gq|$a_hqT)iRMT7)#J7=3zAGTcH0{6zlk^?)V6#2(5p9yD$|*^w-0s3gL|%* zeL7TI>H8rvY3^a6E81hnNBZSYt)^T#()ecl0h2Mq*Oajq-PN3Kj#BzVuR!mg2yG8bj2@a!p*@0EULv@yS*3zC01`&qP=)QDmnPO?Ig$#2y8EZ$z#Z%4x7 z&5}Ee9fJ&>C%PQjr4*z8D{tE0203el8LzVFyRN;;cJl(=*PJ_{Y715-S+5npSo-?) ztj|_8_sr_HS&(!69027&H-`kYs8rKSjkP0y*j1(OHMmB>?15r!G5~wi&OX}`%w9vw zx3GCz34@#yW;=ccIcZNX{lDr>%a6smS$kb>_jbCWP`dH!>HSWc5B5BGSWtXm{+Kk% z@A-_A^SvWjjWJ$`gkZ5?=pW(%?Q|60B_H;ty_}-L-ZVL#!wt!sw*p-kj5W-03-bv;HLABhndq|auQT7xM2;OqsyfqbNp2!sZ+KGE{bG0niVi6t*DD{@!O zUCtoe?8z~W(02xn;#>J=DBF%DI&wAkdEf;0H|1q24y)!&JQj)2V_uqi9^oe4BBr+H zqKDJ1xhtJYPHpN6NKgIsT$OY`N5HrUI+{Q`#Vocb+7V2Qq(*WAGUb= zzC^i6(H78w&Ai?Dbl;R)5t?sa%m)=0=ocX88zn27KqR7fYy)D^4{e8hNyy)}9ZH>d zDhlc^A7*XqW85uvfzB(EG%Qy?`6Dwas-Ee`1bUmbTCnl@o5)Pv23;ffti* z>{fC?>Y4`XHCHgvK+GT3l^6RW^m#gq{bsC>B=ZZ7)jy?7``rxsTeY^I+YZ+dP84M> zaOr*2;$RjJw;gV&B7bQ+{0%j};@s*W062ZejAIqH3$2zXMwT3*p_)oooVDd$R8kO0 z32!~;HPMo5d3j#620ai+)COGM2y60j8Au8bK`!TjPbvY_lv^T-*)LMg3&9gfXbR6* zGzNxL1{io{dt-tUBLwLwnk1a42D-6>V24j(+ugf}JSYg%C!-dmDIpCf9WWsYiRV6e z;%rh@a&t~yZujK4iIW1MnI7Jy8)gjgQYNaT=w8yf%Va1O2;5<)jmQ+J+rB)dr+ZbL zRjclsUAtNp5pEK-(8g562@LnOrYQ)D!aIIywTy%T^qMPwGBH|)L{D@p=h$X*Q9YwH#C zA8Q~97KU5cJP}D5YgArU7`dVC$(*XOtDhsnY@SMWk2UGH7oI%W_Ec_iteGlU#0;}} zrXW4uV!5g)7LEvG+ZVQ86YX1`Nq9aRU|M8Hfdfo;Sa=m)kGrGrCBW2eRdMozwik=4 z##g}srrHGI`7aH-$J>3|i_<^0y<9pueseY=47;+=M0$c7zG_5$9TzFpqLUK6exxH^ z{gw45I3ldQBunqct5yCJcT6?h7x`JP@^sbyqJ4#VL~%d}hTOHk@QC^V_zTEgNKK#d z8^~R9J|kWZ0IRdnr!|J>+k+b`-+lk-Q}BpL`n{M_V0Rc8s~WY z!vOspU4UGbSg{GJKCMdyYsOwwc>>tJe(z&TKB*0HP(td8rkZo|hU!bQhD2e=UHx+k z=Qo4gO*hq9Dm*Hue!@T5$b zW5M*zMDL?CNyuT)$T%R{`&0Jv)Ph>7NtSnQS6A80+tD`}3ungAoPufe^XQvbrjg3^ zQ}-=?Tafb$$lW%u(b(`{jUj;~f|IOw4P^(@{iq^-mbkfE4dE8yD*z3UH5UVg-yAU( zJZwo8xbi%_H=zkZgzN8S{+{>7)(BjIL&(sBKlltC|C9PV-;1c!TmJKy67q1N@HsMR z;jws0aAJRL<2+c=@P$V#a>%UAR63Xtyz<)>3b$UoZM$~uigMSYBYH;Mq}ASCglzq2 z)9N=nRvzw=$u@k@+J2z&ecDh|_L7%YHy1o#eOS{S!GRbh^moW=lj-&wy*a`N2u3}Il5-q>c zONP%m=hivPxW6@KovxSWcbEM*W*=7hzW>#j{rr;oHM99m$82*sl>wr=$r3XH|76U5 zTaoWSY#H745V5=IpSqrZFV}G2E~rm;k4A{GRZq?rn~66L5hXH#4NBFs)q4v2IH^}E z{itj&kxiZjNU7rkaEEaJK=Ch9HhwGD$n`+_tYPdeGL%FVT<`7IN+XUt8A0LJ=#6Zq-mK(j<7YYOm`>1&_ zc-uuN1H#BLswuxEz@R3rkcS$C%y}dPzmATND-svZ4FUxl-vo(V$y(})B8#y(69OR_ zN_QJYfe%mqRu9=P#w@Xo7YDKR1mKp@3&Q|z@mdf}{CdmiR{T%7=WyP~4*>`npGU#h zD~kwt)Ncb2aNh$E{@Crj^&l!hSz+716oBC1j26sMVIsX^FBoGa#W+ubAc7*tj#&O* zE4RwN;&%S$H?D!wKL9n-cPJza1I!ob={c~-0XHAMas4QA_~$pSfW4`^x-MwDi`y}N z3iJ5Mx&Omi{(2DJcjx}!bk2QUu=DRb_njq&{DdXR6#Y72*1m7IjiAUd586DwGgA!q z@Shi58M(_WdH3sC4}agQ?6i~DXcw|nL)`x=!~efK%l%S7^ox{*fbej4>=mKj+`(F4 z)=7&T%-xC>)cHZMLunA%FaTT?-tGwtcD(b38^t%Uwt{@i_+PgwpH>I1smD3)xvp}B zpq-<7b6`*XqQ^^yE{=|V>+mSk|H4UYp<|8{IQ>&?E%3#mp8k19fPd^WfQ4}19qNDQ zyZZm2L;cSJCV!I&b?V>U5u^QsSKy{4_*E|P=R2a>1C%*r!$ymXIlBh@l!f|J17jgD zD@6bLb>{yD^Yq1k1R#CoW%GZaff4xW=Yu!+5AIX;=b!H@8~pzg_vz8U{qy}B?o;Rs z?I{JQ6JVE_2_oq8^w<6B^e3tb{!wou6ZnkDrdkze-AK{j`?{yKIQwSCkC^QL2w3nR zVzOWPq`rQu`j(NLk})ejg9Std>dXD;p3jcp|N4b6^XJpwqZjm3?N<-PEcv>(L&FP! zi+@|OEC2eXjs2CA8XMnXl&CcgkKnu1*v0FEHT=_fx(VXrVp<(edo!ty=VRB4B`4f$9&DoC8|g&WYV)NRDkC-STWBVT<#&J1C;71%sr)ft zJOpyh8r(|&L3LJx03OBWJd5A3`&W^i9vTKnLkhJ2uJLvLp;|#RRs%w~@e$`&GU!>_ zb5L$ExSYZ+x)O6CBjeM=Wq+X~h~d+#j}~84O&lG1u(ZBIV#5Y=K+eHWDbGQ-`53f?M#sdlY+4a1?D} zad!qPH?&4Dh#9J0(kn3YKDGh3is|-1G=YD)a-&q&`EZJzb2nF_o+Op&Z`Q*bGgQvS zi%`h+jd-!imvzr7R%}5M<{IA}YZMq=7@8;5HJxe+wcd)+zy@rWT&v%p5H)ntWAYKy zzou%s#%KSMO}v_mz7_&(h96zzoU~|Spc!_rmRJ&@%>} zuTN2MzC(?}8Qa62GC0+BNy|;wyjw?)+b*ST56QRf0do~O_z%h!_-*fw+|0Yo^o2ZQ$C?`ec^rac<*B#*{{dfxTrQ3 z=-*S=ENZom9ptl+@$i-2_;Y*Y=-x2;K<|co?wxxlXzp<<`;EwbH`_4WLrbr!It%99 zsg{aMUS>qFo8Gnb-i-L7QbnD!EzrK3ny)CM3iOVsV^lreJFstxIi!* z0PVU@cb$(7x+JU7Ph>J)tUO&g<x9{MYNRkMFqp8O$*wGk9#b6D*JJ)*;sCmP?Y1- zc{6(Bt$Lf^C1h7W(KzbYwsz^BFL|)(9KAcdz66R*$17TZ909Z>+;Dxm&?*# zQwEbcvTMM6S<*`hWizSUtdAyR(}Rqe#gC_#j&Y=GhmPqj=|yJvUe&7|4wI;UGWW_@ zD^hOw)RpRIvhv~70VAPpbSloUi+gJY`~eXIUg~*|H}9++OgL)vVvEpZ*UlrOMLVaT zIUV(HdbxD8279D`|FVGI!Su0si`qe5`G9VT$K%aFrNZHKfaK_Q;#~Cx9B#usH z9|83lD7T}Sjw2I08Tj%e-VB`l5V(Mi)Mg_1xp*r8t;#~jkoe>oIPamOSbGMN$WYKf zs?@^3Co(=|2Q9DS7=2>Kp2o80uag>e&&x zdkhvv0&?=S$^blX-jHGWkp(v;hU7HpF+D#aE?&;;#LP`@SbS z5>IrMpXlj0@n{VGBV4$`7deDEJhXK?5Q*;vCAe5`XWS9e$!@lQ3@v)pH+n2FdZIjf zsw4W-STrEXL>Mp;R?(eIK1T{-1r2FQkXTp@`Tz)b694%jY{U@8j~6Ee94W-aAExmo4q?v%*xe8o5>GyBkeum|oaL9C z12-d8Bw(nYTky0|ZKv5XAYZ0=*)2k_bNMuolUbokbZaE-1~y9VFqH08WzR zLFfhdGtyIs;C~G~Sdoz+43J5uRUm{gDOE24BEa%x24b!={GVgN$g%(FcqWZMk;H$T zhJBSdKSLQJ96Pgz!sk1LJb}T}i0qkL6mv>aPw;{ ziGC>$?^QIYw?6b`X|X}2QHS#lh2x}UD|QI z!b4E>0jOx+JR3a{!rq_Qnt;+`A#vRDIl^#u1E$%bL^K8S{&k*P z738(4{2;v?*t7;u0u(5S_3YemV*t$pmO8WL>ezM^#9CH`Yj@ckJU6!W*w& zekZN8)1zQ;&Sj&?(rN$8Gn>}7PD&_LX7f!5<7t2u6KP2Y2KwiX_!ocNlqDmbF}b+< z(~8_Yu)VO6Ss~(~l(r&gJ+sh^;ANgyFJe;*de)LDCE7F)mPc!_Kphg&fq}#_ zAq7KVE~yzVT&nD^=*ZQO&MlbeF4(4C>yp}h7+i{CBXnkHwU{&P-PPy?bhIW3xvz&k zmx|j_*u?Y3RzmFtwVQx?+fmyKs$h|C`1O|`Qd zNyyVt=x`|z&jB=V*sYqbKWBk%l0jOtZ!s#HKXk_xm6jGrH4QCkvToxtY+05})X_x5 zItu-qgxxudr37arawyE1!`8cT>&8Uh=;DLR2kz8FH1azkR@mIcva)T5!j>`7s%)e> z4Wmv$tz`j30a$o^PYmGhQsCC~Uqsph%IYoD#gJ87OPrh=+%+x#oL;>iX8kETyWo3aqvJoI7`!jJ^0->^dnU-!|vaqD8u zR1@v(z;!T%tFGQ1;&YoYLj_2q_s?wr;wB&Z7qzasuD@X{eao9WTaCJcS4z$oxVP$t z9iH>>eeOLy{{qBI+bXZhK-tGyJDqA2<2~ z78F2_ayKjVk=ymo0l3;U{2`ibb0feV=~F85=y6EO4FG@r;7WJZOYMY@ot-jW%C%78 zxlWy>yK%MM2JMjcC+#gu%AIAg#LM?JGlxz`4$V5) z1e`&^tzaS_f8r2d90wy<3D&)T&6evgTH0T-xxe&Ce|dU;Wo>`;qyE}Y{T#W0YC+qY zR*dBk)|bw=hnr5Qqn+g8;sG3!8h@09I>5o4pl>axc+>Of&7)6mcye!_EPeZI^V=6k z-u9)xeO>!@;L+Qx)`PNa+#z0G1clF!%4dhnXkWz_%f#+v;)cVqJE-U)+7RaG5H4eg z|H=^I@sQxm5F|e=vTRsv%kZ3|!^DhXsVl=WkB8-EhDq}86qdac-hxTw@dY^J&T``R z+8h+8U|_f0;TeGMG=)E42%FA)Z+PYXlE?3t&b+6}kC-eQG21d?essh#W5oK(h|S}X zRWl@mimh$c23!ue6&C$Ml4%u)9%qn?jPch8K{ z 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 LQ7U~)sigdW;OR+) literal 0 HcmV?d00001 diff --git a/media/postcode_service_magento_2_nl.gif b/media/postcode_service_magento_2_nl.gif new file mode 100644 index 0000000000000000000000000000000000000000..5201b22d4460ce0cb86f48509b1d770186f1bc19 GIT binary patch literal 208410 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�IVR%=}A@@*I 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 j`rX0poR?@&;~ff61bs39rL!9u_72*~|E%rUBX literal 0 HcmV?d00001 diff --git a/view/base/web/js/form/element/helpers/countryHelper.js b/view/base/web/js/form/element/helpers/countryHelper.js index 86779d9..fd3bd89 100644 --- a/view/base/web/js/form/element/helpers/countryHelper.js +++ b/view/base/web/js/form/element/helpers/countryHelper.js @@ -35,13 +35,15 @@ define([ '../../../helper/field-types', '../../../postcode-handler/postcode-nl', - '../../../postcode-handler/postcode-be' -], function (_, ko, FieldTypes, postcodeNL, postcodeBE) { + '../../../postcode-handler/postcode-be', + '../../../postcode-handler/postcode-de' +], function (_, ko, FieldTypes, postcodeNL, postcodeBE, postcodeDE) { 'use strict'; const KnownHandlers = { 'NL': postcodeNL, - 'BE': postcodeBE + 'BE': postcodeBE, + 'DE': postcodeDE }; return { diff --git a/view/base/web/js/helper/postcode-api.js b/view/base/web/js/helper/postcode-api.js index dd8a349..4e49f64 100644 --- a/view/base/web/js/helper/postcode-api.js +++ b/view/base/web/js/helper/postcode-api.js @@ -68,6 +68,28 @@ define(['jquery', './postcode-config'], function ($, postcodeConfig) { street: street } }); + }, + + getPostCodeDE: function (postcode) { + return $.ajax({ + method: 'GET', + url: postcodeConfig.getWebserviceURL_DE_Postcode(), + data: { + zipcodezone: postcode, + } + }); + }, + + getStreetDE: function (postcode, street, city) { + return $.ajax({ + method: 'GET', + url: postcodeConfig.getWebserviceURL_DE_Street(), + data: { + zipcode: postcode, + city: city, + street: street + } + }); } }; }); diff --git a/view/base/web/js/helper/postcode-config.js b/view/base/web/js/helper/postcode-config.js index 0cebbcf..c6b0318 100644 --- a/view/base/web/js/helper/postcode-config.js +++ b/view/base/web/js/helper/postcode-config.js @@ -28,30 +28,41 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ -define(['underscore'], function(_) { + +define(['underscore'], function (_) { var postcodeConfig = { 'action_url': { 'postcode_service': '/postcode/address/service', 'postcode_be_getstreet': '/postcode/address/service/be/getstreet', - 'postcode_be_getpostcode': '/postcode/address/service/be/getpostcode' + 'postcode_be_getpostcode': '/postcode/address/service/be/getpostcode', + 'postcode_de_getstreet': '/postcode/address/service/de/getstreet', + 'postcode_de_getpostcode': '/postcode/address/service/de/getpostcode' } }; - + if ('checkoutConfig' in window && 'postcode' in window.checkoutConfig) { postcodeConfig = _.extend(postcodeConfig, window.checkoutConfig.postcode); } - + return { - getWebserviceURL_NL : function() { + getWebserviceURL_NL: function () { return postcodeConfig.action_url.postcode_service; }, - - getWebserviceURL_BE_Street: function() { + + getWebserviceURL_BE_Street: function () { return postcodeConfig.action_url.postcode_be_getstreet; }, - - getWebserviceURL_BE_Postcode: function() { + + getWebserviceURL_BE_Postcode: function () { return postcodeConfig.action_url.postcode_be_getpostcode; + }, + + getWebserviceURL_DE_Street: function () { + return postcodeConfig.action_url.postcode_de_getstreet; + }, + + getWebserviceURL_DE_Postcode: function () { + return postcodeConfig.action_url.postcode_de_getpostcode; } - } + }; }); diff --git a/view/base/web/js/postcode-handler/postcode-be.js b/view/base/web/js/postcode-handler/postcode-be.js index 5c9293d..a402bd5 100644 --- a/view/base/web/js/postcode-handler/postcode-be.js +++ b/view/base/web/js/postcode-handler/postcode-be.js @@ -28,7 +28,6 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ - define( [ // Importing required modules and dependencies @@ -162,8 +161,8 @@ define( // Add elements to selection box var selectBoxArr = []; $.each(data, function (key) { - if (selectBoxArr.length >= 10) { - return false; // Break the loop if more than 10 results are in the + if (selectBoxArr.length >= 8) { + return false; // Break the loop if more than 8 results are in the // list } selectBoxArr.push({ diff --git a/view/base/web/js/postcode-handler/postcode-de.js b/view/base/web/js/postcode-handler/postcode-de.js new file mode 100644 index 0000000..21437c0 --- /dev/null +++ b/view/base/web/js/postcode-handler/postcode-de.js @@ -0,0 +1,338 @@ +/** + * + * ..::.. + * ..::::::::::::.. + * ::'''''':''::''''':: + * ::.. ..: : ....:: + * :::: ::: : : :: + * :::: ::: : ''' :: + * ::::..:::..::.....:: + * ''::::::::::::'' + * ''::'' + * + * + * NOTICE OF LICENSE + * + * This source file is subject to the Creative Commons License. + * It is available through the world-wide-web at this URL: + * http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + * If you are unable to obtain it through the world-wide-web, please send an email + * to servicedesk@totalinternetgroup.nl so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade this module to newer + * versions in the future. If you wish to customize this module for your + * needs please contact servicedesk@totalinternetgroup.nl for more information. + * + * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright + * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US + */ +define( + [ + // Importing required modules and dependencies + 'jquery', + 'knockout', + 'underscore', + './postcode-handler', + '../helper/field-types', + '../helper/postcode-api', + 'jquery-ui-modules/autocomplete', + 'mage/translate' + ], + function ($, ko, _, PostcodeHandler, FieldTypes, PostcodeApi) { + 'use strict'; + + // Defining states for the postcode handler + const states = Object.seal({ + INIT: PostcodeHandler.INIT, + IDLE: 'postcode_idle', + POSTCODE_CALL_MADE: 'postcode_call_made', + POSTCODE_CALL_FAILED: 'postcode_call_failed', + POSTCODE_SHOW_FIELDS_SUGGESTION: 'postcode_show_fields_suggestion', + POSTCODE_SHOW_FIELDS_EDIT: 'postcode_show_fields_edit' + }); + + // Constructor for PostcodeHandlerDE + function PostcodeHandlerDE(config, postcodeService) + { + this.debounceBeforeCall = null; + this.data = {}; + PostcodeHandler.call(this, config, postcodeService); + + return (this); + } + + // Setting up prototype chain + PostcodeHandlerDE.prototype = Object.create(PostcodeHandler.prototype); + + // Method to get ISO code + PostcodeHandlerDE.prototype.getISOCode = function () { return 'DE';}; // ISO code for Germany + + // Method to destroy autocomplete + PostcodeHandlerDE.prototype.destroy = function () { + this.deleteAutoComplete(); + PostcodeHandler.prototype.destroy.call(this); + }; + + // Method to delete autocomplete + PostcodeHandlerDE.prototype.deleteAutoComplete = function () { + var currentPostcodeService = this.getPostcodeService(); + + var postcodeField = currentPostcodeService.getElement(FieldTypes.postcode); + var domPostcodeField = $('#' + postcodeField.uid); + if (domPostcodeField.length > 0 && domPostcodeField.data('uiAutocomplete')) { + domPostcodeField.autocomplete('destroy'); + } + + var streetField = currentPostcodeService.getElement(FieldTypes.street); + var domStreetField = $('#' + streetField.uid); + if (domStreetField.length > 0 && domStreetField.data('uiAutocomplete')) { + domStreetField.autocomplete('destroy'); + } + }; + + // Method to add autocomplete to postcode field + PostcodeHandlerDE.prototype.addAutoCompleteToPostcode = function () { + var self = this; + + var currentPostcodeService = this.getPostcodeService(); + var postcodeField = currentPostcodeService.getElement(FieldTypes.postcode); + var domPostcodeField = $('#' + postcodeField.uid); + + if (domPostcodeField.length === 0) { + return; + } + + domPostcodeField.attr('autocomplete', 'off'); // When autocomplete is off, the browser + // does not automatically complete + // entries based on earlier typed values. + + domPostcodeField.autocomplete({ + delay: 30, // Parameter for the results delay in milliseconds + source: function (zipcodezone, response) { + + if (zipcodezone.term.length <= 1) { + // Only make requests when more than 2 numbers are keyed in: + // It reduces the amount of API calls and keeps the result list more + // compact + this.menu.element.removeClass('tigJqueryUiClass'); + return; + } + + this.menu.element.addClass(this.customScope + '.tigAutocomplete'); + this.menu.element.addClass('tigJqueryUiClass'); + + domPostcodeField.addClass('auto-complete-running'); + + response([ + { + label: $.mage.__('Loading zipcodes ...'), + data: false + }]); + + PostcodeApi.getPostCodeDE(zipcodezone.term).done(function (data) { + + if (data.success === false) { + // If no results are found, a success === false is returned + let errorMessage = 'Zipcode not found.'; + + if (data.error_code) { + // show error in console + console.error( + 'Postcodeservice.com extension: ' + JSON.stringify(data)); + + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } + } + + response( + { + label: $.mage.__(errorMessage), + data: false + }); + return; + } + + // Add elements to selection box + var selectBoxArr = []; + $.each(data, function (key) { + if (selectBoxArr.length >= 8) { + return false; // Break the loop if more than 8 results are in the + // list + } + selectBoxArr.push({ + label: data[key].zipcode + ' - ' + data[key].city, + value: data[key].zipcode, + data: data[key] + }); + }); + + response(selectBoxArr); + }); + }, + select: function (event, ui) { + // If the loader / info messages are selected, do not copy them to the street + // field + if ((ui.item.value === $.mage.__('Loading zipcodes ...')) || + (ui.item.value === $.mage.__('Zipcode not found.'))) { + ui.item.value = ''; + return false; + } + + if (typeof ui.item.data === 'undefined') { + return false; + } + + var data = ui.item.data; + self.getPostcodeService().setFieldValue(FieldTypes.city, data.city); + self.getPostcodeService().setFieldValue(FieldTypes.postcode, data.zipcode); + + }, + close: function () { + domPostcodeField.removeClass('auto-complete-running'); + } + }); + }; + + // Method to add autocomplete to street field + PostcodeHandlerDE.prototype.addAutoCompleteToStreet = function () { + var self = this; + + var currentPostcodeService = this.getPostcodeService(); + var streetFieldZero = currentPostcodeService.getElement(FieldTypes.street); + var streetField = $('#' + streetFieldZero.uid); + + if (streetField.length === 0) { + return; + } + + streetField.attr('autocomplete', 'yes'); + + streetField.autocomplete({ + delay: 50, // Parameter for the results delay in milliseconds + source: function (street, response) { + var postcode = currentPostcodeService.getElement(FieldTypes.postcode).value(); + var city = currentPostcodeService.getElement(FieldTypes.city).value(); + + if (city === '' || postcode === '' || postcode === null) { + // If the required fields are empty, do not make an API request + this.menu.element.removeClass('tigJqueryUiClass'); + this.menu.element.css('display', 'none'); + return; + } + + this.menu.element.addClass('tigJqueryUiClass'); + this.menu.element.appendTo(this.element.closest('.tig_street_autocomplete')); + + response([ + { + label: $.mage.__('Loading streets ...'), + data: false + }]); + + PostcodeApi.getStreetDE(postcode, street.term, city).done(function (data) { + if (data.success === false) { + // If no results are found, a success === false is returned + let errorMessage = 'Cannot find street, is it correct?'; + + if (data.error_code) { + // show error in console + console.error( + 'Postcodeservice.com extension: ' + JSON.stringify(data)); + + if (data.error_code > 400) { + errorMessage = 'Could not perform address validation.'; + } + if (data.error_code === 429) { + errorMessage = 'Address validation temporarily unavailable.'; + } + } + + response([ + { + label: $.mage.__(errorMessage), + data: false + }]); + return; + } + + if (Array.isArray(data)) { + var uniqueStreets = data.reduce((unique, item) => { + return unique.includes(item.street) ? unique : [ + ...unique, + item.street]; + }, []); + } else { + // If data is not an array, it means no data was found. Possibly the + // city field was not filled in hence the validation could not occur. + response([ + { + data: false + }]); + } + + var selectBoxArr = []; + $.each(uniqueStreets, function (index, value) { + if (selectBoxArr.length >= 6) { + return false; // Break the loop if more than 6 results are in the + // list + } + selectBoxArr.push({ + label: value, + value: value + }); + }); + + response(selectBoxArr); + }); + }, + select: function (event, ui) { + // If the loader / info messages are selected by the end user, do not copy them + // to the street field + if ((ui.item.value === $.mage.__('Loading streets ...')) || + (ui.item.value === $.mage.__('Cannot find street, is it correct?'))) { + ui.item.value = ''; + return false; + } + + if (typeof ui.item.data === false) { + return false; + } + + // User selected street, update the street fieldValue + var data = ui.item.value; + self.getPostcodeService().setFieldValue(FieldTypes.street, data); + } + }); + }; + + // Method to handle field type and value + PostcodeHandlerDE.prototype.handle = function (field_type, field_value) { + if (field_type === FieldTypes.postcode) { + this.data.postcode = field_value; + } + + switch(this.getCurrentState()) { + case states.INIT: + this.setCurrentState(states.IDLE); + this.getPostcodeService() + .addClassesToField(FieldTypes.street, {'tig_street_autocomplete': true}); + this.getPostcodeService() + .addClassesToField(FieldTypes.postcode, {'tig_zipcodezone_autocomplete': true}); + this.addAutoCompleteToPostcode( + this.getPostcodeService().getElement(FieldTypes.postcode)); + this.addAutoCompleteToStreet( + this.getPostcodeService().getElement(FieldTypes.street)); + break; + } + PostcodeHandler.prototype.handle.call(this, field_type, field_value); + return true; + }; + return PostcodeHandlerDE; + } +); diff --git a/view/base/web/js/postcode-handler/postcode-nl.js b/view/base/web/js/postcode-handler/postcode-nl.js index 6b5a8ce..d661c9e 100644 --- a/view/base/web/js/postcode-handler/postcode-nl.js +++ b/view/base/web/js/postcode-handler/postcode-nl.js @@ -28,7 +28,6 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ - define( [ // Importing required modules and dependencies diff --git a/view/frontend/requirejs-config.js b/view/frontend/requirejs-config.js index 76dc135..45f7f06 100644 --- a/view/frontend/requirejs-config.js +++ b/view/frontend/requirejs-config.js @@ -7,7 +7,7 @@ var config = { 'Magento_Checkout/js/action/create-shipping-address': { 'TIG_Postcode/js/action/create-shipping-address-mixin': true }, - 'Magento_Checkout/js/action/set-billing-address' : { + 'Magento_Checkout/js/action/set-billing-address': { 'TIG_Postcode/js/action/set-billing-address-mixin': true }, 'Magento_Checkout/js/action/place-order': { @@ -19,17 +19,17 @@ var config = { 'Magento_Checkout/js/action/set-payment-information': { 'TIG_Postcode/js/action/set-billing-address-mixin': true }, - - // Mixin for hiding TIG Attributes - 'Magento_Checkout/js/view/billing-address' : { + + // Mixin for hiding Postcode Service TIG Attributes + 'Magento_Checkout/js/view/billing-address': { 'TIG_Postcode/js/view/hide-tig-attributes-mixin': true }, - 'Magento_Checkout/js/view/shipping-address/address-renderer/default' : { + 'Magento_Checkout/js/view/shipping-address/address-renderer/default': { 'TIG_Postcode/js/view/hide-tig-attributes-mixin': true }, - 'Magento_Checkout/js/view/shipping-information/address-renderer/default' : { + 'Magento_Checkout/js/view/shipping-information/address-renderer/default': { 'TIG_Postcode/js/view/hide-tig-attributes-mixin': true - }, + } } } }; diff --git a/view/frontend/web/css/amasty_checkout.css b/view/frontend/web/css/amasty_checkout.css index 01387c8..3e6a399 100644 --- a/view/frontend/web/css/amasty_checkout.css +++ b/view/frontend/web/css/amasty_checkout.css @@ -16,14 +16,22 @@ .amcheckout-wrapper .field.tig_postcode_be.tig_postcode_field { max-width: 100%; } - +.amcheckout-wrapper .field.tig_postcode_de.tig_postcode_field { + max-width: 100%; +} .amcheckout-wrapper .field.tig_postcode_nl.tig_housenumber_field, .amcheckout-wrapper .field.tig_postcode_be.tig_housenumber_field { max-width: calc(40% - 7px); } +.amcheckout-wrapper .field.tig_postcode_de.tig_housenumber_field { + max-width: calc(40% - 7px); +} .amcheckout-wrapper .field.tig_postcode_nl.tig_housenumber_addition_field, .amcheckout-wrapper .field.tig_postcode_be.tig_housenumber_addition_field { max-width: calc(60% - 7px); } +.amcheckout-wrapper .field.tig_postcode_de.tig_housenumber_addition_field { + max-width: calc(60% - 7px); +} diff --git a/view/frontend/web/css/mageplaza_onestepcheckout.css b/view/frontend/web/css/mageplaza_onestepcheckout.css index f5b324c..448c9f3 100644 --- a/view/frontend/web/css/mageplaza_onestepcheckout.css +++ b/view/frontend/web/css/mageplaza_onestepcheckout.css @@ -3,12 +3,20 @@ max-width: calc(45%); padding: 0 10px; } +.opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_de.tig_street_field { + max-width: calc(45%); + padding: 0 10px; +} .opc-wrapper.one-step-checkout-wrapper .tig_city_field.tig_postcode_nl, .opc-wrapper.one-step-checkout-wrapper .tig_city_field.tig_postcode_be { max-width: calc(50%); padding: 0 10px; } +.opc-wrapper.one-step-checkout-wrapper .tig_city_field.tig_postcode_de { + max-width: calc(50%); + padding: 0 10px; +} .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_nl.tig_housenumber_field, .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_be.tig_housenumber_field { @@ -16,15 +24,28 @@ margin: 0 0 20px 0; padding: 0 10px; } +.opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_de.tig_housenumber_field { + max-width: calc(45%); + margin: 0 0 20px 0; + padding: 0 10px; +} .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_nl.tig_housenumber_addition_field, .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_be.tig_housenumber_addition_field { padding: 0 9px; max-width: calc(45%); } +.opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_de.tig_housenumber_addition_field { + padding: 0 9px; + max-width: calc(45%); +} .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_nl.tig_postcode_field, .opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_be.tig_postcode_field { max-width: calc(100% - 8px); padding: 0 10px; } +.opc-wrapper.one-step-checkout-wrapper .field.tig_postcode_de.tig_postcode_field { + max-width: calc(100% - 8px); + padding: 0 10px; +} diff --git a/view/frontend/web/css/postcode_de.css b/view/frontend/web/css/postcode_de.css new file mode 100644 index 0000000..5088889 --- /dev/null +++ b/view/frontend/web/css/postcode_de.css @@ -0,0 +1,41 @@ + +/**** DE ****/ +.field.tig_postcode_de { + margin: 0 10px 20px 0; + width: 100%; +} + +.tig_postcode_field.tig_postcode_de { + display: inline-block; + max-width: calc(46% - 7px); +} + +.tig_street_fields.tig_postcode_de, .tig_city_field.tig_postcode_de { + max-width: 100%; +} + +.tig_housenumber_field.tig_postcode_de, +.tig_housenumber_addition_field.tig_postcode_de { + display: inline-block; + max-width: calc(54% / 2 - 7px); +} + +@media (max-width: 400px) { + .tig_postcode_field.tig_postcode_de { + max-width: 100%; + } + + .tig_housenumber_field.tig_postcode_de, + .tig_housenumber_addition_field.tig_postcode_de { + max-width: calc(100% / 2 - 7px); + } +} + +.tig_housenumber_addition_field.tig_postcode_de { + margin: 0 0 20px 0; +} + + +.tig_postcode_field.tig_postcode_de .control { + position: relative; +} diff --git a/view/frontend/web/js/action/create-shipping-address-mixin.js b/view/frontend/web/js/action/create-shipping-address-mixin.js index 043375e..81e6c3c 100644 --- a/view/frontend/web/js/action/create-shipping-address-mixin.js +++ b/view/frontend/web/js/action/create-shipping-address-mixin.js @@ -28,7 +28,6 @@ * @copyright Copyright (c) Total Internet Group B.V. https://tig.nl/copyright * @license http://creativecommons.org/licenses/by-nc-nd/3.0/nl/deed.en_US */ - define([ // Importing required modules and dependencies 'jquery', diff --git a/view/frontend/web/js/action/set-shipping-information-mixin.js b/view/frontend/web/js/action/set-shipping-information-mixin.js index 9bfcdc3..50e5937 100644 --- a/view/frontend/web/js/action/set-shipping-information-mixin.js +++ b/view/frontend/web/js/action/set-shipping-information-mixin.js @@ -49,7 +49,7 @@ define([ /** * A custom/extension attribute object can have a different construction * depending on where, how and when the address is being processed. - * Therefore make sure the attribute value is correctly retrieved. + * Therefore, make sure the attribute value is correctly retrieved. * * @param attribute * @returns {*} diff --git a/view/frontend/web/js/view/hide-tig-attributes-mixin.js b/view/frontend/web/js/view/hide-tig-attributes-mixin.js index ad67a06..6d1471c 100644 --- a/view/frontend/web/js/view/hide-tig-attributes-mixin.js +++ b/view/frontend/web/js/view/hide-tig-attributes-mixin.js @@ -1,13 +1,13 @@ 'use strict'; define([ 'TIG_Postcode/js/helper/field-types' -],function (FieldTypes) { +], function (FieldTypes) { 'use strict'; - + var mixin = { - - getCustomAttributeLabel: function(element) { - // Hide TIG Elements + + getCustomAttributeLabel: function (element) { + // Hide Postcode Service TIG Elements if (element && 'attribute_code' in element && [ FieldTypes.house_number, @@ -19,7 +19,7 @@ define([ return this._super(element); } }; - + return function (magentoBlock) { return magentoBlock.extend(mixin); }; From 26200a6cd87db443b26e895002dd9df6ea15614b Mon Sep 17 00:00:00 2001 From: Joost Schildwacht Date: Fri, 20 Oct 2023 21:00:24 +0200 Subject: [PATCH 9/9] remove unused config settings --- NEWS.md | 16 ++++++++++------ Plugin/Model/Checkout/LayoutProcessorPlugin.php | 6 ------ composer.json | 6 +++--- etc/config.xml | 15 --------------- view/base/web/js/postcode-handler/postcode-be.js | 2 +- view/base/web/js/postcode-handler/postcode-de.js | 2 +- 6 files changed, 15 insertions(+), 32 deletions(-) diff --git a/NEWS.md b/NEWS.md index 091c70d..3874a48 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,6 +14,7 @@ to: ```text V5: https://api.postcodeservice.com/nl/v5/find?zipcode=4201KB&houseno=63 +See https://developers-staging.postcodeservice.com/#netherlands-api ``` - Added support for Belgium bilingual results in bilingual municipalities, @@ -38,7 +39,7 @@ V3: https://api.postcodeservice.com/be/v3/zipcode-find?zipcodezone=1050&multires "city": "Bruxelles", "latitude": 50.8222854, "longitude": 4.3815707 - } + }, ... ] ``` @@ -92,7 +93,8 @@ if (data.error_code) { - Revised and updated the Magento User manual to ensure it matches the latest changes. - Updated `SECURITY.md` with GitHub’s private reporting option, providing a secure channel for issue reporting. -- Successfully tested the extension with the new Magento 2.4.7-beta1, Magento 2.4.7-beta2, confirming compatibility and +- Successfully tested the extension with the new Magento 2.4.7-beta1, Magento 2.4.7-beta2, + confirming compatibility and performance. ## UX/UC improvements @@ -102,13 +104,14 @@ if (data.error_code) { in `postcode-nl.js`, see comment `// The last parameter is the delay in millisecond` in the file. - Similarly, decreased the loading speed of the address results for Belgium from 500 milliseconds to - 50 milliseconds for + 30 milliseconds for streets and 30 milliseconds for zipcodes by default. This can be changed in `postcode-be.js`, see twice the comment `// Parameter for the results delay in milliseconds`. - Eliminated the redundant loading screen for Nederlands in Magento Checkout, enhancing the overall user experience in the vanilla Magento Luma checkout theme. You can still turn this on in the - file `postcode-api.js` in the method `getPostCodeNL` by setting the variable `showLoader: false` to `true`. + file `postcode-api.js` in the method `getPostCodeNL` by setting the variable `showLoader: false` + to `true`. - Deactivated advanced settings that were not being utilized, thereby simplifying the user interface. - Added new documentation links from within the extension to the Magento User manual and underlying @@ -144,5 +147,6 @@ if (data.error_code) { ## Release credits -- Thanks go out to the following people for contributing to this release: Robert, Tim S., Vincent, Erik de - Groot, Viktoriia and Peter S. +- Thanks go out to the following people for contributing to this release: Robert, Tim S., Vincent, + Erik de + Groot, Viktoria and Peter S. diff --git a/Plugin/Model/Checkout/LayoutProcessorPlugin.php b/Plugin/Model/Checkout/LayoutProcessorPlugin.php index 6ab8892..4b87d7b 100644 --- a/Plugin/Model/Checkout/LayoutProcessorPlugin.php +++ b/Plugin/Model/Checkout/LayoutProcessorPlugin.php @@ -249,12 +249,6 @@ public function afterProcess($subject, $jsLayout) { // @TODO use a better way to set sort order for postcode field, // tried in branch "tryout_billing_address_sortorder_mixin" - // @TODO remove debug data - /* $file = fopen('test.txt', 'a+'); - fwrite($file, $defaultCountry . "--"); - fclose($file); - */ - if ($defaultCountry === "NL" || $defaultCountry === "BE" || $defaultCountry === "DE") { $jsLayout = $this->arrayManager->set($postalCodePath . '/config/sortOrder', $jsLayout, 50); } diff --git a/composer.json b/composer.json index f3d4170..bae928e 100644 --- a/composer.json +++ b/composer.json @@ -13,14 +13,14 @@ { "name": "TIG", "email": "support@postcodeservice.com", - "homepage": "https://postcodeservice.nl/" + "homepage": "https://postcodeservice.com" } ], "support": { "email": "support@postcodeservice.com", - "issues": "https://portal.tig.nl" + "issues": "https://postcodeservice.com/support/" }, - "homepage": "https://postcodeservice.nl/", + "homepage": "https://postcodeservice.com", "minimum-stability": "RC", "autoload": { "files": [ diff --git a/etc/config.xml b/etc/config.xml index a9a9216..f531867 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -64,21 +64,6 @@ 1 1 - - 30 - - - 30 - 8 - 50 - 6 - - - 30 - 8 - 50 - 6 - diff --git a/view/base/web/js/postcode-handler/postcode-be.js b/view/base/web/js/postcode-handler/postcode-be.js index a402bd5..e4aad6d 100644 --- a/view/base/web/js/postcode-handler/postcode-be.js +++ b/view/base/web/js/postcode-handler/postcode-be.js @@ -214,7 +214,7 @@ define( streetField.attr('autocomplete', 'yes'); streetField.autocomplete({ - delay: 50, // Parameter for the results delay in milliseconds + delay: 30, // Parameter for the results delay in milliseconds source: function (street, response) { var postcode = currentPostcodeService.getElement(FieldTypes.postcode).value(); var city = currentPostcodeService.getElement(FieldTypes.city).value(); diff --git a/view/base/web/js/postcode-handler/postcode-de.js b/view/base/web/js/postcode-handler/postcode-de.js index 21437c0..4274f64 100644 --- a/view/base/web/js/postcode-handler/postcode-de.js +++ b/view/base/web/js/postcode-handler/postcode-de.js @@ -214,7 +214,7 @@ define( streetField.attr('autocomplete', 'yes'); streetField.autocomplete({ - delay: 50, // Parameter for the results delay in milliseconds + delay: 30, // Parameter for the results delay in milliseconds source: function (street, response) { var postcode = currentPostcodeService.getElement(FieldTypes.postcode).value(); var city = currentPostcodeService.getElement(FieldTypes.city).value();