From f684e728c8de14af085e38ebd138724cbc2eeee5 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 5 Oct 2007 00:27:14 +0000 Subject: [PATCH 01/15] fix: Shortcuts now follow their linked asset when trashing, purging, and restoring from trash --- lib/WebGUI/Asset.pm | 10 ++++ lib/WebGUI/Asset/Shortcut.pm | 39 +++++++++++++++ lib/WebGUI/AssetTrash.pm | 57 ++++++++++++++------- t/Asset/Shortcut/000-create-delete.t | 74 ++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+), 18 deletions(-) create mode 100644 t/Asset/Shortcut/000-create-delete.t diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 52ae49154..ff19ac9c2 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -1976,6 +1976,16 @@ sub publish { $cache->deleteChunk(["asset",$id]); } $self->{_properties}{state} = "published"; + + # Also publish any shortcuts to this asset that are in the trash + my $shortcuts + = WebGUI::Asset::Shortcut->getShortcutsForAssetId($self->session, $self->getId, { + returnObjects => 1, + statesToInclude => ['trash','trash-limbo'], + }); + for my $shortcut ( @$shortcuts ) { + $shortcut->publish; + } } diff --git a/lib/WebGUI/Asset/Shortcut.pm b/lib/WebGUI/Asset/Shortcut.pm index 4513698b1..06132567b 100644 --- a/lib/WebGUI/Asset/Shortcut.pm +++ b/lib/WebGUI/Asset/Shortcut.pm @@ -11,6 +11,7 @@ package WebGUI::Asset::Shortcut; #------------------------------------------------------------------- use strict; +use Carp; use Tie::IxHash; use WebGUI::Asset; use WebGUI::International; @@ -906,5 +907,43 @@ sub www_view { return $output; } +#---------------------------------------------------------------------------- + +=head1 STATIC METHODS + +These methods are called using CLASS->method + +#---------------------------------------------------------------------------- + +=head2 getShortcutsForAssetId ( session, assetId [, properties] ) + +Get an arrayref of assetIds of all the shortcuts for the passed-in assetId. + +"properties" is a hash reference of properties to give to getLineage. +Probably the only useful key will be "returnObjects". + +=cut + +sub getShortcutsForAssetId { + my $class = shift; + my $session = shift; + my $assetId = shift; + my $properties = shift || {}; + + croak "First argument to getShortcutsForAssetId must be WebGUI::Session" + unless $session && $session->isa("WebGUI::Session"); + croak "Second argument to getShortcutsForAssetId must be assetId" + unless $assetId; + croak "Third argument to getShortcutsForAssetId must be hash reference" + if $properties && !ref $properties eq "HASH"; + + my $db = $session->db; + + $properties->{ joinClass } = 'WebGUI::Asset::Shortcut'; + $properties->{ whereClause } = 'Shortcut.shortcutToAssetId = ' . $db->quote($assetId); + + return WebGUI::Asset->getRoot($session)->getLineage(['descendants'], $properties); +} + 1; diff --git a/lib/WebGUI/AssetTrash.pm b/lib/WebGUI/AssetTrash.pm index e13ce1280..457d7968a 100644 --- a/lib/WebGUI/AssetTrash.pm +++ b/lib/WebGUI/AssetTrash.pm @@ -134,6 +134,16 @@ sub purge { } } + # Delete shortcuts to this asset + # Also publish any shortcuts to this asset that are in the trash + my $shortcuts + = WebGUI::Asset::Shortcut->getShortcutsForAssetId($self->session, $self->getId, { + returnObjects => 1, + }); + for my $shortcut ( @$shortcuts ) { + $shortcut->purge; + } + # gotta delete stuff we've exported unless ($options->{skipExported}) { $self->_invokeWorkflowOnExportedFiles($self->session->setting->get('purgeWorkflow'), 1); @@ -178,29 +188,40 @@ sub purge { =head2 trash ( ) -Removes asset from lineage, places it in trash state. The "gap" in the lineage is changed in state to trash-limbo. +Removes asset from lineage, places it in trash state. The "gap" in the +lineage is changed in state to trash-limbo. =cut sub trash { - my $self = shift; - return undef if ($self->getId eq $self->session->setting->get("defaultPage") || $self->getId eq $self->session->setting->get("notFoundPage")); - foreach my $asset ($self, @{$self->getLineage(['descendants'], {returnObjects => 1})}) { - $asset->_invokeWorkflowOnExportedFiles($self->session->setting->get('trashWorkflow'), 1); - } + my $self = shift; + return undef if ($self->getId eq $self->session->setting->get("defaultPage") || $self->getId eq $self->session->setting->get("notFoundPage")); + for my $asset ($self, @{$self->getLineage(['descendants'], {returnObjects => 1})}) { + $asset->_invokeWorkflowOnExportedFiles($self->session->setting->get('trashWorkflow'), 1); + } - my $db = $self->session->db; - $db->beginTransaction; - my $sth = $db->read("select assetId from asset where lineage like ?",[$self->get("lineage").'%']); - while (my ($id) = $sth->array) { - $db->write("delete from assetIndex where assetId=?",[$id]); - } - $db->write("update asset set state='trash-limbo' where lineage like ?",[$self->get("lineage").'%']); - $db->write("update asset set state='trash', stateChangedBy=?, stateChanged=? where assetId=?",[$self->session->user->userId, $self->session->datetime->time(), $self->getId]); - $db->commit; - $self->{_properties}{state} = "trash"; - $self->updateHistory("trashed"); - $self->purgeCache; + # Trash any shortcuts to this asset + my $shortcuts + = WebGUI::Asset::Shortcut->getShortcutsForAssetId($self->session, $self->getId, { returnObjects => 1}); + for my $shortcut ( @$shortcuts ) { + $shortcut->trash; + } + + # Raw database work is more efficient than $asset->update + my $db = $self->session->db; + $db->beginTransaction; + my $sth = $db->read("select assetId from asset where lineage like ?",[$self->get("lineage").'%']); + while (my ($id) = $sth->array) { + $db->write("delete from assetIndex where assetId=?",[$id]); + } + $db->write("update asset set state='trash-limbo' where lineage like ?",[$self->get("lineage").'%']); + $db->write("update asset set state='trash', stateChangedBy=?, stateChanged=? where assetId=?",[$self->session->user->userId, $self->session->datetime->time(), $self->getId]); + $db->commit; + + # Update ourselves since we didn't use update() + $self->{_properties}{state} = "trash"; + $self->updateHistory("trashed"); + $self->purgeCache; } require WebGUI::Workflow::Activity::DeleteExportedFiles; diff --git a/t/Asset/Shortcut/000-create-delete.t b/t/Asset/Shortcut/000-create-delete.t new file mode 100644 index 000000000..01051d23e --- /dev/null +++ b/t/Asset/Shortcut/000-create-delete.t @@ -0,0 +1,74 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../lib"; + +## The goal of this test is to test the creation and deletion of shortcut assets + +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::Snippet; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Shortcut Test"}); + +# Make a snippet to shortcut +my $snippet + = $node->addChild({ + className => "WebGUI::Asset::Snippet", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 2; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 0 +BEGIN { use_ok("WebGUI::Asset::Shortcut"); } + +#---------------------------------------------------------------------------- +# Test creating a shortcut to snippet +# plan tests => 2 +my $shortcut + = $node->addChild({ + className => "WebGUI::Asset::Shortcut", + shortcutToAssetId => $snippet->getId, + }); + +isa_ok( + $shortcut, "WebGUI::Asset::Shortcut", +); + +isa_ok( + $shortcut, "WebGUI::Asset", +); + +#---------------------------------------------------------------------------- +# Test deleting a shortcut +# plan tests => +TODO: { + local $TODO = "Test deleting a shortcut."; +} + + From a2c75c64b9dcb56a69f8d1f2e9d80119561c7fe5 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 5 Oct 2007 00:28:22 +0000 Subject: [PATCH 02/15] Added tests for linked asset --- t/Asset/Shortcut/010-linked-asset.t | 126 ++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 t/Asset/Shortcut/010-linked-asset.t diff --git a/t/Asset/Shortcut/010-linked-asset.t b/t/Asset/Shortcut/010-linked-asset.t new file mode 100644 index 000000000..a6563706f --- /dev/null +++ b/t/Asset/Shortcut/010-linked-asset.t @@ -0,0 +1,126 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../lib"; + +## The goal of this test is to test the link between the asset and its shortcut +# and that changes to the asset are propagated to the shortcut + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::Shortcut; +use WebGUI::Asset::Snippet; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Shortcut Test"}); + +# Make a snippet to shortcut +my $snippet + = $node->addChild({ + className => "WebGUI::Asset::Snippet", + }); + +my $shortcut + = $node->addChild({ + className => "WebGUI::Asset::Shortcut", + shortcutToAssetId => $snippet->getId, + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + + +#---------------------------------------------------------------------------- +# Tests +plan tests => 10; + +#---------------------------------------------------------------------------- +# Test shortcut's link to original asset +# plan => 3 +my $original = $shortcut->getShortcut; + +ok( + defined $original, + "Original asset is defined", +); + +is( + blessed $original, blessed $snippet, + "Original asset class is correct", +); + +is( + $original->getId, $snippet->getId, + "Original assetId is correct" +); + +#---------------------------------------------------------------------------- +# Test trashing snippet trashes shortcut also +# plan tests => 3 +$snippet->trash; +$shortcut = WebGUI::Asset->newByDynamicClass($session, $shortcut->getId); + +ok( + defined $shortcut, + "Trash Linked Asset: Shortcut is defined", +); + +like( + $shortcut->get("state"), qr/^trash/, + "Trash Linked Asset: Shortcut state is trash", +); + +ok( + grep({ $_->getId eq $shortcut->getId } @{ $snippet->getAssetsInTrash }), + "Trash Linked Asset: Shortcut is in trash", +); + +#---------------------------------------------------------------------------- +# Test restoring snippet restores shortcut also +# plan tests => 3 +$snippet->publish; +$shortcut = WebGUI::Asset->newByDynamicClass($session, $shortcut->getId); + +ok( + defined $shortcut, + "Restore Linked Asset: Shortcut is defined", +); + +ok( + !grep({ $_->getId eq $shortcut->getId } @{ $snippet->getAssetsInTrash }), + "Restore Linked Asset: Shortcut is not in trash", +); + +#---------------------------------------------------------------------------- +# Test purging snippet purges shortcut also +# plan tests => 2 +$snippet->purge; +$shortcut = WebGUI::Asset->newByDynamicClass($session, $shortcut->getId); + +ok( + !defined $shortcut, + "Purge Linked Asset: Shortcut is not defined", +); + +ok( + !grep({ $_->getId eq $shortcut->getId } @{ $snippet->getAssetsInTrash }), + "Purge Linked Asset: Shortcut is not in trash", +); From fad056cfa5626f1179da2be16cfcac5bdaa18121 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 5 Oct 2007 20:30:46 +0000 Subject: [PATCH 03/15] add a bunch of tests --- t/Asset/File/010-setfile.t | 53 ++++++++++++++ t/Asset/File/020-editSave.t | 43 +++++++++++ t/Asset/File/Image/010-setfile.t | 48 +++++++++++++ t/Asset/File/Image/Photo/000-create-delete.t | 76 ++++++++++++++++++++ t/Asset/File/Image/Photo/010-setfile.t | 47 ++++++++++++ 5 files changed, 267 insertions(+) create mode 100644 t/Asset/File/010-setfile.t create mode 100644 t/Asset/File/020-editSave.t create mode 100644 t/Asset/File/Image/010-setfile.t create mode 100644 t/Asset/File/Image/Photo/000-create-delete.t create mode 100644 t/Asset/File/Image/Photo/010-setfile.t diff --git a/t/Asset/File/010-setfile.t b/t/Asset/File/010-setfile.t new file mode 100644 index 000000000..52e281b1c --- /dev/null +++ b/t/Asset/File/010-setfile.t @@ -0,0 +1,53 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of photo assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"File Test"}); +my $file + = $node->addChild({ + className => "WebGUI::Asset::File", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# setFile allows file path argument and fails if can't find file + +#---------------------------------------------------------------------------- +# setFile allows filehandle argument, requires name argument and removes old +# file + + + + diff --git a/t/Asset/File/020-editSave.t b/t/Asset/File/020-editSave.t new file mode 100644 index 000000000..2f8956407 --- /dev/null +++ b/t/Asset/File/020-editSave.t @@ -0,0 +1,43 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the correct function of the editSave and +# processPropertiesFromFormPost methods + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"File Test"}); +my $file + = $node->addChild({ + className => "WebGUI::Asset::File", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; diff --git a/t/Asset/File/Image/010-setfile.t b/t/Asset/File/Image/010-setfile.t new file mode 100644 index 000000000..48e8116e9 --- /dev/null +++ b/t/Asset/File/Image/010-setfile.t @@ -0,0 +1,48 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../lib"; + +## The goal of this test is to test the additional functionality of the +# overridden setFile method + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Image Test"}); +my $image + = $node->addChild({ + className => "WebGUI::Asset::File::Image", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# setFile also generates thumbnail + + diff --git a/t/Asset/File/Image/Photo/000-create-delete.t b/t/Asset/File/Image/Photo/000-create-delete.t new file mode 100644 index 000000000..5479ce664 --- /dev/null +++ b/t/Asset/File/Image/Photo/000-create-delete.t @@ -0,0 +1,76 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of photo assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 5; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 1 +use_ok("WebGUI::Asset::File::Image::Photo"); + +#---------------------------------------------------------------------------- +# Test creating a photo +# plan tests => 2 +my $photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +is( + blessed $photo, "WebGUI::Asset::File::Image::Photo", + "Photo is a WebGUI::Asset::File::Image::Photo object", +); + +isa_ok( + $photo, "WebGUI::Asset::File::Image", +); + +#---------------------------------------------------------------------------- +# Test deleting a photo +# plan tests => 2 +my $properties = $photo->get; +$photo->purge; + +is( + $photo, undef + "Photo is undefined", +); + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Photo no longer able to be instanciated", +); + diff --git a/t/Asset/File/Image/Photo/010-setfile.t b/t/Asset/File/Image/Photo/010-setfile.t new file mode 100644 index 000000000..145dce14e --- /dev/null +++ b/t/Asset/File/Image/Photo/010-setfile.t @@ -0,0 +1,47 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of photo assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# setFile also makes download versions + + From 5746ded766b20bfca3d14b6a76cebe57f23c32ec Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Tue, 9 Oct 2007 07:36:54 +0000 Subject: [PATCH 04/15] Added more tests. Cleaned up the OO of File and Image a bit (removed a healthy bit of unnecessary code from Image). Done with File and Image for the time being... --- lib/WebGUI/Asset/File.pm | 99 +++++++-- lib/WebGUI/Asset/File/Image.pm | 117 ++++------- lib/WebGUI/AssetTrash.pm | 1 + t/Asset/File.t | 2 + t/Asset/File/010-setfile.t | 22 +- .../{020-editSave.t => 020-www_editSave.t} | 0 t/Asset/File/Image/010-setfile.t | 16 +- .../File/Image/Photo/000-makeResolutions.t | 194 ++++++++++++++++++ t/Asset/File/Image/Photo/010-setfile.t | 25 ++- t/Asset/File/Image/Photo/100-comment.t | 48 +++++ t/Asset/Shortcut/000-create-delete.t | 6 +- t/lib/WebGUI/Test.pm | 112 +++++++++- 12 files changed, 523 insertions(+), 119 deletions(-) rename t/Asset/File/{020-editSave.t => 020-www_editSave.t} (100%) create mode 100644 t/Asset/File/Image/Photo/000-makeResolutions.t create mode 100644 t/Asset/File/Image/Photo/100-comment.t diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index da096ae3b..06acb45cc 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -16,6 +16,7 @@ package WebGUI::Asset::File; use strict; use base 'WebGUI::Asset'; +use Carp; use WebGUI::Cache; use WebGUI::Storage; use WebGUI::SQL; @@ -58,7 +59,7 @@ sub addRevision { my $properties = shift; if ($self->get("storageId") ne "") { - my $newStorage = WebGUI::Storage->get($self->session,$self->get("storageId"))->copy; + my $newStorage = $self->getStorageClass->get($self->session,$self->get("storageId"))->copy; $properties->{storageId} = $newStorage->getId; } @@ -221,20 +222,31 @@ sub getIcon { } +#---------------------------------------------------------------------------- + +=head2 getStorageClass + +Get the full classname of the WebGUI::Storage we should use for this asset. + +=cut + +sub getStorageClass { + return 'WebGUI::Storage'; +} + #------------------------------------------------------------------- =head2 getStorageFromPost -We have to wrap this operation because WebGUI::Asset::File::Image calls SUPER processPropertiesFormFormPost, -which gives it the wrong type of Storage object. +Get the storage location created by the form post. =cut sub getStorageFromPost { - my $self = shift; + my $self = shift; my $storageId = shift; my $fileStorageId = WebGUI::Form::File->new($self->session, {name => 'newFile', value=>$storageId })->getValueFromPost; - return WebGUI::Storage->get($self->session, $fileStorageId); + return $self->getStorageClass->get($self->session, $fileStorageId); } @@ -300,23 +312,23 @@ sub processPropertiesFromFormPost { $storageLocation->clear(); } - #Pass in the storage Id to prevent another one from being created. + # Pass in the storage Id to prevent another one from being created. my $storage = $self->getStorageFromPost($storageId); + if (defined $storage) { + my $filename = $storage->getFiles()->[0]; - if (defined $storage) { - my $filename = $storage->getFiles()->[0]; - - if (defined $filename) { - my %data; - $data{filename} = $filename; - $data{storageId} = $storage->getId; - $data{title} = $filename unless ($session->form->process("title")); - $data{menuTitle} = $filename unless ($session->form->process("menuTitle")); - $data{url} = $self->getParent->get('url').'/'.$filename unless ($session->form->process("url")); + if (defined $filename) { + my %data; + $data{filename} = $filename; + $data{storageId} = $storage->getId; + $data{title} = $filename unless ($session->form->process("title")); + $data{menuTitle} = $filename unless ($session->form->process("menuTitle")); + $data{url} = $self->getParent->get('url').'/'.$filename unless ($session->form->process("url")); $self->setStorageLocation($storage); - $self->update(\%data); - } - } + $self->update(\%data); + } + } + $self->applyConstraints; } @@ -327,7 +339,7 @@ sub purge { my $self = shift; my $sth = $self->session->db->read("select storageId from FileAsset where assetId=".$self->session->db->quote($self->getId)); while (my ($storageId) = $sth->array) { - WebGUI::Storage->get($self->session,$storageId)->delete; + $self->getStorageClass->get($self->session,$storageId)->delete; } $sth->finish; return $self->SUPER::purge; @@ -355,6 +367,30 @@ sub purgeRevision { return $self->SUPER::purgeRevision; } +#---------------------------------------------------------------------------- + +=head2 setFile ( filename ) + +Set the file being handled by this storage location with a file from the +system. + +=cut + +sub setFile { + my $self = shift; + my $filename = shift; + my $storage = $self->getStorageLocation; + + # Clear the old file if any + $storage->clear; + + $storage->addFileFromFilesystem($filename) + || croak "Couldn't setFile: " . join(", ",@{ $storage->getErrors }); + # NOTE: We should not croak here, the WebGUI::Storage should croak for us. + + $self->updatePropertiesFromStorage; +} + #------------------------------------------------------------------- sub setSize { my $self = shift; @@ -377,11 +413,11 @@ sub setStorageLocation { $self->{_storageLocation} = $storage; } elsif ($self->get("storageId") eq "") { - $self->{_storageLocation} = WebGUI::Storage->create($self->session); + $self->{_storageLocation} = $self->getStorageClass->create($self->session); $self->update({storageId=>$self->{_storageLocation}->getId}); } else { - $self->{_storageLocation} = WebGUI::Storage->get($self->session,$self->get("storageId")); + $self->{_storageLocation} = $self->getStorageClass->get($self->session,$self->get("storageId")); } } @@ -411,6 +447,25 @@ sub update { } } +#---------------------------------------------------------------------------- + +=head2 updatePropertiesFromStorage ( ) + +Updates the asset properties from the file tracked by this asset. Should be +called every time the file is changed to ensure the correct filename is +in the asset properties. + +=cut + +sub updatePropertiesFromStorage { + my $self = shift; + my $storage = $self->getStorageLocation; + my $filename = $storage->getFiles->[0]; + $self->update({ + filename => $filename, + }); +} + #------------------------------------------------------------------- sub view { my $self = shift; diff --git a/lib/WebGUI/Asset/File/Image.pm b/lib/WebGUI/Asset/File/Image.pm index ffa6cb19e..6edb48086 100644 --- a/lib/WebGUI/Asset/File/Image.pm +++ b/lib/WebGUI/Asset/File/Image.pm @@ -15,16 +15,13 @@ package WebGUI::Asset::File::Image; =cut use strict; -use WebGUI::Asset::File; +use base 'WebGUI::Asset::File'; use WebGUI::Storage::Image; use WebGUI::HTMLForm; use WebGUI::Utility; -our @ISA = qw(WebGUI::Asset::File); - - =head1 NAME Package WebGUI::Asset::File::Image @@ -106,27 +103,27 @@ A hash reference passed in from a subclass definition. =cut sub definition { - my $class = shift; - my $session = shift; - my $definition = shift; - my $i18n = WebGUI::International->new($session,"Asset_Image"); - push(@{$definition}, { - assetName=>$i18n->get('assetName'), - tableName=>'ImageAsset', - className=>'WebGUI::Asset::File::Image', - icon=>'image.gif', - properties=>{ - thumbnailSize=>{ - fieldType=>'integer', - defaultValue=>$session->setting->get("thumbnailSize") - }, - parameters=>{ - fieldType=>'textarea', - defaultValue=>'style="border-style:none;"' - } - } - }); - return $class->SUPER::definition($session,$definition); + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session,"Asset_Image"); + push @{$definition}, { + assetName => $i18n->get('assetName'), + tableName => 'ImageAsset', + className => 'WebGUI::Asset::File::Image', + icon => 'image.gif', + properties => { + thumbnailSize => { + fieldType => 'integer', + defaultValue => $session->setting->get("thumbnailSize"), + }, + parameters => { + fieldType => 'textarea', + defaultValue => 'style="border-style:none;"', + }, + }, + }; + return $class->SUPER::definition($session,$definition); } @@ -192,37 +189,16 @@ sub getEditForm { return $tabform; } +#---------------------------------------------------------------------------- +=head2 getStorageClass -#------------------------------------------------------------------- - -=head2 getStorageFromPost - -Sub class this method from WebGUI::Asset::File so the storage object is the correct type. +Returns the class name of the WebGUI::Storage we should use for this asset. =cut -sub getStorageFromPost { - my $self = shift; - my $storageId = shift; - my $fileStorageId = WebGUI::Form::Image->new($self->session, {name => 'newFile', value=>$storageId })->getValueFromPost; - return WebGUI::Storage::Image->get($self->session, $fileStorageId); -} - - -#------------------------------------------------------------------- - -sub getStorageLocation { - my $self = shift; - unless (exists $self->{_storageLocation}) { - if ($self->get("storageId") eq "") { - $self->{_storageLocation} = WebGUI::Storage::Image->create($self->session); - $self->update({storageId=>$self->{_storageLocation}->getId}); - } else { - $self->{_storageLocation} = WebGUI::Storage::Image->get($self->session,$self->get("storageId")); - } - } - return $self->{_storageLocation}; +sub getStorageClass { + return 'WebGUI::Storage::Image'; } #------------------------------------------------------------------- @@ -261,31 +237,6 @@ sub prepareView { $self->{_viewTemplate} = $template; } - -#------------------------------------------------------------------- -sub processPropertiesFromFormPost { - my $self = shift; - $self->SUPER::processPropertiesFromFormPost; - $self->applyConstraints; -} - -#------------------------------------------------------------------- - -sub setStorageLocation { - my $self = shift; - my $storage = shift; - if (defined $storage) { - $self->{_storageLocation} = $storage; - } - elsif ($self->get("storageId") eq "") { - $self->{_storageLocation} = WebGUI::Storage::Image->create($self->session); - $self->update({storageId=>$self->{_storageLocation}->getId}); - } - else { - $self->{_storageLocation} = WebGUI::Storage::Image->get($self->session,$self->get("storageId")); - } -} - #------------------------------------------------------------------- sub view { my $self = shift; @@ -305,6 +256,20 @@ sub view { return $out; } +#---------------------------------------------------------------------------- + +=head2 setFile ( filename ) + +Extend the superclass setFile to automatically generate thumbnails. + +=cut + +sub setFile { + my $self = shift; + $self->SUPER::setFile(@_); + $self->generateThumbnail; +} + #------------------------------------------------------------------- sub www_edit { my $self = shift; diff --git a/lib/WebGUI/AssetTrash.pm b/lib/WebGUI/AssetTrash.pm index 457d7968a..4922474d9 100644 --- a/lib/WebGUI/AssetTrash.pm +++ b/lib/WebGUI/AssetTrash.pm @@ -15,6 +15,7 @@ package WebGUI::Asset; =cut use strict; +use WebGUI::Asset::Shortcut; =head1 NAME diff --git a/t/Asset/File.t b/t/Asset/File.t index c3db89e46..74e524216 100644 --- a/t/Asset/File.t +++ b/t/Asset/File.t @@ -26,6 +26,8 @@ use Test::More; # increment this value for each test you create use Test::Deep; plan tests => 9; +#TODO: This script tests certain aspects of WebGUI::Storage and it should not + my $session = WebGUI::Test->session; ##Create a storage location diff --git a/t/Asset/File/010-setfile.t b/t/Asset/File/010-setfile.t index 52e281b1c..e7a6f8e9a 100644 --- a/t/Asset/File/010-setfile.t +++ b/t/Asset/File/010-setfile.t @@ -10,7 +10,7 @@ use FindBin; use strict; -use lib "$FindBin::Bin/../../../../lib"; +use lib "$FindBin::Bin/../../lib"; ## The goal of this test is to test the creation and deletion of photo assets @@ -39,15 +39,25 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 0; +plan tests => 2; #---------------------------------------------------------------------------- # setFile allows file path argument and fails if can't find file +# plan tests => 1 +ok( + !eval { $file->setFile( WebGUI::Test->getTestCollateralPath("DOES_NOT_EXIST.NO") ); 1}, + "setFile allows file path argument and croaks if can't find file" +); #---------------------------------------------------------------------------- -# setFile allows filehandle argument, requires name argument and removes old -# file - - +# setFile allows file path argument and adds the file +# plan tests => 1 +$file->setFile( WebGUI::Test->getTestCollateralPath("WebGUI.pm") ); +my $storage = $file->getStorageLocation; + +is_deeply( + $storage->getFiles, ['WebGUI.pm'], + "Storage location contains only the file we added", +); diff --git a/t/Asset/File/020-editSave.t b/t/Asset/File/020-www_editSave.t similarity index 100% rename from t/Asset/File/020-editSave.t rename to t/Asset/File/020-www_editSave.t diff --git a/t/Asset/File/Image/010-setfile.t b/t/Asset/File/Image/010-setfile.t index 48e8116e9..ad02b7524 100644 --- a/t/Asset/File/Image/010-setfile.t +++ b/t/Asset/File/Image/010-setfile.t @@ -40,9 +40,23 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 0; +plan tests => 2; #---------------------------------------------------------------------------- +# setFile allows file path argument and adds the file # setFile also generates thumbnail +# plan tests => 2 +$image->setFile( WebGUI::Test->getTestCollateralPath("page_title.jpg") ); +my $storage = $image->getStorageLocation; +is_deeply( + $storage->getFiles, ['page_title.jpg'], + "Storage location contains only the file we added", +); + +# We must do a filesystem test because getFiles doesn't include 'thumb-' +ok( + -e $storage->getPath('thumb-page_title.jpg'), + "Thumbnail file exists on the filesystem", +); diff --git a/t/Asset/File/Image/Photo/000-makeResolutions.t b/t/Asset/File/Image/Photo/000-makeResolutions.t new file mode 100644 index 000000000..974f3b4a3 --- /dev/null +++ b/t/Asset/File/Image/Photo/000-makeResolutions.t @@ -0,0 +1,194 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation of photo download +# resolutions + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); + +my ($gallery, $album, $photo); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Photo not added under a Photo Gallery asset does NOT generate any +# default resolutions +$photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->getStorageLocation->addFileFromFilesystem( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); + +ok( + eval{ $photo->makeResolutions(); 1 }, + "makeResolutions succeeds when photo not under photo gallery and no resolutions to make", +); + +is_deeply( + $photo->getStorageLocation->getFiles, ['page_title.jpg'], + "makeResolutions does not make any extra resolutions when photo not under photo gallery", +); + +#---------------------------------------------------------------------------- +# makeResolutions allows API to specify resolutions to make as array reference +# argument +$photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->getStorageLocation->addFileFromFilesystem( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); + +ok( + !eval{ $photo->makeResolutions('100x100','200x200'); 1 }, + "makeResolutions fails when first argument is not array reference", +); + +ok( + eval{ $photo->makeResolutions(['100x100','200x200']); 1 }, + "makeResolutions succeeds when first argument is array reference of resolutions to make", +); + +is_deeply( + [ sort({ $a cmp $b} @{ $photo->getStorageLocation->getFiles }) ], + ['100x100.jpg', '200x200.jpg', 'page_title.jpg'], + "makeResolutions makes all the required resolutions with the appropriate names.", +); + +TODO: { + local $TODO = 'Test to ensure the files are created with correct resolution and density'; +} + +#---------------------------------------------------------------------------- +# makeResolutions throws a warning on an invalid resolution but keeps going +$photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->getStorageLocation->addFileFromFilesystem( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); +{ # localize our signal handler + my @warnings; + local $SIG{__WARN__} = sub { push @warnings, $_[0]; }; + + ok( + eval{ $photo->makeResolutions(['abc','200','3d400']); 1 }, + "makeResolutions succeeds when invalid resolutions are given", + ); + + is( + scalar @warnings, 2, + "makeResolutions throws a warning for each invalid resolution given", + ); + + like( + $warnings[0], qr/abc/, + "makeResolutions throws a warning for the correct invalid resolution 'abc'", + ); + + like( + $warnings[1], qr/3d400/, + "makeResolutions throws a warning for the correct invalid resolution '3d400'", + ); + + is_deeply( + [ sort({ $a cmp $b} @{ $photo->getStorageLocation->getFiles }) ], + ['200.jpg', 'page_title.jpg'], + "makeResolutions still makes valid resolutions when invalid resolutions given", + ); +} + +#---------------------------------------------------------------------------- +# makeResolutions gets default resolutions from a parent Photo Gallery asset +$gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + imageResolutions => "1600x1200\n1024x768\n800x600\n640x480", + }); +$album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->getStorageLocation->addFileFromFilesystem( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); + +ok( + eval{ $photo->makeResolutions; 1 }, + "makeResolutions succeeds when photo under photo gallery and no resolution given", +); + +is_deeply( + [ sort({ $a cmp $b} @{ $photo->getStorageLocation->getFiles }) ], + [ '1024x768.jpg', '1600x1200.jpg', '640x480.jpg', '800x600.jpg', 'page_title.jpg' ], + "makeResolutions makes all the required resolutions with the appropriate names.", +); + +TODO: { + local $TODO = 'Test to ensure the files are created with correct resolution and density'; +} + +#---------------------------------------------------------------------------- +# Array of resolutions passed to makeResolutions overrides defaults from +# parent asset +$gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + imageResolutions => "1600x1200\n1024x768\n800x600\n640x480", + }); +$album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->getStorageLocation->addFileFromFilesystem( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); + +ok( + !eval{ $photo->makeResolutions('100x100','200x200'); 1 }, + "makeResolutions fails when first argument is not array reference", +); + +ok( + eval{ $photo->makeResolutions(['100x100','200x200']); 1 }, + "makeResolutions succeeds when first argument is array reference of resolutions to make", +); + +is_deeply( + [ sort({ $a cmp $b} @{ $photo->getStorageLocation->getFiles }) ], + ['100x100.jpg', '200x200.jpg', 'page_title.jpg'], + "makeResolutions makes all the required resolutions with the appropriate names.", +); + +TODO: { + local $TODO = 'Test to ensure the files are created with correct resolution and density'; +} + diff --git a/t/Asset/File/Image/Photo/010-setfile.t b/t/Asset/File/Image/Photo/010-setfile.t index 145dce14e..9a0895ca5 100644 --- a/t/Asset/File/Image/Photo/010-setfile.t +++ b/t/Asset/File/Image/Photo/010-setfile.t @@ -26,8 +26,17 @@ my $session = WebGUI::Test->session; my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); -my $photo +my $gallery = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + imageResolutions => "1024x768", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", }); @@ -39,9 +48,21 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 0; +plan tests => 2; #---------------------------------------------------------------------------- # setFile also makes download versions +$photo->setFile( WebGUI::Test->getTestCollateralPath('page_title.jpg') ); +my $storage = $photo->getStorageLocation; + +is_deeply( + $storage->getFiles, ['page_title.jpg'], + "Storage location contains only the file we added", +); + +ok( + -e $storage->getPath($gallery->get('imageResolutions') . '.jpg'), + "Generated resolution file exists on the filesystem", +); diff --git a/t/Asset/File/Image/Photo/100-comment.t b/t/Asset/File/Image/Photo/100-comment.t new file mode 100644 index 000000000..085d41823 --- /dev/null +++ b/t/Asset/File/Image/Photo/100-comment.t @@ -0,0 +1,48 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the adding, deleting, editing, and +# getting comments for photos + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# + + diff --git a/t/Asset/Shortcut/000-create-delete.t b/t/Asset/Shortcut/000-create-delete.t index 01051d23e..d93ff4ebf 100644 --- a/t/Asset/Shortcut/000-create-delete.t +++ b/t/Asset/Shortcut/000-create-delete.t @@ -40,12 +40,12 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 2; +plan tests => 3; #---------------------------------------------------------------------------- # Test module compiles okay -# plan tests => 0 -BEGIN { use_ok("WebGUI::Asset::Shortcut"); } +# plan tests => 1 +use_ok("WebGUI::Asset::Shortcut"); #---------------------------------------------------------------------------- # Test creating a shortcut to snippet diff --git a/t/lib/WebGUI/Test.pm b/t/lib/WebGUI/Test.pm index 460c13873..4fb17e393 100644 --- a/t/lib/WebGUI/Test.pm +++ b/t/lib/WebGUI/Test.pm @@ -108,29 +108,123 @@ END { $SESSION->close if defined $SESSION; } -sub file { - return $CONFIG_FILE; -} sub config { return undef unless defined $SESSION; return $SESSION->config; } -sub lib { - return $WEBGUI_LIB; +sub file { + return $CONFIG_FILE; } -sub session { - return $SESSION; +#---------------------------------------------------------------------------- + +=head2 getPage ( asset, pageName [, opts] ) + +Get the entire response from a page request. asset is a WebGUI::Asset object. +pageName is the name of the page subroutine to run. options is a hash reference +of options with keys outlined below. + + args => Array reference of arguments to the pageName sub + user => A user object to set for this request + userId => A userId to set for this request + formParams => A hash reference of form parameters + uploads => A hash reference of files to "upload" + +=cut + +sub getPage { + my $session = shift; # The session object + my $asset = shift; # The asset object + my $page = shift; # The page subroutine + my $optionsRef = shift; # A hashref of options + # args => Array ref of args to the page sub + # user => A user object to set + # userId => A user ID to set, "user" takes + # precedence + + #!!! GETTING COOKIES WITH WebGUI::PseudoRequest DOESNT WORK, SO WE USE + # THIS AS A WORKAROUND + $session->http->{_http}->{noHeader} = 1; + + # Open a buffer as a filehandle + my $buffer = ""; + open my $output, ">", \$buffer or die "Couldn't open memory buffer as filehandle: $@"; + $session->output->setHandle($output); + + # Set the appropriate user + my $oldUser = $session->user; + if ($optionsRef->{user}) { + $session->user({ user => $optionsRef->{user} }); + } + elsif ($optionsRef->{userId}) { + $session->user({ userId => $optionsRef->{userId} }); + } + $session->user->uncache; + + # Create a new request object + my $oldRequest = $session->request; + my $request = WebGUI::PseudoRequest->new; + $request->setup_param($optionsRef->{formParams}); + $session->{_request} = $request; + + # Fill the buffer + my $returnedContent = $asset->$page(@{$optionsRef->{args}}); + if ($returnedContent && $returnedContent ne "chunked") { + print $output $returnedContent; + } + + close $output; + + # Restore the former user and request + $session->user({ user => $oldUser }); + $session->{_request} = $oldRequest; + + #!!! RESTORE THE WORKAROUND + delete $session->http->{_http}->{noHeader}; + + # Return the page's output + return $buffer; +} + +#---------------------------------------------------------------------------- + +=head2 getTestCollateralPath ( [filename] ) + +Returns the full path to the directory containing the collateral files to be +used for testing. + +Optionally adds a filename to the end. + +=cut + +sub getTestCollateralPath { + my $class = shift; + my $filename = shift; + return File::Spec->catfile($WEBGUI_TEST_COLLATERAL,$filename); +} + +sub lib { + return $WEBGUI_LIB; } sub root { return $WEBGUI_ROOT; } -sub getTestCollateralPath { - return $WEBGUI_TEST_COLLATERAL; +sub session { + return $SESSION; } + +#---------------------------------------------------------------------------- + +=head1 BUGS + +When trying to load the APR module, perl invariably throws an Out Of Memory +error. For this reason, getPage disables header processing. + +=cut + 1; From a461c437cdca963184d3de55e2c52792634f1f3b Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Wed, 10 Oct 2007 19:28:08 +0000 Subject: [PATCH 05/15] moving files --- .../{000-makeResolutions.t => 010-makeResolutions.t} | 9 +++++++++ 1 file changed, 9 insertions(+) rename t/Asset/File/Image/Photo/{000-makeResolutions.t => 010-makeResolutions.t} (96%) diff --git a/t/Asset/File/Image/Photo/000-makeResolutions.t b/t/Asset/File/Image/Photo/010-makeResolutions.t similarity index 96% rename from t/Asset/File/Image/Photo/000-makeResolutions.t rename to t/Asset/File/Image/Photo/010-makeResolutions.t index 974f3b4a3..7d7c4744a 100644 --- a/t/Asset/File/Image/Photo/000-makeResolutions.t +++ b/t/Asset/File/Image/Photo/010-makeResolutions.t @@ -19,6 +19,15 @@ use Scalar::Util qw( blessed ); use WebGUI::Test; use WebGUI::Session; use Test::More; +my $graphicsClass; +BEGIN { + if (eval { require Graphics::Magick; 1 }) { + $graphicsClass = 'Graphics::Magick'; + } + elsif (eval { require Image::Magick; 1 }) { + $graphicsClass = 'Image::Magick'; + } +} use WebGUI::Asset::File::Image::Photo; #---------------------------------------------------------------------------- From 2accef7a9ddd0ad0e29a25048fad532455f96c26 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Wed, 10 Oct 2007 19:29:36 +0000 Subject: [PATCH 06/15] moving files --- t/Asset/File/Image/Photo/{100-comment.t => comment.t} | 0 t/Asset/File/Image/Photo/{000-create-delete.t => create-delete.t} | 0 .../File/Image/Photo/{010-makeResolutions.t => makeResolutions.t} | 0 t/Asset/File/Image/Photo/{010-setfile.t => setFile.t} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename t/Asset/File/Image/Photo/{100-comment.t => comment.t} (100%) rename t/Asset/File/Image/Photo/{000-create-delete.t => create-delete.t} (100%) rename t/Asset/File/Image/Photo/{010-makeResolutions.t => makeResolutions.t} (100%) rename t/Asset/File/Image/Photo/{010-setfile.t => setFile.t} (100%) diff --git a/t/Asset/File/Image/Photo/100-comment.t b/t/Asset/File/Image/Photo/comment.t similarity index 100% rename from t/Asset/File/Image/Photo/100-comment.t rename to t/Asset/File/Image/Photo/comment.t diff --git a/t/Asset/File/Image/Photo/000-create-delete.t b/t/Asset/File/Image/Photo/create-delete.t similarity index 100% rename from t/Asset/File/Image/Photo/000-create-delete.t rename to t/Asset/File/Image/Photo/create-delete.t diff --git a/t/Asset/File/Image/Photo/010-makeResolutions.t b/t/Asset/File/Image/Photo/makeResolutions.t similarity index 100% rename from t/Asset/File/Image/Photo/010-makeResolutions.t rename to t/Asset/File/Image/Photo/makeResolutions.t diff --git a/t/Asset/File/Image/Photo/010-setfile.t b/t/Asset/File/Image/Photo/setFile.t similarity index 100% rename from t/Asset/File/Image/Photo/010-setfile.t rename to t/Asset/File/Image/Photo/setFile.t From 983a725558ce58f8c939978625c680fa852a31e1 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Thu, 11 Oct 2007 18:45:58 +0000 Subject: [PATCH 07/15] more tests --- lib/WebGUI/Asset/File.pm | 1 + lib/WebGUI/Asset/File/Image/Photo.pm | 189 ++++++++++++++++ t/Asset/File/020-www_editSave.t | 43 ---- .../Image/Photo/{create-delete.t => 00base.t} | 35 ++- t/Asset/File/Image/Photo/comment.t | 206 +++++++++++++++++- t/Asset/File/Image/Photo/makeShortcut.t | 122 +++++++++++ t/Asset/File/Image/Photo/permissions.t | 129 +++++++++++ .../File/Image/{010-setfile.t => setfile.t} | 0 t/Asset/File/{010-setfile.t => setfile.t} | 0 9 files changed, 678 insertions(+), 47 deletions(-) create mode 100644 lib/WebGUI/Asset/File/Image/Photo.pm delete mode 100644 t/Asset/File/020-www_editSave.t rename t/Asset/File/Image/Photo/{create-delete.t => 00base.t} (71%) create mode 100644 t/Asset/File/Image/Photo/makeShortcut.t create mode 100644 t/Asset/File/Image/Photo/permissions.t rename t/Asset/File/Image/{010-setfile.t => setfile.t} (100%) rename t/Asset/File/{010-setfile.t => setfile.t} (100%) diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index 06acb45cc..2202e8489 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -389,6 +389,7 @@ sub setFile { # NOTE: We should not croak here, the WebGUI::Storage should croak for us. $self->updatePropertiesFromStorage; + $self->applyConstraints; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm new file mode 100644 index 000000000..fd54b2094 --- /dev/null +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -0,0 +1,189 @@ +package WebGUI::Asset::File::Image::Photo; + +=head1 LEGAL + + ------------------------------------------------------------------- + WebGUI is Copyright 2001-2007 Plain Black Corporation. + ------------------------------------------------------------------- + Please read the legal notices (docs/legal.txt) and the license + (docs/license.txt) that came with this distribution before using + this software. + ------------------------------------------------------------------- + http://www.plainblack.com info@plainblack.com + ------------------------------------------------------------------- + +=cut + +use strict; +use Tie::IxHash; +use base 'WebGUI::Asset::File::Image'; +use WebGUI::Utility; + + +=head1 NAME + +WebGUI::Asset::File::Image::Photo + +=head1 DESCRIPTION + + +=head1 SYNOPSIS + +use WebGUI::Asset::File::Image::Photo + + +=head1 METHODS + +These methods are available from this class: + +=cut + +#------------------------------------------------------------------- + +=head2 definition ( session, definition ) + +defines asset properties for New Asset instances. You absolutely need +this method in your new Assets. + +=head3 session + +=head3 definition + +A hash reference passed in from a subclass definition. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = $class->i18n($session); + + tie my %properties, 'Tie::IxHash', ( + + + ); + + push @{$definition}, { + assetName => $i18n->get('assetName'), + icon => 'Image.gif', + tableName => 'Photo', + className => 'WebGUI::Asset::File::Image::Photo', + i18n => 'Asset_Photo', + properties => \%properties, + }; + return $class->SUPER::definition($session, $definition); +} + +#------------------------------------------------------------------- + +=head2 i18n ( [ session ] ) + +Get a WebGUI::International object for this class. + +Can be called as a class method, in which case a WebGUI::Session object +must be passed in. + +Can be called as an object method, in which case the session is +filled in automatically. + +#------------------------------------------------------------------- + +=head2 processPropertiesFromFormPost ( ) + +Used to process properties from the form posted. Do custom things with +noFormPost fields here, or do whatever you want. This method is called +when /yourAssetUrl?func=editSave is requested/posted. + +=cut + +sub processPropertiesFromFormPost { + my $self = shift; + $self->SUPER::processPropertiesFromFormPost; +} + + +#------------------------------------------------------------------- + +=head2 purge ( ) + +This method is called when data is purged by the system. +removes collateral data associated with a NewAsset when the system +purges it's data. This method is unnecessary, but if you have +auxiliary, ancillary, or "collateral" data or files related to your +asset instances, you will need to purge them here. + +=cut + +sub purge { + my $self = shift; + return $self->SUPER::purge; +} + +#------------------------------------------------------------------- + +=head2 purgeRevision ( ) + +This method is called when data is purged by the system. + +=cut + +sub purgeRevision { + my $self = shift; + return $self->SUPER::purgeRevision; +} + +#------------------------------------------------------------------- +=head2 view ( ) + +method called by the container www_view method. + +=cut + +sub view { + my $self = shift; + my $var = $self->get; # $var is a hash reference. + $var->{controls} = $self->getToolbar; + $var->{fileUrl} = $self->getFileUrl; + $var->{fileIcon} = $self->getFileIconUrl; + return $self->processTemplate($var,undef, $self->{_viewTemplate}); +} + + +#------------------------------------------------------------------- + +=head2 www_edit ( ) + +Web facing method which is the default edit page + +=cut + +sub www_edit { + my $self = shift; + return $self->session->privilege->insufficient() unless $self->canEdit; + return $self->session->privilege->locked() unless $self->canEditIfLocked; + return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get('edit asset',"Asset_NewAsset")); +} + +#------------------------------------------------------------------- + +=head2 www_view ( ) + +Web facing method which is the default view page. This method does a +302 redirect to the "showPage" file in the storage location. + +=cut + +sub www_view { + my $self = shift; + return $self->session->privilege->noAccess() unless $self->canView; + if ($self->session->var->isAdminOn) { + return $self->getContainer->www_view; + } + $self->session->http->setRedirect($self->getFileUrl($self->getValue("showPage"))); + return ""; +} + + +1; + diff --git a/t/Asset/File/020-www_editSave.t b/t/Asset/File/020-www_editSave.t deleted file mode 100644 index 2f8956407..000000000 --- a/t/Asset/File/020-www_editSave.t +++ /dev/null @@ -1,43 +0,0 @@ -#------------------------------------------------------------------- -# WebGUI is Copyright 2001-2007 Plain Black Corporation. -#------------------------------------------------------------------- -# Please read the legal notices (docs/legal.txt) and the license -# (docs/license.txt) that came with this distribution before using -# this software. -#------------------------------------------------------------------- -# http://www.plainblack.com info@plainblack.com -#------------------------------------------------------------------- - -use FindBin; -use strict; -use lib "$FindBin::Bin/../../../../lib"; - -## The goal of this test is to test the correct function of the editSave and -# processPropertiesFromFormPost methods - -use Scalar::Util qw( blessed ); -use WebGUI::Test; -use WebGUI::Session; -use Test::More; -use WebGUI::Asset::File; - -#---------------------------------------------------------------------------- -# Init -my $session = WebGUI::Test->session; -my $node = WebGUI::Asset->getImportNode($session); -my $versionTag = WebGUI::VersionTag->getWorking($session); -$versionTag->set({name=>"File Test"}); -my $file - = $node->addChild({ - className => "WebGUI::Asset::File", - }); - -#---------------------------------------------------------------------------- -# Cleanup -END { - $versionTag->rollback(); -} - -#---------------------------------------------------------------------------- -# Tests -plan tests => 0; diff --git a/t/Asset/File/Image/Photo/create-delete.t b/t/Asset/File/Image/Photo/00base.t similarity index 71% rename from t/Asset/File/Image/Photo/create-delete.t rename to t/Asset/File/Image/Photo/00base.t index 5479ce664..f3137e98b 100644 --- a/t/Asset/File/Image/Photo/create-delete.t +++ b/t/Asset/File/Image/Photo/00base.t @@ -43,7 +43,6 @@ use_ok("WebGUI::Asset::File::Image::Photo"); #---------------------------------------------------------------------------- # Test creating a photo -# plan tests => 2 my $photo = $node->addChild({ className => "WebGUI::Asset::File::Image::Photo", @@ -58,9 +57,13 @@ isa_ok( $photo, "WebGUI::Asset::File::Image", ); +is( + $photo->getGallery, undef, + "Photo->getGallery returns undef if photo not part of a Photo Gallery", +); + #---------------------------------------------------------------------------- # Test deleting a photo -# plan tests => 2 my $properties = $photo->get; $photo->purge; @@ -74,3 +77,31 @@ is( "Photo no longer able to be instanciated", ); +#---------------------------------------------------------------------------- +# Test creating a photo as part of a photo album +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +is( + blessed $photo, "WebGUI::Asset::File::Image::Photo", + "Photo is a WebGUI::Asset::File::Image::Photo object", +); + +isa_ok( + $photo, "WebGUI::Asset::File::Image", +); + +is( + blessed $photo->getGallery, "WebGUI::Asset::Wobject::PhotoGallery", + "Photo->getGallery gets the gallery containing this photo", +); diff --git a/t/Asset/File/Image/Photo/comment.t b/t/Asset/File/Image/Photo/comment.t index 085d41823..0430b4b86 100644 --- a/t/Asset/File/Image/Photo/comment.t +++ b/t/Asset/File/Image/Photo/comment.t @@ -27,8 +27,17 @@ my $session = WebGUI::Test->session; my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); -my $photo +my $gallery = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + groupIdAddComment => "2", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", }); @@ -43,6 +52,199 @@ END { plan tests => 0; #---------------------------------------------------------------------------- -# +# Test with no comments +is( + blessed $photo->getCommentPaginator, "WebGUI::Paginator", + "Photo with no comments still provides comments paginator", +); + +is_deeply( + $photo->getCommentIds, [], + "Photo->getCommentIds returns an empty arrayref when no comments", +); + +#---------------------------------------------------------------------------- +# Test the setComment requires two arguments +ok( + !eval{ $photo->setComment(); 1 }, + "Photo->setComment fails when no arguments given", +); + +ok( + !eval{ $photo->setComment("new"); 1 }, + "Photo->setComment fails when no second argument given", +); + +ok( + !eval{ $photo->setComment("new", "lulz"); 1 }, + "Photo->setComment fails when second argument is not a hashref", +); + +ok( + !eval{ $photo->setComment("new", { lulz => "ohai" }); 1 }, + "Photo->setComment fails when hashref does not contain a bodyText key", +); + +#---------------------------------------------------------------------------- +# Test adding a comment +# - bodyText is defined +# - All else is defaults +my $commentId; +ok( + eval{ $commentId = $photo->setComment("new", { bodyText => "bodyText", }); 1 }, + "Photo->setComment succeeds", +); + +is_deeply( + $photo->getCommentIds, [$commentId], + "Photo->getCommentIds returns newly added comment's ID", +); + +my $comment; +ok( + eval{ $comment = $photo->getComment($commentId); 1}, + "Photo->getComment does not croak.", +); + +is( + ref $comment, "HASH", + "Photo->getComment returns a hash reference", +); + +is( + $comment->{assetId}, $photo->getId, + "Comment has correct assetId", +); + +is( + $comment->{userId}, $session->user->userId, + "Comment has correct userId", +); + +is( + $comment->{visitorIp}, undef, + "visitorIp is not defined if the user is not a visitor", +); + +like( + $comment->{creationDate}, /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/, + "creationDate is defined and is a MySQL-formatted date", +); + +#---------------------------------------------------------------------------- +# Test adding a comment +# - bodyText is defined +# - userId is visitor +# - all else is defaults +ok( + eval{ $commentId = $photo->setComment("new", { userId => 1, bodyText => "bodyText", }); 1 }, + "Photo->setComment succeeds", +); + +ok( + grep { $_ eq $commentId } @{ $photo->getCommentIds }, + "Photo->getCommentIds returns newly added comment's ID", +); + +my $comment; +ok( + eval{ $comment = $photo->getComment($commentId); 1}, + "Photo->getComment does not croak.", +); + +is( + ref $comment, "HASH", + "Photo->getComment returns a hash reference", +); + +is( + $comment->{assetId}, $photo->getId, + "Comment has correct assetId", +); + +is( + $comment->{userId}, 1, + "Comment has correct userId", +); + +ok( + $comment->{visitorIp}, + "visitorIp is defined since user is visitor", +); + +like( + $comment->{creationDate}, /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/, + "creationDate is defined and is a MySQL-formatted date", +); + +#---------------------------------------------------------------------------- +# Test deleting comment +$photo->deleteComment($commentId); +ok( + !grep { $_ eq $commentId } @{ $photo->getCommentIds }, + "Photo->getCommentIds no longer contains deleted comment", +); + +#---------------------------------------------------------------------------- +# Test deleting asset deletes comments +my $assetId = $photo->getId; +$photo->purge; +ok( + !$session->db->quickScalar("SELECT commentId FROM Photo_comment WHERE assetId=?",[$assetId]), + "Comments are purged along with asset", +); + +#---------------------------------------------------------------------------- +# Test appendTemplateVarsForCommentForm +TODO: { + local $TODO = "Test appendTemplateVarsForCommentForm"; +} + +#---------------------------------------------------------------------------- +# Test www_addCommentSave page sanity checks +my $html; +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +# Permissions +$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { + userId => 1, + formParams => { bodyText => "yes?" }, + }); + +like( + $html, qr/permission denied/i, + "www_addCommentSave -- Permission denied if not Gallery->canAddComment", +); + +# Required fields +$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { + userId => 2, + formParams => { }, + }); + +like( + $html, WebGUI::International->get($session, "Asset_Photo", "www_addCommentSave error missing required"), + "www_addCommentSave -- Must have bodyText defined", +); +#---------------------------------------------------------------------------- +# Test www_addCommentSave functionality +$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { + userId => 2, + formParams => { bodyText => "YES!", }, + }); + +like( + $html, WebGUI::International->get($session, "Asset_Photo", "www_addCommentSave success"), + "www_addCommentSave -- page shows success message", +); + +my $ids = $photo->getCommentIds; +is( + scalar @$ids, 1, + "www_addCommentSave -- Comment was added", +); diff --git a/t/Asset/File/Image/Photo/makeShortcut.t b/t/Asset/File/Image/Photo/makeShortcut.t new file mode 100644 index 000000000..09bc5e075 --- /dev/null +++ b/t/Asset/File/Image/Photo/makeShortcut.t @@ -0,0 +1,122 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to test the makeShortcut method and www_makeShortcut +# pages + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $otherParent + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Layout", + }); +my $photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + userDefined1 => "ORIGINAL", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# makeShortcut argument checking +ok( + !eval{ $photo->makeShortcut(); 1 }, + "Photo->makeShortcut requires at least one argument", +); + +ok( + !eval{ $photo->makeShortcut("", ""); 1}, + "Photo->makeShortcut fails if second argument is not hash reference", +); + +ok( + !eval{ $photo->makeShortcut(""); 1}, + "Photo->makeShortcut fails if given parent cannot be instanciated", +); + +#---------------------------------------------------------------------------- +# makeShortcut returns a reference to the new Shortcut asset +my $shortcut; +ok( + eval{ $shortcut = $photo->makeShortcut($otherParent->getId); 1}, + "Photo->makeShortcut succeeds when valid assetId is given", +); + +is( + blessed $shortcut, "WebGUI::Asset::Shortcut", + "Photo->makeShortcut returns a WebGUI::Shortcut asset", +); + +is( + $shortcut->getShortcutOriginal->getId, $photo->getId, + "Photo->makeShortcut makes a shortcut to the correct asset", +); + +#---------------------------------------------------------------------------- +# makeShortcut creates the appropriate overrides +my $overrides = { + userDefined1 => "OVERRIDDEN", +}; +ok( + eval{ $shortcut = $photo->makeShortcut($otherParent->getId, $overrides); 1}, + "Photo->makeShortcut succeeds when valid assetId is given", +); + +is( + blessed $shortcut, "WebGUI::Asset::Shortcut", + "Photo->makeShortcut returns a WebGUI::Shortcut asset", +); + +is( + $shortcut->getShortcutOriginal->getId, $photo->getId, + "Photo->makeShortcut makes a shortcut to the correct asset", +); + +is_deeply( + {$shortcut->getShortcutOverrides}, $overrides, + "Photo->makeShortcut makes a shortcut with the correct overrides", +); + +#---------------------------------------------------------------------------- +# www_makeShortcut is only available to those who can edit the photo +my $html = WebGUI::Test->getPage($photo, "www_makeShortcut", { + userId => 1, + }); + +like( + $html, qr/permission denied/i, + "www_makeShortcut is not allowed to those who can't edit the photo", +); + +#---------------------------------------------------------------------------- +# www_makeShortcut diff --git a/t/Asset/File/Image/Photo/permissions.t b/t/Asset/File/Image/Photo/permissions.t new file mode 100644 index 000000000..1f978212d --- /dev/null +++ b/t/Asset/File/Image/Photo/permissions.t @@ -0,0 +1,129 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# Test permissions of Photo assets + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my ($photo); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# Photo assets outside of Gallery assets + +# Everyone can view, Admins can edit, Owned by current user +$photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + groupIdView => "7", + groupIdEdit => "3", + ownerUserId => $session->user->userId, + }); + +ok( $photo->canView(1), "Visitor can view" ); +ok( !$photo->canEdit(1), "Visitor cannot edit" ); +ok( $photo->canView(2), "Registered users can view" ); +ok( !$photo->canEdit(2), "Registered users cannot edit" ); +ok( $photo->canView, "Current user can view" ); +ok( $photo->canEdit, "Current user can edit" ); + +# Admins can view, Admins can edit, Owned by Admin, current user is Visitor +my $oldUser = $session->user; +$session->user( WebGUI::User->new($session, "1") ); +$photo + = $node->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + groupIdView => "3", + groupIdEdit => "3", + ownerUserId => "3", + }); + +ok( !$photo->canView, "Visitors cannot view" ); +ok( !$photo->canEdit, "Visitors cannot edit" ); +ok( !$photo->canView(2), "Registered Users cannot view" ); +ok( !$photo->canEdit(2), "Registered Users cannot edit" ); +ok( $photo->canView(3), "Admins can view" ); +ok( $photo->canEdit(3), "Admins can edit" ); +$session->user($oldUser); + +#---------------------------------------------------------------------------- +# Photo assets inside of Gallery assets +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + groupIdView => "7", + groupIdEdit => "3", + ownerUserId => $session->user->userId, + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + groupIdView => "", + groupIdEdit => "", + ownerUserId => $session->user->userId, + }); + +# Photo without specific view/edit inherits from gallery properties +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + groupIdView => "", + groupIdEdit => "", + ownerUserId => $session->user->userId, + }); + +ok( $photo->canView(1), "Visitors can view" ); +ok( !$photo->canEdit(1), "Visitors cannot edit" ); +ok( $photo->canView(2), "Registered Users can view" ); +ok( !$photo->canEdit(2), "Registered Users cannot edit" ); +ok( $photo->canView, "Owner can view" ); +ok( $photo->canEdit, "Owner can edit" ); +ok( $photo->canView(3), "Admin can view" ); +ok( $photo->canEdit(3), "Admin can edit" ); + +# Photo with specific view uses that instead (friends lists) +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + groupIdView => "3", + groupIdEdit => "", + ownerUserId => $session->user->userId, + }); + +ok( !$photo->canView(1), "Visitors cannot view" ); +ok( !$photo->canEdit(1), "Visitors cannot edit" ); +ok( !$photo->canView(2), "Registered Users cannot view" ); +ok( !$photo->canEdit(2), "Registered Users cannot edit" ); +ok( $photo->canView, "Owner can view" ); +ok( $photo->canEdit, "Owner can edit" ); +ok( $photo->canView(3), "Admin can view" ); +ok( $photo->canEdit(3), "Admin can edit" ); diff --git a/t/Asset/File/Image/010-setfile.t b/t/Asset/File/Image/setfile.t similarity index 100% rename from t/Asset/File/Image/010-setfile.t rename to t/Asset/File/Image/setfile.t diff --git a/t/Asset/File/010-setfile.t b/t/Asset/File/setfile.t similarity index 100% rename from t/Asset/File/010-setfile.t rename to t/Asset/File/setfile.t From 320c2c07b0e99f9c8ed81c76e65064f39a1eccbb Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 12 Oct 2007 20:44:38 +0000 Subject: [PATCH 08/15] more tests plus a framework for making test generators --- t/Asset/File/Image/Photo/editSave.t | 94 +++++++++ t/Asset/File/Image/Photo/makeShortcut.t | 17 +- t/lib/WebGUI/Test/Maker.pm | 192 ++++++++++++++++++ t/lib/WebGUI/Test/Maker/HTML.pm | 250 ++++++++++++++++++++++++ t/lib/WebGUI/Test/Maker/Permission.pm | 207 ++++++++++++++++++++ 5 files changed, 752 insertions(+), 8 deletions(-) create mode 100644 t/Asset/File/Image/Photo/editSave.t create mode 100644 t/lib/WebGUI/Test/Maker.pm create mode 100644 t/lib/WebGUI/Test/Maker/HTML.pm create mode 100644 t/lib/WebGUI/Test/Maker/Permission.pm diff --git a/t/Asset/File/Image/Photo/editSave.t b/t/Asset/File/Image/Photo/editSave.t new file mode 100644 index 000000000..51bfbb6b1 --- /dev/null +++ b/t/Asset/File/Image/Photo/editSave.t @@ -0,0 +1,94 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to test the editSave and +# processPropertiesFromFormPost methods. + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $gallery->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + +#---------------------------------------------------------------------------- +# Test permissions + +# Edit an existing photo +$maker->prepare({ + object => $photo, + method => "www_edit", + userId => "1", + test_privilege => "insufficient", +})->run; + +# Save a new photo +$maker->prepare({ + object => $photo, + method => "www_editSave", + userId => "1", + test_privilege => "insufficient", +})->run; + +#---------------------------------------------------------------------------- +# Test processPropertiesFromFormPost errors +# TODO: This test should use i18n. +# TODO: This error / test should occur in File, not Photo +$maker->prepare({ + object => $album + method => "www_editSave", + formParams => { + + + }, + test_regex => [ + qr/You must select a file/, + qr/You must enter a title/, + ], +})->run; + +#---------------------------------------------------------------------------- +# Test editSave success result + +#---------------------------------------------------------------------------- diff --git a/t/Asset/File/Image/Photo/makeShortcut.t b/t/Asset/File/Image/Photo/makeShortcut.t index 09bc5e075..adbb7dd75 100644 --- a/t/Asset/File/Image/Photo/makeShortcut.t +++ b/t/Asset/File/Image/Photo/makeShortcut.t @@ -19,6 +19,7 @@ use Scalar::Util qw( blessed ); use WebGUI::Test; use WebGUI::Session; use Test::More; +use WebGUI::Test::Maker::HTML; use WebGUI::Asset::File::Image::Photo; #---------------------------------------------------------------------------- @@ -27,6 +28,7 @@ my $session = WebGUI::Test->session; my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; my $otherParent = $node->addChild({ className => "WebGUI::Asset::Wobject::Layout", @@ -109,14 +111,13 @@ is_deeply( #---------------------------------------------------------------------------- # www_makeShortcut is only available to those who can edit the photo -my $html = WebGUI::Test->getPage($photo, "www_makeShortcut", { - userId => 1, - }); - -like( - $html, qr/permission denied/i, - "www_makeShortcut is not allowed to those who can't edit the photo", -); +$maker->prepare({ + object => $photo, + method => "www_makeShortcut", + userId => 1, + test_privilege => "insufficient", +}); +$maker->run; #---------------------------------------------------------------------------- # www_makeShortcut diff --git a/t/lib/WebGUI/Test/Maker.pm b/t/lib/WebGUI/Test/Maker.pm new file mode 100644 index 000000000..f3463f38f --- /dev/null +++ b/t/lib/WebGUI/Test/Maker.pm @@ -0,0 +1,192 @@ +package WebGUI::Test::Maker; + +use Test::More; + + +=head1 NAME + +WebGUI::Test::Maker + +=head1 SYNOPSIS + + use Test::More; + use WebGUI::Test::Maker; + + my $maker = WebGUI::Test::Maker->new(); + + $maker->set( test => sub { ... } ); + $maker->set( plan_per_test => 2 ); + + $maker->prepare({ + title => "Test something", + args => [ ... ], + }); + + plan tests => $maker->plan; + + $maker->run; + +=head1 DESCRIPTION + +Test generator for generating repeatable tests. + +Set a subroutine that runs some tests and run it over and over with +different arguments. + +=head1 DEPENDS + +This module depends on + +=over 4 + +=item * + +Test::More + +=back + +=head1 METHODS + +=head2 new + +Create a new WebGUI::Test::Maker object. + +=cut + +sub new { + my $class = shift; + my $self = {}; + + return bless $self, $class; +} + +#---------------------------------------------------------------------------- + +=head2 get + +Get a setting. Set L for a list of settings. + +=cut + +sub get { + my $self = shift; + my $key = shift; + + return $self->{_settings}->{$key}; +} + +#---------------------------------------------------------------------------- + +=head2 plan + +Returns the number of tests currently prepared. This module is so generic +that you must set the C value before calling this method. + +=cut + +sub plan { + my $self = shift; + + return $self->plan_per_test * @{$self->{_tests}}; +} + +#---------------------------------------------------------------------------- + +=head2 plan_per_test + +Returns the current value of the C setting. + +=cut + +sub plan_per_test { + return $self->get("plan_per_test"); +} + +#---------------------------------------------------------------------------- + +=head2 prepare + +Prepare a test(s). Returns the object for convenience. The following keys +are optional: + +=over 4 + +=item args + +An array reference of arguments to the subroutine. + +=back + +There are no required arguments. + +=cut + +sub prepare { + my $self = shift; + my @tests = @_; + my $test_num = 0; + for my $test (@tests) { + $test_num++; + + push @{$self->{_tests}}, $test; + } + + return $self; +} + +#---------------------------------------------------------------------------- + +=head2 run + +Run the tests we've prepared and delete them as we run them. + +=cut + +sub run { + my $self = shift; + + while (my $test = shift @{ $self->{_tests} }) { + my $sub = $self->get("test"); + if ($test->{args}) { + $sub->(@{ $test->{args} }); + } + else { + $sub->(); + } + } +} + +#---------------------------------------------------------------------------- + +=head2 set + +Set a setting. + +Available settings: + +=over 4 + +=item test + +A subref that runs some tests. The first argument to this subref will be the +WebGUI::Test::Maker object. The second and subsequent arguments will be the +C key from the prepared test. + +=item plan_per_test + +Set the number of tests that each C sub runs to be used to plan the +number of total tests that will be run. + +=back + +=cut + +sub set { + my $self = shift; + my $key = shift; + my $value = shift; + + $self->{_setting}->{$key} = $value; +} + +1; diff --git a/t/lib/WebGUI/Test/Maker/HTML.pm b/t/lib/WebGUI/Test/Maker/HTML.pm new file mode 100644 index 000000000..5607ac546 --- /dev/null +++ b/t/lib/WebGUI/Test/Maker/HTML.pm @@ -0,0 +1,250 @@ +package WebGUI::Test::Maker::HTML; + +use base 'WebGUI::Test::Maker'; +use Scalar::Util qw( blessed ); +use Test::More; + + +=head1 NAME + +WebGUI::Test::Maker::HTML -- Test::Maker subclass for WebGUI HTMLs + +=head1 SYNOPSIS + + use Test::More; + use WebGUI::Test::Maker::HTML; + + my $maker = WebGUI::Test::Maker::HTML->new(); + + $maker->prepare({ + object => $object, + method => "www_editSave", + user => WebGUI::User->new, + userId => "userId", + formParams => { ... }, + uploads => { ... }, + + # Test for a WebGUI::Session::Privilege page + test_privilege => "permission", + + # Test for some regular expressions + test_regex => [ qr/../, qr/.../, ... ], + }); + + plan tests => $maker->plan; + + $maker->run; + +=head1 DESCRIPTION + +This Test::Maker subclass tests the HTML output by WebGUI methods in a +variety of ways. + +Uses WebGUI::Test->getPage to get the HTML for a page, and so is limited +to whatever C can access. + +=head1 TODO + +Provide a method to give a proper HTML::Parser to test with. + +Provide a method to test that a certain page was created with a certain +template. + +=head1 DEPENDS + +This module depends on + +=over 4 + +=item * + +Test::More + +=back + +=head1 METHODS + +=head2 new + +Create a new WebGUI::Test::Maker::HTML object. + +=head2 get + +Get a setting. Set L for a list of settings. + +#---------------------------------------------------------------------------- + +=head2 plan + +This module plans as follows: + + - 1 and only 1 test for any test_privilege test + - 1 test for each member of a test_regex test + +=cut + +sub plan { + my $self = shift; + my $plan; + + for my $test ( @{ $self->{_tests} } ) { + if ($test->{test_privilege}) { + $plan++; + next; + } + if ($test->{test_regex}) { + $plan += @{$test->{test_regex}}; + } + } + + return $plan; +} + +#---------------------------------------------------------------------------- + +=head2 plan_per_test + +Returns undef. There is no way to pre-calculate how many tests this will run + +=cut + +sub plan_per_test { + return undef; +} + +#---------------------------------------------------------------------------- + +=head2 prepare + +Prepare a test(s). Returns the object for convenience. The following keys +are required: + +=over 4 + +=item object + +An instanciated object to work on. + +=item method + +The permissions method to test + +=back + +At least one of the following keys are required: + +=over 4 + +=item test_privilege + +Tests for a WebGUI::Session::Privilege response. Valid values for this key +are: adminOnly, insufficient, noAccess, notMember, vitalComponent + +=item test_regex + +Tests for some regular expressions. This key must be an array reference of +qr(). + +=back + +The following key are optional: + +=over 4 + +=item user + +A WebGUI::User object to use for the test. + +=item userId + +A user ID to make a WebGUI::User object to use for the test + +=item formParams + +A hash reference of form parameters to use for the test + +=item uploads + +A hash reference of file uploads to use for the test + +=back + +=cut + +sub prepare { + my $self = shift; + my @tests = @_; + my $test_num = 0; + for my $test (@tests) { + $test_num++; + + croak("Couldn't prepare: Test $test_num has no object") + unless $test->{object}; + croak("Couldn't prepare: Test $test_num has no method") + unless $test->{method}; + croak("Couldn't prepare: Test $test_num has test (test_privilege or test_regex)") + unless $test->{test_privilege} || $test->{test_regex}; + croak("Couldn't prepare: Test $test_num, test_regex is not an array reference") + if $test->{test_regex} && ref $test->{test_regex} ne "ARRAY"; + croak("Couldn't prepare: Test $test_num, $test->{test_privilege} is not a valid test_privilege value (adminOnly, insufficient, noAccess, notMember, vitalComponent)") + if $test->{test_privilege} && $test->{test_privilege} =~ m/adminOnly|insufficient|noAccess|notMember|vitalComponent/; + + push @{$self->{_tests}}, $test; + } + + return $self; +} + +#---------------------------------------------------------------------------- + +=head2 run + +Run the tests we've prepared and delete them as we run them. + +=cut + +sub run { + my $self = shift; + + while (my $test = shift @{ $self->{_tests} }) { + my $o = $test->{object}; + my $m = $test->{method}; + + # Get the HTML + my $opts = {}; + for my $key (qw{ }) { + $opts->{$key} = $test->{$key}; + } + + my $html + = WebGUI::Test->getPage( $o, $m, $opts ); + + # Run the tests + if ($test->{test_privilege}) { + my $priv_method = $test->{test_privilege}; + my $test = $o->session->privilege->$priv_method(); + + like( $html, $test, "$m contains privilege message $priv_method for object " . blessed $o ); + + next; + } + + if ($test->{test_regex}) { + for my $regex ( @{ $test->{test_regex} } ) { + like( $html, $regex, "$m contains $regex for object " . blessed $o ); + } + } + } +} + +#---------------------------------------------------------------------------- + +=head2 set + +Set a setting. + +Currently this module has no settings + +=cut + +1; diff --git a/t/lib/WebGUI/Test/Maker/Permission.pm b/t/lib/WebGUI/Test/Maker/Permission.pm new file mode 100644 index 000000000..926b82d24 --- /dev/null +++ b/t/lib/WebGUI/Test/Maker/Permission.pm @@ -0,0 +1,207 @@ +package WebGUI::Test::Maker::Permission; + +use base 'WebGUI::Test::Maker'; +use Scalar::Util qw( blessed ); +use Test::More; + + +=head1 NAME + +WebGUI::Test::Maker::Permission -- Test::Maker subclass for WebGUI Permissions + +=head1 SYNOPSIS + + use Test::More; + use WebGUI::Test::Maker::Permission; + + my $maker = WebGUI::Test::Maker::Permission->new(); + + $maker->prepare({ + object => WebGUI::Asset->new, + method => "canView", + pass => [userId, userId], + fail => [userId, userId], + }); + + plan tests => $maker->plan; + + $maker->run; + +=head1 DESCRIPTION + +Test generator for testing WebGUI permissions. WebGUI permissions subroutines +take a single argument (a userId), or they use the default user from the +current session. They return true if the user has permission, or false +otherwise. + +This module tests permissions subroutines by running a list of userIds that +should either pass or fail the permissions. + +=head1 DEPENDS + +This module depends on + +=over 4 + +=item * + +Test::More + +=back + +=head1 METHODS + +=head2 new + +Create a new WebGUI::Test::Maker::Permission object. + +=head2 get + +Get a setting. Set L for a list of settings. + +#---------------------------------------------------------------------------- + +=head2 plan + +Returns the number of tests currently prepared. This module runs two tests +for each userId in either the C or C keys of the C +hash reference. + +=cut + +sub plan { + my $self = shift; + my $plan; + + for my $test ( @{$self->{_tests}} ) { + if ($test->{pass}) { + $plan += @{$test->{pass}} * 2; + } + if ($test->{fail}) { + $plan += @{$test->{fail}} * 2; + } + } + + return $plan; +} + +#---------------------------------------------------------------------------- + +=head2 plan_per_test + +Returns undef. There is no way to pre-calculate how many tests this will run + +=cut + +sub plan_per_test { + return undef; +} + +#---------------------------------------------------------------------------- + +=head2 prepare + +Prepare a test(s). Returns the object for convenience. The following keys +are required: + +=over 4 + +=item object + +An instanciated object to work on. + +=item method + +The permissions method to test + +=item pass + +An array reference of userIds that should pass the permissions test. + +=item fail + +An array reference of userIds that should fail the permissions test. + +=back + +There are no optional parameters. + +=cut + +sub prepare { + my $self = shift; + my @tests = @_; + my $test_num = 0; + for my $test (@tests) { + $test_num++; + + croak("Couldn't prepare: Test $test_num has no object") + unless $test->{object}; + croak("Couldn't prepare: Test $test_num has no method") + unless $test->{method}; + croak("Couldn't prepare: Test $test_num has no pass/fail") + unless $test->{pass} || $test->{fail}; + croak("Couldn't prepare: Test $test_num, pass is not an array reference") + if $test->{pass} && ref $test->{pass} ne "ARRAY"; + croak("Couldn't prepare: Test $test_num, fail is not an array reference") + if $test->{fail} && ref $test->{fail} ne "ARRAY"; + + push @{$self->{_tests}}, $test; + } + + return $self; +} + +#---------------------------------------------------------------------------- + +=head2 run + +Run the tests we've prepared and delete them as we run them. + +=cut + +sub run { + my $self = shift; + + while (my $test = shift @{ $self->{_tests} }) { + my $o = $test->{object}; + my $m = $test->{method}; + + if ($test->{pass}) { + for my $userId (@{$test->{pass}}) { + # Test the userId parameter + ok( $o->$m($userId), "$userId passes $m check for " . blessed $o ); + + # Test the default session user + my $oldUser = $o->session->user; + $o->session->user( WebGUI::User->new($o->session, $userId) ); + ok( $o->$m(), "$userId passes $m check using default user for " . blessed $o ); + $o->session->user($oldUser); + } + } + if ($test->{fail}) { + for my $userId (@{$test->{fail}}) { + # Test the userId parameter + ok( !($o->$m($userId)), "$userId fails $m check for " . blessed $o ); + + # Test the default session user + my $oldUser = $o->session->user; + $o->session->user( WebGUI::User->new($o->session, $userId) ); + ok( !($o->$m()), "$userId fails $m check using default user for " . blessed $o ); + $o->session->user($oldUser); + } + } + } +} + +#---------------------------------------------------------------------------- + +=head2 set + +Set a setting. + +Currently this module has no settings + +=cut + +1; From 32b27d0954f0bd9fdaabcf2e4b9821fdf4f7eec9 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Thu, 25 Oct 2007 06:20:20 +0000 Subject: [PATCH 09/15] more tests, started Photo development, changed some naming --- lib/WebGUI/Asset/File.pm | 6 +- lib/WebGUI/Asset/File/Image/Photo.pm | 549 ++++++++++++++++++++--- lib/WebGUI/Asset/Wobject/Gallery.pm | 304 +++++++++++++ lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 118 +++++ t/Asset/File/Image/Photo/00base.t | 66 +-- t/Asset/File/Image/Photo/ajax.t | 53 +++ t/Asset/File/Image/Photo/delete.t | 53 +++ t/Asset/File/Image/Photo/download.t | 52 +++ t/Asset/File/Image/Photo/editSave.t | 29 +- t/Asset/File/Image/Photo/permissions.t | 43 +- t/Asset/File/Image/Photo/view.t | 53 +++ t/Asset/Wobject/GalleryAlbum/00base.t | 78 ++++ t/lib/WebGUI/Test.pm | 4 +- t/lib/WebGUI/Test/Maker/HTML.pm | 3 +- 14 files changed, 1261 insertions(+), 150 deletions(-) create mode 100644 lib/WebGUI/Asset/Wobject/Gallery.pm create mode 100644 lib/WebGUI/Asset/Wobject/GalleryAlbum.pm create mode 100644 t/Asset/File/Image/Photo/ajax.t create mode 100644 t/Asset/File/Image/Photo/delete.t create mode 100644 t/Asset/File/Image/Photo/download.t create mode 100644 t/Asset/File/Image/Photo/view.t create mode 100644 t/Asset/Wobject/GalleryAlbum/00base.t diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index 2202e8489..b47140b25 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -297,10 +297,14 @@ sub prepareView { sub processPropertiesFromFormPost { my $self = shift; my $session = $self->session; - $self->SUPER::processPropertiesFromFormPost; + + my $errors = $self->SUPER::processPropertiesFromFormPost; + return $errors if $errors; #Get the storage location out of memory. If you call getStorageLocation you risk creating another one. + # How can this EVER be true? my $storageLocation = $self->{_storageLocation}; + $session->errorHandler->error("Storage Location set magically") if defined $storageLocation; my $storageId = undef; $storageId = $storageLocation->getId if(defined $storageLocation); diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index fd54b2094..a20d358a2 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -16,6 +16,7 @@ package WebGUI::Asset::File::Image::Photo; use strict; use Tie::IxHash; +use Carp qw( croak ); use base 'WebGUI::Asset::File::Image'; use WebGUI::Utility; @@ -42,8 +43,7 @@ These methods are available from this class: =head2 definition ( session, definition ) -defines asset properties for New Asset instances. You absolutely need -this method in your new Assets. +Define the properties of the Photo asset. =head3 session @@ -54,28 +54,251 @@ A hash reference passed in from a subclass definition. =cut sub definition { - my $class = shift; - my $session = shift; - my $definition = shift; - my $i18n = $class->i18n($session); + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = __PACKAGE__->i18n($session); - tie my %properties, 'Tie::IxHash', ( + tie my %properties, 'Tie::IxHash', ( + friendsOnly => { + defaultValue => 0, + }, + rating => { + defaultValue => 0, + }, + storageIdPhoto => { + defaultValue => undef, + }, + ); + # UserDefined Fields + for my $i (1 .. 5) { + $properties{"userDefined".$i} = { + defaultValue => undef, + }; + } - ); - - push @{$definition}, { - assetName => $i18n->get('assetName'), - icon => 'Image.gif', - tableName => 'Photo', - className => 'WebGUI::Asset::File::Image::Photo', - i18n => 'Asset_Photo', - properties => \%properties, - }; - return $class->SUPER::definition($session, $definition); + push @{$definition}, { + assetName => $i18n->get('assetName'), + icon => 'Image.gif', + tableName => 'Photo', + className => 'WebGUI::Asset::File::Image::Photo', + i18n => 'Asset_Photo', + properties => \%properties, + }; + return $class->SUPER::definition($session, $definition); } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- + +=head2 appendTemplateVarsForCommentForm ( vars ) + +Add the template variables necessary for the comment form to the given hash +reference. Returns the hash reference for convenience. + +=cut + +sub appendTemplateVarsForCommentForm { + my $self = shift; + my $vars = shift; + + # ... + + return $vars; +} + +#---------------------------------------------------------------------------- + +=head2 applyConstraints ( ) + +Apply the constraints to the original file. Called automatically by C +and C. + +=cut + +sub applyConstraints { + my $self = shift; + my $gallery = $self->getGallery; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 canEdit ( [userId] ) + +Returns true if the user can edit this asset. C is a WebGUI user ID. +If no userId is passed, check the current user. + +Users can edit this Photo if they are the owner or if they are able to edit +the parent Album asset. + +=cut + +sub canEdit { + my $self = shift; + my $userId = shift || $self->session->user->userId; + my $album = $self->getParent; + + return 1 if $userId eq $self->get("ownerUserId"); + return $album->canEdit($userId); +} + +#---------------------------------------------------------------------------- + +=head2 canView ( [userId] ) + +Returns true if the user can view this asset. C is a WebGUI user ID. +If no user is passed, checks the current user. + +=cut + +# Inherited from superclass + +#---------------------------------------------------------------------------- + +=head2 deleteComment ( commentId ) + +Delete a comment from this asset. C is the ID of the comment to delete. + +=cut + +sub deleteComment { + my $self = shift; + my $commentId = shift; + + croak "Photo->deleteComment: No commentId specified." + unless $commentId; + + return $self->session->db->do( + "DELETE FROM Photo_comment WHERE assetId=? AND commentId=?", + [$self->getId, $commentId], + ); +} + +#---------------------------------------------------------------------------- + +=head2 getComment ( commentId ) + +Get a comment from this asset. C is the ID of the comment to get. Returns +a hash reference of comment information. + +=cut + +sub getComment { + my $self = shift; + my $commentId = shift; + + return $self->session->db->quickHashRef( + "SELECT * FROM Photo_comment WHERE assetId=? AND commentId=?", + [$self->getId, $commentId], + ); +} + +#---------------------------------------------------------------------------- + +=head2 getCommentIds ( ) + +Get an array reference of comment IDs for this Photo, in chronological order. + +=cut + +sub getCommentIds { + my $self = shift; + + return [ + $self->session->db->buildArray( + "SELECT commentId FROM Photo_comment WHERE assetId=?", + [$self->getId], + ) + ]; +} + +#---------------------------------------------------------------------------- + +=head2 getCommentPaginator ( ) + +Get a WebGUI::Paginator for the comments for this Photo. + +=cut + +sub getCommentPaginator { + my $self = shift; + + # ... + +} + +#---------------------------------------------------------------------------- + +=head2 getDownloadFileUrl ( resolution ) + +Get the absolute URL to download the requested resolution. Will croak if the +resolution doesn't exist. + +=cut + +sub getDownloadFileUrl { + my $self = shift; + my $resolution = shift; + + croak "Photo->getDownloadFileUrl: resolution must be defined" + unless $resolution; + croak "Photo->getDownloadFileUrl: resolution doesn't exist for this Photo" + unless grep /$resolution/, @{ $self->getResolutions }; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 getGallery ( ) + +Gets the Gallery asset this Photo is a member of. + +=cut + +sub getGallery { + my $self = shift; + my $gallery = $self->getParent->getParent; + return $gallery if $gallery->isa("WebGUI::Asset::Wobject::Gallery"); + return undef; +} + +#---------------------------------------------------------------------------- + +=head2 getResolutions ( ) + +Get an array reference of download resolutions that exist for this image. +Does not include the web view image or the thumbnail image. + +=cut + +sub getResolutions { + my $self = shift; + my $storage = $self->getStorageLocation; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateVars ( ) + +Get a hash reference of template variables shared by all views of this asset. + +=cut + +sub getTemplateVars { + my $self = shift; + my $vars = $self->get; + + # ... + + return $vars; +} + +#---------------------------------------------------------------------------- =head2 i18n ( [ session ] ) @@ -84,10 +307,72 @@ Get a WebGUI::International object for this class. Can be called as a class method, in which case a WebGUI::Session object must be passed in. -Can be called as an object method, in which case the session is -filled in automatically. +NOTE: This method can NOT be inherited, due to a current limitation +in the i18n system. You must ALWAYS call this with C<__PACKAGE__> -#------------------------------------------------------------------- +=cut + +sub i18n { + my $self = shift; + my $session = shift; + + return WebGUI::International->new($session, "Asset_Photo"); +} + +#---------------------------------------------------------------------------- + +=head2 makeResolutions ( [resolutions] ) + +Create the specified resolutions for this Photo. If resolutions is not +defined, will get the resolutions to make from the Gallery this Photo is +contained in. + +=cut + +sub makeResolutions { + my $self = shift; + my $resolutions = shift; + + croak "Photo->makeResolutions: resolutions must be an array reference" + if $resolutions && ref $resolutions ne "ARRAY"; + + # Get default if necessary + $resolutions ||= $self->getGallery->getImageResolutions; + + for my $res ( @$resolutions ) { + # carp if resolution is bad + # ... + } +} + +#---------------------------------------------------------------------------- + +=head2 makeShortcut ( parentId [, overrides ] ) + +Make a shortcut to this asset under the specified parent, optionally adding +the specified overrides. + +=cut + +sub makeShortcut { + my $self = shift; + my $parentId = shift; + my $overrides = shift; + my $session = $self->session; + + croak "Photo->makeShortcut: parentId must be defined" + unless $parentId; + croak "Photo->makeShortcut: overrides must be hash reference" + if $overrides && ref $overrides ne "HASH"; + + my $parent = WebGUI::Asset->newByDynamicClass($session, $parentId) + || croak "Photo->makeShortcut: Could not instanciate asset '$parentId'"; + + # ... + +} + +#---------------------------------------------------------------------------- =head2 processPropertiesFromFormPost ( ) @@ -98,42 +383,36 @@ when /yourAssetUrl?func=editSave is requested/posted. =cut sub processPropertiesFromFormPost { - my $self = shift; - $self->SUPER::processPropertiesFromFormPost; + my $self = shift; + my $errors = $self->SUPER::processPropertiesFromFormPost || []; + + } +#---------------------------------------------------------------------------- -#------------------------------------------------------------------- +=head2 setComment ( commentId, properties ) -=head2 purge ( ) - -This method is called when data is purged by the system. -removes collateral data associated with a NewAsset when the system -purges it's data. This method is unnecessary, but if you have -auxiliary, ancillary, or "collateral" data or files related to your -asset instances, you will need to purge them here. +Set a comment. If C is C<"new">, create a new comment. C +is a hash reference of comment information. =cut -sub purge { - my $self = shift; - return $self->SUPER::purge; +sub setComment { + my $self = shift; + my $commentId = shift; + my $properties = shift; + + croak "Photo->setComment: commentId must be defined" + unless $commentId; + croak "Photo->setComment: properties must be a hash reference" + unless $properties && ref $properties eq "HASH"; + + # ... } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- -=head2 purgeRevision ( ) - -This method is called when data is purged by the system. - -=cut - -sub purgeRevision { - my $self = shift; - return $self->SUPER::purgeRevision; -} - -#------------------------------------------------------------------- =head2 view ( ) method called by the container www_view method. @@ -141,49 +420,175 @@ method called by the container www_view method. =cut sub view { - my $self = shift; - my $var = $self->get; # $var is a hash reference. - $var->{controls} = $self->getToolbar; - $var->{fileUrl} = $self->getFileUrl; - $var->{fileIcon} = $self->getFileIconUrl; - return $self->processTemplate($var,undef, $self->{_viewTemplate}); + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + $var->{ controls } = $self->getToolbar; + $var->{ fileUrl } = $self->getFileUrl; + $var->{ fileIcon } = $self->getFileIconUrl; + + + return $self->processTemplate($var,undef, $self->{_viewTemplate}); } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- + +=head2 www_addCommentSave ( ) + +Save a new comment to the Photo. + +=cut + +sub www_addCommentSave { + my $self = shift; + my $form = $self->session; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 www_delete ( ) + +Show the page to confirm the deletion of this Photo. Show a list of albums +this Photo exists in. + +=cut + +sub www_delete { + my $self = shift; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 www_deleteConfirm ( ) + +Confirm the deletion of this Photo. Show a message and a link back to the +album. + +=cut + +sub www_deleteConfirm { + my $self = shift; + + # ... +} + +#---------------------------------------------------------------------------- + +=head2 www_download + +Download the Photo with the specified resolution. If no resolution specified, +download the original file. + +=cut + +sub www_download { + my $self = shift; + +# ... +} + +#---------------------------------------------------------------------------- =head2 www_edit ( ) Web facing method which is the default edit page +This page is only available to those who can edit this Photo. + =cut sub www_edit { - my $self = shift; - return $self->session->privilege->insufficient() unless $self->canEdit; - return $self->session->privilege->locked() unless $self->canEditIfLocked; - return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get('edit asset',"Asset_NewAsset")); + my $self = shift; + return $self->session->privilege->insufficient unless $self->canEdit; + return $self->session->privilege->locked unless $self->canEditIfLocked; + + # Prepare the template variables + my $var = $self->getTemplateVars; + + $var->{ form_header } = WebGUI::Form::formHeader( $session ); + $var->{ form_footer } = WebGUI::Form::formFooter( $session ); + + $var->{ form_title } + = WebGUI::Form::Text( $session, { + name => "title", + value => ( $form->get("title") || $self->get("title") ), + }); + + $var->{ form_synopsis } + = WebGUI::Form::HTMLArea( $session, { + name => "synopsis", + value => ( $form->get("synopsis") || $self->get("synopsis") ), + richEditId => $self->getGallery->get("assetIdRichEditFile"), + }); + + $var->{ form_storageIdPhoto } + = WebGUI::Form::Image( $session, { + name => "storageIdPhoto", + value => ( $form->get("storageIdPhoto") || $self->get("storageIdPhoto") ), + maxAttachments => 1, + }); + + $var->{ form_keywords } + = WebGUI::Form::Text( $session, { + name => "keywords", + value => ( $form->get("keywords") || $self->get("keywords") ), + }); + + $var->{ form_location } + = WebGUI::Form::Text( $session, { + name => "location", + value => ( $form->get("location") || $self->get("location") ), + }); + + $var->{ form_friendsOnly } + = WebGUI::Form::yesNo( $session, { + name => "friendsOnly", + value => ( $form->get("friendsOnly") || $self->get("friendsOnly") ), + defaultValue => undef, + }); } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- -=head2 www_view ( ) +=head2 www_makeShortcut ( ) -Web facing method which is the default view page. This method does a -302 redirect to the "showPage" file in the storage location. +Display the form to make a shortcut. + +This page is only available to those who can edit this Photo. =cut -sub www_view { - my $self = shift; - return $self->session->privilege->noAccess() unless $self->canView; - if ($self->session->var->isAdminOn) { - return $self->getContainer->www_view; - } - $self->session->http->setRedirect($self->getFileUrl($self->getValue("showPage"))); - return ""; +sub www_makeShortcut { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + # ... + } +#---------------------------------------------------------------------------- + +=head2 www_makeShortcutSave ( ) + +Make the shortcut. + +This page is only available to those who can edit this Photo. + +=cut + +sub www_makeShortcutSave { + my $self = shift; + my $form = $self->session->form; + + return $self->session->privilege->insufficient unless $self->canEdit; + +#... +} 1; - diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm new file mode 100644 index 000000000..e5fb16462 --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -0,0 +1,304 @@ +package WebGUI::Asset::Wobject::Gallery; + +$VERSION = "1.0.0"; + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2006 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use strict; +use Tie::IxHash; +use WebGUI::International; +use WebGUI::Utility; +use base 'WebGUI::Asset::Wobject'; + +#------------------------------------------------------------------- + +=head2 definition ( ) + +defines wobject properties for New Wobject instances. You absolutely need +this method in your new Wobjects. If you choose to "autoGenerateForms", the +getEditForm method is unnecessary/redundant/useless. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session, 'Asset_Gallery'); + + tie my %imageResolutionOptions, 'Tie::IxHash', ( + '640' => '640', + '800' => '800', + '1024' => '1024', + '1260' => '1260', + '1440' => '1440', + '1600' => '1600', + '2880' => '2880', + ); + + tie my %properties, 'Tie::IxHash', ( + groupIdAddComment => { + tab => "security", + fieldType => "group", + defaultValue => 2, # Registered Users + label => $i18n->get("groupIdAddComment label"), + hoverHelp => $i18n->get("groupIdAddComment description"), + }, + groupIdAddFile => { + tab => "security", + fieldType => "group", + defaultValue => 2, # Registered Users + label => $i18n->get("groupIdAddFile label"), + hoverHelp => $i18n->get("groupIdAddFile description"), + }, + groupIdModerator => { + tab => "security", + fieldType => "group", + defaultValue => 3, # Admins + label => $i18n->get("groupIdModerator label"), + hoverHelp => $i18n->get("groupIdModerator description"), + }, + imageResolutions => { + tab => "properties", + fieldType => "checkList", + defaultValue => ['800','1024','1200','1600'], + options => \%imageResolutionOptions, + label => $i18n->get("imageResolutions label"), + hoverHelp => $i18n->get("imageResolutions description"), + }, + imageViewSize => { + tab => "properties", + fieldType => "integer", + defaultValue => 0, + label => $i18n->get("imageViewSize label"), + hoverHelp => $i18n->get("imageViewSize description"), + }, + imageViewCompression => { + tab => "properties", + fieldType => "integer", + defaultValue => 0, + label => $i18n->get("imageViewCompression label"), + hoverHelp => $i18n->get("imageViewCompression description"), + }, + imageThumbnailSize => { + tab => "properties", + fieldType => "integer", + defaultValue => 0, + label => $i18n->get("imageThumbnailSize label"), + hoverHelp => $i18n->get("imageThumbnailSize description"), + }, + maxSpacePerUser => { + tab => "properties", + fieldType => "integer", + defaultValue => 0, + label => $i18n->get("maxSpacePerUser label"), + hoverHelp => $i18n->get("maxSpacePerUser description"), + }, + richEditIdFileComment => { + tab => "properties", + fieldType => "selectRichEditor", + defaultValue => undef, # Rich Editor for Posts + label => $i18n->get("richEditIdFileComment label"), + hoverHelp => $i18n->get("richEditIdFileComment description"), + }, + templateIdAddArchive => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/AddArchive", + label => $i18n->get("templateIdAddArchive label"), + hoverHelp => $i18n->get("templateIdAddArchive description"), + }, + templateIdDeleteAlbum => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/Delete", + label => $i18n->get("templateIdDeleteAlbum label"), + hoverHelp => $i18n->get("templateIdDeleteAlbum description"), + }, + templateIdDeleteFile => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryFile/Delete", + label => $i18n->get("templateIdDeleteFile label"), + hoverHelp => $i18n->get("templateIdDeleteFile description"), + }, + templateIdEditFile => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryFile/Edit", + label => $i18n->get("templateIdEditFile label"), + hoverHelp => $i18n->get("templateIdEditFile description"), + }, + templateIdListAlbums => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "Gallery/ListAlbums", + label => $i18n->get("templateIdListAlbums label"), + hoverHelp => $i18n->get("templateIdListAlbums description"), + }, + templateIdListAlbumsRss => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "Gallery/ListAlbumsRss", + label => $i18n->get("templateIdListAlbumsRss label"), + hoverHelp => $i18n->get("templateIdListAlbumsRss description"), + }, + templateIdListUserFiles => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "Gallery/ListUserFiles", + label => $i18n->get("templateIdListUserFiles label"), + hoverHelp => $i18n->get("templateIdListUserFiles description"), + }, + templateIdListUserFilesRss => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "Gallery/ListUserFilesRss", + label => $i18n->get("templateIdListUserFilesRss label"), + hoverHelp => $i18n->get("templateIdListUserFilesRss description"), + }, + templateIdMakeShortcut => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryFile/MakeShortcut", + label => $i18n->get("templateIdMakeShortcut label"), + hoverHelp => $i18n->get("templateIdMakeShortcut description"), + }, + templateIdSearch => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "Gallery/Search", + label => $i18n->get("templateIdSearch label"), + hoverHelp => $i18n->get("templateIdSearch description"), + }, + templateIdSlideshow => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/Slideshow", + label => $i18n->get("templateIdSlideshow label"), + hoverHelp => $i18n->get("templateIdSlideshow description"), + }, + templateIdThumbnails => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/Thumbnails", + label => $i18n->get("templateIdThumbnails label"), + hoverHelp => $i18n->get("templateIdThumbnails description"), + }, + templateIdViewAlbum => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/View", + label => $i18n->get("templateIdViewAlbum label"), + hoverHelp => $i18n->get("templateIdViewAlbum description"), + }, + templateIdViewAlbumRss => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/ViewRss", + label => $i18n->get("templateIdViewAlbumRss label"), + hoverHelp => $i18n->get("templateIdViewAlbumRss description"), + }, + templateIdViewFile => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryFile/View", + label => $i18n->get("templateIdViewFile label"), + hoverHelp => $i18n->get("templateIdViewFile description"), + }, + workflowIdCommit => { + tab => "security", + fieldType => "workflow", + defaultValue => "pbworkflow000000000003", # Commit without approval + type => 'WebGUI::VersionTag', + label => $i18n->get("workflowIdCommit label"), + hoverHelp => $i18n->get("workflowIdCommit description"), + }, + ); + + push @{$definition}, { + assetName => $i18n->get('assetName'), + icon => 'newWobject.gif', + autoGenerateForms => 1, + tableName => 'Gallery', + className => __PACKAGE__, + properties => \%properties, + }; + + return $class->SUPER::definition($session, $definition); +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateEditFile ( ) + +Returns an instance of a WebGUI::Asset::Template for the template to edit +files in this gallery + +NOTE: This may need to change in the future to take into account different +classes of files inside of a Gallery. + +=cut + +sub getTemplateEditFile { + my $self = shift; + return WebGUI::Asset::Template->new($self->session, $self->get("templateIdEditFile")); +} + +#---------------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + +#------------------------------------------------------------------- + +=head2 view ( ) + +method called by the www_view method. Returns a processed template +to be displayed within the page style. + +=cut + +sub view { + my $self = shift; + my $session = $self->session; + my $var = $self->get; + + return $self->processTemplate($var, undef, $self->{_viewTemplate}); +} + +1; diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm new file mode 100644 index 000000000..85f1d2426 --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -0,0 +1,118 @@ +package WebGUI::Asset::Wobject::GalleryAlbum; + +$VERSION = "1.0.0"; + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2006 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use strict; +use Tie::IxHash; +use WebGUI::International; +use WebGUI::Utility; +use base 'WebGUI::Asset::Wobject'; + +#------------------------------------------------------------------- + +=head2 definition ( ) + +defines wobject properties for New Wobject instances. You absolutely need +this method in your new Wobjects. If you choose to "autoGenerateForms", the +getEditForm method is unnecessary/redundant/useless. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session, 'Asset_GalleryAlbum'); + + tie my %properties, 'Tie::IxHash', ( + allowComments => { + fieldType => "yesNo", + defaultValue => 0, + label => $i18n->get("allowComments label"), + hoverHelp => $i18n->get("allowComments description"), + }, + othersCanAdd => { + fieldType => "yesNo", + defaultValue => 0, + label => $i18n->get("othersCanAdd label"), + hoverHelp => $i18n->get("othersCanAdd description"), + }, + ); + + push @{$definition}, { + assetName => $i18n->get('assetName'), + icon => 'newWobject.gif', + autoGenerateForms => 1, + tableName => 'GalleryAlbum', + className => __PACKAGE__, + properties => \%properties, + }; + + return $class->SUPER::definition($session, $definition); +} + +#---------------------------------------------------------------------------- + +=head2 canEdit ( [userId] ) + +Returns true if the user can edit this asset. C is a WebGUI user ID. +If no userId is passed, check the current user. + +Users can edit this GalleryAlbum if they are the owner, or if they can edit +the Gallery parent. + +=cut + +sub canEdit { + my $self = shift; + my $userId = shift || $self->session->user->userId; + my $gallery = $self->getParent; + + return 1 if $userId eq $self->get("ownerUserId"); + return $gallery->canEdit($userId); +} + +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + +#------------------------------------------------------------------- + +=head2 view ( ) + +method called by the www_view method. Returns a processed template +to be displayed within the page style. + +=cut + +sub view { + my $self = shift; + my $session = $self->session; + my $var = $self->get; + + return $self->processTemplate($var, undef, $self->{_viewTemplate}); +} + +1; diff --git a/t/Asset/File/Image/Photo/00base.t b/t/Asset/File/Image/Photo/00base.t index f3137e98b..e1d229aab 100644 --- a/t/Asset/File/Image/Photo/00base.t +++ b/t/Asset/File/Image/Photo/00base.t @@ -25,6 +25,15 @@ my $session = WebGUI::Test->session; my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); +print "hi"; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); #---------------------------------------------------------------------------- # Cleanup @@ -44,50 +53,6 @@ use_ok("WebGUI::Asset::File::Image::Photo"); #---------------------------------------------------------------------------- # Test creating a photo my $photo - = $node->addChild({ - className => "WebGUI::Asset::File::Image::Photo", - }); - -is( - blessed $photo, "WebGUI::Asset::File::Image::Photo", - "Photo is a WebGUI::Asset::File::Image::Photo object", -); - -isa_ok( - $photo, "WebGUI::Asset::File::Image", -); - -is( - $photo->getGallery, undef, - "Photo->getGallery returns undef if photo not part of a Photo Gallery", -); - -#---------------------------------------------------------------------------- -# Test deleting a photo -my $properties = $photo->get; -$photo->purge; - -is( - $photo, undef - "Photo is undefined", -); - -is( - WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, - "Photo no longer able to be instanciated", -); - -#---------------------------------------------------------------------------- -# Test creating a photo as part of a photo album -my $gallery - = $node->addChild({ - className => "WebGUI::Asset::Wobject::PhotoGallery", - }); -my $album - = $gallery->addChild({ - className => "WebGUI::Asset::Wobject::PhotoAlbum", - }); -$photo = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", }); @@ -102,6 +67,17 @@ isa_ok( ); is( - blessed $photo->getGallery, "WebGUI::Asset::Wobject::PhotoGallery", + blessed $photo->getGallery, "WebGUI::Asset::Wobject::Gallery", "Photo->getGallery gets the gallery containing this photo", ); + +#---------------------------------------------------------------------------- +# Test deleting a photo +my $properties = $photo->get; +$photo->purge; + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Photo no longer able to be instanciated", +); + diff --git a/t/Asset/File/Image/Photo/ajax.t b/t/Asset/File/Image/Photo/ajax.t new file mode 100644 index 000000000..cf1ebbe72 --- /dev/null +++ b/t/Asset/File/Image/Photo/ajax.t @@ -0,0 +1,53 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to test the AJAX methods of the Photo asset + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $gallery->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; + diff --git a/t/Asset/File/Image/Photo/delete.t b/t/Asset/File/Image/Photo/delete.t new file mode 100644 index 000000000..2afc39ad6 --- /dev/null +++ b/t/Asset/File/Image/Photo/delete.t @@ -0,0 +1,53 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to test the www_delete() and www_deleteConfirm() +# methods + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $gallery->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; diff --git a/t/Asset/File/Image/Photo/download.t b/t/Asset/File/Image/Photo/download.t new file mode 100644 index 000000000..6744b8c5a --- /dev/null +++ b/t/Asset/File/Image/Photo/download.t @@ -0,0 +1,52 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to get sthe getDownloadFileUrl and www_download() +# methods + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $gallery->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; diff --git a/t/Asset/File/Image/Photo/editSave.t b/t/Asset/File/Image/Photo/editSave.t index 51bfbb6b1..ba8f5a6c6 100644 --- a/t/Asset/File/Image/Photo/editSave.t +++ b/t/Asset/File/Image/Photo/editSave.t @@ -8,8 +8,8 @@ # http://www.plainblack.com info@plainblack.com #------------------------------------------------------------------- -# The goal of this test is to test the editSave and -# processPropertiesFromFormPost methods. +# The goal of this test is to test the editSave, +# processPropertiesFromFormPost, and applyConstraints methods. use FindBin; use strict; @@ -28,14 +28,15 @@ my $session = WebGUI::Test->session; my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); +$session->user( { userId => 3 } ); # Admins can do everything my $maker = WebGUI::Test::Maker::HTML->new; my $gallery = $node->addChild({ - className => "WebGUI::Asset::Wobject::PhotoGallery", + className => "WebGUI::Asset::Wobject::Gallery", }); my $album = $gallery->addChild({ - className => "WebGUI::Asset::Wobject::PhotoAlbum", + className => "WebGUI::Asset::Wobject::GalleryAlbum", }); my $photo = $gallery->addChild({ @@ -50,7 +51,7 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 0; +plan no_plan => 1; #---------------------------------------------------------------------------- # Test permissions @@ -76,11 +77,11 @@ $maker->prepare({ # TODO: This test should use i18n. # TODO: This error / test should occur in File, not Photo $maker->prepare({ - object => $album + object => $album, method => "www_editSave", formParams => { - - + assetId => "new", + className => "WebGUI::Asset::File::Image::Photo", }, test_regex => [ qr/You must select a file/, @@ -90,5 +91,17 @@ $maker->prepare({ #---------------------------------------------------------------------------- # Test editSave success result +# TODO: This test should use i18n +$maker->prepare({ + object => $album, + method => "www_editSave", + formParams => { + assetId => "new", + className => "WebGUI::Asset::File::Image::Photo", + }, + test_regex => [ + qr/awaiting approval and commit/, + ], +})->run; #---------------------------------------------------------------------------- diff --git a/t/Asset/File/Image/Photo/permissions.t b/t/Asset/File/Image/Photo/permissions.t index 1f978212d..f39c8ba79 100644 --- a/t/Asset/File/Image/Photo/permissions.t +++ b/t/Asset/File/Image/Photo/permissions.t @@ -26,6 +26,22 @@ my $node = WebGUI::Asset->getImportNode($session); my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); my ($photo); +$session->user({ userId => 3 }); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdView => "7", + groupIdEdit => "3", + ownerUserId => $session->user->userId, + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + groupIdView => "", + groupIdEdit => "", + ownerUserId => $session->user->userId, + }); + #---------------------------------------------------------------------------- # Cleanup @@ -35,14 +51,14 @@ END { #---------------------------------------------------------------------------- # Tests -plan tests => 0; +plan no_plan => 1; #---------------------------------------------------------------------------- # Photo assets outside of Gallery assets # Everyone can view, Admins can edit, Owned by current user $photo - = $node->addChild({ + = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", groupIdView => "7", groupIdEdit => "3", @@ -58,9 +74,9 @@ ok( $photo->canEdit, "Current user can edit" ); # Admins can view, Admins can edit, Owned by Admin, current user is Visitor my $oldUser = $session->user; -$session->user( WebGUI::User->new($session, "1") ); +$session->user( { user => WebGUI::User->new($session, "1") } ); $photo - = $node->addChild({ + = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", groupIdView => "3", groupIdEdit => "3", @@ -73,24 +89,7 @@ ok( !$photo->canView(2), "Registered Users cannot view" ); ok( !$photo->canEdit(2), "Registered Users cannot edit" ); ok( $photo->canView(3), "Admins can view" ); ok( $photo->canEdit(3), "Admins can edit" ); -$session->user($oldUser); - -#---------------------------------------------------------------------------- -# Photo assets inside of Gallery assets -my $gallery - = $node->addChild({ - className => "WebGUI::Asset::Wobject::PhotoGallery", - groupIdView => "7", - groupIdEdit => "3", - ownerUserId => $session->user->userId, - }); -my $album - = $gallery->addChild({ - className => "WebGUI::Asset::Wobject::PhotoAlbum", - groupIdView => "", - groupIdEdit => "", - ownerUserId => $session->user->userId, - }); +$session->user( { user => $oldUser } ); # Photo without specific view/edit inherits from gallery properties $photo diff --git a/t/Asset/File/Image/Photo/view.t b/t/Asset/File/Image/Photo/view.t new file mode 100644 index 000000000..6a7c81588 --- /dev/null +++ b/t/Asset/File/Image/Photo/view.t @@ -0,0 +1,53 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +# The goal of this test is to test the view and getTemplateVars methods + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; +use WebGUI::Asset::File::Image::Photo; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $maker = WebGUI::Test::Maker::HTML->new; +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::PhotoGallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::PhotoAlbum", + }); +my $photo + = $gallery->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->setFile( WebGUI::Test->getCollateralPath('page_title.jpg') ); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 0; diff --git a/t/Asset/Wobject/GalleryAlbum/00base.t b/t/Asset/Wobject/GalleryAlbum/00base.t new file mode 100644 index 000000000..0119dc465 --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/00base.t @@ -0,0 +1,78 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of album assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 5; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 1 +use_ok("WebGUI::Asset::Wobject::GalleryAlbum"); + +#---------------------------------------------------------------------------- +# Test creating an album +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); + +is( + blessed $album, "WebGUI::Asset::Wobject::GalleryAlbum", + "Album is a WebGUI::Asset::Wobject::GalleryAlbum object", +); + +isa_ok( + $album, "WebGUI::Asset::Wobject", +); + +#---------------------------------------------------------------------------- +# Test deleting a album +my $properties = $album->get; +$album->purge; + +is( + $album, undef, + "Album is undefined", +); + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Album no longer able to be instanciated", +); + diff --git a/t/lib/WebGUI/Test.pm b/t/lib/WebGUI/Test.pm index 4fb17e393..5c74f9b4b 100644 --- a/t/lib/WebGUI/Test.pm +++ b/t/lib/WebGUI/Test.pm @@ -9,6 +9,7 @@ use Config qw[]; use IO::Handle qw[]; use File::Spec qw[]; use Test::MockObject::Extends; +use WebGUI::PseudoRequest; ##Hack to get ALL test output onto STDOUT. use Test::Builder; @@ -135,7 +136,8 @@ of options with keys outlined below. =cut sub getPage { - my $session = shift; # The session object + my $class = shift; + my $session = $SESSION; # The session object my $asset = shift; # The asset object my $page = shift; # The page subroutine my $optionsRef = shift; # A hashref of options diff --git a/t/lib/WebGUI/Test/Maker/HTML.pm b/t/lib/WebGUI/Test/Maker/HTML.pm index 5607ac546..123aa8871 100644 --- a/t/lib/WebGUI/Test/Maker/HTML.pm +++ b/t/lib/WebGUI/Test/Maker/HTML.pm @@ -2,6 +2,7 @@ package WebGUI::Test::Maker::HTML; use base 'WebGUI::Test::Maker'; use Scalar::Util qw( blessed ); +use Carp qw( croak ); use Test::More; @@ -187,7 +188,7 @@ sub prepare { croak("Couldn't prepare: Test $test_num, test_regex is not an array reference") if $test->{test_regex} && ref $test->{test_regex} ne "ARRAY"; croak("Couldn't prepare: Test $test_num, $test->{test_privilege} is not a valid test_privilege value (adminOnly, insufficient, noAccess, notMember, vitalComponent)") - if $test->{test_privilege} && $test->{test_privilege} =~ m/adminOnly|insufficient|noAccess|notMember|vitalComponent/; + if $test->{test_privilege} && $test->{test_privilege} !~ m/adminOnly|insufficient|noAccess|notMember|vitalComponent/; push @{$self->{_tests}}, $test; } From 673faf9be69c3c7e644b5f24638dc8a8cd1e90a8 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Mon, 29 Oct 2007 22:44:35 +0000 Subject: [PATCH 10/15] added Image::ExifTool to WebGUI. fixed upgrade script properlike --- docs/upgrades/installPhotoGallery.pl | 237 ------------------ docs/upgrades/upgrade_7.4.10-7.5.0.pl | 115 +++++++++ lib/WebGUI/Asset/File.pm | 27 +- lib/WebGUI/Asset/File/Image/Photo.pm | 72 ++++-- lib/WebGUI/Friends.pm | 2 +- lib/WebGUI/i18n/English/Asset_Gallery.pm | 10 + lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm | 10 + sbin/testEnvironment.pl | 5 +- t/Asset/File/Image/Photo/exif.t | 56 +++++ t/Asset/File/Image/Photo/permissions.t | 17 +- t/supporting_collateral/lamp.jpg | Bin 0 -> 678993 bytes 11 files changed, 283 insertions(+), 268 deletions(-) delete mode 100644 docs/upgrades/installPhotoGallery.pl create mode 100644 lib/WebGUI/i18n/English/Asset_Gallery.pm create mode 100644 lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm create mode 100644 t/Asset/File/Image/Photo/exif.t create mode 100644 t/supporting_collateral/lamp.jpg diff --git a/docs/upgrades/installPhotoGallery.pl b/docs/upgrades/installPhotoGallery.pl deleted file mode 100644 index 1e03a9a1c..000000000 --- a/docs/upgrades/installPhotoGallery.pl +++ /dev/null @@ -1,237 +0,0 @@ -#------------------------------------------------------------------- -# WebGUI is Copyright 2001-2006 Plain Black Corporation. -#------------------------------------------------------------------- -# Please read the legal notices (docs/legal.txt) and the license -# (docs/license.txt) that came with this distribution before using -# this software. -#------------------------------------------------------------------- -# http://www.plainblack.com info@plainblack.com -#------------------------------------------------------------------- - -use lib "../../lib"; -use strict; -use Getopt::Long; -use WebGUI::Session; - - -my $toVersion = "photogallery"; # make this match what version you're going to -my $quiet; # this line required - - -my $session = start(); # this line required - -# upgrade functions go here -installGalleryAsset($session); -installGalleryAlbumAsset($session); -installPhotoAsset($session); - -finish($session); # this line required - - -##------------------------------------------------- -#sub exampleFunction { -# my $session = shift; -# print "\tWe're doing some stuff here that you should know about.\n" unless ($quiet); -# # and here's our code -#} - -#---------------------------------------------------------------------------- -# Install the Gallery asset -sub installGalleryAsset { - my $session = shift; - print "\tInstalling Gallery asset..." unless $quiet; - - $session->db->write(<<'ENDSQL'); -CREATE TABLE IF NOT EXISTS Gallery ( - assetId VARCHAR(22) BINARY NOT NULL, - revisionDate BIGINT NOT NULL, - groupIdAddComment VARCHAR(22) BINARY, - groupIdAddFile VARCHAR(22) BINARY, - groupIdModerator VARCHAR(22) BINARY, - imageResolutions TEXT, - imageViewSize INT, - imageViewCompression INT, - imageThumbnailSize INT, - maxSpacePerUser VARCHAR(20), - richEditIdFileComment VARCHAR(22) BINARY, - templateIdAddArchive VARCHAR(22) BINARY, - templateIdDeleteAlbum VARCHAR(22) BINARY, - templateIdDeleteFile VARCHAR(22) BINARY, - templateIdEditFile VARCHAR(22) BINARY, - templateIdListAlbums VARCHAR(22) BINARY, - templateIdListAlbumsRss VARCHAR(22) BINARY, - templateIdListUserFiles VARCHAR(22) BINARY, - templateIdListUserFilesRss VARCHAR(22) BINARY, - templateIdMakeShortcut VARCHAR(22) BINARY, - templateIdSearch VARCHAR(22) BINARY, - templateIdSlideshow VARCHAR(22) BINARY, - templateIdThumbnails VARCHAR(22) BINARY, - templateIdViewAlbum VARCHAR(22) BINARY, - templateIdViewAlbumRss VARCHAR(22) BINARY, - templateIdViewFile VARCHAR(22) BINARY, - workflowIdCommit VARCHAR(22) BINARY, - PRIMARY KEY (assetId, revisionDate) -) -ENDSQL - - - - print "DONE!\n" unless $quiet; -} - -#---------------------------------------------------------------------------- -# Install the GalleryAlbum asset -sub installGalleryAlbumAsset { - my $session = shift; - print "\tInstalling GalleryAlbum asset..." unless $quiet; - - $session->db->write(<<'ENDSQL'); -CREATE TABLE IF NOT EXISTS GalleryAlbum ( - assetId VARCHAR(22) BINARY NOT NULL, - revisionDate BIGINT NOT NULL, - othersCanAdd INT, - allowComments INT, - PRIMARY KEY (assetId, revisionDate) -) -ENDSQL - - print "DONE!\n" unless $quiet; -} - -#---------------------------------------------------------------------------- -# Install the photo asset -sub installPhotoAsset { - my $session = shift; - print "\tInstalling Photo asset..." unless $quiet; - - # Photo Asset - $session->db->write(<<'ENDSQL'); -CREATE TABLE IF NOT EXISTS Photo ( - assetId VARCHAR(22) BINARY NOT NULL, - revisionDate BIGINT NOT NULL, - friendsOnly INT, - rating INT, - storageIdPhoto VARCHAR(22) BINARY, - userDefined1 TEXT, - userDefined2 TEXT, - userDefined3 TEXT, - userDefined4 TEXT, - userDefined5 TEXT, - PRIMARY KEY (assetId, revisionDate) -) -ENDSQL - - $session->db->write(<<'ENDSQL'); -CREATE TABLE IF NOT EXISTS Photo_comment ( - assetId VARCHAR(22) BINARY NOT NULL, - commentId VARCHAR(22) BINARY NOT NULL, - userId VARCHAR(22) BINARY, - visitorIp VARCHAR(255), - creationDate DATETIME, - bodyText LONGTEXT, - INDEX (commentId), - PRIMARY KEY (assetId, commentId) -) -ENDSQL - - $session->db->write(<<'ENDSQL'); -CREATE TABLE IF NOT EXISTS Photo_rating ( - assetId VARCHAR(22) BINARY NOT NULL, - userId VARCHAR(22) BINARY, - visitorIp VARCHAR(255), - rating INT, - INDEX (assetId) -) -ENDSQL - - print "DONE!\n" unless $quiet; -} - -# ---- DO NOT EDIT BELOW THIS LINE ---- - -#------------------------------------------------- -sub start { - my $configFile; - $|=1; #disable output buffering - GetOptions( - 'configFile=s'=>\$configFile, - 'quiet'=>\$quiet - ); - my $session = WebGUI::Session->open("../..",$configFile); - $session->user({userId=>3}); - my $versionTag = WebGUI::VersionTag->getWorking($session); - $versionTag->set({name=>"Upgrade to ".$toVersion}); - updateTemplates($session); - return $session; -} - -#------------------------------------------------- -sub finish { - my $session = shift; - my $versionTag = WebGUI::VersionTag->getWorking($session); - $versionTag->commit; - $session->close(); -} - -#------------------------------------------------- -sub updateTemplates { - my $session = shift; - return undef unless (-d "templates-".$toVersion); - print "\tUpdating templates.\n" unless ($quiet); - opendir(DIR,"templates-".$toVersion); - my @files = readdir(DIR); - closedir(DIR); - my $importNode = WebGUI::Asset->getImportNode($session); - my $newFolder = undef; - foreach my $file (@files) { - next unless ($file =~ /\.tmpl$/); - open(FILE,""WebGUI::Asset::Template"); - while (my $line = ) { - if ($first) { - $line =~ m/^\#(.*)$/; - $properties{id} = $1; - $first = 0; - } elsif ($line =~ m/^\#create$/) { - $create = 1; - } elsif ($line =~ m/^\#(.*):(.*)$/) { - $properties{$1} = $2; - } elsif ($line =~ m/^~~~$/) { - $head = 1; - } elsif ($head) { - $properties{headBlock} .= $line; - } else { - $properties{template} .= $line; - } - } - close(FILE); - if ($create) { - $newFolder = createNewTemplatesFolder($importNode) unless (defined $newFolder); - my $template = $newFolder->addChild(\%properties, $properties{id}); - } else { - my $template = WebGUI::Asset->new($session,$properties{id}, "WebGUI::Asset::Template"); - if (defined $template) { - my $newRevision = $template->addRevision(\%properties); - } - } - } -} - -#------------------------------------------------- -sub createNewTemplatesFolder { - my $importNode = shift; - my $newFolder = $importNode->addChild({ - className=>"WebGUI::Asset::Wobject::Folder", - title => $toVersion." New Templates", - menuTitle => $toVersion." New Templates", - url=> $toVersion."_new_templates", - groupIdView=>"12" - }); - return $newFolder; -} - - - diff --git a/docs/upgrades/upgrade_7.4.10-7.5.0.pl b/docs/upgrades/upgrade_7.4.10-7.5.0.pl index 2a9ca925b..daa0c5bad 100644 --- a/docs/upgrades/upgrade_7.4.10-7.5.0.pl +++ b/docs/upgrades/upgrade_7.4.10-7.5.0.pl @@ -22,6 +22,9 @@ my $session = start(); # this line required # upgrade functions go here addFriendsNetwork($session); +installGalleryAsset($session); +installGalleryAlbumAsset($session); +installPhotoAsset($session); finish($session); # this line required @@ -99,6 +102,118 @@ EOSQL print "OK\n" unless $quiet; } +#---------------------------------------------------------------------------- +# Install the GalleryAlbum asset +sub installGalleryAlbumAsset { + my $session = shift; + print "\tInstalling GalleryAlbum asset..." unless $quiet; + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS GalleryAlbum ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + othersCanAdd INT, + allowComments INT, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the Gallery asset +sub installGalleryAsset { + my $session = shift; + print "\tInstalling Gallery asset..." unless $quiet; + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Gallery ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + groupIdAddComment VARCHAR(22) BINARY, + groupIdAddFile VARCHAR(22) BINARY, + groupIdModerator VARCHAR(22) BINARY, + imageResolutions TEXT, + imageViewSize INT, + imageThumbnailSize INT, + maxSpacePerUser VARCHAR(20), + richEditIdFileComment VARCHAR(22) BINARY, + templateIdAddArchive VARCHAR(22) BINARY, + templateIdDeleteAlbum VARCHAR(22) BINARY, + templateIdDeleteFile VARCHAR(22) BINARY, + templateIdEditFile VARCHAR(22) BINARY, + templateIdListAlbums VARCHAR(22) BINARY, + templateIdListAlbumsRss VARCHAR(22) BINARY, + templateIdListUserFiles VARCHAR(22) BINARY, + templateIdListUserFilesRss VARCHAR(22) BINARY, + templateIdMakeShortcut VARCHAR(22) BINARY, + templateIdSearch VARCHAR(22) BINARY, + templateIdSlideshow VARCHAR(22) BINARY, + templateIdThumbnails VARCHAR(22) BINARY, + templateIdViewAlbum VARCHAR(22) BINARY, + templateIdViewAlbumRss VARCHAR(22) BINARY, + templateIdViewFile VARCHAR(22) BINARY, + workflowIdCommit VARCHAR(22) BINARY, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Install the photo asset +sub installPhotoAsset { + my $session = shift; + print "\tInstalling Photo asset..." unless $quiet; + + # Photo Asset + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + exifData LONGTEXT, + friendsOnly INT, + rating INT, + storageIdPhoto VARCHAR(22) BINARY, + userDefined1 TEXT, + userDefined2 TEXT, + userDefined3 TEXT, + userDefined4 TEXT, + userDefined5 TEXT, + PRIMARY KEY (assetId, revisionDate) +) +ENDSQL + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo_comment ( + assetId VARCHAR(22) BINARY NOT NULL, + commentId VARCHAR(22) BINARY NOT NULL, + userId VARCHAR(22) BINARY, + visitorIp VARCHAR(255), + creationDate DATETIME, + bodyText LONGTEXT, + INDEX (commentId), + PRIMARY KEY (assetId, commentId) +) +ENDSQL + + $session->db->write(<<'ENDSQL'); +CREATE TABLE IF NOT EXISTS Photo_rating ( + assetId VARCHAR(22) BINARY NOT NULL, + userId VARCHAR(22) BINARY, + visitorIp VARCHAR(255), + rating INT, + INDEX (assetId) +) +ENDSQL + + print "DONE!\n" unless $quiet; +} + # ---- DO NOT EDIT BELOW THIS LINE ---- diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index b47140b25..f58f7472f 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -397,16 +397,25 @@ sub setFile { } #------------------------------------------------------------------- + +=head2 setSize ( fileSize ) + +Set the size of this asset by including all the files in its storage +location. C is an integer of additional bytes to include in +the asset size. + +=cut + sub setSize { - my $self = shift; - my $fileSize = shift || 0; - my $storage = $self->getStorageLocation; - if (defined $storage) { - foreach my $file (@{$storage->getFiles}) { - $fileSize += $storage->getFileSize($file); - } - } - return $self->SUPER::setSize($fileSize); + my $self = shift; + my $fileSize = shift || 0; + my $storage = $self->getStorageLocation; + if (defined $storage) { + foreach my $file (@{$storage->getFiles}) { + $fileSize += $storage->getFileSize($file); + } + } + return $self->SUPER::setSize($fileSize); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index 714757960..82e6727e4 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -15,9 +15,14 @@ package WebGUI::Asset::File::Image::Photo; =cut use strict; -use Tie::IxHash; -use Carp qw( croak ); use base 'WebGUI::Asset::File::Image'; + +use Carp qw( croak ); +use Image::ExifTool qw( :Public ); +use JSON; +use Tie::IxHash; + +use WebGUI::Friends; use WebGUI::Utility; @@ -109,18 +114,30 @@ sub appendTemplateVarsForCommentForm { #---------------------------------------------------------------------------- -=head2 applyConstraints ( ) +=head2 applyConstraints ( options ) Apply the constraints to the original file. Called automatically by C and C. +This is a sort of catch-all method for applying things to the file after it's +uploaded. This method simply calls other methods to do its work. + +C is a hash reference of options and is currently not used. + =cut sub applyConstraints { my $self = shift; my $gallery = $self->getGallery; + + $self->makeResolutions(); + $self->updateExifDataFromFile(); - # ... + # Update the asset's size and make a thumbnail + $self->SUPER::applyConstraints({ + maxImageSize => $self->getGallery->get("imageViewSize"), + thumbnailSize => $self->getGallery->get("imageThumbnailSize"), + }); } #---------------------------------------------------------------------------- @@ -164,9 +181,8 @@ sub canView { return 0 unless $album->canView($userId); if ($self->isFriendsOnly) { - - # ... - + return 0 + unless WebGUI::Friends->new($self->session, $self->get("ownerUserId"))->isFriend($userId); } # Passed all checks @@ -188,7 +204,7 @@ sub deleteComment { croak "Photo->deleteComment: No commentId specified." unless $commentId; - return $self->session->db->do( + return $self->session->db->write( "DELETE FROM Photo_comment WHERE assetId=? AND commentId=?", [$self->getId, $commentId], ); @@ -296,7 +312,8 @@ sub getResolutions { my $self = shift; my $storage = $self->getStorageLocation; - # ... + # Return a list not including the web view image. + return grep { $_ ne $self->get("filename") } @{ $storage->getFiles }; } #---------------------------------------------------------------------------- @@ -310,8 +327,16 @@ Get a hash reference of template variables shared by all views of this asset. sub getTemplateVars { my $self = shift; my $vars = $self->get; + + ### Format exif vars + my $exif = jsonToObj( delete $var->{exifData} ); + for my $tag ( keys %$exif ) { + # Hash of exif_tag => value + $var->{ "exif_" . $tag } = $exif->{$tag}; - # ... + # Loop of tag => "...", value => "..." + push @{ $var->{exifLoop} }, { tag => $tag, value => $exif->{$tag} }; + } return $vars; } @@ -407,9 +432,6 @@ sub makeShortcut { =head2 processPropertiesFromFormPost ( ) -Used to process properties from the form posted. Do custom things with -noFormPost fields here, or do whatever you want. This method is called -when /yourAssetUrl?func=editSave is requested/posted. =cut @@ -444,6 +466,24 @@ sub setComment { #---------------------------------------------------------------------------- +=head2 updateExifDataFromFile ( ) + +Gets the EXIF data from the uploaded image and store it in the database. + +=cut + +sub updateExifDataFromFile { + my $self = shift; + my $storage = $self->getStorageLocation; + + my $info = ImageInfo( $storage->getFilePath( $self->get('filename') ) ); + $self->update({ + exifData => objToJson( $info ), + }); +} + +#---------------------------------------------------------------------------- + =head2 view ( ) method called by the container www_view method. @@ -535,6 +575,9 @@ This page is only available to those who can edit this Photo. sub www_edit { my $self = shift; + my $session = $self->session; + my $form = $self->session->form; + return $self->session->privilege->insufficient unless $self->canEdit; return $self->session->privilege->locked unless $self->canEditIfLocked; @@ -619,7 +662,8 @@ sub www_makeShortcutSave { return $self->session->privilege->insufficient unless $self->canEdit; -#... + #... + } 1; diff --git a/lib/WebGUI/Friends.pm b/lib/WebGUI/Friends.pm index 514f2963e..c852c0910 100644 --- a/lib/WebGUI/Friends.pm +++ b/lib/WebGUI/Friends.pm @@ -311,7 +311,7 @@ sub sendMessage { userId => $userId, sentBy => $myId, status => 'unread', - }); + }); } } diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm new file mode 100644 index 000000000..41bc3d843 --- /dev/null +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -0,0 +1,10 @@ +package WebGUI::i18n::English::Asset_Gallery; + +our $I18N = { + 'assetName' => { + message => 'Gallery', + lastUpdated => 1131394072, + }, +}; + +1; diff --git a/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm new file mode 100644 index 000000000..cff839973 --- /dev/null +++ b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm @@ -0,0 +1,10 @@ +package WebGUI::i18n::English::Asset_GalleryAlbum; + +our $I18N = { + 'assetName' => { + message => 'Gallery Album', + lastUpdated => 1131394072, + }, +}; + +1; diff --git a/sbin/testEnvironment.pl b/sbin/testEnvironment.pl index 8f60865af..0f571f660 100644 --- a/sbin/testEnvironment.pl +++ b/sbin/testEnvironment.pl @@ -122,6 +122,7 @@ checkModule("Locale::US"); checkModule("Weather::Com::Finder","0.5.1"); checkModule("Class::InsideOut","1.06"); checkModule("HTML::TagCloud","0.34"); +checkModule("Image::ExifTool","7.00"); ################################### @@ -200,8 +201,8 @@ print "\nTesting complete!\n\n"; #---------------------------------------- sub checkModule { my $module = shift; - my $version = shift || 0; - my $skipInstall = shift; + my $version = shift || 0; + my $skipInstall = shift; my $afterinstall = shift; unless (defined $afterinstall) { $afterinstall = 0; } printTest("Checking for module $module"); diff --git a/t/Asset/File/Image/Photo/exif.t b/t/Asset/File/Image/Photo/exif.t new file mode 100644 index 000000000..81297cb96 --- /dev/null +++ b/t/Asset/File/Image/Photo/exif.t @@ -0,0 +1,56 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the EXIF functionality of WebGUI's photo +# asset + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Photo Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); +my ( $photo ); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test that exif data gets parsed from the file +$photo + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + }); +$photo->setFile( WebGUI::Test->getCollateralPath("lamp.jpg") ); +my $exif = $photo->get("exifData"); diff --git a/t/Asset/File/Image/Photo/permissions.t b/t/Asset/File/Image/Photo/permissions.t index f39c8ba79..75598deee 100644 --- a/t/Asset/File/Image/Photo/permissions.t +++ b/t/Asset/File/Image/Photo/permissions.t @@ -17,6 +17,7 @@ use lib "$FindBin::Bin/../../../../lib"; use Scalar::Util qw( blessed ); use WebGUI::Test; use WebGUI::Session; +use WebGUI::Friends; use Test::More; #---------------------------------------------------------------------------- @@ -27,6 +28,10 @@ my $versionTag = WebGUI::VersionTag->getWorking($session); $versionTag->set({name=>"Photo Test"}); my ($photo); $session->user({ userId => 3 }); + +my $friend = WebGUI::User->new($session, "new"); +WebGUI::Friends->new($session)->add( [ $friend->userId ] ); + my $gallery = $node->addChild({ className => "WebGUI::Asset::Wobject::Gallery", @@ -46,7 +51,9 @@ my $album #---------------------------------------------------------------------------- # Cleanup END { - $versionTag->rollback(); + WebGUI::Friends->new($session)->delete( [ $friend->userId ] ); + $friend->delete; + $versionTag->rollback; } #---------------------------------------------------------------------------- @@ -54,8 +61,6 @@ END { plan no_plan => 1; #---------------------------------------------------------------------------- -# Photo assets outside of Gallery assets - # Everyone can view, Admins can edit, Owned by current user $photo = $album->addChild({ @@ -72,6 +77,7 @@ ok( !$photo->canEdit(2), "Registered users cannot edit" ); ok( $photo->canView, "Current user can view" ); ok( $photo->canEdit, "Current user can edit" ); +#---------------------------------------------------------------------------- # Admins can view, Admins can edit, Owned by Admin, current user is Visitor my $oldUser = $session->user; $session->user( { user => WebGUI::User->new($session, "1") } ); @@ -91,6 +97,7 @@ ok( $photo->canView(3), "Admins can view" ); ok( $photo->canEdit(3), "Admins can edit" ); $session->user( { user => $oldUser } ); +#---------------------------------------------------------------------------- # Photo without specific view/edit inherits from gallery properties $photo = $album->addChild({ @@ -109,11 +116,11 @@ ok( $photo->canEdit, "Owner can edit" ); ok( $photo->canView(3), "Admin can view" ); ok( $photo->canEdit(3), "Admin can edit" ); -# Photo with specific view uses that instead (friends lists) +#---------------------------------------------------------------------------- +# Friends are allowed to view friendsOnly photos $photo = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", - groupIdView => "3", groupIdEdit => "", ownerUserId => $session->user->userId, }); diff --git a/t/supporting_collateral/lamp.jpg b/t/supporting_collateral/lamp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3145fa816475e8e8303b4026080a57ed736e9ad8 GIT binary patch literal 678993 zcmeFZc~n!`)-Sqg6ciQdRfM1@C|v|;6p*Nhh=>ss5D-#=NE0EYfOLVB9ViHtP>>P| zA}Dzt}{?ilxb_kDky?~QS5Gj^EltiAV|tDC?1 zn{&bc%>N2)KYQBhG$bS>1f2mt5Pu%JaKRfBhzan<{HStR=MZ${q?L`RC?q%z?-p`~ zL=^X1?iPk1VMutla0mob`L7R%Kf2|zmAN_Uf*ta-)j13BDhS$g=A4f|MtC~}`S}Ol zva>v?a@omQMeHMZ=q6|*qzge;Jpz8Txp?}L;I&p3<|+Z8kU;+HVDv)ZNf6YfeddCS z%3s(2k0dFNA8!RhkkAEC`tUW+01qJF2l9>Jz#j$IX+V~BM+;ipw1ziR@y5y%g32YCWn`)&mJ`2d*- zWLZDYs{s%sxk$cKQu<<=!Tb0C{SkoXp_f05n)MGo`~0ri9+bIgySw|u<3 z162-q98}Rgdi03O8PDJwo`Hed7p{7suim<*Vvh0q@v46)1pT42;4Vm7(6%a|kqvc^ z8X9Wr>44_{^Y|~n{Ik@5EeQJdj}pta-}_8R{=;9_{<`|moGI9SKW(?dtlpno3!uLb@r`M($b z<$XGW_x;&+DyKZJUk$nus3K@o56lfr&@GjKAFq0Ns%ZbOgZRIFl>-=MKK@>yyZx{E1o~k7Reb#acRl>yyzO7=AQ1l;*FcbY!GmN`I?(oZSx995 z10*UV0f}760N)7x*>C4IIY5G$=LnnpW84E7eEJaJ|q6$q5EeWxNMTEBq%L*$As|mw}j|iU-wido5>?-Ufd{a0~_`Yzw@UOyI!bQRr z!f%CJg?og*3eO6!ia;U~BJv`8M6^YYh?t8YMVv*hi`){46p0Z@5y=uM5vdkw5$O{7 zDl#XsF1k@vMpQ*qThv7KjHtb+hv-ewNYTflsiJwJ6{3xzU7}P`nka9>)(yKiXl^jx zV71}$2Cogl8=^L(Y{=O_+R(J2XT$gg#>R~sYI;kzO>nQ^PSDVZZ6r} zwE4^CWeEw1y%I+yY$bdoev$!xEz(;wwwQ0ZvL$Fs{FdA;Z?^PrS>C#J ztJ>D%Tb;KCZjIlXzqMiO@K)wFnQc1TthQa-hTE35tzui}wgt&elKUl3NV-XeNv24? zl5Cfp+rDYL+II8pSGPxQPupI#y>I)fl#GakRT)H|suX)$RvX$$FV()XpG zOE*Z5$%x3P%9zV|$lQ~8A=4x?F1t}yUDit0S2k9*SoWhVO-@=)U(P`;L@rIPPVTF` zh`gG-mHZ9)1o<-gUU`;+lEMiEPlZPcB?_GiYdaKo9N*!&BW4G2N6!w{PL-V&JJCCz z?5x~5v`ciC#xC1k!MiecHSL;HlvOlQ^iYgZEK?lVExcP}x83gW-OqP_*uAQxtYoS5 zqta8Q2BkS=dFA8EzRJHSla;4oGB7ik59}8h1vaB1r*cB&hRUxhjViP~yZ4;g6SOCD z&&NINz3O}I_uk!0+&iSYS@nqOb=6-~>s4v{VEb(LVfPj88`!^T|B?OP`|jA`pn+LKEbRXP!@W?^*!SsWlG=wz_G`uy^G}<+V zH4Qa=G}ARZv^HoR)$-TM((2RRqJ2X9wsxU5RYzXuoX%aHN}UDxKDaad3A_c)J7jR^ z#-SI726d%%&+6XQt=3)A)6nzKOVjHZBk$| zWvXuKY5Kx+?AYF8SC3^L`)a0Q_Ji3ov#*Ffh^vS!#OQI=s+;su+3SUB%3ei_n-GaUx|c}R>&me z&;|7iH!sxKZnV8%n`S#p$0 z>MH8h4;y}P{Gs3n&Q;{qtgEZ;R_?#K(>%;Q@E)_*j$ixb+O+2}&qUA3>&LDqUZ3(h z=9T0%?TzqG@t*TB_eu4k`=0S7_^zRm=v*}ahT{#QpSa%-epUX`{%HS3j4~z!)A6I` zk5NBv5{M`?&F+EPu+ov-uACPTSo>cN6cf z+;hBFeP8MRPxr?jSUxC>+7@*ysxR6kn($Ecq0hsQj}AY2`iK{EE#`gfq1cpI&SQ_q z@8fjievRYDUyuKoV3?5c^Twb3f9`#Pc#@YWl^B*dmSmGu@r%kYF~6)NqmtjH=%*0y zoAE*TufLxA_4U(zPk(;ON%cupR+3`Hiw(*pZhh>F0V1)C_leocR@m-aA8p4bkUWf zPsOK-Uzcc?WD@0xu`i*QK`&=Ye<vk^`Tp|XNHV0D3ZaV73R3z4o2)yQ=p`-dDC7wpM&F_&{niXd`_z{8-U$)c*R@(NEPK zrXA!?MCaSCQ(ev7R^6>V=X*MO?R!7>UFrM!`P%2H{u}-Df!hP@!Joct_!2X;eJEvk z_i)z8!4cwD!>@JJQ`8Tm7e@!jJjQ0f1$^U--=EkzkunLJ%%9Sms+~SP{b|N!W_}<^&{&o zEJxNPJD4NJ`IUQ+Tg|iPec}7@`FyJI1B(!!>kwpP18D#>APz|gZ38|81gU^CN=Wj% zyaC8LLfgN~;y^AGl7>XUZy^EV5ZVPW#2?t>m5}0}a*fb|f0O}F6Vm;D?`}}8K}her zEDPk3XrJ#OM1WhC!3q7>j*tp;5qaJTI(5-p+tI*4P#(Bjf-3y+`@}VjyQj)uu9x{m zJrzeE|7)1w07&o9AtPhmL&mxWD!PY_^$m;<8$r;{yQ%-IuJHc5>3_=F5BL66^@r;J zkbwj8GX#l&w}~Fo)6@M~2^_|NCKCW-=Z^}U9|o{1a&yzZAM_K#UrqhM zK@EKaL!%={jm=M4oVGk;b@t*Vdk05=_dTw8Uib3$@eK$Jx*Z%68g}pggQ)0-k75#& zeo0Qj|N1mF>-mf9oZP(pg0ffTq>9SdRn_$kjZMuhzrTCm+11_C+xNMDfI2$%ZG2*K zYI=sgw7jy)SYxiU1bTsS@`qY~YWBbAB?a^n78Ml{6%*(sBpfVITuOAq9^H-7Cv3&8 z-jvy^cSl_Iz-=|OAPZy~6U95D<4ID@LMfqB1tNOxNeC-qRF^*;i z`}jR8dNL(;W9h+r$fWw-O5-m!YQ|RDzuan3;F6k*NmE@smAP;XXJb6B2Bpuu$GBVG zVW!$jtuvwGn&2{4JD1vccrOpR%BK^!g0{A9`|HR!=lKj`?x638P^8}UbU?sv_Z2?m z@ufk5tN+Wuj2)fnNZ@8aFkoe0oSKQRz1ua)hwhf#UmivhnK!kI%{qdDh|EZ~&C6H{ zC*n$zQsq-VuJ!EfbGPJ+>SsE^I6JXH*7o?{=fAgs zRJY!x9=D%V3xaOW95n9rI$=ANIaTx~XH{`EU-@}txzLv6tv35lu732kPsa}3770UE6JPkySKYQyuZKai2}&U}v~k~~ZN-_7t|cmo{yIh~U8?4+E`kU^nEvFzg5ojy#{q&i8=LjB+Qzi_S&Bcv2(VTEkyVRbE8% zp&yp0Qt!0eD!I4#P>Fr9sWnf@k$IZZi3U8-`~=bR;FVHl}V&E_C`b z!;|a`oTZdoPrPIJcrMkB=pDpOCwt8pn>`B6=0o)sS*UaFF??tq=F7%b8j`&h-SKS+ zZG6by1xK>ujvr38&nB5arx`W+DKeDaKSrSWpXTb{e3TyU)@);N5ja2gp6lkqb}mRM0At;U%+ z(v|A&I~FkxoN_em6fZr%hbZ?Fc(0M!@0Le=*wxW$hsA!cqLwcFVrvnxXY#?{OaH%_ zK9L?LjjkSJC~n3$F)OL~x~QCzmF=fMImCDZ^~~!2)2qMA;l>9t!xEo|O$r}0?uK8q z>dg$>DxQ&9>T7WH8Nx z0zH}$L2#BniqU&QZC_K^lQi32gI|gIBhpHm=Noa?bS-z60-G>s%=|E-%SeuRI%S(Z z*QO1tAKpwGPtJMdk?SM!9yXJG-&)(q{?(^d`1Yn;OX3VGf^!%7Wjc65?-*`2-FU4j zbw?-3(wbU-Xy~K3?LCk!SjEb#~EA4>ym! zPzkH6NLkpUWj}$U{We>9*JV&B$7x!=0bA*up8fkWVlp=wWf+pslDZL3M?26l990&+ z5huxqS{iMgrwB9IOO$Y4MeT1GDGgkM@s#Js=iMw;LvzNqT6*A!7o8YwAZgf((CAe< zc@WXF6Z;O=&RHswXqR=H<|)!%gpnwWqJemV`oMf(4NA}DsVQ;Y3uVkijH=%u#VMYl zapQ|e5n^b^vcZUZmetGdOV5{T`%T{=daMk+wiAVP0(D?JiH5oO?OT zOqu09wctbN3MXf;^Py_vyz$CHkE!{yBPaSyjS9ZZE_n}Ja_&uLgiv~}@F8};JFz`s z2lHYRY@^v;=5=;Mr2iwGq+q|irtwh93?CXVvRg+jy+^GB^W~~pNp}Q>SIL{Vo5s8I z;xf~0(V=STc?Yh;bmZl_-8!k0_lc*P;7H58zY5M!bRfwKr&HZMi~5aH zN{lBFm{z8aUkABnKKks~b>d#injGl0Bz{hs?wR2W7juW<`p>RXzig-Fgl`nA_r7G0oWpWw@56jd%9j7b2Pr zP63;<4?v@PwpIcI@`XUBX}lmT_5P&!xBd7x+YKz~fAnv0W5=I4$iDqAX_16XC$n61 z5i=3Ydgc11PWbS^PSq4AodCkn`c2C{g4GT`>qbGTVcj!svQIOmS$$SD84)tbI{8Ys zV7%Wxe8c;t1fEDFX~JtqyXOOAT3|%>rJIgqby|EJb#W`!faXAzZ$ z{r%J(_z<3bIh(Cr$yr_YEP2&z>~%K~r#RrtQ|T>NI;r{8qpXHPihYl7<@Rxwh#&HL z3uf47qq{Wp&$m#&J?Uqzxs>4>gHylQiIZCc3PK_;j{@NC0){5KdzG?%U^)dcHPHJ& z`^znEh9+trxmt$nJ22aHjgE_|J(lIuJUBY}0E?hnd%sASGg^A5W!J(hD;NkVn`~z2 zjrf=yV4je*9eT&8Da<3c1&xCx&3V@@Zj+L?hlzr6ceOBWpjYDjvZ6aRR5d zZ`0WC<9!^9Tu_P+i3iOh30(l#68fI%y?<)9fs7yR~Tdx-$|U^2&v~n2h!alKZ9lSS6Rc>|T_NT4!FH zHgH&J-+_#}6#^ffd>BNTBg`uzxA<0cv<7iAW$l{e`jXj1Hrh#d21ZMb>>a2~i+Dbj zic1b))JV8c)gl8cN^*1d?TTNWj2%6UANjx=MTo=-aYwzLGk86EZ66agV9W~8bY)r+} zQ(^$7ZZBq!Tn}}chYuA*cLf4}t7AFuKvoR&_xVQ~ z#IXR$*4`^1#FBW<-F89w*Z5EhNj4pQXir#7c38~4XHjRPa*}wLyA6JoqBuvLeG2Yy zJhJ_})l7N*>{HI_7Q&3LSHbG9Qr(!|7kMMa8}I8~0#4b5ItcJ`d8_{CNw%|x{sHr49+a@$X%dny}LC?t(Q4=5c(}%vGSeRsp$%S6h!F~76za%A&PN3kC zzmIoh)6#?RrY09E^;mEL1mn&`tzwEfN|)X zSW4Iwf~#jaKEBR$eKGyYbw<9kb$@nI8E=;B$jYNE!8xSjI*wh;~6l+DIHT*P2a z44-4N*Mq%WV-93jCB0wDV(Z&)G1H>m#?vYr&7`a7uxL}U;B40>7$YZN7UkPb?wM#E z2VTuFbc@F;8uFo;hHsy-A1R|!KAlZ5Y7E2LMJ}(A9a;Uja9$zL$!?Yv{m4}E>%5Ci z{G?6nykUmt3x{2f1GsQFi#X(9_W9UdV?WEwwBcxAfNV$%%2z%l?>nrNHeZe7>~*_T z_C>J%wzem0n~#p{!qt0?YS!2inS=FVQO|?NTXES;^gN=PyT~CeZA@aI&y?tt zko$Od##?z6aHF;*N^i&Ifji@`W?{6F$(l0I)&qVR+baCLnIAVdZKB0(nVKNYdJG>=Sc|+wHb@!hd!GVlvViJ<1Jz6*Fz$C~tvY3Q21+VBTkIx#exVFhjCjT% zShKEf_)%Ap=HP0|gKzY>oa8JQ(1$V-#qOvT7c@a&U`;9GM9wPl7#$OBda+<8C6Q^} zG9qqz;>Eh1WpMW887WjKXoEf{TsSbsh4GanrCs_Z0j!odGi`6yrD5H&o|Pdpm$aI} zH0$DvbA2P#0`A!{8*9pZ@C>WXyg4=!lc8JPy^4~aaV92TWh70&m<;^;*j7-^%@gZU zr%N__a}4q=uWBdsQ+ll@S|`2$)+0a` z1+ZL({fZ?==C@eX=QXEK{{HT~FVT$%KS~8`X~r{V4``2XRm3hNVG1mv$T^q&!Lc< zzKmF~iOcO=HqqhtRpKY_(F5Hx*n8RT&Ihu}_x+6r{=fsu1@9aR;MAC(Gz6Zmw}52* zusOjN#Lg}RZhv>7&St;4(;Y<+Sj#6Ao9_>}v(?h>l3mcVPkF0uMaLwM%ML$}B&h-% z@JfGAVrE$C*#}d?g3z0sX}a(8-XD&S%*M%1vb!&ckvlBp=9EMJW-b16%#EGwWd5_? zw)6o!ztil9&xoX{0mBvkv8UGj=7go}?b3+cxslb*s?uNIU-otD%p~oS)2KPlD0aM3 z)-hK*_*56ZXj+I_pG9rN{=gg@!$@H*`>-O^nqzzWtX^>^8Sl#3K}B{JT6TQs#X3Q- zP~lcvd8vKksV%W)D&CQ5blwYW8ghsaW%~rxu`tGy~M#jGVc=53tNXILW|VU9XRdFZGY z63~*NRhjaB64|9?kT*t_jws}X@(gC&G(K?xLfIy1X^I44b6U7t^!yW_U}tQl5u?*J za_#*xVzxLmxVhCN-5s}`dA8MtHvD|l&!t&@ATGPO$To6jkOwqrMXjRN7^J{i6U}zn zsT7m~)_@Mgdd z7hWW_31F6HE1t*gBbXx|2e$buVcvFx3{roqCMNTe3tU4f{s|x`2_|d`Wx1D}*lD&0 z>rAUlNvB#5p{Rt1eg=}m7NhM_uJ1f#BX6L5xpSzc&Wd_nhr0IPIGgy;CRl=*60Y8b z%7?c3vXIdn6RirKY;|9;AGt@%?FQv~%H$el7G3sEs9grHcZ^?e`{n&imBr%OwP>qq`=+lWY zwdM>ybSKyhkj?j_Po!%4o#aFBfC4yRMVuyDuMnDW4JMi<+Q{?e^wZflxk>rHeTXeV ze$H#i7!xG3fDgUGEKqvaDL%10Cu{b=WZ;yJzu93Xt|8-S@3U?!EFehhUPFc`eM4`h z{8K;%>NW`?nvdv4_f4I0uoid=dIgcjz|8rbv^hP?m6_KYvI>GPx_`I&Pte)nNG0sP zp6fleGPLLhoMg`HlnI7kn9J)DcQ7I|05uL8u`b7RE{3d2k8XHprsn;`1#4PcPCFHL zzj9ZRBdfTL)U%c>TZ#i!bx~jq%#*5k3L$s-&|C60rg?ryL2s9R$|T#|vXgTnzv-$R zsTed*k}L%bw;a^k3^|yVl0Vwo{%~L*mHp2_7ddK&ZQa$ucwhrMNSihpx3EHxwxlt-E>xr(G!W0igHGf_3kA79ne9b+ z^E7%W-!g_~6pW)eWxbqyEJXvw8*~XHCYUODl~`w4WciTQdP+QFOeiE*Zcg8O5CS$@ zE3a-(FckuWc*iuOlPSM!-Zi#tI>^=OJP3Mq9KS#rFAkjz=wP%2BcfJu(jmb}wtNy5 zwQ0a*8s*2fFDYcC6`yDG!ro2vI=)>LnWE61grv2gw$GEaF)qDXiSIj|+_~Kp&sgp* zC-<0|cBZwd(kSu)?s^>!^LTH0;w%6zkFs;QEN)M6nAeb;xT&w7 zqv`3vNV^J8V-q#`kgp*6wE82S5uNn7c&`1o+QXv~ez0aerU|Md+MGrh7=PWpKV@;P z>>UW{FXLA1uQ4@8E#qF$zEoB?4^1Q$I=Qw6Xcu>*mOeUpevi}C{V)}_?J2zySxWy9 zhDp%BOigJ;J$}b4v;#r(>{~d6+7nq;V-Y6@t!O&gS!e=%T;D;;#RAR17@{=6I-EnQ ztSor!U0@#u3*yK#-$d^95kdA8-w$glzl{EERNGRl_2-23Ngdqy6F#(tJIf&cP7&#! zagI*=I`C~U-6oEc+qF0}`bSK{2n6(l0pr(s1w zjQ(vmR|!MiX5o5o!!=Ts8!TiUdz8=o4F_bQO9B#w5~Ts%ef}MNiNBb&*Z2b9)2HtM z>`GV;U|Rl#h!Jo$z6Xszd7rSYv$Cy&E`}-R0ODg+d1hS$eIW_i35E1X8 ztltKKjaKIm;)F$8yE<8+MOj;maIp;V3H^Qk2ioBNPe-5O^3=%gOg7!cmgz@rGi*3{ zcZ7{{OuPX1OhmwKVva0%F154zw~76t`+3p~m8=%>!Bfis?sK6xPTe7QuP*Np)@PRi zlNNn{9%JC@9BjDe=%8S0pbdKQ8bOziM; z!49x~K2%r1?OWhO3_Pn~X))Ru_ke_iHH}fEtwRfa%>0rmQCXyv%bda4%am~KaEC{u z2-(?Gv1T-8gIQ)FYT9jIS#MyS9&d5}@Rb%|hn&|lfGrNafnH8!wwLs*wP!Nmn<=+% z@*&a4ozsz;T!MiUiP2MgV$?>B54|_GkAJ0I9(m>RFD?=LC&=+>Z-x&bA1I_orRRCy z3VAgbHF-8>V5f)FyK!8>GInGb_{T^M@&$TE?$~wu`NFY#)FDf1dsMCEmfLnsS4Sle zw{_z>Ye&l0BT>nGXkfOroboXB^pmdB=vK zcG+yob-&fKBwXmcWB|?bA%eO^d0Q2o5o<6^7>hWK93FD!=FaI2S+E6FXoU}h#KPz3 z549fDINw%=KW*)PdD@Y{_1Zmo5rn2CpRkdqXpfxMiB>fX#&_kqm zH^I{sSpC?3--&!0;mxjuxK(eCksn=^jQ|J{zct*VYN`0e5+EkhT%+%=eOq&TY zGsk8}qHbDlul=<5W#@QBbyd}-Yi<9b_mJ5bn; z+#B{wk`0S6^oT@Iu`z5DGpT+cvQj>FZ^+%gM&}JZP282|1m=38^P=fh+Fdq^`P(&G zbJ7?lT3NZs2Q^MJwYpZZUvJ{Rl`4h7NcT;TMHp_>_{rEt3SPldMpB7qBkC5AN0ZJbL1fKxO zV{9U8T011AFqE#^qAW@Kn5OoKHtbzQ0{Ie`vjEh*AI}ECt-dvq0XqEb^SA4%sg_NI zU05^bo&sFGBrybYyoY4tGH=8R?TGABdkSOat1ctjIpsx?TfLRV>6Atr&9}U5Wo)dn@!HNr}7nOk>1dtbn?F|9cM zDSg(8n`#Qbndu{+;*jEKTvmH29+WYQ41 ztwW3VE`a^+hQYkX1l$m@KC8eg&~(^fv1aTVex)pFEV$`lq#W~Xy9$oRaQ;H|BF z*Rp(yM{A}8B-2_rsys!u8*vmVKgHX_HWRiB|X4q$bm6#Vf$2@4%obJ4Mst0T0x1q5b zcW<<@vd`@X+3~45XNfz>Dj3%vGHOQ9nhs-;-L*!UK4v@Xq;_Pnv8ApNIZjw2$$EDw zuHDI-VG!|ivgbVVB&{tf=_^;_P1xikgITMIUhIho%xGpn@OVV(QFlBqG;*2inCzUf zgE{S?5U;;N3qx*u1betI;d~|OXBQv5{8-yV%ios|XP_HuT`>8+yNI95ZH#PEwbd3} zeHSlLYGT`BxeCCkrr539PYtUugK6k`RO#akZMxt5H=ahyZUH-t4yHy?7*Ul zZmn9%dnt8YfwNZo!R)gY#89S)8sunh3Hh+M0`Dl{?bbQ#o z#|6yN!{^))5VTw;9%6>)PNm>vaAgMJ7`c$}`bhN@)SPu;;p-C5j&C3l(Q_Hs+r<7% zS<;RSZVbiu`m#l4^m?WRkt&UXXq%3bDwapGwww|%8H}KtyifZ<`icSFl z<8U2pN}kds9ho-VCtnw(eO@vn+vn^;@F#ffY@5D8kXkv3U&Im(jTaVHwxZv_q&SGN ze$PI#Aro!CypI&4q|lbq!b=657*3TaPU?nZOziL&sqpLhqffq4U>pmwjd0gxCc4O}S*KPnXqyK>X)fA*ESsBTrF+yk z^3OLS6(l8@gcjrY{C&4m6&`-LJ#fu-{Z{K^j}MLZ-y+pI=88BMM={%6m|2+ZA=i)j zYKGKWXbt=I0M@aR*B{BKZi7+P?**;rBphenEa3!1JA=fI(PJm!8okYv+)IG=V~wyq zEh`Ey9E;QN&K#pe@dN;ir>)+otWBS&@=-2i3{oUGW?j54G#U`1@8RocS7Nk&vB(*G z<1Wi6GvkoH1_gYn6*t*ubY#1WlZD&|P|6y^W&_;h<8~-Ry$gFZg8SrINa7;(bY?ED z7(Cx?r)M=e5k3?uuxTJE%Fj2av;-X%k?^P}a3~V?5VcLU^LaNG9TY?*GV?|gQATT& zIy~3jU@q=hoI`|b-Vm=VbtvT#ZLJxhK$c^=yP|o=$?Bg>5n6c1PCz4SJx`iGvC|^oYrOkKNR} z=dntDTDYmyM#}YtT-uK@@OqQpM-h4WkTZ5fu1bn8a59kiCHMQ!pfwA(&0wxx-&JjjvOx@m$Ozj@uK?NT*6h zD-g;O9{K~Y6(gSk>nU+hvZeJrD9Mzo$Pd_01Y{%dUW)-08)}c|)EO6sD|+9mK**XZ zDRM?`}B4oD#_#P;^rBJ$i3xkh3IkKCq9I%NI@C#Tx$m=`~qtf+Xs-g zH2lN8wKepFM+;-!?sTPYiVw)cz<&?qXfWE9nHS$6M6ls#s!4?TMS5h_p2}MKhD?DA zt1-#-VIx^1>z+>G@F9soI5oqIih)yqrF|?8$PJOS@2MTpan<8P7ud)FfA<*FYKDEl zuqyLT@vO39x4}9VPV{k}e7K5Y(r7mv5n#d1al>$yN=8PbN@-(AZl1Pwt*(3x{DA>X zvSt5Jaqa`pDu7k3#x2HyBgI0y-J=yY^C9VRG949Xw#5=XijnkjDD`oU#E(&!DWRy9 z-XnYn1U)#nNtvhWYr0OrsQ4xuMTQ#ly5}de-4@ik&Fl~5o#Y1XiW)b?>*4drB)_|b=E3IIG@R(7JKTD$8C{hzzU?8|q?-4|m z+=ex!N5&bnHT74N3-^!3AcvcD5aTa!)yol}w@$Odqve24N~2~BHj&l2i6ly#n=vyk z*Hz*U`#H5uLvttQdF&dhZW%XAU=^&7@Z=GUCPq>O!_U3TwzGU)e=3WvoHW5(aKiRu zDMoxK&N0)sQrVE+@{mebBhp4}x;<&%DA%LvT{R}>D$H(B=zNF|k+1`U%+jxvorpV} zW3**z%abwKj#=jiZ3~$}=y5BB&w>~Pt{u*1y9Jj9Z5uGKS2d|0R#;Xu@RUi`J6WfaCI;Me)oPoZ%UlgRiTyD~`3oW%m-8G&BF(W3-p4J|R zE6=Iv)-GANvFd`71-k|xXJC@qd6fBINNj7GLwI;Xzbf^&lw0e)1X|2A`BDbREFr(T zkH$$q9rY@==Vs3Q0+JRpm*4(h?*ZUiVa?fjl<|bIIG)K5>4*HrGel{OwhTThRc{EQx#EfE}f9x|NwQyr^FV+AJlB82A z9c=kf(K5E*b156-qJz|X57u6*C6mnpO7s!|XvGz>p( z4L}YbGN*K5chV{KVJSp9jOz6h$0@5VJQwH5tXQ1u9N-r80c@8+nW6MJIvNtk;L<)B zdq0_~j}l~OhSg|o_wma6V=q!-)~w0gZ{$lA9qWJ?1r)k7kH$hru5|R8S}HUlM7@J` zXMjmC+r~Lb$EB&I=XjeP0;bU)#58B|91<`w_LXA^J6u9=4Z{ElKCbmBWbR#LtC=Jy zFoUgWmmCoT!MeEC6+B|8m3ztl9p@Y~muiB8;p&aDn77)`($Z51?2$PN2*mriT7+u> zDEuK7a3@!?;p^-iC?;t`O7sMV|s5PLwxG+t=Dy|2%i-aVhYUsyC81czyokCe> zvnT2-q8<`(#{%zUJk)+PEGYNRwO)?-3(lD;rU!LVvEM>AHKOlvEkdi*DhKSTIEWn? za>aEyU*?F>7Ok0SSs`~P-w^tF%2lzg<$V;YN)>*tQV&=s(`*3hJuTO8wfdbo$=jA2 zjB{hLPMJef84BHGWu^q%ctrt<) z$8qf_O_1w<X8R+A=?hKE( z5t{py8%?)^ZSr+HK#Ppl#z!xB)TGSXv-O=DDRr^)05JD90jNL<#7TSaLPdcpl4>xr z9PjePt~s9Ly+EW+@8wbad;A({%9dl&yJ(6FrgE*{r1~dOW8tryeC(!-as63U2|Op) zh*T7?oqHS*j|W?viOoZZMw|?94>Rp8Po{^cQ)}R(5Pf-&oBH|bW1LSJ0{BO$#eMS= z4r;@n=_b}~E|+)>u{IrMdz>R;=Z)htsjZS=pSwf#^)x^&gPcI1zQzjd5kU@gzRp;E zDl*m-O_#9h2%JATu!f{HR%@46yS69u3g<_zgUpp8u1t$_dxNA@9EyrnJ=-Db=2lpM z8i<^=i$91P&rM?wjMbhfWVW7L&ER zLEchIsfA!eMD@~BFh_q~ESV>3FpcWT;%t38x9K(33$kCg8-`0NNu4qIm1CL9hjMK) zr;RHJAmrWW7W+O1zCOzy7^KHn%2Do`N_}0FWs04w;Wg3WgE}O_HeZ;3j{&Z1owC#m zoDw)U=*4WfImTlyu2oWDW<;7}MH_oV)?z*#MJR@ZjTG52ue)F>TX~i5*}+^^0YN6H z{bA$|dNczWW2VS-bSUr2W+ORP<1uTOIyfUNAArT&iKm$dN5NjlyDcs~93z@zy|U)3 zB$ujg{lcxmjj(>{Y3cRIOHXhGDVl_#ris3Gil{!N!i`zRc3?(7<0#P9(&ZL1acCdL zQ$T%;_rh60+&neWXEbK?lRsAOns)7pypSKK33R>A8`yry&%u+*j%m%FJI6X}Q~d(o_GKJl zCOq?X7}lUq5OQ7lke3fDyLjX?cJQD(caeLmWbbSvL1ZOD@;$!Zd0P?y=-!s&u0A)d zb@BtoLFyL1t*9=)@})sJv0_FU0l*pNtx;cU{3BoqbZ4D#uOb`1=eY(4kK!KQ@+O<~ z&P5uyg{U?TkcKMaH#W(8YEO}8-fP$evRB(1c?Y^8HGGXLV@NK{ zqE*RlP5KTa{S}Ums2b29BW$!Fa?*gK?gRgL<_<@fTBpXgqi@ZLm3%6Xe>MY~cJ|^L z;Q7$rPf59psXmujv2QA2<&O2~s*d#HgoYuHW@B=4ZtKmU0(2?v`t(hgR(8K9So|hj zaf2Ei%xti>ZVPD`yPi&Wq_)SH!sV-OqW#n|3z%Mw!Y*7xI3N`YQwESMp9x$s2%|Nj zbbWQ1>`~YG2l3f-*qHXnU9HijQFde@!%vax$O!{3WgGDvy`_Qj)37Ad=Ihfyr2I62 z_Uo7RCo`3-ZJBay_fgBOAQ!I~%ovF^FYR3ja`#e%d84voubI|RoJ5blw_7+++xisLIE4V#Y z*bLMxTK!Eb;%+%ekx3j3Vb?D)@4X4rA;_lS-L{pdxD>jcbpi=U&Y#$)pMVUW{73JO})Ji@E?Bws88=3Wt1)C2XEM5KDLuvTtgn8R*R}B6CO?MvsGt*gi@d6fk$X9IWIBQ)JI0eC2;u7eLValLw-wsfb3)HtBqq5{?Ks0k3)4! znl=Zu+V>t%go1e9y#3q=4Y?KPl15c%Iwsb92n+~5L_LIWbZ%;^BZ5tksf0yDFpN{i z9j~R-ti_WFdy1`R)gQ$n`(ZD-fhQ751zV2)qgy=xeIv{N58i#6>w7l-C(UjQFUL2H z=jOZX!{#8x9wNxBA)fdoXEQU_V^s7e9;{b*-}2S-Rd3?JKQHPgnt%FZ7jnkElmB!- zR3k}ZbeoF^7Axi~^kC+BPh~-Z(;b-(^N!=nbdV7BGL-s%yVv(0&|lQ<<_()jE9=63 z>}}>Uj>yEb1Ys-Ix|=K;@}@$+MgpbtEkUzw*|gP#Fl4QO zPgu2I+HHjzu+NP?_MtS~*j_`~DwsC%wtD12q`nXMuLr}W!3Owbb=LpG-n+#movwew z&8C_*W@Tw<$xLNCMOKYwnZcTI%*>25_av-z%#?^#N}{67w9(YmRgF-&l1VeS$Y`Qz z3YDV&GII|~DS_jD2X2rAe!Um-|Ge+fd+;1Q&vUZ=CmosK{kwnneO=$(WkU+DDFYWU zzY?wpq;gLLev{_Dt=$)L+$P=M+G+!yjFmT0ax~+w03Q4K%soY=ev;p6@a;6#Ef*;n zWX%PsIG;KoTT0N(;)Sz}A0l%{f0Rx)n0CCzfDv@FQ;$&J9Zb}DY1jk2RhnHQb9L$^ z`K0Sn@%0D3g$L5MRs{Z=Q#Xq)HGqQu64H=zL0C_bYe80VFfK{B#=hF=i*QWhJbL?! zSdZVlh|NXrMWRTXO45w@FL{f*;ja9xlV*JLfheh0uwK*T+U4|pXn{+dT~(l;nxbQQ ziJ(#+cW9_FyC(P!X_M|sjp8I`n`%6ZK8%@_lNUKDj2|}CnC1;a){gBSW;6zHs58RB zhp`v0eY~l2QJK8T-lAHb!N;r~lbByG8{zbrGkZ&{^xa*CQmbDy=xduUeD2^g*EPgg zk8DteHQ*+xsg^6Bih0}gQ+yh8kmN$4V6q0kF+?nsNn#2Z$2!1R%9Jy|A|n>v38>dJ z%4LR2{Kg6hhk}C?Die-Kw$zCrXKr!kjtbY??I}f?wFUf*+-#2a#~YfXW!ie^MsRrc!pXk`(|KV9FpYOv9sZ)rEx>jGD7=I-ORbNVRN5 zXze~%u8V2$hTDcrtP?ukB76Xv{HR;7Pv@-svu4-LIns^5ruy-Nll$^q23@R5yb=}` z%A0oxM{za0U0qJ3f$3Dz+QDo|)9l!OkMLEno!#Dawyx{YC@^+pAE37F=Wv29RuhiUCjyE{^{+iD?(mrQ>IKRzl z-#;nWCAb~F-|GY?a7P+h5R4eNX=ghqU)5SP6+82e_JQF42V!gdS z5vf@=m!Mza{a&UjYF6(75SsM$sBFoUZqK7YeTI+f+zm3C{oas$6FTc8>vuN;!=Qw~A(tpHqg{t!5 z$3wUn?zp*{KNudpzj=eer>krqC;?ftp!Nj>x!aV9PzGEp+oy^8i5}wKt0kQ~t#MGu zHfc(w)THte%ROD#Ekv^Cm}75Sj`n1JAp|N2=Osvtw`?6v_@zb&9aO_>3}Q*g)niwb zr$})tMfyjkS9qASt|U%3aBDqkl3ZLT zgVZ12ZU$aeEYE97(pf=xA5rpCcLgDfYNR0rbSkQ6DUVYZ00sa{ld{i3u{>kGW$)CH zU5&CH_9c;;d7!=?)VXDMp~ZM2tmEa@GM8pF2&K;z!lon4M#n36KV~cyQ68PIls*QA zBsjIDT5HEtgFNuz$7%QkdHzcy<3sBt z!|7!UYgmUUfbCQDv=m@rUNYCCYuz5Td~{=+mJ2tNS<>re&E&HH(B?&4VuBf9Ui|FM z_qAlIT)0%EPmWYZyQ++DQ7LFX%7~s*|I_RRC)uaLNa#X}yUtZgbnyetL0>86gvwj= znKu?>j!}5_R;;%#SR5g(2?U}1j*$b{@305j5;Iii76z8(6}W62Y)zzXqJ*p)Epr<@ z!}%M^_7F49EdO|2$@xWgx;;T?0WF=%n^aTRS@G$D?IfkN;&m|FaK^%k+_`t$J7Sa8 zC-P-2Qyx!nR@DlX4_)OXs7ouV9QM(x8W$@nWj!;n_(v!?hE@=cN1tvwt3wQVO)TQy zRMhMC#@F|0E*?ThQTCI*KbkV!oPu$9TbYVHh!NItsmmiQS3r?PeykxinD%e!oIB*? zW+f0Rm>cLUX^@w8!3$CQ>v(`)^F9p*Niqb+qo`HbO%Y~-FYxO$j-AI-wLgAd;$LyK zaY#Ch1n3_e4hK+PU(T&dEp%V_xudkO8yl-^)$Nh3(%gkI{5t6;xQ1;O&b@@C-VifYI<&%RYYSB_ms^yF#^?BtbJKQ(KMecH0TlJ@X?BQ~`7enE9kpRn- z>|I>m)c>7^tq}H7e`;fpp$k_mzjdyY;T{?nT~c2Z&g%cUvMGydi$Uz6&#@Lcg=}Fl z*9o7}C||zo2#O_8;@*G@T5Ac_QBJBJa&Bje_r8A^g^Em59T`rsH@=zMD8Pc9Rh~xm z6i+b~e&lF1x!Av!_bJA3An-@j*{eG*K`B1_LTE}2P4Z ztzo{xeOq}~i+PD$Ov;UafcX@32;e%-NDw?x@wWo#n*Y?1!S_#|#d z(xP>kDjvbFC5@UN64x3j2Na~6x^;P);s#UksWDcKx98}UO03^vuN8X%%qFvvmV(;l z%1%G!u+C;P!zA(}Z*92a8o=93j7>h3o#~6X)J)dG*Zk0!Hac~depsENLM0+!g!{EO zhkra`@@idt#+#10Z*+b57JZl3>!Hrt?Nr_<(^SztQTv4gms+#qN_m7(dOMKdq9)&G z^ak^_cI5_z7`NyFMFDR9Yo-Ao1f_i^d8S~9ys_OpUB}y-@>j48gon&+|SoA8~^z_OpTu? z$gAl<3&(-;DkL}2NXD96XHBX@q7GAdelabt!qYVx-6b1^uMOV^4iJ*h&O)xHTt?`O z;;fG#u7S6YgDL~rmk z!`4GqDTS{r(yZOO;7D4f^Oo4*ttUDIH6$PQ8$KLVGY0*g_pYZJ_X4^l0iMAQu|3t6 zaBrSq6n9+f(DPTo3b|54R`L{~4Kp7!#DyO;@oMX1kNF+*9@wE_?MaeWyD`LB+PPBp z>L6|nJ(tv}bK{N?O_Wj6qzwCMqcgoOC7O&=NP`e0L#laLlvdK-Kj!*Sgigem&LOC( zuGP97;G)?2;=zb@?l!)%8L%e}o|Chp`5sqDlcTM*2VO~W za9T)OvxX$bWaawH8SPf#m$St5UoMmbzsR55X?V?t-IEb=w z&+m#Xqf^mN`@$*t^aRNyb7XxJ=r09S{pCU$X({+nK2Be?M>{kjE0jkcDe9cxin+n; zNeACDxCwUWu!>q0ty>uwRbn!QtNUKFCtS~sj*PVN3uL~}15bkC&HzujA!Bscjf9o{ zB+bg{rUS&4T|znOJodunaZ3unsuy6oOw4qs)?@GX3#r~J*B7mt;|#wzWgEj)RduVB zM(T4{M56h;Mc!N%ui_J*2USD1AtXrSDwOXNBReAczsrDZgW5yn!FZM!V>m!TuK?D({iFCMC(KFX8uxu)bx$`NIA*4cYm#~2J`qCunItvwUU|NLPL|#0{E7IV7 zx`Q+Hd#B&jl%?zz#%=IoN{$~Xd>4oM#lCeZ16TIEyiRp7D<2FonBEEk36?(G9qwav zC@WCinzZP8HNi@^LNjde-4G>mUvBsyd2ueVq*5&SnRua!NPw@zS_}2q( z+<15J&YqCcLrV!vf=E}EU$L9N4 z7D^7Tt22f+=8FxSvAwz7)wnJn*WcTCp2Ee^BKW^{z@$KWE2Pr={tXc#!`=TH^pN{M zM9TlQR_1HkOMqATLAyRCB~vR72Vk6jFy(yL@m*C?%dBk~lBR_xH7NOA@={pQDmqJ5 z@#NF>#>OHA#g9Ivh7F0Vop6PMabR3x#E}3iVN4{W~Mjp!GJUCmzhL zdM@D`uWY91;h6JC=%WCJIjIX!VO|msYmO+IWoyn0*JF+8ubLO`^w2XFSmw2mCaS+6 z)Vk|KBh44m-{pVINK$Fo@)!wYXH+42zL>M7@63CbOM}cwl9o)mKh;`>mqPYsmC|K; zq8-qu^+Dlf5j74;x@b^VJ%3)@Iu{Pv*MmFC{Yo@h^6aXT@Iab6Yk+4|KVXgN4@amF z;{uWp!=qcagco2EhK0lJ9^?7?crd-c@Z%9N%Y9yqEHIA~`ndKB7<6xJQky1-gEx%D~ zF<_k3f1rcAqZ;WetEtr5aAw5AEtb@2G#Ll=G*fdFSq&p>>Z2VJY`Saxn5MbmXU{Ut z)S+|C@rw|;QvTi@c?u9!C2b6`P(>#qRuIVc4<+%o0<&>M8hsr-F}OZR|6uo@HLUTs zaPs39uWTHAvw-@VvFhXGwqg0uZKbSX(Wb*y{^{oqL0{h37^_qt zSQx#hC2KQRt2Lb88P1w2eR84B7j|E5Uy!q&m)E>SZ~=g{v06wb*$Rh#`og3v zyiOBcDtbItb?LSKnmpcD3%TKUkr;P%_{CbNYO|aG{^*)-w2kEBL}*sDoEc1c-THnAO%!E>re<% z_FRfYDvHf*0pq;$ntps{TwlvY_|7f9A^5 zk~6)U=2O+m-vm2UxQ4hs9P;CB`n8Dz=1ye^V+JKxw&6>+^M~2oR;<{Lxjq85wAOh* zxM@s!L9ny#xz_&4wckfLqn-ioG)Qz`7|WB`;kGhtx@ksVo#>2;U*9pb`_B|fKt)Ob zH5a-zUZ4A*OAuRU(`o_!Y5DZp2|i&+BDsw))>hzr|weJn56^Gi%iP z06M1O61}P+`>?W~s~~gsAI2X*&G8J0DL#WS<;d8x`y-f$v#q7{Dtvcv7atI4oWe{> zGkz*MJJhW9&t*aVH1{U3TXiK_iE-AL(G4Xyc7Tiq4Fg zjH(^5>)Uk!@+>kQqsL9+B4ALylDRDZ=hR zXj!x;h<;PWf%d<)9d0Ilr908(bjZH)wj5I)zTkMhCOS*~oLU8yFlp|=Y~N+@Y%eP; zrduD=xQFGBnMd~uEBPa(Q^8tesc@K=i9tF_3U!;6Y-IgISI_E7)o>zudn&L`p-N#& zPFD^ec8`FXg^rZ!8}qCL9Ex(<7Yb$K>-^X1>We}Jfo5aysX%rmh!%Z!R-Bw}WM%K@ zuzwb1MD|k3ZeDDW^vr!;GJ$&Pwy_n8$0I+d)M;N4zf&zFMxiYNG#RQ?`9gg%FG@3S zg!4|tr@QA;l9>ZTQZOtZ5V$LmvY`OxD-$`@Xau_xJXTAqdKs=Xn=;b-zdm&`GwwJ8 zr(~;nBHZQ(kRvWKZ!!umJPS&5@cnc?x-@4of;+Epuyogxe4!?YJ#wG?7?7@4(k1*DI~Z7G7Yw)w?M+o zgX3a3UirbRC7+)4CVlu+O~?F-3m2>)Mb;fM)A{;tmw4*OzSE74RxJyuv<%Y-X?iB* zQgq1(ZdRiA_C?KzSp|}w`;HkYPJ|-*a$l{VXdLsUGY?dT4Z^#07fy1jqEG`xa_|76$oUKo1>r65?{U4Ub@H*)h7|HIY0ztqR!_mP$V z-4<2(7=|GQ{F31fYBR^-FC89@#9IEc?XKR%JGR=p|JsjrM-79L?mznfk~)|CIB)R8 z|1|~ayPTBWU-iKf|Bt=>|4JhIGqCq%* zWkoZp`)ae*S5Cd`E=ah3kra5*m7Cy6)Lm9hV2`i^`aPWi{iuh6DZw=Bplb9qrteua6fcZ6*g6K zZ6FoDL}%Yk8=V~L+5t29(xoPyy#1H7&t~Dy#J$$dcfv>u$k#zON$h3jV^V60&WE`p z_T)44wrc*JV|fDzY{kRfI=B3>8lKKt_RUDYi6$&=_(@8(LUz;6{Tl`vG{uSLoQ6%MjOP1X z+9Bps=2Khd_;14TU|xc9ILT>MQF!3>*w0Hu?`4*smjsWQ%6b>`y8QOLY`7yriVo(m z>ej>^G4bbkW@xEe=LQFyYLrIK*FP8o^SDpr9|><|b`Wg(SPlD?Q20P*L47YoC=f+?{MU#*PcFG>JRs7SSn!?g&FhY6JUyPm#}Em#z4QMIec=g zpGda+Lw_LsUSE99?$TQcKHYBxK0H|9GZ0G3C$^EEAJAbga8^2bKGvkow^)#rCv*Q+ z)wMHavw@Ius%AXPgRs#_9%QocOF4~ZvFT~bgjXaB`n6Z)m3PBz*pA+wr~}Bb9z3m( zr2qp52Q$AXK)UG>V@3KS)pCVHN)+ac7CE7{%p>LySsEw#$ene&1 zUa%Edj>V=u$=ZPp6_?S9g8U7LeDlHD=RD|ZK#1N>GtE#=Pu}g*I5sOJ4d89@m1eEMLhcbTUE)DAB&E(CI0;q=JI=pMsbvS)bbm zXpm|suIlqD@ZEas((ZaGTszn2Na(}j9o%O^wchYun+XL|!R!T}=E=Ie?Yy2iM`43w zydyqEXsomNxVv^^Tv#ddeDjVwu&p`|3TZZ^VI)?v{76&!W93k?!gy0JeU}`UVQ*1w z1N6#I+GsV$!1{gJ`ohvgiM=at`Dy@{Li2}g@t@n#v|~Bd+NdhhIO8=%IOk(|SZr^d zv2GN*TjiQ4S2-mA*@e#S2u*FN)Ea}lyo*SQ8TN!n7^cePh&-HMm{Zf9i03@a@OR(T zh+$p;3?3U2OZoY2^TI9kVqd69@4oD}=$z9pZ%OZ*D03P50J;5CDS6Zn>Zt2iwZ0k1 zx@yQUAI>agM-RG3YGr$?$MIkFj3!v9R@c-f?C9p=_`w-k^8iM1G4K**dZ;^nPS5Yx zSAR4kn$>mT%4``H3gh(=mb*Yr=*FJ(WafN=(z?nXxYGn9VD@fAX^@=}flbL3S!rN^ z@s-ryf#f7FSZ2~*!Q-|lZsaS@%13Gp6Z|E4k@^N-h}Lr9{koiUhj>n`)Ffys@LWGf%PhO5=L>j1<4ybi8~b zw(;M#PR;lD595Gb(b|zz<4Bsjg7nLSjQU>Pu22PTGc%ZeRgI|}tMZI6^V<(lw>#BA zPl^A5r*lx9%YFQL$+?~p^Ng#E5Zgx^VwoxEi-<^n8(KEl9)F_NVZZ!9H*4JYo}Q~n zuNy$E9W!0u?@~D4?gmzGccgfttQm^)8ZmXbHuw0!rb)b!GUJ-gDt|PvDr16XeJILf z=NNuMZySWg@X3~b29BEG`%$&5YT%lgy7Jd2pO=uC&FEzkyw<416BZ1Lk1CUwi**8a zLC;9G#pfmNcp4p z;W~KErA|uxWHq4Ar!J18<51Tx=vMvHDL}Ep&S?9~1-9k4WixqfkYR-z%$^jal4QN$ zL-kN{Qk_Vu2-1d#ew1nxYvAoH&5hZfH)AN(1m1jM**QD1r3)@mamQ$vZ~G2O?N(E+ z_BAA3NCCtE<@R1EjpY_yLVjph?JC6zemM2wpOxBWPlrY;tM-e`vi_P4dxSh%pu@@a zI8mTSWgf4^wkkB-s@AIy++$k1%kT(n@=_PTfLKJ_3Gn9ls^^5%=`E;Dnpf(vV{;E3 z+_PHlya((29k*?H^FQdLRA|3?%cWh|Z|S={Ro_0A>E_A0=vPd6$z# zf&Ph_Y8>=>Feb27os>zVz^mK}Sz|B9KQCFPbC7E-o}<4aNooUzB2dB4S$lwpgl?SA zFVb#b8pz>01+L048eQ~#L{Z8b#j!)xaoXz8ZYOxvJPh49T&kF4p?qaGeD!m<6#)zq zNH#)1fX)>^&2vXzCxVtjYX|Y%b)5udXql!kzh|_v|7+EKJIf9=0RW4lb5{{9E)UdVA6a9XM_Osn5(|mQuaOxP=4Bm3~0GirJ zGJ!Ca>x%Y-7JX(B-5s$qQ_Dg@>UWNJR_XT=AX@vXn^@bPaU!OJg0V_*a|%#><%5V> zz>*K0(HA4V%s=;bT*G%n)vdAStS1m79JjKPcU+btY6z>)yA$zHn7y)6eRZbGHdH)6 zQsHLzDM6AOI97%0IRIRDVJMv5*=2q~=Kb&3Pq+7IoxL>~3S!m()s)PHG=uZhHDl6~ z54rDMnL~v5oO-YFl=u2w&HAn~7mVIM6%a-VNm(nf8j1Dg6q5Wk)CR1{t&mfaoRl*z zyY%I}R$Ou{BSh`qjutHK*9c$s8+8O{AnUmy+8>8KkWNE3ha10grdT$gg-cW;+uQB% zU-xV7OxH_KREh(+-Qez`By<{{)-Z3XxH3J|_YU#hqb9=ApB9^)_4yCTb?ZICB~KnJOyb?`&Iw%53d{os>(Lv$>{R+1VP zqi@VpmcIzxnQ1gxm89rKJN5hp1lI95b`XpZ@xYf8slZS4(x`o|(Kenj5N|X8rUoZI z;qyIPdmz(UZQ>!e>+|hu&W|vSR_)SNRNiyb6}vCcK6%JV8{(fT4geDPjWEToj{xjL za8>8rCU}p_VE&P$`aE+hxL_|gHAvYFM-H^QDb){=jBtoel6?ZGR2-{a@^Fw--_U_GY!6 z_bcc(gg^W@>lZ#&^4k|Mh2n^_A@bqg+IEO;Fbr1ypHSof{ejNrpUj#_e7~zsdj{^= zt@>uCc#tk=M=P@?#AQv%xbEhR{@FpOBr%4>A>J01*`&k3D&~#5nqTw(D66>EJd^)N z>T8GIx%7d_gQ+quz31)1s$&zmY@dSohl=T&=Ehf}M9;(*OHGG9y6HLOi#GkQAfkDRp0p?o)DRj- z>vUwrA%=~!86MHo=;N+d*Fy~St4Bxq}jDAzsZZmhRVsq#$ z%_DBX(|rSJMqHg1cB)#HbgRP6$>DKJzRT8pwV!S~3x+N+V6I}k z`x9c%DzsTQb7n#TGXukQ34F2lfgX0Xgs+rO?kZMbq6o%(k(u;oeV2gp7Je4g z;^O{H5Qd=W%mHWwtZx@aU^l6VRqBUi?@n884$B&{?>yZ^-JQTmXDeH7Vmttvn(%_ob^Sd`aYv4cNTvilklpjPqWOg-ImG-A80Xd zh%L>Fw))L$?8?=F*D!l3j^MKOAN0M=4cR;NEYR95r8~+_E1x9ik^S}slGlNn2mRI) z>;gUiJg3 zPWPJUkfa2yMa2ggWfVBV2#d@ov)a%95zfxWJa4byRmeU_`nlzfL{vOZN6?_IqudTmF1tDr;P8P zBCSYk`Vl`7ORDnvNPdcvT!;qKC{^wYOqen zLM8S1Q|0hvCgklczRL`cByUVovr?H%+EAbShH@Y@o(T1&b<;th2KqhXU-*x$Yc;O* zv;DlDIqve)oo}xs;^&j@Jq9bv-b2i8C9P6Pn0JMEbU=##uk{E#ZYfsw?4+ zHrb^sPr=O#d}15K{kyxt_4f29m1~C1+LoIidFOqEke^^PTr%N}mzB>wq}=J4r?l({~_>mkvGG8imXHA;M1 zNGEx>2{w&c?rUc_*xqMu?K#F}R@h!B&6^F?{tZGY#3H1;8ns^M41Zz+Q~F%qlsHHI zN;Cel%F!n94^@0GOFC5Fe4r+4?6>?yYBqwg|rpHtl<{uhM+?!h3wh&D$Y$CKE?V4$1tw!|ANqwNl)`R1gL~Ba9*c)qfV}w|!pHhPKW;EKf}4kPt8iZOmTnJzv3wy z-^Fa7|0b_%TMGDyV#>w+(t=EL!b4e-Ju`XWXl>^-ZR`FZ%#Srqy-{1OoB1sK;wQ*L z9zXT^V_a(dO43b`5~mIE2be4S+;`x5qx$h++?JI)IvM)=6&8q5Z7s120WH) zF(T|fB`PrirMc|?=iMLMDn>&Q$(=(#mDNYulxvOWeeNr$D@NDp{@!I(Dfzsl3~e`Q z4aZ3`DT_j;m@Ufo`qzSB9bz?4h)$`KwwG$&s}nVGrGaEfq`7T&i)Iw(Tipq-`3lGz zSiqfyW+29(tblEZ*Chok)R>7@;KK3O%%f9nom`_g&Q&>>oL@L4QXB1mKOw9$7>%<@ zGp%oCp%E(@o-=aR+G{h-57XqZd=Rr*8aOi*w@)IBa&2RKXxTpob? z5xjRlkR@Zk^(UTTVA%DGb`QD|Da6x5%v=}b=>n0;-Wc}s3B$Y7?r_Ud^v>zy9aN?w zq&O(BPoyryjY~-fFpHr`(naYO``1Ynv4S7p$;B{H=)&gb-dSy>1vzJ^iMPNK9PacYx9`(3>;gu9PXbk zv@LA~gX<+}sjLxH0>{P_fAaJz2oFq8%^$z4Ap(5%YOyLQM_Hxjwh8{Q^pk!+=(6?l z6>+RXa-O)>BYzy#BU>XZ4@qt2-;B95wx7v0I98to;T+%hJjGGYh0_VAH6-Og!<7dR zR4eLkW#=<5^tpiT;uau6_ye`?UT7#-2MEM$cM1ttE%&TudAQ<*f3WtTgSBu-@(y4e zbj`%3$Nu4#+uL-0Ax}o`NcNR>_Ec5u-Oy(Ge z<0GxIALT`?i_gWgBzlX9jzIVb{HJkZP;?kbruT(A%F;@N72B#)hTfpf$2wtgeUPHD zGVV{()V2Ze5;HXcsPZP=&i!kNowg+ns26$geb9m2tV~u`Ib=>tH#}@H^7Fr&eyFL=hRh#J_SEl zP#Ox)9aeau%;y*YSzGR^&AV$u1~!$>w_4Ie@O97FT3a!J1A9$aQ+m7@iGKhB>Q}M` z>m$qX%TdOovW<4})RT43GlGO|)S;Ba1v=TMP$+tM>$@0dF~7`HoJp0{lAO*-n0(MN z{$@6~3`Rjh<#wUixgqvRRuMCdUgf2%O4J=Ga04>uDcR4rGMgd+sWY12CGd&-TLfs0 zoc7pVanwos@_r+pDQ}L}7BVNnawVP(wxW~(lUP%!}Gx$iYq{>loW6uFWs=d27@ zOV;)Tej<&u13;DvErZ_=K$D|<#ovKZl+V*`$F8^|et)u?X(+lh2>bJr^tSu#GHiy} zX|ue}_{E}YiXB1D)kO4@4iFwLKRz>^T)Om6G8 z)fN1e!r%nd5I4r`R~<7>e&jT=2eaAvktS~P(uctCXce<*E`d4?0ZNNSi&IVhZBGBR zr>;G3=D0i=U@mNXp1;c=v3cWkCNXi%bB?kV%Qp_wIae!5O}LfhHfisegZP1M@sK{- z-%9`C95IfwIJ|3+sM1z1P4Ii2uW6jwTvAJkRC`>+fBGlC6KNrDydvEtnohOcpt5?B z9Jwa9G<-3NNa-s%B|=hBCBhlW8{VUrDwBLfdD-_3Zn$?5=XP7)Di&B=Q zgm+=w@x+Qk$8?b_nQ5-us1($jH?U&`wW`Oge#`bpV119YxX+|-gWBd&!W59{gQAy~ z=Xpytw^bH_D#?r1jiV0)zh07)R=(Lj>ya+p+M=JY;6PY~LIK6Gwih?d(N*yNJ;}!; zLxYIBZg**bWHxT*b%q=`!Zvd#XG$=i1|fH4Z?*@n;SL=j;jY?{Cu4ypA4P^^vhn~* zs33+JxI8b(aL>E#B5&q%Wb>Te{x{wWj>6U8UWqAUP&?V#nup+spG*5e?ym>>p$c8_STMv#D5D6MhU+1G8 z>f7m@Qh-xJrh9OmgB3HMmq0j;nKTcGl22q5 za*LPebU2^Tt8tuefOP+Tx%6wI+nTG^biT(o5WZ+V(SISDv@pX8(w%B#ev@326~CQ0pA(6XMD8eClue0OHWDN_f&HZ9lSJZn`; zDm(w|d{mP{F1Gd;&iQ2#ht;&b!kIahct7{Z8ee?U<=21q%OXyVb@U@s)&v3`#vkcv zyc6wCm|~ZYdff46H%9{#?iRW1%p7Vln-0-WXKieS<+Lfjj9b>fE3ss5#4>vSaTLCwI+g&Nt_qsjRqb)Rzs@d77;C3`y? zyw3&U>CXW?s4g|D&o--WpW{r1W53hPY&G#^Ymbs9P#Ts2_qLw2uPULRmLI5&jHc-8 z;#47l)$0kPzWqj>)57uzXo<7SUqj^U=OwqvZJjR?EINiCyq|PbKT2!$)zLx5+&oSXY>G5qbv$ zuXnR&1a6}pp*5MsBAQ6-dTMc7a4LC;6!LbM!@p&|hK*d@nb2NL4rFBk+Em{W6rb&1 zf^FFl*Z?FcbQLUtPrUo@#Pg=ek|YmtMW4ed;P(cGtb=S(eTKRAHnmc58tQzQ-$K~G zh|Y>erTPiu2b$c1S2fBEso{$;tG)VMuWtLRL(B+|Dcvq2nrI{gb*7y!uol3=?Zw|^E?4&7WvbTWHfZ*~c}LwS3g0-b!(Y5rrhhOF zCS4NvaeQ2J=~&WQy18|Rh3lbOF?EVru?>)jW4Q*h(#K3!F;iUjkFi|i3zq~arQlaN zbEW3op(vy6zTLtYDq8$BT%A=sy+{Unlp7yeAIo~W^uv|?qczOMGlC05ycEXI!{Y%a zUpmr{>WpeNAHUqAIjwbd?f`@wa1TKzkbt~T!;wL2ilZa-nP+zh}rLuC^x4YK!_mSK0NlpK>vkt-@oMaRTyIr;0_P1*joojB=emEcVc`$p4LO-ZHc{G#xK}E2;7RTpZgGU;b>BrF`n7HOZFLkIdk{U+~E@zG27NIOaJPTMqp~(mdPI{nWS01 z5pf7JLBWdQyaa2FQQgS7mcy2H3chRNDWq_vBSpWY4|oikQ!6J$>8iX!9AT^?CvK}s(= zP~ChQ{7RIZyYKj{DL2XmI83w4d~ln``)yKYc5|cLI~Csyb!JGP{E>dx*!D1QzPx!z zlG_{f0p{dcqS_v_(7x&^cTR<@9=O;U*MP-$h18M=arTn#3fV?_*r}?SKRf5|<;+q- zXN03%Oo*1JSYEkL=T|7hD|)C-8t30JtB>U-iv0zhYI68r(?Pi~O@@5g2;t0}(L=W}K%TERZ1^?f$>c?qL?qZ6uh6wsel)cLJUALVc&|9L!N zf^@bz#r@w9-j&*HIAvJ;<;jSpCRY(ik87+sS@<}J9P7Q`)%G@R=qOIyeC9@aetf>> z%D78qC)deCUyPA%lTZ~Pwh!ONBJB-e#t}uiXWT(0*jacUu~CJouU}a}E|AWpG!hI$ zhzuL+WJY-bMJo+!K^!!MB3@DgD%=vQI?3zkJSM8S-X*N~dRqMLr^Acsn;@&BBZXpPR^7;w*q&X@uJUyZif8^5@jS0 z12djFjwCE-l3JLnpkQ|tf2(r%mEjP&8UnMUj9`60Z|9QWI_l@!;kcTTX*+I)z8`AD%tfJ%Y&Mthv2R;5k8H9 z;CvXQIU`x{$s{XV>!VR7G}M>9=gqNq)%S8FLcX2w!0-ahf!IS4j+gih#+hD;3%Pn# z28~MO8D;-%+r0dijrsSZH+JXi7`-520|&Mk*w_WEiRzZ0BP%Or=tJLoS3R4FnWlnw zjr^A_gLL9~KcvRJ?cbqty)iMAb-YvethAPA8xR6jJ?Ow@9a2hk=z-Qv`mAHBWp#Sa z4ndeYs5|eiFGx`Kgy!&3=QfZn682VADv_keBPfcN_$UYFm}g{?H+VtAB*}szv!*pk zC?!dS7ok=8f7pBTs3!0AU({c_tF?+af}%hj5M@eLhN?)mT11S9s7wivt%w+6ND(3d zL(X$wM5l|&>8bAR$^>o zMqXgc@S1)f%wRvQv}YI`FCEG^NjKl5{8Pm@c)_t4`)Ox2?5n#Fe><(`fab2@Mw{vq z-6~aE_07D&MX6ch5cZI)^+nLOCv&@db_wmd2SqQC%ai)ypa#3Gr67o$^1^IW*EL>k zW%9S9VDDY?aC0R*Wpe~@2Y}D=WWV$3vKBD*A3iQ}j+P3(3UoE^d%>U-=j)TqYnFSj zl!rFCeEn2zp3FCw*Pg98*0oOCJ8{c_5T&Na--s&TF0l4RCiABg}gwNr!Z>CZMyu%wYe+l zI>}cWi6We(N9=T)QZUtTqqN8%hWjoN0jxH&z!w&di)nUflSz5q2io=+v@xCQ9QsWc zWO9mfZ|r`;+?plohM0oKOB3NypQ{@x#!9Ie*f(M|M%ZtgS-!$ zFN7T1Hy6CHB}kGq)smO~+B59nvFpnD?;wx#;`jd}t`*;UZdYZUkrSJ2i7h7F%<5QD z$&;v4_g?PY)(qD5ZSF|ny&NrjHl?-Ek(M;DGo^Wv&Q3k)lYB9{Fok<)skJnbQRWQy-HaO3eD0lMc|-s+sB@3-2J*#8m0|;xUlV%!G$83 z)wZ|fZYe!Mb2vJ3sE)9z>Bx>~Y5+DQ*-rq!Q92jGjvlaA5R>goLVAExynaID|7|X=S)&y7FhQiE3kCFBA-Yi0RV8)CSp@X7|9JE@w>s zr&xNHO>{IkyJX=J(;$JNjLpyzVnv0Tlet3DT?fw%nqA#jddh}Unrh>w+0mCrmsr=* zU%{UU@79KZB~^~yV{!9hCa#;GN<6PH%2mc$1)7M)V2PX3uC@i^vsY(E8;`0gUqC!d ze8v0g zVGzf6GDI?#F!GEk2{oM%4d?orKm=s-=>foo_{MeQqh~=LhzKVkQwIJacF1jcrL)(Kz404jv8-7(E<2?K7XE`m|9{DAW zh^3tUt$)ddP*xFkzb~NA{jU{4oiq;DRZ;W&SIy2395--~7{+dCijJ`H>Tj{>!p7Bl zE>xmMQNU>tjAfh`K2ivoEf0CDgv?X%QlhG8s@!F8i;&(o0*R8^8_@>=5wM!~+0^^% zZ4&YO5sj^4m6FBS8a22sh-}$vW?H?GE<38mT3@W4ZDf4-6@w8}D&pPzCU0GL z=K}j%NU}gUHnl(av)L9ol1=WXKS%yU75Tiv9X}-4N}rm18r&IW8|~eg_Pn)SAD3_{ zc|U}$G_tyOzjfZ9N50*3%l8gS{hdI8sIFtae)?29mSr0=lT=SEzRu#^myg_APAjEV zQhObE0)=ez1ISUF59=yC`>_!HsCEC!#A1*!bloVUZc{y)@vLNcPH{}c=lR_Pjz9#Q z>3J?pyw2=Lm1cW>>bTTtM=_8hSC22pC*I$pEzc#yDRJN6snX@)7V~xUDpKFEHU4i& zUlSJA_`CIvFaSO>hn2l<`mwV?$PmkL94*%Dq^_xxi}FV!mEeFBQvu4l!Q~KC?}ZBV zZ=&qdHOQ^k@8iURUftJe(|*&k5T3Tj3uT;zm_d#+GcJ0T##MRuxb%G-KiG-@*+yBl z*vYpG=1Htot+~u|O0Xp^%cnYVF+D&x;SbN4{|J~mcwdn!XhT~S1}&|3%Y%jXlO=XG zcCs=`M^#LPZrUbT7Yj)HtGoH3PI#p?O}3^VJv!&pb%O(gx{{WmehHVH!SfqmK37tT zQucq=;oS*yoEx8ci7`6rmk&M24E%(5;J&x@k@(x3fiQ7?3ysjTd-h5);<4mipPR9k zR6Ji7w|A~(Iqq@yzeM*QXp7YUgnSI($EQ^&_fg-y>@MTcSCY3+HE!ZpcJ5?MW0De> zhD`j3E5td;I2d8LegDBVkUQ&hE7PJm2-`Qp@TWj{wZB(zF*$tjWS#tdP86ChnZ8<= zEN*`a`&$58iupMEe#E6N5~2cE*-qG;1Bx``4BOLQhwW?Vx-IPkH8#GP@r8`s$cQas zD9(Bh??>K^B&12eWR6Ks@LbtE>LG=V*)Z~wfY3&zS+Omfk)PwF)&##vlT$3hXaMTQ z<=0-cK`!74+2(X-1LDnHovV@-aCUZ$eRu*Mm;(r%`*l6yI?=*@mtFXOPXv7- zoYx*1K-h^UPcT4IHOYOrh4{=UxA;?zxnl1x&bXoCvcf0efCZC2tW*Od=P04wH|h}% z!Z#_K(IAkU6-3+Q5VZ$62A^Lv`Au2!0c#Xw>N4*>@^1Y5mN)_d;?L8y-m#nUI~Iz6 zu}8sk7|p0`lX`AP<7tx07<8bGQ}{F}4C--f*KUX+2}nFMUc7 zPKTirgYL)+7#L_OAt#RocJuMD^r(7eo0sP4v-1S{Mi>5e z-+haSKqGCSFIKqQ@H0w(ilQG8)OR^=81m=!J6gXiOxGHEgZli}k(5P&QdH|FqaY(b zWbY$mTQ-E%#I|dEmc4r(FXi=tH{oo(U@4@F+cI?DuocyCw1tuB(Nk01IdGlXji$Ao zm5w40f!(@!5~=-r-P?4WxdGAMywbqMI%VnJU|r>tIg1n*Uky*&e-qLF*NXKbUH26_ zb7V5MUvQ5^Ks8CKGe!dX2j9`!fT%h0TSf-1+)oB-Qz6&EpM;}z+U4=Ivc+lr@!P#W z%vb)N2^=D)WM{WwQrF4%r0w?S6t9vWCT&lNiuIH3->mf)4KJeM2yCu)P3>R#ITFTi>M zf!ubth9~lWbm0!hR0RO>CN9hz5c5ucp^5P9L}!8f?-LSc{8+uqH*jWOE^KvZZ}z?D z3M~=V@i1h%&Fm?mT#PJf8zO$C5-tVybM$}&`<{#2X;3OCm#agd-N$`(C z;jKFcK)-8ORS4Qa*y%}TqGZ8X5WC*4>n8Fq56x^{Le}z=_Y)f1)r0yC&P`77@Uf!l zmZ><_j6qVe9xMA`qv3+Jc1<79m z?Tv!Au^oBJZ`6)um?PB}>cy=Q6OzREYhB?t9%cE|^f=df0)*TOmPGhyKeMl|Hr{zL zu(5mKXrJd}_cHP=;(W>O-8%mzRz00V7EZHBdDoA)N%*F2&8>^9-smG!7qW^ug<5fj zE~G4ibWffnTR?1iue#Xmb(i$Cuq%q-(&tr|yo^`?|8_N36CXglcjKe_*Z|+?$IvaK z`G`LFJ{+g9R&dr6T=!PkC6=~G4W|aDRD6zgTMv?N>(UN83nCCy0+j3s(3||V;vT`J zeVAw|tEDlcmGIjbzkIl1Aw8geLP$T6x~ZnS{_x(Kbr8cF~ke>#%>Te#kyEd0xm{+ErVfiK7aGcYu>$CaX!eP7$v` z^BQeBH7AQEFKF{-o-0ktst3nid}s7o?@Rod+LeM}2vkPL^R;P(c`+AWs@du%^@9kg z9AG2^wf_5GXfd+2lRjE;m2(>`&yE@YVe%XLYR*;`wsSXc&S4Ec+ZP5)&EP_%@9Rc{ z@J$1WJ8`734wvt@2Ah()Lq z+U!!Ft#AdU!W_PxUq_Eu42B&b2TM1bS*Q5$wNo{R;*v4j2bV|STd6Po$VGEbmdBf1 zYTpc~SBxU1{lS<=9Z$sLs(!^qV;lJ02o5v`ba138t*?QDB2t=yHF6~)ljpPgtvs#W z^drS7z5W19iW&j=yyLR7RX%|*!Y`kD82w@L`V|I7#fKmX{jIw6Rn>g)6y1PBF%GnJtm}Z#0(<=J0?r?oRQj=%#q* zg>7gjM3hQe)PI{VF`(AYmTzxn1B<|jefg1!>wo8kd9Na1LK0A$ldXM7B7}@y0VGIL z$-zkCO&pKBBidY5MM@#*4e6nx+jmJoJxBU|qQ=Rw#tZJvjx3N>Llssp1!&8tt5rY3 zQlWnr@~iOy%gXMNCz*lQuvM<$a77Bl-kDx#FjvMZg6FDjD=*@=>*m@~Gf3IxbTO{0CbYVHi)Jg~uX)ayI`R zXTE_pv{5uFPhb}hd@>6xdWcj0S{5FXtj|)>^H+1cU-wgtnJD>U3L=Vb(%-Kte}$cI zu(P#7Shs;MHSq3kAFqDWg}lyj8Gh!U=D^MItk+~3i3AEdIV=bS{Zgl*lTiva( z%-Q6z`8|(>U>DCsWtOGYmGz4hJmo(;=Jdo4@5dx7;bKQO@9_8qvy55f)Pmy7qMxz(ItnIoZKF*WXV)(; zM?+tyc`k)6Kq*0vWyD2d{eOCKp}9+$n1W6zx&ZOXzQ_MREwnr4{ooOmheWU7>hEPM zv&6DLio6;y>6}Zk>wYL@&9=(fq`%_lHoLI2WSo8KDB#()ai?Ig! z1m)IJqW=&7LDcMb$EFp;f-$Gjq^p4_dBvjDzPyGz9seWH&;Q|PQhx}4Z^oM#CG|(U z%4ZU$`3*GRZr(AIH;981I^F0|G6Cw|qX(zS+(UJ$MY#yMp?6%A*;vGBziq5RO-B)o zmX%$Tx~KiF8>+$goSz*)FrhVHD~)%bqDPE%rFML>9x+cE+Xbvv(zVp~ozkw^E|cgV1^)7*L>ZBiTCm0`2& z&?lZts_;rlKfQV%_l?0JB|`xPEFM`c7z)!I(7n;K3+Tjzn$~vk$(Vxc+$^md{9F?S zge$}5pr9Y)KBxnaf~xqh6=AjV0)eKgj3#p4U!y#=M;*)hF=%x$vK65gE!1xFK8dKN z%y3IDb=I%Gm)b_yA()jB%)th*-_=}8nuWFMsQAaMG2Y`rSaLBF^Y65k3SAcA=9nzS z*S7py6(^tZSFB4P9i8(MUNbqq0p{vsvVs)Z!3Fr;n9TuckLumdskG9L&28E|N?hoW z*5wsGB_@wAr)4Pfkdqu?J9!<%yd>XIa#Zv@a*9t~f^P84tgQ>=wAtKxari6^^o7`U zxa9$sJYDVh3Uh2PruXWT-pJ20n9wlmn9-k^{qKd>4<|i$a6Ebhxp7r_!X`PDxr5xWZFhivM%I;X6 zw#)r=`z!m@cI#$_gw~XO#E<9U*zE&vUp{s&8OT%J8a?pn3UmhWZoxK`$v%VW>kUi3 za>fVF3x^(39pS_>(ptBXopn8bRv_cVhG!Ix!=m00w}n5WtmYKqZ;8!7@i@=2Zs#79 zzhS}R<`1(2ioIDSVL{$AX)}T)hE6~*j`jT30L-0>M=bD;WJmw38$_MRJ7|F&} z$3{hCuc^J~y;0Y6Vnpnz?m!RR=U|VVp3Ldu=wHCJ;vD92U1msjt zTBJiO^e1U)p-dINPeWtl9FKgF{V3gBb7#6ytRDh7abGPTds89@`1ovebu7e58C-v7dXwA{$`s&XDVuC^R z<2#!D*NTbRa~`qPw2?xp8Xu#oA{H?0YC7M zF3t8GH)(h>ei66}&b6S`uNPQ@v|!+de#PvoV{3hNsodY6Dcm%5#W4=EX}pfEQtJ-Q zmf=*xR_dli%-itqDqonM^6vloLmum8=)cI5yte{T+^nYHO+&p%@ z_OrcPxrsaGQSY{n>J;QQy*br0T?bV#}+*ar81+7t%hx6O3?TL!X-(o>m=JG)bKj=f{yl z2NbCt33*R-@FGk$_$z{)qgF<_wSLihDohpm;VcCGx_pVJTB~y9%h)8{Zl??HQ~VyO z&sM*qFVZI1cSZIP&9_;RsM#5`TYZgF+J{q0?qUB0AxV%5IS0Nz{CUzSR}n4UR{J(Y z;gT&M?eZ{|8DsyIBI|;g@mTO2Qsf$BQ5Kf-jjCqY06q5XTZPRLpA;ogmc{n8vM!eX zN2`*cc;cH zRN;tC%2}cK;$v-mdqFH|fN8`UiK_)}s3s+VwlF0VygPQtSCt*X)jWXDxU}`2+{}&@eruPOkFI?L? z7C3`5!JYM772|yjwpKd`14g~M*7;lZ`2yZi#HI>yF9}cpK=@&PRcTDFWNhS zSxo!g@8t+}4#FV;sq+1ejDDkjo>^UDe$V*}DSdrEuG$Fu&ivgsufoeRh?XyZTtG>cq~x=`d9-kqv9^wJ0B4hNF8ca%pPI5%`O<-{B>2Y z4ldD_zY#x$<41}l$9PvnjjI!XQe|Cu3ytqeNzpy3nW_jwt7zS0lG@H?FgGYhV=6JB zQ-Hli2O9oF@-&$6VN(CAi((n#bcgeV?qm61fL1^GqH-;4WDo{!+Oud#(r|q-P^hwP!O7OnS%=p&3 zM9!aotzZ#>(1D%rYKVSe_IWqg*(*}|PR6z4cT~n@{;{o!V63&DoosUOTgM02cq_7z4hzA*?B^W6Cq|O&i{HaP6IX9&iIW_)T)EJkJ$3m+)E`~|}U)>ubKw}+|#Kk=?M{C?;TACb|6rs6?5 zALEK(0$|VmjW%Q`zeN44PT^Y3e^KR>H$yNu{mPyvK`H_%5KoO~-{(Feir) zYuCUb=S@C`l-mZE9SFTI<)E`E* z2|t#Mo6G-=Tde)LTH-CvHkTAsG9j^#weYHX{)xtIC}l?FK0mnnWT}J}s%1@8gb5m8 zGVz9b8#b7I%19&tF$ zQ|+yOItxhR6wB$Aptf7rtu9s0tRtVWMKndA@>FcUYQ8$AK`^)jUQ8GJqgt>)8o5g> z?i~+uYJ}qmb)k!7aP-Ur=~nJ^-YmBq$iqV4t(4W$jwJDo91CIn#RBpzX_w?%9?@Fn zSUm{Ge@=w2qv7H;K6Ir$SMAL;qPe^n>9H8IwY zn+0-b%CGQer4K6hDp)_+)64^L@b*deJ2~&Ev)i-Ob;Kn=ux!{xeLasNEzYzaAQY*Z znyE&0SuG~_6&a7%YZ-HXIL7@}e6R(tQBN!7?3-6{bVj&Er-AKN0I`rvo2zSlSPGdw ztI`(#z=J47CXdwi@C=idjhk487+L{JTb1WZ8f_VE1MWDu$_YhLp;(1mvc*&Suv62_ z_LF-Ay8A+^gw^Tz`LHiz@rbLWV?sM?-GZzcYAc& zXFUvgfKfxF+e4y&gn${b)Wk^=glHgb#U8z<*%B zVf%13^+$wOo~qzcRmkwL{lR|nrgI{XcJ4#RqM^a{F6w)C5(JhiS=U5lEer|fF; zS4B&YA)Aj}8VK;EUh-(!uOnE+MouN9MpAudIwy(;9nnx`V(8V{`c1afKZr~8y}w^6+yoMDn@x?p*;({I31{-_Yfu^qJxj`XO9ank{b zHcw;=s~H_k0;Nw$JDBUyuI!k>-dR^*3J@QM8M|Dnh`~SgTpLTf%i-=;ygy>mkrCpM5Wm)E@Y(}xe_Roy z#YL8B?Z#SiOjJju1{l|asyhLl_3yaT{A|qY_8P4{gQH5pbX%(UML^;mSgP%x^66@$ zjV^)97%Tz2L+~c`OqK}=pN+nAGE|4 z#|J8w5Aeo_R;Q=zIN%@;7s8e@cxVxz&bjh)lb345E?<6Pt=Akc?r-DZ(TU1Swby8* z;1DGnb{VsIFu}~`>jGC}B_IfM`6l_ntdijLJcu+)^T#$SBGWhzY9rIH`K( zOEUeLixKm@FtK;Ku-k!q@bFbAfsBeV(BasJx|Re^3~W|CEG84r3Fi^(aZVK&S_pd3 zFRo@$FnZ*JELZ`(bH0|tp76cd8f_E%vjCj?uBDuv)5Gwh0s3$Q=5$xR=jI9zqnbjz zSF2LZanbK#{#sEBBHcT{1kTlj*NGQwoxn)qKxsd%aIlS|twtPr1%YX`iW7<~7}6z_2r*(Wdba4FtHhs!PCVaU=cxV6&%nfb%}kNg2n>Sk7h z#%qyDBi&bZ&$0r*csP0T6lDMTUtu(uzc5=VXH=Bqbo=GEQhrw%VygM{shr)9d0LPs z%!)9-3MQElpvxhAhBO=?V_I03na>;dGCcMo9ieV_0oI6t>wcsuZ@y>vUt)W@%2Vdt zmwo$ux26y0;2&O(LP%ifYtb9gI=$k0HOg&YQxB_1iZw$5I%Un!q}LYNFW5dYm_sH@ z5RUNpE(jVR4kl;8c{}d*hpqLSjB+Cj-N7<2kOtmKZKK*EU`_8YzdqZmx%IZAxi9sI z>E1=zftGUBO>C9l-|oyKs57Z0zt#yIso$u4|EY?QpL}toCXLTp*CsVU`+e+;vNkw@ z!u#9N#tLo;=VqGNZP#^3oNlA|qX;=zm#6DGZ%+6~#_m#$T|nfC*@4ba3oof*>Al6T0&aXL!49(43dN2pk8C1H)MQ zPYtydNI?^gzjkx%F?2e*yN_H3hh0srR-6EFF$b3q6KEpepULbYt&$lG#=VV@00K|^ zm)Wm_f^u!pgUrp1mw;kF62pIqzRNdhJzAtv;RMDrmT$}L2`F?GukuMJ#g)K`_y#J~Xvrfv-y1RRBg-gJ1;0Z3nCe{q>>jslzvgaR0 zo#VBm=^;gJ#G=U~_Fk^whfoOlYh1I^l99S{m_LCG}78 z%w|oN=u&f;zkKo8-5n-p0#!BM4ENv!>m7x;2VM@G?9*ks?%=nlyng(IDBbRr>+|T( z<)%eaE4l4OkeS@6Nrq|GS@xve&%?==YJ5*@vydPse~bCIc%-J8D4A?sZcPloR+Tx~ zbgR4HjqnAZk-hU5_fgay@@(PUclEAajo;U*DuxkTk8ef`k{nVoaJ~Guls6zG|4Ft5 zbs1bE{@k~3_QNw{*MUxR_0GzDP=zmjR3z<_AzwdsRLP~LYd!X-o7bf;)*Se|>kZ~6+V`JO zpI4X;)PPy+$*bbjfYubj1*}|K7+y4_a8y<`ddcgie54N1VZ1}SLQU- z-NB;#jLxE`?YpAhc)mHNaAg7}oFN67}0|BpExfDdehc((OzRTp^ z<(8AwFL|D8abA78$@2^>AQ#XNNM?J4yXY-wdUDh|?q1!quEH*k1*3ava2z=&0=p=* zNmS;!T=k*2#DAu@VC6YM6XrM}fl}PqX3NyODV6i3w_}A?IrPVu?jhIWVh1XQ+EA<-dFI1f$^&^E^J`x9{Ttc7Kfo-*!nk(WzLl4rHxKr;&*F$Z$Q^J#<8F$ zTT}@fVUc2y)jnsvvGr1qK$bNp?|vYSuh=q2?eQRWPgPz%F3Kw_8E+QN@3lxhscrI?2pb zmGTXyWJXr+QAoSGex37^JOT8(r#3`DiLfn52kIq$*mE`hJ~`YFXcN_ihDy&wTci}L zEQSMS5@_e%QpegcpmZlcc;5Ov=fYQGi)k=`U*iUG}x=JG)$T3)>#~S$^ADx z7gdYF4yIJH=BPGLgIRUQLR9Zt)>4d9U{UK$s#zNYUQtTE4}Mxbo1X^$gdMz$Y28X~ zVg0IMTQgCNS=?Sl%P-W^zXZIv`qUJw~H)l9U6Ro zEb@iP&%VA4h8H&-M>L+Xv)l8F>*kXK?t9V>%mm%XLO)iGP35Tt+f~7T_*6Y3#T2BM zwh`7Rdse>xbtG-TAK)&gc_vL(`296i2m5kduJ}%_EbQIV(HCY2g*chd@tH%5VA=La z7@n8zoeWt?*jnff{RHC~-tux*Nf7S5>Om_6A6mYyNrC%T0KE{T9r#OJ=zE`PVfwD= z#>ZB3qPNrs5#i1SQ+vTYftpS>|L`UFHeW983%l5>qQ1c{Ty!^Ij-p;_3ZO~QtH0%rA96S9{BK4H@p&9`>H-Ug+U1&AX0!-C;f^4R(A zYdrY~_h+I*%|}UN@%cVCa8F%@UPM+s-Ygg&8l&N)rRHXzXsb1(&^Wuh9F=iUN*h!5 zjrPtIoLSviYuQ17i*B$n9-bzT5(@_LKIqnXXG_zv8sl5F^A(sF0i>M?eUA@&nvnDV zFk2-o4^}KHYm#U@RzhryRJc2tN4qyUEskNaCxrZ#TPa?XEw*C$r3V z5p0@ZdVgs(z4`nO~FV9Z_6SetQ70dm{U|Z9Mkc=dYUI6vDLeFTQG%~pcrXoo9ZVghJYW_mJOe$b3 z$0a;e;%vk9-`6qZNCB99q=D)=)yc0bPqFtdyLU3jtYI#gA)4q0`}GWC?ZL8RpLv9L zUy{$G?P?rZp|?ppV&imoiczCb3c=EL1a0$@)=`C>8olk>-_p@U>s=$OKC<`D5Yos^ zipkn{rIt4rGCKmMYCh7qM8CJZEP|8ATasz`7^K~M1By-1rNR*W*9wVXQCXj(9=1#Y z)Gf?}KV4(k9Ou$@9-aV$YuH1JP!yr8580@^Bcu;Wh|SovO_Wvd#vAYTy3Qu~w_jH;~ zom=HFx0npLmw95)M$pJ_T}V*estNrjEzar0f%k2j^Nw%6?{2wVTu287^w;SU2x}BK zbCUqtU-)us=W9DlOTakC2YFK?o%DIt6K}(_MyB6-+QrnD~>MC6-0CzOl ztK@i(i~JN9hcKm z90K<)>NaT2#OMDW6KNq_L*rDouPVdyRQy*?T8WFdcwW2dyh1zpGta|Gw+T^&vS23J z74{%W!In@LZR$%W!^`dIKR}^cXs5ogb@J>XZRM2JBN18ZzU?g7P<5a^?=)_DS}*6O zIM{xMm>TCsX&w8TjeUK<)eayG+YqiPzed>TO!;16D4`&Ack}w&LJDaeWnL)g8{p*r zH@m4nr}mxNQW*eF|Hi5>6mBg?Ql|@zo8!W8;d{kgJ!fSA0!qAStR-Af+fWB=QBBCh zO`vVwTbTbT$ElL{v@+#YVjJ^y@rAw?Bi)ysE@m;Y;pq;4J{XoMD`$4BYJU40kqh3^8uX_x(H!RkoRr;Vif(Wni;F#Ea|$h{oTr24+fiQ@)YvzlU-3i7O8F@7t*Tg+tvtFO7Q#>(gr)M z(7h_68mYQ{LRF+E`U}L)9_;te8Ot1@_J``^d3SYJ@N9#%C_F0A_xa#zO~@lM#{Dht zfrP?(XH@&I0}vzYrVZ7@Qoey?=N!(NoPpd7O32aMM?&vYJXO0tn4VZ{La$7Ti5u$J zI)GB9T4DJw5m~UD)XlvvLls|99U>0>wPN#R=YT2^^OQNYEWCFCk_4==!wITrGYUu1ED}T zRhQtCgcM7K;1AYXP0SF8lZ=@;+r&IitI11U_pr53Q?!>V;EmDqP}edW>0@z;&m=E? zryPwQB{M`~?_`WW_%kh+AZ46eOaagH=T&z!2UaCJZ-A8H<+4YTt}c;RN!YDH-E5`O zz7&qY$_CEGH`MLa9`xWHohiiyj*1UhYuKK~3zRSD#WBC5HUov?thX{KLqYqahO_^z zGb}1MHru*%u020-00ldC=uvYBF&cA2&35T&5`p$zh1z0p+5SGXlA8rkj4_+}A6>rI zGMr6|$ztpFm zg@sc`TDximjn;EGsu?9zg((=oISy`i_APBU{rM)&_tXTY4?~2*E!blHWaQ=ZFX zm!>pMY=3g{#1uKpr}ps!_dQ0&8(it?CHlc9$S=t?FN|v&*>UA=c*BG%b9<6Um&H?J z$HDm6gluX1=YGPF?x_A#Z>Fcet?#f(_I}L&!rS}NO_PqMx;3(}+w4fY^r+FpCew(4 zRq1Bnkza`BS9MWPL$X7G>T~y{sMEPCH|>e3)(bKi72*>)R-G$rjIv|mLJPxYQx$&w z9y_8BQn!^>s__3z8R89?I-=};_%4S~JP%sOrF4I1TPs?VA^ws)MX9Ib59oF!$M51Wo%iLklcfT7w%7M^A8!VJLY@78~YvojBq-9!JUNRs+cV# zSpMtLK`W&7B5Pu@S&4iTt-cy_!)3RMKGb2Jw4nX`dDC}2wv?AqadtDWYvJ~M1ijuT zZols}))wbAtoh!Z-P0QGL7ZOd2VQDb1PX0P{pS$fN2IYu+$)EIJ2f-4eJM{(D!b4h z$9zTCw_Dxlc~dv26p1r-gu+^RYvMJg7Mtldv#0P(Dt76XTXm80jYZ=wjkWvq$E?;y zqX+m0R~h@m^=V@^uz>YnPNZv02_XjUjYURWo0}kK5j{jm2q9_yw8=6)H~-m(NAh)5 zq+*Q|24(w|Zgk*e#9H63q8ONmb27$spV!Hq5;u8@r%Bt7eYSmY<9p1wvbws_n@7XZ z7rori2~m0Drf2ZxhQwW6_3n^u6(}*>i%Pm8006u5YT6T;F@-8GGy5;K?;S2_-?VOU z)OAZWs}*Q@I<1ex;MAfWJ701got8S}xm6V_)hXWw1O^7QID+afrovtQloo@ShW;i8 zDe_^pbZqRCP~0lyjoDnZ;o5hf%&*sW?@DP;K8(CQvJDEGfRy3wlYNNTfBWLk=`Cgl zL@sa%u1y5(R@5{dyQxG}wUKB=ON`3a5gI2M#MJ%QbJoZMXa)-nmb(4eB;*D{ff|Zv z>#|cH9Xe;kBCD1gr_jX{}CwMVRm@#+c7P6ILLa)8bvo( zVLj81eeO})MSxUV>q%~ZAQ})I=u9$!2vouTnH+mZ`Ks_x600fJw)KvT;yy%M6NC<{ zt%gnGChj`ygxS?bz5kevK*r4o66R9=*^N0Plr0=xC6^^mf9w)e%W9g#56`Uv6&v%R zITmOAe2PRjm^9n1`!l&!eZ+e3pafglug%hWi}grPwRg4!00M@|>Exik3sua3YVANq z;ZkKQ9*%xkg4tJ4UyC?fyv&9apM4l0fA0RIuRsNSjuKqPPVDMaJ06AxTaQ>o zh_^)(BTbc@$Va^%%G2c^>F1d;8cuBppEnTya!_X!-yl$~&DkN;9OASUQzxE_&nF{m z0Iv(Y!aXIlC9%F77++>357)80#hl=3VF)ivhPJD$IR5N964@%OQ_0!&mH18<7Cj11`^mxXExkt|Ua-uqsG6Z+rAq`gz9u^+hzL zdhi;EdY3{iW1mV-6P*J;XnlsybT4$WC%XD#jy#Ib(>~g#DWQ!NK^+dLFMS^G>>dHl ztXoPeWadTFiMtbyo+kBa_u4w4Drt_Oi5iK?$*aykRg!)^AG&zjS(UH=uoe7(c^7f* z{c+t6=9xJH>02N!miameid5V)U_rLmqz2}(ZO%u{n4{x2CE7<2Wtatqe<1JL5)0|| z#Pw*(cgd|%?9T?}xqI2)M+JI%^3?>+yKc;GzeDbGS&hV`gcjmrihp|@MtHE*JCpNAi$0ThO zy8(8QU~mXHrqvtPrLHK!y0*yM5FY2wT#Oj^qJ`?fN^(-&q1_ThhpqJUonMP|gE4II z)4Vw=l8R9k2Ml@irBJ_b)}Z?82Yvo&sD^_ueME1jfiJe!$Nqcj z+kt9CFUzSdA3q}>MvEzkX!+>AC<5{|^DG0CmBm7^ob>rAPUe6K$&8QP&xfqX?Xb)q_aMU7DGEE^u&dIn&4?BPjHjOjov(juG zh(>)Uqj7AMQN~Chb;8-si<>_)}nA zV9INXE<#Ci=F?^X2DCYzi>X7F~_jJ5*)VQ zg(sc#kWe}H6SV98)Oq8I1D0`afFB;hd8)UuSBWTofIRsPDI*f_44v;ry4P)Bs+HeFuwo)QNfr&Xn zUo&hWEWJd9d7iUd3`91G>QSJX?X3>kfx*dYqsjnD77l2@a3oI@D|gE7ajcun9OUm^ z%uERU-voyI?ShIWU|@}dRBuq%7oe;dNohzXDWVLbBJVlx4z?XK>O&sfL6#E z(6b=KT8A?A%xaaR=SJ`hkFR$sBZvAtn6~aedAzf}Z>GlGMgWCJZ?4G&s}Ej#q>`k- zKAVhiykB@_-;{;IdB7X^D$!X8T}ochPt#)|@=OBekH&ARlE<2B39ve}y{h)+IWm!- z1amT=pjkguB;-Dt#G03D@a9c@gNa9c@7Sv!Qt+kN7Ch`uvUH{5#S0Khfz~N2(^2r= zNzQH~?=tH4!OzwCn)o^ z+;?TNB!aIKc7xbwPefLzg zjXPP(lL!k~y;NenT{!7m4VadJJ*-tFzas^{Y@kn@$0IjrkleuS*>14g_*B^vtV;#2 zjzXx}{Dr+41>fbY;^hQ71%$8Al^~@}oa~r@jPxRPQy8-TSV{{Tc!U;aWXHyhK)3(_dkpgMP)j*ek)XHTtgKf!CQ1>XVQJUNkuvJlY8PV02nrgk z@_fI}nR;AlU?1uO>mT5A8MaR+-W+7Xz*_5K0#WK>!R>(7d-dj*X$riLic@5Mx0<#- zN@iu9!e(y=CI;p@M-XGIy~%(Rc7$Ukn3L~gA8I2|R}YdsTd;=VH|ml0odHV^(7=PR z#=)TEJ=zz;A2Wd#W({!%1ubuFYPSRv&fKBYqnL&o=2Z2AC10n5@O%OStWOWS&`ldU zD9=u-x&1qN!rTx@=`;;WM$~m9rVAmNWHVM1_7s^CYYsisot&+6w)O7Ox#N;}Ugjn2 zM59nY3y7ipxsPY)-onkmEEIh8K8|%#$m=5-ep;l4ya%9(4X zT3gd6!!^3j`(d?9e1&oRjQ#f2wg#__Z=%$_tH;`AYrms30s(f>-uzpf6dQ9S+_FLtpEzbtL;M~k%#UfK`>-~Rj9IdiH^$CmAXrbOB);16{P`Nzm7 zWOR}Ke@8v8jP3|`mR-x5(98&CpmTzH5Viu;s9MVuTOQ{f=oexxVl6CIbARe%ex7*I z?m~ujh{?8JoXpf+=tkpu6Ia-T;u-1Vk0;|+BW#98#X9k~w!%wIrE@;^VQ z?tjy3o>qr`V;=f{(+5J$>;=DU2X}t&PhegK&ShG9!1ANd`s|-CpR4;L9ZXr1fB(No z0|uY<9tIcwSH8b)>T?(6Fd8pv%u0{$g@5rx{Jl8`b1cn$xsJ#9Q(UP5JYP$F2HbN56aNMXy@fkik2s&>2m>E9&FMh=z2U zZ2L`GLbZKhd^`$oE<`U=4=<@d{E|-??@Xhy@*dpzw%cKSRNhH!KB`uymh<>%L@ZzI z*eS4-24v!uON37}qtMK@kH*P*j^DC#v5F#QsBy5&N>HYs8@=;4k64I$ZubCZDi!Xi zLR~_TJMLEQFO0jx;eFe;7Z$h^yBbDY!c~Xx?OtW7BZ4QC?h@5WL^PQiByiX_YSDP1 zIf9UAnB8I8bvzON&V^TeUiG@3{tqs>f_GkuGOL>mbld*7vkPD#;epB`bk}E1jy-{>5 zNC{X8#h19uH8I`{*Faac#@7a$JAWYx-vn-*vJCmD%-DC+T?w?;Kb5;V-h*tMhw zZ(BRhBsay_|7Pz#NJRHxhT4haSg-co@hCmgSo4~O!4z+uG3XmvJCGfsJ;Hm;2bG3z z62pp!fffEuk-8D99Nb0z)X2i?XZGoxUkwa|B!)2=A3DJK*M03QU-mr=Y^TxVzu~-2 zf?7@;lVTZmtv75gOx4M9(q#`{uWkqEfNm;oHaZB=b5dSbz^MO87YJQ8tuOS>zs@=A zQ%F7`9hy&dK&U}RYd(zx``5dl$CDPefp~a0S zR;%GoLR=S7+>@f8AuHP5yr*5=_u>DfBt$uyb7iJ=vhsPi>IcTvzD`i0bsl681P(eM zky;XS*28u42m7<0ANI)57aAaspH z4S<*04FP9B!u+;pDHr;e)4)RPbJd^Yf}@nb{sYPEQ<;im#}8O!B4gbzn>6GC27Y76 zO`-AK=x{yp%_AX4uptXTkR3`COGe=Gqg?z)bLaRJQ1^~jI~}bbX6a(0p@_+rKVm$k z)S*8oT~Yoloy!U@{?Kmyv?yd@T0r$c`puAdY^2zLo4=>_fqc@lwmU3L(<9f>#th^G zPeXxR>;auYNY19?nsJ?Zl-13J8R%Fb^~dotI5q_9YtX2jCVhp$8ONH^Z>q9z!EX&q2)_CHcYcJw-UmCoS2KJ_C& z)k)Ljz-W;0SYY|--4eYnyy9|iG~sb#7YM$TgO3B#V2kxvO+`Sxr6Y}RcC_i^wT0*> z?aer+M9CSPHLs3d&s7*emZxueygUD>>@GVaK}6g>=+?E|xTA?eo4(NwJsdDXVYzz- zC$3YJ#eP(931#Ge$_^ygD%+p)YvzbyAj|Uxo{uj~*~uKbvtGu>cvm7u*d4xWW`x`8 zFtS9mb+^-g5&>^JY%!Vl6H%I&wi|hAIO?wRp)F*m;K_ury)1D>lLLD2*BtrLGS8jF zw@hCJ+u@rrN#xn?%KhBrbF8e>wJ@~7<`PyBVD`DyRw3<}wcVo}31KXX*Hz2kvCF2I zcOf=1rnG6#74T2Z6dW3d_9Cy4*}lZ-TkgCkJohlN%+2~qDVzh=*fMZVf{F^I>0=hK z%+RCyifv<^DaK*R%I)&G$um-w2h<~p?LY#-bhTcQjx?19U_U!uwzfEm$^f`Rx-E1T5e;ln{GpWi@w4&jzEoe#`^fqaiM?pd}v*@8(-DRfdlrTeXN zi~#x8mgaJ16LKHfrum$_MM_JxNx&@3Hx2J=peikX{7qeqssUcI?LnwAsk!?TtT&~G z{Hlh%)@?iP9ht}9 zGu}paL8YNXM|P8hBi`FXFl?4-_T?KoRQV%Os@7rX&uFENY=hr(DfJIzm!jbH!OF^| zbiKv%w}kG?Hyk`%taZlmDRB9AlhKva_SE}i=%J=eB>fYvHNr>ge$8WDgmuI4f`h2@JUjz2y~lDt;|c ze@(a+?yQK>+zyE>ex=TfQ4Z|wL(Qo=YoXs?=3VCz$#DxOVpRTTX849SgUqimWK=iV zYV^2F+4z&d#X6lc07H&9w;3_`TBDk1>7d*(ZFKHof&*XI;Vk(Dav569g~}^hlcjcL z70fTih41D96lm!+u~(nUy?93ReIIKRfh=s7)2iDnK@116!OgVo4nBHJr4wlp$EwQl zh+tgV&1AXg&lSP_6o^u@D$Czej55>?-xukpFg^v6BG0pX4>VNuAT^i!tymka0~aA| zpq_FNu+AQgWU0)Giw-OesSj^LB*buBsxO+gAIgr55cKqKtWFH_5*74O+(6R}ralA< zND8GM#~~8sv{kVsYw*Vk630*K&_!}>ipd!-ep<46lNPwZ9o$8qv^&x906Ft7pL@cpGgr;o*`E!T#n6!bP0*CEW^lU{b;NQ!^3v|3Yn~lw*5kZ7<##x8S_ozB z5*S^&e$?3@)-Qv{ z5_06jxdkDIhM)vvR8+UXALq*beIx=+%=_9rJHJ|x;&r#92DB*$7U1+OVO(*nV<>PW zWOR3367lrp`HT)Y%Y2_+2y1&8N2!uBHQP7af*(@%b$(0?LI58|uQ1H?iqK(^6y~ls z>}FZz9HFL`$9fB3ybtvGRn{v-n_t=`Ub52eR1WdR#6d=prX4(Z+9CW0%0AEOZogM! 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࿴(^R-G7ceGC58lzNRrW2I zRi!pBIaS8H&&p31hg}wTB+ir`gSSjjH#bA-x=b?-1+nH6o5!cb1C23bTyo?Xwj{)^ zx@+Qk`TzMM#u1R)eLS^DtDV*}?CUMiW;;emzkFLCr@l-z$ap*HA<`TpOX@FUBT0rp z(`*gX^+=248L4blqw+FPh3Z16!zyi(7Tx}T$b=Eb4(G$J(O)t00a9tIu&sV#oL;D@ z(^YzN%ztn(PpQ}UKm^W`ZXTQAJ=bxE@4c4R6|`Acy3hx`(Cw6~M4P%|D{3*l zYKp@j9s;a8xa}Wfu!`y%BVn#haF`?)B;*gsDnL!7OaiH{D->d|S(kYa+-~kwx*CV- zr~Ci0w*|GyFEooeB*<4`kM&kPj@eqpddAImJD&k2PT0=Nyk*X7Rd;QTy&8wM<5VX# z7^^D5r3~Y52n*nJA9Wd}4>-uliNpHSd|Fmn!bOPE^6uhXoNMnD-EC<8nFN1CAgSH) zvm%QB8HEY^L!kY0hXn^*{4TZ2P%#q%rOh!ZNrkOY_iT2@Om)3)g>8oE0^x|S&DA(B)dNX8=7W8s7W-F&QIF>5 zOB{T3jOq29i&YN>TmTwa9dthR285k3a;z2OcQwQh^sS$=zRI={-_LmXO6gzJ&jN@OXq-e$ejuUEFujh8aWKgNV-S`G`|Gp0OZrG(5ia zqndnDm0j!>mS10UYw@uATgDi8^%Pfw!KL&EonPiW=`CD4eKu05hc_NQ4QQT{|$Ot;XEyR#l!(oB^Q`*QUVA zRF_6N^d>+OH!3qgT~OoFq5DvuLa^6*ll%?O?)y)NyMmmG39(25rTJB2O@m%H+ZI*T z8fADpet`Sq2p4J{f*stG+JIFQXcw9UMa@!O*^`oFzs*8OqU_exgkQHZ@SeYSCl?Bh_#9fj4L7ztyAn_lk!!f zAHYOr$u`X(teG^jB!s36ATi7Tu%e2+*v|U6AG+8R zbjA0u=;tvLnUFMS$*Ym`BUE<*`-GUspQ-K2McxUZ<^sSP2oF|D7US$+n0&AJiXFw7 zgvyHhegGer^^Pzo)@FeJie8ckch>pT`;mGE6Nq`Hns6f9tvkP4^Q?+QSRfG&ir`E3 zO~Z2u%aj}%g;pc!e@te5EObRjrKMsZ-SF& zLyc6h>C^QrAMWVjtGxDz2;+_!!FZ{zS5oa=TS!7Sb~}Dqq6&7C*CcZV>q!Sk&hU6i zQ(bMQ1R1chNdd4D91o0YzDXh^E_o_8FbtmTd0Z5i38*ys>=Z%SRY4^_QPH|v4o*1y zy(;P2@V_8KW{iGukn&>e929;pp$Sl}9D4c6Ls|GF#AI*g34S8_3!($&wzQ&qw3>_b z)FEAf3sRHd%;?K4)AO9m?~O!Ne=;I#e)@Ud>}jVU7TgkWOus^Ggf@K(3_bsV$xBTR zgDp>#`veu5W8fUve^EONShtQ1l#bK#@%uKM^{N)!*VNrf-kEJr1>K8lvp+G@mS7+2 zAlPMc*=KvtC|yf&du|j_Ov3Ei+!VL*cd9)6i4Yu4ub-#(Q=vawwp)5TXMeEtA~}`IpumGol z`c}YA_^{r20ITwaw_%ez_C!3s)3FUVB>;12YCAX?X$MjXmEd&bZ!UPRn%CO5)x;wf zdgd>1L%=(D1B%OgAK5Y4CbuMl)%}#WOH!w4(JlT?`S^3A>*-sX@Xnb&5(J<7V4nx^txgicU8q*l|+dMF<^@r(JvXxe*Qfcd0FP3pt0oZsm5)cOo08ecYU_C>UH7u#Q9| zlA$=931c(Q9?WOgFzZ!m$9o+8Mo?=)@$ZFVc6$RWG7>B@<*>xNVGI?B0e*$V>S{Eb zzXkyFClnj9qYUBJ0am_Yj$NX~(n(+K#K*r^={p~!T0As%M&Cgk6hrYNq@VYsmq3hA zK=tr1a6xBqbl|vL2#cX4i!?hAMhBr%Jw;_>NQZW&vJ_-8zRu)qNP_(|n_x#X?Qz_w z_~x}gIljTZu3Bx7XLv7{r?wUK3&2>cjpQ6=99Kn`kkVWwR-4b&DKgXbV>sDS$PL{{ zuq07zZh;@`A^)_5>;K^>YBlmkJXRBt>n@Gkj2F%XL&7tQq5CX>7ZWQmME3E`Gq&MZ%M9!2_7&{8qN}AEVf*mb3;PE)v&oc68Z!ZlWw*kDoRL|Gr6u+CP z9uB!O^i2<@+LGQ`O0~#ujxB7}K8ZxHxQoOPh?}m@T?8VeS|W(&6{JdV`dA4&%1seB zQ(QFh!@z5`d-eIZaQ>GCTD;q(eMDPJ#VDG`?~^shBQHsyb>G>NTwHYto8kte%?zq9 zuTPe>`j+EfCEMP;s@H~fWwbFO4-{!73*Se(Ru;#^o1nK(6Ok#uk(BwyYR1GNqB29_ zwxb*i{K|4DxY2_m1{Lb>OrxvK_BeMz9c`1+w z^5gj)dK_?D1@QI+p2x9gRl)2&Rm$sm?e1n@yWvlQPY3*6VB`!>N(60rjw=$lBV;ai zo8#JOg_nm&+G#sYc0=CP*3|KI%Jx(uMmv24E;?>D?OshjA|rCVE&1S!BQ`7+G1%nt zRrvB@K*r>FiqO`M_L9NPFIH-9^WAiX_uD6?X#_YL#E>|;AT%Gl9EtlJZkLG)$DHk= zg{|CkRqDqM-9J2qiRgVn{ao(6MHBlZBAM{G#G<{ezAD4~>vCDR4P(PZCteIaC*sQQ z@Oe&UPgQK?zwQ8YCwN>icaZ(VG7pM5P>bFibjuxHzN#%4(>aw#eg9OMV;Nr}uaIw2 zn+$5I)7-vBdQ;Ftuk;`4TECFax^d*J+?~~4*=KKuqxQV5jU^d=u&*KOs?jU*|DXF&ySc(eb z!B#hNRJjB0ReZJC8@f2tmqyST#9}g16%5I=pb3kqG{wkMWzH93XvHunpW#O}{k_W2 zG5C@s41e?yrpAV0hpE8J9z+vDbya+U_bBG#PYat%e%6>laNJgn8!?xpAU14Mj6IGD zi;eo3UPP0r!EibX@{ae4)I{g){e6_XR(sl96D<-hRClqV#ovyk>2#Kv?VKHo!lcE0 zT--Xh{C+%4@=eUr5Yv-E<<0svggTh#fWgCIbt7DcDUFSpwEYS|KT~q6drZ@CU5joy z2ktCb`t1Fe0)A`nHLQID-Oe?scaUvZWtbhx!TmU5wuHAG)>OjE7u1*J9H>#8%q$DZ z%DiVA7TnAbcMT2TK^8#etV}}GrWIX!qWag6oK4;Ir`ML*+_l+s3oOJSc?&5lWFz`B zqJewsgZ{#ayzVOAg^9?ZfdFqF_hs3FgWerFaX6tuvqgIoR1jMq!Y=s2UGddS z+mheBDYrUlsm2smIc^Xx2w@g;f)_%CY^9t#rTt#`x1yiCD5^aw{cteWY8p04e#LtvkvmI;0A%IKQ zRr;mOE>p3Ah1$^Z;qXWK7(;rLXbEzmkMq0d!NwPJ@`e-!kjUz;Ytx%w5H>qTf0*9u z&3(9p*K)UhR#DXlrXTI$TukBYxa%jsiQU zORq(a00U5RbQ5L2Ahrap+BZJ!l}kE7ib3v-gt$ZVMHaKZ%A-{!Zr;d2$Dv_Qx;=bc zSgCznG5{y+rR*i|+B_A#G3Laa%yYsnf(T(}pad4955XdaAPBrjd!gjQ+-u8~;8UQ{ z%cGKNM8TN>@~9W>{-^Jgv$|dgWi8_f0_kH&BF7V_vd|ZZ%l+NtCL0YkRhh`JW$z8z_b&V3q>rIJg2glu8AD3|yV*Kz#v*+~bL^FoWP(f9F?HK^&iY|D zOM+LJKJ4eijg(&9U5|lI2=}Wvq-wjJmD(GF1dArxCX!z&-3k>b;<^ z6@S28d-BOUuA0=pdu7>khwmKSx%{G8bN+*6`v^CrgrHhZ(uQ4{%-k57Rm!Vx&&bwW z5e%Mlf!jV*;^~o{QU?JDV3J-EBGj97lhvHxF2p1vM@u7P2T|V0fLz1NjOT`oreNK@ zuyq;YbGil-*t6ok%%$SAg;ckaL7AA`B1lsB4ZsTv8)n1!Yk-;3CZ`FDZ(*4U&9SQZ zy-Khlrv2k26=Wa5kigkw(MZ2go;h;yk8;??p`zQwHqrT8ef&r@a*;-#q%7&$Q}qrF zRaLyn_dVfe+FoHX(+w`pAFHZ6ecJ9lebfALG4+$bJWtMP*876~97{9jBq7fMlG1wf zmqa(JK$X@W8EjUgwROHEjtIIbkbCtn44!WUG3pJ&nDFGQj?bfhma1kh%;_Ww>1I`~ zi)^3RJ5WR2rS~5$Yn{aW-q54@Lo3z{!_D(%7FGXQFEk(J=$3WZEsFV22XacG-D1$X_&H|e?hxaO;8 zHFwV;HdOODCN$%qxg7^11!E4jiyLTv?%lMlvAsuypnK;0{7zmqxN*^E|p#k)dTuS@W z^t}AJ(YYz=UWLinw=|O?WJtOBOXU{8eKNpJDTMO>ctgtu@p0O zPMg*8I?Ta8gkK9+HVXHdV9S}sqL2DK#;+7Gl5QCx+8*VoPH47B)|F##*7rOrQ0I?QxkJ+ZwFwT9B3?MNW8Wp zkuRNXGBHi_&RX&mE+(IxQO>@}kjZA-Gw`pt-I{uHwB3Gw5u8Hafhp-_6g(F7bU5VO ziFp?=@Bs1zRs(*X6ihPy?box!Kcd8rwWGC}OWiXQ*L_{*`8k^x*=rkCd+Xgd?-!qm0tg66|}r zE-}z!r68y!{`umY2C)1*dR&xtZgGKEw^%(W9*TwpZ=axpvc116Z>H%JX>X^yTg^qe zROpUIn}EV=0vVPsSv7RhyR`OQ*^~){F9=HBAm4|*9(6Bz{FQ{J=Y>*W-eIUeSE*is z$klf%Kx(b)&FyQfgB%DBc3!-&kbcosu;zNdr#&JRuH>*$gzy^zUA&icf`dCQr-0Xo zsNH_*&zJSR*z3zA_vGRk9jPkgg`oJ zDH3)FBdp%!T%!Jpa5DHt)ShjT#yMYd&@KFLCni1b23mS$xZ7{IP_8TDm0Qe==;tfO z5>Jix3GC)@U}4qgLTS7r4BsHhI(muYsT5~{2ku6k_*}w4*{#v|1T0oudAagsWVVxh zLBi>1$e7gAb&G<1D;fHMzFEQrCGrH>Fr_4tJZMJh`_Oq6JCLhetsnU34>K{Rswy%` zw0$f1SE)!I;M(BZA0#fu9dFIq|9k&e=pTu0oLPB1$GX-J8V^*N^LD+Ugo5*{RUZ{c zMC>Mq80K@dzDu)b@P8XS?c3VsOd2^l*2fw; zt?nWuOv3fS*RaOR<6B~I_bi{#EIp;cjTs~=0ow_CJKQ0bsNFixH%FH@?6FXmPF+N~*SMZ~=lU;#^qD=gONYYUEy};VIko=!%wXz`+y(>wB!t z^u!CU(W8k~shhQTbS1b6$B{?WcLa^gvJGyn=ag>hY6_ZZ5Zvl3OM?z7&3NU^zt3CI zPVX=T&6li06gk*8ab^?4%{dmyYj`;N^8n;LEyEuCeaH{5DYu=yEWHZ!G0SwS$y(9O z5Oi&t=!AZIDuof9hjs&AW{KU7mV!55a&hHn9hUz(OmQ87i#$2B7bl4V)lt~SYY%fa zN#FKbhmY3OWf8zAEH?ng#{Jw91a^aQ{(e1-CP(kyOR1od2c1aJ6;Q}FAnT_Vuc1d1 zJL=-+ZcME>ctuwL(yUhH_;f9udxx>{^nu8MYAxON7)xLU-`=0zeet>`+*M^+l+)wI zSJOm#`b1p8QGmfgFZj;rLiM2TNKZ(D9Ha2CX*7(-Pf(Mj*LCipYL7?P>G*EmlJoHD zOi&w-)K^%{~k2dnXS*J_G+ zVJ3&s>0Q{NW`idjfa>EHDEWf{!(oTqLkiwSxPj9@aYgtZc|yZ`_X18wuQe~ohh~O6 z&S0Ia7jjm_E7Kg|p)yv)80K%S`P0zP0HQ1wMf(p0ztLuY%gjrdSi~w;kr0@{3)M!g zNm%s2@8R?^hE-kg;@DpwxWWN3{@A-e17^97nf~+eSOnOSn=;5&9bhWw@jZ*gLuRqX zEPSeBblz&=bt_HVP75*It3rpb#e{Q%ZJzu6Lo(iq)y4F8qZU02SCsa{Kifv0V$f|5 zz`Y6xV1@y2T{J&qz(A!#r4eX$G8Mo9`g4QaIKiqi4t+3KR(3Ysj5fz_Q}0Qgv04ScoY zhLja}O8{Gc;o!v1x-nYZIKX;!#n4eDA|>UcYr~#Zi$W_K$BxBO{hWOu1YxD+epfy@ z-~UI79P<=LdyU5`{-3*d?1$wDEc+9|X(+K3MJBW3J|@4w+(OM~f_AFL z`Ok6|Uy-N0+oCVU(HQ-DI{W~^Yr>D*U6JBM?xqhrZL(06n|0eVgtGSz>{MO5&7Xh7KbKbR{;-DCc z&<;5NijUZ_7c_PN1OCU(;I8hds2cgrbo;s4-{iz^OdeTRwrhVM6FePG8a5%15$1Nr zj-EOx8F^Ug)>VZm^**t?cHMGj&9TxQ z%T_6$4ZTuKpX(f--lCW`?L>32^71PXn^(CChT9(JV=&?|0uGSNwp8loK**;T9Gw3j zf;OMpX1grG*18r<)hIl{FOzN1P-1!ve*;=w=LuwaRcWZB=-uH&cQf2f9 z2))=Za;$prBmYoNq>ujjzUb}4cKhcKHW>Oh{%SgG&?V*KAWi;A*KK??yR?|)qdcR| zu}C?cJVtQZCZ^TYr-E#uu^pbNApdl-?G*dV?r`g6vWA$M+&~@M6=zJS9HPWv<(KPH z1CT!VasS*|!ZCapmDx7RZT0-uj2}_l_G8qD-cNS?cqx@^B!^F>6{BBUqPEel&y_m| zm%0~BuU)T?rG{breF&1Vpx#dKqLGYVw9YQACpakhzU~O7E3U*$DqkliHz(| z^j5Y$jzSi9LV>ErLfF|_$wBS;u!HGGl2z+|cz@5(MfG>TV&YOx~ZzFD}prM;x{@oNn-lA?~!Qd@a?qdg?pu1(V65-cUo_#l&SVy`e8 zjnz(Vy01(eh6hd0_&Xt-D4Vk3tB^Y)p5ljx)q`hob+l6Drn63&+w)zIyEDFoN$${o zR0&g52l8@t;A>|1QmfP5dl7L3nkx5{bBpt%2BH>>kqnt6h=d4BO>C=`^y}R9X^#y} zn|EA##srCEdNNb|vF^~D;jIeS5&V{^Bg|VZ^5k57_Q+D%|0Jk$;(9?a(88kL7=6JU zdy0In`&+?kEz!DGtV|!GAXB*Oz&!ik;V;-M(nLiRUCWHCsm;5l)Wl3&DBoLO&shob zA+H)Y9m8QX^izF}N9f8@@BV5}(%FOnT;H!#FrfiRB=`#Gt~+IiSw})`IRGowcr>qt z=NDdV9hb+6u)o1_;6ro-IxV_Yt2yv!A{BsCbz6pb%FI8@!1Ats;9;^RfBz3AHZ1y8qgz$zh7s=O z0l%31x}FWX4#79D^*B_P&xbz*-*W~gG#ZTklHm6=Bys= zJ%M)8u<-53)a~WsC!&v3Cu)kfakn~KA!C8xAGjlyM@qERZ0u}Lj``wzNHQ$9B{bj$ zcW5GW>V0T=At+R%-qmlX3i)9G7Vg!w;SW0@EL9z@ivHeX&Jpqt zikR{4eS*lD4gB+GGh8l3sufpiAddH9jt_US%XxAt&^0#ld&V4|8BN&6yfVDL@x&+L z&ie}9={8Hj}E$+>b}2Hg;qUJKDFjH)g@-zL0Zuc@~Rp`Ec!mvI59Mj$?iX0 z>F*I6sUOa^<7_#_G`o^|iq#J7=7QTf!oF_Tm<=o6edW5%=Lav>Z6Eyq|M)P>w*~xd zVr}6E=dVUR!*J(td{#c;dpE@KAOAy09^oSb|@q%G~UnyB`Tw?G^9E#%S+(*Xm#sY$}Ko7vCcN5 zT^mTuNTE3 zJIGz7lDlv63c);aQs$JD&C{3NTB+&($LfRr7pR>++u2gUjPk$LZ0v-;%Q!A6wmma; zHu;~hv&+egT?H{nsUZ3J??HV0NX~>2v~jrcZ||mKbmm(<&C)>Yf>EqSfM4!l2{UI5 z4J_k}$2zc8alpNxVu3K<)HbG1(S6%4IU*%SyEXVq?(_%`iCj zGsrNtG|aSvPLu~xOibVQL!&-_${`gQJP?us{GWDNb3GWD;y(Utx;UExd(|@=x?l2+ zyv4^UfP$%-G0lj_rxz$X^|gEt8&R$;2evS?L$b5!dY)N)(X^kepY!iQ5P;DlO_OsA zX3P%Cmg7#hd84nJ60B%=Eq2AP0=xtrkMjz$^4p8ZM7QnL4rvzw5MvD#;@1H0sAlZ( zo>+Xg@J}hj#!T9bql0>WQm-$wtEwHHDlxpntxNl&@HD>WZb<@Ue1m9LiW1Q!&atEShHP1RcY{fJC@1yUQ zFd4D^DQGvhs{g*oY#L|Y?|i7>n-Y!1%2{b-Y2f7@OA+~l@DsaE{coBcSDvD;D3M=y zJ?K(2y#=a&iB;YI5#frP1i$NcYTd%v>r|gSQm%|`O8h`tZWEk*;_}nU&P2~d%%XP6 z1mypx6L~)ey~u4P+NP<0N$J32G`BoukfY={to)B>DG>^$E$=Q1rK2#T(r56mK_R3g zm5@DQc`JNmGA^Zhi6t09xQ>5)u(y8@F~x@_S)Qy&Y!w?}Ba>W4)TKpndDLRMuInIq zX`=syU(Fil4r((Klm0&Qmx=%&Ld)~O9|GALi>2*+{{i;w`yzjyPkSF@LpIiz(^;|D z_$S;Zd~L3LQ;viVhdCZ1#R=vPMW^aZ^}e3`C!<|=OeYe}=lX^w(o`RwP91Yyid?;% z;9-DlkNI|8>tTkE{b4#TTuHDZwzPF~oSR=`<&1r_65IF#gE^6DhkFoY|Iha_;{-fzef$DeJ`?l@x} zZF>$k3Nx>J1+#qiuk2Qgu&<_Ygo$ouoyoB=@$G)UP)#AuwJK~Lr*uxpgFp&raJGhm zR(6H$zkpkbKa#Qcm9rK@l4;QnIjoYABIhav$JVbis6D=J*R{R8n#!dvHW z#t7?}eu|yWgi-D$=9P;`iBm!D_F8CFARD76Dzx9SOkehFju_K_rhM%&-fWRRLH@2M z2Fd^QP=MdFZd0DminE`Epm<7-jTZ=QPBZzD+T#?<`rrQpCtEVk9c3(T;%S35-}?31 zG}??1HqQ_t2$P(~*zYInf#=D9ABAC`7<%BaA~BlabM>MO=@Z3AwFxlm+;s+bvDR;R zsbhiwsu~FpjKN=0+Wx$%!)J>4=-oLA&1IAV2fRy zA!Uv?)+2NGMyXTSt9R$|Rg@mNL|b|xPm5g}hIVGk(E~yQ!edu{!tD)XWAp{i zTVwebHTUHdd2dbsP0@~S02`Ec=x523kXP1M-}P+cQFe#uxC+EM*pFqUZ`{xFx8JQY zQBzWn0XOd;FvhV&P1Xp~l1TrX?lL5+W+QVKBu(rhuW?ooKsPr183k9oGqJoy-Yiu;Icr}=pJj1sT2I5e}yX~uu@dg%4*DWa-A zfn42YlC`}H?5{(}ATiBX`671=85n*d-Xbz%o_!(p=%($hRoOhQ7Yy)`Ze(m`1<{uX z8+TgX5)R*z5!1Vxv-hef z#`~#|mM&ZE)3t?`U8OePPE1IB7Ddgr6}v_BbO!9m;;5h)Aoq$eDl}g&9-~3ay;dDR zFh56&gs`Z7G)7+la0s-dVX$e_V2jzlO#COB!DnV0mu&XdD)o17jc&-Imc9ce9k>|5 zqI8bwufC$f+_5VS^k~IwFGGzrS9U$xD^$6y!4W@W4YI@cwBXse+`+lx^9Oa%`%GY@ zY!4iS)F_z8W}U6;;aAV$;ALSK2aEQrsUYiq-GMiA{(n@4toFnn$Iq%L(q) zc+IIs$P%1!QYXT6I>KPEDjH9yqwXuXHygu=*SVKbbG}jnvkreJ21&Hn01XA3JuwaC zGbol|$IbDbOl6(PdWw81G8-T>k0MXM$s2Mte_h#WGC;2$2Cm_Zb&x*{y&)vXY`cnk z&kotH860bC-MDq+Meb-*47N(bYjqsp^;q*SLpahZAmQLZR=o>AXh*=kc=DY5p7{vOsLL>2w>-Hgsf%DOb>0g*YWn!E}5E~6TWK0E4H zIlAIeQ3K2yTJ1dKW}r#s1i-#5;Eu26n227o&E9cve%Z#wCRsL+O|k&^!6j;+=(DbM zPX~>*C}yM*!L+eINBn9yEMsuCrYD-*kUE*O7qo7b@N1{H>0Dv71E?XLjS9x0&f6iV z$VvDjF(P8DloW`cm5G~#OOWy~4&TeWjuZchrC-%&-zR*gk$NkUA9cYY##xR@@AcGk z+U*5Rm&VyKz*_MjhXqw8H<$+sUxLcfk`P2P1 z+|Ug40IQU=Yge)18v!~>{>gT~5b?*FH18C3b1#;KFAXCix8bfW>N4gS%x;jP3lNC4 zG|bQTHW&b5@g}Bzn>HpQ>ZmN}egOwoD3H)UW}Xeik75UrkxK)b(3UmpO48JtT?O*z zS*#T(1{{dms^&Gec%)&$n0cI3SJjXypSSVr!B%?2sjrnAmXUZ_RK`;<`lnqU|K|+tPVSp|?Ad*hBk9$OEi-65Po*ok}hVIm->(p_{JgnL* zTP?008kWQRMoTK}NwHMCg~Z#SK)$m07W$8{D`2w%$SVcE6mi4c%UCCr@psr5O1-R3 z?H>GFO{xq9)>Q=fo&ow&E*xM+wPadn9J07qDxY}}M3$fr_A9RV4KGU|39OCi-?|~I z>!&s3HeWolzfU}RDI&z0sOG}yw%Z%-w@XMY6kwm(!w?zHp3kaJ@eY1rl`+k z4RESpwOf>l?j~PmGJbRGSL~BQLeE11V;5G~3XdYl1hA;Qjm$;2sMg)XIwM7z{8m$X z7KH}6Es+$4_~10wfIe6R6a~5qp|~qk$+clbT)xS|zQhjw>!8pqY!>-bmQVlQm*|0J z3tn(&?o3Q_ZiF60j)tBmG^8^?Pm)2`VXyfGA|pA36WqJYoe?CZ=dwDh)FsxMQ_rfY zza2!E1KkB?PF=+JP`=%XSI!bCxGhaDBTrb)Ay@1Bu;U3N^1*&spn@f>d?_xpS=E+1 z1l?`*bulGT5)XRQet5A0kkEh8wJaL_3>F+kgH7eKQB={SL^T1 zIRWC5aF3I7AhXS1m3)iBpThYr=uSl%+}zOgndm=J&N|i9qjM_^3)-J{p+WX`QE*9% ztd(X_3=dGkfiN2*kKS_oPLf|=BPn!r=k;8zvp585>MS^yA(h@Wi2rNSx+h!=&g`!b z=&+Y2+R!gIRcU>^5FQXChU*hZVSRo@|9aPRDvQ)>x98ixK4|uLin=S@b@Y0fEnCW9 zT+#}TpxKWz$O_lMrkZL={mw4@8E{QaDAj4SsPSg39LR0j;nfhB zZ$=B>y+pryrpAS6I+g6UC!tT|x(ceoy1I{Hgq`!2jK|$wgGv>5S#Y9fISCnwPn=_0 zFzN0u?+pDSZu+gRVKGls1HeBM4*7BBWW3G>oD(Ev)AO24MOtZG<|IVx)Lqt3>XrrB zLd@+IhbVdNVD%8DMIOneq;&`r$nSTE`yi{d?hq5N$o~CI;M9dTYz!+{`N^Y_>3UIZ za8WCdnfX+$K%1K}O$NW-1s=>xp#nQbJ*hjX@x77DJl|@Dlj&$h^4HU57e%{kl>Ltw z!9ZCHfV{Kl?@C9S96eONyyyP);oPXl(-=xZKls!P$9Pl!eQdC*1p<8N>P`70bEKBd z?M1Hn6mNaW*U)v57_@iozE{(W@_(yPjdMUfJ+_DX1ivms<#>z7(Ym=yvCBrk4SD=; z{0ooeT)Ho^B`oNua$VwHDQl18U5mN~?U`EdX>oXh94~|(oPK-Y-2>^1{1&l|B(ntCPJp3kx)!Y7>W{zGRt&mOh6C zPabi->hw{)QG$J)?nBkOmdx6guj$U4^Do5ZVK=!__H!29p_Z(21-14{rK?Bq7)-M4 zjw2g2Goz2CVKT1D-VrtDoKI+j%nxme>T7Eq)~xjLbkNt*>ODpzbTI8~L!S*}eI9rK z!#FG8h=9yk!p|U+w^U~elhb}3YJS`rVgA}+tH*dtOboZyLkPbNA7j=g-@)C&-p?Ey z3vHo)&NOjXMjm2@exq9VhzF@+(NSyvy#ZGb=)U?_PX$4ouClDYM(`%v<7_qhGUK=y z==cl0zSyTJchz#FIooNFRI|vSJ`^)R^$hkS=V8DGg8ba~y;&(=le6&DDfzzbC%Jnb zrjE`Z<;_5mTV8J`o*YRJ6G=3oZN&MMh;=EAN4CXq?%DB=YhC8HQWYkgjy`L!KrQse zEF`dQj38SGd8BKm!}o3M#g4ObLGt(_Ul2bJhd>nkyo743eG+$vGd_>1_)K-C&{sOo zz|6*NAS9v|Uai_!dCBgqlIb}XVdUXLq{oOBtLZ27mGQK$z21oz#w*g$M}{$UZH2!3 zR%!7Y@)y-w^2fSO+B4wF%8F7QAqvqKprXn@S62rY2sk5PllNkoD)9-{=8R1 zU9@i}U}z%qrj*Ze^w>{i!fw~^kK zW7N&ihpn7!=w+Omr!; zA`EFBjbOhX5NMJoM?;hCsSC!h-l01azv*^vGBLQHeS@Jof<)y~=&V@DoNuU*wxDgw z<^H?QA7X#XZRllphHSbexF((=;(-M8-v_XeFY@$rp31?I?Ak$LC+V5uaBsPeus`T( zX-Oax0cYkEKg55fp!%A2-}lnynD7*(0KSgfbT`#RTI@FN;7ze=?*I62eJy7Vb0m`% z6tCeaUwCABM*I=eA3rCcUG4*co8nbFu)Lx8F+{M(GTvyd@SlNVgoFgkJ+;NSVTN@@ zpa%vh#N|g|>hnW2KXhze(z1=q6Yv>wrik}ayJqD<#Sye|_u`0PoZ_~^I8%zO z@0PwN+!9(eBrgRc9n#tUc!LYxSj7Z4a+m+hW zGI3S4{&F)cL2Xp}gudXyDAXvGGC^zhR-zQ4AR2$Ojj}oCBWmn>O60Y-Hh#Mzo! zvT6w|)KCQb>-FVbf1q1?*gN0dAO(c^-Tcqgp^L8(2yc1F7t7#NVmHberKT_Y_C40n zMvZQX>{3R>I&+K>%Z-BMO{v<8!eR=n!>i>l=M}ZM%V6f~bF~Ai+T= z34rMpP4Fm){41o-Z_s?$EGM)OKA9%Jg1*_~R^ucd)NWf7xp0$(rBW{7qi@@$Ii+>) z@E_?eJ$}diU~kWL)-iqU_RgWsM&gT#jh)Z^53P#dbtACh_xV4jX2x~hbGEWi8O&8a z?*Tx@WntoqpR5~^!uZOSe00j68>~Y4;H3w1nDRN!|B+2E@ph0u$gM=YTTjq0e^(aV zQ(HYMsD^o0&3w6G{0hEoxCLF@CJd#~hq#uM;g1(sWYr2u`8ES*ob@!S_WO&iCGJJ8 zyZym5Tmz^je%y(|Yi9OJ%o8iYrxg4r>;n|jq^^O-QgBs#)F9N_S7#UqzZo+qu`TF4 zbtKNxO@-bI4jvsmaj<6)zW4;2Py)w$QPc)3Sbf zSLZ*cjWdgT!fDkF562I$dPT#OEL{tgh7DEl>1?udsIaK(K3sUKp{1)907P_$5W9U! z=1;y3kxo$Pc|dZWel0`vNT`gYTFDp8hfzj<-Tou<>0FpG?cgYdD4WqA? zFElbj)F&)Q(&uv{crGJd!dBbjVhCY|yH5!DUo3|-bjwB~LRzcCIZdqgc&FB!|JMhG zZF~F|-;Njc4Q3=2{Q}1g?ohXvt+HMrBVTogBupHLY#>w_YJ*tvNynB2Q;oQVO}n4j z`dUWxiNX)WY~(#BQ{eIe)pdrrQE)_6&W*5aJyjlgk2Tozopg3MBw+!KV-2In17J>- zIEMKmAYOyQ6+*4j&EvWLi1Z^lpCI{Wgb>B#;Z$U6Ip(vcnmG_%serAZb zO%EGaFH}R2&_K+KT&gv=baaae2UT4kBbS-TX~0y(a%Yh*rkvEdGy}AWT>n@V-I60IZYj$vPd{U!*v%027=)L zGJEv)Wx`^g0c8Dh;+)IuN=-&L3#-KZ%sLUFeuzpgVFyG|M?avpL`GvpyU^|%%rx)5 zMd~=l@O5d|vVeUIxtTSK$d2sy|xE`M9?4vg(txZSrcOr+{N37mrPoxcbr{ z$B;K&8>V6R3NMe$N?Ff5-4+Auo|I~y!#@jA@EJ{?zAwlr#O83^K>HT$;`UTh($_Drw{@V+N z{y%+S_i;;6HX^gpcCM01(HD-cazRX;}1>%`ZN44=LluiSP+*N zG&D#d+H?crnQfB?&4BRBaNU3~5g2J&mnJLMwQM{+roNjvYQAt=h}|)5tiW*2cH2Sn z0%Wtp?imO(&lo&sG-V5O-&vJqA`1csoNDq-bZ2l9(5=+(My5-{cC^kWQN8Nk->g;P zpDOk*f%X2Gc-!)Z1}7snd9mG9JO^@&^~QwAeTJPobyj%5x7H zU0*IVTAhK8S6(7ue|(pODNn^aFS3kbCrTx31c})-C*Ll$qS)kTT<7*KL!1^oRlZ4K zK`;A1i7@r68}+o+lF&btgdg6|)O`gx;o<2vUFqg=8%DsV9EJH@T(b--jOpK+S$*@t zYu9bRp=!BdoZxzKrTKupRZ23H6B!dU%h@1P*c~we;zqJV{L8~sx zUx6^9hzD8$e-|D#^_`N)yhUDQ&_9n$oz#BY{9Ug#jh8S8DL!kC@bJtyWTq8Q;74q+(WM=w__IwhV*%O1l|hvNQFscf~MFQKJxVdNA}!?ypx-w#d)N- zl8Ivoc-gff0lxXOoxb!ihG=)P_JWeZQ}bd+JsO%Uq>^rY&p2RqpfytdOge({N~oD^ z0e>bcBgZTib7a;8^#`vO2e=x;PlAl3aJS_1HL1tDmcI0Ru5`2WxVEh?~Tzqrqws9kRi^`wsZzvNQ~yF zD*_?U4c1rs#S@B@VkUjmaiH-V<69$mBTBaiY~ZSyU@Yu<+u%J)56&$Jk%U^)$$O07 z(XZb@RrgRcDwT*6zv%&1PeMmOnh8f?M&sCNWnk@{1zuly~) z=r^fu&$T8HI*r?@Ap_lz7CUy~a!(|;D$MCVu~66edMFy&oy1v)1~Bq$kS;fnKT&8R zNEvFW1nqUegbEW;JtDbK`m@sHM~0CJAy*0(BBRlI*u;SHE~-uK8hKIo7&ebjEpoTT_zxo8prdg(WoXlhXpv-PlBSKI z@sG-*V7A&pFZ}qax79uK)vG|_MB&z_E`b?4sE2`-H2DjJAUCPWf2Y*zYB=XzHx940+d#y;!CM9}-(~Nfu2GMn zt~- zGRz7yeEX51-I3KL(aW;B(rfCVO$ie=!Guip0b9l{{dwOd^NLDNCp@piLq3jXmX*I% zs>pYBUW}2htu7W^?3zzT4y`*4#8MLCViJ1{7Vz!lUDRs=eAV&+c56{!G|s2Sp$`uH zEiB9%T5xmD-X1n|zphaf)>2-w=eO?=i51-nI;8#?GwgToZTQKj7utdj_2GkeL}H9I zoKr7HwZ66Lq!o4CbB==y$Xc&g*>wH)hImv7aV6zP#d?|UL~)p-Q(w}5*_dQ<%{xxe znHz90!c8RrID@Q?Rm|zC-o|foXMknk-3Uhip7QIWJ`jMnLLV7E0rHAkG}F{)hxsJn zTIMI&<~e+Zo@<@@dWgNUaszoMP)Gs;sJ=+_c{K1*ut}AE2v?9J9xJ6{61+5o??lSw z$1>0DFNDUq6DL`vTt_oM{J3DJjylq{lbQcSUYG!V)%!tT|AbvP$oy$SE`6&0LIOy) zJkE-t2L~b_Opqzm&nM2G>=hPcS%Wq%dRv>_ZJ0qG6l@v3Bk?Vn2JS&{DYLCPW*y-2 zBRmt-CtR92c-7$y`GIgTg8{3~Hv_wKE-d}_(^x0}&~HYu+gN*4p|g`wBh)xZ*S@F! z(L^4p6>OHf8Y+g1j}5C_026WlLn_ia4V0tnA@pX%U+2Pk=D-a>Ux<6&%0yCYFQlzM zYg__+Xkx!>gfeQ>_#XV#0^S%Y)=E70kcYk$qAwRmg&Ab9MFzF~%5qc^e*A<_D}n)$ z6^x=lfD>Jb&cJ?;ep^lmhQzo{yxFzgfW_L^!nW*xkN-KyrbY>jHS_8*!{-ugBdo3& zo?&$vK6}O_dQ{a~!{ImQF;5@=v++no;c6OD!k6q9&xG*TX;MZ{AWvkbj9FrGb{<7t zNorGrpl|?UwSdDnAu(Ai>DELP8ZK7GGIT%dO#g^7Cw@;^jh8F(xnFlQAZCh6O%)PN z>>y?_c>(is#a_E^R84 zQQKcpxQDxHZiK)XeghS9M0!}mAihBQPtW3xqkZf{D$8VhqmNm8H1T8P&sbmg@KWVg z8llm_Kmv5>NLm=jr?c9$c-HYsjZo`C>34!$T+v6;a&dR0*l~sUU$}!x4z5(bu1q(d z3o}LE>oRlB{pROFz zBx9;y=~GDuLTVb8u9ny8KkK^Ki*$?Hp&~@)_>l_Be!S35pgB`L#HQgeyTi61*IXIU z7->qtuEJYn1FRr=PL^xlv@%e}s1sriAGng$nb@&JeWvy$T(Gg8ztST#s#eS#hUOZ$ zezXF8>A9h>%}BWG_Dw2rRU9^5j;XOnEObFI6sK4DR z{>~eI^fnNV_M_t10MqdazU7^(H9f2atIj1nTrnj0RchcBRqKt9y5YO|atgK&{o$g< zb}X(xZXD7ZOC*}B@jtZf=^7LbMQrPlSn7mD!O2$eB+5EJ$G`7r+IOJ`W=ywB^`>ME z#~|DYx!ByM1#htXTX5lb)a!qX-FizT9d88HyX9IP!U%LoFKjg{EqtwLopi;(Z9ex_ z^P(b7AW3<#IJ)FqRBCbRuMcjZNstV{>EyHPr~d}F+@G);G!jB@S@n>^f<#!CGFyAj zFqs*nH&SBhNL1|p|HwTfAk{YU{5Kf6twl{;;>z%He@A&N8D2LbYS!yQGdQr54PKrF zYULdaRp(;bda~dC02U}`b&Z_o95mXGWqMZ}&2I&+=Qw*|rE&-Qo?>pn8-)!9Ko_1EXTV$Px;-E*ah9H5!PqId1A30xA z$IdxwNd)bFFDU<@lXz{$#Z!q!7G|M$ zRdxK?CEM`1aA+h6U@YuO5AoMrnu~ih!rr98s{eEzayS5`7p$L?3FK93&=O{L;f>&L zK)0!FB@H>cD^~_^-3$g|l10inq%VgY9_WEjIaxM$#pi5SIo{(7$wTDUC^Z#Ma)X%S ziFg|;TIDio*(yFV=6KI;j!2>(nKd?cWc!xETc0D!lh)O>#|Sqf379WL>)ngx??fMT zuS>M|QfDEx`ky8{1fMZyuQ)=3&C^=E1SoY!G)d4TzKV~Jz{p)ZdRde=@9YKZ^r@52 zYoz;sS@nXp0W9CZr~!0~4*yaYTpZRNcAnxuEaTvO(OihF0?8n`ovDA2+ z*G!EZ{YnX7-ars6uOXnNF{?5Avc5u?2*HizR9>aN08V!L-)j})v&uJ0082Q`;S zc7t3cOyAcFm1=#lQ$ufw+0%P#0dJ5&6Lo^Bpj5qQ>uBgbdr|{kqfOL)2rKrj=}Rz5 z2B^d?B4PLC9@h4fP7H@0g_OPP54xVJx8Ws-yp)2UW*aYk)Q{V!tZB+^ehk@fL#{<0 zHwTDM0z>?JL~k~CrLFabSjca7w zYZ+dbuH)Zd5%y{F)z3Agk>gV1+yZ9(WJgW%sJqR+ntfZ|gPryPd6&+=A7{ckqAbrZ zcs=#okS5DJgOq*nDfXa&)>Hs8OVJ*c8F!Shg=N+2OoKm}bb@wU1&Mg=5U`*L`ry`` z-tALI)V9s)C5;D?>rqU6Cvwp4hY=Ee7ETBCbV)N<^FP!aGoMQE+&a1q|6Ue|Gw4Wr zGIifJ^t^vH8#7HTv*!GWN*x`Ua`ZZSIPCt!hl)fbJk1OXz=!-wfvfWI1mm zUg2uv$XUbd*nfi-K)?w33k6UVJK*A09K2ZGC>U}F_?xVr>1_E}cO2+o{Y%0<-=6rE zuo?ne&-m%u&7;MSkgMMKZyxLGP?NzVe5X>}^0R1gBKnwg4q3G*8A279PlFd5oAx~$ z27};)+|@90dq7>3YgcFKfa35b+4Aa1wN_hkxr|pi1N<0j5R*Wp=bwe zFV|~*!1P%GgO?9S#LaP=7Mc-geEi0sx#&X*di`M%!Xs76Q7k_|a7 zo10+8P~^LTr>WA9UiUCW?y8Baq8aqFBT&y$G?iAg<4+wvkz)iR+EOau^AH4V8wk+26pfM$%nC`)ib(1YBEmp$kT? z>oR)vbAB2shx7d6j6}3sXQZ;Ivm+|fenn_g3OWZ(i~=gXe>FAdYv`Rn)m!=1q@KXI ztCG6boc%Vlr=eRD1NIRGI?YwTutM3pQ`X%PSKT>Mp=lb!-^XteNQwp6xGw8G%~Ku8$@Ft#fo zCClnmjEWWOe^|Y8E zEA$!Cl}cz11yYGFW!I3Wmkj8=&onWT=9pUb&D`CfBe|RaHjEV%u5>__mCQ)8Qg(F4 zMoh+)Pt3cU*Cz=1SZjgvu|g1{pOc{XV8boZ&-v6hCLaYTF?!Fwi!)A?Y(MAaXtv~8 zs}!uA5&2Yl?9RFF4NRsLvF>ICRa#>JQt_r~C2KpxG!KjP^~# z-*@)nJ=s@LUOt?fH^2h7z1PXGPX$G&@ zr6>$f&2SGFSB)kDLLTWmx9(%=jo8BJDp!4$eL-#rT4M#p9ONIA1idDh=saO*;lYQv zeJIlDmsIySJuf1{C~H4?sUP~6mL&@0*H-mI-3(zFsW1OwZ?xU|S;O#clx7E>N;UC~ zP$J1n+C*NvX>iqZwc0?={M-Uh>zHO|pIsJa;&h>Uk>B`^RSY->%1NWWqMij%usS}k zxr<$9LpVDS4Gj}lBj4ZAm#_}qwFdQ;J|`ntYyiw5Yu2mp#1>YfWZ zIj%O<i-cA-(e{I0*^S%d>uPK-+#D64*j$lB3#fVutp)3A4AzlGNByhl`o(HgK^ z13B??x;^`Gp~;Qz0JZfLuMJ$c)9^Tw^2sMCR-ewoj{fz5vB&7f5633&S08^ElH7w{ z5Ou<#)CHa|wS4Z^9P^9gYQ^)_>9rT?6INc`SOj{ix^^0*?)d8#%Y!AN6raq&Iec9j z3=w)2@bD@>L*?k?Q@DhDJR}$xT||e=H9z4UKvgF_aCwO;u@&vpoSLq`U0-{5q8mTi z)9;Z0TuQBc=0>R}I{U{`ztT(?&7V3L9O$@=p5aV1Nzr+) zDZ_*8P|igAB`gO%%?BZTqfeQ`BaEDTcK-GBpWhRp^Vi0gan)Rf;cO$3iCq?Hqba+? z`W2soUoYIs28VxNT9j8KtSNVv>>{T2h9%(sh1~tVZ4|(chmf=d}W;o-4Z&8-=j-b|5k7iHulC@R^0NzZM`oV z8VK**;>qXbg3G~kDPN1wo|KM?KHlAVE4l+7dZOZ3gTv*&(BChiK5)mr8cjHrpZs-c zE^u72Lih3omQBb=o#8K;iG0Ls2M=~sRH?#?KORaJhrqY{zTb>IU_+ys8xWpLRP1WZ zKBom2j*sTYC|U%+St~j9HgVQ)xhgw0JKBhIXzJeA+vq|Wd6l2$tNkeGdX2)6o$ARN zFiif5@78`{A6!DJu8(F8f{)#BfWh`?Lv6rsZ6pNWC~-sL3MG^iwGTdb@z_hE3;5L2 zN!V2;p5~7Ra&f$D;iUS`+>5N@=wVpd95`pI5GfXBohPVH(=SL#2PwGb=qQS1*6v#1 zwZew=nCu==L;-E*_3A93%wX3BSn{R8CKqpMry|W*FiCWaGJhUKd+ghuTNjT5eg}Td zAuC!f9&#UdEtH@o1r4>(CJm;<#?jOS+pht16zv6vqYbrDT5cO|cl>vrOgE6vfhYU~ zqi~Qk6BXs?poqlza|~t?#}(m2vsnC{x4(6^pp|A1Wk;H|_=@2u_PuBM!+5QhoK>K3`P?g-+XPyUnD8IR5+8jjT@Yg9 zqf%Sw#osbZmAH%P@Rh~W7ZtNDQK z8}qO+I*s;d?f?6awsC_XC(GY<7Kkz)Z<~z_vkl*i+@HrP8Ud6BnOjFZ$K4=4PD{1< zz(>lvH*9Db zzLPahBUg4N0#!eb$I}S3}m^=`KR194sVS z`GcI;kDp}~0yfs);k;)QxY>&gmoA@TIC7s_6@~f9!z(BotHsxr!lC!+D|3VA1FiU| zQZXEMJ{pl#PJ{!IF62z7hme7ShhCh~6+ON!{sGXKNFL7qUC zgMz90w}3%+pp7`(K&0d$S7L3<+sr#^?(PgZt#EDF5zM`!kdQ#P2z@*@z1XubunjGp z{S8Qd#1Hy@QrKWyy`ni#^g}BtC4icX9QHI?x#8kCQ2sWh113>Q$-)<5>Lnm3U0_gX z;wbEz<(hnX$ZtuDYdfj$moL-43t$bd2ae&|0HW!`US0?Cf%UlBXr4#0yK$DuK;9Dm z?NY{ykLU?~szE!BRY-lC(#!>6?3cPPHBUz9_qi~btqx$fmy*~E zzEX31Qzf)&lb{@@${q_^#6MxSgB<6)?ouMTLUcE9>)Z{u(G6tB&I}S%N8mWPAckJy z;6Z(Ls`#JnDsI4IRsnY1Y{`Fm8Ro8*#P^%NH7P3bFDm*w01eLL$7@FdGB@Li@n~R) zw2!=c^Vju3`Nd}WWq;hM?{;D2{cxfq;cLOamj0YRZS{)^|8pewQ_Y7Y)pt$b*O*$Q zU9y?ecc&m6`nIb9SN{3{mrhtY{YHq}t*^z|?7=*7B0M1*wL9we=U7*#&iG{7ZmdZ& zW4#tX#E(s!afK_7NIFH%VPEBqM346Ic~yxQn;Ntycz5`PS=PQ1D(*xtZm%vxMQ#yn zJ@MAGKLPr=aX$s*;|IXq$>;x1?+a}RS$_$fXfeYH&c1ry{wj~cAh_wkrbZLXS^;@Y zU3C8IgTret4z?-A9}-Hv8crM;!8UK;n&@u+JVdF_$TfnH&N+8*8&D@uH32v$su4jF zcOwh49gQDt@&JwYH+j>wGPT)`?)R(VA;4rt)%Envn&y-G9NZ_wi`1BKUMVxHg?KyD zFMT`k8sMo1(boUR*_+2Dov-nuo!L4wEl!hVX~|4wmWs5voJ{33j+rq=T5h0n%1n{a zY1G^h&P=7H6{j3w(osgsT_hJYH<(g$ip&HR#f8MwTu^X9lx6P2{OSd0? zm(TJ%@8`WF>&u!Sy_5cI(;QVpGC%NC)O^ssy{D@6YY^Kq1qLQfrL+0Q7cDeW%pZ@$ z7WF)My3Y6*4)HKaOjDwmfkMz6;h@l~05R@V7FjX{6W#|2hKGL}Adam>r!y=huzpBH z6_GacOUMN}&tckTTp}19|&n-`gKCQkqi=^vx4`uyr=TQ4M^+g}n?iO)v>PBjna3 zYHl&)qHnK*PhS95Sj*Mz!Q=dA8-n*NcpdKu*?vS2Ug(*O?0ZO4iBMVFuJI6xt~*qV zguHooMIIZ-=g&+UY0NV9qvxvoIi;a+5c+t=0Jk&Tb9DYT?IXLcyQcF{CEpBjGKj=7 z@@x^8nqJUT%GyVBi0F7#4yy)#QPOwp5?wD5nB>@a1N+fqJ)@D|dWd~jb*AH2ikAZY zbKEBD?-bW=o6z^?v|YQ8pIVTB<<>+ZxTZ^&L&)*`&%gxZuXP!;e^OCKTZ!h!`zX<) z80*iS=Qqtr?%B>iesEOt^!-9}vj-fn>=~4Haoh6tOvN6MA0R%{y1bKrEJLSrH+Wf| zt$UhIFvj5t)HxV3XiC`SeRg-hl67@RI&PzOnoqCwjr{pX+6r+S^dCn)r@xl!GnYOb zPkfNn|9u{(RuyNozs^B}u%UdRAY@RE$!Mm;JQKw;MRaO(^Xa$^E!Y6j9J#VELyn%7 zK_s><*5LpMHTXa^07jqXpdUjS*xw!F40C9Wl2sxSg*UF_%g=AMN}h^vJ6K)}4`iwrtBe z#Luo)H7yE)YUHP6a2BCBNSk`0^ImA~S|bHI#kJpURz~`Dr*LMw6R%QNsvO)K7zo;`_vG&R=LO*OgL19 zB*Ed`5ji&Xv_`0Szb)7x*p1Shl&q{Y)?TH8$<=UT2-&S@nicW$yj&8MV=RVHlY+%4 zssM(0VVqBvI?V$2^x8ztUCQhf$@yb*0sLOSx~yIIf$pV0*joryl8qmZmJ^QxcPyZn zmPO(w;L4?49;Ah~kIutP4KSwxxL_EBnTVhNH4g>hRF&YpB#|G%grN*heBw>4gi(d) zkJ9f;D8^?8e>*9-M|eU6)(s$-Ie`xM1>mZ)DQaR+w>6|^&tg<1=p*{!cs>6%BxuI8 z!Zmp5sMkI|RNf3!YEm$Uwa7H5D^i~hPfP{z3xf=YWf*+#W*>b5FMrMasc}>n8d=<^!*UBU->vYq@g4-#7r1>FlsJV6Ct-q52(Dz z1(`!~pq0_@e*J6WckAWXmFwTBelkg;gjy%e{Bi#^auyjfud_aNC-xptzy3$p2g2Fy z3^7IG8EmUmvSBp5O;GnlAx%e`;nSmSy{wiJ{X@dDCiL^H5&isc?Gyfs71-4S2r9uFVZdx+YYX>_~}FvBLPgp_o$aAMlAkp_}iZVw!XeDERTU0?s3 z?1{9^`OanklSLg%Hz#yfI56oplDjLDN85k(!n8Z}_T46bvz=kmJs1fs{(=k^U^T|Z z$HPSTBZF73h?XlyJKa3F*sTfIG;(zKp6OuQgf!qjA59OuIsZk-vO&T|LRUnTS7l2Mx`w_+L}`;JApxEn5pqB=f2;O- z%4kcnhq$6G$9(Mjrh604x=?$0_lxe*p2c9(|9yz<@pdQ194bgZuqjTfU9Dw4vREZfcRpTd#!@e9sE>B@ zb5{HQkC$vNlbXupyM+K6xS?j$NVkoU`qw(O&mc`HsX@2%Q@1NtA85Z*oI%gpllAs= zaRi{+BJ2hKswwk}8t(}dm-5%T5`7Q)qu7*_c#r~y4v$jP?-Yh5J&y7!bQ$W2CSDjCaotsBXV zK|BOn_MUC8q|^b{=M|Ib|AI+j`~*#a4|Y9BQ?W1Ts&2r~xW1Mf($SB9yz*FUEo+j3 z^pwoZw&*%KJAz0V$N_Ru6I;Lp6(59X`ax3BeVfv7=?o+_MSJW`XWGSO2_ zE9z=KP=Ef9_fLf1j!;L);hJHO(OgDuF@)Dk=ozqM-$!zZn&?Og>pFOl2u2V8wazWw zkiDLM{q-U(5sEo3dS?5_@RMw6w)X3`74U6s`Q$DHHqn{EGf|}G5>ZUmskxh-ub=!$ zn=GD(1uTg}YaJZhJ>w!`2a$XKh-W4)jHe@AC+XVk%IIbK7wB0@$CUol9otq9CTqxA zT*mpvs)laLH>5*{^>YUb(*xjDXgF&JQtj z#<=^EI#Y%Er~v%H^0HPxUoZDi3cc{1nQe?8rj+dy!MZXbJgaYfu*z~7j0V-P1lm}} z&ZG^Yue-^$jk0L=5v zDYQohzbpiwTWhqN*mwinxg-``E#Htipv9{{aWv=Tn?N+9a(9TNr(K%z`tnDDVu8d7SH`}z2fEgQJfA)sp zeK;mZJ_HS8{X@b%u|HFscUbd1Q_O18O=iK5;Ww7k2F(wP42bjw_n5@^$0Nh5dFMm? zCCx8M=;ca|R%5N%%!*ltK{TmrK##l@>_9M`_Kq|UXO4T0=3+VekNtn2LYV4zlN6`z zaw(Bt8CE|}VDqDqM*S%@TZ~r^(Q> zboI$)WK5edc=g(SA`SA-S7*lk&@*Qa^j_)@nfyQi?>VT_T+RBHNvK()-7{%tU|}G^ zRtUV*NH)IDX|1iU8&?-S%+r+S=MZaBbrv+&f34e3TD)eIv0Y+b9{+p7^*hGEi=UMUG~|RQL;uc>e|Eq=VGiAsLoita zn40y0yKo6)Z+0+uBSOj(~)%{iUCdUmq zsA_7Ud-br9Hu)NpEP$V3d{q8hDEOa`!nDdnpOV*vmUk&9&v%0bxyJFC>&_n9xNutR znW-b_xQz^}Hl7Y%W(3(uDrfSIFQjil8TgbpsIU_5lkoo*Eu&`nHJ+faJ(KpzfZM<% zWSqGsb*OIk7;QQ2vKfh)bwaCRAZE3fMA6@5HYNAaNgtWMf*FOhu#hLq&BM07I7Nf!z?R2)#)Qt4i{=m_P?DTDa zbX~#b|3uyPYGA^xIzeB9m9;2^MI3pSR!!e1G!yZ_bARouO`u08sm+C>BR;_I36((vfXg%s0 zGCP^Ry`eqeQ~}Qzu!ed#y~Tq`j4JZzzw9^d!B%y~mj|yt5WvTxq*hg6M)`xZ7Y^Pd zQ13pLbi5bDnar{I$u{1YasN-xFS~q?P@d^H4Q9LHqn(z|Ly!+hUdMeF_oc&=Sp$)7 zI;YCn;% z1*yxdH+)|BAm9-sd;>KdVin1WA$*Ou_IoA8$*-OriE}B+i-k0|h_y`+m&|_Dn5jDt z*CkZBh3a})*GKBTDsT1mpX+y}0}z9J4T>Dp8j0|$>t5x4zRc)0 zU-7?4|0kXC`v~E+T%p{x(}cMV^fX{BiMiXhH=Gj1T zvDQmgxpQDORCt5+3FV+dBy&EiV`7yy{@Zy68X1P+a*n1SZVkN2JZU2Oi-DP>j$3kj z9aZC1D|)XRf{&PUq%oOo3w}5tO>#^geHt|(j0HTe5jv|p!Xh{|H#jEc-K3XN;$_%W z+TgW3GZAl3NaV;jZ>gOnQ;;%augcjJ`icogMB^3kt{RTd??}jOjqe5)ph7D-bGt;6 zlD!)>%McqZDn$qQy;Ri`o{9EcPqVkiF`?#NY9Vr#=PbOS@wjQ<&qfQ`&4b`x8opL~ zk)7iI2X)`mmY&$$t-z4Jk%os0Xo*uT!KnUPcN7NCaJ&>$kS@5~XPdTr`ODC4$B)xz z31&p|Z5hvwV0O2Q(<~VH2o7Y+u9Xd{2V|Y6-w2+A5^nuH$~R+AqsXB>Wc26`;bWe@ zRb#_fLUo29v}EYB1>0gr4vJil1_73D_E`J<+qf9wdmZbnnCpVpePkd&6J_`_x#Q>z=XSGyLNs;wP@Ts9#`8dDP7VHQ$FYjqv!GSKulErT+|paAX0^3FaT{0;efl|k^azZIh9ONw z6B9u9QxMt-UrsqVMHPlb73d-VyWz)ILK8_N8F|%c;fd=?PinU3q@FQ0vh8#4aygqCyolf6!{ESw$Teibzyc9aH`!M-v#D zj^+j@R>L8?N?3U1+Fq_p_OU=zLpt4GsTJj+f^1hg3#q( zRwtV0R3r#I7dUabTW7c52R@y?43GQZ`la?edXSz&-u9hPi3=reWl_94)kj=LMf zi$tt(hW!gqmUhktE+bcN&eBGAD>~;>wI^VpqU{qeP#0!a>gr+K_L|Vhv4o$n_#M4N zBE2MSi;ODNd=FDp!xN}{Bts^*n(pe3L>o~O*&`vrDS3Un&0aNdTQb4u zWRaAo1Qe3>73JSv_!oJfLOgVSZQT~4Fhce877>V{n1>{CR_mP#>$TMj&7cuV>Z>eN{3vLJR|>4-W~{7)LgpCNsY%bA99R>< z0WTqVBJnVhQ+K>U40uB4hd-vn?jmn_Wt&li!Kvrc?hacF10u*E zxLSoUWnH&u##F1Rb0Gr>=R6&B(QMpO{6x2$0R=f zz&!l2!d-??pR%}z{7gJMVwh$83Uj(2dqZAN|31fciEnpGyQ!tgbWyTN_nzjXC4<54 zRMGT@MqZJQcw0sfI1bcW+g~lo%~p;yM71wvOq}9Js8G00oV0i3`Wf) z?e1h|%FKWX@8P>hc5c$JhB2tMm!y;PXRDRr&jV{Sa<>L#;9Hs=NY85gp=L<|dCAKO zvG2!s_yrW7svZu-6}fDU{znGt2zqIeY?(s_HUPK?Kv7*ggN1}&6a6;~iNH&_X}Fmm z(Sw?W&K6Gw_(nhgx`*6qG1^$o45?Aam#8a&wC;ym-%hhk<4IL~uqo${&%p5q83Qov ztexLDW6CSdA0C-@7+Ej3F-&PrUMLntPYfOBz}l$kD>_h;gsI8Av<^7R76}e zeY-F}R{_70K?A* zSsqA=Z_Fxue70ksUn3!B9M^X;cQiSA)(a=VE2DB`yV1Bl-e57ftuKJ2wZkBxg^`VQ z&h#&DZr*XdkT>!Qd@1WVMN>R0QKgJ2KhhseD<=Nf5x7-*N@(b55^{X%)Ry5Tw1`#O zB_;+4O#0Wb=H?~j@+r*xO>?tM_}YzoUbGidBQ9bX->$nJhsX-uM_3TgN*4^iOqFnD zRI@N53OczsWCj?|cG4Z{R2iyHfP^BHx@Q_KKDaz32E2fjTXrq?{1E(Cae<6ft=(mXn3;2x<@LBP$fPkZ= zDM&$OBhoIswda2x2zR5UtmWHdw)0DT^;$ZVRfhbn*V+?6)&EFsu9?L}<&?VRzqIk8 zMG^#1azPNUPap3&`>-a`*T|Xvoc84se{({zf1PrFOS}q+7Kr8wloVo~-Mvv)$d#c?K=roDq&K!CxINq6xW8WMaZYJpRAa}w)Y!Xz5JHDJ8d6~LH&(@O zujTE?9EHP@^JUNw?Q;9(EaC(%KmzjqMGM#-{?1;}$;AB5-E}`XG{lp~0de8LYNG!N ze`8cbNRSsNZJGZMb&Q)RmZkodx-TJV@a%&zNRK1Cb|PW2W+?sf=dg&oTnLXh4w(@} z9+tR=mk{H9q<`yN*6d)o7EQuD(Pg*@Iu;^Bb|~qoT(afpsEA9l#?~2FToL#U|9oU1 zK+d5Y^@)Oz^l673-3138EK8CVZG+&d z>^NWT0ZrkJIW2Hu+P!5PSg_x_0-@=|hlIg_pQtP%d@`i2e<4ZD4KuFiS#TSfy6p#P zz0_%|_vLc01C_;I@8&m6ha7_3Povu=PUQEE+!y(l1GXF)Omx7!tjBjbB&Up6N0SKE z4>Tu)QFFBM88Ev6)u-=xWAq*8t&h5j6YyTVnkL~Th_uDv%RR3|HA@`;IDUCTSu^^g zN)fI(JxREJMwzD4GGZduI&bhB?;V6mM=2VFN#Dis6H>g!XkU!rK3pBZ$T(l%BeVZo zQ(q;rM`B?g6BqX_ti_=l7n3gYV$|F*Gvtxz^pVX~V*cn?%;)#$<&nLm=MSAHotsX0@l&ymh3REiQqZN5qDZG3 zkb44z1tMem0O(GuXsluX9@dl-?T@=|UW|z@H(^vPrz%n^Va-qsl8Mfeidce z)aU5y0fH0Zx|EJ>E?<+9uo?C`Ol#iG9@~reUXjgCG%-&x4uIeUsLN#^LYuqoz5H8U zquB4*QNjMYy>dVEEBt{iK+4#|$k5LW+>+mjbnY-xzb!5elK%2B{^1*eKTynm{56pO9Y%{h3{d~7*NUe5NJ zvyNa#Q8-qCWWxk@8dwHkf>(Kt(7lw=X+0|;&$Y0po#Gz*t@*1~Bo{Tn6Kc`**7B#z zzo9ODa5d4QmEyaud%bLP9;ak_3MnUIqPOXK_>BwY)0;e=C5@zh`itLN0V;D`$LkBI zG+^0eQl^5<((a*d)_2zRj%Mh#%8v*j`4g zB%AXegoU$de(ZDYTG~~(lkPZ?8HM1~o;vvI0bav)h0u3no}sV~DtDNanY8h@C6uAQ zqIk5xH4tAIyqbhcv)k>8H$<-W2~-b3y*ciWu0@ajYk^<24{om-KYFMBZMyiZPEH4p zGarrKV$DCpCJc&)+jr}k`}0X<1{PMOFTJiTE_rjYi!8-5fD13Lt% zPu|W7wGzG=TIEb)3zL@(h*pd!+w029CnIl#cWR zi8TbAmJ~AJR9Drtd~JmdA8n%l1R>f?Rb63xB|f-+P~widWg7-$EKQ&K#gvreWgt)nOPfp0>RLWVfBihkOQ@Ki&tPPGQe7VK@0-GdxQvD4d<5Y z*VAal&uUEj(FBPLNn?$D@P#s<)D=KeKpj!mQdO+za#NEOtmoZo z8Pd`}LxXM;g6sXqXEk=-?gq}M#Qq_&+34NvSgg@s>;5y`zHcN5tzb+oyqxGT<}b)m zIk+t!Xq&W-g~8K=3n1Qv++AF878$sXhO-|C-f{Hp365v0YDJV5$5+Bw$eY8~4}(T| zLV(g%FA`}R1?uACVdZLT54BXb)A_>hC&nV={CE{%vzv-Yer)hI;ErZjrjZjB0zdH_ z#iD3R;`Jtfg1Bbam^M!tpe38Yd--2^zxG5)3cc+|C=(Qw+6yvbhs|6;8QFI>nMJ4IGHKXT*4O$DR{5D7A?aPoe z@*MTA7PKc+!EUd(&?)$`#=6q;zE()-%T2%wI{r*=)AV3|Rv)dkp!)ZdL{Y%B+Sjc6 zP3xi}AwLtzU9V)P!ng*34l}I!GG(kns@+RH0(WE%$pzictX_RE&EO#zcu@Kz`s0oi z2CTNaz14ckx^_&tB9(RZb|DVEaZNKBY_m?rBt|Ds-d&j%W0_uy8IIOC>_&GoUvb~Y zdXm{xk)ei!JcPEj6nRG*8SlgN$?@y0BwH-h^0~m8w*k*T$t2s=KxP6l%CbOeMtkl{ zB$i@gbS%;~X%0>G5S+*~rL^92Y!Au$y2r`!s`1x(yWY-IJYfr5fN~q9q7WK0UeRG& z;vut%oe+NKk}%H8N~HN%o}G3ZzUw5czQS~|j!cHCI!Af0^xdZYlU~Xw`ukPF2S&Z$ zgQ34&AZ_@4VyqFo4zq;cX#atPixrhe4hq8T_8aQuv05wp$eqba=ihum`&cmAV&vDN z@9SP-)lOHXWMYJKvIYj&&;Vvu{>E-Tjk>SzYvpFPWxD-sS``r84KEJ$a6&(AwI=q^ zWjpU2CF$HkM74x1x5qN%AFa*cXHYsj-7NRq=;ep+e&xEHJf3lT*4b@;zD-ia|2ku0 zNE6_S!QO7PlE2(FyvL=>)zxb- zyYeNS6Wgt0DQotL; zwF;XF$_;1L&q{(k#@KePI+n$3mrftwHF>U`onW{Ku_=eow! z+Xas88&J0BW;whb*lQMu3q-%-1|%{Gq7o) zvH&h4MhH2&D^AuzoojvWkKPQ1Kl^Q9|Mz7RhF)4gATpJBd)_e_a5&W?iZ`MIM?+Rqb^#tl)5{3&!Jn^|3m8KAFZ zS!vw5wd)m+2$`OJQ8Df@A<#4`k%;dzU$A!BcYUNwU(`f-eLI2XlF-D4^ggV0XL`dR zK_XIJ5ox`RR1Cf{wEgOo)6Lh6I@6*IFT70YmPTqp{ae+-f8SDAL<+Qr?D-^+i2S<-X-cm`~t6w zI4a#dEU@56Xkcq$b&#~!By;Sbn`(ogT}o{H^f%s)`bDzb8C4;O+2v<|xr==MHZ@>y z7mCU&FwtexCXIFM&*5T{BO(oWq3%aEXA=R8QZ^N_M`@d|;h}|*HBgK>V@fcZR)aqU z^#bQi>KQhzZASlPwqxotKZC!OZ5RAeAK9|iC-~3oqT(ygd`+0X9#kK4G4MH3;nGJa z>e~)a)tlt)6vmcgtbeWT0*wJ|L_B9i+{LP4Jx8lgI)AKCX+T`cx}miU8`b0jf=`>U zL`ljAsfV-?B4`cy+o$S6{Bw#0#gW?^gZRWo9z3i(oi?fy!mX7r}y(cH^_)_Ssht zp3tCQLtYA2QzyU?S4Lkt)_gSC_yN)2J0>`wEt?0!(l*vs3#G0(J32M2p_hv^^L-0K zXnRgShYix(C3372`ln?w%B@z>(m9t?9KjI(IM}KR_Ot!~yRXPs@?)R=o5^~r5wE#Q zW6b-yxwrXnSiEYmX~QNr!*3Dc7Vn;vNn|hPUu(jK(2^}3dN|U&!ZhjSJNz|348SECp?oQ4C7`TS` z&z0x(x(%8q7e+pS4QNzOG--^=*)-e;pMIK?eefG3iP?g;1G>sY$RN{G*4?LUY_3un-T2a{*3(!B1inPE-=S8bO2BDTAK zad75%&Y#FVRdt$uhcO`jStS{BU-DQ*12e3smg=5L*#p$FA9v*0uDTWQ-E2umEW@~h zdr3G3OtstOy4xGO@xd?26A%@#5{Fs2=)B$=d}??(o$1kzP|4)^K6|Ok`SUWoA0UWo z_`?{&x1?-z|75l&nI}eN>C2`O)~`5+p+^lF>;mld-WxdelMGHxI)C={7d!i$>s(xq z*%NFh-@svK@CNKk%O<~HOU;Q<{aI9pIj23Za&>1OxJM4(LI0UE1$< zsM1tirYe=KYS^dmfrAYX9EB*o*~rULLCfh=MWTE#lL1fXMn>M|>c{KvCxrj8@ba_F zFoZT^k>k+|8=6ZVRt5kkWO7GVz{_ zy4EL`t24c`@xyL%(;NP{8$910{xX=5#&hyVbg4TY^>8fGk5Twb<^0v~V27O1yaul28r>K8`Xnuc2&cxG|)6B{k2Y6R$nm^^l}XGr8J^R{|Cb`LKn{Tc0S=}zy_^@jCXNi()p=fG7{@cTk0MXYts_e7@9Y8 zVQj9o#%WqF2JTd2CaiR1lF75^k2}VUZt*M?%+xXE{(PbeyVT-?gj7-w1H&s{fk=~c z>Dx$oQMVrrPdnWmVhAOYc1;N%@DNRzZj(?;Q&_*-pJ_DsxH{v76Ssmv>v#GW(8vvh z4Xd#NU1@IQ8-o%zF%Pc@$UfwkfG z7xjwrcdmuug^`W^56!tU8mPl)Wp$h^o}HGazOUrB)dV#WXMGE+EX8fyw7I|J zQAQ`&)9&+qFY!wQS?Dxkz#-&Hy#x5DSONjF3ym z8&DwUj$C_R;|XXs2LmxPoEXLWXPoQi#}(_-=dSQj2~p&4k7HLq#!Vwy>N52W{%`6U zgX#TLQIUQ+Vs4y1yTz9e6fG$cTzbjB;l^tTEsb0_d|>yka3_;5C7HJkDfIMG5=1xD zZnE^x-i?DSPO=@}vJ)bGIJI%sE{1~c3+@h3?6B6WlMrgPNFJ8a*~s9LSZ$`3tvdf_ zCL>=}i!Lk2fAK#OSp{~(usVCeZfS$^vwRu$R^B1KR7swd)b>f6YM;O_r{hfz2oJla z_tHqGDwZ2!rJoD{LNc!_B^lTCftMUOKyw$Rx3wq65WA!_B5AGGslv}kKi$`gUHEHV zJRpf-Y_he7i2RNbjQ6U^5j5R9MTTY~&u|apmJ;UePU&B&qBlX802yi!CX|D`G-Fm~ zM|V+Frdi~bZ+d+-1QHV9uqIfwU{BM%x+i=2b>nIJEi+)(#+)lR(ztnvCUxWYs!Akq z_0`q!7haVmlr6kibW0!fYUp7*KP`k?tf2C!Td~;HIpGmTG4ZG%!D*ta)pQ?Axe{kg z0C^f3B-3TMB+8^gK2R!lyVE@XdmHw{ZP&;=rX@!H(}Sq&G*mx!BAedXcl+l z>TtVpb%&;`H+gULXtrr3vlKR`#6b*13K)uMx~u}A+L;MPr|xTcdi`}n#v6?>KfG2q zpQCB4U!OKxp^b()#~?|-S2Kr(+QHV`$lyTW3_ZE!{?eGT6G-k|E~I2*5LqTVyNZ@u z$)ST4kmk|RO4}S~WTZas*Ha6XrGW!$D_wro%$iNgVx<@HlwbzJE)Rlm)4o!ZHDBj6euYNF%Yx{ zhsS%Xq1UOx1?-bnGMTIcXO(%KKP>Ue4&VAkXJ7j_IlGSH;A`7Kdkmjs`Bsh3@f7Qo zI>IHW8VoSr30n(I+z>T7*HQAmUe~)WMv~Rc``%}$-Ttu@#uuw$=co%^r_%!pv!j<9 zC{in!%LSh2eXW~lQn73oc0|KgeUHl)>Ay>i9k3gAAn_dnU8P8aKZ@8uf-XA0Gs}*B zZg#O#e|Mv_aY43Fc5vP{E+fM;tZuQHzeF2$H{2TgXRr&C3ze`7;YHaLR;Im9|Ce)r z^M`^5V9AYvFMaqJKdZt8AqM07q!Oo;*VP^4@MRb0vdPMMv@Fq>(I=vXd+O_8-V#hm zgKA{cNWx$1^w!Z|xe-ADzmE{cI7pl1=^P7F<%9HqghDL`?l(}58mrvXw( zZ6NM~aIpD{5AcCt?~>)aS2&glYNxe{Mfs2Lt%0$Bt+PUbiwBxHaROZAAsz*l3o078 zv%DgApB|BT8Ofcz>n3+I_%#!VlcF$r{Vf%=4u+irmie_HU7)scFj}) za9W!IR`d6&=upvibe0ATjr{Ez1YkNueOFgtW?n|wchwC|hr~aeNaT^%{dg_=1|#Ww z$d$9L@#Fr#CENqM!Z!aT=HTU~MKs{-@TB-%`ku;;z-Ff2IqFhcCv?!zq&%6Ek2QmL z!+3qJ0Uay58;ZSnwM#`x9)P7BHspw&p$c#ZWv3n+Ff`ExLmuhE^ia~Sq*P`JA!ulz zU3Gw;Y+O(EpPSj7?BX!8gV$N=7H`K|>TBxjKvbRh6ckCzm>QcOrVn+1y>BH@RsLGn zRFQkSOLOrB;3Gi1244a)sj7Rdt~n1MEjI+XfB~mumW^D>b=|x6n3C9~puZF&$jvhiOunL9I+T z*Z3-QS*%RkoNbemu?%2Q!I@daz3ob8zuffLFC-Q^u}09RS@(pzD1{pOT1o@V!zFId z#Y{;(h?PxpJauB`#=0uQisQpTcgg?1TH?Fhm~Ta6iugOVDfpm8*f+O>Le3Mwl~^Jm z+;>b$yR{d}Q7}u@KlDox62)s3{wCW;$Wj}(&&u@$(B`r8DiLd!Z71o1~bYow zoU8>8my!q*SEORdJ4mpPN%hM&k(4{Osa!t;=jB2!>-NCqhL5_irkCM-HcZ2iE}Ifo zT9Kin*!IttbohVQbuVwgu9A>IBLO}|7<>av!oos2Dv6A~t!`nVp+%rU5bV3}ZtU#| zD9cR9O~k1A8D3A9*cm~7G~ktNTjC zPMh~=Fx7NljXk&4$?Gv|;T4`g?7j`J=;YIzJuANtQ+lYVdFXDvL2D;KI}}tYq^i_% z+d}p<6s`+}_e8VR0!>NTNSZ|*v#c|QjGWXiGVq+?#45e2!G%7L3FB|?CtX#8qxzqH zz*R8Xe?U73E>hI#<`v)WWu*D%Tqi0s?f)CWeZfU78G(aI&_|yEjkoYRy zRDa@J+SSs)8Rj+N(9D)ZcrFC%74Ee6ltE2S#7*W{uq5xhFFj2UjN)~gJcOAIG-P}F zQhJgYtWWq;Z#$9ob24!6(SOT$dcfvy2aNG_&&oON0BwBUP+qT#Rox#Xs*WaRpP_G( zW=#aAfFe_1kmX1Q-@3M%m&?o^#vQoObA|0HGMVG|0>!JOyesoOqwBOVE;(lhWeT|u zKu>~FZeTGkY`f$s>-=c(h0~CUfP?K~v4v{aE9mp-3K~zjp8`f1I-xR3&yV0Z-_A zYXOhn+TSh&6KenkUR6i)xfRQQ@@r__77qv`0@Pe{N%^<)&*Ra945p*&zBHYqzQ8=% zkQ8t+&;j60w9fR^8*5Jsot%A5;+OwUj%cGP9qVcqqAoJfBY?n{Wx!$N3;A@QBx-;e z&$jusU5#FKtQat3gF)s)e+!x1?YX3V88XOR(e~ z&qD4(L1lc9((-1-yYyfO$-;rh89Lj86tFx-&&z##X;sKs$Y&}{1VIV}k@9=}%~J9O zSKq%>k&ZW9GE4>yVW(oSK`(Rtb8}jd@_oqH!di8K@EhU9>hx1G4WJ6;@LZu5gkw|f zfkZyKM~pLafYKr;dJq-bd%12Qzjk3x--Qg9l1vV-N|louKIG!$;CD^Bp|dQt$wAP= zAr0qcpro>@XzB+qlR?T%<3u#~E=IF??zlBdzJU*3T83q@y1hDFF~U#$v~Y<*_`pQZ zM1hZ-)!Tp4>i5-DF<;fCMgyE7#*$=RUj|CuQEAIhFZRHpG=tK+SLpoR?u{UiL`?kJ}u3YnsCWIX{LB-$@%U&I!RfGhJzG-=BpQ_t2kx z@~&ygB>G#se~u|Va(8n9Mc7me38<3cLFzOp1hc5K6#H%t1+6)jVD#^vf`vG+R`&Dr zznaJkpTEdWx6%S$^Yc~8KYO(_&G#7PRzH&}t*hekbI%_x-9uubL1B`jVZn5v)N4%r zFq}4A-ADdSzl`(!rV|=kNYzg1XShf(`%oF}yE$!@HEp#n6}xPIPLHSBNBuv4dH6f0 zFaJRimAmnme{AT9+uMU)kO%%`7FUouyo)fi?*X=WfitPs1ou*{sG>XvHHQ?cYVmJRs^$0BiO>FoZ25(H{+joy+iRV& zj&A?%>dCO>E2tWm=8W}nQp~UV9SUv8*Ghf9F+ViT?H;Pe9a#Zf2TO2gEZ~UHX(2`m zDa>jHX7pP*rUI4MSA$s1netzuYIx1R+;wwZz_e4AvN?5b@GRq4vw`B`*}%ZP)KyRj zqow-2lml-q00n1l{7^ki2vlEhHQmT>lysk3b}{Opea@L}b}{FaXaki-ZC#szwbw{kADr-W@K%fv zSqP4XK`^b^1GKe{NPpgUCnQ!Gf*zj8ugqTh`M^AxOP5D; zUm~ z!EF4TvN*#|`Vm2U6k$Ta=TmIeDOXi2t2HmH$yXXI6eQ+VQ0%dmHdH?0}F{=eT!#31lYo*rN%w zs?csq=eLlyV>N*(rIi25E_-uV6Hjtouc*J(yhY=v{g;^Pl#uH69UiBin1&@K07Awu zgS6l2BZ;i$w$K&dW%2Xq0Y}w!CH+P4(XnFru`$j^USlY$Qw0DmWQ^NAAGwG-Smm8r)qd;+h@DXgoKPk=&k;ONr}WSEi;%rI$ZN8VO*K zql#A=BaF2eCEfi{WF8{>IZE#3`mZW`de&cv}s!bl*9+hJ(%wR6H|b51yjcr;)X^ zEz^A=NS@L%H4gHU{Hg#j0qkXU24{{?ru|GCJuG$=l|~$rfQ??6elCF5Yq`2mK7OTp z$6BJuandPL>XLttS*Yq_>>r zZ)DgF>d!{QZE0 zd-Hm@6Ggbz{)cD7(JGjB|KUU*sJyK2ZUEf%I|Fv5pXS|BjI@;KJ3WD;VoL1WN;xHJ z4lEu7E=SyMeN+WBE|n~BrsM2WB2?rTS?{JOsCP46MsAjpD}{`|)}76mH318&dac2% zyH1RSac*k;qi2uR(HdOW^CT~>lv$?Zp=u?ov=;bLT&~IN&0wqYb8`6w{SJLMdSg+G zLeKeqIN<^Q+$Vl~$renkGei{l02>IW^;Neh=DpP6N`BiB&&k#LDhx!cXcr7K7hgg! z<+wWcG3Bsw*418Nq`Fogo_wgLkA30r&}tRk?j>rj5R8|X3<~g%B3QK@vlGsN@6;2* zIH?2H0p)<=dVpIF5${(voxJo0ha8paj-x*n;)l&s+%&j@%{jT>V(3=D1q_~5eqcZs z+V(TyD+rHDqR=EJ{%f>>0&WAWI-hnt?aO9#c?1>8lN-@^(Pd_v(A|PtEP+xGLc(E= z8=!=__+RUOn&qU!0uB=I|U$IMlRZV%fCwX7gSJ8t~*CxF* zguyW88Axc)HZ;3ywCCO*T+I|79S3BJ-%M}tb}7zZTeH{36Q<|jM#=*qOy^6fAH}1; zOlVbAD&lH+*BG?U zmEtaBT0xX8qq4M!q}3u~iV+l$1jx5igb+hU5!sVzRS*yuL4rUfvacZm2?zvISu2Rh z79a>15Rj0Nu!WH2>3gN0|KL4(v_DvtJbCW>zOMVc&ZQ>pfJ+S1YDr-JoDZ|1=F+fa zj5|;ManY;W_NOKjqQg!2P*a9=dwME6Z@;}Ey%m&%@^ai0i?MhYEEcn#e zbu$_gPHk(mkA0Lm80eAQDvyw2~y8FZ9@sSQfW>mzsP#aZmZILvFlgYok^SZn3v z39S1365)yYEAWmKgK8V($!2fftmE`!liUV>Ub&j2{kdk-jb2ezlsl~xU*~koG4gWZ66SQ6o{;~}?_uTml||YS0VgZubmZ}1+84u8N~)I2fDkWo zEmxaI`)GpaHm(7|zx9CLM7smge-81ZM5MN}llZm#R){-54LVvZ3T|gtW=GV=pGkei zP=S%&F4`>^xOMQ8ZN3Si8EG8uh;oxcA&fpe*22qf!|ngb%oCAZ>GZ1jdGNW_(%F__ zX5;=4cJbo=AMJ#c+2XvCw;gj%p%iqMK}LbeI>$WgeactRshV%D#D)@T;nBh>yf;Ux z=|wtlkFNFz5{h$=*5@wG!?1Ml0-SQ0rL3*x zq{h6wX(EuuXRd4K4W7mLD19UKRC?|7zxx7P#gZn(Y0HTB-UO$4EA3_74an;u|H0W5 znFK-;U~klUgt|VL^Ky4FT*98;I)xuczE|+!j82tpF7C;h6VMm$5jWRt+8${01uYIS zs5hL&rinAt=zBljZrk8r8>00erZ4{HecbCPN$suqXejJk3ki>6Gt|Gny9Lz(14~N9 zN;IOMG=chERUf~WV`wV_0K<@SFW7`#O;?|9Sez10i7wm!W-B;Owtqk1)HQafE*}1d z-?Of=yAK>l-A1BO0ZjXBFy_ph(_AdWJ0Ow3)+Bi&HiEC=ZVKVYsh^#ZD+b1UQp~pl zt*lx%9Jj?2VGUuPkx(Uf6z`Sf!|C)gg3@{V9|Ev`DoQ*BcfC#Gs@8W$o|+hA*MCiI zvh-w{Kwz6n_1pdH4g+6b`Wtui(8nEhsq#6?ug6^hNuJ#V3s>Es>XNHm!@LSqz^C3c z)i=BzzO5MO+`qY%|3N|(Wp_!XPf4;PgS?N+f{#T$zTZRjpzq?>(8jG2 zI5D{bZA$mBdX&^n$jj#q#@rxd{?+hr<+iGa~5%6g;m*c;~|p zD`{i=y&;my-sGi+g%8mLU#o94qwv3TTc{eSl?;y+Mgg@D5({=}ZH1&;GBapo^)l2# z=*{k?sj+Y71}OZ2x%5}563CHBl|JyrZAMVEIrpGh4;)BG08&EH`sV1ZKSO;x4>B@X zUTn=L6*rI(y3xbFALO{S6$zx*5Qg;8fFB*T%(HaGPtY+v_VQPDq2$kzuO@MjReCr=IEc(`lbOHL8EDK!IWl+Y%wgb)kw$|j{>t6gC-#|m z_hi6)4#l8)6KW?Buoi9j9$?0u5nErVb%QpbJ^KFPx}lb@l;a+WkZRmSV1>+Ui8A^E zTU9b#>1#Eh3x0vfa9NCNX>7hq=H72vxhCUm)_>^) zVgSgDf5Zts?i5($I;X9D3GWq20@sOBuKLv1x^4aGB)~m*psg~*#C1+|)C)<_Zw_g} zUSFKq^@{oP5M6*(5OB6;YnEOY1?v!o+c3Ny-RpcoZCowHhM_gJs{v)aZv#UsiLQkN zn9l{$#4aX(VO1~FzLCgU+IGD<;X4jNJj9i5+^Qu-I+ptEhkv^izoiHDpzm8uGme11 zUlX&*wavJpz;Iv2Do&jx+Ck>DZfWI}Pr8)T3*U}=3tf$gi@F&s!KZI*$^X|u_cZj| zm+I$W^YwP}kN!qbNLS}{rz6=|1^$DzG}N`eex;~+s3-^S3&4+ey8^rg;k%_Ohh8tR zg=;{>_0|>i+9@ZKXP2u z*7o69YMo)ZuKV5jNvc&|d51qG0EVFCEIJsFvqIna5uD2>#$$6{W@FZ;nlrl#$v@x5 z1lFXe$XPK9VS9Ca73eO8Jts4!ld-MxV0~>JRkAqlLRr#)O|j+Gps2#|?DwAiK4Zc& z#zggbme@8bBe%jTXV#BCG7J^ADim`yEIa(ZgI(qK2AP=g{jqQ9Agwu)zZy)fBh~-U zcZ$^FTJ)B=fC;WTbpH7uz5eS#|Dn9hi$F~Zo27~C)=~Oo+SX;miM5-qB|Xt4n>Qz% z&@w;(r|b~CU~;r=^l1w(#nr1P4aXH9??B4E!EZ2yV`-yT`=ZpFKsYlCSql*I!FCkb z^uhf+twURYhU+)V%cGstI9HUn_z)X_Bz&HEliow!46vkVzE^*_pf)r*bw+*m3O9DE zTjDsxh^pBz-tnShG>4*4$!kySh|61Z3MYk;H=zq2g(h}5k~@>_1OXrKA2h@qr>+T%l4g0^rh%l=$cK(smsLwb3 zh#7Pw8Adf59!$1)&+&+qf%&!#VP>3TFG)c)TSUN33+B)p-pV{}>awjl<&aDKMb1h- zxRt>Cg$2jlWqRw7e6q}u8H&Ec^MK3^bt#8$4sg8Szqh@n10XucVm1Nqi~lLf3) zyy39*W9$SL*Md+(!px0h^X0s8_{?CK}{(u7%ffq zoAF3g&CMNXK8r!?zEJc0gj*C5M$3|=-V?KnyL{>WFK|L?$XU%9$32=U=yJs(*IxU2BxB%!|J)+hW z2sor3=x8zS*BF+#pvS;O*D4>NFYPJ`IZiQm8G4=cRGI0r+>Bn$6V_dxx z7gsTFFu?PGm%tT=kL+iZ0hP-Xl*6MTaHc!_5z;bZc^lCmwtj-@v`2~+OLi*As z1xEuILV*w-(K|cWQpEh*+r{*@P}YY`M)r@{cOOoOnT-vJM`Old=RziEG%Z=AJ%m#x z7m5|a3)Q8;0x$5`g-nk`qUIifKB^Ez9VGswHcHs_ice}9kYHeG+9b~_XcdJz+iUVe zZ!okPwG7d)LA`Vb9URHO?|=@dis+O{ZH4QFo+C8yQD4euHKSUiwDZ3pgLA#}&g$nZ zuvi2S9{!r3xpD9!$lJ<*v?C0^uQ@@cAUW1v_CVnk47rUd{Z5$?o}70n9y*kSn5=Y^ zYy!O%JZdXOAFKW6K|4%8CqQ3A#v8INPmgZk&AStu&yR?5!JT3M5^?)N&(2kdU7efhqJHNKv4f1buXQQOU3C)Gs1D2{}^RRm2fa#gPrb`H-0M zuFhyjmBJoZf>WgY185-Q%}hy_VYL z_T%29#*E4I*+@FP)Z;@fdq-^e+kt259UYtRs=$(guF?T2z8s`pO9_gLTB=>fwNCA@ zK1uwHX9!r_-F=T_@J-SehCt!DFj#22tSl>k@>IXS* zXRv!maoe;Zp2)#MQ~)H7TxMzywMRW*fWawg4wi#9j3riI+VA(rn}L>IRG0KHM&gQc z8H8b({uSO7(6R}l+%m8Wz0|(!HwHz2VT$s6n7+WOS9uT`>xT-|K50aH;KGRA%}745 zXFYzLSZLX+L@j?pkm7pPPInoISB82#2$JY|Q<@}#8*(&BE1GFJochD^*7m6{lqG~W zU%f$$Ha(9mctJvfLfyMcmkq}pSU&I~s{THPVi>Z~w&I7UlY>!#gPKvW_$4mJjFHzJ zU5)0w>iaD@zF(uhR9a%2e#L2Bc@u20*h& z;0?~RZuS?H72DQ0CNFz16I;HHxTD_VS)=S_EeMb9Ut-b=@B|1czOm^JO(+7RMf&2C z7`x>I)27mor*T3Wdap9HP1W^Z#0Xy7P8ZVC#r{ao-6O|ni#qJzhJjb}TcNPV#jC%G zXzQ%jTwjjwN;dbDYkQkZ#(rje>z|55jnfO^3eCRjcvzWEtkvdm`CG(v1II&RMI(E( z0Az{>EIg0D+yi05o1l>aasvBoz9P^_ZzF!^vf1=_JIYXVio#ZQwbo_c=m;%|V0%AH zlG=g|Eu@)3yl98t4YG*;_YbP~UX!RHPAq;WiSvbdu_GOrYATtcVa>u10dJfW-|0&d1eqUVUx|s{#nopQmZ-%n81jZYbOMO+Sy& zC+)&lx%&0;N_$+~x+V4krzR0&C-r1rOFVi+{yMKB2E+7RzE1nm6NLD$pOpFnad26C zkiW7B_PrIM;%t7rhOR9VMH_A<3TD9n-sIH7CUhUc+pJ>y75gl%7Zc02? zY2B>v4gIT|C#~Zb@t<3^z+0m_E0e+lSYpS2Fx~oZ`C>hgF~Qf+a2mVO3!G58bQgxl zo;xspx{Lc=6;_usQ_*`?=EiV!z6h>~aK&hViL8zS==BuoGx{{CgJulVD0T;VPyE&9 zkuYEM<$i~$3Ah*j1@bUFtal@OmQ6d&v9f(pKJR>NuZUhIwS&_LWb`9I1MUuOSyz7y zbhco!&|`M_&PJivr121^VF_3Q4wiw_)V&aZlXQ6)6K&wG3ombEm(#X8$1bOfOz%66 zv(6O7CcRMDg1<1a@mVu)Tj^oM6CiFKqwN};O;ha+JHVWDDgqwv6uOsv`VAV~aFie6 zlsUy8_GHq0s-45b$dJbXX|PeNB$3^&VEldoW~YNm70K_bmdwscJsKIrnW7Fg7KXBNQ@zC9BU#|DDH%ZYBOQLxzZz< z1n<1autl$)AT^rw<7(;5h3M(s54B9WtPQn~_vMV?A+>Ys9jV>zmg^8CZq5d>PM6Ou zm@{m>E4d}p2Y0wehe?ZJ-uM_$`M_EWI#kv+_V$+|dSdwP$&>QiISNinonFa+&BwSQ}aGIZKR zc6W`1aUbTn*s?@9v8Rt(NvTUknGz5U;#cWgG-u>s5Q4j}iendEQMO&|w<)Wlth21p zw)4{CK+Bwhi(6ercSMDA9Zx57nXqfm%#I%|O4U*|nh7VM2SmZAGJ7p|tgfJUc#G6j zy~*JHDJ+s=O1em#p!-99u9pmmc&hRjo~+Qo(-~aM_c8l^A}?2noQCT0Yc9O0%;L=qcyZA2<~ z1I`VhYC$koATM~g&V(3pc`f+IT0Y|YH!f!sl?W-^Z!}{85Yb)&GDNdyQsk?kY%j@X zRm1^8y4SL0{2d1@rCjNJsbNr4Q7Yljh|xMlW!*!XxFwEVQ-&o@8|^Z)iDhd~9@RiV zmfWi?S0AFRHvE(cGyFR(Cd<3Il*nCDj-72k0jmh2_p_jg1AzyfMLZXQ`rYVnYI-~` zEMVHzxl@pxl5sfWDS>SJP+Lw&wcDuo1K}i)s!oxX^>O=HR!>= z9$bH7h2|iu8`W5{#SM?FmVf$01Wse_IylMwr~OJqCo9@QZ_GV3RAe4}yff0>X-?qR zvA@wVa8yPq|E0|3JGx_ivShSG5V^CD`>sqqD<@uRTdwIX4@OcB@l$a^e z2Y$hoq9iRb1F32G&w%5}m?$M_`p+$rsr$5pZ(xhqPA=*znJ??`jzNx>}q#w6_=slQWjuQW2Oh5O^u8vV;fg?&m!;8V>v z{VX0TJbG3*B@}}q9kUk&JF*K{dIa#YTAQY z83fJwuqwao+`OW$^gmIblufI_Q3D%W_IB(%)e7>MEvuM{ptV2v3ne*dSrq;K`PHP< ze_|uA-I9{803U;_t+j|Ms>?AQ{SNRk!t6r>t~4AYPalm?I+Fse@ooBp3*PDsJn z@8zio_DL{#xUVsl`?uRedc!m?vt2MrdClBa27fr(@}}Sg?L)ao<;`q7$q`*YWWh6h zx|e0io~d;V7#ZW&0u};Fw;Vu^{6)$&40k*NB*r%TDESTP8`Vw}@~(PtL&=_8JvX3n zp5806y%CY4-raqYZwvh#%sZ`!R^U>&Z=uB^mrOD3w5Jr>*?WzyS15tD7>PyLu&BL& zB~}<#a(RBRJ)03fZRzZ~0vet?$SU2y$9Ns{>A2*(5XJ4f$0b?Ox=I$@X)-BsjCgI8 zeE6i6P5@I(+|Efj9ZfvzmjPeut%D4P$qqskQXOrSQR*}95`ez@9!?8_RbHscNETdz z>4K5Z1l|KS+YG6S^rY78Nml7ZP)XY|PNakjA4uxGFwJV5imeI+E^cz0eCF|DIItO%#GjQ-++tqpF6Yit>``k&rrg_33$ zHav|yIPN2+MKS2%wNp1Ov4nJW$iTSvFu_;X8A6m=0L6gc$c|k0nBv6x+j z_m$vL$zL5r#<1QS!WbH@-sIK)#K$K)Omi&n@~;7SxS`<5u2Q8xVs=DO+h`~N3cAPD zm^S-ih?KVs;fIk8n9Yz5bG#}_jQb+y499mG+R$Mw)%NdYR*PA^>F&I+lQp0@7XSJnL%RBPrJ$jX$~9B_It zS{vEmv=keSk1Mc(3PjWfE_KYuaQqw zG3RL;ScXh{`Jt0~N|WF`)Z5JMJ3QjxB471s87^2(mL*tePEhu!N}(;Chy>M74~kFuD4{6NjjpdBQr@YX&*E%PHhI$rC=iRhNk-~g*uxH{ zqS({#UcN)^7d!54`d`Q43NjhQJT(AkyOKj9*RW06!zZ7Zw$VYCx3bjk4k)5EZ1z6% zs#-|DbWA0ZhbQt-#<%Sc=Y*C;0AE1}DwKd{O<gv$*dp!3{Ld^JZTxqSnT&@+9~sktLS3+ z^~O|qMlpI4`gqFK()6~K1;h+aCDAu1_R62mH7$mkW&!9Zv6enz16n5`) z4_`%3g8c~;lCnTKDo&G(@9|O}w15B5ITVJ#Efltf3paD2W7*|XHIDy*87ij=2FRq{ zBN%x+7L`L$s9~N!$N_LT%v+`HESkpYyv>)LQ+brqGqcVCtSMm+C9lKc1|7nZ%2ll+ zt*Q&v)8?*+kL2}RTIR2sFwko`L^RUic{^UzWDZLJuu_q}oIPeyrD=9V5E%pu=;VF7 zj5^CQxsD#Os5azZZ>H6HVEj2Kt(rypR>M9E`O7Svor7=m0w1MuaeoBCWke!%phlOv z7*#x-h%H7-=;pn!ZCHY4LMmWKlS$JrsF8sw1;j}6|=4@P@-`YBURgfmP&zq|Z9Tb_^2O;Hs6EV2ho?{?OFG zaIsbs)PRjHf^iUDd(rWE44*1;C0Tv$P8y*Z*jHuj>db)31~Twowd*YeC2uJboeGr* z@Qmt;;Ny60frr{EW3I;{7a*@Gv*sw(+__O{YzDgMYy+S#q(t`bDtgffbEj$zl|bKi2O;Lc#fD0d}svI-1hUQ6=i! z5NHj&!z_)iTxXf2EsaQWDMQsTqwkFh8~!cVSeZ;Zn0r&V{eQA<2K)Dl1380hSj${H|| zQkBnC*`yjMi8E)x>FKlUp%LuXD2-!4QN0jpGw{MFz=PCtVls0&sqdd{6-sL7APGZB z>Op$c#(o~J!d{9SF$oxvS-(v$-94v$U_lsDe~fe^nBSNrg{fYR_CvHmv@FTNdm8YM z)+OJ+qd#pEF(u0N?WeD3#&g)mTf&!79eUdrv)Nezti^$z!XCvKZA$T2M<(w<+a~ev zsd&ttw}3Hz-Ubc!jHbr?py7ZwknEP(!$2$7Aw@R~^0u?}%H-XAyTo-vFRyxA zgfhI=4>o%%uQ32v1>jGRkbe(bu(x-nf9_{gzrri61*dlU{Jf^ekG0?C=x@7x?H_DT zdB|xwk?&$LUNr)kgkvH@EATy~J{@79(1tR~@#1Xi9b|Vz&UcBY{M`op1uS;hHtl{Q zK(04+g;_=SmVc5{8sX_{tNONBeX#$fWo1E6;v7atY;+~3Fk2NuVumrE@sPB;0C@<6 zXRnNdH$WQeShwd=c``8wC1;A=Ni>gC*|h<1#;Ujy(7;`RlmuOc_NnO8jUDiF8Q|TL zL+)wfn_-h30rvqC)hvYRtdB`GcC3YC&Sms={woINFu}W}_b-@ays~L`IHX{(%7QL^o@Mjh`JmyrW`x<}vV4Y9= zMOtU~;n~->!ucU zXa0>rMOBIX75(nbba6H%H$#+cdy>TGIF9UUep`=cgUW6Y>{HQv8o4QcN>w>aptXbvrrz9$5HYa@iBFu?#Quo7iMF4o<_&3@UIi`+$rjql zl^y^GXn7h~n>rZ~#TA{1od(;`B(GuyJSFXCG#I2i-=LFcwMpQ2yugag{beTgJ`90G z%hwVrV!q+@hlFij*I<7FKAhoDrXyh0samfbUv#T1uJL~JaE#ZoK1ot(VY4k`NXo;J zX2)Hqcfdnbr;1wPR(J_%OIaCam*J}W#aw0Bwh8y`App3ww(Nj#M^O6j-hb~Ek@S~Y z7?j@;v%aA~Wmd()jR;0phtckSn*&)tKL_`fL!SLmS1z~w%+%b*ug3Z-?kbOoQoj_p z*vdOVTOC2aAmBAy&AG5xtdJ1s(zV0&DjlwI3-$9pb?4i`9IYEdSsuMkMNhC|lgG3ck7tI9it6R|1i-5>0h z$MNHl#6>XNff4$cS7&zLeFwK?{~1Nz^wfT3{%X5@a(lH4#9M=K0$NgCK*g-j9c zH~8y8h5%2vcqhGzwaS1n{8ZD@SHic{IC?EX?m z){OMy10}2P&>zL1210n>mqmE}&@>#N{zhPvaJ8W!?n2A|GmKwatV!9n?N{u0Q!Tp6 zp4sO3L%N8V0uAWSh#i)J=Lgw4SS4?L7F5@=!sdJ<>1(Sx40{dTO5E!3rMypMl|Wgh zyMP-VYc|Ez{H)r?>-b+{JP-={E)~u6e))p_nKhO=Hscu3OfAd-uagKJ0IT zf&?3`iaV2b?%1@RLBvSsett4AVS489*s7j6;B|vU*=Jua$+KJ$y(8nxy5)^dZFJ{< zIs!zLA4o=D0>PA{-nOlj-XEZq0H=vtDf@ebp6fEE(~|JRaw-`0vI17} z;XW`yXO-_y=KuGQ5?ituK6y09ZMbj{=?9Na;9X%AMM1?6;nNzRg8dWu>v%i@NGxp43}qdZqS_16sbV zO=VL5D~~)kxu|*+j(=6t5lXfIg>4b^So}|H z&wZUS7eOPM_a;e?VS#W}@m8}3rI>3V&5$2UG^}75a=6jA(#=Uh7|mbdN29e(ULU_> zZ<}0X*x$vwN@t7f3!w`lX@_7ts6C>bCG+K1#6||oa}U`sBT3=WFh&Rx!l*@dRc*>9y^D4qK&&;Vyf0r6!GjaO}&&6<- zt+Cj?8)tsGafMeQgWLu>Yc=Q_!F&f|1#^^Ybp<)AIC}$^4z?3V_yYLB07eOLiIwYU z<@akae@5$jFWww?GGs8xa}ZCs2X>f4#h?u#*3MZOYLyVHo}gY>z0L)xo1NAp(y>92 z(`P2c9JX}qK6)t8971l{fX0PZ?@fp-^NZ+&YChkcsm5qw$^_2%0hZ*5)K(RhSu*)n zj1S2}=NL0#WxFuU%4WyB#f|sCLw&Q>XJMHhI05b4C_r@D%L3?6gCjgG&tu2?q@Qa3 zn1#q(xXdDTwI_F4WM)rRmrryBz#;I;th4)Qz|hy3(Ci-X@RcxDV&ewg8NRya*9(lF zfe=2Dj-T}DD(?vOkF~bDJ+;=|7;AfSpMzmIBuIn{O&F6`ikh_207B>)ybPBz^KzAv zx5{5+{VetjpBnQE)YPOA;Tb|m1KxfSp&K`W6;c3(0>H^D3rsnp`PL5nf*J~d>4w&Z zRc?>1`6gke`8m?BmC1gFr)1Q00D@n2RfbFI1IJ?9*ZY2kU#xcZt1cZM_xs**o!ggD z8rkAI0TY4Mq^6UL33F=P6N73*)|=S)kE^jM-sqNIN||@t99GTddbrw8_edxGz>y)1 z^!3VgBNw==>)lO14@e7`fbXR~he5F3yJpiXEkjnfCj2OlAPL$qI>`hiCZh>Hvj#|Eu3^OjP+pnX8>=i553M6`|VY3&ak&FrV}91YAa!ICi4{o zUE`zxQwZH=qh3#SWbH4>BH0dyLTVS>RbMZz{^E#{_3=A zWQo&6oD}v;+eT{-ovBajlimg{)Ep-fH=(miAJ+jAtTJ}XV9ATpVD|{x$^o#e0x?W; zWe)NFek5~iCXA5AD2Lz;fx>-bv9~k~^+3NX*1|1<>KX@j(2OHRE2VtSM}7kA%jKA8J8Bd>u=S5y_S3xnC-eb`Q^mQW#Cf#pV7@{;xFN@YDo!D{|K#* zqYQwfGseQq8XEfl?2&nq5(AsL#QvXlt;2MrMM=+LJR#YzUW#jC-It zTH8LgJ^BkDEzBolbAev2TaKy#pZV|S@LqS`4`W28BQwoItgi;SpB8YQB@Tegrybag zEPvdQ+>se~b@0{`><>daZ%1WzN0(1oZ6HU=}>R~DDz=37zOvP#;_;6sKrVv+!uZe zlLrPI7PxS9pW{cv6KUAC`ThLb5QiKx`9n0Uvsk>|FOzyJ>C1fQG5eIumYjBa+@+6?Za;Dk;6re>0u4QR4)eb`|w4 z{nNVPq%m|aM_KtP^SBjQk_3<&Reg1+PJO!|G*tZo0+Y1IVYxe9{w0BY0|4ll@r5Ez zLlR)Mo)2J~2L(mN=S0s&X4Ao^nGKP2wS{u+E84Eab4Zu9-{ls_u@%&gYk%7$HmpFv zl-a8fC)UQlwUD)pQ*_m3mPOg51-9!w8;`9y5=MRwV?dpZDA*VLGp{v-?-}QZDsU%s z4tMxO)oSYo^YdHEwfkJllOQeiR#d=fc-G1L7v{3vi;b48%Cf4U+<(;!2B>XHmcU0_ zXa7df9Vw4n(k1lKsFnnZUb-m&e%|B(hwq`{wtg=sTv&GMm7E~op1PLmvBK}u9({SfMQjzEC2re|Z<$pvy!i))%i(b(orOO=j{?OHO z(@Wn5`xy@hG`Fl=8w#OELR>I=GeGye_g7|8J(@r>b7>Yf1`S-g1|TGoN-8Ba67N79 zpTFG`in(ahuIq)~bR?2>9AVkTB73`1V}k&t_as z$JM2D^?-YHy7TNyb@>8ca0S%SbvHmUGKg<)N_VgQb??&8aa2ynoQ|Ga443W3E!ZoX zp3m~NYg5gvy@whG=abx1UxP&va{<~5Z*$C9o)#(CGsY{8DSe;V$XB{RU}Y&Mi(Wl9 z$ScD{zehGUxUWCK-M2u-KudqqRq>qHbYHg*!Kk6T>3PZ|9T+o!Dvo%QZiG^+VjHjI z!IB0~+o+T>L;i!G>Od2F_bTHYxOTw_c6lE|R**Q=noZBK7>vz6Y6&VDunDX@xnL2t z{pLRZL9jR>@)FUujizerY%j2_@q{`%8_8FDHel*}#y(`Ct!PI1f*y7G%Mql_^xmyaN+ma;N*7W|Fd#OTNdG&HuEKDvODQdb z)^PCmB-Xx56JpU;^Xl`BK^nV**@neM3T6#>PQs|n{III8XP7pDG-)a3*#|rMhF~fa ziY@MV-(l?LX{tE&D);gYde32)lUxY~!{2c}}PU(=7zb#*7s5sx<;EwciQ{OTNhBE8SK4stIH}Y73C`ztCMIs-Ie-%%8zB=ElEEdI{a0vS6p*hU*@GF}P5l9z?o09vinepbo4lWHG|^B(-jv#@2vn7#pb<}-+I^qF+TPkkcP=Q;Sf5}KZT?NXd1VK%FQzgE!~!reB8 znSTK19E`FI_|0tnVR{hm&Te_|PO(rUd{8ZPp3^c02#52!-+_?(025bj^ zk3z-8Oicvm9_hCN0Z`;{g(0o8Z2j*MM9(2h(GWirou%g6^)k%nd1Qe5=)bGtibBgs z;CJbSWX??h`wTfrwDeW3b|L>7$j|JeVdC3Q&?{Fd*N|SwI?K$k44pJnUntWSR57;G^2V}s{Due9GlNf(tB4bcyDIZMl907n}9Vy zm4u^{C%Yb|{^-7db~qT{89y6a-+{l7evrSss2)F1Awz~Qen1XDX6;UGu7y?Ab|ufbc0JFNbg)nxBwaUX^ zxpw#$YFR`YeT{7XN6Vl^^=3WdrNU((_1#)2Ma49Iu2N>}ie>(81hnTE)l?5Si2YT<`$(_cc65ef;EN88;2QFZox^q;WsV~Y8d zU_4Rd8X}?0sEyr`6>pMbS9GAib)93lA{9xls!?A~`U4Qhe|Ln3s`-GE z#k*}G%owSza6&C<%0d>i;$-R&wbWLCe_+dmL1K;b9AGWuW^Wo()kZ2Rr^il(lR1pD zb#@Cz*(aX%SFd8~9S6~)vvC+*3wMfKJmTP8MsGFW{fi~{y&G*~L-*d{tl;)_-PqNV zq3$!iu!@-%6V09{)7zQ+Ov%WzUPVw*>V_9x3_!I(kor5Fo#LvE>uKQ}p>LuGl>w*E zDLA%;a};Z}>vb{p!l0A_p{?**%M;5Mvy0g`9BN(~iV|IZhS9GD ze{(ng68+s{)ZeOX*a`L}(rweOwh^4>gFVGchjS*WQoEXt*|!rYoY_&6B<8>Ag)bo( zeRzGZ#mg-f@CB(Zgq(6 zG#jWMsuQ#HL}xb_K~ZVp;&=D`@}trUqPE1Hk1I~gtL*(0WQ~mB&ofS}m;U_pQ$Hv_ znZenA{rAQDY-dSdpnS%4NV3-Vg>p%zKG|zWbBpUn zPfo$=bUpMUWgJRuN%kfT?0(nVuS{(fh9|`s#)^6|F6kH3C7E6q;rl!2-lLu}?=9m8 zp?7;LYZc8yVfP(eehMS!U5GhEDk4lJz4eLoqxAl9AJmIXQo3Xyk_LyL}~c=DSQ(W`SKPo#`4?@Jd1HWc*Bq;?}?`BZ$>jCOWn$St<%|C%KW9+*j8 zVaiiqRz_5jb0)Bobf2C%2u$!B>;@VcGID166#86BWKp_Hyl0${Xhp7o7M}@?;3+co z3{TF#r!j;~b$Y(o_j8x;M$IR3zLCUyW($)uOPlRz z?JsJsUbSFxF0a%0c5z;N%1LfEM{trI*Dw629UoZc_jnt6p62A zGmg1W+^KOXi_jA(l1j9>gYE80_jz|N1Iu1_bD4EQYgXCWusio5Z!mRz?F#|JTtX~X zM0+y*X`wtWL7TKYrxOSo*zaI5|%{R;FF1X`WQIm7O!Hl(hCeM9p(tnHc z$((qyl`yq=8#0TvIawxJ85Ajy!VL#J+O^*i%*UXc$$X&BQQ(vZW-#~opMIvyj4TeO z9ZEyICATP6tp~{4x9|A6<5?<#KX?4chJ&|OR?%6CKNf!ceV0jW*#6691@q!zMT*GD zz~k{f1Gn!!{{Q>0o|D1fR_oj8aklm?8DI~-pxD@x-NMS(Ce8_eQar9Ux?z0dc4qz3 z;(M*Lh~CQH9TDCd^(YFbIZvfWS`IaWJczG_Vl_@)>m9V&Twh)lU580Gg+3i0e~Uap zelcL20R-sdx@$Rrk4$ilK+lH8FcH5?r(&88fdB5;>g{Uvu@6jn z^G~V2=N{w9*98S2DGeA{Cvq0(AD|OQ|DTQgJcIa&qs>GNKJ&uz);KAo?@l-Hke>L< zY6CAp|1y$noHjCG^yz@+%My+G0A!QrN2EjK8RL|r7(iNXV~S4CyGUQixGlsaucH!} z93P?JVX-pA(Ca)WW%6hU#c@#A_#ff*spg3%)aCIkDfyBkhJG+&&t+|{=1Y+lE1K$T z$U}yQTBa&{L_oCIMg{0U&;q*K5i{cFei8P49!=^C34znG7)jd8-I-xX9auz=fq0ih zJRea35!$sQHlJ!PL1j53ukD7=C4WI=d%D6 z1MJVYHQyJbGbW{*@8`Id3LKczOlX+nv+4I=7s)d_8{2KOQ<#cz7W%AqY7A!6xw=6z z>a!NK^3J;pHDRoed>qZW4UH=rtmx!IOauIm61Htkl?F|Lr`RdppQ-qGUVBPg(W|!5 zbrx5OiUeVOpLET@&u(x8Qte1}Y_565rvPL)0W4OLDHN7X1xR9ZPA$%qv?WmuBD&sD zrJsqC?6BLf$|S;jjCfPw)tXfbxYNQp<9mpGmv$tA=8Bownh4RshIm7-i_2i(_@G88 zuJ!}W!J7gmnL3H32QiPnWk#7UUlke7C)zM~i|w6Xu%(ZYt^)Dy+nsZBLgMDUjtT|v z6L`fbFUi@8hjQC`qdTG=%*PR}-Gs+Hvw+4#oHX+4Y5;r@PaK4c9{l;SuCw(uj;FOb z6l=Z8vnlWRu+y{Xe?cB?J_qp%I1{MP`_|KP(9V6~ndKOWG? z*vqQo4*-y^m1($%jnUp~Q``UC^1{kQ8EN@CrzE1b9Y)9|$ndkqrbKkDH}u9VApJyi zweP{~v)a=(g#7LtuhY@#u}ltuW$Oz1pDcf7qMG zS)=qis225JH^I`1KFfx(($!|S$3FhQHU}tQZ(NBxYD36*T*U%~7BnJ2x=^&ddb1%t z;L|+puy}we84KG+{n!VpS9zk4Kr(^#=;7Yk=E;{!1(g9qF)Z`*$m_{^(8jp$R<3lB?sqBuxm3#L#XL z!7wFU9hx&*`(E!LDGHZ>3F@o$oAT~~kZ;qmX@*!Q^v=}vBvP{#vY{ifKG@c-G4qL@ zCb~xfuHX~2jX$>}gTffeDpxW)k98D_1=%A@)7-}4n2L&h@VRr{ps8EnVG2I%T+9WR zmC4`}E+sv4n{cfr_<*T@?VJ42H>8cpf89~rqEAW~f`jj#Yu+2$X?Oh3Ek)u? zuzG}DM+9XtX?pu%+}1NNPjNkelu|XDLSS<{DBx(YkU>#?)Ji+BjOn6RM*!RGcSuUS z*Qcn2fS4Su2RX(z^@T08{xPoTWER^>V;V{d1%#s%9H=&G5O_&W?jxmc-!2|V0!~3q znE8`0-80YBXy@uJ?-jOOuNw|^eh#9oe<8p38;`IYjvdZ}l)p@iY69rlV%U?QorQty zII@d)pUOjvn*Dv`uNY~BU?ULagwOT(YzU2k4H^(${C1(S-JbiXX0qcaco{uxaKXyd z)G%snj#hM2VOrI^Qi)#6s5pkTpV&U=T25F{Sh^K)6&XSPKhoa(FX?>y1Ml8hx=o9>#j%|`m02z^mCK|icQP|0 zBP};jxn-tE=%F*FwxTo7fM?_s{* z|KR(>%;PbS8in_AUgtc|bLlV;;;O|IPmy0SZgl8V^qtUb@taISWb`2ju)=2%$p#g$ z$z7l*>n4gwFNIdMbbS`lB+Jt4*;WF+VX;uxnG5S(!DN<;rK!nY%3Xopk*J^H%D=@*sNb^VT~zGg>~WC3j@{(6-k z80tsaKNg6s*&N}aQBsE_TVDq2d@r;2^EbMSG@Dn}>fMe7!x+85j0g)2539}a#|I3# z1pyk_TAXdw2U|&9-?i2<9BwKw1OVd+*g2ce;dRDdmhs=R}^hnvVy22>HSk3cEs%Y@*u>kpe- zR%v+zGD^3-qb?;hKYiskbqM<|!{ND2+l>_W>j3nF*!!0)&zI3N)Gf}z6Mh{8O`9nM zOW_ywWfjyQ!;bz=x0S8?b*nQf{OW^MSU2Xzr7!Jl7$hHQ0PLbG#?`;K!7jl#Eifd5pV6-M!2DVm;Xx?gmld4APZ5 zW!Y4vg`ym6K;5c)$$Lo7Z)y5|JQ&9I>!(>S8OVW~X)A3y2_O(%aO=SVMukGYOIZ_> zT=iHg^s!ZOS1nmwQmr2^+qMwqU0Ni^ckU`nj*LXXfluG zC!fEi^-_@zW0vaSx3m~r?oN1Dnh>obMsP<~@vs;81K6N-9b0U>7XqBtdW8D!BqS7j zFECNg3fT0uDlnm_Q+zGit!|Mdqs^>T^`0Qyffdc7VjjC?DkG%S;#y0r?TF1T1; z>p}_GBzj0fw62I`Q~bQRP2~onYOmTLsnO;k36>hsCM~^|uK(|-*KNsQVql%F$hc!N zS4K(niaI{jb~~Y@B{Y`q94vJ#2Wk4 z2?(mVzDWG#?c^`D`e8n&3b^tu`{3(p7Wm}>w5*~}H2v3o9C^4Vu&1FObF60;NJ&(QxWE5Kx25)PKwCOI z>B-3v<QpQIyB+i9t)xKF@aVxm7-v^j$-v6Mk0R zzs$P95DKO z&sj)T$*Gr9;I;6Qu02iMlYU`A-hiWQE==?XL0Vt0U`g1X-|Ab}&=;lI$sc5fA$aL$ zX*0T8o|pGG&)#V0<@{^igO>`j zjS0~gC9R|}jU3msrh99Dn5Dv>Kra1SnBoUH^nhX}wZ2~CSANdRPFe<6azQnK7}693 z$Iw=-&G^xMo@&q6s6rYaBncaeW%fd!G&$sxRge$Tja-fzI;wE2c2v8nhMxgdR;syC00~CMCEGUMISqOxSzC`tbvB1 z^oC9zpM^?27SzophF08~(|2ro(gOWP5i8;=?NyN$wSKUI#2IQlHw3yhoN@77J~&6f zhj(OF5AEf*FuVfVf=fbUlZxPQ*|y56(8INBiPk`H;vS+|60ESz-_I8*57{S3=o(03 z2!xTy*v2A#u*W~!J@t2}1Ny$2^vkJ$hyzie!w_Txrn1Gv9MT)+7J6``jzu8J+^h{T zNs#GvRy3X>46vuEo#yZA`z@(s>me8Eqljg#0oT@I z-H%+=gj4gHS&L)`>eYwtcvBU-IpHy9wRzs6s!9QPMK^EqPN1#iF%K zwN@<2b5+E$fLCxyO<=1tI?r>v4)wtEuwm+o>!I4fi`1~X>=pc?NEfnJrgGS~#p+5c z;%3?r(lIH#Bk6wBemD%VGX<{VUH)x-FpQ~v#gDn~=oBWjJhN7Z+Y@OjQ(b=c*P8Se z{3b5NX|R~u@;$T|C4&A|753lm3FSEI>%TE$B4)+m3_{$*D)`t{f%H7)3*xA zV|hVk1E)R{lX8k`SUau=40~+woGBAMPoPLy;jQvl)4T6yfC5hdQl%`g3uk*M*56+m z`qgGLcIfrp*t-S$3h#O*(B?2)V14rR(@5Le7p~%zYL#oLI_P4TwJvlJH@wf;I|C`- z1){X&L=yFMEW|>^|65m(cyJmUk+l4Xqr<)7ao>81^>cW0Txq;mpWNV1F8Q?o@5*pN ziQ%pOl;e{;X9^`NBXJHyag3})8@+J;FZgmSoNJsuf1@k>R>d43-Fex85m{D_;^gW= zQf9yYP^X3ZN|E}@PSualJ=|w_DEB4521B$cBJ29eBN;=wh&8bNLe4Rld&VTmw;H@a zJXxzj-<5A+Sm^@#>E1PG#2hgUS^RTt5 z>;$W4w*BL`8~yY5 zk^usb)gk!Fn*DVLN#%D8DndHrm_`=?REa)setXf$vvzH7^+suzN{&e5 zMcm^bo)#?ZQPA!o=_W&l=F!6iR1~p3Tg$Z$>g4@d6*1z;H{U`(83W-b;zQosK&n}` z2$os2`h7lQ!-)vBRrI)qwEeYUgDf2e@kbAIS^|pX)H2h;diWVEzH0tMzNc$i1=nZ2b4fQcGNdi)Z?IY@pQ0 zbn?zMxJU4lNkmjr-u8Z|frB${U6xVqwmt2=sA>WC0KLP&*>CN*YS2L?QNMQDrH*^s zop^{+BWBO>e;;Ggcaa}zfx2i#js*&vl*84j3O(|l z?pumpPABex^$Q6~{B0^v7evu+P zSGT|l)_r{95~-;pnzd4QEw?K7GsgfQ(;9VE=>HYQi@y_ePD!0Bgh`3!33lAx5}xWD zs!>&Jy%x}!imFA%lg$1LN2-bbFe;3jJu432+;#yvP{qdAi4F>WsnP_aPB**1B&Rm5 z0g@V80KD8=fTFF5-zmN8!0B90vOBAw(Z^=o?dNBG?$-KH37U&Al$?M{=;de%QR9dW z);hFzrM|6))ld&P>TL7=e&7Pad=Ixeerndk&dk8nAG~T$!Rk4ziue=54Nl?bL-+{DGiPLBbRrYh{V#OO| zjc*M5a&N?v{G49}$*No#q!}n^rNc8x6l&e2MxPId#-`Cr{Rda=cnKX(4V@o|Uel|t zK3NpBgb0BdZjYQNV-Xug+ zmlBQ>1HVnbr0CPu5D){6uw7Q#~WLI`)U7KJD;xB+myJkW1nkq|0A~tPBTfvOoKcvqSQ1Eg3 zcWbW6TA#5I?-iGHxgJryNMb|3B99lc4(gw~86Y1D7^ySO2ZOO*mw0^-x#K4INY?KEahZ142Q0CtX zhky18z{T?kKJD+9J5cUQQcY2@Gs)z6u|y0VA1F|@571?8V+qdAy{5ed4fQ#bO$)fN zS}fpn(0{FX*>Fx4_-ZHA?iw$(=r_iG{todB)}5C70rL-{PtBU@`Acj<4tj<-;}_3l zpO^$+&52dMS0a5>dq7#ff2*=JJ>FF5bEdDsrc4;eCd3BxKe7CI^^VX=v^FpY-__61 zRVuSv0*x9Q?&-HZMxSi}-c*X4X^I|tX?!WFy0|rBV+>V=SGe92j9v3XpRP@6DB;xm zHVByn6hv9d{>o6R5c_3)-I#m!(#bF3EV!sbeWgArHA&LCT-(ngZJvDS$Oiwtq7nTx z9MF>!lN}YUo{B)h`g=F)l>I*_=-x>Kts2&qCgre>sTTv34OlgfXOhZ}vXJ{=`zx#; zhnaQpyYg47T)(bQXw4zT3p646@@RHImt$~YO!jZg65N~c3OXijV)EjnaoPm(TPpK7 zpw+Rz+JA?A$|;M9;q~zf#vSG#P`_&MU`;JJLkZgxZzV#-9pV)?X#}rYWQO^{z}eOh zdMD;89GatfUZVwLR55)V5}J^<4sPKMXfU0F4#pFRM$7N`$%>a?+;o}Ia@T2RvZsQY z^6}4g&b{CCnP$tq1q4__)&)aNG|+IO-^3!D1zQ3J!gzg*CX3DHlFJ&WER|ny4Ij)} zs+MVZ3!wG%dlBq!a){j!rPuRyGhU0LR`yZ(Y*VFYQ!6}W- zO$d%pGZX)XH9VnCo5L=*-%EvKHtcIrr9Wd$mEmEDU)}a=fSoF-_txyYOsN}+<35WI zN@<$iIs|qUYeeI4U#+v6@~$Xh#Vh(A`{LXic_uU@_uQiYGpcO# z5=0hROnyRIV;<#{dmuJ9lPq`Yc~_zy6Wwb1t&NPr_8;i8L2R8`E9l(+f<(5O zT0E2%F+!m(3Nv>imOK0FvXwMeNVL?*h#Db|`LTZhH%!6iCO?nd*C{Sq40;Nalo0vt zSEpG>>4vz7v7h>k?o~v==N@XljUSo0;u>tpvni(U0A<8<0}zrmgBCUV-}&9z^{hbO zmJo0Zb8p}scefF6oo{3F6(Q%mZ+$RRTwb+$A1R1l=4#Zb0XIDq#E*lbv6-*1A)xoG8Y*= z?chV9)%<+?A2V6+tv5b$blAcT4rUX2Tuaaqtj8gj7xE2RzAm`6`4-H&>FEA#(_&TQ zhkyvTT}f!hW`7+W>K5!Oy*w-G$26qR0{gg_y>6#fMRtSbH!Cq5oWC37rQLcG)Q&2; z(_e7@0@wLi!bxvVRo9o?Qoj+nZL5s`XgJRNV%&DAm z-d!e1dfM5mD#amn^QG5#+kU(zMCOgSs+;1yp`Ob6JhoQ*jfAi;(QAEPJLo8}J(}3D zx2iu9h)S`h!&p8&#Au#MHtv%Qmc1+(Yx`GU)ak=3o;f|oeD2tCK$r!-=6ra;!XkuEwCJlUe!tx*bt7r53a7;+j(x(&+bSTV-Zi-c z|FeG)OLwx_UK8)P`|*-Myqo-n1_}*Ilof9mMyJ!sBG;1AgY#oXtsJf>!k>f?bU#cu zOC9#q!Cu83s0z=R+vX&1`e8M)bhjr=GC1l(Cw>jR=&?Rj;|X1#b9v_FRNeL#UPPw# ziRmhTv=vyemb;@d-Q>*{Z_|e4u?Zcbq3bErc-!ftVTdi_uu-!{p8hvYa8XhA^9k^| zk$LIte&ZkPi^s4+?fW_=pBFiAP0|zLu7>?Jf1*0q+V7SV-;w<13t0r zrTQQl1#I?b93`tVKkN#aUt*_&T+&}o_UVDod)fhL}b{a1-9LIbNmPp zWIyfd=?sZ{At9*x`|Vd$QB>uzlo`mFH)H^z4O7Gmer<}Rb-No&zXsXoqpQ`_R<@RF zcv&V9ib`v`!>)KY)-)ESBENef6JrOcWq>Z)z}tFtQvG7A@y^D2Il394NT=LRV01vU zWFcH&Zai-8wIx+^{kvH*aSBy)Z0XtZKjy)Lcp;yLvVe)0#{J(~(OkCjGw+N^O)L&D zYZxE?a$#TLT1vJp4GF5+j8(ZMO%Wz*rlMTZUdX6e>^AS}Zn%~o^ZL!vcsB?cD8W(q zUTm?{0A32NK5qOO?`rySdqU2T-qh~IDm6^s_m@Bb`sRFIzcuF7bie30g~$21Mdor1 z+96o%czJ)!e7%5ok2{pJbdnU-a(?39Pc4^pf39Y{Ky z{GxUmZ=IE=Dj~e*Qk7zYy;(ANaIv9;1@#h0xBV};nXmPh`p#bNuiPUIjc3pn^&3c_ zcTLYS;0{3btMv9}PT;0#wLG$Xg0blid>C#$jBF8WP{93}-lCS+@R9>P){!rB^L<0$ z&3b%+pX$6>GB2Hvg!|dY?n{?(!U?ht}QX(i^|piq?|X>cGl0ICQO5 zY#CoqvUBa@c2>FUD_$#sb8JR4NQlFa{*WtWZx~Sjh>+Kj6VPrwA9*$D9bCH3CyNXQ zo-od@5{#q70V7$-&DC*ihWcV+kNyFHJV|*%p&Cvzd}GSv&zelqZ!5pFU>y!PvoIR^ zv6`!aq+BWtEO67P7TYyWr;%Qqh4RF22r$-$2;+8ulU*dyxDy%#DQWo+e z6cTy&f0NuCYf393g4i**IEx^|4jI6LJT6mewfhvyw2wMwBeKqQlK#1FrQk}E#j^qf zFNNkc#+ITXH;WgQbGS%~c0V(;0vX2FWE7un3b$|Cexhiv(>Go59);81aKgSu1(!g? zrV2*@yC2t#YTl7+3{phBqVP8gNnE;fen_Rx)U@``24XO%Dr89!bvm} zHkS;LL8Th%9dD87<^6M*2aWHT|^;o2@-0E{~K2ydnaz`*M46(&{1MI`zdz}91P?VD1;32MMjRh!*6-t(j4Lj$e)p9)Ypg# z9b2fmm~*v&7?>W#14bE~DMw8Kw1~_`t{NVKEy-i*<@BV)5Avd0j|B#DNWz1UX=DfvWy+2 z7l(ZSI9+K#2r+gLDu#X zq}V!=2Scc8$M!*Rm+!f#Vbb$?hUvR8oLDBu#La*q|bH_DPx7%#Q z?}!-+%*Lf0y^)RP!ZQf(63t`Pi~EZ@x+Qw;Km8oUhMCtvvf-A30Q^wGOPFE7YzmnC zb05p#ucj=G1P(Qef2y_LJlu^99F0kwky95s^%S5ji1az4;}xi8m~KB|eSV6#MW${T znewjGW&0@_JX@^#|9UB9Y`XCsyYrI3@(xKxlOd zId$plhX(y-1VeXxXT%&JEx{VEIk~+CC}ZHFb}KLfE;I~r^;s$!1KH}76~xXk`X{7HrTCygVIwcL9f?{7#>S@H1Z z5aOK8I|uVl5*72!`z@6|+Czwe-ESB#+AIa1Y6Lu5KNQ?8+HV^B`1a@o+k$fR2i*}r zTvHL=eMht>W0e>gDf9MFhWwU`a(OC9YY2!A*@5CIcSv}ZX(;wwL;FV?hM4$agbm)z z$fU$Q-Q-76QwQU87@wzpzHS=6pgyzXsX^*9p&+qnTEe!Sf1KboV z?05VwRS9>)jYZ=BlyDuWi0?n3I5DWPi2|prNU||ws7R0k%5r2D!$J#vKKr4gtLA2C zvNII@`wlILLHl7weZBs7g|^lfR>g3q-of3Jrz?^Ae=^kPticC^=$1C_r8)PaOtM;g z;;#cQkJ`uzoiHDL_xx&AO6^MLd!dFoDT-q32ospZZ&Xb5qwDDuY7H5Olh`6xRbcDg z&Q9Z^#BnO3=F92=ST?F(X#PFTyS?zPm}N98-`lo>QJ)PA)5-P|qRHZvhAWX$wEQq; z=d?ndgFAWy20a|!V#UxCUo88d{$ClWEn>oM%m5I-kD|JwR)Y-7#xiC>#LczbKi7FK zIt?j{R;8qOMSrXnCL4D#IJ40f*gP<;hLF8-h=Ui!OvOD8w#F zzSO_7v;T8ln)UN|VoAsNPVTOTU!yuVp!KO{x+ofd2H2E7uLB*cl{Z;qLQ>qA>kp16 zk%Me`yhHK8PypUlGte*?43u&|@R%8Or%k!Uq zs=-p{3bHX8cM-H3{t)#2Tro4Y<;N(Nk7pGvLhj2os@^!GL&-%xC#aqHwP1XLI--fO zjG$KC!IE?jaMt5bj-5Uianeh( zuCfx&4HLS|kSNb$AKcSyOijvqT+$_&H#(t+{@o!W8SIV1KPt`A0e#)6+)}W^$G*H4 zd({W7Ob<9aYD$=`Q3+?>NLqJKK5`@nzZ?OpR!ZV-eQ$lu0wg*D1_(fqVQc$7@rXLJ zIeWi(iq(YxJMS)JJSr%7Vk-J}LfH|6SYMR(J2Zo@-NqjlW=uq=T^ktcWnQZ87I%@$ zn2KbD&H9!Rxa*qTLg% z&(-A;bT3HyAB+n?M5|^;Jo|gT#LrTLua8a z-sqRup<)0-NXClcvb7hje`Oa|G4rvy47^1<4+0*t=a|3!s}C9O2-&UoC??M* zsAZ`T(p^r>v+f^%uU&6iQ$&ddb2LG9%#Ri&`84FK7Knm(P9MlMN_Vsy15%Se7LyvJ z?}n-z0`BM>RF!Oj-v@HtvW72b3hJlby=`1 z)a}Op{n1D4;|W&9_ckiF>J&FZZZx{;LGjvQvRg2e-$UZJs?d@X?Q_UkaPlO==s}fd z5vjKb_Wp>Qb=~CD^YMcaKxVk#(0ZRHZkg9?*La7@`X@Mj70`{GO$7;~iuGl(-^(^# zb`d%uA@~<@fI%#@zjh@NY^M!#0q~kgmUHnaDf9d?!FoVI-q#^f`By@cOWCXChs#z$ zzbO-H&?vAcx}ovWa%tI@YW1yoh*zs8VB)k&6dK=*+E=g6{QboD%C9CS&*pR!b5U=* z^HV^oTL+65iWM6&jHYS*r|~VjeV!w=Ym^M3rA_!7Nz=;Dl-prFXuCnvjHAIEU2m25 ze_TGNb>jnC5Se=BTQG9+x}d+BbJYWCFk(3a;=Qm*^Uf)qW3*i91~Tzf_#7F|x^nB# zBAPEa)5zF5UAd;dE!=8(Bgt00IQyhU22K}&@S$N~<2wBj*q5wIq~BK66F-$}pQC^X zi_DUFU#f!uVZqLkfuS((*xEr*6?srq;{G2`gI~JcT_=CkCvh?eMbU8nF>(IYsTk#6 zaX8pzR0gb~7TV|GBIJR;Ly2f;zuy z7E3RNii%vxaNTsG)#N!;3|2g9-(=DJy%dm6X`*k|3_f2)G|tE=ldh!U}k%&-ib;!feKOfXiTkLrM?$%4rky`LO2we z#@_>2r(4NXrE4ig9KB}U)BuXs9gH1 z$TYi&%Il_*Rp<@DDR^^VXxHUlorkkaDGNfY6*>V5`wV7iSH{%nkzN*9sJI1i zl^&eNB)7N?Ie#4tZt1>1jHOJsBS@3##`HedCTDzaoctfNzz0}19>SrKHGS|SH zNF0p2tvX+r@{Z)Jr@+y5+ML*U9rs9nK;Mys!;B8OfZQWhM_T6`Ju$tX#1SZ`WZs8% zBOW>WRV2{e^&R^DI(ROt;Zgo1&ek1%JEa`-9b9$t8T?ECVE(R`S{3f-CG*#>MN}nD z9|2dVEUPb*G0`xvYY?*x@u;n$y!H;|iBPp67}l8wT8ytr!ZL85A_AS?qWMy7vjDdo6d z*j8M?Uqh_}+ZJ2u_{8;dryC4DL@{(i_SUOOjV;4bLP(v>bk)~but$YfxI8qG`jzgb zMQA+3LXMgi#ObMIzaKoO&+}U>JzY2T-RXA=`Z3}J$`(;YAt#p%4NudYf;o9tkLwpW zq#KK7FeY5tJe&cRiz&#_{{Mb$-%L}ulqMvFa`zxlOt#Z@!HHK>v&5ELP?PN+%V|Fp zOiOO2d^ab9p>K#HSZvSljqgDDFUWdd)YoUOP*=agf?YqXY{GUU(#a%)x9-{Zqyu28 zJp<^B@y#y;$vK6wsD}{i5GFRwdr?g6XN0E8;pSeg5lojc#MbD?cl;bth(T-3^Z2&w z3q}7gQ7}u2+Bg%78nn@wtw?SrgFgcRK7X-sYq%`wY1CV#cdj%Qd6+=nhZ6o}qVmK$ z`BZMf%-2{{y4=QszUu`|44%ro7LB-6>X1Gw_zBD9@Uo$a-2RV-Qb>RE?5m%NSxyIk z__fgRIatucADs>(fIm~vhuY+#x=c?v1M}K_S+d1zFoGINXZgE(TQ+-YFiP)C=Sm4ZqF^ir;?J;kFZ;+FkdCg=2{HwKrN=3lLHfxtfTdxmd{bf;jFbDKhb_O-TiN!=hB7Dar1CoFrbYp@<3Q_C5lCq}Z$ zP)^}uBOcl`qP#Su8dj-`HQ2J({iZtah%AMr3pnYpBYy$Ntu0zM(n5@$7;!<+^;B6F zWF@9Qa(}xD7Pv+MJ*1Vug0_2DBP1XX)l+YwkW8NOInF4SG`$r~*!R z;C*Pwz|7XRGT~l0tC+gsDv|Sg6$wHWjN}&2NT|Mq43Rz&*ks(~7p-F&hk5mL0_dHe zCw5x(!WA#8NM7-d>Ab0`O-AkUE&1%+{N<_!kb;_Wx||Vkm#nB{ec2&dFLx^eA$I{ntV8`sbY!N=U1$3xpBTi&1BR!VMxNq1-VWPuoP!?x zCVAH9_D~B^2NuT{nVAeAPkyht2(KWvi`##wwmW>bptk|IxF@x%SJ&mR2Z9t%k0KA# ztvv!q+9G5w1eiuFoHJj0sLST8@Mqyb*xXS(Cy-v#Q>R#Fs{4Y0=(|34)nQJ-67gRG zH(FL#jQ3)bQk_OR=-GulHr5EU`PqdE8E91TjrkKHX#wg8PtBIxNFCi8Pgo3EXcz#4 zpEFO?ndolro@cBVDLw6rri-wa1HYM}0{~7fH z{#D0IL#zKmeG|$vt&(6X;id65Z(^A*SfMm$PC2zk!<{yTSVIZ8U9O~*FS%c7!6rYl zWPy<1H9JCv)|Y_=UFPYQw=}yu_{0@ZWE$M<2jk1K-D_(y-puRFJX4TWXtOnO*U6J< znqW@0q#o!C;HOaMC6I4KpoDcb4fVWw`aWpvyXDQ^_+zK-H0LnO_@#c(G};}@ z4pI?kkY<lWm|wn$WTKsC!zsL*fVA+6T*WERjH!J*{*B z68b|Q*XJnlt>u7o4g)WeV0UzRpjD<$o7Wr`N0_x|phkhL;71%PR+}jg`sU%QV;lnM z-Y^uZvm~G_g0W(N8L8ieSEW_=MFGJ^y}s#o3~T26wgMF`_32j zYlDD>JvF+&rvGDAJ(mk#2-<>p*xmcD{NS_;gu9Gs@fWo}HBgx7!j?lhEYW=!hSK*$ zfCDpJC1~p}0_?nl7-ycZYJKy6R9LV4GCb&B++j8+JJ2q#HP>LfN}U)<&1c;YzW0HTqvgkYvQ)V%yQ|6rZ&fAQB8 z7_XYX20x}cS^9aja%jL+mu=~aS`-=o@KU>7sY+Hzd+^`(uA3!>w>x&duBp+i`5NvJ5PrCujs5Ruz zLIf9&)_}j%>qsgvSVlBJPGnp?V?@V9bHKAdTc5M)DGY2GdwfT=*n*`#|GKDfT0%@Y zb?X?*u}s>_4!$Z4s;z_{H$J%{x@-8caLomcB@yLX59vP~og>EttDg^1%eV$TQeL1} z?EIsKYjKmh0q+aGusVLv+%S7yB?@4-icYtlVgy0Ky2Km!RgyLb)1DcDUbGZ zSd2|^veu&{?A0LkMGK_JP=jfH@ny@WEyfs+j+v!c**cs)gI|7v1=sU-K10zl@q=0N zH++RQ(YP-^1F2qv!wJku***&PJtP^Z524f8b@dIp$@ybkBio}y=KA}pBywfqAFK3# ztIe3iJooI!1<9A{(>pY#Y!!Qs1v{$83M2Qv#9iXHm&4ARz|!9&lPF7|3n8(^r@L0{ zlo^6rBR#c`hI7_2A6x*iVpOuD9o71r#iL@|K>wec5=`jE+}Peb^RFlvMQ#7B?J*Q`(U`gCP;4dHo{2X0pT3$ zGgXor!f}dc;!2<)tXD6>K#w*c!PW9pR&eTMmHT1C9F{+|08CsJf2Fq}A}*w8dYkU$ zyB-6Hq1FRX#zo2Yn0wxR*5BQLMo9dw+ZPUP56EY8D!%Y6;SS4rqR~fnMQ!%yy5q=y z#$?PPR$<`3k8jN2hBvI&*vDYdDedilgxNpH*6PBxdOz;HO}*9;7tGRC%)_tnLarI| zOnQ*!*bnm+)`Q>l-soRS=Yltf3W(j)cyN^7Ke#X1xqK#X&#(6`^Sd08W52?SyG-SQ zb8Ac*Q;J#dI=(A7dkp!2EEJ5kMw6|E4IJDNFN|?afw1ppPt?d~t_Ie;EoM|aVh~}F zLtai0BDi%$26)4b15@(TysO;wnh-B@v(r-4{=iRq^Ll-=8m(Aq>egkh2$bJyFrd%y z&>xA%Ht>_$Cx)704>MqSW`Q#(yy5~Ml#Iqu{kysQ4&d#rutR_&XqQv4i$lMTXTD1l zPrTbxAKD-o@sK}$yb=9Jq0(#Q9cu?_%9bB6Y%m*L0l>{0*s-X{5JzZYcCilWKH?Yp z%YH8&OjI2WPZU`{0Yqp!DDFf)MXr!45xuv@hsJ`1!*qcpydQ;L~g`@)Y$RH4OjxjB2a1 zv;*a#PAJLT`SWz7OXPnJy}5CGcql66U@QHO)y${Vedk)e-m`41Y*n3?d*-fdTv#3D z{9B%`(9#Fd1RIv**IUsLu{G@TbIZQr$`)f*p(lJ8KO$2R(sG*kn*T5R^!v*Kfl{Z>6ovXx%Ki9nh-hN+#-&p$BF%fSPjgxT-K0AapW%#A&D~3>vRbY+66QnQ0 zuI=4_BI`;U^FH(ZaLH(4$!PuChc`;X2y*^rN7;Jj(u*?q6L=6g9uH5ba(%P>if z#!}2y^(bPix~kQ^*HX^K4RsLxXuhl>es6`rV#VNaWCaVu*w!>YqD`^#A-##QBc{fo z5%)&#pp36k)l|;l3EZArMU^}-)Y5Ah>c5`iE2XI>kX2BNI(_qh5=}hA zK;ulgs`-kG=TteSzpmYVn32FF@NJb(op$xik&aQN1hR?vdMYgC4Det@rO(#l7)I0G z35%h)XYt?X`(s@XztG()p;S^}9|sO@Z1;OtQ=1lbIk+K*Ml( z3Lh{YM-!gy<&5B(L_DhaI<5a`VjmIQDd0+6d*Mo1|JWLqH>Wr?m9&L93j%d=-mvIc zY;WK$#YwgS_x^H~0yAIn=emh+h~yF&n_zp%{NT$wQf{Z{IZnCjR25sH;$t8ntZGoSoggUH|zyBOa_9R~^s9@Gnn zdrn`?1fsf=|GWKyN#Ks-3AJ8=lu$vmzIL|jucN!l1)qm9rV z>tz?(tzc=iO*N96I?)_}7e*sK1z8`$`k8Y3y%n|2ebg{PN)AW`{;B#-p|D?i3P8k{<7E12>GQJKW<&voDUENxJ<{$3;5!v74s4Qe7bw{>$q z$tQkI18+7$CM><69Y@*XPh7H4TIe@CP$2z#Q6&67vp6DoXQ)(vv#_%nV9WEJ^9RFlkymqpD zhTaiv`{%mpSKv+ui)zE%g&ZGsEjscJM5LU-qn2||tT@sB_#A5bO_LRCivE^k8n3|(8)w(i22rB^G<5%QA-Nqv}eEPp(b*3BL zBV}SnLUknwe>zYcqM4Rl+vr~4gq{e%&)E1X|98Z-^*?Z~c2g&y|LpXXU zG`e7seD8P3-y_KB_fd*U?Y=UtQ}*S?ZUHy3qg?D(>PE7}FUj>~eE)l`FuQ6ZJpt)U znzz}!O^mNz^_)gb!K>;Q4_WN}gup|JFJDMmW}f{^Bk13#H~WIBIJ}gejs=)KXjQ{P zJ+r;&99yeB&T?6@cCwnz`LfhzR50c+zfar}SL8=+&VlsTza!0&qq-dAYH)y2Q^$3b zky^SZVjC_dv#DFZuyPh+KVnA!fDoF?xybvB&EvXU$M2=+`BbO9*%-y!Dj{Uq?M~Ll zL&L2TWy7N}gfws1=-W^!a=iUQo%uS@wpvMJOsw8zgmHB8pFCV--sI3};yn;^hlpw! zo0c$XPMdnkIKdCzIj8C>Q8)To%851^W7N&$8A?`+QL>Nr#_#)pcu1{cyiQ*qgCCo< z2e}B2h*CVEhPAvDCV;F)eBCgm^9|gdLbaC^^;6!r>eML5lNuMJ%`pzYSGL_Q!QwyN z<$H0nLA1Oi>VV<@G?98iq0b!0q{f1mwkfYQ^_z4|HWs?cG(EB!D{)l;rSw(Z+K{c|lt#AgL_egcnv>8%?Q8)ieMGm~d{X<=S zrBW?Y^iz|noyQv;17^J2%J#4vW*1!|c06gPQqqyS8|3-&n#@9q(Jmh`V^0jTDeoXW zBEMCZ2^9kA>6b+jE6oCwb}>N zE>s)|pr$JeQUCnOBk-Y&_GYFd6KpAAw&Ig0od7+~|638iRy)8yK8lXk)Kf@g zcLVWJfNx}r(AE1(LpBb%5p45dzfjc%z5a|;kfMqWXE=5fc;R&8;U{P_IuSH-a6jbc zi`Bz5S?2h9TjA}jFfY^ztycl0%|1S{3PvL=g3OgfC`0e4=`tK*Nb^_o9L>nF&F9|u zp}JujoIt8`;MuI9A;GQ&Xh!4voZS_YAC^0|x7eGhCRM$j{sg!Jp$YU^$N*a5E>@)P z>tG}wo99~OqCI*KrouuGsEt*kRs`l;WkFCGQT2b$y3EqBz+HwFJFKO{x?!~tN74hd z^ScOP9KU{CzTI0P`RSJYaF3u%#^Z4`Q37a-Y25d}-!63<>pU@}v3mz<5EC(sqA#JP zC|e}r{6MOA+I-Kx?KpiuC!-tAj#U|)f5m6GKLsE{ArI&Sbz981)Ddgi`X(lPndI8y zBOqqK(-?_wfLwYgCUT7W$nksS?uhjSzE!niiFfx!WQeY@d>V9usk6Y-0kK{HzPZz+ zm8HGd(-6e^wEyd#xqL7L^NWg9h33Nse6eJn(}=sQs7Qv=*Yt6E^j|e;NUn=Ml?e1x zAoYGK>#sSnd@+0OEfk5&@%aa{MGDM){lTdk{`OS;8G#bhqQdP2x3F84-U;P-wtbf5 zJySLorz4t0Ct6i?!97}tnT*rdYJu#9osIXBcFt0vUui+A+OB2H1%Ten6XUIGhPYt44bcL#8rzF9cwSU^MR?U3 zjvk1E($Sw>#KykNo9Z`dns?tAftP79dFd+`BrH1rKX@0@FNvJo- z5${85laCJR`@0}&wAi!Prk-BH7Xe*X7JzdB7gfkgwOiq?{cW5o#(mfb`NR4waw%~) z1zl2@iZ-|yT}Z)L{JD;e{}-G*Z|}=VNUY%38Be+Fg#-~1uN4v%yU^M zcN>@WI=0!k9aPwibkq)g(|d?^UdpBI1e<~bFt_diMr?i`89ntcnx;7?ys~6u%IPYN zVTjrZnTG|}S{b(tHcQP55C~b>M2G~G(oT03wxa23*Ll`t_R7yff|>5L2*Evl@Z8$z zZK$nN{rxAxE{g$-HpF35n|W8VN*IV(xQ7}L^snmf>RRl%$frM`N9BCXRK18%6I`!CG;~VgJnN~ufY%I z!+9dGef*hkFZZ#LcTHVSqDaF&39c#Nap32(M<#KVmKH6r9iM3jWGS#{^+<@&y(kN4 zE2P+C2J;v6LaIihS(bU{H5;Ap4Yw-nI-s%3E!L|_J8uV3KF440TN>c*iCC_wgh+`| zQJ$C(Ey@&A7!W=W;m+pRI-;&9Bq*AM9DruulF_)pL|zZY#Vj91R_KRb4uVke#60kr zH``0CoZH^G`Aanc^(-+lWlX0vuov}{&)Y+z-E9L z3)o%soOBSfS55EcG*nSex|JlP&Q=Lwl_H2U{7aq{DSnzQ;H6ByOZp4Kn9!^8e>`8k zh0b)-y@&>DYQE20L!AN7ygU*Up*Q<^cwn_Z2Ln3ZQN5~o;0N0*GgUzP{4GJkp}>$V zqTy@4_+D3ABtZvB-R%MuDwYaU1Lvj^nYvO5fv*sRTVXrzszK!Lz<*-Y>6U81+4hA& zS=713of#H*yrI{$Dph|vyrDFn846ahm$!%BhC+*pj+DCNJT?B&i2;QI<)WoP)m}yo z(J@-Lx~b@>Ss?E}1E2&Px51=F^-6wF|6XK;3=bz;9X@&t+)ngN9Uk^rDR16QeD_V- zkdMB9LEE{^zZ!Te>Th8iQ!N}GMoC_cqD$ILAWElyUT*tW?FByqy`T60!`hoaGNQl`P0E88S1b(X06>~OG4=Yl zy$sX%vXPtK5%7G`R+uQq!qN)?P?vLgRLfd0?{&Gu0Go`ehUh9Za2lXEfN-z;!R^J@ zj;K`dDfuu}1?|?bz6?3!?z=5W#f_CDTu&h1AI(uCkMtmy@oV;#e~-Gfczx+aWN4a) zIKKv93s4&3$Y99)Yz|4S5{MBxbbk6AC^;Zr6mb6`zgu<1nnASc>wecGhF85d&YU6q z`(S-h*(FW>+Nc&ICh;9gBX(iv`!c1n)k=3*nt}8D>^()mj9`l@^ev-IbARx=9_zW~ z%^sLkk@lhw&ERbGJ!yO3Y<7Ug_S&B8^`TN^D3j0rGhL!QlzC+Y>3? zjSJVbUXY=YdI^ZKYn)-DUz1ZnuXRk?L1twQKTSk8b^xpbZPX9x!-Qjl40~~>7PaO- zCyYPI?CkV!Htep}_!Dea9y%+q=sMIp=fA>z9uuG59zKL*!p-@=*k=Ha_(Q;zFNYoE z&YZ5As;7a|lwkpBd5Ous;^k)8`uTxu8++nuQ2zV;A46^!(;t{v@kT@ZDRRg=n3yda zxRrPPMe{N0qzb(q=NpsbS9*Xk5{#AFICQ3>Y%#S^&)`-xCIjQQ1WegSNzv*VQ6sq{ z^EfLKg1aU-bnSa4Yx3DI^g(z5sK485JMK@cB*S$Y5m>svXE`8}#1bZ{PqToj@pBaf z*a-GDst!CEaoO9+PYbMSpmjhv;c6w?C_%P(owqx!If0W>kq@RL8R{k6RpG!*ksSL0 zJ_Rcx>WMR|BJMUS#o-q2s$=rQ{W59f(o3PdBG0(|U6>y8f?lzOyos2+RUihe7Vb?n z57rnt<90A+B-CUmXMT_X)D?&E>)lt&?HO%I4Tyve1GeGgPsrLdFN@iWV5ZXm+ckkm ze&Nz5y)nPfA9Fc17}(gGpFK|4cfbD<6ViBigOdh?WchPD5~#TMPdteHb6w@$+Egn% zL@BuT1??$*upbyPHFR|@8nfv9-k7Epqb-}g9s@~FUrHlzyH$otLOHb}yZIDEeF|d$ z$O%7EVN;QCHgE4jeq}FIc25$_H(I+D;L+iHFSmpH1&(6feas6hI@!SOi3zxxYM2&x z{MA`Q^e8_Qji?P89+1Y}@0c4`&->J;;)g}nP+GG3$oqPoeM|JUfhiXZ-HTU&6JfR{ z{VZA;mp|d5^0|N6hh6Y#k`(YcW}mShNHp+F8$@Z6KIB2A|Dhd#c; zgctJR+#HGdBCWF~^$=>}XKyG6XUlJ=%l!C#F+`g)$D>`om(HQXEA}r^dnlz;BcM`h zR&&76+s8jyHk15MF*ydg39RHU1O|&@Vz*bxfYq`~-uNZ~3h@3%zg+Mr29$|26c4Wd zq8p>7lm^8a;= zfI7vX2Qhw}mGi-&JTbJW)7sBlpJ!D{?S_H^&>sGK0$!OJM?KTW_1q_p*}&UlHM=kb zNT;>1CV(3&G_G!dc> ztu?Rel*92ub{pxa0gINy5f{M9hZRN84sOJQb2BtUEY7(;pwWgw5Kvu>ez{ofzh)t2 zrcQL$Em9M)=7;sN*=0bc!NpUid_2@fD!~q6fzi?rJ6){3>-t{)BgeqqyPdoa94|}{ zww(r91rXEpTG zsP37nKlj|?8DaoX;E7*^e_h8#z6{iDMTPDLfi-m`j(on`S{P3#h!?I|V&ADEGr-iv z*=1aFb7xW7N*3WJSc=JEUBUYP;cssf&?2jhE$(WYzkQV~E^ALLL92zstKdW5!46aG z;^!3KzgpF}$n0UuU#22007hhTE{M6>J>-^~L3{pwiJK$S`}iI9+|SYT^onTDkDD;S zG(pUVWTPJfn-1u@egB^B-8=XT>OOyO$+Y2kL*KjMq>5HKB(aN*XXv?{=hvg-_$Qus zMv+JpUUFck7^ke~hR5X4?U|lo#jU`-g59D|H~+%aO#nu{O5EWdAr8L!IOXl}1Y2D~ zVQND)&6nPxKGN{JBMV++_Dq8%0HM2mdtPL6Z*r%F!7Wp0AC0;nD^pe!y*q|xJT%|d z6J3rb*lpg8rp@-(qTmoS7{+kF72Zm%;?H%Z5m0oLp5!!Ifftv4CezA_Kw?v4ku)1U zU|EJAIB9dj5l1EdfxO$x%tSk40j1D20xTk69863aAL&BVaXJZ z6{XzP1fjgnCr06l9yV20NO^bty0M)lgBz}2ty~O!4z2PmAIs7`?tC0CX<%5R zuf@j(t;W34;SzbUKS&tWsT5Xyhq2*@ZQ0u>x!PMz{@w^4bRIiC3uq&}22=QU*`^ z4Ic&@v3X0W?2Mr|+lp@Fg=a$;wlM^tMsj$Z+QJUB2^@31Qxdmj#kcNdPyP$BVF+$! zq%N*aPE}w_sn0bb#$z306;3hz)R2~FQ>!k-eU&oX(~f)ss2g>@@5;=V8nT<@fI&j@ zQg#+g|IqGd-TNS{2b#=6KeQMJ?%!u3?(qTG+18LtZOP7g^rkAnok%QP6<$t74xzQi z%Q|Efzl-vv#Pvj+m7j9FphUA^7(7!~rHaPBPP5_GlYrx%Xv{_{TcIOA57MC-=WE2t z2Z`o8m7NS)#SpA8BI}LdqBryku#EmsFG*){c@(i#Mln}OQlp&$hrai+y0EoXJ`~{x zQuW%EN@^Jm__@)(`k}p+c>Z3^^NR4CwjULCiFC#%lT=b4si6DVp3mlxmQo}y9v=by zgMZ`#ae?w3Y>`WYrUd5-N|I9Nrkmy!uB2M{DxCRcDk6TvRQ>&O2i?AGN0St;6T^1U zur-Z^GN6PL6}6~k(TcAc--P(PjIbh&O@+L%ucC9!R$%al;<6`xxJ}yYgi1M02e|Otw)dO+eBVC&ZCH$Cl}IXX%!$pC~yj&?OLd2jErjmK?g$uU+Zm@gNd%S{}S zL!Q9bDW41E7BpkTDrugj%F?9YlH>+?A`LG2^Y6ojPQ=_0E==%2w8NJ?1WVvx5S6poX?03#A)e z!FQ+6f5PlF7?p%OhP_stk@+bjE0tr=N`+QCVAb#-wi4%;g^j>c{+YLy6f4(|)%SWx zTspne?R>fz;@p8?wotH0ky*a{L+jO=@gVZLpluZK2~Kl++^KOlZZQ;e=g>(*#Srr3 zmxp#6mX^9&=Mfr&my-I^v0UgQ5G1=2m&RJ~m564{SCsGj$cD{vVn5BNqa4Q*)XEpg zXeWkd{WHcC2$#b2c|s!op8eXB+EmvauUK&rJL4skZ6qBkJzEJh`FpzvYfb>eURsM)KG^umQ)-@8addKz2mVa zU(}Y2fEyhD-sVbO>NIL~##%t4d`VQ9oU86jZf3QXfK4EngK9AV;#e3SaZW1dQ-5taib|mtJZaWg9+0ko$ z&2;!tnO77kM(z$bHj$=DK{ThK9&`u9IpM{8ulyiQa>u9@>oW-P-UN4s+8lft92Yj~I1W9KgaPt^U~iSznvo81#(atI{&*~M*KyT%(kRo1KD*iDT@?w&;KvFLWS(nO6w zW^IGaR!JP*mOcJEmQG$HAdRjIVoUWN4|RjGt2Hq^X8v}~4u8g%OB(|L^;_!NIlZIb zPvZUIX+b95_5?+&6&^Lj8%2=qL+DmB$40On@9er46F`#dXZ@gXn9YG#OnBE=9oeqa z#ILbYiCHt7|28%7G|ZAhVI#*wi`fc)e;_XKgWg$XqS&VDdPORp67npXIQNqGX_6|2 zTFJ4oBVR`CyWpM|y1?ek97K!X8re$&jusD-Kf%8`@Z(3gwU3FHcmJ4nNq3^;lD-VJ zHj!#bay~hRCd2Z&k2?@O*dF~9E{#bCH64GX(%EW6n}i5@w`}9^opQLquC-XYKlNa~ zk+upUul@BU<1+@_UbC!=iAPuNi_{64d!cMEQmAUio8Ihjq}`AflTR&fg>6XsxYbkP zlCLK)OQxkA(={uwm0a$xOFt;A;#I8DPMu9&RD8MQQoev_7Mk)Vj|F=DeWWd&A3NgZ zDh(i`x?=*L8pQhmZ-OEK*(@BXbizj&lUJ+qKdCQ*_TtE)qfx)g1_LfpWiOej*x~yj z_sY>LKffV{zO2W8>NYd~xuJ9MJta_OqT7$yW}({TU|-d~nRj>n*}6*Yd016MU&(rt zrVoyIuiK!>$d9A8>^k*W<=SuM^q%sP{YUo?^~^SXOx@3t--KoqGi7Y+F2o&vpt+Gx z7?>tp0uj}@xp{UZ6P5z188yQJ#H=nOv?^s1qlLUB&g|pt3bv-&rdGPdTHj*U?^u*V zf}wIQlucDwBXwGnS*ff=og%Hp?a{m%N#opKVZ3*&VUC$hsA_ApE zs9^f4%wErQZKU}0QjlZ#uOC_X)uu{MJOYK(W>ziT*k1T9u74D1u+aP+r-Tk7#W_mF z`9b--*Cu~~hcOMB#z%l>+Qixbv9=#Y=-NG`8Eeg)1cNv71F8v+_SA|@hSXi2 z3?!NfRt(LL8g}QxJ7n~bdC#1akh@yzZR~_0VVffP$Vdg;V!mZJb!XfeZ8JjIXKbB3sk`f1g+5G3aW@<{_KlQQ)f3B-#_KiUpCVnc<60EFH^}w71Db3WlBsM<| z)0$`2XPa`Dk5LC>SM=sHJ}Ln(sx%lbU1xrYPB!en+hJC(x(NLJs&~#8O@4}Ay`t|@ z=gQuLi)}7nIIP0m zY@vRsiycAhEniDcYHsd_zKjuAY8#q~T9YH5;M_x1gKjB4eYfNMgO%*sP}5dnRteTK z)CSywDu9uupy_xl zO0p!}K6GjN!i+knrrL}~FqPZ~nl9WY>|`GS=|2gm7L%{qKf=0;DBC`nGhP6NfQg@R zMbKtJ?=)xRzFQgMJ#dvH$X)P~(rPLR2r2HHh8mgzMb`Jd5#WvJNH(u$$iyU$J=*W$ z5zx&)X~_IG^|i*`aOZ}cS^+;wIEIDP4pFlOG7KJ4*PcG-_|d_n12$-URdoX${FC}Q zib#27_9d9-pKy)04lgQ5<AB8Eo1Wk*LjV zT4=$v>rrJ34K*ku@OpoGyr~2783AN`8wDJ(nJW?>W!`gY85Bjs!G=EGZUVnry?RB9 zdk3$Qmao_Y6azP33?}k)q{~$zUfH?(r5DFk{ z`gR?tjU64#-PVd7eooqc%X`u>2xaW9i-5b#ni6ajM+=95#h>CwpUuO=#Df|p)5m)y z^*9z%U3-VcxomisA$m!h&4;KYhj)`0IxrI3vJY7y$1Kb4fUfl!Jcu|hW$+@+0v6#Kr=jB<%;l|!EVK5 zb}%=2vE@jc7P5$5viKY=aXaro-ADaik4Dv_H$vs3PP@+H0Ud`IPxG_yW%+Avt9^v` z6ZXlr8a5NuS6srpmBrAYKiu> z<-h1GfeD+7Uw8w4*g30=mARK2_+}%&>umC;hrgE0viXPQo;RpAy%*4G0<@i=uaRI} z{Up8k<3yTr}ZcEZ}W>);%dh4p;Y#*5)PQ{kRBbrU@?T zPZGoOr!72d__R~?FEYOZ-3=BdAfq5CPspbHOSK+)fzeRq;wWjj+??_C4Wh&7%<0rM zq*l8fE^=Af5_zlci+9U=OlEJnT1dDLE0#CrUUa>BGyW!&xC(Z@Y^3jvVXKna*p|8+ ze+>*avts0)>Oa>xz%=kniI2J%UsL#>*x`R^5Qucw=F$j1zq|vD(C@voeGb+HVB;$8 zCCj{3k#(ak7TAZ@3$|#@zxBw%JJUY=e9pi#NY5_ zED^&TQ2l(k(akPKg`?UvI^Uu$5}Pq7ZagUQk3-t{8Q$lGYFJ{ z(J|19#aU_!w8u3!7cNGr%y*Y?S*Tf$Gu_K3#;O9WXF-h0UvWdpY0k3;L@_^ZH?DuF zL~%7ec-MGfAQ^i2E-Q{Df9++5N3iuCTwBjBRC8BKHgyAKeTgP>1=`2E_r3haF%AY- z@_b=^cEA;5wre6%SIwUHR;JvJ!8}afrfK^XJg1uuDr~Pd)C-`atd3+;`;v0-umd%w zibD_TsB42&+{b*JQ}1#q+j+Cn{}uML=Om(BIyB>$BE6RS@|gbleDZ;~SgqNZt8i?y zlPA&6wuvaiZJt{Jp^87^|_t;-#(NfeSprG5Y&97L@udg@4p%qE7QYw7xp4cg}mmKF;66Z?sSaW%naO z(k}Mf^2;|Ohr!`c5FF(gtDve(TJkKp5*>0x_=2Fu`Xofx2S4hql727}66c@bKbgYq ztIO1$r!^;U=|7M<_U2_nHgZ^MfUl*oET<*!kXYvg-o@JWucS$}&&Y88*!ebGUnVHSbzw2Y6rB%vHF#O#2UW`k?S!7RNGSk{m-G1}#E$w}e}^5L%6 z_Xuj_9n`MnuOg}O1Z#n5wzPl3Fid1;d!^;Anao5Ja&eVoCK^xY5CUmWdd4R2;PyR* z5T3dK_*wP^|J|`{&l{-uz4Y@rkQ_+FduZ_LefnQ{^MA*T%C-&b{;4@RLMJahBQFn; zwP&WKDDADqZ&?}Zl3N|a(hL@H_eCvKb35v`@NB;?KZuAUzhCL0a!28x7S6y$F7=h@ zGfpv7mQP`S4adJ)?h@jkZQ^J{Y^~n{$k@4Bf82H6qmM&=Gp&NXhIZxaJ7b&&^(i`y z=3?_r8G1E_(?i{o+$H=hdZSgt{NHq606#9-d>EGT()*30sHGVe0$iRGAr~bvyBg5D z_3x+6x4c6pw{OW}1_XrD{Oa%4ljkWM5NVWUA7ny>_2n%{U9aJ!m8%i1pBcInhW?;o zslSm;!}}j+*ao9p*KX9 z2t28mJH?6CurKo<3x{e34l;V*tBX7@Z04sY`RLMd>XYYNJP?_2Mx& z!5^DlvHuS?LYiG`4;-5fE`|QPd?5)&rO*z*MB)j+k)NR8#`a{(UJ`$I`6N6tdr*IO z$5$p5D^L-%4x{&z1i9=x?$>!3qq#5hDZF}8$rzbvqHfo1Rk0r?I;1YYG(xb%9pKz% z{TOm%_Ws4P`d|5TP1yRhNZ49<<2@(b3%vHX_Tp8G+L!PYJb8;$MKN9OCu^}mHevB? zR3PYjrD@$-9M3VJAT21aWOW$tapA+5`G*h@)FSDE^@+qNe_4&g`-7k^~1c`dj?czN*(ytM$YgI!ElvaROfXl_(< zPDaWSn!Nh?w2%bpH{|!!sh^?Kf1x|PXC6i~X+Th0ft28gd1iRB9q#19c1ZhP@m-ds z=n&=8jDIZU2Kr}piVeU%-HHxmxmrQj#F;nJz^8up70ot2?=QDLtm;kPC|Qb^_wq>i zR{sR5R9=;B6^t^t0I6f1nuzy+x8ZXgiu`eNU?5F<=Bq*&daO!g0vVQ4)GF~WmQ6xr z-Pg$*Rp!sfag&Z2YvsBA+TERXATNc>KwADlpm{u+dvT=eL2~Oy{AMX(&EyG_c(b)6 zd3vHVt%FyeY1uRUrfV?qRNTZ*AFd)`;x*I zwS)LSQMssSsz2}RY^!(@u;2z^2Kp=GFVHA}clW`*$qP$IjqGl0tZqoreveUXgk>8N zLdU$RoAnt@g3kpsuapa7-uzLm>kNoes^WQ%VTGC$;#CdC@rB{$nEU(1Tr_bI!z28; zZb8ynA{@C!yk$VC?(dEFLi|Yh7d%78;?~}|4$NHJwtR>lwxN?Xf>gADVwP=!? zS5?13gj@q(Fnurl1bC@o#}oi(19Xb{6mMEHV^E#LW`q^5-iXUU*K55h80vn@O@0$c zL&}1tX|lna?nQ7D4Fg2omoAPh_<)uJ^E) zo;iEQgMT?TFfi%%pX*@FkMpM+$}+vo2QkW9tn#4tEsVl}cs$Wa0)d5jnWj9b=H>0c zr^`0x;`22P>1Z$8ga5CE2BXoo9IuI{#=s`S!J6(lL-#1l9%D6|=L2decz$R9;)8MSgJQ8pX%LorjVK)F0&`Icb)Nr| zui<$QV&4@!s(-0H^`xAzL;ArXHrdA;3vp$zb6oZ{?Js40xYS%2fuD|^gs2fZR?7P2 zLhh+R0<~uh{4?u~WvP*!@cF2C`4U7>bbjB1M$aU^gz0Yq3>nI^TDMN;ty6ZTEXN<) z<7o3)fNMKsqz%9VRvzzr!`9Bm;#zLh99-Y%B$q{VJ>8{aWzBTq_Mt zEu)5`$@*MU)c%PlKu=P@y#wwqWF3zk7Sy-zf78+rRc`9v72hsKg1i$_HS7w$%kb+1 zFAeMZ>pl7+d!%f^-JU9*iZA%=1Fe9+}L1KhP`}eVs>sB1Z>(BzlaZ8C&DZ=74jqH8~HQhT^0< zE3n*yBWDv4zIWkcwsib-%;r<5WnmrU^ezth>rKuWWDCz1N%>j8JHv{!977+rUHyK^ zW!tReC>Cv~HZnONM;Jaq_|XIP8D54DJ(1B~Xe}1uphp_TWDAmxaz6(k&S7hq+v~G) z%L5{SJqgp)p%7@Ww;QcD$%aR)=$Ccr8?H2_e#L^;Jk%8X&N)7cJbIkPKe;Eb;A4j4 zgnowvlLk98@Vk{Q16#Nz-?HH`wJB`W3*n|RdC&JyV-zfu))K!4bCiPj8u&qRcDt>1 z4|Z8XirE~z7c4I@%s_2%Bkg}9PNKs&+RZCq$3?C*C$H~;j76kcCM7wyUwM(zX(WmX zd5`l?DE!{8dCL3Yx0|=y5P3!GBAYWB1-zb=&?GyKh9jo_2YQA0n{bE^mV;&*q`MO|J&$cK@#!s8`8^NW?w{obVE1elyo;8+{F6&(QJ*>!3n*qP zd`1QL8CQXFPj$+$2h~YZ8B`6UD`)G+4DVWr-9{^-l?dH%DD*GUdZpjF@*7bl5%qU- zvY8yW!s%`gbtBTSbtB^i+K2~3w9G7-4gPi~#zlsQrgIGITQt8~>S9N&zWp8|!X~{k zDL%>O(Na|Wuur83j@06nisLqhflp=XM%t5-BsS8b1Gt9zd4oHvrFvoMI2h>p_ZDSi ztibiD9=nFMq@dfQ!EQ~$dP7e` z>flOt9(j#pi?t!m0}UKg*L`e&�odG=qR}5$@PBfXUu1)o}-Go@ZMzmhq6ezRcY; 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≥rDjE0--bh$Y7H_ZB+@H4yvIgzl;d z!bx`zz1hZ)bKE-km&2@aVM*E>V1{auk>s4_-mcm7{Noq{sW<}g7UYVh>+R4CF3Jmk zjrx1l=e^4Uc?vbyg|I6FqlEJUOlb2ijf<)BhYaTx^BI2KnQ07ltbEzye)8A*J9uaa z`Du45=xrEjHqF$PyiIz`rire|HH@~H*x$j0s#muH64w}tvS^aAO-xxO`lR^kfj0NK z(CEo9wq-cR9p(E!6Hn%#cM!a|JOhj7xf~$*qkKodXBCC4gk>idHpj90@W=WlHosB& z7}zZV$HdA*CsYTeunIm-VCh+fG5)w2K__bW1)X7MuH?GnTGfXMd#iV4cyal%U=lV= z1s>1#XY?^-&vWFud^=_0ilDsN(A^2XZ17V1_GG+;S9QDQrcLU~?vJ)us?-sx36!}KeN}}ezRfVG{e^j( zissQnAhj53SG_*fuXYCj&8GLc^Etj_I+J;au7%}rHor!ie6{9a2{Oe-khs!YkYD6O zDxPg-yraFEyaeRS6V%!1TS~{13QqFk3oh$|#Jz@&-WXqafyb+%qrBlE`an>v7L$&< z*aOkUR|n8vHVwuTg~kVXtnLQ$%&^^E^by>*%e+s=H5cTSsj}MLXIxZ)3S)7Py8`hf zjz|K^{K%-OVljL_Bb$;g@mc-%D)bK_lD}6KI{(XrQA8S&;gr{N3z(}(8B3R{Q?<~l zL!Gb$138db-74wdT)z_ty0%3*q)H(+sjH}UcoXX^a%jfeY;HK^hi04!`NW4A&_cDGY!*@50I2AV!A-*50=E=zcH6@qRXCxJ z=+wy`q%#~>MqoJh?)gCL_o}$!$=H#k=l;T? zowca=)8B!MUz9E#J{&K%&>sk9DOIMwUK868xuKgrVx1s)vsusFuqs6pyA4%p z@UqW9KB{y;UIl`!E z>45H1doGCej#ls%bW-Q#y`2UZOSrqX+1cE zuDkPv=6j?20~yG5JM!DPEJs)Sne#bxDNfgUI`SchSA3;SgAN=NY?`nIdlJ42Yb?W~ zx229G>ozPycD)bM;w zcmNP-%L27mvMg?x9Pi!{w=+9Y#-SM-{4y+1hbPHUe}&2B*NCi(!l^O-!FaV3#3JnN zuM`>l+b8SXHR&6PO z@vYJg5}lO~G&_{Yt)v7O8x!h z3KVmZIwyKt8lM#qUp{ry1ffcLX8oa?Gz7TngCk$nUKKQ&Tn9?m*ig&12A!h-7NK0O zV5bJrrU^p)LLD^i)a)+t$2NhA?L+ghi|I;NNx=ini70~y^?Up$uv2z+F!2PaZQACB zQoa*(f{>vH`?f}YE%sg$>(}Uvty#TIiPAlA=Y>U?>Sb7MSG2s#_J^}lavQR3vsXrR zk|tx%T5ZvOX2>6+i;N>-EDdK__4*W598kpyTOdtGg~h7>QzKdk8BF;uEWZLgJfI6n zANufd#}}T`jvAqI|0A$>$2J*dM#Y<^L;n@(W4cy_MAg?;m#4n2*;Vz2a5$8KWl1s( zsS9G{a*&VP>$P1bL&g4jR)gsuUkNX|+RwVpv5-;fycdm3O*p?0^v4626|`5VlMli* zSHm5u!@_QWBY|LIxCnZD1KQkc3*xceJ}&ct)$Ib=)d)m-gu36BzvL#bOG*8zx}a+U zHy&N@CzR$ebp8%~f`pS%fali)XW<9XZqh}SUEUQK!1+z^|Z$U=_T zP)C{qhh21)Jzn%aGR3Tm~R%6%6cNrL?h(1mJSNJ^UCbk*T&Ca1!BV!5b z+_r`I@V6)ucifVIt9VI2q?`;x zgUlEJ5<8k~+QA48?fO=hHtCfoWlx(Wd-z3yc(T!im>#BwT#I|=bdsTXM`e#ogt9Hw4oe@`MW{|L0?Ldf$iph`9o@|W0i@Z)Bg|(iz zd89+?G4iwd%iSk&a=Kt0_FguGR&-$8brUO6P;QA+@&{|fcD39j7LX!*YU}9dL34yG z14Jnm$_&IpPAYZVbZ--cO*LPRFbjo-x20Arb`sR0dC6OrM`(d(K`c8p<|)C%vTa{y zUefE$69uDg?fEsl&Fk&n3IQjWvm*GZaxZWtk^Ruu;m1~3olx$(M*i5ee5=PtPXnQf zkcaCjk6f(dJw@(v{%_;o3ZKVkBUF!L%KJee$nOp++5=Xsq4re|qD~!9<3wD>(VqUM zL-S@SJ-RFytr&<|0z2i$068W2xr+U|ulc3UF0Ij(jjv=>I9s}%DOzTZiO=mNbC!qG z+`Ps_$osJK!W&bbS#@M2bCqd+JB~&Wt+?(N_G-v&{zvT+7IvPxeR7MU^>w`kx6=gvkICNu+wI@~@_49mFBccc6VMR02n*d4Cquy` z!M^LQhpD`UQgmhIvRnI+e|J(uN-O)>DbI2tzO;p^?jgdp^2B5DKKVy$!Mg78`hy7~ zwC3u%vCmPET^W1>S(wl zuO?vBo~rlzy$U%m(p6)SaU7M;pUm9>bfCLsqLMA9{`)50?#a~x-4Xygm^64~2AV)w zt6{TUYP|zq(7i&&%^kttYP5n#sFff;#={{NMtuRj&F5wGpfl(g#>6#x>07Gq$s4Oc z&nj$WOVK3}HZe+uFeIJ1#PBWyKfmZ?ZsuQA(&lGfF(BmA#WWv$^dfnS(EqD;>;8>+ zh+$jMZkXuWeL7gN{$6YMx`#p?8`&3(9P+hI9Xz$qS+UeDOKYI40egn8QN!_>&1sN_ zD#CV(_+>P>mrKXzfcc=i#-gq!WYmq`=b|!uZRMdxHFufP&CvB(5H0k}4vu-d=3k0^msLT} zyF;;>mE?ZST}U(2XQ6`=UJP%YX+;4iW)ROqY|~s<_@}LJ;z;+jPXh!qBt@$Uy2?Lz z*!1|PFfLzYR#@Ml93LDFvn76Y-3>f-qa$U&q+NDJF1 zqW%%YxF9EId)yP3SpJh)&g0x_b2KFRoKsP4=vf2mI%3mp@x$hAMKCg$y1Q5kme*=M zd?86ODe}eDI=V&cMzE3af%Wr@-lK_L=1F;5R9~N?n7j-Nsj}%Y0($!C!>YLg(f5 zzB|R*68svYvsW0=G#1ZQ=DzZ)@^=yOsaW;5x^~7AXgf`pW}c?LHu6f2X&rBAUum z*O8G)9v}8+s-rK3T_E5Vh}*-nm$S&&NfdVwA3-CZ%Z&pX?e5V%5xYg{liKoVhxgX2SUYCkM!OVa4-FK`I;%72k;Mk zx@@qH8g>Xm^zL-?yoPnEN?h=vZkd$W@AtQ)<9h#ImDlBL-VL$j=?I3orkv$>`CO%f zo>(~gD%OeptkBDeXtgMQwzcZXFiPE(1975=@C8r)V?|p~$F(xMXvQDH;OAI) zaf{K*le=-u(<1&+pmeWz*2P_~u}zMEIW0O$8IlK(TDup@T|1am%8tn{$%$tU87OZj zJ%=R%E9fa||IzKhAQX%i&JrG=e|kvzsJiV+1Ymb8<97OfH$TELC~u%_HRR102ffdF zI#F*S`C{Xn0j;N3eGA*?$EJ0ZOR4{(vQppaqKcx1l0R#GC2X>ITdZ>MzI{qP%Ap@`|}ljk!mVDVNSPzm7X8|Ws0ZK|uR0HT>Duw4^o zq}gLH_=UF?6%&+p2})|xJAK>YV~DG*WHX&1l-TOX%1Mh>LlgjvCppKg&X`V;y9Aw> z>hT%~b^JaEZ&lVdGb}vM&Uxe$`t9Qj9-pzW9c{8Xl0ic(H8o7{7<96MDgW(bvss;_ zJ8JD?nRXUrv|R8sX2cd$?@)aCsfL}4U<~Um!2zGm@8BPbGk^8Y_v3{7*dr-LiI@UQ z?GmE41Y?c-8fLSzZ8qCsWUyH)fX&iUJ5Y?N{rxL=pSVrF{dKV1TiTZE@nMFu=o9B{ zr742;95cMA9sX~|C~g0Tg*s2ay*n}x2Oi?wRvW?@kN8NL5C68dG>I;G!~DXy#R5A;8%w<0@t zPLYovd2(~$yU58dzJP~oiqKW)u$`PlwzH!2!0qH8bf!Q@SFraCd-#gASN; z3TaW?5QkR3Q?9KnGPnW4KC;7*zgzhm~Gc|F=ej6L+#Z`Tz&l~#ID3e?Z>Jb({;gR3K;tvydJeI+r+Ig) z2LA6T!&|xu#G?NV$c%swdij-q{-xJ$SBm;pKlr{>^MgPYQRqJbD(Y9Rtg$lxH^t4C zZj=cxc0NE^aKa1RJQExKUX^kSvZk+>sS=Aw#5d)Rex;uEVcc>dyfcRyO&vlBt%^ICE#INebDZpm&n~Q24271f|UMrVgk7imTIOb73*T_Z`Tq zf&a19f2`(qE){r0f6~j}n6)IAGGL*vWoWMf5CdbYk4KcLFzzRRex8uZARWfQK z!IuGs0&}qU&u8NXryMO+F@s)K^}9%q+5=+@anenp51k{RgM)7f?qh7e=fm{Fh{$NF zp`)GV1VB)v2i9xP^R_$03}`RNcKeTjO9?efT?!w^Rc~%bnH-_sfhF$h8@hGm;~k~k z^9NKCB_B#4mfISbyZVPJWshw`q z@5b6@BJF{w_BG#J#xcO#9R;^KysaD9U%7!9f}vn}TiF)b>O@F-U;B8W*LL>-L}HQmI`WPWV2 zdjHHY`nI4B_BUNXM!!W_nAEn3G&X$2#WE_Juu{i8ekKBvDH5k|SRuz50ETMr`M+LC z;0y>7E~!ur6eIpThintJ-(A|IKUcu`?hef^k+p0Y01|`QuVv%q6Grw_#`;oR9jwdO z)qu=dW{_-8O<7ofVcvyX&P~0Tgwl_tIrJCNK1&&UbJj zO~acMI)W~r1P?sJs$&qn1rGB$yf#_d;QO?k(50G2H)li-bmn?vx> zB-+rWpdmUc3_skgRPkH6Zwz^#>^+%g^(E26{bvRz>*6lWTdQ%rW<;0%O|yiwYFIwh zoNR~J(ujn15luxk_pd>f#$aq8g3M&D834m{#Ejsb#{y{eS~t23#I-a95Ms01ifV{WF+@>=noqVYP z`u%RvY&fOAm@?zTSEw(_Z|6hsW_;#ZHBq@F9ftlQ2Ij1>{te`CdHU#m)5Vls$@TKGAGaQx05TlV}0Dpgf}P(hY6AougjtbGL~$~=mJ>d63FQ>7S3bbi^6xYj2LRQ3& z!iOKZ9-Bp*g#AtlPJaNUpN`X(*D}`;jK3Vc!?NyLth1dFT@dM7bm^=nJ?Vi;xZu@5 z=Y8R>$W{3xf4QB#K}5DIBB5VPE$go{uPO~}Cq_AO7XA>)rC)t4w3KEzKOhtH2})`I1BcbmeeeJv&Xap~KpHk2*@AlFOi_m570Pt; zOIh8S*Vw+FWkD|l>YbrF7?%Wx56bkP^*a5a7O%Z5o&167TQ+CcSZDgDn7Xr|S{@{z znaj1U3BP8PV(i>g_Kpu@e4>ZY&^aW!=-z-+q|DTSDts+~{F>$nrB8@pGCkIuMmEUP zIMuiD&&Um&<#p4Ngp8r@#jL%Xyq#_ueg1BHS|O>zFOyU#WBjs+oCQ6}O}Bd0Ui zPvY%XuH4i&jQR8UIMd)OqMkU{4d%WbHan2PEk0nQc~Ie5HIO-d`jiE_tsefNiC%I4 z7pPE>^&b|g2D%TGU@I3GQ;3Sl`zTcRpdsG_{35oxtDeY!KW>6#=r*-(Qxy=u=n1U^ z8V|$03A*$oP>oB11`!WTjwz6@*E{<8Fa1f+zGi28({~a`jJU(FUEgZ3lnI8R}eNcmQUIm_>?-!pD+q}h8D8&AWj z&a(NOBf#?0eu@IM{{hy`!FXq3KVDwR+WNaAt~(5Xf8`E`Zg5{A_#uDcZ_a3+G+FmT zTgdCZJ>(}E;LDAc%$ zW^M%VYq@n9(!QC4JOj`l_NxirH7O6{^@&Oxvc7H9OU z<7fDq)xS8nB4{?8t?R>=w6+c2@~J9h5X}cxkNm&#={O6GPMM>Mmrt`b2$nZFK(a{U zW0Wu0*0u0sHlp@G>}SkFI7%0y{-883U0v+SHv5V*WMD9{!uct(C+xOGvsLJ++mm`W zo4~GxhFhNWyPhbc8owFHIx|?nxv70HsNS;+uF6mtvS&eki*2%sCDP!6d5|G&#Ph7c zYQH_o!1k2AMTs9$pSuJjs3iCqsr9tVZ-{drYkvR6Vsap+qH|xJaZ$pF=x&sumt%0I zTCj}2kdEk^2$(ckTMSxpO8OB&d_+w2Aky}b&DX5RA|SUx@=Z z&qAo1&DtD-^2WE|`w(>L(gm6inyby6f>&fhFbrDDH(i~+Q<3o-a0yD?j!r%zEVsEZ zq>>o|2iDC82=;ub5*AtL!NmLhmlT{#{LL5{eqSA3>V5Vc(oW}1ZN0GE@EVZ3s1oYu zf}g{ND=I(O7;JPQj^Z=STHaKO_^rp0bM2K5|0?!Xagnt(^;iXhO>q1S7k<#GFGBQ6Nz3Ta^%3*=B93I>TMdnVK!vhi1;hBk>tt_IR&S zD__f(8bKFrC-<+?_hL|bAzIf|#>Z#jH@yXduK-t6n zWCmUC-8-))EiDn)Ilw767LvO5IiR-U0n=GFGTeco1lQN5*ZV zv=EOJ0pQr$NnWZtMJ>v{C*!1UR{dhI#m9%R0;G*3vlOJQ7+2v`Ko!B2<}Edy_J$>C zljD}O#)m4OM*EBD;9;b&28BCJf*xw={K?sb+x||Sl@IcoqG5FQn48H5YU2|pU1hPC z$^a*JG$19qcd$w|#{qSynvX*F#<=Ty)x(wfQ^|D?SW0NJ=3&_Mk)ff5f3B+T6 zyN@(nq9cH_Gf{FM;31n%%Sh&0m3@zEdqDNP)o`a3wLP3)O$DN!|J{}7KZ)x#C%B5$ zGzTA}Bv7BI>l|Ob(#O9`aJGkwo~zPi`OJG%ZoSF4N<6iHgy+!H=cmx}@YP zBp$*;BnAB%qiPtbQlbo0ez70>EIRgcX(*Qf&|db#S##Ruv1plXP%Q^^=MLX4?5Xz{ zoqjn!L!>hUp6Wa>0Ex4NoQm@eJ^KcFIKNO1R%KZEG#d9S4?HmY=zjy_ne8Fbu9Qwr zwjw;{xUQ7BohYK+lHL&;r?c@FDMZd4T&mP)3RBi{B+-o3QptpO*)o5Q4T11CjfqNL zcFD7`>^1E-7T054g60Dtg`1f^((I+ig{-DyKf2sxHAj@-+hMz{^+Orf2SXAy;j+t! zwr0lS33&|oF%0h@cG+Uf0hgJ@_;7^EIVZ(?zuM{^c(biYN38ZK%p2F=g0Oji$e9^- zG3)IF!y`QqPn_D)@$OCBcZ+MsN=qaA%U$6#g+uWI&Ui@MkX)DOm}XT8r+>|cYRk&L z8vJU!=B8N-Stp&^11o66-k2))CaeVeDb`dv&F$XPaR3e@IJ6fxZs_sq+?&=I zn@}YK(%`WfT)7u4ItMf!vZTzUNz_if!((8ENWt4k@+1^1d|=b!K7)EZ>%g?d9Y)yc z$+G6MwaALcQHTmx{JP(kZ|Za7J-Pplw$6#Jy4e(?ON&sR6dc#Z0-tdu$k&<1bG^`d zri0S5b+{la0&as*Jx%eki2r>=@F4MsD|T+DV1huI7b>@C3+nC1D~*Ti=vjla ztI?}7ud*j4xZui~q_;G${QCyBz&AL76oa}pu4@;2@dtm~bcD=wwO~n`!lpjf9=gUKQmM6@O(NDz*ln75hzUOl7QMf6Z{gXG86oXOe7YD zGB@t;pd3>@>ihmcukYG;L<{Zm@WWuEOM#8IoFdE`Zv|$*;IwJCoE15o8r*%->BBB+vf?VQxQv13NBC#b?da$?n@- zn>1yn2V>4D-Gh#TU2*S|qw2D8-1lz4%hOsECu~kX-pEQSal2>e<{1FG)K&klf6i$` zDBLT@E`1&fb`5Y|Jsxjz5kD>2>VM~HN=YY;RjCFuK&y9T8W1zTBUmWVgK{c3n@PVK*tCzg4bDKTy2j1 zrQ$QYoQ!^Q+kZ?JzaI<9sY~*mZ~coSwRi|zeo zosfQmP;B9!7J|(oV$ax=>ZeUGE5NG8ZrZlJY1p@s8q-K>6ewqLpKF{%NBAcc!Up&h zug3UxvapkG@{VX`cdXsYI^5MHT`UThF}fqVv&>l>^qA-Va8B}TB$ei9DzP!xNtzIP zbr#gkV7 zSkDK8+Pz9VuQu%T==5!%M1pNKu8wm`TM^h637?x;VU#%Zf-aJMS(#qqJE{E4)Us*! z->cHCs-PlHXT=JBqL`^9f5w(pIqpn#7Uhe9yv=6wGI6TKdB{}d4GXx4yNd{80|T8_{UYW=1@tKE=jo;B3W*f+|5MHaAyNaey;bd@m^Wxn?PC`e=X5Ll-ck=F}m7 zM5d(5amvwlOJ4I3et-jXyX4X*=6iuCH!S`%v~(6ywfU{fL0jLYE7mtMtGQ{-Bj`SW zBr^>9ynylm_c`u|vhd7N8;-NIT^X$W?eV|gWcYyipuTk zo+u+#zO_O@ikDecEog45uT&y8?v?AROME|ehr0Jpy7!IM+=G{7*vYaA9BcJQ?Ttz{ zhiWaS;(aIERoA6nx;MJ2xAUM$bi=$iDI2ffRVC+A{#C0m2g^Q|(h4($p(yVM&EKy zGaDHa(=~hNG<_hz7RC3?dIQciyZZlZiaIdBc~*wIR|>Sz%;LR(EXAMhcBT_CRe zIAI#1__E_tvuQWCOArS%B>j5MAqP77@+LsO&qzBB%V>{~KF9$kv;212fMC^_z|;X3 zXb842TYq{X*On$6LY7VC!wSff^5|nztM(WTZ2>t&6EDYyJ5gSHtIBA7ec$CI9Ia?B zS);2L{P40(c_p>AY-<)a=$H^a1Ulqt_d#oSVw+=fEEnAX{kdsoZ?pKRPotk}v{hPkuD2ep5 z^Yr4sG>}g3`@Ly|+Io!IDM`ib&8hz)mK#A6+|Wf{SADO5z-v2NLcU^O6J?{yWpH_K zN?%w8#1fwffdBR{hyGDNaiRRoOUG3rtH|liOMWWO^PXn2)}F;AG&~6jt`9R=2$F#H zh{g=(F3qXptjz~C{bk*L*rd!W^8w1E5U96QeGG6St5bwQobd0 zu}ZI@TE@#ZR2Vc>; z{~I2S1bb={*+@Qlsamo6-bk&8m80!sv7Zf7=3(yy>%S($)_}2AvE{;A(%x#ibWY^< z=ujBH2e{IdiNks_4Gv(SJZ%!tJ;}$TWftE1I;?jenbaCJ!?*?%3weBmOhAi5uWrsG zQu*rnv<&F60(E5FF!bM>=CRt;LQ$RuEHP}B)TUkobwoUhm8gDC;Qu( zK}X7DyKhN}stjrWvYVfNLTo+=|Jnza?Y{}s>ygz9MNz~J{-j?-x?h-5V9(E4#oG*; z(oEM+LGlg0%FbSx$d6MBdP5&cQOd8O>0<-khcS!a5%2zR0j*3(8$u^~X4{COYSC+2 z;tq$bhr}=rjx$I&eWU`Tk-9NQg`5u z!``RL{t6FJyXI><`&aZ9bw0zMRT|6IFNBWFrv!@W2eK<`LUPkb3O7IqY8b-(Bum^l zTu9Iq`jljPntz{fSI}gjjG{lYdWQ?*&Ii=|!&Jk~zvUA7FlS%>(>MW&?AJP2b6p>O z`v{)tKN-*ZrPPYM@OAd8Dpe+4Nu1hV-|{>@>5}>jTsW^RRaZ}zf*xuk*`W<8v~}-i z${p9m?BOc42PYG3ewGQ&Wd=9MmyvfCTphoTdcgydP-g8Day9JiW}rH;%P>z>m_Nbe z_vT>lNq6xg@xE>c7=}5D3ZcE6ycz!sVkH)6dsOW-BE`{kGWs_vK0d>A3hXwf6tI`@ z-O5hQBN3ah7xQKPYeJS{_ebCK@oQ4P;ByeV8u1lZ>ixLz>JrUq#aT~dn<}9T+50Nd zs-@}ft?~YG&vrNvuv=nex=-M^t<%(jQ$85*!#v(Vu@p_qQm3kv##e6oQ3vcY)o&-P z4Gc7PB8_u2KtIYzyQA@y?G5TP(~ei%n}HDl4uJkoWERL(lO~61t3T{D=C(a1`}?Vv`GSCJMEQx{PKc9gP!~s@t|Z z>!HH@Zv7q==55-gxnVgynH66M;8`)(WPsD8H9GE+P)t>oJq-%yr{jFHs->ORwGwX1JqK7TP%Tklt zaSell`%D9yLvX0Z=VHpo?C)`_^w}x6nuomY?A$?>eQjZG#c zQD*he)?p|ZVAjvk4^KH*!S80QY8Z?Xb8-k6kf(a4savOZJ~O;6X$K$@Vaq>xMw{#K z{mu9oj;ab%A#YXwAP8xXB<{c~d}7K`YL120xDMO!nsQLVY!qx&eeR=rDBnA?GYLJt z7UlQNjjkRSeZiy>PTlj7GS3RY05eAINQzTanj0yGnQr1-JqN@|9qHx`=r@RJY}-0TJ2g|P8GeQ&c8(*=Kl)`cq&w)&l86k_m-fDV<|(AT_x2nVurDSwyhBZ+D!}qf-{IFj$y1hC%-V z#LP+mL}gmutx{fxW1bwRF*7!)R$xa5M-w3{!l0?JDGr}Yu+7G-^aK8YJY1)K)ptrl z9sHtR5uCJuTT60&Wvl$k{l+4mcqHKHiOtJ`v9{N%+w0fMk31V%e-f=QXhd{yF)yPO8{n?jwx8O30<=I+<#%=L57Ielaa^k)$-KNz@IV z$g$74-#1IE%a3?AVH%JUW-BLynGN=m`*6b_+Y^D9Vd*&`r>Jm$jd{L5w5wzd zrp%zJe+@ey%+icIr&}{iy#1OBn}9x~zQJ&#F4_2|y*x%r{nMT&Oy`iU`#h$!YLhM7 zV%+~>m<}^E+~-I5PS3nmn3pT58nZc)@N|VZHLH{|@yTcTcKhfOy|Y;p`hu^(r8sWK zZ|mD8wrTyQr$0HC(BqXi$KFqq5)bz%<{eraCjH|>J3_N8q*GDuB*)i7gPpyMBt#VT zn~-wK>|2JXw*QI$MMsm6%Kj}@kp_uneyW7_(F=^}C5*JA{)#)qjIY>vwa?_VS+gu& z-j0pLFbOFx;Y8V^?}1l}j75%fR1)Oi8*AK`O|tdZhrH_)w!GrzT~(gqhcOJtV4$8h z>0;eW=xx_K%6LVg$>&DS=U1dQ z(@&iBhaZ!j+YIaX$%qlbM$K^<@=J|xd;P(XD&yG)k-HrwQ!6RSRvN~!E}(~49bxfX zZ^ZD@{=#3*pI)sk!xp|El^Q$#tWA7AN!ixHo8F?`d~ksU3b_t{{o&%z4}sUg^jgz( zO(iP-Ry6&xl^`<;kx4M0$)C%gE9v2`J!SWry4u0JkYs@okzI#&wl1W>+hG-;#z0B7 zB4GXlN9j09&SvEjGSIJDx4M+3F4SEDgP(nnyP@N}Wq)%b2>birt8Pcd-@NR2Q>@zz z0ryAc)Z|hgXZ?8J4!)d~KC1LBi@7C?fEZhdMI=SM)U8n*D2ZnMz3Q5)j5?KdW~$A} z5Gz1){uUrJLM(xEi?$?@qp;swkfH z->N9>GfZ&(tj8k*wlxIy=RXP+s_^8z;S3B>6hgyj}GTP7Hmw<{gr|5llvC+4#L`-?jfe}I7V1Gtr}A(R4KgCZD#kp@S5 zjB~zS*E^sks%s9P_D@PZb^+zUsU}Fyfk3*5*K4o_)Q+>dPNTVE8tgla39t!#p z$+VUHFdqOiLWsFYyr3c$k_;}0X6tvwbEaXkMV8}Z-!lzwqRcbZT>@}+KKFA~Fc0=L3ay}Fn>oqmhDZu+=@>tH5BPi4-2oaoyFU+6dSX)S_k7zdn&J(HJGKn7n_ z*aMAk1#PF*=@H~qZ3*hJV49QeEoB$6CQMf8H(S7e91o}jnW@G1Uh$88K${AalKt9a_U%y>VD8JG%c`^4aTGQKFNP@^CpGQ`_QGYT)>xO z;qO(85N0&jy2KkcUQOF47tjJk0dn-O)?=I~4mZ@;w}#rC^9U4BBh7xJ_j1!P3M0ml z70wkl3*uRDy2|zPYmNZ9Ox+w9Kdne7l<(%XsTBvnZY6O6`8hnC%TGzvm%0O;pmwWh zP;!=U=1DYuLz7|0J>^204dP2u1-g!_?Wo*lI-!vcK>W{mndWm!~o}4 z$8Qs51}Ra!TU;|e>3#1J>vkm0237*VmJJ)X7oCm>64>?{X)puRJ3+@<-L~*7Ov_Lv zgqnDiJm`j7oDN5Q9ZX4N7(5N}-N+{D#dhBQ_XgIYS8L8{i}+_`=uI#4 zKz4k0@4?8x=P`orW6*)rq~3=N)&Eh5z})^p!oR%Xnc~1sZ{F9|vk6joF?t*uwlQ~6 zrMT;ihx@6MAohB;?AghHv&^_FJa-*!HkJLY?$0(WUNUxOr2UZNOM=mps4%GKtvEXX z9{f`8@pnYTD8BWY5MzFWK^!&Q>jX?or+>l`kdyhurrhzq?Fy&w%Dq~S#tGy zwnIrK-VDA<{koUUi+uKa)z`)?N8c%6H;E7mgwnofPhbNVjoqNKUhHKJjq zTh(TexVMtu=C}teBf+;<*i!0-G8AYCfT&b@EYQftol$G2Eimm4QASdhAf_-=i=0MY zO+ohwA=$ASh$Yekb%O@qg!b9<#ife|+kCvd@y=IjxlQas(@exneakLEEn|tt>6nN^ z;4eAW7L8>5y-Ks6PF=@a8%A^$@9kt$Wgd7f!vOp~s^Bg^6UsKO~0)%^?JNXWIjkWNOhNYOI? zbdK-1qglrh?(;ytuA^f{*F&&`Yo`Z0a*lBPmPTvMdVtz$=?IR$BaXAPmBbB@UrP@nAdmnphD!S%k zS_$ZfkuN3RzR@!Co78WD=!lgVcF!vyv5%C<=P#Cv7iKq**r=V=4*xp?7XY-X&4?o} zQjI3D*K-w=wndJiQ_0uU5%{M<)2^H(UB+^u?uldzGWEzch3B(~flT5Q>l_k#(N<{~ zbpePx(scX6pyH0aa2%=OKOaVQZ#t*0c5=U)22ceE5KWdI@BBz}|UC&c(W~W-oykn1y#FV0nHqf|bLy$@cxaBjU6IZQ=K| zou%wt?KEfQIlrsqp*?R0r)(ye8Z?2Er^FYa4OAFkwJmd7Ry0J}G=XW7)&_h?Bqd#{ z%WjX>lt#MR??$?GT>W)?KJ<~c00k|Zjt#)5s}=K(W{-@p95(bnf8XAi1hLfHL14>A zL1VsYu@-5HU)m=5po;ag*KhZvV5F%jSKBS?SFK}a7aqQ$;x)&+(mYaMuI#VM{v1f0`m{ts(!8r9^zwT<^wTiaU239u-nttbjYj>@2jq>6|b5kUb- zBsq$RAqEaYBtRffwSt1e5elhrAY}$2M23KbKq_M~A~GbAAVh-9Q^F7e8T#Mp^X2{Y z|MI@8t829jg>c`$Vee~S11}P1h-%R@pq_dmx14W=ErdyqAL*$ekRryew0{Twb7}gw z2pRGB=G9(BIJL99D8a!ADIQI-z}DlJ{$UDCN{ye}2&n{OBxDnD# zr}nooeh>Qc;{aCt=Z#~@EB8J`y1bqgo(rmllah7gQqhd$SzPwl@n- za(EBdRXX_(v)1_pdiEXxdH>R}YL?#BAd|rP>x%*4uDOC=HQ>B=aE&tSUD|}zZpF`T zd=}6UC-j9N4fMgvRS-aFG4H0K$fNr!Z0vtsl6p>DWfmjv=12^ z5^fBhMEu=$9#A^r`8)7axeL?gZ6kPr!#b(4p(`9;ag5?A6Ca?1Mpn=ytX1L_mCyUw zcCn%QI4LsZqXjC?=q_(l`AdhBd*@1?`w`@k7#gxm7jQNm5H>vq9wtNxPxuNMdKX#g*Cyndb43L8D0Rnm=WDcs0YTk2i_B1}?|K z)yCV6UQt$=+pfCiPm5*xSAqkA+ z_z+bFSdzt4<+B|1Nue6Tnv5;yDn1Tk|A>kabPdes*VNTDCQZM7gYzqc*n0EcMv;w1 zPrJ9)(Y7}{>&$*$Rly4(tveTDv+QPZUdZ8Rz*}4*{9ak5i~#f9AOC1TNjVTti_Mt#SoE*qusQTun|HpHq_MXoM~P>u%J3W=10Ju} zGY$am>;p*8pzVif7yBi1mBn`+4IS09 zCgPEE-B!G?2<9q2FhhjygR5YrGd+_@Jt^~we{9NuGI7(Hsi`sa(K6DW#b9P06hgjZ zv5PDIy2nc%%RZ`n#8lG$SaYNQQWn0m@dxyCzG~nKC^aN@8eMZ;$Jja-O4s< zNOwCUw3xG^NZr5MZ zIRwKv`8AS7pVK33oT%S$z&6@2ql~_!N^oU|t2{H_PGwd`ZvXCcxYpuyH zLP?p9YeRb5DV37b-OC~IBHO1^c6SEh1W};UKvasupfplW4bToSN@RN&7@A zPsPn8tzebI8U#JMGc+jX#CnO*1Z`J1W3vm8DIOa-2E3_Nh-lMPSPVW%l(hjL1bbY) zmvjD3XYQ?`Z;~%$x^U7#7`Ph>5ayzVWa-4EvqEI}s?}-RjKLOAc!xo4!rzesU)9W# z?$Z`#EUtbkBiCmkn|ML;eN3qa6KV4`H80$;lT6gs@)vcR1OOZJ@r3H*A$l-Vd^$jQ z(L^dx0hMY^V$sPd31@8_AZB>ihLyxrT}V792=-408BOib|4zz>P5?fXaDZBOodf#W zTfxEQkgyC8&_P~=K9RPnyzyLNe${4bdW%h4X8zQVGFN?p_StPx*I1CB{m{x;CDz*3 zo-{j@7`dsF*B>0OJMA?h9m}JDLT~9Zam^3<&t&8GiI@7U01qK8`Gyk$Qr|#0Ru+0V zWHZ&HxACBo+7b3`l-nmfL2B`AFHCTV=0{mW$y25MCJiyggvOnVB(}w%?RVGVIHTL8 zA^UlepnrqfICUDa1y#9>b*0*o3dMvTzmDBLD;{V|7JPgMr~qhAGG5DZu7uGa-Fi8n7-c>6U)DXfha!1hYXC{=c5aSn;Vy}U2}J*O zC{)>XUo^7If;h21>pvDh$ft1=JL_S^hX5kKN$Oup-2udXMAem6U}uC_9SeX0H~FhP zI*9sOflh3)QGVvWRBwHA$t{DS1L@-z`W##B)YZDMT49IpHFLI#6Zf8TZm8#3*T7WN zmyc~4&W$(SeM(SBCd5=>53E(XR?Ht0hHD*UzhR` zFfPc{MXlLpwe{&o3uL-l63CO0X{@=&yr^(bKjj9ryy25i<953!HeG%GI&csjx&VI! z(h|d@HpY0YGpm`S>TJ-`p9gJqwS1fc)xX0iT%u|GWlqBv zGn}eHtHwi<_b=1m2$v|~Dgww^oQX(rFoX?^8s8uo&Hu~|Ihr!i_GR?T(bU%oYXr+& zT}K0EF=bE+BQMB}8wATMzsy_DBipuJbtaJxdbIlQ_VC%2r#{xbp`~km)&@*`o6+4o z=9G^io};p(!%t^2^)Zh{{hk%mE1uY()aG0)4)!9g%hKw=b#}th(leVjBb7e*z`7bh zw5rgGhfFAufbngU{=ypd^;ha6wmGt1Py4cnjIxSE>}o)gr8Qg_3GPFy)f&CFjOs?a zdYMnc-gl7ow_zs5waA$W3qv;%#qP;i)6UdBpNQQBOMvCQXg!Et33Ulo6j$SI@k=E% zT_X5uz|}^Ud_(IB&LIKy?W8E`U3wGxiR1Aq#g#I*3e6`tRl6`t#xxJP`vdAaqM_Q9 zF%XM<*|!H6%9;P7@(y-rpL54s4LCDHKhV$L8)@;e1E@M>z+GtNlD30E(9Bd%X=i$# zOc|4s>R8hmJCnxTHh2RMI%(u0yJvRqBDD+jU=2m_OXw%t{LbMw4T>XE;CoI3Oj-yI zurE>HOe`p4Rjw%t_ey8eL+zu^5SQ?h+fNm{Z=s@l!}Y%5|4tA$WJw+^`#H_5dHqsB z<6}!1gE}+1=gj>=1+C=>(*-}6c{d8+Pp(la@8O>6U;JqK&Rh0}8+CA&JDz3E zu?aSowr{(<5@!^Qki?Y=+JO1OywWMwmg*!Ad^iGBWlO{>aT_GFij|(t?v8#-u@`?u zkHJ(obTKP#tf!s6GlS@Qo7=HR*RsA+G89Qh_$M~_Z?E!;{H6{Cb|#{e z-z;!>fce4Y6~8dWv3o*Ae~kJ3gw>otUH==C>t-xqFFl1@oi@<}?s5RAd-*OWe?D28 zfyOw|8pSn8G32t*fnjYtx9&S3R5|P5`QZ0P$p-u1lJt5XtO@ ztJ;;*-N0t2Pe$pjF|VU6;6?t43(=k`uWI6b2WZZIxwbBh)d4((<@|JBpiB+=P-Brs zQ{V!%8)}2j0@3j;y+r|niO{XxmR#52Yag?G+#7ml1BB$y_tw;b<#Q*KO0Yl1=?$Tp zl~FQw4Y)5gM1j?;cEKEqVeP@fL@82vrh3-rVqM)^9x3)l-5cIw?;E;IJzX4k%q-Kj zfs@dy@?N=^G6Gbu`h)}50deeHB(nN<{~Gk){A~os@8yrZ!TPK(SCF4D<_bzQY{(ky zW!P8D@GX?oW+;F+l`qqdh0|L?2PIeV?P10hn)$yz!*TKL*(U^Sn&G53?i<+{YvffZ zd312#%Bn{U$c3P$Pp^P1GM<5p%EGt(cPDawSEzJ4lN9Kp!qbf(<0pMJGx+J_G|B7H zwPE2T;uM7;#TA(SaZ;MKr#W@X$n>d8sQ$`8J0w6s_XCx;75AMr?a4}1NXrQ{uFu-d z$Gs-SBCnX1I{-$qo!gsCY~(KS4%?{fScGnh`{mwII))8y{oPoYFMR+virVm5-0Q_A zlYO%AjEFe3kMt$`>+soALM?Le$^ea_DL7YtnCbrbz{UIsOj6F?@mJIHn{U}|Y0jPK z(d6Q5BSSmFc7wM}D`GyTM2M-YuC4!%@1&uk20vLF6|htZ!Zh9#x44u~Jwg~Jg|(a5 zLTD}iLQnXAwNpaT#e}2mqgwtbjjuxvY9Q~)U~oc7CXV6>FQyuAhl=qr<;Wo|@avtO zjU;dNi{UV;WPp)!VC(z_g2G$7-O;3Xj(KCDz%CS8(5`c1u|Has4C4{EQf(`~s78nn zwcfpvaS1f}yLT}_M;E21K1lQhj@fj-194by7E5weh_PpL>4tWPS8+b`sM)koN2G|m zSH4TixMv-m72=lI{*>TzILJU)fj;N~@I@OGNl}gbe!``dUwRa!Xp@RzAfMCOMMW>5wrlcXpmKw||nzDTd$Nx)Bm7mfdR=z|*F%QiN5 z^FAKqy^HCj_2q*)7kZ+!NYU(emM`Vp#~~$FYFkB<>KXdA{n#_YNs_kD$ep{^DpVEo zI4>S~R_|1zW;tG&F{b*%$eUsHv$XTL)Mjv|(na%_{8b~Lq$;6BUv-bS+4z2*8v_2T zd7iy{P5m-yB`l-4E2A)@{|HtUrFzwbSczokK>cF7Wn|e-<&e5;*7H^Un zefLQqIE9yq>52_&rca#%2t>tMZV8pO%+0aLIe1bwrVF@WpTK)N8KE2#+wb7SrO~)#ok4|Gci5p*83xDMGp76ObP& z3+K<)RKBSZ)6{O^bpWhcaU zZ|Q38QE{o)?FiZy<}%Vyy;o$zQ=a4=Lp+(O{+jG(Zc%rGK6}_1hnJ1F8l~st1UZ`4 zRaSNH6#%)f|2iO0UdXi)+R|mOi6MPC;*pi(S24AhlptOFjaQYEiWb}e>smbMhJ5}z z%V+cI z6a4n=&xK?c40PohA2a5Fgs?JnFooYt+7Q#v}v9DwqkvH)O9>9oYUY(y_yGvw9p zm@u(-G?SkxAjmhI6M&I|lrTJiJzDmlb`7asPS=&QrL1l8_IM;&5*MlzX}4PXH>18p zS^@NKI)qo`dk=-INsw?|l#|=NpIpM&On$dE*p^qIEIs|s!C%p}MH$_caXD&vu>8qE z&q#dGB27h#VaG)5W2g?f6-}>HPOikdLu(7<{7l0&miiI?d$ofs1{ijd?UcM%_VhJ!lsq!8r5DDWUW;M9Sn;EECKqj1z_zahz$Dg3})Z$<+f1ZcjIUNxI*s|qe!AcH8l z`i~mgW#z1X4Rgd8(d_s`Wi?&pKuKQl=7B|39Ze!0gJ9pVb}d4l#0Zn(^(GXY(@${& ze|;8m%QmHz2&gGwRd9BhuO)v>1}DZqz-~cME_gCpUK_yFFr3rjh{MLjAy=VTClMbh z$3HfNv>~d~hB8U43FzShDYTVJaqB4XPv-$G)qw5{St2Mxi;bT5J@--s9)J=VenV87 zu@fHNK%j>4d{Rzp=@BAoV-*Kz)69Qk;OOf5`W9^~nM4~NS6}X#693{cIBlmzq+`Kn zj{2P5oZ;9oeAWR~Ldm;SDGLYiq~E)75B%^<{jRlsxNTr|fY)wA8B=m$MawpIw%s>K z1L)bZbF`qGt~bXm&V@m`w$A&^>qq09%TFmIBi;<=)QY2d#;s*NtDdR-+*0fqq~x7yR}%QJBxPwIL=eeituWwS6oMqd z7fSriGDN&}*0%Puz2OWH{vv9UXFaD7H^FH*@iqN5y;B2{O%q0bhumlmzf)Q3(i6~7 z56!qR=OB**Pr916`Dp`kRT-TfU+i4;D*yfDHXMfX`ZW^irR_`XOt>-%I^;e!Q^s=_ zu-zf16?+I)CE<|ro?-!C*{ZEMj>Vh5JnrW?;4b^J*1v>+62rvb*K$b{*qMGHwiQNG z#0t61?*a$Cq7M@p8W(qcgmbknMg@P}LaOmMTI(NV7DH`;Mi=d&*Gp4u_ci zl-k+5j2lT(_?yHk^{nV}fZU_znlnM1(5v6TRXc1kUE6Am<=tjChS6&x7 zwmn*|jicg8`4p|6nP*Q3tv8%i%_q}fHNh@tY4mZCs0TJ7U#PcM3BvWhCUB}THEhcn z&ee@31Y>r2GoW6g;7`x5YRUYm*M}0+Ktn` zozcuX<@AOtxr725X^5|hFDKZu`hjo`e-r@TzbogVS@L_TyQ~ze^v|a>zrs|@TUE;P z;QU1@m#iZx7v6uv%5pSn-_6*5v#+2=_+xcnuyi53{wpwQ&R-~4Bnp04hJ0i?0Zzdy zRJ-(Xjiq|#=tp_%L(V{xTol&465eX#dOW4c&Me|JS>>OqK(Fk84b(y*j_z}8riGcM z8O{OIe14Wv_{1c$?25D04ecYefr%VSK{_RBxx)`5@1QO6JJTDp-yya8eYJ1aBoD2) z9+AbJVdQ{MTE+fRb|TmUvlwPoBK3ynong#Y+ti5Yu@3}Ki8!XPX&lrDSnqEP>+OA) z_2O-5n+ier^<_m5Idjl#=H2u*)*&>Arg;$uV?(s3nO*UX+m#_Bv>gPD<&zePxF^Wa z&c4iNjmiVph(Z{87sxj}R-ZI$8U{O@9aIb1rx#P42kg%B5>2Tp4~*+7&=CK!c>Vc{ zpbRZtZr7qcoZ5slO(0721|T9>@SrG@IM#X)A{5~9mRHj&6+Z`Mzga-8Q{ufLS&Sz2 z7~yTBRGqHuvkEV{4ujHJ56$x{K)nHNT6u%&hK>DPP}iZF5S5`eb?Dq!2-9Gp-bvZ>}2iKzLO{AjA*d!nDk7W50x>Q zv!S{?VqOotOIRI8yh`S_#daU+Q0=1B{v=OIgL2mj6AcRmzOj{g9pcC#^1&S-V}95}W2keyB=zt<$!M9GsIbwZl+r42Xn zT+Q&GGM@rf)nxKR6Qq#oa7~K;_CqEXt+(&>h%-IEQs+RPo*klIPH4O?_hyt3!loR* z7tYh9g+eYrd8WbhKmd&8CTb+(ozJuXDF@*;*F}EcTi&I(-A%FOyQ>^3oQriKzcglg zL*5m5f+IA2N;F<>oOItZ|8B*q4*;L=BWQ3*MY1~{x5WfJ_-1oT-vV+Ac1RgA9GK`} zObQ5$h+qa8h)lfc5!y6dG$cro5X1CGOjd0FFvEaiGG`I9&7u_Ot2Y2Q=0Su9W}X@; z&ufmtKMvQ#qSh-@kn3F(&#d8jfSYn!Of>N10$ADAtnbuzaz>lpPPG%bU0Oz~%vbOU zZre}x0M%d&?8QWwMNP$|XPzqWy;fiSlUy(sPY(Nt-=xC;MO9cAGQ=jzM-Z7%lRsCu zZ&qsEw*MiHt1X$13Qm=NHG88fu~RcI4yHa|WzCu#?p1r`2I1ECRqt}wBcQnTJyNJ` zAr%XPEI}E;*B+{^5jw0ZQsWvLGG7VlhanH5c517O<#Lx8&PsYvTar~t=_}yp(;lL> ztIa-k^%K36$xs(;M6}t*<>>+IOx*lNg%lTPW<_*3qkVl|GuCUrM~A2`2T5eV3_;Ye zli1DOq; z)9#RRox-j4k~zd~?BP|jEzcolZ4NneTh9#*~@0`e5qNfaVuc_%P6fXVs zncXZZAblRzT{qMsz2;IXal{QPMLjGZ)hQ6&ihP4AK0x3PvI+xVMh*#g{5vh^$cstt z*B_%LJ1G*W-Xj}}LAwjxmbr^RvO#M&4`ngA@rZI%7SU|vSNK$V;@sQ0T_IMk)ub0VOt5CclL4b8>nR5GiXKtMd(E2RHE80kS900`gL_Au30Hde35GHgzrzSB-r zm0}SVovAC}$su0e|1TL`GuiH&)lf8hK#JO=Y;UoX=s9f68=Mr`$BV&o3b;W!cVkiZ z6wk;ZW@MwWi<=zWmOCAL#=TNpWBEn=G580JsD&oU!!OxqElmZ?oN921`BGR0V}yC8?qvx zO4TYF+mr}s1;L}${#T5mPLo>TvbTWwARl+xQ`EkeoMdw(^m)gQRD%8a*g$pEYNHPw zBvr%-_phn9d#DH*N@ds_VZUi8#}pSJ$y5!L{-$$2j1)AK_6_t$J59KGkF@e+TnAtI z=CO8{-fA=<$}tZO>7 z1GwW-lnERI{dlp?Tlo>Wnitr&7c5gnEBI;Jf+eN)5!Y4fo@BBogWt5^J1KUfr1lPTA!(&HXaYY+mZL%G?+`}Y?>~I^QZP}Tx+WX+a;G3wc_;D>q zbaLbgWKPGX?FdyGs`O^oXkuLl!$;b^W}WLJ-1eVM{zuB&V-7Ba5=w1HeXnl5WEl&K z*pgVrfexhjq@ChSrY1gLQ@Vl=s0S?y2)&O;OO@=dtrRo2O4aT|F)4~;G)OU7OD{-u z>SNh-o*HPTH7<;%&M-Li6%QY@cg273E^u^xMIP(|g{$tafLApn+N#OXF#N|pXvYqq zBF2PC6@jG#tKQ;_kT z4-Z#iL2>@{$()USUKV|q|AEVk%5Yz{*>v-ko)>L&jCtbH@1N&IrQ}7u`6_?f%lt!D z5JO#|zV#1Wf=R+>D+&8^8}4@<=-LrsaJc}^jP-@#|h{hoH`L?c4kF+#hKnNLuM z)a7d=~I7JU7*_43b=a+wm<{-|LhZ{7XZw0&^= zQA?i7X}hWC1zbCo8`Z5&=9ZjEV4)R>FAHD{NJFUl@&+tRXc^i zO^wvcTGD%DbfzMQ5_ck)--;I>TD?P9D^NFjl~ur>WSx|=9$7PtV)^!F_o^iuf!W_@ zjnH=v)f8Ffj169GSBa%JYGqo+#~AGCRJR58*C?HX&LDu-AShhWClYEig6Sg&1Kj%# zYj1`uxt+A5)+3TPDQQ>)9vyL({heIY>K+G-o}bm|_}9s=d&o@30gr0V0q)9&8J5zmDT?(0iE0vhlN>N+X z+xTd(MuH48)WYktjk@1F8ds~Jv(NnM9;kVywF}}^bAS-0{p^^}f_U%lD-IHu_j= zqkev6Qr;nh3L^ytfBo;JwMI~Vq3yYg`%ZqE23Z=9ZK996>kX|QrXVh5psMt0t}<-> zj`V776un;lI|i%b%n54pQO$hSv*Gb$5vcip#lH189q!Z5*!O?#=KmM}9ZROYI!Sfa zFhF?KmN@##P<>%k^q`Ni@EX07rz&hbu1Qm$j44pIOHbpkbzD{eGpN=?A5r?3%Ixpff9g;&Sxv#BZ>>T+K-Z388~ZOBkII9B&< z28$kX4bJS#_=ZJ@4S<6g-@xK8P7U?$h-q_k(fn%KyEJ%e(rNX>$3^@8cPXzC3f#e zk*^V~*OX_fKV>+`ScZJ{#2+9)rPJ;48$m05MqKtxX?fk9%mhvi*~K%55xB zUg_g*eL215Bh@;z04k&qvT5!1R?8>VjuDw!IsiH_@jTw3_eMaghHp+Mx>~~K0^bdm zE&GxRvk3mj+{yb3;qTLHA+}~EXS$?v84Q z!%(`y*-WD;UsO3^Uqa0N@96x=#(jNc#8L>`&krs;7&$L{irz|$sG(tH1kApt(Ye0L zsNR#nui>yV6(zJDklE}&MPI(@p5$mwJukB1yDQIAPwG9&tyuty)Q(0UP}mCRm1ZHY z3}h}dt2DX0AG_a}eSPD)7JZs*+!IqDLgN zez}zOs}fl>(M7r7pmiqM-$Ok zsKvi0IX-Pi4C6zZpM}hy$XR^WN?W}fZtdY56S?@xdB??n{QvyByzbA~@2SR0vfScA zG~P&g>Adj$>P?HnH-_KCNXdQcRx6az>Nrl5db6qrq1}Rb=(sn57^?lbkXYqxm5rMJ z;LEBz(y8Cw;xdv<&`9G(%JC)55!_kBG`1Q@j6SaWeH661AJJ!CD1pJVWw*y;&%^E!Xk7+zg zeNn?`G*V+=a;SEOm@74<=uF%#YrhD0?xCw!T*7{~`jT3*{(r(#j(tJ-t#LPu69V&G zjz(yPmH6jMy=Lt$k+sI|bmHsYITGYL!OQ`Iy5Ln<8jUvtf-2769!Y=4FQSzu93b-! zPgyY5M)5f)ecDG*0H+g<5VN-^>&hn^ZIg=>%fI+w0{TK-f0L$I!I&AyHRfu8T-1~- zUN`JEmH|mAKMdD*SQAUEZV19RIjzv;H0U0DfJ=y}`_h~-uNSuAS$A>h;aggpcgt?a z-Hh1d32GDxDgIGqS?0kfA=C>gAa7t#7&+#Uo>NjU)YMgEy2gp|s|lFM3TI2o0yUxs z4hDT^@Xte)DmVN72rM99>(xC_W3mCF-_~d}-Dr^5;@_GPk+~DTb|rr8awQDJ7pF(- z?t`n@H#QTD(_k->+VpP>mQah5J!+0ds{bHgY2=6ftt|D)q0poo{>M7Td~TrCPLypY z-_$8lqot5}LM8!Sjz-q$!H1{uM#MEodeMi0ARjvJs>iC2H|#Vq+yoFR>W$jEM3>Dg z0)XT*smQ)fH;j4%3L(~XC-W40PgTEXaZGao^`~x|uSdK0By0B_;*SA%3M-yD)rjbJ z@ckIcwJU{U;wwc~*jPKk5(w5ku!6GLi?#RWm&Ut)H2FfFbiWvS3O4K*ov-Oy0E}yo zyoz<`r2eQF2RC{>P+yZO{ZNe>6p2|Z*tt9*t|0IgKVfaY`DP%o9eD| zWQ+!Fb%9^X4SvF(UWc(tnhv_;+70t8r1~?5ucB#?J^&J$%iuTss&Nmc3BQBtCMXar zC3bzS%svWXtb=|O8u*w2;aES=z5MDV#7b&vOK45L`5j|Z%S zYst3McDz$#$0+;eThk#~(gv&239MHC-uPHwd!N?iM2{yZ?;81e$L+dInBzPPcO6Tx zn>}hMRCG&L=|U)S^R@FcHHJ8!xhec3j^odHN~xt?llZp%h19U3)-g>fRuwUidULs0 zbkp&biG0H>asw{Fr?8cC#Wb-LsDEA84Y@@cuRt6mOP5)I&awa1@s7I8Gfl^+) zfhTAr8=Izf!Qqq-QzFpG{OwnimO8RtnIpTt=q`^)YFtOLXj7zLatYOYxP;V4D@utB zP$p`p8viY0X8#;GjD7j3mwGK<83${PuCl`ZmJ834;FCAW(?`-Ob7hjpA>>)?g(P28 z)$H{|Fm_-lgm`mCP5v8R^c|$J`d`WIskA0?E+qw_H_afzsWc47S2BV0x3NDsHXkmJ zJ}0z_Z7z1vpDQT!YgcsymlrGsBsA1FNwzs|naoZ@kNM|(z9ZY*HXg5M-r-+vjMg~uvxAU0}`DN|o* z4f-68Ne9i&%9GwUz@)ceI@T%O}}?K^wqzV!>vwZis%Z`QQQU zuXJ}+01iq1$V+rIyhqIXoZrOTQawq!QIl?Y)Ax38Zpst8kuRAA(;0&+t@!oI)aKr+ zVpJ7Os-7t*N*ibU)8oD^qPhE0Bspxabiq%P0tER9_>rsg8)i8OL}2 zN)v%pSapuu<8E?Qd4CxHi&Wdw2cp5C$`7qXnl=@g3F$aBcop$#$o<$8Y6rPlYjO2P zBI^qb05=4W{+puCiUhnxrw06IVMBwQU3q3io~%A+72Z!en45IMy9uDJzsGP_ikX;_ zG@}h0{6~_vQSj$_XSk@a5;xFv>}^;0Jt&$3jmzpZ#>7C$kSFNr-@4;FEpF*WBm0@w zA$A%A$P>}lRC3(|rF!7!nb{`d)D+}T0M}E>2FMm{?B|Is4ld6rDJM4fwxXa5+vad2 zLg7js06&uw5>N#sphbc4YwnY%!tw_O$=!Yksi?I^9{Bi&#M$S7`&q)&-fDz0<@Kn6)k&c*$}Sff20ZFpJN3+KxpYaeP98MASv zmSr{Fy7LLrt?*NjUg8%W9wxb&>{xy^dZoFzac7sjs%^+r_GF>xkxds;<=y0M``2ev zyzqTVA4W8R>SdN+Pe@x%NVt5;{%+o=pX+WORBq|CrPqzt_nWeJ%S}r4+Gy*DYi&8w z7<1&|Ue$$p{vrtmcNMzI%?oa#4LHF_@=0A9#}}-rwGHpdJiC?(Ofw0ouF{OJNd|rL ze(CbEKV$Rn+iRz^U(JoFcF;I|d)fbSB7@GJwO*O{(b(>kpwY-}_{4sK-8y{ATiIlK z#n-`>1ur;Ixxht@irnoLjCh3G&D9h*?tVXjF6|5}RmLtkg^>dfdT5u#e1s!jCx6fL zd3WUM`V7S3^IuyCG(y{_e3kgNvZrTZ{H)B8`8%c7HU4yc>N)xaZ9lI%;b=K;mYxZ1 zeCd-Kk)sKQk|6rS2)tgG5&G{5-YKg^CwqC_*J~C5Dynb>N^GRhJI536!1b>t=#Zb2 z)B@cZ1l}Y&RsZ}uO!4yG#5bwhXO9BZ<|K=c0!F;np3>XSv3uV`3Up4q04aP(E1=)K z`0KN>>7K^OQFctpgyv3KvSl~bUFxRy$}r02#XIiCqM#J?zSPJvzl|X?Xc(TTsw6P! zzz~0F?6GF<`M9qZv>xq;DD!O)&1w8VQwv^kq`#G-sMS%kdEx-nx(9k4i2K<2d|D}j z?YxtIK4oY5k4ciw$>h~hN#TN&Ze7a%i?W79U_5auGZY&bYT8HuLi32FCbc;}LPt_`1Xd?FlcbEmSu;=!j=ZBx!W3xb1#rKtJ@F;W$v ztwdHiV_v9TfhqJwE8!#ac$4@^&gUbl3t&RG&~oU*Yw)GrujMTY*?IS&4SaZAo_6!! z8Euc`z%3zodr)Z2*+0lS-{5a0LZB@;tkmlGE<*ye-e*&eTY4RgpSK3+#gV(V2Xzkw zZJWAx{27VX4V;Q7==In!hdvs+G_Ns!zO6nMRywg3S6j5sc<@1a&KREr0X||{DHH#l z(yF&LD(PohF>Vm+OYnR>c9b{DdS;kzsv&l3n{a$Fl)3~PRaKM2){hL-Fe{4IagDPyq< zDjpw}BsNq1EJrT_rmaWRf|rawZM#ZpC5=!ceE(Q2R!Dm2clb zdW&HXIG&To(dB!tXnuz_+2lS^A+Z|j*``Ev=8p$9Kg7lDfk zrFV^BF2kn@si!_5-^UtxNREl{?wz?_*SDuz&9l8oEpd2-P%k-%ei%uY>m^sK+=zb+ z?d-$8;xK=?gCE2UIzvF9neJTS2}OHvn^onL5BgbT2j<_(-miQx;u${ZbE>ECKQWAp z@X3COJ=@rfT$3E(mp<)>@z*P1iUb>3^K>-@O;fnrLc(1q&|`s~pncweYIQ`}kH50q z;3OtrIko-U(@kSYIB`EVny>Eg36m%E2?;Z76Sn-rm4YQcm zdeZ8d_6ZF{IGPana3qVQW-os19+?{7kGYVl82r-D4AbY(H4BW)SqQv?piP+Rxq#`w z0M+1rE5vci<`PGY^;!%(T5W_SyYsvg4xILJ0ADJk-3or`ZCz*VNXsMezVg?0s0?yO z#b`1?ky$!l2@F!-*eRHug**ypD1Bp(LE0JjIPoJ>?^MR8<`{oN^)D>wMzG&&M4H2e z4bSp?%qfNQm*ljc9S(f72>DhFPCh6&mTyhf+8V{L{aK*$nZLdOMwKz>YrkXLWg|bm z+qU8+2uSGV$6+V(>~Mh^bvf;)d&f`gf?)yrVuD|gEA@RDyxH{q)0j1>xTj6zO`i>= z+(Ru%D*3Pq0Tp3OT>Rro#>H6GU^SF}&>B6Ftg&k`sF;MbrNot* z?#K%M|I$cM3&OgPb-0t#uFrjyH}w)^&V^XXRn5I#&+c5i!&vaF>bU`~Cn6hCvC_@K ztWbGZ;`NSxwU@0LIL6*n)H?bh(g)8;1@{rvbMN(c?H!-Q$i}6C4{s>LSQC4i?U&1N zK8pX|k@#WwI^AS1e%Y(7_C7Z>+z4+##O;x%*Gj<+W)E9LW>pZ<9cauNsM#SOx&hv4 z6U_iMyk1^Y6gk4&&}4Ma4_&hc3Z>7jE2onWAES{G@G4zeG3|p1F)(xCehY4YAA6(mcGsH4U~Q)%y_jg{g9j@Ya0T)lRNil1LntoP zhDCpBHp|>y0iJQ-OEax{E_Lt<+#PG0z{l3T3x~!%CS%N^6w5P5E_+!O44*)2x4Jow z@qM&_3O-Op@VTfogA8nq??wJi(^EYiE#Q zE$8;oz63O{I)?sM)8{P#N02girOPrAwR7UGt$q4^{i3=2be*gt9pJ;~lS~I6gB)3= zM^7+$KWSe#c_U*;3`OLX0x*z!gKLpmmw;h3!6z!cws2x?Z$V9|B^Sj>hZGa|24KUw zR{o5{J{J2U!Tv>6kBz(D07jENCw8TgW6VG!*_o`3q%jNb>GIE931$k?CywzO-p$4E zmk@Ex$FYX99IvQJ2ATe05#*xDJu9|{FwSEV7vQO;YJI(}ixb%XU1k0~AM(I ze6H&1QxNU&N1YLWeP&!f?;$IE6gkZJhUhb7T2DXyvR?D4riOQuo#YM`dVC(?>8Cn5(kr98b;Yr7?cD_P3dDnuCCi|3-*=`9FZ+1Wc8C8S z(OYhKV%q26!kmN?oqP*ze_r z&B904OqbKCUVS#3h;OuS(pPlv6+BO}WN-N`8E2SMCe1s!iNh?I!Tuny4zWU7fw3WO zZ#hA`3(Rb&PQMfE{yEj{LKvN>^&DKKdjlTX1>iUTb@|HG)SsYMh_^ml&6pW*|9Z6% z$51exRw_G?^8x7#3=K4SZs>Us6fr@9lB}V_etiD*EZl`kExaD7c7AZloWeN;Cz| zyL}lIC)_=?9X(6OUoNkPPoE75E?8i(Mi;3sr(14Q4R^=xsTRzzK~hTEH}2k$WKqh} zIXuBwvMdu+Qemwngc`i;KdZ5~Y5x+SMuhk^A{LX?R=6;It$G*l3kt18?qZT1z6wsT zNO(A9I;LMSSBxTGM#a6k+`Fs^8SaX6*qA#&;9Oubfhs%Q89!@V*+JAX7$+2s`(>kC zQB*p6w^*WZD@)hz<*}<(=RK~r>Hy8jG<5EXmYxx3K{yG0q2{=?s(4goUCB3%y__~` zH2%oJZkYCsvfWd@VGSQ&9-w_opQ!~0a1ad6UYAtaC>-BS&T~%|b_7IdYBlvX`80wc zfR2W=Pq2)%gQMH$i*ib~NE%E3$cX2hDX03DV?l=oDq@S3kvu0vC2OH`Pm7G=kU`#Gy8>@4Z=_c(Tv*Wj#k2kiLe584OS+ zA)`E~yWl)bQWRiI`vt|tuU?L0N(c8~)pDKs1ITvU{1sTbR-R#?NXEA(()(#-#cGVkuSd9RKL*!PG;%2CG8tXcb{3=m&Dx*n(S z4eOfYjnbD{>o_t*3;%xplusqaJLIshf1l-Ts{#NQA;hR87}C4lHn$N0s*42%`s`lq zyM!yCECqTEvfS&Xw#YqaIq;DKGE$0MzYCjnyqPB!9cs7AIbhm8)~aQ(*1EM-ngD8- zoOiZ2*g@a0HS6>CEAie9bd|j?RicX}xQwrd6B5rUkfj5x61(Cg$W?~^vnQZF<%H8~ zy2bzr&dHc@@^@^#?Ss4EEEu9Bo^9w+Uo*|XJqSm2Gnx6|Q=%bjW*z)6UI%t|=S~Xt zpB(d@rr-6%$4-NRW7>|&4?1_~L7$pQ(II89-WGzrV1`4jbXIhJt`!RL%TVm_&0ovH zLtP!20h-KDkinX)-&YZtt$PzN&cZz#!5hCH1Qv@AU-TiTEpf!1uk2JW={2u5K8*rXiOCEXKv8v|y9dnW?$eB`>;LIpsCgDlx@nOt zj_`PAD&)SWS`=V$+BxA-s97A|&++Ex=SG;zN|9{A{a%rDQ(IjmA>WseT-)(fI_0`Y z)1Anl-b)RL$Z3@(Z=JHMwe`u^mlKT?2MG4kJ2?r+)zLALd!ACS)j+$uhm8EZJuqjm zKc?ul5NHrOV!T^r?CZjPJc4EFq^{6my+$Z;o zZ>>L`Wq1}0$%l*Dtx8B^n#^shzb&YFszAT;CvvcY?V0pYvO<~%gDg~;N15fHl7__Y z%AK125q`Nj^0N<&EmPatrTdqayvmVibjptl<-ptW(ed9buF49T2aWm@PM8R;n5?1Zvx->T#G(_&02VJp87sRyYvqjpSt`vek;+ywVJhSXTwGu-a+o0qWiJ0! ztVwn6ZR!AT=T)aMOh-ZTAR5xsyf!@GZX7`X=e5W22Z|QC`4-2NL-pA3cuhvnfYw(M zJKveS<`ZZ4n0tH}RAOi3_=ncCuau|e#5>EX*BQU-RHyTTpbO!76$u=fJ{Q*{LVF`a z+}CpVM~+8=3^7mW30g#uQBvXnH>_(en z{8rSzimnInU96$O;&vodx^57jODTe{JMKJN;&<{8Y0%QP0PYub{r z_UI8myf^)Ay4$JgPJp$nbU-0%&|{fnJ*B#L*?jppV>|UrZJ+Xfk=g~E17qC(Ki1AP ztm$)W_wH?X)mp^?L{Uhq;=o`kGPDR}S4$~IL{O$6WGf;=40#nIQ%G6|P!Lj~kOCW0 z!7zmo83GD{s7ysfWJ)9mfgm7(K*A6L8G2UwemdXIhjU%}O)&Wn&$FJj?)!JYte=>l zx7oX$VpPn(Ibt^DhYe>DJCO@0y#ZITDFR;GF{C zI1i+ngOuez(f+)$0VV1dQslY#jdkOJf6EccL|h6&f2IjiYv#APD*Rbr%xiW{qQUP2 zhEx=M8=(wgEZLR6zp3BJEQUPZYGRi3<5TV1^hy7png;NZ2K}|7m6@)t1nOm$+L|ZR z(t@5~0ri-wsWg3?8pIH_D(+9xx}JBhbq~`=T(SDf9ghAjh-!YuSc9lidCgz6Lv*Rr zf(Kls3P8fg4yGbQs_kA5I6aU>-#<9uWH~Lw*XHW2MbIM^4NQ2bV5?qZgKV+3-q@`B zhXG`bn_WwK*H%`rVYUY5V3(lR<2cIu$23otETpvhTVptNnTO~U2G~X{beeW3dpInx zw%#T0t>rJ9vvw@(e$qD=#94$qG^n0Fn(?VJUQ7tQW|Ui()ow}}QyGM=m-#fqGm6XM zw9)tdI*cx%l%-(`W!+`+GNk|7{8N1c~)|06D)!n9j z$DpD2w_SrpuL7T&4-!Ki?6aplSh3%5mz2ODos}6|>{3IsjDlRVKv27l5&6HI^2WLhg0ah)Floi{($Gce8 zrDdPVpIy!++;1}BJDe<%kPr1*YcR&%1E$Gt$lb0W74Vx}t#avY)bn`fv`ZaWX}IIV zw24LX2+{(5xh!LXA}TfiXc_rRA(H*xnGjqw-SlMHakPy)c9T$ub2!je}4-^3E*=v+k-FLV(kDe`lL+vRSI zkqiL80+Rdnv>ON*J5(4R>o^S z8bRDy^pY7~OLHO!EB;#7%g9*aU1Ra?AvPa#I7%Y9GjWmO_8e(>>{Hl>{jqCPrwY9p z?$?5(VSU9?iyJu`l9u&uV|Q9!cj_M3+Xh6tlv(c`&ic`Z%(H{xaJ6mW6#I1$2Z*NA_&YaWO0Dm+-oQe zFfd}BM6HEj_bI7u6xp+;FC|8_`^&5iuKXpOdkyB3q88DZ0j0Me00p7gnrKHG&X#KD zet(+JFH~ge8Q)%PU&H=vqqkeR-c!)D=TrVSd}&k1Wqn>)a@%)!(7LYx!r`xVk8rHs z8s4tKX`h?ZO@?wGD(N&t5?n%yPlE6Z=3BHbpcPI8u8F=-AAPJOc=VkEBvN?q`@z^+ zqt=hL{7UK?*iI?9oAWLC|B&V1x6U0(K%dV-^C~gI={R<-C8usp1lXxq(M3ljJU-pk z-7L}u*vyp|>JQ&0nnTczbuJG5`{?WGojoBJC^jkDxK$9u z$7`9dS-hwqRbS*8rHf32=1bMu5l*6(J;)L`tFPh$LyE(4sLAsj-j1-5oz>MTuN#fZJ;HZDQYhRy zoqL*>Ip_3c|1x5o`b4i-Nl%DBlp0SouKkVH+;tqPLo3vBW~NaE8R;x{ zkvhWFm!eCF%*}a+XMMbFzgZ2^m7?lf+ygDQqMeRtO4UJ6K77y_VD=3_FltHpeh@JT z!Tv>_0fz_H0NF;i_@qEJJ$AuVi4-{ z$$23}4UMI|jolTljYugIxiZ3TwrW#gJAyp>{WOi&)tF-4&^t*T4B@1OEje>}Pd*4W zMXv;KAf^&VIw#1IDq^a;*d=ATTlte%{+S(lckRM>L-I^Bt;|GTF#Fin3>FwQV- zY8(+5x#*$8Y4K0Rg5}u4b zhFXGg%%tFZwvsJQU?*`2Ebywo+7xYg#{xADoC@Fh3OoaTK~ON;g^AU|sC zytO0BU&Q9C6KN;iHa8=tZH1Y<+zD53EK2ILalx~$3J%q+5r(T{h(vpqqA}qK<}?En z%WL3e0i;(YI`P*!j?Wt*wM8Y`9nRxcM04yn<6(0C0QyPT8p^Tq=reiAqRweCXX1jLDh z#jo_rOgwgE_vkckwwpoL54|xRS5X*W8h$GDN%BwPEIy%T)ic&BPi}Wne*JcU-K#+8 z!`@x=7Su3vA5g@X0e(9HOjnqH_ymoWlskMUGwH(!@c-#8pR*+3my|UxwRLX*HKf@y zanZ@7hlot#?Y<(vO8%T5@mTw!QFTZUN)l~ZvOf7`Zh4IU$}Rh(X4c7b&y`8yzt-8W zxYj=_IynPZ#mFM2d-di zPhve{lEm0%#CA#kXHVsnhZS7Yar5KGUHnHulWhmBgxUq9V#b zYZ?10Da`IUwa8o>>+Qbb{6NsrgMU!d91O=)S7jR>a7{<&caZD`E;sfv>av;xQ(phg z$FqdEMl3XkUeHs7l%$$GoNDLTO0v{63mwl4KzJ=wfC~|39J-PQB>8}#5O9^$R!a49 z`%4H}+kQm5Ln0h#@tE$-vl#jThE`s?unoR*q8O+ zrXYoQQyn=OFr;R5S+laFTc8e0C?mPm^m8l^xYX2WUoS{4uh2jV5qD|Du<3~M^q6au zyTNqRS3Q>Ok1Fh)xyPDW@H!8x8?*~tVB?kQ;_-~+L)RZ zIu<=(glPlm69JtD0?o~ZvViq3ZjF4yR~r{eUhPg}DdF*N+zSpN~CLqspd75WU1kyY`$~jzz5;^F9nf`d~taXETd&r#1hGOtW$q zq=N@#G~rU-A&LKea;LrzN(tIgGPBavAz`$8o!W4KgWT}_mSW(@;S6BJq9 zzB;P853?h9jJhMN$vjtVoDXC7P2L%LnRXAPQ8T%OYIsU8E|*q*7R!^8n`}YXgPAKV z#Q8)wZOa<*Wf8PpME$GFFinfZ>?^D6it%sO+Vj=sqeGVebVD>-DIpqp5Knv`TnP@p zu4JTbZV+*NlSA-mw%S!zzVWYhb=q#*%FEU?TR|assfZ&GE8m?O!3#xfn+~+>FIW3K zNl3@q`)hujbO*V*TsqN?S?j)^^pbb4GG@aM3DIr#lbK)U2dF`;>j%4zWf~nbl{|BPq2PH&SA{z(54VZ)_D)+Q+@)xFQy-@HdK&%7CqoK! zy&6>39xevuSe3V#P#!|9;6|6noPNRA?vWp(S@{Q!h~Q_ABeQ=o%x%|jG@_|<^5Q#i zMBfn>2yu&vYOv32@5-hT!HQXfM>HXWX0pL?^xcF{~D%3llw(?Rqm&tS)V}^YVJs*!w3v93od?~{6 z91gub!NsSKP!o$sUQs!C^Mu`=Knf3N&-8)DOp_B(<4!qz-chijxY_HR?i znAr}44lquh@QDVY6>0-%Z*f2jf9MshUatBqaULtMbZ96g_aW!nGc7VZ`z6>0r%TjX zCxqNbyaCQF31sjkE%CVTKi5N+^X4Id7V9B)1%`DMZeb z2SBKWUFKJ^eP?}7za!m{Q!zbrsIf1AUdx=x-}DULXpS47j<YY;rmhIY z-;7kB?0zhMZ$g0<98awT&q^Ocb3Pf zJgEPE-p`Q#>kU>ewS3~a3fTv1!U+cyEP>+gWCxd$n0X(0dEnLo!j;8i%Wj^0q}jJ> za8L*4eOblSnm_Gks-p>zx2M*VZ_O?0h*dPk9pUvhb;1A-k`KA=Eq!Wz8TCb;-oG1_ zNw#&&gmmAr#i&)n)yg#R@&>>qzfsiOnp50d%Hpsej@ZiU-t+n)@2^XNgVGf`%HjOX z$D+`V}#6CO?L2)dam7Jk{@I)ELicin%0Y_23|w@J<14!;~ZAm37S zXQG`Ep7REK4LJOicm=`s88rRJ>>&_qzu;p((bB0eu;zKXZ@KB;?;%@&<8z0ZHpn?sdbR1nGcQ0OUPZmN^>N3;%`_t_71c-nTDjKk-g}(^g|I(Fx#-%bBLSqJ zdK?g=DUEi`ao6qld7{Bb=e-M75f#~7HVl~h>!N8r@0(Q}1&OE=pg(7k zi#C)>c)LEPi;r68BJ~G{TanocSc6*eI+tAzACacDQ{HJueG=9(O2d!)J0HA7!#n}i zxBbH4yi<>3u^N4SA`7L$sb0^LjK|`QPq#dBWeR~hROdvodd z`!%v`Pvky&eTt20r>uKa(5!bm|BDPbq;G+jKL*p9Yt>j{^Ids!M)NVWb`D~686i`9QUN9c#4hmdQ@kqR9ax=I{DKNH)N>T zPbUQ!!wuHLHSVFUsRt%!u1Lg)CRb;DpYPxP|1i7$U%$iAVDIuD8$m5{{%Fng(VBnk zeYbRx`1>};AC|%7Zu}1~N%H_W+9h@~o{m3iaR1#%nGimX%QjPxYm&6mxCGanQ{yNSisZfjI|Ht|8S~7H4EGS0VlEZ&&q|bYt z)<}-57ljriEA$-94pZOUW)vi{|3LhP-9@>^*2mSmv`~`r4P{e0muvOz0>^ zXq9=R?egM#c((QPz|L0t3uvdz8~Cr%ERbF@soW6wE8QdaQwP88DnEz493qxP%BU0~?zv|H< zriG#wHw+#nt)*FkhsE#)da@JFNefJvj)%B8#8i*jwRCUkjJIgolWuN)pXiEr>YDhl z3d=z``|S~%?p=^1+-&eRSL_%#XLzp8cVd@0V*`(MhIZ^A`IDIRy<-+lg;TaS=i@($WNE`6hF}K< zdFG7n2Uc7k~zrT{B5kO(oX&GzSLRded{`Wie@e(EBr^G(*zM9p8 z9GVonuoGOLAUa!huwyFME51^)BTeV;EYVNA;K|2`(fW0Pm*DCNu)`i>-CL&Xi!uws z>guXvgQ6% zazwVi&#%o>2}Ll`Hb~ekCyY@Phco1-e~=AJ*>^bXni0@!LK;CcV4ZU_!ZvvtOT=ehaED3nQ1djq{j6Ov7b_U@!k4vCp z5g zjpo)f(NEk%;&Gt)Ws6B_^~uSkC-bUo%=7HtYG!W$YaN=gOsopw$(2ovurw^aHA9+; z$sU0zD4gxqgw6FmAGvTw)6z;3(*5=`(8{8~KNVAbYSR*OTmBwd-TnQrZp6(ObU;9?2S}T|X32+S#vJ-9o?V;$Z}v4l_6MU; z!JK6C-^+s+bxJye8}&}qG2DaYjU0;op29x$pA{8c_R{arLd(a(6?;>XHC4BGIOk+; z9=apr^#Y45u;lEVUg>$?nt)fq_2W&kVTgIEUM9NlaDx$=^IIH2aW1166MF*Mtx?@~ApUKXtd;gIKUi(Td|@WCc*1ir1(!Wk2UOp}&jxm3U8*{;tU zidFy|Bb)s7h<{9mm~cM=&o0V!PshTLeFl3CGI6_-NOF^*_j`5Plo1;;i91P$rr@bENrN|ytHVr^Qc^$SpOEL|4 z`t)kdB)2^9!nvY1vyW3t&uU{F!epoy`A2$}@eu6EXN=D8yySN9RwbqL2v7Q3mEf(@ zS4ulM;&&EI8mK=2}N?Sj1c6?J{g;<y*xBDN;duO9P+xNw6Z@uy6%30Wo zkIYQo$o}zAItMj^`2O^FjDGdkaH_k1pjYi2#*C#8p700Z5CaXKfn#7x9XTKy9_%GV z&F?sMOe@enAnNm`1M%_hEkJ#KVMNJaz+q^K<(MQY)Rj`b**oU3Fh@3>SgI=BGbQWm{-i9U^an*wbBGP72ON>gKw z;rCbdHGQQ7@<0@a(-VwZv#RGky>anPBWI_G>lPBpkklu1E!Uugz2pTyAbW+zoV?U) zsisWg;uu^BHPrcpZ;w_jh>RaY|uCCL4>cJD3SQA9JQ!{v$H2RC==bz?)b$+wl&vd`=Z(B|3Of9&HzAx#yB zT@AbRbF2inOGwF7;BEKRz|bgKo1&+SN0*l^A^%AV?dR&<5F;wXo;HV-bn0h43P3|k z2S9GmL@ddAnw*^%&=1Au2t-{WaN^6NpMP62Gn?xJGA$` zj`6LcZBCHMSy|HuD#FvntB)w{>e}@8fU8~VT;a6f5L^FRS2@qwEJ~zoQ+rudp^aM^ ziPg~-S)kCBfFV&3wBfGWwDA4(8Xcq70<8HV&%Uwt@0uF8FZZxc* zK-=2@jj_sD?<#oD+(<&Fp2*m-fSo@<5{TM7ni9^f7LK`2NrlJkDn+GrACIB*l0h`n0NNe1yl^~7SZ3Sj8L zx}AFAb=hr2IlsS@?m|M!r&^iaph9|OT-2(mgSO@5V?}DjE9~&!Q%gF1EjX~JM7fCV z(^`L`57y)V%jfAcvW`ZDMSy?=CVUWc2=Y7zJJA6rPuHS;As_F(`p&^+l$t^-5V~@P zKlcmjnP>5)XgWuMKkN!kLob|cWCN3o$gwVeuU?i@E5kP+dFE>*$fb8y7uT;|T6^zb{o5wtPOR^?wveWH?9S@c78d z)f>(Mw0jj!dz7b7Wwp089jtz*9g2>RKSt9$jtn9awY5hW$wOVRegR%&TIHGW%W$_m zaYIGm53d>(!GUGLZuDs#`Cnz4?|f>v=(VJ)6crmqGUkn6)4! z00lmD?kS`2;D!q~+$N%uMz;2S90-1v%%ACM8h}DCpLb0&uT8B`n}qmmxj4zrx=@N< z33;kMuVl$j5t3n-@;rfe(6cP4LEPpE9XHf~XqF7`1d)q1*G1%L6%+G5i@n zPS%l{4tT<7C9qC{POFUiLVEEx%_78rz-Pde=3dcf2r};9=9t(k@nq z=0SYezPN-MqldLuxwo+=G#BsCksR_ZW&0U9UexvgPyB1$F1L~}r^AUqsZruoq&5!T zD?%nlw1w+Y8b&_I*Y2Is+6yRScD*&qzt&aN?1?IQ0_pUiG30ftYgnOE24UJ+ud3I# zrd$SUp=bG6_T!y`X}PlKi1mHWrl6-M!cd_+n4E$r7(dw_NP)(kiGhaYa6+uNb6VK= z(9URhfU01;=|L+>KEf~fQOEocYY%Y*Z1u^@;|*9N^@To?U!j}n8|;uFY=BQ|b(|TM zoz8bH&4ji8U+NIHvQVsj z`8D&_{NwM`>&LKCW9-|S-U7{F`VrnO^Ec$LB-@pdV$mJ7N3owon8u3VSMNs8w%`RX z9;3t~G*&YPB>I?0sP_WXMyJTe#YssH#FFn1l^Rb}JdL8)v=UV#4&CM}kI<^JwP<%> zeNcCkBKzi|x=yzl&Cv+E>+C~id0maEsVzxbr{L#VM^q5vkh$DlemzR#(fc7y;GZ!j zlZ~Y1EX5T)xJn>mcMM~O5(?j{yt)L%8i$TGZ#`-gLR0uEhyBo+u0OLF6XH=1O2I<# zs5|4VZ^Cr7LSo)!rl+r@IuB?KB)g2h0u2{>|0^LH{izZ}BCz#YWZFG+`0mLxZ!3|v zNr`o{KgSdw;Sp7{Iy|TdW)}@`6Nq(Hnx34pNXYY|j9rrCxUDp!He)ujuh884ErWo3 zaVa*CFvsm)oA9mox$AIwly_$(t|BA8IP}`$nPl;tAg~@bhd3lT~noq(e&`sIpI1usE--0%Ts23sRB!m6vlV+AB5oU*=)yGOPnrnR!y zi>8|bCQ~$}#0dO`c^EDy`hk{gW@0t7Sy|R|pixF@+V`xV^gYv=HRx*L7Zi*q`&z+Yoct zQ+KpoZ<{W=e(S#^52pHTigT^%aMJST_f0(p z%7uz6S-O{6W0lo_*c$W7-QfL9j{5@(a))g)A!?imguDtyGWYYD)*XT0EAq$+W0!Nl z{b22w99p^Yw;Gr;IhjUn1EmJ| z|MUb^%S;OYa27M&X9vmM7M@D-)GVx^1F`7>pFcjC9Out{4Zt3?U&t7H69{G6S)l@L z2q@K;XsYRXWYXqK6#w+bt+eU@})4TH(Jsk9v65lJeG_A&)DOt%kR6_fH>$JTfu|i7j zI5H5`U4@RcgNlzm2g{YvizUV*e~{DfI_xxk%ZUwxY|uH@6|48KN)EZA02hT(A&2)6 zryO(>lUn7Y4fpXiq79@|D$}=*Cu3_7Vb3{DFwbMplh~@@0Go;JOiL9LDjGss-5@;^MqzkKB z38cp})J_~_%DCPR5&DTJAiUE5_F8%6CCpHV{!Qw!BOsY|s_}UBuke8g5>G?@Bkb1z zNO~Dz7029hPxoEk+vtf@F887M+L12pJe_R|q!YhqIy=p$6;hu4- z50nj*cUQ829_sfun7G2{j&0$?sbk-l`6}*w>* z?j0_Su3+YLH9D*~ysj#s6~~C>U0#gfO%>}1c|HLjC|e?sKNMqSx9*M74W>Ob)zZ_L z0hneF!8IsSa0uFE{AFUKsvBUSY%{a=_tk`mG@P6A7lSrt zv8HG;j0}{~K}8)L_7CS`gr8T!6Sm1~_zgWMN#*h;ZH_NEqjJwg0N3>iA0`8vE|K;C ze8bY^l@OAw2oq_@t;0BqT!Yl<-DlWpSO;spUP5WDSBlGFF>0#Z;Ac>4Hg&nU5)hV} z>CWoiV4kT*3YY7YHz=HVqfg zD3{x%kep=;1m%zCIEU^P1o+b@H-curwiUt->8V){CZ>aW|O_|wA%tMow25Fnzrh+dTk(L8*=nMQt`XyO=@`0+}t8#(bB4Ov4 zq7eBzCH{sW%s5Y9O~oM9IS5WU3S|!EAVk5=pMHs zPRDG*V~*L#+pHvm$1meYdG|7KWP}WQ9%J*{olSqk3TZcoV&NuewXLeM<@ZbOoBWjr zmHf%^Q~fqr4p}khkIoK;Qnd)M=COi%u-?e)Qfzq19-mAOBx$#!kp`FA$5_XJs2o}z zq?^!Oq%3rQI~Smp`wvJ>}Ge|GGWXxBde~_A@Tfq>tpv3^T+e@E(wRaFzqb+1fe~N}X8I zsVv^=?F$zmb_Vy_;L&b1@`vP$Id{ExfMNX+rTZv6EdKtsKK0bJrj2SZ0gviMl*%ls<7_V?&3%(GboEv(XWuG)y!*t&ndaEz?R#gX#+k2q9Yf+fYMR>^**!P`2 zi-}Wt%lFmh>-UqM+vsti>)5ID!Z`;v%hudKQx?B4u~245Muy;6{t{kjnjdKpRqenY z#&nw2X`PFIWUEyhTtIQLZSi-fBd%i2&48URM+^lOQp*Z$Pqbl@^(v)@7Y~Q9E9~!O zdN2N5Zb0qDhW7^OPy`B*`iyoUY#;AG)Yr*>`&OVR7jZ06yY_eD0*+RRABslopFyQ`AC!UPzga3_qF#qbE z*XvgbwSztZ7N$t?MJpDDEt^g!dG=cS`|Bm~b86zY^!d%K5oyBU1?k6R;c0CKG>#`0 z>V0m~dTb_yt8>p^BUj z^lObd0yxrp?Sty96Z5D1SYiAq)gbgy`0+tWyVs&a!!$`$)x6JZF?glLT_18yxwiaT z(V*Q;^x-w{JBD-IXUs1KN-w{y*DvdL>BF>B)w~D4ei&&FDfvXR>cATgMnDM;l;+3v zKs!lFy4H(l6I0w!&@1yQ*QJ4K*4P#@(+T#&S<68M`$_{J~Eh_IgE~Xy_Nk)qWk*RV+=({4J;Mu=Du7e zVZ_-p?0+uJkWH0^`Zt7OimbJJnJsoc0?&2@c9_zQS`G8l?(ehY+QlpIJ3VSLq_+9N zjIQz~yzU-CJNls3p%0eX&v2A$P$L? zcqUV0XbPvgSp6zjhOaX+lQ@9}6FL*_Wf74o6OGQd@C+sOhZ@K6m!_Te)czLeTogcF zn7Qz#iLmBQvvm7Ijgm*VP?MnvO&6Qbe<5l5qH4pRFygZPNq5~R#zDB`(@VBdCKbh4 zy)qw~-=-v>dqZl|f2ydsn@(ZQt9a$ap}U1=DBO}8d?u^~(=_#I@q4ZT{>jTy-`0be ztj7vRCp2N$*>KIeO1lD+43)=XX=L3^bVW?O_TVneb)Q?F9fz2v zf32HiqyxN8RW{CbkA;PIV=a@}$_ho{s`|7&yHarw1CmR()7JNk2KOn5TSaXsS(;y- znNXzqvDf${z{Is!^GHNJ+eJp$dg&a+Tmjw0LvgmCdds zd}&y{d$y{^N9WZH@KjhFsCQ0Eu8^$2(%fGwo1t37V*1cN_~?l6dq4G+-?$ zN@>V4FEng6A$!Is`h5sM3scPZ4!PF+uI)2r>qx*^WS?BHE}3HlKE2j%5&Z$-7by7l z=t)?(yN|*FazZCU&z5B+u|DA94pr>`8vzt1@32hDja2bC05PSV>sz)o*;p{JG`|^x zyV1EXhg@n1#l3C@voI5%{om!~N!Hk^+D$Cl)oLePlAi9=#kK(Bs1h9zSSfbf@G4qJ z{-szM834yqakV1B=_nF3Ia`V4o?c5l@JpdSe4!G*)Fd(T0x6o%p zUU3qY21vSF8Ksm^s4e@JLzkbiQ2f=0jGNqVdp4_hZ;uo^qM?n$04ajy8gQ=Ogyob5$VSRJ3-mPM(nCznfd8oRo;e z>8HIsn>`gFzr}>Sh!)qfvKxm>S($U<2xh}P9l*ym;HcLkH2&@CU|3!KRyxZiO!4*QiG;+X@LJBn zd@G+b)pT6xCr&v52r0`5MAddfA)_9mo>~vXc^$hN?Ej#|g)ySMGK3Y3oj^~<3RYGi z_@YB+*160W36D!^?qutA8}RAYITs%dNgin-lQ)gjEm-68>dU}|9r8wdxK8^nalV=S z)jJ!@f4fFc2yvpp<1UK5Fn_0I!V~~U7^B}&GZA`WmCE(6b6+=td$uIFmIFaAQ1VZ( z;v!0;pM-0VX03RuuD_!WpH_r&pK-gPrP8}uv`Kkt6M@CHG1o*)onH`hP!TF*E>c6R z@Hs>0oYb(~uOjc;bU6G&HYKfGwLfSZh+RYK+8Ujph4AyH-zM)1*ILML!ASD~#=BDA z%6VTLnHE_>o`<)#=u!I!7pO!I?qc4agyPm(pST~qBVA03-&;BjhhHyv4igrr1e=oN zf;OsN%!W22N+QyNlj_o9lv+x6=RB=h1i@?K&Ox*M-pB2J16tz~e^PL$2j@Q_HYPO> z8~XX{?N#P>)^Ruw(UTg;WM^hmh|4yUMu?ZHVdUuD<9_~>SEq5ou!$wmpb-k)ehLI* zMBj`dXm_IS*J+Q-6`ZYfV!Qz->z5#XY@@EQaD-;@a>ZI3AVFK=s7WXe2VzGK?G3ZE z#Ov-kG(w1}aVS4#_j%zxY_R)aChDo$?nYUcCimd+aDkPkaJCLx&-uINUj2e9?b;>l zVvS52=A=EIpo9dp7GhctgH>xaOeLHmIgf*_`BZELM|$#XFY91$Q%^K5G8**5lxbG% zJ}4fohbX@|S)??RQMvANn^_*dW}!f3?cEE5a)8!DVZlV;&ityO)i_R_ku%b0L7HFi zPk=JF$Kg-)`^O8~P6R|e~b=fZ!M2N)deSc^fG!FP_C$Sp;C@;p<@w>q}$}ZYO5N^DtFa9*qWhV>vPNK39!h( zol@KQqeKtownG%4ll46iEc z85Q}LN#}_K=4<#5zV`O5Z~HATEuyal181d&V@ghG%w}+-?eKkR+LWIYypo%M2N_DT z-+`>Nu_P07i7VGX7;1r^i{FY^L*{ol-c?O?jvVV!5!DmaofiY(>U`mhJtmmx!Yjc$&iMzYDXrr zqdFKW%Z{`Y`zUa&D~L3K6Z=eYjkN;h8@0OCP;s|!;+awkdo1nloDFh!O#aZT+8!aA zq7qe87y-J#@Rhm788|6a>V7c`<hGgP>ZO-D~NO9$?stCtuCO2EHvzh*c+|>^m{UgvSg)l_I1{ncHl# zQLfioLN)AqA@!$O>1~L@^ZIBLW;-=_58}RHT;q$D~Fv z8&5Z5Qfn|aic|%YPzR;k{ST{Ln3`6UA%&FA>XSn&{a`H5yj6xNKMJN+?1LCRGcYLsV*1tsIWZG0>HhBQnQiNzG7-n^gIEMVQU4ch5ze^oF z4pXnI9ZUR0LzLi9ZFHt3d;Ur?c5Mb$J@}^0A z$q2M?8zTIydP*q5@ za5p8CyfXM(R0I8Cy?fFazv*B&Wh?2jOtN@3ov(h6$;Fi(plL2ug{=6tBT{4R?!jn7 z>Fy=dJ{tS(P~VbtgVc8IuD8)$A6wqEkEbSg1^PXZMaUGXqggRD54mO1?FjOYRj2Lm z*wW(cIb_SDO8~n|F$pA9M851^gRm##OX2SF#q$}hPCNMyHcwJd4ZWtJIV!jET5Myo zUoZgiA-%7v^^ceDmnjdlyW{EWW0IQ5-_+4tnp=c-K}rPygIAlb>Ij8Y?Q_AS8TvMB z`i}33k?@EnMoPBL1RALvSpuP&U9EEi`RKw_&h$G3jp=P9zXs;v*`{ykEk;GvAvXx0 zGmExQwj+NFUOcFohrq0jf2}i;NqxlM$|y~bo29%!ZFX=Gm)L|Z&CGA<&>OU@ zAU)$vJ>jjL(0E1oDiJ>bz=|7Gin|$uIxkaj^lx-BX5i_dYO~>4v)~PQv#Cu-LY)v* z)PKt+eycxgDtUEyc>$)+}=@; z>Ao71fG8zdD^C+bwq_T7h{5zqUQ19_pA_4jBZ-lK!%8l7lM`NGl71$lQR~zPH6>JYQhkFj2>7zi-&;{vOFaIA~uAF_>$~fZkZXK=rz2sroEik zu6YIo%IK^je_^^meWun$O1Y@Juq|UE7zjzk|(hSk*a!#!!;Sz1vUQ$lf58{qUOH;0|)fb|ED? z9~G?zm%6~L??)OOhEcpN1QUwHT7HvZlM{cJ)mJ)r@6i|!EF7qt!MLy?A@k!1=h7F9 z!xH|_N#BIwja^M1ibPZWrv5YC@W0ldWpGtzr;B<|r-aL^am2JpSu=KQn>|>5+0AvZ zs33u2WSroFkDnjw=RWJ^t|LazIW}ySrG();E+r&Kn;u0PM>yqhBLyQ_GI2A!LGGy- zCk-zkr@!8$4q>1PkBlszbi%J|tP?=0%@g(a4GYJf42K{zR~xu@Z!Wuj`=?@zt0Z=! zo2~Yd^T4hnG(mTPxl@rr9f>s5nAJA)&9Hsn%UqXzYib%H<(})f?`kN#TZEO3Pglo> zoST#9jyzgiZsp!zHDx|0Y{I)GO8DE*3DRJv<9!zdmX3-c4;zmE90tU=dwXk}oh0Kt zri`1ME6R(p%RJ^)XF3yw@?I6-ErRu^`a zM{!effZ~Ef-nXCTr{1K-Y)>AX>w*`$>yBR!tgjX{?95_Nh8y|qWd}@*ZrHbE< z|5CMEx{lzZ*z=%FRU;*mc3`RJV9a2alivc+21=C5J1`&Dz1C#m^$ACzugH`ryWmX?KT#7+V`{NOEYO<|88Us3pr~x?0by)ov2TN2?td&b6 zKXV6%$(&rT8H!M}wTFd+H2ZbPj;sz)^y&JlPrj``GhJ{Sm$MjYB%02*N^3<7a?E@8 zz=x<7b`Vs`G+8%bSc`m>A9aJScl*7c7!xKB!iD_>HxiT(TNUTm%_FMcfN4d7Pq}8bKAj!H98@K=Z0QbqIU12eyTs)z{QL5H0?c^sOjWdcyYG6y zzppUUM9%jPfkH@YAW>%hF|jd7bxSxkyHD?dTLI=dHO$?#*8KgdM{+(de}|l#@{NxF zP#|-z1#1Sb8Vyv1-!Te`XN|%#(>~Kc<@BO)K$%?(=C~^ z3ww3@-ui2po#(-iy_%MYvjwA_74AS3We`mSNiCb}1`dYhQiL47 zvK&fy<|CAh5fbQpDLE4QuFrK;)GhnG#{@6nY|wPnEz}q|)U3gHb~Uwb$(ldYWQuFu z?!^}_sz#|Z`H^#w-4=(sKT?+|jntqo<_7N(5*9Ht4dn7r?EvVdm`C4e;>u%BN2=Us zLweb6lDuKpLk>oc0-3A-s&Ir+W;&P34wp0|+!UAZ&9N=C1tYe&7Dae}E}bD>WrFCX zqd@*4e@C-wlVon~gb7M0Cb2S40_XFLb_Nu~0?bJr<+!dgdyFIJXwu4b#`B9nhfwSt$(&{EcXse zyQx+8c~kQnI|{2rJIc+YY<{{z0J&fZYiN2ksXk8LiBV(ja0UtkBM`#coImbo(+C;)34J|3^aNPz=9l0t3@huFR>-BH@4LyBukXe4Ola1)xcqEwVf*r|+IX#caJo-;2i z(#~lQP&=wc0ylX1&NYhDS)_#1sZxlFROT-FZ5sSNf6%n8zCg358_5|0O5t{%wDUf@ z%XQ%RJX7xuwc`6hhv!~XH|6E=XMWQ(xb{`Js|T%Yo&0P5RNTSdOe4inY#!>ytO?f3 zl%*a{RxjI0iZRlBoO|S?kl1ix{zFr$HD*cA!5bvT_XV4mKcXFs&48TxdFx17IHz+o zjur|NI_nxW=AowxC-jxTU*P(QHlMRs_r}#Z@1!dD{m}5~{(VVZ6|wimz9E$aA{_S? zZw#WXj6>MLsK;0kj6@yWOWeySm1WEequbQ&{%K?)z=@la_Fz}8Csv*zsB!{2T)K5> zM6otZJIc?!vGpO!s+rBTt@Oz$-GV$wPkyVZ&;lX<0wx2sGurw{a1@UAk;XMgWRk{9 z`i2#o-WGE2)L_6v^M+5lUR~GC4t*SS0%NRxBzIGuR2`Ck7U)1*J3-w}{TYw4!fYZw zOk-d=UvZld2%JJUP-3}b>mHhMDm=%KM3&p!F8Hu(#EvzngTv*u7atB@EA0z)O z?bQEPWA*?2dugf*Z5<<%4e&8Ftu>=IT!VjsX1+GU%2@{YrMZN@Scb_t95=H()+W=-~`G#d)IiEKWG87W1zNzV8uP-f|Jiv z?oqZdTuoy0as01ht(53A+86g{Kh))nz2&Jp2?=G*9td^@W_Tsvm%L6oolbdvb9>!S zQp~;h#j~+zmt$gc4NA*a(X*y=R z2EQ}ySWk3d$UGx-p03Y8VrG+#0E2Sprg9}41(DH6S)>RzEQT-&y>(hJkxxd&jcD!K z2%B+%L}Bus#UbuuQ$Tg~1y-FN@yv$Uo+fE>OPqri>8Yr{&9X*q!{R4sq%^f1!D*(Z z6FgA+l9cTJ^sdMadNVT{vfFzGfp;+WSx|EiM-X$q2o2kg3O#3^HRs4(zbH1)wKdjf zYCOyF5w13UwZDyk%klX#O8YC0Z*1ms%KdoEPd4_Ta>T`6U+_&GI+i1x9XJPIaOT7) zj2J9F77r(rF)AGKsYr855h}jriU_N}DIUacWoi4WA8qDD&JkT8do#NfY)qV9K~$pu zgkz@SlVkGI_Q)Lp@ZIF&>9tzRlUb+b3{Zhx#9x7LpNGiPw_q~H4g5ycWDDd&glDvEqB=DnWSKmI(=y!Nr-il*Va%%n1LJDUp#X-RYhNH%=*t zFsbvSdQ&QLP@)yz$Kj^g<99CzF2by|T>rdN~eJQmS%rxEIH2zB0* z*_yPyA@5Y5EHj%Cw(Mh6JJ}QSY0Ulk5US~s&mZnzJZv|+qVCIDWS7yXVt`d!t#&xg7wU?8V4##eE58EYQPK#0^gw9Sh?*2s+$8q+t5z)c+ zuiMSJe|#96>qo_$QO$JjjSA*hP86oDy8ZosqeSh>(jDnaI+ipj+AByxYM_O=8yYHo z?Bv-4VO$n6v5*@*CU!@zG7rLneZr^>VFre@l1t2(!uHJrmwHaf>^Oa(_kr#grmOYb zopy@}vI}aQVh^1$SsyQA=pK}zDNci2;Ak%~Q>89qU9jNDJDLIPG1g;FDlBhbyzM85 zrl>qotZI@AcU|HwAnKOFCZSv$i_&eN7=-H(4RyJ5XXd%m^U>M@lhw*H_TUAk;r!BG z4W)D<_bS~(?f;l_I z|3<*JBq35+rjEgcmpMbrl+c{HW$wxs&Ab0HGwHUOA-}XOsBOv!4*~T=bO^P?$)d1&PNxx0x87J;v-jW zd-Zl=V)Je*`-t8nO>X_JrT~|%b!j4@pX;_YHT2Lk_5yn331h3T-iTy0`#RpXTW3VM zpm9|__=D)9de++Se+_VHG?WM%Jw40?IKwFcswCu2vX@}dkg>_DkL{J9%cRGFJqdCc z9n_vut3^LYY;Xw#{nbqTsm60C#kaaPAPoUaB_C`hZm|f%rcpo8nhzwIPvx7d+DBre z2CvknyW09q&*-+lVT3MNz(Swek%|POg8-{7*5c;IM3D8b30C-?f`ta9!@0_t$wgBzBk85N{QsOpyxrIQZ-0LS zJDyw%+Pmx15Ga@qve4Pj?5dEm-3=`2^v>*g)XxydMfp6U@iz`wGrG9TbzXNUp+ny_ z3&0#V&-~UtO58Tf%;64wbM31flb{3po_n{FFZB|8OP`_E>ui!<>+HLcGec6RTdZM1 zi}RK1FX5JY-1)GO^y*mBdFmF?Ihe!-0?CakYM{y~L^&MUnrqN{h<)_JJd{pZbY2sY z$aK;P2bK;F{2QrpRvDr?qVVZFm+0R@d)qi$ShJQjY|vT9F@O2U$Zcm$^jN?LW?tJ5 zGA!ktwJEgQJ6A-%_Zb1$$NEhTJ;%PLL5@+t!s+aouj(3;wUK5) zG{~1)81?6i47K+hxI1H4aWn%0UUN`!>9NV9GVD~&!y#~~0Q?h-*7^ONXUqRt<2tyA z5JpA#9Liiz4pLlAeoqk*;};w6Bt@>;_SUQrU|qTFt9mLOc6(jN$BOf}NBJu=n)yJ%|?Awbs;aoi-gF0l3A z=?%Pk$3OSlYfsL%%N)J&UZps+dXOySD@t#D=+-1C#h(IR5S!mWesW>Y!i9NyUBg1e zUKc{~q*UO^={^6e2XYRS)c~$CVRTsbr9QculYE{cd+31@hNv%sUnMM1^xN0|(UJnY z^2AC{vj-(pj?@Ft5cP7WD)u^bnufII{@i$l<6BH)*QQPb;V;3xG&^AO2XZUvE?T(?JGz{L%c6=B4}3i4urd_;^(LhV0)AU*YQ$T znGhXXMhO*CDpCWuU{~_!b-dA!uEw3$DzvG~ZT(4R)Q*f3)%2!Rf+NOB>s#xal4z0M zyqso3-XYDDZL2jBLC^xdRC^@O_x+~njo}moyXzC(9-&uG!Iq*zY-bsIG@xDo*j-oi zwqV;e<^ztRn^_Fe3Pt`)0Oj(^Q-Zq^#^G@N8u3woS-v3gvRV0i!)CNkgPd{)FkxIQ zoqA^BLhmRvqH!!y>|teAkGXsXYw&Yzdi)&V?odNdcC$Wb76KDk&xH7;^20H3nb`e9 zOL^)X{Gj_O!fkEIAn7qWB>akUYsO%B|RvDf#qY@J$um@+%ZZSGlIA#nueu$&Gk z_g2=v#`YR@%Z#KRDK2pmg6bqP3VkHML@$^VKG3oFd zWTd_9sBo4rgC^9t+g3fL@R@mI1Fy}D6=Qjp$$RAD6c`llw0mdzs;_1n_xd|_W1)E1 z5(g-C_O!3arcDA8x3(7DY$9{60??^(0X3aXl>H1tDDB9E&SqfFvX?~fW$k5sKDuBx z10^a)@3>V&>|JCUsiuSEHw(-dc2Av#qL?aqV_#CsC}ju<9$&)+DuixJ^4&s3A78ni zR*ef+fKu`t1VI7}K9HtyQ<&G?JkVJfai%2(G3P1<7zS2=K5s}GH@2J!$W-ZVRv6ox zF*pfMBkje0Pu*>}OP$L#JRkT0&nS17_-j=0o3o%+1WdbsxnA<6s*wZ|f1D z3YBKw5-Yr>&cD?hlhf&SfOq~CIall zIR2>8*XwUoh&Z+JhhB>0EICpkZaEa9edoLxZ+$>0rVLn(M%td$r)M_{~=?sJk`Jw`ozOID+UWVg=*LXxtQ1Dyy*d+ISDkDPtOx(&h zp8iF3YY3N1sGC%Xrnb~$lV=&Q59?p4=^Uk~JC+_(sw_TSS0gTK+zw0TWR``2s!Cow zrj@^T+9YYM!X*0!AWP#}wq4Z^fXc(QgY50#EqM~kz18;i#676HqP_P7o(dNqT)1*O zzTPAc;sW(mMSsGKKrDzs!k+Ay@^BN!BocLYlm!HDa8;krVINO0`j1D#7=H3#?B!Mj zalu|)X^45!2}@~sO>F4ZMi&|%@7p~W`2`szr;p3Lq>*<;N8tI&JpH8Z&3|V6$FXYr zx}M9+l&R)twq~ZPa4EG{<6k%_97wjOec7&ewh1M~w)Nn`Sl|7#W*pRTqg5P;p&|QM zO>TJ;Tj{CrxT6Uv6Gn)q9SqglBu{7ya<~f%w(*&Fk}NeBx|hU8k6fZ-q+J_3U#acV ziP6Tdyn&~yi#u1__(@^n$_U}k_J7u-xg<(ZUwTMSTxDAp3ene$?@^1jxz_rPUn$Lz z6Z2HDr(P~TnbsyG{pwuDFdgoy*I>9k6!5_3PQ&UGgz{|uNo}!iJ~0K7c=KA7l3{VP5r#jH|lh{JIg2?wUYI$$&F zz1ih^i`;c>p7VY=LQV+vxlJ4Z_Y<+Mtj2DExwofs4N__SuOn zAH`+O$*NkWk&qW-oVjYENd#YikbIK+7^+M2EoXXIgw5gplrQWV{x2S&9hT^KyXw** zU307xZd~I6xlyKDOGfuEatFC5JYTTV2}yP)<{hah)99IJT!f! z%X=!u%zj|E>L)qXTlbedpZ*?YJOLmYxLA7<6U_k`Ys7q(^ag9e|1tTN?wiR0GeSmxGdoyg9>&H*U=t2Pz8B%2HS25P)4QK%5(liM_ZOM9?T#Pr75 z9v4*MVAh^&yXMisAf9E;1*(?xLvBp#5Xr~Z>2&{M<&Y=Ye=J;RyZo3q2FX)h+7A>> z1p8K})Uw4iawI4QR;LM)m+TM;TAgVW9R46Y=0IX)CkmW<8dqow9nGP6MXy(jJXqUY z3`UIZcgGH#P#kZNn(kR_SE5b7g;mMR8$?UO!RcTp-gKfz8{t`ds>}W&Q^JYP@XEc5fXL) zqIP#R*6R3A)t{9U>1cCM^!u;=Erlg)b~K3meRSJsPbwl}laDF1-1IiC70xo@Sz&^BcINK1~g=Eq!~#B%42X^_rSH>|czX#w5sf z)4awezEQF?^(>$%H#g|!U<}QtEYHzN>I&K#ZUSb+CDTuJUJ)Wiq<&Bw8EDPpfA$;y z?H}E>ooh*qNST!Cdhy{3z)s|jQA;_VVIo@##GdsLLTannc+!#3)W?*;OiqII)whKJ zVLhOTJ60E->-NS70T37R@X{4|2Z(zWVn*6hdXdy?=i`oU6hO3$ZG5uQu8t z;vHcMqvyU*31`nj09T_!>8hT`YQup2p2UB(a zjmb)SX|{4JTg-~{t&gsp!j?4H&ZX?qC(6}yn!fW+0y*Y@rlzWk@K?U8JPKjrY8P8b z_zxzgLg;bLF*C*Pg0>fb4y17X>x&9_g~Z&S6lTn_$46h!>0AteQZMuNe;jBZ{U$s& zr_qa^lSY!zQ~{#H^7gwSjSUZ9L;@$}$!{OFwGyD5)$TAFA*A#G$wEe5t%xF0I-lx3JS`=1zV5fAea}%P$a7l) zvRdXnjP4f<6rIrVX;$B{xz=4j$9d@DuLX}4DXb-94^a1#wtGkkMq!P2TX6Eoi0mVa*tUE0LD$4eUpna9!g}k?+@P}I7|q`CJ&M!Msk#1OKEDK zvxO#v8-2EQRosI4NX2dAZkR(}%Hzd9O?`csh&!8LgT8M;H`_oRWil4U4MN`8j0X);N`_3~=2xp}nj~vj}c@#y~6O zq8fn6QRZr+nH^RB-obtL^=?o3Ksx)f;xqygfnVD!f1On^wb3Ky{P`HnUkiUFdx3k8j8N?6(d1dN=vI^ZoZR#oZ%^AQe{XkPx}K(% z)7b0^QB~%hv4x7w0N*9QDX0s&bAH`=w8BX*S$v;pCY)E!Nljm;{E@x~V`Aov4aw&R8=3q%8vE4abflOY?D=T!|Fi0V->*_yI;vOm{1y{fT4yL>7s^4I)xzopG|cc9|*=s9r0n9kt-jrY1f(6U_r zW>}T*f_5PbV3AcWpnZypW&YN%cuWSz^ew(Cq?#a}6ukVvi+~OX)d3#zG)^kL zPd*|aza!&Vggg6jw>+qhP{dKqwky&V4eG=$*ds9NSK%Y5D;AI3Xixg~4aggZo{Jpi zzq?w>+nR~W1bD@U1CwUa;pDf_zt=@m+3LhXqy8%Sk z4_KFjrgNFxuyx0m&(tNKxhEym1_uNaIuXjtgWPCkq&}=2rxt!FI$F;1KdtllhE6`* zP%me`CEJ#${CPRl{gg1CaW7cd?*uFtBw+f{e)=a#TG!D9A5L%eB?#BHvbNT4KT)*5 z9TI%zKfs5o@y|iaYYrbV!8JE4+L|Odbsp2M2Zw{f91BYDl{#?~+=uMj2?}(pTl@Az ze)5N!z9{r=CFLuklh2ADRH7ji97r8=MKe#t+q$qS>a59CN*LkO35sz0l_Wz&>zfJZ zs>X8%hQbw|CXcQpb*UR%ge!HzX+IT1{e7%xe&j{}H3~5pIz0L?(Z|#FX`O!4mW}+$ zbvu~w2>caW7?)$#)u*xv3FIgyOE*>W*_*PkJ1h558{bWg-3(=O}*}ISK~w zXc9sjRc(T;{(940v{+OOavtV-~^YlX(9HN0vem8|l4aD>}` zw+QVz#>p2vP?a6ebbE>0A<>Ti6c^rj^>HPhXPR9MF`Iz!vR=nBpPQK3sahncwS&_? zsF;59)zPMIT2eNHRZDFkMal*BY6 z@B+7|~WFCj$a zBdWtB`7Mjv&cWL`j9#nIBJX zR5^EQ4bSvbYF!3HQ>S4CqFGAoc=)82d6#Bn&_XkLS>9Qq$`^{yP|pZP;k%_|FR^O5 zjdf`--vs(0&Q{9SGpoH1sbz##c&+`iM-Yb7@$RB}W#AR~jHYjDnXII_4gfcS?dG4S z!uhJ^Mo5OIpS>ZmJ*4aQbj*$kXSCJUTZ=?%g`1Lw)ib*|vB} zck1bIVw23VU#wWtRd6ch%5+dS+-qblOkr>4*s%;5A>N!gZg+AX^0$kx9`BylPS>x! z75n&g5dPrQYQn*hA;eu&tzSVo-s@Uo(WKAI(oWMV?C(#vGT@SpVz+zDj3|yrekBYC zSs3H@)o9io>K5+c&8;jG)B?YgSwmt4I}2Kcr?V@koNuV|d}|*D+jwNYaGJCiWmfX{>8DI+|;hwlEYz)0yq`` zBB=MHDHcq!@i&nsOPRxh!xQgy)wBHX!ARcaut_qDaS-1ZWoTH58h*QDVbtB+2cABR zelc`1nU_n+WUY{gyp3AVhgK$*%AAc>jRr$9ki)#4Fg;NE`}kWUZq|vvAp2jtVOrdO zK_Ekf)}?+Yg`!hOS?FB$okD%KXq#|C6=9L16sY$sXm?{+YUJFmg~W?=w`E$>p-Lz8 za`N+k*2rrdh!h#TD|MQ<;;sauCB!OKV1wR*QU(_36^j&uY1$X;z|ZO#qM=U4l(QXe z=XIX8z&3s0k$zjxY*?JMCv1=PBa%E$-HWsXFWUYonOG1zCEH>qvRNgI&x#gFE4k-e=nFL*%qfAKk%=h zxf+PN^)73f!nd)m!8iOj~~w&eo|L=!yxdna!KU zq0hyb{wvjJ-j?;KxCqL;ZD_EF@*-T0^X#_eO1>4a{mX`RV*?!x>QCW{b%JQw>Q5~l z>wD8#`>^uZDh1bXKaJU;O7@Y@-Je~QxeAHL)JB1k z7Tj-?dW8@k`^gL2_k`Q4cE4U3>5E2hWpfX2NP(_`5&xaD@im9j&a>H8L8F;>YdVQ? zLd*7>rHHpnXd>ZRUN|Ls?|kt*w{HL}LH%hW6^G{%a{iC@&`P0L9QOb_jHY+)bkQ3J zRWW~dm`lyKl#g*0M<;?*_~3|+)xB*cx!3rQAi6W-#HcQM5ov<{Dy9i%h$Wb>-CN{tO-{`!3-NYGRe{=9exf$nSYXp z8baoaQaP8Nt#%Q@&#Z1oHPUA$A2)`ro=%o@S=mN<_uEODSy?ZEPzQZTPfl*s9`hZv}Z5ngEf&v8N>3RL9l@~+gGn1#rFFqQfo`DiI+LA3$i7& zyGiDXW83TMN7Q0NJeYrT2j`~;e0b2pYFG;w%GgF`bU97xm}Qc7^}Oy)A1g2KT_+(|E6YO}gl#Hy+kkF&vL~m9 zZTv^9>tXevZS*>~){XBv^+X&X`e%c=^5719Da$(c@)?DDdusq!;w*nRkhBe~J4a;x zg!yR%w4~WFBf-6&MCi;g8)5}5qMZ;z8s?lqD-8klVK_BYw1OXBsBot8j0`7r>*1sk z{Ul}9L^xBZwz}JN^o{c*@C^p<(TmfluUv>#vAcpT-;brlNh51J$I!O@G<9X9I@C6T zdowi9)R8OgLbt>S&3@7{E=#vny9{Nrf?;x<-j$}qu5g$7%gM&7gvto<&ZMtZ?Y#Oo zQ;jh~`m>%H7f}y|k5ON~U%6%Oc`hZ*-th3_;|r~LGeya*-Q7hQIsnk0?V_e!9MNHy znURY6lo9z@DdoKkyKZ;OD&l@sXqtQP`$n}>w&h^vqp_sl=G72sCS=x@S+VBOg94Yl z_IzZw>rQfHPi?x>3uO|bkEH9;7F2}w@DPtmK;MNw$C47hT-2i5C|k&w5iO;4wG|Te z3bg5kL1Ieh5hqf~SY*H24Sx2471LqUU+qHmf7QYcyAB@Bwb#(~_o znqzeeR6EmX!kd`eMQu@T%$qnbm`&>1*S=bAcM7~qI_j$?sIFgY|CG5{$_2i8ZnbZs z%Bmd<=W4Vi{rha`sR0bAjwD%PLFY_!mgCoQL`&jX-A2SlT!jC%@YVWNm+s*3`IV=5 z9;DaT3>cJYY~Z1;z4eIA2S7_Y?|byywy|vt~(ZLWgfl_ z4`-)OK^Nl=7W#Al`g*ZOwlh;vVR80H_8ij7UM~e7*6ra&^k2yN4mca!X=b)9ID=qx ziTQW8`)=3mQ?g3R3nOytZ!a}Fs#|gzYj4s9=R55xH~V|z^s!wJ!E5+Z+8?pEt}!B3 zx0G+bt}VhiHYQ_Mrj28FYmVFwq)9&D%~g5C&uG%Q+LxE2{=W0QT_{9zTxi2+mY{>D z&3Dwa`V;mXuU=Jm_vJxWl{w20O>!{`u&%IYhT|Lh?YgXhbZ{@W} zm)rgE>*{)KIb!ptarkpS@C>wDPXT}3Y+16L%wh>F1WA3@Oa>SKEY9q>zm+W*L*ru% z+M0KtQDv_GsTln9>M2*cBSU*#pF6Gk);8wMv%)4IH3RhoN$D7!D@32WiXf9l^-Vr<~D z44s7BkX0VP)hIQ$nv1wM)*GcJ9UVjI*8|8^`y@aiD`s^LQx874a-Aw0%0EZMa~hs(=&`N@&Zcd1H^?yltzl2vxXaqov6Bc3@!p1m6W!I>VONgheVoj1jsS+Nwf7g~?wiqk*s zsc?BoVllS&_XJwZF8~%ysaj-it9j!Rco|UMbrbm;6@E1N>au5sbVu;zGxNF@OU*n; zJ+*!Dti&urQ^|R>(3!>#^|~%v#>rWwci0w{u{caGdB5&KsZcz;;_vV9NK&WzN%66; z#RJagBcjKl>sYUPrt1h1b#+-V+WL+e+2qbFs)>6SwVTw(Q3k5&1uQq?L{ziSln}>U z0%@tx6ZrHu%{Iwnc!q|QuOhI1l?AcR{qs8XV^qt-a77T$L>v7Osior+cYf19r9PNm z)5E@O*?Q#a{Ndpp*xP|mnst3Wi$vzPo;Q?{HJLy{?9^d<@n+pJ4MOtUTy*+{>2vb& zA7|-*;zA4tKd>@zgrxvj77XNa@7s~LIitQuUuK+D5E!I4;K9V>6`NRXYVRFWlg6t9Br4w52bn zy6k(;I4~=klifpEA?w>CEpvA-fNDAp7QufS-Ayvoy;JzoyOuI;7ej;d&l=2=+IeoY z4b)+oRVm`u67qijcM7NU>d?FvSF?d?DWts1PLMmxstUCO+8Sn=Jqh&!BqF-c!*c&q zSHHf%wv{_bP`GM)Yufb|_7(G$53>>B{=#$4Q@)T}@#q!Nxh+qE`l1u5%()$2y7CmD zfKa{Oy3~EFm$Osh%DpD%w~BW5-f@aQ(FANL0WM%vKSXqAe~34@tq<}Xuv^*}%{7j_ z?3qD;MNeUi%~N-JQSNz1 zTMs0fYg-r+?q;Gequx~f$Z0UzFfY;yc5>Jp!UhO*+Z5cy8F2Bo=WNP?`R16K>@7~3 zC#*y-p!xwvX$l$fbXY5MXx=lVHj<$xYqS+}%lIIuJ&eB{x}46)StWUpZwL{su6@e; z)zz>~2V^Dq91&X8XC}tLWQ3Y;qzPB?%J9RYDQwJ(F1MCFffrf1{kZAyQ`d|RcIwM~ z`Ith3w|rAe+ZbEZw&0fLoqPB`2Nv z@HTrBz_7lO|6f&#L>uxV_w-Ni=hmqz{S-lX-(R1izx3blj)4Cj%;N}4(23Vorum*q zOeM_E%(C6&F<$+YE16#etB&rchruxZPRn*vS9Ojl%xUxeHJY{Z3|j=xxsIMt>18V_ zk{XJw2F~SJ|HiB)>*Xvtc;86jv`N0PYB{EIP!-wMIG$-|A5bL`Af-9N9>M{FQZ zC-l;MD*&=<$)4{~gZ%>EhiwAS{zc~YPBR*P>VdmW4bKK13A%oI%7>@ugH=aGaqHuA zF`Tb6eX`!)W0XuhaFd{BrkjYA#bCFN)V+|`%5AP%?AENk{N5C+Zq48QrdB@&w!Xk= zj|Nhp6+J>0J1qmc@=W<(uHqgwVK@2IfI~A1^8dWQLS0IeAr|=^59^i?g98#VM4U?r zTO;DX(i-? z?a;1$-YlLY!5W5<@L8I?UAJ+P6;6>DbL5GotIwj#b&DOS@!z3HuWUKFm}nAc=Bo0N z5Vppe88VF~$KI6C&QlPB7jpK6q;*J9r(GK7?=N98Vsy@+kI6cb)}k|0d|J247|4wh z*S3$Yy+G}PcUf111m_+r`*O`CyJl=Lq1NE8%lVUeF1~mBTx)vFv0j&bh4pS!d9E8MBv`{y*xVI;%bFlYFUdx7dDa|;R>-{H=glTcaeww3v=E}N3ibiCQ z@zTOx(Hi;s&Z0WHJN95J*gw%A;~Of?#-$t8Xz6!FY{Bf++Lg#c4&;)-&I7!gV4$)k zzK)`-$CvUvqYMXK5E6Bh?G{`b+7JRxH+v7Gac6iE)ZK2?rG*m;yDaIWD$Vycg!4~& z4F(x-!6}pAG+VLwZFbxdWn5p`Bm75l%Vbw1WNzXg+^EExZhSqf>~z&g*gGxwyjnyaSg&6BY$H3vu11BVN**t`EhXhWk2eC zpf00RUmftP4fj^EZ$&@O%#8w?sOX?vl!Z*T|D5DNOm`hSM5+6?*_wk_F`qTnX!(L> z686s;lUnA+sa)o5Hi`t5=VYzm%NoNn>CCD8;4sapKl`e5-%cWo?ISk~cEKL?i`XRG zW4G^9C_SMW<9f-b_)kbrk6TXH_?z&Ucb?)!Dgy6pxTRm6uA@hqdpP`R5qvpL=yh&I z59m$rO$()%d2~mE2|<_FTbD|K0b_7xE4udRwu4TlWo^RkRdb^fyc{d+*qB|B9W* zBa=tQe9bdGc$iaAfj(cQVm=p|<3GLEBbrj814#ur;~kkZ+z6Hfwo0-3%XL`P2e_t3o8y=$gPv4SQ z_-`f6j9d)^JMxTJR}3N+^_MeR<=nAwx+iMRsiV)9MD8Tib^^wpihT`1-M}rN{D-~6 z@~&)liK{y9a^9Tk?`*HM45)+&+q!sofFC ztwqSrhA0k8UJ;DILAzAqbv*c}aK2}1Dxliq(Pq|9B`Ser{1%`JlrL45tvMoxo=6${ zdu3kbiihw*Y9M9ucVEY3#ep$#kiwz14sWb*&AP@IO3VuEb3u)vm63XHlcdV5>5NBx zOBMh0HZi=lN zJ3&5D=~>#T%{FF;HDqv1TP5O=68@T4f`ssMbn{`qhGgknnqAaN^o|DG=sk< zdgQ%?JKn)G=%qw7h0R@^simo~@fnYGH9h^h$i;xlj7HUS1+8tn?{NKXwo{xfZE&|b zctA-eG(zX7o2o0iRoOd(`kox3K;s7NG0FY-O$xsU@+QBYT0^nQleDfhPdP{~W0$e{ zYBe~DS+_3nQ=nyAOqpG>MPp%OCEZ#G4T`qXxC_7+J9;7fs7rUtBH-O`J&gKH_|oPY z?>rp{7m(5`u&R_G2j_8oL>P73GsXJ)1n|h9ZO~2C2Sy`S63$7{gIA(+{beTbxMz-n zI3!NK5TN+1C;=>|&+7Wr>lm-H1#dOTKF&8{p42EK-*$jy>b(4FA&O*(g=HbsEdqpX zF_u_)5Y58ShdD z%)UFF$LatlI!#NcXgA0E&$8dL#lwE}KO!x9zlMK{Km6FqO?{-e9wp3uT>#|G(Kw)$ zh2}InVnEe>MscseqATNRWyD6T`>6Y7XgcAN0W+bd+DOWM!8P!BzoQx3?!(TVJK4h- ziXrL)?99ZlbuLQtwLh#);l~Ps1~lPn#|WW0ZJoy22wWy&N``pS!#K<$b5Y;KK}Y^e z|)vq~owoe87CAg`a#X*Tg+Mm6nMT9&A;FGx|znhjFou!&^+1?l>< zUlTZjQqL`1rHuXxsv8$IDlO9HLXU%W7^S;*o%B?G!Po%^lStN9qcaqh9s2NCL0fM7$8pzk&smhm2i2K)u_>L)s;oCWk7<2Ar z_z<8o3WQBYrCUorLXpm+CKo>(3g{u3!}Yq;So&|b;>&zmN$lP8%>U2{8x7#5r*XFU zah_l9=^|Txwk}0I2%{Io`840~0nZ+fpO)4+Do;fJU6kr+Ytcwut`jfzH^%8q2Z`Iy z)rrh|YfZ7%VMQ4`0t(d*7a|B>Xm%8dCSshq%3m9!`Hx7W=$Js?sOrrbh7wwe{qXz^-hw%bM>Oz|sB#D>!pWBW2r-3qJ*zNd#T4>%n}L)YF(U{N5v37(i_7faK7l@+QYAH`0eA$NEh z8-uvOQ{m3Pu0aH4p6R>v@X&efXqe0Oci}$TToh~NfhV42;76TpQ6*#ZjT)MgeS6u5 z-p_5+rKVhL8Zp?&L;;IW9 z%L6h(0&)&@6V**Fv?}-J^;N1HJsxA5tq85IzA6U^cYU~S7euwfWCcga3&rrv)0f8S zcQ~QF5OE1!CchFE`$6zAHGYqB@wnpBQ{??5D{#;BOHK$O(mtIKww7U5T`f%NpPqE# zi%w8tNI$x;S87)7aSBv{afm;ok$JroA{vYG1{qUQJlj+mn8k7}J`!t`6 zUw_N8FuCx@Z?d$}N0;og*IoKF8eiobKmM_k{*QNMG2l-hgWCB`%2abe#nNvZnl~Ro zYMyHL+J6J*vpC(|Vk4!U=lJ99G6-8PiO+cUvC#@ibq=Fzq-W_|*Bt}YyyTBB7D1Vn z_z@_!p2WcyKJ$?`7yB@Eje?TK{nCCejqs^Mq=D#lRMVvApFOPm7Z&yiA`Mn6f16K; z8mYQ;LiHJJ)h)>m1B@yr`-rsJiI@Mis-bA=);J*>S@dTe2Y3Y0(OX^a(-%?dliWY9 zB#m)GR1*3Bq3unhn!4Mt-?p|6wTc6Sf|6E66vR|zP{gE`B4UaN$`~MzB0`A3qkv2y zd0Gbqic~33p^`EWAw-6NKu9WM1(BIRki>w@1QLc2NV5Ch>8JDYth3(pfz>V-y2xhl z|GtOo`dwIidF&U=UqUY)dMSUNl@(~TF1SGpOsaqQ8oStXwG%s&r}{AVc2~qc+uvet zrB#A(T$!ymenzmTz`FRU;2hJojnXldX1T%Z1Db8)-OoeF;f@b!Gk#)$1` zE%_DsWrbre`BZpxal0Qe3}ni{)t^;eb9QR|i-M6pgu*)}cMZ0`D8MnDm(d-JW`C?n zg>NXsL1h9D?T_@ho{|-=hBCa{j5LCq%iPmVKChEf46m~kopo4zBfN=w;T4#7NWVWY zmB5Sgb;SM4Qrj03Q?>8YzXG)aWWgFkW@AkbDOK<_%VnVC@ePMoG+uf^Fyxbg zqrUN+M{>~^^8rDN95#m9sWg;sd@B8N{+#w%>MnjOL`dZRg3Q1ISjPO7rJ!n0QH)Ys zR|nF61VY9E$W{p(Z#N06HK)(L^FY<-6;11ZB7L|ZD^1SEiA>CcBdX^%j$lPD$f`u3pygtYc^ZueB;^$#osY|lqL$<~C z9LA6b?ohQyfieoF4DO`r9;VW+kn--C9M@cB9z}MF0Lk&uz(Am(!^omqRj%qM{op+C z$e~4#8jIS2v5+(Edv3E5ts7`Vuntl<_mvMvx}H?ez1TtpiGZ3#ZC5&eIJ@7PP?IF4 zY>1yf>(3NZqh-MskTTEgNu)MJ1(n5&QRDTu_p**~^jl$p%W8(rTP|yfJeUor80w-{ zD8{I#B}O>Iw34bgt*>!%&Ap?eME zZNB<;2&NH4n2Z2ZFZzo7u00hRrJY$)!-q;cCeiX?C3jI&80kzJ-5!hj345CwkNxUc zNmz`f$(L||_pp0Ss`;UiWaRuOyAOgDjgK&IrOkCyX3FRnO0_as(=OSRddfRm)%NFO z2@Z1_aX6BQLD}IGdo49EmDf6O9z=v7K7q%TcdS(_M)~^z?(ZE&O9bhr$FPkeqh)WP zVk807#g{;(bkZtgn;c>h4a^?tcq(I5jJ{O1+jbu=qi}5L&NvPpER-{j%d-#U54#*ZYOiB=Y4gstaGB1o=P{Ur&%e{|E^xc9_;&A5RxXHa#? zeXb#dzzem-m;nHH#jImiG?{r^Bi{qASZdAV4+0oi%(;1vlH zSJ=TIh3ost9=?4E7v90R4MrJ6*Ps6I(|?yX|L(p1wm!f6lx_qRH4i#v+1)0UII)GD zB>d-znhJ;zNJX1ZB2mrbRG!D0$E*U^7*$%WUoEQlag?mQ_4afn)Grq2>VFMbDi^dd zo*j$t%~M>?g15H!ZKpL(U?`8OX=PVJHs)FFKFs{8HfBBxNt1!g4p_`#gv2n!knG455+PGPPU{ZX=*qxvMgxMoCMVZibRUX$fEV_*C^^-q1af z1@R()iPXrXb|d=@BIrMmLu3P~c{TiR{6@6awD;{a%KrG?j`)j8{@So@bu!#p_EpJl z@g$;elInJOq*G*h*Oz6>19@XfyYQU_!x7c*GUkL!vqYGkO*2zG9pXzq_L~t-+EFX= zA+-uTt6DFO(La?*A{xKthPM!rv+*)tZ&&jHBMaPa44m3Rj(M6@RZi!K4Ts z9R{6>Ud?wVBd5tb(nekXnr5E~ClSZ~o|{lyPRWai4?g})$avf5<#yx9s>*M@2)i)F zY^45ztypM6|HR!X4hns|V6}xFP<_{qM7nOF#BE9eem-~Icfxgf{sJj|fP5}jp43<| ztt(3|AVpofuR1({^qhU1yWZ-JK_8XT8qfWxe{&ku-UO_g73Q{Cs?^0_o65)fDokse zOCe`+38`6Q^$3Z`7I~J6RybWdLVILoJsy)yq`X0||Co6VEM%$N>zr?p2JcUJ0~3VL z30`un7+d$MCof4{b&@i*4CCFs@34{2E&ut1&U}Y@Oe>={Cp{7v!ZB)Pp;;Dj19n@h z=DK-(4uLTUtV3WL2Lp{>>9^Qf+C9vZjnsZN5oX_Cu01k9qgEWoHqrYd{u!0eQlA`evG!<_NxBp>V=)N z-6i*QQO$8y=Qk#sh~L$NHr6qc;`|7D++&1gUI+7HH^-7h(U5`zEQKYW$SD{G4Ia0L z(yP@+h4gj#qTAV=AT5gA-7L$fBd`#ehji9a zc8gUMZCwt@3)D^Ii#@*bEXfVybH-{gM7St|8%EMWY+xrK7Z~2TNO5h)*=xO_3NhYgVC6`l*b4MahK9QCfBpE(8Ir$ zTx~%O2GTwZftXk#8I~aMa@fymBI{Mm` z<$WyUc6;kN+VmYlv+Q^1ph2Tig8g#lS;YN02n|1+RA7%VJGiL?WAN*?+YF?siU2ua z)=`z0-w5dbcJ4CwBq%@5KTl!K=<8K{`+ji7B_xt^^I7|Kbczn#Kfsp_Z+a7CWh_H& zo#tpg>XFSKJ+6c*6^btPc*FS}-`nPJ4U)JIW6vrW%1eM-9gc^v*8MIyBt}sL zQ<#$42jID!C6)8cG~`)q2j8MdD9Z2P_PMGhgH*`sYlErrBf*9NCABm__ltRMRz&m< zHSxF@44%%duu+G`ndQ}F&D}czUI*@DrEph3*NiT82-8a>0U#!(_6$|boTm?1*-DmV zG17uZ<9(qHpH1^Aj6(z>($}*r&tWYBzATE@AQjm9sTjGQZ}K}#ek&&mVfc^=@Hln- zY%O<{p2AD4))P}RMBHsNe3*(L3Dj_t>J*4wf`|Kih8v}6ITG0`$GOSR(gS1yOSVM6 z+E@1bGC0OOubO= zxG7I+(%;3y7|H#<0}f+dQ|8_TJGh}(;G}hfcn~PXjoi4)fx5wBLxvpv8nuIM0F6_C z$0ORfE$juAu$qI4`~p0~po#OvcQfBNcNK@xB$ZYWHmwR;bycN>#^9R<25A0$W-rjr z&|kuV9$>t{KPakimc#EuWOkAe}rMsMecMOz@A?)%#!{G?b5yngSV{ioK`AD&aB7z-{d8sfRtJlJUl<+|6Y8j815=yq zDfjginH+5P)_>HFS6I2OdzKFaRR>x(9XLmgSK)-@Zd4kGP91+b>afLK9@Xm&&&ChD z%HU<1itcIq3)MHqqLDfXq!+KTK%6I(ZetVptqhEN5F;D#(sN~SNFOV_cK%x4;3`iZ zETU>g2uHVPh&mrfr6n@ap=)M%yy`|UdKDzSH%iZ5?z6HJ#e}py!)_bl<8iX+x-Eei z(3wB=WuB7Uip@kcSQA=dF;x%$}SMtfB#aq`$m5%Cx9m&iV9 zPC&JV?!%5!ZitqWD|<&6fr%p$)sE22M=|ooUa6lO~pjn%) zGiZ?10SD9}O0W{{vToLhCthiW(zQBDC!>17zX{8#sr*StsdGvG1b+ar1CN`dD&JuR zR)x`8WN868LNY8r8xkS(iF;8yc7jYSJ5$=3aFu{X9e4Zk&Ftw~!qL?Zuj}Nl-)xq8XcL6>PG4 zpY3?W0_JJOJ@ZI&nC2ZEph*Vvm>23L^_-+UujUX&1h0iJpv!1;s;gH|4pVQzt?xzJ zZ5$9J;!q>{lQd8|W%W2NN1$3jL%h0d+cOyNBp~KGh z@LYMUbMIJ10?y)Ys{#z=aU zTxd!VekMOC`@KJ}iZ{0s7&O^d(`OoNX`E4*3lchB$^_4^>O>yId!poaRwuAcgJCMX zqx5o$^via{z@>__g|&1507GB{0SRGgbR!mahOkH79)Z6i(NKQP*-$6lmXZsg`E^;f zNn#(&44IXK{{knuWv;#-?63Z1IT_D57Ur)Em$V$k^d62o+IOG|Tmnq+o59Pg)R`oU zO=@ri{+j-Y?r-4LaUWl=u>S+J?)8fB6p{kyS?(@vY!+Mu0x8Gyar)B#i9zN zCI<4dKkW-EN!c^Trn%+Bo%WNmZ7 z)%gp>@MzU9vU4V=y_K{dUB}6pyZd05A>Ms4t=Te_F}Bx0HIOK)p?2Mb*@Y3>yq?fZ z*lk4ufkv-Gjnwv`(pGea<%L0i*-VmgPtL5Lh5ljzdPJS|H>7|w%^tT-v#Y%{I3Qs% zv1lc1B|C@~K8r~DzJ@oyjDIZ7)u~aO{rju$?M`%lK0v!qKAJNH7nFQXRAl->!vT5s zGuFJJ*=O-%GPo|@f?-##%^TgwkS2Ln_5@LeCDksy?Do!WHhHsmY*hv0Hb}B&IUEex z^gKyyi`dmsm1PPHGASy~l(stn<3cNp2x(eJr{pz{+tQZz!cwD(R<9CAZN;b-DhuyA zx9JY5KI>oJf66V!AlNoTrU%~uM}XHEIDJyarS8g8J!IQLqAY#mPk-7mM}WzcpgP=k z+P5!vaZwuibm^(0vyDSghu%(M4t5s5SGxC@ig&Hz7stCo%kl*yHn3|{5f*&mRTVbJ zM<*%WZ;%~gN|fiSdfBKy-x!D=(Mv{R(r45QucYT>?s2tNMOeIyttMVO&Kw~GXg6HY6{SXo#%Lk-!rSS+jy&dgTT;EAN4xNG?%EMfvt($X_ULwsk z-8Tb`aObt)my(pQkFr=hHPCS5tAHMcLuh1Qx;N8Dy0t~$0AAN-!uzbVTZ89R`gr%_ z7cvgT+=Lh4bivYR?8V`~QYjYlwBt3*_atpygKA~Ml_pAurn-=zP8I-1@rG28L?>nH zWY|^J$D3eeZsLi@lz9kd@<0}Au)CD|DhHOc0t@85qnlz!pA5HG#kaaFf%bXm&85<9 z(N}U@TA#bg!$;v1uej3XBMqt>HPM$e-_iaiUf>w~2W1h)AZlsB(hEn-5xI4<>m7NH zC^IAcgE1sX*Kv{ls%Hd&T6@GJ7;%^qpzX_pKTu;=^k}S%H=%SQdfp-9Q2Cp2XX*}o zM5BvT85J@dabs4rTuV+WR^=b{Ngb;+4*Q93UI|eGq-X zY6P69@A#>%rl$5pv-TZ$qp+C*-Konzjc$c-!HAn~vw|Jnq4u_fnqH_8m+b;e+1zE= zo54@i3wd_lyaJ`EMD{c*fNxUz0#3O{Iip8!R;8}u(%P4NRCC!N;*M;cpBbQkK<|vW z-|R%pH0&3z(7vMjzENd_?=KiC6*I|iZ~oq?TxvZLNnPxDHT7}D-rIETFfqvL)7%kx zki$d1EMwjf>^ROlg&X%Xg{;{CPpGH%%y~x^b&99PN-By zD62>$EWOtcP#@IR$G*0!jB#!8co3x!w)zG#H^`oujMwhj6&I6~vgUerRO68=ta^?n z{~#I2Img{OVr?<>*MZ@kZ)Cxz20%~j9pkCx;g@5(_fmfBGmn^R2c)ZyRfpaafcZvo zh)e2O!M$QLPeSJGNTlA zsy+hj9aE{Yftn*-bn*8U*?4)_n4&NYyJN=vev|et!dg@el2sTPj=ces76_o4AfFN0 z8~-R_uj*K&atwM)!sst9?B6~x|D)S5Yz?9BP7Q0C5^lpB_V+<{Mp~gi(8ODbH>xXB zXRoNw{Y*~qJU7~N(bMxyX+$fb8yKaHE<6m+gp-AiJ&yEVM}v=TmBnOf_}~z)%-+#+ z`m1gdY!W*3`Q>FEcV(}^^zSv)bDzC7AVY6(4Hun(sy13O{vP)rI%t9Jg~BvZC7NSJEO~b zuMQTV^eQ^n#~p^F4-$Mjaxl+X()X$Bg5*O_?F&7qe(f@aJTKmua7q=tE;O&vbJ%_U zTz^um8S`@+Qm)VzHglG~^5!NOIx0Jj*nZ9Y{0!-ahVp4khx=Io@(Kx8<%EY_5108f zIPGeqWKqCH<#`G0EU^9AoIdclX4oNZ)lZDK+%~9*=RqCijwI`>*Uqj_PqO#+$o9v*6e!AIrsJw@TO&@b229;hfhgo^h%_m=t#8`^2Qc{X@4bS zw_O)ly30$EPINrB3h5w)9D_k?yP~+0_Lqzwo3s+R8_%0trimHf+s-2&nfq$wNztR+ zZ8*|)?pVDk>ExR`ly4+TCw14HN~kYw{h^0_CQtt5KcBo7O72J8bqgbCv`1@~m5flP z)J}cscuG`i78T${T2mFoT7wt)X~oknWq3K|2n20}8D_v{2?!KhuE7id{S`ILe(t~N z7LVpwTPBbWsY5)sq9pstX>K(rxYQ}ezZO~TA05k+1IEDR)`mj=GQl)o{*16phmaww zVWJQGOmNEmc235%iSD*x?mJ6{F zmHVCXHRquVEK6F`nOUbI2cM#{ezWMLP3`&cyNmgFDuxd07QhBVeAqyHh|YYm*Vfni zTO_uzVJO|HwA##Sv*r>PVQoLAS4T;P>!TisUH2iXUi>M~8O3H4z6nEUNXiZD zICOm_fp@VFvD+}aKn5^Gw2V!dUzzSiCe{3c5_L%b=%U- zBOT9{*k$99yU`i$zT9~JJpXJVr$c>e+1V}_gUhKIrNcQPcXdo_Ko0S4 zFE5CL*ESIErB(~B!5D1Ksoi5#`dg8cYVi7hQ;eKdqGi8C#02!jBHk}#l+GhIk>QP> zUITN;oYf!$B&N$m-?X-kV%jXLExsM`O3L0@JxougIZTP5OhYQ~4TcmA~0pJLgX=!VVuGc$S zR&z-HFdV!4$L;qwzpwR#Jc=Vw^*N(q@RgdfG*KZHHfu|oefKPqk46{T1ro=tL*NPk z1T57%Pp0s6Zc4nBb?}nbpj_scz&t{H(@GRsSN3 z*Whr_dXY2yfzH72(IbRN~;I|9#7xrLY_5qv+DVH`n|eQYFu?HOtRuC zHMa5tYD0SpV&_a)>~0pLLxU=uNbCg0*7abr$n**!3fTNOuL)O4Oe z3?#9QkK|?Hf6iD2yzvP=nTlZ7^oyVkE*^h10X@tjCqY@(ElU@5+ zb-(BKvcN>NWWcHdB*hvDDSoAWvUJbvHB4CA@ellr%M%Ozr4Ef2&7Y05sT82x~R)^Y5KEq>W znGB@-8G&`~8taE4K8wLi2|4r(nl=Cz!mA&v636Tg$;Ok<^#m=8PuYW_8#Gu!)QZy5 z(wrLB5_Xyfyd6tcz^iypPu9S*JVnKM)L-5^dd=_)n*O|~Yqg30e4-@J3UAc_bQz`; zgtH_7oO4c4x;B3UnCro50@C>v;Q>g@*@hp`i9OTNR(4^z-c#HuE`Wy2%icGm*X?i9jc9c@3T$#` z4h}7E`yTtV_f|=N9w&=53Le@^N}ojQ_RskE$m7s)raDI1$^zQtj1uyd%9@wlZY%5^ zDeVVDsQV;EJ1JcIx$3Dw33p~56k$C#N>`h_H6)YGvq_sG%7^j1&_c!n^6o&DdiMx- z*a6D%gBTBx%3_S^`!Db(#V1-dxr<`xKNu?UJ?u6U%ua`3 z^JKalG`}VRM}1-JB8{tpL@JOBr8?SqQwt)j2~xkmP-5;Do1AIHq9;t_q+4Zu@M^Ua zbeP#7wub+75{y;O_cFh&=nF#)CE-|7=KZmZMhn_dxqVI~R3XG>G@m@o1hKtvZPK&S zpR&ZiW(w2f@ey+z5u!Om8flw@LK8hEy=wZ*+{fcd40Cs@IyB2K*By>csDq~e`DCjY zZS`rf(iRbRf6eMM)pMK22sOFV72k2(ICZL+l{Ex*aNYMlufr|8zpMbfoS7R-6r;}G z>zot9@y&OBT1@un3#ER7%b#&s{jdBt+#y<^^j3-tAe-C(b=2Q%%IyJN+QJt${Y8oj zLJLaMbZeqsgOHeXu`l$TYon_L=j+-kZi3iFy9XRM)OM&OAp%NO0Z*O#n4i?Osl(Q# zFHCX7xBT%7{rUn|~_lzdM*v-KnjA*a`*Q*{@nA-Aff>4q6| z5Iq|kv_dj*om;(EK72{dv$(ND4fl2|h{$P7r!~{h(oljaWP3jYhKUt&>Umbe+(7k7 zYCCAE)tb*RkN)a%S!hF|s-Utk=Agv&^?LPv%;&9#nK5*dM`_lvwDMsu972CP+4h88 z+XH_^7ahymZ|Fp8u;kQ@UCize^(jCU_D|gZ4MzIgc?z>vp23*vl9SF$=QGT+=z_I- z;KbDZ3KLiW^`(`%&rEpWR?eMu zv!1#6Bz2@7N4z4ce?d@kpC+o7(pa=@W5dzPk<*?eT}Ja07LxoG7gqSf=faZ|=hlRV zYX#zMFH?#LR~!6#*mmK0@~f};DXCA*X`;>Sze_-OE6eMIPi+Fcigv<2y!%vCRo(|7 zEIm*3kc&)K2;y0XlK@BU1j^FtYvklhxsUXI%O2#k=)OTk6O5pAtFTC!fiFFGpMVgyFbzBzfKw_v1cQseNlst>aXB+UnhvQXMDh zi`GW_FBg933BH{#{etzdgG1APj#kFtGzqZEUE{Zo#x^BhZG39?VFYj6pIuY;4A?OX z{JgXdNUjK0t}MbtSz`M-E(i^JIE@61je0B6!tT}-lMrfHQ>Wo?8J7Yv_45T(o& zImz2;o2@=AatGxER$2uhlkm}K_v42_LDmDc7T$a0a8d|xe)(Z{r#I#N@hc#cFlyR5JLMWeKec>Tol!#1=0B=$rSxMU}&w0HRld$?U5^UnL zFhOZQN+LC_axfCY1M;a+fFx|fOA2JU>D0%^8P}H#z<;qWR45e1z4ACIPK5mn^>dW) z5wdsMJc{}xI8;9NQWuDSJ^6lDVh%oAUmJK&$9uzmAD{S8aX1sevQO@o{!@B<}$$E;Mp}j-xkoH9)YTD&cK{ z_}>%D6&}j$(sBh3CfOCv3HI?0h zlVh*)*eD`hehM%B#!zAFpg81+lNk@zUhrAM@*v{`{?aJz0iqj_PW?HIsY$A(+a0S- zRPs;9pRvtQ3}yoay3ED949@zXR(w@AHmp#<_XN*EkC!#f4N?h+S93ouf|hl#M`2mte$ZW z`~T!(*;D}D=eW5ClYFP7&35{P9 zc3c=;uzLk*yOuAjmyToFi`ovc;(r7y?xj%Fw9dNys?6}`>%9yX0rmh55QICq>eTF+ z_89YZ1oc{fRLdf^0GM|d-ZETA4OZua!b}dHuY>Ga*fCbsmcZM4 z7!A0l+n7Ug`lh7pzF^K~Fc?bSF*GxOtm00aa|kI4ra9W8Bfd`KF-8Zn!w$;tFq9a{ z$a{=NO=arY8dDXv{be%Zj*kRDDgi7q38Ux@5y^jHx3MjlQvyq=^||_SR=w?&lgdTSbLPV=5df9TNbg)c*v)xa&42c&Q>9W zHZG6^i;Zm3`lhCO>%Xe?%@y9sNaA=*@sXUgRgecTtCf3mY;xr;i$|B~=L{X<7dl_E zHmQE}2E7ZE7=c#&#X#yP`hS%R{H@M^5SJjeiuYZ@yV|mJf&ZBPZBSD#@dVXKt1Pr= zsqaMU%^BxG`t=W}hx%xVAO-%}=*VTo@aw{vs;bp;fnR$P;t}}_WxSf{6-CJaEsDGR z$-L06YhyCCfLdJ3QVG`wx#KTf%ez+2=^NMMUVDJuP*oSM$_fuDn%QMj(Q)wYqVg42 zTre6_yq{zzeUg$LQP6a9c70>9v{g2YzxwBn8w!hs&%OQl)ae&dmH+*XJ2^C7`%dwP z!xQ$^vFDg?Jp2XwDu7$?;`rV}wZAoMrdf2;)`$>J4n@}=DG8F=)xV%_YY|os3p94k z2>+AHpP6)vcUus%^xUaHx&{L}RQ2shWWU&l&>ITnQ)hG3N(1grNZ_CTWrGCT2!C+c z%gbJ~+zzc`Eg6?){LoF_E#2+VzfAkQd32kt2dtjLVy+h;vQ{xcx^%1>yVS;BhZd`A znma!i5TH9(`-DaPvtq_vSCGuWdm5$$9x8hie26=HdaQj>+3g)&C^v4(8FT&Rwz#E! z(*w4>#(F#ccjWD%Gz8=OYvglyP6&_=LhP|nN?>o?gr5`J54j(s@ zd@~H0Rl;95s0d?mdZ=K3e0xXDBj9HPl4$8h{IH<@D=#C{e?E!uec&8$R(lTB!rcbc zwFb+opNaxd+YfS|#OPdQK~ZH7`LDGgCv#n|ojTxC5V6|C@BD>9_RaI}!9^Fg7hUM~ zbo1m7g90M(?VSy9Fg%Pb(La)KRfy@<+j-@4mTAJRwI0{g}B=WDMqi9Q-!bSZL&&-^Vf~~ z2G^em?YhMf2}Ey5AM6dgC9R~`G(WhK;6w7&Duqm6x8IW1r%0`)BetS&04m z;s>{n5(*<)RT#`>nok(((F?PeZahX75OiDmFE4LY5 zOz-ss6y^`L`Dx)=EC}660oN>?!7P>}{JR>cJpCMYC~;sAj5Dhz*;UpIkezdEjuD88 zA04U1HEF6~WgT^@EtI7A!E*WB3sa{)&Iuy_H$Z5LN<0!fq23{wG1D z)0XzuiYnv^T%+%REm4YnsN5-OZMGCV%qC?Xc(i(Dppi|BzG*MNvY)0ozM!e!1>-{a{YO~wsSdatXC((wY-$zslKNGi9w zuDB?7Xu)m@9meXli;|X;=IWSxBJX�+S#_69NQ5o3K9aHbBP>>s|S?A4UAJub+)l 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

a(K zLo`$V^g_|{E#$(0MvxUinZN(n36<(u6A7nd#oy*W~&XK#mgeJ%3 z-1}hbqusO$cUymbM<(vK$RxZBjuh~&3OlP=`-X}eDEK6~WWpSo368Z|%Kh14sd0!i zh3$7CAX>%>SjY0qXBHtU@(|;|h(ma%}-%rFgGYzLCa5`(0u8zv`RduWsM?p}nbF4o=Ji z_7pE8{NoRRWwL*UXa7+P64x_|f;#w`KO2~srzfrYVvnWyr|Hbcq~H?=pGHx)wd8%m zd{6y6NL?omR9~(@USaIfEg}BwImi`BwPiV1MF?wK)2(kj=n?E?FqBf&P~U}&h$^=I z&)=eTC1bs0QeXG`7D0XS1W&N5haadSdtX?f&24%2u7wPe6tya+VIoZYD97QB+|pj% zH{94^J2SNP%Up3Px|Y!L2#NFojCLWc`p9#EV|S>s^?}@X>oeEfX8R+jdffh~w7Pkg z&(`;n$m8aiA4}dEII%vzTW;fYg?5i-p5;8{KQj13k4XkHSP76zo9x|b&vz+RhkN%R zu_Zu}Hn1TVq{|%rW=Sa^8n;7s(d2+=8J@APxWb41OSmjZ@>RKF_Y-Dmt$ zoop>)eN2yDZX=l83~PdKvx_}*^>LUmxBc(1yb!kXy1#VVac)O2V3VuZn~nwMlVcq? zZW$U~GfQ2r9+#J5CjL#yO|1fx$Z@-Y1}-2NF((Nc)21 zj_e=w>!1?g$#*7wsg}K-d(~t0l%qlCQ^s_;kT;IU#SSCJgCM|ZQpbgs%8-Z_wCaXV z!WtWhyNo{=stg_eleLv=Ol-~@y6xy|?XA#~F60n#gF`-saRm&>+Cc_3E5I;3Bu>H6 z8eip6*@*{Xrouiv-Va=H0HkmO+Dtj&2j(M!DGKr7N*7gJs%1T@wd^uMltQH)Xji%d68V(#hWIZ1O4Q@}0zTK(0+`y~iXd z#p@GYM-I51-Zslih;#vyv66D{T5sG1X!ZqPf6Skzi*tgqz{P(cV+m7;$YW4P^AZ)6^=-k{bvR@ zsu30PnJ&+Lt6yW@*x4Cve+6!lG^ker@B!LSfP54FXP%h*lh$@y&YiG_ljeUGUP8he zlphCl8eXtFLJOfv-GA+HS3ka7+BV!y^;Hb@J4JBDiy@6N394)RFsO4#OA^7x|BJXk zjcW2-!@pr$yKB`diXyEDsUymiY6V(^WVaL%B1Vxx5+S=R!UN# zk}?k=M36v%kW|JhB6A{1ArfRJk}!lohCXNdydU4S-u15atmps14|{EkK<@jx&fz$I zM?>HI_bR`@J`ZTs9P;e0O^P8#VZJ0I zLyf%yqgqs(LNULkyS%eO1`)^CJ{eD)oU6jcg7Y=x!5i-V+{1l_UBMcswMpN`#%czk zI`{(cQjDb;6jBnYYD4Niy8If)p~(L2c_J>6*D8!i)9=Dbo|MI(XKB(^>j|1?a*j0~ zIO1V%=2IF>ba5UNofClHbL4&~faT@w%r@K|Mb^tNh`qFOxHSxwO_zgI!7FW%fQDX0 zSt<7r8vB=i7xv~eVH@dINxS5!&kVJy3nQu@@qf?nlj{f08Pu63qrZ}-)gpuCVl>he z)U4`L{8A2-Y5o@&PHW_jJC_z6$=<>4`e50bb=J6FLnUj1^rT}vB)Ds0l@`IUnIcC~ z4a4K%jDDX98mEB~M2i1;cQosE&55b+1^u*W1SA}dbAf(R=@nlh!%=U2oB5*Gfi|EA z0fyKIezp1)-9caDp=0%6^}3#I+%1FZC`^7jt~Nzp%6I0>5F|VB9tR%8`mPH6qSFy0 zgU9o)JBza^Qhp;5B{s_x>11S)MWGJA@k#| z8xIKf=h{1+$oaDdyGka(eaD6KlHorS;;8D-S?BK8M%8^jJe7Usp4H=$*R*gCZP~s> zSS0Cr-0h7SK8TCS?e^Xa{d2O$h5Xd|DaAYTB(v)wQ8-?RUIO94pHq*roh1`>MKcXa zIgw=jW8%c>|Ju~vi}CEcy451^Y1KfM!_ISo@nsRrI`e+Q#ZEmZ2C8BOkbF^ov=wy| zX0-d(90i`!+ay!3t=mz@ROI43Hog;?W4LE1hf$#M$AyFlo0Ja2mvoHE zz$x=AbZ6r(4nNnH!AnRFXHQy4Hzw`ZT^c}FU!_$=v7EkgGHnFU9SWOP{$E00UhxxV;oB9l|eNLvUv@7(& zhkwC?WCtArBjhS1In)v5gr_ZO(jx7P6zmwj%NeWu!1)+~C^$`PWQdLk66%T3r5Gx+9oJQ|X8)2#1Rv1H&_W>B;O}aU)^4GXU>)t*mwe07 zjrOj1)r^m`JSLq#y+Q5B{UzbVyVK;MVSUn{h>r~GB)DK;{rxU>y=nh}OG@f;0)`g(QaH1yZ9MyJ;icD}zj{u@ z-o7H>(f*g%{UXct#s9`!#p3c!j}~|&7p`nq>fy3&|4+%h|Nr?qeiTt*9NT*B$A5p2 zWumJ#hW5QTgIK*;l*uuTuK1&L>Fg530B-%M>E!b9tj(hTn4A;h9?U$B{9)Q=ceZ!( z4;xCS@^5|9baKhf+~;a*P-`p`56rMrqj_zpw9i*vG)<5Rbw;a}u@!(SNTCG(26o{Agoa zQhNWZFS`Cac1&`Cb$=w|7zg=-A;4-;UYU{L6IwhIn0;`VQDhSk%5)BaDU3^}|hK zg&4Tt23F;S;2WoJwZUw?Ej1cdb_H;_+p*uZjG5e)DSyO_1%EN-=VG0F zuzxJW)`BpCIlx*H;l`egxmAv}jgNF$w$e7veUCaOdKV?_vc}W>>oeZXh-M}_6i4;t zK>)FV3UQ{WlF{zw+_qbm!V&cA3)n=L6m_&rIu29XD#MC#lRi-vb6M^a=%pOt$xlI+ zT{K~-K2*dnyCxKg64mtIs9T|r7~!%t*XF&NAPX#NH5vmeOK0P%PK;aG{`O}+F|R`o zBLxx6n68F-8(t_=pzWsh1sPKh#Cm-N;iH*{K{BFv#1v++862`&aRPK0aH1lQ!jJ6A zek>HdRYISkLNu>s+=}6h%&Nt^YU=`Ns>MA53Sm2$^_mc2(+qobUkEhAX3J{k9tJD4?su(EU5<6m&J;vbCCO8n@L(Ds^rSWN zTXOvV zct8_7ns{0MeZ$qb0T-HX|AULqp_!;1@uMwt!ZjC=R5j{`H<*4^)Pw4X$@d}}AnDiG z4#Vt%OevZ@uS?9Hkb7NQZe(oqy1?2)MXj7wPNa~_@IIx}5W9iY#lhL0_M+m%e9GDe z-NBIHI`z*^xqjz5ky+z`Lh7y7-NU){X7{T`g4=-9lATZs^pRPneyzeYlK|H>eXfs2 zB&u@*b#a|Ays9bXFnvoYp0FQ6+?MlIev*?pW$wgEq9lb08A|%Av_(;R2qKjVM?2-7Wg-nzhs>C$XPWb{9Qr*NY?zYxZWIT|8bEnu@0Y0H=vVF^i4a z1#^T0tR`6Rp9Bzo8U%_4C7zbfmb_{Rpp)fW0#^djL!WopRf8P748Tr?Z}Ph)KTg zdX8{$HQ-^V`C||sc!U&HLabeHcS#4tiw9V`tUzEz^>FZNU;v7uKlb;!6~743FI)}- zu&&gn=_wd&cg=P-E|OiL$(j*Ho1x1FO)7u2${PLB(9I5_ks@#zkFD~MIY_-D{EGr| z6f#!Nd^0~MwRc`2kbtGRO1kJ#!E{Mt%VS;1Y+#63JF6kKCu=8I=EVjNZdHPLfzB14 zmB0WM_70E8BfCs`8`tmJ(}FMv1=IVJJU=vJTU}4g)8wOX!@`67v*^LanJWDB0(cEq zW?!V%B-A^&dLmN{UHZ(AlgPDsaFhAi;%2&AvpbrbBE4!=2Xiy+;$-R!Rx}Bj1N(KH zV86)G{<42fn(yFf|I+F~aOJHMh>J$sqbr;H+KN_-x~VF;wUlnP1ttA=D*0qTZjoH6 zNGO91;NROm4?F?XX89mis9-+8dt;&NQ!|`HohZ<>10?}Gf?B>ZHd-e z`)5pcEx_;wPCd9PiYl>k;cZ9CIx7B|vw4G{s+1bmx^lzoxHIHKnRN|7MK@ELPm0VR zj1q1EdAVYk*Y&PwD=ajUR^Z${sXYzZ6+_0`&i+!x35C01J9=HP%!BPysJVi{YLpCw z)9=Gqu%;2YHjSBqP07LEbYe5UN`efDMnBv{9=U@0;k*x{orE3sLS)$q$TviehZ^_- z5i(zEB6R?f-=GKl8p4e*^u33Hos4u7Zh`72Nuv6uij3a+lY66?)ZeMm2#7M+U- zd?@jPpNTIUj?J2`&A!5kePd}Y4+W`iN{V67Qn&_`F8Hx8PNZze(_BNF5C!+g7wSKEtE_I6B{69Z*{SqQ)vae!cYRklQ(Ns-GJJtn*l9nXWmFqKpeFh3TWmiX zfjj+V+7Pxj>@Wk$Q_#4yjR$_A&nxu$R}n8Gr_6)xWzIzAl*R_|rp{~5*wWWglPB9H zjH1HX>xRW|8+v&k2^WyCD`xPXD;~WrEy$};TGk~m zzsj+Di$>akFx#7Izu#w}ux1g}Sv0eqR^&Aff;q}Q*5vzykgywP``SKb z92WLoBMm7Gd#Ukl=$f5ya@rP-B%IW6J?dL;tUs1Y{*3b zSX2Y+M?8a`E7ID8vz~Uh>`!EOnxrOKM=+Y*NWr1dao^t_8UdKsQuO`8*oU;v!}(%; z4mye^6h`Gd%a-a?v<1px+yi}?{#0RK73G2 z%67=xSSNTgV86efS5G&@cJ5)#{)?)qNZWij#_g&V1@}P5rZujYy&#C1atP3eu?LdqVN-4lidCn4UOeG2>Y?ZMZJGEZjx zy)Nn~<@2t#GPyh?srRAp=VUqePr@F08scB5{njn>_d`Ar@ei_bRaElwsc#>w20_4Y z?0ZMOU|f?bh(9*E1wGVV@+@qi{959c(hhP3MEqF^^_j+3#EhFm@SIvhq`G=32{55k z#Ghzvf;c+lh&~&q*(#QM-dRR3$2k9Ql{Q0~ff;%30Rdn23Xr}SrvkehKt$o`i(xy= zTcEz&>cC*Qb@rBj%eV=wmOTN1P62V)wQd_=@!15SfyK0yT{M+zr*sv${7f5K^fcB< z+%?%TpjQyS0GOgWMe!*cj}MAHI~4pJKGc3BRR6d&+DQYvgtsXHQ0M-9Y*_ygl=^?K z%V%$@DerR~8|QA<5CVF1UTV^8&U5nqMt#?SZySUc!f!1&Vz}gWzjtThf z>{$j=6H@{vKD02lfyXO(6hr!s2)RDSN<)_jC(~B;hSxnym>et;t95`9zod)7nUbLHL2Xvac{BUi`9l8^ z)(Kgi$X*d#Wx>{|nAg)?PPJ}cO$x#!Q1yD@z6z08}%yz{3 zakz3Z%?-({lHktBQbJn{NV3WaTCK=={87ma zt4ZrGhV4D9AxGorsi>h3BtE>CE;sWiG0031x)G3FOxWv?dh?sgp3l*Jl@lyD#6#7b z_{hit2?k=$4qs}}57ZrPgWH@Gsr_aWTh*94=`$dBuKs;2^#Zs-0L`@|;I?*67ce1)63jiGRbaA8LDm&gmv*fP z4r>BOb7UqOf@j)UZSXQ*I1Q^3uowMGV&;CPiBX;R%4~P~d`291T1ZSqTEkY=52$5R zdW8G~mPPyHF-zw&n)o-X(fBg^B4tOaqi~h@&!8Q&uk2*8Da2Q3x=)oceb#>dEEw+ zG?Jmb(cW22QwlR&*UK#_0huefjI7W@Sq@CYV|C6W+PD~|d%3&`ml%b~n1xS_|ANl> zw`p~DB}@Of{58zUOYpHUwF4k=1)FexcMT-G&XP^hn{;k{m!bb}BiaceE~PQwj+-kI2e5;VikVy4cV|?L?c){S0UDUIey6kg z^57DacEZFLM8%y1he`cafAb$9-se^BeodL2M1Q}d3?h;QPj~v#BEZP6ALgz}FBk=q zYrvbt2NdMd=QCnmt>IM$2%S4S9ATDZF+^=A<6Bmo8u7e`y;;ig_Z}q?9j=SjB?CE|$3f(GgaZ z*!Y6qmq01(RMUrX9+75)b-D#^iNT4Q`G?FDdE9NsA0y~n_%wKp?gcPQ3~KzR;Bp+Y zMTy-9_~(k;)lv&LRG;*0nzuITY570OsWJZ%cD#4VL6hNvaUo>*XhN@RU5G9KA43vL zG*SlR-nE8{?a6u}}$bL*K%Ee!uTVwZ3_K(_Fr7&7$Y z5t}s#!=XS)>xea+>?gs=60a^Dhi_8YP^gS1KC)}iavx*%y?xjo6eZ0$;YH3jHiK|j zfbeIkyj8qkJf;cEC&hWx7L`nkoo@hw1%6vr)kd@M(r|#xw{Q9R<%bgs7LCM&=j3bo z@T~by*5Oj_9#BSwSkPOuS9JTGaNI|*8U;;wCI~WkKUO&|ciiHc49zO465K&+a%d<5 z(V!f!WND>Ss-QSrT>`V%Q}^S?g4?u1v@u}rL^q)5#j{rXYx<)pF36hU zwsBbF_=2n|c=BEi?fsCX9>Ly4yDQ3Tj}badjW&qZcZq5INFeRhfa}-y=Dj3J+%i~` zpil~Hi9|lK3p@ww(f^y`GGp?uplN|ck9=_X@MvS-_l?Z1)L{1)@E?Njkb4YBKnW7a*y7W;&tG5arCX{3xJ_B`jX3c(0n5Y zlum@!d~zHv2=bBMuWZHo-l_swTday6p!B(q>(JTCwre6z(C3Ui14At@Vf`Do^%pdc z9Da;fE-aoMxLSjk(s&V!2cA2tX`Se`*^9+lZ-ncJaTE7K&Fb38ChaRnFAfo592Q9e zEl#)54Aad8@iIFPG>&J35|D%N93qRSOIjr{Synu|YNm!^9P7)aqB9zq@r?s&*gRN+u785;sf?(2S7l>XE8&IM8!K)gq zx>jY@UMyLk)R}vt&vkDY)Q;rhyT$dUiC<RHfSP0RRG?6GU!(cH5=&ur@Gs>ce)(>6oFNusGBa#;u%j`++E?vBm zQLn6?_fq}6u0@v0+WH-gfq!p((plyeNk;0bVY0abUgY1gAL|nO$vV%%nGjP=3YVJG za#Vtka7no%S8Z4egt|jYSmKVrr|4Q1PguK2_T1>V_R!>~q>Un1M2RK?LwZh55+CFf zh9W`tnh7_`uOwDA?HPI(DHHDzD))-Eps&U;<`rmt`4a_=*l3H@c=FF(E(RH#)z<34 zq%OJ1R>E*6D5c=@10fhdfVls;HFl?7)g+*gVoj+3I(|_6c6-Flh8pH4sdxgUCgHud zf$y};zhy&p+j*3;iaz&a{Ag1^@D49ccWjB|Vw>UKD6Gn###ZBua!2u9O~)upVO}!( zaJs>e!;O&mbPrYTW6Yifw+5^w;t6F9%yx8g9P=*!J<1qj7dW-z-d^|im{%X{;&Cdf zpZ6Vs=UM1qP)3yzloJJV$XmbV(FYWJ%sq%+)nhROmr^lc@*g*3f*BFsJ%7&h(Zn0v z%X0L6;inwbL7ka${2p6zlqS4BP( zY|!+}yC^M?bipSpS6U=Bfllh|5T?0=HV*iTC30f_m~4m6R;gx=rn}=c=jE);L7L=G zc$+PKPplrSZOFJ7`v7w<;ZNZ>>)LWhM95M7177-NEzMt*a+kk@mM`&)x5F*puErBQ z;Ze~+S(%RW=DzC+AG1q}nZ}hQ>w;7k?x0Oc;f#dm?$8FmWJNSE@Q=vC>8u@726N>I zGX{Xed>39x4vbLQTpr|E{=M#>&4`qTNTF@!nV6B{>Y72_9zryHsmh3d5Pl|Xz`xerEtAhUJ1SzZ%V@{-=z0759^oozUu3ph7*f%Z^>d(Ru? zO7gpFe1CR$l4bV9n71+e;^}^{^uS0qsmyPzD1gor)}V5qRMi8t$yeD8KPQ4p@N6)2 z_n@n5n$G(T!n#)g7&l=|$O+}s(XjSJL`wrUdAW(y@_-tTV@Ou;LhS)xNt+p6*YJ;2 z$9VUQb7Eg4bs6k4y&DZ(kj~y%t$*uMB+9d^o(A7^mwt{nIGwajUkYc~roY$yCmgZe zQR?GziZA3{AcA!-P#?{xE;z|~riHbkbBHE#47oL_Cuy&8%U~fc_g=iKU~fvh3+2wW zYvicToJ`~px$r)%`>TEbB;0r6W|MYBC)g>qCvG_Ef2Gcf> zOU8pjbTw>ZAOPpAz>IRuHD}Z^`71j0xCPb$EW?8!ofW`kM=R_w!=TfISMiCaZn)YV+REZau(aP>xP73S}C@22WBkCpwSlxNUkYM9M8dlLebry-~Wx!voxj)@C1 zA%XAm=>}XZp&^5?78;afqY^8=mScbL)nEdiD5I*pifCaoy9;r*1>_YY&%qyZ5JW{n zMPz)L2HlD_*{|^^)9g5Bcu`-+)NXnwA}q0<#$Jyl=x);2G!D2Tvh7*TBNc57d)HBm zd|$&JRcFcR>pZO<%hQj6BU51uz^6!Sm$pEb*%5T7llJ>g}x9k zf^K5IU`$B6DrcnXTS}7_n&fgT%HC=Zz1xpB!cGFnMYYd+#S$}l@w7dOYsR#GDo)t~YmlA7t3H*TW&{XynU#sl6sClkEItxjKuGYwQ;YYC}$UaU%Lqo%2EKF-i_Fd6h z9M9=1o1WT~G~L(w9Mpc;HM|EhznHoZlhpo@!B83U5k6m%R0=yPtp9-%dF zNF>4qg|o!r4;MbfKbct~^(gwQ z!)yRJ6P@O;GPMiwzX1fZNxJTwva-(yhy0*3Ci3G4lEhoUMj5QR4rbtG-eh2JZtZ5t zdBfhB%_^4q8unfYTA%{Z>gJ~N=bR*!>2lh}X;kQ7dN&Yu_(Eq`&P_?y;QVT%ZCbXN zwcjD%Q^zvZ1zpeodmV`yVEfo~;sk8A5_9z5^F4O@8tY%(lF~1Z!P2^FWO#x0`=|KC z?2&iPv){twxf2w=M#=Def<$lL<7zEu-9^+elap+uo}*o!&m_p7gij&c^6zzDbPZI7 zrmYBI9u(o2aXNGp{&7qjdi!)=((^d4x+gso3pGtHvU8$+0EO+DD}qWghvkF@7I-5# zmt9pwT@xuK)6N1H)uBA|l!FgJn^q)(2En$=*r5VC64qqm*TPStu&KLfRi5`lCZEZ+ zn%s3Dqn}o|o+yZ|YC}o@RuFqI7C}cLo`)%KQcS5oVN(QF;^UU6_7UXVC$wJZjk8zb z>D2n$h4H@V^tZL*ZD=K=8qoS*g`!mpY*Bj6u?qa60CnC3N2jC zw%*I{JUEf}UC}hCT^ZUgz|7g@Qr5~_8j~l%5Ix94CTI8bx{}RgO!*?Ih(`2G+*5~c zfM5K?Dr+`eEqg`u#Exb~ncT6uk`j|ot(`z9ngaSTQbHXB;YcJywEiQZ+yF`{ZPSwQ zU$bbFr2VsT(Ute&?QY^6m_^eo=xYO@oFEz3x<2ToU}`QKDqia})Mk*?YEszLjG6fs z7v!1)GurIcBlX|wv~YsD0%yeoh~wYJ?G(E((`yn@c#<(kgqm;r2mlQPZCpk8m|NC4 zQGtSXH__rlVLmArRWn%JAB}ilGva155p0X;dk6A^67oMG?MN6zy%5AJQ|>OIlWTX= zT9I2xlI<$LxYJb-FseEUMfi^NGe{>Ggl8Ith0(#A5-^&wH&|2mXk?qokgR=VeI`!p z)^oR$T#j3X$xk_0abw!V+28&*Jn2|kGj3~LiI*J{t(sQn7{`jm{!JIZJO1C505=}$ zgeC;5AhGVoohF!&9g@1jb_(_nk~thG{b~gi&y<>t+0>itU0O z8@zMeWT!NjRY-SL$qzdB(Rlm)?UI1B^2FTvZw!)*uP>ABYXlT1LdCenC9yro#xF(m zy`HX(v;GNrt*A*fF6OvO*({qGLJiOZaLcq?Pc;Rn#I6*}m2}>b8q5%x`<-DRRU#qO zz(^M4(L=DTyU3#Rv2W<+y8pl$*eFca_q0V-CHI&W3#kPGgezO^_%dNt>LUIOg&`{$O+vS z*qa8M@_2g=;%F^y)}!<3h6AKs=ct)J)tbQ4@FeSnO4_KoieD|okjXn?ZpV-uxdet( zV{28e$>LD!&L|lMh(Q7Q)_(;RFjR|Gvv6jR+tJ$&moO}nt0h*pOo^fd$wJPi{wGYjaacs$1Z81!kU z*)2)C!ea;~s9n0iz9gFjxbp6CZ@sPN_c-uR95OnL!rvTVI(;l<+U z!J@im&b3$l&qM*aSF*|pfH@Y0V=IGrbWJz zo@5`6J5ym;2Xlnkn=3aUnsccd8rYDlzHQ@hl$AtOX-+g>KBI9jq)L5j1}m=_`pajJ zdKfJ@=4))qupi1)|J#89R}(Y(Ek0R}-KNPMo0E}vD#RU7!vhnK?cR~knB|?3YKqgW@yZtXg^(lrb!b%$tk+TZMuj_vrk!u%QicT2;2SEU z$z)E|F8Z>Oa8R*0c5k4DJwxrP9jJMH=*1CoO(}2cQhfst_;yHWN8K(lnl`tihmKCg zMZw*8pKnVnB|2ZH<-f+!uCzsx$1#R9^PGuQP*9BJU`>fAyTODn$Z`zJg6P6i{FUur zq^}TOSt#Vj4bnns?~l;PBbqun;-2FcN>}Q_%xs7X@Uc({{lfPC5*vP>>-}iTut{_8 z&F0QeqK5Z-DLEyQgtCLFB7%+BAQ8p1QZxZ7jl92=F>*x7RgXO0d2=m*sn650@f728 zf^>etwH7742X1^+mfV7(@kSjW#nn8By_x;7aH{v>bEEE|d={bhQ|_(mJ)YCO4)*Pu z>@jfPo=rW)m;D2J4%I7MzI1tfI;sBDA~F^6sm`7P3!v|DhlIbu>996GC%!R#6G+eP zATWpnjgw8QK=Y$g*0#(1#_K6&uCpp5Z6|GLVLHx!C5Nn)txf|3yscjtn!XkJUii%h zlN8q-a?5R+pU?`ECq9Nsdck};!T!n5k_#b z5m8_Zsq4^~xAqJtGR*E=r&)WRzR8SNH&j6b7DZPjPVge@e0e&_usFnW(}XqCEE8Z+ z_>|h&X0;I-e)O1h1xL$@w!2|O)%Wy32}a+n=?^yiq4G=@*hIL{vJUcVcbO-Vxspp< zAGiabMHU$r4coS0+Fh&)hq$LQNeI*T=u`2dyKUsY2L zjvNp{bKeQ$wGvT!T*$z4?fIXT-E$A#Y(e@bOaI;Ds5p5+u05HjFH=*NX^={4tWRbL zCP_OqxW(oMY-$v11Ff}KLiu723`Ot|LYoJaQV?ADKL?#0V(W1yFxG_1yHm4i>D*Az zc0_}js8c@&aE%4-CxaA}g;e(yq_3;2>5iY)Tr$J&{k(6aDjnmFmV^@B9t!2wtB zV==RkdOg#i59|;V%pA#xiv#GV(IhwYx%$+@3j1gb*2xwJL1oC6xQ>pG_+DeA$8o_f z=#j*7{oO=#$h>k zA0=&JcGrj#v)Sr^Y9|pc$!%T`s(7jIl`a043Ru;nS3|XBq=_y>2V#rP`2+NodXeK6 zy#CPG*#={blhcf`@+waa3a=VK?bTgah?0FcwM}DvroYnA>(Io-s1fl0140!(gxnfq zX56k#Oda3t3puhQ@r36OQ`s9qk~+niLsu20YW-{L)6VPXsxWo{&XcHyE#$+Bjvu11 z8>!+B97VTxw|&vPI#5l>A{);rqoy7o?0iQUhTS;B`XCf0UrD_IH?uhccKoNcJRWbL zXc09C%`veu&0mAiqM#$#Xpes4NXDGYenA--hU^(Q+dv9;)5Xb@jWGnX+^977zGxrY zGxb$UK@K|>B>6|K>9}hoSW`N18?wL@j!$v0kN!X;H1LeWQ8?(1l#J*BBb>d5wW_Z_#mD{kOB z%Sj`jF{H367z(g@zOyRqh1DLB<6+nHoN1_bif48w^8j5_caGLk2bG;`8M3B6n!cHu z;wvg}iIPc7z3f0?X1|gZ@>q_(wfo@Yt!2bEDyIGOV9gcD40;*IdHK*-o-TAbx2i`z zscLL$suej3O@chMY_1b>$+%k>wsZ@#!`pk~-Ppr#%=u_JIJ4hg&GBe)s5uZuMWa@nI|JssOGR}N+g z@{nt#MfIsjZD`Q3h~3tp-AulxzZbiULoUT!*O&csC|e$S*+tpyxr?sSx{H>)_QD+a z(HMGpfO$HcX2JPW|73aO9Gk`^y?ebI_#)K6DNv{a?*m zA!EwDik@-WLPwhrT9=7WujVr@R3?-HaM2$h=il~vOE7`}zft3iX860qng>pqn4B zb>wf9Z^1uXt7sU>Db!p$9F0I44#xbw4i39oVMD&QWlgC2%<7QpKwRCOP$sMu7L2ak zAOMTJWB<}%=o>iB_6lVz9N`0;M!5Wfv9_>c*k{9CdVj#L^Q#-@j&$k%24uv@OoExJdq- zHu|YDim+e;2tOmBpw|EO^Vr|ME|(BdTl>FTC;-0@*|lLlfhfmV7>h<9rJyJeQ~Fmd zb2mqvqb)5kZtX*2bc9?XtU0v6|K0du zkd4HjeY34MafpUq(yF-6O!m-l-u-8*{%W6_1{!;XM+dZBVtVq{Aaf~EDw569yN3)5bL2Mf-IA||LQ zp2MtpgXFkZ&G4ZP-_%dhgP?M{Awm!FBA!~jURp^-rXeh@fQn^SfpF*1u}w`41Mm31 z^My80jl#`zmN-KAQD<99rFiLI_Qjr?F%PIqqDV-5Jrf<;or>7~M(cUIhGl!|;X4eO z*49w+P61wyHSQOBa`&2%Z{K|ZFc-obN$U)MqBjaYa1SdbW`CzbXY7B*Y;Aa4k#yBG zHp%ZN5qkAzn*O`_y{6kj9||%USOq!;s|m}w|LVy3UPLx+J?+h7);59lj41bzW;D7Y z;Y(%3lL>nV@e9LHgB1ZdRhKj8WV4_ahF$A{5I?Bs)iI+T&D?dm0~!($0In$`X8j3A z^1d1EYJwY=^S@<=m&yDACVly#X;U^(R0Z)pa6((#&eVCy>DBA3y*jrjS>q}p~4FBF9pV!lT}2ti0JT#oAZVUntv~{`-9^pu?pXJCSbt^@H6N ztfr24vkPH()fwJsT36t|Rov#%gd_4M6ymS8XtORJK+*WJ5j+N7sY~3M4i0q#banHi zfgQ-r7|7jL&P13$aNlo7rnv&dTW`TjY~o;*@IpP+R}`oT%TfgIe;e)^G)khG z&A1#YN-QI;+?2?e_7&CoV%sUG@)?3aV~NDzO*t{H%QVgXhHV!1h;Mt5P%qW$OHFKM zA^5MP-R;KMGuqP;Hk;&2bV+7WqREr7H-%vf{O2^082v_n`58{n$Q%`Jm#oGOGt$&) zTh2rE1uaf$y&HW#@liRgQJrFwd%(~k(zzkhqM=(7I(Me|HR#{MFjnyo4Zhev4{>Xb zA2x>A;SnGIG5U(?gNG52c&nHI_@Vz42!Kkd`v{w-vV97l%zWOdea$m*x=@s6Xz0UT zh=7wht@Xz0^@#0W+s!+=?#7-2Zi9B!bD%|<8(BJiok*L)k>6E~PJN$d2;psn<=*Vi z{?EH(i)XU;$du`_kO-7@>b%||=$ft+>`+<3AJX$?2-|em3#U=`s)Mr3(30ndAHOTn z=NRhY3h4$~OlHY!_G!VETEp{!YoUvdn>Uw*!czJ9oX=@};Msoi(w8;TaAA$3$?9EN z5#S9c`To{-6uS4uhk`M-r|C&z)zBPf~MF^F_~q?G}L95wj9b*r(u_b zws2#$S|=~trdgiEJoYA|y)yOIplF3pS!^SPM>;Zg!>x+T;?c%zH6T$SMXv%n2T2_% zZzd3-%nWDEaO^7O8GQsEobfQ_TBvBc$J^a;D7*NIeScIs2Aka3SCD$7AfA2$GeJ|@*)Te{_4@dCO16$7ooU z+~|yt0rS$D(5cS#E7iV9>`xZbDc+H2@=1cjj0j3_G!fb?0MNT$pNe}s;=hFQf5n1{ zhCw|6MJO{TXk^dtnVuRwG#`K^D3OLgr2Q6b-0(7l3!-XuyP(Z#nwyhjvS~Wdg^^P{ z?ULTH_AQ{Dd{?W)nX@q8DiAw%c}sm#yc!piy2o)a4FOwNjVoS`L2jcORe)nv12w-0 zo*%5sF^9POuSlGbJK@B$w}cy(Jjbo)M}+8$RlRQB6+--zL? z=FgkK7J%aLNGq$Jp)D<66ug$cHY~lFuZfqY-ymN@F8P?M`|wBw*4co{Pvx)tVL;F? zs0{UF`31fotWZRNUK&=yS9tbr@fkU;)?Co#;^o6o8xT zBeem9CC>S?sfRiF`Z>Z3G&Y?72FCr$0`B`2VuGa{0&`&tRlkrllpoQs6~5qvhn*4A zfDc(e)_spLa+rn9(6;WN=B$JS{}t#9oi|KADouQT7tbF@Yuuw`J4vEkt4zKBZGj)7 ziUv;sgD|NlUn0->2+gQ0Il7hRB5gzLfR<>pyMb<2aaQUvE;Xi$ZgfmUJcD>ve9+(P zzLNq2lLX1}p&6X+BKU@!i-<16^n0$-Q?TSHrR5vHa50bKJ#ZkiV~w5+R2tiF2NSpo zut^glK-mG`myKGl>7w~lJEr%+yQH$hVmwpwvY`lP92Kpi4<(9y&=b%pSB^BiqCZw#hJROeAt7TW_!A5BKid7(!?eFB0X zkjBC4WwM#|Bf<<;;bhMi!uF&uhH1@~%0gUPI!X*W%Pnwt6rg7cAHt-G4C3E}Zle_3 z4!9YsJOQ2&&^mau{W8(FFjjnv*PX_yMb6E>!Tw;_p$y>WX-F*%w+RxN>GFlY*Y((4 zu1#D20?zqs{CeQ$>mBKOKUx!4G=GcrK5CC{voiP<5IWyeSPQ9d2OaSbLj?ncUyJ1D z2A2O`cbOFjfyWw5i{W3Im_iMvS>jQgHmXOxXUX9_`RrSCx2~pgXm)uIL~$getj+I7 ze*!soGkd;+uxDf7^Z$`QA%QB}QCbU3=MkGKUH7Z3pGi#8`6vGSsiA|7H{X5=^yyAV z&?0YVrC^{dnRLgAZC0kQ|_NZFCp6<3Hls9f${B>aKn%@57bJ+(tO zRM%&2zxbn8rdeHhyZzg*>VKXP9;>lL1or6sV@JC%K`Lwu@~%s))=l)N+{6C9QB>sP z+CAbykOU_*sm9b7GzYaOHKB6?8>&tB*}>mxk6zGZ{Hf0g>i3+7nc~~%477{a2fnL} zi8H6eJ}F~+`3Jb|ITRZ3K=ZFRh)vYUe`|sqa`H9##AuR~TN5F;DqQG?mMS-EX6?h2 zU3nW`(`uJqL-G?^Z)#K&;xDdr$X@SP-`79h%8|3)$HuC-qi(<6c;3*qX(kRxW)l;g z^Uq%jXYKi~_B{+jbxFs&Q$o!cqp0POS@o zjSB87TCXb`TO$!oq^sWV#E1`O;HRQM2hwi{0w))|fZaB$TZmSys<5MQtT*xAn%|J( zeTb#c?HD6h>u4awGnZ{${(T9?XZ8J;vL*9#f3FLLrGnX2)7d4BgZVAC_AWE)bD}=v8gSsh?xSTXxWGd<~PF37zH#*d4&u12YVjU zgxD)dEKsQ6{l3zmy$TJ3(P$p>r(0Fa)Y`?6!{BEh)v~rloRwf=%yWu{BM?(nNwa#u z7!@g3umge}nz6IYc9{f6yFGsm1T}d)`0RJq_8EVhDtpi78yZUU$lh9&sAwyzWGDim zLJsarGoWCTjTwdZCD*_%yU|B z-7X0F4OvD8LxW?}gU&hnulC0qA6aXC?mxx(AavERZ8xNIeKldR@s(6MwpMjbxHVHN z`$BugfUIdFPrzy!MywZE>Jp|L?eNv1e$M{Jg>eShGL}U((Fjwjx2!eh#&hHR5R|wj zO!&9f%FQlcR`^il!ZwpFL-2rawoBSewI1uZwXFZfmb96>N;V3WI&Io|QD(Z+nPVxp zDk>Ashn3<&X3U*dlFWOq8M<}`jQD|A3Ac)T7PsM6fuKgDL&852z~M|aq(}~d9A8aY z4K;tqp7!zd)I1t>v-L{DYaTddBJUb+MnHQ@*$8K&Kxk?p;LAb8_i-V@F?up8X??3z*8Qj>jd`{$Ip> zX;hQf8m{MfTH9L10Yy740dgv$gcx!xQUZjetpfrIM<}Gi zk(7A|Aq5hUF$x5#NRcrRgqTp~DPahKBwz2F{<{C}&-+7{i-lQ9zP;c5?&p1mjrfhj z6|VYt-b#kG8iKFf=8cXQnN=6%&&K$qQErsZc88%z8KADkcYw<%@0bI4 zfVh_#>aI&?PR13^5ZIOo9#J(B6+SHPG~;0JqA;$gGs3De5P@qLcB13LBa_X;Cf7EY zkILr4#}p%~isN|{!_>H+EZxc3Jv_(V%7_d6TIIzo`*;EQXn`hhfE6_kML7^Sz;V0Z z#a&$kKyjeJv|t=hc3=*z7IW!C^y1m^4_6uqFJKR5C&;Du21fVx=T_FIdbnWwkIR!S zr=b&1C%jSlo^se00jG>1Ww8NcMclCpMr&uz>S48+)b-SLCSbsJ^@o*Pn&&UO#QUnF z-x0b#RKGgkPC%R}T;OROBXIgDXY-+NW#XxC(tv{ust zlvs;rkT2?hiPzqGXRu=i`7q6k-)EhhHU~QWapF4Y>N3!4Kjr?>@(!s`@MO(14sN23 zI6_NZMx*9sq)Q~sz`p?XER+_eC8lks`V3B&-w-WheoRXR0Nn1)a1d}bfoz3+1xasI zKz%9X>^F>K?Pcn`7Y_Xkck&*YKUZb@a0+ROegzpgdq_O7h3XQR@&G~25RIWP@^EP* zei(jxOt!ca&ny_kTKSCLtbm0QNH(@DBl{#by-`>a-;;)!o~Vbk&ZD>4e34a5oLCjV zVJ(P_lsQE+(_(^lsC+K z7(V02GWdAv&4g~p%QDQ4QPFp|)q63EZq(i0g+J>QTtZ^y1%f(SWY$&rRi z1$#bztm|LH>NJm@+j>D#0#m|ulv>V17?XhaM8Gz7kB*Cy)l;|48ovb>)KuyE$@OZG zkF3Gnx|VG6^Y$~uXFc@OjNyog?P*2G!s!OEXqbQtwngLnVp(=UbdD%iR}fuH8j##& zl7IWHpWf+3+!zl)-Q~{FA#}6Fd3$wVPLd~!0BhHWO#-PsZ1pzI9KS{#tr$~9_A`#Y zRa>CPU)^#T_Pze?t}mFQP3F ziRJ!~C1LmMBx*l0jE_$cl2B?_e#*{K8crsZ{F%JyFGvKkO({!9)SX;Ds&-PIYGdw3 zP_$)aFQzpv;_H4}&8d)ILm7cJL;T;z6Nx~fWe%Sro}!1SYm5@m4X0$$^gXg|yT4Y5 zq=Q`BETWwyXR4u8B3+tmPTs!Cq%o4U#<&Bth7Mf~Pi+~XxX8|Zc@W=O29`$~YjCZU zFk_Kwv_;bmh136-C`?!i6!SfijfXt=J>e89FzS58>eToSg}~$#oE7P-3gK8owvigm zRhxSxQY*unKFJs(B+m5eZhGm<8-V`266ST1Bc?$8&&B5s$9dbN4-VDWR`u`?fVqnR zgtdd^1^U*8rFYliGjBIO5#UWbH7-+Jdt474QxKYgcU7eng&8^At%PcctbsY|2HE=i zjqhtY{?fo{JI|rnm>Mm;lMDjsKrE5nbUH;;=cGzg5=3@VC9K1o5<-W}vRD`y0TD*a zj9y^Nh%Hu82O+G_{71UAqO0A(H}OxZ(QMDl*y2#}t>`B2pR1*HiCV7pS5Mp(O;XMFe74*qGrYx{~-Tyo0^bqSJRjU zdSgsbnCb51fn&CmJkr3u^6Kfxv4(S8CVt};Nquo6T6 zF1pSj%c{a1Oo>lmgU~YKLHc#Ifilm%2Yof^V*j7Le=gr{ynJCPw>FWeR`L4Tcb!j* z5lGHuwPu_E6D6H0CVp6$UkZqGS9D(U`GEYp;G1C!1<>!wPVo?519$xn zXv&yR!gd$T{UIzzu}u%EpBO#3?c~!w=J+^pS_LCiW4ce>z1N-uhKi_J9ruk^5(AVe zqLh!c){t3k=Af#T%|88VLuL9|HB7!h=yLGy%d$|g9N$X4$2h8X8#^G}LK}YZrlUY_ z$Vf{bSe!or*jZ0wFr+rVct?!iFi%*FtRK1H&!68rF$q4kND!P4A;9Zvki4qi#l?(X zc3@Q&$6N;rPdlt&=TAa2Jekeoea;7=>C0PhIy6wQ#P6W4lgHxvyytr*-%!Cvub*z-++&RewkZMDDE%US3>_I>G%??g&Jl z2j4TcByM!PaCTG%RFaln7D+@#8+uMN&+=79)3AE~7|&RZQTZ#n?ym|rsneeScbK%q z48<~GeC!{RhTva<!yYd?StFQ{Rmo(lZn!$EE1V)&4or9lrsYoy#^Hm zY%xD-FT>zx=Zy0%%wC@Jr?fM3U=>Oz(iP5t3pX5#5fcM7B_0vIC%s8mkWW`Td7@e7 zF1iOqWnAmgo{21SEohB2Fu$}{>?MkvK$dkO(Mj~U24LGJcDbjxDg!b%)hAu(zkE5< z66Wcq(y1P3+h8WWmM+i!1VSQn)b^U)&G1kdyR=S9g9k`wNa;*w5F0Xl`Jgk`Q5S^c z>DSZ|?@$SjXLIqiG-yxwc3EQ--}&!HZ{h=bI>>17`YfyP@>ZTZe&0}oX_fBPlJjWs z$Zk-znzv>jd9!Gv9;@$}!$gC!a3*&tZ;4Z;^c6kzZ8rWm=+MB*7m=|}M~>!Y^t3Wt z|G+-M+{WnLtC~V+KchZklG-06F_SRc9bH1l=9GTYsnowV{rVC%V1cf`lRl4vwj~h|Spv1H<1{?J zaYocEV%gu|uUu=-wo-$+wZ>u5yW6=_cL#nYcOCLd^hK0MQ7oo7Z&LSu1q|f7JRphQ zJwkqJt~oO=Da?sbarOf=n~@=HToNw!qvx$WInTSDhn2V#$4`q!Xw}1QjQ5lW-G6nV zSgU)FBi)9#I*?M_@neS&@3FP)&FTZnuvvd~g6vT^<-j+JmqwFp^}g^as&Xo9o_u$ZxyKo$ z9=@#0+BhLI6lc>Cxs%110X zq-FnZj~btHJ|xT_@a%BVR!2XE&x&6CIW9ci1zmczr0V%9>fQ!RYv#+aRw4zU5rFh^ z5LTs;JOkD}@yN_EI!_ZqJgeR!bLBmp;Mer>VQT(n@oE}k?(heD58n$4DTDK3g;^7- zU|tK&J{tdZz0x$tWKnBYT?q$06mzOXzrcbhQK>;;5@H+sdpRmD;#acqh&cUV#$!^WC;=oc-9n|MjXPyn!eAZP~hScQk|_!IBQTS3IP} ztDgY*i5w=OwxCC5P@x%w4-1kZQ`}30@H#nb!pix@d$z$c%am=?(w!5=SE7vXAvs)z zs_lyqaJh<->H=d_wN!-=R$noHkWVy}1iBZsA0DW#3A*B`S6DIEmMT=lWrZ_eI6gE9 zT9bCq8R4MmF$fyPj=_l_Cl*Mik(-{;uxPr#PUsD-{yCe^ZUtY(qr@FydP%SOVdC|q zxjJh;J3JYvVlWw6fE3nlzcz}c6B>us zL^N*z3pi!|8J}o3_NpHSEy$UmM)|g@8o8BU}vY<&oy?Hq6o9QaB(C2B8&|{#WPL}si`d+1L-pK=2>Su zLdP;CSDmE!N<6REA~<)$&I-gl4I#`F^0O_ZEl2&dAE>*=47P@e#ll@SgOMa=v{hYE z{CpnFZ<~DAp$K?Mv}j!kU%0tNMSU3KoEDWYGHU{r35_8^j|^O_)qG9=2Hw_pAxhWk ztRi)$6sNfebjBjl#4xh}E<^S}L1jj3!qgVD$F}H?`S^gn8D1n$LJ+ga-CWDpO{VM3 zTJRX}EvrqUN6dF((PCl@Z;(z_Hutu?nI34mq4nBes$6xig-fsenXy3;<&4)TzEQl^ zz;@xWQq!LOsi5yFxGn*Y+h~zFKY^d;F+%}~Qa3I6A5wTE=j8RO-qqecf5tWCZ%`IrXF|FPdLj<4@{45!GX5Y^mN7qF=_M|1gw&A70leJ z$AmyvXcvXh)KSQ9VJPyb=@WIdJP`Ax!uO7iF2W;ur;am5Gz@$h_OI^%)s=wNkJvdq zp_u-?x?~KKK-_J+`2LJJK@pzmEGn9HxaLV9__c#=9oSie-%u*;;(g(K)Zlte8~Yzx zCOo)i9EZ%XMh1Etq${Hy#OYYX7kcP0a2e&qEEtE z6)ZYCri`ULwBd%MchT;M@NeyUMB}6=pNxSMSaa=aqCarAXBs+QNHF(SQy$_Y1*(D@ zr0scoIu{=t=gBqO`nj*cYo510t0`5?#-i81kKN~XC6&4TFmsF6SN@=ZtUTqTW)($8 zfki^qIKlm(Z_pLiNnq$M&0-%hTX)Zx5)&Px_Y_HB=aO}-NEIm@+-)YuOi&t^R>tl| z#YLfV>m|ka0@$5%pkUdRa1~HjVVJH@j~>2MV18VYZkuB6;DPTuGn{t+)gtnx!!{s! z_W^)eovX6tUYW3>Z;?@V_>D|g<1;FvNEBEx)sfF~Gtl<>l!p?vn~eCP!^vR2rb69p z{oVP3XZ4yb33LvO-@uq)oS|x}Q!GADxnqj1>FpG>t9){98EC&bQ8dg1tfVm2H)$5| z$ln5vFXHP$1DbFZGr9~jhD@~19Ba>hj1A{`ogZiE=}`{x>Vf3AF= zW2F7YaahQQO&TDKwT^w-^}-+?f3XG}PuN>-k2ssSfrCE@0k4jE{Cm?URq8H< z6cSJ$<@Z?qwW-3YAW7ppSN9fb9Zb}KzA)ljD`E7-jMj`j3U@jssteCC^bHEYf9wOJ z0isF_#eYm7Fzzeq(aG9_(!)~LZul3`(C)o+NBZJ_xJ|pwo9E3fuJ~WA&X_peAk`*$ zNvBN@Dp)_!$-JoypvP$)ym`Z)Rn+#%YwH@9!$zMf;jpn$J8fen^QQ#D-6Ux}$m(+8 z9t$4PCBgV0+RuC-=l@9$lJ-NWDN4}Vu-$tb;MJi~heF%vTm((a6%%TtWKKt7Kb z`DAqayE0+>>55e3ETAWY6cu^mYVy6q_eJuqT}YoXs@2H|-@V%PPcmj(_{~2RPjzoI zdUSP!Mg6U$oLIlanG}K|;$Q=csk!FC4bWQkX+JD+|2CosOOc&bP4UXX(*=y%fT6Tuyw}ML&@2@;iI&O@a7Nc z81p+Tv)ItQ%07(1)}RU-0iHU;uyq2Wl2=k5K-7ZPe{6AUnDgOYYXM3pxEEZfN zBM$3rWHR-SczxVoy0roIj%|1rt@UnlUK^MrH3t6jO08!jA zHB{vL^w5Z{Ec`dw#H@nZQM1})eS~DSm$>Y=OjBG<{!oIPXEHi#`j39@$_Vjt58cU# z6J^Hv>?CB48ehcDg ze+TLg9M%ntxkV8g7o``giNYYqC zvJP(*`Y-&S+;cpw)?rG6URRN6H^vy;cNl}fAp*!-id{L;HKr7CLI}WLkV6CxRO4LQ z^#bJ`qVnDvzz+}Uk%cp#zeKZ0vaa?2fWC@HMa~e-38^fD{f8_w#K(_qlr za8`cCJ)9aj6+X{(6jq9gu|A7=3SC>eu7Eq^!&LlNm+B`+`rya`2miqa$-E#iq9vv< zokP1b_xX(RIb9y2Jh^V?i5E|rzbk$%XG0z!n;0w#a5&yjYqS&xl@L8sB6u*dmDWN|c5u%>zG zei@n0H8MsI|bkMZ5gxJ-=Y8nF)ef>2eO=)Dd8 z=E=_164GAZQQN-H`fl^8)@zh;S#y9I=*bu5Uh7Z~-)|axCqUatU9!At`*_D!$yvhV z`-Ec?_&L78y$zTx*qnieAx#tPu2^kjBP=pc&y!yP0y{EOPu=b&6W&1%u{6Z>kOxCW!aln|6!dpTvaJo({`yS{bl*=$k~Grv<+LTM z3ip^FK<0fWmk_$wA-tA53er!(R7kBb5eJ>MOCGJ)=NT-vyWxRYzwXca1s^ntt;>jY zi5Pn%ro$5_V{Rq97@sn3aG1!`uk|Yxu14vB+kZsepP$SKWMDfZE>$mSIUmxC^(~1t zK-TcAEzX(ym(ek5Y>~Q@py#PHQ#g3W+C1Y>zZsYng4UPWkHx=~ckXUs?CBLySH8He zHv(uhMkBTXPsOd}c(|lLf#Wg#Xxw(wEBWT8$I2cYX)EtHhl<3=!o4hF!U8Zyl zcUL=NXF_$UuGcq(_xgxXb78Q?`f`c8!g)5H3Tt?o{(E@=tQqgu#IVQH8{^W!@az3e zy_&9-5~haY&#G|RDmRkQ-IdaS#%cvPC(U}CTYR0^+}s073|N)A>SqtMo)Jar&7#bk zG1M%MyG_s)VI9mm@o(r~r?kZQBt*#8k7Tu-=&)ijsEZKmsIx6)1=)Zf<-^F$W5;YQ z-IM=JKF6)?LjaqBnGNFopPtrYY7 z$mbC3Fj`PJwd|TZvsZi~5UZzAL1Ze@&z<5F2K&8(xo=hLe`$v_WG{^=Gg8F?smigd z)tof#wYnOIWbQi?Y-=X(uDrf_smyj(2nzwozFvBSe1p@*dOS*tc-_?dZ9hz4P980X zR-n*J+(A^@i){l5?un9p{6#xL77m)5-lHYnT(_b3b{7iNk4pmRZdt8Hc6jPfW@7GV zO9J<+%ZwI7p}q|zkNc+0I^28B5`Xs+1>-Z~5Z6oq^Hd8VF8b`C+cVJ@a zrZ7q~Cn5CmH{d@|% zXZ}q?Yd=*<;!}VsP2bIhUJViubU9Ee!Fy@-RpSxy3s6EvD`KcSNDkj%B+iDtV;O|M zHo@V&4hL)FNlhDjGrZ|J-DcTHb;0p?3d~*n_+*@pqZuMk0Mjqc7uIsQ7V~SE&-d)@ zuqMzt3;&P|OX{kyF$d%bzRImJFb_+x`Q4T}H#kw>FCYs~F3g}uT_*rM1865U$X{0y zTt*vfb*Sc+xBzep^ohv{qUB$klEo&a)7?*#>dy64#w-%OF6f^^3{tLS_q>uo zR$Qiv2v%q*BY7pE-aQTGv2qvtjhnrJ?M6?a-2t*i6UC)edq(*_OBRUN_#&PB-ZA(* zggxRc>#Kfh@U4nl9Z7y%;!)HR5rvXyOTb8=bb?M*Ue*M+q^gPTEWiH3#=lEQzZja4 z|2CA)z4-S`fAOB=a-6YifqFCSC|Hf2OJfX6NFH9^q$ADqy%RS;DvkZTLTr&it_?J3Xuw6o~-%y9`>mXtlBy|M&B0c4G z(z?^HHOn%PN(EUdMt>|E4TO1Xeg>h0*}qO)?m(XS;uLAJgTy_K!SVx7@qV{?2L8Y+ zj^hCF8VD*-+X~?+{x*L*mU8@na9+6L4$$^o*BxmEID0%YHLDnCz{5S(Nl|?*p<%N2 zj}p$g5Z#|X%1BtjzDV_C(Ubkj$F|rgf`)hLTC751u9PqoYSrYs&NhKE)>T3Lp|D;l zePnw+*!-LB`D_3E5HrhL$koTALYf$7MWc#_d>9gq;8w4gOh&$7wl24R5d19uMfb~t znQ>*$4!1`h$MoC+KrPbrv)6urV+POX;|Ky+wZxUee>6*8H@dvpC9mSG;n$IFX})}Y9ZtfrT_6Sv`aVqz$>yi zsHk+scxQjiZ>t}(XULy_8be$UR(oB7pD{bAZMmsg7eTI~UuP!nm*CDJxc)DkrxO;M z2H{5uQ~%t5j6Z#h{|^&GC&PcNm>GHoy_mdb==tS)|BpXAUXK4_IlgEN?rJ;1c)IA3 z_MlMlgLtrhKx7--5Xv2+aDo_vJ0xGi*mg9}!! zwF>`1_YWRp?!_wIJd#>WQ3JV^Df6SdS@RAyLB6_3z*J$cW_$X!HJwldJ&u-RcIy() zM>b+ym0N~ZG-@tp0IHo8EOUvsZtsk7WHKiwV7e}yZ}h#<&gdw+wG$s60xIdG`6O{W zovce*!R?}3D&MPlkzkYZPxXCuv@oQ0*Q3wfCvL1=b*3;LGZxo^*SwWOtnJ>w1c-g+ zIEFA#fM@sH3}f#5WKv!;F6Mw}?kQ+_w&D5LAEmgjYp$%l@g?&Tgd z4NoA)aT7ki1yF^D2g4dqVw|iI+dQ>z%|6h;N4o2gSA3vk4HhiZC9nDzsCH@r`FnhI z!VN1gSUILOcsjAJygj?fH#kjWnqGs+naxSP!EJQummc;Mu5u5ec3 zj_L2vNH)+2SQc$eByeb{Yec2#(|3;uomGNv0TyS!#$4`zW-toy=^m9ETbF{L91Ysq zkB&^)6z1@ACTlTY`JU>jb^qOwadO;>w!%pcfbF^Mtp_g4&zho-6sp{Qv+ zJv+Z+0#YP?XMThsQ}2x)0QxEKpQCJWU2I}oRp>HXF2EjQ+!W4UOM*}L3NFw0rF$5g zX;AG%j9p0tMGZvKM>k#bsR{BH=w9Dqf+=GNpjxU|iKhjZ+N!s6ow}|zHYnz@KT>di zzVXd3?#0a3o(%-IPTKPw!$6F@l&?2<$~%vc=pD5-JcD%~p>jUN2o3`$%UrcU*2(l& z9A4q40L&(^J2f3${MJEDEyk4Ti(aJl>W=eq`Yf2jzu2uz;!5QyXC*LypU~#ymGQ ze}lexJu9G*U;8W(0o&_2OkMdbDg4Za)0SNOD#zhhXBe=IeX~+B#)v=>{fc zg=X8yfR5!BurQd=eF?A#4~bd#PRPCSKicNY72rRn_+M1r&-R%scD}m+NayHormhQm z!>UydK_zmNBZQ|H_R)vXAGaG{fZfJ5r7c3mjR%uzY(A}7GPBivZr-|KQx7Y#??T9H<}5}Rnf@rQLS|R93ozf0 zv@UyAlkXI(?_<`tfbDODp-&GeXeqZwch=Na_0#<$xQObQP4QUocoG!N4E>NcmlvRj zEP^-$nRH%{Oke1_m^cQQbA2MAI9Fp;Ed{ZTljVyIxCTEm_ZV1_TA=JT4&Zn=;`%q0 zmXlg}=4ch0-+;Vj;}oM@T|s`wt)dR_P64%d`VE};-XLWZ^?4XaS84u(F!P^qw9ip=2iNsl;++rXFFy2 z9a$RBXDoJ4wnI&3TjXg zx`0O21h+CA`x>_9&kkhoPigTAb4Cg3G~amo>A@j?tUt<#8QOIZk9m-*Oo7+hIpYxD znnbbGSau3~3Ni*ZPQ$x})4xHYOu)cBE;)1YIeUlth_rdsAjzly=J8;b|8E2N6?Fo= z?k79QJFxLr&)m5N8bgp?6uRcLylrMT-eLz{{sblu1pakjF*ej$>iA$?PK9 z0nEhP65yw%UZ{WLNO^~K`p%NAUa8A~@LCE=rz^)#=AFA=lsALfk9<1I-0g_tK@xah zq(Aj4@+xDdnfRN?x<*%7e&{s|+as*Hd9^ADr!m*+fW3i6)dZH^|Mp;EMmuC&VFMBFXv-E5XcwQgk60BC9I^&@I zUC?WuKUxe9E)YBaYeqtxdz4QPsqUlRUaW9Gmi1NQjQ_P-XnN5bwd9h%CbQ|$Qz`E1 zIK@|OYjOj)8dSZ;GqNbMC-lx!uUT0oW-yx$ZD=uC1cT)m-U~>V;nyTnLV5*Eqgmkx z3`3hBS4kkr^C`~Xl$1!UA_PQ`e`#|Z{zW*+UMNTwx+DAO`_)XvofnU%oIiNOz1<($ zKFq_LrLK8?^842{Cs%)-aCewoRPic0PJdVUS^tSGKR*1!nWusI8fJ?y_!w6kolp1B z71%yHCGQduJdgfXQx%UKcDTk|dPO|$_u^UI41I_>S+sNF#HYHC&L*b)r+`lO8w$ZC&Wq|F6B>|J7UW<8`4WF35+|3c}c;q`{+L`oHwg)Z7TP#2~T3DHJC$ zBblYTMBXesUH;8|{|~d)qQ3B3KDN1o_vSZun}xpZC;tDmkFY*0xky$D4U*uh{?`{JT6<*Rb9GzK7%u5m z#sG1ZxH@o*+^G$O0*~wfG7~wIb+_#1f;^RYlJEh1vI|SI9dxrX+_ov?P_F<+cMi)w zeZefmnF|n|chF?9_G{z~(mkLxkqPG;&rRZzC6FG`2`n?D26=-0rejcZss&!)k-gll z&E(7r=c7H;&)zJA=O4f;S?8ZG_&Vdu;i@s<)ChZLA=FS z9x|LZ#?&5h2v7UCr(N?BLJXi^Di=`wk~N}C;O9zrVO1XC*z@zkvBgfE6g+HL7t)NX zZ|saJ&{YLwPJRt3cXZy#g%%_edft*FtdLvV+2cW@c&rg%4u(STY?pN4jUP3xHnwlr z)=1<)M-##MRysb?C}`ao&`v4AyBs7=GaG^Ypo=UyI`QwnHn|Km^%l-XWw5^MG;18; za>WZ^EFBUgdgpPud4qW;@>#>>cTerx)}oqjf;G-}>v~QjaO{_lSCcwP{;pn`@ z3veoR3%0F}&$n;bJO(pkI8y)q%lk>rJVH$7>(DOZm6Z5w3&0S};qJVvUIUgeXv7~h zpMqW*O5T=*nm32X{*A8#>%Lia50}fesrL^_w0r`H!4L>m1rtG=Kx9)gmNK_3NaLk6 z(34vdn5v=&jvN9??|D=x7*vn>CCQI)-boE+yn+G&+4#aR!{@PIpa`O9)7& zkZ+ed6qg0jLKXT+yc2VU61(~8z3cDfN3+|A2E!!$LXAA>>1L1R@T(f!;BmN_!hG&kHS#|6liLtWbt%RCg}uYt zPxNS0w&8b!fnlg`6E|>xU`BgSsW##h9B;`nr`jYVlL-Z>$DCin=&6c;MeDwU_bOQ4 z(kk67rJ-BzwBwJYmAG&S$nu(3$DV%bxpa%Xf-4)oBH|9`L(>~&)!lS^#VDI({)B=~ zv|Y5@AQZ!M`kO@fT0n5Z%0Le;Tb!p{=xW^%2=eidiWY=&UmyS_9t&ZuRrvN~dJDCO zO)V5f$pBwoSe6_8WZiHqBBVGhvnYYi`|T}Q;-rCx_d39XP43Ea)?sFq_$OPY`n;_* zVXjA)9e5n*qN)@GLP&vY6Tox9n+snY`4K!fFU!T+Piiuy%^kzF%<6@LL;`!R%L4qn zjlf`sXNO;5Zk}PkZ;c$$o(0NU{*?2l{NY zFqeeXrXkrO@U?pXaq3Oer$eyKFiQKD9yjpefpLmqO&u>wGYDm`$(#G#_f1xnRmy{s zpC7vvi718@GpHfP%?j*6{V+))=%V|8p=~8vlYra4T)tcai?7SCTq{f*oRA~MantfO?`nUv7yV!9l*~w>s;2x5Q zwnMK9*HnUrTMFqM1EVg8c!x`pwAENaKDb=CwF60uoB;B=>S!ryh}vdsCTx2e-qzuz zJd!3ii8;!Z|CV%N`6?7i+iNy|W3GxFZW<>$3c}bVG1~$9t zR_xUQ3&{gh*K&V#u2f!FO9|Fh$iAR76w5VNDxn1bw^%WeppX*45{YqQmSNiyzLHg} zeL_b=qEUDf_|J2}D%DImD-iBGetfbtJSd?)q2hpeZYC~i1SZ$xx@xnyCQdz47 z&qn;8DsO6uTmPFG)Atm@wiL@Y(|yYL6z9Efr@h=%9PU>HPH}k%@DDd6<2Kxg7n1g5 zM;uB*|JJ^R`4Mb-l7jB*8CSFh>}yarBNBbBTxayk-4c&Gn&i^LJ6h8`il*wM5)dB7 ztP3F%tJarL`Zhp)k-3*-WcNnIaV-)Z_Ep05O;1@M7%hPFbI9C9=GBxufz(ihdd^G8 zKKjP_BU)*o3jjvX;=!(ENyj=5T4so0T}&rBGeu|NHn80zM4wQ()x!;!e8vxu5j%f4 zkid|u@szBq-H8ly;Jc2&im^68HSQ?4HfNjn{)x2qT3LUVXi2q4B;ub*_(CX(AAoz7 zitM!eQZ1;3123;d>5s^2aM+4_lIonGwjMj*u;tx0bJ;{zZkTV3U@?nI+SC7*sCUWl z0CJ&3T!Qpvf1)&R!ThviMl~SWo>Pofk*q(1SDQJ88BeFr7KAc~+58*Lox7Xy=PGnu zleejXQXLP@5J;q_!!@6HVK#H}zV?znxWH{Ah&zr|H69=EYwFk2G4XF-NgExAcZ9o~ zjp(szH~W^9{c%-3Kq04B`+i?Jy(EHWDB8Cr2%}?Z;}iyCbbIOM#T@mMTz9l2a@+fa z^96MkAbHo1HX5XEO3~sEn9xoPQGrfG+kR^*h`2@C1Ca<#okm%P6|UBd$J0%RQ{=#~ zQb~WhJ+eEXpX=N;F-T+0+tui8ks+dw`+av?ti|^y5tGaBQtk+coUPQNv7>p)_Zt;! zZAy{q0fllkqitXU+?(tMz_+!57V%w+U=Y31|NC#{rU6#%gaTd;(d9Qq*e(N1?k9J2EL3uOV zLVb@+AyGn9I&|xqt$(m-i8?`{AZ+;-ypWAZ4q%~!clCEi6x#SN%=tqR1W=%S|#UrW}n^$6*OS zXjd(mm=?`Q>-lv^>rz1ljLcw8kKV+1vp2|59T^o8A*;tTOuA6%g1>AySVOBH=KDBjuYiBjRFaA`cm6IyPFfzdC0RrsbH(F}`?Al3)xgLhfp|lkM)fgfd$bW5mOt$DR zk9_mRtS|w!SCFzRE_2vN!Axj)mJ5E&62Dxi9U}c&8xRLaDXYFlTKEc^2QI27-iuiB+s|h7Q$DEp3gF{0B)!6uk_Go3WHYcJ^^|&?T%X}Ig3Dk z63z{mYxHK3U4R=wV2TRZH>{%0>@y0~9WJsTt3334S6rHVEvqBzEHn+S`aC8*3PaGi zcqrXo{C<9m@_59K4$XXij%KTlcKujMpXW~P&o@Rk!$G} z7nV8#lv+s>SHA6i|7%Gdi380<%Q>Jw^x~Jurv`GPfY%las2uO2emvbtl1=@!DH^Wls_$ic@yHc>NEWQgUf` zTB_L;jW4a5*Z#nlhC!5gRlGKiIee5e#oMIDJ;7g1A%(Fh%qRA^0Wg{qJBf*VEtvMlcNPJGlDFMC?<`a{_+iF={?2)S(mZ#gE$p zCCk*hK^>7lmHl4-#G8pqFgLcUQDuAguXe$>7@h7Bym_#{I4)ATHK3b*LK)G_Hn1_c zj~q~LuZhS7y1trqg>^|ckfrh~(1VOG!dxwVIpL&L^5GlxA;xXpD}Qx-z^?)6E({_Nw6;zcf(2+Ub0z zOZ}DeVOk!t%Y)#q37i)W-E`y};Ox^%Es+?|Ht72IR77IN2aCtEyVUVz^skgRQnY6k z9mvkc-5vwBsC{6?-NS4SiHtH#UC*Y1bR2H^8G<&j#STnK(#CP{>dK>ZkFi*5%$%2w zbE&pE@fc=)01eXc4o~{Y6xsM>3vb8lEp=*#to;#;i7=5W-VV@-!(;_)A4-YzD~hIy zg1AD$JgN;izEbTsm`W{1MdodcPl(x?-U_eW@GSRsef8~u5$Q3ANH9Ah1}wW-FE+xp_h&YsnijMg7Lca$pr9tzwFcB zbU;lN;c@q`@so$=s&`_MbQD}v5mjxLiRmN`a}}6AtJ8(cA;|~)xQ-=sp+=)A4Qk~) zwM_;OT}CvxZqjzQ8IQcpCaQSp#jX@X;fi?83sE(0ZMI{4Sf%Gm6>5A298cM@B-gra zC^s%;w66&p;po(B>m51U#Vw4JJ#$x;<_{cq+vUk-!NGlEW@j7+s2l_4Ndk`xm`$WL z2Uh%|jSl|>qqhhKyVC8F;?Igu(*sq??N1}D zq8xat&Jn)e7v&p>HC&(dM=45Ig?v}}qusL6J2@@mZf2wK3_skm2sJjl>5BJ2aTO|@ z<{V#2yYm7$#23$(-&{piF&2(dh01nG*wC=k@N zmD~@V_iKY{6wcgOR7=+$Xm#m<(Z08$Jqe(z9~DD0h}rvc;%&REF?No)rKBAi< zUGPZAt(oZI@^jhUNl&+9R=srD@{5PG%*g`!av9Cp^3nIl%+&FP(_rInS$z&X{ZN69q!irwhq#(QhWeF0_)=-*gw{-8`ceSENr8kOCcCaD$4Xpdqi%* zJLed{wZM1Rtk{lCs?+C$6;}GPahk7~&7N`G4(sYHPS`Gy$UN77o5H{TQ1pOsKUF~7(7 zgk*~9X*iV|Fw5{RQZcpPIQM^CfenVU%^3(<0^aGKGHr0ddX03**txc7x{2~y+E@$X z;8mCs0cJMeU^aF}`Y}CJY|X5M;2aaO?la54n4uQ>ZZ2iN-dD<^XhWMg%z}c4dMg+v?C_@|eK3a-TKaY|FfvKiBXq6dKg*=Lk zI7n<<;td=y#taP9%Pp)Jia>Qo9_w*#!EfHCzJ$@KqFMkH z<F`<)TEu9xn zp!)fbDsMGTnId!Cp)P6xm4dorV#HmSLxx)_PzqobV*zWPH9k@?W^!&=gpma8=hrSf za{Tz~K;Z-j>=5vY6OSUBl%lRA$1HN_>iiMHps?GTx&nYrbfw4|&|<}*7szR~Thy=G zOA6~g>5aN%EH;bO@RA~2La#4dQs*RoY}pegDHbh9{gd{se8BMw`O8S%g=L>^n?TFC z4ex&4+a`*DrO(`$Ouy}HlIErU*0$(@)`U{x3PFICZc(65w|-5$4r>_f8M7wDE@K8i znA)n3+IC`P(gd4*4JHvrL*;Xh1R2jBjJ1N{=0KjR{ZPlE?xUL2*c#n89T_es%6AhW|C{70v`(U{h! z2Cw^X>!__6y)JrZCZ+4Qpd>-V`X&c%R$~YX=8J6vVz(Kns8aUck*UWt-dyPdS2$iK zY|MD(u5}NNE~kB@5!pMmUJjUs1s&=NH(m}K0>ga7s{8hi_h+9Y)(}4w(v-Reqlo)( zgRktc7W8?#PKcc_cY#3`7lG@g(u1Q_=U3L9#k@clG)SL$P*oZl&cY6yVr=Wxd+uyK z((c1cIpW`rO1WD^Zavms2 zlN&rVJ)l5pa|YEv4F@R$2E5j9`7v*-dora%;p9~HlQG@qR>WRup#2p8e$l)6U1!ec zL2k?;aQBl=V^)@-HJ6sQDot6rVWx-bl^Hc5y0i&bqaiCRGZ>1D1E#VHW?@_VS84E_apV_F&^8I6*W!YxA#{;FfAH2``7% zF#|xl(z8bjqQ`XR9kl~Cy6rfaxE{>`=+O6XN5!DtVA(V7B*@Yo-All-%N@uuz<6Oo z44?PHe`!=%1M@=|e0ubTuWmboTUuCLfE(gUF?9RU*gfR);~c;BQjP3?6_ht@Yq^yp50R0vkB&w%O4fcvAusQ*90vV>s zNA-mnDaCA%1I}^GwTJ%WvS*Gsq;x|sH1!uVX28RJ{(QjlFgBK)azrAL{Lw>TpL&&n z9$_r-Z&dZr&2w7vgVyaCR<*s_m*HH96JjGXb&UosQNkhOaEy8U$`E)xXa#l4 z9%6w5YM)y8<+JWj)zQC(X2j5g_6_9K=y~*3HD0bDJSbmom2O=uLyk-%LEJobJ1*_( z6ujn&PquIRVbI5CG<~hS5`~deVMAi0ZHSUxZv#7E^q7jDy6qG!+N)ra+d2M_8;wN` z{hi`o=sh@%zDAz&pJANo(Gto@3@hq>XcF!FD;t z0b#-$5TiZLjjBt|iMS;Tbi3Hd>P+%n(hmE@9`31o;?13#HVr97{s0{O{}A`4VNIQD-?zIHbz6-Sq9~+Q z5M|1C04xG&ODRH%2nxuUt%wj}$W}xGgsj#96jZiQNQDil%!45U3CNUG0jWep2m}d2 z2naF-5{3}S(DzLDdw+hO=hOY6M~}k*Sy{Q(b)Cci{Qap0vW}jWwjECTY;E5{<r)r+uaP+Pn0JE-$KUj$x#RU*i{j$X zRDrP%$r7&+a?kWHVRuaDIpwro(W*{X3*J|!Oi#~usvsmbtZd-^@jSKsD)#dW8BiV0 zX^C&1#SZk_dAlhp0>LZbGHtrS2<2SeqbsJSr<*NC^!NsYWU+0d`_r^$v{ zvb5jSab!s&qDM)>F{*|-_jtK&2f$V< z55YvWc|Ge3Wq@i7eVeUh580hfer6vFt;Y4Al|hwr!$V~J7cYJYH}J;V3sz`AU-QEO zs$=&ua$CIZswbLqT|rj5SXOGg&ne2H!sw?nAot1WWL5J7R4?tlvXB{rYjitAF2UrC zyXa|iuiY1;XuIZdXM8iWIlPr2yQNG!c^_K^PeA4b zO)o4G^Ki6j1=2j+VtW>uVwB;i61&kr&3Lb&J+8+7$ zBI68lzKdx|4r)HEzS3PaX8KEZ-92q*vGZsIhkRIM0b?mB=ze!_|JnF79d9Saitt46 zl_JKJ;-be9f%)S7@?*}`y;LvKMXCozF5^{Tw41OmdoGX=ri+(ImsxQM=y@kW93*)Hylul| zcYSZX>n*BV@ub$g5gGV@w1uw=Rz;1BL8cm??2|7 z+$tjT_Ni=hNaK*!K-ug(>x2w@YiSTLdvc>brM1M7aRq+ zZCEEN@md%@MB9bPPAb`&!$#z>n;E-I7x%&6Jm2%4F$7f`4EtT1SrelXW-oR6FTd&7 zWVOw2%F``b4R%ROiN{++Hc#3(Npyk{=P~}oSR3Jnq=SRprchpuWw?j`@#nfvd7+GC z$Rp+viJ5$xhaA)X(dElK3M!^X1_#{sa4&cd2430w%g!;))S^j;cDB{zQ2*f0Enl4Z zDJ?!Gv2vRpZX<3byvv8>UD5O$P`qD!mvZ2@kN&s+E1+>qPs3%H+x_-YK^b&5oOQD8 zU$;1ZzijII?Hm0sGLQ7dzxsT*pv>HE<{SOV{DSxo>vWC*z1}guy$L8@j`CdA_nKT6 zpXB~<8r0o;VbzLneXoghzqj@#;ycFlM%$Eo@bdk_zeM4iUqV6dvwUQ^*DU_PN6kMh zoBpu0&hh_IvHd@a?mcrni4>?edve@_OM{Mqo=@ShA;uUy)Tic*;s;WWC*(ACeNK$O zEqHm@xi}boIFOLISEtlS`)juoi&WkzBQL_926@UiPL59ZU_XOc7WtfdO7`I{w$^5` z*y9laIBQesF4|03{L~5->;YfJaYk$zn{6zRkEeV?4rqI_(X*?UnAlM~X6?sJ%|^-x z$;u6_iP9Xui6U-Ui@nV*JIvqMOIf(kPM`RGY~=x8)&9|0`A?n>iwk_NQ-Atdd`(OdlSwpxWm!kHE zpFJ|6ivf&eEwpG5Ne%PTB#abj>DmNuZB<`Xrj<+!h1LFWU*tAfA3D-N#s1!Wg^?t# zvupGGg7TTs$F0V@b4DG6J?}KEGreDt&yJwtKt?xEf(V%^-I7odo z;RYqNB3742G!6`H?nW&QZB>w>-O@ncqX5nZ3B*cgh-)_k+S9Z{p=ChE9rl}Jo`y5{z-s|JsVHFFPfJ^Kqj^1NS&;J zcVvN0VVs9lh|Q};;!Jv=nQuUcJr_<7AD2C^bvMI&-z8oIPt^5|Oqy2*9W~3oM{);0 z`}>S@)<0wB-s?st^Sq&9-0?IQrT9bn(Cp`BBRfCASKSW&(dC-_;L|u5HP&iyn7Imb z!D#!9C`;1OA@_sDDj?Q1aFTSTBq;S|MOIVDXXHL&#b-HX!F=@GI4?^8RiqD@=jEKp z?C#&njJOr@?>^wO1Jic9jpmY1^+rKbM*v4C&Z3TzZ}8_jBe;2-4|Sr}I>S9;LeJI2 zfS%)SB(^Hp8$y23YBd~;kKNQmSf54#BG|hy_g*(mX`K@u{rK!q8xR!>N(N|icpY8{ zq%zfZM+yXLH{;Ch2%$#%I^)%S3;b-EuD|$z$h_}}bCpdn%G}Ty8@qD$)Yidam=Z7< zV|7})`RgT(T^m@2nKT9Vc3(d{iNjf>iid(- zCV;KKR;2z$@py0%!`bNT?@$UOajST6jMBPPRtubkYPZV794MX&M$<7EfF{SU;ukvV zkJmc{7D2OuK-BK8>9xYvNP$r8k0|Jx7}nM6p1X*QPdVhLfHU$O=+e$)kB zaL8ymdYEbf+C0c4M}D2Z*c-FU%7G7~zN)U_-eGGQ;~qO<7qcm_V%iV9tLgm3u*TF5 zm7RJ)C#*<3K7#q=9j!ZHBDaEKIMLN|D55GcwbgLR3kQP7aikokfA&;s?BsR($r1kqk`u45!H?~W)K$fpng}<8og3+|E zlT~sGoXnKR z-Q~2T)=vHA!NWMxeyq^Nl9ILFesP!fB5#|MLEwf%?Q+PFgZQ`E- zTK`QH3bT`cDo%1n-M#wkKo!`=pYaO*7)lo)9(090mKQhfYROrhyZrCI5>-d|;6H1o z&)#CmQH&CqmIonqVSAY3DTp7g#9ym|M{wqH+!c=q>Hx&kFeL%4doC&Qa5nmm^_QtF zS11{sDI&oumDOV|iFqYWqU6=tprwsDj>lioU!_VzF8M5Sg@bwY+T-N)lor*M7jvK^ ztyyH|tG4T;OQ21vh<5LuXW0aLn0W}O(kqIyQmIuGSb)J6Th7W_M*nS!`+c40QuSos z1#Wl_F;-Qc>G16s$rx4RGK%XO0<-TT%}p-J?gzTM(Lj!RYNBB{eMO+5hiW)&U@M+B?gqj&z~r7oT!!WFOcNq@P=0ds39cX{HH_3R)OLtW%CHK zDR?@-vvnx6jTTN<1Y`VR7ub#mH|@7gVog!V!{2CcX@}(DzcXDWNxZN}6dHm0hkD2w zv-}qz9|k2ghndYu^sgN=L&t+H{JJq_DjQB$4oVj@A!9RIjc-x~Il6THd1&d)@nGoQ zy!pcqN^G(6Mo`M2AH9QJ51SSQ`yQ|yqKzGtp3%_yZr?_*C*Q$1I0L}8lo^(yLpT=u zB+n&FJ@vHhy-Z0X0EI3#CU@uxSaTI`nvBR$K8wnUj)tsZuAOUSQqnI%%HCHutu9GFpaB>U-IVW`R91pTF1g8$c3Q2vShkWqa)E zy;Yv|GU%R9HN2<;%beP?mFkyprinPq;^#(DADnxZQJY|zOBL8+*FcTkI(ZnBZm@2$ zVD5Saukvmn`L$=)(k~P8BYlVUg_3%<%A*k6o8qe6Eb-I2dF~;%mdg^u_7uLN>LL}Dx`k#3?zwdrl69=KT;@hc}dx4bu)yraKWsm5< zdv*gSRb!3;8FJMa6hK_S^%l;d=lH?l{TgW}_YrYoHN*!D=rw&Y38!DLJ(73b*KSj0 zw8THIJ4B4lo?sX}MCY8FSmmwRHgAwP(6-7itR*L_Nz57JoxM&kCkTFCI>p^9A4OWS zwbO=~ymgJ$^4g41Pdy|&0Et*_SeeU*23RE^jGJ6Xd9y1c^V=iov_mqz+>(~CjdcTi zyTQ&93Z!o~alO8HpmL7mX*(f205_u;dfu4fe!knIsoLn7%R$OI@5U^?)@hXf7kjSQ=j3{) z_VNH+;i~w;B9;G?+pl1(hMfft#x%akF=1q-wUhijcCGH`t75Z`w1DQPs!#BZPgF;t z>=fGXa4w%R<^$F4<$C0ac2M!_sFn}Fpah+z$S zFsJPMACgOPkB77?v%`Myl(mDR#$RsnjE1i1;dE_OACdjyw7rj=`<+K@ppe!Nz4F6#{ zraIeeSp7G75$lH2{+0>~|Ah#fTq$Ma7_%OyI~Pe|(4ATF7ADev8t~h_SzZqW=~;C)%Vxj-xlUPT z871Xd2lX*0*vt)(QogqNuBMELn1kvS>6m1qb;xI z9vuXkN%HImW_wvgMzC_YqvvY}EFdW6FFo?vc*uWXskyVz@K zMTH5%JwD6HErDGdlnZfJ@9iIaVQkFScHMU)FHfBZ#0Zqr!3CC=;9?lUKmBiYb~grd zm5Dl4y||y<$DS$M2a%-WIPM<)g`qD~dvBsGj4(c3=Y`NoXpaa^A_BcA;>fQ0e% z=!RWnpUR{Cwl$B9O-Qu#nQ&US7}K?mNVg3bPAl}-&(LojzQpwtAydEjO!gPVhx7rp zJ}FVi2#Xu_aF#m#SQWxIdEla}ZAqJsjBUiVtl<@UcWlU8Bb|)vlV9~7B|<^00VZ=- zW^}9ku-2qss@`}s;CtSM9;oa|X(W)pkLz$Q-MWi8itN#`Ioq7S$Ual0DF@vSP%ad| za9-@2^;d^iP(h-0Jz;81?`H?;wiix%Stp= zkoLRqqkNc@z%To}o?I)gtE9ww*46@vp;5l4T2qOs#%-^n&1iH6AVC!%TTNc`$jh|q zx>=BI6yS+!FQU*}vV$OaSjjZd+0@l?I%xcBNW{}@PeY|U(IZgxo#Mn}hXLdbr2bjH zRldJq<1cnx%iAC~Qy*Au+K>q2Asx_T_e#tXfX*}l64o{_WB;d&bakoWdAQLOK-MR`(HUVFbus_Qkbv)nh{>EY3=pX;&)V$YR#}9*+Sp)qq(6g=< zsLg6KemA^dR3VO7^Hetlzr{mgdAh=Np!ZNg;L5in(kuKnG)$XH62x1nc75!ew@uAt z5F2^vPSe`{`<^3-cnOjQN)ERaQuN3K$MQ<#js}}|-fbY_686I&BY-nIQ7zfGUS~*} zjRl=-dM9Mx$?9qrO%{8@0ZW$U_;xQJvCcggwNFrai}@HV?t@{U99MiRZGJd{-byp1 z;C@F}x!$FjQ?|8U%f8RB6!xbhk-<2tzPsMk9Zq8G&ihElv0_%}CIp<@)m@Z1l}%KOk)POshEV3;PV2QsXeCU8_coh{ws2B z!nDRG-)b_D@!jf`!BCvJ_9$W8l`xK*7=okTBTRQDWJvJqr|jU1AdfZU+T*h_#uA7; zHm*D}U8hXzxfhzv*)~ja`qJ$&C2i%JSoZHphG=Wx%w>?STd{OPI3M^+#I6|p{cO)W z4n_)cjfW)nJAS7MzlK-Wz{?^2qw^@`;4>L9&!o0iXstdHEm09{HhK&FN%;VWorigq z`1ZRFyX2@A2ImJje?HgdNc`Ekel7TmJuv4Q(gv!G1tG{K0I0t@<2mS~`1Xf;`(7XQ zu*PptlLhL(jd~#8g0CLQX|R08ZVk!NuhYN+&I7G$ozMX-=|qj8ZXX5NxF$pL>r!bY z)n?SuS}-ewN2bd^ipp9G54OA0gl0`=dnU6PcZ_XiH|>*hH+HR2{eYgTyVd| zQ+7u`8XlU=+p3I1y*OBqbeuqCeusIY%i!zNFHLnDUoImco0e3G-vyJ~wh@u@0v)7P zff{a`K;-2ML*|}aiN>4yIG9h=cD+r`3h@#VR}tt&729>PI8+OjQ;6EN@2Cgvv<%ZC zPBz|^;%|MvwrANtiaZA?kM8pbm<|L9<_68E`{)J>i$AXZDydKRM`}iEH6Jur;X*k> zuHd7?NVd7e*CsL!gEuXDRJ?sBnPwYds9;EPZX<9#8?m$fUQjXe2xAqQDKD#>)E2V$ zBDEJZOoJaI4T}g{$9@{~L8X$_iDPLg4akk9~A>_sOfdhbkc~4=eYPy66eAf>@TWR--D2Q86 zjMV(B)HKbrp&NvVDW2v{3M4ga*g+X?0BXSK-;@b0!$u3t{S)LZIrC02SZ zA|!{Ts5ytqAtsu#*2*rxvLl*5ZFnrq+DboteAKs0lRUQTd|Eq%;#-2+OyYf*!aLi& z+epv{AOfR@C+x0_pxMf}$p)?W$j`OwVY~YEd|g(sw?L~NCdwiV0uS) z#PEd>GR*KiCY&?R0owGD(c@2-#M`M*cXAUT95#;3eupcXx{Txx!sK>sH*_hMeFi8x z*BO1z%Owvo3}0|=gOW~Xb7^=GHhsvF2Lslo+eh&&m?VQI!|%Ydjk{A&d9~spge@i6 z@82usV;fzcH`Jv%Y}j5C5q~XHG4x$O4n$&xSd}U;!O&T;9KSPfrzTgsH*&`j%8gOi zJD8(5+`xr;m0t4REDKcxxGH2`Ha@2GGrO@IjPmQPjG1ERFqCu{oG4R?Ent{!p;FwA zHrm(cFob(Hd_Z~2Aelp;bsC76rm4V9(9FU(Tnx*St9-YqH3j2wpF@14p?H zjQai>?duPiL?i}6^*Px-XP_8;pfJ4B0_&T5_dbCm-@O)sGTnC$ewf4UqJ$3xN}Q** zSEi@7?D|OU+>|YNsq$3sU0G;T=qmgKzX#vSYd}(Jx=4Dg)7p;@iDv8&V55T@RbKMt z&=DRQY>Z;F%?658N2}k$^w@G0l%78{xrUFT_E68rotRKQvkLS~pTjIwDD!JIy=PEw z1&+p0;Y_8T`y_yz5`(Fx#COc$ZTo@0O$t}$v>KY-buy1U^mf%YZyUse$4{{4ic(h? z%N219Dc&{H*jN zTn>Jga6YBwbOyu$K4v+9=$qf6?S(SL-p1561FpVI@n9ThRMdCtU7cMBd7ud-zxX3W zh#*5(Yi;}OHx=Z&8mJSYI6uf3?l-H9STjK`WF2&nVqY%W1Xi5o_4(q1Do#xo+$cSRk8_)_L!2l9K`t7;J;gi8cc@=P~5H6i>+)@$c-LIrI1D)Yx*EoEt{dSG@RE zE1Hhc)rE;@8DA3oy1tT<{XxRGZIeiDwYS7y z%nB^!4#EC~gfTaG4%8@81!^RgH4rIAaZuY{5=^c&1ou|yk}$D&$nTY*UfQxM?Y`(_ zZeftJMDn680W&ZT!>&vcXzO7;grp_PH?29I4uopZ%^PRs;de>nSsgR}4L|~sVi$Eg zpa3ci&L{IEv*o!vcoJ+{EwaJEV`P`pCgpcMR<2s-fRe%YDxdzp1VTYytYK5B*pV5Y zlzi(SQ)@q7j(ZSE_tpZWVRdGLZtVseo)lMzs@+I>m~jLhm*V#KSeIz+n8P%)0^?`kHyS!o6%&zr_FL zx`cAWr4JePNt7h0$mVNUpfOhQ zp@(AeO6@Acg8yr>Dg9ah5dxt1yjOkeeE-Y8zErVIy9Mea;xAx6BOmapWJwOg+EbZL zkmHD3uHin0 zg+ThbUaut)HCl3~s7feFK3SWpvhYl?!gi)uFyLWg(t+LWyT3~1P4#*M=b`H>RiB0pI(>KHPI-AMuV zdPL7^ogMzXW)|EPKLE_JkK$NNPbg3uX?vPMAzV6nB^dgiw5z;GSUXaDGs_HQ4Wqc! z8C>puN4pjgEkm1DA{q+7MXR1d=#hn2ZVTvsRo-(rj?~qlwo|!B223zVn~$rudG|FP zxjd@MAvsN3JY^PDRqOaHSuxlb_)m2nJF;t++QKn+#s%-wcY{qdPQMF4xVF5nA5;C| z?dCTt(?7IkMC4iaoXNqR?idFM*?=GxhLOnEe{OTb_FC~ zzq;PRZO0?h#57h0n_4(vRn-GfUZ`8~c@+!=WM}sz%+|Q!uhiP8fw|CC&WIt*G=5v|If~vKIc(4^#rBLt;f;HS8w6a4X0&!|>aXgrOO+)r zMC4mnACdumQ_Z}D?L)+nFMXrAweNOslbfbK5u<2||E0RU)YWVt3NU++x2^8r-jdPN z984>b2u3_#Hz z0C$I$&ul(^_Kky=q-z$X{6TG3IDKduO-KP3QEzw|kgJ0`h53ma#ypd+4gZ7D_COh8 z6+dS|ptY4uUEzaXH*<`R=xNPgj^aGFJr{5Kb6uiQ$$V51TV=ycgFz&y`^OWN_!q+{ z)qY-n$S|&g!V1j7;Wkt>KBTpfhz1%si+zG8a^<7J=oj{Pkv&(%`h+#JOoPmrqABPC z0=G3=cbyfH)|t+5R2Qj_6w9#BkPYhHJyNiKjL-a#=Ct3<^0KD<`P}qbW`S;T`shma z#Yr1oTWNNj-m&g4Z@R@;aepE4dZKiF6$ql9VpGst9rVXG`gzsLFt_KeIV5mO4J-8W zP>_c~tp!MZnxfv(qAky)M@^O-AH*DY)ATmn6~de*wX_1LlUKCMxf$wD$K6KMR1R;Of~)U2sHbn%UnlM#?Bk*cf*oj!fuvT zi=M6o7oad{+3xP=Ms_Jpgy>4@8STq7Z*5l(scGTI6RdAD%L0rZEu9*!sGXwZP?_x^dzV%O0P_pS)O>0=f*s($3+ zfssbmy09K?!zqI$yky%fKd_KQ-CN$t?Jgo91K#f-2m$wki%2&Z^>36W-Awe!oSw|Wk4lY}QN{mQHRDurO< zPolCcw2p{IiW@Wf&J$|TS&nwEd(PFS!q=7Mu5DE3`tGYz;`bTu zsV6x+E+EtogMb|@Da#U0r`K^5t_?JS2zgjUQ1tiP#$OeScnvDdT4`Yx*Hgy21+gBo zGg5StsmUp&I`&>w&h6JdNlrcqjJr-&lZ>5EJV~UD^1az?ZAY!nW=l7m@Rt``cZ^(E z6=z)K#4JNvI|Nc*lj;*cWIDg{$6)es?yvTkfyisV4G0v^E5UYaOQJ1WkDve^->E*+ z>;qh=9{|q7=PJ5pDa$tg!=0wn(V@kiAg;WYM-s2S<-OvxDqC;>HUFk1OcLkdR;o<) z>2+!=it~ml{wwY!?jqzxqaLt0(_7muL4S{k zMQhvKAzO=E-asU|zn=GPhEHC%i14wi;}iX6dN=1T^y%gv*QYO#0)10F0hWQouO_*i zWexk-7N{CrA1b4NkHzlM+OY zml5EJfT~qauSlO1Nxg`@vPPq%rT8 z8YbtAg5)+0*gSXxNW<{g$)7Qc-$HyAg)>_l3=9MsFAHk3?D5Lu03pH9Oz^?&W*L%u zTis|~;{kkatxk4+DcdP0{9NffzV^<9c40SEn}QP}Yj_lBHci3Zl4{cH76Vz|HOy2CQ!0Qp}vNLY< z0=Ct#!HzSpz!V^fc32&zyh%MMOZ(P-m}lZ0lt}+!i>qQMP%#VBS1-GwH8EMdNF*Gq zG(+ETLPu_))QtseSZzGxk1;tVLjiHw+duMxL#$|GBIE*m#}IO^u?}Nxn55o<=W*kEG4U${Q7>a;MD7X;SP+*Udu@*U5jVh}09^y*#pEH`(shFBw1=TE;hK z06d50LtCV7)8skrpz6uKHw^!oy_X(QnL&&llR}{Oa6Eja^@5A)DKEx&-&je&+Qxk+ zMipf+)1@TZ7C@Ch7fgbaJUyAwvU&G&~A2X&u{ZSK%UXAKld&$DW_UM~8t^|}E?m-x5;E2{4QXf*%l|Hgr1 zsN|3h%AaZvQEDK8Xmq@pKl*&y<0j4A1OV^d7O?ht9&mk3|(f z`*5^8it30?nj;@AmulzvycGf6SHrtS9n2xHb5T+nUR|AKKE~Ze z!Q#QUt25A}T6V3yr?b(Qv{Lls9Vz^1^F~RGzTzRb%}Cge46Ll-=bB2@km=|&+c$2U zN;}oJ|GovpK{(zKEuAG~q?1X*JZ+?RmNpe6__(*1b zr_6sQKB+*}Y(9OUsCE%*({mNysa)%2ykrMw39{Ku;Sqox;=|0ork4T7>sXcFe;mg< z+tNe`XM)|wEK-3@B=p+1^Ol7T6pS^M05e%YsL<}W!!|ZH^x2@+!nAdr%)77ceB?>I zQmFFgFlVA8-%MfUQ-HtH^lclM%=_}q@-OS=_IGfBbE&R5}76@g{vQ>9*Uc(}@9c7?CvVwQc^ zr<2-E{SK}K^qqZ8DpUHJ+R3JBBg`6bZ=czr8gE!_E!lp*aW1k9s>;AD~2 z;**894WN(l?wX{1PxsLFEOJoQahHQ#P&uIU9mhMWKWb9Bs<&?#2_KM3t+@iZ!S{6y zDHG^r##DD4r#mAIz&P$d-_s0jTZ>U{lRa-A>6&GY@YV&kUnC!uV(pooPc%b)vyA3? zI%9PT^Dt!0%k|9}&f3u5onAj!?IeMkzRcwRB#Zmse%&06NgG}~?e)#R#f;IF*?khs z=4pfBgG!I`cT{`%_5wYZU*j6|Uuq`w=-TT3$Du3Vw{5?Sv{$iSBYP%8ER>|tZpr+; z0PAK+MZrXSQ7{fQNQ%J{i441y2U-Od^pt)}!T%;^%2BtLP&+8Ti3Y7})(=KE8oqxK zbt%T;#GF;ws`_>@dp&T^<2h_^ zUGLGVli9D)=rWYASxOXMHe69bXy7Txid&p_+)K5*hQ&~pfSdwOmKjr8U2msm#J9vY zkHm|!yUF6Lhi=gjJpY_7b@gAtYnSJ8m0t_(xB$RC{yfxcz_S%~eKyEW^*?yM))@AKF*GWKkIn>38kIYA!nSCQDU8?k0@78fSy~OB zX!VXag9QOZ$|K)?M@&?_!OsroMu&`F2;6#`yzK5$x0qA~wdt!th9F+(?_hb$n7Lgk z4xzEEX{fh1zM19lmI0j84UJ%G#n?T7L1ELFdM(ISO7Z;3r#%H3r&OmFxSbeHG!)W& z>P9?5TeB8dy{ARL1W;pXLEv7Y!DmkNTg77+WWwP$suw5``k8o>7E8(brdf7$_{(k+ zPRel4^z<}LMgr($HAaSRC1F7tajUK(a&15Fx6YEtZop$~@TUo^*y(VqF`8W=i%xWd z+YS~W*jCgsHIEbwU0W=u;&vKN5cOrRRbf5AdV`^hfPtvL4H{sD4-K4DGo9>*$vx1)u|STMT-z1yualnO zlGP9UiY5R6Cphp56uY{o2yvG#s*`(bTyDs(~#Sx)=Tq7lq z!a@$>ov8rn$Y+V$9?uxkQ!wnA-DD#|!(DJqpV}V45|J(;2|Dc}m_4TSk*%N~ALy$h z-#NOwv618?8uRIypBn}43^;UY=GVa31<%Mj)DAhxohm}rfOE<8A>2gdR^5%$4*1m( zM92*)3^nf_3?wv=)h70=H8FTIVc=O6D26-#!zs<1GJDS3s1!VZGCUYa!FCGs7qnta z-bGMF0#YDgHKU#J>3kEqeCEMfW%{m*DgL3VPe2H`9i|zJ!Q`DeiL5`WnmLFuZ4_`& zHB+F*7=W@Q^yr|d=cC{jNE(NtpYsOnhgos4l|=m1mf*OmL^>bH_0=g2&DCE=YG>8I z_pmS!;7Caz&PT>pG{y&YlgEP?mCA)Rz)rj-kYX1$Wq^hnk`*>JRz`->wc>6Ax5zek zylq?rx)&Ur5Rkmxw?XU8tQp<)wg2T`VC;bccNVs9A@PT*XrF$|0v?pShh~RCQ3zoU zB-~vA^9~kc>!WP`;2gYkb+8flYg4B)h(STwqE$52o$Oyap@u2JOBWl3(k_wdlPvrY z-W99_k@xmXRv!n+JU-lw0$Ul6Y>UQ+$XI_%_D#^E=sZK9d01ig-C*uT&fN!YU| zdC~h}?ih8808t-w~hZf8t+A^ZanTYUF!%%M(#yy*PcRp}om!5B^cTUjHu ztsW#`m&PnX^TBq|mtXh1iRf|2pai@y)sVzAQ}aM{q$%kH9UHXCZJSbrV}3%1E&9vS zx}>>r2s!?p2qt*mI-Ud!Tbj=;<8K?-m$X=!x%D+!6$}mO;(&4&%s>-xU026LellE} zs0Zt&7nrSqk$&m?3KwXu2DgF06!r_)56qX-))5W0^vjZ5GvBnA$!=_oR7fwyX>-jW z8MZnPAc;7i1@&5Ctg(LTHz1l$IxBVRh8^jrC6#!i@*^WMzaK10fk#`SDMv2>rL+7G zlmM^vRSX|{Bi&aoK%&729tRt&j#PO#&mG1Np2s z$aTbEul!Utdzs@`s~R@z63-GMuK5LD^(Itf}BOJcxjRin;B$-8bNl27YXPYHO{g-;fm7CqlAlZW_7c?1t0aP0Umx;aycEcWKOOw)d+$@Djho}|?`J-~JUBZN3wc772k z8Sn(*KWP2?jp8}qtS*jRtdcZ)qmu+$xoWl5yg`f`paYCyQ*(@}OjF)tg7213iNs+<=7&bD!XS zm{H>!Dl81yg0Ta}IAnUIVPoN;A-*w#NK}`)o^Wjkd*#&6wsXGUM5ouZriooH&NOU9#Ne4{hkbDaQh3^n1L~CRuK030<*D zGEF&K0Qb`8mZa-m{QZZroKvzA^?u%#xn--1GltCjbW1l! zc12SmhlI<`c4u>bkN?8UHTK-O3BIBX7Fm`~(h>;qc)2)Ys1TMSzv3wt?w{7_2_O-Hi%ai z!TSJM8}pIDeyxlz=A1T6i{EBzt1566IFszh)l(s7@E^d;Gk`ArN`Ck?%Hlap_AlYw zj{dps-D(5Xd&ngib?bus)Ar|$C)B&&Puq{PLxO67+^zZVLc}i$>&=BW3W#__Nr|p6 z=xf8bNMnJREfHLdpdeMdCAESzJ4pN-7LqP%aez8hT**E7tp3U|w`yg0SQ#bZMZh&i z^lzH${XTT>g;6-|$8kFO!}0d)iK4Ofqe{#OBWaNm9#r2KTHlMAha_x6EcK8yXnr@8dZTlI81U zT6P_*z(Ma8@2~X@pJsDiAAhUzR32~5P&)~(=7x0nvg>*sn*C-EgCwZUU`=eN^9ugY zx1%`nZDaFphiwW{=&4?lUJUo;jxs{DszfY(zPp^a?zO9UsH@()Rs3vSKV)0l~DFe z8RlP;%XmEzB!&QiASqm?m+E=-Spn7Zndsa#}^oS|9h4v+x zG81E%L94z!w3!tz9WYI265PtTq@jcUS%YtTGQA_a_K|64q3>oW*w;ZVlJjaZ9{(J@ zodTM#w06ISwvxdxmD8Pa;I}lDVF4PK9FU2XJT$k7L^dy@Hfx1;wb(7B&vJhQY}tMf z%Srj!5TwAxgtypJ1?U^kPm~$Yx&y)aDJyrB%<=ap#ww~;tJ~1?Vf5J^n4{F0=-Sg; zko7^-ujQLEDwG`rPN&%^x@s#(?`b+aA5eyDDOaWkqdU3*IHWLrm&Lf)M-}U+mq8VV zobq1Vg74CgCo5xN^51z!PFVyrYKFGWGDr&?kMAsUDoTs8@Tz6ly((U6O(`@FtRh?P zm|3UxrtNBGS7*3CdD575powLn@kwyHGltcpoD@GZw&@M)22bssxMmh;Uyh6*;BfSZyDei;b zIV$@Pn*D+Jb=#oUMH=s}?moJ!2sjL^ z-~gPW^sk+KI^L-LCMRttKa3PTA#x?`$Sra?r>#ARRrdYsNYjJ^vcIkz+>g_Pao_f0 zM|~6&E`K`+Sq|_P^j#$QokZ<6xi&)sp5#1YJv9CV8Vu7|Kz{$N9@GdB9Mv^VD7R-gx&WDT1%_8w(mI_PH_7teD+D-M$6$FG*|S+uO!w?7l# zF&w_LKSz6ufDvi?FgaGe>8s!{XZCyEKZHxzTePoa97T?nUMiv~{7DXF=b5~9t^h(h ztZH3@G95f{Tec%p)o&vX#rdM)nDMdXlHwZM3)SB!qe~;b600$rCu`H+#Wj?y4bHEH z1tyR$hR)vg_^1oqu;jjV(WJ1l;OTxlBqC*IHt(+#LFB`HJn$C&utgz=EnfB>ojSUT z2~z>l2{6UF*7L6kj&`njJs+eEneVU*LW_!qx+4GSkT2zFH=0a~K`w{0gjhKic4|jb zg{k^**8sCnl=h8mIIYB)L@-+rIAD@U z_$=kx0-T86{lNh?KR#hJA4jLae2aJo#mR`=YWU|mwWrg|XcFeF6}B5hyCA>u`z6>7 zM(JQ+8Uz|_Kc0Mr2-VXfV57iU6Bz$lmBB5oIiXuq@@*g6&3Y_-PH5o?=H;SRkB|M{ zj0iXp>_PGB=OOU$GYdf+Q=5g?=wov9qfd1kCs!-NJU^kN|EM&>cUyv0Z?oP?b|u}a z7azv`Z#)2XO6_+bob0tm>W=2*?pG`vU{;PcvwKEiP=N^}bD&-w4-OrCSxCX2lJ8Ho zPSe~0%kFw4E+!h7MX6e?AK;s?l8x=Nypdeob1#1vxv?Yis*iNF+39S4%Ahv;B?g>2 zqcTr_oL41KdyRG}-PEB>aR{!|KbUXQ@3#OcKj^Y`W6E_9TrOKhx5n?Ui;hMmH#st4 z)Lj8_iKQ-#*Y-0!M(@$aejnc6ZB0!qLoTd(yOmEWAhuwcsSD~bjp(|BU6CEN6M zhT@MRAqSfZr#}g?xi~GUs9y--WV!{9zR?!N!w1~?xP0^I2%YCTzaJE;5MYfWHSxS*r4zK z8o%)|5Z7RD_LXJM-?3C1X_`x5qkcZE6|4Z!6U+e~?PrX!K2^52+H*6Q%8JhV1zrt& zZXXp7(g-F@j0lZI%p;lI^>b@49*i+Is`vLh?W6ukKiL!B7nNU~qCH3*tk}uz)7J5! z^1%&0|5p8D?NeoR1*Oifs+Yt2f?%Kgwpe8aP%~hc&9HL(*E$)ko|`=-IS*}`Z9#zX z0Euk-O)QG@3uxJ*E>mPOZ%nCxzY-=QZnW-AbW&F`!xl-v*KNRi-RIrFp(h_Kf~%#Pbohw4Ou-Mk+;8|lQkinZt48X zWHb*Lg8HF>dhR8%*A2%ycndORW2-@y(@`b5BC%1zQ_$+73FA|K0Y|-%uKu;b>@L|g zhTN{z_?T)(QFQUNVNyY?1{67^2s5K&A)oaf1!`>}FUafNLW|o*W-Q$HsbB(1K_EAY zhiD4C?NckjNNkj$Q z=Lk^{b#)`!Q}&-L+LaX^A>Ih+pu-G_94MnPN;Q?o8BbhFks_G&Y68tQi5hIy zx`DBoVk|hJ?Ub9{h*@u~6-@9;l=29@cs(s#a^FHj~xecQ{T6Wlo_*Sc2xA(-~|tC<3edpBY=ruy>r+ zE4AeH#49@JT78PYm37m9Lj+v|Ns)G4iyd?&7q;!s0Usj`!)V}qYrM{`=~zW1~+vz1RfH5TC1}N_wIHbX6o??$pOLNrCCD7#Kd(UDr(H zaPr8pvMe;zpQctn$PJJz)!BZh(DzUMJU-vkloOZpw#Sf;4dY|S;lm#r#57czW9P1jnk{ z7TxEHvBbIP$a+S+{4-^R%)Ag0`W6c&b~sFEHqBwqfQZZzUu$OT3on zw*Y--37ASWzdu*;8@;)NL<$@IMD9Uvv1;B3-y#L4q>pH+fxNX)Jtl^6b}I`r$usV& z^V}3$u(ug=oVS(;6hK|2-q-K#e6d_GUVN|oNKO%{i~ErRyFl($AZhyYyJ#GnHTqD# z2=|BH=U9j)Zl+e?ABps%$DB*O+(NCCvYpJ1v!*?rb+d5LW^w4!?xTe7@X|Wloj@)dOrIvnumAqdhy5FTTG4GWmm7pMBz5s z%+u_L5Srt0+j5P(+^o6#0j0kBNN-Ra(omrjaP9w)CzLQ0ep5RWC)^3VDdBhBH>*Aa zADWmw?QMn#Rbl%_vt|gzsln{%Ho#9m^#mZq)tLBn%Jjy}Ic-UaeC#ggYsdQ$Q#pbr z-hesP(?Nt>(dV!@mub6s30`#XFrBlW;Wu+u6**z!K)4Y|Sw0;7D}y)`0RqOMP%8I2 zScU(!94GF(N&o0%CA{xzWKj63l+ZH;b*{`LA5c+n)7sjT*{iy*6|QA*-oRx2RaG&H zMj3lRb!%)_CbnYV(!BY)dQW}FdII0Y2+qA3W{SE~huR)H*>5YN!r-|9cv)-faQA#xW5s|mNiG17UD&}?gdPt=m zZ>W(!Qj`IQ3gU|vWD)*v*9mRlhhOrlr4;g@6gEOl&0@uF6nnwh%@DFVFobXBJ-$K7 z48al6%Acnl*qfp}(Kk-hd{RS<=_ehM0F?%hiM@fClWiXixR_#5aLz*KJu)K52S$bVvKwo8Z3SyB0*RvKLYI<=WwWwqAlM^R}YaFgrMg6 zxRImlSF|z4=}F{aQC+XLWE5_iIWVxb<3ZJ~f)S;57%u-iuhidiyTwNqj*vbf2Bvz* z&*q3b4|oj+3xIvcgH8hBE$rP{A0G*@2>IDN6IRj_C);fKM%g1^u%wKvgJ#MGa?&s1 z;$Pl)J)!f4mueDg$wF^#vOimGHHlKmWE{NpEq4 z?3RhCGa3W{vn{t=4g<^SWZCRu5PD}?w3rX=Q7~Q{SPmNS*h1eNt%VLV2EUh)Q4OL( z)UMY!tjKTAO_$xhm!X@fTqE~#cxrqI6A#hn=o+X!;Q9DT|NhhtwQsGi5=d87aOXDm zANGFFr(0ve0H5YYQclru*t%J=#UruQsU+W+4e}r*Bk;}y^mWVh`n7CciYCCc-%CsV zdjqJMzpAI`hT?p>V%sN6?=ADTiCjaiMOFC(^^?cWOnv+J5I5>9^4H$zn>(0;9nJ;j2eVu={Xu082teLrOR_I6zh7@ z;tTv#*aW3RcKka9Dvk9;9dgSohFi%9|LDcdW`r9nLn&6C;oU~k2%yJX2_cY@H70k55Lj8hP1e!O|@uhN$6E%mET9dzlX4mPT}zJ4~+VqVv4p8gH$CSDmek@VE_ z9^!rH!$&CcuBRAe;x+N}{v(%8+KeccLVr#u5POckrjG(?@8tAMic+%vxao-hrD?^Z zW=v@Y@uZnSQ@>kW;X9wuD zLGbJ$9ae_bRNA|4$iJ09$IF^Kh3(o~djp4r>VN#sYkDH&Vw_lC-!!L#e1$?-eh z@--jz=?_2S+H1?X0E!}$s#WY~gH8lGpRx^c>@4r&D`<6CSC07u`cgMp;Gcve&-|Kk z66;96EGba_0s~O|P=wuu8MsG(!QxY91Q}L=K(JYaT_98te7<5|Of}@^Ieyj91Am1C)~V+Rxne1-I%DRf z5LL$owF^z%82Wdpp z!COqIW6Rt7t}H^R<_lV9RZzIpBHR|-Cl(pZf(F_uS^1JH{RAz_yKs|C`z9`_ST}665IUE~cuJlgOVUH1<>UEwe5bJ)vFe_L_jjH%EVMefWIv zFgea*;Zo}z=RM1fhZ`-craTIl_D&(^q7~bP&rG6-dlVx|UeWOG%PhHP^1|6m;s9bL zeoVb$xX{QHNWub^ZUOl;~qW-nEK6(_HyiJ+{nExzt9&Bk>-?t z#I+P_JUnNbTFIL#xBsl;_BKfa$U~V6UCjYxiO{gU=GsnTnW#80QS{7m9FmG;afYn{3~#m z8U5Vztjf~BR}wltD4h#?*x4x67*jSi3qe~Qdx3`g@&A8_aun7*!# z<29!@dUZsN4bv~tS82S<_oi0K{~kc;O?3WZHB1E9<)Yeb1&m=b9^($b>@;k2VZv-i zpH{_a8!k-;ps&Wn0H_10jNmcXxr3iAD@iVqU}*QEBW0WRH__1jpHVui66Y%R+`g38 zUuCbo)P@jY<*5?i?6j^d1h~fpX-gXa0wSvi(me%hgmY3taHNy4qX(&9;X}SDKmnK+ zT-BFMfUptB`*xnGja&vUvC%Osd9$y0_~TB3}oN)Qs0BqCsu zh}})rD~8Eihw!?ib@c-p!UWH1j*e^M>9elH?clR>m^|38HoRJ1mBiD0sTwPhB0grI zSj%UK1pUx@7mOV}*YRr63UUul=g<%QuAGTx1NXivvi=K6CW6bH4N-v8CKpO-@xas? zYzAwO7vKu1KF{?T=*mHAps-PWUcJ(F=b;9juaCdwcul5V+lZE`d2%?Oy*zX3PCKxEGfuq`6oRd1uiT@fXbLe&;4ExU!GgGQPe#DIkA5 z3s0cv^?G_zs50kv`Awb!h{3^nNB77tKfvpcJ)?H=k(acD$^i5}_N{D>v7rKL%efR$ zz~#k?(cH;2a!VB0=Yrsf>9GZz6}_+$;Fd{>0qtN7f|-Ln?Ri4XPPVo=1{W10#svGj ziUndcL`6qxZtt|b}}ub^u@X1S6MEHVl%&2 z@c3V{Y)E4*8Pa%%EYo_rO%)x&ZZ(T~*-;*>u$oKyCX3Va)wbHwuX+y3yC`|EoF=uOW=S6`LwGKanuuwSDoZHk z@41!bkg8_>5sU`k7*;wbwPg`!wnKaOCOT)Y%*^zgRZlnzcfs~3PCcfx4+*T$mQ1xg zjJ?w)G8ZS6xf`*a5;Pd|j)$%Q=Y$npep}n4@l@~CoTq%-)X&-cCU*E#O_O%c&+odc z^>x09wubpzbk{qYQ*zz|m%hrdJO}x5O)BNNk@pMb<3c@h%HfcYW6nf<~>y zIVARWtB9hxYZJi=h#*98m@7Vp_gy}ZU2s$Ql;lJe1*no*#_;fwkaJ3Pk^t~)%rVAe zMq^=zm3_XEnloY5xufM{zA~9y^Y?~caF@_!1NTmAX_J;vdrae@xHE;~Q<5A>JNro6 z->#GLqaX@NHwaN$SSbh!(~70o`iNwC*ZEp@z1-rbn;y4NwIkTq?Kbn}mjH~3U=)Ct z5^yBHQMo-^ce|t89xPpt1W?LaVVHx^B%tA^{h_&_pzyQ*-jEKY-2LC_x^vFtzq%CR-MY6Tx~#6B=b+62OX&rzKeu3sJT z1vqcFsF4#?hP4Ji{G$4DN7?d$Bw5>+LzWCwP!-+|*mJWWSk# zl-cqL`)a@u>oFanx-&t{yBTkg?EF2lHCDVhO_h35+Ya$&X&~jYA;$z|NneZ7Og%3) zvH{x~L(Az8;6UCLA$J7vqf7_>-jIcS1yO(4war>WXeW=yYE02Rf6Tu@FE;cS!wrPT=&b;BK22$KPeL8-b zyJ?ZP0GS1BjKc1NiVx^Tqr`Wb`ilpaM^Hh%|&GM=7 z`7AsXu2#(1+N#$h?g(W$Z51A_u0VgdB8h2}V`^&q{B#hkz<(_9Xz_zacB zDY-$**d~e40pu$2rAlJ`fbc<^H@2zd(oau=Z+~0*D4d5tvOMq9=WVZ+zvmcp3&R|a zSXgl98*K)DCpOux=H;Y7_Vj^&WS- zDul2jNRjvBkwzbdE z7hhs6;pZ*A;7|xM!*A0Khd^oABV5^vMa$nfnX@{a>N5#jssX&y3Ui$Z3L zBIZ1o&kz{aYhFOR0y9kjQC~14RB44Otj>f-F{icv z2O>v6V(dVz5xGX$bb%!DF$C%`shP5)YeGjy;lp7400>8)SLb;>!TfIHFWg)C)4=co z`Z8w2iVV@3ZQc&VM_jea0T>C6-1G4k_b2uInKh|3ues{8^_T0O8*sW$XljId+lg;Z zm~?^TlG4HTB&b0*P@>qyw7A3P(usr~863JePB1j+O75GAv&OZ7{_^QDC4sH1 zFFb&qCBG70kAvN>zW&Z+MYxZX@5h%WlB?~;Hiu(wC5MV%qhUu5&d+0NzZc9C@+@(3 zzUE^0d}zJmJa)g%TXQr#XzBR2A<2!So+A(tJxZnbd{8$62P#+uguK9P%+#z3)5 z-s~JVrIs!vjc%-~SKB>|4H5cMXLK%bM*i|~lx?0^NEN-$drH|x{EqVVKz{#C_akvk7YkXbozy`vzG~!$@b}o|?l;HiDTP14JLQ2T2!7V-V9rGDHguV68nB9W-kKCZ zZq~BjgXpf!qp^OT3g%sod7&!FU0%Wp{e9M(4^Hq*Aw#0L8*4YT)Bw_e7%UYbPT1xW$e-q#izJu`hFyqt zz4}%z&Ia@@uw?h3*l$U^8J#eJO8#RwHgGOJ zafF?v9#(PtjJve<#dF`DFnAi@{xlV35H570GMHf*&rKdFHxZeCpaFBWu7Y9;JkwTW zlFms^N^(qb_L?$9w2mGeWNi*(xI8UOXp|h9UVE$J*b7!M9 z-~Z90`y}?br|QI{;pW)(30@oaeux=3X}-t1Og$bL3F#H6b*XsJH%l?4+u>;(Mss2- zS6jyB_M+)4z7O@^qo6aT&Uw=$J@vY>^v$!UR)%a##^)+COO7O{^0CbGNL)r9|7OHa~Zc2;^Y?x593>j z9v8+9_v&6?Sk3bcExYph1hyK3kl0l&iDv!#>xFZg0PA|X0ts(PFOKQL z9_wWOzzLMUT%9nhEE*lc$5RVqu3K|`68o`@^(jy<)};QIJ|{2D2@O)=bwqCjg27ge zW4^|=2UU%{&?iHZM$AX5%8~27kDv}+T&&DgxhuAN8cG_^W-`ELj$bs4K@)7W{k#={ z*5}rGRrLfinZ6~zMq%;bvF6xhq>OiLjtvwpu+G-It=IcJhb;w+TFw`W!-c4=%OeQi zzW+-3inbnG?9=5I=(pN+c++&sJf&Ilwcb0m+F3-X2UuJG)&pTHxiCO{e+q2UsFX=Y zpl|QRT3xH!f`-#2!%HN>a5qQaWZ$*x`NUt*k$Z_}I4Ob15y8ZBFxQ_8xdyd^%Tk!; zvQu65i2_2NUoCn|b0ULBp01+l?+q!?7|hSiq-RZf1oF)clAelauoI}n1YqK_iNMbX zR@^@nuE3D1k5%9wJ$G}V);&(igS|(%wqp0ilxBlTGa9^Rmj=V6zc+M4y`_@FQ*|eZ z6>nL46CjCcTarvvUu@(hLcdwVkVV9@V&)$9{E(!gJw2RjU0*wJ^91^7b$~Y0JylTG z2;~zXsTJBP>#U(sxF1cFpe&w9Fz{NGp{53frxpv~E(VLp{c5Cl&vF@WVq0}m>rr?0 zlY*s-(303wkq$LPt12vRT{fDNu+NFIE+9kSb*Q4_<(18;ksD_r!h3Ga$8ogj zx+jJ}_=ua80TFuc2hLcijRJU~QX5tftlhP8O-!&-M@s2O<~1s__?C%N*{fp`RdIuNu%{l3Rol%rZx_W}4A zMm;zCIRx@5R`58Rj+!;S6}SU(#4lC1)JkV_v0jLmxLF()Mz< z@)#O9cYsyR>;?`f?j_;M@#|T+Bd=pfm$9?a9pQ~_ImH^=fx2NUglrQFVd)Op96-15 z_ch&-oOc4V)Mh&>=}ln51LmU)IWEjc@-tgPZj)99AUm_1e8GukR zz2=uxrl8QSRtUt9nH z)Pf3T9cgzgNiczU*3>i-c?u{rcgI@21?FQ}II$Ma4%CH$%4zI9-}MN}OeAYN{gf}&;YjDNF^Ye@;M?Sl~o4{byjqQkCJX4sl z5HffLJRu|1q0m>9DJ?U#Vl%xtJ$6j14lrskryegS%V=O= z{fQ_Tm&wM=A>Gq|NS{?K-a&kI;nw=Ja0IE)Lk3g1XhTHb2mJ+OiwA~w4`d)6BeQB|aW z$Xrd3Kd0ZS6`#FG2?FNMHL+(aUbs;9+DFVjFtz7sU2XNmVcOI5P8T5z%=OKF9?KGp_v-kn@5Zz^3 z=4k3_bpHPTYfFg#)9<%*$|&#NSX9#Ey5aPSQEoUUy>>%Iq<6C`1Tuy^K5y&$Z-@V) zcZ@OqaRQ3^adVHW;a4BK59Y_`{T{#d!@SCY6y{gkGV=4^KJNT*jNw=6e(INZHg_+d zKr9Z{zI)hd;M9We8~pfNzph_5$4TDuV1M`Ob_mYrlSC6F0lX8V}N-+YPACS=Xy*! zX;;v!Nj#xgLv0Zc>9ReJZD!ddzxAW}Zx|MB-Hd)A+9U^1 zEbe)q);RLjfh#rX;>EtXF)4YPrdcWD2*9Sl0s$*gS{9?dGNDlC0*sUIE=)Ba@j$ij zq~mDb)Wi1JIVlgg63tq;{r51o8v18?a^Vj6x@QF!NjLzjtmM)hI3D1S?epq+h1+AI z?Z9IeVf)MA)5--|b$DLn0;$gktF7leUv7@{RGfF{2@L3j$`cH$C)$NmtDc+Oqw+PU zX|kF)m&@3zAoA8D4>}2EflT;&LsFgvW!x~)JpIg-lo!}KtiZT5%Z5eEQZqHlAvW*l zcDC+G>r7+4>4olL03cMQ7uq9{#Y3DH70aD zS1)YT(w|l1A$^agy-Z&btgSJ%B=V7wchIow;q+r~kAkHG= zsw&m*+gFa_u^-yo3_knva!!j$@BQLmNUN*2gs787Ui>3Yq(w3B3(i$}AD_O>Inutl zUAgcR(Sx9?5PsjMc~VS)GxrzZ?*6=JY#(Y~nyEnD(B9G#cwv>7Ak+~A|L6h=+%9ydEIqAp)9=CElPRfG}aR35U5|q>fN4KrHCZb zCdEvPX_We1kBf&Hbxd1{1azQe#$u(^FctO3R(^Z(FrU298C!yLssnT@C8o_`ETUJ# z;ZrQdN0m9`HTy6{RI2nVp?sKtdEqd;{WT&V&J+o3WIJ#G! zm#g$d%9M!af8@3dtt|9EO1t!=7L<`ok3L(~5hWVkosLDGQ(N<-uyTy=7tP#t`AAjh zGx(;yk2hg9a1jKxw2MANS&XN4Mg512!PS3>@J8%?>RJDUDsw3SVun?hEqS(jvJv!yzn&|-2k z=qz?-f50S65e(ZwLU6N5Yo*;NfEIQZa#~q+sFb`zz01tCcRlR9L~-O$@Ss~PW_mO# zE@O@C%C51H9}JD~32=uLLx89N{8BK@TgdTo^FQv(+uOUci>2NFtdUj1&?S~i=psa8 zHC%4`pz5H!TIf!UVxh5C+jn5L7LTwOY>pIwDf=2^q57RzeZHk=)b>7}q+XV% zX$S}*x2vaC6UlYRi|W%^_#>6du*VT_f#m3;H>CI$>*&-4LyZSjIpfDsTumAIW38B-k0jzp)vHbn->8c4WSaQzMAxZ1l$+FjL)Ya?cu0sXoL<7b5e)6#-d&Bnx zzvCLknU!cI4tUE1$Y8>|(6!~`32q(@8M`Ciq@cr~_*=nb^A~HW?$#>XU{2_A6O#yd zFGN-31Sebm^1!olbm^%BX&cCGEL#5aHs+SzvKk*9qkN=)nLdS=il0wywUP~DXo(T? zZ&CtW1mL<&h(>CoQ#+Ztbzn9?PK-}yBa*ErAW68==*C+ic5#USE%;*PD~&09S8$KX zOO?9fg4`YL)Ft$R8oqHIwWb|_Uu<(qgXQ?ZvEN&InC4INtniT^0B-7Gv2a8ufJtZC zH*Mk0GG$L}#-T~dT()`Z*eqnNz>I+adRBdN>Ys44XdEZIwyAQwyPYphMZSX$#aS$n zo*T26S&;i90M)jhR{s#6tg$FED5>5- zcUv*r&si!1c&H%CNe)fS;vlP+cOLdJ)5K#p4p%62<16?oAYp4u)yJxf- zIZU3Gz-EwjKDc~O&xy?w77yO=ush{Zm?|U>J`LiyctKK(OW=?417j)); z0#J2>y)&J9T3#L&lx!ueW#Kc^e^*KE^_JgvH~|Og z)BGdljzbJ$1Ee)7Img-&#?I!GojetQ_F&1!vtEIc?IXc)*wBo_prwk`qz0|t zU)j2&HCs%d4#e-dJJy`x&(xHY;E}N*M+c>|7tXToXnVdttH^zs1S8P>Ro<2r?WGox zx$L!<#)%Uq`uvcVrbD{9Qx#evkR`$GGupf{4^{y2;lf2&eCRwEJx z3B<4YFo}RHaT?VAHy1u69&FM+(tJIIHI1d5m6s+lRyM_H-(G@H(Q1RLy9c34CzTQVnt}|@kjM(n48hh%py)QbMg@0AV*7dXWF~{He$Pjg16l)GL zGG>CjDWR$_NY_P?`BtMLz9Rz*JQsQ+;WsWq#h>_fjum$EQBhs`luSYH145Wh{I14P z!Rpl`+bAsU^vTDnD2o(l)Fg8YdRh;uK>=*2Q~T19S(o%{u@m?{(oy2I!8zSQmFHI~ z{haXZSwB3%$smKf>+XaCwDDsv%o=R7L9pdl ztb6(Q21AXpoH@?n8FLSM6rm@(Oe7hj;U+??V##EEY#CblxS%IamL=jR9an2!(I?zm z$alvKoIgHTS{Zx9Ca~4wFNG=klbK)P|i!#5bQ^j#oEG7i0y{l=e21g)>DlIr(VuWKiI(K z-s_Xq=Ut&!V0B95iZ>rKbu_PQ_2#p5Ly>MVe=hz6y@h;lPf6-juxGo7S~y8K-6z{g z-Px6M>SFZ!58m&@<-w%w#*?8a>p@ z!bcjZGTjEad~3GDL%b6?%cetL6MSrZIr!qPACfp%4`aP(3fXw>F0aD1sD< z#&EFdcw7wy5ImilkY?~{|BLf=@msRI*zQBp^XoR9?GIdl(jRhFdjskp_^wCla&5A@ za$(A{`7FhsQz5;1`sU|u<>4lMZkJ|)B}dmD!ZcHrEp5@+Jdsz?6Ut-B{`Z0dSFZ=7 zWAtVeq{=%#EqPG*7_!EkC(ppGf0uVHL-6}r2q6J6i8540pnm*FO4>WPBEu|rEWT+< z0kM*{-*-%G`GPs$xeXGOa@onwxsKkM9(^o4(m@PaeQHM${wK95wY(TzGzt^B7!ffSgS5oTHg7J6b))CxCc85lpE6aO=!D}lvZTsR z`+=2b9p9#FZLyNmBnJUHY9i=u-Y3o-{p(_Jo}eSTY5|r)bT} zPmnLPtRsFnvOwS-fagR`O~~xfwe`+x#$ZJ0!^~=|D)84;8|R#|=6YvWkCK!^bkkx1 zxw4khgQKU*k*?&Wd9qw$FRD`0~u(}LlZ+obc6`yrIBboIQE6Je7 zWwIf?B<@PBX=f|q3OB$#*cDdlo?%CH*!bzL8W^J-c@AACzi zu1f>F-i{2a|yx%#e^BBLdZu^s_z@wtzX*XxX&jK^XfZcq=OK-M@=fgnbf!%{xDgyba`-czBoP@niH9LZ-%l!Ev(@4snLeX?ixU_BDO+1*hwzq7?ex`@OS+qnmnG zwz{l(szduR#ibgewiLFW>!M|H`rjM&&RugcR;^C>=ImqwoEoP33FR=@;+gt_Rm}p9 zj6QZ1Y=^s_-gfmH>OajYQ=e>iK2}A3b|GOha+4|(tN1QtW2S)9Z*3C_j$y8PUd#%x zo64h;kt~5Mux*c~bn;5&IO<(^u%4lcr9hm#19@gk5%A6Xz_G4irW38MmJF%h?e+Nf z5OHDjd5lehOuqlwjxh2Eq=T`Afn+O;;@^EY7Yv8-E`C`F`v7$5O|PlM4xQK%T%PA9 zubsS_44%mp&pQPQw$kFkwL0c9y8I@y7Ol%t4_#DyoL6nkA64B^G6z_^+PKD~`J$!B zN&OR6!dtfl3xl`uku863cz_+Mo^9NgUy2X$Efmk*(3TwH4f3ZUyf0Ww8Y0s=?`U4R1`W z%$Hcu`d0h+8C!qrI3!&TC=m>VAAHWiq9M2#&V~1Xk{lSBa`CU{7n;m zL~|X@ST?pE1Q;Ij2zWHr2#-yYKZMsEWLovb*lbwVV;@9lQ1IV;-lRB@HTJ4b zdsXYhV8K9Vc^FTJ9PNavIMgu7hSUF91B6z~yn(l(#(S%-PF>C>Cqe^sw|>}Lm8hes zhl9UA2lo;O@Q(nO&s53dvhUrg!#X3f(%Ns&U8mqKZ}D@Cbo9J0sP`q!o7C& z0E+?RvYWCkOt(q(P#$>%Q!mfK3Y%pcTHAU6qs9z42-|HwBVM3>vH z^08asli55FjZnF=crsH|Cv`O7AIDsE#VprA^$l{j-aPSPKkLwizJg3I09$UnTJwUc zc^E&d1y*~~g7cR)S)B`-{d*qdg|_lu!3R@6w)_I4YHC@{L#ZMa-=C}J_7QUrig()- z^HOzjgZ5=B|FVa`Tot*MmS-unkL5TzCRI(F$aA(v}t)qLZGyhz_8&AzClzjfY^tpwIH!}=Gz(KBQ zUe}!NJMNX@Qut*7a5ut5ROPe2!$KL6KOV=cW8@FOd{9UM$IBG%d4)Ewc${n;zSD2i zq&DfKI_TCQ4d_~aAy`N?e;m4lW^jIKOm%8`Z1XHeTnxZM>S{JAU+Jk@fs+`B1VoEz zE7xR4(v8y@CDQGk>MqN`05F)*YMH?A;aBYD)!ZDD33yhkzT9hG!4S=@u2A4*H^lH< zXS`ZN4LP!Jtog#xg^7IHET26|erL!HrOcY=F~gnMIY^N#avDx7SwHn%7qwAJhT)Ny zV25}^J>)K{0P-L}k_3Ez@0j}g32I?E8HcMzo8^oDiKpr3EePwXEBiM^{Il9|%=P@Wiu94DpsIfdNT{uqFsCx}*D8oe-t7OmiRvy4O>` zba^^MW>jRjD{mugXS}m_@n(MEH5UIgrjGh{pn&o+J8ZJ*&e0<)0-Uo?CHZ35&$CWM z8X4{`3Sgj~6P;$m=j5oY@`Tz}r+bCgHLk``jkC-zkA>45{uBJ_)tZZE);|NVO`x2b z4|Otp)&)^BxMJl_W^sGOv*bl!c%3ugsG`t{gB11YV2z`K4OZ4py{n!}pQ&xevhc1P#Je473=Rp%93+@BbLg$3hw3@XXd64w^%tCb2)$%Zs0j+IxJ6P7lDCrKP3%cAwMr2iiJ;!ZaP2Z?%CmUXD zfF9@GM3b;e*QbvRK*BoDTXP1J?(KT0z~Ah#F4kS z0#!zUnbDbOjwvW<_E;4<+U8w3kPYK~5{2^+<`)nLn9^9qGBSz25o(XcfM+WzrG8AF ztn&PJao!FKG)q@yt0EhGsmN*Z8dWD8o;L zu#l49aW*du!k`tm+eEUF;*Jok(jl!vn{5@T#$n9%)yk1S%+w8P_Kpw#b)_a%aPRL8 z=Rtl4PydF<Yd3-NY1lVcWS}GOz%s?Yhpg(z7LBxN1dg{ zJrMhm=KK@-1S;`}bGb{)8~%}|1O#}2NO%LHwQ3GWp#H0vvPvCTm&*O1+MWRYMKVFI ze)iC{DuFh~9{sf6+%cOkckz294tm~kU7!prQagtP|B-p%l+~=~%0(`H(?jp#{G~5C z)*09z)`rJnTr%bYR8*X zR&TpMKhy_qNf_B@Q%4un^h;24#yVq zu{g#1%T71PfPwE5*H$>OX0!6VFy)IYi_?o5(MsI%6Q;AHeJ88K#it`Av=s8Xn3|d; z{4YY(B=$X_?Qk4+aRHfSyy4_{6Uufy_+91di#l~shMssRI80>f2Ha8@%V2JVCX@_& z7=`%J)MJ`dxYF(*p8T>hI*g1Y$||6;iPqnCvbh=?iVF5)|b%bO9^BdYx`(pP1A zC%QGMiO!XoxtxINQ1#&w2o|}HIpR3bBtbMQh*&F^3;(3;**Y_qG!?n^d3o@p$2V}l z-8P(me2Iz?mut=gWOannM&E|JoxKvYlZ9tme=Qn_1+{@T1MJ~;hGqnVo$m^zojpI`gK#}6W)IE3Ez z&qr6!E3o{lxt7&$9a_&}-wQL>zOF_CTWoFae^K|QQBB_KyRaRtwTg;Dok*)9Dnqu) z&?1oCT0~4Sf-)sQwjyGPA)88M3Q1cP1Vpw{NP$W!Glq~d1O$O75K=)zrbL1e2r>l% z2}1~E*zXhWozmYv{OLdWoJ8`^HJi-M?C$EAbK`%jd3< zDKj1iCqx|#G{oG3N=pcn*>%xJq#L-6#?KwEi6sLE9`rQJa9N}f2JixBB(3x}gQLZF zT}1RzTa*!Z;M5Od(jS;>TD}me35AoVAZ30LzezngQriZd7uLyPA!z29Ylvxv2`8Vg zPbDHUx*!z!ohMy%I-ir=cKMrztxJ8^&wP_UDL3Mqh<24jajxI+n&jjWqNxk7-tB%Z zoDB=H9Ap`(p>B&#AFzj~at|nPiN^(NKi2G8$pG+goHO^hI2AQ|aTsHI$EpDrN|5em z9veId;hHcGoY!cqV*rI%t4WI^gh*2z{8Cya3s7~yf36F>nZg*e=eemS=%@(Ri%%bt zt``kV9}_^H8S_deUVkFcC=qEpn6?9rOtP~MKAY@;>R62AIl#9<5Hem-wNDw^0&ZSI zv=iSJ)hxQapzJ7yLemaTwo1-7H!(15KBBR$MJ;sbuJP*2;#q;4?%h1APAVFB(_vOS z%Hy_-qsav8GAPwxk3o>YbkHGX+Fd8NVuGVbW{#CZQ()~I^F`{w<#LR_I;xZqYhJ`5 z9dJx7oL>VwAqGIwPArt$Jyloh4d%tVK0}xUZ;IhlsmsO@4ym5cV!WCRT*M7-cjm@x z()C-N!_mCeC5R(X$tOfN>CFxtHG==sbkm`_KDO<=e1p?aT>HZ8J_FIyJ64ri9_A_I zT@q>Cbq`CRUerC3I(zwt@L;J~$C5<+&z9k$V5Redf2pJ&WQJGDqnTuz#HO)Q}@fHF2Eb!rx86ap^<#}|aLL!I; z9NxlHu{;|TDAL)buW(9ei#<9ZI{b1%WfnGJ9i9-x``%m5Qbna@dZ;eIW zZ15PF-#!z&bWSD)4FPdGj5dYP9WKIs5{AFEE3s9wN&7)xh$7NA+d@pA{>_VjeUB$? zMUNGws9~zPt5$1%9*>KzK^Vi)E`wXeh7GVM3^Bcz6I(3f(Jl1PmmY%6b3~ZXhj|4S zT%SwtIEW1)l&Slh8MAMrB9!~3S2FBsTT^L-24}iCYhoVTu_<$>y290UhFZFFnDcc>hsm%Qcnx`$^LklSf<9q!#r zzvnN~`@yIki0?Hlzn2S$S&!bAC&$PWl9K%-)i2*l_0h{@tI4OOb>p_;TkQ5&} z>Wmd1zPw1fxJZu)G)i0EWZxw)z0niqn~tT)hW#%wR)Rt^G~&gyS(MR$7S|J*8vbp= z(Sl*VxjRN}2cn~`rDu90J9MMf(yq*waQc>t(o?0!Y`bZiK1_`l7w<)RU z6^U{(N+YSF%|Nr9Mc^rs6@4L<3zRR*>D@evk!;h7b$gn4YTpS~YPgbqP?2taihagXWJo#3f2dK`)Q+SQbsIHEf5Y?v zYFaL}kt}VT^09ZnW>$q=@7F++2e8w$C zk=U%H{!^Fl6f?@(?N7g|j%&^}Pe0QuzXnR0i3zaeT;-`?_;`=G)ppR?$I{x^BN0kj?oM8%Vko0Hv9Km{0&`@)f#fnnZPzv{)9%?do)72? z>8~CD5<0wT0bB-7w-p9(lx7S|m6*fUJzq+_fy<|9tJo z8(TqF*@BophK{%n=OV=2VnwW(AP1#e8|GI}wW%sV9c*7aioQeQP*6!h|9IfBuNig3 z(+U7|-f)Ky7Otj?9qeYsPU;iZI1C_cu+ca5Tj=)?V*T!P{kE>ztdQF3WLd8s#d_25 z9gJsl+SaOl)_AvhqyFlfKAGqtdTY@B%)|RC()BU881LaX`mX=3+lu_44j5BTh>=#qh9YbGk&(psZ0wS_U2nsEnzYH}fzTMeczuebE z(v^9Fa29SbAOT0R=${TwV~19fY-lf#Vn8okd$g?Ifib187m-JqAE@(N5t|#xEdS{1 ztqj`EN&q^f?sOt-Gs$~BZCmlZu=;?X!s_Ews~PF>#VZEKYOWBzdKd4uekb)ug-56A zHhU`fVDETUb&CHYbr7*OZXGI#&qke)A8WB20^r_q#akBirP^YQY!>b7E|e;`ld3%r zba^;GHmawb%F!$b+R~$Uu;PyA_EAxz^rT&qU!9O64~_ZQv+U6!l-?2txlOP4rRZY? z$Q+HhTM1>^J9ShDA!Nj8Z*wO&_-P+>? zApQAkky;wgn_>T(h7h7g{}nyC!f+w4;Z;5vD$X#UWW`%*uPAdou}3bsEoYA?R#fJ5 zg)D3UT(!oVykrP_Lvw`F*VG@<0(fuYK--Z`$2sJM=xm9!+e#a`=)4 znPHma@0l;(6kiKz%;{iTDwRJArLH_J_&PIAwPh5*U&cYzM5@P z8(*aLbhwVgLjSVuN#dGyt(FTpJaEYHxKr_G!2&<{@CBDEBCB^jv*FUdJaFi)$(ddG zi4U!z95qQr@SfvXGZ*p+k1?FjohxQoVhvoM=*QrZbpfdUeT-b>av_#|MC zNM>Q~k8gl8%zOEk{xb#Rrjs>13zINWlSvOyPI=wbii!9{NXBFO&AQy^j|6#(%FYbW0nWC>TjG=41U&&m)6l%A)bV<85%CKi2l@b=*2*ffhIJpQb zm3uiYU1qKDGPnxz659ut5_tA1eM}D=DSK`;(^w|is{e<2kZ)$CTuC2`w`f^-tENE& z#ge}{w8EZlFs?5O9O~MnmPdemz*OI<(E4Um9gYpSjR(3y_Cy`X4N6!t{Kn|x`mMYH zBlpV2x@><^wZ_`f{~FA7L+9b-*ZsuFqTrnI(ol%e0gv}qgm~Aj>_k<0Erp_gJUGh( zlJ70`wDP?fyPIJBcX;;k zM!yo;KEy!}@Po#x3EUy!hCT9D9irql4F(a70FTmSwV&1DZS>N0Pkp;w(!sJO9 z{ao`-R3r+RTjpH$%|wLt$h@Xqe!QW?zA-H31-3yHMq|Cz#w*fB$8$@i8<`u_WVfnr zr;FRMQHk0PJQptpXtQ#aMqYE62M%cLdRT~z&@RY|>Dm|_{6os~;Sba?BM))zwHgN% zGTDihL#{#t*4qVh4#-yj*yTV_^!`?aDdnj(qSa+*Ws3gbt~LhLcU_0+<7IeoRf$m6 zK7%#+d2~u^&?ky!ar8`!N*tIW7`*F+i%)PjnzwFv!-_hoFio;G`o)o*Svy8r|6F{q z(aHzgU!H1JITSER7a@;u1~tc7>ckxFF7;6s)wfcK9N>-au2#6_X6Tt^GDZ-7py3Tq zC>mmJDMwWKZr$g#3gTvnp-US`81qOQWn>i$ocsdI$kMPl zKs<&fi({g$EejHi;%oS-zo945{yJ`$vyu&jR2b&nbopx0#e`trgYzh9u}RvVO(6Oc5HA zTKI5*H#~++hB|9O+7eUkZbh-iwU}Mt5&z;sAI!=Eq{usH6QMjzlwJNP1So^~tbn1n zFI3o$f#bn_X>8xhQ`g=UpS`l9KyjE-m*v^<1_sC%NeI{p+L9UxN0Zyd5S?%L6 z=9I9)-N0Hj7{D~;BP#F|)#g77_^Y8O^!Z@XI2(-3;6nf=vfe2|+t+ z6hBsliMd@_<5*p~&cq)z!#3D(+T-2UYxjenzt$XR?{TJCgu*vq$@ref%4JWVcSFpF znUv8ss4e`Itvqp%eM1heuG^*8T9`_($+>7<3p{`jr0y8U8hq6({tSvf5g^o>ONY>B zs~_N(c$VifCp#Zh8~cgot*V)`l8-w_AG!=;>gt}>*9)~0uHmi)dfiX7%?e49llz#a z(YS?nKm^b1gR9VDK!j7}>I3}>m{yBdxoKQGo&31lv!jE+j8%S;c9(XLP~lokz}Iv2 z?V0}J@2#$^Z@`Y1Yrli%`;qp0rEdA&;I~j!{T6njZZ3|*1X5^q)*s$-Uj(GkV`i^%s$7~IKzUH8BbONfD# za}`R9*$%r@gWb9m&)Z; z>4HT|NBp)$fpL5hy7R=WWWmVbGnB?0Li^<&?YDLR3haYCj5VmUz;T14qycp9or^$! z3CK))>}ruVTBpz#h8B11m8=Wq2fsWlJdfF|KAmq`4Z%Y!b04e3i7AU@uTP0W?~ zKzeQL9tUAh5IxjgpK3Y)FQ3PKq061bXw179ww?hU`XnpfimLJRxOm*(2?C$~C5h41 zOnd{QGeu`|*t|?Lza>Csax{ife@${F6H^)gYmepChR5=}4?f}FrL7a03-tq0tN<`+ z`U^b)#V*k2SGd-yQqpL=uiVk%E(NLf(3ZSQL4&U#A4)E0>;fpM@902pYN~5U=+y-b zg9g1^5O8l2Q<37;Lnhm8ME}l(U0InV?^ zJ~9gY1=_1WIyHZ;PPsmrvX_Ws1c~gP{$5b4@f8;?@aFp|%+Dwr4(Qm`Q%iTs#uEn5 z+(SPp)J^7S28gNgD4(>J`*?SYjP3X7T}S45SKj3JqX_?9_oX0&R2pU^OxA#{e4Ye6V@cjE(co*R&T`aEnrR~;KQYXiAauD<3!RZeVuDwbhyT= zI$4a%dFV3(FjrdkWYeLrT^YPIX^Px29D2iTaJtSz_2NymfZX6Ol%JOFolGuYO37i) zYEJXI_5G$mwj=I7?r3?w2ibIt&}6EBGk?_bp#x4CA}^@Xg9k`=gZP!&Qz7w6Yo#lG zli`Dfa{xa{=YvGNF`)qd@*?iY@o47r;Vl&ny=2PO@Nrm(rUO*iYyWTC;^Tho|&r2azJ6DKtx4#jr4bzhsCFP|^e*s)XZq8jSb z;TFo|uGuL*(r>t~Y>`&_MKi`+9z`fpp7(rKxGSU;e^nGd_Us!IK}ygUH&=>Z-hm2| zOPkg1(lPW#+Am&TIe&$~TeFZuk-?VK~_ob&qcjJsX8 zfAB@d#=f2lNdKRm-MpO7m;ZaO`S;7V8JpG_dAbV=WAEMketk)9VQlixmc0cG-+I2Sk zp1IYE=6_V=e=>C@8A|lV!hhkIwYtf_uZnDz2FQ<|F2Js18V>V!M|4)|jC?h@8Ngy>TUx>z@0W`?XOzX-vys58jA1s^ zr>xYXph5K3=cux^y~?6Q{ml{_{SrM?*1dYagT5U$qj}rnnaoWP%mL;Xl*IVwgn0M(K~?B#+P^Ah>*`_!J6Ui)Kg< z`?@E5Ed3l$gP-HDS!6FIf0ntK#wV4Y)TK{=+6O_@IIImAdN^+R5ess~<>8Oip+x}i znZcB$GzjZ49?t|!HV@93O3|NPigM)oH+q%03)B0KF}olUi)k{fvTJkn7*35>CeLYB z#5E7i-&U;p@TP|iUad|5K#m7ZuNPnv;5>BMBNGa-Zg*{UK@<2T4;#RoTnYhGFpPJv zBZhNvC0b++Btu6__>P~vJQ}FJe(v50-d|{7KrZ9m^{;l_ZYv#0yW~g#QVp_j zrF1Z~i1BUXg*FLYj?(!kvx-N$8hlllNk!mlMSy|yPf-vtHHwuxyk0WB!kU7xX`eq2 z+&jRcoQbdaa})Q#wU$s6@J3gD32EGQD|e5g|6V!-6|UL~-@Eld6g)OeLFiu_`rHN1O1ay=^OBGJ z0JGV3|2O~IVfKl;t5M)Hbuk$0dn(eU^#QWX8@^^ADjO2~_Y13yD-RdC5IXxSbp5YF zetU6%`Lr&*1JSr+RiLy~fzf@_CXBO;YS*iGR{w||*Ku0JQCUA-T68M8n~72`!fWZk z4C#tcYXp2_sj%SRpG^maTOMkb8lBvb<5NIKz<{Av>9|{R>u9v-x#N&v-dwlx-rd$BqxY(zNxeJ8M=4BhGMiCs4L*nzi;vMbmGQX(m@4=M!h8x=F_il`+1k z<(~Sk&Dub9T4gJ?( zuEm%|Ekm|JzmHAn`kT;qC-i{gtdm<0v4YXBm(hqVv@Yyq0w^(zqf}RU6pB>^kfVk#7{&!N zoQxm>K@q3&>>thSz$y4e=_N0sEVR)xKMBU6@uFW9(nAopUX1!fb9$R@Y$y3V%oOo7 zK`4_6RV~nPJrLr(I>O|>3O(;@T?EvPRc3K1OrurDgM~#?3+hCujQ&&LWzf8w6Fd&X z#xFT$sB&PSlk3Y+`IUnsC6uLsVe%C%5|zl@NZEAEF2FYmI( zVcw+!EYSc96140pd{v>CIK<&L2A|FR_VNQ9&MyyO&~e`lg~TBx!a7%$8h?NOIMis?5t_Z~cI3y?^%(^`G2&{b zOxS}X`Uk^>vfYahQ|-(rk^~^vlBLe5X5Y$|NBjexIM>I4;QM3=Ov&d3QH}{2#e{m2 z{GB)+g30RxMKGj}3!Gz>;KJUc7U^Ei#OkII=&@#{Ip{$YxW zQ%IzHdC7T7^VFr`uagJ87v|(tpy*)DPACgA!RNX4DBnVLwpPc~C&42oifMZWrV(2# zp4I`vP-EU-miNH@nl0Jh62BIL-w9LJb4}@Em=veIMbjoUt3~Vm-~#zu&CwWd(d=2Q z#UEj{*>1_3({)L~c14f&9HWN~VOL>F3zjVg!hwuc0VbuRPnPi;-e^z1wwvJ@5nMtu zDEa6eouUj74;Pm2e;#`q7}?pwV0ASkradB0xLKD~#L%CzNk5^p)(`Nw6Hj#_K(2i7 z3rkBzrxk*m+7BL6FQ&}mjqR+BT3legX7<8sDG$2lrI$gN>T}xeZtei}+cD0zV0Vqh z99bR-Q?AuCD7gPK4Gr9rKI)SRP)q8%4BeY|U}L`^LH^%$f6Y;?NijC;kf;gBCpO%T zP&kL)Fl&7cfywA-Tg;~ebUtQuhCJ*_F@dyGgUaEaC?ptWS{r2*0Rv&@p+s<`XGQJM z8h`?TCJfAi09Lx@RBbu+R0>Y07Zh}k#}{`d_rjZg{pN*2qOl05Q>G;>TjSaQkSb^? zo2J+6Bs#lA!Uyw`H?fkR4ay6^Yd#l1hjdSQu$-%OK%*Fqrv zSxUS^D`FRg1i99IyefGE>rNhzp-1s3R-SY@wkOqimq2U}Vwcz24_HLy+m-@;F#$eP zGPrJbUrLABc012*IqggORVuB&!Tq{TMM-CI*f#esntazd%iOho<*5aXk-kIkr0)TR zTBa~Ju)r{bIKyZMUiJ}fvibzsD)(p)TkgUI6YOXc;v=5POz zDDstXKmJd&;Q1~f2Lse3-Q8%3$&~tW=Jdcow`|YE)@hDJ<2x#pj8v`;?a@Oa#mYR~ zW_RJ&O29K0j>P%rG~-5Ps64L3Kj5v7Gduhh7TXNObSrdm{#<|V7}M%R`(cPQb^Qwa@2NTI)qMR z|5nG1Y;tSWn^b}Q@o47_yitx(4Sog@qU+CugwzIur3~V{(|hnRGiyu?i20a(yOY> z8Z0bNNb`-=Wmi&-9%+wv>p$*@9~s(4+B`QQoESz{!q00>T$pdweX; zgUmpx=1CWH&9U=1K5TNx>BUk{6&Dk(h-&pf3vyA_y|g1TQLdR{c^M)e@;&ii>d=VqJs7pB}~0 zXUF9Bc*Sp6@aJ!V0=zMR&|FWFllaTD(PUreERRL>bvW;gBPT z@U1Qf7g2GPG8qEMKDz6Rbc(MNLF1-A)2=z!8@b7GQRC*$m=!<_Z3aT0yueyq@ly)! z?7zv+-PW()M||B`OpH1T=G#4bnSr=i#C;(lBCft(-bt|zUmyhQh6>r7d4rjg}V@G2dQhJ5#a${>|Rr+HQ= z!jp9D5}csr#x>nY$pkhJp*5a*&brT#`mUUc3j z98OJUPdQ@lM1Bcrw;TuE5e!UYV=(ICJof7;>R!dX#>Pl}hGtEuiHg1bl2_kdXvmg< zRp&t!uXtEO)%~BLmk*{Kqi$AD<<&h+LH9}*N$^8vR=8SIJt^e?as>Q}-z3A5A4-Xq zPnq0~i~3ZMro&_K5_)i2jkbeScUSyedVCDQx^^DSH8I2dc(`_99=On6e^saowWw4j zzFiXtQa?QHGBj$9=3{G^q=`ZP_WJm)_Xl=YsJgB+3<~*&%QdwzUpNYDRhFjHKF-E!^>gLEv1aC$1{`UO{INRDr?GF}gZc0Ng8B70V~sOJ9|Vt1zuXt{QSk{oa4ex+1B$^-g^QHouM z^+}Cmk019l_}Ut7S6CCG54$>VZ77-?rd>fzW~cC8N_1bDI%_xqe)0!V*yg|pEp^Lr{zx&9e> zqt>ixx4wL*6^q(zA7y!TL z=@sE+rJT!`!lTokMM*xJ4WH+dxB06DK6Sc@N0dJyL^XxT$R@X@eK|C>D?F#ngJ9(; zfTB0T6`5t&$&vOePMp*$h;-^;@Ah;8zSjqH#4M-AB}vF}M zH3wNGP*aG4ONpjDBmGf2dAjMS!i;TQJ4ml^GQU`2@C#jR_ovVN_CWL^=mW*&pe>3y zHe2gaQwSHIF7v8rq%1 zDB#v`%UGViuV?b&zx$K=PbKEp5fPGhz(4wX64t{7{m`=ILB|9gh@2gua31&V!215W z400R9E>y)n@Rm6>KU>>$!3(DJ@WLEG@Kq*1wdmEL6lf1**A&_fKVk*GeG&CIrs-Pc z3q$z8Yjw`a{sttSV8fGQxHH+yg)cL+U!|5n#xi6?oXu%9p&=A>zQ;+A*LIEQ zR>`I6dl)Ve*i>EM&kqX|2Z>R$)hy=^hc&GZM`dem50MG`()Ey0i>R-I=<(lze8GP5 zn~DaFTl161ET^oz%BTA7r}f~GtO~Q!q-`9W_Q?)UI#}qyFwJ_bW370i5AYgORxbQp zs$>YVC9NCxl6@N+7r2e5ki%jzf1F=rP_UP{46XF2K*JUq4 z-g5jeC0f(8R>WmM3~H{@dNqI3p6k=Cc&d)}(rVN|xU*49Hl-8ty|!TqBIr8Y%Ny)8 zgTPt?+j63}>xE-$<3~cZt+Px~2P<@WQXMnzCoiOj_wBHv~%)b~OL z7*(>&1VM48_qb!r8*QArdpvCTkp9K%chwqKZFXVtT%HE3zD1qIv!z}~y&s-;gN^oy z)_Bb0$h?=nNA#%g8hd|Tie?vn$aOn>9b5+Y17*2KAzs5FalYY$QtIjIg~Hlu;Waz| z@bD&B<}gB?ck<3x-)xBzBa(yFtfG$Xbb=;`K`iD68*CRkK)K7EcSOnEil)rA_fXhD zgMK}9zZWHjg;?yU8=%tz~)gP=llx_l+ z#FTnQF-ARc6sx}J&4ahE2^=QnS1vq-AKdD{>-xQS&znW-J$yU+;oB1QUv`6c)a*1R zXG2I`=3)9wMo8>ImiP~nhOcX9&* zswX0n?SP#Qf$3#S(={ltX?c7PxonVzd;9sY{=3fQRTs3CsLeT^>MXc4_OkHkq5+wB za{fS{O*xNZa0G@_ldX_a>4|njWSDqOY#s(YEXe zM<3YhbiC~tj@}$>nsa^fq^4`x;1mr}=At+S+OH-}b$1aNekGg8GEIJ~ zaT2bKyI zuh9tn+&c01=$q&1qXDqgQ@j?rSBq*MSR>^(BucsJ@nYIX>dJ`|JFAD#I-9v~8X8eL zLsYajtT9-yHgUh~YHaGgoPwaR;VaAo%&<%#Ac|htI|@|vJEQ%)-hDZG7us{I@QaALYOK7M6EZ@tKaO@hl>dMbskxdD6(_U@-axPn z$-6TXPCYUD!iHkBBdo`b6dDD_0d53UDYeuPqb*|zscsS10X#6~I|yG-{q%M!H}I_| zAgM8wF6t>oW7lo{er$Zvp-VmCwyQR%?r>mf|HhrHPfOn4XB8>8@Bqs#h_y1nA36Ts zcKMo?z6S4@Q4;d`u1G8iY*kLOg7^m*H!7ithv+ZlaQ7(wCT)X4^2>yB{k>&foIC=M zRU8f!%6d@v#LOi|Y-fJiU_lDr@vi0p8h9GM1`Cr6{B?EDf;IBlRyyC|3oOPEl}G{O zH7jtjqc4#t-EZ2<^)J1_@U{z5?^1*4*97;%8~<@2SCT zHC&~?(|Q3I(svTAy9`e&6FfuvV~koYU)V+;tV?;7jbk2f=O#Dg2PhBbL_C^`LW$42 zmbeiuRAs(+INJaejO<^3p-=X%&nnyr5k+G8(_7mx%Ptq1t_1~NH=aR+iXcpQ5>&FX zCpq)Gb2`3^9Q+!VYFT=F4;T-ODab=uh;r?2ctzBri8JtvrIfxg4zu30F~kM5X!PF5e}-PK-{HU^*W z*6&x(eO=~pkzyn!=cm17%nIL%CbygIR$zVwm6{CN!xTuY>$8UJGg`;RsB!V&d!8-~ zAl^`2btT&1u?-V_6dg{3J6FTi>@BF(!$PMob+mKPZ#0fB9h)P3yu*%nJH?NnlGdD; z3oDuww`ybA#aY(E3U)lyyI;ppMnuC#O4OTh4wa%b`W|8eX`vaak4y@Y`tLIvn0(ZB zZrosRd?^$$sBVD4-zy2|ma~{&C5p3T@yW4BVZGppv1_VNTG$xE2VJY~F0>6~b^s(l;f)tVlu9T`Q}+eF z{+?ADcFlo{O2*C?p2|Ru=6-_h52Idm-R}MNJJ;>!KKQ@k7vyK}UAH6Xp}GCf`(w?L zlh1O0-{N^@+4yzjC)+?1eTcricYWT? z?>|q4;P0QmPS<&yJnw!^c;#2P+7ZoU%NKHSJHTu!GUu3-c*cJvO@rVES4W0i-zxKf@OGBD^;77fv z#*GmJ?eUe6fLBPw{%ugabB4u$3fw2N-tkghj1-{yuE=lf0SY)XdevcY+WCXF2!6YK<@wQv^SAUS zh~u~_rP0st`Y&tD6Sa+mZ7~2&;$cpotvtJ-w^j2){1r^lZ_{!1)a#>Z+aWG0X*j4* zh1vo)oxpUhq~Xm}KLrES(<6PsjMG&qmpD_shN$CI`F>M9V->eas#VeQ~z=-P?c zO*nUQLNMB89CJf7GyXkhZZ4SLP}%X-^j9@$%;gNtUe|w17w+2ZSKpawp0NAtzw25; z7doZ5wC&L+rCOJb%9Vs=&^0v=`#a_A#hd|W9$uUk^!IRNflDcHet}PpN&<9i#%x_; zOKc`g=#4vcZ+Riri{a(K+ozv2vryn~HIPT|7e&Ls(jm!q>3;aWn!d8UC#eT^>fXgn zTcBo6&?pLUF#YekHv*h8@DE?+M(V}l@0@@0awCj(?Z(E}iyVwlFwqK=e@ABNbccJM(E-ZlG1`9m)BHu0O; z$czKI*XrpxVAwlueLcut;gCw(8hvLPWv2b8l)67@d|`>V)lUp7_$u}fULz!VLx4*} z2Y6^fuG)%0YoJBN1nX``sjTVEmD8vOa0>(UEt9h7*HCNvt9m+je9x(E97We@Wl@!a z#iwtMJgxN~kt4i?V~logeb2bYw&H&co~+#-Yu72r$=giTG0HCfF0;bx7xz?LU3=L! z0kP6E`gDC|U8jSa#(8D!Y)+^Z3>YtK=sBeAJe6q0dz)L)^jaDIO}2%0zxWn?1`_rL zvF-OlvA^p}phs?gs%9zldvRV$(Jdag!2+z|=hvgnmq4<39o&CeMy;Ggv;APK__g}J zGzSk69dm)m)>9M1mU!(3z$V+5HaU!aqGF7a94(m@Eh^H-Y7cVi6zf51|n)$XSmMC*7WAx8rh9wX01egU%1T zdQ-4QjiujpI?0(nD#Oz6kSU+(MHFHbxaLkiQ_lvfgOH=^E&|a#{>o!dx!+G>Ya}xm@z9>bmFKRgp&;&=q)c!S?S+w332w1)@qjXZ#C=BXec^R=i|W{j)S6$>40y~NnP^0&F(@DI)9rRcK_ zoJ~!Z^(>6reo?3ou6djxG;nO@WFp-`5jY`LpWW4;)|K}8G|jO`>m600Et}rI57)S45 zbLR4z(%#3?QF1M+ddOcr70y!4bq^fDRfw8C@f|Bn+{6ZTp2sWD(r(lE73yXy_|O8#;dOhf$)hAx zbJMj4L}&+En@|?Bh{ax@g^DFrH4M@ttXwYvQa( zC0Q1tmbngcJ84&i`rh2c#H3e_=G0*jdxb#5h@6Mt#oXuEnXPKN3jegGH&|(*^{7@C z^v>l065a0({TRvd>F244A%vUOxS^NQC0>+nb+q9?93^QFe&EJ~x4KOCOFDU+n_$!V zme|SWIyTrvO3xpt90Vuq!Us>7Z?e%jAhOABe9650^npw~j33s&cb(6CLKjChuQVCI zuFfKHS9z6mZbI(K%MTPYQ~V-*jwMJae&!6;5F^<)(VkC zO@%Ikxlik>Cg)Kdls@Ufd0}GyTd^n$EII)yLZ|>v>;ksOLI+f7MckLNTGOTj>JuhO zdC}xqM(pNCs)xQo3xyi*CHQ0@7Ui;)u+TBT=&jQ3=y$6VmFuNODK7onY2>?97PA`O zx>Lg&o;>5Snk5ar%T3!l6D4+?b=lmjbtUYmc~m&%c*_&pvE9co;nrvZGOFLqcQ)vlUV7VeRQ&%3k9$eNKNjm{T6F;v2vuuyX+jEgb+$hZO*EKV($%B^6idnm?79 z?EzVmfT{Mp-&9ScnE6B-t80^nVFdL4lZgeoxAg(%T{Ys&xf5hHK<~_iweSiP=JoAC z9_;?NwGN=q0@HHi^ATE4w#>`{=m4aHg~c=3)x0Jk?SnBE_C;JrmWxQ!d4^a=pA;h1 zt9i~pwSBX%M)`5}Z;ljhah3{zX7wsq^65yiyrd-~M6}~3BRtqpQRq9SGH=|Uaq#NM zTg|MIEce1J$gN^yE>4A#C&BRj`etTH`~yE}JpgEUm9VIfq;2%+5o07_CcQB=~6E5vBtmu&M-$E&QrUb>xtd-aN>nu`c~|?|Ap6MVAg0?}!Y- zvwT9oV^J(_En|LFWr{s&lWajPI0(Fg$E#4T<-Hwau)SW`J9k-m!57-RLsBqRp!tHF-CEyOnf^l`sSI-db~m1QS=VRI zO~x@T_1PU>Q#YdOi&&#MmV>`XK18ilOs`;2RGEaSOMcK&0S}wZYQ)!Hs%j z&S$cqtNoX1YP+pTmlkQA+wlwSI5JElbF8@I^%rs-MRw#Zf`Wh+DZ)7H*xO;*Ry6!k zkS~lwCV%s`{{?lMYqUAKN^?y;=&rPDdSu;{L@yNM;(wh$LDVy#wMPaOK1``(8M~({L9Sy5CbR!f9`-t{Xf#q zRlvyLdMGPCxd(mK(D#~2W{4FxTh`pPU&91|6)@0(T*HXRVc0~u?w6hV@LuWTRRB5D zi&s4bJJ|h_jB%Rm=Wiv)#KU`WoxNncy{Enb;tO6IR^Msq)+Ds(FON*C=p+}psJ4?)s0TMz5LDlp2#W)%eF=BB%;s*u&F4eyP7Y6sZ1APF0MdK~Xfar$| zWKNKODM2;-1L~4)S&{?se;fn9vAf#6Jj~Z@hrYG0vMQ&8@e<_!`V0dd&*)P8Va3xi zi)5tJ-r}k3@WPm4U2+fZDrb&sRE35M4$2tr`Bu7_lRNqGw1dkr;e^Nr24>F1s-Q>K zRC#GM%D1+^XrcUKUnG#e`UB%RI#TG1VgW*x_$Knr#pFqyuNWqNkl^iHk=8eDrbD!$ zNhhU|^)-c~PbizfEJQn~;Z*~OjR)_46)S&6rAPHHlZ^4%d$+A%;5#ptpiSYkIztfU zu`=dn{};t?#4s~(D3Tp_kD73$7!=grbJ_YwV7EQ;g;2~$vV8+891QZzU;5S*-9ear z%uvPeRBbiKB2i{xz9vTr_QzI5G%}RC15R(iWxB(kDi$ieTYZgNRMt3;Y$AD;!ZqY) z)o>RjiB2)>DgA!M@?6sO&`Gx_%^{a)v~S z=_th#g!q|jPLgG~CkDbuC!W!(P1`nFq9q%t$bJazIL$SJ$E@5Vxx%eWMy}m3Fivv* zq#CPFjy{cRM8gS^WS6!xx^m)ha0>c$csYrEDMeqm$`$Ey$kMF%pYBUVcvD-+7Gm}g zm)ki$B*{_5dF*b+`VPWN$_=^(&NGZ(P@(kg(TlA=$?!XYRZx0$&AV7N%qg0Q zO<+&FC_!)M$@1Cs0fP1ejkvfUe@%^6(4RS4+}4{#lVA0YG4w8M=mTo;aP0+}FA`s9 z-N@I+Qh%Cnb7b7BMr=^q4|?nR%d4y^0u6Qo4eLGB&pA`EoVjX=LkD;O(YNy&xdtUT zp!{uBQX@5_5mz^S7Z(#11v9!b^JG8m`|Fn#_g!~$+;I_vR)60<)*9ib-gW{tn{$;n z_TP1S?2!9}=#Q}a30?`oC)3N{!-icV+lte%UcquaP;1Byt6YV1fke zlSHgldlt&@TU{K)S518P^`7mf_fT-F^f6(w?b*kJh=@Q~w1v~2{x}>|RFAOkx<@co z_k{wCM11#+oe{)H`D7j%eVXzr^8^|OCF7#*AQY&VO@lY5hmaf|9%RDgIMc6ikvK`B zp-Dz369!*aEf&Cw!BLRfs?6lUKdR4STEzwRg1c9GBhxH2Cq4W2_f~UYF84S^yUJZ@ z6xNL$(pp9pNzi{zi#@7A#0b7}d~jUIJfhX9F%df^u= zIK$wrMksY3+Zj%=wtsb%1Cvvs_4odkp>6|Sr|js-(X}a&tCyLcjhY*UCDTd}vw@g4 zTaP1*O6?2@JiAiD7WRGo51*$1tr% zTY{n|&-GrbmdK4}f9H)0=T|^HjGSY=V}B%o7W4KJ8!Px{O;vTGC*x(GInYlSAa^@E z(`I%+XcbbIjx+fGWHymO7GINUj0o2Bo|(s})1;kVq;S;<592d6V9nb>nTYWw`&Fww z3TI;J1DE?6zGDy41u)S;=InUMTqo_dIbZKSwEV^M`aKRDNPBxrg~GT4C3o36(&z@0}jt07zJe09f?8&>#uV<(Cf zeK@$U!9B*hfVnUO#3fTeC7qg-uG|L1!Zri3SjBsm_Qq(et8JpD-_8S}-;wsqAM=ia zq_P9|CMH}^W023`<=%%FUX2(lNND`R%=5xKPHMB4%a=|4-)5r+C9`Vq{-@~1X1@5tcffNs;_l~b*A51r zxxe`3TP5UNF5sVaz0r&?pIPn(lZZ!eXMzq^E`Cy+)bK<1a9G6TD@47E-@P}h*WFFm zY$H}Hewm0#%wC)1o_a`_{1!;xm#8{yUbpLxeg8)SnEx-p>iUu?7+?Ih&i(&k?@gnc zyx;X-+ghz7PKb&ct02mhiUJmav_(WrF@g*-C3QduG31AcOd+Ww2*oHAB2b7-GLtd{ zWK0zh5h*i~AVdaA4pCUxB9zC&bFevacXkTS$I_Mw?sp(#D z%-OU4iB~|cYJ3u1rHt`7D&O<%ZM!>@PL8&=PfEZ#^WFcpYvljr{eEAMv+E(-jG%>w z+#96|0HK8M9@m;Hp95!z?R<4o|nEwd#) zPdL}8g=BO4$2aFqx8;x!#!bNuKw zy_FsDh~v4xAF52U_j#)vb|434k?kbrcP)eRLOq+SEXE&xu1c6m=}(QgJo<6K(r#PJ zD7qV03@hOW`WJDvy(?b(gU-De@7?2?kx58DlzO&1xYkO~zM9^a1o?|fmxzuiOFR*V z{_-uNw?lG^ImdKf?%WIiv~pjXchAaIt1}Lt(I5mf(^C^HjvTDHCe8hqqt1 zYWh9s>xytw1x$rL`*8{t0<1C#RE-AXMpX$xLkO8>VbrO@*9#hZE`1Dh^{7&u3;qU_ zH5{daY1du%f z&%S|XC)u1Z3a#dJ|5NzBh=jp9J27>H@yPTn*)!cmjvOtNe=oPoV zD#3`olJ8Riut^grz`PRk_47op`mI77B@c_k1hKW+M31>$MLBXynEI$&%=!L?X5|x0 zyB+&?^aj_a;z#>u17=C&p)1HmM`{6+CL}I6+ zjzk7EskX%r{>U-yU@bqj1&!7YSCjsiCwBF`XA`}R+ni--cz)`mTOV$vCR17% zH9NVP15s0&8e&*Q@d7;Is5j^V#BA=MS8rBB&%)5Qv0azzliZCg^QpnGB!<5GNnsD$ zC!%AW`=s@^T{;Ofj4Lqp1xEvWvHwq4K#A5)VG(_|7}}wyPOJJ=uWEs_!lg{ZShEDa z5GAy`!%mi>Wiq+#lY^7hPj6-oQh8;OF-Iw_1dt`Rsobd(+=*Mvo%lWE6^EthgXJmv zPF(<#k~*$}rp7>#+hHcF-NKx_*&1w!;+mJWf-tvsE*rc7cJ{_s?|Or>-XY0vR87Zn z2-n2B^e#Fsa+)zRS1H_DrrK%d%{58IeC=lqT~g1yI*_}Eg*n<{H>V!~+^%*tu_Dd< zLhMZZN65g#BU8sX$M6CNwDU21gWJP}C$YIYz zNh2MxsF4d`Q?A)-#wFwYA=NUorUouhoQVP_dlXqj4G6_@FA;Sg<4k6!j^-#i5FmF& zLt}EMYID!$J{G>%(tQVeA_-RH#S0X-m4Yeh@Oyz2+lgC6{sHcq94b-a+J!uvgjtBw zo2j8HBHSEGLOWg|cECW5`Wj?Dk1%&nc%x=kTuSZ{G=F1Hf!-}>50>#sV+WbUs+4p* zT%<-d?5Ug+HuonJf+Ii|Fg@1Gb!$X@`7u;AdoGqhk z!#gv5@mQ^d<}Kbbk=*=J>R+y$n=PCA)bLi&9s7*B>OHCpj1bV)`laa7?vf2Y4WaA- z+Nr55VW=39&`bI->z>QZ0ejT)fM~gIgt`rj=iUkoWBAYIKra9qYUU}rbYGvaSY*t! zKE<8j2E$x74dVa_KrLFde4@Q?` zJeg`)#4smg0#P=6hacy9lyXSn2$_^VDw=fD8j^t!2C^Q~IBGLO!&*yWQqg@Y7ILY2 ziJ3|7x{aJfLX+iNB`0XH#YPIG1QOL=JQ7Da^ww?VM_M3}OJ~8`ZSUeuVnfB;-LPrIy(4&(N%>^6+9$WzykG5x9(|mz~;Y(3sTE+xJ2p!?#_a zvC~F3_rrpW`R`T1hIG{Y;y(_$RBx8pH->UxAe8p{B7UVLQAOLtgd#z}9d9owSM6;1 zEjZ4gu^Uz%!ODa@fXN}G9SPv)QTMK@X=toCzf&(y@x(E*sOFmCs<1+Q*HE*vkV=&U z4i)?n@Jh}b7a})fwt2!(rU}eXv%yEm$8+&gp7;s%_4mj`!%AzCx{tH-if=(n+!VTI z9(5L#X+c_wbHzS%p|!gEH!SpQ+-6@CDrm9@cqAZntoBRk%S|p`uA=-iIfID5nj$)C z;3m%#yNs)ex3Y$rC^mr*?`1z@dut6DIVVe8d6h(O9(FrAhN!6TNE;M&XD4N7*q zST%SCzN92p|0Uq9>ODSD9n46Ha! zL6%ITDJ3_CJ%W%V<@k=ABA$@>h;JW!GLDUpp z3nbf@3J(=cDo}j2zrur(TIe;5hJ&X7EU$eY9L0}^GX%8CL4O%azmGSQ_E zc20w`{n|!{&Vofl)iF1#>eEUbh4IGEIVIsMb2ypp^?4+xqh5KO@qW7qInmEz8Ja_ zz_!_}ITvPAn{fZitb^G};^8@Vgi#TgWR&QZ6lL=a>`VsQwFY#R!Xm5-Cm9}RgfWiy zo<4lCYnD)h1%)#AP%}L|H(7w#InbEvPMJM=!?F+$hzVF27LI!x@O9(H3XR@Zag)F} zr>X??JMQFE)t|P)XAB@+kdzd5$?}r6Pzbl?T1C zsLUZ|PpsTd3sMz$;uak#(;%iMbOhApTZ$^w`tryW^%cRcG!EXhd7l|q>Q{j=v)5%o z9ys3HcR+#6{V?=#3TsrJLej@9y3k8~FW3iazN$?cRBl5q0~A&L60~y$>vhfNzQ7 z%g5u5ymglD62u#e^T8e4l_`Ubu2oJdsR6`(!bdUaF?$VX+< zq7kL_-=}ECTn@T3b1t(I9@KrDPV8m~n>`jPIM*BevV?5(>6F9HZgeu0W%^CshdTAM z6lb$HbzPL|`@|c*3c2O}X})QS22yFf8%ExALd+AH$UgM?+~V#!NH%T0#LdaQUl;e& z_#5l*`b3sLZG76iGnugWDMF6Np;a9S@p-rz)=Gb6oaYcLTxEE1H&x$9f_s!1&l8#n zKcmM6JT-6g9Zq(-?=M9^BHkz;^J3`ZOupApugm+{H&DKi z(!rdWm!snJyki^Z$v?6=eGS)EZ5{#d`Ltp-W`@U^X;M-m{R*4*tg&&Os09}2YKdDn{mdPs-7pdG(k zt+|hz8w! zkMPGA6L}1g89j8d|GyxH|h^H}2u zYWLZLH6&xhXM(!lHeA&y+xUf!qg^~IbPZwN*Q-X>EblgMusZ*z9(AUslDo;yk7AL@F2eK8;LF1YFqdsV2ssmr=*r2bUnRxipdZl-2o zNaJ+ZfzsLr@u>9vEynVwGGoV0H3dd4667kjZ6EQCAqMYr1Ejc&%gY-iROw}94(fWE|JXEN?_M1!bkX0FUn)GG=ht4nH0Dx40jORxyH+sZ#hpz_dM~I#3p`F@$a0l+&{E zAyYkap=EruRVJE?Q1C3nQKzz)r#`r56BHL0IDb*MoS;2otRLyi?zx_Xw`A(ShNnCX z5;)_u7SvZ$*so-)OoHS?`{qXxhUqsd*^|e@AjkJ7rI08)bpg=xC3tSqBVv&^7t{*I zM}3r>L|njB6=Rd?FnQlR$>(9WXeQoH6AJDmZbg>sI74xK40F%=1bqY~+6;}*D%YOt zDcXZCD}*+3W1P7HsvRcO#Ji@Fy73lKQo9d}`_3H6j5p9Ivke++#YLx#@@Ng~asJ%v zY%pB@C>}d5FZO+>oWV)|Zg?j%mGmr0(^vI@+T}{hxYDK9jdDZ1G^{D%{8X&(cB~N1 zrHEyR1iZVWAe5$EsHFYSQ*nuDx=tr%svn75idRWlWCQ+L)&`gqKYI})g7(W3IzVL~ zC7%2*88QgGCG9zXL%;FO$K&`eY9=+O83{Og1*@C!TBRW?FZ46#SV*Jt+`U^tlcVe{ zrAT9VLg%`_>-Jszu;}?Hz|_+|AmDoM;rT0-F`&;YRBa2ZK|G-Hv&9Xx5ux?CQV+uh zG1tO01K2;`;cLe41aHz%oryh#u11X)p(H}6bzu&4OKlHE2@re9A>9EtSO6qtmj&d| zFfnSE5bY9s@^_c9ZdcRhavmGcTQ}KYC<`hKz30$P?VhOvnP?l*>?~W^7i#{iCB6_V zbCa6^`k}VAI#wBwud3{C=#q?nri$||i%GchhiWYqTJFq-T+C{>M$oxBbg2#xfzU|C z-KTfqF>=V(@ECeWC9giS^3A2=lf@SEP3eexj@{G>mZ;2LO98b?DVSklYprG;mn)7* z?wy5E!!5?zOH){#ik=GI(A2g`3Zim80IJv$)_98P=-;J+eTQ2d`cxb|5t*Fl(Ttoe zp}uDg_+z(Ah@Z8>6aT)WA^rJg%U*~Cq4v9_1>vsTyv^3qg{?(%NKmot-kYstt9f!Q zy3n0md{L#ey+qNM>p)KnYZawwfR)*Zah10){Tav)7cpldLaG<+tm}cN(1%u53=weDCPh z48}~z6IX)(H%TMW@|y;D9r(~6BZu3@npK6s3(uOW8IPrCLofOC6XsF64*j&6(m;Um zZ$l3f#Mxk;$V?>pI#U2z^8TGHt|&CiS*FYj&3et@N)vKF!mLH=PR^%5a1q>ibp>z1 z+qC23rFOmpiGL=Q?+5WOsy1o}ghQ5Wnne~b;*LAS6VSB`b0G!3`F9>wAsNdld%K5~ zG_apaK|UAWIZ$?{DjI1@pbkN_Px$RD-P~ljRn$>4p6GUSw0JdE8wBeve0-ODkCmyd%;AK>#b3C-h{?lHh>!h-5C|d>-N;?#gQE zkuFVn9drXy1B`4DW(baMR*@w@$h+`ynISnkSI34lR>#vD8OHC#ZF?)NZw$N5QX`zW z_`r{$U*cfDlIg$y26b+7OeIn*yO>bsT|iRStC|8Wcy+$#$EoehbQ7DrFvc8b$*KR> zFp=WE;g!nz1PFnE!pjNn4mgWFc-)kRjMe?-=H^fFpkSmcwc6*{3of@h@!_Yb5_!G@ z9+{|@Kp<$X03A$T&`~N@ilj_{@Js-**RAr)Ov0YJ+uy;RwtNg|TyuqoITs{{^DS}k zV$5U;bg)*0PExU|D+j+~H&8K%Mw86n)v(~ma=av?;5K~V;{3ZE49!uH$w{5aD?|{_ zcAlV?+hw=q<10J4{u~pqh^sp{2=4=s0^#O5WN=4WWR+8S)C_OhrzSgnekPpBCFfm_ zReHHrIfk)X>(agNH(Z0Hn4^SKAFUo`S$$4=o;r+>X3vqxYx@TrCXF zoIULI2H7D&UE&Jb05SsvE^|vR2)CY!x4QFcSAGg+nP8luNtiKk(YSG2 z99d%n@utj`m83^-OjhW{c%$WL`6)QV(Q0k^Ka*)Amc%D+?LSB84tZiYP1I{yOc6@sn|Gk9X@UjSOX#u{;~|k zZ|l(X-xkVwW4&GtT%b#F>wrOz9tH0Pzz;8G-RWL3kybqRHl=;%uowF?1W&3eOSdAF(FQW+ojCP^-*vwK4VAaSs{aoWN`bMJxfQRYxeaL()G_?(v6~2{c;m!uxW0*3rjSULayhZ^h2p#V z^lyTZ(c#KJET{@HxI%8W$@73sJpQhP=_PsbC}#lAB@N!-cM~&}?L|(_qqds2eN>(F_BlR_MHiZU z8KPQ?asqm62?k9nn!RSh_;!|o03hVihXnr{5W z^u>8Z?Q8C|To*oXE6|8m{oLi*tcuO>7_tSi>9st{L9*}TT`YpP$*Gg-Gv_o2JP@#+ zN(vrnI3R1!pWfrlwM&*d=s1jl8M;}Ay)?%RCGa(VRcH&WPBl5ouo$?|*&<8kmX@+^ zl>9nsG%e!yo97ZE6}G6SZzaFyE53H?0g0JPFw^=Rlgm9z6-^u2py4LRp)w$d?6qs6IL|g-D zZ11fhiq#hsgu=Z3QjWF0}#C`>6f|C$-YbpO>kSohe!SM^?4 z?V?svF}*%%?$fXZ7Iv5In)@1#&WYNcUx&v{;UTZsH2FC&u(J!GHr=y|xC4@jzv^`g z&dE+FzWz08nJ9yGs1bXQGqA92Aj$a1mllwD%qw1Hqh?`40)>VR=j7I|vkj9Lx;pkvU7n(C zzmcLy5Z%zB^X%WN-2W!bqxt4DPvwECj=L)4rnVx*6&X2zEtq~~(q^3*2 z;lZ55u9*i_bvS1s0|GykNB#Y~b1urFyf^xIcp~1JM^XLDi)HJP8lm@I4R4k-JlZjQ z&5=+_&9T!Bzg`Ob64fd3coZzQ>|{Z&v;y07!XNZ8MY`4TY!by>)xuka@;kwy4)rc-Zm9rwKW>;2I@J~Fw!UC_pPiU{|I7wrL?t1^YMCM;<^=@~w1*63> zyipn|`-=ZfKu)LiA%Ly2G=@E!jM&{|-pVvWQKrs6)sP5Yt++`mpB|=3>>7D>G@E2{;{8z_GNLd7uF&n_@xt+(~UAGa*yCQ{n( z--Q{uX+uy#ntzS&)aj7)&9YXX zklfHWW4o`6l-Y(B_e`C8eqa+f)%Ihxk2HQ zfmoc$7mrJSEvrj6I^9+sQD*)z7I5v*J8f8|^N2oApkc5jJf5JI<$!^{8yjDoexE zxj~ShJAQL1mSrIWD&^_b!mMLV;6UDo`GN z1L0=t#7j}xNk>MZPr3l~We{kUwP6F5`N}AX+l9&)2;McB>{iAKA#(Rc|Fo(ajdjnO zTv?M5F&gG^!=kv3EtxiKaApZD%zqVK>&|SjMv3<)Y@|w-2u4L!CV;zBqm##6p9jD2 z=gJb`S)G*BgCF))tibkAeP#E2klmHqXtEMJQg=WiQ2V?O9r_n*mw!2nm0LIoMm)&FPVr`{YO2bOEDD8)JO*P(=(p7!IOe`qEh2wxFTuWbO>+fE!e>108+6=3^A<`Av3+iqW|gL9$ETVORnnQtCnu_ z>gUPtKK29{6BVg`*{SebD22g$++I^-(vNh4IbOGzd_ZCvwbEfA3^C(?zs^H|s?_OR z9P$`!@xVyWXY4HvL)9dC;*gMX`uMK*&-JCn_}tbaJnnj5Q3J;?-FKy+i$(jP{N4RuM18WjeH!EVoIg`EnN7$g0IWBG-tGFN;?Uuyg5%;E6=)hg`l-x=P|WB%%jPAe?1%^={WhhYNP7{;eHp^ z?>LE2OA*fHhGB^jFLIQrfstda`2;S70diNI4Gi7%2A$^a*ghtho^7)3I5vpcnJZiDZ(J#KuTT5|x&(ND{ zb1vDZ$isvB!RB33af{@TXV-X&yD4c~7#6d_6RzhBZdl6wdOxFh@I$*%#{1_@6}hSH#^@>nw*NB+KIdXxMuxsbG(d=j8fFaaMyLSFXr z<^&hX=xizf6grIrAU}~lPX7qx

(ezPSOw88O9$u3EKja#Q!7go@wMN=JzmGk^Tc;~p)wnU=3 zfoG|DuZ~zYp0>?@ z`_N!0)l)JSmFsCMjYPH6XLu|6)rF!v)V)H5QNhR7An~aSbftGu4KCW4tcDT3`^*?Y zH1lRq!rElYPIV4ceJI?6Y7Hg;!v3_rY~Ovnq%M%DS^@8e+3Xl{p|)_@C&}FhoHflM zCjO;3g6fD|_akGj|0o3>rB4bu0@?0N+d|t2$p-#&wOXiKg=jOp-2mZJ^rgg&>4q|d zc>Z*+5yWq%T6ua^#bC^)v2-B^w>0Nr&9n{Hsc3rR&K8HpK)9>`c}#mP9{}9!qZvB1&SZ)dr#!UEf=}gz9JrBe5B|gjNq4d zR$Eao$ZeB~BXmWHnn{c?_1D&RWSa3o?!m6L_=d{&47+Nyq^PW1-qa4AbKIc zkrapy43X!tgWWA$=&_VT9~}ZeAvA{Da--Ri`LMS+$t=x?_WP%LrR| zG(Z4V2w05Tds!VkvTt?Y*AMS}QhvFQ;P{dqKfId=rwh$*+8VQN`nym|!oOE(QN9Hu zVLWBd$hfH)p)8B9aox|d6$wAI4gRq?i;vl(IDHIny{j^P_ci)b*+;M*gNU2(0SKAM zs3<8&*=j{XZ%>scKG1)wJ-CgO!XT`^@_B_2_2Zx7+{U<_yKbRL$J^JwAFH#m`%@x{ zLy}Cjch=Hp9K+)OSPtZ{ZIH!#aPzZ>N3EW_?HO+BVCj;Kkq;G&hw0lv&N%XnpL8-O zzNbz8bMQ#Ie)p}Xq~QHo#s1a@BpcJNR4aR3d5eF)gc^>3*jiC<-1BpPa3&BBA&Rkq zx8rFG?kB|;%HP<2BCgvEN3~HrDdyevLFvWT*^OPAyhd3%{2|DwW2O3_viGJy;ms%EK%3?Q`XFNI^vn@TA|!0G~ZH;Ge!v{Bd}TEbw3C zM%W;1w~-Rmkmy`LFyebHy^1|{El4L=o*=h|73guwD#exv2Ws<9JptnJ@4xwDbxY%l zh?wu?R`g>bd)vm|9((pac*UDr&n5OugPp z=!+=}eZ+Fu^EJIBC+AzMoNqb0-}$Q7Mc3}fPK^t#7hS^Ne={7Fnf3gOm0pvJ_-?n8 zTk3aQSoi{*Oj`Nbz=KUA^;TluciI)O=jJa$&;G;LXBKtOEI!-X zZQmcg(u@3I3*6F(H!ysp`zHfHZZvL{Sr+i+o`1tDR@Z^SUWC1#|MAb2D2DQp{;h2ft2t#X`zK5{geC4GG9@}SQj_~JE z{dR#m&k%K=pUR)w-qQO8^&2}H7OJE-$UEV4wh|_EJ~0jZ@gdvJB(01Vp#pmL+gtYR z#o=SyquZiKL5Djg(9`S+MSSAD7Gigm1hcgvA`3P%zs%*#UsbCBl_67H>(r7^I1TLj zif$}=8_)Hl35BQf?pK1h>YJxJzdgPxY^MY(V6J)hI(dWaP7oN2j$6?FLTaOu%b*$- zk2@qr#|0XvHC4h$3Hn-fDdGCFFs&Zs`Yk^{;>{LPMPksyb z!A9HLK&sUZ%t6i{epC(XZ~Yi>zTek#t&pr94iVkZjWNInP+^;AWyxJ3@N;K+Af$YuhFZqdN$ZrQ{dm()d%!v?b2!mT{WIW( zP&ZaZVd2W%n)!KSFTM5TO_A7b4Lg~CIUwQ`RIz~XGfIy!WFa)do(!T#x9h%l1Tp#I zQ)(geW|#H1G6O#Q0kzE1CqFb`>WHFaL0)|&ehR5x63rP5;acor_l?ShCwFs*M@55| zYr_o)d{KLQzP4UP_UD-518y;*tT)OCWXo3F8g?JiPPtN)_e&oCst_@&qCTH?mEKs~ zDf8tUgj#mo<82k1wx3#JNDfPO3_CkgIY+@X@AC9H*#@{8f;fG7lLR}F!b=3ZJ_{}N zWaz&{k4RES?z;tsmcI_6ulyXieD6}v!6e*pBxDwMY$o53h4HDY+OG-w7gjSAMSS&4q$Y_9%b$fn8A7qW8tuxb4V*&yvTfzL^fjYUGph;u+Ya5RpnH^W;mJ zIdgKS-9_=5dS3~mQKFi?#EL_`>x0#3C6?%kxu0?)WNr$#$yA9x-A9HQey1_J`vzQM zFR-{&_oWc(PV!o-p^g~K4f*I?yAVJ@FxJ{ajQn&Fg*03EIB_59wrY-c>|S$xD^;_E z^`dSxAoEm2@l~g)vf8p( zCuJ{VVafeyL0GtR7thWYsSKVcFdBfGjaoMy4;P)|r)gNQ7`&Ie(u1X}SZCi@1e%HF)cuoL8En#LvnX$RPk#F!+cl#$)dpQ|rkS4iTK0R* zqa$7nqty&EPxmV^FDDe2wW9S>kotag5YR=JqX1jh?3K>;&7Pv@_b8Cr%PZ=>sD&r; zNjj1py95iudbx`X_X40~9f?7jqaV9H)bNWu*xV9k{Ca*ACbz&n8br!yj|fuIK7-vL z#$6qij92F9KF$K0;}EoI#!qd%+4rgCq!Y!SXZsd3gq!rvL%P;ebrzM}$KCqS%UDb) z{cNnmLsA7=o=<57EkHGuSJ0I8EZypy&Bn5}tO*8@-ZmeQ31)a`+dNWLTdCVyR(Ch^ zQJekM;ioj5{um0#>|w0J5!~7~zD9I^lEqL(58kYwQ4iFykfy&*us$TC@-b_tUf4p-isAuDyguDz-~@N=_IHuzuMVVtI3hW{9-q?J&!hZ}Pn zAvzK+D$gA*g=-jNKWZc+X4#{3Fx6g_?aq*$Qti?2$HeUPAToXxJj4m};EwI{YLO3I zQHKn;Y;`TZ+N{#1l4N(O+r3(S@?qL=e5n-g^byk9SMmvVO?xOgfd!4DIGbEF5viyT zD|PD|ww5K2w37tPxJA&W*vYrQ;#4Ma%@{lBS|6??oy?>Qo#4`du8Iw0e9wN>E-VsXH8Yy2%x|hosR&ZO;M%jpK+VLeoy&}E&+fgkXyimK#|}@qQDI(| z-r$T|USEJIuqEY$(NR}n?ov|LpA@GTR~H6O(9>e}!`l?>vHu>Q(I@q8miyYDhwI8`{n zi%3b3C-KL!BiN2Unf}b)p$HK~VrN@k4e#w+U<@l$F-d0|;N+$riZ3s*T$hOt>7IuE ztu8nWP;x@*WVk7WnyEkQN>(QwGZNj=OF0tkU9fDG)APD%f-eGaUJQ7=SN(kGd4FL*(rCq3F$e3Zb)X;k)FY5CMR6l^851EM^AG=!)`muJ6Ch4~`1gC3! zo>qy6Q$aC_F_@9q5mZ%eOzqw}e7=`|*~eC(w3q{nr2f6}SKAg|)HC=Uhf7T8iaIL_ zniiG5wY=8iaI!KZuSILNgjrHJ$-D#W7nDDh>-m@7SuoWNQrDAF)k*d`l9JLBl@{07 z)6~9J`9MIRQN>egR#<~`c33(#2=_-)P5Wq7^yS{n-&;aRfzs&Fgrz_Jy~;zGrA$YC zVyeCqPjh8K(#M^dl7^(l5QT2~E>;Z3IXdAeob0To+nhtsvXl_r^irU=RJPZx+)f`) znO}-}>Uj(VG`_>s@+HOg?Vs#kd;eq<(IPf)A?@2tR~=>{25x_R_YKYAed+d5u*i{H z1Lbe;KV5cN3B;nswfvSw#&3)bMs>d8o;M!IxH{A0GX&6VEt-5fdnL)lvMr1n8ujkU zx>ZlExfN}1zj$LVb$p-g4yP^uo8`y<`MqCQP&a`l&TxEL7OY>TZ*ipPugA~B)1Qa0 zdNh$4v-#KXd{FC9*GEEI_w^a2za4B+gYICn!c)#Y0E)%bxtQ}6dp5XC{%5uMg9!jH zgWi14R+LAS%DVsuJK0{R3#*aPIPSatrF}oVB%~FW^sZB7{`xH(1-!Wb8;UV??(wfj zdq9PebOP8MLBIY((f~pGs?$S$88uy?KDYY+)#v~D>-&H8zi}4iU}d)TR?6SFjlwzy ziCYun0}S`(&%|a8v`ABx*h^PTPPj@oL%@#c+8qD4HmzhG$}h~ZT4@YG$vG-~VOGgGQ2)^;x`jCh&kBY*kV)_eQvuFg-3um<<+Ob2J4^tsY}I#u6=%I)si zmsLuxm*R5=s4cl7cAs09YO_otapk|km4=p|m3-aHmf^4K3V0E|%YeL?jHu|S9 zxfJe|Bzvmh^%QOhjoTgDRxpy*hkUtm?&LccH_7JVNW|+EY+@l=%x+QXM4gXSc?ZA@ z(o;8FBTA*??|Qx43MWjtKTJwSCWe5DP1F};@woa^+E4Eg6`^RmB!gsXUu43&d8)A3 zA$Wwk`s1bL+a7GiAymzrqHvQI9U733-mJEBsCTId4ACUt>;Sq|s0 zja|05A=#2U!O}o@%TgWK_xKujDrlOfP1s8*a*X`EE)+i%!v|@KI*;XVa&to|4p&-S z`W1SDiR%^b%WMfnT;&Unde9DX?5u>>ki&T*)N;t~wd(7BcwjO7d*GqYhW^lNw8-kz zNXs1(GGLJqNob*N)`kD=!>W+~?4)Kwdcp#~D3z+AxYV=g;5u>Y=o}VTW8nO4Bp+ zAe>^<1@X&*s|Lw=!qfn@&7Bt(PH&`X!xN1$v4`w-jQaT~p-8Mp1AyIHj_C#=^)+ux z1qP`+)Xo+wl8#Y%?*zrx<}%Lfl_K^aMMFZy;${_v8Vk?Z3&e0An$RuZf9E{DCW&3- zu<1Sa8rLizcIDL+X?f_mm?ZU@-X*zb+S*dgi&Gd$(@weemdt*xeTXb@HwK-OPZrnkxTeXs>zR+BG&N2tV7o#}x$*5P{3da2IZg8uCQNWwvF+BnZcPktF z+Jv*RLP5Ldj3Y(b-+v?rE{QhHFwMNI(!DK>M3g;^Kb*n*__2MXBlSfi%=`=HQGIUt zWM|0>2!gTw2d*einBr7XuLFN~s_^%FBWb^-J1j-1jw|B{$pBY(?olv@)S#9|X!O}T zW!M$%R3ZAWa31%vk|Xuzt+**!*^|3=OHCrv^CKUUkWQ)RVS<_rJa15U*0izLDs196Szl6^hvB6F!O$99{H7Ra3e$V5Q;1jOwNrOI5Pi;!Gcj&GKtHCW4~)IpDw z=?gN4Z2#_$9|A7{e;m9M^n15>tYt@N;Ji^wPS8={ zmI`Ztah`Wdq;I@ABurquj z^WP0;290ShG*S06!i+Oq%7O5!Q;79-$2M|mIEnn$;#s&03UF|8cqC0rf0JAb*QvqW zFJ^*F(+hip4H`4Bg(ik|C=4{#`2~T}nmb%tFx3FZG}kAF`y8_c&e(^33k(?@{O>MN ziK-HofBfLmT~kp7d#{XrA!YncgHBYV^ro$xSB^GhNc&M{HHeL}gc0+`+P3^#14fqa z{BMLO;bB62&tB-RvvHO@ObGNDBZMb@E~OUEm6VLq+nLrcW%;CBM!8?jnbeJrs#)Za zTaJx!@uQqp!d_NkcXlKqpX?`DlN%XA%AVw;{OkyZSq=bz)5wbj(L9nU%zv_Xe?v>{Bc=Xu9y{#ju>07&DaF_ZyvZS8Ag}-rR3K zax6aUfK)lEdNjMJj2b?0tYtO!yB_<5Gd1M)d9Ohb!?IA4Srf|- zttMwF?Yo%cW~ah*Qn$YGDULPz%88wFR(PXi%y0R_q3??b76w5jiR)P!v#GXy6&+h; zn4kL>tj=_}b}eqWG<$Ihx<1u@re zPy17uiv$~zd`SGTJaSA~_3n_$s)YPfP<{COFXq@G$Ze|WHd?!-H8t8Gy^kRPO+~Ihk6?&KH@3bA^ zSp;!LPba>#V7elT-AeuiJ1U#5{}6{l`qA2qNqywF*ANM?w2yY7XQ+eZA*jOx0Up7JIp?;-=JoTe}~&v|fNTrl4P~>}=g& z-4-|Te8M_AGsa*-WAA^TVK`>h|M&jwGLdMeLTDT@JsnLnBEDI^4iLA;7BBj~LsHxH zAvu5~G#p+ViEdW3AV@ z=&kjdO6a+DwnfDH)|{?8Lm~Z6o&Li`Qn$1fj)5#sYNm%hw7Yd&*&l*vo>)9yOTV_H z9JLw8A;=~i2!9)Nk)WC){Y6a;hwGG|=^oEw#-Ubx;RxvqKsKE%d}oRqxc5WPLbXqQ zW%>P9Rqi|RRV?BNKk{j%JZjSmjJ{~8v`y+xuz}#AnBX>9c5i0t`HCbF41#Dcb86_I zm4X+ruQXe)#FF{s6x%kj&9{xj5k%X%d%wCgt2SP$-?$;u1uA&6N8Z^g$O{pi>N z{4<{-&&An@W4&czg_B#tO8>norx_q3?9sF^`5<~VyYBI&c1r6Mc5P3vhQ*PY%X0zL zE;yusCAL8H9U^}vW=o5B_{#E_p8uF2BZoPipJej`P&p^R@;nG-qj5)zLwtD3rB=RQ{Q=^?=&p}guu$f z?(t;9QBFl*+$op3idfVXKczmQ5usgTxYHn#dOr0+l**%(Kq2Os3M^<3SoH@H#~n-4 z`;jaD25I_s9y7)CPm);Y`XJLmbsb6S+-yM8|J_xrVN zyB`jH1_ZRF;C0r(*N-ZytCSXxFjiC}74meRR|G-a zyKO%R)lQMgzC5WMb~LTUWU#@GOcHimEY79wnKL6&@iLaK?y82#w8xM>sjp$;Q<$8WRniPwaFrHBU_8{J8tgQ2 zt-1CSB)Ab3v}14F7A)=#PL(z(Dv`R^hkQk>eths`<=U}t7~s!1#LzD41-oO#NG?iI zNBg)n({oT*nj*e{1`X)Uu$D>1f|;NsEKXLvPo#Hc3OWKPGyT?s21*wqKj0asrYA<_ zYvg$EV>|WDh*-j9Yp~!$4p1P#;SqgV$Es~`Dh*r5786VuhP#YUsmkN*)D>sQ9^+K| zk?8^EARfOP9$5~`NPBdiAevY}rCU8chWZnVFE?QxJSo%nZu z4AEpgo+F8+*i(AJv1RJ3;2e6#h6{EzE!Z&_%~0k8D2KQ#R!hZwuQlzNtv6s)Y`Vqt za^kb~!>l#5Zd5v``sDLF_PMde{3Ah4-$P!bHHwGyI+S##P3I4sV_e@`6f|QitE^<1 zj410I`a9dOsfT~&@a#-P!k%?={!**G$;qOcSTGADORG+kZuLT%&xRZ0&5V+kNE(V$Jb^2DP|sHC6rcjH0#UAPENz2A0QPfIy4r z^fB`|l0Wj8sw$z7L?aICh82F6`e~EGs!{E71Mc+7}S z3MkWLmq0)Q^Y3yN*V^s-?SyymHl=rbdL{l3)-aDJArcU4+R-1;8eZ-Rr5AF0FF|q2 zwXU$9;aUNRlN_aqe_gDTc5CnPk%>deQItW<7;&PrSy3s8bokS$ffn* zf1^J^)$E3ezzdto2?=STrdCE%9Jw)f(`@*Rn1dwbO^BP{>Pe>3c;{>25|%xSA0-Kg z=wZn5Xy5kyW8@2jJ#!w;<0MAn;?ff!nfAEJ50UxKlqH{22uF!41XJu4%b_-_PNuB& zNLnKoWi3w2wB$pY*dNd?B)`V#A#pmSs)!+d~DDYws1NojJVa?3O5L_2mfj|>At3E zYn{w_e&7pu^4+QQ4q3P2`s(a&=Ob8;AZBag_5Ix}zqF~91y6guZV*4Py(y0(NcRtG z-KT4veVIdUn!=67H{3x(ZRSOY6xtbYmlFFIQh z^T%#cB7ts3xD@tc)`Y%#q;r;%uo@)Bc1EDK3=hm8+-2`mznI z33r*>uI+c05y-xYppDA5mp5dz;`PMQZO_-5#Qw|ge(hLPr+h(ctjvG=6*6-*sh1Ss zT+Siyn#!A5#}dIPkC|Ma4wDL;H)IKmV8`*HJtMx>+%@>;x^Lr9Ng`T;gPh$_e`xlM zX=Y7_zk?~_9~Et!9zAc(EeFPDW1jyW!S8s%Q5z2;h04?hI$%>H#bAp)(CrEDbJ{b; zNVnUOR>ckaT&xSFkmT>(AtuyeU_I4y2M*?i*twov|0^8^h+I2fvwu`6IrWG+PC^ z0yLAhvftFnlQs_{Y<-gyCm=|!?0$T*F}TJ!pvEycfbaI}5ePTgk??xYho3C0s;xd_bn z{oN97(a#dTOR)Qs$~!w{^LzS1UUc}>kzmqijE~-Rqv19VFAfic%^)BwZ~Xb% zr_Vr28*$aoX{4951KLi~F1ejsMD`=%;kEMhvjr30$-93M9?jFH761MRt?&Ej?sGX_ z8=SmK+rijWYc-d||1v?b|6`b~g^G>yLI-pze>3miFHn;4+|34t11|a$70ms2Q}T;0 znw7)fUEZ)bprN8VT#%7#9e(dfzqRVupFs;An{$o+X(e%~CdLwmc zk`6dsZP>i_!zYgyu0Ec7{}g)qPe&aO4_mY0?=AvKiSR0G?(eP*Jl3z(IAbL-HQ(<7 z7NC_?-^P0yUvC-#sqpE}{FIYbukSBh1=sU`t-bjF!1et9SBc|)$nk&pfm(y>FEGfQ z(n&%zwjCDCHhaEwKi5ECC&h(3`_Of7w3S>eSvI;nlFV=~j7Gnx59Tee4ptwd-1gU6 zB+dUjay9BDB%LilC>p)B%djMWq}?RIj7U)z0(!tv7{dn_3Wj@S*Ny~fzQ7bO+iH0 zvJ-g7VNF^eE-g1S!|*L`x3bQIAszG}`SkUqir{V6-^BgxrrC00(i`0_CyvvPugumWdb;i>MN!9^7 z5?I;EKbUb2$A8;4tdrU<#W(QcP0z3qNWx&0!|aQ}?3bTMjh3vJG?U%rW6wx&UI(+p zi|HmZr;OLA$*$v$9?;k5FBUKvnK!l{7tEiwHahKTZO{V?K6vTk-19yr=9Ngod7eN% zLZkjtnH=#&zadVDb8&&U6eAQzZ$+-mb&J%Tw3MYM!QN~Yy-OrWXWZ{4SB$cifhi-C z5q)e__Dl@@_vlJYZPNg=*P!97vhHV}@~;uwPeLHEWYLE({n!f8rRk!^kwpbQ=$pRj zc;|vSbxk!9(y`kl12ZFW`BlPnj<233sRXLub?7Yiv{S1EUd==dww3l&?o5cQh<4p# zHK#&3?5r-|pc(vlZhGxoY$)7_8aSCT-Hl(P7lv4gogNPkm!18SGuqysuU-GkM6fG4 z6Jt8M9RDo7Td1Q*HuTL8ilFXumo%=$P#5F7mm>CD;&G-zGu4O@4xNILF>+3EY$6zi z6C4_-et@Rd|aG z%9tW$cOa1d9BcQgIm$5kxas#@>e4r$2;`+^=U<5W)8eXyp2JYX*fPcel5*%t-8H^T z#N&gTZp`*sJAI({srfj^$@f`@m0+Q;a0P_WlOQGoV|R^ zF11I&m+I56UmIA#&*ogf1r_Eh&&zp*;-e*+6(POiD-8a`jc0$#vh@p_DP1{Qn~^?m zR1IJwz5*TowK`ErdXHiR*fBGCIQybbu~t(;4gr`n)=@qW;IU_AzmvG2H(tZm?y)Oi z3KMt8H%;c0G63LPs>0d-ZiMD}oi`DZ6=3AW$ht_82deqXe7)-z|CAW-)NY2fUYK|b z+2ppXolC>g>f$>#O5cPS)JlnB8E0QMUuPerE-ZvuvcLGM;cu&5h?eAgj9{Mm?Ev@< z(UlDQ>=o*sGeWE;I*+ByMaQKWPaspAWq?#9D-4F`WDQoY?f>SyFMYs^U&c zdgyQK6K1ak=*ceMJrff>tVLp%%LW)FxeYMe4br7u{_D6tRvp55C)j$eSjxZQW1lrc zdgsxV&sRicsY^K%{mZ`z0{RP^n5`mMRDjqNJel>jRWCu;GaDS0>M$r+=jj9 zIeL@gJV~SQKK5pI%j|Py<?cq)G~MwAxi;eQSE&HHUas} zo!POhehbLX(y+H*(Ka z9uIHh*p|vBdp;wHX}KPK!RjVR2z9hEisMbb=l{8o+o_#C)`F|5Rd@rf~SWId zwzR<;wOsS_z-c|i;F#F@(`go%3wr4v%!~Uw0~7_~=S7f+@U!C$4-F<{I#R+CN(s6G zAsey^a%C+Y_Xa&+!pK2ot675YNQxUS8y>NGxlI&aMxDd}Gh7b;Z|NLK9Xn|GjisMM z$8Hjs>3eY7?(mlnA00VuqnfL9NFDCGeTS%%!Q*(PI;FoBF-Ktb4Yb58@5d#xZ~jvG zbtUvxE?ARoAMNUeCf2Oi_7ig_L- zR|da4OOe7`wj5|5AbWTVNLAELAAnNJsfx2N>Lg8;u2PV(afu5h4bRD>zwt+oguaWuPWVgSwl-L-W$m^tayo1Y@pA0A+Qj36X5* zISg>G05*%MkkoYp1}i9Yi{+OJNzu1I9+!5$ky{^F$&HICX5*DHb-1XR1hPG( zWfC97?^0CW8oG(yEq5N)U)l^aG*aC0RdZ09q?oUeW}iSpaDn_0HRtT8qR4pwU(KM> zyHMGvTo}F8Y;J%vnFNFj5O0+&qe*6c5UvOvd&H8?Iqk_szcKYr%%YYRiUOTQLB()w!%%)twx1Ym8r&Od&zTvJjq7Hs1B)dbHT{H=SO zBu{KLh$UpfMr}iS#;flZ-cDrK1KTOA`~NLm@}KbUm6=L?A1W0@*8|@-J6T@5=>7x! zgP~2I`%lxLMBeFF?o(VoS+5fNSUQw`WAWe6o%~-g%5>Y@ViWB*jeh|Vk_GU|SRN11 zLx;0Ln&j}F_N5IA@H_2!-;)06&_HAb37k!zeiW;vu+~vVE&-R#6wsZgI~P9J4F)$6 zFj58Z$a$`O@`q1!b!0;h5n4AOyJ}-c+JD03`mcTr|2$Mu?E3_2OQB|vmMY^jMbR@` z!Gx`>6$8N{O=p~4X;-sQK@KIFQMYI>(aDEF_^?yM#*sw#9w)B6cy&xRmW@Vj66;)N zT+`#R)zM=eBOYSbozTr4lz&J9PLC;H(ITZcP}CacC9kIFc+Ts3?Yv=n49uU?DKnt+ z*X5mq6)Y>-s!QMoz5n=Vhm3y)A{S-b8ks$TTv_1-kcr8b&(M!k;78A(6 zbrSm1gR@-oUfs{ZP(7;B3*c||5R;H~Aix$WgjC;%49J<}HAjIj;C{CvGHP-hcIcD_ z!)oBv!?Ny9ssKXG@OL+0xh1KE!TPPwigTGBT&~`9FJ1?}mL6LP$2T^>Mfig&7Ag+7 zynEi5?hMTlfew8XgicSm{PgALLi4Vb#eFh|=I2bs@)940EM!M(7+84+W{A*DcKWPl z#nO|Je15QI0B;(Q2g9x2MkO0Mdnhdz*~i9P#yyw6@y|KOnyrpGusO>!cNUBzQg>}o z+Cx*NI~TEdVGM0%cl8QsfHb7EC3JToRvxY8!xc4WJUdqXvFA{cXyaUA+SqGlF-%j5 zOT}AtI7z~+f>6@uB{X8j`to5{Fg0+D@$rrpCNEF-3+3#fFUUdK6maXt-+$jzYw3-g zP&T>X)Q%dR0VNu+Ghj$2J93q=Zmy>;Zv3SWn@^<fHV*p3NYhHeQ&ksIalc~|bw5OniM0OO?)Vq#* z+A_F#5@z!0%U5ysn0PM+6z1Qk9UTW+I7-M6N@n2NR@TY_ z#9pu!4=A~ER~Q_q>51a%iOHa*f7yi}CAt)at5YDbR?1Tm#R$JllX?UI9kN>tYTr)ffjAreQBARU>Sa?)^(8k7r&N$l9)6I9DRW zt`ONCXD2b)44O_C*pf)-yAMKwi*%+;Oc_JRpyVywUYmCD2>G;4Dg63*Qe33_J^lQD zlI?UoQD?MHTwwr$g{~74baHz|@ws4yXz;yjY=ThiQlycdrzldF(j@*qd0G#R<48N~ z@P<#`Etr}BNTRHKGza=V)+{1uP*<1}f({h8^L71bw|{G(OMjq4Ai1L;>&{Z)TKq(K z3B}kcI+#v4SBLd)7wT~i^&0dzvriMmI66-)H%vg@xrl3rjie8YA7oUNYpC6*sqSA~m- z!@<-w{WUxwv@B)ikiT=qkJ*qRK$$L05`^)*X$awXTs&f=*l*WZpQtrqTkeg~cf_bg zF8&%#a2i-5)kmUqUZ+92&exxRGCB)6_`P2FC6(YQw&X2lOh@n5V^w=?>ShH}mi=1D*%UL!r{fD6;f zbpv8?8oDl_)ZM(CwOrNUSR~6d(`m6e-gFq7i$^NEGp4tko62nQvQcpBEU0TBL&%f> z=1eS^%dg7>{Rr87ND&1}SVa$Op+t$C8Aat|bHSc+9vx+HCuhHX$@nBJ=T%9_MX2M+ z>1PD(GP74#V1#d*+Vi&)(A=|N{zKzk`ttMTY<#%b{_NGX^ZuerotIi`dR*dQ+`A63 zfew-l)BL_UBXhlScb^~_&$`vzCIdVKF4*+yw-R&Kf#6}saS6XA4P1m;AoCpps1IA- zd&^3~szyxcAeZ=~P77v9qojV;3~dF*X)LFak9^B9gqk2zQ_HA4F$=Oxg&>lu4h+xV z3<5#epeIqFOfY_@o79sob9GEXNdnZf^&uPc--hNO@gcJkn`V9Ce0NBJuIVZoaO6e=;jzW_$YD zP)TEAAY&BJ$@#pvsPuP(1aqxIYhQc-M5+TYt_B-F^KQN^5mL?P3(^sHYnMN{#(L=! zil(j89pF6b@9|z}rvm`U8`KM1b&x>UW9i@#{tvT`Wz#OtJ zJL7If8asvNz+U+%Vou)X5?I)rw3VSKZ7UtL=|`FCiBV7~a60&MQT4CU-Oq!W1HaV% za@9E~?yUIr3#9YL0G?1)bCdP!^VFWk=a55o>R6|=dq^=syb=G|_E`98xNH6Dt2TXD zR#hQcf-?aAm77eYwr7p!{ts1(7e_&7f#(Cl%Ith>E z7=uu#V$X$o_rQbv1(@J2Le&<2Foy_sSH0oT5TR#iQl7+Ww9rpcw6toclVzHP(7ICr zQ5bI6=jjvVz((cCIGgn3nQ=vnCr)@m@3|cE4&7a?dtPsXuCvAqt0^nIKUFo|f{_UjK86N!!*O%6N!PRN8`s3SBDrx0H`C46b zRk{vaKkqb5r*eBK-8Hc?uc4|xhmNOVx^8A7vAu3jpt;kMEUU3Lh8v8&XyF?A{kU?n z5DqYHsLuv;vdw8%NL<*?<)UYyOVd#N-4XVX55XW5=jajRf<$G@-r&wYO^KGb3Qc<< zY*YEI6|q?ir$dFATXeOYpBmSDHF}6qLjTO(^o6IM@1Se+?O!TqcxW^C`0V(W zDRXB?t8rUqh3n)BfRQo!E=?8sIB3zx^q%M+&l?(DU^OUPv*PNLIr-;d@?ENR=Dc}% zjX4X(Zk&^gi+i*j$eb4~Q9L|DD4juNVUKfWUXfzLks94C+Kxae<*}-C;?|&I-+A*f z+Qf)I{z1Wl*zCcwpwg5g=E!g}G0wvtax|oqCx~-3Of+o3wJQafcUEtERllxZ6%?pv z?dCmhl5bKF7&~%2HmUcS`jmD=m&>9N}b`CRTEsgp#SZgodkif`goxyI{l7`s=*X%%G9U8Y` zA@H@19O8wU=@5fO_#o7;2Kc3K6Pg7=G2Uvcg>gM*1lrlw50V!nvIMPG`oX+BX~64c-6TRMMcECxIY-N+^+ zmdup$EZFppQlXQa@WsDFV!g9EQ>wKoTb2RxSZj6IU459Va^n8gk4kg#zG7Qi{MZ-^ zs8j>DYCaLROX>NQ1$=Cf5;t0?#(CPTdT)tm<@awR{TTq2z#T8IGG2PLYznoR+}?7G zw%|d|6BEF$8u2N4*1-RuE5^u!0Er)Tc5XBD+}FV}9*G?(z?mghD=O7HZ} zSMd;I(cVy5tc{u72uxoLc)**FJwdh{tekHFEQKQd#?jjv&JT+3pXr0Z0t*T5$6{mn zqv8QczVlB$&NSc)7BM_mX}@DfU89CQ8YZ2|Sz1{ze}!8#0$l@Jcl~jAyVxUsEA}`m z1ne}^yMUDBs!&uXB&Ro;=PzI;e5Xo_p4s4yzJf}I?fEReLTD&AeHN^F6kg*Do`A3< z)LVki95}G_LgYvW$0euRtu$8=k{<%K;dR_W@jybxSPw&{-N5v7fgd4_x;w%-gktXI zu9YcpG#ltX$?OuqXTyu}%y$sLac3jP`Nq4Mw$KyvYGxpo^$zVy>+`_~bfSlSuKz3` z!gt1ln|ugaGjQ_e6@^|lW!oRTlrn1D4WK^s$%1~L$QAVMP}NF;*Xo}sGN(plxB;p? z7%m)$tetclw?ZW?H9Wipetp|g<&4@7oE{QRWQiw21)>35E^DJXo+n1{4I-(c-`?6L z*&;mTCA^~Uku%;(%oTI-ad7AUl4w-VnoE&*5y#oyNC7G)1@1P^i4*fI8vPrO-gqxT zkyjZ!LJEM!>4|dSe~V_rB_0oIBupEhBRZ+L9F*8 z5i7(Og8I*m6{$wV2VOPTynwFfl-v3z%zAerjSCCFH{Kj>M(ynK4Olw@EVqo$iDPOR zc2MFLR`x;nw1SuGq2%=3Zu0ZTHuf2I;kL~Kkgx2)!y2yW!Qkxg6(-=;S;TyyZj|_H z^28u>%&0&3tZfNt#ND5!GT6{&YQ@D{_TqQ5Zh_)!a}Y-VNgbqpkl0c@m!rLu>4EXD zfQ_sP+oG5i-l{R%Wf*FVZQy(L>if7-jPJ&g#w&cqmOUE=Ciac?QQ=6^?%@GNt|Ai8 z8@CNhh{7KwEuy1Pxo$Z}?~rb?<1`uut;H;vOh*_zd@n5gM6)_Ce*UJiapA&-HT~IK zY!+)w|K?zPGec=uuUr#S>KS%r9WftQmm)I2qFj}RdREsMqD>&>ZJmWM8)xSX+sHk4 z2=&%Rte_$7wE7Q@xvd)jbM_R<5b1rpt#oT;>prWR-#R@P3s51o-U9=jvw~io5RRbf zLB}btbC;ABCiz$hyueIj&#YgSsbQ723@Ic9enersjkZhx29w{3FBP5F`*dU8=`yHEPN5vU7 zVs^9dpu7vduM~VeMx?yG;X~651-$!yBGNE2yXAwwdwNkTAb&t`rJywlNx-qubX0L| z!{DuEQ9+~P9cyD`i$2H)kwm>#AucM%5-xxfwL8z=6Zn4b!;L$;^=xmj$F`~1 zcbjYcs6oV^Zq3rXp?AP@6A-$UD`Ct+H*VbfKnLr z4BE9eJMBxGzx?ku@Jg%q_`}IcH-RtUi`CxKfKUBDlI(WQfm6JJifj2KG;?O3Y+UCH z!2@s8PR$W}CHn3ENT73g?|=R5|M4~W(0-=#BVw%5=K6r&5dH4z-emo?ps(!mT&|7O z!OjCIBM6B*(jrgTu2gUTOXWQc^=o9*_7&s6nJc6?85`c+S=tB!xQ@6UOGb{3d^u$9 zZ`8X3oas<(!L{9h_)(QxyHc~q#m4InRYhz4jbQJg-dv7^|& zJSJ+8R4BP_Yk+fG%n#tbYgUdgJCv|er$OW{KW^xh%sx*>LxCVj6691`AcJ-cnw+9H z_m<6^896_R*hh&3xk$0>*>`N+*pmfQA%)?Uzf=|}62-D#bodS6$?dh%UTzXU7{5!M zqbiqHdQrim)~M8ZqQ?mlxcP}#kuyLQ>3aiE1_sHDfucq^Xd}~;A!YYx@|g~CAS7VT z4zHk0PJ&waQoep;zg(l-HXOgVy4)s65aYy#yr+^XnTD0qAaL1ukwFErkUC&}e~T6! z2>kfkW1UgC@633|Zq{u|4;dwcb9e<-H%^{j(NjXF#@gI#${>^>M^Z%%=4z7+ElyfN zy2QE7@q9g`+2t{}bCe^5{;9i%m)sPolU)LhpT;h?Cfo_6h1`U&-x+mz3nFe_WT7~N?;0Cr$A|f? zDQ=LCJ!xeX8dB*@jF(#2V!aguo&)NLO4_Bn1cyM4iX?$up+_6kMI-vvt!S> zq$z^hWR#pvUWDi>T1iB?9915#NAYatvZnCiQ98M5PD*)L?WL1j`yAHDpfciH}nmLY>8ZlngrlbPhe zrNy(8>6qGOKWal3u>hGF9x~ zqQCjQD%gdHZWyWwX&7To#N6o+vnE{gx36OG=&K50UQltTpfl(%m6b|fy!MIAm;|G+ zQTN5W6jp2MvN+#4?ARsMhnB}OJNTbPC@y1iuN0&WU$C$oex=``PC*)r?%T@(9wHOr zc(L6H-bn^u7psglZXHsZ2B!-KL*wVF^;t7nKb?+&i$CUpp?w7Q@ee=4-3e?7;l)28 z74q1o@^}~yD3%Ex$$5tx&!r0Y@ZBY+=Nm_I=o7u;b&xDBP$Zf)Y2>BdgMo$KE3**O zJ784XsWTc{3NkWNg>&pyd$pmh`OPWPvgC_?BNnK9m#_1QB8tn~SZ{49B;e?L0}p zH+&ZYRtH{hzi0lgS-RMInVLM)wjKhpkV0Uf%Ij#pnO9a_sDB`0bP&tQhrU z$zbHC7U~Wu(=QKq3>OHHm6I&4jZa?5WV8ZC%aD@oBVYJ2=jz z{?_70zRT2VV#zL7;$}#lLvV%Ix+4p>(VpfQ=OO(F^fFEl)fj9xvyug)^i3D;Y*VZk z7-~-q65ADd#w%1cQd_Fx26lb8ZR;gdwXS~q_bJsS_b*qs5`7!$njX5v_=IEtgp4*} zU|zL&lMALL%y!zMW(3ih#j7b$zSnopq}N*<)g}erTyS#tocGzACYIT((;|17gQg4% zsTNf-+CH}h&2zFnbdLOfHJWP;Q=*Cq{{2nVKcc4wPC}WrfOJQ5iDVTygfTbfj5Ae-$!u>_i+p@46K-fD9yR==5gxLRZLRI{Qc8cW4~= zQ?y)?yBx(@^oR9}BpPnjAla;v)2FCQcKhs2ZR-Z7MI|YyO-RV`;D9r~f_lFO_yZFQ zBd0N1Sx80w@!1Hp?$j>d43w@ON|}Tus^M#CV-iZ>rEByIDrr>!_tX_KGV(_Z(GCAx#~0=3u{PoI_KFx4dw+zW)SkM;&Ym1S zdl)J@yUA^fqwTM9>9}nDsUdu!((*l@8IbF4)|qC$|4-54|Xm8oP&+Q_Ezf^L) zEVk~;dtCvLIOLy!YGBJ~x@{T48{B314D|Lz%fXnS;>ivHMhymAU~n&Uj9Rtcj8B0SwQ7w_5&@)upL^(^P7hlo1q%T)O9DA4@k z_wmpZBsS1Fp+b4*F~7o4O*pRkg{bDH>_lD}B3{655EPZp#=oqDnv-PZ1!ThVE?;Fm z0-x8GQpgPjH_fBL{Wk9;PQjX9b#RtuDv3Lh&MEZ9-$dmU@R%HRb$|PC`uVo7%o7U+ zmMFzR;TBdj%n(NlNpI1Ko`lWX31n-FUi4OCh~Mm@)r69!e8tU%H${wcMn&J}Ta*;$ zXXEpv-SpnjG311%Hv~$Kf?=Q#H}%FyfoUiC4HAIAH)btJpmf6`x=G(s|DB(vskNQ` z=gw+6%WPofia*56Pym<{bU?;NpUYh{^s>&|3%LZdKteo+E^+DrpLq`QxO(H)|9pf*kakW^ogj_r zKBrLE^vLIZ6+=%T|pyTQA4IZHC{(Ptw|H^EA0QHt;?n<4GzOsKR6NL;Ag^eZnd zI*68T$xNZ4zhA~|62XA$X)Tk{z^!If=AoDBBu-+}o>?5<9r1B1NDyAIJ;>av%+m7WRukFMtfOD>V1Xkex@qcWrt+Z84Qh;ChKG@S? z9KlS&Cu>3H>D(tLm3ixU@Iki$;|aoW3Q!Ntu0Bw)$uKw-9?D@g%CfrwWPh!JquPx%+1o9tf>` zA<^^chp}*_QO3sLa&atHGez@v!qOyX3!*FVPc2U-{VEbDy(VsZP`dpt*O(w104;rvO zk@<8&lJir31h%aWUO+KbcnnHqW&jMFj!u8R8FG5$#}^5=Dz2=iryySqF&w8qk5pWB zBhl%f$8+?c8%c)_c;;s?XJy`HX3Ef3B50^Uj0?MM>2M@_;<{I&yT7Q~U>VJYd{Ndc zCF?+pxVg$kOS*@?B`nTWxaMO2H4+)jZQdF>8K-+$v!ucc>R+hqs?Keyj@uoL;)_PW zaxT-d;CLn|E7w``)z%;82dunxF3P%``Cmfs0wcBXk42fT&bAnZ+ZfE0VH~ z+bf;2)k*3BMj^DRjYZ$6y3yDCK%*byDESItGccZ_U1}II^n-D-@Er+EjGUuQ?gfZB zOA_tooRyOT#Rw?YNk6{6kf4XS^|}q8)vkS>j`;Y2V=YGO*s>)dQ=hca{TyX@ZsQq) z#mC4vCiJRMOHM(%21f`Bw5xz^u;YBDIW>R_2uM(36j zsiX^Og6p3jS@3rIT@&00RAUT(a|_-itf;*kt^pvc!9mB@VO;0wFfndJsF2)&h1`D9 z`J1L@E{f3#<DbBGajH z9gc&S&r@oY#quZ1%@djw{6wf{cV-H~X zv1Y0u&r3a-VOqRR+>A%=*&fU1vi8osxjop@1U2XTlhldOmL5eeZ*{!7JL#MVgIAxBT;sdh^3dMK>1So#u+ zcjgUvMvn%b=Uk+|Iy_nM=Q8>mCbt0Tf+@EP6GZFEKG!6xWL}+YmRKVDg?@xOA!%eS z-lDyC|J4)sHxqOD|4bv$yYw9)eOsAJV-RbZHND651$Y|MRqKPV14M>+`M65US#g-H zr%}{5q>$Q_v8A)1OF0RE6R2~lwU**0RJSOW5e{r`)`LhplXFIP`xjrnMOT84No-2oK)Lyy{}Y zdewmAbqZIy=0crH-}bzlvt#8pr8jL71ZoO-D;ZmW@x{OEPYBfF!?<`yUCf`O30Y{_NJWuuv584*xZZb>Dvc;_qVu$4CtG5fW z+Z!fzlOAqZWkq@m)^B$ynWB>f{`XV>`2xl~JZ-`CeTFEih#q{EZ}5Eeqw%mVnsu>+ zwPxHRf^rQF!>L>!Oc6{rRUKnAJ_(ePYj3_?H1Krli}AT0HbviUpt>)2Jl4nUcYm_{JxURV2gOAlosX`99 zMZ;UaDrhcq_vTNwAODwCxQ^7gN@+?`8u850=a1KPoU`RoZu~{x8Y~Gv_gVYfb4963 z*cN#4$PFI0aW&D%fYkPjA@kGz>Xaw}8w6#r0K42AsiX+Mn z*;x#|IBRQx;fD}aKKJDVxHw>U}!;hg`doUVKSf#ZezLxoCcFkL4 zOm?{-5|yRabXrNwcTMz`e_gkIZ;kJ@c9~V#TgD^(VK#8G+Wbv5Yq$@8Ir(>3l$ZLq zU*U3bi(NMxL5Gi}|J}viO#(rryZ3_YK+M3HwXD*ugl4zK|7ipJP>a5&ED<>xd_DNE zHYI6#JrYBkz(j^eB8|-!7)&~5Ev@=3j$r2AAk-aG9K0XyA?u)6e)Z$2GoIl(jrG`sJ=>kv219S<1o<^6 zhMd}wMgWUFKJPc+#Highd*o#M4!q(iQEJYv*P0re`ry~|UD2X$cL=r2_gRx*umBP* z!TIrWr;ReL^gz&vspYq)6KKo(B&_xBhJP|L?N@1Ig>`_y>$^BwBb9Ki@*7Am92Es0 z7oo)Xe5xT70{YAmfG2fI5}Iyoca(RbGGSJZZ6J-DWbj@N6w3l06=wE81(D|p+YVOT z-J<%wm!}sNcPH4zCF=XJgi;`bBQ0#Nt;A52-`Xn(&g|XYFUhc0@~rfylyQB5xBccv z@_j0!;=+$lew*_XMN8RVV_Pb6ZbVsLF47T}=A0|eRF*5u5FqcugEe6#^AMoS2CzUx zb}Ol(PLf`}g2;iom|6)F|8bHPPJ1P(23YWsCkq+}r-0n;VR>Tha>>+V7Y&S4+M&>8 zxEd&sk9LtbE0y{Am~3;6nqa3c8O=oRWQFIEWWW0^AiNNcT5|qA%JL5&Mx6s7wU52{ zr?7-VAsh=C7_{@%c;3Qiq?@o6zZ(H5Yqw(gu<^g^qFrA}+j=?D6RB{lXI8L!%Hc-^ z7;p|&&&VQ1Ml2&70f4Yl2U)@fs*w~(D(+HOD5_+YF(E<*zd>@EC`3Gvh5C(WU#4Fb zy@R|4*wX0*N2wtr<}|(6;MXTtrXPT43(ffOz$N2>0%n~9l>$^uub zDv6z#dg=s_g^8~#cGV{ZaA7MpGN^pNe-2SH<6MAlq>4=9FtWbmQxY2*E z$J>7BDEU{1y7W1tyi!o5rCJ(dkdY7*M)C`{RFzF~$EqZmnykq6=AL?>Y8u zxO{g&bJ*pvG6az*Re29JN(|K{ow5QS--802ds6D7Yja8 z;>KSem@6!b?ddxi3$~7bhmZB{yB_#-=cF=syywHr>Wf!5mCbbEd%=HyQNOj)8>M}- zf}l(r2RL89;*?q6`&?6?+d?dPxnJoZ74aDU&I%gz|J6$W&yElrVjbgxcO=JuzkOe| zU3K&?6_+(#$-dy{GLy$@_Z5*nN$HC^ih9~BgF91F%se4dk7}|ab`RAid$LU2ftCWU ziAyM+XNRjLdV8XLZrIhtac=VS6anu9%pqAD>GEW)EEvTtzU6#29uwfW4t;kzQ11vU zpiv{@US?B9F3oOD-T?UL@T&rZYAQs>>A?OqWL7=H5f-HY115we z;yquieE1GDDtw4+l?+ZAaE?1&gpG(}FY~wkki?=WbYRu{gPyG2NpbIApe`0EwxsqT zY95A6nm%W4Oe;qMMBV+4pQPr$ys##RpNVDTcemX|_DWg-Hv%(w!+43T|HJO5l#P#!R zP7v=wW5KKq1d{ba$=l(?_v`|q-9l;N^Pig#4ik!Q;MVA4XF+vomk?txlfF`jyiPn9 z&)R^U`eK1zmqFVG?2~LItWgc#yaBZ-o2^kGBRH`dxX6bcQifK*c*XaA9c z3WQ$dwFs^t#SI8URWD{wKMUGw%5lvO58sUzae8a`Rxr){b)%Ws9%ss1iT`6|vF=BX z6Nv7k4m|$(tNCFp17=@2e=svn8N0FSLkN~#V*4}h{&4C}F*nMy<9wS|Us2VC4B81L zlW`CW76Z9OqkP+h@{aIu)yxBB(1wW&VlHP@C8T#lSm`2qzB-aLrUj8KgqLB>)^@v0*sNg|@npOl+sMBwIu(w2bbGz{Jm^;Vp~&iQGjpXdAw28A2C;dhWkgb`kC?hCZZ0v=3O%xYvNX@#3YeU(}Ami1{u(+jZ~o=*uvvLYiMjs zyqWCspnuLf6h~1lC1t`;zfFbS-EP$O&%hkK3M6ENkW#((!Sw~YL0V-1KiFP z`J2ij8Zk}PigRb^ZNNZ7Dqcrs<0Fd9ZPmlpvm?WI%5gufj{IQsFe0}rq^B;>qpB{m z)JFYh^zcXnxZ{NR8?Y0c7=?2p)!RbTM;3|n2mrCrtH>M6cj25sZdA(86Igv0#rZ9#n5CR$cyW@L?zs_0fUF)oM_F3os!?jvvLHG{O^W67+U7t%H zfQy-pLZ%mvMbq~lWF@-yhSmA{wi<0*xicKN@nW_^^_2|KsIS+x>fLV`??rRyV-n{K zYZ8wO)?K;UCXKKE!DpSB;!A_Z>P{@8n&S5JN~|!bhuE2EFFvXl zcfH5dznxcz%9PW6!crHRnc?2C6d&0mog~HC5su8BMaZ)8eq?eUfL{|_6@AT3vQAy( z+=)7Q`n23J{?nxa??n+uZa0;Y{$rsXx-of&%wz6O`aT~U4?*~m0Os~i8$B7jiOP?n z&R@;2{@%-mONh`>Kjc+zE0-#AW|lo=mjqI-eNTS1+_@!w1=LdM-ZaZKSnO0ae3Jir z^ltoOu;6^AGQSY=4SzOFK&eR^K6Okv!EejF3uA6tKV(#M`>^6mS*XqfbEF00%bDSW z3C_mdJorkjHw`3JH#2*MarER|fU3LahTK4r-69Qfn)?OVy!oqm8GH{C26A{mW(P^7WS+o>xT*Ejz}D+ zoa~+r3UR@>>#1uYAeHxXBVdClL1n!+8M%^hP-hQ0>41k^4M^mHN4a6>XlB9sab==P zX@@(3R0^^8Xg;i+v3_=X<5Bu)g_Il36Hvf$B}B?BHS@b@?J#}g zUaK$j-c1i97XQ|WUoa=liNBm%@{MKA38#;P#0V=H;8eDZ;L7Z!Xx2Kqp86K%=I!Zh z#LK9glxfR`@S(wSt^tUY)sUcpX)Nw%R`UJf9gsj4N-hfSYDT`L>uk`y_vYrwa#dgT zV_TKU?={)>{((i!g=EguZhmTP(kZKt7_%x|zs-Otd$*t&l?K#coXQ;c582p=-rL6` z?P%won|05bls+sMybr@%+#dTPpJ|GgdB?{NM3FLK-h>P~q;QaL=Q8$HJ__PVf5F{z z8KAsMUjlbaJ#VaMo;U#+^S})13)SEBA_2X1Hj1+Vc_kqKL#+XhwS^J3F;UO{S%Dne z+t5zl<8eBM1AFRUtk$3is>R!($Wf>Bjs&IEj_t1D8$=- zGH!m}!Q@bMqy{Dryq@$D&yVP7}_7p6hG zoo9Q#PKOrAPE8SmI%6%=m>{@*xh`|xEg(tAh9S)j=kagXp$&kt0N3pk)d|EsPUY)NQjybm zq;2zgYxI>2&%FE4&#d)%dInB^aOYDznlr*%wAgx0uEAwa2H6)IhOXk~zNzo@3pMuhu$rc$p8$r|;?--<>og&8c1 z>F8fv>1lczw(4N<%k>(XF6!$3&F7Q}_K1u12bvJ2v_M_5!}o;@@vWm05f^I4e?4p?jVs zEB6831Vxp$&(y(6i;TqGU$A;{APIE_xL)UmW)V4^dH!gZ zUUUd_spT}|7tysHm0r$(P*|{dbkY70Wo#1ar7BjS3j@88yg~FD zzK)xjpogxf#LcQaTg`2iwEf_$CkuhU=H=$H3A@FLyB8EhE^sb1PS^r%1ge`sNPoA=Wlm_}fSoA?qREMNvBf@v zam%PO0Um}>T;s_+7*D$e5Va}cot6}4DbHmo7WoU zMD#08zjn75Oue8IqfEznK#fT?+FgysH~#Sby0e})IY+Rki)ZbC>W&N z^6d9)|DueGQr>RHZi3Rsoeec0I5~3L^;M__2tVbDaQ8fQ>Pit17Oy^pZ^@n>H$I&c%5Q zTuVO#v~Gw%2uqptl>5%J_Z$b|ek;VV<(9Gbxm}7s-@S?q6-S%~eo2ovg(0DUo_gio zikx7*6fxyo3Z?EpP8M$ zgUto~(_Ieo4&zrii}J5X;`FY5thZC>q^+v-Fem!*P(PQXy1W0M>*$r)?Yo0Ep8V6! zAltc6X`WtrklmN3?vDszo3e&8YUTd%VFXyj@~a!FGITGDE{_1*9bkVF_dfI1aFfiS zYdv|(V?grGsqI5@SYeq#iUnhVm(@EE<0@7e9mhqZnid1j@pIW88~uR#`0m6UajbiV zY0-wUgwaE~E7yzf3hkpUSJ=nnMBbSfK#Ia3w(6$_O2L|JCW!C1;$nv4X5W-#axC7y z4jM}*ol$v_arLDMhi=p-Z|KuisRo^mstTotdPMEHy6rbb2>v;qT|utm#|0|GiBCk@PhwM-|FF!T2M6r!X1>S^Q_Mo z%v%GhtCp_1kPv=G$|qZjFiIg>O+c|!dg?QbU-=Qb>y4;)@SMauowE?iYAI0A8uZ1De@ zzlX3mhvy2{rOz@A-#$gX!yp2HN3z0)J6VN%4ls z8KSxqBMhxo%$JdWI$1mk*R7?UoK9JXKy{w>BLp}bt#_DWM=W4Rp+1tB2pdn*^phpWEoSyj91335bB zm*1dIJ0tkGEwZ_*uq}ZVEpu|dD;ii|h`06BtoeE>z z47PA-)c%nfT<&l+A4*h8xM-a<8NCy;RdV^fu8B9PdO01YX0&n+?*l zT2egrdNyi_RgfxOn41dM#SAOqg$mRP8UC7G1uc(yOEH>oPl~GaZHCLHcDELnIAIcL z?=~i>xv>>Kys=7Zs~oj~f#{CD+b&Xj#$0T!HEqo8UgCS9KAyL6)KGG5l;_2nm|SCx za0D4tc-L>w-iFPF9C6zR9^Z>~LW_J==aSKbFD%(Yf!{Z^YC#SJ<-iI>nTxPYZ6>PX z3mc`?2Yb=o(16bO_mJg$pZLA!a4@z-dNJxr!z~){KgoW;khAw$OJIGjIJ@MEtMInP z=d|ebD?q8Een-wbUpu+b&>p%U6n4_KGAp-HXNxmpo7Zh^%M0#uBSjRv*J|YoN6ITd z-A372S&P~ob3E~74e`w}JH0^<9g4ciiddk8`?(PE24O>`NTK*UgfvpZIRWp{OWSH? zsr`J!lZD#t2ln|WqAEb!)DoIDLNrz=#Bdc3fF{u3q%a!61Sx7sui~))s*t2?B|T+`{=+RR;Kqi z_|h#g1F+v&)xCgR+zE^P96-IoG8P(*92Y!#n`5|;35zK_on9VO?0*yJLM>Ueo6c~U z-=2zuQwHg{b%JR*1;)8!xa0;zH8c%cgkL%plC?A3=F05z?c~hW5RdBLpcyC7kHfA? z1Mh+q!l##Y!Axnvb*`X_%hxHh0f|adrjM2OZOW^U#!QHghbdiZ;|XBYGLd06$Cj?U z$W(fkQ1pw@6&xN{t1uG?Dzkpkh4#`%q3)_~<%+8>H$;_&B=_F29?)xMZXo_;^=>S) zUG4)>Hh->q9ZYtsRF2z_l;+enSY2m>P3RrsEu%d*IiX1EQvT~w97KO-*w*&y6yMru32m4)kpZdShgBlP!oSq&^$%sZpS z+UXoPH9mF2>YcDMg_kJY!-{?@b^fXw7QM%O%k}O$>jGtlZnb}R zF0>Aq3YN0(dWRm1_T$Rm8tY?+XuuNZtFZ89T0<{7C^Wsa6q&d9S*qR}KaYOaw#k8_O5F09X%5*AVuR%`MkVyGZE}_O8%(&1Lg{$Vim&7BUyCh|6!pe)A{SLA?9_j7 zC!n>0Ss}^EOksk`mBfjFZRof&-V_2!pA$B0l-Vi+L;~;*bnYrbOdZX=2lO&ZzSlI- z;Z3$xH&G-V?GM*u6%}7C;Bx+16;Sx6jji=7XbV^`0}HFzCh|WwoG<>5&xH)z|H?nq zC>nkS(TbakC=-J8OO=&+pJ=*(id+Mf=K_;&xBj2-D^Q)o|K^}P$P*zZ& z!`IPf@E@pGxd~v`ww!gFq5N0&`$wWHW*=z1pBCvCq%wYhTO@p>fmm)?0yDU+(Z-Ah zaSzPzcX6-?h9-~BKe;1S<=G2*pZ`PI{@uz)U-m_nxlNtk>~LAF5YV(cuMGM_lcAP3 z*tYzCiZu2gL`E~lm|pgDygscLryZF&_KDxuGWjS;&!^cUPwO??0Ps_C<_c;3P9iw9 z>xz{&N_yQ@hzB6eofz}7;+`l9=5gNfcKNU^Kbt((20LECPXprPkbkVu?q&VOVH?7( zp?W0m81i_v6o*=SGEKuYJ~5ZZ2P`Fy+I2j%aw}|=Plw5m#C71+=dau(<3-~6F|ihM zb)tPT6CsF!bEwa1Z`!iayQdP>{D$YaB$tjiT9`dGzB~!f5cqLdpZ}4{mDCBQJ|0Z5 z*K_`~$>pV4IaK>7#RIQn002>yC)Pgjzq@wjBa%1{2imQL;IB+oU7I&r>Bie07|+%d>MrFK#gtj{Nj=Ou;*k3czBG_tL1!e!bmjX%oL|1Q%mQzQ{gOa8r_h7 zvaW5lUtxKuI;Z(L6lh;=#h9siZk0GU$?u(N7a!IqG07d#L;d(G;X}recqfN#){AeA*RTv z>TyRwH}4hBvW>a_?i*DfW6$tnoc?k*R6ez3ykY&YJE# zs~;=}NMZeT)&Y3w17biX)LPlB_$AHeeN>tji~UZFG*Aw@Bd(VU|Gg1|ZAm&hQJqex zeK8@o!okHUXdni}obR5iw7yLeA3;}sqb@jMNDCnq`YmhrG;z`vvlpBZtsZ8>K%f~P zJ#+IwEsWqz;dISv=r{c*UJCK(UI&&(AYa5Ux?qO(qEc>FfrX1`RVNUO(Uo~L@o_Id zN}k=G$7=A>KuqyOuGcUg8=E$KtU2X=d7(fvHaHW@_Anizv^|#0>Yz0>F zT7z5k%066zIc6LF^k@0eQs>=VOkV-7mneXH$sIvHr z;N_bH86^j=9Q;r-vvLZ3XRv{H>zqewQDxK1vo_Z$B=|0-AyBwj!2s#0JLVmWypXXt|HaTo?K`g5oX_KiAPi8hbh{Jq;xr3=@9IN_V|M%#EJ3>) zkGoplTaYn7pwu_{JioL_cFieSBe=_ltE5ddBVXsJXCWtG_Sd$8+%z)$W6rvLo2si9 zJt>-9OB*;u3(%)Z4>NL-_=p)O8u>jgtuxRzY;0pZgmF*cQ`wzikx1fLU*5+!G^RXy z_(l_MZN66X%USIW#Jzxq)C+y9FZW8emp;8JeR^GCoX`K4;#A1V>Z%G=GbdT;#(S!I zgbYvbYSnvk%-JZ@k}7XC>B{?=eu-Lfa>y?h^DFEm-O{nq8;pr}vmC)`_Je@b%YQj(Qizs4>9Ni?mbTV}NVB_KE4OmVal z4%>9Doxs%1*WvtFye zDy!91Iz__6-a`vQoA==!-daV;zWatZKfbKuhb!so2CcNM&ff3wbo9QKKW4EaT8RAI z^giKFE7Lbv?C$)oN;)WQ5=2mU8PFte8!|ZTPOG!|wupz6ic5?DIcEs&_Yo5jXlN-%`jCxC8Z6v zM?l3eGpq80XFa`v7}{`>cc4!8oE~}0%FMy*o9qP2g_fp2IpZ@rq~3G}8O`B6aQ@{N~KdNLbpv>Vm6`+83tKh%`7 zCV?y5P208->m=87?`voejCjVCtIKE;RZW*c-0r2HdFk%mY8SZ$HvVamFB!K4vq$JH zY|Q$)75)AsB>v^Tn<4h2bf+Qgfa)6OMlF=Ms3P&?SuQo@`WYuB~1=#3t`ZjW$ik)q~@X)E`jFSq}@P?0znZ zzdzm+M%hnz?Cqq?lMa24Gimz}pi|Dzd}-i;&|cm4)Nr|=dRfds!hpq%k?)|#QCwt^ zZ!DMO%1LQRA*7|n2*wq9dR1jh76|c?8|k1nsD!1BLTJs6PNV!BJF%EL`bh@vl~et0 z0qTr0|1-b#X955ZSa^GK#wKB9&StF~iFUM)7ssaku#`QE zQT3jV!9HPU#O1+ye=Pyr`m|*pLol_}k{_EPI#nvR5*~%jqKULHm2m~Nk+O^RIkWCJ zpx&|f#o$)NqCRI2IIJaXn)BcfyA@`E)@zlAmCR%ppG5BS!tgbrpM`ngZc`Mx?ARn5F~ z0iwKsWz(KFa0q{{RraXJ+kR;iCgDO|QA2CMewf}s>+kaHQj0QP3JiRA+QhosEo{-a!D$WpPNrMzLiv=J#mY1G!Ntsk>^Bxo^3rMS+dN2%p7;B}o23kp? zNcyGa+rgW6Afq!+$yeCLP*LUK110Nyzfc&MZfFi4gil&yL4acYgo`mK1;s<(LrKLO)d{T zSBqE$A&?Vr@9;+z9Ws05!E}sqkMg=(TFJ1_^cbcJB8Tdj$FWVF(r{5$+1Q&kL>`>5}lCFx#ErZ z1cuw+{zulkAF_O=J`yfVoO2U29)TFY29J_})@>R6tjkB=Owyh8H&*Ol;t z;Eu2UH}jI34EMit-f}Ukdsv$~gA5^wR1?(vg$|c_H+}>dx9%$Bh{9q?FUkgZ_Kbbe zltyv5NiXKRPd(^be*fBA-s_0+Do-IOyE1N*#$*RZB6XD&bkexRpG>VfuW zRd$t_R?cpMn$us75^z=m-lQ${?!!@IQEBjZF>MOEHA5WYrrEh1Wz(_kqGZ7PWGNbo z7h6xN@P?`{v#nHsF}A+Futu8&Vd#<3=rg}5+_cs<7LFetXIdn+;83j#Hx}0M zqII{dPaZqOPVl3Pr{nzMMXb}r#7Dp2MPd(;)eOpgEnF)R{>FHq{P80%_4LV&0dW6 z#Z+4@3`6t=i%Bl)QMKf#mNCX4|0b(}oTi>TUy52M?X;-#{y?RkP|NOj3Ce6qVa!nuzfV<{4^L`52ER7wn zVL(i~j%D6eSmsYf#2xEnmW;~HYy!b{0W_AeEXr#gn{WGWDI5$gPYZx5W?v|PR;%$; zoN>$rzJfgB6{A-m^rKuKu+w`@hcaCaaq|l)bs&;QJS*Ro+*G^+-zyKL)b(NA-R$sG z$JM?l(&KV{I_`A0;D|wbd0@|ie;@IH-1&F+6tXLsLn!6GYS2{;_Qkb_hE9OLAkL?Z z(qX&`T7nT>c3H34z>zpU{K_y8yhaRdGaEQrGIwkK7LgMjx~Hrel?i@}jIR9PefH8y z!9^;EKviW?qWzTb7q$a>II?4R($1J(YInbc8Z;3{4pFwDuIiWP0Ei-eQ zMZr2S#BO;*t7pWfXx@DD6zuxwtuPNFW1rNp7tqrses22vVYX$qKCkGQ>%Wn#j*lTg zU=bkGgy$C(ekXrga4t(Bz=U2}wfeWlrsnt2VjI-TDPZs7mS#;kQ=D0R*D+~J^oXA8 zr2QgOdb8YFnP-5*t7kEC!KjUCii3KrhBQk7rF$M8S*6-m zVm-!<4pN+o5VcI$89q}Nw^eRa6mDLs$}igsPE^BNa;vK{+tcSUmg>aaVkmO`9)CJc z{c`$vt3eMr+XG%tA4T!V3VJ1ZD@fo20Psy&3+$FK-Wjf6+jPX~gkHhz6m`1!?pT@|ynQ|PzD9cqi2kb3cIM!_M!ZhugfgAqo(O}f&FE&ZQpo*&%*9vO!RyK8 z!%O&UF~5nq(`PW!b^g?WOy!jnGR$YzT>06GPhfGXG%Sm*T@Snd?$`xKzc(SSTv?l?aImAV5_=v&&k<+2Q@H#lR*f z%nm47AWad&f-?@15)Oqg-FO326`Ayv`C$$Zj+B<_=%*JZU1d|3BkTUa` z)4K<6AfquU-WZT}!Zkt?Rwx>Lk!6yVk#_uNIb%VJEF<@%9+lymYcukW%~#6u(LOWA zd0)!8dx$bSSl7!T4aYF5|2)ZQ`vpnaZ>Q6ORddRZl12p~D5`<$I^~;Eo!68vt+p>N zoK1CIN=^vN`goufj<54qMNmcfK+Wl8G=j_Chk4COYB;ep&!R^fTOS-*yB9+{%6m;j zi<{I6pcSOah&H=8vY_X+@Jn-)3=`vJq-Z``M-M9ThbO_sTb=cS*ad4)g;u(`!j_2> zbTru*_Kera!WVJPr}H1+RtO6_XO7{IL7Vj^thhcKah;s69@P(K(C#U|DRefP7ZY=m zynFU@er630L6Le!x0W!C`bK^KN?GHUfCdlch9ac5XdB=$#5gJClB>9IqXWAfBF$<%su#} zV*x%rhcyuCeXfuBetBi~u(@~j4Tzn?uH&YI&&{J332u28Bn!XjZ{n{eF2M2mmG>wevl;OABa?AZdBf7m#jY?Ppg#{A5Po{L zNan}C)Kll2?<7t1mggD4)#75M(}g{C)-bK(>gqa0f*~S5V7l8YGWAuD4JMa(4r2aRTyDfqz&A#r1&GglYzy z5NS&%-yq71V=Z>DSXgk!5`@X9^q+29(Ifdt|T5BtfXhM9l@(BHQ=};g%@-+oRCkDlee@K49cHquche`|c>;lH`b3Hkl@(}E4@@;np);NmjH z)s}vrylt`LUkfD*41>gTbub-Xk8|q-#5S|&>x$~+m%^)6Fl01>H8NZ)=JOXgScNCViT zVf+yzSYK#~(}6+jt?4^EkG2X`g!S+GR z)A1X)Ga4rZ&>J`W077kz2er374sy`^9*aSpsVx@`01ap*S%`{~LN(u>sF z>i}L+cfsv)W)QIdSN4_-I8EAWJ)^-+2j;zeCqL&edFbzL_O2s11nnf05U z40|UoP!2YLz#C~evzd$zY)h(`+iw~U{c*-!WhU_I2 z#JR_vkQLH@Dk1O4)a!^}^>%g?P0rC8Ajx2Zd8=k|=xt6u{`mARTeEJk#fb!D@XgfG znuigfe|iWocTv1URe}lOLM}Y4aPh0^{YP*~2UKl*vjN&6i0vqY6is84L|!~&(BQjA7xv&&@!vv4cGk=6W2WQfk9Xn^Fu%YugcnJg- zt`jCa-tcJn?v)F9)%B9n@$?I$iEY%jbVrQ^EB{3fv{(=`!^f(s>XxrpCVv2Vz>N-I zX4Ux{JzYwaTds8l?+Vt(^@AJ)FewfBU3FLG_jBQg;$d_hLN4bYGkT@8^jW%8Jr<;D z(Hf*oqgUJL1C)+NN29yG4n_(?7YKR7C@$J`nR}PLsD81epA)T$hgK_1P0>;;)1%y} zd*Y0j7p`Y~1%RkuuMc%RTO_tqU`BZ@% zjy5Hkv#sdzhIZgh!Hj9XIOt$?>Px|+j;CZ~VWz=t)tZv%-B1Cjf!K$fn;G~6$sn1C zC46VKhLafZ&E!XJ-AH^B&jsTsg^|u6>}n1f1)J?EZsvn^l6#nr^Ql-?xb4B+$UvM> z*-XIo44k;~E!iWZq`@OqGzfbWt6;P9A6^6GCA(0gR7n%O1#gDr}bY zR;WJ&Z^l4#=}=9L{38FjfQu|iX*Hr)wn-@B{8&vmc$h3pR9hIMctcsh66)pgemjCP zi|!p<)+$mhlUQ~Wp?_=q%Y`P#H_C*lpa|X9`El#zdIvxbLOhtktP_|d zGz#Hja`t&VH_p;H?MU2n`4iIrjYmRN{@@4;{25w%l)-^uDR)6*HJEnR8(rTaeAJ1^ z|C21Hc8~mb{}@xA7eTWxIrImkjf|!~mWiHjBY%UT_^JDCH_u@{Ks6q6o8lNg8#f*@ zsMsRATVf9;W8p5AiS@bQeX%VMNViOn#w%D!5PJh&Dj&U}-(7@Grsa*Or!cSx_C51P z)doq};Dr{d%zyB05e2LLOg(m@7SP)+{cgWtayouWMjFu%U=FnE(?JE5a>h|){?{mE zqgR)%HRI|Ul)_XMTj`PJW4D&Jf46F(wPZ)rl|GVTvMp7W;pB63*+D)9XOb>fe{A-d zM8FZQPxv%FUQcbGaK9IC9kD+JW18*eCP!0k(4kPL(@TFbg+;{6@IcVA4}2Q=#bFQS z?b5^_t4HJ%P@>7C@ScOwT0Lvd5jeyeW<7IJ3*Y=m&~`O0j@K5&@yyw9#>+b1Y z4l1@P3bygK`h%~^@%!SF#Rq$Hm&2Z-$vSC(d|Kx8K`HY#v`j`e6mz5(T`AlPb+s2@ z<<1oK;T|+>uCD8&RF(w9WA2IOy^hY8a>R@~HpZ%UwoHst9F)4>`L#9Qj|NSt4$w+d2Ne$-$iN(TXyEElCp>aI zXAz6P23Ju}r!7cX&qCs)Sjmw4*xZ`1zpUAe9l|wLZ?hf?kS7bLrIfn`WmU;-_Z$MCzTp@@n46C|JAyNILK*k8t62ouE^hT_ zy7 z$VYbcA4pZ|<5<2Q`YZ*kw_$n{k6NTYyL<+lp=#z#KH;p*)N=Q(nj~+=Z#?1nCwTW? zPoAqPhx7Dl$z;#Uzynb=Zycg;AtNiy8(#F-&by zi}9lkkKbeV6XJAvt0?2{<-_AWv%%=*<8;Nr!g9W8-L9o~!!yGAj5EyRo(h<<;?BnY z8DqDk{UH3=a66%J8vCyowaSHKtrJdeMvLfw)!|B8R5TK~cpW|6`Oeo~#T-Vj2l_o8 zA!$xG?C)7Xh7FyN!(D-gBL#W_jvJ6{$j@Grs&B{>_JHK*d@i*; z;RQ0VW!Kaq+-2A;@V)}_Fm4`dac?7~l6ml*ezV?N?s-)^oS^$r&l27qCUVGd5H|Mp zXt88k+$>=pWo=7di8X$0jb1B+1k5z9naWrsH$q)k;JYN)Dek4~JX z0uf-;th@b|$l6i2-oRj_UjsHs&z-xBS#759{G4! zt(U*#7G?HX+LRQ%$!6blDmi@^aa_}gE4Sw5goYwic2D@_fBaP>Tnk_O?PBgD^XC%t zknrFW2c0`tvh;^NSB6gaTuM}BU0a@Qw=s$#%0d=X8<%i0uybTwq#~AP18B!*Ca1N? zG%;f79`_aHW0tdSBYp>K3>n?tT^V$>8d3Wq{on)i7yQ?%&C1{BNMB(8)_7QYwJ#s4 z6cI%4!6OOWvvPjg!w&paPDH%*7l*d=ts2!$36mr5oV( z`Hr7%bq~?XE3~*Z5UGF#q&OK~F*m(PQPvn*`)qDxV`J2vOpCnH*c**=QTHn1DA9Xv zuS0Lv$KJ8}l|3o8)N^KE6`1)WCR7ro4$$t^K>^sVJlS2>rRrzmk?n>3`874bMZzsm`t1C+#{$VC1V98ZiV2F%SWq5Sd2==b zd?ter^@VeFJN62KGGM1xb0lxx$Z4;TT7YpyLmwzIUw zWZ5VIe=z=1Wi|X2ur4KPYahV5{Xu%tU1{!RCfo*V$xB2(r=gb5@)WObQClZeQg)uajQ4I0b6>uT%H-tC9q+1){Xx`p_v84l;1R`xJKV+wl6wBcoGUocoHip(Qv%I{%m&J{u~p1`Wt+na5iW zqE0iEguY7zlZ-MIuTN9A6)kWT0Pb2nWxkEJ8)LyR4Yf0S9Glrz13OTfPe+oulThYy zyxG5?olcXm)uTls;9;+KAK?=8J` z^K50hiArV#emfn!~QbT);^9ThfixxzfpQ!;J-IYaRg zP#Gmh6@S$gad^EsAkF=ivQadez~aDSHCmh@ zU+b~eSwQo6_a==Z_JcUrT$hGg3zk4csygxs5mjAr z^0wvC(ld={Jo`m$y3=0D*o>pbTq%eAiI7MY!)nmsg+Itn5WcGL_9jDjSKY2u%^2^- zR7T!5A+2=4n1BoO2Me4{U7`E7`?6+tuP~UvGF_mqvvkhP2iqtsy0!^vC2U)?yXMa1r|jkPQdxtJm;Tg zLHSFD?97n;!&fYL-Gl2M=yjwiOR4)h^p?rONi17_WZ6rs>wYLV!DL!<=YN_R1z?S? z)<68QnZj+iNJ#qEX84rfLY%=_bsjq?L+sS?>tP?L4%S+Fp+EX%8CrZ$mn3K;B{-b! z?hNu!CnkKz4D1d6ZJW9mveh0^2RrX!WU^dGB5I>e9 z>o)b#0xuz8&pw3ThZy#I|J_Ex|9rijnFgA-bs3X%y+yuP;hBP7r7gw>Q#NdoQ84TG zH2KTs4CvaR=+WNZp$1OVg^qJbzHnbc*9$ zy5@^LC+)B3=b?#j%}Ox?e3EdV#c6YAnv^L%@0$BLd2Tn8_ZN-#G+8U>cj0sm7KQP1VObV}3zSh} zk&~1o`wc#d@zeUZ)uRlfbKR(zB4X*N9G9jQ-ghidaiUkH6Nyvp{99wIz-NZ{ z175&-gIk`}RK&Vdnozs_TCK{w@tpcciO-vbVD^KNiIY27ncdQJALn`wy_2gLY_; zD;KPt@jZI-O}F3Rj4L-(orLD+7NY-2r?}2??9ul~?0_@a3NXpgZprq8L7Rlo1&uaV z;xrR3&bfri_EeS4-x|wWQD&E-Uc2%8E0sIE4#L;ssuSBwqupMls&>YHKOp81;8NaR zXU(#4JLcmWk#A`J_XxCMwdSCmnbm-lQJOMr(jxZM*w6bb$IH2}Bwu5gxD@Y+I3?b3 zh9t8C+5i#2R7_|)dHY&q<_o>vHPc&lGNpJ*mlaH3`~nu+B+hKwWr;xs=_u}m(ipeu zHXkLTjXJfiC=WI++k&!xCLjF4gr6Stc_wnHm-*i$$Xg}XA)L5|!L2@!>XYeQR)23E z1M=-z-cRe3>%%D9A#{|sV|BZe zW6#ZznncWrAy`PbUNJ?S$@~!9&bkPgBX9jq#(sqz%1-?>ouTHlpynHyhZSQ-7TS7shRAHwD{77YA>^Ga^ zS2VXxg~ZlKLDeG%VOfB(FVJ^NYNOd5kYp0XFy9u90Us3ftciq#PyvZlImQAl!;6-U2hx5B;jHhHbMOF=zp{ zA@e!8+s=R%AgLShgin=S&aZtp9ToA)GfW<|vfaN)kiW2iTD_l>e2hm+Ak{gIArDb@ zMEX0+cchVZ`d6)QuO%BFq43BdYv!|;;Y8cf_~RJv-EkDjjA14F;iceWI%Oc@vm>9B zK@J#E4Xk6}N1|ymN1~NO^z&eB6=Qz`PM{WPt5s_QT?)$)^r!ue1cFXh5g9jCMk%RD zsfpe9w}xx)X2H>$obnjXkP_IrZF6~dPnozMaTv4Se2&BFHb;85LmmZpd6YG|oYW91 zYnD62=u|B>RKF*)&UEaGOdsW47%A^DJsNN%bOM1ou5rv4BStP6ot1gXk&!L9)Vb8i zyK}U_?h@z;g@?jy%=DL-M~j@sDE31mYE!m_B&YXgC3DENy~4PXUvd7Om7X!J?u2T0 zq^6kG4{hrEX3mxleGRQr5-0%^>U)~>4f>d1!IT-jJZ8Jc6_)k&3E2GTi-XBu$zGv0 zNBVhQ?Tc$QP4$Iv6*>tj$*eyjBVHjs&2+D;uc?Qg;Vq=|2)l}vBAW3b(`Mo)*F8Gk zFGln(FdjPDK3qzE*=~eUX4Tmi4-dDOM&1*3qsqBql!-!k^af1EIa>$q-&1zYQi#YH;roYZ2v{=^jhmcRg{WAS`|?NQ*U#E8rih6u<^AWR`->bcVY zT6?YY;q0^axA(*T(5~eY!}C13pZmV9-}M`QvSB;-H%mV6i27_K!z;O0i>D(P5VO&n zp?fX-*v8XE5#MWDBxrszI5l)F4!9%X!vhk7IF9{hY2|yAA))fN3-YpzkdTqnQ3kug zFgWqo@U7H5YVVoivap+|jXGk@nn8FSnHO0Ni z*#Hnj7a2D8G#oUxU`Q3$6aBr@^@x0Fc+b#Ly4uY*9a$OJXeGd?N?u$JI?`h+G>l=X z&-h!7b#fn3+Qz^F+8-6~MSama+H6d@x8voPlhlQUBKRc0GM?r2$K*A7;XH~7wfpaZ z6Hxe8aLe>PvgXq=*=ua^faMO$YFoCWj2g;a(qF_w;RO3i~8yqo&)`o@x`+ zmCmsYFrNfi0_NfU;fN13=QGd?`)f!@jb}a(0lrcDbO|twG2ii|5<)Gi$@&|W2U$ki z?})C%f?117H@doh^^$Wsh)VB;*MB7KvvmJ2PkPDDDnXTfq%fN;4JI0l?=c#AwwgI2YT{f!oa6*asT`hQo`Kh=k4USzrbB9n!0_Yo1Wu`bOX1f7>x$TJSX0wH(k`9lDka^t)GmQi{&a^QtNzPK+c}Ocf zS=1LLAUM^d_;}5oAnR~c{fS!J`p0uQpLM?LcHTvNkeG{@oe6sa=d^IKvz1mK?bd@D zKA>fMQKbfh>^|$qG(X`)W&%%+e(?aOIa&wlmHZ;^jBo{t9zRWq3N!rbajx52(;H2a z32op&1=d3k+kpAhB0ClP?5*b|;4L0r_IQNqn2TH^K3uS}URr@t2CG#2q@HjI=(#xUJMN94by<73ks z4H$q2g{biiydyfVnY>^;=h*+|N~f;HNM+>}OI_*}bDVkGyYq0XZW%L2TF9fOr^d&T zYmxs%VhViX=+6;51C-Pe8x*0Y^9r|yOB>onfk{O`;ZJ*keZdNt0v9nG@X#2eP0#tU z+CrL~6e*j9x{D(b=N45+* z$_!pa-)J;B;t`L06s>>~B$gW!I?}j$cOnJ6V68L^=3&&K>3K-~{nhwRb&5p?Mf?s_ zRO23cYb2*)lPjrd*NgqZtyjYTqXBX<=7dvp%}PlYjb5Ov9I?yJ^{4*jD5G5V)|Xv? z4Z4h~Vd3i9Q~Ot6PdiZG=-*l^VN{UO@L%(hRJ)0nx>t3{yQuM2uu%S9H|QI6e=;YO zGerq)LT(q4{$BU_jCHu5%$x@hX2;1fcPCh&ZE(ns`6l)}26J%4r+sem#ev#Ft%Vlw z&^+_(my{^3S7O;5da%KWp_Xjv$i+1mDt*CWHuo<2kULR48>y6O4A@ZRu<2rmA_*#A zFnX>MHc&sAlFEN|)iR?aj3my_bgWkBCYB*{{i#NHCp!9Q?3a4Pwhg?-)Fs^}6YGO@ zxyYl?J=XmL;agi)cL(c3T|N;T^%Ve_D`nLS00<{ZN(^9Ul$$gAnBEHG zm&OQ^5xC+jsIcTkkha!(M{^5L3fB|43i~~vDnwz^ctBx zTHBn7m=kmYACy)rs&Nu-i3N^uf(VXPz}^a}VVB~_O_nHSGkgE(Ty;?1_!@<*JqpRV zx;xxJY=fV?iCIdh_6nSet|}kE4m87;1h^r7iSt}|&-Z!&<*%SGYEm7KgQkpj9O@k( zbstsRO=(Sd?-zIVmIM>%mT$yZ!04yrGuG@=7hMqISkCf^A3?{$b&mY6LU!T~#H}kl z2P4)jlHt0GWY--J^&uUR?*-+>fqm!XC;MP;;$A%J`)|9v$CJOm2Tq}`;45MZ1mkWn z5H(%5!}RouVRo3!P5^CKuRkRFOgCbF2lEf$zCd?eDt^DD#TU?=_w;`%egX-lktnbW zEpc#nXa`EnooU2cu(FG{8)QLK9T&pZ0Y-G-eFu*3Ax7_UxDcQ^{l6tbhEtZue!nxB z`;R)v#oR92eBCzyK1F09{tZCSO49!Ydj8K@F*fhPRx{H=aX6`HdowZebCAGL@DG&J zBOJ?)O>080*$D4R6^Fv{Di7aJGo+8dz#lrwy zW-sRF;Ftg+1VVp=2U)ND3mwzEjL6@L^Z^)T^yDIrj< z)Qou;N&y{a0#y}jcA4VV2X7XQx+sD@p^W!Nc|*Fo9XNupclhW9mVx1~@K;6mEELqF zJ&SrCa5Z$wz~zXYe`KK;8xUaTF4u9~7CxGw8)#P4_Nq60$r4hQ#s%+c%rDw3{IOPA zrAjsnCw|#Ek?}HTx8*@6=~3?I8Cr*q6L!tsG_s25uQ<{N1Ep~!5AMJ! zp)Wkp{(KE2Y|;E4!;^5n==11x)F196A5Sb@Wpn#IUBrtrb5P3yQLiJ%q<2sIG7HU} z`FkC)E*&;gNT!3EK5>adE9`Zun+&d~;)9PCU{nwQQB%3cwJDBb z%93t-o8;)hJ#ZA<^W+uM$2{QQ6DQGn04d~Iw89dx-;eFwZr$65>ZW!c$mje^{*iz^ zy7?2xn5SOC20(GlTE$Nt>FuCPP<^u`o5A-dbmoe7SCa~DS?wfeEhgB{i5hD?@x#h) z24gZrjaEJ6ONV-IDKRdB${*(>Xb1dI%R4yW&hq=hrT2LE4m(>z;+LyQhlpfVL74%5 zDwE8~TV@;JGu|qg3TqE< zZVK$??lc_|Kq?UG21Ng$LrgOJe6s{X^YJ`FM2VK!TAN&3AJK@AgM*y>{*-<1FUoke z%Pc(XjuCBlH82D{iQ$H4S-v)rbzZ9mb5J{Q!{)R;kjV}#GEqlKg_|6m}6uK6tC zlbkHH^kChs0syoMB%QNTaOMPOoPsyXPVWxQS4D*C>MzB%ZF2yt6!=^$r*!<{lbdi4 z7-XB328y5SDi*$l$jqFJK^H3^E(PqzRxr2O%h@i?t8s9!Xdf4@;Ypn%DZr!c5rlMK z?hMv)3o>vi+U?-APKPwJKJd1gWX)IOU<&18bO-QaY9-|DctJa)>wN%2%S6(xCgaH3 z+maz6XG*e3avOV=IcY{_?BIgYVDq_3U4zn5n;)M`Fp6+DjMft?POut~Jg^_DwpqI* z|Lq7Cw}zK&gSoYbbx)y%)`mlQy)0CocKQmbvT^V%%(RdIvPScA3%b9ZRz6{7(q+ws zs1*q1`+~2=)8g*CTMZpkc6K+jqJ9;I zE|I7`qVe|PSbCO8k8dxk7RJJvSO1+b1@57{5+b`OAEn*hI@H&YD`0AWGgn*P7>uPZ z_O52G1Z6xSAU<*aWJ*P96fnLk!Vz?r!O>8pCF{NgcpJ3Tax z?g9QoNc9T-tkMLl41Fa}Cm7v)-w~2k#tGC>HF)k3|Kxu#Jik?A{hB9^wYh($6P=Dc z>X)B|to#^q?|LwKN-8D;uY0A;<1}tzDlFZDQ(B?Ab4_(nEY1(+P>!zbVlNQ!y|P(Z z z&8I(#xi*5BY+rjonXc>iyl{@+i(Kv}J`Cxy(g=C3P-4$a9`w?V7t*PNzaj1>9NUt% z;Pzs56+z?+pB@=-jgE{l3uUN_X6#2ejcNbVm?)2Ml>LoH<=81Z{Ni7Tp@9Kv+X2Ym zWd|%w+}G@WyLqqg0_rDTn9Y~&ha>bi8(#}S}+_0aBg0EBe`;xG$Q|dT?2D1n4sgV!WRz@)H}f}b$nFO z%I#Sp_T}Ccq0^7&(!fX+T3DZ@Wjv2vJk#U*B+>J2TM|`XM%ghqRr}Fc>CnEXsp#dI z`7d9DXotoBvAap%nPbr%mFR|rc8=4ub9E7yW)rLTM-t)}TkE5njm-8|$`!N(`*$9! zpz!woW_=Txj2h}irtOOxFfn7iAzGS;t4cFg{m4{Efbg-a?OvQokuH6ZXX7mpg=CX`~?^il6zX z1M1y3cqn0-W(Y1Mj>Yh zFA+WWcfO=e_i8WlRJ(&?-!j0r(bvWMt{=CU(jHCx4l0z8GWi@J_~)mQ7xS_ShS16|dhbX+|XJju5j* z^Zkc)jYY1eQoUdUc8-c-5CBJv7?>m`OZwH$_?7fEaCuIxM>h%$=AzIaVu{zob=TPO zaMsCI@&Al!a1k)9??)eg)kLD;koGQ1g0>yN!vwajmgMkfn#ID7cY@Dz<~)dDm$(&m z8LPF0486S23i@eK*C86gwzA?WaRj}N`j?0Hu>0jD(xv2@8JU4M ze<{-A0LZ+;=HBTEjjEyv1;3^;OES69BW}Hrc zWlF{_?dv)WX98{?Oa`#`gIg8f4%z6$U8qphPng=P{~4UQL0IgU=;0O-Rx{jdd*42w z+eT*R_}L{Ld}bLCnqWB*ml0=rY&;|0E(dL|s;Er)wz^iIMr#Pmc#8fAZ={K=mS0O7 zRoCMh78>mD1}8fLBqLm@MnMH+_w>lsYjaXU)1ctep4tR?I z)>)z|A0?oajGg%r3Q-o(z;R--N zG>vEBTFwzD`;KXm=eX*#LO4NiLHS^5W6m2>uybR6RDD*k_(boh!ingnm`>H+O|s+c z%OMT6Wttq(rw`}oF$t1vGfaXKVDCS->L!l{l6tdPI>!e$Dxm2K{!^PefzH8!VxHHy zufpBBH**Y*`uT(s?FS1JN%MTi|D~+feT-W33>=;!YH?FF1?j*1EJu zFPALvX~C_ALhyCrZ-iP3djySW+%f-VtgdEJ(+3{%Uck#Q3&&C$YeK4OlGF~c=>xVp zKUZRDdI9(-3|TvzFybfI8+ULZA)fR1I@8h_&e|3at19VbZWS063_+%%xqk1t$0>Kt zLMPK}pBTlF=JG?gu%RG4EL4F0N8~RJuE=;UxQzYPo_dAmk7}C-vw%aRGP6V6#auod z7*c2+oLHrTg;NYjM?PNxVxKrJvo0CQ(m5h9(|Sxa0_n+ zwV7{UFpb!$ImVjC(iqWJbV`7iYqYKeG~uzBlyLiP)5aHp%hJ)PE5qA?yB{0z5%Iw! zb>}jpf6#8piwkb!)=r?7sPxb`AJ{$Ya@B72w;IPZzaR12VyS(qv^fFfvV+PG|6anW z&XLXuZo74E77oqRt;%#4@hc$qbHxl{IWN#kf3qDO)Q$w^F2QuFM zL!@gGN!XQ)Rfdc^mOWT#G# zr~~tP(nnT7z(*hBfVA`v5@qvDT!8Af;2OhvAiV|g213oLQ8DlYZTeOc?jXh@4lCy5YCao(wxGx1>6B_rvLB2DxWhY&| z6B^H(*AuJohxH*ps$!~wO(~-^O4vQcf3N$nU5UFMchQ4fIN+D2njl8ma;Z;z)=bqG zv{h}x^zWBlOkNKTgjcmg!1$^t4ali*7_wH<6h>fIwQXXUseK__o`}NZpR-nz+Cotc z&V1nY%%LCtS2@?DCUd@qQyd_w9j5CHTz8mW0TUU3nLZwZxZKH4^zJnNKbRW0x_$k@ zO3CttC*Um;r+05nO$U2i<4;d~yJ8N1)g5=B^v_VRw>fy=@ubaO3NHu*SzvJMYQ9d7 zZNZ(P@Xy|M$$bR&W4 zPzvOwQ!5WYI;9QA{4b%F!wa>v|~FR9GT+MRpx@%;2ISged?rS#)iCn zZ*1u@1NP@Kp25$Nj^s@VVGIBI-h3&)lZRu(>Q&#?djLSu^eq$l(T^Jl&GzEFQx7g6A;FtNrAe7<-fP;X^tfWpc&PS ze|A{4y5&QBy>^+owzH0EproMpo1Pg5qGLVS^P;!JP$v93cpLjIA5tsXx!RX-i1LND+wOt}>WtONpz;0;ip?mTOt!MSc;KX0(gG`LoaO z2hU4y=NQ$z*1T6J^)Sya>?iGgn%v`mDWx^JF3p6P9^f}E;fY`N&>l2eK@%-6De(FeCHc7mOV;c=8mP@BSBS@By}2m29mt~PTRCGM6+sfwshY>rz7!N)=Dd%; z;N;t(O__yST-zO$vqecQj>!l}J}oQIV^W|{(^rCzD2mFwZz+-okF_<$3E#@c?+sHo zH)~c_rJ6kM_Ri`)wv!#Ae z)<##~a3c`)4P=^_P2QxW_#+F_RpX0u#D_oxniDRQp<=U8hM015qFz>iIjDue$wbJn zgIuY^9shdFYL<_81lqf|k0*P61MucyJTEqCLMribn4!!)m^`0YsM{L2U((;wDG(b0 zryV3)_YE3AzXn)A%ch~w`9sp%ycA37Cono1m=av8jwdK$z5NMkM6bIMHckI zzR!ZYSe>rF99sz0`e$6B@>`wF)B=t&p>~5P0sz{_ zmP}9yeNN(Qre{Q}(t04n*z0P$q@SR;{FC{C{nTQvc7Ps@@m>qM2)zk*F&r!?mxW{P z%h5k-3~~b!9Fi51QS~=-BmSt$S?6wGNnnm80*ME4mkjE*zw$dTb=eZpl_E7baLo`) zV9v?esNCO-)pb0r?3{a&qTSg8FrLR46`Zq^FgEiaO#^14AtRHWf`jev*gPCrTvl)N z7wRo7%PM+bzs{3k=Gr#&Mh+DoTd;UW3)-Y~A7)kth`&tnNs~cc&l1s!2*U696aQmNu4*MHC~-C!d!_`#Tavs#ilVAtsuJBF9)Ww=f)biFwWdKvycH&4E$(Wz zgLa}?`xqgC`Y$M6ZRbBUB`03*bB#5$-?mmUNCnYz^Ghmtmvl>CP%K{0U+S?9w4aUh zgngn<&{@1-1tO_dwmcFQCEG;w)lSVA&t{n?HL#wps2_gUahbO`wnWV7PB=K6c%d-} zQB50qe~vfF#?edTg2yUx z#f%qj4fM)KY5a(0%I7so>PLllmp7kjJC}@J9{k21s&)qCS+TmD_b8bsVe3Ukv%!_~ zSy6bE1fxjJ)Q{~4*6_8Q3@4+v$9eT+v;f?oTpH6oOtO9e91XG}eP*uMo^#r z#_bu}9A4VGAOhwlc7PT~VaKb5%f%G9tU%&4`ko4Zi$gJ)nz&Gth4XYESAA;@NTI4k zGr53D(t-7-(*1D4q(BT00N!>S{&z45=DP#>M4oNeg1jLj*^)ElipYdCp_!2GdN%S( z?9*0f(Q4BAkKsR zdXN5AaMY3%tqq3G_;#rwmi18ccAmq`DVy({zC$`ny&1 z)aU)FP|+SIMn`Dbp--lI+T9iCL-T*HOYIT9IOa6^T)19Cdi-W^8q-_pF+SL+?k~Os z_1G7&K9f`O)K%S%Af{n7P(21;3NAx#n!eBFVSZOOzc5DMwTe{7GiOuk>X<9lr)F05 znd583@!qza^$X^!Db9O6i=jZAP*^BR%cm4uJ#;B!J+?(z7Uz>1g&)7G?hrH-2la`@ zW4*%>aI)k4ayF{Zr6rEUhs{R5iCnWbuYy`y1HhFZtDk>z7$w_$lZ1!H&;#lbU%kfO zteh%4WF2|J!e!y2UC_R&&ZrI7Kyrki`RC4S%Z|BBY*>yDTXyu^){3`)T%dG)^e;e^ zDG8qG{kmPU4JZsTsq)cNTt#?2S|C(rd64hwEEhuW*@gi=e*5k?QkhA(0jC3C zd|;r`U>zAxatWxbf${Ub#6j6W^--7(@Jhv#Iq0_=9S2=TcjPZuxDa$@sAYKhe=7%y z(%^j3kvDysuNId*$cH*4$V!Q;VGxFaPuAIV&cZI066g6U!%%WADTFYlw`Yb*M?j(! zYRndz7$ckao&k-y3~Mo`VZgjLXb6p2EzEr6eQf2R)iq~Fm>o(z0c9Cm(-X$EF!LOzOwWba=1Mz=2*jI945 z0dnm3AH3X|Ahn-e(6cRp&F9P8{wgm8s;t9puMh^B?Y*N5KGL6Tfjx1rTUP%F;t68K`9Rp*_w#*%J76I&f_7afg%K*3|M|L46xi5*58>gTTZJC$6ODR#NHUh zg1}34sK#-Is?5JqPCF=U7j~FK00q%a-mvPknf!_7bQkdbO;O$%uNJ{r6mTw>TM}h$ zn{@58USmWiTbtT3hgyrHuX?ZftgWeQoW4?Xq~S+n1>||+H}N7y+98z+?GOgeo6~ya zt-f3|i>`G#x$xXGxHY-iw=+_WUL!{Be2o8>#$~}gE!oLO!K`YCwyjpNIF>qHcfFfm z4Iee*1Qhnn%adjXH5q5<-d)1@vFUA85x5tPcO{i8LLCcZ%byjwLP?)LGzc^)01~ZO zea;(W(CQ1L%l6fFLy<>B3M$YR8o^keU(xhc1o9DrVGngaw7#LlulCBz*dvU|aqT<& zl@u8ycunZz(B8vD{6!_4h=30{l>zE6sh#_t6zIlh+h%=f52(-V`5%!lU&`u{%y?HN z`w7Q>Pq|Q=qQbx!_2(!L@=i)8cBtB7j;r0@3lsJkAYW2XGAoAe5aAqr=Ip%HukWMO z-D#U~;ZCrsagPidc6L}kw|ai3|hPsdavdC z(}Y7vh;{P4^5aFaUMQeXZq^$vmHwHUS9}PucJud-K)rWn`PcVMUChs}{PR!Fq<;T} zKGF$4b0{uJmxVe0X+7fqE8VH9Q@0KCfoFW~jR1-1Tv zz&F%KsBlY1>L*~?obcUcdhTa)WB_f?Rz!-sfQQgkrvB6TE(38ZwhE>IYA-nN%E1%>CXrY3Qw3hikdc)6YC?Nse5~P7 z4}kH(zYJ>r^ecYokdz|IogXQ^8_uq#{Uk|j)9k5?$?$}-AWJf@%YyCNDxb5y{aw#W ziYZFgdkhO)%k;I{B!E6x8shc%l7x>Lp6W>Hldg95H ze4x>aIYaGs3#?8SZ0!p-#wao~U)tY%;4N8`uj-TezO|1mq9ni;*LtLWX0XaHPnc>n+LXF^T z3z94{5sWA!J!=i8AGS=Q?_$7|qnk1q5n)>>30a)evnK#3V;8j_DNQs5U6}BV?qg!y z5WApHWZ!3ALz|wS0l$&nKO&~yCJc}~Q99shuz+jUb#0&zYb3zQXt^`O+URYf7aH4NVvv(?D`B6d(488Oe zycMp=gg@j_et>HSkMi9+88+3oklLj5~D0*dQS!N+4oLg~2N%^sHBwkL&Cg#jFPzgYBGY~^aSn+W7G-dB8hywThlZ!ukEMSNLB%C#1+x+|y&qX* z64fmUC5zHcO0qhlr8B|(UE>oiNAFVFQ~#>dO-@Vu(1DyJd(7?31JnV8xwVtYk7#aD-nblm~yA)Z8q$BC@63)ENIGgbTS`dPmylIbQ`T}tmhBt zLxp;*hQ8|6A?G(kBy>)1)6EP015@eGNr3a=Vg(_w!Zg7aWw`p=E?a9iU$u2tEk_cv zR|}YHK~SKN{DiFfM<>@&vZ1m8mxNC8?WVLT^j*n=Sl*j(%C2sH;DV$RR}X{hWXE${ zZ4ccFa&4}w2eMYW!+i)Q%m&uunXHT0L_x+T?A4pUNZb}(O}Rk=RfT?>uOJ<_&BzN-f(=v(%@4+@x zmYcHb+uqA_>${j2OfOy-(uci1SAks{YWVXsapy8~P%mY*?gieztZc>L{Yh0B^LK*4 zf&MKIe!FM)9(a>ZEnVU~wi!fuR(D^M@%yM;Cn*=CqY(2=iPyb0J9u9hhTNenq`zNp~t zC=b8oeTLUdibAz1Z7Y>3du_yqBAds&b8ne%5=C zD#JD?`-ZTQ!9KE5COXqTA{Qn(ce27UIpj<==TNvD7O_qG(#Tc4 z1rPa)PCkc=g^9CpCNm;0Vh9z=-s=lZ;0eh7&D}p-{SlQp;?p@2J!_--7S0CJTq|qV`1|$)R zr|>*tA&Ef{uG~;W5Ev;jgb*u=?_-jofXvWUzvSd!n>X+JoQ_GBAY=x!%DhF^NL$`l zX`d3{;Lq6tGmW!fY9Tl_KKf6*v0uMtCpYMsox{G4}^<^sluK zv}}?RppR{(!)m|W*A*DuqIt>MIu*uiiumi4NfPA11)g%YSY0dw49K^Qg3(x z@g|z+*K-L5`B=C84>lM6ENHQQ=?naYXjtF!^%v8Zz^CwV{yr2jy#r-;0Kmvh>jW?e ze9S6;qfBei?dF%$aExqw-L|$NP-Pnczp0UD*|u|%a-`#uu2_~b%vVmx6HhQlb>k9<%M)D1!`P$1 zXO_B|JzAYZ-W8MHy8Co#?$Vw=U|aD~bL{oRdj|yIr(Jnqy#&Aw5Bv}mmS}iO4-#|a zoclIun>DB4DsNY*7U$0|QQFlky$xUvFJpvbuiip7oyG^#J{zgYK=YE}H!_!2tYdz@ z4ka!%bfDigws7hw)^*Gy3QUJPz`BO`0eLMlKBxHabw;;F(aAb1W>rk+@M@9`x>Ax@ z(y4QPqLn4|juhJ>Wg<@x@6<5f?mlWo?jo!#n$NODiohx?3pJaG{IN7x9mIk6t}lFB zqxwxQC;Q)Ui9as++=a{s0AlB_33^?_pWVuhC8xdXefN4SL&VoLq=Ib{&A}MqBzs>yYgf2EoEFM|O}Hw6EItdB#a$9_!{siUI{aE(8cY`l zux9ip3HI`+C)K^esT;9WP+qqkDpsFRZV|!z#wiTP{z{dY?XU0Db%OaO%E}+i#-o#!+L@e$*adEOnoTm^`RaG?`j0%Q{7QQwV6pbXe7uy5eZKAIe{2vIDUMI zvUcYDLRImJq5NX^P{J6P^9yG#rGTwo@r<*LyecgbbiClss_NUrtF6bgZ? zkKQh|#^Ch3S@PjXp$V2qB{0+ulKE9%IJEvLphtNsp`7FQ+9`Iy$i1S1?%CzsIMzQX zvX(N&;kCxojC`*L;bBh+6h`fc13sV$J_bKhknyBH022P}LFYV$zYK#LT~)38W^v8< z=z+==`Uvt*t^Gwomu;f`>M=JXjbf3t#AtHi#eQxQKvG=iW8RSyYi9= z-vQPLJ<{1Hoc+afzn#k5hcW6HfDLm}TE`~Nf94jd%ZOKafa9oW5#r@D$0>@Eljg5# z5^ZT21!AK|QAoy^9_H0*ITR&EZs6T*i}UnoL@mm|OGB-O5+Jl^2p+xuijGE zOJkOx>i@1IvcDx#IksdAzuK}@Pk)BOQn>(wquGS@>aV8khRB)G7W1fhU9|{YL+t85 zX+}e!$TIs>zih};nyI7fla8!}vdjeP0%IgpvybNRt_r3t9mn}~XdoPbjSZ2MdIl-! zc0O?Hd^-9QW!AU{(_U74=Ovi3qU?k)dA{vz(v^TvTLN7mwc%h|W_?l46G#w?d^gxlAjwtV}mB(>(xLkG6fA;q3DPfdQ@5Zk)%~WVGg< zg4`C=C61JzdF8E(B&|Ct@ zKS$O{l@G)5HH%M{EZ-I76yF=xdV3n2fdTPIAna{zNjg_fgq;3Dd}eWDy*(z)yUW^1 z3PLeRG2*=)+LGQn>U;MqYR6cHE)I<9mQS2{)ikt=#1?GV&mu6muqC{RgaI&nS7D1*uXo$5GWXy+$f_PJi(oOrzqj0rnh#sM`7!sxy! zlR}(KPA0OC`-Ze1AgxBf?k3~J^W#pI&}WJSj2Bt;^VwEGWR)JKq0Z15L5yNIMPkIc z&a1h1=U;+l7B&g;A^6okd_lLZ$ldx$7IN*Tws($IF8^1Wk%IHn)lfhu&3DG<&Q6PgCs>T9i zoDf{6>F)YRi~Ey?Pk3Au(vX{{J_YRUw*%U(YGc5;nMiP}p zlW>Q#QG#Q6UB|Vk1El>>t-{a{TH#Z@sVLdjVc}~ya~lHy$9#6q zmds-alJDbTntfKLu+LhUsBQzuv1I=6a=nLJIYh&qaXcQ$ctnlzqa5zB*_dWRaHzhM z$4@>m0=-M)m`@<4(U?~JSexYC4XY6h&9S}j4H401>>>haAjz6K4`k+!Qh`t6$65Ka zfQ0t zb)2V`J?3g+@7w3 z$p_&@mH140g&u4_8LJR&$fHfnX2jy_dHVL@{NxS1zj9<=CS5d0J)q&hOWKc3@@bz< z0I^bBliHhK*E3IzjY4YFn2=#nyy-U|gK3d)j5!B)1zk^1_3!_RZah5~WpL*|V7&zq z8K@PXwf^DzE-$i@(pC_grvy8-GHwO+$DXj(mN5Thk zVzV*%jk=oxjlCv;KSC{56m?=$2ZSh>tro?-eNVO*@UR z@rv3&0`>_`W>&CcH3QuyWe+h==s&0bW zcKOmX#HR_n^4d7&4~4Z)=`#DcQ1A&Ohh#iL7uLt0%{g9^NL24fZYH)9x1D@o`qC>g z3#pp2c;v4;xG*FfX6(9_CqGxn`ex7lh3}$F(s!Z2C7ju8kP>ZXsHNK?w(m|sZjLEa z;48!4|0?bt>p6xOIr58z~mmOU}=B79!`^Kx5RzD32$GzP+%U=2+H((XxHk5{Ptzy? zfGf5~trXt3_4GKc4B-qCXu2zpcia{Nr^z2RmYFz?P65iMGaj1S!VM!*LxP2G%9-vJ zqNn4x9SN-aE*I>ni=99@$WYF?Q}!n~)^$YUwfLy?8EbFOT zTonxBaZ10ze12^mT})GeVNhUo>WUcOfY_2idNL_M@OyM^!)q|3(W5Fzpb=c>m2~O8 z=swjYeM$*R*vK#Mata=yej4s8B`$)iU$-j=o5etpTB-1FiA@|Ay=(Y;-8p#e*&KkG zLy3<4sM~aE{ZdH1c5J{42%7A_*B$MBo#k6hGOHf*nDDS+E=&=3B*?Z8mUxZ^B0b@x zOy<|@OA_m~B&vxWC*M*(#la|ld!+gehgvxd53L%5uPw7^qGt(eMn5YH0l7L(i&r64 z=*;opkRh#hXZ<}`@GW_Z@sR%YQ+fXy=Y2JEjolo959<_55xG)YW9sphCA{Fz&AEx#CU zhf9%#*~l?T+1rGQ>GCPBDeRr@ z(x9up;Gqb^mu`F?4ZL|-xQE84pNPk|FM9?*|6^zk^B}xkw}?E1 zSmBMq#Hh)`6x-iu*Gs1aO6PL*)uj(4K$J+Irx^z+Z$0awOL(vHqmi(>`XCW9Omhkx z%8O#LyedX$G(jO;sQ`xl+KgXT_U)toF_j9Z1zy!Xq(tMwB4F%*)^4PUX&x6r&SnbY zkn~Sg^xgT=tIJFzI=L0Le0VBpWJ~?mT_|^kXY;X+wdDcH@b$FO5m(ZVQlQ3a!G5%o z{FZ4LgYj)QFYk<;x^`)Cj0VmM#IMahC?hNow@)MF_uPxA&yS63vn-1M?^>M6kvkU` zOvd@2rHoG>#(|M>0!=c#-@(xAu_mRQzuG!FBA4Xt&$@e zJ+b}1>0nsqcAf_MgE&C44;{D@JjvWT5HO`9t?*X+oW+J9?WDpE2VSrPO80z#0Rp zgME@EDqI_{#Sr5RY*zT(a)6JP4f$0Ig=xdO{+cef&2ioa=N97lnm5#bDa{Cjk=H;a z97d%8n^Ck+fM+O#Ya!T?nT_jR%|2K#UV1J$p~xs0Xtr1IWKzlDu@p3D34mG;NTzV) zV_hGJ0K#a!^teR2%1KXpD+2;sJ$l3*hH%C)&Az?!S4)TMs$j_)F?1Y2?otSXePEPj zdH7yPF=a-3xoT@TqE@d&EASb~nJ9N?OR~?|-J$V`E{@4->1Nx=P%`1a^|XDa-gZ4? zC0qR4&Mcm|tq;YG@<)awBUNL_IboY-u`DT|eV%VG*O{JK)t*h)DUjfcqGH#}UP#Vj zGgme7)F-iCu7LYNta4WG$#1dak3+8iE8CjOoQ48de_)=rQTMkEHd^%UNz(=80#+vr z$Z31o!7nKeHk~Uka}6Qw8;VTVW*x{+uKYkIyb}l6F)xVd4+jSNwCR$Am+64?C}l0@k_mWlH5Yc@>7`@NXq2 zQ~`m)1&!}S(Gga>AM*^YRedB)K2QNAZN2lBfF0OhrKrqYx3Uuh3)QOTSZz0sVJnoiYSAr z%FrT`wup!n87d%&kS&N3LP!-*hLG6pfIx)`B@wbE1!N|q3<-ijs(=(?WCjUBB*;7^ zgoHqnd%r7v&h?&iUFXYt-sgOHK0F`nRR=QO_kXSRTfbp+CigRj`Xr7>UcaWc<%sg3 zxc-eQ#P=wuroij6gyVoMQ%~r(jVv#k4Hu8hdhLo!nZspMW?i%UAKd2hk@x(UY^j|4 z{}^yQD63y26HfL@%5E`1itlt9zN@DCw-09?0l93`UzY4Qf8%&Jd6<3o9}>pX z_cprUkJqusj4FTJT=Hn%rwNSK^*&^>4U%0pB{EzL{0B`x^M*I^-@pEkKZAD+Sh6MJ z`YSC5F?E3sP`MxrrAHA;Mg^6k^`1Byq^$_GV(pO>@LyD4#`hd+wv?lgkM~NiiCbw~ zVPBNm5FN6JnBKuz|B$ZW`M`kyt@w4!h8OXv1YnD2xr5F>E6+Wm;$t1;3v!S--2wkd zhPIkh7>%iky@{ALpFJAbHo5MN)s4-nF6YbzumSY92XwlEyFlF}JJEpo86f-YMgji_ zSxoD*(6omv9=^_%%WMoXo$8l z0(JvumY*W~`oOd7Vvp^zgXo|m*e9yR;0%Zr%*CAH2Hm$^rOkG~h8_Xx()o7fEgw&N z5oIf-8t5t87=mK```%^%+bzOAcO$P#e$ zu|4m%GeT^92s|2)=U@eSRZR|yAIy(TthT%tr4v?E#MNQu_^Tw+98WoR0!!l7_PHxP z$B?P|nTdf_t)JzqN%g)Scrxo??ILQ#sLq(fWVcO?0wbvaycL)*7_rYB&3hshGmaOJ z6x@Mu56J--xGQpg&72#=W-au&?DK|XG)NTjJ!Q2Vt-^4d`=*3ukKktw&-PT>9?;PA zUR)phehjGTQ98*;_a)$rDAE@&sXxy7+jR@3Xa#?npu+3t&S5JVR`DFz(~Rw7zU-%T zsT5%7pQS6LoOk+T?iR>2hrl%Mqperj*F8ToR|_%k&)V5m~*f)CIDiO zH$trw-DS_lrk$n5qKoxM`AsLon7(-@)2UKGP ze%V5Ov^rH8ogOH&zvbxqMo-_X+bWV4Qv#n*%3z<4`LRw2YI4eh5u>?&{J34`h)=2; zkFnOI(fwcBg5S~o;y|5}19Biic7sX-1i~PQm?3yH=buTi^J?FN zwa?PI2T|9wmcmMY$U+*1wCGp3oNT5mAU<7`pC5V}pC9{0gdIc&Fu!&qtrD-J7f-)6fYd|WTxe1f)9TCK0c9MnH2+j%buJb5B!Da&0}Z@?l^wT z`bb6WO*d7C`aAb>!K098IcM_Bm5G`vs#2{5YmkNwh_-2O4XaI0!tx&G&u>I#!g*A> z6?|>rnZ=5i&1R}yvi}@Sy{k68bMt{X-F+rKTo_cF6gS7 z_33yNmKoRw41^C}q$=i*aOC{`M&o<2JG~XYJ)O4)^F{7Hgw&uGyW3;0leA~3)Pcv8j)^oZR7DGpt#X4&d__;ua2Ih%5@qHhtd(ZIcPvzST|+iC}Xp} z#u(E_G5YJFhC`Z_mGT8J5Vvp1jNRhf+(>M)7!$bBzbfJaW2wd!9=q!>Zp=_R#w;9m zPTWHy_B(RM;6P>5IkCN`CR84h%NZl;@6Ze7{}Som-Y9Amu~lSW3p|~>Lv+?D!6-Gx zg2lwt&@@c+t)&Fh#kB7@ zHwVcEpU5xPsjcvH6>vThDG~Az>05h;EaBTKS9JEIJ6f}n((Kec-RB$lnxTyZ*(|O z@D%)cm&-Q(4)-9XDdXJ4odXj1i!9|XJ^bt3ouQf^9wxQY{Z03BtNSYQnQm#oZ@nsj zRX=OxrN#P?@)o4L3IC=(C7mj;!tO6E?zmhQ=a);)-jnZbow#LU@$_fSrgL`p6Km8# z^Jg9>d=6?WEa*rY`Bv9>Yw7HGWrfeWZ)FpFGEbt1Dfn7?$PQECo34VXd_DrE& z(xO_f#+ojT_%!Q092rb4YZ8D*;FRgaGqW&q2E~$*9qY9$v5Vo0pwMDnOk6Hkdi|M+ zvrmm`xiZ#n3P0*Pd0v#rK;nRUD>@R+dWBe|Y&<_lnZ-;)O83~%3!0#Bv@BfJ-V#r~ ziR_xsJ&@_v7c95cKXechM;Lh&(46b==^?Ak>*C|-zz*0uHRH)0-{IFTGch&i+u~iPf zrD^|DT94IU?mbD$K}?+at|^c;xwbSVv>F*x^EYaHU)Y`(iQ1r66+pPG|A3!tp(+LQ zr9cg5PfIMvv!7gBYC06ibg8XNaizPTYZPQ#E*v$+EF>k}W``HQUA}9B*&c>$9>UaI z?2D=AS64<-zNOJXmek`CAg*rWXTQ;N#j8D)wL=cK>Z-M65IY-yL4hoXlLRPfPt#yy z@FnOe)?>f`87->h4*-KOqI`_HNreV}>)*^^g#P8)!%%|3)lqlgNoyCl>k6|{g&}Jx z{aiOPBEh7@`@#$scZf|wGL;-?Nh~%l(URidPr4n6^q`ct2ik7Y$4C&T!1>iiFBtui zusmoc=T`?x6&Oq`(tx6!6-IH;{kiBfm|Yq5 zpy}gEQHw@0=Chy!vfGo&@&p^F&-47ZDF6us&{;8UQNQJfCv=E58 ziMlVp?B|j}>)3R_gl_dc?TL#wS9&Tdg3e>{OF9snL@85&apl;K!3B-49*=D$9=7wp zvhEbYzXZN)x>_Gy)mY!X%2EC5s`T9P8l;#U1^*JeDFno8(X>soPDV{guMCrFyPJR1 zs{yPpz1^pV80x;?SKi~H_d;4Ez?LCkkB`>!|pw7=2)yqeYpmbP?vp7rh}XBx{l+ z?U;MuAv{FM=@9P&GEA#5XrlFsYf+nBK?!wE4C(TL!5MWsp!^V@m1`1as zYS7QZ8exd_a|PifIBwjecqk*{AQGi(%tL2qYc+@4ooMc<^4HcW!-BQT!;4=4&x7D4 z4rn)T9gR8xJn20^M8_5SBmqL+Pc z)hloBfG-u+|F9zi6PYvhHAbfptSbcCX~Y0!m=;xxb61Oc)Q$|}qJpB?D&eH7RrB{g zP{1%_gEw~8G3<@cHbem8kGzBpa{r-5&U&b|dkA^*b+~b@e+@x~bJ+(B;lSpk5`rBV z3r4P{680lKI&AtDz=pMDId3z9!lDRvqS3d!3^=GE(PS`aIQ7+o98#+fkwv0U+vT41 z0jt^#k=9r0`>>X_Ie0)9>I0?(0D4Yx)>HWA6_M6lJwKCoUnF&a-v~6q)Ft%T(A?-i zZb303Y)E`@4(Y0|%{ZlFe0kbKHSy28^-6w))#h|aReD7!^gGZzGU>6uF3RjRepMg@ z1cmD#qP7b+CM!+z3~Lz~vq~``jSQ7S@PZXiZ!C}$XQNuO$szRJ^^q}K!r)Z@qihCq z`4~{`+We`z)0CeTW-Q^k>oCR~B$^gLig3S%7H8O8UeY$%Vq46#qRm4}6$~XYP}{~W z`VYk%7?)Frtf*&o&tajiIoG}LNcNmP748Kqp4q{SjuLkm5NI*@hx{EeLOait4Dc@< zioe~Z;ikZ)c|NO@y1D>!-iNEScjrt4R~xupBl~OXK^+OlRxTLwZPykk^z6pOEg}y_ zCS+W$GmMj)!`ML2lxp=xgO4me&1L>!~;6=QX==C@aJ;mjx|< zd2IgAE_-NM(Zz+-`jd>B!i6s3yzg|$t6FcDfV=+%aFln9Hah=VaTc>8|3)uA<=)ID z9q!W)zYVxC_tOjzrX2p3qQjCvZ%F*|V;zjO86x(I-Oj)HAFl8R9eR7d&HD??BI}&C z4)*E{<3WGrVqpC40De8Ll*RrQsl2iC^zAvkBFpg7CWVPXM$B&?2IcE)=Kmstfk%9| zVz&Z*0|9!7db_rFmb*I9j)52Pd^f#qL*WMOQYvdN;1R$^=G|J&bm&Rx?s zdrM4ITrTvYxCCDvQc$XtJlA#a<%CV*(z!R^ChTpaVg`|i6^ zPW^k6#oSDBV1n<3;!CtI#k-tL=foeBhIg6#QF&Bx3|+tEwJ_!J$m! zD*nAm^`K=BzJWd$pj$uL;L%F{O5>|W4%pf2r&8ji4dQ2Dc;Uf( z0l)#|NO3IC8}kO-btl%y_1rzo1#w7k^fJ(vLZ2|eW(SLjP-8@k91htmWf}s(nAW7l zpPP#k>tJXLrkowP!0UCy{MKf0jny>p1@J1k`d>hV2R>i;#J>Dn(FK2jir<>ur_o59y2*B zE39NpeQPLOemLm{J*DrW_`?W=W!GmdPyt~>vL-|Z8o=D4f%C~gjOU`BrI1GttDS$q zpJZrOIEA!JFy9gy0vD?1e8PQ%Q3SK5M?wBTsD^!+Z~KY)iff>PxLDtV>=BSiQFaB^ zyeuG`fz=rPi0Y8|R1K8&%%WGYwk5h5ZI}%VZGf{8>|&m(MhfSG4yfGhv*1Ix>}>Xk z*9)DRZgGOsAyt1ketkK#Ky}r`t`m2x2|E>F%^&Rf`S7z(W;PrdJCD)`gc=v4hm&nn zZGMUX>w;!_=fS@-7sg0oT_vu?Gf{-<4&@WR&bWK2u=4Ndy^jYjfk=?7-F^Nt0dT@d zH#MuyZPFu3&9@66`nh9{zO3i<=iLFdz2Zqq%_`g3BWoJYZsrCzNK$Nb;bl`sSz9Q{N_1TW#nD~c1$FQ^ zanOq5CUFM~bBD1)5*Wg+`G}FZb3momZ6A4D0I~W#i>IVxKNYC1ExT3s$HbAokViTJ zwNR4cIW~lOGlL9cmMSl4M_==sR``?bAEX>5ul|kRRkzR;er+fn!*wy*D9LBjHoNYl z8q!DHc#Y5k!j{TtnZjS6$A9aR>o(0d;(j=R^kleEM)zYjUlY7SWzXwffr#4g8eauu9-$0JQe zW1`puug59wv5_2!t_L3`j?BcS)YOkR_$7sc9lCX>32}4PHd=$T2VJQ+16oyAPW|@7dln zk`yn-Nr^^Q$@=}&orNnIZm^`n| zT>LbVxdzw2g(@9`?RP1C6XN+X@LoPK2`f zq{V-3tld0Rd(Zh9T=;j)8n?T|fbvb(UQa&^A%IeQ-RL@mU*9P}X_{z{UaxyY&{&u3 zgQQ3E#?x5|QKc?6ta+-yeuJY)4WtFOC7>={O~h|W$i?P<1&XaJ&Y^FZEc-L{jD;0} zlD}Hce2@?Hr`65|zA5byWuMxH=j0(~DzhU&5>Q0DwXrYPB1he_CLZo{fo-pk$R*GQ zK{eO)R>I}+OOmEWy8yOmjb-weZRccNH=Dmq{e#BcmK2qcu+@)oM4*JR8);a_uYb(H z7(Fi_{os5@iBb5p;Zsot6jZ5eA$4WLWPjM?3P^Hv2g;)UFmvKx*shxu8f(cS&4bx` z7**3|v<|EJnAQ57M~8DGLtRBw>Dsl7gmlriHQZ42?cQjjC4ND@n|*p&OOTss7p@HD z#E#$wHU8>Tb7R}O$&qmRZ*4DhC6@%A1E>`b`PofkuhbKdRb2#a-WBVYd8WB~?24N& zxZoKJU~7Yt^9xrP;xp*9UnOtNi7d3gLpg3*zW<@&z^y7;VIo6Ix^~Hz79FRuEtM`O zSFEz$MaG)#yB)udvT-o`mDkf26NA*j;ZEl+-Cqwnfq|;RZzjb~wT$}eAt2`$#XFRHGpt1kdN_?D5laW zcANyib#}~{mw|JOgsZ`Dp$@nwK)kHOA$>> zr_jL=nQN*e?6E#Xl1pi=MQdK#pu8U179p*3DY2zo*)cSs-OR)zouI0t%yZIsVW8nAs(v^8x(JNhCjE`US967Hejzc*>m0)w8sVI9v(Teh`K|Fn%gTQy@Jf19y^**JRy zEHc!h>Bg^t@@9U|X|G3lY^HxwN4n?AqLq~ylpdg$6~ZlaHemTmedN1U#^-r%%_b12w>=Z%~L+a<@o5Tfml% zFB;pspPb`+Q-pT%KQ?Gd3!FT#wH)z; z5R3=ShijVZq}P*bU$OI~YuUP`z?_l4cO3qSZnU2#4m)ktd^6CDda49Z?-iVX;G5khJC=~OY2~Oj;sC$kfggte?&yMZtYwY5V z#^D>P;JpOFjROT=6_C3*3D2vR=MV6EN!FCvV8BIA4$))Fj@yrGjIKL0=FkhSPbV@L zc%MQ-iUBt(+^PG(pwn3>R|-qo9$~5Oky;yIoqC`W_MgF?Wdx&N;`|2fuKlu(Z)$)P z56I}w8-A^-c>__`JLmj{SRzyZVK`^)*MiPcBY>CKoB-d~4P-c^5_f*xiB#)<#6^kY zTdrkIC*Y@#M_-2G_RQY2oDd4`ZO{`#JBhmPv#vABI!?s3UfYPs-IJp}q26;iym$TD zebA%l>xL!pr%NzF`Sm;PbtxK-!#t6PfXl?Fi&->y)9qwkA?)D~|32EGtIWRNxQw$t z5)+L?Y0Qwfx`&N~%gNX9Vlm_L73&w(aoxi%=I{*%TGsVPH@SPV+VpGm@Thn;v?^udf2f6fU*Q->*@66P0Q5xVll{eebJddwfoB)B3Yqx7hS7z zH>5Uc+-ms+WMsAh)xsJRX!Gnr*fI(kLExfH+1l7&Ap5o2 zJ<(nSe+o{wx;D(WT((S3PG7-cOa&V)N`2u#B?*&21dYFyH$Ycb<$wMrMcuVh1W>#s zEb}ut%5$1>ooWJ{2!pEfW;RZ;WIoH!#}22FuuB*PKU{Z|2rS+vBm_>SXrR)ngS~Nx7@II4~7r*HMP^31wIrO7{7>L&cA);w{H|YAh{=+Eif8$cU zm(Kq7hmOHAulKS{bf#M1+_VdNGXBR&2##uN{R6;Hr2vWj>m3jm_V#@9A5Qb%cKa8* zc@$wZii$r@o2CGtYLhm6*TGt^_sHImm>8Aw{x__-1M#Of-J2<4Eqi~13h(*v@HC4W?FiJi0cxf^Nln((8 zoV#Xynqx6jiPg(Ukj~%!c(9yU)LS7**X|E=_qap&0uHDtFzO8WB(Yv?7YkcnjlPvX zrdjRr2rA`_s7s|aEsT>+d(|`6x`*BOu~r3ZL8Kr5z3Bszf|zcYSY&;gydPu#Qcfvp zENK+Wfl^BBYu-QndM?*+$co<$jnrgqwQk;CCkAe2!ffP8j|p^o-u1^?e4Xe*N|=UU zjTH^$X@Je@Ec0V2ACh0@OyO%Gmt$1N8-a}>Z7ZxPM%dPkKXAsd&d`+~Xen%K5N~5d9FKHb85!f5c zJn!0oSbY5ph`~bE5Uc>_i|m^2addSZI79)uuNdz<2^-H@`O&Xl@C&{iB#BWAp@ zh@r!@F8s#)H^#7gaD&wCFv4{PfZ(6C8M1!f$FGkZlvYo!f0&^c3cJE0J_KARV6 z2i&FdXS9gsp?&JeDuQiRvB+@*1|Z$MSvNp2ABV+<;IFye8nZ}iN`?0ie+53?+~Vq^ z%J%zVh+p2sZg(b;c-$2N**A2AWvUGGlg3-(xreafDT*G&LE3oAsr=tz&ulE^>vupf zc4Yx+JaLEmWS{oDkCxM^9ZeXzLsFpMd1~908X2=}H`Rw=+YEwyZ7u}nPLB(H#Lg;z z_Ha0iY=t9Oh&U06gj4I)>ptsT_BiU3xZF)SBb`Y?UW%I;^m#^EW)wkT>`i|t+J3l) z_C8GYNw-4qqT6^?$k6%%N*RWEKhM0wPxm^Q5X zC;em+Z2$`wF&Zp8s2aNrrTEQK=AL*m_^2q%cswNeao4P$-!2hR-ea^FTm8~jqUYouYbK9(#R8dsaqAWE56+or1@D%=rAn&k zP(F|DP5}3Y$wErG`XrXX+uX7-y8Q5Zd3d#!>DlMVQ7O~Goq}60y*`fc3sh-%9-w9A zscTh%(1=*WI5P>k%;v83>8BZfy*95R6#}B0Q%4MlSp(D8eogZ|ndMOYK;`bw?Ewd( zS2oMr$3|7O)3KEy4Gm9H*Fdd-|5A0b%R|=QzWj+Qqcb2+Dr97bj;nF!fMHMv9-bjG zahfBr>cw}KBWg#QB9*=8kbx=CuBbx|ub|$qn2_>s{Jo#Uk0R`6DVcl=3wdOGXYz8N zmibH?*cLVI3}P@PerrF*OCdQa1yQDL~V*eG_D zPG#m34&%;rpNiZ(tl_|SsOWS^Z#CK;`@^$46E3`(l@K^K;d1e?d|mJ>T5{Hrac}nf zm%Y&+)~e%bJ?u{)9X+~(Re6p-F^wQYH&pJ*D;X2dM3c)uSCWHehKmDTS#QP2Jc!Qw z2B~{__>bGJlqOd1g0b4$Wgonqw+=SxhO{M;Vxz!2HppL^?yM?N*NiXKK}7nq0z4Pke@3j8!EevwpX-0%QWE=JpHH=2 zJT>*VmZ*g55nrrq0I`U*zKwsJx(96M?@P(2YkBFdIT0d{TJLr{@LSukXnrZX{+zT! zV*a#={FJ&)eKGg&Q0=DE3uSoJ+9!OY{PK!hiyu3BVNk!Qzgn8x>~8m^{IZc&B@&I5#e{w zLe%AC9YlIyBCYYX%Aq*Vbr<_*{ZGKt4%tg@Ul2EC9GIY^?V3FQ*w}MztuMTn(7+hB znaNMH#OdgPkkHmBZ&{&*$4Ub6IEEUxR)y1o*YGs>$ArXg*E{L)1={ZUuG)D5O@g0v zR)+EC*(An4w7&((zXsI-Ecn7c|*T9iT9Y{G+}pke(@q<13(`y1~oCY=C+c?(^`>SBG1gfw#S#^VAtHP`IsyOHRJPKday9H+KuHh4Pe;HjC za2{}l+onACggZpj@zS3mTy(}qB!b?gy`Qx@*g#x#_GnZcD<>RjkJG=k`q0S@qs!(< zpLGNrN>_r~*tp?bM*ncZ8_Xx?W@uaUkP)eNDo-LjiLM=;y+Uhe*8%1CPl|7$YDa4> zrk~6qU#OKiUSrMV;FXjrnwVp8uJoepB{J1oQ7qOqUgEJK zFeQ|T-`D&oeO_1UuFWeC$E>;k9>SHL=OuQ;mU+&;v8c{;q_SO)r~47KIVw zLVrBEO|I7WeUi3uAQBNG>4xk$@`70MQH=f_zx!@c6@hJgd}#RsBMlc;a%1xwR8FDB zqaWS)$Nr)9;cB>oY8I0hAJUBY=|CLz~CZ zDLX~9r?k5pbT&$Ps~X#}$FE8k{YL|bCC8oMzLx$9a(L62MZ$?h?2_ktf}Bzw4p4Ht zl6G0uCo!>meyj^>=br1=ecBB0k@a#gwEl6>p(Har=&L4Kdz;4&A3!w6Q{8MzYB>u0 znzA1Kvk0u`^ihEEpx-bbTcpLaWg ztGUCuf|@5_98OiDNB!R~j6H<8Yx))QMBhcG+R2Ubq{(OQT!Gs5it(?E2FH!-%J1tK z*D}Jl54%92I}T>+q{XzTK8kDQ`HnXUo_g!ee#xXMx9c%e>%R6sY0xBz{>P(Y!p?4i z-d~x}?%HKQ)2zb_=5kze8Po}EU_luai)?bhDud+M}3Mc(Q#NzYS?KMB9@ zGS!BZL3IlVQDZb%Rq}+|-P*k!`#ckFcmaOli6=x)f?9P=$SGc+>S+$D{Ko?^-}FVl zy3~Itcx7pM0a*I(foFfbY!-1r`fDyqHk59AE|LQAhJKl@R(@hp&dV$?Ezw@BTzk{C z&{aN%`YgD=F~sO01eusKV`AWzDPL%EmzcM7ZNBFeXn&%H=~tb)xRc@UualbZUth7cm)TJn=uZFDHny)8zL4V?&dWO3K4)(-J zf3kEM5dK?aW&8lwlDVvU5F~={B_Fmt$WZ3|Mo^}t%aAa(sh6CWLwx8rqV_|t!*K#` zh1hvxn#j@hkqW=|A>IJbW4;Y?i+AbhuDY&cVt(cvO1?_8BJJf8aPW*a|oHl>}$6e~0%1x$tPHcGs z`0yRH;tBvEO4i`-N>8C|I6`8mq4iR+#mDu{r`wQ1Rt>Y6o^0c3j0Q}qd#kR_d7bmmQG@r zuK3j}Odr;?rMNkC|82k_qac2hMH3ia>ENnOu3qph3++;- z|7Kr+1b91lzo)b3`YnD_@=QFSXVLHLEa?Mo_y$B~AkirMkSouar?pI5nue?ncrkqBu(}?0> z`q~@)_M7Fgrv?6=w;N{R4z})QEMkT;;%H63Lk8;dTPldlQ7e6&^k($k6(X{dt^9i1 zW%B4*$Nh=lc{pqLPpM%)6c#3%JrWDHJRL=#lRqz(cRt1}b{)~LI^U*Cu(2k+f`?v_ ztCtn{mBD6I$ZS_PYg5=YaXsUkOk`iKzb5goZJuSh%5hdjA+_IA1WET}^O3?$%v zG&q%i5tupj1p*>dJS6qz-C6DP}QS1j4*@sO>a`HLj){=NPC(t6QwCJy0| z5f}Wr%EC6CO*L#Uf|CFB^+Xep^H5l;^^t|zA*hzeiTSFm@dWZ+);3xK@TRPEiaTF* zNr4u0|0bN=RhmIK_IT?cez+l$MTnZh1tLnky#|?UW=Z|(qa+^NmfRQZRt`i4s~y2v ze=?3gPYitNJh2$!#gmSeA7YkktBFqzhSuqF16dYT){&0hWzJJ>(;mgNF3!eZ;z+e? zJ8IJcS7@x{JPxIHqeVS2ohLYBtcvyu=A3wD-;5c(<2^`2?Jbh9p=U^J|8p; zagK_vVH;-lMd*R`bry_tZg%M)Hav&K`Z-1~NZ^svd(ezNb`HMRT-a>YVR)b~k=Z-< z?v>X*xY&;Y{A!-H9B$&;W=y_o^Tcyu3(3A^>@%36aWIK6|>3oSKNaa1{Ffw+K+%q!LewuihfsPUN4(eCYjbH z#%;?CMbZy3F2F^?B{rvgHP>6Xn3&hCv6D6zRuWmFAqNO;O02~<04nBd;N$Npt7-dm zR_;FDWPYLs>4v~DiOzHuX#NWBfU5j#kJE0|yIy_KqwXF#I$Cx*-tIv8G`XaT13-6KLSk}vX`tMDi`sJ`ZT)tzxpCzqxlikTI_q59ol>=>S)i)7U zId{eES3kQo{_xsWm&xQ{`eX4&Vg9C@RXel~NpA^qoU?U1bV296-GV-i$x~%u7D+fi z8L!EzI*!%w`xEv6`SK}wQ#!Z&W#Z=dbMF_Z#?Xh9E0#|nKA?IuE*JEI3g77*{PU(` zUaFq*6IR^h3%t|?NY+8hb?4Fj!MYZjaX9u)S#+TJA9eS?Ox`U)}V4C$AWpm<$ zP~WYtx?fnVjOl0GIZ&vbd;#rV0lUjY^>XbQZ5v#1tD^>Um|5@kyM>iLkV8B)*&Dh1 zJ^fk(cZsEp4W*+;ajs^G`n*ET(Ut<2oc&!sQt>~5Q?|$9dw*!bW2WPB{k2ysjs*s_ zKg~JAE_z5)WBgW{M`EmgU#~`#4JHnrTgGBBUXM)=B>5$E!Z@b{aB`)*)5ZhS5v69Q#209?8|!HU?m-C`OzK+oK1S`B4T?;Tn-XZVXkfhr$S_P_#5!5=t;NOw z=^V*n?Ik@-0)r!(q3+z+YQ9V`jloNDzn0mLe^4+XyzbUd5gt2}BhW_h;MHTLB>$(T zR?@<>f~bW2aBrwND?=~A4^l1On8ZiMUh4C!>08x0%yk~Pz|#%5L^-9iM;6J@R!JxP z`zU#65sAXLI6cA1Ec>-7uW1hn8=)D$soo1YcJ<8w5<)a5XlmE-N`a8$sxk-0!DsEV zug=f%Ly*>L?Pz}$h+fIepn@V5%5zY2!SL63y`r1r%OAU{SvGMD|2k9u4bcpnf;UYs z_V_J~evKBM5#Ts7Q<<+F($;W{HZu~;mmm68<@T>Gx}WWH>N0E}iI5D0(9f|QfuK_u zd%0~3&A_#guo6r5W4iV4Wg`2HWYiTLOTlkQt4Du2tcrrybo<|%>J&|`finH%kbXx2 zu$JwG@=&-sv0q|irzMzsjU%MUz`dvHRvy)+F63UU0@xBO2t3!22dahsDJN5nc|TWw zH(`U38e{oqFt0Z4RD_jdiKYWMAqhsemlaR4xq3Ut2hm&f?Z(_lm5rsrPM0;+6=!9e zlQi!@epi^0XsobgZaV?F2xoRhiU{0#)nz?NPwAK)PTR3K8gY!Uu_qqvauXp$SO~!P zJtLrm-9i7*R!h6LLAssBE_b(nSj=FL4HH)2oLgswrVBZd(yp`xl9kPaN9k?;Q)^!I zQ73b&2g;b;XYcWo@h`! z#U|m9flOrkmU6ts^co9{39@~KD6Rf!MA#S6I9yQ6Sft4Xur_EWnI~&dMVe#X3KOi_ z1KPU87qG5DFM%UDupqR>%CV$3dQm>SD&%Ete=v-R4f0_1S=a`4p)DFW+OHmM^qp`g z9=CMsvAJg__wJ2mjRgvno;qvOPKyy%%T*QmjouiC-LcjFnpmy?_vJCc53#4kE!20V zn?;n+D0|UjerjhA1erR)byn#+6?6>1stJ7u<+PuA|3edT_D%+n`q-6MOXwQ23H`-C zA)YW@?La!&iwooHwqn8b#@(&P=V5^(%_dZzZ<%&u3-;hc!8KwX=t51>>l!zOa9bc& zN#OV9ryXDeuFiddxik4#Rmw(INLU=RJ`$9!StkETgS+ot$(BX5#ExC`T43`fGN;5> zgW%ra>R;1#kFTOGdGT#OI-l`EUdVd_mDmcpD#?6#0!d%_vozXI#K=^>D(K_tgN`$R zxI7ws3j_t82jO7u(yf;IvFW6)$ZxP_Q*O=w_}7~xPM0NC=$*!#~sU?LxwWIE# zTSp$`!w}yIae44EJcu{u%z7&iMQBjht?NdtZJ5JUp%Sny@mSB>lEGE*#6vWfi-Xxal}J4LoouYW`7mTbp@V?J}x5HqL)2 zY1-b20)!0?U!U{PT4DQ!cO`^800Z1b&ut#%9i<+Rgz90l6p+;EtiIMbn_~NXq}o-! z2piEWFe_eaEaz)(pLfcFV{V~Izb$v)z!G(cFfQD&c=#N4bUldF1?XNNQPtuh6}On+ zT62%U?QkuxoZy2C%L!!b2)>TM2XN(mTwEGRp{OxQ)_ZvwCi?;X0AtwUzn&KRc1h!1 z8k?c^RNId@itPd%OA6sC0Y(sHXnh$=bIo*@ZevTfyy9Bpym&g3dw5O~@ZkW#s286H z?9ktBpf(k@bVSyu2tM#7{w&+D>Zg;*EM3qu&9z&xg;m>fh>g;KUp?f4qqSV^Vq9|p zFveobh)nc;^ukQz<3=c2x(!*y0LA`LdLAhMiPURs>xF7p2!c`sU1sViN|~${S$o;~ zmDeo>K7Wy+Iu_GLKAGcRdW>}Ocq^Bl$U`4Pz%Bd7cu;YFQIl&)wpY9Q0eC~Nit`;2 z#b!Q3wsbEceTJ-LO+W&{Dn9X6HI(2wcyQ}5>E>r~(OOG48613$vyn@o>J#3H8K9uy zEEB^qtJ0i-H2E9Xq*d{|V{=YNhG3Q|KQ99Jl9)*#pLbc*%bX=H3zwGh^=ea=L3M{o zvDQ}G&n5e0`V4%YGqu){(mNFZUi8p7{pl+=Z|4{j_@dr6^=vKE+HzqK21NzDPIx(Q zu>({kr{+k(iS?RRR58;x@k>HE>B6r0tQ#B-h z8$e38cY4wE5Pd2A;%Q(|)&AFDP?g05=Vjc`UymySncb#UZ|}i>82IRnrndcL;c!4F z!%N`=+&CM3T>qO-2jX=xe^EDPEsS+?y`+4|Cfu|=rX;AiY}NSFCIeq!Ru#JeQdChP zgugBL?Zb;jeVN*CflV6l%}1c?Gk8e+a%YN#J`kJg*J>vHdXBT~dpU8v%ArSmVuLKaN zdf|t2n@b?2SCAplw47e$r&!MGZ-pqrP5=Gt|Nm!TDQq^=V7jU1l+R?S zpC}#?^00;h&hXUX^s%T#brNlQ#@yVJ+ zXE%m+uS-AlPQIl$S{JMp(K-!M5BJ6F*nz%?1zKEDi+#4v@zI**jIZ6ipdCkvw!C>e zwp+HHc|7P<$Nrn__D|Gj7(X8U6SXq9|M|YV|2nlfWU>P#FOU((`S*|yHMjvsvkA+u zC;H!*MjZLY1>mEVms29=7xy=A{>gb6^>ga*K>b>_U8wt~?!#wai<@P)6|HjGrFJa~ zy#ZpSpyKhsD8I($zR5J@3VxM;WLb;uTq)35DH1DP;|de+9AnvoAMRk&Ue}?0eQ)|B zLi>wSJ>jTi;P7f9{y6z!{6I;8;^rTWo!Fuzo9p&9)Mey>AZV}5-ZOJt-1>_014((@ z+${q=HtIsKs&1Patb68ZaBeKt-?J}*n;5**J0eV9Xoh_qD70)j6;>n-TGF*S+##~g zpc|Rig;7|7RaGrNK94%n!^*z6 z`-zMbz=LllU8DqQb0PCdA#}y5$e}j844S|a$AJXcA^I$~h+jN&B^(dUUveGOtdYkD z@XL3SrY;k_QXef#uP#Y+A4lIcuKkf9a|K;!264L$IyhLNxXrWh7hCBp1wz zvnO3Z-g$r!sZ@1q=`Pe}th7(G}4A7i5BO-~)bwl{a+`Yfb%PGichWJVh!R9u)m4mT z&#$DLVW5~Ob+lCOei%gBhO&ofsag&}di{??_Z9@BCMVl!-Mwph+P6Uwcxdc-zFps{ z&xFfn@xi^(=?lzLh4in3)#e)@1qCVCUc~ra+!NWJBgA-mA>cNc;p^1P%s@D}=uW}Nk-pwLGDwIAaAs{C)xBcIF6 zQyrnD*g-nIaxS!gUq-JbXO#?BX_Zvaf^6?m2;7$q+~O(&U&GRWe$5-Z&K2N{{=Lbm z-Ti}08eO2rbUKjx*S7$9=R4CWkwVp3WRqpmKSm^4$_YP)! zx0J>(dC^c=ULx3Y<+JjCsrWL~)3NuZM#+&p!cdT8gM3XEZ9MFzNami9oIXnH8t7Ukjx-y+CK#h`?C0_N zDD(Vk7nDw%#OCBQe?8Jspb74c3YbO)(cLuP#j; zq`ZQ`C@U=d|6%VAfV(D3Mf<}^AJJ`Bp_2#8LJVI0Eq-40y0ktLkMK(yVL8r*Snq%_ge3I?|ZH1 z`EY;eht`4`{^$SP``E|+9fSMDG1TUIy0MTy4-I5wL%r{&O?W0CX1&%*M-QXze|WP@ ztp5@mj&#d;mNKbhfitoOPpO;i+K6urwFN6w{b+46A9_Bc<8P_bpBA?5?Njl^TiE7e zQlMD%*doV}Dg|8;GvEht>y3-%?d1yHp?Zo&uyBCYDZRrHZjGJpSfB&!L*-E3m>dB^>|qypLc0$Jj`b4F_=SF>iVU+#-PC|E2{`WBvsAxx5?R%f#@lwG#51wdi4Aa3)s*F0FO0PLJ}9t8%8VPSqJemfT}_Sy;_( z6^hiM50hmq){wJHD{2Slva`7ykso&wx1~m8`CBwyQ5M0>7={BJcTV(F7Ux2V7PD(U z6hp^WtJ>uqcBad)HflCC*8h^eB5MyLtdgZoz7Y+iXK zWgyBU?b1vuL}yy>w6lopA2w-q*$gTNEImFMbC6;-lTXw^vjB&~LswBrL&POZqK{-W zr`nXU#TL7-K|J)8dgm^Z%8_x#zxOwmSw;U`a*2m!ET-Jx$nm4Oa=&bMbr-bIVa^rU z9UtJ{-22Vc4n9?a0qMm-cU9T@^G)>W&fsul%XQEZWqCh{3py#wq?spM`(M^3HkqDJ znN|rw*{b97*t@hpx%`kQ<#iAUQQ>k13!$qs$JlsC{6+42rCUdKvq*=47xew`lsVBE z(*cbOgnqp6JCRoI2T#N{gxPQwJx0%OC&>HH6~F{Yef<_z{G!^~CZn`&jij_2ex2kA zJ`CZFto;v#NH^GoJ(uRc43@5yrOzChOm28W(83s}MSls*0z=T<8A>CcE+axi3QW7lu)q0RxteTtRV+K~$i`yT3l3G+K z$@)<#wIp&HAAhC?gM2`3XRN)=1r{Owa-_ho@!2okKQ#7mhQ98lmpA-bh7Q4w!14_a z9hO2lL~TOEkMO}(cKSVqu*OGPLd^J>L4JJmlfZA^sLZCYp_TFgszH9HdkugRAhvIc zW`Ft_Tl|~q>m*neKs8r32d|5 z*@Z5@n2DF2+?~3DpFW=m<;+@5v5Yi>Z1^c-rQ5&X2PU;@P0V9zRMcSeTe~d&pTVvo zr}y(rW#IxLG$`q1I(~H=z(cF%!vo{e_`4TVgu=zy8$9Ug@0L}l{r8>tBR+DG2h9AS z%=#3zM6E-zbL1uDeg>;`G*-$!B=NfSK@6r^Do1;%BTvE~*KFFn*(y4O|{raR;qK?N*td%z9-lPtjv~-|6GWVfbv%a$joD2qf0zzPh11!Ua75fGW>$jCyQr!G*RTpG> z*5jAiUh{}N#IWW1lRZ6*2JbME*tccPIX(4@x;Q#PN~{g#jQ<9HU9%*Q6uG0Ac_1pXUfZMl~8$Z{MU;8xPrpC$&E3{@(8!}cnb#(WJuKn}u){wwUP;fqs z^8D4z{l2p5C^k;?`G>BhM#ok*wpNb67Yb;9y!=$XXmfy{EO(9fa(tHh_9|?fwi0zJ zfi+s1;a8P%5?ifs3On+os9k&QEv?yxAPID?sfd$1cf&&YA{me+48=m8@SULVroDZe z-8YMtj4EG;O9VnuREm$!s%YsY`!mTH49~SuQP-U0U=834@?=?UYZ-4ZCJV=3LZ<5# zw^cxvvzwH^z`o6O8C7B|8Xj+9XzNqr>d2K&1wI2;wQ8e{##fL9z7Vr|8QZ%P372<@ zPT0PSUq5U1u3P_pL0oPOyo*0sQ>K-xv=sXwDDc7cj#KT!MG15TUy@jk)@d^x0~g0du5i>hdA&^nzJN z2b*ROy(4fBkW6W z-!2i)UNCp#kC=@^o%i%I5=}DuJ!^Xky4f#w#fJ1kq?$)JxJ^FD z^_ZQv8#YL`_CJp`@3FWbhJouqzrz^Px$k^>J&`es4zy2dv(9*8>2sg$2NNXHJeJQ5 zXp|(qk4ercccx9Ge=~JZnYvOFKuQC^cBbIPN(5?)jTNAvL^#dC)LoS?biggmxtQ)V zDmC%f8+-$)t}VI;-Uc6N54ogS02%gbd8YK8xTCf6VFb;W7_Gf#1p@z!nq86Z@nLX# zLt~GPc0>%#Z?XccwI=FlHs7;OmrUk^l3lF8C*m$NaX7qjcV2Obr**Z-nx0y3Px@by6S_Q10ia zjC*!3wx_)=7{(#BW+nzCl%8z6E%+nuwz zqptDVVso?|{qTeI0?Rs4+L%A^0x&8N3#vUPV$N`)i=J_Z0RPP+$#5RRhDwL&Jbe+3I5H>Huf^N=^op>3?RM zRMm=+c3|<3T?V+AQddcW)JyEnAEux4vEM2-4#VG0k0A}ED;upcFd0%>F((`y8XJ?@p0&Fob1KI@`TjU{$)$oAoyJrPD?Z!+XZd&DtC{6gdVka* zToC5*7#B*)hPUeBX)aArNKtKu;Dp$(tE-bcUE)?+DnV#NxTe#EFub}24ZErAc*H2Q zMT-#73H4!=`?UTUWgnl=Q8jmm50M5^^p5WYaP<}C5q)jZD7#ehg!M^ApdCp^s~ zgQoN#`Qca>8JN<*-IVz7vR)(WgV04dn!Ha9Snvgza4Gc<*xk3WDvk8yjmvQ_yFV=M zQUA(Y=*H8w2i=Z+T~d9J!Yr8Gmwk&qdE-c|9RO*WVZqpm?2FXGb5XDi2=4xE!`ho2 zQMZ=051oYFzz<2U7RrHCmhgO=^ZbHEh zeI>^B<;gGR9ifMhPO6~)?8YyZKmg;j$m^%6jnW`$@dL%j^_9?>m`ESwKNLpc zA$@$L49HtPF*6aufh8{x!}=Vgk(|-~nL)3tfUfne%VTK~AqGsLbHT6dOZ}=Bsz3A_b96YkRT)mh1^()9;Ynh48Av2I7yvNI#OJI_gM{a z_v~eDORt~@mH9fAIu8#Jo%x6T&5i}u#6g|)t{-_+DtaDe<5Z&X?!g51=7^Vz<}JQX z^aXX>oHQuNo;niyRga~u$w?Kjfysp8Kamg29#wT?AY`Sj#4YyKF`B-MB=j?kUwL@#`?M4TI^Rg9oQWT4Z}%Y)5JAJ89;x zHNUGCcrJsjDjEzTLWT$In)L1{%*d{3gqGQa5o%e)pUp2c;v&2 z(kkSO1HQqAmz39%6s>;S9}7+-tgIxm{`?>=tC+NN7G=QAi^4-l2CUk}&9XWl90XQK z7C{>FJ^skl6zrUW!r@O8hAO@bDT~z8582)RBF;r7|66!Q6XCJf>sM0R7oC(@QC59$ z1}P=y(@h&Xtvcv2zfW}8B}lN%jaywl2{znYt5y>dg{HGhe`yT1>SmcJ50>v~;Y;nd z^|j0g)4)nF?teyJh6;x!y8`xvns_-Lj?*$$*pt zB-}5%cKD&8d zv_)D+RNFW^9klX_{kUU3=Wz08bj|`g&~c+@!P($vFWpOaLNTV>)QCIN8;;VC6!y=g z20*}{)e7=cHRGAh*<#q{k|a}~UPfK%R_x2=8qCqcb=UfkaB#(xo3t33_Aucd8`>%! zsF6MxU_wQNH(&9@fLv32oIv6<1?}Mf%OwgzYZ!i!^yX z^~fBK1A+uF?O+BBFYdYP$U0>mj%0oshAa^0HA;^;{9aSbIn1M8uDkYVIK>Ini42IM zwEU6gX`|o9)|PxqE$vVy=!hmnfV{B>)`yr)qyQ^ahKi&$ar6 z(_)u|3EiE;6b;7$AHOO7nN^@IC^I@Tl=|u^;wLIoF)O=ve`dp(R!iy>CtOu(wuspr zN#O)Dsks7zOALtTZ>C<|5GZHa$n@xqQ!uWgP^M_{DI}jAbs{4dWY@4uL zo>uHoZUC{tq`0Aa-Ua1AzL#t4G&uANQ=6jGGlq|rx;!Qm#S}Mj zb{e4sA1p-{w81lV2eKl9lAmEwvb?6jb#D~5s5?xj2IpaeQ>F@+H*Fo6s z|GnMMB7H> z0t?3Jp~SV(6{*L-4Ey>4KQ0vYbeCVS>&Ovu=h&{>%>i2zm<;W{M{%rS^GD=<|AYMk zRVEkoKcGxN&vx`fx}BnG{cP})G#anjO*!-?mWxzX)8#*^x(-er^a~)UHu5N7fh%d% zoe#-V*BK7rPJ>teNJ{J?cY(I%ERMLdq`i)Otjoq|DCUTPZnMxM{|4BX{C6ilW84vK zwAm)cy&ueYPx_efpzt!^k=%XiPd61=+tK}dcMN2Zeb#R-qyHCEJ6`>L9IQ{pRat&+T0HSFP>SGYE_?b3IBV|y zr4a@AZ`0Bx4R`$X`XB$&m@a8{dkCUWy)nHuf~kzyTTa_t{x)~PCQcen7T z>jAw~0*P}0WggM5CJc-K;tfD>Yqfny!y4${r;=+sKAN&N+W^1GV1Du7Kh3-I3wua^ z>kg>U|5*_G?>t}zv@w!UUm7irm|ZXSZ#X`@o~Y^b_Jzgma$kom`oVFNhiZSV?ca_X z!Y9`pmpbRv0rT2qP5z4l;*rw zp8OmhKj@`Sa^xP7*BlMTvvyHo6V}^nxe8uFaoHPX)c5-uFe4mI0^7JN|6k8o^-1?G z%d;0M!@BT}}Rbm*wUX*0Fvr&{mEW0i5|EvJ&`0XpIMA!{Q zXlhkp)k6}M?R!>Rj0#D=#O}Ij9nX#3%D1?_j_`GD!vZG)l{UsTQGL(o{!8PRK^t*I zlFdgEL*{Rn-m*4Pmjzz<#n+sD=#URJx0NO_!HE{#tPMoB)Ib^-a(8C<|UxA*Elcy1V+$wUk2pYfV9TUlS$MBq#fNeOqU97@v7?!bT8DQ zi{>2=n9bSjvcK9DX$RYKT^-$IZ>sp%}^e zm65pG9SQlXZzfWZ^2Jb)!vJ-w-t;N9+pe$z2qpG&p|4--hmKL)UiF(7_Jy5sZP{DJ zSeSQ03BA`kK0)9qLLzsxX@+59p%QK3Dx5lTAOlT9QwaWH|v^Jj9P zKFcwI@|dR(^7#Zom?Bp-W91ACMsZvW^UJ+7!`Kp6_@+Tk(Wk8TfTCDq&CnBb+u)%sE z9jvh&ExI~63wRvMtYyqU?e+!>?P`l~QuL88p{H_G?=moqDRZUS4}t^u50?bVc02oh zpIhAzN?-8zaY9C58rr)3s?aMLp3^&?c+D3fhYJQe70WPHY|Q&s(h_@AT*gyocDf`% zLb(?(z1cS>@dAJk4MaxTWlUL^HR1-xbZhs{}qy?DOApD_7TzmEbapUp;^IG4O z&^Zk#kv%pvhJ1NUzIJx^TgmU`cL?Jxgw&o-}_(cMTk8cUe^(LA$rTE8Wo#Fi6JqmQ$UpUH;Mt5K^~Um`|b}MqMRZFS)+s>L3eTr9NEOTx5sp z2!Xv$y&rFp~C>AM~oT=+i#~U^Rt=@!%xx3}MWX zVR)^U*+dP;*bS1h_QRUMBA=oM1YAk}O0;o8;E^YAQakAk z=t88}c(+KBqof)Taz}XjoYi|VMJp9hJ<@X@Y%}Y<$JD;7((h7jADHrKNDUU;=<;jV zl@^F#)QVpOtycQkhi8&xm^*(4_}tJZ`N|aR611r3h-|FvapAkjL38vvdElAuk@^%- zi>_PisKY4y&Ze}^aR0#OHS$_G*n^Z*g8bQNIxzJCd6Y&}?AboMb8<6bEtI+;EjJkA zWvGjr)h)9}fcJ>^GRBbXnA8+eN#x0_Ujpz>=l52rZwYq1jCoGh4Z)0Os(B$SwBwoH zas`Lw(+Y8E)4?PI;8jN^W6V#gUhqQT(zo!1ggCB=@^I1Y(CUze@4L6RbJH zD@)1~M+;IQHBVZ05@XjPA$m$2?hgQ||*l&923J2ZW<*|K) zQDIE3_jzRxT;u&<3=4QTJg?n8>}<|m7)$3JBXdu}TRXkd>ozfiD*hMwM7`v6!qWhP zb%d1csq#wQkB6r&yK;rO@{3Q3oOJtCqOnyq0jJliBJ%hUD5CpK zdd@eroaysN+V6uqkh4Y%ps#Bw>ol$BTac~9SuNJT`Ggmx-YkyFj4RsDnHpJunVR5V z9TFEe39N;Lgrm2TYzHFXBCK1VWjEO=4x#z2sj1(9RBklx#!0z4P4iWmlW9;n3P#Z^h5?Gj6MI zCXb{j%coUr82zihPj84HLhgbhbD8{eFRKwZn+iw2L5)L3piuGf>r5KJ%US0sITp-%B34V?ccODL{2-op zS$hf0vk)aFMWdP)B3=H_i+f1=FllX+mY;$P-_Lrbz=-V%u9gl=uMGZpVhr4rH=%HV zTiJ)B7mo9F*r(f!Y%BFxYSpGhMji)|*?)OzfXsIg7Nvs&EKsELB)ZKCO_1 z`szP9MZ|$lp*~D=@Xt#9o~pAjTX-y zq<{g*=h#o%?UZDmQvJ{Mj=#1w*^*W(Ce3@%m! z9em~I{nT>=c&f#Z2wu?*?C`=T(9a`$F6c0{ZEe_XyFubAc9cG55z39yU-J0o9PsFU zP+?`y^JR7~=bd>r6Ag!gbl3XfagD)%x@$ulu?=j`%t$!=g4Kxlc3-Tog@Ow}`BnJfuY(7A0GX?xD8i@aM0KW{#FM&|>WPm?Ib~RVL)(itNRRw2gKotFSMC7(JG! z1C!8y4>ig?o`cXzy(00<2@Cm4<10Dgf*itr!FRIEpkXhF;!t1Onah$|x?~5ZFdJnT z$KFh?L1nRNg4|ErY~Ak-;2pF@(6WsKEZQx`?Aq~pxsm*+o`7*GQ5x4d(;+{IgGZ;u zZg-tv?sQsih7!Rh<%(ss`I;JOJJDZql{vvt3!1B{{>oyn%>;yG4YXT>2;Qa&PN71uHLtFo)9h< z8{U3un42^46k^GCnt!AJw>1PJ#kL33{;?07C=eH>mO|7(8{V6L18@v9wEqKulL7E% zonIlB%(~(XLVNlNB%VzJ{U#IciXzw|nkYb)bw1i|Z{+MTp^*z&XP*~&nxR&s%76ZM z^q65@ekvWU@i$h-V8eH?w$x>GBo9m{u=f=;lz%T#eKb)#@pQuO{oi{^S^r1PJ^!c8MgQHue^U>08cqDZp_^rX+}Y8kHV$_) z%lFX_6)rnF=LQcg|D|z^E;N0o{U=ozA^kZ1Y<&*|dYx$dI>P9kmu`UO$HyZ%lO?QQ z5!x=wQmCkL0qh;Wd930}C!^Ejhi&bhVM(H6>zr^7N38cIzb#OU0O@Y6>g#Il)iiz| zIYODCG9Z)1A1bG+>F_4iRc4->Av+b>C!~J$4?peI$fT94%j1-R7lvVYtKWVeXDLSy zO;o;H$j@G?pLx{^j1xQ01h=5u|Ou0f1|+3HkNnj zCR)zVqBg$6Nkg!$J5ZA8aH#vS<3fl7#{i5Iu&W5uao0jCEC|ig$%cnMnYHyad_q-9C%2XlJl^n?nG`h=Wj^o;`By zK8p|O=SDeo8MAi42`<0cS{IOTX&7tK?%Tjub;~=KA$shQrFQa;K~r%=+KvKcYJ>?8 z{#3Ted~Y=8mg1+ttI9lOjfwRBLA4(+oG34DD0Q#6L|s1goQ)xycZVoEj?@Ghj6+3_ zxh8}+xS4<{F-gE!J_=z{wmNI2s;P4rB`u(@``K%zis?q{v3-Fc-f*m5G9Fr# z!I@YmOGfWD7ga_=(fN1I47iSc__1#y9cDWH1^eg2H+{+OE{TFz*Gp@qlZpc)+B3Do zm2zjQ@&G8;e3v^R%Q1m3d&-02=AD!xMWbrvCF62;EULXMsw>z_bb%?~iH6IHos!`s}&3k$R+mELrQbwOO-P;KZ>%%1DM5X|cegMh+(fW;I?`RqmB zF05XSmGU9}8Lvw|QPn8(lIW{;7-ki&*10Iwgsr1Ur_W0kDmdJgKGRuaw`&^Jw^rt5 zbzs%{4!(YoOdS+-twdy+BwHSBu!;#Q3To~h#?KN(CM%Vy zm06Fay9Mp>BVu|1V3zrr12yxz>sX2R4G)UyFFva?DW2kJ91g+0uH})xi`@Mz{rF8^ zyp{SSDH#S5ue-~a+j52)eOClG;1tqTop6ZdrE<~`J14wEagbTdzngzH3NPiGEoRX= zH%3;<*Xwb1vHwKZlJ*8!+uV4YR~3Bpla&Jw z^3tr9YnQVvCHFbv2mQ{&k+Cm!W!~kN5JnvUuKF`fq_uPXV#>$HxX$(Q%AlhDQCMwr zxAwZV|9V`n!i#pfig*z-*s@y*>o3Yf3!KTcYcW5HrsJCjx63d?^)X&&*n&Bd1rTRY zsbk!b{rDw;dXnM+LP%4UdLXy=+LTWSWv)SF0l7J=P^Vp?y;~A(dM8U>^bjl`kJ;mp z<&Bbh9Eug1p>v=38e z7&8M~{ZH}m%gFS3_3*|w;0|@usH&Mq7HxK>IRm1?2vEte`4T*NBl>iX1aqpVj1-QU zaXS3jhaRI|w9T^u_;Yd^8Q*oQ_DsGB2<|#3yJkNB#UwkZk^TlMt`c)tAN+>yQ-Zx4 zyR$zscFiDk#k0!Jzl=&u-$xcP1==GnTc$IM5-f3~Ph>}1hms=mQ_paqpbAAMfA#1h zQuQ@Clw7eY;r#^bSpihA5V@BxVHf0I4nvy0BMp%@#E!p;gM#qTOcy`_T;MbG^^iIm znR%3xkhv^65lM?ED!y@KQ_RfZ%t^M(n%ncE|E7&M9mJ^M^^=m+Q#L zq!)gwJQSIR*u&Cn8`;AU$vXF5CJs{_Y`Cql$0B5I{x1zMBL*)L2V*z(!TkI$jqk=N?WCbi*IJJ%)Rh~F-kNq&Ml9(m-Pj`kMVM? z<|~XY(IT_^K_j62rEz3jJ^bQ&6DPeD-wk18-kC1_*MSR6VmYdA5i#(?R~`0Sxu?(` z;^+|T9@HdS_S>4sefGf~mdXywPh~ia3Nxy02D{xU!zPLJ-R#;p9#4v2st3`)O$|&~ zLWd0%#V_F|a%&~uC3!wen%#2w05lnC22l>%T!IpDnHYi z14J!gr9cLoXT>h+mIm99u)=1H^m>4QzGp=&EC|A6Qn=I^huW$zA>pdAyIHkE;{Q5pCiXK(TQC0J><2L_Ua?&~atb;@#DiC!n~In0Xe@G&cbZ|~FC_2|e$`mfKAo*E zSx>zivbPo@r_O`e?#RplPhBH;$2^e)_Lq^>ou|aAEG1|}JMzYy#<<0?E8OxpWLISB zIRP3IRJ+KWwVs1l^!63y;qu=%+C&WRYY1e>^5oj~a2UY2uj2~UgbnQ=%O=4F6;d2Y zQEdr1HP$%;+=Cx2IDCO~*+jH4B_<+&BE8!ozn>t9Nx_)EOy7r{O}k;Y3oIg+it&+c zE2?cMbM=<8BQu>pzfyyp21u>LQ-b7j?DnLV%y&qC_SbyQhmAx87Mb7`#`Vs;iN74J zeYXJ_;%E`9Ve{}t3%MaEK zQR5UF$_We5gl!861<`>B<vE*5Cwo2^oM$kKE*nuaqU0{V|>f zxM9b*<$d9`yXA)qGl)7BY6=qM;Mos7z&x*x#i~StrHw2?L&=^*^U~qNSuxwrNCIlY zEVAU&1K&FtCA}=8c^%G8b{Te=bqyQAQD&0NNi(*_WB3Z3nkd`esXWNo#TFdK?27W_ z`8sPB)XW=!eIqSe_kqoUTu>X)v2C_iPD~zsx2ltsNLsFpmF`0pbXYBpQ8AZd4%a-^ z%&!(fK~g6$!e5BCJRNT@K(i9S)JU{F zR!Drh?Iog?O?a83O2_Y6w%}w-^;&k#4)sz{0KXEBILNjRDn`Pdbk0SE)exdBJM>%+ ziC0+VPYR6_F51-l>VHNq&V!*{cu)H-*Ph3Q9?*?nSo*z(a<45gc-Ua>Z|lKV|2-^O z9gY9W_c^ms&|@vrG%sF8O{v>u4Tb||t?m@8YnbiBj=cB$ z2U<-QF|$tlOQXl#{i82_6#|ze@9#D{01$I&+XP3~YdbiY_-Odtnu=z8yQNXxwND>< zdOdAZ56|6F!}cs~`@gqK9!wF;^u{%!lM_wVYas40Z+5lS&_44*RhV@;<)2@}pGKW( z?%8xP(UehUcjbS;A^-ouA^*u|7qKq8m-*zlk9by08E5+?k7*f0Vf9n9N4WRQ|iA&NrLwjB6G?q&KPdg%l)W*T&I)b+X6% zGu>T@3-(9y#<&p2L0=?(nEnURa8_^W@ydDfKe{jcg0g5=8Lglero%B=0e7JkZrUW- zHe^f>L#I(ebhYC^5Y0H9?DU?qH8S+raCLQKLndmOS_iw!)q*Z-uOv%NyR~lT?%2K$ zTzM^YBI&Fbim!l>XJFOT_&s*LlJSGYVfIPBE1;hI)yye)69~+tS*S$nCKzB1zLn*< zNi0RnpYmYmRqnUE@{7tqR`rJ@rf|g>b`0#d^K*0oc~!X>jMpOT@|ToabKK{3?Ay5n z9zus3JI4LDOZQ|{>A%>CF+SYpSY3&6PBC~|op#lD`5<$-;1ltr++iNG`Kf$0;GpD0 zAyPM3}JPFS?Wmuk5gPew`&B zz`lgvvMY$;B}*;n3l4)Uqu>DjH|G;iBH=_LL0$U>3tFOI$B!`Xtc?y91m4u5=K}j> zQ*lAkjA(U7gCgLI<=-E1sZo)Rtvft#d;=sg$EafeRX1gdK<@Q25rU;$&&ev~%}{#q zdmD`MgakX%8qME+_5i~5Sv@<1PqY;6ilm*U05jupNWr4T?0E)jiDtXao!3AkVptuj zDy2D0eY(vcy_5dK3-Nf1_MtYr{QxH=7qbOpAUu?+e>&M7qA9BWVgFE-v&l*EKz>Dl z&lu()>EPL2dAmlG{((x$Of-EkD=63Af;t-Y^C})hdb!;9hP9gO*b{zvvO@=$8((CDmjZ(7$Qy+RffgwoKPO2~ zEsFf*+!D9e#C(Fffo#t+5}z&&$&VxcSzeH$;+q0lhT6zDh}>J*)AG%3cKy1h&yJeR?6%yg61o%URrz**I9U zi|yx=?*+*<_>Bs8*~7mybjoXUBY(lma5m1+aFtFgA&z#ACbTn+tZGI+A74;x(-Dd? zajG<; zr@^%VX*vsFV%u#lsV{4oUCd|f4kCz>>M~7Wwmdnjzzo@Hd-AT3$bDDf2T$?0nC?i# zm@7$Ok*^~qaJKHPl7;EsRalv%5`u`MO19Y&@=v=>@=Hy=74)~t6#XpOTr4-7Fsg>< zjnc!-EM4qamlXE)LzrfmghNv-6)w&IV#yxTDy~7o`@a;3IKJhk3&3$VFK#bS2qa30 z{)c`vyp$25&Lf$m$J{QR&ghC1xxBITH#waJDndp*!%AgKTdeX{sPp#!%$nj}eeAL|RtKXS6-Q z4vi<-=wssN*zIb!Px;uhadYRZm^=~^VNp_wlM;bpH0mX|VU@k( z*=_kLXB;$vqp-=rI4FB?2@vC!8~Qh|4TYmS4PEY0_H6tO3|7c61DN?AFI@ zo~{%+NjH5N-v?dCD#1^=(&oGsd#5TA|83=g$heg=DI*>|v*#Dp@zZ##j`U~oV!!Nd z**xE@elQ-O4tfJ0{1SL!kZ^SLd=m_v^&;-ud{jCWaG>XUKVI8WC&lO7-+!iQFqsF* z-za+zy&CU5+<2|cJPVDNW8o3Y_Jmb9kF)Kny^_$J7{btMxEw1x5y)%cK<(Y_Be{v% z8tj84vO27qd@|OIs%c?{RCJFU7xJ1KC_{q<<=;inrc?(6z`j@$sqd=Na{tqfTAA`T zl=`K0H`C;wmXCjeN4ZVvy|?GE%W8B*a%m*3U3U;AF03i>CNBC#5tE`w*emAi^M=)5KnQeST;TUDl;@~ zdq-J@UTj9V3S@I<^#qfZ*QYNJyjRz?)Q?RH^Nn1mG8+7{nwj|095(r&q!1L5kBNV~ z5qq@fg5<&Lf?}cL7qRX&ZpuP$wOSV+I82FK!&7F_?2ZqUM?AAH;DI?&9tcjQjk!ou z2a|_pzP+x*zFgc5S;;f5e7m05)+gF6)UC*s%c+r8C#zMRiNg6=tLXe1WT8_fw zyEk(mGG3{9ZfAns9{+a} z5PTg|B#mMH>g5$c5|%@XV*rUT)OhN+@_QlfEqPxN6pQug-jG$?HFJ~lwu_tW*b?3z$Lan6FcxP6Zpp(P~N#tQXzV70!LAPdP>!R`vw=$GC{sNxzb%NqpUT3fB=rkl3sF@kru{tx<*3 zuJ@sLZE%AFSPoB8Cw^d+wRRlrl;$#mIBt#GV)bh9u;ebyaj#d6M7zq{sdFBkyZo1i zm;A+#ccSdM3w2)oSO2N8U3v_=sek3s?Xd&3({QzJNFbZa%mEBrbgM1ly}uS3y*Cas zYd-1nI6O9R(x~OxYlOel5|!fOvtqVy;~2Z?!FrtRQpYjt%!GeRK&#YP)?WtSn%5bxqw94h&2-fhYjprIuj`EM zr@y$9{&vSlo0k0ned*ITh9$l6)9RV@`jng!z#(}24O-Cfh&Ho&`f*N5AqWxGVdG`M_zyC?|`rk$pT|}W27GhK@>N5k~_Uvsuvco^F zotOWJZ>+&Cy~Zy;M8Sr1I#39(?;md&aEf4%w@WntsI$8g|Ggk+!!GVu^22{pY*cet zi-14IT=A7p?<>Jxlc6Cve5LxqS;oc(wD>;iOVK^Hmcm(oP=xt6(2HI;>4%r(h)s7VL>@$pRbO+{lb?Gk{9=uxL8d|w{kY}iQ-DH`S8N-3-=I%8|@sRJ;^3nWFP<`TUP- zWYkuqvw7iDtfAA@5AO!wtqQIprJy-xK!-&AT-CM3ch%bQaTFl}FnQCuP!`RVVo|Cl zs-9w3rN|-2B$-)%`IAEDFJg*zqNdoL^7`Ad6U5PD3e?RaU>Rq;X4Y5MD`(uARi!6s zAEtwnA+q6GvehOp*`*2UFC2pQR=>z=^Cv0I(dqPvF)pfq8OK=ihO)UZz~jams>MZT zFt{$6KB7GJB~$*Wp&qAcfjRVY0oDX#Z%z!F3KS-R5jtLWKUTn+D)i~;tmz$C-NTKT zQ_6wYS;h7tn8)b&HHK0@0C!lrk6Ps8b>GGcjHRDc^C9!>MymV;c7%tw;+9uE7Z%+P zd^1*C*;AOM{zf%!P`T|RE~Gju^DG}=J<>5-BT4e_c@Tw_IOlzy;V;IvQ8v8`uDer5 z`sKH?8{w%g2%Gi^e)z&SIM)G6WIU_kSK3jIzTE%L_pK{7Yl_!=`CEe=A5ij=XzY&ZQdk_86#%o4+38!-G1hj+s7&2Slec-1sksl>dmVT=}+wZ=5d0GY49?7p*Z? zgZ#%8=+5;g_zy*dZ(1xu^A|%477B81ex;lghgQjdh<&qWd%pr{LPyb%?sEmT)r-Lc zj9C(0hS>9$sQLumOp|+|*f(r0aqOMi>bdsI^ze9-{)20CC+B{u@4=1>W~eYAD0lVz z5%t-Uvpue!zid9c!KJ>JwK3F4?g1J<pZd4rZe2~4jLHvQO4_PedcLruCG48BH^T)_^TFm?~9n<6!v;5A-=#}*yIQ{$a z3omPryR3gJyWJrVNxxkLv-D||KW7$BJohc{$Xee*8N%E^QDEOgW-urV!&*;3#Gs{5 z;k8%6E++s29&jrL1haU_&6YLyL4EPS{lTw#kWp4|Plc~T2zUk68}34nrRp^C+<41o z=b=Wc6~Q$JjH1N`oOovjA~El&zo-OHi7Is0n1rIJ>?*SuPQfdZ{Jl=t^`f*dqqHE; zpsM8>ypT69({aA_a{L@UR-kiZOS?L{W`01=*#xTbjk}XUFoN9RL|?=V0wI|y_yU$! zy1xQ=f*B(Q+fKrC$pfW`S#?!275aTvX1$tXcR=9f4u-NuNtZqjl$*RgtZimy5#%ML z>iNs6W>H_}^stC%oNG5I-V_(JFLPOmjW@Vbs$dqwZXQBDo8AJUc{N~c?EF%OZ}LI1 z@~3<}`Zd=|L#8~ZP>xp(;nd!=W_=E*r$vj`zwSW7f;_hR}y;V3Lm6ck4m ze#v1mET`)qfwdGtzpLg~a}+lUnaUhXXRWn)H%gmNdW|L05C?H_0qP(KW!Zz{?+uc3 z#M5W^W!JN6Ly(a{eVR-?kAREOS1yEE)m@jNRhxcu;$-$wI4@X>7eKQF?qbTdArDo+yT`-&*yyJld6gzsCM#a@S#WIgY!Zpmoi4TytIflAfbQ zY!h=fkXhMRCb855gBd1p%`!!rd&N3X#};!X(kDC8zTk69i+1$yGmk@90^k0zdmjSvw_0~`I7t%JY`iv#>Tn^$gw zcuJjp{aY!xp=a{&R8jKxiNBOEiN#giG7eb9Q?CWq+v(P%h^g$+mR+LIgQ4=?zz6=h zjkxY3-;T%5dSLG04waI-XHnIvHi|}ph%b(I1HUR-kQ5#v7Wm>C3vMa=2+4CbfxU`x z%#6Oaeh#bQ>oh`^@_+>El6{r7X-u39JWy2*hHR&wsV)FdFiSGx*CJ8POuU$Pm86w! zw{o+eG=r1O;^a%rrh@x&=NG|gwfkS3br6Ndr3(k=yJl&ZVK-+9oJMt8M)K*y?ruP7 zV0e(OvU+h>1mocE9c}}LgI?h`M6zeg^jdP1<`!|*oe_!O1M@Fus0Y9yBL;8egSm18 z2VOO}z9c_*!*LCQ8~ScOqk@TQN!55RiF)O6m>(A{z(Z-2zSk#czmvIo1>8wx@5A`_sjnm5}zRaXN+SL$dXhvt2OrJ?8lSW!>dEb%-_x5X3PYkl zh9O_B9()qcdQ%v!P=m$x%59<+{a5_%glqgBF)E$3tAwfCGHu~aaux}mO7kW^~=zf2> zsE8XqdozSVgSR>B>g_dFp;%!?ZLvCqh z=OP(7b<4_>zc_m<#DA~6ipz;|Lk zm^rL%v zAD+kX5;wmx7a)@@qemY>^e-7A-oq90BPoVK7YgL3D~Vr-BuTB^@9y|!yuA0Cud0yDViFjVk=J>W6 z+V+)%mzAaNGe9$Q*Io}*z<Xi`4Ija9kyBt)8FSbK3M202kD_K( zjWbX-<=@b4!+3MI>`!d$xMhDb#X0m}@V30xjp^Cm){jB9tQnnKY`4+tpG&{^aW;5S z+5;2rcEr|L#osbQ4`ZTcK)VqvI{btYD(E@X@Do+_wYeb_QfoTssjow$fG{Wgo2oh{ zsa92A%F)bO(?#FI>Z=@0Fgy74uD%uE;?|kDS4=v1inqO706gmcGjWB8vo zes}}k4uva)@I9;z|M%c#J-(QC!X&A-;Yh4w8FK$r?0STP`TkEyCJ zknsn{bT^FKRf|;WeQ}ueH_NJ4Qu&k zID!cO=*_RFR&UyZ(WqHR^LbJDsUe>v9svD?I5a z&l5I#okx?k6?EQ_DQ3`(a|ji`v)gh9wKHRoKwn)x!n*=$>xBAWk5-cB-!EoQASBkj zcz%`mc{m+3s}Ir#nzE+bd#O_3lXUP!J}IqBN-6{~J3Y|In1PBE-|B)07LZ9o(nJ96 zE@~wHV;9YL+JqV9$sqTK^T8S$JDsBghRv*-x4leLboQ}k@~e9ncm<>Lr^v{%zr0*Z0EMNpnko0WFzIIU49u|`IVUOYY>pr^7LW|xSP z`rX|dkCc|DA|+>51JhtI_*s00BF*1;&JVOmXl{vOs)@gYqAxze?2U>XA*wpy%paik?c?N|! zW@xvuZrsK=2?tCbplt`l7fMTQm2<0)Nd&fxEu3vh)-7k}0R))Ui!GYD`;TTOW*|4O z=3gvnzrb+47$X$o;G&P|07HeZrbVxF^you8e5$zGf<{HxnqUiF%X?6MFn-_wIH=ix z-_)4Lmx{SKjO3$ZR_dsq({5IE9$6_EKyGRnTXnpUACkV~>%W2Ij(46f6~+>gxM{mS z5!D22*Lx4MXZ3uqkId)i-M=%;x)T6aUHy3$!?W6N04tg6eoEhHf(-9RK$*N<15SOTavK-nh^FuZelK#}pO0gPAx>!r1-^ULh6c0woH8is1;oiyDnD#DF z!3_;ekZJsL$`g1Z?FZ96^KT}<8*{ItF+VX`Mb0J%O=+@V!o6)$=d zqu&o(|1on7`{O1bo4RTy=Gf+Wx6f$0_m%M_qH*jxEyUtronT<(Dktgl1veO}#Cte* z*kf)=uo+cqD|cl#n6_O_Ru}l10yo|*OwBvgPdeUQH2j(~$Y~17JKqn7r+bLUn&}fb zlT7u-Htb;*O_PG6mcmJ1oFr{me90_ja0xQ*_Kf)I>&IzoGt2=epxu~Xk@fgqV&4+; z*nXFcyVI*d#81rtAQ0MX|Nb18q1P|c#I?#bvck(9679R-5vNxH(Xqq1C0H;rzWl&c zLlLQ#cx8BYN8>WOFVq8ET4?|JQ}em9-+4OH7d zmH(Dem)VfxVX4ZL<++h{4nJqB(1ly7#v4xUWCt1>Kv*`a;ZKHGk*uxexW-F|?o}(Lcy*QCv^wZAZy}A% zew##V*Lus(De$K6@brcoujDnG;>2Ov`wGd|4IA25Au(1q6mhjj-#lG~D5m&S zcn({G#yr~CP|-Lq^CM_O$u|riI#8@7w+^5Sip@1@HMqrQBB!sRgVv>^IDK+YhE2@! zcND#Q8EoPJ;8vxjj`choMGd(iuG4<{Kd5rsqSeF?Anh|^OMyN?VgcY8ys#&_nTgE?dXI4?CE>|X|P^`1MJ4BPGgzqhBU0D|ItOOoqKvw zV=V=Do`R$oQbi1x1NQ14Q`iW|V6)RjCsVA1DS4_Muq20NmfYP=0sq(rJpuk!>%*Z+ zp8+)apFdxMt+0Vl`zC!W`?eEX&_X8%r%vqG(lPupf1Ex_kiEH$0eLiI)?t~e-tP4q zJBVPgrSZ`LK62X{8Hi6RIE!OjXst7X0Yd1c!PjeheAylmpTl0Camr^G!9v#dU+83G z(aBZ|5Vbu5L0lS`Yl;6WTKoSRM19q>n>F8D-Qs}Qiboy8di*GxhiNA7sj>+T?W6fb zMJaum#SXn3QfFiDsBB$OANfnV3F}xN+JxISR<>)p%!C;|K}S8<0b8`7=cG;P9SWfL zsJ{x$tkP@Z72Wvq>9e$sBcHrwSi$V^M~(0}%aFL@^BTmJzm$Y5sg=72k)N6=C zMy_#=3j?AdT&w{?ZIgnfp)u+X!;jLW9Ljf+gTJnL?C8oLfg`NAPLFzLX3ynjm2pel zi0+osX_pL+>V$Ck%}NEjD9nXoF*qN7lee8PU55u_(f z%k&B=_U&11JZ(yKuIoc|U+tWhxWl1q0v*&s3T>Ed=JpLCgYf+|c`>7Qt^sQW!xAftu6Yx%g!>$v_4}+8NVGAKSKQRQYE@v=SA`kF_$mn zZ$~aFocIe{9|MKxI9f)fgeU7cZ1K&fu!^nr%uzef`A<=C)t#3aHc3XV&tveqHl+}j z&@#RQs4@J8T`FI;87TJHGNw~QsEt_!O>5tVlaTBTF61YoYPc9arz||b1-CSVudgbk z{4hgntcjdtOmCbw$KBI3lzjSNJ1MB9<-QBawh2-X65>5!1GUh&L&z_MFeC1~; zl%o<{_t(tE-@Tu>dGS}aPLLEg3Xz%|n@gW15{l!Ax{3?GPp-IR20PX>M8aazN{Z3A z$+f=&(4}7a-qkSj!wGhhC;fHPMyWEw2aKy%MQjaq-~9MI+L-H&` zz7>W`;WgZt6Yo^03!9+(r=a&)gNwRH*1NqCpv4j<1EO zPf>HFby@_Ne6QI*K912$OWC^U$RD3bg;z)gS@imYB0DY+?KT*vPUS-IwCCDtS*``c zx0|wOT;OHw@g&$4KaRTR!bBZ9G->(%C$d!(mdaMJ1MZRs)9v-J{%xi&FOnbLpi^*G bhr9U%e`e-TD$gTschc4MR{>%7SI_?fk^ed| literal 0 HcmV?d00001 From 2570980fa5264091ff66d2b6bb159fcc62983037 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Tue, 30 Oct 2007 21:04:41 +0000 Subject: [PATCH 11/15] makeShortcut done, EXIF done --- lib/WebGUI/Asset/File/Image/Photo.pm | 175 +++++++++++++++++++++++---- lib/WebGUI/Asset/Shortcut.pm | 62 +++++++--- lib/WebGUI/Asset/Wobject/Gallery.pm | 7 -- t/Asset/File/Image/Photo/exif.t | 27 ++++- 4 files changed, 224 insertions(+), 47 deletions(-) diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index 82e6727e4..c5f075f48 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -223,9 +223,8 @@ sub getComment { my $self = shift; my $commentId = shift; - return $self->session->db->quickHashRef( - "SELECT * FROM Photo_comment WHERE assetId=? AND commentId=?", - [$self->getId, $commentId], + return $self->session->db->getRow( + "Photo_comment", "commentId", $commentId, ); } @@ -259,8 +258,14 @@ Get a WebGUI::Paginator for the comments for this Photo. sub getCommentPaginator { my $self = shift; - # ... - + my $p = WebGUI::Paginator->new($session, $self->getUrl); + $p->setDataByQuery( + "SELECT * FROM Photo_comment WHERE assetId=? ORDER BY creationDate DESC", + undef, undef, + [$self->getId], + ); + + return $p; } #---------------------------------------------------------------------------- @@ -281,7 +286,7 @@ sub getDownloadFileUrl { croak "Photo->getDownloadFileUrl: resolution doesn't exist for this Photo" unless grep /$resolution/, @{ $self->getResolutions }; - # ... + return $self->getStorageLocation->getFileUrl( $resolution . ".jpg" ); } #---------------------------------------------------------------------------- @@ -326,7 +331,7 @@ Get a hash reference of template variables shared by all views of this asset. sub getTemplateVars { my $self = shift; - my $vars = $self->get; + my $var = $self->get; ### Format exif vars my $exif = jsonToObj( delete $var->{exifData} ); @@ -338,7 +343,7 @@ sub getTemplateVars { push @{ $var->{exifLoop} }, { tag => $tag, value => $exif->{$tag} }; } - return $vars; + return $var; } #---------------------------------------------------------------------------- @@ -406,7 +411,9 @@ sub makeResolutions { =head2 makeShortcut ( parentId [, overrides ] ) Make a shortcut to this asset under the specified parent, optionally adding -the specified overrides. +the specified hash reference of C. + +Returns the created shortcut asset. =cut @@ -418,14 +425,40 @@ sub makeShortcut { croak "Photo->makeShortcut: parentId must be defined" unless $parentId; - croak "Photo->makeShortcut: overrides must be hash reference" - if $overrides && ref $overrides ne "HASH"; my $parent = WebGUI::Asset->newByDynamicClass($session, $parentId) || croak "Photo->makeShortcut: Could not instanciate asset '$parentId'"; - # ... + my $shortcut + = $parent->addChild({ + className => "WebGUI::Asset::Shortcut", + shortcutToAssetId => $self->getId, + }); + + if ($overrides) { + $shortcut->setOverride( $overrides ); + } + return $shortcut; +} + +#---------------------------------------------------------------------------- + +=head2 prepareView ( ) + +Prepare the template to be used for the C method. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + + my $template + = WebGUI::Asset::Template->new($self->session, $self->getGallery->get("templateIdViewFile")); + $template->prepare; + + $self->{_viewTemplate} = $template; } #---------------------------------------------------------------------------- @@ -444,6 +477,19 @@ sub processPropertiesFromFormPost { #---------------------------------------------------------------------------- +=head2 processStyle ( html ) + +Returns the HTML from the Gallery's style. + +=cut + +sub processStyle { + my $self = shift; + return $self->getGallery->processStyle( @_ ); +} + +#---------------------------------------------------------------------------- + =head2 setComment ( commentId, properties ) Set a comment. If C is C<"new">, create a new comment. C @@ -461,7 +507,10 @@ sub setComment { croak "Photo->setComment: properties must be a hash reference" unless $properties && ref $properties eq "HASH"; - # ... + $self->session->db->setRow( + "Photo_comment", "commentId", + { %$properties, commentId => $commentId } + ); } #---------------------------------------------------------------------------- @@ -499,10 +548,9 @@ sub view { $var->{ fileIcon } = $self->getFileIconUrl; - return $self->processTemplate($var,undef, $self->{_viewTemplate}); + return $self->processTemplate($var, undef, $self->{_viewTemplate}); } - #---------------------------------------------------------------------------- =head2 www_addCommentSave ( ) @@ -530,7 +578,15 @@ this Photo exists in. sub www_delete { my $self = shift; - # ... + return $self->session->privilege->insufficient unless $self->canEdit; + + my $var = $self->getTemplateVar; + $var->{ url_yes } = $self->getUrl("func=deleteConfirm"); + $var->{ url_no } = $self->getUrl(); + + return $self->processStyle( + $self->processTemplate( $var, $self->getGallery->get("templateIdDeletePhoto") ) + ); } #---------------------------------------------------------------------------- @@ -544,8 +600,16 @@ album. sub www_deleteConfirm { my $self = shift; - - # ... + + return $self->session->privilege->insufficient unless $self->canEdit; + + my $i18n = $self->i18n( $self->session ); + + $self->purge; + + return $self->processStyle( + sprintf $i18n->get("delete message"), $self->getParent->getUrl, + ); } #---------------------------------------------------------------------------- @@ -559,8 +623,21 @@ download the original file. sub www_download { my $self = shift; + + return $self->session->privilege->insufficient unless $self->canView; + + my $storage = $self->getStorageLocation; -# ... + $self->session->http->setMimeType( "image/jpeg" ); + $self->session->http->setLastModified( $self->getContentLastModified ); + + my $resolution = $self->session->form->get("resolution"); + if ($resolution) { + return $storage->getFileContentsAsScalar( $resolution . ".jpg" ); + } + else { + return $storage->getFileContentsAsScalar( $self->get("filename") ); + } } #---------------------------------------------------------------------------- @@ -625,6 +702,11 @@ sub www_edit { value => ( $form->get("friendsOnly") || $self->get("friendsOnly") ), defaultValue => undef, }); + + + return $self->processStyle( + $self->processTemplate($var, $self->getGallery->get("templateIdEditFile")) + ); } #---------------------------------------------------------------------------- @@ -642,8 +724,32 @@ sub www_makeShortcut { return $self->session->privilege->insufficient unless $self->canEdit; - # ... + # Create the form to make a shortcut + my $var = $self->getTemplateVars; + + $var->{ form_header } + = WebGUI::Form::formHeader( $session ) + . WebGUI::Form::hidden( $session, { name => "func", value => "makeShortcutSave" }); + $var->{ form_footer } + = WebGUI::Form::formFooter( $session ); + # Albums under this Gallery + my $albums = $self->getGallery->getAlbumIds; + my %albumOptions; + for my $assetId ( @$albums ) { + $albumOptions{ $assetId } + = WebGUI::Asset->newByDynamicClass($session, $assetId)->get("title"); + } + $var->{ form_parentId } + = WebGUI::Form::selectBox( $session, { + name => "parentId", + value => $self->getParent->getId, + options => \%albumOptions, + }); + + return $self->processStyle( + $self->processTemplate($var, $self->getGallery->get("templateIdMakeShortcut")) + ); } #---------------------------------------------------------------------------- @@ -662,8 +768,35 @@ sub www_makeShortcutSave { return $self->session->privilege->insufficient unless $self->canEdit; - #... + my $shortcut = $self->makeShortcut( $parentId ); + + return $shortcut->www_view; +} +#---------------------------------------------------------------------------- + +=head2 www_view ( ) + +Shows the output of L inside of the style provided by the gallery this +photo is in. + +=cut + +sub www_view { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canView; + + $self->session->http->setLastModified($self->getContentLastModified); + $self->session->http->sendHeader; + $self->prepareView; + my $style = $self->processStyle("~~~"); + my ($head, $foot) = split("~~~",$style); + $self->session->output->print($head, 1); + $self->session->output->print($self->view); + $self->session->output->print($foot, 1); + return "chunked"; +} } 1; diff --git a/lib/WebGUI/Asset/Shortcut.pm b/lib/WebGUI/Asset/Shortcut.pm index 06132567b..5d6410d88 100644 --- a/lib/WebGUI/Asset/Shortcut.pm +++ b/lib/WebGUI/Asset/Shortcut.pm @@ -636,6 +636,34 @@ sub processPropertiesFromFormPost { $self->uncacheOverrides; } +#---------------------------------------------------------------------------- + +=head2 setOverride ( overrides ) + +Set this shortcut's overrides. C is a hash reference of overrides +to set. + +=cut + +sub setOverride { + my $self = shift; + my $override = shift; + + croak "Shortcut->setOverride - first argument must be hash reference" + unless $override && ref $override eq "HASH"; + + for my $key ( %$override ) { + $self->session->db->write( + "DELETE FROM Shortcut_overrides WHERE assetId=? AND fieldName=?", + [$self->getId, $key], + ); + $self->session->db->write( + "INSERT INTO Shortcut_overrides VALUES (?,?,?)", + [$self->getId, $key, $override->{$key}], + ); + } +} + #------------------------------------------------------------------- sub uncacheOverrides { @@ -859,23 +887,23 @@ sub www_editOverride { #------------------------------------------------------------------- sub www_saveOverride { - my $self = shift; - return $self->session->privilege->insufficient() unless $self->canEdit; - my $fieldName = $self->session->form->process("overrideFieldName"); - my %overrides = $self->getOverrides; - my $output = ''; - my %props; - foreach my $def (@{$self->getShortcutOriginal->definition($self->session)}) { - %props = (%props,%{$def->{properties}}); - } - my $fieldType = $props{$fieldName}{fieldType}; - my $value = $self->session->form->process($fieldName,$fieldType); - $value = $self->session->form->process("newOverrideValueText") || $value; - $self->session->db->write("delete from Shortcut_overrides where assetId=".$self->session->db->quote($self->getId)." and fieldName=".$self->session->db->quote($fieldName)); - $self->session->db->write("insert into Shortcut_overrides values (".$self->session->db->quote($self->getId).",".$self->session->db->quote($fieldName).",".$self->session->db->quote($value).")"); - $self->uncacheOverrides; - $self->getShortcutOriginal->purgeCache(); - return $self->www_manageOverrides; + my $self = shift; + return $self->session->privilege->insufficient() unless $self->canEdit; + my $fieldName = $self->session->form->process("overrideFieldName"); + my %overrides = $self->getOverrides; + my $output = ''; + my %props; + foreach my $def (@{$self->getShortcutOriginal->definition($self->session)}) { + %props = (%props,%{$def->{properties}}); + } + my $fieldType = $props{$fieldName}{fieldType}; + my $value = $self->session->form->process($fieldName,$fieldType); + $value = $self->session->form->process("newOverrideValueText") || $value; + $self->session->db->write("delete from Shortcut_overrides where assetId=".$self->session->db->quote($self->getId)." and fieldName=".$self->session->db->quote($fieldName)); + $self->session->db->write("insert into Shortcut_overrides values (".$self->session->db->quote($self->getId).",".$self->session->db->quote($fieldName).",".$self->session->db->quote($value).")"); + $self->uncacheOverrides; + $self->getShortcutOriginal->purgeCache(); + return $self->www_manageOverrides; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index e5fb16462..f4ffb1010 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -81,13 +81,6 @@ sub definition { label => $i18n->get("imageViewSize label"), hoverHelp => $i18n->get("imageViewSize description"), }, - imageViewCompression => { - tab => "properties", - fieldType => "integer", - defaultValue => 0, - label => $i18n->get("imageViewCompression label"), - hoverHelp => $i18n->get("imageViewCompression description"), - }, imageThumbnailSize => { tab => "properties", fieldType => "integer", diff --git a/t/Asset/File/Image/Photo/exif.t b/t/Asset/File/Image/Photo/exif.t index 81297cb96..6dc256ba5 100644 --- a/t/Asset/File/Image/Photo/exif.t +++ b/t/Asset/File/Image/Photo/exif.t @@ -19,6 +19,8 @@ use Scalar::Util qw( blessed ); use WebGUI::Test; use WebGUI::Session; use Test::More; +use JSON; +use Image::ExifTool; #---------------------------------------------------------------------------- # Init @@ -52,5 +54,26 @@ $photo = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", }); -$photo->setFile( WebGUI::Test->getCollateralPath("lamp.jpg") ); -my $exif = $photo->get("exifData"); +$photo->setFile( WebGUI::Test->getTestCollateralPath("lamp.jpg") ); +my $exifData = $photo->get("exifData"); + +ok( defined $exifData, "exifData column is defined after setFile" ); + +my $exif = jsonToObj( $exifData ); +ok( ref $exif eq "HASH", "exifData is JSON hash" ); + +#---------------------------------------------------------------------------- +# Test getTemplateVars exif data +my $var = $photo->getTemplateVars; + +is_deeply( + [ sort keys %$exif ], + [ sort map { s/exif_// } keys %$var ], + "getTemplateVars gets a hash of all exif tags", +); + +is_deeply( + [ sort keys %$exif ], + [ sort map { $_->{tag} } @{ $var->{exifLoop} } ], + "getTemplateVars gets a loop over the tags", +); From 55135c8147663765a19677a3d8cc2bf3f4a606e5 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Tue, 6 Nov 2007 04:13:43 +0000 Subject: [PATCH 12/15] more work. completed GalleryAlbum. started Gallery. --- docs/upgrades/upgrade_7.4.10-7.5.0.pl | 2 +- lib/WebGUI/Asset/File/Image/Photo.pm | 82 +++- lib/WebGUI/Asset/Wobject/Gallery.pm | 311 ++++++++++++++- lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 461 ++++++++++++++++++++++- sbin/testEnvironment.pl | 1 + 5 files changed, 825 insertions(+), 32 deletions(-) diff --git a/docs/upgrades/upgrade_7.4.10-7.5.0.pl b/docs/upgrades/upgrade_7.4.10-7.5.0.pl index daa0c5bad..11518cb43 100644 --- a/docs/upgrades/upgrade_7.4.10-7.5.0.pl +++ b/docs/upgrades/upgrade_7.4.10-7.5.0.pl @@ -138,7 +138,7 @@ CREATE TABLE IF NOT EXISTS Gallery ( imageViewSize INT, imageThumbnailSize INT, maxSpacePerUser VARCHAR(20), - richEditIdFileComment VARCHAR(22) BINARY, + richEditIdComment VARCHAR(22) BINARY, templateIdAddArchive VARCHAR(22) BINARY, templateIdDeleteAlbum VARCHAR(22) BINARY, templateIdDeleteFile VARCHAR(22) BINARY, diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index c5f075f48..ccbf0dd44 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -22,6 +22,19 @@ use Image::ExifTool qw( :Public ); use JSON; use Tie::IxHash; +our $magick; +BEGIN { + if (eval { require Graphics::Magick; 1 }) { + $magick = 'Graphics::Magick'; + } + elsif (eval { require Image::Magick; 1 }) { + $magick = 'Image::Magick'; + } + else { + croak "You must have either Graphics::Magick or Image::Magick installed to run WebGUI.\n"; + } +} + use WebGUI::Friends; use WebGUI::Utility; @@ -50,12 +63,6 @@ These methods are available from this class: Define the properties of the Photo asset. -=head3 session - -=head3 definition - -A hash reference passed in from a subclass definition. - =cut sub definition { @@ -91,6 +98,7 @@ sub definition { i18n => 'Asset_Photo', properties => \%properties, }; + return $class->SUPER::definition($session, $definition); } @@ -107,7 +115,12 @@ sub appendTemplateVarsForCommentForm { my $self = shift; my $var = shift; - # ... + $var->{commentForm_start} + = WebGUI::Form::formHeader( $session ); + . WebGUI::Form::hidden( $session, { name => "func", value => "addCommentSave" } ) + ; + $var->{commentForm_end} + = WebGUI::Form::formFooter( $session ); return $var; } @@ -142,6 +155,28 @@ sub applyConstraints { #---------------------------------------------------------------------------- +=head2 canComment ( [userId] ) + +Returns true if the user can comment on this asset. C is a WebGUI +user ID. If no userId is passed, check the current user. + +Users can comment on this Photo if they are allowed to view and the album +allows comments. + +=cut + +sub canComment { + my $self = shift; + my $userId = shift || $self->session->user->userId; + my $album = $self->getParent; + + return 0 if !$self->canView($userId); + + return $album->canComment($userId); +} + +#---------------------------------------------------------------------------- + =head2 canEdit ( [userId] ) Returns true if the user can edit this asset. C is a WebGUI user ID. @@ -399,10 +434,16 @@ sub makeResolutions { # Get default if necessary $resolutions ||= $self->getGallery->getImageResolutions; + + my $storage = $self->getStorageLocation; + my $photo = $magick->new; + $photo->Read( $storage->get( $self->get("filename") ) ); for my $res ( @$resolutions ) { # carp if resolution is bad - # ... + my $newPhoto = $photo->Clone; + $newPhoto->Resize( geometry => $res ); + $newPhoto->Write( $storage->getFilePath( "$res.jpg" ) ); } } @@ -546,7 +587,14 @@ sub view { $var->{ controls } = $self->getToolbar; $var->{ fileUrl } = $self->getFileUrl; $var->{ fileIcon } = $self->getFileIconUrl; + + $self->appendTemplateVarsForCommentForm( $var ); + my $p = $self->getCommentPaginator; + $var->{ commentLoop } = $p->getPageData; + $var->{ commentLoop_urlNext } = [$p->getNextPageLink]->[0]; + $var->{ commentLoop_urlPrev } = [$p->getPrevPageLink]->[0]; + $var->{ commentLoop_pageBar } = $p->getBarAdvanced; return $self->processTemplate($var, undef, $self->{_viewTemplate}); } @@ -561,9 +609,22 @@ Save a new comment to the Photo. sub www_addCommentSave { my $self = shift; + + return $self->session->privilege->insufficient unless $self->canComment; + my $form = $self->session; - # ... + my $properties = { + assetId => $self->getId, + creationDate => time, + userId => $session->user->userId, + visitorIp => ( $session->user->userId eq "1" ? $session->env("REMOTE_ADDR") : undef ), + bodyText => $form->get("bodyText"), + }; + + $self->setComment( "new", $properties ); + + return $self->www_view; } #---------------------------------------------------------------------------- @@ -582,7 +643,6 @@ sub www_delete { my $var = $self->getTemplateVar; $var->{ url_yes } = $self->getUrl("func=deleteConfirm"); - $var->{ url_no } = $self->getUrl(); return $self->processStyle( $self->processTemplate( $var, $self->getGallery->get("templateIdDeletePhoto") ) @@ -705,7 +765,7 @@ sub www_edit { return $self->processStyle( - $self->processTemplate($var, $self->getGallery->get("templateIdEditFile")) + $self->processTemplate( $var, $self->getGallery->getTemplateIdEditFile ) ); } diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index f4ffb1010..1133f0c6a 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -18,6 +18,14 @@ use WebGUI::International; use WebGUI::Utility; use base 'WebGUI::Asset::Wobject'; +=head1 NAME + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 METHODS + #------------------------------------------------------------------- =head2 definition ( ) @@ -69,7 +77,7 @@ sub definition { imageResolutions => { tab => "properties", fieldType => "checkList", - defaultValue => ['800','1024','1200','1600'], + defaultValue => ['800', '1024', '1200', '1600', '2880'], options => \%imageResolutionOptions, label => $i18n->get("imageResolutions label"), hoverHelp => $i18n->get("imageResolutions description"), @@ -95,7 +103,7 @@ sub definition { label => $i18n->get("maxSpacePerUser label"), hoverHelp => $i18n->get("maxSpacePerUser description"), }, - richEditIdFileComment => { + richEditIdComment => { tab => "properties", fieldType => "selectRichEditor", defaultValue => undef, # Rich Editor for Posts @@ -246,10 +254,197 @@ sub definition { #---------------------------------------------------------------------------- -=head2 getTemplateEditFile ( ) +=head2 canAddFile ( [userId] ) -Returns an instance of a WebGUI::Asset::Template for the template to edit -files in this gallery +Returns true if the user can add files to this Gallery. C is the +userId to check. If no userId is passed, will check the current user. + +Users can add files to this gallery if they are part of the C + +=cut + +sub canAddFile { + my $self = shift; + my $userId = shift; + + my $user = $userId + ? WebGUI::User->new( $self->session, $userId ) + : $self->session->user + ; + + return $user->isInGroup( $self->get("groupIdAddFile") ); +} + +#---------------------------------------------------------------------------- + +=head2 canComment ( [userId] ) + +Returns true if the user can comment on this Gallery. C is the userId +to check. If no userId is passed, will check the current user. + +Users can comment on this gallery if they are part of the +C group. + +=cut + +sub canComment { + my $self = shift; + my $userId = shift; + + my $user = $userId + ? WebGUI::User->new( $self->session, $userId ) + : $self->session->user + ; + + return $user->isInGroup( $self->get("groupIdAddComment") ); +} + +#---------------------------------------------------------------------------- + +=head2 canEdit ( [userId] ) + +Returns true if the user can edit this Gallery. C is the userId to +check. If no userId is passed, will check the current user. + +Users can edit this gallery if they are part of the C group. + +=cut + +sub canEdit { + my $self = shift; + my $userId = shift; + + my $user = $userId + ? WebGUI::User->new( $self->session, $userId ) + : $self->session->user + ; + + return $user->isInGroup( $self->get("groupIdEdit") ); +} + +#---------------------------------------------------------------------------- + +=head2 canView ( [userId] ) + +Returns true if the user can view this Gallery. C is the userId to +check. If no userId is passed, will check the current user. + +Users can view this gallery if they are part of the C group. + +=cut + +sub canView { + my $self = shift; + my $userId = shift; + + my $user = $userId + ? WebGUI::User->new( $self->session, $userId ) + : $self->session->user + ; + + return $user->isInGroup( $self->get("groupIdView") ); +} + +#---------------------------------------------------------------------------- + +=head2 getAlbumIds ( ) + +Gets an array reference of all the album IDs under this Gallery. + +=cut + +sub getAlbumIds { + my $self = shift; + + return $self->getLineage(['descendants'], { + includeOnlyClasses => ['WebGUI::Asset::Wobject::GalleryAlbum'], + }); +} + +#---------------------------------------------------------------------------- + +=head2 getAlbumPaginator ( ) + +Gets a WebGUI::Paginator for all the albums in this Gallery. + +=cut + +sub getAlbumPaginator { + my $self = shift; + + my $p = WebGUI::Paginator->new( $self->session, $self->getUrl ); + $p->setDataByArrayRef( $self->getAlbumIds ); + + return $p; +} + +#---------------------------------------------------------------------------- + +=head2 getAssetClassForFile ( filepath ) + +Gets the WebGUI Asset class for the file at the given C. Returns +undef if the file cannot be saved under this Gallery. + +=cut + +sub getAssetClassForFile { + my $self = shift; + my $filepath = shift; + + # Checks for Photo assets + if ( $filepath =~ /\.(jpe?g|gif|png)/i ) { + return "WebGUI::Asset::File::Image::Photo"; + } + + # No class found + return undef; +} + +#---------------------------------------------------------------------------- + +=head2 getImageResolutions ( ) + +Gets an array reference of the image resolutions to create for image-type +assets in this gallery. + +=cut + +sub getImageResolutions { + my $self = shift; + return [ split /\n/, $self->get("imageResolutions") ]; +} + +#---------------------------------------------------------------------------- + +=head2 getSearchPaginator ( options ) + +Gets a WebGUI::Paginator for a search. C is a hash reference of +options with the following keys: + + keywords => Keywords to search on + +Other keys are valid, see C for details. + +=cut + +sub getSearchPaginator { + my $self = shift; + my $rules = shift; + + $rules->{ lineage } = $self->get("lineage"); + + my $search = WebGUI::Search->new( $self->session ); + $search->search( $rules ); + my $paginator = $search->getPaginatorResultSet( $self->getUrl('func=search') ); + + return $paginator; +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateIdEditFile ( ) + +Returns the ID for the template to edit a file. NOTE: This may need to change in the future to take into account different classes of files inside of a Gallery. @@ -258,7 +453,72 @@ classes of files inside of a Gallery. sub getTemplateEditFile { my $self = shift; - return WebGUI::Asset::Template->new($self->session, $self->get("templateIdEditFile")); + return $self->get("templateIdEditFile"); +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateVars ( ) + +Gets a hash reference of vars common to all templates. + +=cut + +sub getTemplateVars { + my $self = shift; + my $var = $self->get; + + return $var; +} + +#---------------------------------------------------------------------------- + +=head2 getUserFileIds ( [userId] ) + +Gets an array reference of assetIds for the files in this Gallery owned by +the specified C. If userId is not defined, will use the current user. + +=cut + +sub getUserFileIds { + my $self = shift; + my $userId = shift || $self->session->user->userId; + + my $db = $self->session->db; + + # Note: We use excludeClasses to avoid getting GalleryAlbum assets + my $assetIds + = $self->getLineage( ['descendants'], { + excludeClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ], + whereClause => "ownerUserId = " . $db->quote($userId), + }); + + return $assetIds; +} + +#---------------------------------------------------------------------------- + +=head2 getUserAlbumIds ( [userId] ) + +Gets an array reference of assetIds for the GalleryAlbums in this Gallery +owned by the specified C. If userId is not defined, will use the +current user. + +=cut + +sub getUserAlbumIds { + my $self = shift; + my $userId = shift || $self->session->user->userId; + + my $db = $self->session->db; + + my $assetIds + = $self->getLineage( ['descendants'], { + includeOnlyClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ], + whereClause => "ownerUserId = " . $db->quote($userId), + }); + + return $assetIds; } #---------------------------------------------------------------------------- @@ -277,7 +537,7 @@ sub prepareView { $self->{_viewTemplate} = $template; } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- =head2 view ( ) @@ -294,4 +554,41 @@ sub view { return $self->processTemplate($var, undef, $self->{_viewTemplate}); } +#---------------------------------------------------------------------------- + +=head2 www_listAlbums ( ) + +Show a paginated list of the albums in this gallery. + +=cut + +sub www_listAlbums { + my $self = shift; + +} + +#---------------------------------------------------------------------------- + +=head2 www_listAlbumsRss ( ) + +=cut + +#---------------------------------------------------------------------------- + +=head2 www_search ( ) + +=cut + +#---------------------------------------------------------------------------- + +=head2 www_userGallery ( ) + +=cut + +#---------------------------------------------------------------------------- + +=head2 www_userGalleryRss ( ) + +=cut + 1; diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index 85f1d2426..94ab45b36 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -13,18 +13,28 @@ $VERSION = "1.0.0"; #------------------------------------------------------------------- use strict; +use base 'WebGUI::Asset::Wobject'; use Tie::IxHash; use WebGUI::International; use WebGUI::Utility; -use base 'WebGUI::Asset::Wobject'; + +use Archive::Any; + +=head1 NAME + +=head1 DESCRIPTION + +=head1 SYNOPSIS + +=head1 DIAGNOSTICS + +=head1 METHODS #------------------------------------------------------------------- =head2 definition ( ) -defines wobject properties for New Wobject instances. You absolutely need -this method in your new Wobjects. If you choose to "autoGenerateForms", the -getEditForm method is unnecessary/redundant/useless. +Define wobject properties for new GalleryAlbum wobjects. =cut @@ -32,7 +42,7 @@ sub definition { my $class = shift; my $session = shift; my $definition = shift; - my $i18n = WebGUI::International->new($session, 'Asset_GalleryAlbum'); + my $i18n = __PACKAGE__->i18n($session); tie my %properties, 'Tie::IxHash', ( allowComments => { @@ -63,6 +73,131 @@ sub definition { #---------------------------------------------------------------------------- +=head2 addArchive ( filename, properties ) + +Add an archive of Files to this Album. C is the full path of the +archive. C is a hash reference of properties to assign to the +photos in the archive. + +Will croak if cannot read the archive or if the archive will extract itself to +a directory outside of the storage location. + +Will only handle file types handled by the parent Gallery. + +=cut + +sub addArchive { + my $self = shift; + my $filename = shift; + my $properties = shift; + + my $archive = Archive::Any->new( $filename ); + + croak "Archive will extract to directory outside of storage location!" + if $archive->is_naughty; + + use File::Temp qw{ tempdir }; + my $tempdirName = tempdir( "WebGUI-Gallery-XXXXXXXX", TMPDIR => 1, CLEANUP => 1); + $archive->extract( $tempdir ); + + opendir my $dh, $tempdirName or die "Could not open temp dir $tempdirName: $!"; + for my $file (readdir $dh) { + my $class = $gallery->getAssetClassForFile( $file ); + next unless $class; # class is undef for those files the Gallery can't handle + + $self->addChild({ + className => $class, + title => $properties->{title}, + menuTitle => $properties->{menuTitle} || $properties->{title}, + synopsis => $properties->{synopsis}, + }); + } + closedir $dh; +} + +#---------------------------------------------------------------------------- + +=head2 appendTemplateVarsFileLoop ( vars, options ) + +Append template vars for a file loop with the specified options. C is +a hash reference to add the file loop to. C is a hash reference of +options with the following keys: + + perpage => number | "all" + If "all", no pagination will be done. + url => url + The URL to the current page + +Returns the hash reference for convenience. + +=cut + +sub appendTemplateVarsFileLoop { + my $self = shift; + my $var = shift; + my $options = shift; + + my @assetIds; + if ($options->{perpage} eq "all") { + @assetIds = @{ $self->getFileIds }; + } + else { + @assetIds = @{ $self->getFilePaginator($options->{url})->getPageData }; + } + + for my $assetId (@assetIds) { + push @{$var->{file_loop}}, + WebGUI::Asset->newByDynamicClass($session, $assetId)->getTemplateVars; + } + + return $var; +} + +#---------------------------------------------------------------------------- + +=head2 canAddFile ( [userId] ) + +Returns true if the user can add a file to this album. C is a WebGUI +user ID. If no userId is passed, will check the current user. + +Users can add files to this album if they are the owner, or if +C is true and the Gallery allows them to add files. + +=cut + +sub canAddFile { + my $self = shift; + my $userId = shift || $self->session->user->userId; + + return 1 if $userId eq $self->get("ownerUserId"); + return 1 if $self->get("othersCanAdd") && $gallery->canAddFile( $userId ); +} + +#---------------------------------------------------------------------------- + +=head2 canComment ( [userId] ) + +Returns true if the user is allowed to comment on files in this Album. +C is a WebGUI user ID. If no userId is passed, will check the current +user. + +Users can comment on files if C is true and the parent Gallery +allows comments. + +=cut + +sub canComment { + my $self = shift; + my $userId = shift || $self->session->user->userId; + my $gallery = $self->getParent; + + return 0 if !$self->get("allowComments"); + + return $gallery->canComment( $userId ); +} + +#---------------------------------------------------------------------------- + =head2 canEdit ( [userId] ) Returns true if the user can edit this asset. C is a WebGUI user ID. @@ -71,6 +206,8 @@ If no userId is passed, check the current user. Users can edit this GalleryAlbum if they are the owner, or if they can edit the Gallery parent. +Also handles adding of child assets by calling C. + =cut sub canEdit { @@ -78,11 +215,116 @@ sub canEdit { my $userId = shift || $self->session->user->userId; my $gallery = $self->getParent; - return 1 if $userId eq $self->get("ownerUserId"); - return $gallery->canEdit($userId); + # Handle adding a photo + if ( $form->get("func") eq "add" ) { + return $self->canAddFile; + } + else { + return 1 if $userId eq $self->get("ownerUserId"); + + return $gallery->canEdit($userId); + } } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- + +=head2 canView ( [userId] ) + +Returns true if the user can view this asset. C is a WebGUI user ID. +If no userId is given, checks the current user. + +=cut + +# Inherited from superclass + +#---------------------------------------------------------------------------- + +=head2 i18n ( [ session ] ) + +Get a WebGUI::International object for this class. + +Can be called as a class method, in which case a WebGUI::Session object +must be passed in. + +NOTE: This method can NOT be inherited, due to a current limitation +in the i18n system. You must ALWAYS call this with C<__PACKAGE__> + +=cut + +sub i18n { + my $self = shift; + my $session = shift; + + return WebGUI::International->new($session, "Asset_GalleryAlbum"); +} + +#---------------------------------------------------------------------------- + +=head2 getFileIds ( ) + +Gets an array reference of asset IDs for all the files in this album. + +=cut + +sub getFileIds { + my $self = shift; + my $gallery = $self->getParent; + + return $self->assetLineage( ['descendants'], { + includeOnlyClasses => $gallery->getAllAssetClassesForFile, + }); +} + +#---------------------------------------------------------------------------- + +=head2 getFilePaginator ( paginatorUrl ) + +Gets a WebGUI::Paginator for the files in this album. C is the +url to the current page that will be given to the paginator. + +=cut + +sub getFilePaginator { + my $self = shift; + my $url = shift; + + my $p = WebGUI::Paginator->new( $self->session, $url ); + $p->setDataByArrayRef( $self->getFileIds ); + + return $p; +} + +#---------------------------------------------------------------------------- + +=head2 getTemplateVars ( ) + +Gets template vars common to all views. + +=cut + +sub getTemplateVars { + my $self = shift; + my $var = $self->get; + + $var->{ url } = $self->getUrl; + + return $var; +} + +#---------------------------------------------------------------------------- + +=head2 othersCanAdd ( ) + +Returns true if people other than the owner can add files to this album. + +=cut + +sub othersCanAdd { + my $self = shift; + return $self->get("othersCanAdd"); +} + +#---------------------------------------------------------------------------- =head2 prepareView ( ) @@ -93,12 +335,30 @@ See WebGUI::Asset::prepareView() for details. sub prepareView { my $self = shift; $self->SUPER::prepareView(); - my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + + my $templateId = $self->getParent->get("templateIdViewAlbum"); + + my $template + = WebGUI::Asset::Template->new($self->session, $templateId); $template->prepare; + $self->{_viewTemplate} = $template; } -#------------------------------------------------------------------- +#---------------------------------------------------------------------------- + +=head2 processStyle ( ) + +Gets the parent Gallery's style template + +=cut + +sub processStyle { + my $self = shift; + return $self->getParent->processStyle(@_); +} + +#---------------------------------------------------------------------------- =head2 view ( ) @@ -108,11 +368,186 @@ to be displayed within the page style. =cut sub view { - my $self = shift; - my $session = $self->session; - my $var = $self->get; + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + + $self->appendTemplateVarsFileLoop( $var ); return $self->processTemplate($var, undef, $self->{_viewTemplate}); } +#---------------------------------------------------------------------------- + +=head2 view_slideshow ( ) + +method called by the www_slideshow method. Returns a processed template to be +displayed within the page style. + +=cut + +sub view_slideshow { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + + $self->appendTemplateVarsFileLoop( $var, { perpage => "all" } ); + + return $self->processTemplate($var, $self->getParent->get("templateIdSlideshow")); +} + +#---------------------------------------------------------------------------- + +=head2 view_thumbnails ( ) + +method called by the www_thumbnails method. Returns a processed template to be +displayed within the page style. + +=cut + +sub view_thumbnails { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + + $self->appendTemplateVarsFileLoop( $var, { perpage => "all" } ); + + return $self->processTemplate($var, $self->getParent->get("templateIdThumbnails")); +} + +#---------------------------------------------------------------------------- + +=head2 www_addArchive ( ) + +Show the form to add an archive of files to this gallery. + +=cut + +sub www_addArchive { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canAddFile; + + my $var = $self->getTemplateVars; + + return $self->processStyle( + $self->processTemplate($var, $self->getParent->get("templateIdAddArchive")) + ); +} + +#----------------------------------------------------------------------------- + +=head2 www_addArchiveSave ( ) + +Process the form for adding an archive. + +=cut + +sub www_addArchiveSave { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canAddfile; + + my $form = $self->session->form; + my $properties = { + keywords => $form->get("keywords"), + friendsOnly => $form->get("friendsOnly"), + }; + + my $storage = $form->get("archive", "File"); + my $filename = $storage->getFilePath( $storage->getFiles->[0] ); + + $self->addArchive( $filename, $properties ); + + return $self->www_view; +} + +#----------------------------------------------------------------------------- + +=head2 www_delete ( ) + +Show the form to confirm deleting this album and all files inside of it. + +=cut + +sub www_delete { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + my $var = $self->getTemplateVars; + $var->{ url_yes } = $self->getUrl("?func=deleteConfirm"); + + return $self->processStyle( + $self->processTemplate( $var, $self->getParent->get("templateIdDeleteAlbum") ) + ); +} + +#----------------------------------------------------------------------------- + +=head2 www_deleteConfirm ( ) + +Confirm deleting this album and all files inside of it. + +=cut + +sub www_deleteConfirm { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + $self->purge; + + return $self->getParent->www_view; +} + +#----------------------------------------------------------------------------- + +=head2 www_slideshow ( ) + +Show a slideshow-type view of this album. The slideshow itself is powered by +a javascript application in the template. + +=cut + +sub www_slideshow { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canView; + + return $self->processStyle( $self->view_slideshow ); +} + +#---------------------------------------------------------------------------- + +=head2 www_thumbnails ( ) + +Show the thumbnails for the album. + +=cut + +sub www_thumbnails { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canView; + + return $self->processStyle( $self->view_thumbnails ); +} + +#---------------------------------------------------------------------------- + +=head2 www_viewRss ( ) + +Display an RSS feed for this album. + +=cut + +sub www_viewRss { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canView; + + +} + 1; diff --git a/sbin/testEnvironment.pl b/sbin/testEnvironment.pl index 0f571f660..d6006238d 100644 --- a/sbin/testEnvironment.pl +++ b/sbin/testEnvironment.pl @@ -123,6 +123,7 @@ checkModule("Weather::Com::Finder","0.5.1"); checkModule("Class::InsideOut","1.06"); checkModule("HTML::TagCloud","0.34"); checkModule("Image::ExifTool","7.00"); +checkModule("Archive::Any","0.093"); ################################### From 337103cb5874b238c78af56a78d4a8da2d2ff459 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Sat, 8 Dec 2007 09:00:15 +0000 Subject: [PATCH 13/15] a weeks worth of changes --- www/extras/yui-carousel/carousel.css | 99 ++ www/extras/yui-carousel/carousel.js | 1567 +++++++++++++++++++++++ www/extras/yui-carousel/carousel_min.js | 115 ++ 3 files changed, 1781 insertions(+) create mode 100644 www/extras/yui-carousel/carousel.css create mode 100644 www/extras/yui-carousel/carousel.js create mode 100644 www/extras/yui-carousel/carousel_min.js diff --git a/www/extras/yui-carousel/carousel.css b/www/extras/yui-carousel/carousel.css new file mode 100644 index 000000000..59475a4da --- /dev/null +++ b/www/extras/yui-carousel/carousel.css @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2006-2007, Bill W. Scott + * All rights reserved. + * + * This work is licensed under the Creative Commons Attribution 2.5 License. To view a copy + * of this license, visit http://creativecommons.org/licenses/by/2.5/ or send a letter to + * Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. + * + * This work was created by Bill Scott (billwscott.com, looksgoodworkswell.com). + * + * The only attribution I require is to keep this notice of copyright & license + * in this original source file. + * + * Version 0.6.1 - 07.08.2007 + * + */ + +/** + * Standard Configuration. It is advised that this section NOT be modified as the + * carousel.js expects the behavior outlined below. + **/ +.carousel-component { + position:relative; + overflow:hidden; /* causes the clipping */ + display:none; /* component turns it on when first item is rendered */ + +} + +.carousel-component ul.carousel-list { + width:10000000px; + position:relative; + z-index:1; +} + +.carousel-component .carousel-list li { + float:left; + list-style:none; + overflow:hidden; + + +} + +/** + * VERTICAL CAROUSEL DEFAULTS + **/ +.carousel-component .carousel-vertical li { + margin-bottom:0px; + + /* Fix for extra spacing in IE */ + float:left; + clear:left; + + /* Force the LI to respect the HEIGHT specified */ + overflow:hidden; + display:block; +} + +/* For vertical carousel, not set, width defaults to auto */ +/* Note if you explicitly set width to auto, this might cause */ +/* problems with Safari... as in up/down button not working in some examples. */ +.carousel-component ul.carousel-vertical { +/* width:auto;*/ +} + +.carousel-component .carousel-clip-region { + overflow:hidden; /* Secret to the clipping */ + margin:0px auto; + position:relative; +} + +/** + * ============================================================================== + * Safe to override. It is safe to override background, padding, margin, color, + * text alignment, fonts, etc. Define a separate CSS file and override your style + * preferences. + **/ + +.carousel-component { + background:#e2edfa; + padding:0px; + -moz-border-radius:6px; + color:#618cbe; +} +.carousel-component ul.carousel-list { + margin:0px; + padding:0px; + line-height:0px; +} +.carousel-component .carousel-list li { + text-align:center; + margin:0px; + padding:0px; + font:10px verdana,arial,sans-serif; + color:#666; +} +.carousel-component .carousel-vertical li { +} +.carousel-component ul.carousel-vertical { +} \ No newline at end of file diff --git a/www/extras/yui-carousel/carousel.js b/www/extras/yui-carousel/carousel.js new file mode 100644 index 000000000..34f3f26d0 --- /dev/null +++ b/www/extras/yui-carousel/carousel.js @@ -0,0 +1,1567 @@ +/** + * Copyright (c) 2006-2007, Bill W. Scott + * All rights reserved. + * + * This work is licensed under the Creative Commons Attribution 2.5 License. To view a copy + * of this license, visit http://creativecommons.org/licenses/by/2.5/ or send a letter to + * Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. + * + * This work was created by Bill Scott (billwscott.com, looksgoodworkswell.com). + * + * The only attribution I require is to keep this notice of copyright & license + * in this original source file. + * + * Version 0.6.1 - 07.08.2007 + * + */ +YAHOO.namespace("extension"); + +/** +* @class +* The carousel class manages a content list (a set of LI elements within an UL list) that can be displayed horizontally or vertically. The content can be scrolled back and forth with or without animation. The content can reference static HTML content or the list items can be created dynamically on-the-fly (with or without Ajax). The navigation and event handling can be externalized from the class. +* @param {object|string} carouselElementID The element ID (id name or id object) of the DIV that will become a carousel +* @param {object} carouselCfg The configuration object literal containing the configuration that should be set for this module. See configuration documentation for more details. +* @constructor +*/ +YAHOO.extension.Carousel = function(carouselElementID, carouselCfg) { + this.init(carouselElementID, carouselCfg); + }; + +YAHOO.extension.Carousel.prototype = { + + + /** + * Constant denoting that the carousel size is unbounded (no limits set on scrolling) + * @type number + */ + UNBOUNDED_SIZE: 1000000, + + /** + * Initializes the carousel object and all of its local members. + * @param {object|string} carouselElementID The element ID (id name or id object) + * of the DIV that will become a carousel + * @param {object} carouselCfg The configuration object literal containing the + * configuration that should be set for this module. See configuration documentation for more details. + */ + init: function(carouselElementID, carouselCfg) { + + var oThis = this; + + /** + * For deprecation. + * getItem is the replacement for getCarouselItem + */ + this.getCarouselItem = this.getItem; + + // CSS style classes + var carouselListClass = "carousel-list"; + var carouselClipRegionClass = "carousel-clip-region"; + var carouselNextClass = "carousel-next"; + var carouselPrevClass = "carousel-prev"; + + this._carouselElemID = carouselElementID; + this.carouselElem = YAHOO.util.Dom.get(carouselElementID); + + this._prevEnabled = true; + this._nextEnabled = true; + + // Create the config object + this.cfg = new YAHOO.util.Config(this); + + /** + * scrollBeforeAmount property. + * Normally, set to 0, this is how much you are allowed to + * scroll below the first item. Setting it to 2 allows you + * to scroll to the -1 position. + * However, the load handlers will not be asked to load anything + * below 1. + * + * A good example is the spotlight example which treats the middle item + * as the "selected" item. It sets scrollBeforeAmount to 2 and + * scrollAfterAmount to 2. + * + * The actual items loaded would be from 1 to 15 (size=15), + * but scrolling range would be -1 to 17. + */ + this.cfg.addProperty("scrollBeforeAmount", { + value:0, + handler: function(type, args, carouselElem) { + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * scrollAfterAmount property. + * Normally, set to 0, this is how much you are allowed to + * scroll past the size. Setting it to 2 allows you + * to scroll to the size+scrollAfterAmount position. + * However, the load handlers will not be asked to load anything + * beyond size. + * + * A good example is the spotlight example which treats the middle item + * as the "selected" item. It sets scrollBeforeAmount to 2 and + * scrollAfterAmount to 2. + * + * The actual items loaded would be from 1 to 15 (size=15), + * but scrolling range would be -1 to 17. + */ + this.cfg.addProperty("scrollAfterAmount", { + value:0, + handler: function(type, args, carouselElem) { + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * loadOnStart property. + * If true, will call loadInitHandler on startup. + * If false, will not. Useful for delaying the initialization + * of the carousel for a later time after creation. + */ + this.cfg.addProperty("loadOnStart", { + value:true, + handler: function(type, args, carouselElem) { + // no action, only affects startup + }, + validator: oThis.cfg.checkBoolean + } ); + + /** + * orientation property. + * Either "horizontal" or "vertical". Changes carousel from a + * left/right style carousel to a up/down style carousel. + */ + this.cfg.addProperty("orientation", { + value:"horizontal", + handler: function(type, args, carouselElem) { + oThis.reload(); + }, + validator: function(orientation) { + if(typeof orientation == "string") { + return ("horizontal,vertical".indexOf(orientation.toLowerCase()) != -1); + } else { + return false; + } + } + } ); + + /** + * size property. + * The upper bound for scrolling in the 'next' set of content. + * Set to a large value by default (this means unlimited scrolling.) + */ + this.cfg.addProperty("size", { + value:this.UNBOUNDED_SIZE, + handler: function(type, args, carouselElem) { + oThis.reload(); + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * numVisible property. + * The number of items that will be visible. + */ + this.cfg.addProperty("numVisible", { + value:3, + handler: function(type, args, carouselElem) { + oThis.reload(); + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * firstVisible property. + * Sets which item should be the first visible item in the carousel. Use to set which item will + * display as the first element when the carousel is first displayed. After the carousel is created, + * you can manipulate which item is the first visible by using the moveTo() or scrollTo() convenience + * methods. Can be < 1 or greater than size if the scrollBeforeAmount or scrollAmountAfter has been set + * to non-zero values. + */ + this.cfg.addProperty("firstVisible", { + value:1, + handler: function(type, args, carouselElem) { + oThis.moveTo(args[0]); + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * scrollInc property. + * The number of items to scroll by. Think of this as the page increment. + */ + this.cfg.addProperty("scrollInc", { + value:3, + handler: function(type, args, carouselElem) { + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * animationSpeed property. + * The time (in seconds) it takes to complete the scroll animation. + * If set to 0, animated transitions are turned off and the new page of content is + * moved immdediately into place. + */ + this.cfg.addProperty("animationSpeed", { + value:0.25, + handler: function(type, args, carouselElem) { + oThis.animationSpeed = args[0]; + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * animationMethod property. + * The YAHOO.util.Easing + * method. + */ + this.cfg.addProperty("animationMethod", { + value: YAHOO.util.Easing.easeOut, + handler: function(type, args, carouselElem) { + } + } ); + + /** + * animationCompleteHandler property. + * JavaScript function that is called when the Carousel finishes animation + * after a next or previous nagivation. + * Only invoked if animationSpeed > 0. + * Two parameters are passed: type (set to 'onAnimationComplete') and + * args array (args[0] = direction [either: 'next' or 'previous']). + */ + this.cfg.addProperty("animationCompleteHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._animationCompleteEvt) { + oThis._animationCompleteEvt.unsubscribe(oThis._currAnimationCompleteHandler, oThis); + } + oThis._currAnimationCompleteHandler = args[0]; + if(oThis._currAnimationCompleteHandler) { + if(!oThis._animationCompleteEvt) { + oThis._animationCompleteEvt = new YAHOO.util.CustomEvent("onAnimationComplete", oThis); + } + oThis._animationCompleteEvt.subscribe(oThis._currAnimationCompleteHandler, oThis); + } + } + } ); + + /** + * autoPlay property. + * Specifies how many milliseconds to periodically auto scroll the content. + * If set to 0 (default) then autoPlay is turned off. + * If the user interacts by clicking left or right navigation, autoPlay is turned off. + * You can restart autoPlay by calling the startAutoPlay(). + * If you externally control navigation (with your own event handlers) + * then you may want to turn off the autoPlay by callingstopAutoPlay() + */ + this.cfg.addProperty("autoPlay", { + value:0, + handler: function(type, args, carouselElem) { + var autoPlay = args[0]; + if(autoPlay > 0) + oThis.startAutoPlay(); + else + oThis.stopAutoPlay(); + } + } ); + + /** + * wrap property. + * Specifies whether to wrap when at the end of scrolled content. When the end is reached, + * the carousel will scroll backwards to the item 1 (the animationSpeed parameter is used to + * determine how quickly it should animate back to the start.) + * Ignored if the size attribute is not explicitly set + * (i.e., value equals YAHOO.extension.Carousel.UNBOUNDED_SIZE) + */ + this.cfg.addProperty("wrap", { + value:false, + handler: function(type, args, carouselElem) { + }, + validator: oThis.cfg.checkBoolean + } ); + + /** + * navMargin property. + * The margin space for the navigation controls. This is only useful for horizontal carousels + * in which you have embedded navigation controls. + * The navMargin allocates space between the left and right margins + * (each navMargin wide) giving space for the navigation controls. + */ + this.cfg.addProperty("navMargin", { + value:0, + handler: function(type, args, carouselElem) { + oThis.calculateSize(); + }, + validator: oThis.cfg.checkNumber + } ); + + /** + * revealAmount property. + * The amount to reveal of what comes before and what comes after the firstVisible and + * the lastVisible items. Setting this will provide a slight preview that something + * exists before and after, providing an additional hint for the user. + * The revealAmount will reveal the specified number of pixels for any item + * before the firstVisible and an item after the lastVisible. Additionall, the + * loadNextHandler and loadPrevHandler methods will be passed a start or end that guarantees + * the revealed item will be loaded (if set to non-zero). + */ + this.cfg.addProperty("revealAmount", { + value:0, + handler: function(type, args, carouselElem) { + oThis.reload(); + }, + validator: oThis.cfg.checkNumber + } ); + + // For backward compatibility. Deprecated. + this.cfg.addProperty("prevElementID", { + value: null, + handler: function(type, args, carouselElem) { + if(oThis._carouselPrev) { + YAHOO.util.Event.removeListener(oThis._carouselPrev, "click", oThis._scrollPrev); + } + oThis._prevElementID = args[0]; + if(oThis._prevElementID == null) { + oThis._carouselPrev = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, + "div", oThis.carouselElem)[0]; + } else { + oThis._carouselPrev = YAHOO.util.Dom.get(oThis._prevElementID); + } + YAHOO.util.Event.addListener(oThis._carouselPrev, "click", oThis._scrollPrev, oThis); + } + }); + + /** + * prevElement property. + * An element or elements that will provide the previous navigation control. + * prevElement may be a single element or an array of elements. The values may be strings denoting + * the ID of the element or the object itself. + * If supplied, then events are wired to this control to fire scroll events to move the carousel to + * the previous content. + * You may want to provide your own interaction for controlling the carousel. If + * so leave this unset and provide your own event handling mechanism. + */ + this.cfg.addProperty("prevElement", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._carouselPrev) { + YAHOO.util.Event.removeListener(oThis._carouselPrev, "click", oThis._scrollPrev); + } + oThis._prevElementID = args[0]; + if(oThis._prevElementID == null) { + oThis._carouselPrev = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, + "div", oThis.carouselElem)[0]; + } else { + oThis._carouselPrev = YAHOO.util.Dom.get(oThis._prevElementID); + } + YAHOO.util.Event.addListener(oThis._carouselPrev, "click", oThis._scrollPrev, oThis); + } + } ); + + // For backward compatibility. Deprecated. + this.cfg.addProperty("nextElementID", { + value: null, + handler: function(type, args, carouselElem) { + if(oThis._carouselNext) { + YAHOO.util.Event.removeListener(oThis._carouselNext, "click", oThis._scrollNext); + } + oThis._nextElementID = args[0]; + if(oThis._nextElementID == null) { + oThis._carouselNext = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, + "div", oThis.carouselElem); + } else { + oThis._carouselNext = YAHOO.util.Dom.get(oThis._nextElementID); + } + if(oThis._carouselNext) { + YAHOO.util.Event.addListener(oThis._carouselNext, "click", oThis._scrollNext, oThis); + } + } + }); + + /** + * nextElement property. + * An element or elements that will provide the next navigation control. + * nextElement may be a single element or an array of elements. The values may be strings denoting + * the ID of the element or the object itself. + * If supplied, then events are wired to this control to fire scroll events to move the carousel to + * the next content. + * You may want to provide your own interaction for controlling the carousel. If + * so leave this unset and provide your own event handling mechanism. + */ + this.cfg.addProperty("nextElement", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._carouselNext) { + YAHOO.util.Event.removeListener(oThis._carouselNext, "click", oThis._scrollNext); + } + oThis._nextElementID = args[0]; + if(oThis._nextElementID == null) { + oThis._carouselNext = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, + "div", oThis.carouselElem); + } else { + oThis._carouselNext = YAHOO.util.Dom.get(oThis._nextElementID); + } + if(oThis._carouselNext) { + YAHOO.util.Event.addListener(oThis._carouselNext, "click", oThis._scrollNext, oThis); + } + } + } ); + + /** + * loadInitHandler property. + * JavaScript function that is called when the Carousel needs to load + * the initial set of visible items. Two parameters are passed: + * type (set to 'onLoadInit') and an argument array (args[0] = start index, args[1] = last index). + */ + this.cfg.addProperty("loadInitHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._loadInitHandlerEvt) { + oThis._loadInitHandlerEvt.unsubscribe(oThis._currLoadInitHandler, oThis); + } + oThis._currLoadInitHandler = args[0]; + if(oThis._currLoadInitHandler) { + if(!oThis._loadInitHandlerEvt) { + oThis._loadInitHandlerEvt = new YAHOO.util.CustomEvent("onLoadInit", oThis); + } + oThis._loadInitHandlerEvt.subscribe(oThis._currLoadInitHandler, oThis); + } + } + } ); + + /** + * loadNextHandler property. + * JavaScript function that is called when the Carousel needs to load + * the next set of items (in response to the user navigating to the next set.) + * Two parameters are passed: type (set to 'onLoadNext') and + * args array (args[0] = start index, args[1] = last index). + */ + this.cfg.addProperty("loadNextHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._loadNextHandlerEvt) { + oThis._loadNextHandlerEvt.unsubscribe(oThis._currLoadNextHandler, oThis); + } + oThis._currLoadNextHandler = args[0]; + if(oThis._currLoadNextHandler) { + if(!oThis._loadNextHandlerEvt) { + oThis._loadNextHandlerEvt = new YAHOO.util.CustomEvent("onLoadNext", oThis); + } + oThis._loadNextHandlerEvt.subscribe(oThis._currLoadNextHandler, oThis); + } + } + } ); + + /** + * loadPrevHandler property. + * JavaScript function that is called when the Carousel needs to load + * the previous set of items (in response to the user navigating to the previous set.) + * Two parameters are passed: type (set to 'onLoadPrev') and args array + * (args[0] = start index, args[1] = last index). + */ + this.cfg.addProperty("loadPrevHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._loadPrevHandlerEvt) { + oThis._loadPrevHandlerEvt.unsubscribe(oThis._currLoadPrevHandler, oThis); + } + oThis._currLoadPrevHandler = args[0]; + if(oThis._currLoadPrevHandler) { + if(!oThis._loadPrevHandlerEvt) { + oThis._loadPrevHandlerEvt = new YAHOO.util.CustomEvent("onLoadPrev", oThis); + } + oThis._loadPrevHandlerEvt.subscribe(oThis._currLoadPrevHandler, oThis); + } + } + } ); + + /** + * prevButtonStateHandler property. + * JavaScript function that is called when the enabled state of the + * 'previous' control is changing. The responsibility of + * this method is to enable or disable the 'previous' control. + * Two parameters are passed to this method: type + * (which is set to "onPrevButtonStateChange") and args, + * an array that contains two values. + * The parameter args[0] is a flag denoting whether the 'previous' control + * is being enabled or disabled. The parameter args[1] is the element object + * derived from the prevElement parameter. + * If you do not supply a prevElement then you will need to track + * the elements that you would want to enable/disable while handling the state change. + */ + this.cfg.addProperty("prevButtonStateHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._currPrevButtonStateHandler) { + oThis._prevButtonStateHandlerEvt.unsubscribe(oThis._currPrevButtonStateHandler, oThis); + } + + oThis._currPrevButtonStateHandler = args[0]; + + if(oThis._currPrevButtonStateHandler) { + if(!oThis._prevButtonStateHandlerEvt) { + oThis._prevButtonStateHandlerEvt = new YAHOO.util.CustomEvent("onPrevButtonStateChange", oThis); + } + oThis._prevButtonStateHandlerEvt.subscribe(oThis._currPrevButtonStateHandler, oThis); + } + } + } ); + + /** + * nextButtonStateHandler property. + * JavaScript function that is called when the enabled state of the + * 'next' control is changing. The responsibility of + * this method is to enable or disable the 'next' control. + * Two parameters are passed to this method: type + * (which is set to "onNextButtonStateChange") and args, + * an array that contains two values. + * The parameter args[0] is a flag denoting whether the 'next' control + * is being enabled or disabled. The parameter args[1] is the element object + * derived from the nextElement parameter. + * If you do not supply a nextElement then you will need to track + * the elements that you would want to enable/disable while handling the state change. + */ + this.cfg.addProperty("nextButtonStateHandler", { + value:null, + handler: function(type, args, carouselElem) { + if(oThis._currNextButtonStateHandler) { + oThis._nextButtonStateHandlerEvt.unsubscribe(oThis._currNextButtonStateHandler, oThis); + } + oThis._currNextButtonStateHandler = args[0]; + + if(oThis._currNextButtonStateHandler) { + if(!oThis._nextButtonStateHandlerEvt) { + oThis._nextButtonStateHandlerEvt = new YAHOO.util.CustomEvent("onNextButtonStateChange", oThis); + } + oThis._nextButtonStateHandlerEvt.subscribe(oThis._currNextButtonStateHandler, oThis); + } + } + } ); + + + if(carouselCfg) { + this.cfg.applyConfig(carouselCfg); + } + + this._origFirstVisible = this.cfg.getProperty("firstVisible"); + + // keep a copy of curr handler so it can be removed when a new handler is set + this._currLoadInitHandler = this.cfg.getProperty("loadInitHandler"); + this._currLoadNextHandler = this.cfg.getProperty("loadNextHandler"); + this._currLoadPrevHandler = this.cfg.getProperty("loadPrevHandler"); + this._currPrevButtonStateHandler = this.cfg.getProperty("prevButtonStateHandler"); + this._currNextButtonStateHandler = this.cfg.getProperty("nextButtonStateHandler"); + this._currAnimationCompleteHandler = this.cfg.getProperty("animationCompleteHandler"); + + this._nextElementID = this.cfg.getProperty("nextElementID"); + if(!this._nextElementID) + this._nextElementID = this.cfg.getProperty("nextElement"); + + this._prevElementID = this.cfg.getProperty("prevElementID"); + if(!this._prevElementID) + this._prevElementID = this.cfg.getProperty("prevElement"); + + this._autoPlayTimer = null; + this._priorLastVisible = this._priorFirstVisible = this.cfg.getProperty("firstVisible"); + this._lastPrebuiltIdx = 0; +// this._currSize = 0; + + // prefetch elements + this.carouselList = YAHOO.util.Dom.getElementsByClassName(carouselListClass, + "ul", this.carouselElem)[0]; + + if(this._nextElementID == null) { + this._carouselNext = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, + "div", this.carouselElem)[0]; + } else { + this._carouselNext = YAHOO.util.Dom.get(this._nextElementID); + } + + if(this._prevElementID == null) { + this._carouselPrev = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, + "div", this.carouselElem)[0]; + } else { + this._carouselPrev = YAHOO.util.Dom.get(this._prevElementID); + } + + this._clipReg = YAHOO.util.Dom.getElementsByClassName(carouselClipRegionClass, + "div", this.carouselElem)[0]; + + // add a style class dynamically so that the correct styles get applied for a vertical carousel + if(this.isVertical()) { + YAHOO.util.Dom.addClass(this.carouselList, "carousel-vertical"); + } + + // initialize the animation objects for next/previous + this._scrollNextAnim = new YAHOO.util.Motion(this.carouselList, this.scrollNextParams, + this.cfg.getProperty("animationSpeed"), this.cfg.getProperty("animationMethod")); + this._scrollPrevAnim = new YAHOO.util.Motion(this.carouselList, this.scrollPrevParams, + this.cfg.getProperty("animationSpeed"), this.cfg.getProperty("animationMethod")); + + // If they supplied a nextElementID then wire an event listener for the click + if(this._carouselNext) { + YAHOO.util.Event.addListener(this._carouselNext, "click", this._scrollNext, this); + } + + // If they supplied a prevElementID then wire an event listener for the click + if(this._carouselPrev) { + YAHOO.util.Event.addListener(this._carouselPrev, "click", this._scrollPrev, this); + } + + // Wire up the various event handlers that they might have supplied + var loadInitHandler = this.cfg.getProperty("loadInitHandler"); + if(loadInitHandler) { + this._loadInitHandlerEvt = new YAHOO.util.CustomEvent("onLoadInit", this); + this._loadInitHandlerEvt.subscribe(loadInitHandler, this); + } + var loadNextHandler = this.cfg.getProperty("loadNextHandler"); + if(loadNextHandler) { + this._loadNextHandlerEvt = new YAHOO.util.CustomEvent("onLoadNext", this); + this._loadNextHandlerEvt.subscribe(loadNextHandler, this); + } + var loadPrevHandler = this.cfg.getProperty("loadPrevHandler"); + if(loadPrevHandler) { + this._loadPrevHandlerEvt = new YAHOO.util.CustomEvent("onLoadPrev", this); + this._loadPrevHandlerEvt.subscribe(loadPrevHandler, this); + } + var animationCompleteHandler = this.cfg.getProperty("animationCompleteHandler"); + if(animationCompleteHandler) { + this._animationCompleteEvt = new YAHOO.util.CustomEvent("onAnimationComplete", this); + this._animationCompleteEvt.subscribe(animationCompleteHandler, this); + } + var prevButtonStateHandler = this.cfg.getProperty("prevButtonStateHandler"); + if(prevButtonStateHandler) { + this._prevButtonStateHandlerEvt = new YAHOO.util.CustomEvent("onPrevButtonStateChange", + this); + this._prevButtonStateHandlerEvt.subscribe(prevButtonStateHandler, this); + } + var nextButtonStateHandler = this.cfg.getProperty("nextButtonStateHandler"); + if(nextButtonStateHandler) { + this._nextButtonStateHandlerEvt = new YAHOO.util.CustomEvent("onNextButtonStateChange", this); + this._nextButtonStateHandlerEvt.subscribe(nextButtonStateHandler, this); + } + + // Since loading may take some time, wire up a listener to fire when at least the first + // element actually gets loaded + var visibleExtent = this._calculateVisibleExtent(); + YAHOO.util.Event.onAvailable(this._carouselElemID + "-item-"+ + visibleExtent.start, this._calculateSize, this); + + // Call the initial loading sequence + if(this.cfg.getProperty("loadOnStart")) + this._loadInitial(); + + }, + + // /////////////////// Public API ////////////////////////////////////////// + + /** + * Clears all items from the list and resets to the carousel to its original initial state. + */ + clear: function() { + // remove all items from the carousel for dynamic content + var loadInitHandler = this.cfg.getProperty("loadInitHandler"); + if(loadInitHandler) { + this._removeChildrenFromNode(this.carouselList); + this._lastPrebuiltIdx = 0; + } + // turn off autoplay + this.stopAutoPlay(); // should we only turn this off for dynamic during reload? + + this._priorLastVisible = this._priorFirstVisible = this._origFirstVisible; + + // is this redundant since moveTo will set this? + this.cfg.setProperty("firstVisible", this._origFirstVisible, true); + this.moveTo(this._origFirstVisible); + }, + + /** + * Clears all items from the list and calls the loadInitHandler to load new items into the list. + * The carousel size is reset to the original size set during creation. + * @param {number} numVisible Optional parameter: numVisible. + * If set, the carousel will resize on the reload to show numVisible items. + */ + reload: function(numVisible) { + // this should be deprecated, not needed since can be set via property change + if(this._isValidObj(numVisible)) { + this.cfg.setProperty("numVisible", numVisible); + } + this.clear(); + + // clear resets back to start + var visibleExtent = this._calculateVisibleExtent(); + YAHOO.util.Event.onAvailable(this._carouselElemID+"-item-"+visibleExtent.start, + this._calculateSize, this); + this._loadInitial(); + + }, + + load: function() { + var visibleExtent = this._calculateVisibleExtent(); + + YAHOO.util.Event.onAvailable(this._carouselElemID + "-item-"+visibleExtent.start, + this._calculateSize, this); + this._loadInitial(); + }, + + /** + * With patch from Dan Hobbs for handling unordered loading. + * @param {number} idx which item in the list to potentially create. + * If item already exists it will not create a new item. + * @param {string} innerHTML The innerHTML string to use to create the contents of an LI element. + * @param {string} itemClass A class optionally supplied to add to the LI item created + */ + addItem: function(idx, innerHTMLOrElem, itemClass) { + + if(idx > this.cfg.getProperty("size")) { + return null; + } + + var liElem = this.getItem(idx); + + // Need to create the li + if(!this._isValidObj(liElem)) { + liElem = this._createItem(idx, innerHTMLOrElem); + this.carouselList.appendChild(liElem); + + } else if(this._isValidObj(liElem.placeholder)) { + var newLiElem = this._createItem(idx, innerHTMLOrElem); + this.carouselList.replaceChild(newLiElem, liElem); + liElem = newLiElem; + } + + // if they supplied an item class add it to the element + if(this._isValidObj(itemClass)){ + YAHOO.util.Dom.addClass(liElem, itemClass); + } + + /** + * Not real comfortable with this line of code. It exists for vertical + * carousels for IE6. For some reason LI elements are not displaying + * unless you after the fact set the display to block. (Even though + * the CSS sets vertical LIs to display:block) + */ + if(this.isVertical()) + setTimeout( function() { liElem.style.display="block"; }, 1 ); + + return liElem; + + }, + + /** + * Inserts a new LI item before the index specified. Uses the innerHTML to create the contents of the new LI item + * @param {number} refIdx which item in the list to insert this item before. + * @param {string} innerHTML The innerHTML string to use to create the contents of an LI element. + */ + insertBefore: function(refIdx, innerHTML) { + // don't allow insertion beyond the size + if(refIdx >= this.cfg.getProperty("size")) { + return null; + } + + if(refIdx < 1) { + refIdx = 1; + } + + var insertionIdx = refIdx - 1; + + if(insertionIdx > this._lastPrebuiltIdx) { + this._prebuildItems(this._lastPrebuiltIdx, refIdx); // is this right? + } + + var liElem = this._insertBeforeItem(refIdx, innerHTML); + + this._enableDisableControls(); + + return liElem; + }, + + /** + * Inserts a new LI item after the index specified. Uses the innerHTML to create the contents of the new LI item + * @param {number} refIdx which item in the list to insert this item after. + * @param {string} innerHTML The innerHTML string to use to create the contents of an LI element. + */ + insertAfter: function(refIdx, innerHTML) { + + if(refIdx > this.cfg.getProperty("size")) { + refIdx = this.cfg.getProperty("size"); + } + + var insertionIdx = refIdx + 1; + + // if we are inserting this item past where we have prebuilt items, then + // prebuild up to this point. + if(insertionIdx > this._lastPrebuiltIdx) { + this._prebuildItems(this._lastPrebuiltIdx, insertionIdx+1); + } + + var liElem = this._insertAfterItem(refIdx, innerHTML); + + if(insertionIdx > this.cfg.getProperty("size")) { + this.cfg.setProperty("size", insertionIdx, true); + } + + this._enableDisableControls(); + + return liElem; + }, + + /** + * Simulates a next button event. Causes the carousel to scroll the next set of content into view. + */ + scrollNext: function() { + this._scrollNext(null, this); + + // we know the timer has expired. + //if(this._autoPlayTimer) clearTimeout(this._autoPlayTimer); + this._autoPlayTimer = null; + if(this.cfg.getProperty("autoPlay") !== 0) { + this._autoPlayTimer = this.startAutoPlay(); + } + }, + + /** + * Simulates a prev button event. Causes the carousel to scroll the previous set of content into view. + */ + scrollPrev: function() { + this._scrollPrev(null, this); + }, + + /** + * Scrolls the content to place itemNum as the start item in the view + * (if size is specified, the last element will not scroll past the end.). + * Uses current animation speed & method. + * @param {number} newStart The item to scroll to. + */ + scrollTo: function(newStart) { + this._position(newStart, true); + }, + + /** + * Moves the content to place itemNum as the start item in the view + * (if size is specified, the last element will not scroll past the end.) + * Ignores animation speed & method; moves directly to the item. + * Note that you can also set the firstVisible property upon initialization + * to get the carousel to start at a position different than 1. + * @param {number} newStart The item to move directly to. + */ + moveTo: function(newStart) { + this._position(newStart, false); + }, + + /** + * Starts up autoplay. If autoPlay has been stopped (by calling stopAutoPlay or by user interaction), + * you can start it back up by using this method. + * @param {number} interval optional parameter that sets the interval + * for auto play the next time that autoplay fires. + */ + startAutoPlay: function(interval) { + // if interval is passed as arg, then set autoPlay to this interval. + if(this._isValidObj(interval)) { + this.cfg.setProperty("autoPlay", interval, true); + } + + // if we already are playing, then do nothing. + if(this._autoPlayTimer !== null) { + return this._autoPlayTimer; + } + + var oThis = this; + var autoScroll = function() { oThis.scrollNext(); }; + this._autoPlayTimer = setTimeout( autoScroll, this.cfg.getProperty("autoPlay") ); + + return this._autoPlayTimer; + }, + + /** + * Stops autoplay. Useful for when you want to control what events will stop the autoplay feature. + * Call startAutoPlay() to restart autoplay. + */ + stopAutoPlay: function() { + if (this._autoPlayTimer !== null) { + clearTimeout(this._autoPlayTimer); + this._autoPlayTimer = null; + } + }, + + /** + * Returns whether the carousel's orientation is set to vertical. + */ + isVertical: function() { + return (this.cfg.getProperty("orientation") != "horizontal"); + }, + + + /** + * Check to see if an element (by index) has been loaded or not. If the item is simply pre-built, but not + * loaded this will return false. If the item has not been pre-built it will also return false. + * @param {number} idx Index of the element to check load status for. + */ + isItemLoaded: function(idx) { + var liElem = this.getItem(idx); + + // if item exists and is not a placeholder, then it is already loaded. + if(this._isValidObj(liElem) && !this._isValidObj(liElem.placeholder)) { + return true; + } + + return false; + }, + + /** + * Lookup the element object for a carousel list item by index. + * @param {number} idx Index of the element to lookup. + */ + getItem: function(idx) { + var elemName = this._carouselElemID + "-item-" + idx; + var liElem = YAHOO.util.Dom.get(elemName); + return liElem; + }, + + show: function() { + YAHOO.util.Dom.setStyle(this.carouselElem, "display", "block"); + this.calculateSize(); + }, + + hide: function() { + YAHOO.util.Dom.setStyle(this.carouselElem, "display", "none"); + }, + + calculateSize: function() { + var ulKids = this.carouselList.childNodes; + var li = null; + for(var i=0; i 1 then this will adjust the scrolled location + var currY = YAHOO.util.Dom.getY(this.carouselList); + YAHOO.util.Dom.setY(this.carouselList, currY - this.scrollAmountPerInc*(firstVisible-1)); + + // --- HORIZONTAL + } else { + YAHOO.util.Dom.addClass(this.carouselList, "carousel-horizontal"); + + var upl = this._getStyleVal(this.carouselList, "paddingLeft"); + var upr = this._getStyleVal(this.carouselList, "paddingRight"); + var uml = this._getStyleVal(this.carouselList, "marginLeft") + var umr = this._getStyleVal(this.carouselList, "marginRight") + var ulPaddingWidth = upl + upr + uml + umr; + + var liMarginWidth = ml + mr; + var liPaddingMarginWidth = liMarginWidth + pr + pl; + + // try to reveal the amount taking into consideration the margin & padding. + // This guarantees that this.revealAmount of pixels will be shown on both sides + var revealAmt = (this._isExtraRevealed()) ? + (this.cfg.getProperty("revealAmount")+(liPaddingMarginWidth)/2) : 0; + + var liWidth = li.offsetWidth; + this.scrollAmountPerInc = liWidth + liMarginWidth; + + this._clipReg.style.width = + (this.scrollAmountPerInc*numVisible + revealAmt*2) + "px"; + this.carouselElem.style.width = + (this.scrollAmountPerInc*numVisible + navMargin*2 + revealAmt*2 + + ulPaddingWidth) + "px"; + + var revealLeft = (this._isExtraRevealed()) ? + (revealAmt - (Math.abs(mr-ml)+Math.abs(pr-pl))/2 - (uml+upl) + ) : + 0; + YAHOO.util.Dom.setStyle(this.carouselList, "position", "relative"); + YAHOO.util.Dom.setStyle(this.carouselList, "left", "" + revealLeft + "px"); + + // if we set the initial start > 1 then this will adjust the scrolled location + var currX = YAHOO.util.Dom.getX(this.carouselList); + YAHOO.util.Dom.setX(this.carouselList, currX - this.scrollAmountPerInc*(firstVisible-1)); + } + }, + + // Hides the cfg object + setProperty: function(property, value, silent) { + this.cfg.setProperty(property, value, silent); + }, + + getProperty: function(property) { + return this.cfg.getProperty(property); + }, + + getFirstItemRevealed: function() { + return this._firstItemRevealed; + }, + getLastItemRevealed: function() { + return this._lastItemRevealed; + }, + + // Just for convenience and to be symmetrical with getFirstVisible + getFirstVisible: function() { + return this.cfg.getProperty("firstVisible"); + }, + + getLastVisible: function() { + var firstVisible = this.cfg.getProperty("firstVisible"); + var numVisible = this.cfg.getProperty("numVisible"); + + return firstVisible + numVisible - 1; + }, + + // /////////////////// PRIVATE API ////////////////////////////////////////// + _getStyleVal : function(li, style, returnFloat) { + var styleValStr = YAHOO.util.Dom.getStyle(li, style); + + var styleVal = returnFloat ? parseFloat(styleValStr) : parseInt(styleValStr, 10); + if(style=="height" && isNaN(styleVal)) { + styleVal = li.offsetHeight; + } else if(isNaN(styleVal)) { + styleVal = 0; + } + return styleVal; + }, + + _calculateSize: function(me) { + me.calculateSize(); + me.show(); + //YAHOO.util.Dom.setStyle(me.carouselElem, "visibility", "visible"); + }, + + // From Mike Chambers: http://weblogs.macromedia.com/mesh/archives/2006/01/removing_html_e.html + _removeChildrenFromNode: function(node) + { + if(!this._isValidObj(node)) + { + return; + } + + var len = node.childNodes.length; + + while (node.hasChildNodes()) + { + node.removeChild(node.firstChild); + } + }, + + _prebuildLiElem: function(idx) { + if(idx < 1) return; + + + var liElem = document.createElement("li"); + liElem.id = this._carouselElemID + "-item-" + idx; + // this is default flag to know that we're not really loaded yet. + liElem.placeholder = true; + this.carouselList.appendChild(liElem); + + this._lastPrebuiltIdx = (idx > this._lastPrebuiltIdx) ? idx : this._lastPrebuiltIdx; + }, + + _createItem: function(idx, innerHTMLOrElem) { + if(idx < 1) return; + + + var liElem = document.createElement("li"); + liElem.id = this._carouselElemID + "-item-" + idx; + + // if String then assume innerHTML, else an elem object + if(typeof(innerHTMLOrElem) === "string") { + liElem.innerHTML = innerHTMLOrElem; + } else { + liElem.appendChild(innerHTMLOrElem); + } + + return liElem; + }, + + // idx is the location to insert after + _insertAfterItem: function(refIdx, innerHTMLOrElem) { + return this._insertBeforeItem(refIdx+1, innerHTMLOrElem); + }, + + + _insertBeforeItem: function(refIdx, innerHTMLOrElem) { + + var refItem = this.getItem(refIdx); + var size = this.cfg.getProperty("size"); + if(size != this.UNBOUNDED_SIZE) { + this.cfg.setProperty("size", size + 1, true); + } + + for(var i=this._lastPrebuiltIdx; i>=refIdx; i--) { + var anItem = this.getItem(i); + if(this._isValidObj(anItem)) { + anItem.id = this._carouselElemID + "-item-" + (i+1); + } + } + + var liElem = this._createItem(refIdx, innerHTMLOrElem); + + var insertedItem = this.carouselList.insertBefore(liElem, refItem); + this._lastPrebuiltIdx += 1; + + return liElem; + }, + + // TEST THIS... think it has to do with prebuild + insertAfterEnd: function(innerHTMLOrElem) { + return this.insertAfter(this.cfg.getProperty("size"), innerHTMLOrElem); + }, + + _position: function(newStart, showAnimation) { + // do we bypass the isAnimated check? + var currStart = this._priorFirstVisible; + if(newStart > currStart) { + var inc = newStart - currStart; + this._scrollNextInc(inc, showAnimation); + } else { + var dec = currStart - newStart; + this._scrollPrevInc(dec, showAnimation); + } + }, + + _scrollPrev: function(e, carousel) { + if(e !== null) { // event fired this so disable autoplay + carousel.stopAutoPlay(); + } + if(carousel._scrollPrevAnim.isAnimated()) { + return false; + } + carousel._scrollPrevInc(carousel.cfg.getProperty("scrollInc"), + (carousel.cfg.getProperty("animationSpeed") !== 0)); + }, + + // event handler + _scrollNext: function(e, carousel) { + if(e !== null) { // event fired this so disable autoplay + carousel.stopAutoPlay(); + } + if(carousel._scrollNextAnim.isAnimated()) { + return false; // might be better to set ourself waiting for animation completion and + // then just do this function. that will allow faster scroll responses. + } + + carousel._scrollNextInc(carousel.cfg.getProperty("scrollInc"), + (carousel.cfg.getProperty("animationSpeed") !== 0)); + }, + + + _handleAnimationComplete: function(type, args, argList) { + var carousel = argList[0]; + var direction = argList[1]; + + carousel._animationCompleteEvt.fire(direction); + + + }, + + // If EVERY item is already loaded in the range then return true + // Also prebuild whatever is not already created. + _areAllItemsLoaded: function(first, last) { + var itemsLoaded = true; + for(var i=first; i<=last; i++) { + var liElem = this.getItem(i); + + // If the li elem does not exist, then prebuild it in the correct order + // but still flag as not loaded (just prebuilt the li item. + if(!this._isValidObj(liElem)) { + this._prebuildLiElem(i); + itemsLoaded = false; + // but if the item exists and is a placeholder, then + // note that this item is not loaded (only a placeholder) + } else if(this._isValidObj(liElem.placeholder)) { + itemsLoaded = false; + } + } + return itemsLoaded; + }, + + _prebuildItems: function(first, last) { + for(var i=first; i<=last; i++) { + var liElem = this.getItem(i); + + // If the li elem does not exist, then prebuild it in the correct order + // but still flag as not loaded (just prebuilt the li item. + if(!this._isValidObj(liElem)) { + this._prebuildLiElem(i); + } + } + }, + + _isExtraRevealed: function() { + return (this.cfg.getProperty("revealAmount") > 0); + }, + + // probably no longer need carousel passed in, this should be correct now. + _scrollNextInc: function(inc, showAnimation) { + var numVisible = this.cfg.getProperty("numVisible"); + var currStart = this._priorFirstVisible; + var currEnd = this._priorLastVisible; + var size = this.cfg.getProperty("size"); + + var scrollExtent = this._calculateAllowableScrollExtent(); + + if(this.cfg.getProperty("wrap") && currEnd == scrollExtent.end) { + this.scrollTo(scrollExtent.start); // might need to check animation is on or not + return; + } + + // increment start by inc + var newStart = currStart + inc; + var newEnd = newStart + numVisible - 1; + + // If we are past the end, adjust or wrap + if(newEnd > scrollExtent.end) { + newEnd = scrollExtent.end; + newStart = newEnd - numVisible + 1; + } + + inc = newStart - currStart; + + // at this point the following variables are set + // inc... amount to increment by + // newStart... the firstVisible item after the scroll + // newEnd... the last item visible after the scroll + + this.cfg.setProperty("firstVisible", newStart, true); + + + if(inc > 0) { + if(this._isValidObj(this.cfg.getProperty("loadNextHandler"))) { + var visibleExtent = this._calculateVisibleExtent(newStart, newEnd); + var cacheStart = (currEnd+1) < visibleExtent.start ? (currEnd+1) : visibleExtent.start; + var alreadyCached = this._areAllItemsLoaded(cacheStart, visibleExtent.end); + this._loadNextHandlerEvt.fire(visibleExtent.start, visibleExtent.end, alreadyCached); + } + + if(showAnimation) { + var nextParams = { points: { by: [-this.scrollAmountPerInc*inc, 0] } }; + if(this.isVertical()) { + nextParams = { points: { by: [0, -this.scrollAmountPerInc*inc] } }; + } + + this._scrollNextAnim = new YAHOO.util.Motion(this.carouselList, + nextParams, + this.cfg.getProperty("animationSpeed"), + this.cfg.getProperty("animationMethod")); + +// is this getting added multiple times? + if(this.cfg.getProperty("animationCompleteHandler")) { + this._scrollNextAnim.onComplete.subscribe(this._handleAnimationComplete, [this, "next"]); + } + this._scrollNextAnim.animate(); + } else { + if(this.isVertical()) { + var currY = YAHOO.util.Dom.getY(this.carouselList); + + YAHOO.util.Dom.setY(this.carouselList, + currY - this.scrollAmountPerInc*inc); + } else { + var currX = YAHOO.util.Dom.getX(this.carouselList); + YAHOO.util.Dom.setX(this.carouselList, + currX - this.scrollAmountPerInc*inc); + } + } + + } + this._priorFirstVisible = newStart; + this._priorLastVisible = newEnd; + + this._enableDisableControls(); + return false; + }, + + // firstVisible is already set + _scrollPrevInc: function(dec, showAnimation) { + var numVisible = this.cfg.getProperty("numVisible"); + var currStart = this._priorFirstVisible; + var currEnd = this._priorLastVisible; + var size = this.cfg.getProperty("size"); + + // decrement start by dec + var newStart = currStart - dec; + + var scrollExtent = this._calculateAllowableScrollExtent(); + + // How to decide whether to stop at 1 or not + newStart = (newStart < scrollExtent.start) ? scrollExtent.start : newStart; + + // if we are going to extend past the end, then we need to correct the start + var newEnd = newStart + numVisible - 1; + if(newEnd > scrollExtent.end) { + newEnd = scrollExtent.end; + newStart = newEnd - numVisible + 1; + } + + dec = currStart - newStart; + + // at this point the following variables are set + // dec... amount to decrement by + // newStart... the firstVisible item after the scroll + // newEnd... the last item visible after the scroll + this.cfg.setProperty("firstVisible", newStart, true); + + // if we are decrementing + if(dec > 0) { + if(this._isValidObj(this.cfg.getProperty("loadPrevHandler"))) { + var visibleExtent = this._calculateVisibleExtent(newStart, newEnd); + var cacheEnd = (currStart-1) > visibleExtent.end ? (currStart-1) : visibleExtent.end; + var alreadyCached = this._areAllItemsLoaded(visibleExtent.start, cacheEnd); + + this._loadPrevHandlerEvt.fire(visibleExtent.start, visibleExtent.end, alreadyCached); + } + + if(showAnimation) { + var prevParams = { points: { by: [this.scrollAmountPerInc*dec, 0] } }; + if(this.isVertical()) { + prevParams = { points: { by: [0, this.scrollAmountPerInc*dec] } }; + } + + this._scrollPrevAnim = new YAHOO.util.Motion(this.carouselList, + prevParams, + this.cfg.getProperty("animationSpeed"), this.cfg.getProperty("animationMethod")); + if(this.cfg.getProperty("animationCompleteHandler")) { + this._scrollPrevAnim.onComplete.subscribe(this._handleAnimationComplete, [this, "prev"]); + } + this._scrollPrevAnim.animate(); + } else { + if(this.isVertical()) { + var currY = YAHOO.util.Dom.getY(this.carouselList); + YAHOO.util.Dom.setY(this.carouselList, currY + + this.scrollAmountPerInc*dec); + } else { + var currX = YAHOO.util.Dom.getX(this.carouselList); + YAHOO.util.Dom.setX(this.carouselList, currX + + this.scrollAmountPerInc*dec); + } + } + } + this._priorFirstVisible = newStart; + this._priorLastVisible = newEnd; + + this._enableDisableControls(); + + return false; + }, + + // Check for all cases and enable/disable controls as needed by current state + _enableDisableControls: function() { + + var firstVisible = this.cfg.getProperty("firstVisible"); + var lastVisible = this.getLastVisible(); + var scrollExtent = this._calculateAllowableScrollExtent(); + + // previous arrow is turned on. Check to see if we need to turn it off + if(this._prevEnabled) { + if(firstVisible === scrollExtent.start) { + this._disablePrev(); + } + } + + // previous arrow is turned off. Check to see if we need to turn it on + if(this._prevEnabled === false) { + if(firstVisible > scrollExtent.start) { + this._enablePrev(); + } + } + + // next arrow is turned on. Check to see if we need to turn it off + if(this._nextEnabled) { + if(lastVisible === scrollExtent.end) { + this._disableNext(); + } + } + + // next arrow is turned off. Check to see if we need to turn it on + if(this._nextEnabled === false) { + if(lastVisible < scrollExtent.end) { + this._enableNext(); + } + } + }, + + /** + * _loadInitial looks at firstItemVisible for the start (not necessarily 1) + */ + _loadInitial: function() { + var firstVisible = this.cfg.getProperty("firstVisible"); + this._priorLastVisible = this.getLastVisible(); + // Load from 1 to the last visible + // The _calculateSize method will adjust the scroll position + // for starts > 1 + if(this._loadInitHandlerEvt) { + var visibleExtent = this._calculateVisibleExtent(firstVisible, this._priorLastVisible); + // still treat the first real item as starting at 1 + var alreadyCached = this._areAllItemsLoaded(1, visibleExtent.end); + + this._loadInitHandlerEvt.fire(visibleExtent.start, visibleExtent.end, alreadyCached); + } + + if(this.cfg.getProperty("autoPlay") !== 0) { + this._autoPlayTimer = this.startAutoPlay(); + } + + this._enableDisableControls(); + }, + + _calculateAllowableScrollExtent: function() { + var scrollBeforeAmount = this.cfg.getProperty("scrollBeforeAmount"); + var scrollAfterAmount = this.cfg.getProperty("scrollAfterAmount"); + var size = this.cfg.getProperty("size"); + + var extent = {start: 1-scrollBeforeAmount, end: size+scrollAfterAmount}; + return extent; + + }, + + _calculateVisibleExtent: function(start, end) { + if(!start) { + start = this.cfg.getProperty("firstVisible"); + end = this.getLastVisible(); + } + + var size = this.cfg.getProperty("size"); + + // we ignore the firstItem property... this method is used + // for prebuilding the cache and signaling the developer + // what to render on a given scroll. + start = start<1?1:start; + end = end>size?size:end; + + var extent = {start: start, end: end}; + + // set up the indices for revealed items. If there is no item revealed, then set + // the index to -1 + this._firstItemRevealed = -1; + this._lastItemRevealed = -1; + if(this._isExtraRevealed()) { + if(start > 1) { + this._firstItemRevealed = start - 1; + extent.start = this._firstItemRevealed; + } + if(end < size) { + this._lastItemRevealed = end + 1; + extent.end = this._lastItemRevealed; + } + } + + return extent; + }, + + _disablePrev: function() { + this._prevEnabled = false; + if(this._prevButtonStateHandlerEvt) { + this._prevButtonStateHandlerEvt.fire(false, this._carouselPrev); + } + if(this._isValidObj(this._carouselPrev)) { + YAHOO.util.Event.removeListener(this._carouselPrev, "click", this._scrollPrev); + } + }, + + _enablePrev: function() { + this._prevEnabled = true; + if(this._prevButtonStateHandlerEvt) { + this._prevButtonStateHandlerEvt.fire(true, this._carouselPrev); + } + if(this._isValidObj(this._carouselPrev)) { + YAHOO.util.Event.addListener(this._carouselPrev, "click", this._scrollPrev, this); + } + }, + + _disableNext: function() { + if(this.cfg.getProperty("wrap")) { + return; + } + this._nextEnabled = false; + if(this._isValidObj(this._nextButtonStateHandlerEvt)) { + this._nextButtonStateHandlerEvt.fire(false, this._carouselNext); + } + if(this._isValidObj(this._carouselNext)) { + YAHOO.util.Event.removeListener(this._carouselNext, "click", this._scrollNext); + } + }, + + _enableNext: function() { + this._nextEnabled = true; + if(this._isValidObj(this._nextButtonStateHandlerEvt)) { + this._nextButtonStateHandlerEvt.fire(true, this._carouselNext); + } + if(this._isValidObj(this._carouselNext)) { + YAHOO.util.Event.addListener(this._carouselNext, "click", this._scrollNext, this); + } + }, + + _isValidObj: function(obj) { + + if (null == obj) { + return false; + } + if ("undefined" == typeof(obj) ) { + return false; + } + return true; + } +}; diff --git a/www/extras/yui-carousel/carousel_min.js b/www/extras/yui-carousel/carousel_min.js new file mode 100644 index 000000000..a08d8d82f --- /dev/null +++ b/www/extras/yui-carousel/carousel_min.js @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2006-2007, Bill W. Scott. All rights reserved. + * This work is licensed under the Creative Commons Attribution 2.5 License. To view a copy + * of this license, visit http://creativecommons.org/licenses/by/2.5/ or send a letter to + * Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. + * This work was created by Bill Scott (billwscott.com, looksgoodworkswell.com). + * The only attribution I require is to keep this notice of copyright & license + * in this original source file. + * Version 0.6.1 - 07.08.2007 + */ + + +YAHOO.namespace("extension");YAHOO.extension.Carousel=function(carouselElementID,carouselCfg){this.init(carouselElementID,carouselCfg);};YAHOO.extension.Carousel.prototype={UNBOUNDED_SIZE:1000000,init:function(carouselElementID,carouselCfg){var oThis=this;this.getCarouselItem=this.getItem;var carouselListClass="carousel-list";var carouselClipRegionClass="carousel-clip-region";var carouselNextClass="carousel-next";var carouselPrevClass="carousel-prev";this._carouselElemID=carouselElementID;this.carouselElem=YAHOO.util.Dom.get(carouselElementID);this._prevEnabled=true;this._nextEnabled=true;this.cfg=new YAHOO.util.Config(this);this.cfg.addProperty("scrollBeforeAmount",{value:0,handler:function(type,args,carouselElem){},validator:oThis.cfg.checkNumber});this.cfg.addProperty("scrollAfterAmount",{value:0,handler:function(type,args,carouselElem){},validator:oThis.cfg.checkNumber});this.cfg.addProperty("loadOnStart",{value:true,handler:function(type,args,carouselElem){},validator:oThis.cfg.checkBoolean});this.cfg.addProperty("orientation",{value:"horizontal",handler:function(type,args,carouselElem){oThis.reload();},validator:function(orientation){if(typeof orientation=="string"){return("horizontal,vertical".indexOf(orientation.toLowerCase())!=-1);}else{return false;}}});this.cfg.addProperty("size",{value:this.UNBOUNDED_SIZE,handler:function(type,args,carouselElem){oThis.reload();},validator:oThis.cfg.checkNumber});this.cfg.addProperty("numVisible",{value:3,handler:function(type,args,carouselElem){oThis.reload();},validator:oThis.cfg.checkNumber});this.cfg.addProperty("firstVisible",{value:1,handler:function(type,args,carouselElem){oThis.moveTo(args[0]);},validator:oThis.cfg.checkNumber});this.cfg.addProperty("scrollInc",{value:3,handler:function(type,args,carouselElem){},validator:oThis.cfg.checkNumber});this.cfg.addProperty("animationSpeed",{value:0.25,handler:function(type,args,carouselElem){oThis.animationSpeed=args[0];},validator:oThis.cfg.checkNumber});this.cfg.addProperty("animationMethod",{value:YAHOO.util.Easing.easeOut,handler:function(type,args,carouselElem){}});this.cfg.addProperty("animationCompleteHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._animationCompleteEvt){oThis._animationCompleteEvt.unsubscribe(oThis._currAnimationCompleteHandler,oThis);} +oThis._currAnimationCompleteHandler=args[0];if(oThis._currAnimationCompleteHandler){if(!oThis._animationCompleteEvt){oThis._animationCompleteEvt=new YAHOO.util.CustomEvent("onAnimationComplete",oThis);} +oThis._animationCompleteEvt.subscribe(oThis._currAnimationCompleteHandler,oThis);}}});this.cfg.addProperty("autoPlay",{value:0,handler:function(type,args,carouselElem){var autoPlay=args[0];if(autoPlay>0) +oThis.startAutoPlay();else +oThis.stopAutoPlay();}});this.cfg.addProperty("wrap",{value:false,handler:function(type,args,carouselElem){},validator:oThis.cfg.checkBoolean});this.cfg.addProperty("navMargin",{value:0,handler:function(type,args,carouselElem){oThis.calculateSize();},validator:oThis.cfg.checkNumber});this.cfg.addProperty("revealAmount",{value:0,handler:function(type,args,carouselElem){oThis.reload();},validator:oThis.cfg.checkNumber});this.cfg.addProperty("prevElementID",{value:null,handler:function(type,args,carouselElem){if(oThis._carouselPrev){YAHOO.util.Event.removeListener(oThis._carouselPrev,"click",oThis._scrollPrev);} +oThis._prevElementID=args[0];if(oThis._prevElementID==null){oThis._carouselPrev=YAHOO.util.Dom.getElementsByClassName(carouselPrevClass,"div",oThis.carouselElem)[0];}else{oThis._carouselPrev=YAHOO.util.Dom.get(oThis._prevElementID);} +YAHOO.util.Event.addListener(oThis._carouselPrev,"click",oThis._scrollPrev,oThis);}});this.cfg.addProperty("prevElement",{value:null,handler:function(type,args,carouselElem){if(oThis._carouselPrev){YAHOO.util.Event.removeListener(oThis._carouselPrev,"click",oThis._scrollPrev);} +oThis._prevElementID=args[0];if(oThis._prevElementID==null){oThis._carouselPrev=YAHOO.util.Dom.getElementsByClassName(carouselPrevClass,"div",oThis.carouselElem)[0];}else{oThis._carouselPrev=YAHOO.util.Dom.get(oThis._prevElementID);} +YAHOO.util.Event.addListener(oThis._carouselPrev,"click",oThis._scrollPrev,oThis);}});this.cfg.addProperty("nextElementID",{value:null,handler:function(type,args,carouselElem){if(oThis._carouselNext){YAHOO.util.Event.removeListener(oThis._carouselNext,"click",oThis._scrollNext);} +oThis._nextElementID=args[0];if(oThis._nextElementID==null){oThis._carouselNext=YAHOO.util.Dom.getElementsByClassName(carouselNextClass,"div",oThis.carouselElem);}else{oThis._carouselNext=YAHOO.util.Dom.get(oThis._nextElementID);} +if(oThis._carouselNext){YAHOO.util.Event.addListener(oThis._carouselNext,"click",oThis._scrollNext,oThis);}}});this.cfg.addProperty("nextElement",{value:null,handler:function(type,args,carouselElem){if(oThis._carouselNext){YAHOO.util.Event.removeListener(oThis._carouselNext,"click",oThis._scrollNext);} +oThis._nextElementID=args[0];if(oThis._nextElementID==null){oThis._carouselNext=YAHOO.util.Dom.getElementsByClassName(carouselNextClass,"div",oThis.carouselElem);}else{oThis._carouselNext=YAHOO.util.Dom.get(oThis._nextElementID);} +if(oThis._carouselNext){YAHOO.util.Event.addListener(oThis._carouselNext,"click",oThis._scrollNext,oThis);}}});this.cfg.addProperty("loadInitHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._loadInitHandlerEvt){oThis._loadInitHandlerEvt.unsubscribe(oThis._currLoadInitHandler,oThis);} +oThis._currLoadInitHandler=args[0];if(oThis._currLoadInitHandler){if(!oThis._loadInitHandlerEvt){oThis._loadInitHandlerEvt=new YAHOO.util.CustomEvent("onLoadInit",oThis);} +oThis._loadInitHandlerEvt.subscribe(oThis._currLoadInitHandler,oThis);}}});this.cfg.addProperty("loadNextHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._loadNextHandlerEvt){oThis._loadNextHandlerEvt.unsubscribe(oThis._currLoadNextHandler,oThis);} +oThis._currLoadNextHandler=args[0];if(oThis._currLoadNextHandler){if(!oThis._loadNextHandlerEvt){oThis._loadNextHandlerEvt=new YAHOO.util.CustomEvent("onLoadNext",oThis);} +oThis._loadNextHandlerEvt.subscribe(oThis._currLoadNextHandler,oThis);}}});this.cfg.addProperty("loadPrevHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._loadPrevHandlerEvt){oThis._loadPrevHandlerEvt.unsubscribe(oThis._currLoadPrevHandler,oThis);} +oThis._currLoadPrevHandler=args[0];if(oThis._currLoadPrevHandler){if(!oThis._loadPrevHandlerEvt){oThis._loadPrevHandlerEvt=new YAHOO.util.CustomEvent("onLoadPrev",oThis);} +oThis._loadPrevHandlerEvt.subscribe(oThis._currLoadPrevHandler,oThis);}}});this.cfg.addProperty("prevButtonStateHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._currPrevButtonStateHandler){oThis._prevButtonStateHandlerEvt.unsubscribe(oThis._currPrevButtonStateHandler,oThis);} +oThis._currPrevButtonStateHandler=args[0];if(oThis._currPrevButtonStateHandler){if(!oThis._prevButtonStateHandlerEvt){oThis._prevButtonStateHandlerEvt=new YAHOO.util.CustomEvent("onPrevButtonStateChange",oThis);} +oThis._prevButtonStateHandlerEvt.subscribe(oThis._currPrevButtonStateHandler,oThis);}}});this.cfg.addProperty("nextButtonStateHandler",{value:null,handler:function(type,args,carouselElem){if(oThis._currNextButtonStateHandler){oThis._nextButtonStateHandlerEvt.unsubscribe(oThis._currNextButtonStateHandler,oThis);} +oThis._currNextButtonStateHandler=args[0];if(oThis._currNextButtonStateHandler){if(!oThis._nextButtonStateHandlerEvt){oThis._nextButtonStateHandlerEvt=new YAHOO.util.CustomEvent("onNextButtonStateChange",oThis);} +oThis._nextButtonStateHandlerEvt.subscribe(oThis._currNextButtonStateHandler,oThis);}}});if(carouselCfg){this.cfg.applyConfig(carouselCfg);} +this._origFirstVisible=this.cfg.getProperty("firstVisible");this._currLoadInitHandler=this.cfg.getProperty("loadInitHandler");this._currLoadNextHandler=this.cfg.getProperty("loadNextHandler");this._currLoadPrevHandler=this.cfg.getProperty("loadPrevHandler");this._currPrevButtonStateHandler=this.cfg.getProperty("prevButtonStateHandler");this._currNextButtonStateHandler=this.cfg.getProperty("nextButtonStateHandler");this._currAnimationCompleteHandler=this.cfg.getProperty("animationCompleteHandler");this._nextElementID=this.cfg.getProperty("nextElementID");if(!this._nextElementID) +this._nextElementID=this.cfg.getProperty("nextElement");this._prevElementID=this.cfg.getProperty("prevElementID");if(!this._prevElementID) +this._prevElementID=this.cfg.getProperty("prevElement");this._autoPlayTimer=null;this._priorLastVisible=this._priorFirstVisible=this.cfg.getProperty("firstVisible");this._lastPrebuiltIdx=0;this.carouselList=YAHOO.util.Dom.getElementsByClassName(carouselListClass,"ul",this.carouselElem)[0];if(this._nextElementID==null){this._carouselNext=YAHOO.util.Dom.getElementsByClassName(carouselNextClass,"div",this.carouselElem)[0];}else{this._carouselNext=YAHOO.util.Dom.get(this._nextElementID);} +if(this._prevElementID==null){this._carouselPrev=YAHOO.util.Dom.getElementsByClassName(carouselPrevClass,"div",this.carouselElem)[0];}else{this._carouselPrev=YAHOO.util.Dom.get(this._prevElementID);} +this._clipReg=YAHOO.util.Dom.getElementsByClassName(carouselClipRegionClass,"div",this.carouselElem)[0];if(this.isVertical()){YAHOO.util.Dom.addClass(this.carouselList,"carousel-vertical");} +this._scrollNextAnim=new YAHOO.util.Motion(this.carouselList,this.scrollNextParams,this.cfg.getProperty("animationSpeed"),this.cfg.getProperty("animationMethod"));this._scrollPrevAnim=new YAHOO.util.Motion(this.carouselList,this.scrollPrevParams,this.cfg.getProperty("animationSpeed"),this.cfg.getProperty("animationMethod"));if(this._carouselNext){YAHOO.util.Event.addListener(this._carouselNext,"click",this._scrollNext,this);} +if(this._carouselPrev){YAHOO.util.Event.addListener(this._carouselPrev,"click",this._scrollPrev,this);} +var loadInitHandler=this.cfg.getProperty("loadInitHandler");if(loadInitHandler){this._loadInitHandlerEvt=new YAHOO.util.CustomEvent("onLoadInit",this);this._loadInitHandlerEvt.subscribe(loadInitHandler,this);} +var loadNextHandler=this.cfg.getProperty("loadNextHandler");if(loadNextHandler){this._loadNextHandlerEvt=new YAHOO.util.CustomEvent("onLoadNext",this);this._loadNextHandlerEvt.subscribe(loadNextHandler,this);} +var loadPrevHandler=this.cfg.getProperty("loadPrevHandler");if(loadPrevHandler){this._loadPrevHandlerEvt=new YAHOO.util.CustomEvent("onLoadPrev",this);this._loadPrevHandlerEvt.subscribe(loadPrevHandler,this);} +var animationCompleteHandler=this.cfg.getProperty("animationCompleteHandler");if(animationCompleteHandler){this._animationCompleteEvt=new YAHOO.util.CustomEvent("onAnimationComplete",this);this._animationCompleteEvt.subscribe(animationCompleteHandler,this);} +var prevButtonStateHandler=this.cfg.getProperty("prevButtonStateHandler");if(prevButtonStateHandler){this._prevButtonStateHandlerEvt=new YAHOO.util.CustomEvent("onPrevButtonStateChange",this);this._prevButtonStateHandlerEvt.subscribe(prevButtonStateHandler,this);} +var nextButtonStateHandler=this.cfg.getProperty("nextButtonStateHandler");if(nextButtonStateHandler){this._nextButtonStateHandlerEvt=new YAHOO.util.CustomEvent("onNextButtonStateChange",this);this._nextButtonStateHandlerEvt.subscribe(nextButtonStateHandler,this);} +var visibleExtent=this._calculateVisibleExtent();YAHOO.util.Event.onAvailable(this._carouselElemID+"-item-"+ +visibleExtent.start,this._calculateSize,this);if(this.cfg.getProperty("loadOnStart")) +this._loadInitial();},clear:function(){var loadInitHandler=this.cfg.getProperty("loadInitHandler");if(loadInitHandler){this._removeChildrenFromNode(this.carouselList);this._lastPrebuiltIdx=0;} +this.stopAutoPlay();this._priorLastVisible=this._priorFirstVisible=this._origFirstVisible;this.cfg.setProperty("firstVisible",this._origFirstVisible,true);this.moveTo(this._origFirstVisible);},reload:function(numVisible){if(this._isValidObj(numVisible)){this.cfg.setProperty("numVisible",numVisible);} +this.clear();var visibleExtent=this._calculateVisibleExtent();YAHOO.util.Event.onAvailable(this._carouselElemID+"-item-"+visibleExtent.start,this._calculateSize,this);this._loadInitial();},load:function(){var visibleExtent=this._calculateVisibleExtent();YAHOO.util.Event.onAvailable(this._carouselElemID+"-item-"+visibleExtent.start,this._calculateSize,this);this._loadInitial();},addItem:function(idx,innerHTMLOrElem,itemClass){if(idx>this.cfg.getProperty("size")){return null;} +var liElem=this.getItem(idx);if(!this._isValidObj(liElem)){liElem=this._createItem(idx,innerHTMLOrElem);this.carouselList.appendChild(liElem);}else if(this._isValidObj(liElem.placeholder)){var newLiElem=this._createItem(idx,innerHTMLOrElem);this.carouselList.replaceChild(newLiElem,liElem);liElem=newLiElem;} +if(this._isValidObj(itemClass)){YAHOO.util.Dom.addClass(liElem,itemClass);} +if(this.isVertical()) +setTimeout(function(){liElem.style.display="block";},1);return liElem;},insertBefore:function(refIdx,innerHTML){if(refIdx>=this.cfg.getProperty("size")){return null;} +if(refIdx<1){refIdx=1;} +var insertionIdx=refIdx-1;if(insertionIdx>this._lastPrebuiltIdx){this._prebuildItems(this._lastPrebuiltIdx,refIdx);} +var liElem=this._insertBeforeItem(refIdx,innerHTML);this._enableDisableControls();return liElem;},insertAfter:function(refIdx,innerHTML){if(refIdx>this.cfg.getProperty("size")){refIdx=this.cfg.getProperty("size");} +var insertionIdx=refIdx+1;if(insertionIdx>this._lastPrebuiltIdx){this._prebuildItems(this._lastPrebuiltIdx,insertionIdx+1);} +var liElem=this._insertAfterItem(refIdx,innerHTML);if(insertionIdx>this.cfg.getProperty("size")){this.cfg.setProperty("size",insertionIdx,true);} +this._enableDisableControls();return liElem;},scrollNext:function(){this._scrollNext(null,this);this._autoPlayTimer=null;if(this.cfg.getProperty("autoPlay")!==0){this._autoPlayTimer=this.startAutoPlay();}},scrollPrev:function(){this._scrollPrev(null,this);},scrollTo:function(newStart){this._position(newStart,true);},moveTo:function(newStart){this._position(newStart,false);},startAutoPlay:function(interval){if(this._isValidObj(interval)){this.cfg.setProperty("autoPlay",interval,true);} +if(this._autoPlayTimer!==null){return this._autoPlayTimer;} +var oThis=this;var autoScroll=function(){oThis.scrollNext();};this._autoPlayTimer=setTimeout(autoScroll,this.cfg.getProperty("autoPlay"));return this._autoPlayTimer;},stopAutoPlay:function(){if(this._autoPlayTimer!==null){clearTimeout(this._autoPlayTimer);this._autoPlayTimer=null;}},isVertical:function(){return(this.cfg.getProperty("orientation")!="horizontal");},isItemLoaded:function(idx){var liElem=this.getItem(idx);if(this._isValidObj(liElem)&&!this._isValidObj(liElem.placeholder)){return true;} +return false;},getItem:function(idx){var elemName=this._carouselElemID+"-item-"+idx;var liElem=YAHOO.util.Dom.get(elemName);return liElem;},show:function(){YAHOO.util.Dom.setStyle(this.carouselElem,"display","block");this.calculateSize();},hide:function(){YAHOO.util.Dom.setStyle(this.carouselElem,"display","none");},calculateSize:function(){var ulKids=this.carouselList.childNodes;var li=null;for(var i=0;ithis._lastPrebuiltIdx)?idx:this._lastPrebuiltIdx;},_createItem:function(idx,innerHTMLOrElem){if(idx<1)return;var liElem=document.createElement("li");liElem.id=this._carouselElemID+"-item-"+idx;if(typeof(innerHTMLOrElem)==="string"){liElem.innerHTML=innerHTMLOrElem;}else{liElem.appendChild(innerHTMLOrElem);} +return liElem;},_insertAfterItem:function(refIdx,innerHTMLOrElem){return this._insertBeforeItem(refIdx+1,innerHTMLOrElem);},_insertBeforeItem:function(refIdx,innerHTMLOrElem){var refItem=this.getItem(refIdx);var size=this.cfg.getProperty("size");if(size!=this.UNBOUNDED_SIZE){this.cfg.setProperty("size",size+1,true);} +for(var i=this._lastPrebuiltIdx;i>=refIdx;i--){var anItem=this.getItem(i);if(this._isValidObj(anItem)){anItem.id=this._carouselElemID+"-item-"+(i+1);}} +var liElem=this._createItem(refIdx,innerHTMLOrElem);var insertedItem=this.carouselList.insertBefore(liElem,refItem);this._lastPrebuiltIdx+=1;return liElem;},insertAfterEnd:function(innerHTMLOrElem){return this.insertAfter(this.cfg.getProperty("size"),innerHTMLOrElem);},_position:function(newStart,showAnimation){var currStart=this._priorFirstVisible;if(newStart>currStart){var inc=newStart-currStart;this._scrollNextInc(inc,showAnimation);}else{var dec=currStart-newStart;this._scrollPrevInc(dec,showAnimation);}},_scrollPrev:function(e,carousel){if(e!==null){carousel.stopAutoPlay();} +if(carousel._scrollPrevAnim.isAnimated()){return false;} +carousel._scrollPrevInc(carousel.cfg.getProperty("scrollInc"),(carousel.cfg.getProperty("animationSpeed")!==0));},_scrollNext:function(e,carousel){if(e!==null){carousel.stopAutoPlay();} +if(carousel._scrollNextAnim.isAnimated()){return false;} +carousel._scrollNextInc(carousel.cfg.getProperty("scrollInc"),(carousel.cfg.getProperty("animationSpeed")!==0));},_handleAnimationComplete:function(type,args,argList){var carousel=argList[0];var direction=argList[1];carousel._animationCompleteEvt.fire(direction);},_areAllItemsLoaded:function(first,last){var itemsLoaded=true;for(var i=first;i<=last;i++){var liElem=this.getItem(i);if(!this._isValidObj(liElem)){this._prebuildLiElem(i);itemsLoaded=false;}else if(this._isValidObj(liElem.placeholder)){itemsLoaded=false;}} +return itemsLoaded;},_prebuildItems:function(first,last){for(var i=first;i<=last;i++){var liElem=this.getItem(i);if(!this._isValidObj(liElem)){this._prebuildLiElem(i);}}},_isExtraRevealed:function(){return(this.cfg.getProperty("revealAmount")>0);},_scrollNextInc:function(inc,showAnimation){var numVisible=this.cfg.getProperty("numVisible");var currStart=this._priorFirstVisible;var currEnd=this._priorLastVisible;var size=this.cfg.getProperty("size");var scrollExtent=this._calculateAllowableScrollExtent();if(this.cfg.getProperty("wrap")&&currEnd==scrollExtent.end){this.scrollTo(scrollExtent.start);return;} +var newStart=currStart+inc;var newEnd=newStart+numVisible-1;if(newEnd>scrollExtent.end){newEnd=scrollExtent.end;newStart=newEnd-numVisible+1;} +inc=newStart-currStart;this.cfg.setProperty("firstVisible",newStart,true);if(inc>0){if(this._isValidObj(this.cfg.getProperty("loadNextHandler"))){var visibleExtent=this._calculateVisibleExtent(newStart,newEnd);var cacheStart=(currEnd+1)scrollExtent.end){newEnd=scrollExtent.end;newStart=newEnd-numVisible+1;} +dec=currStart-newStart;this.cfg.setProperty("firstVisible",newStart,true);if(dec>0){if(this._isValidObj(this.cfg.getProperty("loadPrevHandler"))){var visibleExtent=this._calculateVisibleExtent(newStart,newEnd);var cacheEnd=(currStart-1)>visibleExtent.end?(currStart-1):visibleExtent.end;var alreadyCached=this._areAllItemsLoaded(visibleExtent.start,cacheEnd);this._loadPrevHandlerEvt.fire(visibleExtent.start,visibleExtent.end,alreadyCached);} +if(showAnimation){var prevParams={points:{by:[this.scrollAmountPerInc*dec,0]}};if(this.isVertical()){prevParams={points:{by:[0,this.scrollAmountPerInc*dec]}};} +this._scrollPrevAnim=new YAHOO.util.Motion(this.carouselList,prevParams,this.cfg.getProperty("animationSpeed"),this.cfg.getProperty("animationMethod"));if(this.cfg.getProperty("animationCompleteHandler")){this._scrollPrevAnim.onComplete.subscribe(this._handleAnimationComplete,[this,"prev"]);} +this._scrollPrevAnim.animate();}else{if(this.isVertical()){var currY=YAHOO.util.Dom.getY(this.carouselList);YAHOO.util.Dom.setY(this.carouselList,currY+ +this.scrollAmountPerInc*dec);}else{var currX=YAHOO.util.Dom.getX(this.carouselList);YAHOO.util.Dom.setX(this.carouselList,currX+ +this.scrollAmountPerInc*dec);}}} +this._priorFirstVisible=newStart;this._priorLastVisible=newEnd;this._enableDisableControls();return false;},_enableDisableControls:function(){var firstVisible=this.cfg.getProperty("firstVisible");var lastVisible=this.getLastVisible();var scrollExtent=this._calculateAllowableScrollExtent();if(this._prevEnabled){if(firstVisible===scrollExtent.start){this._disablePrev();}} +if(this._prevEnabled===false){if(firstVisible>scrollExtent.start){this._enablePrev();}} +if(this._nextEnabled){if(lastVisible===scrollExtent.end){this._disableNext();}} +if(this._nextEnabled===false){if(lastVisiblesize?size:end;var extent={start:start,end:end};this._firstItemRevealed=-1;this._lastItemRevealed=-1;if(this._isExtraRevealed()){if(start>1){this._firstItemRevealed=start-1;extent.start=this._firstItemRevealed;} +if(end Date: Sat, 8 Dec 2007 09:00:32 +0000 Subject: [PATCH 14/15] added carousel --- www/extras/yui-carousel/{carousel_min.js => carousel-min.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename www/extras/yui-carousel/{carousel_min.js => carousel-min.js} (100%) diff --git a/www/extras/yui-carousel/carousel_min.js b/www/extras/yui-carousel/carousel-min.js similarity index 100% rename from www/extras/yui-carousel/carousel_min.js rename to www/extras/yui-carousel/carousel-min.js From 82e9bf8448714dca66e404f60cde35f1e49faab0 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Mon, 17 Dec 2007 22:22:06 +0000 Subject: [PATCH 15/15] Finished? Ready for merge at least. --- docs/upgrades/_upgrade.skeleton | 128 ++-- .../root_import_gallery-templates-2.wgpkg | Bin 0 -> 21091 bytes docs/upgrades/upgrade_7.4.10-7.5.0.pl | 147 +++-- lib/WebGUI/Asset.pm | 13 +- lib/WebGUI/Asset/File.pm | 152 ++--- lib/WebGUI/Asset/File/Image/Photo.pm | 286 +++++++-- lib/WebGUI/Asset/Shortcut.pm | 20 + lib/WebGUI/Asset/Wobject/Gallery.pm | 564 +++++++++++++++--- lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 441 ++++++++++++-- lib/WebGUI/AssetLineage.pm | 5 +- lib/WebGUI/AssetPackage.pm | 98 +-- lib/WebGUI/AssetVersioning.pm | 13 +- lib/WebGUI/Form.pm | 53 +- lib/WebGUI/Form/SelectRichEditor.pm | 101 ++++ lib/WebGUI/Help/Asset_Gallery.pm | 229 +++++++ lib/WebGUI/Help/Asset_GalleryAlbum.pm | 309 ++++++++++ lib/WebGUI/Help/Asset_Photo.pm | 258 ++++++++ lib/WebGUI/Keyword.pm | 3 + lib/WebGUI/Search.pm | 38 +- lib/WebGUI/Storage.pm | 88 ++- lib/WebGUI/Storage/Image.pm | 83 +-- lib/WebGUI/i18n/English/Asset_Gallery.pm | 548 +++++++++++++++++ lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm | 289 +++++++++ lib/WebGUI/i18n/English/Asset_Photo.pm | 291 +++++++++ t/Asset/Wobject/Gallery/00base.t | 78 +++ t/Asset/Wobject/Gallery/delete.t | 96 +++ t/Asset/Wobject/Gallery/listFilesForUser.t | 78 +++ t/Asset/Wobject/Gallery/permission.t | 107 ++++ t/Asset/Wobject/Gallery/rss.t | 66 ++ t/Asset/Wobject/Gallery/search.t | 78 +++ t/Asset/Wobject/Gallery/view.t | 130 ++++ t/Asset/Wobject/GalleryAlbum/addArchive.t | 69 +++ t/Asset/Wobject/GalleryAlbum/delete.t | 96 +++ t/Asset/Wobject/GalleryAlbum/permission.t | 107 ++++ t/Asset/Wobject/GalleryAlbum/rss.t | 66 ++ t/Asset/Wobject/GalleryAlbum/slideshow.t | 69 +++ t/Asset/Wobject/GalleryAlbum/thumbnails.t | 69 +++ t/Asset/Wobject/GalleryAlbum/view.t | 132 ++++ t/Form.t | 104 ++++ t/Form/SelectRichEditor.t | 59 ++ t/Storage.t | 10 + t/_test.skeleton | 30 +- t/lib/WebGUI/Test/Maker/HTML.pm | 2 + t/lib/WebGUI/Test/Maker/Permission.pm | 22 +- t/supporting_collateral/elephant_images.zip | Bin 0 -> 50141 bytes 45 files changed, 5112 insertions(+), 513 deletions(-) create mode 100644 docs/upgrades/templates-7.5.0/root_import_gallery-templates-2.wgpkg create mode 100644 lib/WebGUI/Form/SelectRichEditor.pm create mode 100644 lib/WebGUI/Help/Asset_Gallery.pm create mode 100644 lib/WebGUI/Help/Asset_GalleryAlbum.pm create mode 100644 lib/WebGUI/Help/Asset_Photo.pm create mode 100644 lib/WebGUI/i18n/English/Asset_Photo.pm create mode 100644 t/Asset/Wobject/Gallery/00base.t create mode 100644 t/Asset/Wobject/Gallery/delete.t create mode 100644 t/Asset/Wobject/Gallery/listFilesForUser.t create mode 100644 t/Asset/Wobject/Gallery/permission.t create mode 100644 t/Asset/Wobject/Gallery/rss.t create mode 100644 t/Asset/Wobject/Gallery/search.t create mode 100644 t/Asset/Wobject/Gallery/view.t create mode 100644 t/Asset/Wobject/GalleryAlbum/addArchive.t create mode 100644 t/Asset/Wobject/GalleryAlbum/delete.t create mode 100644 t/Asset/Wobject/GalleryAlbum/permission.t create mode 100644 t/Asset/Wobject/GalleryAlbum/rss.t create mode 100644 t/Asset/Wobject/GalleryAlbum/slideshow.t create mode 100644 t/Asset/Wobject/GalleryAlbum/thumbnails.t create mode 100644 t/Asset/Wobject/GalleryAlbum/view.t create mode 100644 t/Form.t create mode 100644 t/Form/SelectRichEditor.t create mode 100644 t/supporting_collateral/elephant_images.zip diff --git a/docs/upgrades/_upgrade.skeleton b/docs/upgrades/_upgrade.skeleton index e13a7b7d9..7821157a7 100644 --- a/docs/upgrades/_upgrade.skeleton +++ b/docs/upgrades/_upgrade.skeleton @@ -12,6 +12,8 @@ use lib "../../lib"; use strict; use Getopt::Long; use WebGUI::Session; +use WebGUI::Storage; +use WebGUI::Asset; my $toVersion = "0.0.0"; # make this match what version you're going to @@ -33,8 +35,71 @@ finish($session); # this line required #} +# --------------- DO NOT EDIT BELOW THIS LINE -------------------------------- -# ---- DO NOT EDIT BELOW THIS LINE ---- +#---------------------------------------------------------------------------- +# Add a package to the import node +sub addPackage { + my $session = shift; + my $file = shift; + + # Make a storage location for the package + my $storage = WebGUI::Storage->createTemp( $session ); + $storage->addFileFromFilesystem( $file ); + + # Import the package into the import node + WebGUI::Asset->getImportNode($session)->importPackage( $storage ); + + # Make the package not a package anymore +} + +#---------------------------------------------------------------------------- +# Add a template from a file +sub addTemplate { + my $session = shift; + my $file = shift; + my $newFolder = shift; + + open(FILE,"<",$file); + my $first = 1; + my $create = 0; + my $head = 0; + my %properties = (className=>"WebGUI::Asset::Template"); + while (my $line = ) { + if ($first) { + $line =~ m/^\#(.*)$/; + $properties{id} = $1; + $first = 0; + } + elsif ($line =~ m/^\#create$/) { + $create = 1; + } + elsif ($line =~ m/^\#(.*):(.*)$/) { + $properties{$1} = $2; + } + elsif ($line =~ m/^~~~$/) { + $head = 1; + } + elsif ($head) { + $properties{headBlock} .= $line; + } + else { + $properties{template} .= $line; + } + } + close(FILE); + if ($create) { + $$newFolder = createNewTemplatesFolder(WebGUI::Asset->getImportNode($session)) + unless (defined $$newFolder); + my $template = $$newFolder->addChild(\%properties, $properties{id}); + } + else { + my $template = WebGUI::Asset->new($session,$properties{id}, "WebGUI::Asset::Template"); + if (defined $template) { + my $newRevision = $template->addRevision(\%properties); + } + } +} #------------------------------------------------- sub start { @@ -63,49 +128,24 @@ sub finish { #------------------------------------------------- sub updateTemplates { - my $session = shift; - return undef unless (-d "templates-".$toVersion); - print "\tUpdating templates.\n" unless ($quiet); - opendir(DIR,"templates-".$toVersion); - my @files = readdir(DIR); - closedir(DIR); - my $importNode = WebGUI::Asset->getImportNode($session); - my $newFolder = undef; - foreach my $file (@files) { - next unless ($file =~ /\.tmpl$/); - open(FILE,""WebGUI::Asset::Template"); - while (my $line = ) { - if ($first) { - $line =~ m/^\#(.*)$/; - $properties{id} = $1; - $first = 0; - } elsif ($line =~ m/^\#create$/) { - $create = 1; - } elsif ($line =~ m/^\#(.*):(.*)$/) { - $properties{$1} = $2; - } elsif ($line =~ m/^~~~$/) { - $head = 1; - } elsif ($head) { - $properties{headBlock} .= $line; - } else { - $properties{template} .= $line; - } - } - close(FILE); - if ($create) { - $newFolder = createNewTemplatesFolder($importNode) unless (defined $newFolder); - my $template = $newFolder->addChild(\%properties, $properties{id}); - } else { - my $template = WebGUI::Asset->new($session,$properties{id}, "WebGUI::Asset::Template"); - if (defined $template) { - my $newRevision = $template->addRevision(\%properties); - } - } - } + my $session = shift; + return undef unless (-d "templates-".$toVersion); + print "\tUpdating templates.\n" unless ($quiet); + opendir(DIR,"templates-".$toVersion); + my @files = readdir(DIR); + closedir(DIR); + my $newFolder = undef; + foreach my $file (@files) { + next unless ($file =~ /\.(tmpl|wgpkg)$/); + my $type = $1; + $file = "templates-" . $toVersion . "/" . $file; + if ($type eq "tmpl") { + addTemplate( $session, $file, \$newFolder ); + } + elsif ($type eq "wgpkg") { + addPackage( $session, $file ); + } + } } #------------------------------------------------- diff --git a/docs/upgrades/templates-7.5.0/root_import_gallery-templates-2.wgpkg b/docs/upgrades/templates-7.5.0/root_import_gallery-templates-2.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..8b71ce9d9999cac292822d70153c60ce79749dd9 GIT binary patch literal 21091 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 fv=Y-2nt_UORIc~#={V%CV``=6K!2Wlg z|ELhDaoPXQ?f<^YuEN}iWTnM3QLZ@tUSrD2ODyYt^-SNxC5{@1H>Q#5+W z`C}g=%A7Yv-{|=!JS4&}DLSbYDiq7?;Co2$qsBLxMW}GSJjGr-M4xwHid4*WejZ$J zbWm!fJSwhB-`-j2(xfg@U35ZH=S;G6d06~7>zCOaXilP!cVSwJ9~_*h*Fai0-qEOH zgkA8oeNo0%rpaJ6MyOCqTTC49gdR3~@nfe<)@gL=B*=P#OQ9VGl=p<>YtbRbc%0A; z9k>pOhDsAL}3GodZ*n^;aKq>>4 zFS>Rcy)l4fwo(CErjlSt3|0%pO>a+LFP=jn)Sid`S_NN(7IC8gy(&=ud%+o9JN++l z;eSPpT-kj6FU0>UO8=vLSmZ)T>VA1vXp}CZb4F%*V1C!InBH;ufkyt(!GDkL=fw|_ zip^07XGwIwErZKk?~7z!JmatAir<#R=T7N2!}bZC>zC2@L{tXS`B;hPe-y3w*lcM@4f8~Qnbt7* z0(>1F{fNf%(G_v@6C$vOrpEy_RQla^0+K>(OY$Efp@P_VML(L829ru{qWPR@Qsm<- zz|?nytk}^a#8#-i2vIq9>B=D$umz4#z zOo{z~Qk-I>JFoY9bA5p(Gl+4>7%AQK)3A4 zkw~N^kxe?^X6Srl;je{MV%pm_K% zt?+EEf1U^ED_3h2ahZ92!{m8#tI^^ujEmtVkNNj_fV@4!GV%bOu(-^9K&e=4=fGO= zwt*Ymk79z`4pgK{;e)?Uh%7%ZP$Ko>QCm#tH_g&4BsNh_TThIIz<2q;##Jfw3R=0+ z-|^i(1Orog8Lks#3$liWjVa4oW;U%iqb?N}C~WA!ZNU|_?J?Sn91#mu1$}Uq*9E2$ z>eOpL%19-N#ued8Sc8|ok;F&j186(pjyP|Hb8pG2MU4H22&GIQ(kM!^@U2${HAkfx z`--!;(k#wQZkjA!x3eT1)2LRE`HwFA7Kp&MLLb<1ap+|^Z;t6oGm1ZSHO>Z+7(9jp zR>s1ld1dcb(T%IrN`nbsG>UHuDWaujwA2Q}HO3~mgT|Ht%#AWgZ0PYOI7&D}w&Q{r z#%r5DN$lEnr;?5$0$?P$)+k4VH1*k*C}W@UH)-me3!8m|bkAe)j*Xd|Fci-z_@YF8 zu&vUaj&I|*$_yv?uXN3Y4jVJOD8F50u%hdq@N^JxwmVyhVu;gHj9W_sI-D26n>hm8 zfy2YjnqNfzG` zI~I<{hnwo;vPXg&dboE4A$sf_alUF(MG#NPfAot?=i$n63!K^_W@E8?jMgdiPfUMc zd*;0B#B8Iw&%?EdfpRxebaCQr2LmuFOzg|4FnYnp&alYtG4hxZu^gc!w$&^o2>s;^ zu3b+^7nvJ-vQA>n;sGxNM3`o2BgnGov;zBHGEfCUr1Jr0hSh@VNzzzg!uE5pbn?h3 zWKDM@kbDiu_0wjkP^xjRZTcm|ZenfbX)Iznx2XzAqkw=;I4+a=mnWngD#^;1O{F1f z3tY-Y2zenBjk@{@vYu%*N>)-R-k^rqM?^1e`9jYzcXO5k;2<&JtJEh6`$^hP;Cu!; z8}T$4;S7tPkX%j?lc@&|`%bkh;>N~KqMHSWp}&N&W~23NJBJr(rfY>&9OR4s()=O^ zgl0xz@A`(JzfRwk7WOU=pC#HwXQtA|@U|pM#eb?)cI=f}s@X$K3$ON<5ED$~3^D z$m$|`_3|Q_M)?^sPKwejNMXZrp6i#TQK{5=wtm{CVL)M4pt;c?CEtNUpvMs}6ztoD zcOO<7TLw6w*dFj^Eg_Omj@ooLYc+7KWR@YKekxjH=!%(98lF~Hc%(%4M!{o#s z*(606m$pnTPG=RA?d(7mkt|WzyB2mzBwb55jg+n=EhTE4osy)>4_CmQl%{-+{fvK2 zZ1F)jo86uS-<+eTKWraU%PrlkooKmp4QjY19WTvxil5gPceIpg75O&C7puT+wrtR% zVX+u=exyf5xl-i%=zzVX6KBugLX0|=k&Fbh+>5#4V+-n4WGteS{U2Gy?f(eG-Xbr%_&>4CmH($K z_IHY^yI?coY-&pQG`z33e~^ zuw;rMJsWQK_VWva7%;VoCp$%_d*mG*D5ISx`{66`c>+%!?@JU`Xy1DI?IxArAOUk( z5G@jMLFfoFRvzpR{-K02i~5I{IZL3{n59TpTOeh;R-2EP1fJ-Z-JLt7I~mZfhJgO# zW;8)~AIf~6h*DwM%p?bF6NyA_`0W8T1{Aeem&5nY^gs2yY^(sN%Udd~gzg$bSN*X6 z(<}r1Z+ri%m#4RvOaGU{aNAW`nErR`tnTd<8!I-1CFO;BMaB6>==JgWnUuKppkyB8 z-C$IkERg#EO-rgeG_Y>}UCr-dGMn8qH5sHXBSS;d17i$63Qb^KpiI$CZir8f%!^3j z>C@s{03x!HLM?zowJ7{j@lUYEl`6aav zAmq)?a4B}oi356H6br$JcWkjx3&GBl=MAkzkx36uIo-#X0rNo*LW)fd2OM{JBYP3H zgA>F5A5{LJ4XD}6{uFsayf#c{YF3v~7GS8baQ!c}*Z(q+OaI#`>vDKdsQx#5hlxA& z4e6#5cMge)2oK85RZ7(H#nk_WIQB)F2Ib=U7kci$s6&IK{uV1W@;+jfG*4>nlb@ZG zpbeJ##+D*480G4D=unIy5NB&LXw04PJ{MktcnY>q^Po^8pya9-Q5Ql}$Jf6_srh0X z54@bJr7=^AvIMxC0%UJUTcS`~fo~2tnG_{52l!E>&WI`kH^3sv+CDNFkBu*;Nl>`f zFVtWtcaxx)DxYULI2&0W!vBxj1+3-=rH>RpPyd%u7SJN~zr^VIi)pWgDENNI>FDnTy|i`Q5~joyL(dHo+N3^gbAjm!+p5k(rbVM)R~d8GN-^uN{k z{A&MXOj|kWejZR>{<@#)ODQ$Klj-n`n%|zJlIeYKo@eaR`x4LIda2MDBndQjvu4`B zYKi$~*vYWpK){)n9PdJwR`1)7>+_@aIXzIQ{x72}fJN$myZk?1o-!By&ka&JekxS| z$7)iH(p;^vQ?yTFWQ1O#Gw8bYE-wE6@AdyPR4N}!cxYaJm)uVIrXZh$p!CSDyu^OR zJ4H(S|9Ze4o=@%1P*zU5pO-YSe04w5lTvDaCllcrG`}N)N~HHi-rhX^m80VKk?_(Z z7INma7*PWJJ%AU{;kRK2&*678tk0v`XEjQp`oD~_0G3MsyYm0CV^p3W3f2F;JvHHp z>dxJisoAoai2N>ILXmI2%l{8DYRs9Pw9?cNWnyS>XQQ`4lP=;p8YR;IMhFCdKJ`CC zSvl!{UM7R`)&ERSN~!;yOoV69|BeVMk^UD0R7>`zJoUfS24aYVV+9Z&Vedx&H}pTB z9X$Q-Xjord{a;2|po-N0knBn1DU*o2Ai1>+5Kh5-G%CZaeR7ocw!e} zOz%u>aE2}~-jW;?=<@&jnzKymgv_|Wt`>cmXNaXsdc3Gx>HU8r0v`=lyO6=>WB;F| zuAJ-uUizqVwga5-x&-_GPA0{(*aA+7Dv>=P@|M|X>2kY%z=y8@|MPeNpB;RAz{$`) zH#UJ2|KF!&cGqWw?GOZs+g>*(3n2wra+<5evCVY9X0=s zd5}5?&QY7;`WJ|)7rA@Fz4Q=MWl+Htmhd1sDNN{-=GGBk2kH;x5rxI5F!hBpOQF}R zwbU;-vM#_M-$&U;VG_{4dr<$Qquc%v2AD&X0G0*#d*FxoYvSl2QHuA}gZvF22S@d? zcVG(8iYrI=Yf>~pYH(foQpa3A1s$;^%|FwsfeS*-acao76$M=f##&5PHE@sP62${l zlA;riw}vPzYN7;ipL*iKe21Ck!S&7N4p4s&-ngJ6C;_B+AzMNn3`3Xcc$d2v!J53_ z{X)&OBEX!{etv;wvl`C6G7R(c>y#87#r($aZ6W4d7F>1~gfgO|x@`{Mk^_&M zF8)nZJ~Cf#Z=0x6r_c||R1={OgIr0}sU99Ug^p6-Z2g!5dTjBidLULO@R!2pFwWDS z6+8_13lVWEsbv&#ykEFjX1;_M{e zQ#(@&TSS}{NZ+lFpK@l>KVzW&i>*LjC`d(Ffl)AHC@auhk!D~a&6dm#6!Eq?Upza| zN9JP#E|#Gk=z-XbjY0E^U9)u9ov6m&x*AF9OnNLyUzbUlVMlPmtFRsbNf#i z7!zeQB!$Ka_0qW5KvhCsaNmSd#QE6bf7t#*pp{t&xrK#R00mrjV42y0h@EoGU8>6R zw*~)`a3KGt@(MKs!_d?b0MsN%hOw@2gRt=COJ*2KUu=L708S|n=qqF|xa0sKHViSh zVXVyX^U!fLgFBt_pqNHP5ygtw{}p>lq&E1Ux73yYr3j{$(br8!R;Oxu zX}|Kz4#*pjd8vC<+IQ}i>Zz4qtJSbp?VY1)M@L2Pimui0f3<4Yjvm$Ue;=e~z213b zWZjV;#I%i#?(DH^ldkEz`Cp#@pweYu&r!$b1U8?YGGoT%>C;owqJmQ@Z``sv&DECwcy)%p{>0&RYt^lF@{s78 z)Rh;nom{slWyy)}G>KO0ouRcGd+U#PO-xKoO())JR;Q#iXx#YN`j4t9mCBTFy7oT1{qqa^=MQ>t zbM8++^}Bgy+xgvJO!Kp5CnO~F>(?(oKR-A)I6Qm{6dBW`!^2C5mK<6lpXqC!H-G+? zBS-R&ey3TxcI}Qy9%Dw2j){z%Cdu6WO}7;zMvQ1D6#Dx3WbB-L=x%}iR-Lczu?#S2nU8&kOzIEcf*&g9i`(;&=PZwh2%<@KCK%se*zw{5;^%x!qs%dvx~- zJU+Q@Pyz7m&6Y7h#HvY?8b~BSDaMj{rdHjlYig2b7##4 z?)?j%4tVnLPC-FIc#K=KVTCP+q&aR|MkDznECF+#9z}tyfpp&UH!tn zeRN&(CXbpj|J3Qh4JJ&UB9V1FGu@~E2cveKct3phXTNv%j7r^p>fFfWm?%Zv{5CUQ zTlnUbBW}|-)$o2hMpgT-h-LjQ2;BVRKRVTAN3}__YyY9!SvTPIPgBR-sS&>ETK-pm z_y06Bebn#|c2^zxQM;&i0afbPeCxH9CiC!3?TmT1RehV8H#VyFX3MKBTCWTrseN~yv-byg4u2tR(VuQZQZfz{AFJ79#{!W#8DX85%6T|Pu|{y_h{y}Mhh{yLPoblDH;4XTtCAHTh0Z0KwK zPo=xp+OoN-&i#k2>fil+cCL9mtjfrVKUWT}xunvtphc?&e>r%OPtKTG6O7ZMKWv-x zdCdteb3fb_8mpi8zqvINK6J0P_VB}X)%_OLU(rgs+{e9_9e;pU(t6ze&tH-T8kx}M^sH{G~QC{v$b=(weYI>dF=kQ zUv(?aw)p7#MdQ!Kf1dpMYhQ~zTdt|QSKsRBg{?ni9r>nRwO1~^G45)lxU+eJMRTl% zVC_?xNG5HxxZuLLO5v9Z_B|Z*-P2*`r0wn$tQ*&(px~Q^@J)QJF-JvjRhj*+=UY`Q zuUD>=Vv^UZ^i~-y(B)i>eXad!FMCy_;?$o`>WLIUn@n|@Wh%2KjiN?_2bA@p`oGQ-*X>u z^Y)cFjdE7ET(a7H{=%w1TAo-}aP#toW4||k{o9kqKTps7sph0BeeYepb#QTb6aT!G zy>FdrwBk?`pZ@2L59vN^OppAhk9!0^y1Zl3k}o>uDlZ*e>mmQS$GU+98;9*_5hWjR z^T5jFMfbEv^0m9CzuZ2z$+2aRcJ4oKXmfFXl5EeKe)qop{`)~;10QW_oilpI4>vCz znmMNFx)VPYoc?{$>u1mYK5N#jDKB5ywyjaY)2B22bUk`%awG19eBAMucAICm`?OXq z?^=F>CR<}`X}iC3=ES0ghdWsUF2o)GCBF5~_ca$Twu*0YlC?Yy4S=vmq}OFjXzy4V@=DgTNk~TK36+ixp`L3jdP2K%=vuix(oV6hLb|! zk?C(Y`etAMFo`}QOrsy~u8XYv+pTrO-&p#EPin#bb_d^hrP_cf5JCqg(S& zmxl%Sl2#2%1tWC+YrBn=>Q;!*yBc9R;5fN$g|7c%Pj9>RUkX=(2q0B>`Twy3U}J(b zsJZHN2*`8ZUQyrUjT9=mIee^C$=!KX&(k;0=lVZl1m*f&?1NmtU-rJ;ppuWup9i*ABZ6J@MOfvCEu`^B4Ro&zw4Ny7r-N z^n*!LTFjgjK5)j@cjoQ5z2CBU!^4 z7lyr>As@Z?;iIQFW**8taqr@w!vT-(eesUr=i^UA zf$=vB)(twDtNB@bpy20q52EL9yEebUN$(wlx=txj&wFraLfaYj+6?X^wR z3)f6Lb#LCrzxVgQ=20#4$&<$qFGY>~{*M+jGgAjnPk;E;$-lRpx|;jW#XX&qPed6D z4$r^4I^xNd_s&;q-DZsW?954R)-FsLctm@9`H}nGrkptBo6)r8#s1UNpFX-e185pF z^{?xS@n?_4OgJ{KjVxF_^WfnQOAhq!u&?0Sv}xB`P988__4Lt=Dd6kv4;WRuQRDv& zTJ9}2}x!K>}_BG1lf zwew8Rt-ttxq#XIng4Q#t3@+&3u;GW(^Ba5pTrW@Bq|1eU-{x&xdSmSQDuDwU*B&># zb9lm>H4S2~*V*3H^0TZ}Nat|3A3sqq%X~L7dGqX-BKdtp(9i5y#PxF-} zyT*!;lFz17u)icYS@z*Kb){S%bcOZ?;qxF=^G}O21tiq+GG@ zZb$3sNn=~jzEhC(B(~M4Pa8e}H)m7Gov*{gv33sbHD_3*O7E;+u=GXoYM!SR_W7p8 zab}x})&JgNkuCn~4Jkog`o981=lRtCHxt@+#@^qBJdFJwsMD;Val_Go{QmmtPHk?i ztmcl8S6_K`=(S^k>9EWf+`D!XVSJ$;M- zSHL*$Uq1y{??k?{Bz5c|S{J(x31t_Har#@Gqg0Qzsg{RS}cfddB) zA3nTyZ=75%Pf1DX-n~0uyghpKNKQ@$I6OW+9&qt4UAm;ErUKxdmX?;3l+?9r*SNT` zGiT16G-=YbY11Z5nDF`MpHG=GW!$)NGiJ<~IC0|CsZ+;~A3uHi^v^!~Z1UuWO`A4t z&;T&?#`Wse18})XlO_P=zV+5y4IBP_>C&YuSFT*RaN*RcQ-C7>`DZVkPN&!FRjR7m z9v3cM%E`{o&dU0F;leg;+qP}px^t^NLsz-nh?aWi`Td4JE?J*}0Z^(#}3zNZNswsGi? z-KKAKvF>U8j|aqWOWWc$|HC8Z@%qPZ^*4Vxd;a{dSBGyq{`H?%C(n7uyfys#gyqA= z_B{92%RAi8hGo{96rJNf(C>8fd2jygKFd6z&9$U@HND?_^Ih5CDGwVpI5+)r!mTgV zpFP+Zd?R81N5lK-4Bt*~*K=UZuM7V?`}wF1d-iNwm=|$la@8N@)2|)Aes=TvKko)~ zyL7W@#{lol`_(&pMql;4e|B@#Mn6rJHK^6nqivq*WSg%Re0FA**OByj<1@zXXfvqM zeq+<%mgoLDf6h1eLiBBa)h|Ep&8$1-uZ4SmpEPgL;+?4v+a4Y@Xz<1}HEVo2WPWU` ze)pc%={jfO0Nv*oPLG{XkU8M2f6FTe%(3As;*Ob@_514!4@vOKpe|JlzHeRcVc+bd z;uQ~TH@CwBw$QpYOi<%BPDyUgLY%`{&dZ zQ$`J0-?w3l+_957^Ppl+X=4NxpBZ~`&{8Wls5+(=e6+mEoTmk{<(CQuwG6jB*>h@_ zXy>IteGiCc_xW__FIm-V?XFX)Qc})U;XhzrInHcTq55CqEw(-X;VqWA@ZSp1{*@|m z`v1!0{HVkS^|uWAeyy;Fd)KVN0qs_ProKHqE-ObdRJP=UiMpT>f@U8E9|?@V8yYH{ zd->(c!>fE)Kkj(krPn?=T;ud7twQ5x2MS}ud)J=zhH-F8bVk2zs+;3AGd%7-HUpsB z;r!#D&*xr!a{N*yi=kcpkz3AIxxVjK*L8h=_4u_)OuHt>hHpH3)2H1pMw98Z-%CU9 z*8ih>SZd#pg{!{%X7bh_KK;1k?t7V+j_%T2*?%tJLC4XzyDj!nZ4M0y-8^URg{5s4 zH>v46UH<6XwNEXt4b-e#wSV2Ub&@d~U#_)y>S|e!J0}D0%`K?c=y260gP){S{cX$r zbx8tWQTpQGw4iU?M;1(Ykh$VW%>wh&1~(5sd~iq|J8<-sv(1dXNA;@GVshL^l)jGp zD(>>J@2_ng*Q{wk|16#E53nw7-?qfW>|UnaG8!z4)0>9hy?b}nD(?kJBi8qN?QNg9 zo;?R%Jg`96eU-&xk$QWdJ9{>{OP6nZuI&q&x8J?1yY}okbnfU6y=Qlx3rcJ2?%gL= z>AHu7{R)-_m<+==o?5tY;VS(fM-LoG>e6N6j2S-NoDShZ@^*I&c#ZEK-WD3i(D-FNTZ>nRp5U%K@A?F;+ic~TpzN_FPSvG4EPx%0&r zU+mho3sg4P5$(*w#kv)a|q>D8-F!-iicwOO%z`5Ds#FpqZ6=I0u4Lt^`>AQnSWoH4A#xM z+-oyJ+ycLf%e{7@HpCA^MP0sjZRX_3)oavPzH%k($$AZbAGGo8eOaK@)rT{rj*BzD>0pjI1^Jw=!Ux94x7+)2Cm)diBK0oJnA+z-B&d z{CDj-dF4tgT$>Ko#O&FBfpsPSx&MW8=ene%-5cm4E*EXT7#vZr{DT@b_%6 zk-$U`MBTl2ZPKT3X$loO8b&Z*lMI@61aZv^~&p!GhjP zw+R;1czM#{Wt!69PenBQW^@Lq3pUc0q>isJKewTWWLo%p zAE?GH5LyS;*}3reD1F%El<}Yc*mK6R*ZkLi)F`b|;_&ffFX^|9snYEwn47%3A?V~zxZ+T~LkEdtb zPVqQUN%GS^QS0ChZ+UpR4Q})Pm+H3fZTX1oX_$-SVuT~&+PuUW>@!a_4M0i(+-ZT>fUqj2cD0vq_&TE zrT&!8;|?qhX?4EA0$jP3oBsNN@e|A2t2&?DarxJ7-?v%)&eLv^q29f&RT+?VP+WU_^)&XH3zB}r(hN1;)Le^|G-P<^}ZNs`gjpLJU?Q=g=fA;nR+5hufT75$!p=bTT z!vkh*Pdhf@^`y1uQtJCYid(icZu9G#=k%@9tLlaoRVFTYuwv`RZQ`7DO){>fTng{- zuv1E>Hx}xy5Bssh-SJ1aR+%>EN9EWXrcI4L+K?o_q8?G{%wK;d8#dHv8RQml$`rG_ z@`cC!=1!gxQ6p}7wfhVI>XQ6>c(3`s*A_hPHu>dt%L?XIt6XJ5ol}~6BZe;U=(q9L z^&fT3{$^)H4Q-nb53GOuQ+SQ&{$4wK-hKV%jwN0V8@eUD>6<00J~veU(bHv%;{EPb z%TD}h-d9KJ&TC#(vv6--l(-DD)*i7>-ga`Gsy{zSYtn9};hhUN8ZBzp;O~i53i>_$ zYw7gw)>XcJa?t9IvUR6AMs_H;@E~^2pmpchUGSJzFt2I8C9tLClcG;{{r@(>-SRjO^P4lU^zGi8KX0>KzBC`}P}f zV%B0w#fyB6XW9j3ptwnXfR;_C3UiVnN0SD;nKI|xs_omh?V0iYg_9=>uJjl=@!JzWDK u51O`a{i&GRXXpx10Fgme{asN26*Bc*jkq}A;=q5L1OEs6{Wt{xtN{S7Pwk5U literal 0 HcmV?d00001 diff --git a/docs/upgrades/upgrade_7.4.10-7.5.0.pl b/docs/upgrades/upgrade_7.4.10-7.5.0.pl index 11518cb43..a26c629e9 100644 --- a/docs/upgrades/upgrade_7.4.10-7.5.0.pl +++ b/docs/upgrades/upgrade_7.4.10-7.5.0.pl @@ -112,8 +112,9 @@ sub installGalleryAlbumAsset { CREATE TABLE IF NOT EXISTS GalleryAlbum ( assetId VARCHAR(22) BINARY NOT NULL, revisionDate BIGINT NOT NULL, - othersCanAdd INT, allowComments INT, + assetIdThumbnail VARCHAR(22) BINARY, + othersCanAdd INT, PRIMARY KEY (assetId, revisionDate) ) ENDSQL @@ -142,24 +143,29 @@ CREATE TABLE IF NOT EXISTS Gallery ( templateIdAddArchive VARCHAR(22) BINARY, templateIdDeleteAlbum VARCHAR(22) BINARY, templateIdDeleteFile VARCHAR(22) BINARY, + templateIdEditAlbum VARCHAR(22) BINARY, templateIdEditFile VARCHAR(22) BINARY, templateIdListAlbums VARCHAR(22) BINARY, templateIdListAlbumsRss VARCHAR(22) BINARY, - templateIdListUserFiles VARCHAR(22) BINARY, - templateIdListUserFilesRss VARCHAR(22) BINARY, + templateIdListFilesForUser VARCHAR(22) BINARY, + templateIdListFilesForUserRss VARCHAR(22) BINARY, templateIdMakeShortcut VARCHAR(22) BINARY, templateIdSearch VARCHAR(22) BINARY, - templateIdSlideshow VARCHAR(22) BINARY, - templateIdThumbnails VARCHAR(22) BINARY, + templateIdViewSlideshow VARCHAR(22) BINARY, + templateIdViewThumbnails VARCHAR(22) BINARY, templateIdViewAlbum VARCHAR(22) BINARY, templateIdViewAlbumRss VARCHAR(22) BINARY, templateIdViewFile VARCHAR(22) BINARY, + viewAlbumAssetId VARCHAR(22), + viewDefault ENUM('album','list'), + viewListOrderBy VARCHAR(40), + viewListOrderDirection ENUM('ASC','DESC'), workflowIdCommit VARCHAR(22) BINARY, PRIMARY KEY (assetId, revisionDate) ) ENDSQL - + $session->config->addToArray("assets","WebGUI::Asset::Wobject::Gallery"); print "DONE!\n" unless $quiet; } @@ -177,8 +183,8 @@ CREATE TABLE IF NOT EXISTS Photo ( revisionDate BIGINT NOT NULL, exifData LONGTEXT, friendsOnly INT, + location VARCHAR(255), rating INT, - storageIdPhoto VARCHAR(22) BINARY, userDefined1 TEXT, userDefined2 TEXT, userDefined3 TEXT, @@ -215,7 +221,71 @@ ENDSQL } -# ---- DO NOT EDIT BELOW THIS LINE ---- +# --------------- DO NOT EDIT BELOW THIS LINE -------------------------------- + +#---------------------------------------------------------------------------- +# Add a package to the import node +sub addPackage { + my $session = shift; + my $file = shift; + + # Make a storage location for the package + my $storage = WebGUI::Storage->createTemp( $session ); + $storage->addFileFromFilesystem( $file ); + + # Import the package into the import node + WebGUI::Asset->getImportNode($session)->importPackage( $storage ); + + # Make the package not a package anymore +} + +#---------------------------------------------------------------------------- +# Add a template from a file +sub addTemplate { + my $session = shift; + my $file = shift; + my $newFolder = shift; + + open(FILE,"<",$file); + my $first = 1; + my $create = 0; + my $head = 0; + my %properties = (className=>"WebGUI::Asset::Template"); + while (my $line = ) { + if ($first) { + $line =~ m/^\#(.*)$/; + $properties{id} = $1; + $first = 0; + } + elsif ($line =~ m/^\#create$/) { + $create = 1; + } + elsif ($line =~ m/^\#(.*):(.*)$/) { + $properties{$1} = $2; + } + elsif ($line =~ m/^~~~$/) { + $head = 1; + } + elsif ($head) { + $properties{headBlock} .= $line; + } + else { + $properties{template} .= $line; + } + } + close(FILE); + if ($create) { + $$newFolder = createNewTemplatesFolder(WebGUI::Asset->getImportNode($session)) + unless (defined $$newFolder); + my $template = $$newFolder->addChild(\%properties, $properties{id}); + } + else { + my $template = WebGUI::Asset->new($session,$properties{id}, "WebGUI::Asset::Template"); + if (defined $template) { + my $newRevision = $template->addRevision(\%properties); + } + } +} #------------------------------------------------- sub start { @@ -244,49 +314,24 @@ sub finish { #------------------------------------------------- sub updateTemplates { - my $session = shift; - return undef unless (-d "templates-".$toVersion); - print "\tUpdating templates.\n" unless ($quiet); - opendir(DIR,"templates-".$toVersion); - my @files = readdir(DIR); - closedir(DIR); - my $importNode = WebGUI::Asset->getImportNode($session); - my $newFolder = undef; - foreach my $file (@files) { - next unless ($file =~ /\.tmpl$/); - open(FILE,""WebGUI::Asset::Template"); - while (my $line = ) { - if ($first) { - $line =~ m/^\#(.*)$/; - $properties{id} = $1; - $first = 0; - } elsif ($line =~ m/^\#create$/) { - $create = 1; - } elsif ($line =~ m/^\#(.*):(.*)$/) { - $properties{$1} = $2; - } elsif ($line =~ m/^~~~$/) { - $head = 1; - } elsif ($head) { - $properties{headBlock} .= $line; - } else { - $properties{template} .= $line; - } - } - close(FILE); - if ($create) { - $newFolder = createNewTemplatesFolder($importNode) unless (defined $newFolder); - my $template = $newFolder->addChild(\%properties, $properties{id}); - } else { - my $template = WebGUI::Asset->new($session,$properties{id}, "WebGUI::Asset::Template"); - if (defined $template) { - my $newRevision = $template->addRevision(\%properties); - } - } - } + my $session = shift; + return undef unless (-d "templates-".$toVersion); + print "\tUpdating templates.\n" unless ($quiet); + opendir(DIR,"templates-".$toVersion); + my @files = readdir(DIR); + closedir(DIR); + my $newFolder = undef; + foreach my $file (@files) { + next unless ($file =~ /\.(tmpl|wgpkg)$/); + my $type = $1; + $file = "templates-" . $toVersion . "/" . $file; + if ($type eq "tmpl") { + addTemplate( $session, $file, \$newFolder ); + } + elsif ($type eq "wgpkg") { + addPackage( $session, $file ); + } + } } #------------------------------------------------- diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index bddd26f20..3e9ffbe4e 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -14,6 +14,8 @@ package WebGUI::Asset; =cut +use Carp qw( croak confess ); + use WebGUI::AssetBranch; use WebGUI::AssetClipboard; use WebGUI::AssetExportHtml; @@ -1336,12 +1338,12 @@ Loads an asset module if it's not already in memory. This is a class method. Ret sub loadModule { my ($class, $session, $className) = @_; - (my $module = $className . '.pm') =~ s{::|'}{/}g; + (my $module = $className . '.pm') =~ s{::|'}{/}g; if (eval { require $module; 1 }) { return $className; } - $session->errorHandler->error("Couldn't compile asset package: ".$className.". Root cause: ".$@); - return; + $session->errorHandler->error("Couldn't compile asset package: ".$className.". Root cause: ".$@); + return; } #------------------------------------------------------------------- @@ -1752,6 +1754,7 @@ A specific revision date for the asset to retrieve. If not specified, the most r sub newByDynamicClass { my $class = shift; my $session = shift; + confess "newByDynamicClass requires WebGUI::Session" unless $session; my $assetId = shift; my $revisionDate = shift; return undef unless defined $assetId; @@ -1895,6 +1898,7 @@ sub processPropertiesFromFormPost { $self->session->db->beginTransaction; $self->update(\%data); $self->session->db->commit; + return; } @@ -2082,6 +2086,9 @@ Updates the properties of an existing revision. If you want to create a new revi Hash reference of properties and values to set. +NOTE: C is a special property that uses the WebGUI::Keyword API +to set the keywords for this asset. + =cut sub update { diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index f58f7472f..4926fd559 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -55,17 +55,17 @@ Override the default method in order to deal with attachments. =cut sub addRevision { - my $self = shift; - my $properties = shift; - - if ($self->get("storageId") ne "") { - my $newStorage = $self->getStorageClass->get($self->session,$self->get("storageId"))->copy; - $properties->{storageId} = $newStorage->getId; - } - - my $newSelf = $self->SUPER::addRevision($properties); - - return $newSelf; + my $self = shift; + my $properties = shift; + + if ($self->get("storageId") ne "") { + my $newStorage = $self->getStorageClass->get($self->session,$self->get("storageId"))->copy; + $properties->{storageId} = $newStorage->getId; + } + + my $newSelf = $self->SUPER::addRevision($properties, @_); + + return $newSelf; } #------------------------------------------------------------------- @@ -173,23 +173,50 @@ Returns the TabForm object that will be used in generating the edit page for thi =cut sub getEditForm { - my $self = shift; - my $tabform = $self->SUPER::getEditForm(); - my $i18n = WebGUI::International->new($self->session, 'Asset_File'); - if ($self->get("filename") ne "") { - $tabform->getTab("properties")->readOnly( - -label=>$i18n->get('current file'), - -hoverHelp=>$i18n->get('current file description', 'Asset_File'), - -value=>'

'.$self->get( '.$self->get("filename").'

' - ); + my $self = shift; + my $tabform = $self->SUPER::getEditForm(); + my $i18n = WebGUI::International->new($self->session, 'Asset_File'); - } - $tabform->getTab("properties")->file( - -name => 'newFile', - -label => $i18n->get('new file'), - -hoverHelp => $i18n->get('new file description'), - ); - return $tabform; + $tabform->getTab("properties")->raw( + ''.$i18n->get('new file').'' + . $self->getEditFormUploadControl + . '' + ); + + return $tabform; +} + +#---------------------------------------------------------------------------- + +=head2 getEditFormUploadControl + +Returns the HTML to render the upload box and link to delete the existing +file, if necessary. + +=cut + +sub getEditFormUploadControl { + my $self = shift; + my $session = $self->session; + my $i18n = WebGUI::International->new($session, 'Asset_File'); + my $html = ''; + + if ($self->get("filename") ne "") { + $html .= WebGUI::Form::readOnly( $session, { + label => $i18n->get('current file'), + hoverHelp => $i18n->get('current file description', 'Asset_File'), + value => '

'.$self->get( '.$self->get("filename").'

' + }); + } + + # Control to upload a new file + $html .= WebGUI::Form::file( $session, { + name => 'newFile', + label => $i18n->get('new file'), + hoverHelp => $i18n->get('new file description'), + }); + + return $html; } @@ -200,10 +227,10 @@ sub getFileUrl { return $self->getStorageLocation->getUrl($self->get("filename")); } - #------------------------------------------------------------------- sub getFileIconUrl { my $self = shift; + return unless $self->get("filename"); ## Why do I have to do this when creating new Files? return $self->getStorageLocation->getFileIconUrl($self->get("filename")); } @@ -246,6 +273,7 @@ sub getStorageFromPost { my $self = shift; my $storageId = shift; my $fileStorageId = WebGUI::Form::File->new($self->session, {name => 'newFile', value=>$storageId })->getValueFromPost; + $self->session->errorHandler->info( "File Storage Id: $fileStorageId" ); return $self->getStorageClass->get($self->session, $fileStorageId); } @@ -295,45 +323,21 @@ sub prepareView { #------------------------------------------------------------------- sub processPropertiesFromFormPost { - my $self = shift; - my $session = $self->session; + my $self = shift; + my $session = $self->session; - my $errors = $self->SUPER::processPropertiesFromFormPost; - return $errors if $errors; - - #Get the storage location out of memory. If you call getStorageLocation you risk creating another one. - # How can this EVER be true? - my $storageLocation = $self->{_storageLocation}; - $session->errorHandler->error("Storage Location set magically") if defined $storageLocation; - my $storageId = undef; - $storageId = $storageLocation->getId if(defined $storageLocation); - - #Now remove the storage location to prevent wierd caching stuff. - delete $self->{_storageLocation}; - - #Clear the storage location if a file was uploaded. - if($session->form->get("newFile_file") ne "") { - $storageLocation->clear(); + my $errors = $self->SUPER::processPropertiesFromFormPost; + return $errors if $errors; + + if (my $storageId = $session->form->get('newFile','File')) { + $session->errorHandler->info("Got a new file for asset " . $self->getId); + my $storage = $self->getStorageClass->get( $session, $storageId); + my $filePath = $storage->getPath( $storage->getFiles->[0] ); + $self->setFile( $filePath ); + $storage->delete; } - # Pass in the storage Id to prevent another one from being created. - my $storage = $self->getStorageFromPost($storageId); - if (defined $storage) { - my $filename = $storage->getFiles()->[0]; - - if (defined $filename) { - my %data; - $data{filename} = $filename; - $data{storageId} = $storage->getId; - $data{title} = $filename unless ($session->form->process("title")); - $data{menuTitle} = $filename unless ($session->form->process("menuTitle")); - $data{url} = $self->getParent->get('url').'/'.$filename unless ($session->form->process("url")); - $self->setStorageLocation($storage); - $self->update(\%data); - } - } - - $self->applyConstraints; + return; } @@ -421,18 +425,18 @@ sub setSize { #------------------------------------------------------------------- sub setStorageLocation { - my $self = shift; + my $self = shift; my $storage = shift; - if (defined $storage) { + if (defined $storage) { $self->{_storageLocation} = $storage; - } - elsif ($self->get("storageId") eq "") { - $self->{_storageLocation} = $self->getStorageClass->create($self->session); - $self->update({storageId=>$self->{_storageLocation}->getId}); - } + } + elsif ($self->get("storageId") eq "") { + $self->{_storageLocation} = $self->getStorageClass->create($self->session); + $self->update({storageId=>$self->{_storageLocation}->getId}); + } else { - $self->{_storageLocation} = $self->getStorageClass->get($self->session,$self->get("storageId")); - } + $self->{_storageLocation} = $self->getStorageClass->get($self->session,$self->get("storageId")); + } } #------------------------------------------------------------------- @@ -475,9 +479,11 @@ sub updatePropertiesFromStorage { my $self = shift; my $storage = $self->getStorageLocation; my $filename = $storage->getFiles->[0]; + $self->session->errorHandler->info("Updating file asset filename to $filename"); $self->update({ filename => $filename, }); + return; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index ccbf0dd44..568282979 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -22,19 +22,7 @@ use Image::ExifTool qw( :Public ); use JSON; use Tie::IxHash; -our $magick; -BEGIN { - if (eval { require Graphics::Magick; 1 }) { - $magick = 'Graphics::Magick'; - } - elsif (eval { require Image::Magick; 1 }) { - $magick = 'Image::Magick'; - } - else { - croak "You must have either Graphics::Magick or Image::Magick installed to run WebGUI.\n"; - } -} - +use WebGUI::DateTime; use WebGUI::Friends; use WebGUI::Utility; @@ -50,7 +38,6 @@ WebGUI::Asset::File::Image::Photo use WebGUI::Asset::File::Image::Photo - =head1 METHODS These methods are available from this class: @@ -72,15 +59,18 @@ sub definition { my $i18n = __PACKAGE__->i18n($session); tie my %properties, 'Tie::IxHash', ( + exifData => { + defaultValue => undef, + }, friendsOnly => { defaultValue => 0, }, + location => { + defaultValue => undef, + }, rating => { defaultValue => 0, }, - storageIdPhoto => { - defaultValue => undef, - }, ); # UserDefined Fields @@ -91,12 +81,13 @@ sub definition { } push @{$definition}, { - assetName => $i18n->get('assetName'), - icon => 'Image.gif', - tableName => 'Photo', - className => 'WebGUI::Asset::File::Image::Photo', - i18n => 'Asset_Photo', - properties => \%properties, + assetName => $i18n->get('assetName'), + autoGenerateForms => 0, + icon => 'Image.gif', + tableName => 'Photo', + className => 'WebGUI::Asset::File::Image::Photo', + i18n => 'Asset_Photo', + properties => \%properties, }; return $class->SUPER::definition($session, $definition); @@ -114,14 +105,27 @@ reference. Returns the hash reference for convenience. sub appendTemplateVarsForCommentForm { my $self = shift; my $var = shift; + my $session = $self->session; - $var->{commentForm_start} - = WebGUI::Form::formHeader( $session ); + $var->{ commentForm_start } + = WebGUI::Form::formHeader( $session ) . WebGUI::Form::hidden( $session, { name => "func", value => "addCommentSave" } ) ; - $var->{commentForm_end} + $var->{ commentForm_end } = WebGUI::Form::formFooter( $session ); + $var->{ commentForm_bodyText } + = WebGUI::Form::HTMLArea( $session, { + name => "bodyText", + richEditId => $self->getGallery->get("richEditIdComment"), + }); + + $var->{ commentForm_submit } + = WebGUI::Form::submit( $session, { + name => "submit", + value => "Save Comment", + }); + return $var; } @@ -143,14 +147,14 @@ sub applyConstraints { my $self = shift; my $gallery = $self->getGallery; - $self->makeResolutions(); - $self->updateExifDataFromFile(); - # Update the asset's size and make a thumbnail $self->SUPER::applyConstraints({ maxImageSize => $self->getGallery->get("imageViewSize"), thumbnailSize => $self->getGallery->get("imageThumbnailSize"), }); + + $self->makeResolutions(); + $self->updateExifDataFromFile(); } #---------------------------------------------------------------------------- @@ -247,6 +251,19 @@ sub deleteComment { #---------------------------------------------------------------------------- +=head2 getAutoCommitWorkflowId ( ) + +Returns the workflowId of the Gallery's approval workflow. + +=cut + +sub getAutoCommitWorkflowId { + my $self = shift; + return $self->getGallery->get("workflowIdCommit"); +} + +#---------------------------------------------------------------------------- + =head2 getComment ( commentId ) Get a comment from this asset. C is the ID of the comment to get. Returns @@ -292,6 +309,7 @@ Get a WebGUI::Paginator for the comments for this Photo. sub getCommentPaginator { my $self = shift; + my $session = $self->session; my $p = WebGUI::Paginator->new($session, $self->getUrl); $p->setDataByQuery( @@ -366,10 +384,37 @@ Get a hash reference of template variables shared by all views of this asset. sub getTemplateVars { my $self = shift; + my $session = $self->session; my $var = $self->get; + my $owner = WebGUI::User->new( $session, $self->get("ownerUserId") ); + $var->{ canComment } = $self->canComment; + $var->{ canEdit } = $self->canEdit; + $var->{ numberOfComments } = scalar @{ $self->getCommentIds }; + $var->{ ownerUsername } = $owner->username; + $var->{ url } = $self->getUrl; + $var->{ url_delete } = $self->getUrl('func=delete'); + $var->{ url_demote } = $self->getUrl('func=demote'); + $var->{ url_edit } = $self->getUrl('func=edit'); + $var->{ url_gallery } = $self->getGallery->getUrl; + $var->{ url_makeShortcut } = $self->getUrl('func=makeShortcut'); + $var->{ url_listFilesForOwner } + = $self->getGallery->getUrl('func=listFilesForUser;userId=' . $self->get("ownerUserId")); + $var->{ url_promote } = $self->getUrl('func=promote'); + + $var->{ fileUrl } = $self->getFileUrl; + $var->{ thumbnailUrl } = $self->getThumbnailUrl; + + ### Download resolutions + for my $resolution ( $self->getResolutions ) { + push @{ $var->{ resolutions_loop } }, { + url_download => $self->getStorageLocation->getPathFrag($resolution) + }; + } + ### Format exif vars my $exif = jsonToObj( delete $var->{exifData} ); + $exif = ImageInfo( $self->getStorageLocation->getPath( $self->get("filename") ) ); for my $tag ( keys %$exif ) { # Hash of exif_tag => value $var->{ "exif_" . $tag } = $exif->{$tag}; @@ -428,6 +473,7 @@ contained in. sub makeResolutions { my $self = shift; my $resolutions = shift; + my $error; croak "Photo->makeResolutions: resolutions must be an array reference" if $resolutions && ref $resolutions ne "ARRAY"; @@ -435,15 +481,14 @@ sub makeResolutions { # Get default if necessary $resolutions ||= $self->getGallery->getImageResolutions; - my $storage = $self->getStorageLocation; - my $photo = $magick->new; - $photo->Read( $storage->get( $self->get("filename") ) ); + my $storage = $self->getStorageLocation; + $self->session->errorHandler->info(" Making resolutions for '" . $self->get("filename") . q{'}); for my $res ( @$resolutions ) { # carp if resolution is bad - my $newPhoto = $photo->Clone; - $newPhoto->Resize( geometry => $res ); - $newPhoto->Write( $storage->getFilePath( "$res.jpg" ) ); + my $newFilename = $res . ".jpg"; + $storage->copyFile( $self->get("filename"), $newFilename ); + $storage->resize( $newFilename, $res ); } } @@ -512,8 +557,12 @@ sub prepareView { sub processPropertiesFromFormPost { my $self = shift; my $errors = $self->SUPER::processPropertiesFromFormPost || []; + + # Return if errors + return $errors if @$errors; - + # Passes all checks + $self->requestAutoCommit; } #---------------------------------------------------------------------------- @@ -566,7 +615,9 @@ sub updateExifDataFromFile { my $self = shift; my $storage = $self->getStorageLocation; - my $info = ImageInfo( $storage->getFilePath( $self->get('filename') ) ); + return; + my $info = ImageInfo( $storage->getPath( $self->get('filename') ) ); + use Data::Dumper; $self->session->errorHandler->info( Dumper $info ); $self->update({ exifData => objToJson( $info ), }); @@ -584,16 +635,19 @@ sub view { my $self = shift; my $session = $self->session; my $var = $self->getTemplateVars; - $var->{ controls } = $self->getToolbar; - $var->{ fileUrl } = $self->getFileUrl; - $var->{ fileIcon } = $self->getFileIconUrl; $self->appendTemplateVarsForCommentForm( $var ); my $p = $self->getCommentPaginator; - $var->{ commentLoop } = $p->getPageData; - $var->{ commentLoop_urlNext } = [$p->getNextPageLink]->[0]; - $var->{ commentLoop_urlPrev } = [$p->getPrevPageLink]->[0]; + for my $comment ( @{ $p->getPageData } ) { + my $user = WebGUI::User->new( $session, $comment->{userId} ); + $comment->{ username } = $user->username; + + my $dt = WebGUI::DateTime->new( $session, $comment->{ creationDate } ); + $comment->{ creationDate } = $dt->toUserTimeZone; + + push @{ $var->{commentLoop} }, $comment; + } $var->{ commentLoop_pageBar } = $p->getBarAdvanced; return $self->processTemplate($var, undef, $self->{_viewTemplate}); @@ -609,14 +663,15 @@ Save a new comment to the Photo. sub www_addCommentSave { my $self = shift; + my $session = $self->session; - return $self->session->privilege->insufficient unless $self->canComment; + return $session->privilege->insufficient unless $self->canComment; - my $form = $self->session; + my $form = $self->session->form; my $properties = { assetId => $self->getId, - creationDate => time, + creationDate => WebGUI::DateTime->new( $session, time )->toDatabase, userId => $session->user->userId, visitorIp => ( $session->user->userId eq "1" ? $session->env("REMOTE_ADDR") : undef ), bodyText => $form->get("bodyText"), @@ -638,14 +693,17 @@ this Photo exists in. sub www_delete { my $self = shift; + my $session = $self->session; return $self->session->privilege->insufficient unless $self->canEdit; - my $var = $self->getTemplateVar; + my $var = $self->getTemplateVars; $var->{ url_yes } = $self->getUrl("func=deleteConfirm"); + # TODO Get albums with shortcuts to this asset + return $self->processStyle( - $self->processTemplate( $var, $self->getGallery->get("templateIdDeletePhoto") ) + $self->processTemplate( $var, $self->getGallery->get("templateIdDeleteFile") ) ); } @@ -663,7 +721,7 @@ sub www_deleteConfirm { return $self->session->privilege->insufficient unless $self->canEdit; - my $i18n = $self->i18n( $self->session ); + my $i18n = __PACKAGE__->i18n( $self->session ); $self->purge; @@ -674,6 +732,25 @@ sub www_deleteConfirm { #---------------------------------------------------------------------------- +=head2 www_demote + +Override the default demote page to send the user back to the GalleryAlbum +edit screen. + +=cut + +sub www_demote { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + $self->demote; + + return $self->session->asset( $self->getParent )->www_edit; +} + +#---------------------------------------------------------------------------- + =head2 www_download Download the Photo with the specified resolution. If no resolution specified, @@ -719,10 +796,36 @@ sub www_edit { return $self->session->privilege->locked unless $self->canEditIfLocked; # Prepare the template variables - my $var = $self->getTemplateVars; + my $var = { + url_addArchive => $self->getParent->getUrl('func=addArchive'), + }; - $var->{ form_header } = WebGUI::Form::formHeader( $session ); - $var->{ form_footer } = WebGUI::Form::formFooter( $session ); + # Generate the form + if ($form->get("func") eq "add") { + $var->{ form_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getParent->getUrl('func=editSave;assetId=new;class='.__PACKAGE__), + }); + } + else { + $var->{ form_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getUrl('func=editSave'), + }); + } + $var->{ form_start } + .= WebGUI::Form::hidden( $session, { + name => "proceed", + value => "showConfirmation", + }); + + $var->{ form_end } = WebGUI::Form::formFooter( $session ); + + $var->{ form_submit } + = WebGUI::Form::submit( $session, { + name => "submit", + value => "Save", + }); $var->{ form_title } = WebGUI::Form::Text( $session, { @@ -737,12 +840,7 @@ sub www_edit { richEditId => $self->getGallery->get("assetIdRichEditFile"), }); - $var->{ form_storageIdPhoto } - = WebGUI::Form::Image( $session, { - name => "storageIdPhoto", - value => ( $form->get("storageIdPhoto") || $self->get("storageIdPhoto") ), - maxAttachments => 1, - }); + $var->{ form_photo } = $self->getEditFormUploadControl; $var->{ form_keywords } = WebGUI::Form::Text( $session, { @@ -771,6 +869,23 @@ sub www_edit { #---------------------------------------------------------------------------- +=head2 www_editSave ( ) + +Save the edit form. Overridden to display a confirm message to the user. + +=cut + +sub www_editSave { + my $self = shift; + $self->SUPER::www_editSave; + + my $i18n = __PACKAGE__->i18n( $self->session ); + + sprintf $i18n->get("save message"), $self->getUrl, +} + +#---------------------------------------------------------------------------- + =head2 www_makeShortcut ( ) Display the form to make a shortcut. @@ -781,24 +896,27 @@ This page is only available to those who can edit this Photo. sub www_makeShortcut { my $self = shift; + my $session = $self->session; return $self->session->privilege->insufficient unless $self->canEdit; # Create the form to make a shortcut my $var = $self->getTemplateVars; - $var->{ form_header } + $var->{ form_start } = WebGUI::Form::formHeader( $session ) . WebGUI::Form::hidden( $session, { name => "func", value => "makeShortcutSave" }); - $var->{ form_footer } + $var->{ form_end } = WebGUI::Form::formFooter( $session ); # Albums under this Gallery my $albums = $self->getGallery->getAlbumIds; my %albumOptions; for my $assetId ( @$albums ) { - $albumOptions{ $assetId } - = WebGUI::Asset->newByDynamicClass($session, $assetId)->get("title"); + my $asset = WebGUI::Asset->newByDynamicClass($session, $assetId); + if ($asset->canAddFile) { + $albumOptions{ $assetId } = $asset->get("title"); + } } $var->{ form_parentId } = WebGUI::Form::selectBox( $session, { @@ -827,7 +945,8 @@ sub www_makeShortcutSave { my $form = $self->session->form; return $self->session->privilege->insufficient unless $self->canEdit; - + + my $parentId = $form->get('parentId'); my $shortcut = $self->makeShortcut( $parentId ); return $shortcut->www_view; @@ -835,6 +954,46 @@ sub www_makeShortcutSave { #---------------------------------------------------------------------------- +=head2 www_promote + +Override the default promote page to send the user back to the GalleryAlbum +edit screen. + +=cut + +sub www_promote { + my $self = shift; + + return $self->session->privilege->insufficient unless $self->canEdit; + + $self->promote; + + return $self->session->asset( $self->getParent )->www_edit; +} + +#---------------------------------------------------------------------------- + +=head2 www_showConfirmation ( ) + +Shows the confirmation message after adding / editing a gallery album. +Provides links to view the photo and add more photos. + +=cut + +sub www_showConfirmation { + my $self = shift; + my $i18n = __PACKAGE__->i18n( $self->session ); + + return $self->processStyle( + sprintf( $i18n->get('save message'), + $self->getUrl, + $self->getParent->getUrl('func=add;className='.__PACKAGE__), + ) + ); +} + +#---------------------------------------------------------------------------- + =head2 www_view ( ) Shows the output of L inside of the style provided by the gallery this @@ -857,6 +1016,5 @@ sub www_view { $self->session->output->print($foot, 1); return "chunked"; } -} 1; diff --git a/lib/WebGUI/Asset/Shortcut.pm b/lib/WebGUI/Asset/Shortcut.pm index 5d6410d88..f24e88126 100644 --- a/lib/WebGUI/Asset/Shortcut.pm +++ b/lib/WebGUI/Asset/Shortcut.pm @@ -593,6 +593,26 @@ sub getPrefFieldsToImport { return split("\n",$self->getValue("prefFieldsToImport")); } +#---------------------------------------------------------------------------- + +=head2 getTemplateVars + +Gets the template vars for this shortcut. + +=cut + +sub getTemplateVars { + my $self = shift; + + my $shortcut = $self->getShortcut; + if ( $shortcut->can('getTemplateVars') ) { + return $shortcut->getTemplateVars; + } + else { + return $shortcut->get; + } +} + #------------------------------------------------------------------- sub isDashlet { my $self = shift; diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index 1133f0c6a..3bbbdb3cc 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -24,16 +24,14 @@ use base 'WebGUI::Asset::Wobject'; =head1 SYNOPSIS +=head1 DIAGNOSTICS + =head1 METHODS #------------------------------------------------------------------- =head2 definition ( ) -defines wobject properties for New Wobject instances. You absolutely need -this method in your new Wobjects. If you choose to "autoGenerateForms", the -getEditForm method is unnecessary/redundant/useless. - =cut sub definition { @@ -51,6 +49,23 @@ sub definition { '1600' => '1600', '2880' => '2880', ); + + tie my %viewDefaultOptions, 'Tie::IxHash', ( + list => $i18n->get("viewDefault option list"), + album => $i18n->get("viewDefault option album"), + ); + + tie my %viewListOrderByOptions, 'Tie::IxHash', ( + creationDate => $i18n->get("viewListOrderBy option creationDate"), + lineage => $i18n->get("viewListOrderBy option lineage"), + revisionDate => $i18n->get("viewListOrderBy option revisionDate"), + title => $i18n->get("viewListOrderBy option title"), + ); + + tie my %viewListOrderDirectionOptions, 'Tie::IxHash', ( + ASC => $i18n->get("viewListOrderDirection option asc"), + DESC => $i18n->get("viewListOrderDirection option desc"), + ); tie my %properties, 'Tie::IxHash', ( groupIdAddComment => { @@ -77,7 +92,7 @@ sub definition { imageResolutions => { tab => "properties", fieldType => "checkList", - defaultValue => ['800', '1024', '1200', '1600', '2880'], + defaultValue => join("\n", '800', '1024', '1200', '1600', '2880'), options => \%imageResolutionOptions, label => $i18n->get("imageResolutions label"), hoverHelp => $i18n->get("imageResolutions description"), @@ -85,14 +100,14 @@ sub definition { imageViewSize => { tab => "properties", fieldType => "integer", - defaultValue => 0, + defaultValue => 700, label => $i18n->get("imageViewSize label"), hoverHelp => $i18n->get("imageViewSize description"), }, imageThumbnailSize => { tab => "properties", fieldType => "integer", - defaultValue => 0, + defaultValue => 300, label => $i18n->get("imageThumbnailSize label"), hoverHelp => $i18n->get("imageThumbnailSize description"), }, @@ -106,7 +121,7 @@ sub definition { richEditIdComment => { tab => "properties", fieldType => "selectRichEditor", - defaultValue => undef, # Rich Editor for Posts + defaultValue => "PBrichedit000000000002", # Forum Rich Editor label => $i18n->get("richEditIdFileComment label"), hoverHelp => $i18n->get("richEditIdFileComment description"), }, @@ -134,6 +149,14 @@ sub definition { label => $i18n->get("templateIdDeleteFile label"), hoverHelp => $i18n->get("templateIdDeleteFile description"), }, + templateIdEditAlbum => { + tab => "display", + fieldType => "template", + defaultValue => "", + namespace => "GalleryAlbum/Edit", + label => $i18n->get("templateIdEditAlbum label"), + hoverHelp => $i18n->get("templateIdEditAlbum description"), + }, templateIdEditFile => { tab => "display", fieldType => "template", @@ -158,21 +181,21 @@ sub definition { label => $i18n->get("templateIdListAlbumsRss label"), hoverHelp => $i18n->get("templateIdListAlbumsRss description"), }, - templateIdListUserFiles => { + templateIdListFilesForUser => { tab => "display", fieldType => "template", defaultValue => "", - namespace => "Gallery/ListUserFiles", - label => $i18n->get("templateIdListUserFiles label"), - hoverHelp => $i18n->get("templateIdListUserFiles description"), + namespace => "Gallery/ListFilesForUser", + label => $i18n->get("templateIdListFilesForUser label"), + hoverHelp => $i18n->get("templateIdListFilesForUser description"), }, - templateIdListUserFilesRss => { + templateIdListFilesForUserRss => { tab => "display", fieldType => "template", defaultValue => "", - namespace => "Gallery/ListUserFilesRss", - label => $i18n->get("templateIdListUserFilesRss label"), - hoverHelp => $i18n->get("templateIdListUserFilesRss description"), + namespace => "Gallery/ListFilesForUserRss", + label => $i18n->get("templateIdListFilesForUserRss label"), + hoverHelp => $i18n->get("templateIdListFilesForUserRss description"), }, templateIdMakeShortcut => { tab => "display", @@ -190,21 +213,21 @@ sub definition { label => $i18n->get("templateIdSearch label"), hoverHelp => $i18n->get("templateIdSearch description"), }, - templateIdSlideshow => { + templateIdViewSlideshow => { tab => "display", fieldType => "template", defaultValue => "", - namespace => "GalleryAlbum/Slideshow", - label => $i18n->get("templateIdSlideshow label"), - hoverHelp => $i18n->get("templateIdSlideshow description"), + namespace => "GalleryAlbum/ViewSlideshow", + label => $i18n->get("templateIdViewSlideshow label"), + hoverHelp => $i18n->get("templateIdViewSlideshow description"), }, - templateIdThumbnails => { + templateIdViewThumbnails => { tab => "display", fieldType => "template", defaultValue => "", - namespace => "GalleryAlbum/Thumbnails", - label => $i18n->get("templateIdThumbnails label"), - hoverHelp => $i18n->get("templateIdThumbnails description"), + namespace => "GalleryAlbum/ViewThumbnails", + label => $i18n->get("templateIdViewThumbnails label"), + hoverHelp => $i18n->get("templateIdViewThumbnails description"), }, templateIdViewAlbum => { tab => "display", @@ -230,6 +253,37 @@ sub definition { label => $i18n->get("templateIdViewFile label"), hoverHelp => $i18n->get("templateIdViewFile description"), }, + viewDefault => { + tab => "display", + fieldType => "selectBox", + defaultValue => "list", + options => \%viewDefaultOptions, + label => $i18n->get("viewDefault label"), + hoverHelp => $i18n->get("viewDefault description"), + }, + viewAlbumAssetId => { + tab => "display", + fieldType => "asset", + class => "WebGUI::Asset::Wobject::GalleryAlbum", + label => $i18n->get("viewAlbumAssetId label"), + hoverHelp => $i18n->get("viewAlbumAssetId description"), + }, + viewListOrderBy => { + tab => "display", + fieldType => "selectBox", + defaultValue => "lineage", # "Sequence Number" + options => \%viewListOrderByOptions, + label => $i18n->get("viewListOrderBy label"), + hoverHelp => $i18n->get("viewListOrderBy description"), + }, + viewListOrderDirection => { + tab => "display", + fieldType => "selectBox", + defaultValue => "ASC", + options => \%viewListOrderDirectionOptions, + label => $i18n->get("viewListOrderDirection label"), + hoverHelp => $i18n->get("viewListOrderDirection description"), + }, workflowIdCommit => { tab => "security", fieldType => "workflow", @@ -254,6 +308,91 @@ sub definition { #---------------------------------------------------------------------------- +=head2 appendTemplateVarsSearchForm ( var ) + +Appends the template vars for the search form to the hash reference C. +Returns the hash reference for convenience. + +=cut + +sub appendTemplateVarsSearchForm { + my $self = shift; + my $var = shift; + my $session = $self->session; + my $form = $self->session->form; + my $i18n = WebGUI::International->new($session, 'Asset_Gallery'); + + $var->{ searchForm_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getUrl('func=search'), + method => "GET", + }); + + $var->{ searchForm_end } + = WebGUI::Form::formFooter( $session ); + + $var->{ searchForm_basicSearch } + = WebGUI::Form::text( $session, { + name => "basicSearch", + value => $form->get("basicSearch"), + }); + + $var->{ searchForm_title } + = WebGUI::Form::text( $session, { + name => "title", + value => $form->get("title"), + }); + + $var->{ searchForm_description } + = WebGUI::Form::text( $session, { + name => "description", + value => $form->get("description"), + }); + + $var->{ searchForm_keywords } + = WebGUI::Form::text( $session, { + name => "keywords", + value => $form->get("keywords"), + }); + + # Search classes + tie my %searchClassOptions, 'Tie::IxHash', ( + 'WebGUI::Asset::File::Image::Photo' => $i18n->get("search class photo"), + 'WebGUI::Asset::Wobject::GalleryAlbum' => $i18n->get("search class galleryalbum"), + '' => $i18n->get("search class any"), + ); + $var->{ searchForm_className } + = WebGUI::Form::radioList( $session, { + name => "className", + value => $form->get("className"), + options => \%searchClassOptions, + }); + + # Search creationDate + my $oneYearAgo = WebGUI::DateTime->new( $session, time )->add( years => -1 )->epoch; + $var->{ searchForm_creationDate_after } + = WebGUI::Form::dateTime( $session, { + name => "creationDate_after", + value => $form->get("creationDate_after","dateTime") || $oneYearAgo, + }); + $var->{ searchForm_creationDate_before } + = WebGUI::Form::dateTime( $session, { + name => "creationDate_before", + value => $form->get("creationDate_before","dateTime"), + }); + + # Buttons + $var->{ searchForm_submit } + = WebGUI::Form::submit( $session, { + name => "submit", + value => $i18n->get("search submit"), + }); + + return $var; +} + +#---------------------------------------------------------------------------- + =head2 canAddFile ( [userId] ) Returns true if the user can add files to this Gallery. C is the @@ -356,23 +495,33 @@ Gets an array reference of all the album IDs under this Gallery. sub getAlbumIds { my $self = shift; - return $self->getLineage(['descendants'], { - includeOnlyClasses => ['WebGUI::Asset::Wobject::GalleryAlbum'], - }); + my $assets + = $self->getLineage(['descendants'], { + includeOnlyClasses => ['WebGUI::Asset::Wobject::GalleryAlbum'], + }); + + return $assets; } #---------------------------------------------------------------------------- -=head2 getAlbumPaginator ( ) +=head2 getAlbumPaginator ( options ) -Gets a WebGUI::Paginator for all the albums in this Gallery. +Gets a WebGUI::Paginator for all the albums in this Gallery. C is a +hash reference with the following keys. + + perpage => The number of results to show per page. Default: 20 =cut sub getAlbumPaginator { my $self = shift; + my $options = shift; + + my $perpage = $options->{ perpage } || 20; - my $p = WebGUI::Paginator->new( $self->session, $self->getUrl ); + my $p + = WebGUI::Paginator->new( $self->session, $self->getUrl, $perpage ); $p->setDataByArrayRef( $self->getAlbumIds ); return $p; @@ -392,7 +541,7 @@ sub getAssetClassForFile { my $filepath = shift; # Checks for Photo assets - if ( $filepath =~ /\.(jpe?g|gif|png)/i ) { + if ( $filepath =~ /\.(jpe?g|gif|png)$/i ) { return "WebGUI::Asset::File::Image::Photo"; } @@ -416,9 +565,9 @@ sub getImageResolutions { #---------------------------------------------------------------------------- -=head2 getSearchPaginator ( options ) +=head2 getSearchPaginator ( rules ) -Gets a WebGUI::Paginator for a search. C is a hash reference of +Gets a WebGUI::Paginator for a search. C is a hash reference of options with the following keys: keywords => Keywords to search on @@ -431,11 +580,11 @@ sub getSearchPaginator { my $self = shift; my $rules = shift; - $rules->{ lineage } = $self->get("lineage"); + $rules->{ lineage } = [ $self->get("lineage") ]; my $search = WebGUI::Search->new( $self->session ); $search->search( $rules ); - my $paginator = $search->getPaginatorResultSet( $self->getUrl('func=search') ); + my $paginator = $search->getPaginatorResultSet( $rules->{url} ); return $paginator; } @@ -451,7 +600,7 @@ classes of files inside of a Gallery. =cut -sub getTemplateEditFile { +sub getTemplateIdEditFile { my $self = shift; return $self->get("templateIdEditFile"); } @@ -467,37 +616,25 @@ Gets a hash reference of vars common to all templates. sub getTemplateVars { my $self = shift; my $var = $self->get; + + # Add the search form variables + $self->appendTemplateVarsSearchForm( $var ); + + $var->{ url } = $self->getUrl; + $var->{ url_addAlbum } = $self->getUrl('func=add;class=WebGUI::Asset::Wobject::GalleryAlbum'); + $var->{ url_listAlbums } = $self->getUrl('func=listAlbums'); + $var->{ url_listAlbumsRss } = $self->getUrl('func=listAlbumsRss'); + $var->{ url_listFilesForCurrentUser } = $self->getUrl('func=listFilesForUser'); + $var->{ url_search } = $self->getUrl('func=search'); + + $var->{ canEdit } = $self->canEdit; + $var->{ canAddFile } = $self->canAddFile; return $var; } #---------------------------------------------------------------------------- -=head2 getUserFileIds ( [userId] ) - -Gets an array reference of assetIds for the files in this Gallery owned by -the specified C. If userId is not defined, will use the current user. - -=cut - -sub getUserFileIds { - my $self = shift; - my $userId = shift || $self->session->user->userId; - - my $db = $self->session->db; - - # Note: We use excludeClasses to avoid getting GalleryAlbum assets - my $assetIds - = $self->getLineage( ['descendants'], { - excludeClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ], - whereClause => "ownerUserId = " . $db->quote($userId), - }); - - return $assetIds; -} - -#---------------------------------------------------------------------------- - =head2 getUserAlbumIds ( [userId] ) Gets an array reference of assetIds for the GalleryAlbums in this Gallery @@ -523,6 +660,55 @@ sub getUserAlbumIds { #---------------------------------------------------------------------------- +=head2 getUserFileIds ( [userId] ) + +Gets an array reference of assetIds for the files in this Gallery owned by +the specified C. If userId is not defined, will use the current user. + +=cut + +sub getUserFileIds { + my $self = shift; + my $userId = shift || $self->session->user->userId; + + my $db = $self->session->db; + + # Note: We use excludeClasses to avoid getting GalleryAlbum assets + my $assetIds + = $self->getLineage( ['descendants'], { + excludeClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ], + whereClause => "ownerUserId = " . $db->quote($userId), + }); + + return $assetIds; +} + +#---------------------------------------------------------------------------- + +=head2 getUserFilePaginator ( options ) + +Gets a WebGUI::Paginator for the files owned by a specific C. +C is a hash reference of options with the following keys: + + userId => The user who owns the asset. Defaults to the current user. + url => The URL to give to the paginator + +=cut + +sub getUserFilePaginator { + my $self = shift; + my $options = shift; + my $userId = delete $options->{userId}; + my $url = delete $options->{url}; + + my $p = WebGUI::Paginator->new( $self->session, $url ); + $p->setDataByArrayRef( $self->getUserFileIds( $userId ) ); + + return $p; +} + +#---------------------------------------------------------------------------- + =head2 prepareView ( ) See WebGUI::Asset::prepareView() for details. @@ -532,7 +718,30 @@ See WebGUI::Asset::prepareView() for details. sub prepareView { my $self = shift; $self->SUPER::prepareView(); - my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + + if ( $self->get("viewDefault") eq "album" ) { + my $asset + = WebGUI::Asset->newByDynamicClass( $self->session, $self->get("viewAlbumAssetId") ); + $asset->prepareView; + $self->{_viewAsset} = $asset; + } + else { + $self->prepareViewListAlbums; + } +} + +#---------------------------------------------------------------------------- + +=head2 prepareViewListAlbums ( ) + +Prepare the template for listing multiple albums. + +=cut + +sub prepareViewListAlbums { + my $self = shift; + my $template + = WebGUI::Asset::Template->new($self->session, $self->get("templateIdListAlbums")); $template->prepare; $self->{_viewTemplate} = $template; } @@ -541,8 +750,7 @@ sub prepareView { =head2 view ( ) -method called by the www_view method. Returns a processed template -to be displayed within the page style. +Show the default view based on the Gallery settings. =cut @@ -551,7 +759,41 @@ sub view { my $session = $self->session; my $var = $self->get; - return $self->processTemplate($var, undef, $self->{_viewTemplate}); + if ( $self->get("viewDefault") eq "album" ) { + return $self->{_viewAsset}->view; + } + else { + return $self->view_listAlbums; + } +} + +#---------------------------------------------------------------------------- + +=head2 view_listAlbums ( ) + +Show a paginated list of the albums in this gallery. This method does the +actual work. + +=cut + +sub view_listAlbums { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + my $form = $self->session->form; + + my $p + = $self->getAlbumPaginator( { + perpage => $form->get('perpage'), + } ); + $p->appendTemplateVars( $var ); + + for my $assetId ( @{ $p->getPageData } ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + push @{ $var->{albums} }, $asset->getTemplateVars; + } + + return $self->processTemplate( $var, undef, $self->{_viewTemplate} ); } #---------------------------------------------------------------------------- @@ -565,30 +807,218 @@ Show a paginated list of the albums in this gallery. sub www_listAlbums { my $self = shift; + # Perform the prepareView ourselves + $self->prepareViewListAlbums; + + return $self->processStyle( + $self->view_listAlbums + ); } #---------------------------------------------------------------------------- =head2 www_listAlbumsRss ( ) +Show an RSS feed for the albums in this gallery. + =cut +sub www_listAlbumsRss { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + + for my $assetId ( @{ $self->getAlbumIds } ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + my $assetVar = $asset->getTemplateVars; + + # Fix URLs + for my $key ( qw( url ) ) { + $assetVar->{ $key } = $self->session->url->getSiteURL . $assetVar->{ $key }; + } + + # Additional vars for RSS + $assetVar->{ rssDate } + = $session->datetime->epochToMail( $assetVar->{ creationDate } ); + + push @{ $var->{albums} }, $assetVar; + } + + $self->session->http->setMimeType('text/xml'); + return $self->processTemplate( $var, $self->get("templateIdListAlbumsRss") ); +} + #---------------------------------------------------------------------------- =head2 www_search ( ) +Search through the GalleryAlbums and files in this gallery. Show the form to +search and display the results if necessary. + =cut +sub www_search { + my $self = shift; + my $form = $self->session->form; + my $db = $self->session->db; + + my $var = $self->getTemplateVars; + # NOTE: Search form is added as part of getTemplateVars() + + # Get search results, if necessary. + if ($form->get("submit")) { + # Keywords to search on + my $keywords = join " ", $form->get('basicSearch'), + $form->get('keywords'), + $form->get('title'), + $form->get('description') + ; + + # Build a where clause from the advanced options + # Lineage search can capture gallery + my $where = q{assetIndex.assetId <> '} . $self->getId . q{'}; + if ( $form->get("title") ) { + $where .= q{ AND assetData.title LIKE } + . $db->quote( '%' . $form->get("title") . '%' ) + ; + } + if ( $form->get("description") ) { + $where .= q{ AND assetData.synopsis LIKE } + . $db->quote( '%' . $form->get("description") . '%' ) + ; + } + if ( $form->get("className") ) { + $where .= q{ AND asset.className IN ('} + . $db->quoteAndJoin( [$form->get('className','checkList')] ) + . q{)} + ; + } + + # Build a URL for the pagination + my $url + = $self->getUrl( + 'func=search;submit=1;' + . 'basicSearch=' . $form->get('basicSearch') . ';' + . 'keywords=' . $form->get('keywords') . ';' + . 'title=' . $form->get('title') . ';' + . 'description=' . $form->get('description') . ';' + . 'className=' . $form->get('className') . ';' + . 'creationDate_after=' . $form->get('creationDate_after') . ';' + . 'creationDate_before=' . $form->get('creationDate_before') . ';' + ); + + my $p + = $self->getSearchPaginator( { + url => $url, + keywords => $keywords, + where => $where, + joinClass => ['WebGUI::Asset::Wobject::GalleryAlbum', 'WebGUI::Asset::File::Image::Photo'], + } ); + + $var->{ keywords } = $keywords; + + $p->appendTemplateVars( $var ); + for my $result ( @{ $p->getPageData } ) { + my $asset = WebGUI::Asset->newByDynamicClass( $self->session, $result->{assetId} ); + push @{ $var->{search_results} }, $asset->getTemplateVars; + } + } + + return $self->processStyle( + $self->processTemplate( $var, $self->get("templateIdSearch") ) + ); +} + #---------------------------------------------------------------------------- -=head2 www_userGallery ( ) +=head2 www_listFilesForUser ( ) + +Show all the GalleryAlbums and files owned by a given userId. If no userId is +given, will use the current user. =cut +sub www_listFilesForUser { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + my $userId = $self->session->form->get("userId") || $self->session->user->userId; + my $user = WebGUI::User->new( $session, $userId ); + + $var->{ url_rss } = $self->getUrl('func=listFilesForUserRss;userId=' . $userId); + $var->{ userId } = $userId; + $var->{ username } = $user->username; + + # Get all the albums + my $albumIds = $self->getUserAlbumIds( $userId ); + for my $albumId ( @$albumIds ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $albumId ); + push @{ $var->{user_albums} }, $asset->getTemplateVars; + } + + # Get a page of files + my $p + = $self->getUserFilePaginator({ + userId => $userId, + url => $self->getUrl("func=listFilesForUser") + }); + $p->appendTemplateVars( $var ); + + for my $fileId ( @{ $p->getPageData } ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $fileId ); + push @{ $var->{user_files} }, $asset->getTemplateVars; + } + + return $self->processStyle( + $self->processTemplate( $var, $self->get("templateIdListFilesForUser") ) + ); +} + #---------------------------------------------------------------------------- -=head2 www_userGalleryRss ( ) +=head2 www_listFilesForUserRss ( ) =cut +sub www_listFilesForUserRss { + my $self = shift; + my $session = $self->session; + my $var = $self->getTemplateVars; + my $userId = $self->session->form("userId") || $self->session->user->userId; + + # Fix URLs for template vars + for my $key ( qw( url ) ) { + $var->{ $key } = $self->session->url->getSiteURL . $var->{ $key }; + } + + # Get all the albums + my $albumIds = $self->getUserAlbumIds( $userId ); + for my $albumId ( @$albumIds ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $albumId ); + my $assetVar = $asset->getTemplateVars; + + for my $key ( qw( url ) ) { + $assetVar->{ $key } = $self->session->url->getSiteURL . $assetVar->{ $key }; + } + + push @{ $var->{user_albums} }, $assetVar; + } + + # Get all the files + my $fileIds = $self->getUserFileIds( $userId ); + for my $fileId ( @$fileIds ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $fileId ); + my $assetVar = $asset->getTemplateVars; + + for my $key ( qw( url ) ) { + $assetVar->{ $key } = $self->session->url->getSiteURL . $assetVar->{ $key }; + } + + push @{ $var->{user_files} }, $assetVar; + } + + $self->session->http->setMimeType('text/xml'); + return $self->processTemplate( $var, $self->get("templateIdListFilesForUserRss") ); +} + 1; diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index 94ab45b36..2f62447e3 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -14,6 +14,10 @@ $VERSION = "1.0.0"; use strict; use base 'WebGUI::Asset::Wobject'; +use Carp qw( croak ); +use File::Find; +use File::Spec; +use File::Temp qw{ tempdir }; use Tie::IxHash; use WebGUI::International; use WebGUI::Utility; @@ -47,22 +51,22 @@ sub definition { tie my %properties, 'Tie::IxHash', ( allowComments => { fieldType => "yesNo", - defaultValue => 0, - label => $i18n->get("allowComments label"), - hoverHelp => $i18n->get("allowComments description"), + defaultValue => 1, }, othersCanAdd => { fieldType => "yesNo", defaultValue => 0, - label => $i18n->get("othersCanAdd label"), - hoverHelp => $i18n->get("othersCanAdd description"), + }, + assetIdThumbnail => { + fieldType => "asset", + defaultValue => undef, }, ); push @{$definition}, { assetName => $i18n->get('assetName'), + autoGenerateForms => 0, icon => 'newWobject.gif', - autoGenerateForms => 1, tableName => 'GalleryAlbum', className => __PACKAGE__, properties => \%properties, @@ -90,43 +94,56 @@ sub addArchive { my $self = shift; my $filename = shift; my $properties = shift; + my $gallery = $self->getParent; my $archive = Archive::Any->new( $filename ); croak "Archive will extract to directory outside of storage location!" if $archive->is_naughty; - use File::Temp qw{ tempdir }; my $tempdirName = tempdir( "WebGUI-Gallery-XXXXXXXX", TMPDIR => 1, CLEANUP => 1); - $archive->extract( $tempdir ); + $archive->extract( $tempdirName ); - opendir my $dh, $tempdirName or die "Could not open temp dir $tempdirName: $!"; - for my $file (readdir $dh) { - my $class = $gallery->getAssetClassForFile( $file ); + # Get all the files in the archive + my @files; + my $wanted = sub { push @files, $File::Find::name }; + find( { + wanted => $wanted, + }, $tempdirName ); + + for my $filePath (@files) { + my ($volume, $directory, $filename) = File::Spec->splitpath( $filePath ); + $self->session->errorHandler->info( "trying $filename" ); + next if $filename =~ m{^[.]}; + my $class = $gallery->getAssetClassForFile( $filePath ); next unless $class; # class is undef for those files the Gallery can't handle - $self->addChild({ - className => $class, - title => $properties->{title}, - menuTitle => $properties->{menuTitle} || $properties->{title}, - synopsis => $properties->{synopsis}, - }); + $self->session->errorHandler->info( "Adding $filename to album!" ); + $properties->{ className } = $class; + $properties->{ menuTitle } = $filename; + $properties->{ title } = $filename; + $properties->{ url } = $self->getUrl . "/" . $filename; + + my $asset = $self->addChild( $properties, undef, undef, { skipAutoCommitWorkflows => 1 } ); + $asset->setFile( $filePath ); } - closedir $dh; + + my $versionTag = WebGUI::VersionTag->getWorking( $self->session ); + $versionTag->set({ + "workflowId" => $self->getParent->get("workflowIdCommit"), + }); + $versionTag->requestCommit; + + return; } #---------------------------------------------------------------------------- -=head2 appendTemplateVarsFileLoop ( vars, options ) +=head2 appendTemplateVarsFileLoop ( vars, assetIds ) -Append template vars for a file loop with the specified options. C is -a hash reference to add the file loop to. C is a hash reference of -options with the following keys: - - perpage => number | "all" - If "all", no pagination will be done. - url => url - The URL to the current page +Append template vars for a file loop for the specified assetIds. C is +a hash reference to add the file loop to. C is an array reference +of assetIds for the loop. Returns the hash reference for convenience. @@ -135,17 +152,10 @@ Returns the hash reference for convenience. sub appendTemplateVarsFileLoop { my $self = shift; my $var = shift; - my $options = shift; + my $assetIds = shift; + my $session = $self->session; - my @assetIds; - if ($options->{perpage} eq "all") { - @assetIds = @{ $self->getFileIds }; - } - else { - @assetIds = @{ $self->getFilePaginator($options->{url})->getPageData }; - } - - for my $assetId (@assetIds) { + for my $assetId (@$assetIds) { push @{$var->{file_loop}}, WebGUI::Asset->newByDynamicClass($session, $assetId)->getTemplateVars; } @@ -168,6 +178,7 @@ C is true and the Gallery allows them to add files. sub canAddFile { my $self = shift; my $userId = shift || $self->session->user->userId; + my $gallery = $self->getParent; return 1 if $userId eq $self->get("ownerUserId"); return 1 if $self->get("othersCanAdd") && $gallery->canAddFile( $userId ); @@ -214,11 +225,15 @@ sub canEdit { my $self = shift; my $userId = shift || $self->session->user->userId; my $gallery = $self->getParent; + my $form = $self->session->form; # Handle adding a photo if ( $form->get("func") eq "add" ) { return $self->canAddFile; } + elsif ( $form->get("func") eq "editSave" && $form->get("className") eq __PACKAGE__ ) { + return $self->canAddFile; + } else { return 1 if $userId eq $self->get("ownerUserId"); @@ -233,13 +248,23 @@ sub canEdit { Returns true if the user can view this asset. C is a WebGUI user ID. If no userId is given, checks the current user. +Users can view this album if they can view the containing Gallery. + +NOTE: It may be possible to view a GalleryAlbum that has no public files. In +such cases, the GalleryAlbum will appear empty to unprivileged users. This is +not a bug. + =cut -# Inherited from superclass +sub canView { + my $self = shift; + my $userId = shift || $self->session->user->userId; + return $self->getParent->canView($userId); +} #---------------------------------------------------------------------------- -=head2 i18n ( [ session ] ) +=head2 i18n ( session ) Get a WebGUI::International object for this class. @@ -260,6 +285,19 @@ sub i18n { #---------------------------------------------------------------------------- +=head2 getAutoCommitWorkflowId ( ) + +Returns the workflowId of the Gallery's approval workflow. + +=cut + +sub getAutoCommitWorkflowId { + my $self = shift; + return $self->getParent->get("workflowIdCommit"); +} + +#---------------------------------------------------------------------------- + =head2 getFileIds ( ) Gets an array reference of asset IDs for all the files in this album. @@ -270,9 +308,7 @@ sub getFileIds { my $self = shift; my $gallery = $self->getParent; - return $self->assetLineage( ['descendants'], { - includeOnlyClasses => $gallery->getAllAssetClassesForFile, - }); + return $self->getLineage( ['descendants'], { } ); } #---------------------------------------------------------------------------- @@ -286,7 +322,7 @@ url to the current page that will be given to the paginator. sub getFilePaginator { my $self = shift; - my $url = shift; + my $url = shift || $self->getUrl; my $p = WebGUI::Paginator->new( $self->session, $url ); $p->setDataByArrayRef( $self->getFileIds ); @@ -304,15 +340,77 @@ Gets template vars common to all views. sub getTemplateVars { my $self = shift; + my $session = $self->session; + my $gallery = $self->getParent; my $var = $self->get; + my $owner = WebGUI::User->new( $session, $self->get("ownerUserId") ); + + # Permissions + $var->{ canAddFile } = $self->canAddFile; + $var->{ canEdit } = $self->canEdit; + + # Add some common template vars from Gallery + $gallery->appendTemplateVarsSearchForm( $var ); + $var->{ url_listAlbums } = $gallery->getUrl('func=listAlbums'); + $var->{ url_listAlbumsRss } = $gallery->getUrl('func=listAlbumsRss'); + $var->{ url_listFilesForCurrentUser } = $gallery->getUrl('func=listFilesForUser'); + $var->{ url_search } = $gallery->getUrl('func=search'); - $var->{ url } = $self->getUrl; + # Friendly URLs + $var->{ url } = $self->getUrl; + $var->{ url_addArchive } = $self->getUrl('func=addArchive'); + $var->{ url_addPhoto } = $self->getUrl("func=add;class=WebGUI::Asset::File::Image::Photo"); + $var->{ url_addNoClass } = $self->getUrl("func=add"); + $var->{ url_delete } = $self->getUrl("func=delete"); + $var->{ url_edit } = $self->getUrl("func=edit"); + $var->{ url_listFilesForOwner } = $gallery->getUrl("func=listFilesForUser;userId=".$var->{ownerUserId}); + $var->{ url_viewRss } = $self->getUrl("func=viewRss"); + $var->{ url_slideshow } = $self->getUrl("func=slideshow"); + $var->{ url_thumbnails } = $self->getUrl("func=thumbnails"); + + $var->{ fileCount } = $self->getChildCount; + $var->{ ownerUsername } = $owner->username; + $var->{ thumbnailUrl } = $self->getThumbnailUrl; return $var; } #---------------------------------------------------------------------------- +=head2 getThumbnailUrl ( ) + +Gets the URL for the thumbnail for this asset. If no asset is set, gets the +first child. + +NOTE: If the asset does not have a getThumbnailUrl method, this method will +return undef. + +=cut + +sub getThumbnailUrl { + my $self = shift; + my $asset = undef; + + if ( $self->get("assetIdThumbnail") ) { + $asset = WebGUI::Asset->newByDynamicClass( $self->session, $self->get("assetIdThumbnail") ); + } + elsif ( $self->getFirstChild ) { + $asset = $self->getFirstChild; + } + else { + return undef; + } + + if ( $asset->can("getThumbnailUrl") ) { + return $asset->getThumbnailUrl; + } + else { + return undef; + } +} + +#---------------------------------------------------------------------------- + =head2 othersCanAdd ( ) Returns true if people other than the owner can add files to this album. @@ -360,6 +458,26 @@ sub processStyle { #---------------------------------------------------------------------------- +=head2 processPropertiesFromFormPost ( ) + +Process the form to save the asset. Request approval from the Gallery's +approval workflow. + +=cut + +sub processPropertiesFromFormPost { + my $self = shift; + my $errors = $self->SUPER::processPropertiesFromFormPost || []; + + # Return if error + return $errors if @$errors; + + # Passes all checks + $self->requestAutoCommit; +} + +#---------------------------------------------------------------------------- + =head2 view ( ) method called by the www_view method. Returns a processed template @@ -371,8 +489,10 @@ sub view { my $self = shift; my $session = $self->session; my $var = $self->getTemplateVars; - - $self->appendTemplateVarsFileLoop( $var ); + + my $p = $self->getFilePaginator; + $p->appendTemplateVars( $var ); + $self->appendTemplateVarsFileLoop( $var, $p->getPageData ); return $self->processTemplate($var, undef, $self->{_viewTemplate}); } @@ -384,6 +504,8 @@ sub view { method called by the www_slideshow method. Returns a processed template to be displayed within the page style. +Show a slideshow of the GalleryAlbum's files. + =cut sub view_slideshow { @@ -391,9 +513,9 @@ sub view_slideshow { my $session = $self->session; my $var = $self->getTemplateVars; - $self->appendTemplateVarsFileLoop( $var, { perpage => "all" } ); + $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); - return $self->processTemplate($var, $self->getParent->get("templateIdSlideshow")); + return $self->processTemplate($var, $self->getParent->get("templateIdViewSlideshow")); } #---------------------------------------------------------------------------- @@ -403,6 +525,9 @@ sub view_slideshow { method called by the www_thumbnails method. Returns a processed template to be displayed within the page style. +Shows all the thumbnails for this GalleryAlbum. In addition, shows details +about a specific thumbnail. + =cut sub view_thumbnails { @@ -410,9 +535,31 @@ sub view_thumbnails { my $session = $self->session; my $var = $self->getTemplateVars; - $self->appendTemplateVarsFileLoop( $var, { perpage => "all" } ); + my $fileId = $session->form->get("fileId"); - return $self->processTemplate($var, $self->getParent->get("templateIdThumbnails")); + $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); + + # Process the file loop to add an additional URL + for my $file ( @{ $var->{file_loop} } ) { + $file->{ url_albumViewThumbnails } + = $self->getUrl('func=thumbnails;fileId=' . $file->{assetId}); + } + + # Add direct vars for the requested file + my $asset; + if ($fileId) { + $asset = WebGUI::Asset->newByDynamicClass( $session, $fileId ); + } + # If no fileId given or fileId does not exist + if (!$asset) { + $asset = $self->getFirstChild; + } + my %assetVars = %{ $asset->getTemplateVars }; + for my $key ( keys %assetVars ) { + $var->{ 'file_' . $key } = $assetVars{ $key }; + } + + return $self->processTemplate($var, $self->getParent->get("templateIdViewThumbnails")); } #---------------------------------------------------------------------------- @@ -428,8 +575,42 @@ sub www_addArchive { return $self->session->privilege->insufficient unless $self->canAddFile; + my $session = $self->session; + my $form = $self->session->form; my $var = $self->getTemplateVars; + $var->{ form_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getUrl('func=addArchiveSave'), + }); + $var->{ form_end } + = WebGUI::Form::formFooter( $session ); + + $var->{ form_submit } + = WebGUI::Form::submit( $session, { + name => "submit", + value => "Submit", + }); + + $var->{ form_archive } + = WebGUI::Form::File( $session, { + name => "archive", + maxAttachments => 1, + value => ( $form->get("archive") ), + }); + + $var->{ form_keywords } + = WebGUI::Form::text( $session, { + name => "keywords", + value => ( $form->get("keywords") ), + }); + + $var->{ form_friendsOnly } + = WebGUI::Form::yesNo( $session, { + name => "friendsOnly", + value => ( $form->get("friendsOnly") ), + }); + return $self->processStyle( $self->processTemplate($var, $self->getParent->get("templateIdAddArchive")) ); @@ -446,20 +627,27 @@ Process the form for adding an archive. sub www_addArchiveSave { my $self = shift; - return $self->session->privilege->insufficient unless $self->canAddfile; + return $self->session->privilege->insufficient unless $self->canAddFile; + my $session = $self->session; my $form = $self->session->form; + my $i18n = __PACKAGE__->i18n( $session ); my $properties = { keywords => $form->get("keywords"), friendsOnly => $form->get("friendsOnly"), }; - my $storage = $form->get("archive", "File"); - my $filename = $storage->getFilePath( $storage->getFiles->[0] ); + my $storageId = $form->get("archive", "File"); + my $storage = WebGUI::Storage->get( $session, $storageId ); + my $filename = $storage->getPath( $storage->getFiles->[0] ); $self->addArchive( $filename, $properties ); - return $self->www_view; + $storage->delete; + + return $self->processStyle( + sprintf $i18n->get('addArchive message'), $self->getUrl, + ); } #----------------------------------------------------------------------------- @@ -476,7 +664,7 @@ sub www_delete { return $self->session->privilege->insufficient unless $self->canEdit; my $var = $self->getTemplateVars; - $var->{ url_yes } = $self->getUrl("?func=deleteConfirm"); + $var->{ url_yes } = $self->getUrl("func=deleteConfirm"); return $self->processStyle( $self->processTemplate( $var, $self->getParent->get("templateIdDeleteAlbum") ) @@ -496,9 +684,130 @@ sub www_deleteConfirm { return $self->session->privilege->insufficient unless $self->canEdit; + my $gallery = $self->getParent; + $self->purge; - return $self->getParent->www_view; + return $gallery->www_view; +} + +#---------------------------------------------------------------------------- + +=head2 www_edit ( ) + +Show the form to add / edit a GalleryAlbum asset. + +=cut + +sub www_edit { + my $self = shift; + my $session = $self->session; + my $form = $self->session->form; + my $var = $self->getTemplateVars; + my $i18n = __PACKAGE__->i18n($session); + + # Generate the form + if ($form->get("func") eq "add") { + $var->{ form_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getParent->getUrl('func=editSave;assetId=new;class='.__PACKAGE__), + }); + } + else { + $var->{ form_start } + = WebGUI::Form::formHeader( $session, { + action => $self->getUrl('func=editSave'), + }); + } + $var->{ form_start } + .= WebGUI::Form::hidden( $session, { + name => "proceed", + value => "showConfirmation", + }); + + $var->{ form_end } + = WebGUI::Form::formFooter( $session ); + + $var->{ form_cancel } + = WebGUI::Form::button( $session, { + name => "cancel", + value => $i18n->get("cancel"), + extras => 'onclick="history.go(-1)"', + }); + + $var->{ form_submit } + = WebGUI::Form::submit( $session, { + name => "save", + value => $i18n->get("save"), + }); + + $var->{ form_title } + = WebGUI::Form::text( $session, { + name => "title", + value => $form->get("title") || $self->get("title"), + }); + + $var->{ form_description } + = WebGUI::Form::HTMLArea( $session, { + name => "description", + value => $form->get("description") || $self->get("description"), + }); + + # Generate the file loop + my $thumbnailUrl = $self->getThumbnailUrl; + $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); + for my $file ( @{ $var->{file_loop} } ) { + if ( $thumbnailUrl eq $file->{thumbnailUrl} ) { + $file->{ isAlbumThumbnail } = 1; + } + } + + return $self->processStyle( + $self->processTemplate( $var, $self->getParent->get("templateIdEditAlbum") ) + ); +} + +#----------------------------------------------------------------------------- + +=head2 www_editSave ( ) + +Save the asset edit form. Overridden to give a nice message when a photo or +album is added + +=cut + +sub www_editSave { + my $self = shift; + my $form = $self->session->form; + my $i18n = __PACKAGE__->i18n($self->session); + $self->SUPER::www_editSave; + + if ( $form->get("assetId") eq "new" ) { + return sprintf $i18n->get("addFile message"), $self->getUrl, + } + else { + return sprintf $i18n->get("save message"), $self->getUrl, + } +} + +#---------------------------------------------------------------------------- + +=head2 www_showConfirmation ( ) + +Shows the confirmation message after adding / editing a gallery album. +Provides links to view the album. + +=cut + +sub www_showConfirmation { + my $self = shift; + my $i18n = __PACKAGE__->i18n( $self->session ); + + my $output = sprintf $i18n->get('save message'), $self->getUrl; + + return $self->processStyle( + $output + ); } #----------------------------------------------------------------------------- @@ -547,7 +856,27 @@ sub www_viewRss { return $self->session->privilege->insufficient unless $self->canView; + my $var = $self->getTemplateVars; + $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); + # Fix URLs to be full URLs + for my $key ( qw( url url_viewRss ) ) { + $var->{ $key } = $self->session->url->getSiteURL . $var->{ $key }; + } + + # Process the file loop to add additional params + for my $file ( @{ $var->{file_loop} } ) { + # Fix URLs to be full URLs + for my $key ( qw( url ) ) { + $file->{ $key } = $self->session->url->getSiteURL . $file->{$key}; + } + + $file->{ rssDate } + = $self->session->datetime->epochToMail( $file->{creationDate} ); + } + + $self->session->http->setMimeType('text/xml'); + return $self->processTemplate( $var, $self->getParent->get('templateIdViewAlbumRss') ); } 1; diff --git a/lib/WebGUI/AssetLineage.pm b/lib/WebGUI/AssetLineage.pm index b5c37f4c1..373eef46e 100644 --- a/lib/WebGUI/AssetLineage.pm +++ b/lib/WebGUI/AssetLineage.pm @@ -15,6 +15,7 @@ package WebGUI::Asset; =cut use strict; +use Carp qw( croak ); =head1 NAME @@ -82,9 +83,9 @@ sub addChild { $self->session->db->commit; $properties->{assetId} = $id; $properties->{parentId} = $self->getId; - my $temp = WebGUI::Asset->newByPropertyHashRef($self->session,$properties); + my $temp = WebGUI::Asset->newByPropertyHashRef($self->session,$properties) || croak "Couldn't create a new $properties->{className} asset!"; $temp->{_parent} = $self; - my $newAsset = $temp->addRevision($properties,$now, {skipAutoCommitWorkflows=>$options->{skipAutoCommitWorkflows}}); + my $newAsset = $temp->addRevision($properties, $now, $options); $self->updateHistory("added child ".$id); $self->session->http->setStatus(201,"Asset Creation Successful"); return $newAsset; diff --git a/lib/WebGUI/AssetPackage.pm b/lib/WebGUI/AssetPackage.pm index 983acce7e..5c505b36a 100644 --- a/lib/WebGUI/AssetPackage.pm +++ b/lib/WebGUI/AssetPackage.pm @@ -125,18 +125,22 @@ A hash reference containing the exported data. =cut sub importAssetData { - my $self = shift; - my $data = shift; - my $error = $self->session->errorHandler; - my $id = $data->{properties}{assetId}; - my $class = $data->{properties}{className}; - my $version = $data->{properties}{revisionDate}; + my $self = shift; + my $data = shift; + my $error = $self->session->errorHandler; + my $id = $data->{properties}{assetId}; + my $class = $data->{properties}{className}; + my $version = $data->{properties}{revisionDate}; + + # Load the class + WebGUI::Asset->loadModule( $self->session, $class ); + my $asset; - my $assetExists = WebGUI::Asset->assetExists($self->session, $id, $class, $version); - if ($assetExists) { # update an existing revision + my $assetExists = WebGUI::Asset->assetExists($self->session, $id, $class, $version); + if ($assetExists) { # update an existing revision $asset = WebGUI::Asset->new($self->session, $id, $class, $version); - $error->info("Updating an existing revision of asset $id"); - $asset->update($data->{properties}); + $error->info("Updating an existing revision of asset $id"); + $asset->update($data->{properties}); ##Pending assets are assigned a new version tag if ($data->{properties}->{status} eq 'pending') { $self->session->db->write( @@ -144,19 +148,19 @@ sub importAssetData { [WebGUI::VersionTag->getWorking($self->session)->getId, $data->{properties}->{assetId}] ); } - } + } else { - $asset = WebGUI::Asset->new($self->session, $id, $class); - if (defined $asset) { # create a new revision of an existing asset - $error->info("Creating a new revision of asset $id"); - $asset = $asset->addRevision($data->{properties}, $version, {skipAutoCommitWorkflows => 1}); - } + $asset = WebGUI::Asset->new($self->session, $id, $class); + if (defined $asset) { # create a new revision of an existing asset + $error->info("Creating a new revision of asset $id"); + $asset = $asset->addRevision($data->{properties}, $version, {skipAutoCommitWorkflows => 1}); + } else { # add an entirely new asset - $error->info("Adding $id that didn't previously exist."); - $asset = $self->addChild($data->{properties}, $id, $version, {skipAutoCommitWorkflows => 1}); - } - } - return $asset; + $error->info("Adding $id that didn't previously exist."); + $asset = $self->addChild($data->{properties}, $id, $version, {skipAutoCommitWorkflows => 1}); + } + } + return $asset; } #------------------------------------------------------------------- @@ -188,40 +192,40 @@ A reference to a WebGUI::Storage object that contains a webgui package file. =cut sub importPackage { - my $self = shift; - my $storage = shift; - my $decompressed = $storage->untar($storage->getFiles->[0]); - my %assets = (); - my $error = $self->session->errorHandler; - $error->info("Importing package."); - foreach my $file (sort(@{$decompressed->getFiles})) { - next unless ($decompressed->getFileExtension($file) eq "json"); - $error->info("Found data file $file"); - my $data = eval{ + my $self = shift; + my $storage = shift; + my $decompressed = $storage->untar($storage->getFiles->[0]); + my %assets = (); + my $error = $self->session->errorHandler; + $error->info("Importing package."); + foreach my $file (sort(@{$decompressed->getFiles})) { + next unless ($decompressed->getFileExtension($file) eq "json"); + $error->info("Found data file $file"); + my $data = eval{ local $JSON::UnMapping = 1; JSON::jsonToObj($decompressed->getFileContentsAsScalar($file)) }; - if ($@ || $data->{properties}{assetId} eq "" || $data->{properties}{className} eq "" || $data->{properties}{revisionDate} eq "") { - $error->error("package corruption: ".$@) if ($@); - return "corrupt"; - } - $error->info("Data file $file is valid and represents asset ".$data->{properties}{assetId}); - foreach my $storageId (@{$data->{storage}}) { - my $assetStorage = WebGUI::Storage->get($self->session, $storageId); - $decompressed->untar($storageId.".storage", $assetStorage); - } - my $asset = $assets{$data->{properties}{parentId}} || $self; - my $newAsset = $asset->importAssetData($data); + if ($@ || $data->{properties}{assetId} eq "" || $data->{properties}{className} eq "" || $data->{properties}{revisionDate} eq "") { + $error->error("package corruption: ".$@) if ($@); + return "corrupt"; + } + $error->info("Data file $file is valid and represents asset ".$data->{properties}{assetId}); + foreach my $storageId (@{$data->{storage}}) { + my $assetStorage = WebGUI::Storage->get($self->session, $storageId); + $decompressed->untar($storageId.".storage", $assetStorage); + } + my $asset = $assets{$data->{properties}{parentId}} || $self; + my $newAsset = $asset->importAssetData($data); $newAsset->importAssetCollateralData($data); - $assets{$newAsset->getId} = $newAsset; - } - if ($self->session->setting->get("autoRequestCommit")) { + $assets{$newAsset->getId} = $newAsset; + } + if ($self->session->setting->get("autoRequestCommit")) { if ($self->session->setting->get("skipCommitComments")) { WebGUI::VersionTag->getWorking($self->session)->requestCommit; } else { - $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); + $self->session->http->setRedirect($self->getUrl("op=commitVersionTag;tagId=".WebGUI::VersionTag->getWorking($self->session)->getId)); } - } + } return undef; } diff --git a/lib/WebGUI/AssetVersioning.pm b/lib/WebGUI/AssetVersioning.pm index 023cc8ecd..ce3c5052e 100644 --- a/lib/WebGUI/AssetVersioning.pm +++ b/lib/WebGUI/AssetVersioning.pm @@ -79,12 +79,12 @@ If this is set to 1 then assets that normally send notifications will (like CS P sub addRevision { my $self = shift; my $properties = shift; - my $now = shift || $self->session->datetime->time(); - my $options = shift; - + my $now = shift || $self->session->datetime->time(); + my $options = shift; + my $autoCommitId = $self->getAutoCommitWorkflowId() unless ($options->{skipAutoCommitWorkflows}); - - my $workingTag + + my $workingTag = ($autoCommitId) ? WebGUI::VersionTag->create($self->session, {groupToUse=>'12', workflowId=>$autoCommitId}) : WebGUI::VersionTag->getWorking($self->session) @@ -104,8 +104,7 @@ sub addRevision { $self->session->user->userId, $workingTag->getId, $self->getId, - ] - ); + ]); foreach my $definition (@{$self->definition($self->session)}) { unless ($definition->{tableName} eq "assetData") { diff --git a/lib/WebGUI/Form.pm b/lib/WebGUI/Form.pm index b5b5291d6..ef552ed77 100644 --- a/lib/WebGUI/Form.pm +++ b/lib/WebGUI/Form.pm @@ -15,6 +15,8 @@ package WebGUI::Form; =cut use strict; +use Carp qw( croak ); +use Scalar::Util qw( blessed ); use Tie::IxHash; use WebGUI::Asset; use WebGUI::Asset::RichEdit; @@ -92,7 +94,7 @@ sub formFooter { #------------------------------------------------------------------- -=head2 formHeader ( session, hashRef ) +=head2 formHeader ( session, options ) Returns a form header. @@ -100,7 +102,7 @@ Returns a form header. A reference to the current session. -=head3 hashRef +=head3 options A hash reference that contains one or more of the following parameters. @@ -108,6 +110,9 @@ A hash reference that contains one or more of the following parameters. The form action. Defaults to the current page. +NOTE: If the C contains a query string (?param=value), C +will translate the parameters into hidden form elements automatically. + =head4 method The form method. Defaults to "post". @@ -118,28 +123,36 @@ The form enctype. Defaults to "multipart/form-data". =head4 extras -If you want to add anything special to the form header like javascript actions or stylesheet info, then use this. +If you want to add anything special to the form header like javascript +actions or stylesheet info, then use this. =cut sub formHeader { - my $session = shift; - my $params = shift; - my $action = $params->{action} || $session->url->page(); - my $hidden; - if ($action =~ /\?/) { - my ($path,$query) = split(/\?/,$action); - $action = $path; - my @params = split(/\;/,$query); - foreach my $param (@params) { - $param =~ s/amp;(.*)/$1/; - my ($name,$value) = split(/\=/,$param); - $hidden .= hidden($session,{name=>$name,value=>$value}); - } - } - my $method = $params->{method} || "post"; - my $enctype = $params->{enctype} || "multipart/form-data"; - return '
{extras}.'>
'.$hidden; + my $session = shift; + my $params = shift || {}; + + croak "First parameter must be WebGUI::Session object" + unless blessed $session && $session->isa( "WebGUI::Session" ); + croak "Second parameter must be hash reference" + if ref $params ne "HASH"; + + my $action = exists $params->{ action } ? $params->{ action } : $session->url->page(); + my $method = exists $params->{ method } ? $params->{ method } : "post"; + my $enctype = exists $params->{ enctype } ? $params->{ enctype } : "multipart/form-data"; + + # Fix a query string in the action URL + my $hidden; + if ($action =~ /\?/) { + ($action, my $query) = split /\?/, $action, 2; + my @params = split /[&;]/, $query; + foreach my $param ( @params ) { + my ($name, $value) = split /=/, $param; + $hidden .= hidden( $session, { name => $name, value => $value } ); + } + } + + return '{extras}.'>
'.$hidden; } diff --git a/lib/WebGUI/Form/SelectRichEditor.pm b/lib/WebGUI/Form/SelectRichEditor.pm new file mode 100644 index 000000000..1093dda31 --- /dev/null +++ b/lib/WebGUI/Form/SelectRichEditor.pm @@ -0,0 +1,101 @@ +package WebGUI::Form::SelectRichEditor; + +=head1 LEGAL + + ------------------------------------------------------------------- + WebGUI is Copyright 2001-2007 Plain Black Corporation. + ------------------------------------------------------------------- + Please read the legal notices (docs/legal.txt) and the license + (docs/license.txt) that came with this distribution before using + this software. + ------------------------------------------------------------------- + http://www.plainblack.com info@plainblack.com + ------------------------------------------------------------------- + +=cut + +use strict; +use base 'WebGUI::Form::SelectBox'; +use WebGUI::International; + +=head1 NAME + +WebGUI::Form::SelectRichEditor + +=head1 DESCRIPTION + +Creates a select box to choose a Rich Text Editor asset. + +=head1 SEE ALSO + +This is a subclass of WebGUI::Form::SelectBox. + +=head1 METHODS + +The following methods are specifically available from this class. Check the superclass for additional methods. + +=cut + +#---------------------------------------------------------------------------- + +=head2 definition ( [ additionalTerms ] ) + +See the super class for additional details. + +=head3 additionalTerms + +The following additional parameters have been added via this sub class. + +=head4 defaultValue + +Defaults to the Post Rich Editor, the least-featured Rich Text Editor and the +one most likely to be selected by users of this form control. + +=cut + +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift || []; + my $i18n = WebGUI::International->new($session); + push @{$definition}, { + formName => { + defaultValue => $i18n->get("475"), + }, + defaultValue => { + defaultValue => '', + }, + }; + return $class->SUPER::definition($session, $definition); +} + +#---------------------------------------------------------------------------- + +=head2 new + +Create a new WebGUI::Form::SelectRichEditor object and populate it with all +the available Rich Text Editor assets. + +=cut + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + + # Get all the RTEs available to this site + my $options + = $self->session->db->buildHashRef( q{ + SELECT DISTINCT(assetData.assetId), assetData.title + FROM asset, assetData + WHERE asset.className='WebGUI::Asset::RichEdit' + AND asset.assetId=assetData.assetId + ORDER BY assetData.title + }); + + $self->set( "options", $options ); + + return $self; +} + +1; + diff --git a/lib/WebGUI/Help/Asset_Gallery.pm b/lib/WebGUI/Help/Asset_Gallery.pm new file mode 100644 index 000000000..d449681f2 --- /dev/null +++ b/lib/WebGUI/Help/Asset_Gallery.pm @@ -0,0 +1,229 @@ +package WebGUI::Help::Asset_Gallery; + +our $HELP = { + 'help searchForm' => { + title => 'help searchForm title', + body => 'help searchForm body', + variables => [ + { + name => 'searchForm_start', + description => 'helpvar searchForm_start', + }, + { + name => 'searchForm_end', + description => 'helpvar searchForm_end', + }, + { + name => 'searchForm_basicSearch', + description => 'helpvar searchForm_basicSearch', + }, + { + name => 'searchForm_title', + description => 'helpvar searchForm_title', + }, + { + name => 'searchForm_description', + description => 'helpvar searchForm_description', + }, + { + name => 'searchForm_keywords', + description => 'helpvar searchForm_keywords', + }, + { + name => 'searchForm_className', + description => 'helpvar searchForm_className', + }, + { + name => 'searchForm_creationDate_after', + description => 'helpvar searchForm_creationDate_after', + }, + { + name => 'searchForm_creationDate_before', + description => 'helpvar searchForm_creationDate_before', + }, + { + name => 'searchForm_submit', + description => 'helpvar searchForm_submit', + }, + ], + }, + + 'help common' => { + title => 'help common title', + body => 'help common body', + isa => [ + { + tag => 'help searchForm', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'url_addAlbum', + description => 'helpvar url_addAlbum', + }, + { + name => 'url_listAlbums', + description => 'helpvar url_listAlbums', + }, + { + name => 'url_listAlbumsRss', + description => 'helpvar url_listAlbumsRss', + }, + { + name => 'url_listFilesForCurrentUser', + description => 'helpvar url_listFilesForCurrentUser', + }, + { + name => 'url_search', + description => 'helpvar url_search', + }, + { + name => 'canEdit', + description => 'helpvar canEdit', + }, + { + name => 'canAddFile', + description => 'helpvar canAddFile', + }, + ], + }, + + 'help listAlbums' => { + title => 'help listAlbums title', + body => 'help listAlbums body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'albums', + description => 'helpvar albums', + }, + ], + related => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + ], + }, + + 'help listAlbumsRss' => { + title => 'help listAlbumsRss title', + body => 'help listAlbumsRss body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'albums', + description => 'helpvar albums rss', + variables => [ + { + name => 'rssDate', + description => 'helpvar rssDate', + }, + ], + }, + ], + related => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + ], + }, + + 'help search' => { + title => 'help search title', + body => 'help search body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'search_results', + description => 'helpvar search_results', + }, + ], + # All classes that can be found by a Gallery search go in here + related => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + }, + + 'help listFilesForUser' => { + title => 'help listFilesForUser title', + body => 'help listFilesForUser body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'user_albums', + description => 'helpvar user_albums', + }, + { + name => 'user_files', + description => 'helpvar user_files', + }, + { + name => 'userId', + description => 'helpvar userId', + }, + { + name => 'url_rss', + description => 'helpvar url_rss', + }, + { + name => 'username', + description => 'helpvar username', + }, + ], + # All classes that can be found by a Gallery search go in here + related => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + }, + + 'help listFilesForUserRss' => { + title => 'help listFilesForUserRss title', + body => 'help listFilesForUserRss body', + isa => [ + { + tag => 'help listFilesForUser', + namespace => 'Asset_Gallery', + }, + ], + }, + +}; + +1; diff --git a/lib/WebGUI/Help/Asset_GalleryAlbum.pm b/lib/WebGUI/Help/Asset_GalleryAlbum.pm new file mode 100644 index 000000000..25cc4598a --- /dev/null +++ b/lib/WebGUI/Help/Asset_GalleryAlbum.pm @@ -0,0 +1,309 @@ +package WebGUI::Help::Asset_GalleryAlbum; + +our $HELP = { + + 'help common' => { + title => 'help common title', + body => 'help common body', + isa => [ + { + tag => 'help searchForm', + namespace => 'Asset_Gallery', + }, + ], + variables => [ + { + name => 'canAddFile', + description => 'helpvar canAddFile', + }, + { + name => 'canEdit', + description => 'helpvar canEdit', + }, + { + name => 'url_listAlbums', + description => 'helpvar url_listAlbums', + }, + { + name => 'url_listAlbumsRss', + description => 'helpvar url_listAlbumsRss', + }, + { + name => 'url_listFilesForCurrentUser', + description => 'helpvar url_listFilesForCurrentUser', + }, + { + name => 'url_search', + description => 'helpvar url_search', + }, + { + name => 'url_addArchive', + description => 'helpvar url_addArchive', + }, + { + name => 'url_addPhoto', + description => 'helpvar url_addPhoto', + }, + { + name => 'url_addNoClass', + description => 'helpvar url_addNoClass', + }, + { + name => 'url_delete', + description => 'helpvar url_delete', + }, + { + name => 'url_edit', + description => 'helpvar url_edit', + }, + { + name => 'url_listFilesForOwner', + description => 'helpvar url_listFilesForOwner', + }, + { + name => 'url_viewRss', + description => 'helpvar url_viewRss', + }, + { + name => 'url_slideshow', + description => 'helpvar url_slideshow', + }, + { + name => 'url_thumbnails', + description => 'helpvar url_thumbnails', + }, + { + name => 'fileCount', + description => 'helpvar fileCount', + }, + { + name => 'ownerUsername', + description => 'helpvar ownerUsername', + }, + { + name => 'thumbnailUrl', + description => 'helpvar thumbnailUrl', + }, + ], + }, + + 'help fileLoop' => { + title => 'help fileLoop title', + body => 'help fileLoop body', + variables => [ + { + name => 'file_loop', + description => 'helpvar file_loop', + }, + ], + + # ADD ALL GalleryAlbum FILE CLASSES HERE!!! + related => [ + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + }, + + 'help view' => { + title => 'help view title', + body => 'help view body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help fileLoop', + namespace => 'Asset_GalleryAlbum', + }, + ], + }, + + 'help slideshow' => { + title => 'help slideshow title', + body => 'help slideshow body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help fileLoop', + namespace => 'Asset_GalleryAlbum', + }, + ], + }, + + 'help thumbnails' => { + title => 'help thumbnails title', + body => 'help thumbnails body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help fileLoop', + namespace => 'Asset_GalleryAlbum', + }, + ], + + variables => [ + { + name => 'file_*', + description => 'helpvar file_*', + }, + ], + + # PUT ALL GalleryAlbum FILE CLASSES HERE ALSO!!! + related => [ + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + }, + + 'help addArchive' => { + title => 'help addArchive title', + body => 'help addArchive body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + ], + variables => { + { + name => 'form_start', + description => 'helpvar form_start', + required => 1, + }, + { + name => 'form_end', + description => 'helpvar form_end', + required => 1, + }, + { + name => 'form_submit', + description => 'helpvar form_submit', + }, + { + name => 'form_archive', + description => 'helpvar form_archive', + required => 1, + }, + { + name => 'form_keywords', + description => 'helpvar form_keywords', + }, + { + name => 'form_friendsOnly', + description => 'helpvar form_friendsOnly', + }, + }, + }, + + 'help delete' => { + title => 'help delete title', + body => 'help delete body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + ], + variables => [ + { + name => 'url_yes', + description => 'helpvar url_yes', + }, + ], + }, + + 'help edit' => { + title => 'help edit title', + body => 'help edit body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help fileLoop', + namespace => 'Asset_GalleryAlbum', + }, + ], + variables => [ + { + name => 'form_start', + description => 'helpvar form_start', + required => 1, + }, + { + name => 'form_end', + description => 'helpvar form_end', + required => 1, + }, + { + name => 'form_cancel', + description => 'helpvar form_cancel', + }, + { + name => 'form_submit', + description => 'helpvar form_submit', + }, + { + name => 'form_title', + description => 'helpvar form_title', + }, + { + name => 'form_description', + description => 'helpvar form_description', + required => 1, + }, + { + name => 'file_loop', + description => 'helpvar file_loop edit', + variables => [ + { + name => 'isAlbumThumbnail', + description => 'helpvar isAlbumThumbnail', + }, + ], + }, + ], + }, + + 'help viewRss' => { + title => 'help viewRss title', + body => 'help viewRss body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_GalleryAlbum', + }, + { + tag => 'help fileLoop', + namespace => 'Asset_GalleryAlbum', + }, + ], + variables => [ + { + name => 'file_loop', + description => 'helpvar file_loop viewRss', + variables => [ + { + name => 'rssDate', + description => 'helpvar rssDate', + }, + ], + }, + ], + }, + +}; + +1; diff --git a/lib/WebGUI/Help/Asset_Photo.pm b/lib/WebGUI/Help/Asset_Photo.pm new file mode 100644 index 000000000..9a733ed42 --- /dev/null +++ b/lib/WebGUI/Help/Asset_Photo.pm @@ -0,0 +1,258 @@ +package WebGUI::Help::Asset_Photo; + +our $HELP = { + 'help commentForm' => { + title => 'help commentForm title', + body => 'help commentForm body', + variables => [ + { + name => 'commentForm_start', + description => 'helpvar commentForm_start', + }, + { + name => 'commentForm_end', + description => 'helpvar commentForm_end', + }, + { + name => 'commentForm_bodyText', + description => 'helpvar commentForm_bodyText', + }, + { + name => 'commentForm_submit', + description => 'helpvar commentForm_submit', + }, + ], + }, + + 'help common' => { + title => 'help common title', + body => 'help common body', + isa => [ + { + tag => 'help searchForm', + namespace => 'Asset_Gallery', + }, + { + tag => 'help commentForm', + namespace => 'Asset_Photo', + }, + ], + variables => [ + { + name => 'canComment', + description => 'helpvar canComment', + }, + { + name => 'canEdit', + description => 'helpvar canEdit', + }, + { + name => 'fileUrl', + description => 'helpvar fileUrl', + }, + { + name => 'numberOfComments', + description => 'helpvar numberOfComments', + }, + { + name => 'ownerUsername', + description => 'helpvar ownerUsername', + }, + { + name => 'thumbnailUrl', + description => 'helpvar thumbnailUrl', + }, + { + name => 'url_delete', + description => 'helpvar url_delete', + }, + { + name => 'url_demote', + description => 'helpvar url_demote', + }, + { + name => 'url_edit', + description => 'helpvar url_edit', + }, + { + name => 'url_gallery', + description => 'helpvar url_gallery', + }, + { + name => 'url_makeShortcut', + description => 'helpvar url_makeShortcut', + }, + { + name => 'url_listFilesForOwner', + description => 'helpvar url_listFilesForOwner', + }, + { + name => 'url_promote', + description => 'helpvar url_promote', + }, + { + name => 'resolutions_loop', + description => 'helpvar resolutions_loop', + variables => [ + { + name => 'url_download', + description => 'helpvar resolutions_loop url_download', + }, + ], + }, + { + name => 'exif_*', + description => 'helpvar exif_*', + }, + { + name => 'exifLoop', + description => 'helpvar exifLoop', + variables => [ + { + name => 'tag', + description => 'helpvar exifLoop tag', + }, + { + name => 'value', + description => 'helpvar exifLoop value', + }, + ], + }, + ], + }, + + 'help delete' => { + title => 'help delete title', + body => 'help delete body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + variables => [ + { + name => 'url_yes', + description => 'helpvar url_yes', + }, + ], + }, + + 'help edit' => { + title => 'help edit title', + body => 'htlp edit body', + variables => [ + { + name => 'url_addArchive', + description => 'helpvar url_addArchive', + }, + { + name => 'form_start', + description => 'helpvar form_start', + required => 1, + }, + { + name => 'form_end', + description => 'helpvar form_end', + required => 1, + }, + { + name => 'form_submit', + description => 'helpvar form_submit', + }, + { + name => 'form_title', + description => 'helpvar form_title', + }, + { + name => 'form_synopsis', + description => 'helpvar form_synopsis', + }, + { + name => 'form_photo', + description => 'helpvar form_photo', + }, + { + name => 'form_keywords', + description => 'helpvar form_keywords', + }, + { + name => 'form_location', + description => 'helpvar form_location', + }, + { + name => 'form_friendsOnly', + description => 'helpvar form_friendsOnly', + }, + ], + }, + + 'help makeShortcut' => { + title => 'help makeShortcut title', + body => 'htlp makeShortcut body', + variables => [ + { + name => 'form_start', + description => 'helpvar form_start', + required => 1, + }, + { + name => 'form_end', + description => 'helpvar form_end', + required => 1, + }, + { + name => 'form_parentId', + description => 'helpvar form_parentId', + required => 1, + }, + ], + } + 'help view' => { + title => 'help view title', + body => 'help view body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + ], + variables => [ + { + name => 'commentLoop', + description => 'helpvar commentLoop', + variables => [ + { + name => 'userId', + description => 'helpvar commentLoop userId', + }, + { + name => 'visitorIp', + description => 'helpvar commentLoop visitorIp', + }, + { + name => 'creationDate', + description => 'helpvar commentLoop creationDate', + }, + { + name => 'bodyText', + description => 'helpvar commentLoop bodyText', + }, + { + name => 'username', + description => 'helpvar commentLoop username', + }, + ], + }, + { + name => 'commentLoop_pageBar', + description => 'helpvar commentLoop_pageBar', + }, + ], + }, + + +}; + +1; + diff --git a/lib/WebGUI/Keyword.pm b/lib/WebGUI/Keyword.pm index 3ae518bc7..a5fbc9adc 100644 --- a/lib/WebGUI/Keyword.pm +++ b/lib/WebGUI/Keyword.pm @@ -27,6 +27,9 @@ Package WebGUI::Keyword This package provides an API to create and modify keywords used by the asset sysetm. +Assets can use the C property to set keywords automatically. See +WebGUI::Asset::update() for more details. + =head1 SYNOPSIS use WebGUI::Keyword; diff --git a/lib/WebGUI/Search.pm b/lib/WebGUI/Search.pm index b19ec0316..138b9b80b 100644 --- a/lib/WebGUI/Search.pm +++ b/lib/WebGUI/Search.pm @@ -15,6 +15,7 @@ package WebGUI::Search; =cut use strict; +use Carp qw( croak ); use WebGUI::Asset; =head1 NAME @@ -329,6 +330,9 @@ This rule allows for an array reference of table join clauses. join => 'join assetData on assetId = assetData.assetId' +NOTE: This rule is deprecated and will be removed in a future release. Use +joinClass instead. + =head4 columns This rule allows for additional columns to be returned by getResultSet(). @@ -344,6 +348,11 @@ placeholders and parameters. sub search { my $self = shift; my $rules = shift; + + # Send the rules through some sanity checks + croak "'lineage' rule must be array reference" + if ( $rules->{lineage} && ref $rules->{lineage} ne "ARRAY" ); + my @params = (); my $query = ""; my @clauses = (); @@ -410,10 +419,31 @@ sub search { if ($rules->{where}) { push(@clauses, $rules->{where}); } - if ($rules->{join}) { # This join happens in _getQuery - $rules->{join} = [$rules->{join}] - unless (ref $rules->{join} eq "ARRAY"); - $self->{_join} = $rules->{join}; + # deal with custom joined tables if we must + if (exists $rules->{joinClass}) { + my $join = [ "left join assetData on assetIndex.assetId=assetData.assetId" ]; + for my $className ( @{ $rules->{ joinClass } } ) { + my $cmd = "use " . $className; + eval { $cmd }; + $self->session->errorHandler->fatal("Couldn't compile asset package: ".$className.". Root cause: ".$@) if ($@); + foreach my $definition (@{$className->definition($self->session)}) { + unless ($definition->{tableName} eq "asset") { + my $tableName = $definition->{tableName}; + push @$join, + "left join $tableName on assetData.assetId=".$tableName.".assetId and assetData.revisionDate=".$tableName.".revisionDate"; + } + last; + } + } + # Get only the latest revision + push @clauses, "assetData.revisionDate = (SELECT MAX(revisionDate) FROM assetData ad WHERE ad.assetId = assetData.assetId)"; + # Join happens in _getQuery + $self->{_join} = $join; + } + elsif ($rules->{join}) { # This join happens in _getQuery + $rules->{join} = [$rules->{join}] + unless (ref $rules->{join} eq "ARRAY"); + $self->{_join} = $rules->{join}; } if ($rules->{columns}) { $rules->{columns} = [$rules->{columns}] diff --git a/lib/WebGUI/Storage.pm b/lib/WebGUI/Storage.pm index 9291d0c79..5c7178c4c 100644 --- a/lib/WebGUI/Storage.pm +++ b/lib/WebGUI/Storage.pm @@ -15,6 +15,8 @@ package WebGUI::Storage; =cut use Archive::Tar; +use Carp qw( croak ); +use Cwd; use File::Copy qw(cp); use FileHandle; use File::Find; @@ -24,7 +26,6 @@ use Storable qw(nstore retrieve); use strict; use warnings; use WebGUI::Utility; -use Carp; =head1 NAME @@ -64,6 +65,7 @@ This package provides a mechanism for storing and retrieving files that are not $newstore = $store->untar($filename); + $store->copyFile($filename, $newFilename); $store->delete; $store->deleteFile($filename); $store->rename($filename, $newFilename); @@ -202,6 +204,7 @@ sub addFileFromFormPost { my $filename; my $attachmentCount = 1; foreach my $upload ($self->session->request->upload($formVariableName)) { + $self->session->errorHandler->info("Trying to get " . $upload->filename); return $filename if $attachmentCount > $attachmentLimit; my $tempFilename = $upload->filename(); next unless $tempFilename; @@ -225,6 +228,7 @@ sub addFileFromFormPost { print $file $buffer; } close($file); + $self->session->errorHandler->info("Got ".$upload->filename); } else { $self->_addError("Couldn't open file ".$self->getPath($filename)." for writing due to error: ".$!); return undef; @@ -343,6 +347,31 @@ sub copy { #------------------------------------------------------------------- +=head2 copyFile ( filename, newFilename ) + +Copy a file in this storage location. C is the file to copy. +C is the new file to create. + +=cut + +sub copyFile { + my $self = shift; + my $filename = shift; + my $newFilename = shift; + + croak "Can't find '$filename' in storage location " . $self->getId + unless -e $self->getPath($filename); + croak "Second argument must be a filename" + unless $newFilename; + + cp( $self->getPath($filename), $self->getPath($newFilename) ) + || croak "Couldn't copy '$filename' to '$newFilename': $!"; + + return; +} + +#------------------------------------------------------------------- + =head2 create ( session ) Creates a new storage location on the file system. @@ -354,9 +383,9 @@ A reference to the current session; =cut sub create { - my $class = shift; - my $session = shift; - my $id = $session->id->generate(); + my $class = shift; + my $session = shift; + my $id = $session->id->generate(); #Determine whether or not to use case insensitive files my $config = $session->config; @@ -365,14 +394,16 @@ sub create { #$session->errorHandler->warn($caseInsensitive.": $id\n".Carp::longmess()."\n"); #For case insensitive operating systems, convert guid to hex - if($caseInsensitive) { + if ($caseInsensitive) { my $hexId = $session->id->toHex($id); $db->write("insert into storageTranslation (guidValue,hexValue) values (?,?)",[$id,$hexId]); } my $self = $class->get($session,$id); - $self->_makePath; - return $self; + $self->_makePath; + + $session->errorHandler->info("Created storage location $id as a $class"); + return $self; } @@ -446,6 +477,7 @@ sub delete { $db->write("delete from storageTranslation where guidValue=?",[$self->getId]); } } + $self->session->errorHandler->info("Deleted storage ".$self->getId); return; } @@ -753,6 +785,8 @@ Returns a full path to this storage location. If specified, we'll return a path to the file rather than the storage location. +NOTE: Does not check if the file exists. This is a feature. + =cut sub getPath { @@ -898,21 +932,22 @@ Pass in a storage location object to create the tar file in, instead of having a =cut sub tar { - my $self = shift; - my $filename = shift; - my $temp = shift || WebGUI::Storage->createTemp($self->session); + my $self = shift; + my $filename = shift; + my $temp = shift || WebGUI::Storage->createTemp($self->session); chdir $self->getPath or croak 'Unable to chdir to ' . $self->getPath . ": $!"; - my @files = (); - find(sub { push(@files, $File::Find::name)}, "."); - if ($Archive::Tar::VERSION eq '0.072') { - my $tar = Archive::Tar->new(); - $tar->add_files(@files); - $tar->write($temp->getPath($filename),1); - - } else { - Archive::Tar->create_archive($temp->getPath($filename),1,@files); - } - return $temp; + my @files = (); + find(sub { push(@files, $File::Find::name)}, "."); + if ($Archive::Tar::VERSION eq '0.072') { + my $tar = Archive::Tar->new(); + $tar->add_files(@files); + $tar->write($temp->getPath($filename),1); + + } + else { + Archive::Tar->create_archive($temp->getPath($filename),1,@files); + } + return $temp; } #------------------------------------------------------------------- @@ -932,12 +967,17 @@ Pass in a storage location object to extract the contents to, instead of having =cut sub untar { - my $self = shift; - my $filename = shift; - my $temp = shift || WebGUI::Storage->createTemp($self->session); + my $self = shift; + my $filename = shift; + my $temp = shift || WebGUI::Storage->createTemp($self->session); + + my $originalDir = cwd; chdir $temp->getPath; + Archive::Tar->extract_archive($self->getPath($filename),1); $self->_addError(Archive::Tar->error) if (Archive::Tar->error); + + chdir $originalDir; return $temp; } diff --git a/lib/WebGUI/Storage/Image.pm b/lib/WebGUI/Storage/Image.pm index 008a6ed6c..241d1a783 100644 --- a/lib/WebGUI/Storage/Image.pm +++ b/lib/WebGUI/Storage/Image.pm @@ -52,11 +52,11 @@ use WebGUI::Storage::Image; These methods are available from this class: -my $boolean = $self->generateThumbnail($filename); -my $url = $self->getThumbnailUrl($filename); -my $boolean = $self->isImage($filename); -my ($captchaFile, $challenge) = $self->addFileFromCaptcha; -$self->resize($imageFile, $width, $height); + my $boolean = $self->generateThumbnail($filename); + my $url = $self->getThumbnailUrl($filename); + my $boolean = $self->isImage($filename); + my ($captchaFile, $challenge) = $self->addFileFromCaptcha; + $self->resize($imageFile, $width, $height); =cut @@ -284,7 +284,7 @@ sub getThumbnailUrl { return ''; } if (! isIn($filename, @{ $self->getFiles() })) { - $self->session->errorHandler->error("Can't make a thumbnail for a file that is not in my storage location."); + $self->session->errorHandler->error("Can't make a thumbnail for a file named '$filename' that is not in my storage location."); return ''; } return $self->getUrl("thumb-".$filename); @@ -331,41 +331,42 @@ The new height of the image in pixels. =cut sub resize { - my $self = shift; - my $filename = shift; - my $width = shift; - my $height = shift; - unless (defined $filename) { - $self->session->errorHandler->error("Can't resize when you haven't specified a file."); - return 0; - } - unless ($self->isImage($filename)) { - $self->session->errorHandler->error("Can't resize something that's not an image."); - return 0; - } - unless ($width || $height) { - $self->session->errorHandler->error("Can't resize with no resizing parameters."); - return 0; - } - my $image = $graphicsPackage->new; - my $error = $image->Read($self->getPath($filename)); - if ($error) { - $self->session->errorHandler->error("Couldn't read image for resizing: ".$error); - return 0; - } - my ($x, $y) = $image->Get('width','height'); - if ($width && !$height) { # proportional scale by width - $height = $width / $x * $y; - } elsif (!$width && $height) { # proportional scale by height - $width = $height * $x / $y; - } - $image->Scale(width=>$width, height=>$height); - $error = $image->Write($self->getPath($filename)); - if ($error) { - $self->session->errorHandler->error("Couldn't create thumbnail: ".$error); - return 0; - } - return 1; + my $self = shift; + my $filename = shift; + my $width = shift; + my $height = shift; + unless (defined $filename) { + $self->session->errorHandler->error("Can't resize when you haven't specified a file."); + return 0; + } + unless ($self->isImage($filename)) { + $self->session->errorHandler->error("Can't resize something that's not an image."); + return 0; + } + unless ($width || $height) { + $self->session->errorHandler->error("Can't resize with no resizing parameters."); + return 0; + } + my $image = $graphicsPackage->new; + my $error = $image->Read($self->getPath($filename)); + if ($error) { + $self->session->errorHandler->error("Couldn't read image for resizing: ".$error); + return 0; + } + my $geometry; + if (!$width || !$height) { + $geometry = $width || $height; + } + else { + $geometry = $width . "x" . $height; + } + $image->Resize( geometry => $geometry, filter => "lanczos" ); + $error = $image->Write($self->getPath($filename)); + if ($error) { + $self->session->errorHandler->error("Couldn't resize image: ".$error); + return 0; + } + return 1; } diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm index 41bc3d843..a93676cf9 100644 --- a/lib/WebGUI/i18n/English/Asset_Gallery.pm +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -5,6 +5,554 @@ our $I18N = { message => 'Gallery', lastUpdated => 1131394072, }, + "groupIdAddComment label" => { + message => "Group to Add Comments", + lastUpdated => 0, + context => '', + }, + "groupIdAddComment description" => { + message => "The group that is allowed to add comments to files.", + lastUpdated => 0, + context => '', + }, + "groupIdAddFile label" => { + message => "Group to Add Files", + lastUpdated => 0, + context => '', + }, + "groupIdAddFile description" => { + message => "The group that is allowed to add files and albums to this gallery", + lastUpdated => 0, + context => '', + }, + "groupIdModerator label" => { + message => "Group to Moderate Comments", + lastUpdated => 0, + context => '', + }, + "groupIdModerator description" => { + message => "The group that is allowed to edit / delete comments in this gallery", + lastUpdated => 0, + context => '', + }, + "imageResolutions label" => { + message => "Image Resolutions", + lastUpdated => 0, + context => '', + }, + "imageResolutions description" => { + message => "The sizes of images available for download.", + lastUpdated => 0, + context => '', + }, + "imageViewSize label" => { + message => "Image View Size", + lastUpdated => 0, + context => '', + }, + "imageViewSize description" => { + message => "The size for images in the gallery. Will default to the Image Size + in the site settings.", + lastUpdated => 0, + context => '', + }, + "imageThumbnailSize label" => { + message => "Image Thumbnail Size", + lastUpdated => 0, + context => '', + }, + "imageThumbnailSize description" => { + message => "The size for thumbnails of images in the gallery. Will default to the + Thumbnail Size in the site settings.", + lastUpdated => 0, + context => '', + }, + "maxSpacePerUser label" => { + message => "Max Disk Space Per User", + lastUpdated => 0, + context => '', + }, + "maxSpacePerUser description" => { + message => "The maximum amount of disk space a user is allowed to use in this Gallery.", + lastUpdated => 0, + context => '', + }, + "richEditIdFileComment label" => { + message => "Rich Editor for Comments", + lastUpdated => 0, + context => '', + }, + "richEditIdFileComment description" => { + message => "The Rich Text Editor to use for comments", + lastUpdated => 0, + context => '', + }, + 'search class galleryalbum' => { + message => 'Album', + lastUpdated => 0, + context => 'Asset name for WebGUI::Asset::Wobject::GalleryAlbum', + }, + 'search class any' => { + message => 'Any', + lastUpdated => 0, + context => 'Label to not restrict gallery search by class', + }, + 'search class photo' => { + message => "Photo", + lastUpdated => 0, + context => 'Asset name for WebGUI::Asset::File::Image::Photo class', + }, + "search submit" => { + message => "Search", + lastUpdated => 0, + context => 'Label for button to submit search form', + }, + "templateIdAddArchive label" => { + message => "Template to Add Multiple", + lastUpdated => 0, + context => '', + }, + "templateIdAddArchive description" => { + message => "Display the form to add an archive of files to the gallery.", + lastUpdated => 0, + context => '', + }, + "templateIdDeleteAlbum label" => { + message => "Template to Delete Albums", + lastUpdated => 0, + context => '', + }, + "templateIdDeleteAlbum description" => { + message => "Display the confirmation to delete an album from the gallery.", + lastUpdated => 0, + context => '', + }, + "templateIdDeleteFile label" => { + message => "Template to Delete Files", + lastUpdated => 0, + context => '', + }, + "templateIdDeleteFile description" => { + message => "Display the confirmation to delete a file from the gallery.", + lastUpdated => 0, + context => '', + }, + "templateIdEditAlbum label" => { + message => "Template to Edit Albums", + lastUpdated => 0, + context => '', + }, + "templateIdEditAlbum description" => { + message => "The template to add / edit an album.", + lastUpdated => 0, + context => '', + }, + "templateIdEditFile label" => { + message => "Template to Edit Files", + lastUpdated => 0, + context => '', + }, + "templateIdEditFile description" => { + message => "The template to add / edit a file.", + lastUpdated => 0, + context => '', + }, + "templateIdListAlbums label" => { + message => "Template to List Albums", + lastUpdated => 0, + context => '', + }, + "templateIdListAlbums description" => { + message => "Template to show a list of albums in the gallery.", + lastUpdated => 0, + context => '', + }, + "templateIdListAlbumsRss label" => { + message => "Template to List Albums RSS", + lastUpdated => 0, + context => '', + }, + "templateIdListAlbumsRss description" => { + message => "Template to show an RSS feed of the albums in this gallery.", + lastUpdated => 0, + context => '', + }, + "templateIdMakeShortcut label" => { + message => "Template to Cross Post Files", + lastUpdated => 0, + context => '', + }, + "templateIdMakeShortcut description" => { + message => "Display the form to copy an image to another album.", + lastUpdated => 0, + context => '', + }, + "templateIdSearch label" => { + message => "Template to Search", + lastUpdated => 0, + context => '', + }, + "templateIdSearch description" => { + message => "Display the form to search the gallery. Display search results.", + lastUpdated => 0, + context => '', + }, + "templateIdViewSlideshow label" => { + message => "Template for Slideshow", + lastUpdated => 0, + context => '', + }, + "templateIdViewSlideshow description" => { + message => "Display all the images in an album as a slideshow.", + lastUpdated => 0, + context => '', + }, + "templateIdViewThumbnails label" => { + message => "Template for Thumbnails", + lastUpdated => 0, + context => '', + }, + "templateIdViewThumbnails description" => { + message => "Display all the images in an album as their thumbnails", + lastUpdated => 0, + context => '', + }, + "templateIdListFilesForUser label" => { + message => "Template to List Files for User", + lastUpdated => 0, + context => '', + }, + "templateIdListFilesForUser description" => { + message => "Display all the files and albums for a specific user.", + lastUpdated => 0, + context => '', + }, + "templateIdListFilesForUserRss label" => { + message => "Template to List Files for User RSS", + lastUpdated => 0, + context => '', + }, + "templateIdListFilesForUserRss description" => { + message => "RSS feed for all the files for a specific user.", + lastUpdated => 0, + context => '', + }, + "templateIdViewAlbum label" => { + message => "Template to View Album", + lastUpdated => 0, + context => '', + }, + "templateIdViewAlbum description" => { + message => "Default view for albums", + lastUpdated => 0, + context => '', + }, + "templateIdViewAlbumRss label" => { + message => "Template to View Album RSS", + lastUpdated => 0, + context => '', + }, + "templateIdViewAlbumRss description" => { + message => "RSS feed for a single album", + lastUpdated => 0, + context => '', + }, + "templateIdViewFile label" => { + message => "Template to View a File", + lastUpdated => 0, + context => '', + }, + "templateIdViewFile description" => { + message => "Show the details and comments for a specific file", + lastUpdated => 0, + context => '', + }, + "viewDefault label" => { + message => "Default View", + lastUpdated => 0, + context => '', + }, + "viewDefault description" => { + message => "Select the default view when a user enters the gallery.", + lastUpdated => 0, + context => '', + }, + "viewDefault option list" => { + message => "List Albums", + lastUpdated => 0, + context => '', + }, + "viewDefault option album" => { + message => "Single Album", + lastUpdated => 0, + context => '', + }, + "viewAlbumAssetId label" => { + message => "Default View Album", + lastUpdated => 0, + context => '', + }, + "viewAlbumAssetId description" => { + message => "The album to view when the default view is 'Album'", + lastUpdated => 0, + context => '', + }, + "viewListOrderBy label" => { + message => "List Albums Order By", + lastUpdated => 0, + context => '', + }, + "viewListOrderBy description" => { + message => "The field to order the album list by", + lastUpdated => 0, + context => '', + }, + "viewListOrderBy option creationDate" => { + message => "Creation Date", + lastUpdated => 0, + context => '', + }, + "viewListOrderBy option lineage" => { + message => "Sequence Number", + lastUpdated => 0, + context => 'Label to order by sequence (as in asset manager)', + }, + "viewListOrderBy option revisionDate" => { + message => "Revision Date", + lastUpdated => 0, + context => '', + }, + "viewListOrderBy option title" => { + message => "Title", + lastUpdated => 0, + context => '', + }, + "viewListOrderDirection label" => { + message => "List Albums Direction", + lastUpdated => 0, + context => '', + }, + "viewListOrderDirection description" => { + message => "The direction to order the album list", + lastUpdated => 0, + context => '', + }, + "viewListOrderDirection option asc" => { + message => "Ascending", + lastUpdated => 0, + context => 'Label for sorting in ascending order', + }, + "viewListOrderDirection option desc" => { + message => "Descending", + lastUpdated => 0, + context => 'Label for sorting in descending order', + }, + "workflowIdCommit label" => { + message => "Approval Workflow", + lastUpdated => 0, + context => '', + }, + "workflowIdCommit description" => { + message => "Workflow to approve new Files.", + lastUpdated => 0, + context => '', + }, + + 'helpvar searchForm_start' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_end' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_basicSearch' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_title' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_description' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_keywords' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_className' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_creationDate_after' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_creationDate_before' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar searchForm_submit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_addAlbum' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listAlbums' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listAlbumsRss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listFilesForCurrentUser' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_search' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar canEdit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar canAddFile' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar albums' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar albums rss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar rssDate' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar search_results' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar user_albums' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar user_files' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar userId' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_rss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar username' => { + message => '', + lastUpdated => 0, + }, + + 'help searchForm title' => { + message => '', + lastUpdated => 0, + }, + + 'help searchForm body' => { + message => '', + lastUpdated => 0, + }, + + 'help common title' => { + message => '', + lastUpdated => 0, + }, + + 'help common body' => { + message => '', + lastUpdated => 0, + }, + + 'help listAlbums title' => { + message => '', + lastUpdated => 0, + }, + + 'help listAlbums body' => { + message => '', + lastUpdated => 0, + }, + + 'help listAlbumsRss title' => { + message => '', + lastUpdated => 0, + }, + + 'help search body' => { + message => '', + lastUpdated => 0, + }, + + 'help search title' => { + message => '', + lastUpdated => 0, + }, + + 'help listFilesForUser title' => { + message => '', + lastUpdated => 0, + }, + + 'help listFilesForUser body' => { + message => '', + lastUpdated => 0, + }, + + 'help listFilesForUserRss title' => { + message => '', + lastUpdated => 0, + }, + + 'help listFilesForUserRss body' => { + message => '', + lastUpdated => 0, + }, + }; 1; diff --git a/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm index cff839973..7724c47fc 100644 --- a/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm +++ b/lib/WebGUI/i18n/English/Asset_GalleryAlbum.pm @@ -1,10 +1,299 @@ package WebGUI::i18n::English::Asset_GalleryAlbum; our $I18N = { + 'addArchive message' => { + message => 'Your files have been submitted for approval and commit. Return to Album', + lastUpdated => 0, + }, 'assetName' => { message => 'Gallery Album', lastUpdated => 1131394072, }, + 'cancel' => { + message => "Cancel", + lastUpdated => 0, + context => "Label for Cancel button", + }, + 'save' => { + message => "Save", + lastUpdated => 0, + context => "Label for Save button", + }, + 'save message' => { + message => 'Album settings saved. Return to Album', + lastUpdated => 0, + }, + + 'help common title' => { + message => '', + lastUpdated => 0, + }, + + 'help common body' => { + message => '', + lastUpdated => 0, + }, + + 'help fileLoop title' => { + message => '', + lastUpdated => 0, + }, + + 'help fileLoop body' => { + message => '', + lastUpdated => 0, + }, + + 'help view title' => { + message => '', + lastUpdated => 0, + }, + + 'help view body' => { + message => '', + lastUpdated => 0, + }, + + 'help slideshow title' => { + message => '', + lastUpdated => 0, + }, + + 'help slideshow body' => { + message => '', + lastUpdated => 0, + }, + + 'help thumbnails title' => { + message => '', + lastUpdated => 0, + }, + + 'help thumbnails body' => { + message => '', + lastUpdated => 0, + }, + + 'help addArchive title' => { + message => '', + lastUpdated => 0, + }, + + 'help addArchive body' => { + message => '', + lastUpdated => 0, + }, + + 'help delete title' => { + message => '', + lastUpdated => 0, + }, + + 'help delete body' => { + message => '', + lastUpdated => 0, + }, + + 'help edit title' => { + message => '', + lastUpdated => 0, + }, + + 'help viewRss title' => { + message => '', + lastUpdated => 0, + }, + + 'help viewRss body' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar canAddFile' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar canEdit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listAlbums' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listAlbumsRss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listFilesForCurrentUser' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_search' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_addArchive' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_addPhoto' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_addNoClass' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_delete' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_edit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_listFilesForOwner' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_viewRss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_slideshow' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_thumbnails' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar fileCount' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar ownerUsername' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar thumbnailUrl' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar file_loop' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar file_*' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_start' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_end' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_submit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_archive' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_keywords' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_friendsOnly' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_yes' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_start' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_end' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_cancel' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_submit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_title' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_description' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar file_loop edit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar isAlbumThumbnail' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar file_loop viewRss' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar rssDate' => { + message => '', + lastUpdated => 0, + }, + }; 1; diff --git a/lib/WebGUI/i18n/English/Asset_Photo.pm b/lib/WebGUI/i18n/English/Asset_Photo.pm new file mode 100644 index 000000000..bca896348 --- /dev/null +++ b/lib/WebGUI/i18n/English/Asset_Photo.pm @@ -0,0 +1,291 @@ +package WebGUI::i18n::English::Asset_Photo; + +our $I18N = { + 'assetName' => { + message => q{Photo}, + lastUpdated => 0, + }, + + 'delete message' => { + message => q{The photo has been deleted. Return to Album}, + lastUpdated => 0, + }, + + 'save message' => { + message => q{Your photo has been submitted for approval and commit. View Photo. Add another photo.}, + lastUpdated => 0, + }, + + 'help commentForm title' => { + message => 'Photo -- Comment Form', + lastUpdated => 0, + }, + + 'help commentForm body' => { + message => 'These template variables make up the form to allow users to post comments on Photos', + lastUpdated => 0, + }, + + 'help common title' => { + message => 'Photo -- Common', + lastUpdated => 0, + }, + + 'help common body' => { + message => 'These template variables are shared by all views of the Photo asset.', + lastUpdated => 0, + }, + + 'help edit title' => { + message => 'Photo -- Edit Form', + lastUpdated => 0, + }, + + 'help edit body' => { + message => 'These template variables make up the form to add / edit Photo assets', + lastUpdated => 0, + }, + + 'help makeShortcut title' => { + message => 'Photo -- Make Shortcut Form', + lastUpdated => 0, + }, + + 'help makeShortcut body' => { + message => 'These template variables make up the form to cross-post Photo assets', + lastUpdated => 0, + }, + + 'help view title' => { + message => 'Photo -- Normal View', + lastUpdated => 0, + }, + + 'help view body' => { + message => 'These template variables make up the normal view of Photo assets', + lastUpdated => 0, + }, + + 'helpvar commentForm_start' => { + message => 'Begin the comment form', + lastUpdated => 0, + }, + + 'helpvar commentForm_end' => { + message => 'End the comment form', + lastUpdated => 0, + }, + + 'helpvar commentForm_bodyText' => { + message => 'The body of the comment. A rich editor as configured by the parent Gallery.', + lastUpdated => 0, + }, + + 'helpvar commentForm_submit' => { + message => 'Submit the comment form', + lastUpdated => 0, + }, + + 'helpvar canComment' => { + message => 'This is true if the current user can comment on this photo', + lastUpdated => 0, + }, + + 'helpvar canEdit' => { + message => 'This is true if the current user can edit this photo', + lastUpdated => 0, + }, + + 'helpvar fileUrl' => { + message => 'The URL to the normal-sized photo', + lastUpdated => 0, + }, + + 'helpvar numberOfComments' => { + message => 'The total number of comments on this photo', + lastUpdated => 0, + }, + + 'helpvar ownerUsername' => { + message => 'The username of the user who posted this photo', + lastUpdated => 0, + }, + + 'helpvar thumbnailUrl' => { + message => 'The URL to the thumbnail of this photo', + lastUpdated => 0, + }, + + 'helpvar url_delete' => { + message => 'The URL to delete this photo.', + lastUpdated => 0, + }, + + 'helpvar url_demote' => { + message => 'The URL to demote this photo in rank. Will return the user directly to the parent GalleryAlbum edit form', + lastUpdated => 0, + }, + + 'helpvar url_edit' => { + message => 'The URL to edit this photo', + lastUpdated => 0, + }, + + 'helpvar url_gallery' => { + message => 'The URL to the Gallery that contains this photo.', + lastUpdated => 0, + }, + + 'helpvar url_makeShortcut' => { + message => 'The URL to make a shortcut to this photo.', + lastUpdated => 0, + }, + + 'helpvar url_listFilesForOwner' => { + message => 'The URL to list files and albums posted by the owner of this photo', + lastUpdated => 0, + }, + + 'helpvar url_promote' => { + message => 'The URL to promote this photo in rank. Will return the user directly to the parent GalleryAlbum edit form', + lastUpdated => 0, + }, + + 'helpvar resolutions_loop' => { + message => 'The available resolutions this photo has for download.', + lastUpdated => 0, + }, + + 'helpvar resolutions_loop url_download' => { + message => 'The URL to the resolution to download.', + lastUpdated => 0, + }, + + 'helpvar exif_*' => { + message => 'Each EXIF tag can be referenced by name.', + lastUpdated => 0, + }, + + 'helpvar exifLoop' => { + message => 'A loop of EXIF tags', + lastUpdated => 0, + }, + + 'helpvar exifLoop tag' => { + message => 'The name of the EXIF tag', + lastUpdated => 0, + }, + + 'helpvar exifLoop value' => { + message => 'The value of the EXIF tag', + lastUpdated => 0, + }, + + 'helpvar url_addArchive' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_start' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_end' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_submit' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_title' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_synopsis' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_photo' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_keywords' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_location' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_friendsOnly' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_start' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_end' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar form_parentId' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop userId' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop visitorIp' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop creationDate' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop bodyText' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop username' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar commentLoop_pageBar' => { + message => '', + lastUpdated => 0, + }, + + 'helpvar url_yes' => { + message => '', + lastUpdated => 0, + }, + +}; + +1; diff --git a/t/Asset/Wobject/Gallery/00base.t b/t/Asset/Wobject/Gallery/00base.t new file mode 100644 index 000000000..0119dc465 --- /dev/null +++ b/t/Asset/Wobject/Gallery/00base.t @@ -0,0 +1,78 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of album assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 5; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 1 +use_ok("WebGUI::Asset::Wobject::GalleryAlbum"); + +#---------------------------------------------------------------------------- +# Test creating an album +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); + +is( + blessed $album, "WebGUI::Asset::Wobject::GalleryAlbum", + "Album is a WebGUI::Asset::Wobject::GalleryAlbum object", +); + +isa_ok( + $album, "WebGUI::Asset::Wobject", +); + +#---------------------------------------------------------------------------- +# Test deleting a album +my $properties = $album->get; +$album->purge; + +is( + $album, undef, + "Album is undefined", +); + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Album no longer able to be instanciated", +); + diff --git a/t/Asset/Wobject/Gallery/delete.t b/t/Asset/Wobject/Gallery/delete.t new file mode 100644 index 000000000..f49603f93 --- /dev/null +++ b/t/Asset/Wobject/Gallery/delete.t @@ -0,0 +1,96 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the deleting of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::Html->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Delete page gives error for those who can't edit the GalleryAlbum +$maker->prepare({ + object => $album, + method => "www_delete", + test_privilege => "insufficient", + userId => 1, +}, { + object => $album, + method => "www_deleteConfirm", + test_privilege => "insufficient", + userId => 1, +}); +$maker->run; + +#---------------------------------------------------------------------------- +# Delete confirm page appears for those allowed to edit the GalleryAlbum +$maker->prepare({ + object => $album, + method => "www_delete", + test_regex => [ qr/func=deleteConfirm/, ], + userId => 3, +}); +$maker->run; + +#---------------------------------------------------------------------------- +# www_deleteConfirm deletes the asset +my $assetId = $album->getId; +$maker->prepare({ + object => $album, + method => "www_deleteConfirm", + test_regex => [ qr/has been deleted/, ], + userId => 3, +}); +$maker->run; + +is( + WebGUI::Asset->newByDynamicClass( $session, $assetId ), + undef, + "GalleryAlbum cannot be instanciated after www_deleteConfirm", +); + diff --git a/t/Asset/Wobject/Gallery/listFilesForUser.t b/t/Asset/Wobject/Gallery/listFilesForUser.t new file mode 100644 index 000000000..0119dc465 --- /dev/null +++ b/t/Asset/Wobject/Gallery/listFilesForUser.t @@ -0,0 +1,78 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of album assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 5; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 1 +use_ok("WebGUI::Asset::Wobject::GalleryAlbum"); + +#---------------------------------------------------------------------------- +# Test creating an album +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); + +is( + blessed $album, "WebGUI::Asset::Wobject::GalleryAlbum", + "Album is a WebGUI::Asset::Wobject::GalleryAlbum object", +); + +isa_ok( + $album, "WebGUI::Asset::Wobject", +); + +#---------------------------------------------------------------------------- +# Test deleting a album +my $properties = $album->get; +$album->purge; + +is( + $album, undef, + "Album is undefined", +); + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Album no longer able to be instanciated", +); + diff --git a/t/Asset/Wobject/Gallery/permission.t b/t/Asset/Wobject/Gallery/permission.t new file mode 100644 index 000000000..2d91342ed --- /dev/null +++ b/t/Asset/Wobject/Gallery/permission.t @@ -0,0 +1,107 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the permissions of GalleryAlbum assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::Permission; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::Permission->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); + +my %user; +$user{"2"} = WebGUI::User->new( $session, "new" ); +$user{"2"}->addToGroups( ['2'] ); # Registered user + +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); + $user{"2"}->delete; +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# By default, GalleryAlbum inherits its permissions from the Gallery, but +# only the owner of the GalleryAlbum is allowed to add files +$maker->prepare({ + object => $album, + method => "canView", + pass => [ 1, 3, $user{"2"}, ], +}, { + object => $album, + method => "canEdit", + pass => [ 3, ], + fail => [ 1, $user{"2"}, ], +}, { + object => $album, + method => "canAddFile", + pass => [ 3, ], + fail => [ 1, $user{"2"}, ], +}, { + object => $album, + method => "canAddComment", + pass => [ 3, $user{"2"}, ], + fail => [ 1, ], +}); +$maker->run; + +#---------------------------------------------------------------------------- +# GalleryAlbums with "allowComments" false do not allow anyone to comment +$album->update({ allowComments => 0 }); +$maker->prepare({ + object => $album, + method => "canComment", + fail => [ 1, 3, $user{"2"}, ], +}); +$maker->run; + +#---------------------------------------------------------------------------- +# GalleryAlbum with "othersCanAdd" true allows anyone who can add files to +# the Gallery to add files to this GalleryAlbum +$album->update({ othersCanAdd => 1 }); +$maker->prepare({ + object => $album, + method => "canAddFile", + pass => [ 3, $user{"2"}, ], + fail => [ 1, ], +}); +$maker->run; + diff --git a/t/Asset/Wobject/Gallery/rss.t b/t/Asset/Wobject/Gallery/rss.t new file mode 100644 index 000000000..1f96b786c --- /dev/null +++ b/t/Asset/Wobject/Gallery/rss.t @@ -0,0 +1,66 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the rss view of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test www_viewRss + diff --git a/t/Asset/Wobject/Gallery/search.t b/t/Asset/Wobject/Gallery/search.t new file mode 100644 index 000000000..0119dc465 --- /dev/null +++ b/t/Asset/Wobject/Gallery/search.t @@ -0,0 +1,78 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the creation and deletion of album assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 5; + +#---------------------------------------------------------------------------- +# Test module compiles okay +# plan tests => 1 +use_ok("WebGUI::Asset::Wobject::GalleryAlbum"); + +#---------------------------------------------------------------------------- +# Test creating an album +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + }); + +is( + blessed $album, "WebGUI::Asset::Wobject::GalleryAlbum", + "Album is a WebGUI::Asset::Wobject::GalleryAlbum object", +); + +isa_ok( + $album, "WebGUI::Asset::Wobject", +); + +#---------------------------------------------------------------------------- +# Test deleting a album +my $properties = $album->get; +$album->purge; + +is( + $album, undef, + "Album is undefined", +); + +is( + WebGUI::Asset->newByDynamicClass($session, $properties->{assetId}), undef, + "Album no longer able to be instanciated", +); + diff --git a/t/Asset/Wobject/Gallery/view.t b/t/Asset/Wobject/Gallery/view.t new file mode 100644 index 000000000..dedd4f74a --- /dev/null +++ b/t/Asset/Wobject/Gallery/view.t @@ -0,0 +1,130 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../lib"; + +## The goal of this test is to test the default view and associated subs + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use Test::Deep; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 2, # Registered Users + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test getFileIds and getFilePaginator +cmp_bag( $album->getFileIds, [ map { $_->getId } @photos ] ); + +my $p = $album->getFilePaginator; +isa_ok( $p, "WebGUI::Paginator" ); +cmp_deeply( $p->getPageData, subbagof( map { $_->getId } @photos ) ); + +#---------------------------------------------------------------------------- +# Test getTemplateVars + +# Is a superset of Asset->get +# NOTE: url is Asset->getUrl +cmp_deeply( $album->getTemplateVars, superhashof( { %{$album->get}, url => $album->getUrl, } ) ); + +# Contains specific keys/values +my $expected = { + "url_addPhoto" + => all( + re( qr/className=WebGUI::Asset::File::Image::Photo/ ), + re( qr/func=add/ ), + re( $album->getUrl ), + ), + "url_addNoClass" + => all( + re( $album->getUrl ), + re( qr/func=add$/ ), + ), + "url_slideshow" + => all( + re( $album->getUrl ), + re( qr/func=slideshow/ ), + ), + "url_thumbnails" + => all( + re( $album->getUrl ), + re( qr/func=thumbnails/ ), + ), + "url_viewRss" + => all( + re( $album->getUrl ), + re( qr/func=viewRss/ ), + ), +}; + +cmp_deeply( $album->getTemplateVars, superhashof( $expected ) ); + +#---------------------------------------------------------------------------- +# Test appendTemplateVarsFileLoop +$expected = { + "file_loop" => bag( map { $_->getTemplateVars } @photos ), +}; +cmp_deeply( + $album->appendTemplateVarsFileLoop({},$self->getFilePaginator->getPageData), + $expected +); + +#---------------------------------------------------------------------------- +# Test www_view() for those without permission to view +$maker->prepare({ + object => $album, + method => "www_view", + test_privilege => "insufficient", +}); +$maker->run; + diff --git a/t/Asset/Wobject/GalleryAlbum/addArchive.t b/t/Asset/Wobject/GalleryAlbum/addArchive.t new file mode 100644 index 000000000..29d9844b3 --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/addArchive.t @@ -0,0 +1,69 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the permissions of GalleryAlbum assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::Permission; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::Permission->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 2; + +#---------------------------------------------------------------------------- +# Test the addArchive sub +# elephant_images.zip contains three jpgs: Aana1.jpg, Aana2.jpg, Aana3.jpg +$album->addArchive( WebGUI::Test->getTestCollateralPath('elephant_images.zip') ); +my $images = $album->getLineage(['descendants'], { returnObjects => 1 }); + +is( scalar @$images, 3, "addArchive() adds one asset per image" ); +cmp_deeply( + [ map { $_->get("filename") } @$images ], + bag( "Aana1.jpg", "Aana2.jpg", "Aana3.jpg" ), +); + +#---------------------------------------------------------------------------- +# Test the www_addArchive page diff --git a/t/Asset/Wobject/GalleryAlbum/delete.t b/t/Asset/Wobject/GalleryAlbum/delete.t new file mode 100644 index 000000000..f49603f93 --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/delete.t @@ -0,0 +1,96 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the deleting of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::Html->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Delete page gives error for those who can't edit the GalleryAlbum +$maker->prepare({ + object => $album, + method => "www_delete", + test_privilege => "insufficient", + userId => 1, +}, { + object => $album, + method => "www_deleteConfirm", + test_privilege => "insufficient", + userId => 1, +}); +$maker->run; + +#---------------------------------------------------------------------------- +# Delete confirm page appears for those allowed to edit the GalleryAlbum +$maker->prepare({ + object => $album, + method => "www_delete", + test_regex => [ qr/func=deleteConfirm/, ], + userId => 3, +}); +$maker->run; + +#---------------------------------------------------------------------------- +# www_deleteConfirm deletes the asset +my $assetId = $album->getId; +$maker->prepare({ + object => $album, + method => "www_deleteConfirm", + test_regex => [ qr/has been deleted/, ], + userId => 3, +}); +$maker->run; + +is( + WebGUI::Asset->newByDynamicClass( $session, $assetId ), + undef, + "GalleryAlbum cannot be instanciated after www_deleteConfirm", +); + diff --git a/t/Asset/Wobject/GalleryAlbum/permission.t b/t/Asset/Wobject/GalleryAlbum/permission.t new file mode 100644 index 000000000..2d91342ed --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/permission.t @@ -0,0 +1,107 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the permissions of GalleryAlbum assets + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::Permission; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::Permission->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); + +my %user; +$user{"2"} = WebGUI::User->new( $session, "new" ); +$user{"2"}->addToGroups( ['2'] ); # Registered user + +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); + $user{"2"}->delete; +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# By default, GalleryAlbum inherits its permissions from the Gallery, but +# only the owner of the GalleryAlbum is allowed to add files +$maker->prepare({ + object => $album, + method => "canView", + pass => [ 1, 3, $user{"2"}, ], +}, { + object => $album, + method => "canEdit", + pass => [ 3, ], + fail => [ 1, $user{"2"}, ], +}, { + object => $album, + method => "canAddFile", + pass => [ 3, ], + fail => [ 1, $user{"2"}, ], +}, { + object => $album, + method => "canAddComment", + pass => [ 3, $user{"2"}, ], + fail => [ 1, ], +}); +$maker->run; + +#---------------------------------------------------------------------------- +# GalleryAlbums with "allowComments" false do not allow anyone to comment +$album->update({ allowComments => 0 }); +$maker->prepare({ + object => $album, + method => "canComment", + fail => [ 1, 3, $user{"2"}, ], +}); +$maker->run; + +#---------------------------------------------------------------------------- +# GalleryAlbum with "othersCanAdd" true allows anyone who can add files to +# the Gallery to add files to this GalleryAlbum +$album->update({ othersCanAdd => 1 }); +$maker->prepare({ + object => $album, + method => "canAddFile", + pass => [ 3, $user{"2"}, ], + fail => [ 1, ], +}); +$maker->run; + diff --git a/t/Asset/Wobject/GalleryAlbum/rss.t b/t/Asset/Wobject/GalleryAlbum/rss.t new file mode 100644 index 000000000..1f96b786c --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/rss.t @@ -0,0 +1,66 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the rss view of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test www_viewRss + diff --git a/t/Asset/Wobject/GalleryAlbum/slideshow.t b/t/Asset/Wobject/GalleryAlbum/slideshow.t new file mode 100644 index 000000000..36513b46e --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/slideshow.t @@ -0,0 +1,69 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the slideshow view of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test view_slideshow + +#---------------------------------------------------------------------------- +# Test www_slideshow + diff --git a/t/Asset/Wobject/GalleryAlbum/thumbnails.t b/t/Asset/Wobject/GalleryAlbum/thumbnails.t new file mode 100644 index 000000000..578dcd34c --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/thumbnails.t @@ -0,0 +1,69 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../../lib"; + +## The goal of this test is to test the thumbnails view of GalleryAlbums + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 7, # Everyone + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test view_thumbnails + +#---------------------------------------------------------------------------- +# Test www_thumbnails + diff --git a/t/Asset/Wobject/GalleryAlbum/view.t b/t/Asset/Wobject/GalleryAlbum/view.t new file mode 100644 index 000000000..b12a5f56e --- /dev/null +++ b/t/Asset/Wobject/GalleryAlbum/view.t @@ -0,0 +1,132 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../../../lib"; + +## The goal of this test is to test the default view and associated subs + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use Test::Deep; +use WebGUI::Test::Maker::HTML; + +#---------------------------------------------------------------------------- +# Init +my $maker = WebGUI::Test::Maker::HTML->new; +my $session = WebGUI::Test->session; +my $node = WebGUI::Asset->getImportNode($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Album Test"}); +my $gallery + = $node->addChild({ + className => "WebGUI::Asset::Wobject::Gallery", + groupIdAddComment => 2, # Registered Users + groupIdAddFile => 2, # Registered Users + groupIdView => 2, # Registered Users + groupIdEdit => 3, # Admins + ownerUserId => 3, # Admin + }); +my $album + = $gallery->addChild({ + className => "WebGUI::Asset::Wobject::GalleryAlbum", + ownerUserId => "3", # Admin + }); +my @photos; +for my $i ( 0 .. 5 ) { + $photos[ $i ] + = $album->addChild({ + className => "WebGUI::Asset::File::Image::Photo", + filename => "$i.jpg", + }); +} + +#---------------------------------------------------------------------------- +# Cleanup +END { + $versionTag->rollback(); +} + +#---------------------------------------------------------------------------- +# Tests +plan no_plan => 1; + +#---------------------------------------------------------------------------- +# Test getFileIds and getFilePaginator +cmp_bag( $album->getFileIds, [ map { $_->getId } @photos ] ); + +my $p = $album->getFilePaginator; +isa_ok( $p, "WebGUI::Paginator" ); +cmp_deeply( $p->getPageData, subbagof( map { $_->getId } @photos ) ); + +#---------------------------------------------------------------------------- +# Test getTemplateVars + +# Is a superset of Asset->get +# NOTE: url is Asset->getUrl +cmp_deeply( $album->getTemplateVars, superhashof( { %{$album->get}, url => $album->getUrl, } ) ); + +# Contains specific keys/values +my $expected = { + "url_addPhoto" + => all( + re( qr/className=WebGUI::Asset::File::Image::Photo/ ), + re( qr/func=add/ ), + re( $album->getUrl ), + ), + "url_addNoClass" + => all( + re( $album->getUrl ), + re( qr/func=add$/ ), + ), + "url_slideshow" + => all( + re( $album->getUrl ), + re( qr/func=slideshow/ ), + ), + "url_thumbnails" + => all( + re( $album->getUrl ), + re( qr/func=thumbnails/ ), + ), + "url_viewRss" + => all( + re( $album->getUrl ), + re( qr/func=viewRss/ ), + ), + "ownerUsername" + => WebGUI::User->new($session, 3)->username, +}; + +cmp_deeply( $album->getTemplateVars, superhashof( $expected ) ); + +#---------------------------------------------------------------------------- +# Test appendTemplateVarsFileLoop +$expected = { + "file_loop" => bag( map { $_->getTemplateVars } @photos ), +}; +cmp_deeply( + $album->appendTemplateVarsFileLoop({},$self->getFilePaginator->getPageData), + $expected +); + +#---------------------------------------------------------------------------- +# Test www_view() for those without permission to view +$maker->prepare({ + object => $album, + method => "www_view", + test_privilege => "insufficient", +}); +$maker->run; + diff --git a/t/Form.t b/t/Form.t new file mode 100644 index 000000000..01838ddd1 --- /dev/null +++ b/t/Form.t @@ -0,0 +1,104 @@ +# vim:syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------ +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------ + +# +# +# + +use FindBin; +use strict; +use lib "$FindBin::Bin/lib"; +use Test::More; +use Test::Deep; +use WebGUI::Test; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; + +#---------------------------------------------------------------------------- +# Cleanup +END { + +} + +#---------------------------------------------------------------------------- +# Tests + +plan tests => 5; # Increment this number for each test you create + +#---------------------------------------------------------------------------- +# Test the formHeader method + +ok( + !eval{ WebGUI::Form::formHeader( "" ); 1 }, + "formHeader() dies if first parameter is not WebGUI Session", +); + +ok( + !eval{ WebGUI::Form::formHeader( $session, ['foo'] ); 1 }, + "formHeader() dies if second parameter is not hash reference", +); + +# Test the defaults for formHeader() +my $testDefaults = all( + re( q{]*>} ), + re( q{action=} ), + re( q{enctype="multipart/form-data"} ), + re( q{method="post"} ), +); + +cmp_deeply( + WebGUI::Form::formHeader( $session ), + $testDefaults, + "formHeader called without an options hashref", +); + +# Test options passed into formHeader() +my $testWithOptions = all( + re( q{]*>} ), + re( q{action="action"} ), + re( q{enctype="enctype"} ), + re( q{method="method"} ), +); + +cmp_deeply( + WebGUI::Form::formHeader( $session, { + action => "action", + enctype => "enctype", + method => "method", + } ), + $testWithOptions, + "formHeader called with an options hashref", +); + +# Test "action" option containing query parameters +my $testHiddenElements = all( + re( q{ "action?func=edit;a=1&b=2", + }), + $testHiddenElements, + "formHeader 'action' option containing query parameters", +); + +#---------------------------------------------------------------------------- + +TODO: { + local $TODO = "Some things on the TODO list"; + # Test the formFooter method + # Test that the autohandler works properly +} diff --git a/t/Form/SelectRichEditor.t b/t/Form/SelectRichEditor.t new file mode 100644 index 000000000..60c04e88a --- /dev/null +++ b/t/Form/SelectRichEditor.t @@ -0,0 +1,59 @@ +# $vim: syntax=perl +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../lib"; + +## The goal of this test is to test the SelectRichEditor form control + +use Scalar::Util qw( blessed ); +use WebGUI::Test; +use WebGUI::Session; +use Test::More; +use Test::Deep; + +use WebGUI::Form::SelectRichEditor; + +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; +my $root = WebGUI::Asset->getRoot( $session ); + +#---------------------------------------------------------------------------- +# Cleanup +END { + +} + +#---------------------------------------------------------------------------- +# Tests +plan tests => 1; + +#---------------------------------------------------------------------------- +# Test that SelectRichEditor control contains all RichEdit assets. +my $richEditAssets + = $root->getLineage( ['descendants'], { + returnObjects => 1, + includeOnlyClasses => ['WebGUI::Asset::RichEdit'], + }); +my $richEditOptions + = { + map { $_->getId => $_->get("title") } @$richEditAssets + }; + +my $control + = WebGUI::Form::SelectRichEditor->new( $session, { name => "richEditId" } ); +cmp_deeply( + $control->get("options"), + $richEditOptions, + "SelectRichEditor control has options for all Rich Editors in this site", +); diff --git a/t/Storage.t b/t/Storage.t index 42e47b354..34fa1917c 100644 --- a/t/Storage.t +++ b/t/Storage.t @@ -227,6 +227,16 @@ ok (-e $storage1->getPath("testfile-hash.file"), 'addFileFromHashRef creates fil my $thawedHash = $storage1->getFileContentsAsHashref('testfile-hash.file'); cmp_deeply($storageHash, $thawedHash, 'getFileContentsAsHashref: thawed hash correctly'); +#################################################### +# +# copyFile +# +#################################################### + +$storage1->copyFile("testfile-hash.file", "testfile-hash-copied.file"); +ok (-e $storage1->getPath("testfile-hash-copied.file"),'copyFile created file with new name'); +ok (-e $storage1->getPath("testfile-hash.file"), "copyFile original file still exists"); + #################################################### # # renameFile diff --git a/t/_test.skeleton b/t/_test.skeleton index 55ab13a23..bf4795eab 100644 --- a/t/_test.skeleton +++ b/t/_test.skeleton @@ -1,24 +1,40 @@ +# vim:syntax=perl #------------------------------------------------------------------- -# WebGUI is Copyright 2001-2006 Plain Black Corporation. +# WebGUI is Copyright 2001-2007 Plain Black Corporation. #------------------------------------------------------------------- # Please read the legal notices (docs/legal.txt) and the license # (docs/license.txt) that came with this distribution before using # this software. -#------------------------------------------------------------------- +#------------------------------------------------------------------ # http://www.plainblack.com info@plainblack.com -#------------------------------------------------------------------- +#------------------------------------------------------------------ + +# Write a little about what this script tests. +# +# use FindBin; use strict; use lib "$FindBin::Bin/lib"; -use WebGUI::Test; +use Test::More; use WebGUI::Session; +use WebGUI::Test; -# load your modules here +#---------------------------------------------------------------------------- +# Init +my $session = WebGUI::Test->session; -use Test::More tests => 1; # increment this value for each test you create +#---------------------------------------------------------------------------- +# Cleanup +END { -my $session = WebGUI::Test->session; +} +#---------------------------------------------------------------------------- +# Tests + +plan tests => 1; # Increment this number for each test you create + +#---------------------------------------------------------------------------- # put your tests here diff --git a/t/lib/WebGUI/Test/Maker/HTML.pm b/t/lib/WebGUI/Test/Maker/HTML.pm index 123aa8871..404be27d0 100644 --- a/t/lib/WebGUI/Test/Maker/HTML.pm +++ b/t/lib/WebGUI/Test/Maker/HTML.pm @@ -73,6 +73,8 @@ Create a new WebGUI::Test::Maker::HTML object. Get a setting. Set L for a list of settings. +=cut + #---------------------------------------------------------------------------- =head2 plan diff --git a/t/lib/WebGUI/Test/Maker/Permission.pm b/t/lib/WebGUI/Test/Maker/Permission.pm index 926b82d24..f57a23423 100644 --- a/t/lib/WebGUI/Test/Maker/Permission.pm +++ b/t/lib/WebGUI/Test/Maker/Permission.pm @@ -55,9 +55,13 @@ Test::More Create a new WebGUI::Test::Maker::Permission object. +=cut + =head2 get -Get a setting. Set L for a list of settings. +Get a setting. See C for a list of settings. + +=cut #---------------------------------------------------------------------------- @@ -116,11 +120,13 @@ The permissions method to test =item pass -An array reference of userIds that should pass the permissions test. +An array reference of userIds or WebGUI::User objects that should pass the +permissions test. =item fail -An array reference of userIds that should fail the permissions test. +An array reference of userIds or WebGUI::User objects that should fail the +permissions test. =back @@ -146,6 +152,16 @@ sub prepare { croak("Couldn't prepare: Test $test_num, fail is not an array reference") if $test->{fail} && ref $test->{fail} ne "ARRAY"; + # Make sure pass and fail arrayrefs are userIds + for my $array ( $test->{pass, fail} ) { + for ( my $i = 0; $i < @$array; $i++ ) { + # If is a User object, replace with userId + if ( blessed $array->[$i] && $array->[$i]->isa("WebGUI::User") ) { + $array->[$i] = $array->[$i]->userId; + } + } + } + push @{$self->{_tests}}, $test; } diff --git a/t/supporting_collateral/elephant_images.zip b/t/supporting_collateral/elephant_images.zip new file mode 100644 index 0000000000000000000000000000000000000000..a04bc6e69d2256a7419d40f26c08ea7544a2c97c GIT binary patch literal 50141 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 literal 0 HcmV?d00001