From 1d8466a9e318e42da2a0515cdc9f60ad33e2dfd4 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 10 Apr 2025 17:44:55 +0200 Subject: [PATCH] Feature: Decrypt encrypted file name (#3788) Closes #2713 --- .../org/cryptomator/common/vaults/Vault.java | 11 + .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../ui/decryptname/CipherAndCleartext.java | 25 ++ .../DecryptFileNamesViewController.java | 233 ++++++++++++++++++ .../ui/decryptname/DecryptNameComponent.java | 50 ++++ .../ui/decryptname/DecryptNameModule.java | 59 +++++ .../ui/decryptname/DecryptNameScoped.java | 11 + .../ui/decryptname/DecryptNameWindow.java | 12 + .../ui/fxapp/FxApplicationModule.java | 2 + .../VaultDetailUnlockedController.java | 152 +++++++----- src/main/resources/css/dark_theme.css | 175 ++++++++++++- src/main/resources/css/firacode_regular.ttf | Bin 0 -> 188504 bytes src/main/resources/css/light_theme.css | 176 ++++++++++++- src/main/resources/fxml/decryptnames.fxml | 70 ++++++ .../resources/fxml/vault_detail_unlocked.fxml | 28 ++- src/main/resources/i18n/strings.properties | 18 +- 16 files changed, 955 insertions(+), 68 deletions(-) create mode 100644 src/main/java/org/cryptomator/ui/decryptname/CipherAndCleartext.java create mode 100644 src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java create mode 100644 src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java create mode 100644 src/main/java/org/cryptomator/ui/decryptname/DecryptNameModule.java create mode 100644 src/main/java/org/cryptomator/ui/decryptname/DecryptNameScoped.java create mode 100644 src/main/java/org/cryptomator/ui/decryptname/DecryptNameWindow.java create mode 100644 src/main/resources/css/firacode_regular.ttf create mode 100644 src/main/resources/fxml/decryptnames.fxml diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index a1ad1aa42..8c0b68e80 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -423,6 +423,17 @@ public class Vault { } } + /** + * Gets the cleartext name from a given path to an encrypted vault file + */ + public String getCleartextName(Path ciphertextPath) throws IOException { + if (!state.getValue().equals(VaultState.Value.UNLOCKED)) { + throw new IllegalStateException("Vault is not unlocked"); + } + var fs = cryptoFileSystem.get(); + return fs.getCleartextName(ciphertextPath); + } + public VaultConfigCache getVaultConfigCache() { return configCache; } diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index c9e3b833e..ce8c65a37 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -12,6 +12,7 @@ public enum FxmlFile { CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), // CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), // CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), // + DECRYPTNAMES("/fxml/decryptnames.fxml"), // ERROR("/fxml/error.fxml"), // EVENT_VIEW("/fxml/eventview.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/decryptname/CipherAndCleartext.java b/src/main/java/org/cryptomator/ui/decryptname/CipherAndCleartext.java new file mode 100644 index 000000000..909285b73 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/CipherAndCleartext.java @@ -0,0 +1,25 @@ +package org.cryptomator.ui.decryptname; + +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.beans.value.ObservableValue; +import java.nio.file.Path; + +public record CipherAndCleartext(Path ciphertext, String cleartextName) { + + public String getCiphertextFilename() { + return ciphertext.getFileName().toString(); + } + + public ObservableValue ciphertextFilenameProperty() { + return new ReadOnlyStringWrapper(getCiphertextFilename()); + } + + public String getCleartextName() { + return cleartextName; + } + + public ObservableValue cleartextNameProperty() { + return new ReadOnlyStringWrapper(getCleartextName()); + } + +} diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java new file mode 100644 index 000000000..453762f55 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptFileNamesViewController.java @@ -0,0 +1,233 @@ +package org.cryptomator.ui.decryptname; + +import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.cryptofs.common.Constants; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.controls.FontAwesome5Icon; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import javafx.application.Platform; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.fxml.FXML; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.input.Clipboard; +import javafx.scene.input.DataFormat; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.TransferMode; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@DecryptNameScoped +public class DecryptFileNamesViewController implements FxController { + + private static final Logger LOG = LoggerFactory.getLogger(DecryptFileNamesViewController.class); + private static final KeyCodeCombination COPY_TO_CLIPBOARD_SHORTCUT = new KeyCodeCombination(KeyCode.C, KeyCodeCombination.SHORTCUT_DOWN); + private static final String COPY_TO_CLIPBOARD_SHORTCUT_STRING_WIN = "CTRL+C"; + private static final String COPY_TO_CLIPBOARD_SHORTCUT_STRING_MAC = "⌘C"; + private static final String COPY_TO_CLIPBOARD_SHORTCUT_STRING_LINUX = "CTRL+C"; + + private final ListProperty mapping; + private final StringProperty dropZoneText = new SimpleStringProperty(); + private final ObjectProperty dropZoneIcon = new SimpleObjectProperty<>(); + private final BooleanProperty wrongFilesSelected = new SimpleBooleanProperty(false); + private final Stage window; + private final Vault vault; + private final ResourceBundle resourceBundle; + private final List initialList; + + @FXML + public TableColumn ciphertextColumn; + @FXML + public TableColumn cleartextColumn; + @FXML + public TableView cipherToCleartextTable; + + @Inject + public DecryptFileNamesViewController(@DecryptNameWindow Stage window, @DecryptNameWindow Vault vault, @DecryptNameWindow List pathsToDecrypt, ResourceBundle resourceBundle) { + this.window = window; + this.vault = vault; + this.resourceBundle = resourceBundle; + this.mapping = new SimpleListProperty<>(FXCollections.observableArrayList()); + this.initialList = pathsToDecrypt; + } + + @FXML + public void initialize() { + cipherToCleartextTable.setItems(mapping); + cipherToCleartextTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS); + //DragNDrop + cipherToCleartextTable.setOnDragEntered(event -> { + if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { + cipherToCleartextTable.setItems(FXCollections.emptyObservableList()); + } + }); + cipherToCleartextTable.setOnDragOver(event -> { + if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { + if (SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) { + event.acceptTransferModes(TransferMode.LINK); + } else { + event.acceptTransferModes(TransferMode.ANY); + } + } + }); + cipherToCleartextTable.setOnDragDropped(event -> { + if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { + checkAndDecrypt(event.getDragboard().getFiles().stream().map(File::toPath).toList()); + cipherToCleartextTable.setItems(mapping); + } + }); + cipherToCleartextTable.setOnDragExited(_ -> cipherToCleartextTable.setItems(mapping)); + //selectionModel and copy-to-clipboard action + cipherToCleartextTable.getSelectionModel().setCellSelectionEnabled(true); + cipherToCleartextTable.setOnKeyPressed(keyEvent -> { + if (COPY_TO_CLIPBOARD_SHORTCUT.match(keyEvent)) { + copySingleCelltoClipboard(); + } + }); + ciphertextColumn.setCellValueFactory(new PropertyValueFactory<>("ciphertextFilename")); + cleartextColumn.setCellValueFactory(new PropertyValueFactory<>("cleartextName")); + + dropZoneText.setValue(resourceBundle.getString("decryptNames.dropZone.message")); + dropZoneIcon.setValue(FontAwesome5Icon.FILE_IMPORT); + + wrongFilesSelected.addListener((_, _, areWrongFiles) -> { + if (areWrongFiles) { + CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS, Platform::runLater).execute(() -> { + dropZoneText.setValue(resourceBundle.getString("decryptNames.dropZone.message")); + dropZoneIcon.setValue(FontAwesome5Icon.FILE_IMPORT); + wrongFilesSelected.setValue(false); + }); + } + }); + if (!initialList.isEmpty()) { + checkAndDecrypt(initialList); + } + } + + private void copySingleCelltoClipboard() { + cipherToCleartextTable.getSelectionModel().getSelectedCells().stream().findFirst().ifPresent(tablePosition -> { + var selectedItem = cipherToCleartextTable.getSelectionModel().getSelectedItem(); + //TODO: give user feedback, if content is copied -> must be done via a custom cell factory to access the actual table cell! + if (tablePosition.getTableColumn().equals(ciphertextColumn)) { + Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, selectedItem.ciphertext().toString())); + } else { + Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, selectedItem.cleartextName())); + } + }); + } + + @FXML + public void selectFiles() { + var fileChooser = new FileChooser(); + fileChooser.setTitle(resourceBundle.getString("decryptNames.filePicker.title")); + fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter(resourceBundle.getString("decryptNames.filePicker.extensionDescription"), List.of("*.c9r"))); + fileChooser.setInitialDirectory(vault.getPath().toFile()); + var ciphertextNodes = fileChooser.showOpenMultipleDialog(window); + if (ciphertextNodes != null) { + checkAndDecrypt(ciphertextNodes.stream().map(File::toPath).toList()); + } + } + + private void checkAndDecrypt(List pathsToDecrypt) { + mapping.clear(); + //Assumption: All files are in the same directory + var testPath = pathsToDecrypt.getFirst(); + if (!testPath.startsWith(vault.getPath())) { + setDropZoneError(resourceBundle.getString("decryptNames.dropZone.error.foreignFiles").formatted(vault.getDisplayName())); + return; + } + if (pathsToDecrypt.size() == 1 && testPath.endsWith(Constants.DIR_ID_BACKUP_FILE_NAME)) { + setDropZoneError(resourceBundle.getString("decryptNames.dropZone.error.vaultInternalFiles")); + return; + } + + try { + var newMapping = pathsToDecrypt.stream().filter(p -> !p.endsWith(Constants.DIR_ID_BACKUP_FILE_NAME)).map(this::getCleartextName).toList(); + mapping.addAll(newMapping); + } catch (UncheckedIOException e) { + setDropZoneError(resourceBundle.getString("decryptNames.dropZone.error.generic")); + LOG.info("Failed to decrypt filenames for directory {}", testPath.getParent(), e); + } catch (IllegalArgumentException e) { + setDropZoneError(resourceBundle.getString("decryptNames.dropZone.error.vaultInternalFiles")); + } catch (UnsupportedOperationException e) { + setDropZoneError(resourceBundle.getString("decryptNames.dropZone.error.noDirIdBackup")); + } + } + + private void setDropZoneError(String text) { + dropZoneIcon.setValue(FontAwesome5Icon.TIMES); + dropZoneText.setValue(text); + wrongFilesSelected.setValue(true); + } + + private CipherAndCleartext getCleartextName(Path ciphertextNode) { + try { + var cleartextName = vault.getCleartextName(ciphertextNode); + return new CipherAndCleartext(ciphertextNode, cleartextName); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + //obvservable getter + + public ObservableValue dropZoneTextProperty() { + return dropZoneText; + } + + public String getDropZoneText() { + return dropZoneText.get(); + } + + public ObservableValue dropZoneIconProperty() { + return dropZoneIcon; + } + + public FontAwesome5Icon getDropZoneIcon() { + return dropZoneIcon.get(); + } + + public void clearTable() { + mapping.clear(); + } + + public void copyTableToClipboard() { + var csv = mapping.stream().map(cipherAndClear -> "\"" + cipherAndClear.ciphertext() + "\", \"" + cipherAndClear.cleartextName() + "\"").collect(Collectors.joining("\n")); + Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, csv)); + } + + public String getCopyToClipboardShortcutString() { + if (SystemUtils.IS_OS_WINDOWS) { + return COPY_TO_CLIPBOARD_SHORTCUT_STRING_WIN; + } else if (SystemUtils.IS_OS_MAC) { + return COPY_TO_CLIPBOARD_SHORTCUT_STRING_MAC; + } else { + return COPY_TO_CLIPBOARD_SHORTCUT_STRING_LINUX; + } + } +} diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java new file mode 100644 index 000000000..7684d4286 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java @@ -0,0 +1,50 @@ +package org.cryptomator.ui.decryptname; + +import dagger.BindsInstance; +import dagger.Lazy; +import dagger.Subcomponent; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.common.vaults.VaultState; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Named; +import javafx.scene.Scene; +import javafx.stage.Stage; +import java.nio.file.Path; +import java.util.List; + +@DecryptNameScoped +@Subcomponent(modules = DecryptNameModule.class) +public interface DecryptNameComponent { + + Logger LOG = LoggerFactory.getLogger(DecryptNameComponent.class); + + @DecryptNameWindow + Stage window(); + + @FxmlScene(FxmlFile.DECRYPTNAMES) + Lazy decryptNamesView(); + + @DecryptNameWindow + Vault vault(); + + default void showDecryptFileNameWindow() { + Stage s = window(); + s.setScene(decryptNamesView().get()); + s.sizeToScene(); + if (vault().isUnlocked()) { + s.show(); + } else { + LOG.error("Aborted showing DecryptFileName window: vault state is not {}, but {}.", VaultState.Value.UNLOCKED, vault().getState()); + } + } + + @Subcomponent.Factory + interface Factory { + + DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner, @BindsInstance @DecryptNameWindow List pathsToDecrypt); + } +} diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameModule.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameModule.java new file mode 100644 index 000000000..0dd573940 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameModule.java @@ -0,0 +1,59 @@ +package org.cryptomator.ui.decryptname; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.DefaultSceneFactory; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlLoaderFactory; +import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.common.StageFactory; + +import javax.inject.Named; +import javax.inject.Provider; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; +import java.util.Map; +import java.util.ResourceBundle; + +@Module +public abstract class DecryptNameModule { + + @Provides + @DecryptNameScoped + @DecryptNameWindow + static Stage provideStage(StageFactory factory, @Named("windowOwner") Stage owner, @DecryptNameWindow Vault vault, ResourceBundle resourceBundle) { + Stage stage = factory.create(); + stage.setResizable(true); + stage.initModality(Modality.WINDOW_MODAL); + stage.initOwner(owner); + stage.setTitle(resourceBundle.getString("decryptNames.title")); + vault.stateProperty().addListener(((_, _, _) -> stage.close())); //as soon as the state changes from unlocked, close the window + return stage; + } + + @Provides + @DecryptNameScoped + @DecryptNameWindow + static FxmlLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { + return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); + } + + @Provides + @FxmlScene(FxmlFile.DECRYPTNAMES) + @DecryptNameScoped + static Scene provideDecryptNamesViewScene(@DecryptNameWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.DECRYPTNAMES); + } + + @Binds + @IntoMap + @FxControllerKey(DecryptFileNamesViewController.class) + abstract FxController bindDecryptNamesViewController(DecryptFileNamesViewController controller); + +} diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameScoped.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameScoped.java new file mode 100644 index 000000000..2a7ac0fc8 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameScoped.java @@ -0,0 +1,11 @@ +package org.cryptomator.ui.decryptname; + +import javax.inject.Scope; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Scope +@Documented +@Retention(RetentionPolicy.RUNTIME) +@interface DecryptNameScoped {} diff --git a/src/main/java/org/cryptomator/ui/decryptname/DecryptNameWindow.java b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameWindow.java new file mode 100644 index 000000000..7d68c9559 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/decryptname/DecryptNameWindow.java @@ -0,0 +1,12 @@ +package org.cryptomator.ui.decryptname; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Documented +@Retention(RUNTIME) +@interface DecryptNameWindow {} diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index 9110f8d50..8eb221883 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -7,6 +7,7 @@ package org.cryptomator.ui.fxapp; import dagger.Module; import dagger.Provides; +import org.cryptomator.ui.decryptname.DecryptNameComponent; import org.cryptomator.ui.error.ErrorComponent; import org.cryptomator.ui.eventview.EventViewComponent; import org.cryptomator.ui.health.HealthCheckComponent; @@ -28,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; @Module(includes = {UpdateCheckerModule.class}, subcomponents = {TrayMenuComponent.class, // + DecryptNameComponent.class, // MainWindowComponent.class, // PreferencesComponent.class, // VaultOptionsComponent.class, // diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java index ef6148c87..42a8fda7e 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java @@ -6,12 +6,14 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.tobiasdiez.easybind.EasyBind; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.common.Nullable; import org.cryptomator.common.vaults.Vault; import org.cryptomator.integrations.mount.Mountpoint; import org.cryptomator.integrations.revealpath.RevealFailedException; import org.cryptomator.integrations.revealpath.RevealPathService; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.VaultService; +import org.cryptomator.ui.decryptname.DecryptNameComponent; import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.stats.VaultStatisticsComponent; import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; @@ -39,10 +41,13 @@ import java.io.IOException; import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.ResourceBundle; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.function.Function; @MainWindowScoped public class VaultDetailUnlockedController implements FxController { @@ -56,26 +61,39 @@ public class VaultDetailUnlockedController implements FxController { private final WrongFileAlertComponent.Builder wrongFileAlert; private final Stage mainWindow; private final Optional revealPathService; + private final DecryptNameComponent.Factory decryptNameWindowFactory; private final ResourceBundle resourceBundle; private final LoadingCache vaultStats; private final VaultStatisticsComponent.Builder vaultStatsBuilder; private final ObservableValue accessibleViaPath; private final ObservableValue accessibleViaUri; private final ObservableValue mountPoint; - private final BooleanProperty draggingOver = new SimpleBooleanProperty(); + private final BooleanProperty draggingOverLocateEncrypted = new SimpleBooleanProperty(); + private final BooleanProperty draggingOverDecryptName = new SimpleBooleanProperty(); private final BooleanProperty ciphertextPathsCopied = new SimpleBooleanProperty(); - //FXML - public Button dropZone; + @FXML + public Button revealEncryptedDropZone; + @FXML + public Button decryptNameDropZone; @Inject - public VaultDetailUnlockedController(ObjectProperty vault, FxApplicationWindows appWindows, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder, WrongFileAlertComponent.Builder wrongFileAlert, @MainWindow Stage mainWindow, Optional revealPathService, ResourceBundle resourceBundle) { + public VaultDetailUnlockedController(ObjectProperty vault, // + FxApplicationWindows appWindows, // + VaultService vaultService, // + VaultStatisticsComponent.Builder vaultStatsBuilder, // + WrongFileAlertComponent.Builder wrongFileAlert, // + @MainWindow Stage mainWindow, // + Optional revealPathService, // + DecryptNameComponent.Factory decryptNameWindowFactory, // + ResourceBundle resourceBundle) { this.vault = vault; this.appWindows = appWindows; this.vaultService = vaultService; this.wrongFileAlert = wrongFileAlert; this.mainWindow = mainWindow; this.revealPathService = revealPathService; + this.decryptNameWindowFactory = decryptNameWindowFactory; this.resourceBundle = resourceBundle; this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats)); this.vaultStatsBuilder = vaultStatsBuilder; @@ -92,89 +110,81 @@ public class VaultDetailUnlockedController implements FxController { } public void initialize() { - dropZone.setOnDragEntered(this::handleDragEvent); - dropZone.setOnDragOver(this::handleDragEvent); - dropZone.setOnDragDropped(this::handleDragEvent); - dropZone.setOnDragExited(this::handleDragEvent); + revealEncryptedDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverLocateEncrypted)); + revealEncryptedDropZone.setOnDragDropped(e -> handleDragDropped(e, this::getCiphertextPath, this::revealOrCopyPaths)); + revealEncryptedDropZone.setOnDragExited(_ -> draggingOverLocateEncrypted.setValue(false)); - EasyBind.includeWhen(dropZone.getStyleClass(), ACTIVE_CLASS, draggingOver); + decryptNameDropZone.setOnDragOver(e -> handleDragOver(e, draggingOverDecryptName)); + decryptNameDropZone.setOnDragDropped(e -> showDecryptNameWindow(e.getDragboard().getFiles().stream().map(File::toPath).toList())); + decryptNameDropZone.setOnDragExited(_ -> draggingOverDecryptName.setValue(false)); + + EasyBind.includeWhen(revealEncryptedDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverLocateEncrypted); + EasyBind.includeWhen(decryptNameDropZone.getStyleClass(), ACTIVE_CLASS, draggingOverDecryptName); } - private void handleDragEvent(DragEvent event) { - if (DragEvent.DRAG_OVER.equals(event.getEventType()) && event.getGestureSource() == null && event.getDragboard().hasFiles()) { - if(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) { + private void handleDragOver(DragEvent event, BooleanProperty prop) { + if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { + if (SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC) { event.acceptTransferModes(TransferMode.LINK); } else { event.acceptTransferModes(TransferMode.ANY); } - draggingOver.set(true); - } else if (DragEvent.DRAG_DROPPED.equals(event.getEventType()) && event.getGestureSource() == null && event.getDragboard().hasFiles()) { - List ciphertextPaths = event.getDragboard().getFiles().stream().map(File::toPath).map(this::getCiphertextPath).flatMap(Optional::stream).toList(); - if (ciphertextPaths.isEmpty()) { - wrongFileAlert.build().showWrongFileAlertWindow(); - } else { - revealOrCopyPaths(ciphertextPaths); - } - event.setDropCompleted(!ciphertextPaths.isEmpty()); - event.consume(); - } else if (DragEvent.DRAG_EXITED.equals(event.getEventType())) { - draggingOver.set(false); + prop.set(true); } } - private VaultStatisticsComponent buildVaultStats(Vault vault) { - return vaultStatsBuilder.vault(vault).build(); + private void handleDragDropped(DragEvent event, Function computation, Consumer> positiveAction) { + if (event.getGestureSource() == null && event.getDragboard().hasFiles()) { + List objects = event.getDragboard().getFiles().stream().map(File::toPath).map(computation).filter(Objects::nonNull).toList(); + if (objects.isEmpty()) { + wrongFileAlert.build().showWrongFileAlertWindow(); + } else { + positiveAction.accept(objects); + } + event.setDropCompleted(!objects.isEmpty()); + event.consume(); + } } @FXML - public void revealAccessLocation() { - vaultService.reveal(vault.get()); - } - - @FXML - public void copyMountUri() { - ClipboardContent clipboardContent = new ClipboardContent(); - clipboardContent.putString(mountPoint.getValue()); - Clipboard.getSystemClipboard().setContent(clipboardContent); - } - - @FXML - public void lock() { - appWindows.startLockWorkflow(vault.get(), mainWindow); - } - - @FXML - public void showVaultStatistics() { - vaultStats.getUnchecked(vault.get()).showVaultStatisticsWindow(); - } - - @FXML - public void chooseFileAndReveal() { + public void chooseDecryptedFileAndReveal() { Preconditions.checkState(accessibleViaPath.getValue()); var fileChooser = new FileChooser(); - fileChooser.setTitle(resourceBundle.getString("main.vaultDetail.filePickerTitle")); + fileChooser.setTitle(resourceBundle.getString("main.vaultDetail.locateEncrypted.filePickerTitle")); fileChooser.setInitialDirectory(Path.of(mountPoint.getValue()).toFile()); var cleartextFile = fileChooser.showOpenDialog(mainWindow); if (cleartextFile != null) { - var ciphertextPaths = getCiphertextPath(cleartextFile.toPath()).stream().toList(); - revealOrCopyPaths(ciphertextPaths); + var ciphertextPath = getCiphertextPath(cleartextFile.toPath()); + if (ciphertextPath != null) { + revealOrCopyPaths(List.of(ciphertextPath)); + } } } + @FXML + public void showDecryptNameWindow() { + showDecryptNameWindow(List.of()); + } + + private void showDecryptNameWindow(List pathsToDecrypt) { + decryptNameWindowFactory.create(vault.get(), mainWindow, pathsToDecrypt).showDecryptFileNameWindow(); + } + private boolean startsWithVaultAccessPoint(Path path) { return path.startsWith(Path.of(mountPoint.getValue())); } - private Optional getCiphertextPath(Path path) { + @Nullable + private Path getCiphertextPath(Path path) { if (!startsWithVaultAccessPoint(path)) { - LOG.debug("Path does not start with access point of selected vault: {}", path); - return Optional.empty(); + LOG.debug("Path does not start with mount point of selected vault: {}", path); + return null; } try { - return Optional.of(vault.get().getCiphertextPath(path)); + return vault.get().getCiphertextPath(path); } catch (IOException e) { LOG.warn("Unable to get ciphertext path from path: {}", path, e); - return Optional.empty(); + return null; } } @@ -206,6 +216,32 @@ public class VaultDetailUnlockedController implements FxController { }); } + private VaultStatisticsComponent buildVaultStats(Vault vault) { + return vaultStatsBuilder.vault(vault).build(); + } + + @FXML + public void revealAccessLocation() { + vaultService.reveal(vault.get()); + } + + @FXML + public void copyMountUri() { + ClipboardContent clipboardContent = new ClipboardContent(); + clipboardContent.putString(mountPoint.getValue()); + Clipboard.getSystemClipboard().setContent(clipboardContent); + } + + @FXML + public void lock() { + appWindows.startLockWorkflow(vault.get(), mainWindow); + } + + @FXML + public void showVaultStatistics() { + vaultStats.getUnchecked(vault.get()).showVaultStatisticsWindow(); + } + /* Getter/Setter */ public ReadOnlyObjectProperty vaultProperty() { @@ -247,4 +283,6 @@ public class VaultDetailUnlockedController implements FxController { public boolean isCiphertextPathsCopied() { return ciphertextPathsCopied.get(); } + } + diff --git a/src/main/resources/css/dark_theme.css b/src/main/resources/css/dark_theme.css index 4ff354f67..fff15e834 100644 --- a/src/main/resources/css/dark_theme.css +++ b/src/main/resources/css/dark_theme.css @@ -16,6 +16,10 @@ src: url('opensans_bold.ttf'); } +@font-face { + src: url('firacode_regular.ttf'); +} + /******************************************************************************* * * * Root Styling & Colors * @@ -125,6 +129,12 @@ -fx-fill: TEXT_FILL; } +.cryptic-text { + -fx-fill: TEXT_FILL; + -fx-font-family: 'Fira Code'; + -fx-font-size: 1.1em; +} + /******************************************************************************* * * * Glyph Icons * @@ -1012,4 +1022,167 @@ -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; -fx-background-insets: 0, 1px; -fx-background-radius: 4px; -} \ No newline at end of file +} + +/******************************************************************************* + * * + * Decrypt Name Window + * * + ******************************************************************************/ + +.decrypt-name-window .button-bar { + -fx-min-height:42px; + -fx-max-height:42px; + -fx-background-color: MAIN_BG; + -fx-border-color: transparent transparent CONTROL_BORDER_NORMAL transparent; + -fx-border-width: 0 0 1px 0; +} + +.decrypt-name-window .button-bar .button-right { + -fx-border-color: transparent transparent transparent CONTROL_BORDER_NORMAL; + -fx-border-width: 0 0 0 1px; + -fx-background-color: MAIN_BG; + -fx-background-radius: 0px; + -fx-min-height: 42px; + -fx-max-height: 42px; +} + +.decrypt-name-window .button-bar .button-right:armed { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_ARMED; +} + +.decrypt-name-window .table-view { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; + -fx-background-insets: 0,1; + /* There is some oddness if padding is in em values rather than pixels, + in particular, the left border of the control doesn't show. */ + -fx-padding: 1; /* 0.083333em; */ +} + +.table-view > .placeholder { + -fx-background-color: transparent; + -fx-background-radius: 0px; +} + +.table-view > .placeholder > .button { + -fx-border-width: 0; + -fx-border-color: transparent; + -fx-background-radius: 0px; +} + +.table-view:focused { + -fx-background-color: CONTROL_BORDER_FOCUSED, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 1; + -fx-background-radius: 0, 0; + /* There is some oddness if padding is in em values rather than pixels, + in particular, the left border of the control doesn't show. */ + -fx-padding: 1; /* 0.083333em; */ +} + +.table-view > .virtual-flow > .scroll-bar:vertical { + -fx-background-insets: 0, 0 0 0 1; + -fx-padding: -1 -1 -1 0; +} + +.table-view > .virtual-flow > .corner { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL ; + -fx-background-insets: 0, 1 0 0 1; +} + +/* Each row in the table is a table-row-cell. Inside a table-row-cell is any + number of table-cell. */ +.table-row-cell { + -fx-background-color: GRAY_3, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 0 0 1 0; + -fx-padding: 0.0em; /* 0 */ + -fx-text-fill: TEXT_FILL; +} + +.table-row-cell:odd { + -fx-background-color: GRAY_3, GRAY_1; + -fx-background-insets: 0, 0 0 1 0; +} + +.table-cell { + -fx-padding: 3px 6px 3px 6px; + -fx-background-color: transparent; + -fx-border-color: transparent CONTROL_BORDER_NORMAL transparent transparent; + -fx-border-width: 1px; + -fx-cell-size: 30px; + -fx-text-fill: TEXT_FILL; + -fx-text-overrun: center-ellipsis; +} + +.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected > .table-cell { + -fx-text-fill: TEXT_FILL; +} + +/* selected, hover - not specified */ + +/* selected, focused, hover */ +/* selected, focused */ +/* selected */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:selected, +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:selected, +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:selected:hover { + -fx-background-color: CONTROL_PRIMARY_BG_NORMAL, PRIMARY_D1; + -fx-background-insets: 0 0 0 0, 1 1 1 3; + -fx-text-fill: TEXT_FILL; +} +/* focused */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused { + -fx-background-color: CONTROL_PRIMARY_BORDER_FOCUSED, CONTROL_PRIMARY_BG_NORMAL , CONTROL_BG_NORMAL; + -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; + -fx-text-fill: TEXT_FILL; +} +/* focused, hover */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:hover { + -fx-background-color: CONTROL_PRIMARY_BORDER_FOCUSED, CONTROL_PRIMARY_BG_NORMAL , PRIMARY_D2; + -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; + -fx-text-fill: TEXT_FILL; +} +/* hover */ +.table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:hover { + -fx-background-color: PRIMARY_D2; + -fx-text-fill: TEXT_FILL; + -fx-background-insets: 0 0 1 0; +} + +/* The column-resize-line is shown when the user is attempting to resize a column. */ +.table-view .column-resize-line { + -fx-background-color: CONTROL_BG_ARMED; + -fx-padding: 0.0em 0.0416667em 0.0em 0.0416667em; /* 0 0.571429 0 0.571429 */ +} + +/* This is the area behind the column headers. An ideal place to specify background + and border colors for the whole area (not individual column-header's). */ +.table-view .column-header-background { + -fx-background-color: GRAY_2; + -fx-padding: 0; +} + +/* The column header row is made up of a number of column-header, one for each + TableColumn, and a 'filler' area that extends from the right-most column + to the edge of the tableview, or up to the 'column control' button. */ +.table-view .column-header { + -fx-text-fill: TEXT_FILL; + -fx-font-size: 1.083333em; /* 13pt ; 1 more than the default font */ + -fx-size: 24; + -fx-border-style: solid; + -fx-border-color: + transparent + GRAY_3 + GRAY_3 + transparent; + -fx-border-insets: 0 0 0 0; + -fx-border-width: 0.083333em; +} + +.table-view .column-header .label { + -fx-alignment: center; +} + +.table-view .empty-table { + -fx-background-color: MAIN_BG; + -fx-font-size: 1.166667em; /* 14pt - 2 more than the default font */ +} diff --git a/src/main/resources/css/firacode_regular.ttf b/src/main/resources/css/firacode_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b8a44d2db0a18c12d7cf03c3763ef23991c3b5ab GIT binary patch literal 188504 zcmc$n2UrzH+xKU-9YE=zh{`z}nhorV9hGJ;fC^T`t{`?SvG`{W1c7PcYW{m;q{yU?9A+xd&Dy=?V;&P3%Tp#IDyByAyZtj6yWzxG)X4@>#Y>H!G5aRco9k+T@9GnTRHS31V`N=7)&z)vQq)Cg`jM)`n z%poZ;J|)?(TpEt_IA*4#_{8>`0x})ZI2@~4$=!SP?p&qRkBm)f$5_KP$vxXAchV+~ zLi*fDZ`jGRN2Mu~aL9OeHgkkBLpe!fZCDDkqoW)@GL!ZAy`Kj$X4~dP!8d8P4Zljm z41oyY%tjA))7=70>esPTZ#^>!dBE6QqV`IA_1q~!Wh2x-w41FRE5By4;T(luwGHe? zdOc?2{uc#5dDu3zZG%INNfe47McIX1RCrz~-{bguq0%~5N=iZQxom6^DKX_Hlb*Wp z_a7x@@}LuIMu*m52bq0#wn1-;O>g;r8^#u8TtZ$2)p#T^AzzMjgDE|JTy&R0&q1#IaV^cEXHYoz?I|?aL3By;7*b!F|JHdCcs^( ztc1H-K~0nk$_2QumDh0JEAJWCoHgXH`D@5uE36@Zt)f;DZe^`9+^SkNxYe~9a6>g% zL#w4Vf*Ykp!EK`@!0n)QgPWwm8d?vnC){fqW*K_vC6l!`+8f5vS8fa0{s-^ZE2hSFQR=J4lYW+~DVo;!!%o|||fOSl6o!(LhZ`LMp+7Jf7# zH@j@{bIjng7JrU9qnmQGLzZv_{v8&-ihNdD{2FHPLW|#ke5PCcHW>YuHgel9?c#RK zi^W;emsHj>x2}IQG-OJN&2&-uS?EZPR?AvhP!CXvG}dU(4XaenLRWbJEFhI+CBf)Yh_`J68Kl@&of2dR2LJ*ea>^g zq^*SVqgg0sL#02@`==8Bnum4de<_8|OGcm2h!?ZXgxZwASSo|LPd?&{CH|g+)!JQ9 z+XUE>`lOFOny4pfh7|g91X)KzN4=*yAzfQoAOUqq#LUV$MvDKfWrb<^N6&V{XdTWb zvDs`H+sJmaqwE}e#}yvN`{8Ojh0o8@r$GP9yOZN8m z9`-)=DfWvU3=S?11s#ewly!)880C=au*2cB!zG7X4u3ejbCew&9HSjuJ0?1&I4*ZQ z=y=-kp5qHAd#6CB3Ql284V_vzjdeQUld=c>+$&MD5zoi{n}c0THS&iShI zUFYX6>-yaFlbgXU+HIiQdbgc!N8HZ2 zy>R>NZsYFi?&V(Cy^MP`_d4!P+~eK*xleOn=)T5%oBILxYwlTjZ1cF~G3F_fCnQgu zJWcY%=Sj?yl4nGo$$94F*`4QR-rRYM;a}stad{Wzz2}kNql!nEN3utX$2gDa9_u~s zdpz^_m`}?Wl&^Qb>G>ArTbu6>Pg_qn&tT6G&q&XPo(Y~^J$rc$^jzq<#`Cu4frkZN6!a|Eq~MT(TMA}*74hogHOXtQ z*Artg;}GK*;}qjI<3W?1$=B4uG~2Yylx}+F?do09JIcG4_ZIJ;%)aIx=E>%n<{jn? zAI+znPkWznK0AGFd|iF>`}+H~^_}W_!1s4QXTNa2Mt&{)+WB?&TkW^iZ@*u z>4lFMk&4(AaVb)+$fzPGi@YvsF50l@s-mxo`4lT!tWU8m#SRraQ|wNlSD=4j$-v5i z?E;qv9tr#@@Jf(ZP{p9IppHSQL92t(f({3r3c3((rZg^Fa5EMYnkXWqsvS!v$M>#vQk;UvJquFl^s>~NIBPXEz0#T_kFo7<*t;= zE?=~KO!<`ZE6P7B|1nq&b_lK&+&6f6@Uh?*6?`icuTZfgqTeW%B)m0x?bFbF8+R$o0h2#yX8B!-CDx`TxLdbxS;UVKgz7IJS zav|hu$n%i*)p_*-)qSfMt6rvh*4%^D4AG_TR2 zMvodJYpkfTp~l^s1!`8V*}Ud=H8{QsLu*|ThVIRW{ z;jZDv@S@@6!)t~&2yY(VF}zp!knjoNv%;5!ZwlWNemwj_ct-f6@V60igkwbhh=7RF z5!E8^h)9a)A2BLoYQ%zwH4)n*evCL1@ms{5i02WXBW)wyBfTR7BZDJrMmC6S z9@#OnSLBe$36ZlRmql)h+!J{`@)xv8STDF<|9WfcU8`@dA6P%Qe$D#z>&Mn_ zSHFAx0rf}KPpv<%{?7WB8z>D*HK^90Zi68W4m5bs(5qo|!_^HxHVSSuw9&=Ju8mtZ zp3rz&<9UsjH9i%kMma_0kMfTy8C5wdBC2sz%cxFKy`lz3jfnYHADtXMFnVVE(b+L} zF?nMAV#>tSjAC~q4o33iQrRlz=Cz@VpdZX!srmvc2H?wQz z-ptgjXtQ$7#x%PeTP?PBY)ovM*sigCV~52~jGYy`Gcqvxb&l&1*FSD@+?=?~<^`IEHt*DYar4J5inXZQVpNMoEzY!bX<58wyOwKO z?rG)JszIwMtxmOeYF(stZ0k9#ceH-grbL_2HgnosjL#qM8y^^7F1}iPWPGFexcG$l zZt;EMm&9+4zuGoW+mdbL+b(Lmx$XOepoH=XAqlk-8YeVQXqS+f&^KX7!q|kV33C&c zC9F@_p0GdRc*41a-x6*mJa3n~U1Ymi?LM_H)_zp`lO23JOzn`-v1G?39Y1#(-sw~4 zW}SO?p4xe5=Q~~Ucd6JVw#$qzKX(>1B&vbm|NgI= zUAKJQs&}j1Evj2ew*}oY61@}4Bt|4QP3)A|D{*Y%)Wo@oOB2^7Zb{socqs8?;`ziY zmVfsWUnTJ*`y}@yb5fC{Qc2a48YjgiwN2`h)H7*-{%>Z|iKLI+1H0Gm-m&|H?wh(F z>Hb^yr`@xXwPc6nJjq_k)sovJ_e!3Syt@bM;n^d;$H*R2do1md+2dKy$~`;u?A3E* z&#S#$dKr5a>(#4QYOig$o#@m1K<`t%uk~^4Q=m`pJ`eg9@7u5M{(dF<_3M|Gk}D-| zO4*d^DUDM)ru0l1m@+bDYRbZtH7Sq!oBOxuKfC|={!a(w9#D8dg8?H3tQoLlz~KSs z1{N9EbYSYh6$8@-?i_gVZ~xv53K=wY(3$UYe;4vy*Y6g7_uF8H!4>dt(%_|oHw@lB z_~76ZgD(yKFeLAg3PairnK)#|kcC5b4LLF-W5~mywnP1gRvFrE=)j>PhE5y0eCURu zJBI!|^y9GN!`cp;G3>;!$HVgt4;$Wj`0(LVhOZfZY51cNb|Xw9%8qC}B5B0r5m!g5 zBi%<99XWL5nUR?zpNw)JWg1m~RFhFjqb7`6KI+nF_t8G1tBh_oI$?Cu=>DUB9TPLA z)tHWBx{sMVX2qE8V-AivHRj@&-^V;2^LA{mvBk%>9h*2dW$e1K2gaTp`)HicxUg|; z#&sRnciiA{)5a|vxALoh$H(0tpKE;J_=e+qj-Nh$$N0w+%o749L{8{6Veo{p6P8R^ zKjDW7Zzp<944arVapuIe6VFV%KS`NnoK$a8vq_sL?VXe{*<-TLr(pQ$D8JrshrcOD&yRJ+(n<%hax^{Zq%J z&PZLEx;yn$>b2B|Q`uDK?<1#goN;)@?U|l48_pa&bN$RKvutM>XO*4Rde;0|S7v+6 zj+wn^_WL=d=fut#JZI6IgL5vp6#<|fS@GHekXmu4<~wM<&(w9IE&*s@N``YxNgY{RlW%YIsR zbJ@$~%5sOGk6xaugt$PXl3n{ZC3VOIc4RFm3vnHy7Jj7+f@Ztm0DGERqU!Rt46Mxy=v2{ zgR3sBy1$yQc3)k1buFbPHcx~+3VQZJIJ-znz zI=^+_ughNFWc`};H#YcfXs}_@hAkToZMeAM;fB{6m5uE;rfodCsnn+Nn=Yr>q?J$W znKm?SM%vl5dz*7@uDN;I=2e?_Zho~Ta7*8|Iy6L$~aJ!SW@ zJ!SS(-4nSdW>5P)6ZdS`b9`^{y^Z${-Mebbc&L7A;@Z@0bgB1?eJoxjEg?{Y(CrpMYIOFTB|*sNn8j<-Jk%L)Gz zktb44tT=J$M8=7GC!VL;hLbnnwsPA@#Y;q=whw@?3Z#`a9$nMP;&oSAdx z{8_uR70z}%yZ-F9vxm=~I(y;l)t}Ahf4orhqIxmxV&cV&i+^0=mvUdqd#UWDs<_+a zz>bCB{#6SNuN%$$6Z-e;#{4_>Y~PjncZ=_x#QXpMGb-7@pMAQ*?S7 zEhpfz!OV&AJ-f03iCq)BGWtCOo=sa)Q2vDCzMP$4<58A|r+oBeke4^a@y>*gYI=OsJTbCAko=uSM zTl`PT`&(L-IF@)uW`j6U9=TQA9&i^Y+ zUmaWH@f_NPa6`OCUH- zCMUw6b$?JFTHC4D z4}FHSrt9`gfxXZUu|}XDFlL;4I(M_;a>9B3U*}3tt)l%m_=bN67^L(l^Va@liD(WKQEo(2WtF%rohZ2@@|9YM!JQ8_Z zY@{odh5pdb@o;u=S?iqp@8{)cKdrNRJw<+B`{`GSqK!Guv9wDMr*!~x(dmQJD=Qc~ z^Zy)EnAQAj6aGKW7Rr;oUT#dJ6*JoPHkJ&jhfBlFgiUqD;K+Ky%h^GmzM8kDo0U+VF-9lqpYZJ%COeGbtW{W8Y%aZ1;VoMVWt zw{&d1rsRwxKV9oeeRa+Wth2QDpmCowy`GNZkpA!IU>?IBU7Xrk&w=IUJGDZX1#9@X z)Tx=vA*aTmE(ix9pdu&(g1)s6aw_E13^WFHK{yBj6+syg1k5hqI~4$VfD^C-%9nkQ zW0u==$9Lcbcnt1>o8SugC8tds&pKv-ci;th4DN!P;0pK!z$T7|0M-k~9Uu*?1z0m2 z7v{`M_#I~>{Ci89iO|tN?^8?s037$mSh9mAflde~o9Do>t@CQf7S3LdO`r|IXfPDi z2BFkXRvfE3wgoLf6VMQh217w@5b9XfZ86qq{o086gR$xu>{v=ap6gglKgQgkF)GHe z7{AuFfWjS3ImfAW3|qrUU4k8vhodL31>~J2OcDU?l10?uAfj8h8 zcnEHT8{il?=vc~OH`oR?g4JNDV<~DA;V|E^n8Qqv3dVzx;1d`OQqX2<_n$cQbm#^; zfcao1NCo4;Nbm^^1}UHoz;)0e8sM7a5D994%Ag!5A#ASOpZee%I21uTU*H8ifD6cN z?Hl+t=lKqp&;OLp{)5|e`&VDmf9aFIhB*{*33l)WUcdvmfZQ&@_8-72i~)?3FW5h^ zzYlKNKXE7me1RA604^Xm;y!>^;F|pteO;mJKIWqRMSEOzTuyxPJ9n@@X@A6izZk<# zh@~~#9&5Zku5I?~!Ah_g%mui**-r-d!7YZnGbviz1-GBJ1Md;F)GEQBOREWY3b}l% z9ulj&t#!AV+6A!#IlWmlP@4+ZPtPX^Z(?z&xw;8%D7_0L#p~`Px=WN==%q}jQlx@< zKI_Qk19g8>y~GxJiL3MwC*57ByH)ga`{*@np@#(P>8t4J$5IG?u7?lR-B`U2)%DU_ zk;_->b%@pTnX17}^qrIga$ zyLu^sdMWMo+Sb)m7Si(x)bmN95dOO!-d%TRXZ3(hmMaC}R!~#mwikYKxvOs5Zn~SI zhd-lIvPY_Te=K{siub1APi8!8mD&mZ`xMSftGy7CLH?{fdiZ8N+))pop@)>Gv$BWl z?p-~$48>+Al0SPA<(#!rPZ^=7$=2Nx6v7JX>GM;1=?}d=;rdza^|OZPXPNZ$qsYx# zqlcW;^M9q+;k+KwOHcEgp60WjvzcO9q@MEw%9%y!W%W>DrR+g^nu3&`b<)qBriY~K zY5vg9YDMFa;~i1dZIwPItLj#*r@L{wTSpy$*rvL_fu6E~dK4je4g$A`Zuv91|E})O zqNglUQ{Db?x?4#P@2ld?G^w5*Qddu3Rre3o-B>-Oj^c&-;QdLYT%(8A)BU~mx|JtC z#~Y(~`%V)xNRMr^Of1~>!8mNXf^fcvkx2D<_AvJY>H{BhgyLI%lqRG!Y>i%7N zxQp)IqY!>auX#tR4?m@+nW5LMnLZku30vvmKkKfGZl46*pP{F0uBU0P`|Id#EftT*a4+5OrTeiiq5f$Ko+nAo^pMVa`bhoUNZtRPUgy@jizin|*+lm@ z()|g#U-Wg1?w>~Cyq)f!rTaVT{!x1RNxFZJ?#|FdrtAI*x_`Lt@2dN2>;Ce(yGIYX zs{1eKZnPfK41S5>jZeJM!tivgD3snFErNG@=CGFf+oLn}w@0_?Z;zhP-yZ!%e|z+I zdV7>>^!6yXrT0d;9lbZogXq0cUY_0?&dz7ExFL^dU zB}tOPFVlOY{3^XS%CFITqx?3#H_G4Rz0tD#gH&D$mQ;FsR5IZ0(btlT^cMdPN$;gB z=`g)XDy7q#q|!-xlT@xtZ<5OO=^awJ0lh;iH>7t+}A(f-(9a1?O?~wY- zG4$T3+=Si$m7CJLpK>#L>r;-Uw?5@Kdh1h;r?)=kwv1N9o?k)h_;%u7{4db!(i~~OhVoGW=~klKmNJ?}1Bz+HmSCn&S9dOhY*J!Pi*p z|8KM;&bR#rRS{PF8%#l1PN*-b{nS>fBgKvTcVxf9m;fvt{O}KqMfhmY089c4{v~^n zZp1gBvH}3<^Z!EpSMdjMY~>gD3CbtsA82ohr!+i=pN zNVn)4So8Wf+8^ipe1q-?8~6>*AS@@;w>jHOakLJQ{mGtWKL)5h2!GoSdK#eaocg^m zpz{&OoxY%-Lw2#^0e?97dOq$$7~ut~SmIk+l;+(KKy#?91y3lAf9gN$*tVvpe5fxe zUItNs#(ggk4Xo=5=3e$&9MgF0{xg_S|rf*b_E-wmYaU^o0UE(vN+450XF7A5}= zfYzFU7Ain#ZcyLs1Jpi((tZLpz#u?%qxMo>ln3$L!T~7Nhw|xc@lzZ70BTDl=md%a z8uLp)6rj9%3bM1IR6fnO5`fxv!9qQ#BUle$L$(*txa$S1?IAxwb)fMx6HuGz`t&1k zw~zv*x?TiPfZ9p(m(o(*#|iYcp6or%g4Nz+H#&!~#*tDztTrV@e$;om?WRDR1F9Qc zBU}L0XAZ~(D30mF8uBKxvR?_F;hbWW&zcn*i#W zy%BMgH=T1EP`_KtoB{u5FbR|f>7WkIDJWFW_Y(X=KowBk;wPmxP?<(h05k$^KyF}< zII5Q=&DZ)*=VYVLvo|PdS?G@})F}(~%t9Y#rvYjk#z}S@!pZ{7k*p|?064(-%5DMB zern%;O}hwb*5Evh+pMi%02mJnfdIsz9%M(|cGSl^K@Y^00_8v#fOE3zfiYk%fQ{(f z&mX{S9HTF(53Kv3>>W7njWn=z7RHM;kF09&qc8QmXs^-|{{NCzpT|hUngEoqkJ0N; z8Y9!dcK~hB*Nx3kl);Vyin9lMz$wddeJG8QngC;0pM$Wmo(JVaP`nk&gW~%Dnj2K+ zRX}U~0YLN43ZM;l`05ra1fioBgs7`dAHIH=o(I0vmD(in6YRi9u+WEhQ z)z1I7N_PHFkZlQTAO7De_51%49P^LRufvt0m|yzZQyRJo^asr?It4ld><4{8N016I z5B2>j)(icbItohZD4w_gXxv%tycYgNfX3YjKa$ z{^0*hI>tWJ+{N`M`yF@)Ft@U^z(;TmECrZ9*}IU=4Pege>2M9u@0(tu?yCT7!MB51 zND~76S-`g9_&ofSrak=eP^|Czo~SdFz}m^lo|F!G=xYtuVf|YFpOoeh&ezLD{W$8$ z-b1NxA3+O)WKc&*ldw+e{c-{d_`gk`v;5;Y&xG^ox<%on5f(ok)BOVRbvhhd+rnuL zy=vh%@cz+AXmp>I@e+jqL`xCBZ?<6JdQ!NmS>%>^-Jb?Jm_ms5vzX3;p z@%tI=|AcY*`3#Q3a31phjQW1wgzE*?%y+*c9^>zAFNC3gK4DCJ>ZqiB%tRP$`f)XQ zkFZiX7!E&yu#fwMzNKT-<3B zMZT~LtqJ-V_QY7qg=5%DpYQ9Sl|V^=dBYP0`uafm(3*g8$j~<&b4)+?no#mv;oT8W zP+8XeaIDvl^1c8_slHU^2yhQzkDx2X6Brjdzgmtd4Xtfxhn{X4Z21!Y(qNZsSX92EV|DuT^m%a?ju>#Of$qY>vPu(n&Dzf@1EJIdyc;#}?^RNvzxKfMi<&YG6e z6SXZ$wu8-eTTpw+hKSSaPHm^Pn)J{9{kvbk_o|QZKmh&QaaT)NF~nniW)%RnxuaF_ zg@uW>ZTJ%$qa4~l{;62Av$u<5YnZ-XUc)(+{(-6A3jdPte`?FWiIbWsX$rKkpmi|LGixqx1fD?r4mQ0$<7_zhooGegk`a1;tsza{8@d zq`cFYG}drROW{_m;onM|Gmg$9a;E!l?X<>ITL|m%{|mL&jg;z?vtHJ?ob{!9yRXxI zeGaQ5($IPTl>WcvVJ-VFiaC+J8_?W9Jt%*|nuf}?hUJW>vaD(TtOTdJUW+@>H~N#=$#y3 zPoO_*BmK$Z?+qOd-hs=2>`z$gO23oPuPwMXkbW}a`u_viiMrLp-UW7gjce71ya=0v z_#}WjynTed1MFnoCwxADW7O~MRweBP%KrpAzVpC2$m2a%(q6&N?`|R-{rV2qwLjx$ z3;!qB@E!X36Y5Imy}1oP>Ph}j5y*QL6m_A!&)Zl_*!sWLo%S-czah<9BsAwS`KkYN zD)|Z8Gvz%06WIf{ptye(jy;c_&+D(!=Ljboecp$<_XL)<<=ktrE2u{a0Q>V57S2H3 z0Itn^1%5M^A7p?opdY|*6S=d6K!FC3;N_!1Cg_L!(NEcDksrn^zYcl; zgmYKmVj&PZ05}3F8{>#i1D`-9z;%#c17s)6xj)aN^NWN2fX=N2=v?$2-+=P*ttkEe z@hXmg0vPvtev~K1vVPANYSHRY$`5^}*Ok(`1I!bC9#EYr59Ep8iZcENA9lJ68((45 zcrCrzjGbT}yf`mLyHowIS@4%0rO7t*mmR+P?>p&O#&19AI5%8YntmIO9|i9@GkbwD z4r&r8^t*U(fqVyQ7AR$*J_7jV%Gb6Ixs#KY^A26_7p^S`k!&pWd6QEKrU>s|b`I zp;ZOSVQ4jhOmAF-2sEl!bqgFyHmV88PN5dupkWp~py40_kewneP+MzRp!U_aKz68O zAs9-1MNr-Af%+f>&|5DA<=fCg6qMepXbk9`3OXj@0KM@*!~=>W=(p-kKvU2I(C^Uc zofph2{Tw>)JJ4L97@#c#@>3|i7XlO;DBh(dlv7ZAFO5*By=?^AJ1CV+U@qc2Aq?LM z!B@mUI}3B5?JX>TQvEuDRiKlF4baXOu#&Sb7WP8BS~vjhX5kPt5hQ^Vpu2^0&}0kO zpwxbPzJToX0i=Nbn12v_RYr$v(18L)g$@#ErJ-a~pir8@ z0wo=~SfG%7mI&m#(4_)=)r;X9DLTq@=yHKF5xPR4%z&;GXl0;eJD>$ZR}1iEF2>df zG@3VS1w1cwoj@rGT`y2hLdotx!TO7@wCHHXp_>E-2&4W08lAgYpd5#80b4Qe$iGdX zy@zfWD3_o+1X?lZ4+8lCbf>^T#@!{5k3n|}xCeBPKq&>KaRB6Bp!)>!&(Qq>`Bx~7 z44Ri+AE%b-doFSq?hJ^>vn-(TOf449OddtE%D9tfq3b<`yJoJu* z$osQi!M6QD9b3%CT$vOxCE7I2J7 znhpdrK;a?SL@3VD&y%4R*jV`K9Dw(o7{}Np@XaNBu1|n3D&h}81^D_LdMEhp1#AY?L4dzJ6?-3)gZJtfr*wejg*pq^d?=L% zmk~0V@loI6&(hr}F_T4J|65b&+;>`YtaBinW8FHJ8&dz}LSRFD{_9 zla~oNAvIojjGpnV)q5YSr7 z=@`&HkGB`lddxcrXb(v5Hxsm8^G*WVm+{U5S}*l`y)Haexhl4zgei{Z7D!K>!DO$K>H?Xmq5d~l6DKUo6x-iEdz>qC>_Us z?;|u_pkcg8mjxQ?Cs93s275|Z1RClqT@@H4=rw_cx=Ysu+6U~<&^(#rT#PXp=?D$= zmk}YW@MA2=nm~I9g?$O_HWaoav`na-K*Jc5a|yJ2P}q^s9zY!h+Eb`2a6|Yrs6PmR z{{<9lo?H(8SI`;)e6xYcVFG+dfyo$Ogwz6xF-Ax)p%`O?)Dns@Mo5%TZ-B9-q1`gZ z6(O~PVoVVd#-}{M!YC-lj{F_M-#{@&2xT~Qh(M|c9VsxlL+Kn~$O|1UkfNYt1j;bz zSTG)WMnfkGq^8ixU<$&UK~n`1*%@O_UV`vS&}Co^{B@yg!8-WkpzFa#_{oNw1QPXK znn1$(Aa4dVZhnHE6iCz;rv%bt=xKq3@hP7XNYsyK1rqfaoew0eHS#&|GyE7!@_FzJ z{OzH?f{Os-Nxme&Hli&}A!vW2AQ3^=Pr6?v=(pliP31YD7iC)5qN!*7D-0r}wfg;E@# zy$;=TDn9TRgHoIy{NeXF5v0V2mwC(F)r+8ZhD1swB6=^&uJlG0H?&v=zi0@^nzodx_Rw2OfDP)b(;$J|o731~m1 zBntQ~Xp(^TR!VmP&x9rmXrHC@5b)d3o&wr$DZK>z4z#y`_FqaL0ly3FE1-Rt(oewe zK~n^@FH`yp_=v)Eq8I^eg{s(lvfcB5d z0s(&lT_~Wvq_RlBpF$T4IE|wv0{#rTR6u)7Wto6Khmu_Y?Kc&&1>i5BD+RRoR8|T2 zE9hzg?LCz>0{$AhRzUkuWu1VYoh$1Fv>#PA2sqYVWut)hrwZ8@@ORKO0qs?l%>w=& zxmLVF5n-bI|Q_!ReliAUQgL6pna`E;{(v1PuVS?eXc@t70@0~ z*(;zuuCh-cG3b5)?Rk|00*ONpf*)}%jrT(WNroO4(Ee9BB9Ij5Q336Rm16=)g&r5s zzF0XSkThtzfcD7r43Urw&{G21FDs`7k`45XfcDPHS%G8={YfC9G0Hgs?WvWY1(F@~ zyny!B$_0Ux3;K(I_S(v?0x382qJZ|@^!$;K?4g$hwEtFq6G#rwD*`?QdQ~7fLazz< zQ0R4mA2|f#oaY;x4P>e-_&xT_B5mF&2#vH-tKrzk;sW22{i{Nvi7*B*$ z1d1_4@Oe;-8$v1y#aJQud?>~TAr*sSOb~nl6yt!90-@-8f-i)kzX>S_iasXzA}IQm zkcvammjqu7MgI{}2`KuE;7g$BCqgO-Mc)v7DU|vHNTs0E2Y@ewlHGw+8cMbX^c+DY z`vU$FN;U;_f3K1q0p0tmWIMoDLdjl0DhDMS0lo@Kb^&z1tCB4MUk#=911T6vZ3cV| zl-dcT3XHj-{|UO6azlR-bT8#KRKWT|hY9F;t=Dh?>jfPlpy#|^BL%Dvbd-Re^?JeX z1Zx9*A)wzKd7;e&N7*nXGa67X#*onlIHGQ_gAwDxi2jvfFC+TUNPU5Fj3xm4$Y`e# zwlPv$CPL9qM%X~E2}PTY)eyc28Un%)9tDjA^$@-e+7L8FcuQ!kK-vavE|9iEDGo?G zpsfYc4^Xtn*b(O@LOTJ}m!2gUlR*!JyFz<{Uht!zjJ*MDBbR}~rpA8o*MX*h{_s=z z1HeG|+e2X^<9G1m9OF=cK9Mm-jbp(SltuBWU>3qFLT3ZCRl>1xF<6Cgr$f&O3}nNz0z*OQPXdDxdJbGbKJ}p&1v18p@sdDp4806~L!OvN#w*|| z{IIq0y1-BXdP89Ff@TN|Cg@F&iTpc3Z-YDVH;3L8$Q_~g1add%eeeMJlZ_vONAT~2 zJ{CySZ-0O%cpidv$M{rW@P%To5psX%OM#pMeI<|wK;H=Hxs36x0RQ(AGrj}wQ5MFE z@dNk-KiU4Xz~B$f5*R!gGZ}ylu1Pr8ggHzoW1ubq1-3Q00*oUC_A%uV$Y_TtuYm4{ zO&%a0(iDeMzJTs^O>_?Witceuuqi?Jy(ZYygm!Bf117AsgbX{GP(MP3jZGy43T$tx z04n0#($G+WjQ%&(7SJ;cQ?ful3hfPGKN;i6G(bT68WYAhLHlCUAOY>;P2YjR2)Bn0 z5pcA}G!%?OKC7VP1+-T(O%Tvt+cZ%?_Xnm)U^4RI(DeekPcm&1(EXEXmw@hvOuGei z&t%#spnE27Ng$(aZ`6sP=VIRI3qmUkMV}Bd>f()lAvD;@8};^v{ptCcH*8PP^D}SQ zn9yKXZ(jjDQ}YfIXu;4Z5RLTbp)sHp{1>6E1@bv4)dOg-w>OmywC>PU0qr5Y(H?^K zCEnB?Kzk8yw3(p&hd1W7_YC+Qpfd%u=kT5-pnZ(@Yys_EyypmLzv8_{K>G~uG_V!< zxI%9Tw3blJUqWjEy$vvDX}{uqS3r9O?|a|@!pUY21sd87GwIO2&y2nxXg_Y21$3Wh zRs^({G^+x-Z!n|H1nvFJXahm_e`d6wp!-WR+C$KNl^M1ml%-I#ji9})8FnP-KFkce z5Oj}gb`;S4gxOg@_Y-E=f}ndWv%7%qea&baq0EJ1To826VfGRzr=bC$D8kP|%Lr&+ zY%VLHdv0?%0o@arBL#GiWo{#&`!;jDfbNIQZ3W6MXgdMjtC`yi=pN2ITtIt#^9TX$ z<;^3(DAZ>+bTk+PKl;!-7L0>`J9NB&?g`8j1hn@zlN|xwLzpoq3EKOcmkX4aP^urG zy}Ws)fSxg!R|)7|*}Pgn_W|ZL0=lO+uNBa}f_a@lSqxn-pyvwa4Fb9kHg6Qrvj_7g z0o{N5V2lx3DX1jSqM@=t3xO&E+ROT=0`~(`VWj_7_tr-;KfzX;j3kkG1D8>k(HHD55XcUirA+*L&^aY_+fnvN8 zbf4-oA7DHxzd>OOg6>UyU@xD=@Lz*25zzAtAM~LQ^&RZzvs^&;h(72ypOpxI2t|Jo z^o+!3wSbL1^*NJOV8V znpdFJg<^~mT2*L1fmRFZDbTt>^Me9NQy+@4OK6RtUIMKH)F{w;KrvPctuxeHpw)ny z1zKgOk3g#gMQ0FNTd1Evs|ocNXo-v=SO?$dVt(i^LOlsZzY*#{DEf|2FG10Vg!%-k z3e^&rtLuq5c9ze-ikj7V|@Y5*oD+eM+cVQ1mIG?uDX1361Q8J|)yc zP_sZId;18~D^Op7+8>I}BQ&xl`jk*VK?4NpZfGHaMtxFPpdN%45opxUMFr|_&|(6$ zFEmh~UV{b+)R)lW0(C#Mgh1U1Eh$jnKuZbK3}|VAdK_9tp!S276{y#tL zjmC9NfqDxXDp21;!vyM8Xt+Rq0gVu-hoO-IWW)Sw3DkGc+5+`=XdQui8CqAM-i6i^ zs7Ijn1?oL$1A%%J+EAcQf;JMU!=Q~p6vo30XtY2b2aOS^L!eCr>R@P7fjS)8OrTDO z#tPJF&^UoQ7TR2(j)Jxjs3V~*1?mWBE6^Hs7!7SBP$xp;L0g0mf+h&mq0n}qJ;J9# zI|$SX(2k%J!lytx3)Jz@E&_Enw5vd!1??tKCqolKGUiBbXb*vU2TJoFsJEfL1ZpO< zw?KUWr7;B5XHc3CK>Y*SPoUn1rU=wi(EbATJam9S{RuiypdN!#n}PZe`kg?14y8T- z>S-wT4N!lDl3jpGV}BTc?bVV{>Pw(jhmtLT8UiJI0ks;GYz@?^P#PaVr8z-%0cvF^ z*%YWWhf)P9jeY6^^tnpoj>Z8{Y0k|6i{P&bT@2R2KL@%VY=A!rx>2AeLN^Ii^nu?N zflBc^1S-Yv7N``zSD>ar4+_-HP?`fk-3lc;9*3X$KV6`_5t=u&jX*O)F~11S2ihK>?wT(Yw)5`_{}ud62g)Ece`qr3fjwR>=n{d7@&ho| z1289)A<$>wIqHo316}}XOI|425|9l)@-M0iRMe-a1`G%{G8Tj}L?{Rk!k8lz)W1Y- zU=P17V>cO)@yw?%bTL>8e;_msY=s~7$wD~<{cbk9EkGL;cl^4%f)2eS!(Te-FfEcP z4wLaLwkOBQtS7T)#aRV57+-Guo@Yz>@vX(((q8GflrCMDZRFgtqwFRJ$mQf3a+ust z9wLvIC(5bv5_yfBCa254%P;X)wLVHkrKZwfE$*he*?EofTIluCXfQe&-Hio}0mkCS z^2Tb$Fk?MqQ)8^Lxv{0OwXvhIyYV~y|D~K|Tx48j+=Tz1@`&*#;|1eY<5S}+W0uLr zl*{C4@-mrC{-zS9il$IgZBw$TziEhRoN2OYy=jwaw`rfZN&sd)cJ{x>~^7Z!{>NnPJy5Azdb$*-tw)pMv+wHg4@1WlizvF(V{C@Jg z;CIRIj^87{mws>kUHnb{<^3!Bhxpgvx9%v0M~#X0ZRfN1iTE$E@}v>RKotI zd~@l|ty$UG3Hbkb7;J80C0Iqa7&iYTdBEnoVDn?J`DJ{~(hfFvmHp+iy3Ld20rE)L ze6l=MUM8=VH_IpGXYwm0zv8P@QbLvSy3L2e<}ZwRqHc6DdKgW{LdFutU}K0e(%A4% zo3}A`GA0{`8pj$_jkAr5jjN4m#vR6E#&gDt#_Prx#y2JdZ0=$zU^3}8uVArxZ_@zN zP}6wb=DYs1xx071KW!f69Rr(>_fCb))4XqZ--gX4*xVU5&j*_an9IQCZOrY=!_7-! zb4jC$*}qTfM)@(imE{sOXR+Z`EoN2HgAh>Yz@LwsWz}Yld{Oo8jTs^ zqm)%V=m>E)rEvPmEQQ)$%naB4#SpVa4~CP0RU~6$2F}g+l<_{} zUB;`7=NV5kmQ#GjNZs8JU&os)<7LL}jLeLi85tReG7e@OxS5>cdTrkIDc5E(b{%UF zV;4RL6!xFwKUAH7XCYWzcrutMVV#!G%D=$9OsSy1;Qus!BK*RY@5--a^owFc$K)zl z`IV{wtx>knb2qHWSlQ_A`M>?pUGx8sLk+cS zy6>hnhOP&H{n1WqxPDSfI$ygFJ_+D{AfJI5Bm>%PfSqY|Ho*3VV8YPC(8{ouF`LyC zW3!vwFF!V0Y_JQk*+Jnp=e~r0%crN=Z-eod^G6va-%-lSe<+ib46UeAPLUNwex&S^ ze^)#)zMsgqDVGGzQwwi5V_)-l!zz(q!ES;TW*Vqk~ z!7|xH_LO~KA35WkYl^CsRx~AD87<#cCMeUDiOLMEj24J*?gsI^N=fCUl3y!sU|LD# zxO`kbp}kiwX~pCR1}-1t9!e>UoS)@i<@-!y5>ps``PP=@V$RIS^05M}AS=ZJaWyN! z+*vrQ%OY8A)(C%7e}FY$T^ao^-(6UL7R?^832Y1-$EL9HY%)t_Gud*skS$?L*$-?B z+s3xDx%kVaU)j&>0=t6mhaO~?*(>&pywfxR+$}PRoO9CjU8t-*hv=3&aj&7 zG&{w@*jZMeU1GJ^c~*~IWR2NX))d=^SaypwW52WJ>^5t~?y;8aE^EQ=uy*VZmcSmf zw(Jp0X75=dd&4@h=d3$>$GWlCEQ!5kz1e3rfXi$k_6G(wl-sf)+=k_5Q&~gy8*9z( zv-a$Xc1yddeb(M;Sq4eV);?%=w7c4U?XmWU_C$NA-PSU-N7_B@fz(2JDYcYdY1g$I z_&?BJ%cG<>_=@v8Ww=z);BLq(MJdCiXemZ&A~lm@rH4|S)Exge`g7@pbYJ>IdLTWP zo=A_Rr&2p98((~GFLjVQ%3PN44d~YR5_B8sgA^})l-f$4qy*`+)JZmI*QCy}jnqZz zD%;9-Qa344O5$ejgYQ{;@tV8_zHS|kuU?1n>O7Jc<%M`zUKw9c&d&?*g51Qtxi9zQ z{ycye;pOmE>U&XG(tKwVPRd^`Am0er^+Vy&T*Baj`;@kLkzJvdOuU;SH$9X!w zaD9@W;%D*Y>ofcp{u{r7{|SC8zsfiA3;aC)m0#qS_&NSFzs&dGYuQKnX?$V(8os@K zo!93#cmtln8}ggH5&xYx=C^nh&*ahkHjm+VcoTjXU+BJvZ*kw}h50VNTq?s?;7i#? zz6oFLe!%1KmF?#I5pRJnZMWoq@K*TVc5D8Wx8cw5HSg!VEq{S8dcWfB`D@;RzrnY= z-||lU9q-KF^Dg`Y@5(>&Zu}EZ9N#?!r#qK_m%KJ(h?(iIr5>B6CZ|edk>df_z20BkCfc_D9N3V zmh$j1QeHk*^5Em7e0;p*$tOtpan&fmCrJhQWXX$9k&HZ5GV!UBH~(HT^J$U~pDy|G z8Im8LDf#nR_*(dEsSuxo?}g8mitu?-Q9fTP#urF|e4!M?7fHqWVyOgQB9-JzrBZyE zRGPQLx5vBV>*Fh>a(tCkp0AdI`5LJL>&voPFZPM`VOeYtSFsColZ(hj_vWM&`yURXOe`$c!PfC#n8uG~_@%8XR1|KL zoK{|bsN7PvD9aUl#ewHjepfat%M`9i$~0xFJVC3VC2QT)+^VM9sCKG@>ZsbQ2Gv&0 zrM1*rs7|W0T0qUGdaC)g80E6EQhBYMQ7+(X>PwWJ%2MT-@`Ex@`BmAk%vCNbZ(OQUFP;0NXQ`RbLR4=VLuG&qsIIWP@Sh=eFrd&~ODAyEx?LgV6Y*HR850yvC z24%gnPMNPfQ0^=DwANazmY{Xfx@xtxI$Av~K&z+~)}nCj@2NG^s%f3Hj#_msOpDOM zwNNcyOVa9URkd1LH?6+bKx?FR(0XW{wHp72yDyKgs<`66Gxy$kAqm+NLfArxfC!lP zUS2j3$SNWNB5r7bkOUG831(r_QbeWhqM}koM8zGcQi_yPiikT!tJYF$l~T7_MQdG< zCH%f;=G^yQLj3jj>7T#kGwp64g-nlplew3Q6%GG>#sr#yXh5Kjsko$)F zrTa(sU+y2=&)t3QVrZ`_yN7UjAp+;`kIWxL1Sx821m&h2n_s2F!Q z6yCe;5*6znbGIv>yGu#;FYZG3J@-HEPIsI8o%@0NlDo+LoBNFt?os!9_kjDB+wQ*a zeye)8N8H~j+eZjriy~@4Qz01Ac{h7PWUE!{F z?{KekuXV3+uXb0uKX-3(uXKOvE_ZKpZ+CBWZ*^C>H@IuuyWLw} z_n+=p?icQ-?rZLw?(6Q0?q}}5-M#Lg++w%X9p{d9$GB&>quo(%nLEjy>`rk@+$Oi# zo$oGiXS$8;rth>cM&wavu(%tAj z<>t79++J>`JJ22AW;+9EwF_OY|4yuh{)WkDVv%280q%3HSD<@eg0^}}*wDZ=(3-1+ z3ynG$I_iW~i?12@pjZDXVxXmlT6OrMK^$z6S4F(_n&>GKpl63!hee`D63NzS`1(Pr zHC&`wdqp}l=swseuZs-POJrIjL~m=P$g)mnJCaZ1xB&CtB5|SB4!v?QbjT&vInW?Ku_i%(%(Ny$dsIVn)WE8nVx5aQv<|vs zuBeA)IMrGr8ek<{32R}VxXgM$G+IA}4RfA#2=>+3?% zimyqui-oXGmWf5ya_cHs7mLLbd{g2IaV6}Q>EfsGO8iVLhwXBy^|`pp+AdaDKM_}3 zpNMP3wPL0CxwuYTFK!Sw;)@eE<9idgidEt^SfuN)uD(O87I%uf#NA>IzD{uuzD}`L z+=uT_+%MLP2gHNoA+bR`EFKY$;;R*phxPa-Xi(DSq^Ui9z6~07J9P98e9dAfzGksY zJSTRG=fxiAY|`{EL)Vk0-wQoY+Maa!o6zxZvyR`db^l+X+y4f={sDCQ-=WX{0bTwP z^!O*x;q+CEe?eD&0X_XCbo9TWpZ^2>{4I3z_t48fKqnuCK0Xdzd;*_>5cq0_EggIl zL*a`UG0?rSGETs7Yxk6qouaVcvmGbBE zI(fa;us6w@9WH;Lj?91&IyVY*fmewNJK1*QzTwz~n|I}UvALMfTDtm=}HT+`N+AHm! z>#x4tVBZKY+0F2i-3tHYZT9W<9rkMbPWvwVZhMXW3;Q1XUVE*5pS{k$-(C;@<%961 zZLlAjZ3HwQVqy3b<$^Iogo6p#r?O)kj>|fhk?Pu+6_HXR%_HXSS_V4VS z@DlB^pR;${&)a+K7wi{lr3z2ztM+T~ApHTpj@Rusuugr`ehcf>KiTitf42AAf3e@S z|7yPnFVp+>2Uv~&omS)ahxSMCeSBhnYX8&z%>I}Cx%~y!>0iRX_iy`a`#+~K@tP|(N zll|u;I!R8llj5X0X->M6;q-Dco!;==_A&M&>`2naIj|ygol~5_&Jbs)bE-28_T+GF zQJxOl((eSEppy@;S%FjN6gkE4`i^o&SOPXMuCM)8e$^JpVSQ-C5`?auz#FoTbhcSV_O2SNmJB?tdIB^PTWt z;7dBrmCjF{WzNr><<3>k3g>F)8s}PPrSo&=I_G-l2KX&*f`{c6=T>KxbDMKJtm)Ox zoz7j(-LPzb0c-eP*rfNts=Xif?E|osAA$w`Fzn|?VLLw#`}RrLtxst?_Gwt;n_&%a z(Khn4u&aNgt>zuh?_gK|-q{6T&2Hy;_-tN)RsE9lvh#{%!$Y-}%5f;QSryfqyt;lYi`d0;~C- z+K&DlmiZxA=wHER{~8whH?Z`-gLQrw-$^ZQRkR*-05&mSZiGiev@BV54*xz<4V_d9oNO`!Ur$Oi&$gyz$zmS>y4gztwHOH z6gSmPbJN`nZ4vgSwFcH4{oMX!8^S`&fvuS9p5hL6hqy!CQ{7?iY3^`$ggeqb-OY3T zZomz?`EJN9a0}fc*sCS5Qb)sD9RsU%9IV$ex7@98E8QyhOn1C{mOH^c+nwm1!*=Ys zuwBn{r@8057q}N{`*pf|iF>L06L$tI+gWVQ*20RN!xrs4_cB<#^R@lE0PBDjtO43! zuP=lRzt~-Z6~h(U=3WMid^xQ16|lswfkjT%_;s+;Z-5o zzZ9}eeOEgCT^S^Nd7mA_(j@;9tNKEPV!?^u2O18anju;%y#D};YyZSXIwfxf_+=u4~` z{*86Xf81}}Z?Tg39;=fdux2@mwa#&@e@-Y%2_==S9OWvdd@4ruP_Zh`TYab`e1R)P zrK&WQt};|Fm8p8GEY(N#RsB?dH9%#nfhtE0Qn~6Be5Gp$)`F+1Vd^wB9R9+Q>U5Q- z{3@V=@E?X~wX2G-qAkJdZL~TAE4#639M*efSjkmj)mMde-*~L{CSYwi5v#*VYBGGD zJ>bDx318q1@aA2urjS2NoolVIcB`paIZjjOV-0#CR-zYUC3=av6zk#{SZB^s)oQk? zQMIa0%~5l)vTV@n&PFvKtIB4qsxQZyvsJaJcC}C~Qj66RwNzc9u2er&%hb=*a&?tj zp{`cfsB6_q^>cNdx?bI&ZiIjOW_63YRjpFDsoT{ZYPGr(9_zc+8ubfxkGfZ_RrjfN z>VCCeJ)j;`52+36VfBc5R6V91S5K%X)kgJ{+N6G|o>tGO&FWWbi~6Y5fIkj6oulA@H)QjpR^|E>e{_xk}+5Ustr(RcYs6VPV)m!Rq^(Xa? z`m@@v{sM3LU*Ylon|fb;0AJtV;qm(i{CXe3&-V#DegA})?_cci`%-x=Wn`+E8ke2MVLz6X!y z&F~)Yhu8A2*5BZ1d>7v21HL3*vMPv&SFvHgiUY6eYLR%krQ2N1#GQgMZ8|cgN z4f5ssPVo))4S^5lRNpY)X};mU5x$YW)8UKv`vSh8FW(pP75EC_kuUa@_(u6g`_Ax< z@s0J3^OgF_RO#%Nx`lPV()rajEzM27(&o9%O?8*~N-L{t+S}^l%4-^0YTD<|X{=iu zTVC7TR$Wt5*VLveYN~;aOG|Tgo2t|_RHX*SR)*1hl}xqLP>nk?Le1CS)R5;71Y*w& zqdVhgSGUBCkKo9&CaANFd}lGGvkWD5R$D`3ZC%`i2(lp*+= zADSB>V;VOQjGY@scj~DR)kkntgC^XgL5n$U>e;ekp09yvHgIoh(3NVMBUl(WFOuD` z2o}a)Hn*j&uBoxQskWg;HR=+n#;Dc|mOG7*LN%GfHdQZZZf$F6UQl1BnxfG13+y_y zVzX)R=1vXXY@~{7j_PhLhEq!viBO?xHB4H&$Qke#J8jg>+M>`4g51r@RJ-BY-id2F z*F`&bvv%Fh+D$iGWEd@qFzT@=+|3r5Znh+nsFs*+wp3?}T^eqdgc=R;x=MnnrEs*l zbE+v`IMq<|qOprd&TnsQYgo{@B(`B>YjtDW%*N(LvGXFgjp5svMI&1mRM*tCsFsnf zt$F^$NZyfc&8>4{7tO@~$i{}b)l^A=yuvD7S^54vzWVuU#%jLbRAzo2UyD7we8vlz zYaYY%y!-{6UdUHHFXZL>iy6PdT#HIMov(T2953Um7iWBbCBs?n0P_tn-vG-U@Z@Iv z0LvR-c>^q0faMIZd;w2Bk3RDcuzUfQE6>C8p|PU&R@v+i#ffR(~CL1*h^>n#Z14L z>6bG7QqEt>`AbdykXPTOOsACTl$Q56AJas2LtD*~M82bGa_$l3+!M;Vh03`l%DDy0xh2ZE#VR;|1;89=da}am7Kql^H*~ID$ZZU`Kvg873Z(w{8gO4it|^Q{2?BR zA?`_`Jd;1fJu$>RFqFsj$RjS4$N70C2>A{Fke~DW4gZkQ@OdFW=l2`_As(3_9+4q$ zBo?uJMNFSZT8KwfD8Tu>kr3qa2f6)%Tn|BR$B;J@dFfm~L2lm==MQ=5TyH^c_aN6_ zklR1x%|zS}f?Tg5mOJRdy*T3sxxIosa`TyQKJ(3Ix$`}_89$%p&1ZS@S+0DRGoR(l z_vG{FGyi;+FQ4TKd3c`OUOjkxSl$rR4>7+G^9eDXd`~{+7h?GfxIC;@^9z`M0n;g9 z{sl~@fcX_LokGrE$n{Xj`3pIJA?Gjl+LhCbIlb6RXZpoVznJNlGW}A{UuyD)yqUg~ z>69{^Ql?W{(W5;)6Y*V_nTRQtu|#D|sf;O=8A>5fmz1$&Wh_~_cjcNa=N2jFmMG^I zDCd?d=N2yKmZ;#8Rj?ctEJp>)QNeOlaEU6Ie+Bcc+SxgGqR-_QBkCJ1@9KoQGV*UU0bz#X7&8})mlddp)D&Hv^F$0H#yUhWLF}2T0QQZv#?@x&#qpupc>1v`Lk=Q z-Y1Qq%^9?C`N_~S}jxeRQ!LTVUj@A6z znwy$ii|?*&=!1zGO}xz`6-e+Iet23d~=S)T>D7X`T&1zDd3xfcalp9M{C@>dzXg{y8g zT=l5IRkuE_di3C`TM<`1ig4Af?XNO+1Fnp3>vJip(4)tj6Or0 z`53*1IP>8ZaFywu{wkv&o6@Qhn=x}Aa#aw^IjAtx7q%&P(=^@T^jo$QE8NG=s=QsKhajyR$=QsKh zaL#Y~jlaswR=9FKn_0|XW%M4dET7SHh_ih8Oh2FL8#~BfW%`f5%Ggo|{Z&S<;mYMS`VDcG!{|B0xt|$*2YDFZ%!-IJzOjV;RYnit z%6LW}A@1RE`AV5?X_Z^8C!yJxU);Gg3Awd(jcwJwI-Y`-BEhD_Ha!J3&=ho;o`M?n z6lBJAS-EU#mx~*G&1N35Tk4xlN_oI-)ss;hCZl$qj22)bszE^1ZKnC72hlZ?3*C8> zMsjq-Br^#eN#ux!p4KI9ar=+o#~i0?09S2k;Hot?uG-?j zRclUMwdH}U)}a0>GuPwF`OR7jbE39oarNL#&#cV=XSzj2 zn7^^8Fc&f%qwx`EI!5y&&UB0g0C_pxv^eHI&Tlk6;+$?YKjNI<*o26)9L913Jx({a zDdtX2H)}`4nVzxWFefsKZ?)68W6AQh$nag8r3-IIen6)+HTpnZ5 zVlHO>X3c^)^EYc3#F@WY!ywM|%~}TK<2ks{(=nWG#v|r(re|yz%-PJ(tU(axbh8#g zocWnG3F1u8tVux68wbYX4;GfD)KoWNZmn)=UDDWCJ-eZ%wfSUFwQBcQgp48%_|2fl zRSO;Pn?ZuBR%p2DO2w7a1Nl9c*0nT`q#tufp237LOgjo=uqk40+7>k%*I`>dEMk4z zV@`8>3*R*?WW3gf#Rjhxb8nNmt!tQD-)0b-8knGAL@c!gG_eNq%tV5#ZeUz>MdGR( z7*}19xay9BtFA~~bp_(8J0`BhrbM+(&GU5;^bHk(ZemRl=++d$+))uU9u-03nIh<0 zQv{8ui=gjxT{X4OZ_zyT4e_8G=0UfHhq)sj8jpBrJi|lZ8Xg)^^PoFZFKmqG@scx- zonv`rTrXzgf*Y6X#Y_l@bG?`Wi#YcMV*~~KWeX)sB;uxC{boQSZtB%tNOBdOrwB{A0MWSu>4K%Abxh|^xf zJ=~1GJhNN~=9%RRt_EIcS~^f@R54nN@e3;x7F4%jBc^Uno35}#9c|Ggiz+Z-HnvRa zBFQ=$Nlv2pWp!;~gk%OpP)NWko-1(;>MVw$sh*T*8U~cwiHd;{oxHqK7Th0-ozpP4 zy``=eTZy_3D$P#Rx~_HQ&&0--2Bk$+e;C*|x&dZJ^@}!vIKa*zxUD{5dnMO8^ob07UiWv=wDt?+*zUb^3VW4-Tsiu0d zsQek;yff3g(WnEwSQs3>(dp^obU3B3o-y4bH4HUVlP+YWBg~9U8(mYV>zMIPDSe{y zMD;YoIVvrx)uNzLHJlj*_6mOzl}O`dMWIKHTM{X^+oUcfO4Y^gTvI6q7F|tA1{A5I zj3~g&2sq7vBU3pE5}DbfFr#Jx$k`G-3s5|n2lo7i+SFlFy5KzcMdOrW=cMyD~E zz9*+dgz0l~Vwhw~r2S`lC5i$?h@?e9!?`oKo}y+_DB!}*!y1sH&J}8UBEhwGDm0Fu zKw)KZkLsr8HVlx4YOT_Oh1xt1*$a zUTKw6+1{dkErC4ag~XM$WLa^~+Gbe#*sj<6_HkaU)vVnE0kdWZ1k4&RfJYv*xB)gC zg2s;oxG@0(#&3jtdM$%%nGZ#o4{M6^l_uztL$%Ezd&;vk%i{oUSXkXy*Hlv%SGTwU zhF4QtLv^FcR$3f`M;+kCX=;mYfMteAPUL^!dD`M*A zFKAnWgxJRBxeYbd^f*fozHM%ar-HyuR73Wsi$=rqVAPNS-Yd;BJ3oP-@r~kYS}kaN zridFUgWM5<#%GFBnI%_Vp}7Wv1@SF)^hlYJGQo>L2|>1=@IA3iC(PmnLH}|sru1y4U?_1E=4s)RFKRbE(_dT|tK-_5)1~qk7xmB} zT6!=9W1ljS708eR1DW02Rv*U%BlyMv67U-b2%c=?b(V3U1^mW=hO1f6`gz?}XdDTF zLgQFKeltw`JO|+MO&P?^OjuY|l{g#Egk3h3mLa87W13Hh*Y6=- zzlVx~J*cwE@U-1!jA1%(h*$8TqC$7JNnH?yWgKXMkl9qh)$k2r)1`3^<71$PxCe)L zz=bePw6sN~7l*LEtgdaTZfcv@yr`~aBHA^j6GWFFjCB42bRj|-<{^b4rA@VA65hSe z-2X>Wb#k|qG*wf1QDjf+j?&4fI$yXHk@U`j{1@scC3h;5udxl!f7aHy`qx)`nYq&B z7%Hz)H0m17)DSYe#etCVIpS(uI3eS6MBGd&A>*4w+;rKH@r4IM+(kp&MMK<0L)=9} zW?u|!D|<9FEsW-Dc9cNT=#G%_5(YxXO9;5>ydmSIN1Qv6@z#T)84MxgjSYlKE3sn5 z0m;>wk1Hn$MxqMA)F#JQ;K?+Jy>xDK(uCuBCaz>llI zI8Kp|%VRdVkj{L}rWoQZzj2@f-^^1X_7jDS!xwOFbhBxOe5E~1)y{5S%r)!px2V3M zt?oSZ`Ifp18`|opHj{BzTi)E#1pUHTOoug8h}B<+)nACsg%Fz?A)bFjtgk|>HbXqW zhIoDr@%$Pxn}O&uW!YV%36J}8dH(2%5S|P?gn?ZsXaqgXehecrbUlp3ww8wKx$O(4 z;R0s_53#a>c!Cokta?J_c|AQ~3(dklowadJFFi3wNPDCVJR+0_&(Qec(sTxgYrzAX zW-FVY%{~gcGj}`l1V$ia_7%|Wjhz%S`#Xqpw_zJLWcF=<&)v=J@gmOo*g6cE zeG%~GZejNJ!I$S8c6Wx@VCN@Hkj^s%+hhDB3gFC--J>CPQ1KHbfslDR7W^2`?5ja8 zrf2r#Q684Z?2{mFthW%`>>;x!j_H8w%j}(l4i8JS-vWM2$Lwz*&gC+D-@xbkW%q7~ z-M=BTZ-Md{ba=>vw?`SJZ7&S_*}2%83&|uzcBlEh_jq#UkdVh^m&>x&lUjAc)Z0C zGJErwc36J1H;;0gd<8sh7jS74WoP!0lVW^;N*- zDF_z#Xr12xBNBcVEHV~`BX(9We!n(76f z96j-PLS35|OEa;m=9c->7Bw@0%-Xtz4K;P;rbJcPPU3`Kof0NDc~p9Lf={EZsBUva zSftEtY@V$Z%Q;x)>MgYt_!cJ5Ij63+p?yB*PST)hb&J~=kZAz07}030tymIrLcfy| zw7try33W|aJ-003XwSOn3Q2?Rt2?g_4mmuw;FUBHtE>4{b#=9zC4Fv7bNhm>Sh^ns zi;DWxH@7q_MRip-POF~X-dIgbR?g|xH@COeX-q#Wv>?yOL7t(4JRP$bb}eo~Ykk9Eg(mYT!y}n(5oh0l} zehA)5;4PI-J1aWbbH?jx%IXB_M69PyLN#i{WG@!p*GZ3tbOVi+I!WWQ$Bt?c0kv}E}4y3 z+I_4!^wRjoog6J3c2~Tuv`+041;#icae768qA6rW!6UaiOHL$?Er&3l=-h_C@km8? zIQB}>o{{!WkpyNW({=%mWPNL@o^Hbf&GhRi4>*m$uE2C}SegWAD%w`))fpQ0m-qJI zCv8+{IwwIhy5KYUu!voEH@a43Aenb*0h26|BMdQx-r z{?U~FUW#|^T)ih%K-Y!~S3uWWOih%hu#=typeVzjMg0<9QQZ9YRx({^ZzUn>9uH@b?UNVe zx6gw79$}E*;tBBEcL9DYFTiir1^9ubAa9ig^9p<| zWA&0`1H!XLa~aY@zePL}Z`kUmP>@}3Y4r3SUN##X;dgv>G*%bO+?tnq^;1pJZyf8y zM57mI6UZPNUW6R0-%{4l9`r7`W923{-cl7+6Q{|hnk6lbvI+CwWfCvL zw>4RVmo_xj%ciAEmMoD?a-tPmT6K1|Oe>vUnJo^KmrlzT8_TESck$V!)3ZgzIg=-5 zizJ*hkZrv;b@Dmc)??FvW3}PM{A`@XY~j3kd`$p+B~Bc6a2`)0P8m+dsY%_O`J~TS z8gNpcp8rFh`2QhK-2ad#_J7FJ zW3G}HVB&5Q*U(fVmeDd$ES`fWd_)tSaUtsUFYSpnic9tH1^Rc2{+*zIEA;Oe{ad7e z17w7X;mx>+!C0s_iT-r*fXJlB21E*UhF`?vHy{*#gH{KA^R2`94Ow5|x4`-ozlGKT z{1#d7(t6u^yA>~gSo_*Q(|Va6p~Y$9)bso4-vs@OFJb7hfL}2U_Yx;so~y5CEBZPN}MT%?`(i#qW+~?78qOfi_`w`i<8{(Yib?e z0Kk2^{_UfG>FWW4$0wapZ{s{OI`4|0I1UTHN%)AzMcj_lHLtLKW?hZ*(r(nJmEVCg zxbDU|TWfJ<`FfnBwgG30KZeuGp28WV&)__>tvE;gw>TMW7iw=0P722vs5l>dAI@Zd z(|Q}{g73#^I&?bw-*JxTM>xUzGn@hbCC>f+56=Jo!8&Rk$64*RaD`9ABZVKQl@{WBQmQwUO`Jb**jdi_J>#z&KV^LG_@pxrpZWBe58}V}%(64H&y25n zr)pf)aQw&Oe|Y6ygzGAsDyQL^SD8_9UB$fe{pCB$pT>Xxa)+*E%gdU|pDz8ZbU%Jq zmbR7VlqQW^Kkjx)8{0AVtFZ_1KV$5av1Mb+#_SohwfyNZBgbTqJ$S~NGj14LHhRbC zb)#2}P8)S()aRqdk1828eAMugc_o*YOe&dFyu0|Zl1W8Vizels716^s1aUa(3o4 z=1k4827Wy7(t%~!UuD0aeN%P|zTctnJ(YX#^^cML-|N4-|APJ(^mqDw)^AO}W&MWt zOX<6-?<0N3_bur=ywAIRUhcE7&!v50vyS<9W<8O$Dr-zuZtpjH@5vk1dwlPaneS!3 znz=Z0Ugo8}I(mK8>tL_OUekNUWE{#^oH6h8b?INHzm5M{=~Zcm(%wrwnEH0=i#n`J z9F~}n@M*#u3EL9ZC)|+GmM|k>d_qajLp|TXUf|4N*!)r8Z)(v-qEV>587TLDgl%fden7sGkbZ{qyD z#W*i;ypx7=5)b0s#Vt73ahhF%vo-gP-y=6-B+_V%LC;OF96H~R&b0!>q4Ngm6s{76TzpaC6^v1omU?DF_175DB{!F}Z+F!T43O+`zp_I}?aeIn|^H zz$3iTE;zr9Ae7^ZE-5%4O{ZM1?hdC=-G&eoIJwNDBSyT9bBrUg7x6`gNNgMCd@p8d za;e%1h;(vPP?tkl%W&f51e_V2i*o3e9jAmsI;rlE>0o+P7kHLuVU`dNTuEU=I6aiR8_?2{mXM}S8 z)1cSQn9N@bowQu%Dj-Ut$rAZDFzt|rj00pbQZChU3F^uD^@!&gEaXMc4<+Gbz^?QK z&Kwu{_|}W29|Ser<$s3Q*BTPgvL66!KjMT(HTXH=FXKwzbBWZ=w zo}oYdCgi%Ea*ES6z2(4JiuhWlkM!a55T`jNOh5D~W~r0uSD<8XGyM^UerPvx1t_N& zuIXn3=V`=8GyUO+uSYxyar)xQN&!0w=cMzYtI0D>N};3(jc_itThdqWCTGL%{4e8hsPz5dKm9Itn%nu;+0O;WJUN z48UH%$%I>?U|0{i!j($*dqZ#3A>i$XzMwKN5BUyejz*k$_y_gNDCjOg=XcF7p8)hS zoRGLzZPGP35Z@j-i1VGV!#UKmaK?2$&d-j)+1&5ryzi|zL;Mz;RXzvjsE@%J?^*aV z$~XAl%3hq7x&dF6S%wqZr{nx}(^D|gM2$rA#ymb}Y& zr)XMjfb25C!wY>QW&yIX6W&BXFiI$RcqP+lhA3Ip2`?8AXoLWbPE+4PpvFor1?-&& z45L((OaqKY0pr0Q7A2SyOG*ML51@lc>f&!;JBt#~4Xn}79FiN~I}#=6#U(L;6%pJ} z3G8uE{55bJqi|ON_9-ZR8n_^WTYQ&=(OeALfpJl|0mO%KiHN_}+<{D7(-@1iVHTYX z3_T&N1UmCrpZ)m^&ivekzD}om(s`b*t3T@eDd18I?zQ+up)jK&2c;BGFu_mX#iDqL z4zjq!zsX1dY?Kk-9hi#~;K$) zJrIV48PMS7AcndIq#trg)X*iEIGg1@oSjVZ^W?=Gr}>idqHf6sq;DM|CQ;%^S~3Za z+J?f3-VrOU5AFppFc;JL`k-~8yb!sX<&BmtpOl*|l3H|=ryP0QaGr}ekE8Pp#7XzR z#rH8H5(YzaYoZ>nz7U)^)BP)&ktcIMenO^;8svO95@g zDYvhx%@HWgBLf2g$&MKek6yd!0w{eF2V>qAwN_rMA{SpY z>A>23A7-H^@a3_U@EhnpIBXl_HGPnNU95&aA{jAL==363MZ?T22CYgp9~uvcu_!%A z9w3;Nk=ToIh5<5LLl|e+6iXHj<{2p&DU#}fWyrT={;}k78b8Uv^4~-IX6NIJc^uzs z*~60Z_b2y_rds%hB@5p;^@xV015*r&MNh*_d+Ns;md3ePgTv}m-;ChpPl2vn4!oV6 z@a6z-&Z$pC@J_!6cvFFQS0}s)z?*QYna4HXAY{ld03PZK^+0@uL@gEOaj#F+5Y$qB zY$ph6Dfo3K2qX)B-U)))qyUq3*!Lz$O9qK43XfuoA%D0W2X3HW1?wBDcohO6;bDR+_0z-j2D+;#=@d;dWB&)#Jh{O;;d0bH0 zd^7?(%@b*QcA&2j;9CUx?Cz&P3LmIqF&P!Q!L?s%#!}c@C$LU9t9?) z_-`>`@Ls?vjvjy@{mTaL07Po+803I{fkprw=zVqV|oAgKw z>l(BEci>~3g0B&pnj{MZEy?AJ17(5lYCK{j(9m7sRN^bK3b@Cz$nuA;m1+p}jrEI1 zp$G0V5qg5Y`4(l=cO`%9iygqXb=o7EBE}ci$R0&1F=?dkDR%p15G@@vD>XMu?A40I zHxQ*$Zy#rSVLaC2VJ{GTts-dpw9=BGj)O_MKH=B^ErEQ-GPnsn>M+)Fx}|W&yui1T zM1W?)2q)B+eaxAwWjJJi$s9ZRodQoIwSw|sJ&M}w_c`tZ%#k2S2!I!49L&5j00A$( zh9il-M5=@AD=f>o-Y1^~}8G)=4*Z}ypGrsPCxNRRKEvF@N@#U(C zuzYerQS&<`7sfM29Wv4$6)w4NTH+MyZw8|EQSL5HnJSs2_zy`>eKMEpK*K$bhRR+` z=H4`v^8p(z>)(hkkD7kLwbkC2S``8(w_V414 z&3zS^2uS%>Q~Vh5ZJLIKRk`U;kD#270y4}ySBZkZ+FYo``KxpD(0^sizp&4cD+`v>QIP?Gj1u$fGMZp8l2M65=_ zp1wifSt8r?p|3PQjFxP#4}FE)0&;@OY0ylA_9AT$xF9}gE5Z)Mx9B*e8nn@p*&DJq zaQa$65VBVz9ao0?NrB~u{?c=f#wc3E3ao8i@WF(3#zwNbo8-&y#Q zF128n9@!UThyqeR(ez^wFX5aYGyS2K>^rpYP(UF;U+6&&UFyyL)+sk-ak9GO)#rdE z2ErZ!oezmp2I_I3r&|aDdVO}ll6q(0JBC*ul%B%C7b#5#%xoD6sIPDFy{2x;)8|U` z_E{SDpypA8I9rYQLZab;b!Gq2{YNto)PEm@{==hq2+Smd!yGY_gnQkO%_Ikio1O!_ znS}i7!gUQ#>;F2FI1yjG?t%7Ery98>zLK5OT`4n0qV|Sr`TjQiYF?OIvWY6S2SIR`zRr>Z zz8*m936cgDAB6!287tD;k2=#euP+?hgFdM@reA8!-I9Veegm?wOYx#iX zfD$j*H53LcV5~4NX9kz+qwdR<_8D@uXv%*kN@))wK8vXk1iaE-1g}X0sQ(ZKW-JN= z#xPcx7ustUm&?qPT}D|NY~DU*-v5)PRDifQ?-PW0O}Av9NBTU%ye0sG(C4nMyquqK zxeoqFxiJ6s9j(jt7V%02-@e0`3PHdt^$T<#OS3=Sb~R zuGB{`uYIO@X%AlN48->{6@n126_|Bj?ENC{NgC8Rh2C2kE4mJ~ZwY-KTa8HV%B#c@ zagOHoI#Ejb+7hwUCgm`6GGWJ010o)TWWkT#5l%@mQMQWWZ0U^7{Sc_eFm~gO1BSYti?`AoRaXqeUsl1msweN!BvSh#o;9 zvxTVX;I;1^EaT1H*ZCl{eu~k0FA$}iEr@$sk079z^S&ihhNiIA%h?AALJEzU&b)3m zyzGB<&npL|=#6qA-}9OmbWQK+OobrCs|90ZeDCqNCuwGz(7TASbo-`k$KJJ6_jcF5 zIRVgwo&-Mmw#2{>5x<9Xv$rb;TC?|cy{|Jo26g}o0d`8HJR)lvzBfi=ubXvC7UmQR zNc}zW=>0C@-n_EYlp`zCl3AGpsg6jB7-N&cE~7a3^gaw34&zs+_x=CF;-+;UXL#TVh$j$ zBbRxhUadu~)w0pz85ldryPc@@br44+48dLY6P8RrgmnQy6?;*PuN67cK_UAFedRjH zUJCr3>AaJXJrC&!>6>(ZqJdh=d=n$ev;*1O6Qb9TncI<$0Q_wvQzrUx=3|`uSwQUU zoXpvoG;YxI5QwkLoRm2pu@yS7B$-%cW-h?5uBpsfNHc+?Fp|iWahN3!JLhU?eAq2) zf;^o@dgd@_szW-*uSuR>I}m@5<oGtM z0`iE4fPXKna?)0(nb9wL?E(ZL?HZ=7Ybvc#yr^aCiSIuifCp_mo-$j5FXoxHtbo@c z8$3ZRt;z)4|BB>HS&Mi+)7s29IhLK4lk#a=4&WwN5@bk9A#Fu@9zhe@ATuDxo2NsA@qBZu{5s~?9|!cIp=Uct%nBaJi4M{|=$a)j*`L8rL)Iip5OC}shIH2Pq3q6=Z!W*0`!u?9-uEN}@6{7r+ zS&PAWy5|0X=8hUc-!T10L&(Ote=jYb3A`SOW=1;hyl>7P5~x z^lX>JcbgCKSUt%nnS>F5$CoMJ{Ul3LJ#^h6mW3clOWJ@n!+ZGEZQpk|aX1 z2I)KclKo2*+Dw4|!qAPD2Qv=I)BXIEG#VP))XRNDDe*nTy?P-C@q(SvyP!AK3-LlL zQRqE5ikC?IioJi`*fNRxK^Fn|_i7$!i$rgByT|ZI++xYZEqYvl2YD43IQ91Pq1LGYrPu*-TT@g}2zk#d)&Fa^5w8_rD-;!$r&JUM$1_rwEj zM4^`_Nx1#=^OIDbSJbd>d1XVU3N6=aqLe^oqtQ!}5(IY%7{gXJ{xz=zj9&^~4+dSY zR3c#?_6NHuQNniQK>&r@HJ4?GKSs0>ZeuQYVXWSja2Iod-c2yUV1-Mh9(En%BTMi# z=5>;nCq7~=lt|JO!-gY`UkY)i4h5)(%LV_^_^8+n>|L2s zp2Qim2Iach;~e%>qfN1W(;DFn?%AC=himk-C|)<{oh+&Yj2Z0j^wFGM_y?zgb}sUm zvOwR!9-gCf-k`Y;#r;$cmUTT~^vp>bAf89$I@}A9$`o>O&DH<9owau?1$k2NPy7X* z;}6$J=3?xvMPl>tMgi4`3orh}Xt^?{!D^j`U&38Ua@n__caJjxuxm*!d#Sw?kl~t- zg=aiar;A#vA#qb0&C5`v9+S zPihl|I#enZnh<%Hk|fqHjEb*eQ?1jmB_s*#uZ@7*!1M`*a=NeL3CUMe7s8s=_26y; zY#Y|P+fr*8Q@4q`E^6P`ldFp5GG4cn`mhV@(QS&MK5Jn|j^sigcA;Hj#%S0=Etl@Y zF`gy05Glg`mZcjG>4wK7#U!zGS;(ISs#(5{DCx{THc5&=t;84jjb-?I~ zouhLJNI)g|0>9Ls$R42G(qrm=?Xj?FS1{b7T}FTM0jzrtCBLonwh;Yf^s}^gaW#?? z45L38y)D_(@hzGk?;9qs!&+)%^6kmD8~KtkUm?h}dy9sF5Hc132(O`!euLwL_F(8{pXm{2Lr9D}pIC(g}y8M43~= zF|&4@Vjl)X+6U~9SpJ(ZyUyt>zk>e>;Rc%H2r(l9(bK@fW=Y^Ypnn)ZCx_)Hni{C z_$6AGP{~O9&@<^20GqB$rnQgo=1^Lz372bK+-^DIcKlw1;K88j#WF#CnjqR56_`0h zBYsJ4$IRViJBSU6PLyX}A{w&r-r??Kug{cj}S4A^GiY{oyO zQ}9-;-#IkrLDuk-2Q+dgK_?7`v_|@=kYp-GH08VyFo8Emg&2eDEDeK&1?s!-FJMC& z4jN{UvoS^lMk+$MkE2XBLb#8^qbLw0f>%G!X}Ws6;%%9vCSM&v}UHHuz>pU&1v8I=?tTcXv{hh|n#XV*!gj%HP@?#v?2vb=) zNi#lCk+bEcz%BxIQKWPz*MG6bZ8P_q(rw0bbzX}IYXjCRR5~A?FIFmaxR|oh>|<*+z;O#w%)CkUCwzxMdmXr~!9Q^!sI-Rr_9M1}gJqossBQJNGJLxM zGjj&vQhSiT5zeVPA22}kJ={;htVZ)DrBUk&JgcJ1>)Q@b!$|aG`qyLHhaQe#Yx^~g z^JM8fAK{l<$G1%UiTl%H^rkL*hop-s0J{p5NTUkhRGrtdDw#9(C4A$AnazbjTl?~K z;NIfHO5B$%+mOph3O~Lt$;Vc_*6@%8SCWXOQt$EH?n7;#B$YyKQ2=&1NhMHMc!SI2 zFEd;eY9C<>pj1yAfN_fsIxfhnS*8O^1+5Fsi(j3tW+2UkXsITmkI~puutH~`Mxyqo zwD!)|GL0jS?$@A@!!nI!nNV_-WMvy3=a-^cR8E!OA^@dXWp#WABe&BxACqw{*eaS&NVtn z=NjBa$?GhDUZSQr$wJ3-GSZo@pO&%kzAn+gC~&GwK#qKp&%r++0j5bBpSbr2_x|*c z80C!DK|1lci*T2s12rhsty+RE9z**8M)|wCcKk%cz8&FZ&P@=|v3Ec}Z-uW!bFnu9 zLgA5U9unRfwF16yDrHw5&<^$j&Es^<13lTE!MO=SJfP$4iS|U?lN4nfJUd+53j&$~ zjRZSEa~e)`~3 z3W5A0RyZ0;7P{1ysIa~PJ}YH50fS) z9184bQMaQ{lC*jy9^M7&>J36KK;LN8c?W2!WEWBoxF`%`Z;(~NJO&^I?-bK7I2h^j za2*z9yY@$Ff6%5kDo84U-4?>9H!%e)i-@eK7yBNJTGT7vg18r@G^HS42U$+BNOABa zlEkw^RQGvKK@`pez{uWm(0io)&!`m4_nh*gPNDW9>pE6TOmpim$Q=if;($4aD1Z zpTa}vIIg4M7>I!u?&I`z`Z<0l-~^p~XD@sr->L7_VfBMLqK>L#>bUAqCw!Jq_|kp3 zzQIva;nV`W#eT1SpS{k$-(GJ&U_WR-WN)w^wy_FEpHHN>;r071R35Kw6?6{b&ec&Z zMs1n5wV&MthX~jFw!9GifqJy`9?MLxm=HvDg_LKHT`zd>q{Y(34 zN5B^NyYmdF*e6rb# zNtVgMI7c8sO1#_ojrd%ADE5k7Vw>0??hy-c&Qh#(1as#h>qFRSn<3#ajFqF9?z($- z=>U8V|G@iYpI{gI3mb0@b?N;%WIH)KQCjV_bUskSaGpsJV^(4uC0psvIHy##sb%VC z>Q?M|+@{}0+o+z>?~^~Ro>80eZrT>SSH9J9=zJBNwsHmZ#Uh;BB3&1IC_ZPbb0zjJ z?^XAyhj5ZjvU8?$95eJU)IIt=wwLiH+pBn^m)=L;hd0vSz&q*L&P7hGgLitNcdmjJ zbG2HjZcsO>Th#4pwYp2KQES!x>OuG$x8oh$9eB%kC*JAZrJhr}^}FpaSZPj`bCxsF zIfu^gan5&UIUDeB>ry(&N8wZ!^{{#z@5yb$n{tlxjI$a2>oKbb+VP;%0iXC{b&a}K z-Kiec*5uvl4!rL>%&B&k=<`kDF!v0_lX7P`W1Mn&Q{I`cZc^)ko96UZKgBiG$;9)! z(n-Odkc}CumvadyNc6ZQXS6d9bt2IJ64AG(W9Om)J?FUH;moyq+OOlyp^Ke5XO2_v zv^w+-;6nWt;5xjid(Lo;1m_uD=+vm2(R+Wu$wt$hnYcUbOm=2C&6xMU zcP8Q8!vEk&A`-knP?d|p+dmrvMpfCRhW9SdKe+WH$ z8%ES#+&_qZ{w&7VYq);^y?!f3+pD-=k1_CTjJ;QIe?LaV7L3G~ala1Z<5w7$FX8?^ zjF!z9rFc#ZdhT9~o@X#>U(hpSI(}0H{6N-LdVA9wt)kv~2JaL@zhIst4MV!(TFiQ} z^tL&4O(wKWn&?UTLnMfFdM_St(T|m-^8b@_2kf;tnW~$4ko2E@qKnSE&UKulcpiYx zIBLg9NN=h?sdv;{YEf7hcCQJgm4`Z~T2IuTkTPg((iP;lxCH+$^zu)j56I_5&mJy= zc3O%59?e*ze=5$3^I2(H zAEu+7%B>7Kk-_Sv&pXJ}=N}B99%B6r{bP@H6}0rn){XY3_NUfOc8A?z-3%?=&$oDf; zw$`f$FfToz_dOnjolK6^$2u(y0r=VJ=glBZ!okx`4=2(%8513EUdk4)WT4# z{H*f^CJ#I%d0?_gQ-g8_<1{antc1r4i#tEmNJ>c}L#JG&CGcFi%LG_S}>lP2~-+w3t_r)LHtaoP|c~CkTSy>s6 zsmjTtCdb98KB;{MC6zXeZfHyF_>NEqoJN}UR0#QVw;IyLT2|>mdyoirY8mhhxL*qNbP+z|= z6r94i?}VXPoO@7TpD+|v>p?NwdfXBXv?D~aGt}pk0``fA?VAzC?ioen`!F;ComZZK z&&2sX%AZKKjV}K{-@w#?={leuO&Xb`RvS&Tf}*nJayx= zv)aqfxow8Hy8iOv9lo^unewIfnvSyh9qxiP(}%d#11GPnyZDL;iSd;;k|p!A6aRFY z-9>cPWoaOzmk$EuD3zX;kpbR?y%hRct_D?`m(}+1_?%;qBPG{t zVOoN%D>Ne`#a=V<$~(?{aKnT~Toy;;wvrn4ttSeeeAJaEXsWTj;5L;t>J=0mSH z|9tbg4P$S-;Ov{4OV4{~@%XFG==gWKc;hE;_F5-KAKENpH(zwlg!!Y2O0M3&{-q=B zIoV>vs^bd+Ra9=xQP(GUqV?iS!caZq8EEWi4L!bxq(cccRDFF$7+3ddgR9P<(Mr9d zhiUI>XbVgb_zfo8mmWX-)KfC%DS7kpR=4{2c3E}gei{P~@Hc9FtQbpy@8xmPYn`}F z$G_XONyduFM=zpDoOADx6$h`q7NyYKw7j$zpnRC2A;UgQTnD+&nI0EHzYEz1JNAjd zvCl=IW1m}nL@AY{XY=J>?5ul?oRj$Z4J zfBf>xPD=5uC#;umNxSaAo%W=oJ8!+!DO+`{SNs0Wi&Fj%XYTc&n8XHm zc;A`XT^2O?zxO`*=}!*#o;h>o%;_^16!EdS^!DKt3H!pKoZA8_?2CAo$*F(}`y!rY zaw?$0z6dCjQvo&Rwn1QER!2aE)e+A!t0SPo>U>DS0WPNu3OTJ`%XOJ}n%NieG_xA-kwQ= z9p2t08?l`X94d*g4y&kPb!M^^zl9aw0L(Jm8Bq`rGnj7J?zHOa7LxT9+f3sQR+~1$j{o03H;sqnMOwNZT4IxxG57c1SsUD~dp*Rere^v+87(XN7$_&f__bRLU>E;mT056?W zP!=d18Ks=7kruTlpDZ8;6YDYrIRy0xBNYUn$(WCst=vx<1|J}bSj*;Y zzma|rVeB{y+L>sY8}Iss{6<=}*rhsc8CSA5R0#n^-d5!gmrHMA2ZB#x4>6C(hx4PE z+yG_TT|iqZ911RBck7|pz08i$Nqo<@H9{T8r$JC$oZ%11P3V$-44L0!xb1M~p+40+ z#y6&sPIBs;WZr4y=&a?NHHC)Onz(Dr~_wRh8c^SnzFS)i(=HY^tf*v~_>YCh73U^xW|`iPzmv$ncX# z>G@9)ruCo?=x_M%YhuIZ&&S|06(D%Uy+;n^yIVlT?iSCo-7TPEcZ+A)?iNt7yT!9? z9}B41#{#-o4{bh0PXo6?;#ur&?4@b-Jyc=F{(SbZ|L~Md%?)^9XQ@FXqH%C@BW@Zn zf*TZ56L@pdY1Ny2*Cp0$9A2nSVGJ>3&_@n5 zqIT!B9~^3mhL_sGg;=CI33a{AO3F?J6t6=SJW9>S#nlAJ5 z;LKX!Z*v>?ll*VCda#O?x+~;y;BLlYuvClORJsVwXl> zm$u;hROjouy1Ky(z&V3;8mN+Yj$a>n`FvFA#8Y{Xw;rh>GoBJF`R%w=H|3a1M#`>> zlPOV0eFSXxfNc`6wKlTEtjwJUs+fPw@euAgvk;18eDH#p=loWF=@7~J-^1y}D^EE zdShG4_Wva&eFKSKc&zMj&6XYeYqm&-*Z+NLh*@w(OknK#QHO~~gXFg-w)B7WSFPk@ z?CY4za?GU-p9>osDqG7DjV=;UIfrkaPBwo`b5GTf=z5|#wRz{2E2VqoFXwETWvOhF z#wc&9qux80l|+q}G8y4mxr|ISkP!i8x<^1;ayxY$x(5{Kp}2krc4`tNX8?EtlfXFA zV5S&v?H!;CMQCamH&|LrssW3?+O_GQNpk{ErH)@8F(`9!?&XAqS2K!kPn;ceVDhNc zQQn&~;!Y-#)Ws*~OdX#*VvO5@Nh2ah+V+eoO_;ND%Glrq!-w___ZvDfz@h6ju17f~ zd@d1UF74P11(eN2KwGxtP{a?QS`TgaqTyMlF~qYi#IxKoH9V_&!RB33|2JaD3{<}O zelf>g3|zPxwC^B$2N%MFC1w@|xk`S8f5y|Y&%RH%xN6jr-Yzy{2d`Lv_fs-wnqR++S(z`i1QakM{;1z#| zd-GA8gDrU!9tvJzJa9!o+i|{zf-8nl6>I?aT2x&@oA6q=IM_2|*q+6TE+(q33vR9{ zydHn3Bs-@BR&?5$JBw59W3-*}go(2>l_Vdg&c~?p=}W4uFL&UV;3GUURVDt3+Px3l6#Ne^ z3iDDbZ+*9Y$D@liCHwAf+sC{URomJ>;Za1Yq*|)tu{3{|^KYR6{{)nAN<+uO!Mr z8#k_1d6zQpnLo>ENEI~jC{{q3J`vECc5E~b<*}H6;@5zR?1deEXafuyjVUV03||JYK?M~ID#kO7Wgb`_c8-b4*{Cb(GDb1& zd9KERZ$c7`(1C}x<^;(b6J&A_+sdbVJNELOZRvhs&h``Zae3C_K?UO+qYjL| zbcv1*DeSkorYPozVME$1Ztmwla@5h1JvEaTPVZ=y*2DVbHYIIXJZ^xR>!FGPw2vNI+W=MnsE0mnfEu&;3cSx7pz13+s0K}&j0S4WxS)ly ze88ppM|#@k>z+2I4LFcQ)nTrG3~#RfZ*cMqIN2953f9PHAe=eo5$Q8t_W#CLOIKGS zxXPY|kAw`ZjlI1bb8N3l`Jqj0?9lLmAs(3%V@uqIWz1Sr@!)pE^hqueKK(|l@lIN1 z)isMgAHQzi*byUU4rtki#Dq_2O_s@HRL=C*$8HX9RrRt@avBmD{l=uDC3_D~oF9c% z=-Oj?=-5c*0Y3IVcluP9Wb)ajcPpyF2{8-48tcSrm@p~1in;YvKR}+mD`uw88^d%v zXlzZ~%%G^5;|01+EG)=^A)BVGtqGm+PVULMtxBqX&nz4~f9&L}KD|=q(%`V%XZv=% zD9lVyUowBW>BjB+lT+UCR-SqVvAuQ@<1_~kyFeCoi9&n(#_j-1tVsLD^|aXQGqSjZX^R3}b7|aU1u-s+EYD zP5wgUT!4K16LcXVR(JLyyMUBI&;3&usH_3pDw{lNU?&^6;j@}KS5{-S7@ zXUh*i$$fk3Y;UQJH#WUwlntKsGHz*PV+2d#1My)ozona{#=?|kLf~EL2gUC+1U`m7 z9SeCQVY>$=`Poh0=(#3l#nGz8ch{}_X!)Y|7R=t}-X(X&R&q?1op(kBt_<0+d~Ky_ z*8UE*Z8FWAY)U7uT22?!udAMCCw;!H^z-F`!_#i~?^Yh$dUqWY7F4$Mt<#?}o{a%@ z*VPYH_C{qNFnuQD10gdJ`>X{#5ByQXGqwla$llnv*!`b;`gI#UP4|;YRi*8QlugQi zld&sejmsYyg+mg6X`)p3d!MYP+Hj8>1& zA3HX~Z%ojcnPvAEEc~z_>--!^q7jR>wUq4SLUMaq`N;lG^M?$_6776mnEK<+&Q7M} z(~6q?2f+b88sAadgxr}kz6dDOZvv_qK$(6M(7M+`Ya5_k>xpNdHb9MA=rKGqfHGYu zo_*c`<+_kVH7xxr8*PKf!nk9Os+$}3p*hcGG9GDkcEOeWUrdv&=fv6%@apDfXKL;4 zurNL1D1GbyU}M*=eM16l`#Nhh*~ZNlh6OGTBUk>Nu}oXw47qANWT*pHQD0>+H;0ji z-)iduIc@HQ!OkehJTt__l_Kpc`LebGoJE3{m(&2jVAy+HRe4EjzPrIQs6~~{pb?wH zr%a7}Gu0))rbAbcv1eoVN6{CLt1gCZ?!R(za!Ek$?00il4|Sh1G4||=tcnyGnYMJr zs>DT$RBN}Jx9FV}F?aXW7A@KhwzeM_ylPx|h2PpZ&rk=4(e9&ymxMUauSbi+Lpqq$&nuM6T4KY?<#MHh3#Fh$kL1H zlUzf4D@6Ss(_Ic)JZfG|VJg7c?REI1_h=10vAe1uR)BtbNV#tpt_pP9XaM% z80}BUi^jMGJUIwD&+qdbGtpH(v3SxKq*vX~#E)Jg(*}@@z|`=z{w2mkF)s6P-V_>uXX^x%t&e~z22i#>0$SSu<$GN~ zpEf}GUKh}322i%w1@yVhc6Ah;EZ1W07RdMYV>GjLfPRU%{U$MX@$++W8!9)m*fV0E-~+Z$sxSUKr*0|%MMCFWF*-$_R2FsEghQ)}Fi%x9#+j94we z#c(F_vhDQF-7Z@n=g=T>VX!a0nKpbl=q)(%+qxdzRu-!qljJJU89G99W2%=bTrIBh5Xj3!E11>_CvQzb^-6iucfb6zF zW~-c+T*yzg-{Mh7>k@b)f2c3Pe`9#t>bSw&3T%~)(-AY(;T;Ta33(mu{^UypSUp|u^s!w ztDGHIF0Fek{WEj&&=GYX>i%D4wahcjeVo^5olfL-(Qi^W4+h6tdw>Ms!$B99oxH>XBp zD=d!LYllngH>|zQxLF?UJB`R)*UIPol=8x=4x>Xo=S}FM{?fBw2QR> z^PiM3c@~t^@ksP4*7gzijRo|H#4Q4y!l10;A0t!?Hlm0LxJA&i*<60)n>Tlu-xNp7 z(c`#n08`GvRJdTI6mtz_*usD@Js{tWU zlO?oPWu@+7P%+SD5V_}JXDMs&pM#m387c<4ehU_wNfGO=#DN1v*W%}1C&Sl<_pR$3 zQZRLZ(k?P*jpwrP++5EkjT!Q&7yV~s-N*Cj%ig3zq}+e};;XkykB45pweeUen<1lw z^XUF7JYwr4X2{k_uCK*9eTa4HAv{VR86(1dH8j?_-`I?X9u)q~Ltp-M8mfjWQqm2!mqQJb{13y zg&)hSexs_W&5&JglURg1DkF1Htjbvgxyxt^bM>W?v6FLHi0c_}g+;qui?eZH5yUvc z2t{)c zh@Oau7J;Z_bQ{{%4jpfnEP788rFgAw75zWpp}Coho3ng-?_ScQt7lD-qhF5!Hm&Eu&Tk)ev57;Bzo|wpKg~jco9& z@e^KcIFDU76*7hxj$1!8D4DlMy}41v#br=GmCGQwfkIVls}5u5Zk^oEcSOIjDND!B zIWTL?N*7Enlv_i}Z&A2cc;B0DB|$2i;W zN#>p3i1Uu{^YowQGbF^r#oN&?#5KLV_L{2C9bS#t0m@pdyD@7YBSK0Zt+}Bez(#BL zRjpmO1RZ$$$&)G)-=0=Yiyu0xk4ul9M+>Cn^gr5DC0!|;Jhcl7^OBJco0@l<@fd>q z3s$*=R?rm>r4_Ftm(H(Vtt@)Y2v|2U!V|2;&saC)FpTyiPYXD*M3{#j&U3{K4hb}X z8$V&WSLPwGoDdu`vj#5=bq-r?S`b0g#3_@?`#_m^otRd(NoA#2%$+*ZSJu>iTNpZF zPl-fO?!&NSLvn`u-8;J!m zZesE-w9szB@imOa58K&WIu3L(uq590)!N zE~mxO&xiy5qIcqmBmYa)rO}W4x6nR+V%0V33*gWHmz;upz3x<2mUJ@Se79#{cqQMNSvTa+*j{+37XKJiCx#h)uyJ@E2 z4(3!{-n#q7mc3WDY`IZz=JGbCDcH_$`bVz`m^Lu@10sxYa##Ky_OdH91j~>h#)2_o zJqTI_-MAh`&~9i@wUK_t~jPa|KSk8c>`Oin#9bJmF!sV8T}ye+Bg{vbK?($nY7TeV94ApV1#^ec(;KFH4a zAd!uty0~fAuClUSyYRhdGDiAao~f?jR*B8INo*`_j*Tj^@#s6QQ_(8pUUBM*gecmD zY>F7;VN1J8`^F9Ii&gD~U66w+w=twem!28wz!3Q%+Cr&6;N3EkvE6q?`y{>tuYGw3Mw=% zMnN~B56}6kd`y+XYIW4+TGsxKUO@f?tH%<=rO*Y<=72f@HO>N$q1AlgZ<}e~K5&4& zZ=6LRwkLz>LxDzRWJDjR-T=ZD;891u7A6`SC}~qSGqnx+|By+uK^8`~b+d7{#Q&*e zzq;Qh_I9>+upWdu!A9#2cD;u5lO__2e5*dK>ZX0r+R-W>1^E8O#l7N>5}Svl0O8cf z^rzzsdef1_zPOk^V0#7Hns+H1GcM|WX7y=;x&>xq*x}4_Fn9`3^hjeB@Nd;-(9Ed|=g`e%TUe{E^qG{)T7CJSC5i)s z0iQp7Hh1*wI02tFF2bRKrp_b^OSWzZkM!k06pp0Nx^ zA3gEKQ~z#%Yjo~}G1(K64vmhU{k=LRVt4F>%g9$=_cdGHXfOKz;(39osNk zbp>t6?`$W{B5Oy0kNka&3VgKZ9CP8^6;Q@q0c9Nw_`)aF{)|Qi8M9z@su-}+)=k}X zR5KLWw5_&omTmAwpz<7FJ5u+nAu-p2SA{iOWHHe{V46izv+?QqG?duqLk?c0(YX1b zSwS6r+}wOR2F)6T8K1$7S^q8T?O+XDSV-PXA+^|1Q?r{?yi5C&r?;dv$|9gcr?rBG zV-myP?`*-L+*mr_!aCeWvuAR_( zijI*RbnZD?yFX!+-RdsBs~=yMB7xl#RG~i>`_a3BgZ$^7{Ab>sfQ~6+-ks2}ZW?$< zyl31-^q9-hs%y2bY#c`OkHCt4KD-sivG9%vjs+bN_& zza02gdHh0(EAZV=QBkqMw?JK z>pHgiMLBkFCYzzQYX%%h0WA{GV={Ti`Bt`K+Wal=??$H-%l{IywX2ux8f5OfByH@{ z-&A6$^5o55Etxo>SRF;Bt6%PX4~G`8eU1%CUmCa4 z4fvo2R5<3MwPgnQY+?V|St`ErWcQut#47jCa=PM)RQ&j_sq4m%U#~~0y1H3OQBL#+ z&Qv$dM%NeB0(luw83r^k?kZcId30$Q`(>+n>cwT$Q+4}ZU@x}}t#{5mbD`@)Vs^G}sXe<;h9BLmZy?#y5^ ziM`23GiBKx)BuHV(r^^S46L!>tdTA~`#bqg@frH$^&xY*4ESG zq*IDN`$@7_CMzEk#}z5%DcA$Nhl%fc*26@MlCaBX!Txl^X!=?&?5??uK`B~$rtCu2 zsnBr$jiGaorL>l2C|jE)y}cl5^T4UYZk8URf0ylMC(Hc2Dc3-%t zY51Ahab68TPar$ffu~#{p=bs7HAWokygE=mpPp{!JWvW~4I)6vx zu`ll4eHn+pKYbC$#vOrqu$|qScWpDe5i7I$c@MZy!mV{?#^@$}c#-%nSxQ>epSiW8 zyfEh(Q#DdA<(@Rw?Y)&3?&YT!6l8PG&_6k6n6Ip>AsbX8cykhC4-TFD=vEwY{P4K) z1jotKY;`=6N0_QUp+g7wgG;y8yqREEU>mw9f^^rj3;e>J9N1-06-EOw3Xb||`}KK* z!1|U=UEQ2<*o!3+S(X@@ifL;UB?n3N4l1dm@4#{EX3SV@-7Rs}(Bw#WXWx!heY|b^ zk9TzrJ}}-S@tuk5l4eX2lOH`u*^Gq|ax5i9gYQ_MEsC5xJaP zqk~gs*~OgMw2!oYg!A*P60b@GT^8&lMHI%>DkfX>LFn?>#Ki`ki-W2Qrk75vDLHmz z%MWS!e{NIWCEdtZP@s;3Rwr*w&7bmi!PfVtsO(m+X6qCR`Pc{fU?+;1o-${0L3n;m zcThvurrod^>%aW+uxf%!PWbEl~vA6b9=>$$yf3%4$^FfxYs4f~%2%gJk=&L+go#KRHRJIDj{|Esl=;+0a#f6W@uI11QffSsMUh2NcI zW+Pl|=w3oxSl6mK5(_rwqrQ@2Ki<7(;r@jc#F&1NLY&CJM0$!2Q%et}f0UNI^ObeK z=1DP0z#gBZluHpSSF#z{;jbV049uW$p#@VwvW=yUiKW44W`?8L9h7X1m3waYC7;WC z%BEIN+wv3rIR#e}v|d2JpflCd27(!t<|rkk$>6h++2F~_Rw+C!4P)=46I3mci|K&g zf!@5!OfUHugRV)B|?zVEld$ zB$;`=h*O}!AxX}}Oq73BaVA~c+xIo0H_p;Ir^(P->%?h}zFk${88>%vuf-XL+PU)G zg>%eIFcQb4xei}(A~0)=|ESL)zK{b`X(9W2VffIY;SnA_*D(s#FCn3_q+T<}I@0Jld6A z=m#|Ksyx6y+JQ8jQV?gv408o;sGdVF$OkQy zi}})2oEG!xAx?|^{MM({sVkQ32_%7U|5^<@wC?$Hg9Bsg-rruOy~y3{by1UchfN`0 z=)9Q@@ciE6bYoqG|43dN$Ew~-@7$|7Rlgd|3a66Py*{SJI{G7jkC+zgh}{K?+wL!> z@y=l6jeKNCif&{~4mtwjLTptVnTt$^7)D;&p!!;0%Elfo$Xk>D-O?HSlyHo4QEStcg4#B-grZ zE?i!v=Ja8WwCZ~Hmg?Z)!&Ce7!lBJYXS(_ie`9kdSy&F@#DxWgKC)s6yd&d18SDr7R z>t~-nc5KG1ospBvXGNXg9=YkGx34aYp0R7gj_GWUX|y}Py}^v>`WW5=iE^=yo9G_~ zuXRRW>*+MQ(_wYy-kc=g$Zn1uyq(>LL`;qQk2@X)IBt!NUf#`gcB_tFgGOXH|HqvV zpez*fhu9zTr{}&Iq>njuvICDO#VIAhe$~*1b4titv9l!bqnBW>OX6Gz$Hevl*NbRA zHeoy5S$>n&(=qS=)^O4!H9I@D;jjsN-wTuoy{eCI`MXdM?0>42jGDTGuO4*KlJ;?v z<1RAKGS1-?wdA>2jjb&*%6qE$H|x;=R%q3yjS_W~>^O?M2nuWai>#sA zt~QQ^?JRQ<1NvB;&w8pFH0bMc2SRL>2~9HydO}~5M*x2Cllku|c$}TULGaE*ejR!# zbPHAR#u5``BrSq}>&2+b!>om5Excu}j@jtwoenh-t zzc_sI;Vc?8e0I-4b|dU(ug!sdBj~6EeXwtd+`dT>`Z&`d?u5sx+RU?|sKLMrA{&ai zRYJ=;f^#iIWSFG2GH@MiSnr%0)3!}rg39VkB;p;K;6#6x9M;yDJpYn@F`BsoT*YpO z4o7sX%m`JANZ9&<^?GmYSNZNCdUb&105`w! zuE92*gIzj@$o;nD`q>fgo4=Z>tnI~9txT>kD<-v~W2`}^36I9W4mCRQ-bQQC8WBq> z8yPmq2uXW>TCF9s&cZ4QtLP@E?nbQ+9U|XWA1i018X7f`3D)geMjy-cVb{Jk*C+ED z!>bv;HQKVmYqk_B4X7w!{&t{|*6j`3LfXyoSn+2(b_<+GOY1r665=ok&z;}sz$Rq%qeQl*3P z9EX7N9Ea{+BXqN&a`9{j@>o}yR8GOz=UBZHRNHO^;sGTN7T%0 zOfAA?S@vpvtUPADU-+2InRTT3^6$2nf4iL26<4)YVp>&5n@n9hkv88Ccb+q1BHc$T zzo+lil#v1S{l`S2PrhSx@DUlc1R)s9$naiyzF#<0>=%)z;q?&?6~3feVKlErwg7kh zfaY%8<{KDMUMLag3(&*MjudL7K{Gd|xJ@2evS`bW4OvfeV)lPHZRr$Mqs><DS9@>09;|{l2e8z(X-e0joq#bsI4_1iBM_O;6$4Am2W&)(!tRkp0 zg}S<;$lr2Y!*rCx5~e}B6ap8En|Pft25MezqGbrjPDCVj@!YwYS`F#pUA^p^huMJ-vCB8s0n>*352D|V>O ziDp!3dhw6hq|@)8SJQ+azTR?VV#$m?~eC|>hAH>o1->FJ~iFq#0 zV&8C|m>Er$ibQIQnNc&~W?nx2kHc7Y(!p7~rQp3!n)$(oq?G0Bqx}P?Iu7Yyl3Fuw z@us#lLk9Qq@1s`NsEormcA0WKxAe|}oV|zFFPRxNZ^1(O30XrI)wSKePBvD$%$Vg{ zRXTFXup!F>PCZJ%90x)NF|W^38{a!1t+@eTdL zhr5IgRI3lE)KhoW{Z>@EcgK-qCvoY*-TPLSd230$DLoQ1Dd5nS5g0Ue#F<|bq}jR4 z3Nw@QFP*75W20g^h1r=2pn+S6FkEiIim)t~0VN{FwGlo|F_{F+>~@E;kC7q!oD3}8 zTeg#Kkl)XPZ>q+f4!Rp2a+elmCDoo1)gIjCT>m|?rX-u}JS>S~pG z@&;*W7>^*&O2g|OC?M9R z<=%^j4Ouq4@Wv`nSjZHN6bsuXs_TtnD`yRazCr56*)v3lZsM8@DJ}P#+0mm9B#qAv z9iKDir}p1WSwG>;J@d|l%?YRVB|Cpw8M%4F=#0@z@2XQKOqlBxFd%wV$V{ga*W}1m z8-x94M9xk)zbw8qtVOGlOG4-Eox&TstD(SCe$kAuN?kBF)lEkRb+d{eq4DB(C z%Nv}`zok}Sbyq0{+0(D2)mx|)m#Q8@(lAy6?Bo`VWyx;ZgJ;Y0IM#Rk;wIZk}WsG!{p6ErK4$)mCS{)U4c4f?-dh4FTEtM5`g_D5PcDBQ2AWGCS87uDC8=Q<17{!`xgz z-5yZa7QSL1$kYFk8zKgtznq?3Uh`^(sHTFpp`Sv(^gi@oDI$;}vQ^ME2*f3PzeL=C z!RsF}4DgEP@@*h^_{kdKF<{UZpN>#?5RRd&Qj|BcDdIeDw z!PTCyIIQerc=3_sxt*-o-g(0MX_wAc?0Yx&@iyJ%M`uxIm^m*E7a(QrD|&C1_Wq;# zar%3~5PyU<+53ik8p!+>aV6MxsX`YavCF_LItGr;Ua<+6fi;SdjO%}d<+_YjVZK&d zcu3uupbHFihH&&~*F|mWnN9h_B4HkOp+m=i^-qJW(ljqh>s@oge z-%~nEraih_x3(dLNO@Y$Z{NIQ4=3_Q&U&|u;w={|$_A~c4@l)|{AItIhU2f*s|U>6 z`Q$B9_j1Q-RRqnb_@!bo`E;EWq@2K?WTlUkqb!wjKw~VZWmTPKh{n32{sK8lg8ZWC zOG_MU{6cAmmHKSV)vNzrU+)5R5)Ksk6@- zP!_=V-s@syKDvCPn!eQ}MsCGM`nM2Sq>z{f$%8FocVQUwdozg9Cj4xve#q-SXm`<| zoxrle`Z43gO5s9@Hq-@C8By9ksWHBp3AU2sh1{e=GZtRY zOuM$&r>bo9{Hf}P8Ri29Sy_5S?_AdWm$NsA?JGOK)iW=tdPRBCy-oXnS(Zv#eDaVu zU3BT}H~_oqOYEv%{8S4vz}kK^jqv2X%xOW{)hI_?P6DasG{nWx1Klt}dku z!`_Pa7~lV!?Cj8G-n8z;+!ZTT&fZJI$1UpGI&I0kJa1Low&vN!#&tiAj~G3=bEe<4 ziTRe}6+jkUiTMWOh-yxz;cI7`Oooh!byI;?vh zMCvf|{PuZl)wf}laq1tdzKz=r{xdtPM&9J}FuXC~M@02_3bVtV1Mpt32C6(z%lv*O zeXledO05$=uK4?_18*m8OgyvitG^F^6ihhR zI%Yc>gzR;Vhqkzk@@(v~^d)1e14Ba}&RcXQap}~+6~U?Z^2`4h6dH6arMNgZ^NtiZ z*?)X!|9&w;eTSvZ2%q0s<1sgQ{-)qb9`P>2V#6nmXX9Umie=|C+A_W)@#yM?eWR*Xb8?z>8I#}UoC~bmhx5DbXJ7V`Cox{~_l=u@cPAK^G=un^SOUs8 z%AvT;n`!b>Sm|ivX7Cnxe_`YCFrY|z!Jz6=2duwPzPzWEhK5|UaiNrormDi-h@HVqkm@_&Ixs_thk1eKsyXrRS ze}--+W!LH6kAY_*IY8N3{X%)H&EMnleu_)P3$zKa4w|3wWdJLd31c&|(f1(9byak6 zht>{W)BOYNhB(=_!r4=_Y8TU=k9?jx!6Dw#J^tbja)9B0|Du`#9ISSROqIPo>ZSP4 zLYJvhwGH0Y%UCTn`=sipX81&k^^Ty=zxjlrljI4|EE^pqL}-kg+4M*KprS1``T!cY&e&jA>5myo ztu{N(ba`XZfZ?mBIZf@kxo1?rX=&ar%ib6?wahq8)oD(5JwLOvqtYNHl*(7CGa8>}q}T4NOeEyxcL&6kDRBP?fuFHrC^ zJ3f#I?W-oLF?FWfNz1LIrT&d#wlEkg3S)hNH~y`!@e4N26y582d?2}0JFGwgELZ6R zu3;Mb8nr|7zDCkZ5RJ}8^$77Q-l+qv5Krt-=vg0a)B=9#dj@eY<=&6>UI!!kd@Oud{K{Ry_*Z{ABr1KuLf{$>TqA(1jmWa=jkgUB;xSz(d{pxNiVgP` zr+!vIAJ$6F>xx2G1#JMD;{jV&TWk{`tn&!ldS;GL7bQ7@a+VJyg%I5 zgf#2tUwd9S02 zHr$DSb`Wtmiy-i&0-kti)Y^!gi}Y#d>)-u!>D-;x8atmEK3-j19BrCeO0GS6;#N_N za&X`AQ^({@^p`_lu9@Pnpo7P}bLFIh_M?NN@|LjgdKP0A6&S0%u)2EAK#75Lwn`0? zksfx=y6{HaxwMP4uA%~8%d)i_HP2%ShDr7*Oj%a!EtxAg+d`8`f%23lcAPkQ5kHFr zy~59H8uJrM4Yyt~JFl;-vTiD#S`wvI(QzYH&N><#>Yp)c**6NT9zmSm^ zChYifQSuim=fNKFPQ5EDvrg~t>lE+hCGNpu`%J5a_^fpOV0!P~4XF)855mYwj=OKq zoqvC4^!btFeDX(USGA&T$m6!#SC1<62@Slca?bv1-@e)cZ_oMt`|m%Ub#PDLf%As) zled3@ckBiaWA;4?>~;P#KRx#*(^&QfLowUMfq)Np8-C17Ndx@XMj-K&;t2{F#DsL0lg+maL?Y>k67Vb)yf-lZb-v>8rlYh`IXrqB2hMY68{`5k zW!d(N1xw?X5}8)S%#Z)_0!gofhS>K+-Z&{bW=dAa-eqyycfuX`p92kM{B~gXA>f7_ zR0Dj>S#+|6x&5$_DN`)~OrKIhIIknW8y7(QV@v{%Yf6J%SHj0@wv zA{`^V$^$db&563e7KyKw#bEb09C{tzn)Oa)@1C>0yt4kO#HDV~G)NGtVzFY{owlEXjZN z0BZU?l=gnMW&g&C(n@yw@f#S&CWc<48EvHnDrtgpkbFX&_@BSXhg0cba%CzVNDi!8 zg{S}li0U%N(7;=4Z`4hAYD~6Rmm!Xu@-9OSF=z<%-$#7uyW})|oKW|4Hhn_h(ny_~ zD?L9UFRtw<8M$?2DW)=b4Rs}kqgAJ-*3ICwT*Ghh2dljcJ%Fw7p@kkipTc(rYyX23 z>u$spYS~!V45)4Wdowe=>QrJ$Kx8PbB)gO&@&G!lbkF~vxA7;KtcStxS-@re z2d+c(o|Q2sCH$Nn-t?`}FDEeQjOab!*q%z8!@Z zQnylWwP2>1X`;rscmKLMY$T4!I0s%kMuHCeV=Gp>z8?9d(~x~#eu;%<4c&Y!L#*%N zF*bG(S$XbxNmd=^`k_-DmS3g?^K(7D^5@OV_Vmt)AM55eX6#UR8lGxC zV$n2hC*R}jcjl4|achORvLxr)-A}JwyMOx{)0by3*GZ5Hd<%~28i;}jE;}o`->s^W zzA#t5l%{57DG+uRTi&GM^4EBt$xsK@)f=Tv&glXy?g*JUpruA{AVdq5>^?1cdgkEn zE=QM6%o|hpE0AYetmO5p;R8Jas&#Er))?*Dw?gLtXkGB{ZO7Cj1o zi>+HcdixMVV%?6jb;F{wk#A$!mgcCxDoeo4q4kp$|=qZx=HhpVwWCUu?%sD%5VKEoz^>y=DO=CU;dR*4hO=YB#l#LoQ z#y??PWEp}swgyS)^cxNB(3PFp@Y7#suIuOHwLz{8EG$tJfJ)*yL`{R*u#`6y9|`r# zjLh6RGWT4HW?5Olu%W|zd^Ts$2XJ%y z;$yMWa;b=tu>+G}2RyOP&6o$mQWnm{L^7rcM_Kizh9)2Dt}(@bY#0>%Og$rl(AwJAQWb(&|zr zNBy4Z%Rb=U1ofv4$!>dI%&xA& zO|ti^YW7#drkSIk4^$c3ErAvzgXpH6j!m+%WMc8QlQYGeGsfb@Ex!Nw8Y` ztID(T{NRfiyqw9CtBgK$%4_plJQwonJ`}Yg_MCy%P zGh?TCyOC?i-ir>tH$d9~&?fpLMP3wXQGHgFv(-Vq7reWdMx{Ddd0man=+2-o-aSCx z%F6Kzg6iN2(zll?J*E4zuIUq`I^IH}cm;?_khnQrGw3%aXB^6-c{my@nrC;R>ux=V z^sVF4C+Y?)_swH|%^)Z>e)kr>iOFt&(^YGXaSjGfvKt(n_U+AiqQk+ZAqNq-?`Blu z$LntVD#_As$}v)uUQkR_h3m#-`Gy1>MGoRw<-w;}#PqLDea%;^o2l_JpwF!DyxV7R z(vabxmBj;{8Lbk!yBV$ZYzD|QptlrI!gq%8Q%*6jHmHBnd5XqQ|6*UFUJg6a0(|D3 zdyp?(`kieScEv%H&b@xKwx$fSsVB4N;HCg`a?<6g|N2|$kWjjtbkrX<)SE$Dn zzhPTS3zx1AKbo2Ge!T2Mo)%^(r#(O!uMMypQMDBV5UqzYdPT)R(92^TK8tf=ZulEF z17gPFE=19}*O24ku?P{lBw6UEM)x6-9m)@_vX?KXy{=DT)Z^7P+-cQsI2%KTTniKb&U^(&A?!}NSGCabhJx{u0^wVH}MsjfVEuDz4$ z2Rc%o%aO#8a(*w>{q9LgY_+ua*kgZ}fn%&UkM(8!5BtJZdyeJx4S042-mHkbxs%IW z%QljkiKU4=CM0c4v;89m_aE7d_eo9Is8q%l2Ze5$GbOgCsojL(6K2{64)jhK+Sf5^ z*3SK%{mYh050zfC68!dW^iM(al<%3J6I8iRckg;xG-X)!kf}F6T5~)iF?Z^M)q_Y2 z)lU|+!O%SBpm#O+fH)WDb$LD-L4X5q_2GM&wP7&RZQ0PrhmwkV)`7WMm4P$vd=R&M zb;i>dpL~_FX!gJuPq!(qYPIyI7(6rMaQfufnc?ZXx6NB;cQV|=@4zNd1}>FBLi=J= zZ67zjrK9c4!$0_FW^ho&tqb3izHuwk)9GFk`N`K;PEh)A7xD3Da!krHwb+ZxJJLDi zx;gD8gc|y(C0hqRLhmNsH!^EQZ~=##bf_5{j|=G5uY0Ff-J~`LFI%>?cMX-^4$cTY zIK-o0a6dFes@2oVE#`OfO1!X*Y^Tjg9DQ;0n>CaB`V}uAK`rPZzi30wgN7-fVGoxv zrq^ANRMh6sM33BSD3JQl2e<{m{?Ov!tg(lNcsT|;sa5FFn_5otf_d@Ho19nT=~RrV zw4g7V49P9YFY-4$wlc_->)PXRmmd4pCjagjPUkOQvUgOJ=hD!Swc(qxJYol4GbQN( z?=8OfEC-qL5kuph`i?tN_}y7cOVTr&s(X3klYnOXpJZTW8qCZeGvl{@;H=i`_=%1` ze(=b~MA|>2EW9dev`2!kNsSHZ?Ta}fhv>t){g|KGI0kdmd6@>Gn6vED@@8i4y7kE?QQ!Wi zEbs2}2`fFPE}efSdH(02p@G$*De22%rMSHDlfq+%xx^2hJbGh7Xo9=kW!|J|t48<^ zjp^4vbiDs$=B-kwjCKiQj^H+ZL4h%WAsr2|bSeces-+iFN3|=t*rh<=lkr7OYB7>{54KcHn$twjP zeEQHJu8=l-7r!_mKIUj_)EhC!7n6#*njcE3G@R}{r1tC({6aWaB8O^jB3aQ7 z4jv>!4xRj$T#`0wfV!*wmTj8<$|tP>w;ixw+OsH^)hR?VRb1`BO&aq5$gjCqtqfin z^z!Xfw;n9GyO|EJAqOmwLyqk}b>jJqLz@B+Fi-=>Z)`>fh9ebw+&P*CGXf8RStXKWga2c`T#m9kf?G!g3*T>UI z4RPCl^%suTeR33`rj)3Q+t6RA4>0jPYJF}q!JbE{s}mbP6ins*}W7vA1Fuzd5e z2bIVAZ$;zO@gmkzSVTvW;}ZRD{mFTL)kT(GvB%buLhP_d1xWEu#vj%w^9Wtak3iEL zP!|L0nt|uqe!>`-Oi(1uC2uK*Z-#m!qYyi)f$}-z+LLz8?Oc4Ka}I`9Et*easkh`^ zcgt$HN8c9oo1dEnc9FiZ3NZe)K$d@4c`S7tnH;)n+0p8($h8vUy#iCO#JAVfjUq=2 z7}*6h1bcWS=!pY8uZzt^@5I$Ay1heN2TvB84{_?=+D7(ee#z@Y^LXCs0Nv5(#v1(G z3(}jzJCG3t;O7hY8Q1ecm!MlicSj%lncvYT>7Ivd8bdM(im${*x{Q6Yo1BlMhoxPt zg;5=~srC}X27T1%j=UoLY{Rjq^3f{sGfvcDG*|%OP;;n!zRZmg-#zTJc39Q%XM)~PJ((s8CGQa0{bcX-d9J<{A=yQGObb^xoEC%_ue7%M^U3%~yn zSoJruf#UV}*&3suR}AaJ@Dl_THbm}8U8D>6q}yir{eWeSE)g)twY?R6_M+a1{?lyt?q;MVF?vc`wc1X<#>FnBAD(V5cdh%n`I#FV zs)HC+UKka341lT>z9#TX_z4)4XQE7yz=zJoEpPZ6#{<~EB@J#MtGqw^NM23Nfi*{d zeMVNbUVU>FQqQW=ns#zX-LZCuN^$eV%L`O7rz^p;X~4+7bPP-C!_RY=TC#w$;fyeD z64J0wn7f)X7etyIyMAQ$3L5!GT6XGpTgtyp%}@Q4&RCHdv|jZ?;@?+(r%yar7YrwD zKmQta={@xF*PqkBd<#~4k=DOo`8$!#N$k6H?Fmec#)58U9It;5lyp`zIA(`Cb}jH> zAO@cgcykVCJB7h_a`;9rzwCL~Kn}mm;fLYXgz@JgH5`tvT;PG+VMW>VOSEtg4o7!~ zcwQQ(g$v(;?+72$?_L%D>n)DPA6nxBU3 z2V$gH{*;J*nVZh4m?@kJ zCKLR+dM^o<9*ujvW+d*amp%%Zl<2f1ZvDFv{$+J1h(j0p>y8g+`fg26-V{_y$0yrI zhB$h9_VL*BOGWBWC*n#|zbq+yCv{NY@We6kWv~PaX4?;AHD|d3A0*+xFBE;ucnwBg z+v)U8n z_Z;f=4(Yz~rD`zgg`*&Mt!e{R^3a}jkMJh4!5jzEd#(95NZ?xAARILV3Gi*2dTYBL zK2+}F+x6tn4`~~z!)F7;jWq*3@O|@QT<@j(l0Eax^dC2e{EY&wmDt6s15evb04c;6 zW>^=nOtq?&m08arR`jbQbmDmuc-J9#+OY1f9aP`Q>VaNLnf4BeVDeLVv_s35*ezBZ zBX)~~^QqWH4hpKlkU%~XlYb6}{6pklYrQQ0Lk?AK>-Ni&d<`Y>|AX-Y756~hB(4|7 zgE}IV{4=E{ghqReJ~DjsLjw<3H~Bz?hyGQ*YxirVsQC`&zUZlij4m&cJEC zZ@w|KjyHLJgs$06pH!7x8y4ZVF=^4+`7@8L2-zJrF5;p(WjB5QryuEid&4~!_Vu6l z{O0XvaZYXveEcw??uJo&DHgMAYy2I)UzFkV5q_f`8>B_*j4^>EYd|5reba1psGS8eSRX&W?`ca@W*qIM4+RaCSc` zpD*r5G8JaP{yOh2GASeP-iuxcNm}=O$X%> zTjBcZCh$(m6$Yod9L{JK&v#ZvvX!AsJ9g$PFW_CYaAso+;a19A{`^S}XOxTQt(C=m zg^zGJTQOm`?G$c5U$N&7T6+$=346}yXTBk$e*>oz;CY z+?&9=XyIW^;8sd|{`^c1XY>m^)=GB{hn!*Dg?f0`x<8mCQV<7tvL4>8?g^LNsT|Jc zEBp~V1)(eW-_%cWP$ zhOgs(4re<@z&k1LGfhL^<#0xifOl3>Ise~k0`H_)a4TgfhqFY%H)=+|z+9fkjBr~E(6eFt1r$M*luy>}Ol8bw4D zL_wOUh)7wK-bFwVP>OUZQltqeAQnJSYzU~>OEj^?*b<{L<(XnkqUm{0V_r;*(bSh_ zEbLzX-cBN&{vHH6_~qpoIcZR`QJQ)84P|2FV=A{(Qa?}5Lm`gw*w zodZ|MDgHAx@OXwlXbd>*TM0f&^$o38{gAQsi$fF5u=HPhXt)3TWKr{$neQ7jk zAct{VYrSC0MMD(Owr*f;a%TBypGf)5RDUoUyZ3;P(!eoCYx+>i-_<8Q;F>-WAw|38 zAES0){7P*;i5H}DEYwbnHW3UC+Gz06_F+R0xTX(b8#Hz+XBa(mk9X?p^R#yTS9i;IDOqS9QVv(GBj?1xK8S4j<9G3;wze z4y&NN^S0m%AE7DLX`t=FAi&)L_`-6YogF=WoWs^Qy48}cS0Dlw2V98>^$EtxZ8~;~fUCADA?!WY+2! zGLQ^;O0}W!>Xi>)w@i3?<-X&AROfsFJCcLtSJ??$8Xu*>=pNTtQ8kb)%S+q$ff79X zK#mJpaHcSNb#zF};?Ske z2O3OF*i=&gT24rCna@@G;U`V-yNX z5nTSuaa1eCfyw-HN5sep1IIL4j2LQenYysr>qt;t@i@WNR%JBr-Nxa*yAOn~CAQ?r zPp5iCi7N30Fajr|GQt&6pf;M8(o&^$0_jdNN^xl!NV6Jbq&*gbISiKMZ4a6qxF{$t z$8mn#s?+g4mCqGz`nY(`#)N`7^A0<&uiUz7^_FR?eP6&Rp4wJB%*$nMx zs^%mw@tHC;cf55}?DRRb_AkT$*p_dyJq9KUnV#88eeGRl@lcr(^s!V5gGT&Qyx!*9 zRD{!Jx9~_z9M1O3#WnI%+d2!fh>llOs!xhAf_#5pFxl z-rRA)GYxC7m@($)69a`N)ZT*I^X{Ohp)F$sFs5Rif_-!JKsr0+XwC#&_8P7_Hkldi zu>f}+k2Tu)#IPY;;A?{O{+5nnW5K>abDbskM&1eE;X{3cOy?xXG!Yx@eivz9ljf9I zbTT_wnMg;;xgn$sF=dmu?lBt&)c=zEEKW$Q@D~4=Tj?Wk<9Tmv1UxMs`|-B;^eg8` z+>dui%vsgDZ{9C2zt1ly`Q;z~_@x9bssWb`V_si)P?Xy1)=Z=*LGqQjV;H%g5k7wI z1P7}P)7Ky2H>_9Pj_}8Autrw9H-Jl@#rx^F3uqwr=de4Is6d#+*%2PAY7$ZSjq62k zV(XXYHEmjABIh_E^(jjk> zalloN_0ahs7;M?AYHrd#-MD2 z1pGEQ(vyitx+{RYRQP60bkLrN- zKa+smi2NN9`px=_v@7fb1&{cBk(}a+5HMB9N9wh_pVsIww4sjnk zxOtT(lPJ|D7mrDnwq_nFQTz#2B!7aa(m0d4kJ!vFp zI#{yOhtfM)sF4mSJcJ$~Z``%b6#k4`?75;#E9hT*9#x^A^Q8+Jt6C7H$h#Y&9p$ ze#&HP$3-U_5C2p{xrNd(MX+an+bM#Hv5lQAb3nu20pVkZs1Z#}2@A908cPYEA$}E= zyuH+WO~cAn@c}DiD{|j%-uP~A#g_s?^41OGIP*FC>py(w-H#5xIfb*o{Pf`mjjQh+ z*!No_rQ}TP4SaxpdV-y*sp%K&9n%C;Xacic4f(t3#ZKXo?qCdVK+UWE49i8mC*+gQ(Eube0;5 zbMVA{niNBrwv2vie zVmR4kB;I(Dm=!$TDJ!l#nl*?U)bz&u`jqW+#i7IAfBT=WQ49*ixwzuhN%ka@8W6@N zU>uA$I~(=`K{kdy3l?}~k|hVkH?sV)=O!t6!-LquC!Rk*>aztWpB>kBXR8gYxE+g{ z-&#}X?qR0RSgy`B<9>&kNwoWnq`jaLjhrRg(RS(<2Dn3&)e}t3j*Ku%y|ic7_6u_l zF4~Hf*Yqbd4lXJrLt5%Y^^Ue14NrEfPMdO7V$4cEsY6&8ZsWVHJ*Q@{$&!q%t)6z9tgHu&4Dj^y9kF+$ucxQK z>65lLf_bKR%#qH!l^<3_a#k&LXrVaSN zn90<^coPhP_!YS4aTW|VVLp3M^cgeOJ;;?`q^h%Zp2ENR@Sw4LL3rc9f%3H+-yiS4 ziV^9`#yZ9%-9bbn$ej&{oDLvN7__rZUVY|?C&)kES|fUK#pTJ0C!RD|Grt`-l~`yc{&7 zzS0EM=K=HvN=>cchCij0&K8ZIcO!_c||oCwn(F~Lg*$RX-S0(C7+mxp>t;)498N4c{i>>iP07n#3)lx%f)n*Y8IeSCL7_h#5IT zX0FFzlP$q&jSKi;FpEBc{jVRtkF$jo#14x;21aZc@X|1#gAz9w8_?|?cD&)t1vY_J zK9fCykM0o%UTh>M-fB2ho@_7>$Fej`bW+uoCm9UD@5TvJ#DvMC^66%+Ulm_$-bUIz zTKR%$ZK_=swe{9Dt!wj!wy7GjSy7ak58=kA)UENZV^UjVrxqW`f9gV9;+Au9(d`+^ zg$c9Ey{$8nJ@W!Hh3vP^;Yf{{6<%}O3(N+_p5GCFurcxw@%!=};`mNh?OO5b_g{1t z#I~f&+Y)18Ii+nv%*h5HZ}9zA@Q4$zgkMgIRHSRwP*2!8vc_P;^5hLO)6?DCEtpsSFff&llSz;nctd3ZYxI2`p(jlM&hV?>Ceitgrc;j z*IUzeB|j%#ydvh)xJ6!;fN>qicJWB3tV#C)YKEGf9gGU7#nd{WdN0AKH^E1V>&LnE zZSUnSyxbsfUbAlPLSg+X9DUjHPVU0@h@l|t69mD8ulsh})8AE-6$Wp=boxE6e!1|@ zOE2JCsJ*@Y0N}5PBLY|Y9Y{Vye;I-jyO}(NZXVMmi*5dDP6d{_In{CW z*cpp5_)wLfk00Oa9=^FXeaT>x>ZFzp)7=ZljOjnpTdDLMv2TQ@+f;AUL6#PLea*lD z@)caaoDA`|!{2M>S>d-sWMIbp6Hg~f^Xw-kKT6Z=+-FYCr?jgEu5=8@;YF~bBm40j zPj-XJPrlW77);I>8%$nXp4{(=f&Do!`CtuKueE5?adl+CaQ>a%T>X+bi|Oh^sQ=Cn zh8Frq2?{`!H6cny3Ggjt9Q4+Zq0(f*xSc0Y+NUI!w$C`|P*t*S#c=g8x$WxM`ljVe zT1yUIeShQY87{fov(t8nvqo8%3?3T3p-dhfKf!3&Om8l%Ju&mMGtZsB@xEv(=lYZW zWYCf?H)p@vo`8i#-RTsg5VO+Fxj+XSwNWHK9?l(j)NaE^>@LK-)bqRv?F^)Yp|5Qz`R9dIb zLOw%`m%pic$Sbh3W`JvcZLI27zJEYfnTIM(GfEQB(*jDwYJMEXq7@EOevFBfz^xUB z@8iP0rG`@cS{O?2tt+-)KBEqXQeA`G^Dj&#v`Ny6!Y~(0TG5Chw52_vrmJ*N&#t^? zZ}bHnwW}|v`6wOKyQ_rJ|ItBT=z@;<4pa(V3 zLJh|0L5;Ogg<1!t`)V|FkV#N@JmJ~wf)1-@wNWTN$%^H*HL(7Wtq}H^X4@-GOKV#L z(3-9+>b<8+1I2r!Y3Xij0J=Xi4b*>R8v39|nzkow4bT%k(zN|yYk>afk*4hxTLbh; zk2Ed4Z4Hd{+AitYw0)AEJtB=#vM1E^pE@XQuawtpSYOalY_FMAf-bLlfi5p?om9eT zZyl8K4udN0Tj-#)Hznu;29+!Timzk=j9};1^n{w8rX@&Fii4Eb?AN}aqu%KYY96YC zQhcQnMw{uNv>zns7(FQM0SRiM(B-9VV^GC?wGK+#CP5$QL1{lpC5+QS1y>Ces}P-D zOzKIk)0P2lSF<&NN2J>Jk*cL4I37jzELoQdYW7OiQWaeP>*G>E-N(EOD)&m&QX9Mv zg}EnITB?Kl`$*MNAN-GC%%1ORDT@)%jT(~0Oxr72%p)vmAN7Qqw(Fp@^-^B5Py2$7 zVlntq3A()I4!XRwl~M_#+0I5OFKwL!9mAqCBq(i_1hx2HR|4fJ236euN(ZIgAE< z<&%AUCQtJA7B@Ng_&7NF`X+oAEZ#lU(@!mb)n}4}udl--AMH1pB!1(6U)`^p|N6hd z2lf@;3m;OTL4&*vTpaPxFIT)9GW_r0lYQS`{Yp1exx5hQX-)8LO5qV?tLfylBZALqp z<=GX8Kla2~_@|eHqnDSXgO~Q3Or7lHILR#}W3tl(2iMqH>Sg-qgUgwhSwVUK3+7Q7 z;X`?;C)D(e4odl1%4^1M(~$D&prbDLmDfB>2c^6(l`wj=4odl%LFu`gT{uvFmY@$9 zl=-O{zF$iChSR(~p{7g&lKfb-ZIW+FYFkgJ)HVr9TOs9@+SU^)wXG*qYMTV5ZIeon z+9pBixR#(}%qhMSl#Xi&YC+fCHBd?i2G!6(%1h}WK_xm!P&%%q5@0)al|aX}lvk~T zvT-ft1>wNAQVH5|?eh3>O(dTw+?v{>9X0-DYc{%le8e_7aKX5V--U>Oa@%^kp&vQC zH$Tcf{oi1Sk^U$QNs|UKa*2+2JoKM0{ux3({5u$8z>DFJLa>X5+OZ$}-;RBwM^Kft zPzeChM2e`en(XbZl>qrx`V!#do^AMR0U!=~M03DBl7E(t7s)>>jhCKKX}m~KI$or_ z(s=0!mBvd?s5D+AC><|S3DS6xpme-QP-(nKP&!^Ds5D+AC><{hsu?d5l#Uk(DvcKj zO2>;-f;3)eq!>MMPl7^UkS%8;hQXO7L32a5!rw=y+V+vEr6P1IObI>T)un=(y;8MQ zg>Lox<5EH0$Gi(F_e#}L8@ko#-l7Q?->Dr0GwsBM`f3d=ab+_O)MvlkjOaa#6sGZSjppc1GXBb}hDdQC zSve(duF|cgMr6m}-23+oA3H0${?W63 z=tc|f8?qIv_jj-jeJdFu&MD_@%h^p}n!7pGCBpQM7wHErcn0OsTg;^07w8m}L3pfh z*b!`QS|Xkvv6obm4AZ?WqW5xg4reG^ihJbgs*|`8Fz?~+)k0*)3EDfA_%jdX(6h|U z*lsPlXlaG>_n|lrr&~D)?Jk7*<8WCXloIBx{;tIrK}h7Yr+%(eJzL57N4KOdn3uUJ zR%~wOU)+5mp5AkidVWL486i~sYW`9W^=bE7@`*Zx);CwWI|CFkkXgtkf)bSa^g}&A zSY3oG6LT1I`a%aAs=rZ;q%2=f7UNUnR+E>$I(6(B``n$2c70yF@aty|eqDNc>vPAp z?LKsDn;>>%3OhP7xrmlO&P_84ugjXA*An&|@%;2d;(vziAR9)k#LuCgNn1g{*_00Z zK?l0qb{Obj15 z(h@5K|Kw+gW65=6)k^ZEn9Dhc)^+3y+)3H-`sQ_lZ^tFU4OnjiN1K78=|0*qz+LYi zWD^9D4I7QU6Vlo})^F{&_%FZt=F5NIy7lj6EfxVeA#}FBin!3JRkgaDjv++Q2?KyJJs}h;bBJ}Yvmw}A#r<$l zd?OSa`cA2CfqgFub+0WJJI1YE4ZmLnhQc*q33m!?6uR2L8PJA$3z9pOYTle#?b%HK zjXxaWRvW7>@A!PfEQ`8@*|mOU(QnHaWgaU`eg5Ka+c&Jk}9MbHl=0ktH5a#WwE?TOM6z zJS$*PczZ!&Ltt|JTk=K8J5yp-#XqTt+?c=U)x!9+q@chpwHc*OE1e5wl`i)2&540T z=jbUt=*vZ*3}QVIy#{Y2yJXaevtBEEk?I>hCEmq{Qx<-(Vae-J^L;iZtZMf!3Gzzu#NL1g zapu^OSr=BX{-88|W~Q&tfjvdbl_n+}L^F}?2EU91j*_*gasOg%pDk-JGU@CfiH3BE zVW=CoJE~!tzhmyy!fi7N*U(;9=T#V*zu#F1JXV;0JiqL%MN5wrI91+~FS55QH8*b+ z@1FJ(e>%6Pq|SYLW?NZy%0F7$ua>8tc(C;w67?d*^G!9!2zHZpQ~CpS`E z#XA~J7G7Mt0^D5(Y#o5DIpUk$K^rXMb_)toN~^ifm_FzoEr^_C@se(Y`rH}Y!>r@) zE?L;Pr|jdF)(;nKsaa4IQN1xRtaWinWy;eFre=6o7cP5ls!Q9#)W&#w``PuXhsg!gZA_yU#g#X1 z{0!&hmrKza6h}^hdzIX*-LO{0j7teIr2&mSkk)0nfX#2un|)IJ{vUR45TQZN6OYQ& zhNhJjIhzBB*U|EYC$kp6BQI}KJ^O+9<%N3J<;pF$kER`cfA0QWJ2#YNw8WR@z0uVA zPEI!|V9KKTdP)J^8Vt6gqg$!9;Nqqy4ch#d%#N$}^Q(@V8WuKH85Z^kdGM~d2;$&9 zb%huh?xu{0P`ZWFSq@`R2oh;9n`SV0*Ts`NF{m;G;75~;#$1cnq@2hH$ z=vFT~MF6se?qQ2{#wT1@+^Mo+QgJItcNbKHN~e*ExP7FjRP?NUIcJ#fimL~>>|v^pj^17yY|^+O zzBRNk=8{mAv^&c!d%?1uSc1Y%j4W zMfU1RVf(rhiEV`m4G|?DY^-`WBG+eq{QCAStMi7LUMz^4n;zo3d1-xB!{UX>3#R(cpBVv))O1b|f>3{NX=u1kY~hVn?!0U#F%haf zR9osQ$WqleWDVI!F+bdCA`Ad6|DH7bVubqNZux%Y$J5I{TwC|b%pC8vsVjE`SIqF4 zJEc*`ZV+?LM`XUda^*XahS`2T``YtrTt^J&w*UVn4bOBM^WQQ4!I|cW$h36jzY_;; zB{$WJh3pj_lU;4mAC5<_Bt5fg-KMmH&2!TWFD$LUkpKUWRDexoC6@AQ$UrP@Lg^Nl0*=tOjB$F61{b$T zQ8y{~NA!#tvC-i(qPGOC&dOdL9K1R^YjqIuFH6fV%q`9-O>9p}YEMksoS3i$w>v@8 zM*?3LUxm6&P&2g)m^6eax0SrJsFlz0 zYh6mR4Ar0Qe%9Y>>g05Xtg2%xn#ft7j5MFh-1Op^6CGS8xJ9gk%88xQXv->;XNU6G zTp+0rXoXIz(n>&$1DMOLYVwVo6T7!1YOhz)q~fU&GeSa=2M2luR4L~>&kWkktxt<~ z4Hz^iV0vPSn@_mCoy+(s6Ju>0;;qNUOm(ESB8rw@&22{HBuu8~?*lQ6nP$jW9;k_G z^GqB!PdRa3fbRU@u`?zmB?}XCXZS1#!sd>=b<;!JirveducfC9 zwDng8h5D0whC|Y_>>S1?goNZyP1u^6usP9ewD@cESRZ@e$?h&_n@{Jje2LWe8eNaG zUx%9)3%DtRr;!_rGGsh41Ad!W-;ZUwyjItfbQPxQQSUtTJUcp(13zeaIwfymwCC)( zM_V>OjoU$ecU9GIDXU0Z932ytAbt=wSE=+54e=*;0(=yvVLpk43*x3m7#aq9&q&J< zTPBPjV(o7?aS92sur)Nawis!L4&;b!=UsjS@L{(BWVyL1yKz4zQn?YrDYUvBDSGy- zt#d|@|H9zdrdgW~bcmg&osw+H?5N5)5L;eZsF|5J(9Iu|b~I z@(SdElwc4g@>H^NASD=NT-RHW5)9(Qz0a3mZ>IqdDZzb-y3CMg6Dt`~g5|-wC%=I~ zASD>YipvAea2`>~##Jz!D|k!cJ|Gll3UT2ofHTcQai$PEytRr!D9#jOgFLI{R62gU*W%>w{yj1OysA8F$yCfFh zc^`V;SglsEHjlZ4rxqXFLTPU#b~tDallB%!3OMZDTu zwDFzacm9F<9wlt2bgNhXHwB$PL!_3qiq_O(GPi@K9e-K;P5`OXfM|2(7A1bXHt<)6Pxk{$>wV0`*i zRg+KDoY{L@qxN9-Dw;ZThOQ%BB7!#Y2@-0zUK^-IjfiQ{ZvL3iLK8F-n!WRc+1d%M zgVRSC_j6na=Y6K32zD=a=lJe3YxikuG^3C-koftJnZkNdtfTK4jqltCE*qrbGA-@; z)*8TkkHaj9l1?4r+g3v|hp0d88jRJ)mN)V42bN&6O|Z{^jfly1#+X9#t!A>VeI#Rb z-0Tx+zVi~OcT3aXGyco|etaXG8F`QX#ZVCJ|B~>3!4C@_(Xz8>**$p$#{5uv?iS;V z?nC4+dLfGSg0qG{U&YYjt{zx2tCi6{WV)Z1R?#_Q9&VLgC(+(Qk2}?C`a})h=V8EY zyM|}&s83#xYq2AMs(yc|3Q2-{mn1K%y3``?!bhn^-R6q#{z6B>oe9A4DTd=%#43bI zINChE&uR4g-@!eOk@nrkQS!NbkhfLp8QDcoeR4KqUDEWySoj~OcJGD%PTiZvgk2Ns41PkiM=VwS z4$Kbs^xIWkzqzbDU90*fxw!{m+;$f!_y4{gDDV6R{c=S!VgqC|Wr-5re_KlbcMS_- z4SSxAVkX7ClN=$%Lt%pq3G{>wlEb9z9`17nqvL8&8@(Atk^+JsqWO5!+d5gV4G4pRVDpIIz7bPBA|gDd zMv&&nsZ%2&rcR9{Em~Nq`^=f{QzIj%_V}hW`4BY0k{xPAKlmZcT_1PugyEK9>C+-2 zrcDhG#}aK8zrCYvrqVq!(p@=|y)Bk=U+}jyZyQ+|b$ff4>FXmxX=c35^;Z?}ZRGk) zcV%Rx(w)97I|UB-3Tr2ly)Ui0@y3{uUA(bROXE@LMoccQ`b5g~{DRO!A$fVzS7n84 z_Ff$SaoDt(GpD%&!$tAyBGW2kBJ*N`BGZ>AMkM;rP7aEQ&q?iAs)x1gBb=@$1J(nW zpFyv$jOZpK%`yn~uYlg@P2l3nH8S#rhqs~LkVaN-+$WV)CsIT63#Rk8w5<}YW73z+ z4Nvr+lN1ylpPiNfd=|$><;4b5EBYDokT>8HVej2Q^M`_$v&dOKjNi#M!>wBl_edSwH-m(gVt(VUQt`D6GE+R6L3~ShHIhvfr!@6JKFXk8LTbj_+Qk0bTK-In;^^nCVl<}Gn12<{!U1bCCjzURj`JBVLQYZUc>90A zGh4hD>3BxINL#vS70r0nZ;r&Pl!tXZ^SmsXdmxl56#Un+GDNbZ%gWL3u6X_d_pIWK zicTM4v?7>NjZ&t?pPvz^u(5nF97{IcXxfWzkcYC>D0`PA5B>Bc%U{VuGO@Qn1TURc zALee6j}!)ihsJk%36Q%Cf{udkmdGB6clg+!WH^~~^BXMs53f&3JNxcEjGehC>5Qf%7kXj@j*EZ` zpTj{0JdSzJ+glL-)VI~u-#!(ezcc#KH!{6LQAi?)5lTy!KMoF?C z#9#SFMI)02##n?iF&fTR=nZ%UmL-kHPQtcJx+LI=I0ZZ27QsP{p^Nw901BW*?IAE<ToL5y>t#+1b zj167nuK-^2X3d;8uHSftf5i+%Bdt)Z4NRHb;FJ<1*3$~>M+JM6Z3zpe4H)EG7)!Q! zF&v6JNAg*URC>N@kRd_?@FB(Iu6UTtxor@<@xe7X$O#EUE?+5^A3a+YAKq6SK<0>t z6{+{ntykD>lo8Gy(!&9{5Sf+E%HrHKsDtqiw>7+>Vaa`r7P zl*$%JX_iv_XyAbbSIm-dA|_`q6zSga6DDciL7VJ_<5J2jyo28;46X3vDup6`0BRkD z6PSrCgc~R1a%Z)*h6rQ1aT_;MnrlixPKb}5&v-La+$4l|j?=!G$=?w-wYK6lq(lo? zXh#aTC!L0s;3I^qM(}r3BX;c)f7!JQEhO<(C0d2g&8RUfzjMnjEN|HNw2aJ2uvPl>1~{ zLR&O+8nFFbY~w#>@1dPt`jzx%mx?7l-qS0G9GmOq6ZfR?{<>a;j%8JNIB2S%b?`6o zpDM-!H`L+BtYoNzN=%usuWNrJf1 z(1X>|^+f4@l|PGG#!0o{raDQD?Xx9!X-kHT*jF2AGKyB>lklVoYl(c5_w3o;W=bas zdCP83pzj%jnkD|m9m^7TlXU!g&X4S_BK!Qr zd17YQ&tB#D;YbiHUGti+S>kV5BwgH{)l7e+ihHxTFtXE6OsNvn{SXkL{YhI=DJ$fa z3?D5vyfRaKnj~h5cc1lPmHUV^+DkvDrarD-yqif9#iuh-{%#*uz7I5#5dLL87pGgX zG2_QWm%=}iWAX8rbE7}9;9utYsqfPdE%iTm{0GYmE!~;to*eVh7%2xGrw3$jgIaYM z7f!OoZqHNbGjMtv*wb|99?vfD77%i_b0T+(kHu{O=wazhCu+LT;{~`-iy&o^SBk4^ zidT{{$b$IfZdo1c7P;kARrTpDk#4c8w@~~pp@h4d5@?(g&c>ozEIn0-%c3QCC%d{P zdrKwcOC_AHt~#YHfm1%qvIqw%!jUCv(p&jne8%+3jpw#r;UAB*?L z5A&+Z%Bu7p#*w&v{2N;oYifOy#H5-UBc?s1CHvR8uBs->og>{wHH>nJ#BohaY8~%q z80-Qr>Q$Igr?Yt(bm^MEQJZ=d->M$S{XrZyYo>97;QQwcpfjqrV=ljfcW7iLU4hoq z@*VFdZ&v1EO>ICk^o*KW}M$!r%ulaNDYjg%qb(YlgXZZOT4@S7V z1HH=bveNSngbK0;cY_!B`Ys4&W)bb@1KlhmoQ8QD7Oe>h73}yMDqqYtCTU(74GCp%W&AI-q_~PyHNxRuWxr zQhI`}Hz|E_{wPk*AU{Fdw&QPUM$IioPx<{%LGfz%0cbowl@oALb>qDrJ|kQ~+RcYV z{?M@9y$5>EB;khMgO242y1ST!9?y_iR-F<27xI0KUR2J})kqD+#PSAyPc3=xez3v0 z`@yFI6hr+)BWcKCY~Neh?M-;Q^xvgrsLbj6g7xp42j)p1sf>>|ZdCVgX(83nkueU_ zL64gM!8jy;Y6zkZ`ClA|g6dt!E*dvYduX~W7CbLW1wmgbAgUcF)98EY{+8?@8-S`y zbkZzWjpJ=(Ou@3?Cv>hib@1cb!W?r^`Qbhx8KLmZEsc*z3Y?uhcxq+dull~ZzbA17 z6^*B_L`&(IvBsThbaX?pgB|*J$QEk_*g+z#pf^aNjkIm%>FNJzf{Nl6)xD{)bwyS zA>4+?A|n&fQ_@NX?I}N51m(&{`pZq|DAGvXp0XLPOMTh=)T1!$$W!fPJSiOQA(*Xl zi&IACSu9+?@k!09$m6@1+=hJXC7R8qHx<^+Umb0!w{RkKybK<=q*)P=X#VI{GFgF> zWtksH{LpIO^OKq&SJ{nttlUd!&CMZpz)cVgBvW74^OARV zsuCdguQIv+bH^{zywo%q^jm?|77nW|Y>!+3^@{YzIm;#!1P68hx!eWSQ1wc>03%OP z=N}bqmXOojf`>75H3nsxqs*I{G7%+-x$fs3bgugl@MRL5&24u4&ziaJXQrbQ)m?Cq zv@;Jg9lPzWh}-dk`iT1Q^V|-0+1=Y6?(%fhp~(sFZ;nhRPxr;1UFy^2hH$qO?i!yi zjYGY}4d(7L2=(dSl#$LK;oW=#r|!e2N^Qtt!oRq2ZEf&T$R6lYsDI%B|1L}E?4{GZ*mZ5f9aKVr?VFK#!-DQKr#mRL zxM;sorhd8nIqnD5B>toOA-&4ijuDAM+Ij@l${zLT>Ok3)&g808W``*)^TEbPA`MBR zTkVh}Nt(3UA*H+_t%GP}j3$MxkZ4k9M2SBHlMFk`TxW`XcdaOv4$$MDa()j?At);|9 zKz6ezr78b~sx*zCgg;`M>LY$V{&3NhuzY2Ak)w{1_`#r;HBR}#thY^0G#Ui`mhAJ6 zg{lz#tSY3Rp=vt+qG~$6*|TJ;kLX^XmP@FIx@gg#fh-0Fth_r8@=WBm)J*0pV3;jzGfmV1@&=2tGvd3Kq6 zj`)dz)1+djvG0BO@ym8o7EPYqAGh|78$ryzZobntluW`jhsd^8+}`^-G;v4RjM!oV zr@?Nk*U zQsaEG;H0IUt;KQ9cxheT(xod_2(O>Eu(q^1S#aEGS!mcY=VJ>_SmHnAb6z?lw8rW5 z+N}+Z?d^>XTOpxjP2v@ts<;;x`FI*#tEGXRp=Kq3HlJ;3GGRx=Q!?NhSGt2oIw_Vr zwfLNO&b0cltmg{m99h=5{=XK{9z^Fx6e{+L9}h~LmgnZzUv#&e zzppy=nT3Yp7sR}Osb7)r?0($%X=m2VYRw)%96CN0pR~UcyO`VaWO{6Hh66BEi6#6A zHkVp}a?n6KlRF=ehWLWUS=eW)CneHFu zsw4%^b8-9=sy|hxTv@Mm6)#joRlx2Fn*YI8<3%?0vcHT*b@J`PdyBJ)S83tTS$Fb>kX8+#+T>a+{~93tYJNDf09V<>Zoit|fbCll(m5R$x{{oC^>aO-s!} zsgmw9nne>#5m=z0m7$Gh-mt?W4%@bEWraWyk9)*?^)K7ki|4uh>LfB}=&rO)vtwJ6 zafrtISNFXUFUo%|FDHZQ>+9VbtMivCQOh%^#U8Z`LuBA+dQNMMD~bef+S0vunnT2S zO>LG|JapHWziitT&{A=I_&X2d%RPVn@fW^8)y5ZyPD2Khtsjc3ILCEMwxlecRvSMc zx_0)Z*G)+?YMoqKre3Jt!-dhF*@Rl@$rz|l#~0`s{6o~HW@8TR8|ta%o-a5PP&#E{ zXnqmdC1yCxDzaPDB;)YeG5!qfuR!(GjPp6@# zNYs>$_R%?);GSXn5986&mHuE~)_Xs|oXMuggDEEUw+YeLEpF z6=!miV#@*|l_dz947D1U)wUpK&)iwzCH@``2|*rnLhQyQ?-urm+er3N{A|iSqeYe>%*&3T6u+)g z=!qU(W$;Gy{c3)O>S3?9QNM>QRXCubiB!LaF0^h!f4|FJQ|F>;(#&1sZf@L2w$e)J zNA&|;i{;SkCj>vNIPE$lW37yI}_`cCnPMdOGL~GS1t40XMiUTaVR44g?hl?9OCal26%{hKTtjE6HiUTI* zHN%I_n(^nB{&{U15WO`3(P(@7-GS7l^-3{tsPVx1!r0bgpMH1lIV12SxG3vMh@R^Fh9Pwd6I3mi@ zm>aN-B;4-*{-3XH(3UPracPJW*?8|79ox#ZxnOjOe!{SHj6T-JoFuMlSQfXg$z1S|x2-Z^UXx9{)*>n3^+R zZ}>^0pU>_!2zi-P=Rin+``|n3qmb6L`W%HuXe>ET4G7hmzQ&?A|Dnq9k1>kNqg7Yv zm`rGno!v~wq&Q~?JMCt5?}fN6OMmr_{us_8PdFdS8`!jQfyV)lS~R$ZMR zt4JeZ-lg-Flb#i>sfBctGtx0ElB8j^s0KY!hH2~RA;<*T$DQ-AQrSbo6G|P;hr3Jr znOm)sFH%1XXLM4AO4%-KA!R8=SS$iXPIFw09-bX<_tmu$ibHxyTIv~)sI4iv?;d3o z82)G)59v-|p~tL5{RVnmPR9s8khZ*x%}wF_jGpW*%`b=%m2DRsgaAnjp_LFSU;;yK zKUpm<+9@s}^+JGHvQ8``YuC}k8;I;SXTx8@&6@E2`GLy(CG}|T<@R=@JS6@27x;^; zEE8%W!8Wo}n(z_1ckgQd=Pwp$9}4J*x-CoRF9|jHMOVJ1SwS!ALf=zQYa%5qew@aT zOCRpch7IBi5lXsuKpDXg!LRUe{Gzkm$9ho{UGq)XT%!q#K+PY^rebE=j~TlkPQqi9 zq`b5y%kL=hOqs&LHBicD-pr}ZmUPA1eq^U5uE%5?8^nTKz}wE^XY0gEM7fTPSEWjt z$}7Z+|BZhZG7>ACep1vIGfX503^js``h=3#J>!GD#!U7evCt?md%8!0=3!W1PVggB zIOnkrV?FIXZD%RRP8{nw-qS8xNvg&=Sb2{3VlYdO@m_Yb5O_gkapY|w0r6=Vfqmme zwrhgWY;{3uekpc~M@LulmNX7+x+XR)eY%H71@m(l+&r+!=8W zF~jT*-@#~{Te?Bw3g(69o+4Fe#9zc;Pm?Oe2K5GVO=Op^^PRuTeiB|12<8^)d^5Jf zF6sHO>vVfoOuV@+9|H|i#{*RaoTuQ%9)5LkgQrJ*{(@F_%h-~c#f=`G^?3`LJ*;Aj z)jtJ?hD@I}%hPQ5v>48u{xETm_1O?2ki3&cMJMOi)rBq!&O23zpYeIx0U97!$|B0lviDStVhQnjq zFP4^G+!7nRg?_ikHWj^8Qu0!f^jA1&FN%q(fB1?w$CHu%d_WxNT`!w0OoV~KMxjLS zS4iP*@m=wqU8Df|v^yWHI>*0FEf7s!=z&+D5tjO5-GlZRN-&2cq8c%64^^+&##*g< z#KouVUlP&+)f%&HOURP_LQQbZQ>p5m+`QRqVq(_JroU33s-gRkP?|ML3qu_rppLzo zI-qMZZE+N>qsx8OQ|s)eI_fK+IxX_Sk2*zEF|2KaPP@gfCU0gNxuLEqX4OOXS>dJ` zOMI+cg{osui}Rm>k7oUYZN`df_GdlXe+eCY6ZxqGgc^gzMJjKID}Pgcl&lrYxLDP< zxW*_&1f{U!1RVv893ig>C8B^^|}+5F&L ze&ZC?FN&d*)|wkbS;Q#4g3SP4D~aI|WCt|q1xv%>9Z(wb7p;fw9%3eU+z}a-U~4eo z;KAYHk*TX41atM2oFiT)rn$BeNe)Wa1Pk#BE}m7N%x#~Q?t{4rlJF!}j63Be=usPB zHeBdB&AIE08(Wzj(R%INl&-e6B=iMha40J0)%ucG%CeuGpWZrYpm<$PEYj;63Zu)s ziEpjEWXihB;?380{INFoVpIK_g^2+llhJ|do9)dlhvqz2@0buRY1q_K#h8J153A(B zwtjd1cx`|$S`W?tj*z6${D%#tt;hZxLuc+l*6SPM_kCTyjXVE=_`$=ank_ksiBfq& z5>`fO?@-Q^7CTXF`PW#x++XC*oqzbFe3;(CB)Cwkxq}O@YON=5O00N?;s)q7eJHgs z6wQEsu7yIn*>wI(SSN4L%+C|3SDk7aT~verM*p{+PIfUOlOE6fuLY`zT;9$jI?Bs4 zGE#j|^TRWxHYlhzCAmI0xSp%jdyqE-KWq;sU!~@z7i8oYB=NG0?2LT+YjJ$b92^)p zw=FhqW4xLqw9LW5fpc4D$F;=62VsM|Zkt&Ak`dMd9D#S342}wlI~AL-aw&gF4ir6o z<8f(d=Of<}A}4qJYYLg>qBI(+baizzgx9sGt*xkJ(#s*`iT!i7z_i5!6Q7gu~FC}=z3htmr1D5O>DhZ2F>M~(I`0AT3zUn@IGOZKZ z-HY3x&55_jVc62nkeG!W*>254gn<)|We-HFG zpmrwh0o*|N2wQ~p0y)$8ORd_Xui{s%csh`*_T_B4bqMQ^6X*{ov~{nxt=*tMYoWlS z2pBEv1EW4|MIA<@urEud3!`pUDd;>ywo1qr#;|rXI@^HGGlWs%v}S%?OUp3TZGNQ0 zNvXIJYzZ*`sS8IAXCLF#D8)9s4J(MooAQ=+mYN`XOR}b!yxi=kK0Slsl>A zCvhljz8=mI^m3O63|!k4@d5hhg8nkl^>?7Ris~we*Z7@yK`WgF>F^%g(N-r@3e$vV zsfMMApseH1s6zP>syo87qUmAL^eNI#wxE^@k7A83GzoWdD>Atc~ z*c-wnxsvWH^FtISGyvcag_fRA&6Q+{uZ;B^`SeInEAiDVxl;X639%dPClsMMSTBR|i+!$yo5xwGZ!96^<~}y6gM8d58>>;` zP2qR-ZuRawGR?wcM4OSh&1eGEhvG3Cc;rz$V$cqHe<)7FcEe?VuW}CtDfp3lC#v4> zN2E! zIhOcmsbMo@5kD)>k-~pEPCNRU6T1@iN8F?m@!DwL$#i32H%u_oxw)Ch4QzNN-7Ula zTB4SNB&4dJ>V1hMLSBgq9w$l@KA^vtGpQF%PzF7s+ZYRICg>tAVu^Uu%-Y%D_xK3yq*A0Ag(wwz$OpSG9pe65gqw*Z`7n z9Xoi=Gs8j5?#~BE6j618BKfi$d64iD^9m3E5{f6Q#G%=zo1tgT0VU&FPiKg}ZodW_x4^+*O`T=;l*x!(1R^|c8J8Kir3X2m4Zus9Uts-^czLSmD27h6|b86IVw^n`+{pr zF%BkT*WD7KLI{x?YDWiTpbMb&0`-$)*D5^~zduK17=L@`PW3g8S9gfzWQ|bKai2dW z&Jt&lEN1IZ?R*{bc?Q-3vC|+%t~I}~oTb&fEQulcnREn|1>yhAn@V0REPSyVjywen!PG*id>b&tjHX?ok>vnd0q9^kcD>3|UZWbr zw9Yq>GX;7g)&1qv8I1bKG%n*=)vpBG>d141Ki+YHd{2v}GCT)wRLE0k+1l0vy0-IY zgHm}ZpdtvmGgyV|k(7BCJKe2?JW`)HTS2PlL7Fa@KkLTjWV@e0{yn|9ahTpZH zk*LoU%hg9!77j|K1Al{jA~tlK6M_+gbzEjDmkIAkrG=t*X-QZaw^Ty^f%N8%aiP6Vu02uBaU!V_-ccV^A0%l?2Qtn<+3;`iwSN;>;uN<)^ul!wZkVMgQkJwlIc5=p z(gsv!A3}$G3OL_@O1}Vz8ykG+O&0h+jO-Va_ zh(3|JlLiB+^EyV*N0{;C?4AdvR#!fRCYAd55HTLPG{@uolglL!JZ3|k3}uln7;v1Yw!d(Wki1RgR&VEi%KVcR7Mh!)y= zo;Hy8RlD$U@3O%onzHGPqMhxfi4BvjW=0|U1wI&tIfaa_QQzP!YQ(SU%%}KKYM*`$ z+If#l*UW?(&7fOr?7LdSci}-f9^R%Ha6A16x?|sv4`*iwUC7SE;QD=Q`cb^Ynz+5!A3pW~o3S&ERa?_2o!tdXnCTt>E(m$!^`HC+YWa-+0Y{x z39cX*j2j<702BD=EEP zC5Jn&Ua=oPF7FpNDgH$%4~5fyijB<_d+{cBp5$D{e>t1>)35#95ly2fPBv*XnLH7y zXE!;dKcjS?O1jS>R931F3dhAyKocsxpoMfqiJ#zr5BQm+G#Rxp5M3mt!8VT9rXY{r zTV$eY316>GLoU5E1bjqchS!vcTzYAI{X=WaU79rH(n}ML-@k9rPn(8ZdTH|O_ulJ= zlcXgqkxMVlpx>W+(Cu57b4Yop#)4eY9W$9PM%UL}B~ct$o}MN3%JJtOsSH|oZ^|%Cp-FX7MuQ1q*ixvr ztr#KE!ZAI*)2pc?iqb$+(_~pDeNRyeS{ksGG%4nm-iKm`)g4EyjVU3Md}IN#5O^db zWijwd&XuLg=0U&Chp%j*Y>})Q5qWj8M%fzN3)L#yBHNC5m!}XvcSQD_?3C<`>?PT& zRIXb=u3NcU;=^lxYriR+ezecpZ!KK={r>{4t%H8+{}zsCs+MGuiJ6(1BX%>Ok&rc{)sN=51B&G+8hjQ_~Q&6~wfbl+UO?pb|Mf@@*)nXlix`TrH1 z;-;-jA5WPKmXaRtO3|A%!ux-p+g_Jll>MLfz5_a{BWZW~rWpw#A&s&?SsEdsgu;Mw z0!bi1LP7|U1Qto;oHNEO$s}WJ9OR6>!U@~3{_S;G?8OOZ?DcxRUg!1NUayTYpqZ=p zRo{DOMnZV~-oNL(_s;o2lkV+XT~%FORbAa({fg;z%#^=p`m^b;rcW_%{}0nYO+T7` zHg%f1FyC!veV8A!!jp<%QSjSsEQO_G$)g?Su9%gxN_g^PSUnCEo5-fJYuGF{mn~#V z*-EySVf|^TF0nB^q{NU^`t+0@&+Eo_PSEk3RTS zdgW^R0BY?2V`YXDTyp zHeGA_jcE_YJ2#kaGTmyr1NoWmM^?>8Oplv>XL{Q79M>s9*qVCPS6ogUdTo!FzZDPI z@e=WpJwBPoZ~9L6|I^nz>m(e|E3f+ROlzz5$M*4W^x-@P%clJln)ucK)D={v1I9PA zg=}W;|GZi*PRAYgyzwS{r+rh4=;HtBFE>1RVF=wz%cLPZDyOeJp`25+5=CfQ^oJW7 z8gBT*qD7}~sIR}_v^2!y$0E8((K9!MILJv47(LIay8`B-IUTcRbE?pW)q)@XfIcaFFp_24vH=Z0fc zO^l`yy<6&IwDTdgRa-8o{xP(eOkWg%wvD->hG*3RYunLD;Ov+kKh3{Al*M0J+XHG* zy@~4(|+wJR@j=qc_Ka$n{>+`;e=Ic z|C?Ar5x6#3_S#6jU|1Ly7Z(;9-;11H71Q?kQ0*a4$)$XGWGfIG=($G7gLiz*leDb! zjL?7Mo9ouSxpBjr>({@zVeF2v_^aPhSGR-CPM3z%;-afSyK%1`UwGda`g8l{Lwo#6 z{o{;fh&W`KnkfcrOr&Kxh+3gPo^l=|$j;BS>V*E^;~D|eEuGLG^F$mLCasK>PjT8_ zm&6>xw^qYdM@8uG{LG+$V_i?0PREMo!pLH}(Q?^cou%zAyUXp$Y|ZNGb{n`51Vfv- z(2l6iqg2q~3t@y38YYC6OXF*0>xq|?yE^AX+$3~`{yHv;Jp2?yDXT@o$N8D_ zGioN{uF*EI9TY1vRhx|xLVxu|mdAz|CD{=53|+w!+hIYHu||{fWnc~iGh`unWijDN zwn*Lgg1VnAoMoX6h8ETzI|}QZqlJfrN4GfNaK0_1Vz&}3x7f&Q)x&PSd|9ij-HFL!CRng@ z>PgXu&kynyVA7M$@7hJ5_DdbgdAcvmlb$rc!S8Fkh>i&X&e7&KIt$w6RzT>w;0P6t z=@2NWpCcS=cYY`OT=G#G+UdS9PdMg+fJsc@7#I>@e&g~j?b2x-0NwWOz)W~ky;?aASI1rB0cKyQZXuwvKnF;`bPfPNqZDY+Yu0P+ zbIPF7D5b5)=X4UN^HmyRoL0_FYCY5^J&C*#KJDNF@tJdhw=31qPR{|f2W(D1hn=J0 z%4yf=KVKz3*52MO#bb^b92cuNF778FD}ZWg$7X^h>|+j`Bjr(tSOt!G5szvA71bkF z0i?QDYb(xP0~@i!C<#pPU#AuP?YKCPV}dzj0}q->#o8T$i&-umHh4|gh-2G91zRG_ zyVQZ_vBN&Rq|ufP{%E0%FSfcJ*0a4{?dT z%DJRJLmbuGO{_wSxkoux<~J@mfRm07Z$JJF=Mp`Uh5uBZEolc&xx{uB=u*pGXDh6PkRoC7lJDgrX9(Ef-PVYdDpf6miTAO1Z9d@fRIa<1N?bT!T>^ z9<;jJMAxsHvVbj{t?O8=7vKp4BgccfkW%;JJw~wTvSXCxy};E6$fi&ipmor?R@Su; zmE*XOjwc3_SW;gxA0iBN3r0{~80+}Dv4t&jwI+E!x}DLa&W*J$c`jxWox0s|^?O|= z3@AEoXg~Vz*{3yRxv?R_F4q_;+_3X*AAqd5?gO~vBDz+DuL~h_+j$TB?JjH8a&Gh( zOBzeGC?hwPYza*r?=BfQaLKzJ9p@Gg9Ju&g$Lbr$3>Yxx#?`A2*A5s^dsrIcd6Npa zkG~ zzzO!t>B8^Nsi8s`juI*}VHM$(HE1(hz14%AjlB@lOP%6dS0nHW9PaB*vf(qk{bKTE zHGkKnd%NBIVu}pw-mcp#?naf15{*sjHVWBLALM?qyI&EHyOqVb;Ob?uDx0@4>$SUj zLN!WiE} za1rqlK+&J4AGq{RcL-(!0zFHw?)5vN(G3XBLmB{;a!a`7rw0yD&@R?oK>>TUov(+v z>eB`VL^V|VE-%IbJ=Ob&vDf)1W;+Cde?x^pt-~7tKjcA^7N#dmnBZ>r447=poWj1OttW+T0oCWOL59u)GAnC!h?NG zFFw*j4!0^Z?e*978RM|EB0`g+M0{3mr*{o&E*p9bf+T|v5nVnMYSf{)+nPpT26Be< z7@XGV;PPd#+K?H&E!=Qi>;p&0U*yzrEyhRFoG5}%qc8V8iYaIWYxi`&m!y&VXPTEu zW#EVrMzF#rpQorH4(X zXH6xc z|MjNLC?ep-ooh3~9lFeegVgd^_kmXAFSjn!5rG!##!D*S3kIy4{-S906;W2MzC5%A z=N#WSMD3zGA8=*5`yRUI%(Vb`?DkbimdRh?rkg~cEb$dR1wBh^87+S8(NT;xgd}(C zDZJ0}cGQ4ht*3CvZf&6H54{_@`xYdGpmXg(G#L7cth7sg0PEhghgMe8*%VK@n)Wa> zq@l_f*#QdE%iT4ZtIq-t^jVTw!>eg`YX<7Gz0$1dDfct3Zm!2=IQL2BP>+D?M7xj#2zmk9>L9G95n+ z8Ym(jb6e&yi{cU6({wG~Nh&;iUfo|bT10O>4?9HV_4y4Ci>%uS=@!rlzN*D6d;lm$P7u z5?rzg42-zHi&Gp2!NRS+58rzn6i3slD2a*HEa}O^nEq_1X;2seOqx;-bbWr6dXXks@{q9Ac$$4K_ID(*57^+I zQ1tv+6ruIVfM$Ras~7z6!-9YPwBW*p1wRQP1~_q}aqV9Veqi^yU?QkuO2ZC@T;$9h zh&7Rw*ex*Iw9K>v(6#j%<{+~<#%9B|B1!=((xxt+x4>@W>o~HIV+iLpg@gpz^n3<( zJC(!=26K=-gmxo&EU92xj%&(yVAiu9*leOlfdop1V8)g)o)W=k&cSvyp?T7QhVaPj zMpbPb92GI{z$4kal>srK{k_8@Qli2FlVU4u(dHpD3lgnyiT%U-1+$C&Qu++9@E&+i zRC;<;Txu%YxHm4@8s2|kM1P;i(3k~|ELEG zBJ+HG^CAoGPK}Gn%#4XkRkw}y_Ztut7LyU$FF1BoRwH}ExaA$?A7RavqQirO6Juva z4;%^kxWn{Y$*=d!rIMfHfVe<=d1fxfD6jid+H4b#G&5KU{yMK7H=Y$2sK-5@XX|hf z+P{Gj12{(gbmV(a7=R#OfdxsXQ9oHL<1c2eY*P`3X9|E$INk*U@bV9QSURlvA$@{SgjZ0aqo(i zQEYFMb#mjl$$?E?HEYIkqkB&tjeC zp?b#$qgz`?SFfqAUc(;GPE5+pO-jsucI68zR=v1l#fz&}ys+|F&#( zOpF!dp+~Q5p~H>VS&idn1vYxsZWuFWL#>*l)4`~j=yheYINN!%tgfnB&2|~M8=tU% zTC_P5Ck5anrP3g5^rgcKLNE+d_~`{^41f}`HxC>J!}SwZAM?Mr_N}*S@AiLS^@Qsi zCb?@etwQK+h}F#>j-Z07QH0({W#nB z0~03fZ$z~j6B1a4Flg|ZCv*hFv%zYE^kQbZpuUwnD}Tc7y1LyHfJ8(HOOr&=qTb@d zhM9H)n|MyQsg$}sP_S8X+!fY=>U|uGF!!Ea)Yg2cHku8obBU*CEL^=aBi0Gwk0ji55I!gya6+ba}qGk{LqTtfD@sdWT9!^w(^0t!Kp3NS2XV$ z0CmH06rAv!^;=GYE(m5SodkDTuav_tuN)KrT#a0<>y#nLwfO@$P;>bP3)oO=49 zXQVqX-!8V&Y>O{@Ub+jim5ygj?ByWJ0_V&2@o#>nA!0Orq6%TqiO4y3FT3T1$#>m2 zaZc)_2iWq9v$quHubKN-BnNwINd`SA(p*;U6^<^1`gdiG%EA#gO`Z(#empU1c21>jbkdmlvm0{jKkw*JKfmuj7SYkcBJTUaW^0M=zjn{H8xo_Z#Si_%sddL1_wN37 z|GsZ`?fQ1#{%?1~N1e<*lInnOKU1_Rm7h`JUP}(%772X+h9)?iujav|nnL1i(DD8u zm@ubPK!m2#`{Y~_xt8ge-g6BcMQx#7EV)`Fpe_* zo5I0IYn+JOTyZ$YEspYG#aSt8f|!uiD$R*p6UYRnOxn6s5t-n>wEw&7UliV%-6&6U zoM&g#XAE{eA&f|$k*=l-w>VpcTNXLb3WFhYTg6$T56*q@qkMg6scy!^gKo-_`NxJs zlP4c)7<*{SltW`v$7W@XO&vaOp8P@e?$*{l)gyM#yk=MR%7Np`%Eu>9y=Hm~mxKe- za-MyUuRULh^%d;ub#UJ1iyuvL#Iol$o?W-@?8c2}*RFYeW7GAGjn_Ag-`Cil~5 z{9@hf8#cbacJ1pMH@v=XcjLbCt|EvU^u@0CyNnD2h#1`E$`l|7K3zG&oysWSrpF$5 zjQP&PhYu^GoO!~Foe$DGY4PL8z4}LRCXsT^Xo-%NBi#FS~m$t0K*l-1U{TS6+kcVKJH% zU@r+yr=rf8rTG>%Y-&(0`^F$gd(M$rJ736}p7-_h9bfMV4chqklc(ni zjcG^aHJjeqpq_VLNXeQtap}>OuWe$E4ex9k-Jk}rZxS=max6fn&m}{wW^1uny!5$OE?P%W2&s6)}z9s zN7ciZ=gqr}=InYKRw@ZnBx3hM97<7Ue(uxg9nFT-Qg*9;iV*B8xE@d}Y${Mc$-8ml zo(F4Nez)V~Y@dV2zT38U$ilj&Yf}cU7ymk!4W6rRt*PJf^F6m;+PiJO{6f&>8()2U z=gEn4N}LypM$j5b(}V|4V&D6;9-Z8J&o%XXn&b^H zuNb}ai8)(7*yY3CRNFrm(*DM#37c@v!}NP*OuTt!-(7w8yuW$Q6FWz*dUaEO*77$Y z?PK+J@>Y`Jtt{vM2F$b0Gv?x1smojW0e;EbdO5={Y1I7^%DMF#vffgLDXc!B%u-l@ zGI)lXrDh?AqH0;f4yX$#2b~=)w3fF}psTh#S8buL+Nhk?k{;#s_VaVKDLgeu9~_KmI4;>k zuqiW(-$4RPbBybo>q`uVKuE>SpJ)78_+l{x1prwrB7Ovqzy@Le7^B>gkj+G#1lYO&dR?%$d6x8BAA-(1Q2HsSt) z4Ha*RA?mB|u#kZKO+r`pZJ{>*`UB3*)w_%1az>vLvxVw=n*9RB(11|kt%?oow7O5U z_G`YUT2Ma=O9?31Ibz1|SYzRVdVgE!sChJ2h+r>^Z}8p}>KZGQXnhhAUXMO>qkh-u z+0$HoZKX>h>(LYTbBPRf^~p+CxoIBdUY5396<%MDa!t~GJ>ZqP;EnSr_dM{Uagw{< zW>-01qa6CPF(Qg}QK^rJz=JsO;2DmU`);g@2S^;RkEY^!J_{}XM%PQy$MUW4p)wJR z$82kmn1EP?EaM1~1Stsp*#2majj%X3g34>t0*C z_BHv|Pu1oR7PKvT^Yz7Ti_fXEzWI(F`Sbj?MQ^-2uWjCk?5@t!6OO*-dUE+|M<*;< zb9Nn$-9gUdb!XS0#k;_ZmpCtyT+~j}bu?!4p(|T3zLoeqDNPM9dJ`H2@6PW9Mcpo3 zlycR<&LhHXY&LyBZDPkz)&w7ea#1Sqvjer9s4;j7dHN|wBRs4e+L9%D=B0F=S05Co zXxS-|PxxV0d(54nl2Vg8y}zc6j$b$2DL<=jcfKmXl@PjGOhe>axePun^5ns%)v`e9 zKAg$LrXFmLm`D|CuGatFkp4$0)x-FHZ+P_kNV7@!m z3m(O=-A+)y((Cg!Ar|DS4<`s*QI+FvXA`Cwm;FLj!VY0euN7%@odI3Eo@&8Jzv)?x z7>)G~O^&-cMW$Y>ac*#~`XzcKQ)Jht(gEo;_=P@bEAlN_jOA%~T_Ak$ym{P#mKe znWLs6ThvC=VGo|^ZA2sWAae9*U_~PjiapYAoFc`4_q^ZZx7g!%Pk24=#~9_gtZ3EZ z=nOfMi^s$C&Y}}Q2!MY`Xuo-Y zA^m`arm?)qK0+E&1YL~B)hFEFh1=ZU)eiS}*5Lkrwd=e@h`;KfYS~x*A!u7fe<^CD z`8)M7bXW%Cc}w%zLAHjas`J$CSSoyyZB^I9ZyvZ)I=5>Nbi@7Xza+E#1foro0pa%) zZGzWyf0qSUUqkQaGmu!}OT!leO5>9Ikwy0*wf#2rE#b0Lp_lkFQUW_Vi>2qB_Fe49 zUDR*CG}R%Wb}DvbAdbaPl;eIel!LKr8jV6trAq?;VMf>hfhx_NMwc+6puE>ps6@LE zV-%qaVr5OPy{5+QjHLJ68ts?xiS}##uw}z5Dcf+RGgA8;zPzGhxqeOfM8CFdn3U>_ z?*`yQ&tI-$ZgBBef+M<5nyL?MH}6Hp~v0IZg;Vh7#@iG*?QOA0j`lzvx~cKzbMJ@PfS!! z^JCoQdh@fW+%~;7qqW?8cKc7SBZA?SS4x%Qmy*6x5B;|{Y*x8i$vsY6*7XnZlDt~- z6Awx)@^p$Ro3`WH*Yb2+JK(x@(Z$u7F21?B`o7DPSnRrMcoL$izU#bnS>B3~afTi# zq<(CsM573)xQ?ji0ZuK9s?DS50ZuL2Nl^+xn0>VI*6nPWtsrD~Y(v(+)|{<<>%iLQ z79QGCGJeq5TNX~5GhleplBEmw&uVL5zu=Z)dF$xkj9+vA81=T=hi0d&J=5^Fy3@^V z6YpDi?a8|0ISVQp_tr04T$?_osi<^I{lr%1&XVh=EZ$jPO}fs&Is&l^E%vNoZMJE# z5(>xu8f=BAw~`q06aONGEV+&~W6PG7VFJh!N4(rZU_SeSwszf~lJTBZx)n zlE-MdN=4MxSHu*cg0UNzjI)dq6UDcOkBl~(`{hj@K6P={!*>+Ut@cTb50A5&M?H6Z zOUE_IbI=d-e>gy|i;1 z9Ky3zw;x7}9UbYD1^jLkPq63cON6h+T?#w>06O}P2~`?vh|w?ffl zYfqe5`xup6$h^c-MkfOC`EapRO=H{FuQv&Raf4VYh+H%Ado)Lm`-6}LeUKn-*zo-Z zO3pF5^a^A9oqX8wWoeBj?rSU5lNoUjlZ)P$?gSO{Nwmi-S+ zZb&!(>S>U!F6T-0Tk$?+mo!`|F~LJ9f%b5o!pSwOl&QD|`=DJ@Mi5B{E~ipscRJbhrCa>B6tQdM2si!Lf8i9 zh%k0x+7T(^h-8trbZ$6uMEt?wEAPAXv{Ftl=g-l7R87n(6sq_lG3M0-TL4;B4$<=#imd66%c< zLV|EGgg=6zh&9s`w}NO$PNYD+kI#|dNNfr}Cu-UcBbgvdPOrXF*Kv2ns>invt~s)4 zbm@xQCSTXM^FZs0J2sR)^i17dYpyF_I(+A)v2#W(z&?es&WJ(6KxdJ1hx(xr>C;tIDhO=Q~!j_m?uokVK*Jc35?}@%s?%H7__!pm^wt9zuLsl!S)()EHWHC?<`V%*te?nRyCA;C7lD2&Tk%PkFgV5)V_P@h>kt% zN0Z=)>-~Jri^I)NUK}pE&gcAj=`Woe{o`SuHtprPlE)-EpXn+UX3KQqt(nUtMy(>f z>@3LUd`7Cy?>rSk?I6ep8%vh9TH-l<=tTEAoE;sJV1JU zy$W>CicHcE1K_!w#Mp#RKh{n(>VA%kjAdU8^I(`C;A;b@W1KJ4&vp?eI`1~lc9Eaz z^U;rG{x=3rqeG5xu&VTS&%<6u96BTpb<7Ztb{-mSr!!gYqtUXhCNHT8=ME^8b*Mau zIvGO2BF=!}o+iUVJtOGYQ^$ky&_@H=*IBAR8+lOuK)rAy%T(n8lA05A8tP+0V26<4 zy!7w`JJn@N*dyx1*=*;|`yVxl7egV7dAyFkCTw*q)obBZv4rlGb+&1>ncpx3)H&zh z*W1@ExG(jB0(9~yXsucDK54kJ#n8!@7&PlpT&q+zljhYl_4&uUMw#B@S2vL!rmLXg zW6Y;5k?#Ya`eOXjg9Z`3*Rj%ZNi;j=$Ulom!R0=VpFTS*vq#l9HRgm+*dYvYp6PHt z`vm(d`-qLdv=@n|VP6Z>v*H{7UA>4A0X5n`en~Ihxz?>0o$p0DAEFlh?`y@z7u6fI zrpJPeiw&SA&x4xE|1&+W(*vSN-HX3OmZ!RRk!3#gAJqG93NhX4HUWCiNi{UA(Q`aB ztkG>g^w6)ap29xz(62@hA#L54pKR24p~Q`m=bOjGadm>8u0iS&o+|-sYI@Xcce4d2By8&daj%bcgfzLRp9N1@;;3SnTR@ zOgBxCm;~=f*{Q*TKNAe?c`L3}D!bgh%CX(#FV^F<5I^Nk2>xd@%7R`fgI>5>vPq|Z zo(*5eCjFrcGp6v3?s6U@-{`_;czfCbK*)c3@VN`f(_p&EwDVeyr?6OV|8|#;T<>DoCL|%5uox5X)E+2zqn6=ZF`FYHtGd69_9X2Z7(m9D% zH0i6G(2B>=wrg+>#~^rwIP(>x6p0`cuOcxd$QM&{X^3C?;sw9Z^HdIJL2O&@z~X|+ zX%)j-DhrAS4lKwU-ddG4Jg=nLxPrSa!>V`B4wR1fJgwuW@~KG$1xfUZ%N`sf+#$zj zq(!C_7pKsrF$*$<_$$xvaBOC0#EoJM*3DqQ04=$qrZGM}n#k2uqS<{yb$V^xjLIun zo;GsK>>B+%Yf;n>t_IUQ8L0i7ZW4Z;VDgvdfnSp_n+aL!$s~hW#wVC&@6J?%x%7!q zgUxl!iQt`7IAr*=%FK$PB@-%!O&eZNl0^J%8CKC!Sy+;kjPFy2d0r>ZULQMq$iSk) z;nRj`t&mibU!^^P7U9<`rlED__T+y(=lZ=;d}^wT>+v}`@wOpD6FpjCxVxE*<}yBo zO;T3C)+R5jN&h+kFg*D_| zU7Z~`JGW8Z4o&pe&g-Co6zQ)o;X0cy7Kr6?q{7c;6+Xt5h2r1EQfVfxti~9PuFMyg z#9O*QC1#OO9^X*Kf`U|VHPhr-LYTJ#%mj@20 z+YTIH>$Fd)fLsRdHi%u{bc2umIXYxO45Xbk*gO8$!v+NHNze$a*fjY*=<4IT-j~$d zyFsFz4<4{+B*Xm06OK`M-R_B%2R70b)be-&*w3@P5e(_HW0dnF$0)_dVLWvR|Ac?I z=n=Zn!%r1s1|`DD!@^UC#EqQrZZtfi(;)Vsf!9uJos62t8kKrfiQT>6p>P+tQK_7e z9yVYJeY^3a8#gcyG|zbmub!-hoOnQc+yzbO22Fznyf_@dNP;`A(S^wPH|h;8iP72< z`&iMI&MKU4al^rb=739l#_t<8S2``O*5WosyX$RkG&qE?3*}&odX^JkapZ`vc$70; z@`T4vCPn*S>RHa*SpeO08oI}jXzknzH-D(L@q(7NyU)c!_k#mxV@Qfs(0N)akZT-I zi{*}|9Y0)gbd^;2u6oBhc1o>U$EF$x3ci}`_i}obx`AzJb0({SZEOpyde=7|_<8L9 z=#CFknW1ZRCb4gM{p&+>(`L?_H#03abp04vE^q`D97L3wL-Q4yc8hp>$wp73ZZ1Mb&X zw1)@BTpFr7zXEZpR)z4C`XlFx=h0=qz#X_&-K3FLenDsC#E`}Td>Zq6n6}c+_0m?j zuG3U*ht{)K)Et!`o#uIf7y9BMA;iUZy#?~z=Xaq;xwwM}99b8t3!!4#na6k!WDjYr z>v1mFpdzS*6r&xlirMN~?Qu5?-FUcLgY1CT8n9(gYPy?ruzsyl`7c8UYbC|~7(onIo;FH4 zhPj@8%DBd{qjHtX@7+(EesaNl#(mYJ_GdkxCk=_`pX**yul)~3Nsro}H?Dcqe%k%C zN9`{dS9!E-t57cYgD$qXqGc2*qx5)sw5)*QWci&pvLqfO6TjM_hTR$MTy*FV#(z(D zZN>PnA2{-sR=-JfEYah$+KE@tFwiQA@qF|_v(UjIeB%qvGV2TS`4VQEHu*#Tq(mm0 z%&sIjvyuhtcj|-ZpE`a`&AO4rH*KAJa^Z@P?>PL^_*s=tZm2)doV|7Bb!X-+eremR z#~wa&ffaS$bM)v@QSMMzzRvviys)WyK)&piIpTq)k?Tj6904_pKuz`LeNU>Y zdecwB_d(9bzht%F-M4n;DbT^z5~fqD3{2~47MJA{J>x4Ab$Yzx$LxIja0k2jr268u zPpz$v>!T!gqXeT=Es{d^b_9Bhjum#K`~vPYbw#@&JewuNXi2p%;g;pItOdIfe45y$UFxnEYa-F3#-MnigMD;Cy=uNpA#?!~`w@AHcB<%33LA z3FSkYGVJ-An-QgpgE#dT-J9xW8AaVfihpq|5%)Tl+@^gPM$vHIF`oE&X%84$CQ1Ey z@|`?iu;Z2D?;MpDe@B&g%29<+{<|k&R|U-U0rq0uEk*LV1bq{YEj!U>!*V9-wul>J z@d%D6zk5n^Rghm^MnzijqUvdj_s@y5L+*SjrQ+l;H-dCcD2&TO1o)K!pV>oP*uJ&cJ^*oy0t&mxLww z>>Y~xuzSP_Vjp>$q9~teztsz3ACrpc(I?ntKOSnAvDc&o;Urd^Qyu^w9ygogwB13% z$kbwMbbV`qHKI)ZpfD}0VA#XoTL(p?6%y<~z`g~$$ZX0dT?;YRGoz0E_+)H^JYH;- z--Bl5_DO7Yej$X*<2TVg9V33vnkBM(9(d|=aRQ~EA(#=ezj#poQc{!)9N)i6j|gwe zx8wKE!VP%3O*V<83atdeenxWwJIQwDs8f`@kDDLB-IcgIO1~Q-+k~#s>Xd9HZ{GvW z1lub8M!Z$Qs8zX)6O^!6MmmmI-JeVfhlOpS3BrEXx7yiR!~Enwy*IACecXG5vA?tn z0ti6s<8Z#BlE+m=H&ykHBy_HtBAl%HQj*U0dj(Pmtw~6E`czw zk^UmilqXAy*+g70bx41a6nV12UrC|0bkbioX;hvEmDj<3UN&r97obR$!dLPI$*lZf z8lY?i%I3 zhwyuX(fXK?58+(YIvXZzXyqdBc=*nKlTlQZky>2L7N!*yrKJ}a%l-vv>4k;qX$8h7 z+T$-c*!NAvo6qihO!^3o_KFI7Zh5)lU6GkJY*F=|izVN#Gb`rbd+2dChe3 z$?Lzt-CvL^lK{Em9LKX}U~LT%?RYWk(Hoxs;Nb)B%Y)d&;p(X@HgS~tBwz(dUyHXZ zDO{Rt30YX?%cj>dzs0O?%_ZsU`tQE0f4oO2UFPa*xXjgFR8ktg{kGu=luDJp5jQJA zy~!?*m$W_oIXIyfm>5(d~N0zB^;!smGUqOp?efBJ@Ie~PL7S;QnaR21GfThUaP`qKlJYYNK7r-X-0^Yc%jdJd{NVjQxK0OuL7lC)e9xS9=> zoGW^T&zhS!xG3755D+=kwq(obdkPCvM_0zBW|_^~70Z(P;VWAJ$00g}7v-fK-w@Fz zq~0`ls=PEny~US$rrx*EtAF6SEnG2)2b6Q@lNX@5|A`VGDn7y+=(lF&XSxE23*|4x zB69?XNc!$Iwm3^|HAj5Vd^hgS#ocmqpjIFB-On}ZxKwlCzFWDz3y?n*Z!xa`w97iQ z0Qq0y?dAcV8t(w>JHpvHlKGhjxHVpY{5i_`chh(yxb%(eH2aTx@4az%p!Rh6TXC!M zQ*YAOShJaHyvpI4#*@D-m=+)aw>c znmVZ=pkGsH8a?%A>6q}IGDfQdEuQe`*44_GXmvG2iLuwkKM8-6x47w}OOoU7xSp2h-H*LR`*u~jQ}L+7QYmz1zSWE2;Z0yM|Ps}BcC z#c8P}C8=q}#wV9G>8S9EG7{W`tSRr4^hvkkN{xQyPr&YTlzB}V>0$S=L6!G^p)RdB z)S5T5wV!XXGO{o&BE8=~-iyl&huw$fD8}xksY(Ix4glY+X3^H&Qi!Ihi+B8%ti?66 z@&iMQl}vSR6x%b{(`XQ!imSjeu;6f>049O?v#udbTyTKT*XO$7GuDLN8;*gGKyZGWTB70O2Yfi3I}6jp!Jl(+gTvA} ze*z$tcPmd|1~Lx(;n|1aGIETpy=z3-R#=>#Q4}1XG&5V*jj?Sb>@~V>oG)!&mrzI+ zE~L0@IIHK1a`<#ZQ3|ZDv=uhxlwPCWh`dg-z4sdLpJ9s+E=o@?DXQ+h#;wE4ibK;1 z3)2b{-|JDI$RZ%Q2b6EQoz|>}OHw_h)@n5;i19Gc=@3r!5J@P+xB2gt>IL~3Lt2eb zmZpAIcG2h;H~b3d@bK7f4ivt?OMpz(c+FNXRQ3ja=EXAfxghC1@jm58jycUhdH5Bc zK8DyU*VqA~g?k><72$^L>eZAYgn0&*xm1 zy#-zIsje%~r-YkEY`I?EqRtCqJ5XBpKv4P%ZaZ|%0!@gx*A?1KHZ^obdezF`nbxrd z47+yOgNTk{2&hl0xfZ}@W>7?e{>XS@u9Qrkjb`H#p$W)#^J|nwfEz;^5@*^oFdPCf zR8Al6w`>%~6f3`h4>Jzi?c?JjaH(kj1L)hV}WAZa&5Bu0sA5{ zH&Vze^R+~TStQ9Kcn3;MObqbLO^Jw5vdaQ3zD=#sJ{`)Yv44EBFd)m%V$Dkp@`}h$ zH6ukwd4NTU6|D84KIw(QqvfRZ*ub!cCBp)nXO1$*EpH1PP#Tsrbk>BXYeE#k9wu1J z1I$_ZDZz@jccL5>;nk+JmbTw>1aX4e0AF9lTVy@~g9Z$+9+=UxC*RT}?K&8n>?2A2 z1BWCB1cyc^_PbdMnzDRR;^1&^ucU!Br>cC!$i70%j$z}kpIhq98Y5aVi-f_&LAgS9 zb&O!m_R3Y#heel7+G`#-bwd0g@0l!2@d>g=<%pxb{Ra3ZRS%4B6JL$nTvNVxT10$= z95SjU!WvO$ODW7B=#^Vw&B*lk9x;BHg2k2o>G2lD%a-h8tC>|BGr>0?TVZDF(7deW zV~2>$Hz+ZvU%YR>#JaHAzM~h!uIg91X($VcxB2zUom$a1%pU4Hc=_z85s!NLh~CLN zYwf9)z|tVUOkW{d@DB1CIx8})q9Uw+T3UZ=AIw-j|z`7`lZ({!h zYhX!Pu;ObQ5R@K}EilFsg9KYaa$oOgF{NxotTLc-s22+e3lgoV@sgMjo^5~Vo8KiO-QlAOC@?igP`t9N#MM6q9pSFm4Daj-QiG9WxR zKBgg4X!9PK86MS7v`BtQwt%#7>(D{r-j;-<0sZ_^3c`hu1aFH^Y(>j>>r z5b)wqX`68nU9;P`VuNPHb*?xlJjk)M+e7RCKs9hvZ?}OcIfIA_&a~Tda1WX+(+og> ziVxhjLA!A(0IFEX0O|CM4b_p$X%}XDm(IO@{IDG{Lf=Tyr|MMAz$7p4@WF|TmQM+i zZtj;D9U2^vJS4EcB>5!A9^550S@QR^%s5~jFkn!C4->r=U*CY*ay>_I+C7@O%mD1O4!fo4%@ ziyv5>PYbXm`AHVBUsQPJNbfcw zvmquvH#{IR${Ji8-^WV5ntFHStf5{(-steYnSMc~ftFNz?apLx z(Z}m4A1^OuI=YNxi5nDTsgS(9EU}7LO6Y?b-a~W!BEkj_6SIB2%j-keBndGIl7a~y zFZm1hnB}Z=04vI9zgHY~{)-l%ho6NLFKJA%0$Q!Ux^~7B4?bc(5?LPoP(T zGALk*k0mOsO_mj#pMOrEXwH=L(tH)cD^c|EU)#qE9)ytACrYt|B{1i2EoLV9_{66Q zA`?aC-QUM*@^yaD6{(!_^k>*9_8fbOy~X~*zF_}imjxNzKwtYG59j|45624E4!Reb zScXKRVGUyZQb@io>P3=2BAQT@-xe)8;h{NhK7#hs$qH+ej8uDV`k+Kuv`|9H^}mUU)IdV z7fTmaK2Ww>C|9QyL23V`*lg(xoi2~KY}*;xw4#zdqXso?p4O1k8e2STvYO1kTDEtl zxLUn%4cntGy@ujN)m^tB?o^Al)fn^Qe1aHr42E@D1}L~}c$v4o zd{*?^{;E>zoV@;@ZuQSbqJbcPrstucJ=YZXV0;j1=U%7{`8-+Cl(gE& z$oTlk$l5gFyYxEkdtLgZ-Ajfn*?r^6(3PwtJHeS8pOqCaoJ+`73kxPpC@5@f+=1O^ z%kbEkbmxa2AmY=<00cX`WcThR>R|TXiWTZWr_7%Yrg!zl@kNETic(uxG(PtdB9JDN z^O*P*+DxF;=uG^|5el}~(h_ifPdb8ou$cv^hNF-R+f8N!DVc|GGi zCOwQDca`Q0_l%M$)O9t}xQdu!y4)8rVawHH!oiJtOn8gjH@kI2SgGA!8aASpBC>-N QFL9GuLcBM-OEo$E7bYrfRsaA1 literal 0 HcmV?d00001 diff --git a/src/main/resources/css/light_theme.css b/src/main/resources/css/light_theme.css index 052aec302..39e2892ac 100644 --- a/src/main/resources/css/light_theme.css +++ b/src/main/resources/css/light_theme.css @@ -16,6 +16,10 @@ src: url('opensans_bold.ttf'); } +@font-face { + src: url('firacode_regular.ttf'); +} + /******************************************************************************* * * * Root Styling & Colors * @@ -79,6 +83,7 @@ PROGRESS_INDICATOR_END: GRAY_4; PROGRESS_BAR_BG: GRAY_8; + -fx-background-color: MAIN_BG; -fx-text-fill: TEXT_FILL; -fx-font-family: 'Open Sans'; @@ -124,6 +129,12 @@ -fx-fill: TEXT_FILL; } +.cryptic-text { + -fx-fill: TEXT_FILL; + -fx-font-family: 'Fira Code'; + -fx-font-size: 1.1em; +} + /******************************************************************************* * * * Glyph Icons * @@ -1011,4 +1022,167 @@ -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; -fx-background-insets: 0, 1px; -fx-background-radius: 4px; -} \ No newline at end of file +} + +/******************************************************************************* + * * + * Decrypt Name Window + * * + ******************************************************************************/ + +.decrypt-name-window .button-bar { + -fx-min-height:42px; + -fx-max-height:42px; + -fx-background-color: MAIN_BG; + -fx-border-color: transparent transparent CONTROL_BORDER_NORMAL transparent; + -fx-border-width: 0 0 1px 0; +} + +.decrypt-name-window .button-bar .button-right { + -fx-border-color: transparent transparent transparent CONTROL_BORDER_NORMAL; + -fx-border-width: 0 0 0 1px; + -fx-background-color: MAIN_BG; + -fx-background-radius: 0px; + -fx-min-height: 42px; + -fx-max-height: 42px; +} + +.decrypt-name-window .button-bar .button-right:armed { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_ARMED; +} + +.decrypt-name-window .table-view { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; + -fx-background-insets: 0,1; + /* There is some oddness if padding is in em values rather than pixels, + in particular, the left border of the control doesn't show. */ + -fx-padding: 1; /* 0.083333em; */ +} + +.table-view > .placeholder { + -fx-background-color: transparent; + -fx-background-radius: 0px; +} + +.table-view > .placeholder > .button { + -fx-border-width: 0; + -fx-border-color: transparent; + -fx-background-radius: 0px; +} + +.table-view:focused { + -fx-background-color: CONTROL_BORDER_FOCUSED, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 1; + -fx-background-radius: 0, 0; + /* There is some oddness if padding is in em values rather than pixels, + in particular, the left border of the control doesn't show. */ + -fx-padding: 1; /* 0.083333em; */ +} + +.table-view > .virtual-flow > .scroll-bar:vertical { + -fx-background-insets: 0, 0 0 0 1; + -fx-padding: -1 -1 -1 0; +} + +.table-view > .virtual-flow > .corner { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL ; + -fx-background-insets: 0, 1 0 0 1; +} + +/* Each row in the table is a table-row-cell. Inside a table-row-cell is any + number of table-cell. */ +.table-row-cell { + -fx-background-color: GRAY_6, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 0 0 1 0; + -fx-padding: 0.0em; /* 0 */ + -fx-text-fill: TEXT_FILL; +} + +.table-row-cell:odd { + -fx-background-color: GRAY_6, GRAY_9; + -fx-background-insets: 0, 0 0 1 0; +} + +.table-cell { + -fx-padding: 3px 6px 3px 6px; + -fx-background-color: transparent; + -fx-border-color: transparent CONTROL_BORDER_NORMAL transparent transparent; + -fx-border-width: 1px; + -fx-cell-size: 30px; + -fx-text-fill: TEXT_FILL; + -fx-text-overrun: center-ellipsis; +} + +.table-view:focused > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled:selected > .table-cell { + -fx-text-fill: TEXT_FILL; +} + +/* selected, hover - not specified */ + +/* selected, focused, hover */ +/* selected, focused */ +/* selected */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:selected, +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:selected, +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:selected:hover { + -fx-background-color: CONTROL_PRIMARY_BG_NORMAL, CONTROL_BG_SELECTED; + -fx-background-insets: 0 0 0 0, 1 1 1 3; + -fx-text-fill: TEXT_FILL; +} +/* focused */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused { + -fx-background-color: CONTROL_PRIMARY_BORDER_FOCUSED, CONTROL_PRIMARY_BG_NORMAL , CONTROL_BG_NORMAL; + -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; + -fx-text-fill: TEXT_FILL; +} +/* focused, hover */ +.table-view:focused:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:focused:hover { + -fx-background-color: CONTROL_PRIMARY_BORDER_FOCUSED, CONTROL_PRIMARY_BG_NORMAL , PRIMARY_L2; + -fx-background-insets: 0 1 0 0, 1 2 1 1, 2 3 2 2; + -fx-text-fill: TEXT_FILL; +} +/* hover */ +.table-view:cell-selection > .virtual-flow > .clipped-container > .sheet > .table-row-cell:filled > .table-cell:hover { + -fx-background-color: PRIMARY_L2; + -fx-text-fill: TEXT_FILL; + -fx-background-insets: 0 0 1 0; +} + +/* The column-resize-line is shown when the user is attempting to resize a column. */ +.table-view .column-resize-line { + -fx-background-color: CONTROL_BG_ARMED; + -fx-padding: 0.0em 0.0416667em 0.0em 0.0416667em; /* 0 0.571429 0 0.571429 */ +} + +/* This is the area behind the column headers. An ideal place to specify background + and border colors for the whole area (not individual column-header's). */ +.table-view .column-header-background { + -fx-background-color: GRAY_7; + -fx-padding: 0; +} + +/* The column header row is made up of a number of column-header, one for each + TableColumn, and a 'filler' area that extends from the right-most column + to the edge of the tableview, or up to the 'column control' button. */ +.table-view .column-header { + -fx-text-fill: TEXT_FILL; + -fx-font-size: 1.083333em; /* 13pt ; 1 more than the default font */ + -fx-size: 24; + -fx-border-style: solid; + -fx-border-color: + CONTROL_BORDER_NORMAL + GRAY_5 + GRAY_5 + transparent; + -fx-border-insets: 0 0 0 0; + -fx-border-width: 0.083333em; +} + +.table-view .column-header .label { + -fx-alignment: center; +} + +.table-view .empty-table { + -fx-background-color: MAIN_BG; + -fx-font-size: 1.166667em; /* 14pt - 2 more than the default font */ +} diff --git a/src/main/resources/fxml/decryptnames.fxml b/src/main/resources/fxml/decryptnames.fxml new file mode 100644 index 000000000..04e16b8e1 --- /dev/null +++ b/src/main/resources/fxml/decryptnames.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/fxml/vault_detail_unlocked.fxml b/src/main/resources/fxml/vault_detail_unlocked.fxml index c035b2d88..d80d8b7b1 100644 --- a/src/main/resources/fxml/vault_detail_unlocked.fxml +++ b/src/main/resources/fxml/vault_detail_unlocked.fxml @@ -1,12 +1,14 @@ + + + - - + - + - - - + + + -