From 5e33c5b0d691f685ebaeacb7282c053ad1d048a3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Tue, 14 Jul 2020 18:19:38 +0200 Subject: [PATCH 001/105] new release cycle --- CHANGES.md | 4 ++++ setup.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d677b31..a1e0fa6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ # Changes +## 0.0.3 (2020-XX-XX) + +- (TBD) + ## 0.0.2 (2020-07-14) - FEATURE: New, fully object oriented base library diff --git a/setup.py b/setup.py index 4904d7e..c313099 100644 --- a/setup.py +++ b/setup.py @@ -40,7 +40,7 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Package version -__version__ = "0.0.2" +__version__ = "0.0.3" # List all versions of Python which are supported python_minor_min = 6 From 2f8fd716c20815f336602e8a7ceaa1120cd281c2 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Tue, 14 Jul 2020 18:19:54 +0200 Subject: [PATCH 002/105] ignore build --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fe1f1c0..05a8957 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ pip-wheel-metadata/ notes.md *.yaml dist/ +build/ From c8fb6993ede80a1af12842c94ce732eace209267 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Tue, 14 Jul 2020 18:20:08 +0200 Subject: [PATCH 003/105] offer wheels --- makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makefile b/makefile index cff9b42..1e2f9df 100644 --- a/makefile +++ b/makefile @@ -14,9 +14,9 @@ clean: release: make clean - # python setup.py sdist bdist_wheel + python setup.py sdist bdist_wheel python setup.py sdist - # gpg --detach-sign -a dist/abgleich*.whl + gpg --detach-sign -a dist/abgleich*.whl gpg --detach-sign -a dist/abgleich*.tar.gz install: From 96ea44b2c9746d9d90b8a55921f673e06eba3e77 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 10:49:29 +0200 Subject: [PATCH 004/105] started gui --- src/abgleich/gui/__init__.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/abgleich/gui/__init__.py diff --git a/src/abgleich/gui/__init__.py b/src/abgleich/gui/__init__.py new file mode 100644 index 0000000..d82915c --- /dev/null +++ b/src/abgleich/gui/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/__init__.py: GUI package root + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" From f8d8a931f3619b3d2989ba69959c4764d007a3e8 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:07:42 +0200 Subject: [PATCH 005/105] gui dependency, new install target all --- makefile | 2 +- setup.py | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/makefile b/makefile index 1e2f9df..9e907ad 100644 --- a/makefile +++ b/makefile @@ -21,7 +21,7 @@ release: install: pip install -vU pip setuptools - pip install -v -e .[dev] + pip install -v -e .[all] upload: for filename in $$(ls dist/*.tar.gz dist/*.whl) ; do \ diff --git a/setup.py b/setup.py index c313099..dc4c1d9 100644 --- a/setup.py +++ b/setup.py @@ -6,9 +6,9 @@ zfs sync tool https://github.com/pleiszenburg/abgleich - setup.py: Used for package distribution + setup.py: Used for package distribution - Copyright (C) 2019-2020 Sebastian M. Ernst + Copyright (C) 2019-2020 Sebastian M. Ernst The contents of this file are subject to the GNU Lesser General Public License @@ -57,6 +57,21 @@ # Define source directory (path) SRC_DIR = "src" +# Requirements +extras_require = { + "dev": [ + "black", + "python-language-server[all]", + "setuptools", + "twine", + "wheel", + ], + "gui": [ + "pyqt5", + ], +} +extras_require["all"] = list({rq for target in extras_require.keys() for rq in extras_require[target]}) + # Install package setup( name="abgleich", @@ -78,15 +93,7 @@ python_requires=">=3.{MINOR:d}".format(MINOR=python_minor_min), setup_requires=[], install_requires=["click", "tabulate", "pyyaml", "typeguard",], - extras_require={ - "dev": [ - "black", - "python-language-server[all]", - "setuptools", - "twine", - "wheel", - ] - }, + extras_require=extras_require, zip_safe=False, entry_points={"console_scripts": ["abgleich = abgleich.cli:cli",],}, classifiers=[ From 11f6a35b1197e500878d628d1023d15b44fb2fc8 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:25:05 +0200 Subject: [PATCH 006/105] included black config --- makefile | 3 +++ pyproject.toml | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/makefile b/makefile index 9e907ad..23200e7 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,7 @@ +black: + black . + clean: -rm -r build/* find src/ -name '*.pyc' -exec sudo rm -f {} + diff --git a/pyproject.toml b/pyproject.toml index d1e6ae6..fe89541 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,22 @@ [build-system] requires = ["setuptools", "wheel"] + +[tool.black] +target-version = ['py36'] +include = '\.pyi?$' +exclude = ''' +/( + \.eggs + | \.git + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + | env?? + | env +)/ +''' From 91028c2ef36837b217e984bfca4ba64c11257a51 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:25:14 +0200 Subject: [PATCH 007/105] black --- setup.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index dc4c1d9..188e97b 100644 --- a/setup.py +++ b/setup.py @@ -59,18 +59,12 @@ # Requirements extras_require = { - "dev": [ - "black", - "python-language-server[all]", - "setuptools", - "twine", - "wheel", - ], - "gui": [ - "pyqt5", - ], + "dev": ["black", "python-language-server[all]", "setuptools", "twine", "wheel",], + "gui": ["pyqt5",], } -extras_require["all"] = list({rq for target in extras_require.keys() for rq in extras_require[target]}) +extras_require["all"] = list( + {rq for target in extras_require.keys() for rq in extras_require[target]} +) # Install package setup( From d3e2ac3e21e8c4db234c9ba3b25a7198a5ea5b53 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:28:41 +0200 Subject: [PATCH 008/105] updated install instructions --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d907f16..46a2e3c 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,22 @@ ## SYNOPSIS -`abgleich` is a simple ZFS sync tool. It displays source and target ZFS zpool, dataset and snapshot trees. It creates meaningful snapshots only if datasets have actually been changed. It compares a source zpool tree to a target, backup zpool tree. It pushes backups from a source to a target. It cleanes up older snapshots on the source side if they are present on the target side. It runs on a command line and produces nice, user-friendly, human-readable, colorized output. +`abgleich` is a simple ZFS sync tool. It displays source and target ZFS zpool, dataset and snapshot trees. It creates meaningful snapshots only if datasets have actually been changed. It compares a source zpool tree to a target, backup zpool tree. It pushes backups from a source to a target. It cleanes up older snapshots on the source side if they are present on the target side. It runs on a command line and produces nice, user-friendly, human-readable, colorized output. It also includes an experimental GUI. ![demo](https://github.com/pleiszenburg/abgleich/blob/master/docs/demo.png?raw=true "demo") ## INSTALLATION +The base CLI tool can be installed as follows: + ```bash pip install -vU abgleich ``` -or +An installation also including an experimental GUI can be triggered by running: ```bash -pip install -vU git+https://github.com/pleiszenburg/abgleich.git@master +pip install -vU abgleich[gui] ``` Requires [CPython](https://en.wikipedia.org/wiki/CPython) 3.6 or later, a [Unix shell](https://en.wikipedia.org/wiki/Unix_shell) and [ssh](https://en.wikipedia.org/wiki/Secure_Shell). Tested with [OpenZFS](https://en.wikipedia.org/wiki/OpenZFS) 0.8.x on Linux. From 12b3a7cff181cab84b3170e003107b0f8bd7eca3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:36:46 +0200 Subject: [PATCH 009/105] wizard cli stub --- src/abgleich/cli/wizard.py | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/abgleich/cli/wizard.py diff --git a/src/abgleich/cli/wizard.py b/src/abgleich/cli/wizard.py new file mode 100644 index 0000000..898fb08 --- /dev/null +++ b/src/abgleich/cli/wizard.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/cli/wizard.py: wizard command entry point + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import click + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# ROUTINES +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +@click.command(short_help="run wizard gui") +@click.argument("configfile", type=click.File("r", encoding="utf-8")) +def wizard(configfile): + + pass From 94b47f618b80f04eafe584f85893e2324188c2d5 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:37:57 +0200 Subject: [PATCH 010/105] wizard gui file --- src/abgleich/gui/wizard.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/abgleich/gui/wizard.py diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py new file mode 100644 index 0000000..3f5b368 --- /dev/null +++ b/src/abgleich/gui/wizard.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/wizard.py: wizard gui + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" From 43d5127c5227e0cad88b6b196c04d7337e790f3f Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:42:43 +0200 Subject: [PATCH 011/105] new abc file --- src/abgleich/gui/abc.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/abgleich/gui/abc.py diff --git a/src/abgleich/gui/abc.py b/src/abgleich/gui/abc.py new file mode 100644 index 0000000..21f4ec7 --- /dev/null +++ b/src/abgleich/gui/abc.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/abc.py: Abstract base classes + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import abc + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# CLASSES +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +class WizardUiABC(abc.ABC): + pass From 58753e5d44ae736049d42acb062e1340a2beae13 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:42:53 +0200 Subject: [PATCH 012/105] wizard class --- src/abgleich/gui/wizard.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 3f5b368..4b58e7e 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -23,3 +23,19 @@ """ + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +from typeguard import typechecked + +from .abc import WizardUiABC + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# CLASS +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@typechecked +class WizardUi(WizardUiABC): + pass From 514020f37e08bcd514e40f592f695ea3ded75d05 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:54:18 +0200 Subject: [PATCH 013/105] new abc --- src/abgleich/gui/abc.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/abgleich/gui/abc.py b/src/abgleich/gui/abc.py index 21f4ec7..57f61d6 100644 --- a/src/abgleich/gui/abc.py +++ b/src/abgleich/gui/abc.py @@ -37,3 +37,7 @@ class WizardUiABC(abc.ABC): pass + + +class WizardUiBaseABC(abc.ABC): + pass From 59cf8e539a43f59b3ca7c6ba352e8db31e5c26ac Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:54:39 +0200 Subject: [PATCH 014/105] wizard ui base --- src/abgleich/gui/wizard_base.py | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/abgleich/gui/wizard_base.py diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py new file mode 100644 index 0000000..583fe16 --- /dev/null +++ b/src/abgleich/gui/wizard_base.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/wizard_base.py: wizard gui base + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +from typeguard import typechecked + +from .abc import WizardUiBaseABC + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# CLASS +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@typechecked +class WizardUiBase(WizardUiBaseABC): + pass From df32566e2ccef16fb7d58a55354b9b1d3a38a0be Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 11:54:50 +0200 Subject: [PATCH 015/105] inherit from base --- src/abgleich/gui/wizard.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 4b58e7e..7cd65cd 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -31,11 +31,12 @@ from typeguard import typechecked from .abc import WizardUiABC +from .wizard_base import WizardUiBase # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @typechecked -class WizardUi(WizardUiABC): +class WizardUi(WizardUiABC, WizardUiBase): pass From a28d46a29ceaec13679745b182c05c807f7d86ea Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:32:42 +0200 Subject: [PATCH 016/105] cli launches qt app --- src/abgleich/cli/wizard.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/abgleich/cli/wizard.py b/src/abgleich/cli/wizard.py index 898fb08..616a344 100644 --- a/src/abgleich/cli/wizard.py +++ b/src/abgleich/cli/wizard.py @@ -31,6 +31,10 @@ import click +from ..core.config import Config +from ..gui.lib import run_app +from ..gui.wizard import WizardUi + # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # ROUTINES # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -40,4 +44,4 @@ @click.argument("configfile", type=click.File("r", encoding="utf-8")) def wizard(configfile): - pass + run_app(WizardUi, config=Config.from_fd(configfile)) From 35565a7f5ea9ebfcd37c86b4381bc6a38dbf14c5 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:33:50 +0200 Subject: [PATCH 017/105] config has its own abc --- src/abgleich/core/abc.py | 4 ++++ src/abgleich/core/config.py | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/abgleich/core/abc.py b/src/abgleich/core/abc.py index 7b30159..58a076a 100644 --- a/src/abgleich/core/abc.py +++ b/src/abgleich/core/abc.py @@ -51,6 +51,10 @@ class ComparisonItemABC(abc.ABC): pass +class ConfigABC(abc.ABC): + pass + + class DatasetABC(abc.ABC): pass diff --git a/src/abgleich/core/config.py b/src/abgleich/core/config.py index f207f33..251c3a9 100644 --- a/src/abgleich/core/config.py +++ b/src/abgleich/core/config.py @@ -35,6 +35,7 @@ import yaml from yaml import CLoader +from .abc import ConfigABC from .lib import valid_name # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -43,7 +44,7 @@ @typeguard.typechecked -class Config(dict): +class Config(ConfigABC, dict): @classmethod def from_fd(cls, fd: typing.TextIO): From a2ba90a116dd751e56b7188bf424571124a541c2 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:34:31 +0200 Subject: [PATCH 018/105] gui lib: running an app --- src/abgleich/gui/lib.py | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/abgleich/gui/lib.py diff --git a/src/abgleich/gui/lib.py b/src/abgleich/gui/lib.py new file mode 100644 index 0000000..e74df52 --- /dev/null +++ b/src/abgleich/gui/lib.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/lib.py: gui library + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import sys + +from PyQt5.QtWidgets import QApplication, QDialog +import typeguard + +from ..core.abc import ConfigABC + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# ROUTINES +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@typeguard.typechecked +def run_app(Window: QDialog, config: ConfigABC): + + app = QApplication(sys.argv) + Window(config).show() + sys.exit(app.exec_()) From 1ea016a40a9bc767c2894de21a3505374445e7a0 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:35:25 +0200 Subject: [PATCH 019/105] base window with layouts --- src/abgleich/gui/wizard_base.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 583fe16..5e9eb81 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -28,6 +28,7 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +from PyQt5.QtWidgets import QDialog, QHBoxLayout, QVBoxLayout from typeguard import typechecked from .abc import WizardUiBaseABC @@ -37,5 +38,18 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @typechecked -class WizardUiBase(WizardUiBaseABC): - pass +class WizardUiBase(WizardUiBaseABC, QDialog): + + def __init__(self): + + super(WizardUiBaseABC, self).__init__() # skip WizardUiBaseABC + + self.setWindowTitle('Wizard') + + self._ui_dict = { + 'layout_0_v_root': QVBoxLayout(), # dialog + 'layout_1_h_buttoms': QHBoxLayout(), # for buttons + } + self.setLayout(self._ui_dict['layout_0_v_root']) + + # self._ui_dict['layout_0_v_root'].addLayout(self._ui_dict['layout_1_h_buttoms']) From f72b8ac3838bf528f4b0eea70845bdb7f2d82a09 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:35:37 +0200 Subject: [PATCH 020/105] window with base and config --- src/abgleich/gui/wizard.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 7cd65cd..671a135 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -32,6 +32,7 @@ from .abc import WizardUiABC from .wizard_base import WizardUiBase +from ..core.abc import ConfigABC # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS @@ -39,4 +40,8 @@ @typechecked class WizardUi(WizardUiABC, WizardUiBase): - pass + + def __init__(self, config: ConfigABC): + + super(WizardUiABC, self).__init__() + self._config = config From 31c4acd73dfa0119593a5fcc36dca65fd20b3e30 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:58:24 +0200 Subject: [PATCH 021/105] debugged --- src/abgleich/gui/lib.py | 6 ++++-- src/abgleich/gui/wizard.py | 5 ++--- src/abgleich/gui/wizard_base.py | 6 ++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/abgleich/gui/lib.py b/src/abgleich/gui/lib.py index e74df52..d7f899d 100644 --- a/src/abgleich/gui/lib.py +++ b/src/abgleich/gui/lib.py @@ -28,6 +28,7 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +import typing import sys from PyQt5.QtWidgets import QApplication, QDialog @@ -40,8 +41,9 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @typeguard.typechecked -def run_app(Window: QDialog, config: ConfigABC): +def run_app(Window: typing.Type[QDialog], config: ConfigABC): app = QApplication(sys.argv) - Window(config).show() + window = Window(config) + window.show() sys.exit(app.exec_()) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 671a135..a077044 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -30,7 +30,6 @@ from typeguard import typechecked -from .abc import WizardUiABC from .wizard_base import WizardUiBase from ..core.abc import ConfigABC @@ -39,9 +38,9 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @typechecked -class WizardUi(WizardUiABC, WizardUiBase): +class WizardUi(WizardUiBase): def __init__(self, config: ConfigABC): - super(WizardUiABC, self).__init__() + super().__init__() self._config = config diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 5e9eb81..4d49c43 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -31,18 +31,16 @@ from PyQt5.QtWidgets import QDialog, QHBoxLayout, QVBoxLayout from typeguard import typechecked -from .abc import WizardUiBaseABC - # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @typechecked -class WizardUiBase(WizardUiBaseABC, QDialog): +class WizardUiBase(QDialog): def __init__(self): - super(WizardUiBaseABC, self).__init__() # skip WizardUiBaseABC + super().__init__() # skip WizardUiBaseABC self.setWindowTitle('Wizard') From 769aba406dc0246df2e53b8e44b9b99542182141 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 12:58:36 +0200 Subject: [PATCH 022/105] cleanup --- src/abgleich/gui/abc.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/abgleich/gui/abc.py b/src/abgleich/gui/abc.py index 57f61d6..c73b29c 100644 --- a/src/abgleich/gui/abc.py +++ b/src/abgleich/gui/abc.py @@ -33,11 +33,3 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASSES # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -class WizardUiABC(abc.ABC): - pass - - -class WizardUiBaseABC(abc.ABC): - pass From 131f0c44ac45ba18e0b0f4a2649c6c8b36028ea1 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:06:26 +0200 Subject: [PATCH 023/105] basic ui --- src/abgleich/gui/wizard_base.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 4d49c43..1ee868c 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -28,7 +28,7 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -from PyQt5.QtWidgets import QDialog, QHBoxLayout, QVBoxLayout +from PyQt5.QtWidgets import QDialog, QHBoxLayout, QLabel, QPushButton, QTableView, QVBoxLayout from typeguard import typechecked # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -44,10 +44,18 @@ def __init__(self): self.setWindowTitle('Wizard') - self._ui_dict = { + self._ui = { 'layout_0_v_root': QVBoxLayout(), # dialog - 'layout_1_h_buttoms': QHBoxLayout(), # for buttons + 'layout_1_h_buttons': QHBoxLayout(), # for buttons + 'label': QLabel(), + 'table': QTableView(), + 'button_left': QPushButton(), + 'button_right': QPushButton(), } - self.setLayout(self._ui_dict['layout_0_v_root']) + self.setLayout(self._ui['layout_0_v_root']) - # self._ui_dict['layout_0_v_root'].addLayout(self._ui_dict['layout_1_h_buttoms']) + self._ui['layout_0_v_root'].addWidget(self._ui['label']) + self._ui['layout_0_v_root'].addWidget(self._ui['table']) + self._ui['layout_1_h_buttons'].addWidget(self._ui['button_left']) + self._ui['layout_1_h_buttons'].addWidget(self._ui['button_right']) + self._ui['layout_0_v_root'].addLayout(self._ui['layout_1_h_buttons']) From 9bbfd672486075fa8e5b756f532d7d2379b78c60 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:08:27 +0200 Subject: [PATCH 024/105] cli does not fail if there is no pyqt --- src/abgleich/cli/_main_.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/abgleich/cli/_main_.py b/src/abgleich/cli/_main_.py index e423bf3..c551a1c 100644 --- a/src/abgleich/cli/_main_.py +++ b/src/abgleich/cli/_main_.py @@ -6,9 +6,9 @@ zfs sync tool https://github.com/pleiszenburg/abgleich - src/abgleich/cli/_main_.py: CLI auto-detection + src/abgleich/cli/_main_.py: CLI auto-detection - Copyright (C) 2019-2020 Sebastian M. Ernst + Copyright (C) 2019-2020 Sebastian M. Ernst The contents of this file are subject to the GNU Lesser General Public License @@ -46,7 +46,10 @@ def _add_commands(ctx): for item in os.listdir(os.path.dirname(__file__)) if not item.startswith("_") ): - ctx.add_command(getattr(importlib.import_module("abgleich.cli.%s" % cmd), cmd)) + try: + ctx.add_command(getattr(importlib.import_module("abgleich.cli.%s" % cmd), cmd)) + except ModuleNotFoundError: # likely no gui support + continue @click.group() From 93f069e23b70780d6cb4202430d5a472d71cdd70 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:15:15 +0200 Subject: [PATCH 025/105] right button is default --- src/abgleich/gui/wizard_base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 1ee868c..0942c5e 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -59,3 +59,5 @@ def __init__(self): self._ui['layout_1_h_buttons'].addWidget(self._ui['button_left']) self._ui['layout_1_h_buttons'].addWidget(self._ui['button_right']) self._ui['layout_0_v_root'].addLayout(self._ui['layout_1_h_buttons']) + + self._ui['button_right'].setDefault(True) From 2eb681a81effcd6bfea2f8c7e2cbd573853e11bd Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:16:06 +0200 Subject: [PATCH 026/105] better button names --- src/abgleich/gui/wizard_base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 0942c5e..8a1ec6d 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -49,15 +49,15 @@ def __init__(self): 'layout_1_h_buttons': QHBoxLayout(), # for buttons 'label': QLabel(), 'table': QTableView(), - 'button_left': QPushButton(), - 'button_right': QPushButton(), + 'button_continue': QPushButton(), + 'button_cancel': QPushButton(), } self.setLayout(self._ui['layout_0_v_root']) self._ui['layout_0_v_root'].addWidget(self._ui['label']) self._ui['layout_0_v_root'].addWidget(self._ui['table']) - self._ui['layout_1_h_buttons'].addWidget(self._ui['button_left']) - self._ui['layout_1_h_buttons'].addWidget(self._ui['button_right']) + self._ui['layout_1_h_buttons'].addWidget(self._ui['button_continue']) + self._ui['layout_1_h_buttons'].addWidget(self._ui['button_cancel']) self._ui['layout_0_v_root'].addLayout(self._ui['layout_1_h_buttons']) - self._ui['button_right'].setDefault(True) + self._ui['button_cancel'].setDefault(True) From 96e56732ee5f1e5d44af7579318f78f90edc8141 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:16:28 +0200 Subject: [PATCH 027/105] title fix --- src/abgleich/gui/wizard_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 8a1ec6d..75b8af6 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -42,7 +42,7 @@ def __init__(self): super().__init__() # skip WizardUiBaseABC - self.setWindowTitle('Wizard') + self.setWindowTitle('abgleich wizard') self._ui = { 'layout_0_v_root': QVBoxLayout(), # dialog From 8ed6dad7fa641a3b944d2b6ba093a1228f6f2389 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:22:36 +0200 Subject: [PATCH 028/105] button events, default text, disabled --- src/abgleich/gui/wizard.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index a077044..ddcf083 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -44,3 +44,21 @@ def __init__(self, config: ConfigABC): super().__init__() self._config = config + + self._ui['button_cancel'].setEnabled(False) + self._ui['button_continue'].setEnabled(False) + + self._ui['button_cancel'].clicked.connect(self._cancel_click) + self._ui['button_continue'].clicked.connect(self._continue_click) + + self._ui['button_cancel'].setText('Cancel') + self._ui['button_continue'].setText('Continue') + + + def _continue_click(self): + + pass + + def _cancel_click(self): + + pass From 5ce4c4cb1ccd9468c5135b9e9917f733ac13341b Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:35:43 +0200 Subject: [PATCH 029/105] black --- src/abgleich/cli/_main_.py | 6 +++-- src/abgleich/gui/lib.py | 1 + src/abgleich/gui/wizard.py | 15 +++++------ src/abgleich/gui/wizard_base.py | 47 +++++++++++++++++++-------------- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/abgleich/cli/_main_.py b/src/abgleich/cli/_main_.py index c551a1c..43a6572 100644 --- a/src/abgleich/cli/_main_.py +++ b/src/abgleich/cli/_main_.py @@ -47,8 +47,10 @@ def _add_commands(ctx): if not item.startswith("_") ): try: - ctx.add_command(getattr(importlib.import_module("abgleich.cli.%s" % cmd), cmd)) - except ModuleNotFoundError: # likely no gui support + ctx.add_command( + getattr(importlib.import_module("abgleich.cli.%s" % cmd), cmd) + ) + except ModuleNotFoundError: # likely no gui support continue diff --git a/src/abgleich/gui/lib.py b/src/abgleich/gui/lib.py index d7f899d..6df61bc 100644 --- a/src/abgleich/gui/lib.py +++ b/src/abgleich/gui/lib.py @@ -40,6 +40,7 @@ # ROUTINES # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @typeguard.typechecked def run_app(Window: typing.Type[QDialog], config: ConfigABC): diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index ddcf083..3d31848 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -37,23 +37,22 @@ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @typechecked class WizardUi(WizardUiBase): - def __init__(self, config: ConfigABC): super().__init__() self._config = config - self._ui['button_cancel'].setEnabled(False) - self._ui['button_continue'].setEnabled(False) - - self._ui['button_cancel'].clicked.connect(self._cancel_click) - self._ui['button_continue'].clicked.connect(self._continue_click) + self._ui["button_cancel"].setEnabled(False) + self._ui["button_continue"].setEnabled(False) - self._ui['button_cancel'].setText('Cancel') - self._ui['button_continue'].setText('Continue') + self._ui["button_cancel"].clicked.connect(self._cancel_click) + self._ui["button_continue"].clicked.connect(self._continue_click) + self._ui["button_cancel"].setText("Cancel") + self._ui["button_continue"].setText("Continue") def _continue_click(self): diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 75b8af6..0b07720 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -28,36 +28,43 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -from PyQt5.QtWidgets import QDialog, QHBoxLayout, QLabel, QPushButton, QTableView, QVBoxLayout +from PyQt5.QtWidgets import ( + QDialog, + QHBoxLayout, + QLabel, + QPushButton, + QTableView, + QVBoxLayout, +) from typeguard import typechecked # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @typechecked class WizardUiBase(QDialog): - def __init__(self): - super().__init__() # skip WizardUiBaseABC + super().__init__() # skip WizardUiBaseABC - self.setWindowTitle('abgleich wizard') + self.setWindowTitle("abgleich wizard") self._ui = { - 'layout_0_v_root': QVBoxLayout(), # dialog - 'layout_1_h_buttons': QHBoxLayout(), # for buttons - 'label': QLabel(), - 'table': QTableView(), - 'button_continue': QPushButton(), - 'button_cancel': QPushButton(), - } - self.setLayout(self._ui['layout_0_v_root']) - - self._ui['layout_0_v_root'].addWidget(self._ui['label']) - self._ui['layout_0_v_root'].addWidget(self._ui['table']) - self._ui['layout_1_h_buttons'].addWidget(self._ui['button_continue']) - self._ui['layout_1_h_buttons'].addWidget(self._ui['button_cancel']) - self._ui['layout_0_v_root'].addLayout(self._ui['layout_1_h_buttons']) - - self._ui['button_cancel'].setDefault(True) + "layout_0_v_root": QVBoxLayout(), # dialog + "layout_1_h_buttons": QHBoxLayout(), # for buttons + "label": QLabel(), + "table": QTableView(), + "button_continue": QPushButton(), + "button_cancel": QPushButton(), + } + self.setLayout(self._ui["layout_0_v_root"]) + + self._ui["layout_0_v_root"].addWidget(self._ui["label"]) + self._ui["layout_0_v_root"].addWidget(self._ui["table"]) + self._ui["layout_1_h_buttons"].addWidget(self._ui["button_continue"]) + self._ui["layout_1_h_buttons"].addWidget(self._ui["button_cancel"]) + self._ui["layout_0_v_root"].addLayout(self._ui["layout_1_h_buttons"]) + + self._ui["button_cancel"].setDefault(True) From 48e950f634d8c2502e57d34deaf2fef93f81666f Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 13:58:11 +0200 Subject: [PATCH 030/105] core uses configabc --- src/abgleich/core/dataset.py | 6 +++--- src/abgleich/core/snapshot.py | 6 +++--- src/abgleich/core/zpool.py | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/abgleich/core/dataset.py b/src/abgleich/core/dataset.py index c1451aa..a036514 100644 --- a/src/abgleich/core/dataset.py +++ b/src/abgleich/core/dataset.py @@ -33,7 +33,7 @@ import typeguard -from .abc import DatasetABC, PropertyABC, TransactionABC, SnapshotABC +from .abc import ConfigABC, DatasetABC, PropertyABC, TransactionABC, SnapshotABC from .command import Command from .lib import root from .property import Property @@ -53,7 +53,7 @@ def __init__( properties: typing.Dict[str, PropertyABC], snapshots: typing.List[SnapshotABC], side: str, - config: typing.Dict, + config: ConfigABC, ): self._name = name @@ -179,7 +179,7 @@ def from_entities( name: str, entities: typing.OrderedDict[str, typing.List[typing.List[str]]], side: str, - config: typing.Dict, + config: ConfigABC, ) -> DatasetABC: properties = { diff --git a/src/abgleich/core/snapshot.py b/src/abgleich/core/snapshot.py index 8c200dc..671eec0 100644 --- a/src/abgleich/core/snapshot.py +++ b/src/abgleich/core/snapshot.py @@ -32,7 +32,7 @@ import typeguard -from .abc import PropertyABC, SnapshotABC, TransactionABC +from .abc import ConfigABC, PropertyABC, SnapshotABC, TransactionABC from .command import Command from .lib import root from .property import Property @@ -52,7 +52,7 @@ def __init__( properties: typing.Dict[str, PropertyABC], context: typing.List[SnapshotABC], side: str, - config: typing.Dict, + config: ConfigABC, ): self._name = name @@ -171,7 +171,7 @@ def from_entity( entity: typing.List[typing.List[str]], context: typing.List[SnapshotABC], side: str, - config: typing.Dict, + config: ConfigABC, ) -> SnapshotABC: properties = { diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index 728ef83..c2e370f 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -36,6 +36,7 @@ from .abc import ( ComparisonItemABC, + ConfigABC, DatasetABC, SnapshotABC, TransactionListABC, @@ -57,7 +58,7 @@ @typeguard.typechecked class Zpool(ZpoolABC): def __init__( - self, datasets: typing.List[DatasetABC], side: str, config: typing.Dict, + self, datasets: typing.List[DatasetABC], side: str, config: ConfigABC, ): self._datasets = datasets @@ -247,7 +248,7 @@ def _comparison_table_row(item: ComparisonItemABC) -> typing.List[str]: ] @staticmethod - def available(side: str, config: typing.Dict,) -> int: + def available(side: str, config: ConfigABC,) -> int: output, _ = Command.on_side( [ @@ -265,7 +266,7 @@ def available(side: str, config: typing.Dict,) -> int: return Property.from_params(*output.strip().split("\t")[1:]).value @classmethod - def from_config(cls, side: str, config: typing.Dict,) -> ZpoolABC: + def from_config(cls, side: str, config: ConfigABC,) -> ZpoolABC: output, _ = Command.on_side( [ From 9039c8f73377750e4492201dfd9cb6ed4703540e Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 14:00:26 +0200 Subject: [PATCH 031/105] added missing types --- src/abgleich/core/io.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/abgleich/core/io.py b/src/abgleich/core/io.py index 425d2eb..8f01b11 100644 --- a/src/abgleich/core/io.py +++ b/src/abgleich/core/io.py @@ -24,6 +24,13 @@ """ +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import typing + +import typeguard # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CONSTANTS @@ -50,11 +57,13 @@ # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -def colorize(text, col): +@typeguard.typechecked +def colorize(text: str, col: str) -> str: return c.get(col.upper(), c["GREY"]) + text + c["RESET"] -def humanize_size(size, add_color=False): +@typeguard.typechecked +def humanize_size(size: typing.Union[float, int], add_color: bool = False) -> str: suffix = "B" From e4e669db5bed91688c35de114dae023e9026a22d Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 14:01:11 +0200 Subject: [PATCH 032/105] logged change --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a1e0fa6..ed5e646 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ ## 0.0.3 (2020-XX-XX) -- (TBD) +- FIX: Added missing type checks ## 0.0.2 (2020-07-14) From d4e1fffe111cc6536b1401c5b536be17a0837d2d Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 16:12:28 +0200 Subject: [PATCH 033/105] comparison exposes length --- src/abgleich/core/comparison.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/abgleich/core/comparison.py b/src/abgleich/core/comparison.py index b1b541a..e9c08b2 100644 --- a/src/abgleich/core/comparison.py +++ b/src/abgleich/core/comparison.py @@ -72,6 +72,10 @@ def __init__( self._a, self._b, self._merged = a, b, merged + def __len__(self) -> int: + + return len(self._merged) + @property def a(self) -> ComparisonParentTypes: From c81addaf9450de76fe6b5c3dbde8a47cf1e76ff7 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 16:14:56 +0200 Subject: [PATCH 034/105] new file for transaction model --- src/abgleich/gui/transaction.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/abgleich/gui/transaction.py diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py new file mode 100644 index 0000000..2617cfc --- /dev/null +++ b/src/abgleich/gui/transaction.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/gui/transaction.py: ZFS transactions + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" From c1ffe1ccd4ea635e34823bb288cb46e0a329fd43 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 17:16:14 +0200 Subject: [PATCH 035/105] transaction has signal slot for changes --- src/abgleich/core/transaction.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index 0228380..7916585 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -139,18 +139,33 @@ class TransactionList(TransactionListABC): def __init__(self): self._transactions = [] + self._changed = None def __len__(self) -> int: return len(self._transactions) + @property + def changed(self) -> typing.Union[None, typing.Callable]: + + return self._changed + + @changed.setter + def changed(self, value: typing.Union[None, typing.Callable]): + + self._changed = value + def append(self, transaction: TransactionABC): self._transactions.append(transaction) + if self._changed is not None: + self._changed() def extend(self, transactions: TransactionIterableTypes): self._transactions.extend(transactions) + if self._changed is not None: + self._changed() def print_table(self): From b5d68e6f068ddc433427fdcdfff71916132758d9 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 17:19:31 +0200 Subject: [PATCH 036/105] zpool transaction can be appended to existing list --- src/abgleich/core/zpool.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index c2e370f..611afa0 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -86,13 +86,18 @@ def root(self) -> str: return self._root - def get_cleanup_transactions(self, other: ZpoolABC) -> TransactionListABC: + def get_cleanup_transactions( + self, + other: ZpoolABC, + transactions: typing.Union[None, TransactionListABC] = None, + ) -> TransactionListABC: assert self.side == "source" assert other.side == "target" zpool_comparison = Comparison.from_zpools(self, other) - transactions = TransactionList() + if transactions is None: + transactions = TransactionList() for dataset_item in zpool_comparison.merged: @@ -114,13 +119,18 @@ def get_cleanup_transactions(self, other: ZpoolABC) -> TransactionListABC: return transactions - def get_backup_transactions(self, other: ZpoolABC) -> TransactionListABC: + def get_backup_transactions( + self, + other: ZpoolABC, + transactions: typing.Union[None, TransactionListABC] = None, + ) -> TransactionListABC: assert self.side == "source" assert other.side == "target" zpool_comparison = Comparison.from_zpools(self, other) - transactions = TransactionList() + if transactions is None: + transactions = TransactionList() for dataset_item in zpool_comparison.merged: @@ -160,11 +170,16 @@ def get_backup_transactions(self, other: ZpoolABC) -> TransactionListABC: return transactions - def get_snapshot_transactions(self) -> TransactionListABC: + def get_snapshot_transactions( + self, + transactions: typing.Union[None, TransactionListABC] = None, + ) -> TransactionListABC: assert self._side == "source" - transactions = TransactionList() + if transactions is None: + transactions = TransactionList() + for dataset in self._datasets: if dataset.subname in self._config["ignore"]: continue From 67eb3dec978f3e8ccfd04aeaa2c9da68939be7d3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 18:59:53 +0200 Subject: [PATCH 037/105] expose table columns and rows --- src/abgleich/core/transaction.py | 55 ++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index 7916585..ac15f6f 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -145,6 +145,10 @@ def __len__(self) -> int: return len(self._transactions) + def __getitem__(self, index: int) -> TransactionABC: + + return self._transactions[index] + @property def changed(self) -> typing.Union[None, typing.Callable]: @@ -155,6 +159,32 @@ def changed(self, value: typing.Union[None, typing.Callable]): self._changed = value + @property + def table_columns(self) -> typing.List[str]: + + headers = set() + for transaction in self._transactions: + keys = list(transaction.meta.keys()) + assert "type" in keys + headers.update(keys) + headers = list(headers) + headers.sort() + + if len(headers) == 0: + return headers + + type_index = headers.index("type") + if type_index != 0: + headers.pop(type_index) + headers.insert(0, "type") + + return headers + + @property + def table_rows(self) -> typing.List[str]: + + return [f'transaction #{index:d}' for index in range(1, len(self) + 1)] + def append(self, transaction: TransactionABC): self._transactions.append(transaction) @@ -172,18 +202,18 @@ def print_table(self): if len(self) == 0: return - headers = self._table_headers() - colalign = self._table_colalign(headers) + table_columns = self.table_columns + colalign = self._table_colalign(table_columns) table = [ [ self._table_format_cell(header, transaction.meta.get(header)) - for header in headers + for header in table_columns ] for transaction in self._transactions ] - print(tabulate(table, headers=headers, tablefmt="github", colalign=colalign,)) + print(tabulate(table, headers=table_columns, tablefmt="github", colalign=colalign,)) @staticmethod def _table_format_cell(header: str, value: MetaNoneTypes) -> str: @@ -211,23 +241,6 @@ def _table_colalign(headers: typing.List[str]) -> typing.List[str]: return colalign - def _table_headers(self) -> typing.List[str]: - - headers = set() - for transaction in self._transactions: - keys = list(transaction.meta.keys()) - assert "type" in keys - headers.update(keys) - headers = list(headers) - headers.sort() - - type_index = headers.index("type") - if type_index != 0: - headers.pop(type_index) - headers.insert(0, "type") - - return headers - def run(self): for transaction in self._transactions: From 9f658c2459dfe5231a383595ebf79c66469ae704 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:00:27 +0200 Subject: [PATCH 038/105] draft table model --- src/abgleich/gui/transaction.py | 68 +++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 2617cfc..13d9009 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -23,3 +23,71 @@ """ + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import typing + +import typeguard +from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt + +from ..core.abc import TransactionListABC + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# CLASS +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@typeguard.typechecked +class TransactionListModel(QAbstractTableModel): + + def __init__(self, transactions: TransactionListABC): + + super().__init__() + self._transactions = transactions + self._transactions.changed = self._changed + + self._rows, self._cols = None, None + self._update() + + def data(self, index: QModelIndex, role: int) -> typing.Union[None, str]: # TODO return type + + row, col = index.row(), index.column() + col_key = self._cols[col] + + if role == Qt.DisplayRole: + if col_key != 'status': + return str(self._transactions[row].meta[col_key]) # TODO format ... + else: + return 'no idea' # TODO actual + + def headerData(self, section: int, orientation: Qt.Orientation, role: int) -> typing.Union[None, str]: + + if role == Qt.DisplayRole: + + if orientation == Qt.Horizontal: + return self._cols[section] + + if orientation == Qt.Vertical: + return self._rows[section] + + def rowCount(self, index: QModelIndex) -> int: + + return len(self._transactions) + + def columnCount(self, index: QModelIndex) -> int: + + return len(self._cols) + + def _changed(self): + + self._update() + self.layoutChanged.emit() + # self.model.dataChanged.emit(index, index) + + def _update(self): + + self._rows = self._transactions.table_rows + self._cols = self._transactions.table_columns + self._cols.append('status') From 587c5b88cac8b2dddc1d599fe7268e4b35f79358 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:01:11 +0200 Subject: [PATCH 039/105] draft prepare step in wizard --- src/abgleich/gui/wizard.py | 74 +++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 3d31848..e7215e8 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -30,8 +30,11 @@ from typeguard import typechecked +from .transaction import TransactionListModel from .wizard_base import WizardUiBase from ..core.abc import ConfigABC +from ..core.transaction import TransactionList +from ..core.zpool import Zpool # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS @@ -54,10 +57,79 @@ def __init__(self, config: ConfigABC): self._ui["button_cancel"].setText("Cancel") self._ui["button_continue"].setText("Continue") + self._continue = lambda: None + self._transactions = None + self._model = None + self._steps = [ + { + 'name': 'snap', + 'prepare': self._prepare_snap, + 'prepare_text': 'Collect snapshot tasks ...', + 'run_text': 'Create snapshots ...', + 'finish_text': 'Snapshots created.', + }, + { + 'name': 'backup', + 'prepare': self._prepare_backup, + 'prepare_text': 'Collect backup tasks ...', + 'run_text': 'Transfer backups ...', + 'finish_text': 'Snapshots transferred.', + }, + { + 'name': 'cleanup', + 'prepare': self._prepare_cleanup, + 'prepare_text': 'Collect cleanup tasks ...', + 'run_text': 'Remove old snapshots ...', + 'finish_text': 'Old snapshots removed.', + }, + ] + self._init_step(0) + def _continue_click(self): - pass + self._continue() def _cancel_click(self): + self.close() + + def _init_step(self, index: int): + + self._ui['label'].setText(self._steps[index]['prepare_text']) + self._transactions = TransactionList() + self._model = TransactionListModel(self._transactions) + self._ui['table'].setModel(self._model) + self._continue = lambda: self._prepare_step(index) + self._ui["button_cancel"].setEnabled(True) + self._ui["button_continue"].setEnabled(True) + + def _prepare_step(self, index: int): + + self._ui["button_cancel"].setEnabled(False) + self._ui["button_continue"].setEnabled(False) + self._steps[index]['prepare']() + self._ui['label'].setText(self._steps[index]['run_text']) + self._continue = lambda: self._run_step(index) + self._ui["button_cancel"].setEnabled(True) + self._ui["button_continue"].setEnabled(True) + + def _run_step(self, index: int): + + pass + + def _finish_step(self, index: int): + + pass + + def _prepare_snap(self): + + zpool = Zpool.from_config("source", config=self._config) + zpool.get_snapshot_transactions(self._transactions) + + def _prepare_backup(self): + + pass + + def _prepare_cleanup(self): + pass From 82715aa4c99c9ba6c9c26b73b72ca70f39b7c70a Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:32:39 +0200 Subject: [PATCH 040/105] removed status column --- src/abgleich/gui/transaction.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 13d9009..b6b16a0 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -49,7 +49,7 @@ def __init__(self, transactions: TransactionListABC): self._transactions.changed = self._changed self._rows, self._cols = None, None - self._update() + self._update_labels() def data(self, index: QModelIndex, role: int) -> typing.Union[None, str]: # TODO return type @@ -57,10 +57,7 @@ def data(self, index: QModelIndex, role: int) -> typing.Union[None, str]: # TODO col_key = self._cols[col] if role == Qt.DisplayRole: - if col_key != 'status': - return str(self._transactions[row].meta[col_key]) # TODO format ... - else: - return 'no idea' # TODO actual + return str(self._transactions[row].meta[col_key]) # TODO format ... def headerData(self, section: int, orientation: Qt.Orientation, role: int) -> typing.Union[None, str]: @@ -82,12 +79,14 @@ def columnCount(self, index: QModelIndex) -> int: def _changed(self): - self._update() - self.layoutChanged.emit() - # self.model.dataChanged.emit(index, index) + old_rows, old_cols = self._rows, self._cols + self._update_labels() + if old_rows != self._rows: + self.layoutChanged.emit() - def _update(self): + # self.dataChanged.emit(index, index) # TODO + + def _update_labels(self): self._rows = self._transactions.table_rows self._cols = self._transactions.table_columns - self._cols.append('status') From 6ac779ba7a15a627f5927cc15513a6c1a604c352 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:40:34 +0200 Subject: [PATCH 041/105] ui refresh --- src/abgleich/gui/transaction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index b6b16a0..eb76a22 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -32,6 +32,7 @@ import typeguard from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt +from PyQt5.QtWidgets import QApplication from ..core.abc import TransactionListABC @@ -83,6 +84,7 @@ def _changed(self): self._update_labels() if old_rows != self._rows: self.layoutChanged.emit() + QApplication.processEvents() # self.dataChanged.emit(index, index) # TODO From 644f5ed82dfda2ce206463173d6699e3b62c034c Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:42:18 +0200 Subject: [PATCH 042/105] missing ui refresh --- src/abgleich/gui/wizard.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index e7215e8..4842ae5 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -28,6 +28,7 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +from PyQt5.QtWidgets import QApplication from typeguard import typechecked from .transaction import TransactionListModel @@ -107,6 +108,7 @@ def _prepare_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) + QApplication.processEvents() self._steps[index]['prepare']() self._ui['label'].setText(self._steps[index]['run_text']) self._continue = lambda: self._run_step(index) From 8cc4d4c7386a8e3e652b87785a53eea5c3878141 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:53:43 +0200 Subject: [PATCH 043/105] auto resize colums --- src/abgleich/gui/transaction.py | 6 +++--- src/abgleich/gui/wizard.py | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index eb76a22..abe9e06 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -32,7 +32,6 @@ import typeguard from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt -from PyQt5.QtWidgets import QApplication from ..core.abc import TransactionListABC @@ -43,11 +42,12 @@ @typeguard.typechecked class TransactionListModel(QAbstractTableModel): - def __init__(self, transactions: TransactionListABC): + def __init__(self, transactions: TransactionListABC, parent_changed: typing.Callable): super().__init__() self._transactions = transactions self._transactions.changed = self._changed + self._parent_changed = parent_changed self._rows, self._cols = None, None self._update_labels() @@ -84,8 +84,8 @@ def _changed(self): self._update_labels() if old_rows != self._rows: self.layoutChanged.emit() - QApplication.processEvents() + self._parent_changed() # self.dataChanged.emit(index, index) # TODO def _update_labels(self): diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 4842ae5..78b99e1 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -86,6 +86,11 @@ def __init__(self, config: ConfigABC): ] self._init_step(0) + def _changed(self): + + self._ui['table'].resizeColumnsToContents() + QApplication.processEvents() + def _continue_click(self): self._continue() @@ -98,7 +103,7 @@ def _init_step(self, index: int): self._ui['label'].setText(self._steps[index]['prepare_text']) self._transactions = TransactionList() - self._model = TransactionListModel(self._transactions) + self._model = TransactionListModel(self._transactions, self._changed) self._ui['table'].setModel(self._model) self._continue = lambda: self._prepare_step(index) self._ui["button_cancel"].setEnabled(True) From 29a4355465ebf4f0e9b2b18b02db8bc07018ed97 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 19:57:16 +0200 Subject: [PATCH 044/105] better name --- src/abgleich/gui/transaction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index abe9e06..ac28f27 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -46,7 +46,7 @@ def __init__(self, transactions: TransactionListABC, parent_changed: typing.Call super().__init__() self._transactions = transactions - self._transactions.changed = self._changed + self._transactions.changed = self._transactions_changed self._parent_changed = parent_changed self._rows, self._cols = None, None @@ -78,7 +78,7 @@ def columnCount(self, index: QModelIndex) -> int: return len(self._cols) - def _changed(self): + def _transactions_changed(self): old_rows, old_cols = self._rows, self._cols self._update_labels() From 5b224ca6f6f7217092cc5e88cfe595b7c1f8bf22 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 20:09:49 +0200 Subject: [PATCH 045/105] status colors for transactions --- src/abgleich/gui/transaction.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index ac28f27..852adfd 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -32,6 +32,7 @@ import typeguard from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt +from PyQt5.QtGui import QColor from ..core.abc import TransactionListABC @@ -52,7 +53,7 @@ def __init__(self, transactions: TransactionListABC, parent_changed: typing.Call self._rows, self._cols = None, None self._update_labels() - def data(self, index: QModelIndex, role: int) -> typing.Union[None, str]: # TODO return type + def data(self, index: QModelIndex, role: int) -> typing.Union[None, str, QColor]: # TODO return type row, col = index.row(), index.column() col_key = self._cols[col] @@ -60,6 +61,17 @@ def data(self, index: QModelIndex, role: int) -> typing.Union[None, str]: # TODO if role == Qt.DisplayRole: return str(self._transactions[row].meta[col_key]) # TODO format ... + if role == Qt.DecorationRole: + if col_key != 'type': + return + if self._transactions[row].error is not None: + return QColor('#FF0000') + if self._transactions[row].running: + return QColor('#FFFF00') + if self._transactions[row].complete: + return QColor('#00FF00') + return QColor('#0000FF') + def headerData(self, section: int, orientation: Qt.Orientation, role: int) -> typing.Union[None, str]: if role == Qt.DisplayRole: From b0b4632f80bb0b3981d3b2d175d1cc885906dcd8 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 20:48:07 +0200 Subject: [PATCH 046/105] show human size --- src/abgleich/gui/transaction.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 852adfd..8012868 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -35,6 +35,7 @@ from PyQt5.QtGui import QColor from ..core.abc import TransactionListABC +from ..core.io import humanize_size # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS @@ -59,7 +60,9 @@ def data(self, index: QModelIndex, role: int) -> typing.Union[None, str, QColor] col_key = self._cols[col] if role == Qt.DisplayRole: - return str(self._transactions[row].meta[col_key]) # TODO format ... + if col_key == 'written': + return humanize_size(self._transactions[row].meta[col_key]) + return self._transactions[row].meta[col_key] if role == Qt.DecorationRole: if col_key != 'type': From 12d9099e7fb2dbf4a385180738ab7b7b1bddff8a Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Fri, 17 Jul 2020 20:58:30 +0200 Subject: [PATCH 047/105] colors in ui table --- src/abgleich/core/io.py | 28 +++++++++++++++------------- src/abgleich/gui/transaction.py | 10 ++++++++++ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/abgleich/core/io.py b/src/abgleich/core/io.py index 8f01b11..1ad69d4 100644 --- a/src/abgleich/core/io.py +++ b/src/abgleich/core/io.py @@ -6,9 +6,9 @@ zfs sync tool https://github.com/pleiszenburg/abgleich - src/abgleich/core/io.py: Command line IO + src/abgleich/core/io.py: Command line IO - Copyright (C) 2019-2020 Sebastian M. Ernst + Copyright (C) 2019-2020 Sebastian M. Ernst The contents of this file are subject to the GNU Lesser General Public License @@ -63,22 +63,24 @@ def colorize(text: str, col: str) -> str: @typeguard.typechecked -def humanize_size(size: typing.Union[float, int], add_color: bool = False) -> str: +def humanize_size(size: typing.Union[float, int], add_color: bool = False, get_rgb: bool = False) -> str: suffix = "B" - for unit, color in ( - ("", "cyan"), - ("Ki", "green"), - ("Mi", "yellow"), - ("Gi", "red"), - ("Ti", "magenta"), - ("Pi", "white"), - ("Ei", "white"), - ("Zi", "white"), - ("Yi", "white"), + for unit, color, rgb in ( + ("", "cyan", "#0000FF"), + ("Ki", "green", "#00FF00"), + ("Mi", "yellow", "#FFFF00"), + ("Gi", "red", "#FF0000"), + ("Ti", "magenta", "#FF00FF"), + ("Pi", "white", "#FFFFFF"), + ("Ei", "white", "#FFFFFF"), + ("Zi", "white", "#FFFFFF"), + ("Yi", "white", "#FFFFFF"), ): if abs(size) < 1024.0: + if get_rgb: + return rgb text = "%3.1f %s%s" % (size, unit, suffix) if add_color: text = colorize(text, color) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 8012868..8088648 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -64,6 +64,16 @@ def data(self, index: QModelIndex, role: int) -> typing.Union[None, str, QColor] return humanize_size(self._transactions[row].meta[col_key]) return self._transactions[row].meta[col_key] + if role == Qt.ForegroundRole: + if col_key != 'written': + return + return QColor('#808080') + + if role == Qt.BackgroundRole: + if col_key != 'written': + return + return QColor(humanize_size(self._transactions[row].meta[col_key], get_rgb=True)) + if role == Qt.DecorationRole: if col_key != 'type': return From 9cb1a1ce1fa9de1ef8e6088bd3cfa6c9b8d4fc76 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sat, 18 Jul 2020 11:00:25 +0200 Subject: [PATCH 048/105] progress bar --- src/abgleich/gui/wizard_base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 0b07720..0459243 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -32,6 +32,7 @@ QDialog, QHBoxLayout, QLabel, + QProgressBar, QPushButton, QTableView, QVBoxLayout, @@ -56,6 +57,7 @@ def __init__(self): "layout_1_h_buttons": QHBoxLayout(), # for buttons "label": QLabel(), "table": QTableView(), + "progress": QProgressBar(), "button_continue": QPushButton(), "button_cancel": QPushButton(), } @@ -63,6 +65,7 @@ def __init__(self): self._ui["layout_0_v_root"].addWidget(self._ui["label"]) self._ui["layout_0_v_root"].addWidget(self._ui["table"]) + self._ui["layout_0_v_root"].addWidget(self._ui["progress"]) self._ui["layout_1_h_buttons"].addWidget(self._ui["button_continue"]) self._ui["layout_1_h_buttons"].addWidget(self._ui["button_cancel"]) self._ui["layout_0_v_root"].addLayout(self._ui["layout_1_h_buttons"]) From e57bd3d30a6a0a0f9891ad66f149e923c5c409b3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sat, 18 Jul 2020 11:19:47 +0200 Subject: [PATCH 049/105] snapshot transactions from generator --- src/abgleich/core/zpool.py | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index 611afa0..0e0dce0 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -39,6 +39,7 @@ ConfigABC, DatasetABC, SnapshotABC, + TransactionABC, TransactionListABC, ZpoolABC, ) @@ -170,26 +171,41 @@ def get_backup_transactions( return transactions - def get_snapshot_transactions( - self, - transactions: typing.Union[None, TransactionListABC] = None, - ) -> TransactionListABC: + def get_snapshot_transactions(self) -> TransactionListABC: assert self._side == "source" - if transactions is None: - transactions = TransactionList() + transactions = TransactionList() for dataset in self._datasets: - if dataset.subname in self._config["ignore"]: - continue - if dataset["mountpoint"].value is None: + transaction = self._get_snapshot_transactions_from_dataset(dataset) + if transaction is None: continue - if dataset.changed: - transactions.append(dataset.get_snapshot_transaction()) + transactions.append(dataset.get_snapshot_transaction()) return transactions + def generate_snapshot_transactions(self) -> typing.Generator[typing.Tuple[int, typing.Union[None, TransactionABC]], None, None]: + + assert self._side == "source" + + yield len(self._datasets), None + + for index, dataset in enumerate(self._datasets): + transaction = self._get_snapshot_transactions_from_dataset(dataset) + yield index, transaction + + def _get_snapshot_transactions_from_dataset(self, dataset: DatasetABC) -> typing.Union[None, TransactionABC]: + + if dataset.subname in self._config["ignore"]: + return + if dataset["mountpoint"].value is None: + return + if not dataset.changed: + return + + return dataset.get_snapshot_transaction() + def print_table(self): table = [] From 062db66218e7945262bd26a437457c6091f92b47 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sat, 18 Jul 2020 11:20:36 +0200 Subject: [PATCH 050/105] progress --- src/abgleich/gui/wizard.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 78b99e1..23d3aff 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -131,7 +131,19 @@ def _finish_step(self, index: int): def _prepare_snap(self): zpool = Zpool.from_config("source", config=self._config) - zpool.get_snapshot_transactions(self._transactions) + + gen = zpool.generate_snapshot_transactions() + length, _ = next(gen) + + self._ui['progress'].setMaximum(length) + self._ui['progress'].setValue(0) + QApplication.processEvents() + + for index, transaction in gen: + if transaction is not None: + self._transactions.append(transaction) + self._ui['progress'].setValue(index + 1) + QApplication.processEvents() def _prepare_backup(self): From 4c3a921289b075be342e136cd109569e0c20f129 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sat, 18 Jul 2020 11:25:56 +0200 Subject: [PATCH 051/105] default window size --- src/abgleich/gui/wizard_base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index 0459243..ae1eb3b 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -71,3 +71,5 @@ def __init__(self): self._ui["layout_0_v_root"].addLayout(self._ui["layout_1_h_buttons"]) self._ui["button_cancel"].setDefault(True) + + self.resize(1000, 700) From 6e9cf0453a8ed5193644ec5205d7d240177d4f9b Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 10:57:50 +0200 Subject: [PATCH 052/105] transactions emit events --- src/abgleich/core/transaction.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index ac15f6f..778fd5a 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -55,6 +55,18 @@ def __init__( self._running = False self._error = None + self._changed = None + + @property + def changed(self) -> typing.Union[None, typing.Callable]: + + return self._changed + + @changed.setter + def changed(self, value: typing.Union[None, typing.Callable]): + + self._changed = value + @property def complete(self) -> bool: @@ -84,7 +96,10 @@ def run(self): if self._complete: return + self._running = True + if self._changed is not None: + self._changed() try: if len(self._commands) == 1: @@ -98,6 +113,8 @@ def run(self): finally: self._running = False self._complete = True + if self._changed is not None: + self._changed() MetaTypes = typing.Union[str, int, float] @@ -189,13 +206,19 @@ def append(self, transaction: TransactionABC): self._transactions.append(transaction) if self._changed is not None: - self._changed() + self._link_transaction(transaction) def extend(self, transactions: TransactionIterableTypes): self._transactions.extend(transactions) if self._changed is not None: - self._changed() + for transaction in transactions: + self._link_transaction(transaction) + + def _link_transaction(self, transaction: TransactionABC): + + transaction.changed = lambda: self._changed(self._transactions.index(transaction)) + transaction.changed() def print_table(self): From 5fd3c770f0a33679800935bf44687f6a33193cea Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 10:58:28 +0200 Subject: [PATCH 053/105] model emits change event --- src/abgleich/gui/transaction.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 8088648..314d3b2 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -103,15 +103,14 @@ def columnCount(self, index: QModelIndex) -> int: return len(self._cols) - def _transactions_changed(self): + def _transactions_changed(self, row): old_rows, old_cols = self._rows, self._cols self._update_labels() - if old_rows != self._rows: + if old_rows != self._rows or old_cols != self._cols: self.layoutChanged.emit() - + self.dataChanged.emit(self.index(row, 0), self.index(row, len(self._cols) - 1)) self._parent_changed() - # self.dataChanged.emit(index, index) # TODO def _update_labels(self): From e92a6248b6e34103c69fa7f9799a51e32c4d260d Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 10:59:10 +0200 Subject: [PATCH 054/105] wizard runs transactions --- src/abgleich/gui/wizard.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 23d3aff..8bb96f9 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -122,7 +122,26 @@ def _prepare_step(self, index: int): def _run_step(self, index: int): - pass + self._ui["button_cancel"].setEnabled(False) + self._ui["button_continue"].setEnabled(False) + QApplication.processEvents() + + for transaction in self._transactions: + + assert not transaction.running + assert not transaction.complete + + transaction.run() + + assert not transaction.running + assert transaction.complete + + if transaction.error is not None: + raise transaction.error # TODO + + self._continue = lambda: self._finish_step(index) + self._ui["button_cancel"].setEnabled(True) + self._ui["button_continue"].setEnabled(True) def _finish_step(self, index: int): From 19cfc68403e2b4c74634e508f190c1c0b3d120a9 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 11:19:16 +0200 Subject: [PATCH 055/105] prepared handoff to next step --- src/abgleich/gui/wizard.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 8bb96f9..561668f 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -101,6 +101,8 @@ def _cancel_click(self): def _init_step(self, index: int): + self._ui["button_cancel"].setEnabled(False) + self._ui["button_continue"].setEnabled(False) self._ui['label'].setText(self._steps[index]['prepare_text']) self._transactions = TransactionList() self._model = TransactionListModel(self._transactions, self._changed) @@ -139,13 +141,17 @@ def _run_step(self, index: int): if transaction.error is not None: raise transaction.error # TODO + self._ui['label'].setText(self._steps[index]['finish_text']) self._continue = lambda: self._finish_step(index) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) def _finish_step(self, index: int): - pass + if index + 1 == len(self._steps): + self.close() # TODO + + self._init_step(index + 1) def _prepare_snap(self): From 1b3769c3c7c64b9c16a0d7c5845e1ec08fe016c7 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 11:24:40 +0200 Subject: [PATCH 056/105] transaction list and model can be cleared --- src/abgleich/core/transaction.py | 5 +++++ src/abgleich/gui/transaction.py | 5 +++-- src/abgleich/gui/wizard.py | 12 +++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index 778fd5a..b850295 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -215,6 +215,11 @@ def extend(self, transactions: TransactionIterableTypes): for transaction in transactions: self._link_transaction(transaction) + def clear(self): + + self._transactions.clear() + self._changed() + def _link_transaction(self, transaction: TransactionABC): transaction.changed = lambda: self._changed(self._transactions.index(transaction)) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 314d3b2..579278d 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -103,13 +103,14 @@ def columnCount(self, index: QModelIndex) -> int: return len(self._cols) - def _transactions_changed(self, row): + def _transactions_changed(self, row: typing.Union[None, int] = None): old_rows, old_cols = self._rows, self._cols self._update_labels() if old_rows != self._rows or old_cols != self._cols: self.layoutChanged.emit() - self.dataChanged.emit(self.index(row, 0), self.index(row, len(self._cols) - 1)) + if row is not None: + self.dataChanged.emit(self.index(row, 0), self.index(row, len(self._cols) - 1)) self._parent_changed() def _update_labels(self): diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 561668f..bc516cd 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -59,8 +59,11 @@ def __init__(self, config: ConfigABC): self._ui["button_continue"].setText("Continue") self._continue = lambda: None - self._transactions = None - self._model = None + + self._transactions = TransactionList() + self._model = TransactionListModel(self._transactions, self._changed) + self._ui['table'].setModel(self._model) + self._steps = [ { 'name': 'snap', @@ -84,6 +87,7 @@ def __init__(self, config: ConfigABC): 'finish_text': 'Old snapshots removed.', }, ] + self._init_step(0) def _changed(self): @@ -104,9 +108,7 @@ def _init_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) self._ui['label'].setText(self._steps[index]['prepare_text']) - self._transactions = TransactionList() - self._model = TransactionListModel(self._transactions, self._changed) - self._ui['table'].setModel(self._model) + self._transactions.clear() self._continue = lambda: self._prepare_step(index) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) From 56f9cbedef32e15eb5651f4fd247ce31d90e3cf1 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 11:31:33 +0200 Subject: [PATCH 057/105] progress on running actions --- src/abgleich/gui/wizard.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index bc516cd..0438098 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -107,6 +107,7 @@ def _init_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) + self._ui['progress'].setValue(0) self._ui['label'].setText(self._steps[index]['prepare_text']) self._transactions.clear() self._continue = lambda: self._prepare_step(index) @@ -128,14 +129,17 @@ def _run_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) + self._ui['progress'].setMaximum(len(self._transactions)) QApplication.processEvents() - for transaction in self._transactions: + for number, transaction in enumerate(self._transactions): assert not transaction.running assert not transaction.complete transaction.run() + self._ui['progress'].setValue(number + 1) + QApplication.processEvents() assert not transaction.running assert transaction.complete @@ -163,13 +167,12 @@ def _prepare_snap(self): length, _ = next(gen) self._ui['progress'].setMaximum(length) - self._ui['progress'].setValue(0) QApplication.processEvents() - for index, transaction in gen: + for number, transaction in gen: if transaction is not None: self._transactions.append(transaction) - self._ui['progress'].setValue(index + 1) + self._ui['progress'].setValue(number + 1) QApplication.processEvents() def _prepare_backup(self): From 0029e8215356900c7c4853f4c7e3ccb9d24f22d6 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 12:33:11 +0200 Subject: [PATCH 058/105] fix: allow to attach change function --- src/abgleich/core/transaction.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index b850295..a204d52 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -210,6 +210,7 @@ def append(self, transaction: TransactionABC): def extend(self, transactions: TransactionIterableTypes): + transactions = list(transactions) self._transactions.extend(transactions) if self._changed is not None: for transaction in transactions: From 959edd0c427f71feb8c1c2e008bb1de6c0f421a5 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 12:33:48 +0200 Subject: [PATCH 059/105] generate backup transactions --- src/abgleich/core/zpool.py | 88 +++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index 0e0dce0..e318104 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -123,53 +123,74 @@ def get_cleanup_transactions( def get_backup_transactions( self, other: ZpoolABC, - transactions: typing.Union[None, TransactionListABC] = None, ) -> TransactionListABC: assert self.side == "source" assert other.side == "target" zpool_comparison = Comparison.from_zpools(self, other) - if transactions is None: - transactions = TransactionList() + transactions = TransactionList() for dataset_item in zpool_comparison.merged: - - if dataset_item.get_item().subname in self._config["ignore"]: - continue - if dataset_item.a is None: + backup_transactions = self._get_backup_transactions_from_datasetitem(other, dataset_item) + if backup_transactions is None: continue + transactions.extend(backup_transactions) - if dataset_item.b is None: - snapshots = list(dataset_item.a.snapshots) - else: - dataset_comparison = Comparison.from_datasets( - dataset_item.a, dataset_item.b - ) - snapshots = dataset_comparison.a_head + return transactions - if len(snapshots) == 0: - continue + def generate_backup_transactions( + self, + other: ZpoolABC, + ) -> typing.Generator[typing.Tuple[int, typing.Union[None, typing.Union[None, typing.Generator[TransactionABC, None, None]]]], None, None]: - source_dataset = ( - self.root - if len(dataset_item.a.subname) == 0 - else join(self.root, dataset_item.a.subname) - ) - target_dataset = ( - other.root - if len(dataset_item.a.subname) == 0 - else join(other.root, dataset_item.a.subname) - ) + assert self.side == "source" + assert other.side == "target" - transactions.extend( - ( - snapshot.get_backup_transaction(source_dataset, target_dataset,) - for snapshot in snapshots - ) + zpool_comparison = Comparison.from_zpools(self, other) + + yield len(zpool_comparison), None + + for index, dataset_item in enumerate(zpool_comparison.merged): + yield index, self._get_backup_transactions_from_datasetitem(other, dataset_item) + + def _get_backup_transactions_from_datasetitem( + self, + other: ZpoolABC, + dataset_item: ComparisonItemABC, + ) -> typing.Union[None, typing.Generator[TransactionABC, None, None]]: + + if dataset_item.get_item().subname in self._config["ignore"]: + return + if dataset_item.a is None: + return + + if dataset_item.b is None: + snapshots = list(dataset_item.a.snapshots) + else: + dataset_comparison = Comparison.from_datasets( + dataset_item.a, dataset_item.b ) + snapshots = dataset_comparison.a_head - return transactions + if len(snapshots) == 0: + return + + source_dataset = ( + self.root + if len(dataset_item.a.subname) == 0 + else join(self.root, dataset_item.a.subname) + ) + target_dataset = ( + other.root + if len(dataset_item.a.subname) == 0 + else join(other.root, dataset_item.a.subname) + ) + + return ( + snapshot.get_backup_transaction(source_dataset, target_dataset,) + for snapshot in snapshots + ) def get_snapshot_transactions(self) -> TransactionListABC: @@ -192,8 +213,7 @@ def generate_snapshot_transactions(self) -> typing.Generator[typing.Tuple[int, t yield len(self._datasets), None for index, dataset in enumerate(self._datasets): - transaction = self._get_snapshot_transactions_from_dataset(dataset) - yield index, transaction + yield index, self._get_snapshot_transactions_from_dataset(dataset) def _get_snapshot_transactions_from_dataset(self, dataset: DatasetABC) -> typing.Union[None, TransactionABC]: From 358a699a1fc0a1358ee5cc040a431e7e154fbc94 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 12:34:53 +0200 Subject: [PATCH 060/105] gui prepares backup transactions --- src/abgleich/gui/wizard.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 0438098..ec4ea8b 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -177,7 +177,20 @@ def _prepare_snap(self): def _prepare_backup(self): - pass + source_zpool = Zpool.from_config("source", config=self._config) + target_zpool = Zpool.from_config("target", config=self._config) + + gen = source_zpool.generate_backup_transactions(target_zpool) + length, _ = next(gen) + + self._ui['progress'].setMaximum(length) + QApplication.processEvents() + + for number, transactions in gen: + if transactions is not None: + self._transactions.extend(transactions) + self._ui['progress'].setValue(number + 1) + QApplication.processEvents() def _prepare_cleanup(self): From b7b95b7a195976331a789b7d34e6de2ee78d2f36 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 13:20:43 +0200 Subject: [PATCH 061/105] generate cleanup transactions --- src/abgleich/core/zpool.py | 53 ++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index e318104..49ddd19 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -90,35 +90,56 @@ def root(self) -> str: def get_cleanup_transactions( self, other: ZpoolABC, - transactions: typing.Union[None, TransactionListABC] = None, ) -> TransactionListABC: assert self.side == "source" assert other.side == "target" zpool_comparison = Comparison.from_zpools(self, other) - if transactions is None: - transactions = TransactionList() + transactions = TransactionList() for dataset_item in zpool_comparison.merged: - if dataset_item.get_item().subname in self._config["ignore"]: - continue - if dataset_item.a is None or dataset_item.b is None: + cleanup_transactions = self._get_cleanup_from_datasetitem(dataset_item) + if cleanup_transactions is None: continue + transactions.extend(cleanup_transactions) - dataset_comparison = Comparison.from_datasets( - dataset_item.a, dataset_item.b - ) - snapshots = dataset_comparison.a_overlap_tail[ - : -self._config["keep_snapshots"] - ] + return transactions - transactions.extend( - (snapshot.get_cleanup_transaction() for snapshot in snapshots) - ) + def generate_cleanup_transactions( + self, + other: ZpoolABC, + ) -> typing.Generator[typing.Tuple[int, typing.Union[None, typing.Union[None, typing.Generator[TransactionABC, None, None]]]], None, None]: - return transactions + assert self.side == "source" + assert other.side == "target" + + zpool_comparison = Comparison.from_zpools(self, other) + + yield len(zpool_comparison), None + + for index, dataset_item in enumerate(zpool_comparison.merged): + yield index, self._get_cleanup_from_datasetitem(dataset_item) + + def _get_cleanup_from_datasetitem( + self, + dataset_item: ComparisonItemABC, + ) -> typing.Union[None, typing.Generator[TransactionABC, None, None]]: + + if dataset_item.get_item().subname in self._config["ignore"]: + return + if dataset_item.a is None or dataset_item.b is None: + return + + dataset_comparison = Comparison.from_datasets( + dataset_item.a, dataset_item.b + ) + snapshots = dataset_comparison.a_overlap_tail[ + : -self._config["keep_snapshots"] + ] + + return (snapshot.get_cleanup_transaction() for snapshot in snapshots) def get_backup_transactions( self, From 0650cbcbce4c6c447909a907d52e403d2b9db422 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 13:24:31 +0200 Subject: [PATCH 062/105] cleanup step --- src/abgleich/gui/wizard.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index ec4ea8b..261fb11 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -28,7 +28,7 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -from PyQt5.QtWidgets import QApplication +from PyQt5.QtWidgets import QApplication, QMessageBox from typeguard import typechecked from .transaction import TransactionListModel @@ -74,14 +74,14 @@ def __init__(self, config: ConfigABC): }, { 'name': 'backup', - 'prepare': self._prepare_backup, + 'prepare': lambda: self._prepare('backup'), 'prepare_text': 'Collect backup tasks ...', 'run_text': 'Transfer backups ...', 'finish_text': 'Snapshots transferred.', }, { 'name': 'cleanup', - 'prepare': self._prepare_cleanup, + 'prepare': lambda: self._prepare('cleanup'), 'prepare_text': 'Collect cleanup tasks ...', 'run_text': 'Remove old snapshots ...', 'finish_text': 'Old snapshots removed.', @@ -119,7 +119,12 @@ def _prepare_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) QApplication.processEvents() - self._steps[index]['prepare']() + + if not self._steps[index]['prepare'](): + QMessageBox.warning(self, 'Warning', 'Nothing to do.') + self._finish_step(index) + return + self._ui['label'].setText(self._steps[index]['run_text']) self._continue = lambda: self._run_step(index) self._ui["button_cancel"].setEnabled(True) @@ -155,7 +160,9 @@ def _run_step(self, index: int): def _finish_step(self, index: int): if index + 1 == len(self._steps): - self.close() # TODO + self._transactions.clear() + self.close() + return self._init_step(index + 1) @@ -175,12 +182,14 @@ def _prepare_snap(self): self._ui['progress'].setValue(number + 1) QApplication.processEvents() - def _prepare_backup(self): + return len(self._transactions) > 0 + + def _prepare(self, action: str): source_zpool = Zpool.from_config("source", config=self._config) target_zpool = Zpool.from_config("target", config=self._config) - gen = source_zpool.generate_backup_transactions(target_zpool) + gen = getattr(source_zpool, f'generate_{action:s}_transactions')(target_zpool) length, _ = next(gen) self._ui['progress'].setMaximum(length) @@ -192,6 +201,4 @@ def _prepare_backup(self): self._ui['progress'].setValue(number + 1) QApplication.processEvents() - def _prepare_cleanup(self): - - pass + return len(self._transactions) > 0 From b187336849839be0c7efb2ad62c9fefd2c6d9d76 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 13:41:46 +0200 Subject: [PATCH 063/105] fix string conversion and error handling --- src/abgleich/core/command.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/abgleich/core/command.py b/src/abgleich/core/command.py index ba43f7e..7dfe918 100644 --- a/src/abgleich/core/command.py +++ b/src/abgleich/core/command.py @@ -48,7 +48,7 @@ def __init__(self, cmd: typing.List[str]): def __str__(self) -> str: - return " ".join(self._cmd) + return " ".join([item.replace(' ', '\\ ') for item in self._cmd]) def run(self): @@ -60,7 +60,7 @@ def run(self): output, errors = output.decode("utf-8"), errors.decode("utf-8") if not status or len(errors.strip()) > 0: - raise SystemError("command failed", self.cmd, output, errors) + raise SystemError("command failed", str(self), output, errors) return output, errors @@ -93,7 +93,7 @@ def run_pipe(self, other: CommandABC): ) ): raise SystemError( - "command pipe failed", self.cmd, other.cmd, errors_1, output_2, errors_2 + "command pipe failed", f'{str(self):s} | {str(other):s}', errors_1, output_2, errors_2 ) return errors_1, output_2, errors_2 From 9f1c5e9d12ee78d3a6195c292d96f72287be7fc0 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 13:42:07 +0200 Subject: [PATCH 064/105] catch critical errors --- src/abgleich/gui/wizard.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 261fb11..7981ca7 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -150,7 +150,13 @@ def _run_step(self, index: int): assert transaction.complete if transaction.error is not None: - raise transaction.error # TODO + QMessageBox.critical( + self, + "Critical", + "Transaction failed!\n\n" + '\n\n'.join([str(item) for item in transaction.error.args]), + ) + self._quit() + return self._ui['label'].setText(self._steps[index]['finish_text']) self._continue = lambda: self._finish_step(index) @@ -160,8 +166,7 @@ def _run_step(self, index: int): def _finish_step(self, index: int): if index + 1 == len(self._steps): - self._transactions.clear() - self.close() + self._quit() return self._init_step(index + 1) @@ -202,3 +207,8 @@ def _prepare(self, action: str): QApplication.processEvents() return len(self._transactions) > 0 + + def _quit(self): + + self._transactions.clear() + self.close() From 5377671624d2522153f7fb054a8b906853bb14d8 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 13:53:16 +0200 Subject: [PATCH 065/105] logged changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index ed5e646..6dabb8e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ## 0.0.3 (2020-XX-XX) +- FEATURE: Added wizard GUI for backup tasks (`snap`, `backup`, `cleanup`). - FIX: Added missing type checks ## 0.0.2 (2020-07-14) From acc398ac709ae52927a86ea5554bb3a0e27420a1 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:04:41 +0200 Subject: [PATCH 066/105] added gui screenshots and information --- README.md | 18 ++++++++++++++++-- docs/demo_gui01.png | Bin 0 -> 43687 bytes docs/demo_gui02.png | Bin 0 -> 46883 bytes docs/demo_gui03.png | Bin 0 -> 31154 bytes 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 docs/demo_gui01.png create mode 100644 docs/demo_gui02.png create mode 100644 docs/demo_gui03.png diff --git a/README.md b/README.md index 46a2e3c..1c9405c 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,20 @@ ## SYNOPSIS -`abgleich` is a simple ZFS sync tool. It displays source and target ZFS zpool, dataset and snapshot trees. It creates meaningful snapshots only if datasets have actually been changed. It compares a source zpool tree to a target, backup zpool tree. It pushes backups from a source to a target. It cleanes up older snapshots on the source side if they are present on the target side. It runs on a command line and produces nice, user-friendly, human-readable, colorized output. It also includes an experimental GUI. +`abgleich` is a simple ZFS sync tool. It displays source and target ZFS zpool, dataset and snapshot trees. It creates meaningful snapshots only if datasets have actually been changed. It compares a source zpool tree to a target, backup zpool tree. It pushes backups from a source to a target. It cleanes up older snapshots on the source side if they are present on the target side. It runs on a command line and produces nice, user-friendly, human-readable, colorized output. It also includes a GUI. + +## CLI EXAMPLE ![demo](https://github.com/pleiszenburg/abgleich/blob/master/docs/demo.png?raw=true "demo") +## GUI EXAMPLE + +![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") + +![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") + +![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") + ## INSTALLATION The base CLI tool can be installed as follows: @@ -14,7 +24,7 @@ The base CLI tool can be installed as follows: pip install -vU abgleich ``` -An installation also including an experimental GUI can be triggered by running: +An installation also including a GUI can be triggered by running: ```bash pip install -vU abgleich[gui] @@ -93,6 +103,10 @@ Send (new) datasets and new snapshots from source to target. Cleanup older local snapshots on source side if they are present on both sides. Of those snapshots present on both sides, keep at least `keep_snapshots` number of snapshots on source side. +### `abgleich wizard config.yaml` + +Runs a sequence of `snap`, `backup` and `cleanup` in a wizard GUI. + ## SPEED `abgleich` uses Python's [type hints](https://docs.python.org/3/library/typing.html) and enforces them with [typeguard](https://github.com/agronholm/typeguard) at runtime. It furthermore makes countless assertions. diff --git a/docs/demo_gui01.png b/docs/demo_gui01.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed6e9bd619fc8ce604f18b821336c48f456ee1d GIT binary patch literal 43687 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�GoA7xd7klmgkF)<&;0ReR9o>G{tA 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 O1OPSe-6>Oh6#8EcpK;j$ literal 0 HcmV?d00001 diff --git a/docs/demo_gui02.png b/docs/demo_gui02.png new file mode 100644 index 0000000000000000000000000000000000000000..82f999f27c7c324e91230978142a3759276ae621 GIT binary patch literal 46883 zcmZ^JWmFtX*Y4m1f&_O7?!nz5SO#~O;O=h0A-Dw_+}#}#+}%C63=m*&yPTZ&{k|Xf z-k!B)b@i%UUA?Pn%k%6AMR_R{BmyJ=0DvMREujnmz#Ibr(2I!BZ%>l#nZy79s31#m zaYY$%aWV%ddoxQLQviTA-Zx%Qx>tm#-$14CBX*b@y5o>y7GroMpA~kbBKaIrCEpL- z2RI->0v4{+ug0ydLF4&f{aP9b8lvb=07oYmWtVu2*HkR+J`abrSod2J_j5q5l2Q6R zC%i?QZBgPo)(jnN@oGf!Z=V7z)3gRMDGRswyUspro#Jv&oC}0e# z0*igfPijXzqw3X5YZnCXk$XLTP18;|!s7ZqrjUsSe;j8tJ2&|x9{e8l%vK@DGn?zGmouk_6n0^lFh zyTT9=K~qSM=-+y}E128Af-J9ZVU&%X(h)Bj2><{xfQ*Ews>cd=-BlAyhY;|`-OOF9 zt(}pvrba{t4o;NnJ-EvHq_O?&f+3XrQbQ;yDk*cM>15n2#&o^r9a%8C7$SM_3#=}n#B>&&ADaB12f3SCYmd$SJz`Z5(w-h@ z@P~hU`8n4?vW)P+$p1D!`AWTsqKo;%C^^3UKJ-d=m0^XAs%5xJa?<5=c_>0tYQ$wEW%hkyjIsRts%}1CTza~z`8i1P-IFXX9W(6^HZF3q zhwOhw2&5mM0|Lk4QNV*c7xbPMwVE9!2cY0S38LA5-_9Cp)G*KKDJu&rO%?U$PSz^P z%*+T$5ew&af7@y1wyxUJ(o$W>9RWZRTU=NevCRL^2TyHA=h1=^W)@Sn>FAWOB#kc4 zX_;w!UnxJ$ybg_w`H+yv&$?U_%#V*Tjii|3Q9qm#IwQ+*ayHgU{#DqNLFP|?15w5o zmXnI|os*q^xuOx&3K5a_y)@_o3UHZa3^*h5aeSdy|rq;&PlbcM-9F z@fY^Y%@y>y+vgDxX9=~k{6yhibLjp1cgnIs&mLrBXS`MzWZsXzD~qGS0aaOY*YaCD zox2GRaNcxQPaX5Tvc2i)COLp|q>;8=PaSQ2ups-eIZnV$!0l6$w{2SQ@^E#~w7+{} zW6`tc021(gxVv$UPj~DJM`?FkE^LjCXgjp#51etx>h^V@IKy?{)x0(6?9)-$xZrht zWCWd;8eB+qm{G)ju^WC}p||9p)LrZ*Kk&Ab@N_e28h6=-`MX*M!jGtht37EdI1`yp z*ZY-m<%^(XX?c0OodvHqEtuXW$qV=^KQVB@^$((uu8cLsM@F&%99q{NxE7qLW2=2G z&UyI(5}!W{m6NftU79RBr){(EvoJ9;?_b?_Li4#EZ|zywFIIbN_zDWm&O| z6Pi6fdxeqVl!hUc_Y0Nn&DB%oyWcKUQn+uPaL9i5dhF6ZeQ3jR)k-L4_A~fdPl=`A z7CExkAw4OnX3Tv*_;nMc)hVAKN&gaFwiL%g(Tc{!;sfec-t-f{XWr^$3tp9w?`ud)WjRU;)Yp3siiw&++A<}=(Qhj=a>8=4sg+4sgA1^SCqhn*mhDWYA z|FM{?dO1EmChinKLJBdX9`N+^tgWq$AWdM_LwhV}$%JH;#YNLoeYV;Zh}&?5|1k%# zD1H^<T>aL_8R|&au9$nOz z0{}*Tx-LOp=3N^-(iYuq)<{9(Jn-^CpKt9ev}vVLV!skxu*5DuAjt|*Y-v~u`bcLS z3jiF~S}XZk2J0K2if@2AJe;(cbJmY&C#zMV^kFy~+QQzXfO4hoO^)h^ffa%T?l28o zRQV(!yzC~hfIpJ|U`Y^bg?>hV27fUlN#lO0^t=&R{jpuVx$L`^AvTYXd+lT}RJ0m^ zr%kQA=!}^2*-7d7>=o4_Z{&BW@;ls=>Q0PF_bkD6h`vX%yzO@b8&JzjmTPxyCviih zbG?bMgYc>NzXprdKQ$48e|WUNhf7IaEc;qoS;_Q_=8U<+##>>7)Mj(>A_xQ6G9GG7 zYH&GXm@ij%bgY>i9!D0yg$#Q#;JDjaq5&czB8G>D-AM%tEn|wk%hT04kLSvcY&IDo z8~KyCuVv~C^q_>4w5&v(8|)OH1QiBGzl&oOZ0zJ1ecQ&yhK9xlSZGmY<(bt(_hu3y z;1~Jl29JJ7=g0Y>RT1Y%#$%X(n3$@>sL{%rnx!Sp%7i#TKzMnvHkK9{SG+&sM;}k) z{+6JA#=>)c|Ih8(+|B(kg_e|UtgdVDy{Kj7@E&bi8$>@ z%&8=SO@AH-sZ6gb<{dE_sl^vi9DLbswTCC~qP=1)vYH&nMi$|I{#JfJ4||tlWj{Ev zkpk3lORujHUoX!vkOlyj&?YHbeNT>6YCo=i9+@s}%+Pks?yA)5_OiJ<`&a`908n4< z&P33NmUv!U3u|@mur}BvLe8|RLUqTD!N<~&z8n9HYDd&) z-1i$V{&S*ZdFChgf85g4tLP20f34{9Si^RKL)!Z$T}M(DG(d@&k>B0!QAzW;m1_A) zuAUAqf_ESp4Y|;Zk_W6$)7^5;)&PnP1|}w{z&o_q@Ue;E@$u2~sjBF;QV85GS@o16?#mzF-nlkQ&YQAy)VCmQ3F%3 zls=M=s>sX9$%V(-&oo&6>5pRR$zCkeTWxa0OfRxTccu+B!h^n4uXJ!ZX}r2^TKH(J zzNyJ18Ui2rt%o~SANNBfeWd4;#9VVzE{3Vzb8ly71O^h>$wsexr&S6gZ62*`yL>Nw zXu5bYH#|T)IfPL!1}ycHv(!M!!+yOTItQTnF4sduW<$u6mP~|Irk3=O;Mheb`9}*b z%k|1q$!1>qad38v@pOAFc6W(URz-2~)z>J80&~@}X?pZy>A{P1|?4u`p9AiE`8 z^}u{JJH>xX3{K}Nv4_E0^S*0vV`9KXcofV1BrH7H)-<30Cv|T^C-?3wXmF#`8VT^b zTK`~oA4)M6)ETbuq&QgSm8+;(MQ|DEuUC$ZQ!N2qo#RnIfYN^dn4X4*3=7SiT3%J9 zKRNK=>N2)^d*L*p&+1#fG#=8JUM{sU^&U;Obd`E{rXL42X1+{A;fu7#{iW&KTA1zc z4-8PR0Rn0;iomE? z`%a2e^D7I?vDJCTZl_XcY7=JrT-^XzfDiAYmSU4>sOI5Q z$YF6O|B2HMt0y;vwSE%cudMZjPaZ5bloeG{=;RpXRNvm{eGdf5x4u_T`H{@fcy54?qg(0asKUuzWPe6iSlo-or)+n0kyAl1ZLrtDj-37aF$P!>QJ2 zzA@J(_;CLaWnOJ_Q?&&af4H7moE;w>m6Men86K}TSJ4m`r^rcE$W_F1x>}$yPfhI7 z7~700;}~)~D|~*k(S?-r4RFnuspnd*w2KdBW@aYs7MOESUjM1k8{5OBRr~G0BQk0k z8=2BZOGlmsCEL5w1dl5Qpv{@H;;vWsh2$xgYMbb6Jf7ljw=A;m$3&x4=>km}Z8B63 zQd+e>@+z@7@ijQJA$Eh9bCX;eJfKD6!R9uXN0p2 z0-QOWgqWU?N{P7Z28%ic_C}4co#h!Fq+~C>*ILguJ9QUUs`3s>UUDFGl9!$i1M?cK z|JAReu9)e=g)y+E&o_xiw?sbrIn1%m5C6n&&Bf zW|M)v3yoHQq%%f2LxzH%D*KH3Y~EJaR%$J}RT3YE-vY{)kK5yqOEuoHqi3Zh9((0_ zwRcZPi9#x0=lYIFW!0}3_}c60>f&>ABO|SraiiZumGie|- z240{K|1xvHxoX_Axg=hhQu ze0<%DI8W~e#W9|1seSfA*-p=cqiC_GbU8#)=3Kw<2nr6c?OuJU1JqoX5|2)GbsjCk zH6}9(bDPKSasXz0%lux_@V>}qW4w>lz}IG|hEC@>BKQ;jV)G;)wvLm>bYhTBMJS4X zyZ$@r>GjHbG@tbPRO@oG?c}d<2krUO7y*#tNnYQTZeDDL`1Nr`5qvKfd+WRp{4Px> z0GYNX*Yzyq+kqQR9;SAYA4Jde^M7U)P$Nl6R^|=COF&e~R;_b`E}&^(&lB?EnXeJ}@i9NS@C z7N@3iXpavsFst=H`@M!wxnwjHJ+zXq8p!;)6!~ir$FZ<>3GwhXeAYM1qtha$2mSq| z&toJUI%doW!^Y^2$M(xNr9U@bG%2 zEhoir!jF5?TZGL)_G>9BHBSBAy0)JEi{}D&_r~32JZk$BG?ly8m;Ix0S6f3wqVj&C zPzEv)c_IdzWGvhoj5wHp97F(=7>_Pc&H`P0Iu?nKhk*=Ugz5s!y@66W!(Ycs^ectv*5)BzGwdBEa8v=Tq zs7Ry`;|S@r>hJyCtu2sbNCVb=l(}ZW?wqRh^YJR{|0I{psWe7?p1jKjX_U&k%xJVo zQU1;sPD(!m!~ah5ZPlDxb(wKqulq-dWjBW?87NS~DE`S=(8aphQGiU#+iC2BsK)O9 zCfbk;X9r853Cn+4#Xli`H#H*pm%j$)P3T7##Xrg?4?g;vr@r0Jy8rtCz3BY!u!u$v zF@JlY_xxA-e>(q<^nY{n|Ly!=>9<#nQoym?01sCN#w%^JnOG=o zn<M0KaxuA#tXt)E{7_86PI&1}rVLCe16Zs2zk7Ow%wu-SRxkeeGkBv@=B6H|9{!=p&CTTo%*W5uIhIGLj9%+pGr46u zc@=SYBM{4cqCX^&{W8t|snp8=eKtFNci84d6E;`RCV zN*zM9bCUcfL1r?ZuD^PmLc11>QVri42qh-T$Ibp>URBn&gLLc}>y%|?J2d(}jot9* zto_VcFX=6$K8PJ;)b)00VvRt{X9~zw&4Q1%G%2jitLTH$o?NK{<+7m=!93z{_T%Gw&J3H|5ohbm zQ_G56FzFIo@6q@TQ6>3dJ5ztW8#}#im6$JZQ(ITCR)YNLQHzlh7G_XOS8u+!s(L=# zKc&P0Am(q{&7n&nqhOmBDj+#BuJiNbGeFU%H5@Nb93G8J-NWwAM~=5(KF#G_37=Y9 zIklFBssT9*Ex9BUSSHe3Ml9AwYR4P9lRU37?%f)v3j*_PSKD>2z^l3T_%TY@^_hbQ zK_t{zQ|UO3jGUjm|3%A$m)w0Nlen5V7 zQY>e62{cov8gdsqP6-BYiSQ1(dxjbpOX9OmtW$vl%N>ySMwgZToy^kghUyX-OE?&c zP+LE=(j9j<lS8BL6OJ{~95_OX?*R85%G`unuk%cPRTJoJvdGcc!pDZgaw``>J(^jEf1&Q~L zJGo9tHS=}VvjG5(N-`?yWbB+laI;SM9m4`MvHY@;e8uqI@`On?`-C8O*X(O|uI6y2kSr4Q^V4Pl?15ju*?{@gq1j7ab zr}3IzqK=y6pZvyj`OjH`1c6AzkzjfITHN$tsK`QCe`y%_-n5?DEVPF&5wSvP&vv8~ zQd3~~Us5R~n{8BHPTKKa(Ca{pNG!9)JGL4;kkBTgJMGFEe}Gb&nTNrhCFJK;L3o=p z3ennef99GOZ&e%|HOp_`I&?t5_6fd)j>`|B(qB9M$dkT?P(0N8p=m52Uv!wa6(4Ek z=Ph)l^>eu#a)yHWa3m+Oa$_fv>iEqL%Tp8!Z3VkZ3-(t}WM>T&=C>rO*BIU!2V05~ zf1QQFXWnL8|NSLVaCkLYgyy2J(@XH|EZAcS|6gB{>iGZkvAM$VLil@x4;34SJGeE3 z|L%Fhrm9C& z{y6n&l6{90L-e(Oh_TN=eD0BeYX_JFzKuf;@jc>~_a=iNE7oyB|F1B+?_e`9*iQx| zhNy3cha6lhf|z?Qzj+ajNj|3X38$NMdK~|({ChKeOvUIg%_oa5Pau80UT*_~)532? zl8Dcr=^xEA5bav%R+b8CoNraMz>%-j(c@k|`)1!@+qb!wx{jIJw$!Eyn?HgZvZtG2 zDbK6)JyN7zqEue*Dz_Cy5uc6f&tZ#U;`82>xtlMZGlQ0^TA@O+E@05bUV=xXfhfyO zXKJJh=FS8r7ugFJ3=HY+*0+(!%oDbi9(YkBnT@+^$*bLW!}0Tj{lNt}# zx{f|qhw`>WI(#j+>8{(Zxe#|1`MY1Gf`VC@dTV^K>pt9B{ix3`6%PZ)zt>mWo89b= zj`@AAf^47xl(*m#^~9SjZH^LOYbkH3Nqy(Z{>Xw4L;kMDF99*kTDy*_K1#94Z4{3xrCPq*Sznf_b?UphI~S7+;IM-YqwGO|mdwR&%TwA;LH)0{az zrUC$j-NgzAoZNO*gy8wQh|M;{A~DyUTgZ);!|v2~kbV`DHlH_&zNcV_+8Vmj;g@D3 z9rAP!>|e3eI(KyNc%$~#GGPQ7ow27kJe?HB%) z?@@x)%_q>M&(IgZ#7auag3m_y#=m< zy9R<(^8_YZ7h_W6v}q3r^Xk#7jc2L-4t3LkAv&3q69CXA@^$i3u;-RSFt7f_P)#*D zVE$%b6TQ9oc=`A|Z+^6#h*BdfKG~dvrv<+Ip!49_Xe)f?fuR$Tevm~xpLehUyIi$h zlUC(tZ6H&P87YsZ!_~Jq-akF;J+-~%@nMKLkUT@75^rXDzP2!Eac~j4Y0h_||FM10 z&Bbb;?>0vBW&YWx(BNDxkbeNdgRjx%2+VCY3Ilb2`Og`7cf>C$P15%H=jHHO8xGXT zq(MiENlkIA{k4>NkP4m{;)iZTqz^nU4)ajZ+e3-CtwC=3NXUZS4fpNXm|Q~4AHR4_ zWjcnHZmf#g=?Zd9{FzB=H7|ghZq9Eg=ef~!*xH^aOy%}Ox~UYxr#P8eiwknEC?-aE zhb+iCad|ewsR7GqRA0?P(n+`MxiPHcUWHJVJ+<&Hfe>pth&W2D{0mA4iQCo4u$oDy zRcS_32Iu0Y*rfBX`zTz6@Ad=966aZ;o{N@S#5L^Jkye%pJvI+LQ)e{A5I>PZrxJ(i zXRw446DX%vX&M<~D3E$?dTDK4uP)wP?`3CnpXy(j6F}#+4_4{O^SLmAFX3;;Dk(yV z=Ls5xc_910y6ACJPW?Vo7u@wPTwGDu9AtHn5HwVshH<{y`Kd#qf__qF={NGW_uj;1 zU&oB)cPVWDPJKX=oJo_a*+qot$u1 zN!0Q66c0hK6757aY0hjT^4jU^#&OrMX{SmGIkz#4JRfl87LSePLd{xrpRm5gE*9_o zmcr@XZS)+Xnu1P!v$b2Q5j{xM<#jbu1p>cBjEXrgpC9VMWs$Xc(@LA)osDw$e#7DP zZFlQ0MSD*U3#nLnukHEq&g-yM61ZWf=}#x_b^KIL({qXg>LPLTwf9eURx!_(H^P#L z##--8*=jwWORgzLcqq>_sCm|BCI51ncJvC`y1wAhE1A z7Ie7{*>W!D%TP=%_q;c#DJ13iWG`;8km*IcI}okHZY2!jcHQJ(rgC__1CGjsRfVqe z@D5*|Wzs$72`|oo%gdW7y{mYZh;fP@1?rWE@R_Hxwo9ODZTZ&au zuu_%X;u0AHFR)LV^1YmebF4lH$46c4gtu*uCc=>pLuR8BnLB9}?Z_^_9|{x`Qi}6o z6a|U3hGW#z;TXKWM5I365ZX%LD^1BLhsaP~#>2O}{rI^Po?||rl5uj(B(D3SQiXe_ z?|m;uMBrixIciavtS)LiyNBl1!u8RfVPAX=kqYi$I^4U9W#bSOBdsY%@Z5%Sgy~(Q z&I$n?=h;$e3O&Q`^oE*h`n$LvlURcM?&RyW?vq}}jH8W^3(Ew*XKmGs>S(xfE2Gi} zu3e9zD2@*rgJosR*R3gapRd7ImdX{uCMzAKrs}d~(w92Em;bE=$lFSwgTD_1*dA1M z&EHG(l&$h`&dbEep|eU(GV4#cp04JD_>44@wO?RXm3|eU<9xyhr78?e)bMN-m+Yxo zam~;=an=ewTv?vSDlA6otNZMFXjP7ap}o10%QcwiYEA=_ZZuEWWRsJS8TTuzB1qj&-sUiwrhoGTa(@>3RBH--d`&t^W`-qAKUFwhM6g=bbVYmw8w2_A zwa(HXcI6qW87_6()%oS{(N6;Gu`e4B3RUaapCa=YI$KGojCcm*QPuw{(eWWVM+zqk zzMa4s|D9BK{}jo>2Xp35Tp7G~;)vu(>15sedp*A}06o$LOf#;>yQUK+R1)nn3a@SF zRbc~BR2V6RE_!^;)jc#Avfcdw%&r@H$Wgcqc65c?93J0wTwO_Gd+9w!O*Iv*Hd>1- zaX!88E|NozN@@uLH$XeW5Gngj>&J-Put74@%5qUeO2u10X9Y zrz6u8Th|rnr7s^t$skyMcU|>D@@PuR7}c^65(3NN`0m-gVr3|{t;TurelQ{g3n7@U z)TTV)9lN%ML34pQFHxkaR?ohvDLXuH#Lql1nGmbYYSK01Jt}ya$HCh!+AU}R<+iF& z`{hQ6K|IIIFy|vbhONa{z(3iNEP$w zNF#dzR$~Lt*$60$=DdHmhC?dh9#l(rloFZxUT$>=1-7!XSm#oGB9~5G0gTEsC`AaK^2YgDkqb}-rBqEeyeUF08Chny` z<&PrrS8=Fn>)}r`a|`tNl@Fm0yGHUPN_d=|u}b-cN+xh=T1kQNU0_q$@hNFwTw1?a zqkXC8JwwabS^7$Pospd7(aB8fGB50VC|Y1;!lEUyxGx_Ie^@|iUW(I~vLDXE?yhgp znBA;sl3Q|wTZylXS}mg6fxEOwSSBRaWkb#+y;Qi7|& z0(y`O3eV%6+bvn4s^YoEhQsf3E-6W7e~`XGAFJDjFV$4CBf()tvQmOL53G5a47LYqH*ZTGwHFf zaoB~fF0Ls26N0?0tmphv^X~oMtd|%KmFt-)HV{}yg+1dphSg5@npH2o&Xag=GZ(5s z^U@i;17}CGG)P$bY*_J_;VY((1(2UfFxyFu=k zqEUkUSei@Iao#vT(fefSn>1EpW?x;f(n?9fVKO`{Vs7KL%UmWxw*GF>!zt7~B~CIJ zmg`_7;llgqBE!9*Ua?4m+q`jARoRk@ohgWl8Vm5rlI|!er3oHgdAUT1@1f0sg*Tdf zp92urk(2~YtfMD;V)opmHuGt0lhVnA73{oL=osSHRQd8mqj1!R9ZuQR%oGv9Zozw%kYmOc9tu$w-E0o!t+DY%Gm zzxGx<8fQ^f>tEAE#Fo}dFx#1BwY@p_FlF_0q9XmDn?zDleOW)ws4~BuBfQ0`{A!7% zo?G1NF04_$Vq?UdFEH<*#MGRxsxCYhQ>G-y#RG;F{I03ho&;-4d}wMUzk!YQ7_2dc zBqI~6^t~9Lcp`uF#r3A{gak8v7i_-rG22lG&gWbz!4MbUFeyVf8_1wzC}(V!|}Aa;fvus_Ls%Q6e4*XaWOT@_ZuOoAD#*9GQx*J!dg$_O$24|Z}$*m&2D zX%yD)xf?<-pRX@kEU-vV{ftOETTbKlIH%h?>-SROK9&Cokp+c0zuDvz>Tf!+y<@vq zW`eZ<1j8*(?^cJ?ws(GV>`|i2Ir5JeQC4ZCPyV<2w}OURji#F)7IDXqHdMsL`)f)K z+V^i~umynx0K~!*E>qKiW3|Mm1#_&c??i(Ydb{T2G_(WwXwBm!&jLYzl9N!5-GAID zh%@H`1s~koT8$0c#gA>xNVC`241Yuaj=X+e8K(s_TA>Q618=7g3`d1J9@y;}v(>@% zD1k_?I(8~$!WR8=S>+nn)~Rum4xCIG*IBJCZ5u4na5`Ade!nlbG|5vZHL8z!%<@u& z;NCgujMSfU&6sY4>aV+5mL1Mr+3u8GZL_Dor=UT{fb-4!%Ii}~@kNf%u&>(WEl>|@|cU1+8rY(pXK?KZl%3AmW9y@N`;DfDy@XlIrlUn_ zM^n<+MJx=LabnBIdY}RTiwRCDE9qpzQi&pzq0ZGxP znST;JciMxd(@7%!yZfxO&2D>p^RTQC`i#!Lvr}%4yw!M9eLgI}8zW$QI}C>@uTbB6 zfZ%_$^C>+hGO|pq9LKHy)s^v2!hJ+7Su5_#wUD{LkBY{Q@cHm?p3W6t1-q`hhvw<) zZguUp0Ew9J>ht66X;+dHe@jCZWW~M1M#Uo=sosIRdEgtaCLq1!}16`QV zvz&z2ApSY^G*vtSo=AGn+~;KC!a3u$DjfeA?@@oeCXm~kR%>(L*M zED6IXK15yo1=;%T!>hl)@ofI84je*+v4*dov)O4pCnarMlt?H8zC?= z?qAsajp1YU0{$YDel`y=ywv;uf|Q4`GMlWuPoAaxeszI=#NLA9;3+iu&DZ+wsi$HH zMcAX-qa5BlH-f+X)An>BZbvT~ktJDMY($JK;~>udIZa zt%d%#$+1+s2qahS+|);Re^8yPaGq^e8(U%!s4}RRO zLyZsUqWfJzNpKhO-`n~0Zt3v<17?2meT|MEyV?R>R>-Qowu2^_DCKcS%fVHrOe(|rG3n7 z)^*VPvw9+ePFNeqQ7ik4iI6(vX6)O>DN)7>Z`&=%m$5A1=i=h2!if26f+nI#wat&Y z!QNKMM6(-Ip0j>&-|C_#AX!PY9{4UtK-T-%h)q4-SH@JTV0370p!W;^)NtIx zOTLiSK0n*1DAU;()YHyqVwFq2#0$gKnuT%i(-@PHvzJ~cfwhr|g+aY#Plyb>QVmR@ z`h1lskm=aoBC6wbwpI!6>Ml$DV9)$a(9gj$S?+j1h7c4EC859#)Xm;+y&nmZI>6=f z6SALq!Gq7?Ia-!;$Z!VlCrW9!!NpM|s_Tx!!0{(`5RSeI_8c{{K#sC@FoELK6TGPd z$`5)?g5DQT$u8c0*1q2P1TjoZydrhkHpCm=b_GS2X^+&?^*|Gi0X`;P_gA|=`!T#3 zQp|14WCmK?_q4~&9k`D=#!&ar7CbhO{W`Ivy22dN&rc2gqR^M-{r|2sy=U`n1)>+l zORTlt6XY-*bJEn=;3uoq+Q3BS>$;RFW_GYOSJQkRQg3$AqP2~T+(AFcj&#{wG%56G zGUHD&wOztc<+GHnP_zF)&Y2Lg56tH(p4Tcw#2O|3hr8+)mXx#42{F+ZAlJ%pfV6T? z)0d;o#>7~Ig8)&Lw;YKQHoze`UTXjS>HP3w^K3xcV>VLw8l{rF)FY>-+g-wWEUS&y{fEuU~&u9-xik zt#z76y^`!SulYSfeu9nGpL{#oQ4PH4L>UEJXn9>ulKisx?_G}Bz0@2kD!9$uv>h(D z+un8ZKYBhwh+2|XEUUb@TXA8q01ugouOLrWEdQmq>+T42fJB|>#E+t3c} zDn*@LY!D!gv4W&eAgH~Sb@ML}+mdRDX#&p9HJeC`?K-@;?)pPV=^vj51BKL*=|J&U zaU`xJp!W0$Xh~<;pJDahXA5VTiebni7x(-6QE1E;91QHZ&o=|(L_F*UbAfn+=awVTz6vH9kR{nHr@?>`nmV2P_q$J<>B!J9wUFRCi#3m$I2 zt|nJSr`#2Mv`)iu<6c_Hm|C){d2aXMR*-!Z**PS9f8C8{XurEZcb3Rkz56TR%}TYS zuHm(~7L`-MD zvngiKSruxGT^0?|ciOk&i=O>XJ|TM%sZ_IZaAt=TaimwB>D~9A!Qo8LD{sj4%^iZw zL|VMtGa5B(F!~#(29kLrIo=BW1=(_|9_&Gkli`e%-{~ldnw0U+chY`m^)(nJv%Lw^IclDtUEz|d{l>G5D zs{&1ZQ{EIS_d9r>yd^no`V z^?pL52XyF&vSi3FyKc`#G_K#1N2MZ|*HE6$G(CT78jXd82l3Td>1ybh5Fi3{o+uex z=QG!(6i7GGb9_v%e-(cOa0z-0uaViMVoS+q@ijHY?l<0FP56(O!jQ;!@S zUFtNup0DgBIBQUWIP*NS&G)8Dqko19%nd`jKu~|WR64sFmM*l?BFKnF-yo@^;O7V3 zG09WxP1#_LfA}c6M+z93G(9cyVJ{0!$@_NHC^2Bqx16Cu^vR7owyt zs4-CEZXIWA^VgYjUG2}ftvY{?eoENB`aR@o^IKlip;m^g~6|M zA7Xy>GqK;~BjA|QMuC3HFcWUU%y$U+WNTrReg#$@N<<53XtP9NceTV$wpo2#oXrbV zuG*iPV|*5;SGliCQb+dB);@j{z9zP5R8CaZdIPY^xGfFy#9#`wsXOSs9MZ<{t*vleNycz^Vx#ut#ozqo#sC{2J zlQ*fjXr(L8WlW;mB3R*O^b_`&J^3UsV1icVra86FDXaDmCe%U!El35vi=chl`CgN<@CYHeuL#)|pXGTYr*B)3!rb zl^qhQ?qst!rr?`5nCHKC+zHn6riKT+RV+wZ>yg0uAS1L}En6Nj2JCt&I&`hpmW9rM<1nPo3Aw2%j(SjnPRf0Mj}%^OyIwUb=LedD*&4jp53P-4z^|f=lnNTI zHTEktA?M%2)WvCBDkkntOajrxUQ_8Gx1>{y007Mt0ARG{J&cHEiX#1l_(0pDV#1mD z_mfpZ81zuCdTVXd(@_rA-Wf(HzbocW0&5kt}@xrJI2tt#f{1gSVW^j^QT(rVFNv?;B9M*%dfAh3-fBDeCDRaBji#8|+TINowS< zA}ShD6sy@qmY@6TU};7BTAv5)J7igkEXv4Q;|^4mp@1krSvLnkU*a1rd6E(?(t5Mw zdx|hzw6&6%KL4#PJ0Jw=4Vr9l6={Obgb6mqGjy)66VWgz-bE~f_oC<3S`Pl<_j_7s z5A;k?+>-#V&>b)HT4VDcO+hD1iZ6Yq&_w*Ef4XzEcD`K-)y>-|mDiT=N zU+-^5tebgW#u`5Gs}0%^E`G^^R#Z~UjYNt<1i%3bN=m}jl~{&nel!pwhgJ?9*SbY# zkibQ{sVk|)W4)sS$j)dj^cb6RCdcARINk;ND&0_MsPFlhZI$sW=+1gi&-~i3rX?;{ zUne4@?`GrN^-){jHFwnJTOmD&zjlrM2-^>^`SK^mcF?XHvxX>!heBJK6d;n29G|Z; z`zO)V)@J)6c{MH1>PCAcsVBBW_8idI$U{m~iNeGCjR+bidwl&hRMWwBFuR=_#5CcB z+vGej6_~b)8r!h{;`vsL@>X)%on(Ts{Q5!c>+4&@ZenaXK&K_GjOA`RIgxm4?4+4a zG3+zBG^C!USk~4yQpd&-W`-Y%UMBlL)X3vD!6|$+;hCOX^4E~;r7o6TPi=5H-A_TVo{0&a)=&a?}^I&p3tlB~rs~YMdOZm|x9UCC~yErWfOhzfJwa z!KB0`7|?Eemp?M2V1A`MDF1TglQs;TC;-9T*}J9Hxqo5b7-UardKol3r|SOo7H0fN zrlOPxf+h>WKe{KtN#_7aVx~x^Y5|5ZcWdiDCV4fgKNmM0XI(!{^|aRCrk~@(iqImB z5Gnrt_8rMIOglN{Tiqn*dp-UW#Di??^7SvtbQf9u>u$+U;o~DC#=qX&bOI<{wA9)X z9S{>(IZ3-31G7_Q`-9az`fTIg_8kB!(#Pqmtd0~eNugH#q>E=5){M+)&-g5QWrezUd=*?PkHWA)Dw)3wH*e#3}3 zesQU@jHVX=0EWZ1v?vyEAKZ8DV@z_G5dsi5x<{KV^dwVC;>Sk$ zCl$LgwEcgJ)5wlCozGDCLII>V=4HAX!5J3HZ}G>y3Y-?c7GudY;HO!UIo-+OpR|(G zSNZOBtJNa7Xjh)GM`9?bY5;&|rHx>@^vJkGkE^keV|9#wg~@3yXV{wXGLcU~X;qGL=hmvG<4sdEe2aA(}Ld~mSFe3*=U zE3$I{*z&aeAYkuC}`?9hAAGW$kvLs1R@pzG$_a_e`fn zZ&ZLFzb(|eovk+epU1E=B|!l!P;71aC^&la@1R=yX&M!L=7#kzaZ1|>=l=)~iDh$UxQu|A6(?O?RnT9U>_+SVWZ8iAOr8eLI#sEF|) zzXUbOEvgBq!UAqjW27XL^{=`8stR zQ~D>~52z()F|g zcqbAmtlJ9FMBEQX-z&0Xx>C0n-sdWoBfj2FT4HRp+V^3y-P>K9ZmlS#j*DgA$=O-T z?Z2^I71u3lVlAGvvlWEY$q)K7(IpuCAM)NhIF4oE@@z@A#cVNK%q&?JSxgo)Gc&eW zvLuU{EoNqBSATxjGoUF*$;}fNN z<;5V1vpF{tl-SPMk+x9U@?;s)DJbV>#>MYRl>XiGe&-oOp;Ua#V<2jaN9b#F(&gWi z#E3tuJM&$0rtOy$>zpe95c_Ji5nIg23acAZX}ZH@qvwSrtjv+(Ff6&dQGV2XcXnyE zHY$*9VL`J`&$DJh>D_izZC`e2b>u5;&y}@O)idj}a;O-M0d(8zw}kywho;+8(^nN^ zeM2R#U`JF0R;8}KNT*Ud>&6X~Bri5(a?C8Geez8?^WdgiWG)+#$wj(exUb#!w5Ft4 zK}un@S}EA`kIcuiuRC$cY%D81qAcXF%jA)5GCn!wJE;l%S*bc>*c*;ZkEIbspyaR$aK&rZr>)dVb&c;k*I^%dln<$6J8aXs392QwXbnF0PTah>fVW2K2J@ zs&%kC9T@R~#c*iB;5Dmo9+5uqfe?Nr)tlKlHlXr|q#O-xYOeqZqXwp?~ z4BgsWzQNIRFiAd$5AdvL7V4af(_*74F$dY(u&MyB)=KhoR;t1ZQ^y^TtQuaM>f=-x zes8sM=SSzR*j)q?wDapoC8i&Yxz8HTkN(j(;aQMjvxC>#mFZMNXX5gi{*B|p1JE+9VF~rWcPhjbF|27o^kS{tSl$9eV0CINqF0j!RLj3%H^AVu;r4cDb^{c~s6UFL=_hR(R2rCo=`&#|<0u2B9Tegnp;I?T$ zyX7)ijeCH;mVDmOZMO1z${AxXEhy&xiQd{f4eZ=;qTt_b|QPj z=;o%J3_L>S!pxWfx+W$b0RREt+nFgDJXb?Xrh)I$0AjhqgFr*xk#tBlyn9`@o1N-x zA82*v2zQ8D7wGu%aD}n)uqYRX$3|mwcDAzC(e_8BOg@AuPn<%D3iVW?vEHk?!WIpWk z&l|=J(zYZ^vmAni5MFR2?{9Us?XR`&@sh)>+<^@r6uvuB8q@@w``mtvC$9?ozZKl? z#9sIJ_XFck!g_kdZy(KXSRFp&tNtbL{Hw0j02Hr9lS%BwF z|K%ooGMomEuK#6S1z&vs!#r{FAD;#yuGPwA-R@1to4*&Dl$F|GcKgSt@;7Vx`LB6? zF;xyX$|kRtR~NFak#^0A7SgwJn!a8Tk{QRo-$hWpeSPOb+Df0#$VYJpS!CPQgYRfz zAQ66}x?r0h;Cs$PU{^&i_;7qp$O@fdyA6J{6p4dWxbPAi}37@`?YsF1RHPh8#oehJFv^7E76Ju*E6$F6TEv7Ir z>dJDhyW#SEk^8zSrQtq`|M@gEGiBy?q~~K zF$%Rr@#ins?Bu`pnBZY4mC>7SsX4>nS1IXdr__>?0!smchn*0_XrW{|$65?)&=D1R^ z<^dH_fZ1y_>i!9fj+j^Yv|8e&QIs`S#ykliE7V~1_7oDt-tc=SzSA`4C^i6%2S%SM zS@%art_yAknU2?#-`hZ4hfMQLR-`Bl$p-`6@sR_ZL6rAL^=p@9#?bPdqZ%_{(#67O zK^XQ93BE(_o^Id#Z0oOGUaAhLt+`)qc=<(0+hrDkWUXb~Aha(%5kC^hgEz7nc$-1E z@aOHAsc6_f&pPMz#JSUYo&Ij+fYWD^4(Q=BK}83U&T`3}UEIbHBwW^Bk3Xee1IfP0 z`dU0``W&54+)z04z|M0u(}%Uyw#s>E7ZVASWzVtdjr-C!(kb=N8V;DN?cR+Z(^P|0V{A1 zI$n3XTmGq25Qz~!PgWgjAuV6+*7eW;fQRtL{W|U!fkQG_NM*9h%p=EN!0td+>c(pp z#z2qa4tSSTqPx0}gFoXI7|wxiGg~hd05dnV26B1*C5x2~gw>yh;6FvGqfs%_%}RAU z?EUsGJn?zTV}jRe#0!GDltV@{@||Bc0rOxltfV*;HRADpM0s`>2k>2)XQ)!~nh%_( zzPsQ6j^`r_Z5i2?w~?(_ur#nIn5skyskkZ>t$Badj~kH}~mo?_y5 zdSti9R5S!m#Tyr9ve~hlb@koaAnj9p(x5|sHZCOOganQRtxuCOhpG!dnqq21vH}r(B%Sy28xRH8a1q8nCIK1h*r##J3k+GVC!sh> z!minLQeC+nsv{y>)}KaIzSkqmJaMTX9^zt4Ypf>X?CnC!*dg)Y9WxIpNog*uIv?Dc zHVR?Ma!k#raAq_d3qrI?Q(=&wY3Lai6J08lc9cYJSB8EK#xFCwlmLtR-$z@ z92S-7~!=iX(LMcn@x% z;Yfs)*Le32tcQP=n&;mt=KP)kFp(bQ`ASa~b&oooPc~mDlesL6}{`}N*iyXvxn+AZ|~ z;o&E(;lU2)VQFITzU3x`lsA+{+B|myBMlXmyZRlxgQ{I{lFw{fx`I*ryMl(yQ>G0h z7AN7jKGY<+eQDdoWiz3~$hZvu9*Mo%;}z>KCab6QxgE0IbR=@}Lj2T9Veb`PZQNB) zVCO=?OHAo_-o}I^Pe-3X3^G8@dH8%YYTg6gHowdyW-r7t=|y5R^2f-JFl~mo!^SsA zpwY z?-IC-%sRJ|Dm&8@IeA7sNZ8%2_|aPERuxp_7Fk>mi7WhJLr8>rH#%Hbn#gFacM}k17H_l|^(kO1m~D({$^M~qs}?I(I|>xe$?PyUa}wV;5et{T8X4CJ?t zgSZL`D-Ntr-{*=wkdxHTB%9ofe{nF9uzc^)ABzcFu+`yb4|8KaRN@1gQXUNbUZg18 zlsamR6)Lxk`k3Y|BXE*Fc!mR4YG7-$`h$z8Zq}rU7~;D)V!hpp7sHY0Q=j#5B@*F} z5@BD9X-LeVL~NUHKC~yIrw~LV*(K*5?P`#c=VIt_4ClY6GpCAsq%ZEdCOBz%xOhqT z76mV9y=ilrHMixpua4;Q*_nrMjt&xsOhJpl_J&#q1B8qY{<{~nN`kyEULK!f z<<5YVaBryg#>frgVedzTs3#3gg-FqriNQIs7&1H;1%#&;BGwr0?N^4Qv#5v#ZJbfJ z7AZJq7dbA7gwxe`Xf`$Q9qdKGWcSMMh^(#vXH4#-N1Vk1kfM8@A1R z6M+CQ?Uo-bB4Qc=Y;_H5nTsB@vAEY;uZ^P2=)>3Sss_gwjA24ja8rG$2dymAJ}CN1 zaB{Hu*i1Ps-C9Ec>pTxiuLU@NrQ)W#CPSVvW_(HZdl`$6P9MLxG%!-gJYvv*T*K{U zRg%KU&y=FG5G{K2(zvKTHHm!zKg+nPLtmY4`N&WpeSTyZi<;!|nSBH}_@;Ekk}*QO zK;70st0pDPOj?&|>ZYr;um~BRbUo$zRj7Ro{2A&aMrdBiC^D`?=$@to`{THvxXRKK&ffrk^{j#$$CU3+?|3!k_aM z=O^fD0D+)2B6e*YiP*uZ5)GM~W@F1XeY~kZi&u`mlynqCq9lEOcL*lyBNtAwv}lHh z3V)+Wq`|196-_yjG`x)L(tFcAItn8-4+S@u%|8IxL=-;*a?FKcuo*5mh`I;p{huNY zZa;qiZ0Oq%*xf;CT>g113-!WMI=z@eW|GaZsrvlSPG#8AEECQnL_HQGnbF9y`4BQT z4Fa1q1PsEQ0(jNn@Ok;IPE`c~c~7pSndF8pR;6AEfW#vN;Is4;3`!1Fil7!NV2Z7; zxaqg6s`oHgoOc`B$LSV$Q>qnVT`yMSiq8?)Q1semd%uGrsiAh{smiJXasoOJ?dAKf zlX!&6lAW&C4)WnJU*$9tR^GKd?l%j1J2HY01I&(1d9#FJg2NhZAv zJko{Qu zV+Cr>KYUl+7YQP4f6A)+-9>yHhWA*|n5pwatIe9nWN=V2J8k(JnL*w8?09mp9se_c zga8Y)ckN`{yi=o;c{fTt1W3t2)mD_35FcrXau2Z6RnI;SmHcqU&+>TMttX=_Qr^pi zvtAi?r;5FJN1!dQGj+vd6?n;9A;x8;ke>|!0T2>b$dPtt!bS)TPR3r~i4}m%L4}kN zF*mmErwMbaSj}Fln+y<5Nxh6epJ9k|9b_QbD5vzuTHENWybJ%Vh1Q^?m<&Kc`AnRG zmx>C202DPh|0W?`t(Y#VsiTJnDvvETE|eidtYKiHeBNZ^vDU{}WAxLG@?u^xE2^neY?rjU6uOqP8fiRL%bT#(0zLjetvN=dNsSC~U& z!N-2-Hek_Rm?T@$xC~{51GI#&YkRr?zs~U_llPzQ*EAGhcKzAl z!{jL$VOZA@ZB%L>5556rs^Z)od?C+R$AotXu(T`M0ek|W5(b)a&c*B?j zTddh>gjmJLKn0r>V?h{6NtTsJ{b+=g9F#Ag)9!=BGrwW-FnT_tST^Pp?gYW-l)N}@ zQN|J_)-z#W9C<;3*is6PX-cWhoy`y1G(VDjx9<0R<5d$@R#8G#VDSoW$nj%g5oAwL z{(KDeCptRTjQgWO^atq~Ho>!Y>ytCyTA`QNuioB4B2q`2pB!E3JVKxj2(-eS$ki|`-uBp9J?W5=vFt+_Y z)hA&C_FB8;tI_0MKH&S!seElG!3j5-FZZyIx%^uFm`==YC@Cf7AUw+HEC$6hU+L5p z+y^KCxJrj?9FW|E4e@6sY43C*<@}Y#KJ{QaLLsCJy?NpJX%s=ioOp6b@_8x&b)#fpW5CH?BIbDdN(K9J&+cuBIY5|5!kfLY2}bN_Jjijl1H_xbrx05c z*Qk59u>0CAF}X(SEiB9PNRXl{^6Vxi;VxFj4w@*B+awY)4%2P7{^k7wm{hnpHhd?6 zYXbn%?j=rmkl9AzmJXPjtiLQ8>wDvL@qaMX#ZX|1{qUXLR!0??P1$UQwdhL2h)18u zfacBG7R8{X7MS)M5#W1V`MiW|S{#P<*V$a`R}xBt8-Tsaq0$#0y;+zM#Hbr*j)qwy zBJG#AF8uWy-x=S0z+sd0l*~lis>&&z$F!T z#VSZ@?WHEXX&X$rpkGNLu{sm_e4%*sZVpo57X^iW1XO0_#mCQ@*0#QpTL!Kg*$yOs zgqU&}(E8lL4!w<@7$1vv_E1=svhUko%(>qDdg<16JClCW$Ymj=>i<)?yM9b7&wun zf6J6GO5W>i$Y{cEcR3B??a+_XJgI=De3oDx9?i3-!wMeD zQLO2G*fBLgXNV*eD&T85{{@fzM3jj1+}xN~U?~C$aaR7r@*a04QDa_cMOxcc1#ET! zr+v^4ZT)Eduk5$6Tr3QFHl~0*QKXnJ8cS<7fh14ZDYtPgbNv^w-)gI>I@=mFMH@$_;JuOx#n@D$;QXq(aS37Fa$xQeVNz~ zo(fEmzF=6F^(sb*@;?hJvLiRpb->}X>9fUN~65jqWg$ z4FNT+aM$}6WB)nqpACha+=M%MC8d^+&@@P>hQuXzmveOs@pMi++aY{O`)_eHuP4kN zzBOq~QN3APP#@4WmYfuwrNiXk73t{DdyDf=4XN0rv%mT~nVP9dtZRu|fiI(;cF%R1iM7rmgHELyi&+MqW4l@pz z*qLqhbKrXQ{!n-^*Xk|wd0F-IAvl{{r*&h+W{J%Wg^hy^AaHR3fAN|Z5oyG)$V;>8 zyxJZW;U`3|a&{-T2Ng}&>A957-hn<4HX<2{%u+pz<=!JbviG6V&POit;qf<%A*J<= z%Fa(Q-Ut({0hhSu*y=m2=;po|J_%tpxvt(Wl|Abq8A8j7*5}{$pW*`DrijR;ZV=s6@8dSi^my@Z{$?NS@rvwL7Q?ZXkWbvep#B z4;=Dm$3Vj&OQdTq3>zKeGcVsU(1^^>@V?r9fGuAVbJ3zSvY*~MN}_NyCA#vLhdczo4ukd&Y7lsk+F)sf7o-uS6)c1jG;72`6 zoa>@=nf5nNMtO5UH_lgtE;FP}OC{7P=0Uc>sYTzGk2N~#YbkL?2nQXKo7 zXI&cC+DJy6JH;`Baoy8>GmfMBZMTz)kpDvVt9iV zeynR~iNOye$k*P4Bh(QMMIE!;SxwAqxn+=p2TKr|pPwM@GC$!9V|`n-1y>mNDTS~# z7W)U%-dwWN((ttj2r4d0ee9g(_F1DWf0r4HsZMG3Q<`OR@Ai7F(I2cO_(q@taX*NB zBvYcOw&*5I?XzJu*QbrOxi|`rQEKvlmFShE$%y!;VJw6;`!rf3LUf3 zZsv%ltp+R={AY{+MIX>%KS5HcYrwA$pKxVPQ!&Omw|o8c$x1vvx0?cI$G~^zHm}?E zdz(zMji>EX_jgj@Fb?TK&}psLuHlTyrxFhb4yr>ZcL4%=rtdRdmVNlv)SpUP>qhr$ z(@#@R$^>_j#OSf-&F!-IGcL8}+O~sBe_Rc#BNwErXZJ&adzQHmcX8Dxse?vQ8aF(Q z+Zh-EWaQ-1DMlL{Fwy)JtX!WDKu~s@z4@8*WY)8LuY0M8fA!XOWC4$g9DQB}=Y3MS zfgp2>B18Tc&qZ^~QJ0~>K1M=`ZM97`J-dZ~t{2EWE!nyG`8O9FUecM2VITn}{PPWM zg?8(mZW8F$GM3{NxW`@6R5wrhB2hSUS>hh}tob4~p`P9HRdz>hO=`g8P5ALmk#4|n zmr>}t+;>S}DP8AW8p(OR)39dseIp>676*BNQRRz0ogE!hlV!J_dz9xvSH{yANuE_> z@1ns7b0_YP*MzC3MZ~X|*a+Z06M6Txdx8r^u8o{9t0&|jgK*H^?0Qa_$eGa9sr@2z zJ1*Z&IZpq-7Qb#C29~We|FvS59#gUo>4yCs!C$j~eR9NpMNkUv^Ze(1!NMRg&1>MF zue$WyBRmVK;JD%cy)eO5de4@gss7)qg168v)Uh$#^eg=qc)r>ml4?<`Fu0A7uBqy`3=rz3Km=90SMyH%0!g z_QwZ4cK0#+>hrISTyTx(@A5sGUlIJ(o%?_88r|ly3Pfj04MMye1O&V)%lVSuE+< zDWvV5mrZm1w#qUwt|p|dJ!91}G4%57ysi3j>GzzB=rV4JJBOo7!DmNsQqpTJ{7;>@ zAI?g1b+?rCu;Vngtq!WcAm&yhE*e;8aZAn3PHelvie#+n(3(?Ylue_3weBi}+U;d9`)D^tH4rwML%7wbpX$ z_Tq&~K2SwT5sQZT?4dmFr$koOz=L>2z#p0G85NxDys{z|cZ8AEE>^1I=rz=i*24LT zYE~6IRt=Gv!FlVRp|)X;`>8%LQw#f4@`JZ=`&_$hhR;7uVLhL zn{8}YF01}zMo2b633c=BpQdTY*XJea9rIljlq6_k&Mt!amsW+LKdEe~Uy$5JjO z?&@_Xi;R`r^RHU$$I}ij`qM~258jCC;S#!BiEF4Cnv1U?T`#q}+!lpf65DfF^oKq_ zPEO*bkdMv4oSL{`tIadxC&FcBCcACnYtAA~3PYF+5Y|VUBw&%KCbGi0mUC)hYMvRN z-}X7*Z$EOo>GtJw#LYMTjhNG#^ERnq1Wp#^L}GBF#m#PqC0*0KhLxn=%b7>>f?v3# z|0~jdJ!BOq=z)-`7EXGo-NU?exkuWY5}wL85g9qdcPTJA)eWc^`89{tyR~9Li1U}c zm&WE5Yu-u7&9l0x*E8j_O_Q1^x`JX4A&>h*{Ii?uiEsHSikG$4)G_0RAC zz$Q-X%hit9srih3HCYdSDb1^BuyT;F?W9M1}{5@ z^F+{`nC?M&^ne@J&(FJmK3M$zye1L6L^N!9{SsGJPNBOG2iEedH}IJE25#={9AplA zJlst61j#!>he^Y9++Q5!21Ob0ip2u{sfzYC1kqePR7X7b@8rmqbX^Y!W!c1pA2) zj4XZPJ#7p5t`{qMvEEP4aOm%I?=w6WGrCEQ=lackrn+8Ji>J5SJmuMynRA%my_-W* zzzx;lM2kD{q1d)DTI+Cg>5E<+!<)c(&%60Z$!`Zvwq+(EyenANpxZfmWA$ zN^ZQHq>dZ`#nR{67&svTg%28=ewY1E%PpV!@2-*ey}?goo(N=8OxcFX8U3Rrx4>N` zXL^FxuZigm{fqQ$-uHqYq}tYqxzr;v{N|e$lYU_*Yxtwm2z6={cOx>qHXqItk=ygd z3^+#F7EFszWbHOG<-t_> z#B69nD_T5e2ZsFmruBbwGlUJ6XZgB69&D2jWMHPLn{kb=vcFKzB_u6#z&Kknv0-Vg zH&4!sTh^sS4vh*SFBUP3&$wD|pAGhLd^>hOVbz3~%yvNfJ~9zTHA3UeIauVNtFD};rW>$BNm&Y`Ez@A9)XoPJ2 zI4_gicEUK7nRM$vn^^c9ybsBh9lO9Me7`PlmtkPduNaOIqv@Jlw|W>bz}XLU<6cTR zIjOFr*KX8i%x;NvrmWXasGsX{csoiOlOsAP-gBxeI_tNV)-C6^pFj^?3E2NQaGq>h zIxsz7lU93s%zejCjH$gcUurP5Bua?NMUW(6ak{|BZ7V?P`oTE<>{Pv5h=H;-< zXyHPkJl^HbeDo0jth-9xMU~DujqI((&D^~lkQH^rI6Q8yrY1YG7tNy{x9g$jx{!9r@DLs z^1%Q=3)?N`8LmA!D=qtU!`ooPjBGI>5&UV{Oh~K_r9y2@EYPB35#9BT7ZHF^yp?$V zysgM$ql-A{+3W*KkhB>)Q5@%;L~M$W@j8i5{r(bKZ=cWhN@Albe%m`(S5|gvIlwut zKNJH16mfCq54ykS*QMR?uYF*!;YsWHlqI#T;+DDN$QzrOp6)#?w0(88X9}mkc+*}w zATh{IASo%s#i4t|Z77}eiF0EOR8Q@*Tf%yDUyBxHYcID81yD+_;eN=yUGLSTE>$;j z+g>L3L8~R5VVN;V8X3-pr$=hA$*%Rz{pIE;i;-ceXy}k++So)c5 zjtKbU{kg?xhqS&N_NXz=znt#_J*@X6B)G#ZR>qj7vNbxYf%`~jdB)?@u9Ncm@a$!XLvD@r|9bt=FTv_D1=$e#%m$8IKMd!wSHf6 zM;$n3rK&*zvYy&r!#H>vm+OK3O#7UvaxOnox=RkjR~pe&kcPDmfTtL@&jUG9EAEzb zhlwSeoTLWlp_XQd=UVWy3b(u6&2*EqI73ho$mcu>Y)p7_k58VV1%Wjaj#tMX?pQfj zsj0ko?Bm>3b1mbk=8^>qGosl2NZtwZLPE-~Vnr#s$m8KqV1#Ia# z>1MD_OhN)wm%6pc-0u4ox%whp>#@OCtjPwfy}vO;1?fj8&k0Ix=|w9B1m6JsoID}?~&@;=fb(KD|)y{XJc zEJE=m3MsGMyH|gRUyY)m&|YQDe?Op^B!_+DJ9sqtMOkQ?hp$QH-DfMp28<&qk>X3w zucM&gB7I#2V-kYriUpVRF>L=rP!w-xUqNP9XmS{qpDB`J8WyI{EU!8kU(C?s_@^Mptv3vd1NK?nBhC*-oB2weC95wq#r#wVtD`#DN*==)2Cl!U9l~n!6PM`h~=w0 zK5N!nn6s@BKx0d>kK}Mu6>W$Hj(xD3DwB`eiCuqNMA!JAp;UruSOIid-IFaeNXVD) z5_ORRFQ2&Xi# zTetLL(kn+$(Ae2IAQYpQGVBcDn2!1b_b2F67+O2%HzN~4p3Z!S1$K&t=*Ws$?bPT$ z1m5=h3uH_mT$x#lC!Db8f7&2!zXs(V{^hgnOCJutQehKbhmq>$_Aaj>fJEg zJ7ClFf{QGAJ|os4Id<5k*xM;Z_ibe!-mq(E!;sUY?2~18=iNKI#n=|cli;cb24Q+J zv&HFRb)Zc(3*P{T<{io5)3Sz!mO|Qt#rL@A@6PN#aiF5RZofO}v)uj6^36Abgg)za z@AA6r-)nL5agO|x7GyxYry_ezkOR1Vl-a9Y!rEvG>)qNYcA6bodSG#fj;VL$)nlln zf7Aa;L}{hgk9I`$>$u_}8TS|m8~jRnAfNxDpPoS3lh(%qWs8q47h8b-gg$ zD1}ac23O=}U;t*J1ylgxnP3zqtxapbfGEvRw*-C1@V-?20BgiwUb4d))F}d_n+qx5 z6s6O$%=hgK*M1J@V$~Mwvs^)0FzSd8Cf3iy5-}-Zo25XaV3*{>`BI_al;?K)ROb2R zJUB2EGF$tb76r!vVy~b8RA4emEG*CVtH}gRe?t}RSuZPI;vFeoUCrV0oUz8`8bUgr zOop|nahX49w5W}+qJC8P)SoM-rVlFu>oWzP8+yR#7O2L2wBI@*g+cd}-9Q8NdYAWn z+7or0;s%Y|TAo=lC?(H-azrHfU8~ItJ=(V}TwGh49??J-iT>a0>GBCr8=v+A00H)h?+no|$Y|0E7h*EOZ7N%=l8?&T zgemxGTeRcotPl&`mIw)lrAC3OumLFqyPUh8mEz0l1mAb@fj*B%9&PpWCc3#oURH4y z-vTq?1tlf4>6&S4UG#1*<6kATG^m5`gS)lx{#?o!^=LgtuAL0ay83!6KqnD5k&){v zoc@6(!o4bqguqYWvXDrGaLoPHmGH&DK_bfInC8L5a5vZl+;ul$nGDg83VYX+kAvLF$o}Zung8d*H+_%th+o5(5u8xbxeqg&Yhy&*+ z)Aw95t8@7qf0mAn_B#OO%eFyyN(t`G9Gavu1_=ejRlRWlSVWDd8QyU&2=0xQu|7oS za$FjolpkmpW$xsyDtV&tG}gRcYbwpVqJt}_ zO9t~}p|5OmOJkhzizFaAwnR}iKt@}`9kd!*55Go3YRHq|R(%2HTU=M|)|KMV6)_F( zfaup<=;$*%i4=InNRfDQ-Xpfnn5C4ImKEg9VYfejrXJLG4hI+mvMiFsTYb` zq7r(c#De5<69$sZt{}6SSm~@OEXqBAoF)UIZbXe~I@$COjyXSZX=rd!gHZuR)n$1) zPE}u_eDwfp@z?wM?oxtKeWODn`a{qcc#+!-U&@(jz^-! zy_+GcCthAAfq8YGjlAgc1v0<_fsVX90R`>Q!{K1txgC%q`oF<#{_5i?wqQ;aS!ar( zRzR-PK@XSl#yz1d5w*n9&(ThbJ4(2hvUry`8ep!? zO`CU8DO;K~YuGa8GQcai_@S{~Ah>vZ-QI))tR?L{H|0;uXOMKV)s)RHr71B(F|b=v z!%!6T%XBB~@RTl)P#eT#hmCbd-#UD#dsaiw+2Ii3=Dl{%thPOs&_&dTg!u#kQ$JCZ zVquXI^JAcIm{t=)9FPSbYmC}H!B*u77$SnzaNDBhS!fzvr^a(oH&Zb<Q ztmVA_luLeGLQs?X%Eq4iV@g0e&lHP97#b-y5x<_tZoG|)7D`$6`Q$y>`L=P}Mm#d= zrOkE4*>)qBukCiOxIT!V>z8|xcl{Tki!ezE31|D(%b^lkT`t-_mP_x)&iLn@0afPY z^$FySf!+li^qkkvvtc{5oU7*t9rtRpAv@r_eVpDy!EatM)YvAEmF1KSVwD8X22r+) zJM%3k5F?Qb$rWKd_S?Ic!Q|h5004o(OL9&Ff{{e1VE4$+S}`XJr(-`!m=A$~ zA#G*(^59$_d}fF7t?O#}u=*$IMNB*oJ_`xc2+@mBn#0j5JY{>3&D4aZuT?XF*OfQ> zMQh8Fh!tehoKy`!~$kipqe9@ZizKOIaDRRQx_o%Zr4_woP|YpcTRC$Q#0)%i1EP3vx< zHiz&WVGqaJls5h|+HcKeKY;!5IX+oXHM^;mWmCT1Je(Ts*clCq`QwcTYTW!jQSAqm&X2Z?}AXG_pzOC^W?t4iO-MrJ%5ehM@g;WS`fL zs;z9fFkln{ihO;KwN|KeWG1` z2$9!aw-?7%2${Q~@aK@k?F| z>15CgN|yNLVbSC;?$;sX7!LPT#) zMm{jgkIj5v`q5QXxAhDf7kI8=Ro|S0lguJ{SL#BGbUIbK`#9i^zlhS}*cxZQMVTU| z^mDJlc%q7Lt-sb$Tc*|NV90hd+T9E&Y7g%k6=n`>P1#65uN7-K)9Ua7=fM1=A>*4~ z=CoUfLDQ&>I&D#q6M2@Eys>S4+kBKyN-A+u#{N*3c$(4f)?RuU_$_c$EvQ_xz@8{h z$k{xGnLSa{x-&CpXBU)y>|7AAjX^M4qw6?3_B|c|$Y5Z+htiI{Dr+ z()3!cNpXg2xx|aHgQ{L)BoYCrQOg!mj zY}ch@-}LZ?iI~Z^XaB~rWlgoQ{Wxr%`B^S9hn5tkDZUQWGipL5yhb_t3f>_jtk~+c zo3K`masBK5XVw?h3__f(D=|)ZskGQLM$}thXcKze%js}J0(v~cN(>C?`ACdv@ys_xLBc}!u?V8h&eUS6I=-08}b?A3q~g^2wd z9{^fL>&aYtT69g<$MVa+K`^UM&}*gR!8xxqqVs7`CNj5m#1g|&)k7bt1b!GeHmWF8 zICH4A52&ME`T9P0e^=M|Uhl5q$*srqj{M)#VWP1P|BGZU=OMkO1NjG*aW*=TyQ}qkL}Y02HckMB(;t+i1ik9Hv00foA>jfQBAnCHw^f=Tj?$ zjVkJu+`_td&9_>dFOrH2Vn1Go?P4y|&vw~YUDv7{699nVjz|(Q2*A(2yIM>FAF?OS zhfkUhE<0hF*ItzAH;?xkegRPkjVekJ--hx!qOjiB-Op5Z9Qi~?YaWv+!v24 zf-U^H##W8cYoh-v#MW%Zu^nUTw|Ouf@cWE{@k)fywgEaDLOnNSS+gGj3pw9oJpTtQ zY`XDpzzfFQ)$ad2$sSnx4;CDnQ&s!lFn01f$p#lbk_+a)Sn;PB?%n6|aLq+^pM&u= zk40GQ)e110{~Nwvj|>5!p`lO9DuW{;`Z|dt9&vC#Hqzq5BSe18-~%6>ccqRUG1dRa z<@irB|DQ#M4*2-O`8p`{Cg+9({f_Y8inm`l1f=^9pkM9#?>&7xU~;EfM}6~recapJ zg^uLZPMUj?!VzibJ}zqBb(rxfkMzK|;xKA>Vc;YNUjTBc&c{#@&pGdsmimR|%vH$V zKN}0S)c!)~iJ;CpK*|57SauZq|H!iah#Jc|kCrybFr{r3k)FnC*kQpr3>AIge{` zLYGSwmH?-0{MHGmlEa}ixdTl(N%i}P9j@6Bmtn4kX{Nf$FRd?^< z$(R2yS% z6zHL!6_g-eubT_=b<~57cL|PA6x50bN5zMpeTMg8R+q=U0kC1WBktuu)FY%!dgk5v zhO6~eocUSE%{sH=#5auDDXx**!sHD|_$fQN%8h zA`p~W+B>U(+p(^Zcv;>9?j^}R=l6=w^tnDgSNGxB-~`TRcw}Cv1$5~>zVRNjMx9A| zUUsf$OgZqogPMcR%%K%jtkW9s-+eM@=*LH}loc^Zaj!v1rA0%)E5wqCrAFScsic>X zgl(`<6g;LXMQ_i#l4h7O&l>-JrKk2(J@?D6p({l@zRvPzM0Q5Q&$)0!EFBK}_N`)& z=k4xJnbF9E%odF@ z)x9bQ^5$NWt+iEt|JUrOb7G^9OlWmQNP1As!iWs}yXEUtI=xGWL9c=W}W=`hAv1}qt4~hlJ9+AVO;iK`VhOWYLh8g_Y51`*`0ZoJNd#v;+oq$ zs(VZfr!nX0lI_}bJ<(`v;kB$!)>Bvef_$)i0A?qiQ?o!3hC~_O_t=xuGdyY|pcPWC zRX?JjSx|E$Xzbe?=hyqMbr%z-wMe0e^N3S2p1yE5C$Exxuu|L7_WW_yn;&1sP*wWk zB(JNR8($1HDmW|Pdke63c~jWZogGB3BCFJFMprLo9NrQRD=2Ej9AuQ9-rhMQl~31Q zw77plxIqcm)kyU;(6c+-gLJYi(QP6a#;k+#r+%HYEQyuOUE%O< z)GQLy&2w^cvQusLK5H2FE8teo#8sV9x@<1t6LaOtGw=CXekFj-Z^%wMKYZ<7_4@j@ zso-xZDY8J*6D@gU8})mdxRv`4o_AKz4DhKkey-29rWv;B6uq*WiBO>A<{mejjs~l6 z&DF+NKx?v5Q&MG`PO?~;4Mps_s+_dEw153w1b&}gQ~>~3^4=C5oYyuW^_a>ymQdFr z@QjuOd3o9Li|++4ri}ss>v|szl{6k;)80Z=RmNAf`V(f@q*=bWHBhB88+jF%zK)&zOkKSre;C_x1aRx|`*3|cx{^FHcfbm+CD4^`O8-CQ6gE`*Kb^v` z0sQsj#(1F+XtWXV71wnh*Y*hs1U|S=hBkiU` z^~IB)!rIk%raQNXNpQOTHlNz(E6Pf<{w*AIezCNNxKJo zS*x^)u&~W;-cAH7GJ0~3qaSc9GNyloUtIeatw%;M1(=ho==7q3yNkTamD?vy zSK2(5^- z>i2;b%{YC4on4Dgm9Bc6VKCic-p}&5kKmOn5IN9t*;u^3oah2u$1|>@!cXT`+|?gx z-g*Hy@e?6gFs}-7AElkFjPF(8TWP%N>CSU7X_{XgdF@5v<4>v|%+juzR&j7_Y%5+f zbAvFOqmK8sgc)+_`q-Ga>AzHQT;(jK@D;*L0D#j$YbyS)j`4oMj*WYqmVl16#Zg(R zBx23(pv*5-x#h>JiO6fe^7xb-b};m3cx~oi;kC>$93(>D9LFI9b#_iE{Tyo({O+>( zms8?{I-K{VD#jk#4?q0PFsA*t*z4_Ht-pq}aK}C!9{>Cpb87tdvGZ3AL66xR<(C)^ zJe)_4Ht+lJkm;QSE^p^lNN*~cww@|qW$J%}@xhZX{LEAxqUo}sSvueH(C1*6UtM93L2%t8~G0g=rh)!8}BWcu9;=&uF5D&h+Z|WGqI!}|! zt(7;|ea1hxF6fiZBF_C*TFcvyx~9%8H@Q9>5G~5io%iiH(r+gQYs_FQ5DyQi4z-;$ zp?t@A9j&wDji&e1J}C=r7awix`JfOag43DWKX`h=rI18ahGg&v28`uuEjtl zObFXZnxvM-)uTxnp>Ctn5gtf$xCZ37Amed|E7G>k-Na*uJ<^gi(AYPs9t>7q2*acc zP$L*)jr)8}bflfUcsGY+a`}7mhEG+65Pzz{6;_Roq$tf3g^m)br-co25f4YdI2iNd zDolu;h(*wjyP)R#802cBO=B@0bU*WMo2kk7@mZb-k3=EETsb6vlS4Yzxz{Rb{n23U zNTuE(V?(lMcl@Jg@x6NCB!ky)M_eOHwIUNfdY2!n%i}UE)9xw-69<;$^y~ue_Z?`T z2=@eqzr8DJY7&WXluL?n6Vi=*Q0Qp1vK5aS@W;c>xW3CWcs(Z&uUdd1Q4gs@5ZHtQ zR~vRcc-hNSKF9HC!`4hGVzX*dG_l^DvHn{UbWh(J^DecpQ&}Se@1-4GunW4^lNmS* zl;CJ|#@ALHlg-mKqoSBM?5$|DV%c9hC1hM5)%sdVER;gtS}|b137lnOj6{*Rz@Cp| zcH=?Y-Yyx{dMPpI=2UdTi{mMq)q%uaYfLaH{eosB4<}D4PI&OQ&EX<5PEEG~5Y-me z1;eM>@y274`>uk0XI5q5DR8?0?Kde3?w3%tB~or`%TubdC~`Yr@5K=PdrU23+O&zP zQn9*>va~hC`Pz977AFj(rENGRy=wQHOr?-PRT-kW(TIM3Q|R8KzN2MUj~Ys{ef0N{ z;K@px^ah||l8jX8{wvLd?s6LiR*pLt34(A%TOw|hg;PWtwVg4lhe zo9*qxw5{((>=OC1rKf~V|Q2otZNg0gBfbsZKP^2qea zNR{w$2ZhAKb`iJn`=j&3xF(;u74;N#=%j|F*`h+1^;X+pFnoU|Oa$ASV{YhjuYppX z6DNV*=@n5et)lQX(2)_HF9!pknAkq*dJ$^Jd|L`B^xrWT@nfD49zb{&x3045OSq^* z){Hos_9rUM)J&?DhaBS@itpM_gomg4QQwHo6*|gA*%Qw;J3rdYMA`-npMkB^VF&UB zfo@&vPd6Kx4YRxXc`^l2n3gD6%RF+5foK=Ev_3Z&#NQlLW55|+K>8ZWpg+!8Kn%83 z6@E_ksr7xTC?fE3vO(?xlj`8h7U*EYEG)CBdb^m*3XP|B zI8Inb+mqMP)SXvQ81|$n)h6ZvQ_h4&DCXzr{YSX*}#*t@y_5}hv zV=yurv%~CZ8vfH+?r|CJLYb$c(_g2c)8MB(=Y_+b(wc%K*^!=?K=@aCWn_oxmH_CJ zdC@H%iwGI_rQR|23zFgz-Q$ZdBD|*1d+7n?RvTzb+0p{nCsmL`%CZVJzr5zo6D{y& zv}d=$AxDxtNqzqP$?*KCJ;Y-USmDN(|6}J3-&$QEu~d!4LO9v(q!Q` zsA2Awf=Z-S6taMR`x#2PSGh<(6 zpj=l9yw<`D?we($$diUG##DfIv92k|mE9#d z=#&nY^N$2Lu8w&~1_y#LY3r2y5RSbWWj%P1A6)ewUPhVQe)C}@VgzVnE@flQn^Z#U z;+82oD|}w_j&z1HFcrV0ieBk)0u8I5ls~1)p&mF)q^j@iew%MZMk<$hRvcNG2scVs zDy7>dNIoBJDtc#Q_Mu{<_*h4O@D3~k7yz}t{e(0L)6bDXt1;iY#5ZijabxqqPw%DN zOWU*eVAWm83*P|t5?W8`W%w@Gus!l0(g=W0`4CYWqvGfx89E2*Fgpcj`&>K!r4cHG zmv&TNVdK9RfexMbyj&-?fUyRnK%wwUj!(wTu-$>~NFEp_>n(8TJXM7W~ zC8v9<;n{j(iRGC{yne_xw2Cmwnr{!pE^8soajhCY&G$70H3p~VYO<=Ewhbz_bhQ$wr zv#<>yOkTyRIiFfxTh#G*fos&mHTWLl@~PrQ)U#>gP(wT~PUiev5Y31iaxnYNaSsX< z%cWjYQCnNtR5rd^dbY6hn7oGF0g-2BzU>ut8MqZEDVS-Jd|KGNekO;bSsY)7mM9$) z%<;*(7%;T9Rg5?{^1df)SAQj-shQbB7Ok00I*=id@&1&P7fu;B?^X+J6?b-ZbxBIN zBech+^%jjA2sjRlPYH(jdO~ta8d~%%H^=6cSD!D?A}sLFcO2H5l|`*g_B)~jG9l~XU|-WR`VO0n z%5DrM3QEJGKsRY;dz)d@3F_N)I8QobR!mZFx3@_33~JFcqeIj%*{OPE^17^`Xo?Y& z>?5Dp)2v}B0D-Jc!i;*EPxp%~)UB8DxT^7$=DRH;#Sd6wX~DHi#9bEAHn-DY;FTpc z*TkdbkbJfC6iIL$c$|h_P6H{Dx7t)d)xF=l`VLlec%2H9jWnmh_oEQvoTo1iF<);g zt0^v**jQtDn)domlKrOV13VoDqG|+}tYt+)AsK0miEpDvty|rkdp=Af92!|c)xX)q z*ApwW68y&GWcH}3=(L;rqg(#2X`3RMe;QX`Y%ry~7V!_-DyFR86X|U@*em4=zpu6$ zfX;lryAl%D3AXrvhkh?R`dp(_U79-S=W@838E&Gh>#Pq)$=q;CufFE#fLshFfvOGx z(i6lm2fK#lunJ>^-X1SyNAiF=&~B&$@;U%QEV-W2{fM87{On6EY%<46&H9GVTs;qP zf1*=c*E#X*tG>OKEYXT`Qc2T!WN3=5_kFtdiH~$BhC`JY z1vzdzvibsTyk`WjHnM45hvwTt+6gHc^1I1Fgg4)Cm;*+;9dzy3Uf`Dc;d4(~Zc3&C z<=bHATdP6Hx>ZVmXO)SND12aP&%Fh`gyqciR?QQx>D%L@sLOwpVxFKqu5Z@8Lo@Al ztk*K*>L@X{V;w4pXVv}2RV+#JyYL{Za1`wN^M_xD&v>k9jg>&K5T-AQk1dmqVM8|g z!%O22T5v85;tLa`vSf!O2{rGPDQM$UB^?1)rzbE1ps?AZgRBsnz>ZnIrqiKS6Wkq9 zeegYO&=TYtS}n?jvl<(W+$vM4=-W3|7{hvQq885H*xCo$`b;S55raDsMY=iy0T=y7 z&xoCMtIYEC8YX_=Q=X#XfO>|yY|q1tIW(f@0hNQCD*QOB7jF{Nj%%WtUD zJJZU+#F{bxbv)Ytfi!F>xk{$VWxui;ibfGihIMiTN%V3U|9yH;qhgg1df_Eseo41i zf_cABIn)qiEVMh*)-pd-Hp%Sfa=ELP4-P&dyhAIE5ZIkPZ)_*$xR@!H8A2Z(6wfhn z_Ab9JmKo&BL=eEZ=U?rZTRPTW_bk%?3{is7a53^=V6D$(iFAK*Qi^fl;rw9H_Ttfd z^{cWWHKm7phg-e%L7m?Mkq+%P>cNw)jbrLD1?wn!dEHzYkA|e7Q_UoljL!&i#OG}m ztOL>0j5SRCD$PeP&YjVB661f^{#AHqL|rVyJZP~;@4ea%y#+Tx&XPy!gQ)L!rZGh3 zVzcohB?QU0=Yp|X#h9(bTAYt-y8oxbLjAH3z#%p(zw8G64ZHu{a%!WI*>3;IS4`9p z%u8iF2re}BUKuw9ZS*W{i3gAPxNtO#G6R6;Mz72R#j=LgpMb`> zFBDl?>pT=kGU-9`uCJQ{~^U?yZZrA@O((jh>?*j)_55eM3GQ)jz>W+)f?OHhW^Fk? z#UBj-d|{^6iLz4E(paN>4*&q(k^z7hp=m1MEk`Pq4p_^8@VXI6u1nHO}9={)GL9DgPDNe?a%Yf#MHDexmq4L*9Ri z;?H@1tl~dkn*S8`U*^EyS@IXN{>>ctDK-CdVLPM{r|+}e-NgB^EUE>uRj_6 zZx*nB(3StLfNcyJV83HgyOZvJ8SY!nR3dhal`PuZ&21F@;yMD1^{=xqr>R{XxldvYQv~yFN^d=%B{)Sdy-Je0S+;Q@wTcvyRsZ;ROPLi<{f} z%!}hs`m=BM0f9jdUiBt44Y0QrXSjF*8F1znXPeY7w_a5RZX$%F@LDHKIEPul9Rcou z&l8j5p~gBUokxyj3*Si{1yIzr-$lCsE*&4bbgNm9B9Q%YxY6~@@Aw>+f?m4Q4EhB? z%ZhsGjz6;chS-<~H~G!Jm~DHfd_>JuK=Z`(neSAl>h80}h9LH;m^t*HJ92IjnOZ8tNuyvqF=kCTi2YxWn#VL zMQk@>6jWl^z$tzgDTC(myZovPno+_MVEQIBK7>>3g-;XEL;{G+vZEDG@_S_UEs_cD=h!bXPpp& zo}J~v!B-pqmE>s!F!mcA&y-WCOWYy@(jA(|pwB<;{89j(tGJ&TlTbLko;1*(@leem zT)ee1EwrM9R^Y#Ru4{U~pqQ*GVb&D1@)d?(i?T`Y4VB?GZq>Z=$DB!Q{n^j;i;aIt z&qH0-&Dx%$m7BMbxYQkBoz8j^HDSa=fl-_mLvlU3WC1y^$vl#o*HklEL+3y)zgwNMCoOFyLV)S@pNQGq_fSV!+X~doq{M};E4J8HrB#i%ymO$(74Saq zfv}mBwckof%!S%6uXMph*ddKwj5yg)hBMs~s^6cj#o#Nk~jw)sohvsb00_PYo~YU`#AyA@vwLx0$&`vb3F72VnK%l~_I(XJ@Vy&h%M8`ow9b z2Cez=*O!4(xT<_R?63D>JsGr>m&e!*3=Fzi1=XBi!}>zYOA6K}szNwv(o=vP%ZRg} zyYRzi-m{-odN#yv!2O9jir)Shl+7L?DO;1%^cM{ ztJ6vj&No;djcB`u6(PHARpN`%OID{ZeU9x7Sn@1jJNDp^0AlTtgjZJVDV7+yOUj-| zMgin_^~A6+e`$u|PFFj~)9NCJaBKQ5ztZK2%TK7z@-WJW*2vFePZ285Cvg73q6BVS>BJ<^h_D`uj@ zKZ-*V1G=8l=zTzWB&@IZ7|RhMm*z)$fQ)EaJor_vr4U}Ubgy}S*K!^kGqp4ZQtEqS zF17#M%iP3bU2oDRN70x~vaj!VJZhuUSU`x~4z?Qmd3u(9#v@6PRcT0nE6&I*peIdd z2p)7mTd^yQJl%=;^5F?#T1TrSyiMAl%~TOlEFd^i<(Zp{-a zZA8_Ga|koqlB@=$d$``Pt2lwTCnR>p|ax**Dqp0VoGl@NQugwQQU4)WJwzB0a9awCm?kQt!9=e8*uAVKk+ zaY-WE1`@>L;wed7!eYuHnZ=JD_~fB2C!EaCqgE9xX#yj+EKEtzr6HS}zOfPFj-K@` zyFK#uCf~iVxsct6=#)H7TjGK(3Rq5a;Z%A?e_G0b^#Bv??q=2^w!9c1mIEivtIDr& zDU0#!u-~He;EKZPis|>$`5L5@AJ)h}dTKnl%((+RT~S-Ze$&HbyE~>$@mg9hY${j|%AS*5%E0aj4rNv+>IrfrZ2!abCsAA_*?U2cz)dh*(bd_o=*+b`_Vo zqMH3kIl%*Lvc^z%XICB0=v)h_yEXe|w=<>e>PP?lJ*)uX(N>hp@|?9b)@Z2|y&)ir zV-UK1;o=4(MCJ&AYviMMBqGq?|6U?4L=aeMV^7q58JtRX zzOnNlxVW~bE5AwE{SH>TnReB_kS5Dqn@t4?27dXVG_hH*otq9$LppnvyWGdfRmoW< zmp+92enPla?s+927Ztd@oN3q`^gz`55!LjC*bkJE$gK;}idg95u|f{u23c3+_>KqY z?Rj$uFal`Q?=I1w%24tkQI~tUjyE<|eCF|YhRg2Pv zEBy);yKVAoXoxiw+M6(8SF#N1zhP0eFNW`evrk@CEWToxAf$R%{0nj zIG2ial$?!POP>VZ2nwYL!-xF3KfXzUhtN8(S)d20cO4b3u3QgAJJaf=k000%vm2`g zwk7@_NzKa^7=n{ZNC+eE6I{=!ouc&@hCwrgEu(Nd&xbbXeu4$@?f zw+R7KhNb6i-KTCyBF!U6Z9_TY+9uXrnN+MN#nc%0d}OXu{GHV}6mva9vBz&kbyYw~ z$C*AGu@0wBMfc$tov#Rr728vJnQTP$+Ob`&Mm4#W_Dxw2F_;)11FP{cm&zY`0pVE1BjzI+$AR>1k$JdHt%O0>Rg&D(zUe4AHGy%pgr_r+ z0~g4RYmMM-TnKq*Wm?k7g{=THS23eIWgZ`F-{p z79ZNz)1jaHpyHual7SWIMXMIPKLDyKE71p(uH;hd_BoA_OW7I* zI)(K42dESl|LiR0k`tx5x4V^1(xW53TqSX^*)a!Gmr{=;8~16ChF&8MR! zsY%D4X8*wUHU9j`|9z?Xf4?oshQ9G5qe{(L7aYfDnMd@brH)wmpMSu*PX*}f+|w@8 IeEjl%0qP|hEC2ui literal 0 HcmV?d00001 diff --git a/docs/demo_gui03.png b/docs/demo_gui03.png new file mode 100644 index 0000000000000000000000000000000000000000..cffe6984db570dfcaa9053ef85cf1b16e33a22d0 GIT binary patch literal 31154 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 literal 0 HcmV?d00001 From d27dcb90d989549a7f43e4ed70d753402fbf4378 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:07:25 +0200 Subject: [PATCH 067/105] screenshots in table --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1c9405c..c321564 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,9 @@ ## GUI EXAMPLE -![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") - -![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") - -![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") +| snap | backup | cleanup | +:---:|:---: +![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") ## INSTALLATION From d917047d2e917cc079997232ff7db3e3b1ecdf44 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:08:02 +0200 Subject: [PATCH 068/105] table fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c321564..5c8d524 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ ## GUI EXAMPLE | snap | backup | cleanup | -:---:|:---: -![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") +|:---:|:---:| +| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") | ## INSTALLATION From c6e62a1aa8278464c2117bb542589ad5c4df871f Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:09:24 +0200 Subject: [PATCH 069/105] table fix (2) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5c8d524..bc93bea 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ ## GUI EXAMPLE | snap | backup | cleanup | -|:---:|:---:| -| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") | +|:----:|:------:|:-------:| +| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") | ## INSTALLATION From 3aa4b3a52c223ff4d93bc2c1ab68b1b3df407983 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:10:03 +0200 Subject: [PATCH 070/105] image url fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc93bea..482f6c2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ | snap | backup | cleanup | |:----:|:------:|:-------:| -| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "cleanup") | +| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui02.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui03.png?raw=true "cleanup") | ## INSTALLATION From 6d22b0a4ee325564ec1419145e11a7b3b3b26b5c Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:11:38 +0200 Subject: [PATCH 071/105] padding fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 482f6c2..a2ba4d7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ | snap | backup | cleanup | |:----:|:------:|:-------:| -| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui02.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui03.png?raw=true "cleanup") | +| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui02.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui03.png?raw=true "cleanup") | ## INSTALLATION From f5cfbe5bde1d044406ffe941460afd63610d0a01 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:13:14 +0200 Subject: [PATCH 072/105] clarification --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2ba4d7..d224d74 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Cleanup older local snapshots on source side if they are present on both sides. ### `abgleich wizard config.yaml` -Runs a sequence of `snap`, `backup` and `cleanup` in a wizard GUI. +Runs a sequence of `snap`, `backup` and `cleanup` in a wizard GUI. This command is only available if `abgleich` was installed with GUI support. ## SPEED From 29a5df4c6f08991b8b4e4e0122634ae26e8c3025 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:14:50 +0200 Subject: [PATCH 073/105] hint on qt5 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d224d74..cf60c34 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ An installation also including a GUI can be triggered by running: pip install -vU abgleich[gui] ``` -Requires [CPython](https://en.wikipedia.org/wiki/CPython) 3.6 or later, a [Unix shell](https://en.wikipedia.org/wiki/Unix_shell) and [ssh](https://en.wikipedia.org/wiki/Secure_Shell). Tested with [OpenZFS](https://en.wikipedia.org/wiki/OpenZFS) 0.8.x on Linux. +Requires [CPython](https://en.wikipedia.org/wiki/CPython) 3.6 or later, a [Unix shell](https://en.wikipedia.org/wiki/Unix_shell) and [ssh](https://en.wikipedia.org/wiki/Secure_Shell). GUI support requires [Qt5](https://en.wikipedia.org/wiki/Qt_(software)) in addition. Tested with [OpenZFS](https://en.wikipedia.org/wiki/OpenZFS) 0.8.x on Linux. `abgleich`, CPython and the Unix shell must only be installed on one of the involved systems. Any remote system will be contacted via ssh and provided with direct ZFS commands. From 3469ea57e208d1bc1073cca0119bcab16fcd0936 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:17:22 +0200 Subject: [PATCH 074/105] swap names --- docs/demo_gui01.png | Bin 43687 -> 31154 bytes docs/demo_gui03.png | Bin 31154 -> 43687 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/demo_gui01.png b/docs/demo_gui01.png index 8ed6e9bd619fc8ce604f18b821336c48f456ee1d..cffe6984db570dfcaa9053ef85cf1b16e33a22d0 100644 GIT binary patch delta 28716 zcmZsCWmFtZwCzA32_6E3;K3b&yF-A%-7UDgOOph5cXxM}A;H~UgIjPJoJaEAcmKRM zYu2ppp04Usr)=+iP8ZI=)?C0;wZQKF^SZ+_cSAY?;Jg5cqLzM}|Hf1nFOsdm+I zx~gcoUiCa_hqi>ki=kKfqA0+@!w3~mN);hUnv6b@`hF6cP*J<|%yd6?4&-9lP2(c& z;7Uf0%U7`!d`s;2PWbH%oHppQ?N@(-Z!agre&b_wPdZN3RYA1(Xa)+z*KdKpSKkQ> zG{@YGen!5A|L^qU8v4JxD+RUbXg&mg{BkFjGjs~0_{*1e&pqb=)2Nq29+gQ_!B zl+aSZ4L@z_3ijPXIFC_^!3pSL3jh1COQ}BB?C&IcVq$9F#wuN+H#$3cC9CDX75esc zv^1sNpiT$o=>nyyNA|~tZoIl|uJq9os0928NpXILxPOh>!|weYR#3t%C-eHNg9IP%nK^lA7*y(#lXa(RvEIqUVetOvE`rtKLC0TJ z9%pR@;dtH>!RXOQY89p0Re7gs#{|NV5FDyHKY8IpE=Yfq;g`=nOurh+l9f|dC+muan4 z59gb)(n6QacO(@GJP+ln8Q*0ZmMD1*r0w&iaSuFMuaxv$cJ!*Lw0VIG1-z}KWLNEI zNf`n$@E+3mUnHpql2_vkGm#A)`$zv*lI?c*X6u{~dY=yA}$Bv5!( zR8O1kO#2*U%6GfGeEq;!9#gQnL10+U`Me_>XUcN*^XnUa;M3nedpxf_IW^E|cUygF z_QSEj=~*j=A`LlteyP&#Oz3X>nj-tzgTfi3dI=T(VV6e=LWoSLfhuZ_kuDM#R(vJg+ibH?SK9pia(Apdt`Xx ztlWAx)9e;a5L(h}at6!? zlwyI8g?eDX6_#)t8*@;Voz?pD6|jkNdG!XkJoY(jac%xSE#A{{+C=m+MvBQ=DJdvE zU}BnCTH<~DsLpOvXEa)eh1claaMQud4cgk?)@gR<>BuU20DJ4KkcZ;|5%{^&_4of ze^y1HI?~b>76&r6nTyWSWtt6noZ3ug)IqiGJ=9;tFu=!eVB-`+4On^`lndMkqkcEr z-=~X$vM#x0wK*HUHN0j#JkDOB6mdilA2V29Gt{ESMwk>PP5SV#qy+5he1(d81|0-oRgfBkb3K!29L?5$q)W+xsw_r&>Fmr+ii#<` z9bJZWPskR2oSDbM(C(h0$#4-29XRQGARD@po_G1_lNu zm~4sQ+9kk}_f2lwH@e9V-6C0BIou;4K`E)FY>~h>FfjJ^_PF_laG-8&0%HZy>~4uC zhM><68wLA?p&H;h=j|NA9Vi+ZDBtE2gaf!^AnsU?8mYYtlm)nOO?l4879+8xufayn zts@#s3U>EhgnQhNPjkf1Co$z`it)3+@lCGb={Zlnz-Hq|{$j_wG`5WQZMxyT3ih~+AH%wpg;GC=*tt~&c&SeLmxtz%s*HUH!9umY3iL$Fz!SRwkQ zgRNYz(lyfNrFY=JFL(R-nPwZD4s6V|wP~^0#>B+|m#mzutaK!l9E^+|S+0>4C4=BA znXp%bJ+93?9lY&B)Vf>~N;8(N(jF!z2GR0LBCkMA+BP=2PqDwp=Wj$yCMULgponrA z)XlU4?htm$Qr z840+6Xy*ZL2^r0Vpo0A6jz(ONd>qxadzD+AKLplz;rCLtXC!58r#Entkl5iGCojTi1P%`(&4>&j~3a(>5>k@FH zYH%=sRWVf`eDJCyTy;-ujhj>}`AkeTyhabu9$;)n5O)!UpCZOs@*~nbQtmh&ZDyT%@MpD9OB7-OZ6L_kOc zA7J>IxN@a)T=*0Tdt|l9YC8)@<@WxvvvaxZN4j;iyt;gpt+~N99cx>sJuQ}i#~skQ z)MyR*bm^>YqstGvqT5mtp1l8Jf)e7_i8vFb_AsRRGAS(JZfHWZ8f$Pjb~Kmzg??30#0GjYkbtegehF`6fogkpt6_7)~J*hLa=LNu5p~5NW@MdsDMfA2MhXC z7DwFyBj#vkus30RpDD$!jls&WfB-KDlJF;dFGWTal6XjFFWuiNps87}JQ>-9`yqy5 zZ?ZwGg8beCpvaCJEa|r8y@{O77T@_2M3pst^qjOp#jY%_%Z!ZgOrRe_doJS2nj{k~(n9IU04#VQUz0x~LOFPGH$2+9!=8px7V zs36W`Fe2V7cg`{?9M+R<<`^KV_lS-)wR#Z5P$@4xVxJ*eRM6A6G5(OjeT{{eFHyc$ zb5AOJ!;Pp^7fBAk=Ou7Z0Huj|+D$@l;a951xW+1S`vfF1h1#|%b4^l1BJ3+tc; zzN$;RrZO)IiN#>~m^DqOmE!R0jV~;?r*l#9cA=ES|E^r~d=(%Vj_Vfh!Ch*cyttAw zWz%f1`AP3uE$Tq3w|#xQo`vnfAp)j0Ge3ocRTvnXkDFtn$z7Uj#e9~PIKymuFRapX zdM{6IFh5lHt353#=wd=q=o)Ea88S;#IYv=M#6TUFf_kSHi_MeJjj2Q)pIAUvAoWer zdU-Mo2}+~uRRx$UR9lFYS?Wnh#L;Ng+2o1B8~TX+${t<~*|bSaqi+MMf|%Le!3tDujIwb=S=o?oKiT#r}@KXx5kBP5-g_|mgmt|xsk%4{gxpm%9fuh>Hb;iwSXB8}H z+Wy=F_t$MPAOudwya~P1MrZorkud2oqrqJpiuKHL?58wN+YY?w_Y@b$zsM6e!LE#` z{Ow~_8#hNhSiV7oCwd+So5Q-<<=?C3ChbRU$ND5-n04E>!Va!>9MbBxECOJ`9rxol zUo7k~64+rr4Y*#PxH)YO)ESgwZ($-Tebp@l_JM~1A^Y)U(vd=$B}2-=As=kQ^j=v1 zTY|q7pu@+fa&HnP^8>x+$GH2=3=eM27vCq^-1N(h#}8{kTprKiQDpG)3JL=J1I63J zQQXek20>3(Gfy=ekDe|o_IuNXp;{V$KaZ)o;$mViNXX~oB?&t*H8(p%g6aXVeE4`P z&e$O!RXV#PQ-*jU;AJ{nBf0tO)ti2Xx1(v?3$wjn)ch-{CDmRN2ad&3nehfmAOIL+ zoAz%|2}=qJz9>xJ0t^t;$QvlB@QV3p!|M!y(2Kq&@y$ORAy-gUB{=r8>fD1Pv7$a4 zdGP7N8=MlT=6{nBolugK18Az)gZ5S@R+sB^CDcU)e_sp=JX)Q}m6qIKLeVp+>Mu@< ziR72Nh6=562tXEiI8Dt?<=WcUC&OWNUk##{cOkEc{c@-XBj?)1(K@UAhDOw8Xg2Jc zc^O{7v9YDWOhUf7rh=XlIz|_YFRI2|>Eef#( zJlt+oS1&ieXFi-4LE8gYp@f6f>g^kul?`nhJZPCuPSr#zX*90evAQjguV)ThyqwHx zQCjlq{c0~w)H3PcTr|>+cfvQvW8;e--axN1RMn5xnxOK!^hc5tZ%nyXlcB)p~4;JU(M= zyrFGDK;f+p7x5+YJ&90APc#7vJ z;9${L{?WXC?!OjZvNg>}O;1Ic$5qa{51bX3yOZ~b*;d+W0hdop+SKAbMLpy2r2*ujFnz~u1Mf>y zxMkG2hw>|61?{)|XS5gtD7G;%FAiPOnv7&CJrJ!niqBZyw_IW93J@hFjg=d-SRFsC zs~%vcV!63Jj?!kE3+Dh?D_KKZDoQ*Su%Je&hnqB=3}R~dtfjBxf5eW<>#3TLR7Sj; zyn6#YHQ<3J+^023@7JK;*7+44 zDO%$zSYfQ~WY~FgNE2Dm0k%dr;tNN9Adzi>@cNC|TVlZPUFQu0WqY9jQW(pA z%k=r?zRS+a{_PMUtDdu0cz6Zt`p%*`%Un^W_LPj;u`IJ~Wy*czJ)Pcj1SrXual$AVBB?!0l_qaZ-014I;~6sn;AEES(3|icj|S|p zu^|?K2qO99?gQ**(k=T~nDFTqtd*Qux~$dft?8t1?6Vzlg8Ihj+oaT^VF~jN~p-W(<^0OA^kMD5uo64 z^{^VJ@^SQ9%uF3!%1oJmyVW>%d=gLE75D}!(72#+D+2gakAM#~a#g)|TPj%RNP@9< z!&ZD|2W(QdFAVXBQs@L4%gb?76K`a*ilv1H_@HD0M$ctz3bK|BD6ILJ6~%Qp|EA5| zk@DdVPE2B~xcQ+4koIw*skL!a6WP(WwC@#opxfO`psOzfWYO~R0 z8$PSO2RBwQVeEKct+(>#SQ#nEwdP4-maPB*>gEo5IrQax{RTa9~RH}JZvl0u|j?5N)%{j z1qh(JkOr6iKor(M6OHrWYYP>ivR3TORTlrs?R}~^XC2ugfgu9Osog-!^)Q_aV%xcn zf|9mUDEntZ9tSkPHPjlxlG8GaTa!Dmg#15Boo(Sui|c$s6TVdYKqiRzg#B~N3ssU5 zbd{MOhYJexf22uzXxPn8&nlWR?GKM=HQKJUcn>X|M66Z71ZV>&^x>Uh$P;}S^M3uw zlLhrD*SDUV3$%R{a~^G9_iy1AYR#!iCIexq32Aq9c2U$lPjAjh0~;f4?$&YrjZ94v zc_+W5B&UqbO>e>Y#sqg2k>4}wEsm4#cBdUhf(eV1nsGAC7~w&m3P-nRS!`t))X%!@ z9ui0?BM7-_2Fn3L9S?h>S?kWhT(vQ}x{y_NsC<)hL(Np@g{OGbl+-nZicG~O;9uu{ zhN$&25nY=0El(kRNcXs8D3ze2=?90or7MfhI35_IyIh;;x4;E`{&hdTjj4srBh!4A zKI^=$^G(RFshsJZ4YV&k?R(xa z`VgT?=u#zZH~|$U?Qtmuuj4;rDZ$CFx8!zuuyat#Wy=~W$)Hx< zt~Z_l9fn48AO*%)#E+m17w-$rLB-%dy{=#tHMK6U?(^W+x)T@mcbQfur?q0Y2YE1WWa*mut`&5K@ zn244DZl`Z(Alx5Yc%@Cohi7M(_HWaF zB%$iFX|K@beB@z`m*L&!Kc5*-J#3|3cmEGgutom=QIQ4m@yV2O%V3OQP-rbaJba`v_yjbbABy2Z zMZ?IUhEfmG#;t4 zawB_Mj;w-<$w^Zsb*BAS-ViYN>f>Pc%Y|*l9Qzw1Q8wJ*krmB8F9Kpxk?fT96E~Xw z23&kbZz61sioX6Nh7*T(q0T^hDY_?KdhNJod}7k{Td_u&k1WL7v=Og~F{N08{_930 zYJKvK%B7OazFZyVn%>^H>#pTaBf+X(bCpKMRBJd-`p<`-sxKDYjcoG#+7@T9a_}|P z#|~|@kPA)D2c7}zik9CJ!ik!T$Bqww(oO|?G^-xR`3UGtCX1JbhtXgqwj5~i)!*DG(vxN$UwX%Tj;manid zUUR$dn*pXLtoqmcr#X?Du2kQnYf(T0fV;=)DPcqe>UFv&ik=gFMEo2p$>|!a{m4pL zAl`Bd7gYC;)~7<<`0Fk|>!TU_;Eue!@4pk#Pcw8^t`hHl!} zqyh7N1CVx+U4D#NJ%HBFA}y=UQi*$n%ievYNjLq-`Y2tT4jLAFrEqpwd(qdz&BHa% z<3s>ao^`b9td90p%i!X&t*Xr}*J(5u;_VU{8^xRL%J$|FZ^WVO0?U%7o|&zM38fPd z5Tpl=@LVyUcxt~x|20E>6i66s2m=Z^2I!pX4jOifKZ1PS>+=(*-UHF|K=ssgC?f+M z{+8K_&B0aMi$zww8L|d6*8}B!_muS4639y&z4=;|`_E*x4t-zZO)*}`OfPh7R4kjw zmz|)^-Uj=K`-iJ;hx^62+b*O6B}3;z*7z;4==tD~xc*#g?uU0#qS`G31grdj63Oqsyra&V3`kpfR0C$76wh z+FO{tBxi!g+Z?D4FveD%>w44{FR5ad?n$aS%1#&SWjwT+w))2V_CNj9xzS}i z#z=BMP^{DTa_cA_?=gRy<5$)-$L(*FJ$~=x%V!p?*U{xV?tKcsobhpFB1gZhZxWr) z&A)Ch`pe(AMxboE4db@v>h}{?-a{*gEAEXhp6=oOqBhj-P0Nrin>Qu_9iWn6Wz{yd znM3r_wxuJ)#K)k18=3NKO2qQva1`2vXSW8OOfYBI85DdAL(zMZygrSw>U!c?-ssb6 zIJIpQ@J`{h!rYQXv%JaeWWAmC5FevKdgY-={*i?;=$)`c#@N1i0@CO`+>KtE&AHnn zyB>_x+w}vsBR=c3?WHFG$}n1X;WqW{jWCJjG+U(d+)4)Y@%eUX9Jt*xR?uPBIYT>L z)PJ;@8^trHBbHv?Z@zd$F3h-UJ@GW+^mMp>{mgrvismkFX=sR!cgdSdE_(Cln1zpJ z`{#Wnx!>ntp)q*XBh6C;n1Nb8yzg2J&2D3^-W)0m>ZDl;*>Www(o?f@O?k|=UoJ-* zUnBD87-c5*63*1j3ep$$y~Yb+QKV)NurYWG8Up8sDT9$)p_b_GM_-i5P2w(Rp=c#}l=WP)pu zmCkJqiu8P&HiLj);c@B#lU6KcdPs!CVR6x54Kby|4_`vc;)>WU=ln90Q;5swxo?-M z2A!qja=o9<+~XN`ERtuY3i4uTQhKZW-X%oqNpjuuY7|O?K%YR8qC(2i%*a|#d&pA0 z#yATe6~>iMBWyu&+sT)Ni@`o_la7i9(o-lBm=y!y;VtK${@Q40HP=8`s1PYc&q_tTx7c7y=93vmZ6ZpX!NL4T z9M!gDutqx;;;m)6+>W84T`kpNR$P*-r+PHlRs8W%+G3Z#-RsC+o1s*3Xj(nlAWty? zUZzi|0zkPD9V}tDH_MHGpGoyn8;9+#Gd^EgF^z#bxg!UZFb*2u=RaI17o|K{<;Q-^ z-`R|s89&K=O^_0uccWbVay2EqoZh*aPNdG-3O9sh5-uj@%N60YB1T?aMR_`Wq3kXU zst0RViDtcRMO;i0O#=9e%_0Z`(Lk$dw0GQ4*IjE z5*|)7wo~}Q%TwefjQ|U~^|z_GxvNY4TJ!FgX*;O)iDw#vmop{MUUl39~$zu2w2nFleCeAG!**`sOPXcIfHF73~EIf33=Bq znA?*IvVVIM+sbcK3pFnlEspWj986XlBE7Lzt;XSYKQO~fr%AaskB8>!6`yanYKlnJ zZhcS4EzTwPNT+4sf^X5xKjgyK*GK?Bn0@zzJYM^fRt!>(c^W546!|;~6O)Q`&73>q zbtwTYWmGbbzQ!6L3R+Uyll2%~G_D%ds45x;vF8KTw_GE6kfz1>Kny7k9Ef4$YO!JK z3ffNc^+%4!%8Z>skf7y(S>n^i?{Q383b^^SVQqS)_Q{#LjO+?B=F%!|mY+afLxsye zXxolTgDt;UPL_bz^F*d0u3%vqt~gs~U_867&UiN{#~d}kAp1+asviZNi0=S+jK-(I zT)*+CW;Omp?UA3NudUA^pH8JU9@bb^KMC8j;E0PBcfG_~?W4hR&}%u;!-dg_0zpK< z!{lj&+nl*o%HDwGTFLbjaX;V%6+Q*~1rYT-3FgaH(C#}MYt2pn&qI z81=w!iLENuT5$UIaXitkigG1_PZ;;B3on%(Yi6T)^=_B!uFBtxRRe^a`{~eL9LKpm z?L{NnM)N*CV^8PX_3*M8R28O+3V!0MN867vk(G9erwtH#U)gj$Xc|B zvcL9~lp2*EpHX;C^00*vA$^8j|@NVBT#$f}6T9U|H8!Srh5;PKnraVn}g zV`Hf3L<+YiO~htpnZ4rEU7}#mx(L(&@`5prq9RL!X?tHEA?3rBYR3?t2 zK!gHM#e+`X)!~)-4)znCpM1}}{&uF!LwVSXm|uJ#!17u+q)FN%reMqgu8X>cZ*< z9!^Gz==bRv)WGBVS{nty;*_hLUKov0FzaE@!qBhxFOfTmD5WxM6Z7su3HzG0@?GJg zY3?t_>|_G$4>AQw#B~nzp?8aM>cjHqsb7jMEaVXsCj80K3pYqi1^gx}t;r&gBWOqj zlhS_Dy2d8e6dFm9R-}8!Fc4cQg!Lu2c2^j(=$b2+oB|SdpMJh|aJY5GO}3cy8$r2% zJSV_3qagzZF%ti=rnpc@^qC;3OxDwVSy+QjCP_tN&+`SF z7M<~CRTIEua5N`4pttMn_WRicc7Ke51i|xd{h{JEV4l{xbzlchrJf@uGgb^I=_=i+0sKfp~3dwX^@Ha9^>Cx za5fXf@Nv9P2+p9)6t+x#omP_idTWz^-Q0|(pe=a7@S8E0N(73#=|$~W#S2%v^c;h1 zdj5*+uHNH-Y<8x1wVV{Q*?VJVdi+Il{#~pHB+c&)IjEdFHfdTys0a!h{dhHWDvi;i^Du)Yl zK>AUR)WoMobBhR4@fA(B!d+*`QJA5nhnZSas^F>*)gHg``2`lz8? zjy=V~yh^#!Jr$s3h*q5`qBzFGCY-PHFoQawi%;cTY>fboO0Rw8GCoB?dEG%-GCGtk z?eknVr{vCJDz${NIx@$?&aH_`!2Cgc%#kO>rDhs!cDyAU0jsNsi1%^F$5jPZnT??hi88t z*{m~9i3kg0<>2U3x}bI12l#-rQ*AG_q@x!`-HU*XTz9Lz)o?i8ya@d}YygRer`{*2 z+m!^DNg5t>B7VN-$QYP!nSWk+n9oOd%&nn&-JnvH@3z?uNg&CFBWOJvBt8YLEB}xk zm*Z^fK=i4_dSR|IZWqIHvbZ&#mvoWHS06|d<;;pDXwoB|589$K0UKqz)Q9TbZX!0f z<)=WMJCOh-8E&Dx0u(~&zp<0EcIJfNM7Q^H<0H@9?)Q~3(!Ub;%)c9Q-9FSmpSQi! zNBE_17W&c>{=W^0TqD4IGe-83kT!d!Lz19xnvLcj*%b{Y`%ejYsJjXIn;N+XjW~gU zftlCXBL%3bi{}yklNNMZTzX<(Fms2qm#d>=*C@?cS68l{z#PyV%Nxx~A|oh)(kdRG zlU4oALwR26kiFcV%u7UQEWT~rvABLWC(>FR3 ztfZ)4{O-2G9V7ZHa*WI2tueI&Xl&34z=@9df3h`wR&OF|Pu6IE8DjrSs>`+|Tw^l% z`Y)ROPMD1XV%Yy6JJBBCQ}%5W=5O?9uQ1|7@N<>QO7JqHC!|JsP`~iMpw-F8HKsOz za=!ZISueLO^|=lwC;d-KC{WQN_e=_xh&aR{eInoj5Z^XpH%oV~nFrn)sy{g3o%D7tRiOc&V?kul!c#lg6AWYU|?8?;h@ z$zSF|KGY~_ntSr|*aFOBCh&Umt@mZNd-q=8skW{pcd0Mx#Y!MC^j%f@wL|RKz8TvI z*WN(@M<=XV@SL>b&ywTDPAw-)sp6c=-XF1N%S!Pd58>b5W)SE$Y;@wa7_Uof=4)kBdf^vocb^L_Qxh>x#M|N7f^g+#fg)PBegaR{Wvya%F%zK~^p ze7W1n^$M?8UIkzFda24YurF2M!n!p*J@-9e#{bN_CX*=5j^nD! z7BAvyQ{mXB`{ZO(ZU*6u@qMctccq)--HaJ3$nNU<>qxg0z;XJD;|kV$`uv;<)SI)`OFYu!C-1in zAUdLK=yKh>X2txiX7S=&4u!`B=zITl-NseS*yp6J@{_A5-h>xkX;z2BKeZy1c?b1G zS^dquK$>biH757b{ghs*C1b$LL;ve;18GEWV)>m3i~d%jUXt5d*X|D%gi*-ze3m-q z{X==LZ@5|}FW})R6ShG4hgXx2+vcGAwTGoz?b=McMs%;_)9~M;$__Cs zqxtN38hz&CFpbsYSFUCn=xDUx;TlcCcw!`cWNA$p`(vE3PnXYgD%f9|SZO>o^oGY1 zCuy;fV;wYru=+gLzm0xS??!Y$fx5tA?U>fZJ@&J2)$@MqIK6GB!dF>^gX$gNJJbDx zgXqO7=rHHZA=0b|LJ7Xmw48Ua#3ApYH6;~YiMph2h<9ZoVskzVu~SLYiLh>J~H zyS>`8t4E_};|SfeWrAYZ@vJ})FJZ0uNZKoY-0+nO4z@rbgp^OrRloO4NDuAYFfZU%UoD&}#V~?&dj68M{24No_~x8d)6qhL?O9uxJNAjXTIIp#8KfMJ36aRZ=til>W)S9#GkkIQ$cANkDN z<=&I>eD(Nwot*m`ZSRQN>)a$0uG)$m-S4T^WAg1B7^@{mK#N5|UqbHd_nZa%0WJ4$KHD&n(7@j$1g6jE?y$`7sd0+Jj1hOHXUk>Si z%i+rZ{a9}pN&f}KrW-!%#>+6VzHp9f?n$1F;%@a(yKf@5yp9v719v^ue!;oZX`(DD zu>s4xktSSS74?4=r??W~va?Y)jj!qxYi{3NyztoSTvdHEZQDEXTN@ViHwuu%{t|xl zm+9;>nqO=8*_qrDm zJr6|DGS+_tfvKJ59}L-XvGlylgl&WmtH^S)ga2j=0G}ZMJ~INbRm5{|u;sA{-}3L- za?cYne)ndzLMM%btF8Vze$-ilL;=j&?}cwnkx!P|V{_Bnhlmaz6+a3GkvY{K_R|x- z{Be9d4oS~FjPsUrRDZcXU^>+ek&U>HAZWSFtfDOPCHD(%hj?`g?!JhSf6`wMa}%ga z{0&8q0FPrK0(VYT4Gs2tT-(w{r;v^h?qmT+cvHDrmFCZFi95RKRxH;}%pz|MYBC8@ zS(X=mt*&O@k1qsfnlSslV}~BZ$vVnv>u#>r*0z^>L(zx$3~7CQezx(jp84HUh*F~yrPbvU7ovz5MTbgK)y(k)G( z&Z{l9_&w+y#X(47zw=S>klJX4^PoWMp#v)t9H~Z#6>~|ZyF?Tm@{(9rPtb_p8cOc1|A4LVV*Fa{w z+wJ&s*bgW^V!tWOJo1V2Pm$C3%mgG4xl0ORP(WGBd8T@_GA$25l<$M%O0(q8TYt>5 zkNf9!D_=W08=kMNth#g8XjG0;oS&o<=ll%(F7(D`6>xx_>YoLhA0BU`gTVDJsW4Kq z%gAnS&z&E8O7S8B!7zfCR()|;+2OmH7rHWpm&T_= zsV9PG>u2nnxt$r$CZo~nB)L^jlH%>(=J6Acs(B90dMTm<({uSYU5BpH-Np;a z#TTqUf3}VJ%Z}uvy0pxTRR-%t`7{q<kN;DEVbYs3R+N+Ag80lISl z+uqlxj7z0N_b_ldwhVIpD$u=Ga|3?KnG8FLU!!6rFe$^EQZHWlBemLCQT`_fQPAPo zYAN%eZGZ7G)zR85PViWnxR~NBRKg0usg3y<>pwLz2KCDDS-j>5^ zM^)F_1dIlmYL%KayXm1N$3tIDqLiNnx>~GiE~?sd&^A zg2f#5Hf2$<$)uJ@I)%BV>BN~inBnOG&QtDJdtxv}xOlWZcb@QV=%2j^raW3|mPPSg z|Evv2M8ihNE?p;(k#mKcx)x!n%)2F4s4+i1IzXog~C+3c*?l@8fTCNDP|! z^4tioXK}b|$`#|WHd5-XB_9|)$V1+uw|6w&&l{o#UKF=T>RIhuFZI6c;W?jb5o+&P ziw=NMR~x0d>~d#LL29-=fx%!5J4#VlP}*YoANqQC%+tg9h3PTLF@2ak#`ZR(Gz!@& z7R49!C3$)(k=z;l-tp^Qn=gB*Yq)K}dGZ`x`ILE3YBC}UZx<>?0DD9;MwIrI{_b4+ z+|Y9O(44YFmQ_dGV5-f^l%6{`q|y#XY!?u%M;ef^nOZ0{Z7sWu+L83fvglNb`utvZ zA)D+ggPf3daYYYGt9!%bOFo*)2xb-cQ3Qi}oyFOPN^LKHLB^F=Tz5|*;tS(oD7mN2 zH2w$zCA>tOnCZGe?-I!4Vm33UT9Rn`8;Ao&tWaRyip({bE4g~QwfGsBCxAMRegf#_ ztkelAtS9r3(X&R$uLao<$s_Htp*cdlOLI%bC21`61Q>Z{%cb|epR;D$bd;VhrlkWE z-nQAxRnHw8$gpvN7AfjsJ|-9-yzBf-Ct@@M>Z}Q4y@1TI#KK_n;GC(yzFd^UpY7g$ zD0hAJG;WNbQ+VG`ND<-(qZ1f0(hq#QQ4UZjw>uJMCe3Xw7!4`g(=gIpvH6mhH$bjr zK?ftOzJT6AOmbgZ8W+5D5We`F#>0FyeSIfON)d51DfsQ3rleFX<9(=xUk{=niud7!mDqT&NyOe)%-b)iiv@VLBCe+;z7YqmB= z5>09bg0fjz*}#o?)FB2MuvW4z>}H1+@fB*bQwoD4qr`a$4}C|!AMPUujuF(brMb&^ zuYNjNsvrtVY6QQ>3VsWM2Z@rsp8%KS2PaE*G+JyF{4rQ+C16_tEoMwC;T~OOcNn=l<7-sVG)WJb*P@10U zs~45fbjN~i`gt#aoqa!Zf|R+Lg&i2pB&%-#3)p&JMC!UKyl;)2 z=vP#lyBP{Ic;`Q8d$3XXfwh|@{FOYz4K0}yjl5@7D~IKZ`6zp3eTLARX%lKyg~N334o5?* zK>W*c(qC%G!fy?{7y%*{$$@8dVenJzJ5WTlq_ymRJ6Vp~nqeR#U+{>rc?9br!BpPX z7Ywk5mR5Bh@<_Hu0I^>Qk5?aIyHcM^E0MP4qT%voherx+?4R+_H*z;^(u@V>RBn3x zc-=M9x~izTbDC&_YgHsj?Z(d38UsegCQ2=L+{yz5gLii{-+?l#fIZN-W{W0y>nGO0 zuNn#Dd6)FM=SGKnS1{j)<6!gMU)iv@Q)?*q>o>L&>=0yHjL`CI1kM6om%1OQsAlfc zdq+=LneVrgXND39Ir!O8edU!kHf~Or#h;I)M(v*(%}bT&#lYugM^U8t0$*!uYc)P+ z!T1{G87r3HS^#jqxpOrqaS7hbn%3C0&*HD)eC3J0OH0~=m89@8@=a^xUxXCJ zs0@X?327uS$J1T}&I@<;rP_H&GdHa(B+y*WPoQI`;rPrV5fU8hi%tXzF*H=PNS@t> z0ZF_-p5(e(yXlN0n=2{E8xmJT2*lx)ab%L)Yg|VV5cGRxDUCb*Fda`l|uJg%hpSnk%CFVz`p*_w28MgYM zYzES=Wv;=hue*`n`jw1C>IG@u5qO>DekhLItty(-`D`08rghzI*4bcaDvK`wF%jfz zS^na%>Pb}}u=3n^*ByQls@1l@eJ_|qHfFmLw)uTj3N@3{{`@Ap_y`jQWX2{V!_5NF z$9k2#&v!KQSd5C+yhHthIH`zKe^s|%QYz04W5V+|oS#lgha0&93~UasS%-U6o}D&1 z70|T;9LB{-BS8pK)J8A9r9eTB&sUU;kNl3ljVP*lHH>nLiCK7e-;SB^D3Rg?om?>@ zChmkgnQDX|IntsMG4N8hYDjtqUI2cUReT`FVo~8Uc!@&JmCG!KV?dSs;JR_-BK1P7 z=6fLQC~++vA+1^=hN3)bVMV8o%B+zZOPGSy`D36RaN9!PFtcSh#U0&I@dciN-vg z{!TtMS>fIr(j}WLa_ob}3;(#Pyk1MHcFmObnd`K_4TX`Qw-skf1wTU4&0|+gF(V0H z9}(k0PA8n%Y*ke4>4d<%sc%4h|NSSi3G9gb7*tt$x3W(>iMC%CZob%a{Q7OTeQSnhQq{0Iru#B8s>BRgMfTycdbuIe=M!rl(oR*lAEEWc&FdSbh zLcs|W7(`^LFZE6aq2=AQpS(mnK2!KnHP~BZc3l02FEoA; zuRav^8kbIU>{z}C{h~cv)%DZg;zq)LBzT{=yg|di-2dEB%9Q@3|D1gK#oHuBJ}*m{ zkJc;fl$eXG+vMXCp2Fl!5*+DNOIl>X!chHH>()(L6vp9BAYh6Pfz>MvzHow?;0MKJ zk~?un5MEpLZP-82(13f7($eW-1}lV9=2HX8o(<)^7|gV;G6ZT%8Q>Sr8aYlNvFf6< zr!&%vGHJ^yZ%Xb6@$;w5XV1U$dF~>wB#hDE)c>j1uP$Xm0ik$?*J(MMZT#$d-L7_w zZ#eKvZ6s3O4KQ8X@y+|1G@twYz*8G+vPoFW(V}H1cz)Ag zkXpU)C&x!O)M&}!AX325&_l@`?}y@2ajJNwHg~~h4Xl5~<2bdtcZGs5&UclW}yM>jcJZRjjyoKJAZiT7Y z|KaefO{@a&Q73(mm$BN{(u%|6Fb&lLbH-%LsZdPozV&!cezE~~?@!*hb z&T=xz3>d8F2hQPq9VvKJt-#aSroR;}QJ4R;jNSBqlL_Qir6s{;_R(MkCX^oI$kv#k zJWQoB#ZO!42DEZ=-)b*@?StW{xEUc=VwDtPepHqe$tjAq?z1OIhbzs~6{cf`ES@0} zLh0CZcf4c89v0tr$?3vGCtIo~uv!`_x;XE`R4z!(KQA`G)hbTPSaRTysue&A9U%2u@7)11htM z=GvfZj(zo01Avdy?cHIpwhC50cZ4?zQTpx}-VT)S&*2UWbj|3)1@cj$wbs&@ z==n}&erN=o@pyRO$-?U43|(T3MO51<&|t-NM3mY`Gt=Ob%IsPe&LDGMF=lrwFL(Ax zKI$0;&AhEOXl}G*-(JqU&1n_~diU;!@vxZpmX}qr7_GWpcX=|cydK7jxXCAamzG*z z+18bN0EdbRLFABhzG$$fY+Tjwo8j6c;8kiUa#6szEej;0y*b}OXLd=t&<$~U4C=dI z#+SdV0MOb)xW??v^u+u*Be4_R^#V{{`xTNPlaK2JxYLn8ofq~NM<&m4n>yxDA^Zp` z&wJ~l6UQyCZ||T{!q6TRW6lOs2d+qCJmA2J9Lp}liwfuCvFca;5usFuQf1_Hn64_U zo;jeiYOJE`wVX}(b4+?EuY=Bb1bOG4xbp-dU!e=}@PRbHXW++2etZ$F=y$opSjXR&}! zB>i9Yih!HYI`OQKF>Lkley2+5&g#E31aFAyqLStA0}mg5c@0v2+!J_$@pg%{$B(@n zdex^TAX)@036Rmt5;-JZ*J$+XE{TmL9K(9I7+zI9aAF8?)}9@QOQZ=4*GmXY@jv#q z*VYmWZHf{T`$7&(PXamM)5$IzbWuv)ft?-o(jU*iQ)CI$s;YlUkE8gvd#^VBr^_jk zlK5vX|Kmmkzpr%uJB5FfK!N`iosfU-e=knt=^@Of#cCMFH}=yR{*iP4=A&|os4`vu zf1Vys{;!}0Y-$JUkZ@K}(>~XarrA|lRiryy*#D{c_0k2IKto2tP8IBTfdhPrWaYcE zFxSi&#CM+*gPKDBI4q#VV(0S+|4EO8uhjunL1No--o`7(cw*D5PqvcIbq4N&M>{XA zk9CiT{?hHWQps*Q=~A?PegB$OB_VE_25+1-H`96NtKr)9?dxRF80i@ENWs8iA7@?A z$fc$4I}j(xUGpiG>(#r2^$#X@(}iCJ8$M=y*?RAM`!1o$26Z|^5$#xMeQ!A)n^15S zmA4vfYR&q0p7@)5Sd2)X%$>TO2xLQsC4a zhjhIsYlk%F4J+RXhT^K|TY+Liel5nzGOI@v#!wn)P3^OAC2P+`?vEb{-W4cD9ALLp z`c!EOJ~2p4`qW~dZq1*mfv^alY+tMvbZ=*js4f;DwDW|8oIBrrxmdJDxDd&^-}zs; z<_?47PwIc7LhpoMkw4?s_SN}WtDP9;(8ivfRv-6f)>r@S>XBB)odMnoO zk|2@r)Gty&3AhN@_lg4^KD5-CPs$W1$nGY$9}zB ze5*cij^Oj+&k$q~n0B2h`dO`4^AN=7{u8)L>%iFck;wFTT1)SZ)*DZ^poC% zcKz zi$p4#?oAs8@Bcm3^ZC;_KqcG;*^**`5IAjr zgRCwy2F1;sRXcPFJFOM#(@uvFDsZ*PU`AL^K}P+F|AvO$xqe+8{TRHLOL_BUb-v&} zf-OLfF7X$8bJwr)LnuZoz}do|fKu^Wpb*Pu!E-Da7WUU{bw= zs(-Y<&!O2fASu7^Bsuc}Zjk zgP1ippX**vru8ZX)$zk)P02;A>tl1<*Xdd1jp9a+ZwISA-)m?wJ-MLT#F=^~$s@K5 zZePGSQO}`V+t!d!0GZpyiN*S>(HmtGEmJNRNA#)ZoRqRInQ_x>Q9}(gUaSuryywqt z^~uu56p88mv~VB1s}-|A2NO5;3AFHdI2Gl*|NVvcMl2Zi*I@ING#?=vylS$8F)gDB zIMSqDw-^+0={?fR`)Mzg@s4ueTcEwTgWCSXl>3^57#wiC{_6%sGibEk!r=L9d*|kPxGV%*2Ag^nq#v<4OWDO*xJYMNU^^-GC@|>f z{zWn0sg|Hb%=$dotEboXI+gfs%R;}JizsCJpTfXcl%ft^ZWX|;kvukMIsU4jS>fNT%2ZhgF{@t`e}1j zy8ucVhh(M48Z_yb<9xMO!w}1p(uzAmB7iKd?RM%nok)7))$qz|+c6v&V7q>GR0N{_ z!q|*_u~ru~`y&6yu(Q_In|#Q}$S*b`HghGeFO#z7xVu$2{kpsH6R*<=%kOF#qH80X z$!1_#t=f-VWmAx*q-8&Wo+&Xm9346#ne=*Q^=FkPd8#rjMh#L+y|DmQEdrx{2Tr$O zs0pyXdrGjKPl*$QFUxJV;(D*#uSmUszIMLFo>aFJ-**|LyY%tHC;9HHSN-K8wycF? z@UzRu7JOC+_IP%;gcGr%J6uW*(SHozXQYK7w$wV=rd%8`Y`Ixjka=pbaxRkK0#buC zxo^Qr?BlxnEFm#bX&OOuWY|v=APs|3IWGU)7e8@Ba+fmRxq>0jG7UDe>r)1pUzRmp z+sV~NE=<3fb{?Y7aPP}G%?q~ZM&zwo*bUQ6zqwcTUF?tMV!p{9loTg4l&#eOGXxqD|#tipQoQN@vi zTZ4pla-FOp7h(u_Gb&H7M`E{$D7m&DKP-aUA^gdN)qzjqE)gVoL)KPDNZ&IH_TV&9 z!s<-cJ!~U^3Ofn>EG>(HZhpsvW9hO5?SGs%vFd+%1y&Gw2Q?z258FWO<+3cD@?VyA z=V(HJHMy8bN_$9Ou&Fa`Vkpu|pn47)t_Bt#4}5W%1)BWkKCz;28bwpSG$LhiSGINon=y}FP>^^f#BuO)&0QU0>+%h_9Qt~E_410{-a&@}CIg3birH9?9hEh@v zA|`-Eyq58|kDY`=u^-e6P)gK6Ik;vn?R#p-1ey~Ms<;=!i;vaZMpGX?AIrU2q^`G3 zL3Z$%(}^)iskp%mIYq%C2@*Y3j}N4;vKXn`+7XN3)*YVeHI}H<^{X2 z)gb%Zuh$94`4$%*e|b(pvQt0k#xowPs*yOgy4?tHCs-9jYRBZ?PZ*Kf!>a%T82ea` zf$PdwRq^T;iNd>QYYGkyo^oQFz9pR<=7nu&q;BTO9K!`pf9!pV^9HyxyY1&GaK|>H ztoDPiwjc<0b+Bz~3si{;J@3IjDZMt#ju^?d98CUTVB|?Xq`14-`g8`(FnVtTi5oOD zQc+gEf8SEm=|@zLe^%F1b_$Tr-)L8ujJv|YR2a>4;tnEP5NOjL>qW=t)pvG_QC!9s z)1av3r-xSTOy#@70?6?0X3LJNOEsV(UFGoZpfpR(lk#V<;go35y%1>6cMzd?m$m|u znY;!c2RYCeJJ%1`84%bBgAbu=;_90T{kWIN*q*v$A(nAVmW;)AfZ5PzL|}%GH{ld1 zXbeMe`Y34LlJ$5s59?YDRkt(kuVk#{XjlY{QQm|fT;F-hkF7MNKWzvo!_ z7qjf*DGHGfF%NFc(o_aPMrAJ=ax{i39|o~muu1#14&Ez7{br)6k$#QYhPdId`RYU* zfZAjiBOo(#4uH@q*H%`Erss0)$9r!FvL-xuqDpgq+7R^Ix2N@Qz;$BlmE>X+k=Ei@ zAJ)t?B2}8+eg*d+Whi>S>e%Yvkd}j)fu;01KJp2WxbWq-B4W;r=_eINcb}*GJqs!P ziXY6+6KefBe615ts9@7 z-F^wgF%yL8sJPvQof(nF2To0ueDL)U5TxutL$yK-SR%IttPr=Z)i@zmaKpZ^-Tokz z@&x|dxH5!tyKsJB|S4H9>rSBcTu zCTrKzBDaWfI-Hp+a_W|zwn4M4v%Q!Xz!W+1>)&Y49%FyJ1s9ckZpbP9#3&5}DRQKI zY>b^4c^SXES%@=qW98z~^60Jw7Wr?Z`J;t;k&7tnbvRlUP8gy9UK_h;@!;k@S#_q- zkEhD9V!y>Xa7hh=1Z<~W;~HAq595@vAl}L@Y_M0(jR-)d5^BZ|Dh##3^?)~V(;m{( z5kjd~j%E{+?P_PER!=>`TxwqqVG>u<>rp4(w&2PuC|R;C^`Qb2e{b8(HM5}+B@MONW&JqAu$_-)rgB)z zNgd>0{$+6H%f&b*kqz`%J?wbAPms-bE=Z@{oT}O7p*bycXd5oV&N3ikO+f@SJ!z=a zY=SLgRc8L`?r>5JT;eqFJX9|8`Kbr~&D+x*?v84nq=t|=j%v2r{e-{tR)|&s=)%Y~ zjP_OQtMsjjs`mN`4~1fI=u+`z5}fX8NibXoUwHY-ZWhUR15(45XhDa69tcUb9eKS8+;$G+| ze&|FQ|&I^>h~;-n32}RTCczGVO71!zV}>3W<<{$^(>*2({sAwp~Y>g zON=b=sBlQ>vfF`FiG;r zPZ@`?W4mOdcJbopB>PtCwMCDQr!7ugJWHeL1i3Uj5`70M@m6gbQ%2EqTH@dc2kaqT zavJu>vbFxhlk(kkRlC`T4$9Q1tLNiitJ$|00Ji0`AGTA8w#e*8_Zgbf1bY;FDSo2%jXDf5nf;NhB}UK2mp|pC|<3|x|{&R?`JJ)yAh-T zeY@%N7MGQBLCXW-M|}99-{XVAJmfvSe0q{aQ_4=c%Rm3v+Iqbx3;pS>gn2I^Vp8UC z-@I0xQ@Q>0WUs@FLwS!$xqP5=)ACnFuC7D=6oR*_SiJXsp$#_4Em8c`R;VcxwXY87 zcCtR(Bg%LjSYVcJl{Y>!$Q3nVs3`@onI`>=!;Ok3Fq|Rl9Pt>={F+m~0rfaLIzMg0 zZbY-FEew9NU(?jk;Abw%8+q@;`%E=%M+8f7U{JSjQNf1dn<)1_9p-n?OKyeopl7e5 zLgzw8zt$g*&S#DaqO8pW+ZyMy@h&ZhAEkAEgg$gUPlPa6`n%WNLD{Y}3gEi8mr>(E zt#iM<{zRqNxoWR!~G{~zf)Lc5aKb(_YZOK1S z)-hkyW9G88()5F)(%2Ok1O2U7>Fyj$Blf|S=Ja|`?*mC0ahaGfZ+;?VuDtuE)Mv^U zfH#RxReTkAAg8RoIU(SGBBDnNu82E_PbT%r!1s?SI_r?=-5&-$X3na5XT$FsC=}hh zRH|glnvSJ_%bAIQelw-SXTgX@*h;s`v_JS#cSy1jIuzO`2m7iFv#`&3ncm;MNmTvS zrqYhh)P7;y)Dx+KPEH~Y9(T{GvQ>!{5BOH=sO>|fJ-u}%{uB;C7GO6-mzC>1ujcNr ze zlX!dfWsyRF`@J4V_|74qiUI!1F+nth^9$ofH%CE5ps1chpaYNTI-dli&Q8-58~)KmO3ngRW)?RND<)896I~xa+}(ZR7S8W_!`q!7Ce#{xn{_yD z=`>@0V{tmvvHs+y`jDKK;Hf{BdL|@dvO*H?&HrkQK>Vju3yvR_-6YxmV7ScffC!Yqa z;})A2AViNjOt2Ry?siWvS8fjdr9hdYxxkV5;rXTE>FQcx+wWRn@I`9>j}&A~)tW8~ z%$u*PD8{UOY`Dl$jy^kBW8cxViiVX62mi*N?jQBYA<#!=Q}tsE&Xp=Tw5Xn`ab^#z zp6!2HJ~)UmYKs_Mz6CkZ0X8z(!$7{LWpUjcE&bG4yF#PNm9LJCQducAY9C+cqM_sT zf?H+=*-ELK&AGN^%ZZ7FvFi#s^P!{EjH=B1gG5oepH?As%?nPQO|*n$bJd=~qTe2V za<;FlUS>^Rj3m-JO5+QQq@C(#RkpGH~POI^j%v_2g_>6^>szt`vg497ZAbjxhE z`9GfohmH18aIP6gfS@QwSL>XI;2#P13}z zs}#g%b|(&Vp~(DSm(S7$H2J$3g8f82qy~M`z)oyjfuO{3PyYMKb|(8;xDe<@4D*zlfgr&@na z(7mXkzk(^1*lw@4Yrf?sXjWEtuLi;dwg4#L@eaUztWY2PV--q?Mi15|v0 zO7T~RRdq1htU04Qz&*zYzm|T*6-Dnie>6uKj-{)L+Img+EnWvJT(Sf9Xsrzr6XTA| z%_7F^JJS#9s>k}56^e1ncM?vy6DuF~hs4laN03I#15SPFX~y5Go6Qe8SVs2QN9E4| zz`_0tKSIY1ZAV?iH!VIS|AaI~3gr6@n;)^|?BO*2XRckHze$<5t52`-i>!zK%+TS| zfx+X}=Z2@lO;)H}ZRZRr%}>+2HHNBW+QvLd6Jof&9g9Qkd})-8+o`^RBR9vn&?V*c zsHtpflcTkmQIvnp?q7N#th8}&5;_*R;izU+yVR|t9WcxZbdoca(2Qcemc;IHJ|nEF z0_phIN`{ma9kiwj#2KEIK{$j^M3DNm@(0vGNaMgo#p0SRyh;`6x81d8qe*8~ZM{fi zO>Xf~nfBUrJhf2*|8-3mKMHaR*~cdJ@Qd0?CWD*9t?652M^$co`pN!M;H>JDUEo~D z?b|OVHRH&5Sc)-ODfudEd(v%qLELbhj01f0(1_83rv;p5EtOR-1doEVQw+!!_X2Jy zCzrk^)Q4~rj~HJ2FnCsE;+1CZ9!p+M+i-7Luilr8s$B<7`3&|AjYYd^)GXBBu8!DV zr~6;4&VRr}_A7)eLKlHTQSN+1*Al~csXbEuocZuKGk&>vxXEC}KAENkwwLnq^t4@A z`M#y;TPS5T&k;ah!Z_WPn*5OsP^EJ)bb%+fHSRvL<|7{)5u!&-#t3^$-m+nC0COir z>{3k4ebQQ)**O^Job)#im>W}rwFd9~1D$XumTkn_Hx}{2z(LsT!4%TWn=;1yHn*+! z0b+Kvg#E?`hF-1h(igAB^N}}4=2lF%uO{V+7sK(5qPB{`hUAeZuIBa*x$M2mh*8zd zX<<$&vGi29XeNT& zf+1xoS_DF8gCq$tWZead>I+()Ow6-|DMQ+xipy;&|tDNk#YxmC-J3Uxb!`-ViX|2?%3yDjVIBzGHK_}DD< zv=4(bzTf<*nPs@KJ=mU^(!(@5_!?|SfJb4mcHb(eH^n>Ki8uj2_j+ObYpe!3{4*Zl z$+|pz`=B1b0l@e6hH>=G3!z=jlndcx?Jig+WyjDGL#tB_rVzME{x+%){qRelZ)*lE z22O3qjz~X#Sm9s}T5Z0*+j~ecn4Y=+x>{$$Rb+LSGc^-5m3YeRxYYf9AC{(>aZ?ky z5f^g(W8XV-)nFwTD_|BYh5&5T&I4hS!5H%_bIZ%-DU;qv%Ud(iqEb39hb;mcAG>sh z;+iQ7-1?MQNz(vWG(Y|s!KI!Izc#>L&AJ&-D5w?T;%}(KcAEP1fNP2jlr}y(n$Qtn z93idqff^$K;;|C-BZi!pQEQ*%7JUaYm1Sm8ggxJewP&Wt*3h3rHo0UCAZ9mt^?s+T zFPHR;2SQ+=8y$8>ocTLVku$_bn$v~ZVB)*ng#^Nw;la}9G7Z<*nHN=aAL37?hs)|O zJ-4)o3Hpp^EH>cJDtfD>TpiP@Y9hrR5G$IIO=}CLNd907JwKjB6cUo`{iiU2b$ECK zbR+H#<8Ieg4Pg0YuQD*YDW13hUw;iUa%nNDiRlwPBG|nP(=GYY3;48qPEsLI4v)3V z-bsHpPjBQNS>wCKJgroSiKU>JAw&wNo*2S`H_k7 z#Ws-c@FRVgiRgBLZ~g&UKsm1T82W$$t^DR z^u5XeC^UGiok8g5Bv=qz5n?SR6H9RwL-Mu?(VbTae52+4HJZ#584Ut_`nR2}0n%QD zn~b`!(Ec?rXP$M+p*n~yci}!iq-TJI=6523kMCU>LoXVXRCx(KS|5Qi#Ds+O?_u;g z|Ldz@LPFDSw1v_C^@eZm*c+({hOW>$o0=xv4+(vK^@bv$c(2KxaD`k5t9i2UIeokO zvSqIOX`$)A>7Cp|BKFl3rJQ_^(?UXf+CA!rGTicRXZ$zsTI2U@-$NOXvraau=3P0I zv6Fc#BR|VPFmNNIBRBMyY@x=bOgrI!3^G*nIxj#ke*%Z0m90P6|8x68w9cTp7Te=O zLWppSqKq54X8?penEC7?G6pg0bGXMw-FG@yE}q*jD>$KWfx)Y44!+0?*|diD?5YlfzYIO1Iv`i3lOG zm69F)GhO-gDG_UrNjz1m^bscX!)G0>{iK-Kw-$RfIeq)F;2AR>O6+W{#=iJN5ho-B z&dGb?sz|uV78BavkFk^3Q6~HxjJ5~@Zn72DR=HQGu_LYf%Z8a>lv$Gm7d#IyAEa+Xqpu} zdZ@EcUV_t3?CY_&|G8v$GSci7TQ5-KozDI7S88U6!k3k+38bu~0HeDa;`Pi_YnJ7ZT zQsKFiuH<(54W%x84K0ZlYSF46%0$?d*%9uagU1@JuT>P;sK;#bx@VQTCvT^0_H6Z* zaflwG+2t3k)um8s#LtoClEAO%_mP{jgJz4Pl>GsA@Ub6L{V<^A*rV9-CaC|y)AYG1 zlYVs#wVWKN&G=qsu5|C2+g3+Q>VQ>h&xQcXv+ZcuUFgVssVjY4#b?MNUCCK4zgfN< zar;_iVf?C{g5nRm0aj}91;0+A7K!@ZiJMiXD<5)d7u|K%ZOqUg?viT6r}zOWun!0W zA6`$mu{VVC zF)XOQX`;)&Z;|sc;%?Zu=c^uZ{{maEYC*dt^Hcs2)=$>dLZjOAQ!4m7TaK+u$yrus zzCMkYHd-*`tyQ`KW(UcK~ zR=+Mrxj5F^|0H{u3Gu;wMrKkL+m8$UJuXLLCxD3NN(=4K=?hYykvWuXQK8qAI*(O! zIN{Kf;$lkJF9$3(q}(|8=m=b}#GshiEtSBVJ;_-fi2Aq?M}@622Q64oOTO1(Aw+}y zQTk-2y~rMhwHS*Oe6hQ#5kfXlxU8;<3R%ky$0Z>c5aPf`Vo z`k_41xGUi#P#-5QKObiAq$(;Tgso{+5X!ibEde0TgP9pV*=i0AnARvpo_6+$NBR#j z&TT_O)haesZpn4COWsJ$_Q?m%#6ib8UpCwu#sAoCN)Ou{y2c9SVI?P|bB3 zaND0o)#`-_*R5RbI)s3+WsU#bKh)w=|5jiYKC)B%mLmU_Cp5>{0d*aMj-5XstjC@) zfy8<#X4>z}zFX=s9N8ZK6YpLpq17dbYHCpdJJ0BIE@J>IBIS!1$#fmPq7x``_(AJV zCus34lR94>VCH_Fs4^8a&fR&1-Um=OuRDTZyujhi7J6f3mHTO@swxN^px8PS4Bib^g2CSQK*W@yKr;)QL--3T6=w*&8m%U=I1Ee9??^*?9>wY_l z18Vmib+S{8k9Db9?@rFv-1morP_LS zz0de)67KfA;bqozV>|vuVt2B`3M2;JYqwQ8G;m*^wb5pZzlM^S3+l{Y3e1UJ+uT6j zcU~avG`52TB*rOYi>#Q`n@6o09*=at@$iXjZg>p;11O6blucy%IvQaZUmzDRKL4vd zZmrdhu>TnHg%f3w$^@>Lgp)H*rhtE=4?IuHIn&org__6W4u;L3J*ei@JN93jvBsqp-@^QoZOE))j72y^vYXo4?Sff72K z>Z19LX*F5xftz)G#phkwL&E<0&x**qvYrWzE{@<3=Kj!S8EMZ13aPYy=s3esZi2Jp zuREIT*Ci`!*v76kge8Rp{FO5z4caX~JPf?LPW~37t59XDFi?K0r_od#4iDmb;J_tj zyLf3!Bkg^%N(ITOf8lR}4JLLei*ViO_|)0>f_W09keKfLC%tU>a_1a=Bsu=I6`W#$ zwv6RG(-ialeoeOYb@P@{P^C|I>1&sYyPYJ<g5le`r1mxQpWy>o>QgiIPlxEA)&hvn=yC!iNJ*h z&Z;=rX%v&5;j`yLMEB!D)Gh+5T4!oqBu!=r2z_h!h1t>ql{V^qu1_1SEy-kS($vcK zjQdQRu9x_6D+AdSvka>zf-?EG-SUt+uZ-xhJK%sSvFwc_cgXL=d4M+eHeMnvj&ipnn?N@Nr?IV zsJx0}C$wt-m$0Y}U-|2mnMZVFN|_RT{1OcI1NMeeR7IOp!I~F#)XU)GO*N?_PO%d(}F1LdS&#!p-bA8HJE?9*G6;!xMdBY)Tvo zMVC&o2^eqNcqv)LwTns9P~Tkjxz!VJe6m{w{|(s|n*tP+WL(z#I9dXoOfaF`dz%{= z^LSz6l)}L5K3cKAyP-h~H007$+H`}M8B%P}$RJzOX<@cQ`Ph~qM4SD_*oM|x_HCOo zrEdS0z&8gt5WydMhucnkkkNBEW%B*h$Mmfq`f~x;e>Q|NL!{Tb;i9z8a`B8Ii_nN5 zlIjouc_6EtSS5M(T)AyEL|gS-x{2%XK5NXAt#0AIzxeLeRN&$zURzQ~b9H-2VS(>( z170~xbuwfof~2}a2>OnW941BiEj5&z=xVEY=|v|9mP!8p{@P8W3O~Y%_2ty!YaA+7 zHCaOWJh5tflK0I&x=mZ}poEoQ28sE(jRzE{B>!P1_a^GdhF9WvSxE6E3F8-~_VH^n zPW;%372yg`9ZIZsTJ>=3o=!{Jl>b~K{@azbMR2)uTlKu-$vnH<^Ct4i4+5Ziw9m&p z1iOFTyX$8C)%M7ngqy1CdJGwc7(aC=W+6?#^6Op_5^NY9<>sfRjtX1RNMs142;Th5 z7yAqieBHerp*4oEIqldRGe#YZ8-)?*w5|fmWQTMbV+@yZfIrbp(-i{``S8eL>n#sD(a? zB`XIBOj@<}71z*Mt0Q$h975~DBgKLxusk6=JS@H6Q|+Aj<&4R5kMz%^^=0&X23x%P zUz8VwZwH4NQAv$zhbnKiZR?stEvEfSY`mSTmzPhz;Ba9ueuAIGhBQ0kdr~BEg<3Fj zd*r0#BmK<$jEt;8mu7z(!JT~amcUmCH;>{gZ5kVd^pyld6-yzve#sckQ@S{f>CQvV h4yp+L5J_x_e`tZ)w_7QOFcuQDyCxR5YKLLkJQycyJ5u?hu^C-95n;cXxMp3-0bL7TgzKoJaE4y|3!M zueP@OlbPwUp6=5pL|#@54VeHL005v#h<{fE0N@S*0N4d2*w-iVHuORO0L)LIu&}&@ zu<%D)dm9s=r7-|N9qkp(E8ZhO)TgJE{|P6^8N+T+KAkQY#AS{Hk|&!*F6T#E<_7%-UY>eEm|R1?H_1lZX-Dmq4Ez9eF6_PW}xM7lspTp)mK1^tvcHUzU4 ztAg0KOsQHp!j(v5{$G88$r}A>pYu1kJ5Jwk9OGTot>8!oWnkCg2yyvTB2ogqNm z_^Ul#7BX7R5#r0w^;OM)5Ie>%X@C|zqCLY8NGGskEnA+X+_IN%koe%#+`)QQ0G740Lwc_4GORFUnHS^q=q=yVk92 zb=XbgGIBYn`MK;!PfT2HopDC!AP(ue;|5hVk9{~wqwyyz!G?{B^;u#dvGBe3( z7~=j6{WvFO(3SN>JTz3SRLI>Od@t^63-nr0 z0Xv}2C&!iZ{HfM2`cY2RWVbdLDW%|uV4)oNL%o5n=c~pO6oZv+!si-_xsbx5HZ(?g}eSyR3tQv{Z_3tQV z9}=$>GgiX)3ZRsE+Zou=0w-E)=E91ecRcHMQt3k^B~5yv;u5j=XkQ zl_3r5gD05(%)~WhdwV+~;zW%hP03kiC}3{_Ddn~&Gs(XPI_hG@C6F`>XjUtizV z^)|6@gvRC~Y#UYZvoh#RCCo#6-C00O^m6S4tP5Q$=8y{WzO0A<8lv?C(haF#wvX)L zzXws3=P*+-#X|5YIa>^i1O8A`zZn1n$~{rrh* z`Lg!_rkyt~F0Q48YX=W|es*DGY%Dx9RO&Ixk(~Ofc5|oKa;n%u^W31cxQpTa!Yp202ZxaogiiGLA7Cc z_j{^Hhx>Z4_s&}+{6U6vO~|iDDGRfre4PM;@u%NYS&HnNND^`i(MOjHH_A%10LpK?fw*8Gx!)+Ce7ht31 zWh}1FafsZ>Vxgw70dsrXUGMy^Y>hD#Twf3C+uPgwx_Uh#GpAVxnuS~4Df`h57iw$G zaqM5t7eaj&bk&r3DCk+VqLgmlCwL|l)6#kKo+Y%kd8#eQnwONk{yh2kzkE3u11Eta zGbkwwy>%Z)Zl5Uvins+FK&XUpzAY_*bV-OVP+xg;r{wS`V+dWqG{g~;~soBFyIr`z@e>?g2!chT+? zVSgqFho&*9WeB&H`>%n2_Pf%3Hu_mJbTty%ZH#$L)z{k01tUN#{8MRO;9=a?S=x27J1ENgs5db9u}<2P zvGEpK2(<_KB<~jwpR|706czOr%uXqx0oXQc3(B58RRu3X-_GLIC*rO1H(!Qbq59$C zDRc`ZP$ecLBw&!P=NL<^A1!2x@s!$_n@_dD%gnF_f5Yziit2Y^Qf|vi(Cq5Su0-)k zRZ5OYFarVP@4pbKhw~mp1M(H`?w1Y4w-%}i5D z%y{&17a%}e6_wu=%?Gdj)Q^S?u?ZbQME1qO0wKoT$}E!e!GI({4+4a=Qxq}=Yy6S3 z$7U6dspiEbb_~C59?AEo62Q@7w?M2;nDe>CqrUsUf%5B z%JCd{kpr?hQvCF~C5$=nW^Kx`ounwbsq*#3UI-V!>fqU8Ee<9!GG^v!=>2sH0)o5y zy?Hk^-@g4fqL#Gw?Ac>cX&VA2i+H^n^>O_h%1~yG_Qxh>7*Gxp88!f*-zU99bHWH zU_qkLTmHNh=oQ!){Ed~nBp6n*&*XM=H`+m!nOOikLPF-|m0v!0N&Z}->f?Yc7Z&EK z6ecLditfq~B*O^^>gzkJ&e!fSZesFzVs?(uq65g@k@(=o&oI|cGuQG-HSXZr%uZg> zdfb0Hoa3;lv~;h`x|tG2GzXe*@9t7kP`tIjAV}s=R#iQn$<-3n&-OVxnJ{Oh>hMWk z4>e~SY9K7SIlg#kWF*{AUMSWHEjSq0X+eJDAGe)%wn6)pE)&{ZbH`l&jR<{m=Qy&h zBt_t#GHzpiG>08~zRKPUdk!|`;nt9muBI#-g^6ASCe z?J-Wn%g{HHRtoMI@4f4I%$x=8M7dTWZsG_|XrD%M@k|XR)pKl(g{pGf#n^Mr z?ZsVfhoaHu=pCt~$)%cdYg$@bMMOkfo6r)XQ++*O#-V5FO?P*9Q&SU%%{niV$IYRY zWhRNv&d$z2I05eU{fX&c8`F7=QXy@P(l|Ivm;MggTDpyri2|BKRo;#lTQoDK@}w@% z<#o@NAE|jK<6xG;;DYj{v644~$98As*gq#PDG`_=0OL!&YpmOfpNdFJdr{*LJ$7e+ z#dN=r|7l0t=s1dJ^u5sdtFZ$ImXGsg@|5A;@%2Z8ZlgCRdX8ijMwi`HSRT^-5z8$) z2;x)i?V*uA8B6?2YR{pGo6+M;h3g=g=}f*YRA&z_GFdv_)NJ2ryTb(uJx=RU0|!8i zqXVR&b>UR*pwnL0*<1etoLJ12>0>YdxWAoEsZ?-W!!SJLj(0~H508BL&#agDc)!fv zSv-%Wu+7k4Ze=W|9GYB*Pv~7T@(cRtk5A88B#xJwYI9If?1&g`mnJPvKFHCaZt$-i zLul7>9R{orBYfIjX9{Fe*{$wb>O0-9Y0ibG)5YWrx3JcGI~b|yh&as6?&=d)Gc;y! zug6k%_q-p+%aYxC_}bkiWszh__~)0W6{QqZW#S3|0Yn-Z;-c5i%J$nwP#%&-wM_5f z;bCl%bUu$$W24y#()TnGwGFfF%|-F!tJlW=YST#xU0|cT@c?-e+|x40L|@9VWZsd z#8PkFvr;{h>vpFB=zO|8vTDU`W2%ns`3a(&XZzwy={J?#QL6IobGgt&h4FB5cuzrH z?~bxCR1v>~1ZQj62=ULK00Qp;u)l1Zv`J)?ura!k1G){e<$vQn-r8j?+HM?MQ`RM& zxdv2@+qA}uoYnjN9jYsi0vAa-T)XBr2n_{psH9CsaGy`vEmiKvWFDocM6G)a8HJXX z7Rh1cm{~dXZj1z2Aq8ysx+{-b<5S|;M6IZllwnNi)&IOU4F$XRk+kH6S--bb*aJb| zyL0@7qSdLXXoLEEnwqwwuj=A1s3xiaL&e2W_p615uF`+EJd%o`HiO(~us!_JIzHwX zhD5}_p<>gk4!($={<;|$CEA{Q_RZRK&o7M6Lj`q?*R{;kXSUz}HM(z8P?kfJ&f{<} z`t}(8Z*{MJiT(V|3Gf*Hzq=CTFv!18k@P*q{vToM--3TF^#2JT*8jy07()M_@IOKM z|3>HkSLk>7uSxm(5XdGT*xgC@THxw#t6S@m7?C(k|7EfwI?ZC{xIax+|0R9OXq}kk zxay;L@BrIit>xMJ%CAy#wp#~WJak*3G+%xDd5uVa%l9eS)CWo0&o|?xm(RGkf&$(-@q+@@vV;nl3@Sq z`o4`yb17uBbjIT+YY<5?L?IOp@X^MS#SxyP8S?lO=JZHAex&ztWpL(bo}@ihz0B;# zQjg}~)8i&j>fOf1@(CWfB1%Y@=qfsvsG|E%;;g>cq6U#`{SMwn%b z!ldHXILviv*-YCbYh3s9n$i<5DTZUN>F%E9^Ur_YT)Zwqjh2L4IKQNH`Wok#lT@lT zPl6utKA019KXyN+HMQ{S11MToyg)n$TgwcZxla1&QVuk=5PY}A^j2C9T+ayk$SW5{ ztwygDoLde$XbU0eQdsThuGFO~-c!-%_u1SF$LFEr*oyYc*R3*oEF}R32jf+52gD|J z-#tg(EIYCb6)Zf*zTmgx4uSyi5g)se_5Yywyrk@WZkx}pN2m?ePRhD#y5W=5l)o0vh0B1eZ&75j5cv#!s!0YljHDah(DK&@5L4cSxb@ zwVb**Srn#WaWixzN*m(wwP2XDo(x_K@K*xsNy@YxFNjf^yIMIq&FlNQKmLZ4>`g1& z)EfZ+0*`dmElZDBYF`vfc z2u%}M(e;`KX%pbt|E$F1leuq2-oxv1^RwYh zk}o(Y_QSm{QzIMPLJxjkqjA6uVErLvEeyJpKwYkhFp9D+<+8Se0q-@lOfY?Kta(GU zsQnWqE~i+SuxGaS9V)3CVlZm0J*ZZGUF6pOXa|={dRe}+0@bz_1wjD&OxinHy z8UF0}X>eSrvXp$4GQT8$=z&gpdbwichBot>hi}gCXGPEN5G;3gRXBjAf|8PK3(Z)z zMj!w%OQr2YZF#F5 zu+Udr{lJU(&3!rTWS0{mc6no(C_Q9<@qwV8FAzOOKh5q25Vty3Sm z{Vl)-$SRs>l%@rmUrZ}aBbmVge5u*kv~;BInE+(lTb!X1g-j#dXcI`6+TToXU~*Yv z3A~mySm{?;^9!;WX3F-4PDnJ3X|YV>TJ`3Qrhww4XU2(L z9Ue0sOYzS-jC~N%kf|wToSIwUT!;zvwRf?w*x9t&$C4T+R~B^ z8kar%2q0wYgqe4*vV$l(j>-U3YX~9IsM;+U&x$4<){Wdt2G{>t;c|O+;)AhsZd&N8 znt;GhnDn&;V+A8k(jZ)iD}TriR#q-d%8aj69vBr5L7=>>etD{!mRS8o>VDG=_Qd`5 zg)C^iovGTUR1SszyGTB64WLGovY(5mT3q|j_+Y)W1NQn^+ZlT%yq)T8b*>8=x0CrG zyrhUu{@2qnL^2Ga#X7YK%*zje4AJy^HtgO{Q)>6}BMlBm>Xqpo5PJA4$PCwhQ{OQ!ujfg$f_5n>PJp%Wo@@zp{P?YOPv z#5%2uXX9Q?7h#OOy4wlY7?IeC_S%y2ZtNWPva}|r(O8Rw&P`}MswULgrPS%J7Hvl) zBcl;&9TP=GTd2BjH%_D#04h;7Q2KyRL4`$$E`!C6X6F`9 zrpV-=RaK{FMSvXhv!U$5n>@?N2*cp2ltA9RZU5$t<n5 z#`Q~U0PX=x4;SK!r3Z$S!qqu^UIJC%(q=$r_4g559MYD#NC1HaC;O@Mm6Y9%!uY&U zYMdir>cHt*o8|A*I9OHHo<;A`3(k7wFn9X�GoA7xd7klmgkF)<&;0ReR9o>G{tA zWG@MBFP_2wz~^_v6|vxa7OE22p8<`DPD>TFC)?^u=n*9UT-*CZb#P;44*yq4+p~YZ z>m+}0Kf`}HqoR@x)p~@HMY@anE<53WuEERaw)_85LKy$!YyPkBwd0>RP4?^m6Rs+Y zXT!-!d0c&Y1O98o#ux~^v)JSYIPPx*6N5_9_V@P@&WC^Sy|yZe)9|C-a_R9 z8p}Upuxkb(G;*$jMyyH`V`Uyk3kv2l(5NShgT!sJfH- zv1_`Jw`iQ-a61XGAe>b$y;)gf6&K&iUTZ7~8Gg3J>dG%+v{c-WM=Yju?pts2T#%xB z$)5=45IU|~pK5&5%jCDv?J$&Cbicr;M?&+rnBTBmMwiQTNq9(e+mr3NP~!aZEPvg? zuc*%FNs9HQ$rW%Ahjwk_kx_R~b&+&Ag_D}~)8^O8F;ldgZyX9aK3!Gba$}u>D!j_C zUGO3f*Ey3jf;Q^T6p*;#@3Cdq)?NmCEi`y6N;jv_hvSTnSgn>*=?!7>f)~Ah2iCSy zUGJOC%(wLX7TMFq5yuSvxY@e`Gv45Q6Tw?}+>to`3|Gw$T?*lZ(>^}7v|4UOQ@7=e zfM;KGkZ;7%rNTqCb$Ts6?ljw`+%*T??5sJgyLPdjs&zsfF0!?@e`e6_guhCR34LQV1&%xp+M-Rz$E{S%F=MYj4b@ z$uPVJ1FK8@nIUDD``atV`o9zTyM*l-I@k_BLb=pT%giN zt83%q2NU$AuIK9s-0AMx+zPvufHV1EeN zJANHocJ_wxCsPvlq#;=BAP8~iB=?`bjO>c^m4XZz1KO#Jl@Tm3>bIDWIx5&Lli3gR ziKya%Y`l)EW-ekLgy3;`<;D-7mKD!BFzPp=j|9?=Hi+>68a?`~95-}_4gJq}t z)4iX<`0C0LU&nE3H-=E~esd)MdQ0d}E({Ej^v-c&w=+?*!MXZ!L-x_dyS(792YgZm z894|imz_ASCMDzHoKlPu$f}0Y(|t0nwXMg{cj#|BoX!4VjHF2u5cuX(J!d(n7fr27ldK3CJ~REo4me4wp((kmadm97?z#PQ-i3R$P8 zTD#ixbbtfC*C-{nE3LTbzD4KcmS8kGh@zA9z6Z#3j=wx$!PrxwOxjeq;BP}=6U;TV{i6k@L+}DBHzV!wivuT z$$Bsu{tp+xKqzTj>as9%4{Z%Xib-JW8kRCqrlAYLPcF#ikgJN}AauA*fyB%3UKbD7 zKhAIrPW!-IQhu&kTZw&cwANAoac{J=lFNij_RIIIYw1U>1{IvJO?sxWqs>rSu1#k{ z;gVk}^fR|j6OpHvvqg(P9(nMm_BNFJ(>6?duuWs_Z-=pSYSH=?VfdHbS98jby^de~ zA+elV*kG6HIKy64l$!EZD6^6ge$K3;Jb!6f zRMvjZRVp6j(1mnKHgg1HE@71$$dBGMfu|PTZi2rnhFpUjD2iRq+iKA&tDZq@)ZTm%JUb#6Jb@d6&r}K?tm#1R197rxHnI*&O5lKK_eTvT*-O5- zy8gLn{{~a4-m@s+r{8Ok0MFLCcIsptlBB}iXjPo?$R{|69iRstvHLLH8I7s0es@no zu1&oj3cbK*>cJFR1VKY7>ilK|OocU6r7e~hIVeLQO1-bDl(1PE7xWq9=ja19wFlIDW=L?8>Zg{Qgfq^RK%MBr(_Cg?eI(LsP`#85w{c=`8X^X}q>yf}W zzi?i9)sOSZzdV;c{qI zIAZ)kSEf)uy}sLeZHombQnPbDB`)dD{*q?uHdU`_==Xz0PZGkL4?9@{#=S)4?1uNL z?M;qb>GGq&_(DjuM zsBeda=9c5#>+uG|;M~<2JZ%QCuJu}|SA!Ep^0cwzDl`9r_z@v%TV>8D?`RMRq}@S& zvsrdkwy72r$VnW_Lx*cWhK!6Yh$f093_boUcvL1?A7O&6)uKpaRagni6J}X^fOAR2WJY`r6y`K;86)R}vL1g9#WL z1mo?>$EMTjFFQF+x1_}oWD@WTP^IyH?}qf+CqY$uCJIWHxuCUdt|=m;vMm3axeMjN z+>SvOlc{x_H5)3bejKHf)KZhW|C(QvTRJ!~YLGo1S@$^ej%K8+BB$U}`w8l6xGA`2 zgo3mWkf$l3h@3g((sZhVM%a%I z>T82=Rr=78K=&b)Qua=o*U57w3%4#EM}=d$`EK5^gk;}aB&aXL#m`I09THX=S3BGk zSlG}B_c&c`S(O))vB|QGrh&&GS#suX^odM1hs>$wp@Q%BYJC&z(#00V#)Wwy!Eez3 zzw;>bN6dgUfG=+VA1&b@M3AB%#b46|(*sF)4pJsM747Cw7z<+j7%!lGB4K_kFW+gL zqp^_qLAk-(>^assoD)$U?VX~tEyUlZh6+QnKj2|33W&1{Pxv+rsKws?#A`mL0kWnh zCv;(YAp?@?;v6MaWbl!SkBbxzH3@9_Im5{iSOHNhadDnbC}@)IHc}0nHfi2d7cJQE zzx4Cqk#GG!<>*X{3Ys(|VGsZokLyrX^RsC%hLSZ3#P40*B?(H+3nXdQl(KwjfU9vY8c|jyHWfhg@{^&P}H0|;w=EKQ0dd8r)`Whd<7uYq9BWJgwuT42Q zvt@^{uHo@>`7oz3QcCZVPhh>PvpkV$N^!0zH`9`*^OJ!9wJNkqjXUBW#3N9 z-jH0+6bWC5cJ^y|uHf4MX$eZ2+E*%HU?zPOo8^x(Q7qN7ZjNt(ejx5xlj$6COou*! zCW89IIc1E{?{7L*m;o5wY%WeyNY^~L<9Jx?RQD^{N1Hbl^u}-V^9m&UI^AO#$BcK5 zojA3~o0nj7OqT_u0;}L56^Npsy!6YvVPkHY3v88v>e};IVGkip6nt1|-HVZh;+#zU z&|w!?t=34oQnGBMgiVVZuHJAu@k+HS0En#G~s5s-p`{;2@SP>?*N}l&I z(*(6PndjcA1HRNxf2J-g!-$s;B~HC3-f?<8%aFkJ4Rr;Lcd)-k!H75zVDgO;PWy)u zu$ba$w!hCMhR{A~%YB5+g9`CL-2-*d9r%I!q-4rstBWbT*->YKK{KfFKw85>{vz~7 z;AmNcIm58!dmi@ioKsqdxiS`sZ^O~%b%0jm*nS6l?T6P8uSrHrrL(|OWpR(RV~I@* z+rw$ceZ5JjqO45ODs_lOr=D7zx^`?@?ad#JtMnh8mIJ>#f|R%C2%B9T<$a#x$Bmdt zPPBLqG!UZWqi3vFjMsc*n!i6DAV^t6Gm%z%KX;(fK5*va*v(3V!Ds}Y zhJ9t@YR2USZWZ=ZSv1Q>HH3NLs{`<9&&RZaAD2Sa<^wqJnxWX+$))jD@l<@gpKy zF5z}s)EHC9Yy{UC?G+j5(4YZ-Qxf|7;yK)7sk@ne!B`S)aDN zg#s7PoYl6y3;2p<)>MT91vt$SU{}kEOe&S5Zfwu+g5{i7-{G1lE6hgyK1a!U_Z%B<&q!S;nKS-}sPhXwWsytl1Q+4&wNVMVt%Z9T(k$3ik7W7{ii_OhO7u<-A zh_%JTO?<|~>%y4}JL{=$-*e!mw=UG>YNE(&R!gjANLM~9G?<2*N}q=c$Ih>9`#dIm zDnH@znaSdhMR|!dBum~LOBkiUlc68K(&2m(S5DTdKT8Q)VXu9f@HTBd_Dtf3W$YsV zB_AIYYx*p>d6q70;#yeBN?7L@7C>}o5L`N@9?Rdz{gODoo$_wo$x>VTAU8`C8~W}$f#CYP5B%1 z!qmC&-f4H86<4z2$fg+>x4+@}K#+ij#QTR=8sKyM zZG=n4os4b)vgQYKef~#u{SXb-8`ytYwXxfXgC~wIQlUpL^@Jb)a%q$N1nW#j&;4&A zbzYl(jkmq6JO{!;?uh>~3XxQjZzJAbLPcC2jo{=$|9fxe`C{04rlWEn-Sbp&-52(O z8|~k>PZhTjf1aRS9U`x_Uo6Sbef$sWcy1bAQ;)>Z=F{`mcW3m`&$&T8YCI1~ z@-$9AY>v|Igs)Iy%!|rg9_Nn;;a@47+qMYcZ-e<$e%Elyt;cf99`aY0zT0O!@?^C_ z&TuaLiA}TT9`VCm-?Pz5Q)fz+<5|#q9b(M}v#H_g^)SQtoH5rZIc>Yw^^KN5{Sz)r z9f6!zTGh6wjyiv}#{)a=7`;`C+?pGQj=N`kBQwVH7MxPca=rEZ@VM1uMJqlXVCWl5 zO?7fJFuAV{>gN(xNAV6CQEkJt@xv3y&fx9nD+2ebUWZ1Ye#iHK+|sEibKQKA3;K3V zgD%zCeKhNdNqT5Yy1&QE5Zp-OddsWie65$jV|RBD;6`eD=BSQvw>;;fi1F}Qw0`ei z3Yy7t1vbiTahQ+z`rh~KpduMOljefRXG4(7rppJ3XaYuG9l{ zyKugCb3Zc-LSYYawLWvBzwaq$@OF0}X*Q)uB<5@xa9YG-^DFa7VMq5 z5*-VF^%}cps$5rgnv7FsP#_bR-^AfC!+65r`T?bS|)SsAN5 z_o&JBjGrY?-}sJ&f2(%vu6pL>S!qQ}>$r60k^=N9cm&C;9XZ$!EyA4Yw7Q{cxgHn$ zVgROkoJe}0qO~z-HB*RzS8I>rZv?(W7p{|?w);<$dpsPE=AAaeh#OdE#B+ z_CU?_*jGS+6A)jMg2Znjx;ehq;V^hx{~QvQ*IzeTK7$B7SnBio{VV+WTxjU$FH$?_ zom;=t)s|K$VdtarcXl|-^`oj~DIQtO=6v~#Q5_`YgwZXY; z+4+ZGLZ2coIyDycUHMszQ*y1DJcCtMRMuTk2a|8KzRt84C!mVZE;u-`GD^B;_6gk4 zzDAruG%mzbla2SazIiZ)UR}O@Ax%-(~pVOKXPSzm5@@%fsfVt=43ydNtxe*h`Q$uUhB|1=G zP|urJC<}??G%_#g#3A z)27V(ZC#@E7RaAB2d3|HqTJY5*~ORvf0OW{$5*=C-DAtcHT5%9@f@20x6hzg+wjzN zD~m*C={$J`RNTM)}hB1x<5>7->X9-(Sxq@kZYs6|Gb%8JYV<}o?F z-N*}?7Haf4c2`g5>WjUe*Hw3)QYo>6+)2|};M4t_#Z+u5)FNWt?Pl{1ZVQ#fO516d z_hH98r?9Yr=WCkn*@_5c1~DPRo;4u|bOamT(g2r0^v&&bbBa^O;2kN_W-Z{&M`(kb z(FkYIxX!o6`pmMI!|M)wI*Hb5$cN4ucSais$^eJViB+~391MoYn)jSp|C-Vs1JUio zN6Q7jNo`zT8K_R}Y!KMu=RyFAX#=`ybF=5t&bvJ41(7W)6>~=&r^nuq@F(eg8#y1U z$Kb*crxZ5DJmmF(0>YHp=!~=>{M3D_j*z>nN7fgOMT>IEu`5pb)8Rf~H6-*XX?9l} zv$mzWT65*7sfMK=g_MXhdD+g^bg0iB{&IXZrDV$Z-N#RuA{9rUw_hwp zta4{HogCOy@;cm*Vsa2&Zrha~wt0K?#^}xVm6CZoM=gw0c=(fSq8Y%E8CrX#JrWUl!t7QSG>0@R8FBk_V=JsTHi}75}7VBKNNYCx_U>ya$!I!1PHEfWs`wOQn z4nT)@GuZe}VN>nhy237*e?lLEej&IA~+yIB-Tw}I;HY=7MS)Q}W_6qP(>o{>3UrO;OJUWo^TYXh`A|`JwM~3I zO1WT_Q&^A}>yS?G(}&4UyLnnU98`)kfNPAPgq-q;Qvm9$b5*Zro3ICG&4BvUgQGFJ z*zwi-^Q|ESh}7^{sj3JE5?@9e0~=)U_B1cBZR^Vs9N9uzAHH6Xn28^Kn8*0Fe)jG` zUVwJ)Yen&QuY3l{YU@zS`wLcins80FxS{dE1j{IPN885v*nDbExPj+%*35OU6huh` zgo|o2zU<1ou(AR>D|!j^0yHA`x|zgW-`u5^a(oHd;m-m!q;Et%w4gQ2#OC`JuDXjy zB2;?*#Oi=ryvu>ENjZOZOy?X-5=KTr7L*l~U0#YyYa`N%(z~*QEY;4BG1 zRj#tv7bH`Y?bxQ2jZ5>lR1nlprvI$RxnH_uBX4nsOxVi?v=S5=zx#~+Uh(SByzGRB z2+?>W_{M5Q^z=#7%-%Pq5^PvSPIYC{gar7;mI_V+o>51!)ispGrYDTU24~*g?s7&D z86*~xNRje?TRBv+V!q=I!c92klSkJDG2d*q`Z%oWEy~*HT z4dVR{jmMUFf<6GCo&W%hRH4ENs3*u@IOi5Reocrj6TTwQI)K3ltN54~5gd8|qSt-waf2*DV6U70vf)V&2Z#`WQ zeH{RSWqWrO*Up#K)5`zxLB=P^KcP1rZ`#l32U35Sy_H#)dw ztAQI17hbO|oryo1blGU>2+bdc-Xqjm5);IFL6km-9>hA}#k_wCv^b_4z~zmQEuWLf z6nD`OQY5D>K4170qo-s1CfO6-iawx*zgyEjmM|tYS|iHSMv#$T!q*^_vqc73UGb5u z_h@@=0OFvIPCxEG!5UQ|H&R+UBI$JzX0GEiQ}O?iWqUs9l1Ln)(xI)eG5wzft< zSgL*74&F+}O;DAcjBU7+Oy2D$1*ntN=20+U=%JuNF$b`Xvt69y{|QzA2JnT3CTAyJ z5|bs?*`jX|P2;K2+HN*4D<^&jXS+`%zyN^%O7l{drz@n^TXySvKM*OZC9_D~&ZWmk z(VDD)kQ816AOJ z{kNR3#?5{JV6zO>&z(1Yq9C|B#FXRI6m+Owtg394%ut{_r_4zae_-zL#uElc*faKT zwDBzMnK+K~C7JEh(>s9JdJ$!z(I<(i2f)P7J;(sEdJ6ft=RlH_X|g;r0fGHAGi#6u zejrB4ysuSjU8Kh;QMFHf^~hlH7T1E>$Nv|8Of^nU8?_W|4PcK;FaH#hm2VZzH)v#H zq@c-_66dG_PfRT0ZGtPz3S;I(?{q+kG?uNNVEp#W+s`=zy*k_ zYI5Z&>gBg3YaH;4>qAyFh(4S6tcSQdlyhOZNWBfrgT-xin{0l`xvbv~rO}PUMw{W#Txj4!Yo06=O+%y1E#Vh?2OFW0wo#by0l%sm~hg7Oe$(t_A7U2`SB zN$B2Cu2@9bp#~*TacA|}U$J8EYJE6&L6*_-#{F{Ci}5?B-z&QMr%})GY=6p73|-oq zoJykJ+}u&r9N|urJntbVyBy}=3vl|~v4pOb_hW4MUC`+joi+imoeeuY{1V)kgM37Tc@{crv9J)EpY@I6^O?q< zfyz!w`1E&@G@tXnu0em1c818Xzz_Po(6CF1BjsmVC`zScq9lWE{1q)`ij5EJbGwED z-uyav7nv4WvCvgOi53R}eR^3X}jN~t7a(f7CFz(__`QhuO4{ z&|vD5@#om+aPFleadhr;TE+=PGz4_B&zECxf)`z?`qMv!9p-s!iFfn`)Z|y8M7o>e z5JQ)l?*hncX`Gk>$Hb}U>fQ+g^Mhp>T!@Qldwd-EShH?2Y21T|$J|%c!fz}UmcdPQ zxBzNnE30dSo_X2nR#uzqF=^P3YBTb@d~`fNVSIBM@fdmUZ{bzCJDn~@OL=gANpL{Z zJ&g~|3gx!6=w9)Ht5UDMITv|FrTop@^=)pB_(a_hhW5{6My4o6XoMeLXYYMmlO1i~ zRKWDe-1gRTj1O~hr7n_13L&-KoW(+Av8~2uBb3^^K7s_3`x*fd|C<$8MI?k@7|jV0 zRt_8x{;j4wHMsoExF)(jE`*vAbNivnwcRQI2CEwg7-GZUm;V}X zM9?WDRQL>ub@sks>K;hLB2Bgakt-Ln-Wk5YQPFpI%=$JwrwpdTLIuv|P@^DH z9TpDe*umjJ^Av75;;AIKodt0q7wW-_E4VwF3*q0ELSd{>eaQh9if|y`(ft$|npj0@hx^nmI=D7i zQ#djCNG!=-z!5STcvP)%?0?FKlGmeTIy+>cMEHs~4K`-9*$rOw2@@x5PjZd%s8;M- zeQdT;7%%^6dMiu2YVOI>4OE|zvcVpPC3p- z!2OhbCzG2og3Ei_X_oEsbizv)ICh!T+F`So+rm|{ECX&y(x%lZ_eKo8W%IJsD?phe zaMJ5A5!XTQ==o;_iHsM9PNtKw^z;t8ej-|d>!QCmt(^5ZBzm-C3~I=5^Cap_-PP1L?HA=HR$N*SZ)13oV|5aTurpM*#rqLfk1Ew?(Xiv0|d9=4nZ4-;O=gX zySo$I-QC^YVLI=7@11++`{r9~rWb#(y6Wsxb-K=}s{Q=-J}uJrp8}t?U+Il=A#R;4 z#kW&%yl%druIjGafaX#lyJbAD>l9=58!E@c69U z8uoasCsu)Girpd1&pG|_zi8iR@jif;(ZkSCYqhntFHhXya0nXQ^<_16J&|Q z@BQq@fZ69S>!F0FDNaPCBd_ROb*qVEj+4(t3$j-)n0HNUTNC+bU)H^_1ydarYJaQ=mXN<&485mS{l5{k&J94Nr&R{4>9=_jk)W3sal{LSn z13x;=nY6aGT~Z*vzqJM#_!<1ZxPkju5T~pCuPeI{EESjej|h~%9&y$Gh%6~)zQmvY zkNA_n9dZ4)Pk*Zuec9+(io`numN6J#@IU=+H250#0ule483=;E-@;}IM3h@PQ#87_ zzc_6L-KH-yG}AoYBTL8F+iG2R_Q$HZ`@eCLzx@KK#8!NMyMO@?m*wVj_tBrKfA2tcU9~-K z$FVgGf*|u)n5Ct$wT3a%xyJ@RiPd0to56`DBIg&~lw|3$0DE zfu1Z*t8zv|bk0Nx5af4)y4TFwtIlCSb_jri;z4_|FL#64fEPk0DHxPN#blIHrqL-cIU9!mqRx_b~x8nNw z1gnXEwBLYJKjz^B#2n5~Ctxx4LIjI6q0e7{BPZ*FbH#ai+KEiKFX(=GCEJtN_doUN zZTK7*PD>1g;q^g1g?CzBhi|cgo~b8Fz_BGX@(-x|t8DgeDc5J-fsqyEmT#7er3O`q zg0_mzq@46z=y-RW8{Y}H*epbT(*LMr9&D@gY{oJwp4ci%fBw@{SAZ^ecz z!N{0j1Z?^O^UaPupKqlVyiPN1>5R49h)=UCr*qQ!PSj_I1@pFjL|97Wb7@9e(LO)Y z@;=<)6!<8yBJnLXW_E+|INj}XdoQ6|Ed2bDP(72n+rtarUY)gZ0pYON9|LOaGEhwp!>2QGHY*@v*Eo#=AnlF|=r!2dGc-1eSx~hf7>J#RW=}9;q$b$fYppDITDvwp} z1vO1|ZY1r`NnHSMPJNF=h~x3|)R~%`_&lR!`fVUzlvWU8vdMP+Thoml!?k;CX!q9g zR{-i-%Dceb7z=fXkwtfl8!QV{GBL@dH&M1v3>iG^7gQ!97^rI|ia!n`5WPV@@Sj9? zV84b?hCreH=n2!uR1hMQ`29Qi?8%dn$W?GRkih!-hc(cB2oRLjfZf09kk$Q(sIzDxru?Eq5gI? zEp-KiMt%>XIu2%wUPyY=;LmFX`w!I`pNi|6`c-8d7+F|Y>K*Jf(=Wt-Zubvs^5R?3 zBFdgpluJ9)RR)*0qPOdBF`}a@q4P8tN!Y|I3AVjhOl}2HKvV2TzIV}X``ofoW+|+Y zlsR(4X+NF2rle56f9iR@p(OYCm$FV$zt6NL@>A{UNh;!yLd+V!@Atn}*YU2@`U7AU z6yi6RnCRGZnpu{;F+NW_poCqpC%%n6N=J># z=d|`C*D$kJVb{>U=pY@jS^~T^f9dV7M1$?aBrnNuy<}>mW)9(MYU3NHI}iFd*Ib8_ z2VlX=ebCu6zn*j>RMHO0W;n69M)f^$ND_jTrp9dypV{u9GaZfqHj+$^ZIeRGOcz2X z?i!yj@^*et@750)Hq#his?$?5d&rWGhy6mm{ic-}RY}HKaVEKtU_T^1hp75z3*Wc% zC*ym?4tNrnR8D@gZ_qAkY@c>a>MpFKs$+vgIGv+dMbzA~)H7|nbY;=@pfOzBnM7t! z5E%)SUyr_v7KXjF1GdPlq7zn+jCOX7%uE?=ZfYvC3J0miRa=~yYD(Kn)3j9C`&fHr zqh-U7*`%?oO^&$+HJvtornou+PneUA@^V%wXO>2$rj|_ldN(z0f%|3Q3?n=zhpd)6 zF-qr;;AVui$+>5u3jf$mhXoBrVD9Z~s{&H+|E)+|+TF^4{vLSl}(as2=R;dO!ClzNZB6^Q-P` z1bZQB%5}qU4arY<6PB5qd_Y+E^PIZ_y{R12!s0W2)}gLX>5s#si&fZ1CHmFYIy?=E z+fUq}AXWU6Kf`c~?#c$IO(SWzs$nDHHYA~{vb>b$~l{!gWs0b9spv3NCwicUpa9l&7jpOscG|hYQlfw zMi7*f$+>etp>gcH-ui8Xs@mwlIa)+$Z6zv%awFiLrF;9Q+C7(ZC%e3hPgT*CFMYM@ z1Ty^W3^0jkxs#nTeA}jcQtg{viD{WMIUmMJz4_^&SFzR75bBCtr(n?$={NaZDeIZb zg%|L%u(4d12)HzF(5s%8SCU@o-2apD%g8&&BQij+k}l!V<<2PC6(ra0U|o|A1t^wU z2j(u=&Nr1{d4&7JNg6@Uv*`t!sZM9}CI!1?Yk)Vcv6tcKkmDvg(p)<~&^Liw*wC%Z zS<5vus=c~{%_**~<5Qa+J+J`b`uob{mhG4dLvm}}m!pl&9eAih?rxjOEd62Gf{N9~ zPhLO$MQmQVo-tD@9rpYv$SBV6=hH2L-TVzsy=G{UQE?-sGeJ!!q5SPkbV^$aRztzK z+!p#u)y&%oMMmcfAeCvIrzpM^$Srvr>~h0R+*D`sUm^K-VH|&8Hw;%EKaub+rw)f0&Xdi@ym&df)9<(Qc4j5DhER%H&oN!$sD)uYS z?NZ}MKW8b6W<=_qR9>1=Z3LoMXKH6#(AG^uqh^>{etb3o3=$af3)W`m`d~ILnN^p; z#}cXGkeIX#tV?#NOE@Uaqk6e;(eK(q_r}f7{V;XG|5S8#u$epb70jRY4+MYQl*hsR zuw^?;2v}~_qn7y~ib03vd^66I`jTHl9evO4+1)8@a$eN-rLZasElFSIcMTkQs3gaX zy@13=?Uee_^ZMxf($23FlAC=2;>6@7w`6iqN-}ZF6AR@5k-=Gm%x6mBYUwznGt1uy zjrzzw+o5f>kHdxy>@j~?Z#aF1J#2170V9FVBd)pbgy{G;?~nL_Nbh=zR}{-l_5qYk z*fL-boqMPvg>%K%#PSj51=n9HUbb87sA8ug{0sxDU0rrT{=29a_mD1L=VG2`I{Uv} zU7KOWClc(ZTmC7Y~ z?ddf;7r)6iH9$?ULjO6k%0=;}jKcd_Oyk}$wng* zRbchk7y*b*V|2WjPvO_u+OkV^u|nG!+f&@)64)Q!HXc^9epSZL=PqJGgRaJ$dsVnt z)(?q!*op`r0<~cr?GEHN0W;zYQIv#zM66e}?DseFNqZk9XnV|#Ok_Y=B|{}W@fbXD z-yE#W)VrUQ#M__$f1$Sz3)j0|6`y8Vt8NNh|aJH1X!btRMw z!}CxGE|E02IU5G;US&FW;bd;=3ci}MARkjwqbzg@+l{rSzgK?6;V5R8Wn>4!duL#% z7G4!ba*FjsCe1JnESJAZnbLAs4Rif|5K2BbVm9CzJ3tJm`0iU1%(qUr1a2sL0 z0f3%eJIMsm68(HBmim!ZWiGRKeogET+%zMf3@)3(-2rIeDpsc8z`-S-5-JYrtK>nS zRh)I4J4rRy^VDXm{!+AOSUH>2;62D>`Q~AkcC+P3r13n?llruF+Q3xRRVYCq2K&p< z6;4Ec>xF8xs)IQYw)a%;>#TZ>c6jz3MBXm8^MGtJ6u_r5=BdTY4~9NG@=o#XV*bRo z-~o>-y1wJs4HSB(Xa#&z1WR@+8C_d^p#T74+D_vicDb3&)hRHCPHfjDG{;GnMF|jN3!Ap&#clj%AM%7%$xu6X~KtN0ibB^OzxO*#e(SyTO zXg1ct4b|5CCphC|RQ;(bnNEIEU+`ci7WS|cjMDlcx)Bz2+LmTapU#mT`K5Ry93fc7 zMQuqm=Hk$!?E)$#-<+nHvZ>Qx9N=Z!tr0rTCe-heK;rPsC1 zUR**At3{4xp37LwvKY&VAFtO_;!s^)N@%&cw1IhtpE2(Pjd{p~`4F_)_nKvYO(Y26 z!Q4I-rY^^_6VFcih{X`0O?=pXWK*tlNPWwq8K!myAObRnL!>F|>03ysL>#7Z+6TNI z2#p$i+Y;&Fry473x9h*3?v5geV7Ke_OB7WF?K$YCzFN^K$HkL;hXG_t^T+)i&L0HT zCJnDN(C^7AV(LeAn-$m(Gw~f74`SjHV*POmrA@z+KmcYxW6evWB#>o_ZFmx%m3#q_ zO-@NiyqV3n^~US-xzS*>xpqU6DF95Voo}n$7#zXm^X+-Z@fu~u4eAtlO01?nsi&vl zQk9{9S+S-#kqF^kth=vTgshD9fT^s7EK8*26Hwh@MMRt@VAVfp1^^V&kM`$94sKYB z?$^IwWL8$U#=zKC_g=@#AWOu#VooV6FfL5RD3clSPUyQ&Zr`Qqlk;nHP6IpEY;7Rn zKETER{4}}?tC~|ncUmyTKxmk;3Gwl-rCmI4WcrFmC!ZP?7Co89(3EC7*kC?IMJ-@Uy2Ihj7KO??rPcJzn%emmRdiBi^(mbQNEy17v1R&iL?a1a2^ z3j<#MdO|k83?w~pZ;RKe2(@w6+jYz4aXo*{CW*vfW|#BzvniGoR-E39EQ`j{f17cu zn&;t+R88G$I8nQuaLkI1?vKRRwj8olD7R!+*HMgUHxf;)j}55anrrx&El<{aJ7woH z>(Rrp_J`QAn)T`CHf=OtGTB8%c1FSrve)5v(yf%apUK=MMyHwwbS&; zVW*^{^ou_uC|Z6gG}pR`_0n%OGTJA{a)g}8s)HW|W#b=RpxJ`T%S+Lerzdw9y~{n~ z;@;Ae`wW3>y;mRa;avcK-jnb^%B$AAKhn|gpI^|CMhT~Ub3hi08q}|R%m-Tq_Xx+7 z0KG$Js`-)S%%R@-*~3`Y9PR}67&^S3m)a!4;T7Wql7)=bED7Gt z^N~7n9Fu}lg*T^U(ibT_e5k^GOT91MMIwX#;jk&8ERZCGhhf!9CIG75GnLCNb!_PM zFWPLpT=mYLwKrRkG$RYLNZ?Pn7QenJ3ed11u%Gu;RB0BatGj|`Y1xc9^HJ7k`~)(b zz>S@U`ujgs!+CMI>1oXwr|J*g)wVS0x8ikBf<0HflH%P%-yg>1#dl2QlS^r?Rw3+$ zeare#xb$d%{IyBD#llWgTB_M0@0@QB;fe&A0f|-piqY|98NVp>NO=EDM#SUbIklvH zWNo;aO_jm{z)Es)Mbytnh=stFG!&>30rIP<_gC9K?qUFb>88szuCCO9SD&bd90rpU zT^oE@OKXTBh3p4oPpOl@s}IlB8@tEy>t4G3IgRm;$r7rT-xQMG0)1J3n^!wMui{s` zW@K?v88o;Tsr2o6EY>|(DT1eM-^X{-bxl&QQ=UeLBH6ed!tnzvoGt4UW$2~LsDpvBW2}P>KAD1`?70%dsuehR zRv%{}WmX$D*h8aR;>TUO>9Cr z{B3$0ux7EP4V@MVCZ*{qjn4Fb3pqP=cSt0(rJ%xzjg6JHGQD-A3V&C49L${yWHh91^3C#b|g-3yPKghzdkNj)u{pG-avS02!9hB-{^=SGoJUr?- z?dnAINkL3*gODUFoGxIY5x*3-&2}zxEMqn5N)D_S)lNF!;_me5dqWWsKdO(%n5&r{ zQ)e6Mau}EiGM-OQP5b<r{w=cat3!e%9|0+^-)GZU}cUH6|8I0t^GKLY8(X9E?ZRN;+R<1I8D;`4Vn z@?9DRdVtJzQDyokg@iWw%PIO}Y=ZpBl_KGsu&c%k z+JCLdOfaUxZKl7uWlkVdIDItg7Fb?%cT6{k8j3zxJiSi3>5siuwe{%c-BnU?_g)xVeG7&UI_9m> z%Syoa)5XU*lYlf7(8{Yo-S>;T^p*e^-%FP_8d0>f(0A@e1ja9jdsq}~bgK&s56eaY zYDljNkJje;J|0h>6B%^hyhzt0NomdR`^3)JI?UXvmv`T>+bBMsd?~q#G~_7e<5}lk zJ8|#9pk03-eTjQ}>R0fqBS|>_=a+%I(uQ?|pN5dRj%V6iKx*s&p9?%QzL>vUq?!Qa z;a@R36xrKKg4AqAtKZ~VMIG$nn)iKtci+k0t0=p`8)`(D;d{cle~f|Gc;JTKN1by% zNBr~uUqkFy_$9!Rre{;0(Ee93_*i#-LLP*FYlEMSd^^u|r4|e7Ui;vy zvH;f@$=Jy7PYWM+cUnqHXq@I$d;0sgL5wfAw_ndlRMMl0KRAWdr;P~^~KwL*QeQxbdCX%BgpXa2`~I3?Z(v2 zErjrQJLpkt3tFuYy5AS#--%*|(GwTOI4?1I(EjnzxjeqntP|0UG1w=4enpmUdp9~j zQQxcEHm(c9KhKk}=d{R{8H#GFU(<;qe5lUnz5Yzc)1Htqom_E{ZET@VVu`zRyh zQkT=Xu;`7*;F>8E(k2e>=&X=2^N2?xky8`r5L+W6jnE+{4MuRciskwEX4?GzkYn?} zLh9#W8Hs%uD-ca2~wS=d>`)^1> zb{r7VrF(Mcpz!Xhrf1}=pG89U6Vhca!6XdQj1-8!UCah-e383NHp&|?1s>!vWw`3r zmvB&&!#kR~Trcn7+iL}UIk=tXsKQ|x7RbTV-TylvuDk8mHETwZi7i$bM*LG#39>zs=h-44FX{;dVWEzb%o z#YF<%uVTY`qmvEdESP~~w`-Z;{L{5B4;vp16jG0*HTmu`Ly~bIzt6U9#9NG4Jvm~% z&6uYIy^f{z^JsLit*$e9%EtO9pgJsQp};8HIi81%a72z}q)(X5GHgQmZA|@8{PE9PfIKGZXx89-Isio+QBg56QRhGTH`=k!`5wGt+ zTkA{TP@&X)S%wwDx*@fz5)sl|E#w00Y79(w5^TWf%FNBtPWA4f25tm>LkvVeHmvu% z>H2}dkV>vi9U26{M`(^0g822bNrb!-nPv&<4%c^=p=3=DiRZ$%Uu(WuoC`vi($_l_ zeyjKtL5R(qdWSoL^(}O%2Y>7+IgeV{rA^#!tZBr4s6V_&)_n@>G2!|9KpLN(brV{> z4bqlmcw3(4N;&I433XdYaWbSttmaU8+)qiNZ%$mcifYH0jB@Lc0Y>4#0YsIQ?IR^y z#&nu&uaBtKbsE@h!f2k%4jJD1OCUn~HL+0$Of6aZz-d_-*x6e-Ys`vs{4Y^03X)r5 z5M00;qCJ(1m|&9Ak-(%cJkHkAH2DB;(6NAd_50z5*!GERSoo;;D9TWgFyPOymepE< zH`LK20mbp{yfa`TP2(<8?mx8vRei4FKVKrSNx+71xty)qZpsZ51{j)81l;`UnyQlh z>xN5x8~C%vmOf;{f0`e6sH>@BWUjJR$Bdr`&?)H$&?1GdGWL$G7*;+OazUt*VE{6h zR<>!#xs#HUu{F7y%H*6$DlfNp=`teNF$41N(C5ioF&9Kt*Wh%SY?Fe6i-Oaat8>84 z_e`C)I#b)8Sf5yX{F75&kqifBh2K%ENp((Hu?cagjGWEgWo|#(=`2NG3aAdlou*eE zNhM(D%B4Z0&zT3uZFU!r`?ivLuRgiB>({^~7h#8O5MVE(MZE zte15alB9JsufzWBli~F=<#|=x8$anSl+Uh&EMSTS zRe05>q8g}9p<|bIcH*8Byy@=~>z&xNZn?oN`9AKmL3J*h428`l=vxm#5JN5xw{@S1S3UZDkSnOx zcoVK@SIA3aFs7{6?~7=QwuZKp!*^(Hhs%-JPWn4LD1mvexaWw4Oc#2Q@Nk*Z)%iYt z8$jpcz6LEsUEeh9bT!q=iK&C0B>XI87?jnhIVv$?)M63Rx)xJLb`+uIw22 zHY7{LIP8affAD0KLv6aX&AhaB^02XcjJq$+BH*@?Bs)MzEy7-qm6ZUx8m zY=dxuEWznd1FjzThZ}q|LNH-r05%NI@LduQui(*+$k1tH60|Fek@z`_QMK$v)Yq{# z)K=s2P#oM*;1CyYy!3Hx-##a7WIPUofPb{ju7JQL>Vyb6ty}5CQ?^==u21H=~W99yJ+%lC( zzpyE|sXHz_7+SWFZw8zn#vn~XR^Vypb`Y9=j2>5Moua}X``JX1tmuq&c)GcO6q1;j zD~GuGYaZbcWv9;j8Prv1WnPJ*(Vl4jdULv~{y3}0rPEnO%boy3<_y(_qLWHCXsyk$ zJ^B#?K%8aCXsx}|TY9W&z?Tfi6S-S2Q@*h;*3Tx#Wp}wZS{sGNmbILn;c0SYW$$De z@Kl^snmRvLHq+QXMzN**k>|orm|b^P&5fRAzc1b%Vpzf~6g|B`Z0OE5sYZa9?Rbw& zpgR%bnO>##p@g38?053|W9f;70*g9ayH^HX)**@s5L!7Ld9=}%w2T6_($z7bA$`aU9WU4TM6rdP5S^Zm%@%2|_jna+BQ))?ZtfPb)YCmk zRfJaK;3>G7d9?B@#&_e;8{F3bZB*Rm2Ky;vM5ir2L}$;7i@(gv`P}~mz()q-pw?Ja zyJ4jixrReG`YBDPZNWyT)$IIFUz))r*&P81#y0?<%9BJK#V|G<3iVyxp+^KVvWgEI zkiIBhi6ntC|B0d<*C!~|zRgwmqPK*j!mpW4g8p*2P%Paa>0a(nmu!=VYWhg47s=rQ zrm9tR{YDE`<5!N0SRYmXJ9Fr*6n>%KZH3KuAQ{XLzA* z-(~q+I?Lw<8(mSi!o04UG&e^9SMu!YlGOcEn9 zTS;O2$h;jx-4&y>4*SE-7FoKyjKD`SpswB4Qr(6m^?LIkMgM~NbC>N(z2v4J6p`Qj zo{?%|Wft3*s0#`qI(PtoS7O@n;J_8AW&LE3iEcvC{o#)EKKrsHAhYp&LqS6A%5Pl<`)5X9Y5WOu3+UG0O`kK6U+y!_!hY&E-cG&YL+< zjZGGuw27RvqTSY-?WzFb2W@xj(~#+}1jJOy>P2Ywi&!4+1{&l=*-LTg91e3m`G!V) zbV|c(RRU%Cud7ifn*^v{uEW2`5Y`uZSbi(9)|o(2koH;GZPl)-96sGI68GC-qzBx7 zexl+N+ASdad?2rDSVBLB8hx@RBH6l1m+p4GV$>I;j{X!Bo4ex;H|7C;>%glZBxBsi zmJC5f${AlknJ(9x?M|E_B4`wUdo1Z#PQcwt6~CjRfw|a{%A$V`^Fj!A8J9s^9SlfgITo8cxbS?JvzmijSvtkRF zd1F9+!Slsd8l`5Q)>L`S-dnRSDZr(ctW5g4e(~j&-PqtyzXEPTvU|phuQ@~c7jv$j zzg#OXTwW0=hEdyv*SUJeu|twwj)fz`{rm64KYur1d;RJabZ2DDhDxaB zNi(<-%Qh@?^H(%Kn5KOAdCNZaQ4r%BGUM#$Hcc%#g|A##%t<7W6o=K=fGP7K0EX-& zENV7oiZGoqAlocN*OToqVyTf6mrO6^16NH`>=ROC(~awjgE~%hF|tznOj6JXb%f(L z$_FbZF-dn@EQ#H59r#;2!>JXXajBU=D&kIJ$k)AxG&2c;Sv!B_GLv$`3OX4D0fQ$* zZDk#@^4x_i(QFIpVVpG++Da)RC^+f=PiRVrKj!~8nkxGm7N;5|#>H0mZOUAGW^5sc zn4jKrD_<#*7Nkdx0w9%8$yaV<{uTo!gWBpkLIYF-aIO(i-+!Q1P*(_M&Ox8P(d*s5 ze6Q;5ltvsUve# zG{bqHQCdF4@3P^^x@=Z_tvHxDLk(H(7A>wZZov^dW#ETQ?2~YNwZh>lI{O^IQKo5c z+q=N0Webf7A^5F2Z{TR?h++GSvZ~4_#gmGHc1U72@`oYJk_u$#B$(lB_5nXR_4=#t z?*<6ZEFB(tGxz-W@m4E5CJanzcgGEK(5 z0OV%_A55H}h6XLWgJw0|Y0P0UvKBM|qS@cF(~t7H_csnF|7O7YTo z4r+6CsW79SA3Y6y)&icBgn9TuKAU^=`(SNNDh%JfF2+sNx};{|-PN9dmhxR{WPeXj zM%WF(l{)q0XQSP+k~^vY4z-phdO|k|gbNa_WlWPzr#qRVrtGS}KUInTpx3Q zI?V=AB0A|FW?hr-dt!Uu{^M7BT-$9qn#bnIu7f}7t%}FBrXF3yLc@1CS*W+g*=d+1 zB`!L==${)vVDdU@TR6r~>o1YL)^sX$J!qa77})NQpl3I#r&MK6rDdR!SZB_bU6vG4 zw>@5loGgghay8>RJYQGzmrW1{@iU5*RLn`ve zB-#(2gvS7`(Czg=%mp1O*H3C)ry8oFX&RE)uvB|QAdNdtYauAJiIau#Dte5P#}Ot< z@x=NwLq@#9MYyeUcdS9^zJxRbe`QzL>dXZAGq6h%aQ92X$<=veTAo$;m5BGHIlC>L z95Q8{^kIa5;-Jc;Cg;QK->M4(Ia%9X*)Swlsbhg;?Ym!f4sW9l`dqCx+85mFP&9^s^0?n*r~(FPFG^yn;v!29bGRX*BsZ<+{Y3y>sws z*f>v|xKK>34@)@WSpldqc6NAH75JeT=qfhy6@ma6BjvFcHaUh23xyef z7GaOBtEv~u_aqLCs8tDuFXKVlZBJ@<%PGdiP4yQlHyWT=zvr*>5jr1yO^cD9hMj-j zr8ae|l30xf6co7*y||UY?W?#v5&S2X2VAQcHn(Yv0O?MbV7mqz)D zw?e%M6yk>}krP?Hz@@{os;0b3YE_y;3SW5Wag^5*p6T;1Dmz6Au3Kf)(abJ-kj-;O z`K&<2e!YFITIX=x&lAgv-Gr8D_juNUU^-^cY2=m z0)#fA-jjlQKP>@Dwas9Il_^sz$6|`FjrBMp5a!+6K1(g;Z?FW8yoyo46oKcbgh%?pm{0mg?Byhm>$OPnHz&3BD&bed z6{2?H=s;^b6(R+7&#q=GEcher>=A3eG7pu=1PX3k?5MxwZ06}SiOazNi7wxqS8qQ< z5(g15k<2*m)SFS2@Ek`$5T;W&ub?$wK)9B!JOd?tVxSq0y<^X0r?H;QlW3#Mv3@2< zrho5vbqC7o1?V^}l!rpc-z+gnT4=6v&^&c1u13H^4x3({nWfIVY1kB!?cQoNSSL?Z z8=}n``}L{tSmH0fek8@Z_nfK13P5nGo8K44XaB!x+4fMEyfC#0@BNdSYN22O%s2^>0TPK9oQ8|;xDHYF)yoP0L{a>($Ggrq{XI-sCAV(wxt z9^k~{9O-ZS?{jxqx@oY~<*6KNpjxNh;C6|EyOSL~nD@7GwB{Bl9lXku5uHoFkC5Uv z<^lwIlt}o({?1G5uM0$TZVSb$*EeE-hjd-x5}no73=)3mMGR1|i<+{7SM_G}xWRoB z#W?NBPbdYK`-l3*e*e!%K~&QQl{q#O`j9V68hwLzJa8KI1YD_A z-wWkb`Mp_2*#!TJ?1nH-6Fi`E_SeO1Z-yr;Ue^|#QryrSp1xde&T)3nRQyL%Q0h4a z$gi%i3n17Ld~xBtmwaRrOIT;Bz0+++O5GKQ%V-{bE~Av(+_H%aOk==^K{YATh)`)o zBRRt5(v1CWPS|_0itlkN<`P?({TSo1++TR9lcv$Ze&U3^2vnJPi;h%5#7Y9!11;6; ziy8~jjViJ`XdfIK(Mo48T@MF%)z>^8arYC&lT6kuACo?94?dPOw(DhFQPJ=b$Z#I= zd@Cd)PHDBU_@%M-EFVPtbyBED|Z8E&asLz4Cf3F)l&6l@Yb@oH zd>GD@`{`W1`-k{V3rHkCud*C5ShP`pe=ORcE3slM*Kgly4VI0tKQGY zsuDd;n$?>)sONo8yPo4gu4ue2t_RYSo*6urq*d}AjMvKpz%-A)rvF*jc;fz_3*{6roG}0EShoQnKPWQ&uS4{o!(RxlUNz>}PD(rM zpU1RMpjITlfZ^d^!!LGMtFyD8d5&qewzn@CqTZie(eBaC5D*FY_5SLIv)%ipRsRYu z|28XWUA*1k_J7b$llA{Y;r~RT-j&|(`GnZQ+SKC(7j8HId7OZ3yTRrEu!-RO@9Dt1 z=?>(_oGtv#@p%vk8SE|YnQ-KAes|LgHXk3u-9fwk-Dh&pfqYB9GWzS%zt5}52h5r= z>3=g&o=E+B)g-_)QMxVUdKk}GtfO1;+zb0jWUeV~%BCNnY!@qX z+fZ+WICpWga}=!72lFHn;C3oQw*?8vY%VZ)!HU2(FBTYBa39(FgKOl|%tMV>_%t?2 zHkKgn8jwJ;|8bSF0OGsL$;cb`YweQ9lPu>`$|p6u;{m*q&RCK4Ix~Z_VLv*h^bw@6 z(bN3$NbtPUK8XhaoOj2sp6&VWXOz9ZW`rt4-iP63-saiY!nlfilydU*|I&Bf+_%nM z!%H_^unQ|>whri=F%ScBWKVsO@5c6u{|YGHIOy?oHEYn)TV8jPbe`qGe}@Q&bX|ewHZqpJ z%~bf^$oa8opKxXh98@Pb^z-Tp8}q71pyGB-E)n`No>d!%#l-v@|7~yI)AO?y5@Ldu zrR6h1M27A+)IHELVS@J4D8CRAH1ImF?~!7q)$RC-pd>~R zf0+|P;dsPj$ONSD^ExBeC)`oLa;LP+sL>wmIr6SZzk|sxNyKnuuAop?&#eUmc6W zHIJuJc`C(rG{T-KReqLohNebcaPfMbNaWeJrhlUu^Xq*uCs6(jx=E_Um7wE!XR@2( zzKfjZE!Oe_F_psGe125m3UUMdAzeq*{ej-vXlyLXZob^GHCMf$*VIM<`g z@G|zVbcy2O$xJ99zUD*^>vzN8xcHKsbwyoONB!B%hQP#U6Lv<|h;@8M?Lf0yR>L+W z=>ms(o+5s}r?*&%rY2SS)4PL5%Xf#!HlVE0z*E7J~ChyF(r#u(y{qzt|_TJ#G zm(NmGlL-T65w|4hZCm3o+pTF8=1>|9sp)>$;bT$VHB#~LV#g~?(ZEAdVDGy#+s{j9 zn(a==aI3xt?dO}`z5px}c3H<-Mgsj)R(n-DViW*ib_HIC*)})*5f$Cw zzkdh`Mm9D!?n{ufEJM!=GiD0_K*L7YSQ81@J|c5n zvfYDF3z1+vM}0H*2=`?Sf}_bku7_OIHM44J4=3kNw~1U>5`E6jeCJoV*-4 zCH#DS-sx$kV0smfSTYYnE)@AJ{f|Hu#U5Qorr$qL3L@Qq8o1|Im2hlL>;zark`d;gKfsFnOd?Wfh)2zxz`}Z6tepXhcK|LeUU%K&w2wHdgL>YkKkpdL)TyuHzMwYClgLw;=sdv#HNTA7q?r z895q${klhPQgWnH78IRrK#9NmxpqOELkGHj+&Xl9$N2eW6%|gNaI(IsQ?v{TT z+Ca#!bq&J$euVLhiic)W{(OyleZU>wJL)_8mj?PP{khwcs*Dl8^nN={a@C9L>}{L^ zye8*sV~v5JlnE;Z`3@44lo|sTaG;LiYO9lVUf-=FKUxL%!tX@%>c`@~CHrJ9j`B1F zHGV10w1ZYU#rnwZv{$$ybq~_QjU{!Xnu49oc%E-%@iIHw-%AgeZDQ5{M>&4kZ zQ)upB+82(ym>6kw!>j<-PG6iC@DtQN%DAdH`Pf9Jdb%l@qXM+uon~V=(Z(yoPEJM& zUD6PS6G83>DQC|r%l0$m1afkc;YoSdkiN7((%m`=12f7wCm-rFW$J(^LgZf66k&t75&8?GX-D${fC+i&=|Lq9gj~-I_<$4_N(>S?Gaoj zR>fNDr=vN%rXGeIOh-)i6&?r#j@>(LN9OCd@LU5;tvazKpL3l*K1kzuz|+*+!Iyr8 zn`_g2wpMm$`1iWQgV_9Y%2#Xh2;(kbH6h!(U@q%_Aw18zG0-07I#=qIj!9t=-Xp^a zG5}Ee)@_LaGFdO{eEdf%_VT>T0|0c^tL^PCCK?@ia6e8pjXHe-6jFPvN9*@%@0aV` zuwjyu#v^IX`;p~q%Z6V4BtHu_SB{O8@8gg|U|d)ST8}I0e)b|e zHa|M#lMcK`BLToJu5}xqMM$^DBsW@Jl=yy(r9sU+LhKL=458ylZ+F_3dinhsx$SoU zMANhjoG&6HF0B!$bw3^`hy~JY*{Tha_$FnnV&0>5Cq}rQlt6V^$iCZyl+IQ~rJig% zJW~xkk$>Lul)U?e5+u-O)EMJ$W4V?5hbm=>#RvV#wBjXRHTvieSy)il9^fgiPIgPii+M-2_D=jRJkX{>D%>)kqC;wM z>Hd)f6-22)e{lc;vOmhIDt|qV$wFTg6^eTA zA^ua8J+bql-D+Lp+kCGFI9(g8%6Jt)eOT$uN8STY%LkO$7=gvHbQaOz!Jl?BtUH=< z+?{Tpn;eW1I_G?Ao7OWbBOUi zM=)aPOG{t!&(_5WvzZv9V2pU23mnH0QOI{7f%GSI<>klij9Xtqf<}> zs7kbw)`X$zm~2WBhU$((0ZI^~$kH;i{oR%-GF$ThD(^X?n%tI+BBCM!M-iloAShM3 z6hT11Py`g|MMc0!6X{)wptLAR3r&>XA#_M0QUXFiYG@(SOCX^WAPFye@40K8b>Cg@ z-h1A=e_sB5vu3`%Gkec`vuF0qu!j`%6R(Gjp3svzG)*hy?iPQZCp|y>!ST1g^lsx9 zviBe0MUP4A9jox;Sf;srhMz8FC2C4kEdSd3boxs@??Vzi#?AsjGSu?AdCyLqGQ6Od zeNhU~FWoMVfOu#*Tc*dx-_Q$5ADaY{BaoJUw_F-UV(&hTETk62x)W0J+B5h9sW#;k zKb)=UPqVegKpkIp5J777W_`cJmAwV?|*dyNg+g*36=k5a(~s} zN`FnR9Roq?qUqIYY631Bh5^U?f<7L65^3F6o_Fc2^}cY>kuld*G2zzVjP9IyFFhP` z^Y)qzt@ho@+!O5omswl2LfoOM@zSw?rEi;O)b3@=OaTAyvbOxLU4Fa_b6u(Bf@-ev z-Gn&{Kp3AYFN^gN^PE*=m6B&FCSD#?ak^N0o(EtIN7seB9dAN5zuIV6_ZMP#FVsc8 zHF7|C$wa~F)VrnD-=#^8jZ@zGLNjYe^aIEg^AoqfutvOn=3lngEa|R3_x(kJtM1`q zV)DaipbmY+wfnZAxME!BJbS&g^0-do9n|ptvcE}B zNQvhoZ3n)Y83X$$rc1~W;vy8i61Jl@< z{SNF^8T2HHEainkp=JW%Db>;sDj2&igQC>l7-VrW@w2ip-{gDhFP@*OvlzR?7a`<6 zt9Io9carRT{s2E4aix&F!tp2}ZI=qp>a5aGrpqA`S;34K4O!+B!%Lda@?H}X5Er+$ zG6eEo0>txmGaH5cihIQx;J6aK-3irPX2bJ5DwW1@O}fKDC6~GD8@Q{?eVyQ>LKM;r z8mf7n`Hjoip@XRT)t@1+#oX9a;YVKif`5&A)vHKPfNrmt{n(U2JBNnVo}IZ-fY!oH zW>%jrjQc?UGuRcfK@E19H|j}!PqbrE0-OYVw`;$8!6F&+e)4i7h{0w~g#@meXqnPs zr3G11E>f*Zzz8fkaR~!T>c>6YVV>+ z)Xr+D!S)IROPBVUw$1Wc9}_2a`%EO|ISp6L?rJ@5eWasfocLkmcJzh@c)~R*mFO|8izWLZVGR7IF5f-Q^qk>y z$I5fDc!K$bK)S~gATu+wki!D~8E1W&wx>B7-O5S#KMpij&Z)m;(lVdv*1S`l=bG}; zu47?VJ514?MMz)2UX!h~pXE5Q*EIbdcWo!Gt<5Ui_Q<^CaQ=W@EgUm3<-C*)L=#MW zcNaW7_maxsi7Do}IC<0K*r=a=oL+>W+KJXvNBY$(J=^B}jlH@G4zXQ&S_4wSRo>C~^MG zDQ5{Hoxaub_pz|k^ht%$ftY0)!7ZVEYWHtRmGX}#`-c-{K0Q}}aGv~L1CAd+NDZc} zmgSjJeppk_m_(k0S!mHjY~;Tk4C}Lv`x=cDhdbUW*w`84JI$i$)$yCb-a&u#rU3ih z(}{4{)6>@O`E+WXrcEiqH$AU4R4}W$yV*aQs*HTBm)?m;am(5_*3Fy{n9>DSTgAW;@@va*@NBdoGIM=Qxcxu2EZ@c(b3=??; zo#uNZFG4LJcHV>Fw2d}+kUR*(Z!|;elDnotRaL|1@%&EVbT`KuL~mkcgHL5N<7}#-9B^Ti;?ksbJO0(^y2`0G4ym@8a4IsNI{oo@$u3s{?!nv zNFd7OP(b(v`cm22-9ZEj$=bg;ej||;u2MMTntfX)3DNBJ1htCt_P8ig>&Rhs8S*@g z@?0?DAbj3--;g2^oc38`m?ft@=R%hwNZT{WZTYEpV`0&c5fEZb87MiJ+~9@m`io5v zB4&?O4HeaB_TR0Va=WbaF2cp41Ne7=E@FDIW|mG}K(2P?qKxp~gZE4`&$bOODk2^8 zIEstXa$-HH>Ocmj5A&#FrnV2%rLllEQvE!&93752(kzI=3xw<|LhbfJ0hFR7{1n3p z#K&-^<8k}f2H*X7ccJ*(WIcEd)I=W6O zHW!9oG0~qv`RNfHz{AG51rAgJZ|%SKBm&7w9$T5;#Tne_p&QQ z3@*sOSMYKChu!9-#YKwKP`egpTh-2dvf7rwE9Zf6D?cB(3-?&=q8rb)7+@IwhScpramj7be`8#HuClF-^~22ISmWJ*7+i_JhM>SJUN#)2Qd=GklT zCac(k>3Q~dx~xvx1W(oQ^(uIfW=uzNv9xjlhzGJph!=;k;2yJdYlWq09W*0$If0wK zvAg5kxt%?E@9i#=Sf%-o-NKThUWzOECOlBDkekLNvdNyqjJgi@2qvgSZTL3bgazTb-fY;u4C zygUw%=uUZe{rS*Kq$?+}v_F_Q6;z7O;&&S(t4z*PcB0Q<8+XPW8TU!J2n;;)R_7YF#cQ^#Zj&Yysj6j%j={qm#&>jY}p-KEviBd`kBM(VUP}x53I* zW6PWS1Nhgx;U4%5!Hn&L>-upD#5HWD)C_u%wPWU!9}2O7a*trZ_j~MDE0)#cTlQ(M zGT>aXTb<4n?5+0Jpg>KeQ%QPX;Gq%a++K&*MKkM{a!kMt{-fNq9Ae5xlt|>g!(CfB?%J{<9{<%!)v%LgxE!Yz zH2WUJQg14q#*q>PByd5tLNn=t{j!AM%95d#?`!fKzCI_>KEccVIMP zjf;TR9~;L3n|h^ta5`22iqL*FgyPAByRKg=yvA$@Lf1pMbxi{*Cr0>hH9_P=BZWh59?~ABOoew10Mr|AD{v zkEi%Qv*sVu{$$#pS%E)8`-j#0cc%Cs-e7;2;=i~#|3Ld^W#H$_{`ckQpPb@Y>&(g^N5t) zcnSa*M4HQ7UmGf+Jj9L{_imEo4{abBj?H`7k>SsLs9qPbtH6|lnIRoQ@bXHCKUxot zXzh*;kR!6l)j(%I6g@+L9f`iLBQkrgBMPQemfr~oB8*5 zdui3p^Z6(&d!u3xV*YxMauG&bTiQyr8vwReskYuW4*Sk zmeB5uYxfqOg$yqrwx^Epb{Nw(iIq0w49uN-$G9VgJyt6=oY;Ucj&L%Q-S7D@S*2R_ z+^*4Qjp~{6wi_*1?R=_+n<0V|adBp_D^>>LW3q1>*y7o2&jL?n-`K)9&usD7YvQd8 zDum=VvSeI`*lb^wUdM*HPMmnhxOLbF^j*`Bl6tJCcXzh2PwC;jnxX9JR0GbhD-cg) zPD8yw*AV?i#<#f&O`zN3Dss_iyS;W)})YkS91!x%`21)41I7H zTYLJEPJA018r4PZ*(Jn!hW<$m?pxE1^Ty~l2&6(G;!{tftz@dfh1qWq;^yQEtnq?% z+S|SWCPq-kJ(3CAb-OH3Aa4YFOg6c?*942UmLKRmJ{O`d*Vl}=Qi@i% zPVc6Amba@K#585|ZsB>n??YhPfkfFE-teynz^#YN{-B=Hl6|V#{Ek18V6L>cRx}1u z{f%1gjmJKk|I0$gxTF6^7y)2m+E9+^t@qNlhF2^ko_nn&SGqqRI$C1alHK0WbTLJJ-w^ug7-*+c1EeRgXRX>I3)JNh&@s*#wx?b^ zSA=zYzbbVLI-2~zSzP3r_Wta$W$^vF3j2rnkV_ByO5aL^*DaR7q3#=3=`P6L`>M!e zjJY9b0`)r6_Y~}sOj@g1c?~)RLh&rJq}OP{oFJ4SO)-Z!y3wLdjJFkSC(UrQN!IS< zBHpa3VCCClG2F*eY;Ue7QNMTc$KK*|m*D9^QM~(NY2%|zRoc$50LHXOI~XmKV}M5q zbB6+>O0%Dfe~RQLtX3;61rMX;;hNLVrDjHgB~p#OkbwU=`)c zRoq7$6+OqsI*(HogtnTG?MRFZietzOZX@-A+HEUs^I&N4qKL)g0IGgDC*x{4Q0g02 zOoz8}*ymQOUnsz9UIYMS%VT%}|IPVeMbo)lNy>kBb)Kc0Rn+`hCt%ZHFb~BpC+3WX zlQj{3N2HZ~;TfDxF~f!1+$)yG_3FTdvwehY1Q(-hHhJ~I^EZIak+#%sfxcq-D%26zV$HX`c@`F!-%gAKyVjwLc&Th8%^U)qY#eD| zL@o9Cg$nnl>vRQ{f=is?77fQnL$@#@=PGKp57DN9ayvA0J3Uze8gPq1x>4(Y*xhLV%=Fz}WO01_MMb>t>N-w;VhwlitJ_93oqhEZ z*74Bk6z@bC_T5%d(*=3h*!ULabdj>C2k(7w_pwbx#F4 z8{16`=v9vi`^m1`Bogj<$wIf+fVLE-xc&JQsm5V?Y9qI*2jC<}eN<5cI0ivk1UJ`K zG!~elTl?zQSC6f&L{==MGHdCM<0pHmZo5YvbcwVRJU4yX=8@jk2kR{AE|~}Y5IL|< zcD-SiFkZRNXR?2>ynZSB{jHgfIKuc1k)v+;K*AUfk4>)*6bLsUPufMsI(v1)7QIjr zGFw^o^Wz(gy_TFh6I@Efsx9#962^2>{s$~loBQ4x57~~y#lt1JlIi}-AC(Pif-#=u zZL9ZKDKBF``tC>&FDwyTmj2OP9Q<-!Hnn15j9F_EhH1#i!|trdFbdJvVT0G-bjRVw zZ-g7j>{X_@rV~4bw~U{rdB{&6oObXKHs2qat3>OOaI5pFo4w>d`1b151WSiL8p}&? z3Z>T?S8BD-oUsXbd~c$)e5!#Mo&RK5xb7@$A&ZPW0+Gscg^zsq+8weKYr8P5{?cb9 zj1V`L`?>3;C_dwaNZq{7yH4OJXLfE-wqZ9ZIK#H(^sNNTqZw!!~9u$`5hM zzGq5~+)$2)n}j0tLCoPG3R@uOJ@CC{5mP%0Q%5|eyS2|j5OCY<`(|RDGF5;c#pg~( zmy2`MjJto=2rF9~;?D>s_zHq4&IFoXZ0Y4TgIn`^V7!0#8l&g+LLay7OX^zs%InF< zI_s@(DE0D;sl##XWWD$P3Zrs~i#1!aii-VGDZM`D(UfoCsCAOGvoXBo6A%@n#bXn+o-4RIe)GHX7X8`mI@?oXdBZzyfsgJjY68#3daL-9S0PZrDy(Vx!K-iQ>8vE{{kvzFqUxN_t6A=l z!t^g}bEy=lhw+D(X)!KsPef+=6WV06@R<@s5-Zia;~*t`-SI-Qh$ZJNt8(uLi{^?? z&4F8?o{J6x&34e0V6hTi+s|y0b|}bGblFmylWam+S36q*n@ZOXlk&bqgt$CKNYGkF6(xe@m=fc3n zwn*Jmyg58D#K!^d$7Cg*q55vL!|-zHs$r##e2E{j8{$Bb>}>6vr- z4rhsvL)W)rPwZb~knr@2503I4bI;F31P6?Ry(aRf9q_#{PjrRwQU2m+Wir7$NpEq= zZ5&vhFOetF!4%Ilz?QHh=H zqyu;3Y!Hn(0&_xB_1-hB4O29`LX^q*7G>YHOSW&atD8OM)8!}+S!^Le8$wSwE1|AqoZX-LV#~SB&E!Hy?3%51cT9WHb2=c4TjXzE3|o_X5^s@Vuz%|LKhcb zpJLpwH$l2G)egd~@bXE&l^oW$wNNG4)z?$CHHqtxfosrr!rqDw`(iAdqfEK1Ppi1f zF2gTNYGIO_L0JVA+2`cfzT!sC~o63TT<dpv8H3n>%m!`sf7A7?8`Q)Eyj&#rBBpyRI;?^woq5W1qtmK!o(uD>6SCAyzfJ#7 zWowdweXS>T;d|aTf!`DKmHNwVY+Rd<&+Rx)^83!c*J4~7T%_O2+EJUYC+j?zpapFD zp6laZRI+i?0Y}&bj#6Oft`pgVivs969lDYc;@A+sIIN(0{?WM!2vkz!jU_x>`2{k=>cU zs&kRU=9Q9>^;AwtNl9SjE=SOEXYK1fRB7hA=CB2eJPqx;NQET(iNvRf;o6Gc&0FE$ zvu(Bb=qp|;Jdga!bS9SOi}7XKQ-5(W{}Vo%xx^e?nLj%%^;mg@BwnUl_&naI_zTs( O1OPSe-6>Oh6#8EcpK;j$ diff --git a/docs/demo_gui03.png b/docs/demo_gui03.png index cffe6984db570dfcaa9053ef85cf1b16e33a22d0..8ed6e9bd619fc8ce604f18b821336c48f456ee1d 100644 GIT binary patch literal 43687 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�GoA7xd7klmgkF)<&;0ReR9o>G{tA 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 O1OPSe-6>Oh6#8EcpK;j$ delta 28716 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 h4yp+L5J_x_e`tZ)w_7QOFcuQDyCxR5YK Date: Sun, 19 Jul 2020 14:20:58 +0200 Subject: [PATCH 075/105] also gui app now --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 188e97b..45d2fc6 100644 --- a/setup.py +++ b/setup.py @@ -93,6 +93,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Console", + "Environment :: X11 Applications", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Information Technology", From 9eadffe7039ea1d44d7464693f8589eb2f1b1245 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 14:21:38 +0200 Subject: [PATCH 076/105] branch fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf60c34..a2080fb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ | snap | backup | cleanup | |:----:|:------:|:-------:| -| ![snap](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui02.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/develop/docs/demo_gui03.png?raw=true "cleanup") | +| ![snap](https://github.com/pleiszenburg/abgleich/blob/master/docs/demo_gui01.png?raw=true "snap") | ![backup](https://github.com/pleiszenburg/abgleich/blob/master/docs/demo_gui02.png?raw=true "backup") | ![cleanup](https://github.com/pleiszenburg/abgleich/blob/master/docs/demo_gui03.png?raw=true "cleanup") | ## INSTALLATION From 8ec76b0d7f38ea883fce972f10c739f37ed32540 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 15:12:34 +0200 Subject: [PATCH 077/105] cancel action fix --- src/abgleich/gui/wizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 7981ca7..026ba6a 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -101,7 +101,7 @@ def _continue_click(self): def _cancel_click(self): - self.close() + self._quit() def _init_step(self, index: int): From d185f8c588fee113da9a4fb175d54a03b654c708 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 15:20:23 +0200 Subject: [PATCH 078/105] fewer clicks --- src/abgleich/gui/wizard.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 026ba6a..83dbfea 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -110,6 +110,11 @@ def _init_step(self, index: int): self._ui['progress'].setValue(0) self._ui['label'].setText(self._steps[index]['prepare_text']) self._transactions.clear() + + if index > 0: + self._prepare_step(index) + return + self._continue = lambda: self._prepare_step(index) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) @@ -160,7 +165,11 @@ def _run_step(self, index: int): self._ui['label'].setText(self._steps[index]['finish_text']) self._continue = lambda: self._finish_step(index) - self._ui["button_cancel"].setEnabled(True) + + if index + 1 == len(self._steps): + self._ui["button_cancel"].setVisible(False) + else: + self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) def _finish_step(self, index: int): From c2bf7454d8c73e795f086c6061ef36b7b3d1123c Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 15:34:22 +0200 Subject: [PATCH 079/105] improved labels --- src/abgleich/gui/wizard.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 83dbfea..241f8c3 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -56,7 +56,7 @@ def __init__(self, config: ConfigABC): self._ui["button_continue"].clicked.connect(self._continue_click) self._ui["button_cancel"].setText("Cancel") - self._ui["button_continue"].setText("Continue") + self._ui["button_continue"].setText("") self._continue = lambda: None @@ -67,24 +67,31 @@ def __init__(self, config: ConfigABC): self._steps = [ { 'name': 'snap', + 'init_button': 'Collect Snapshot Transactions', 'prepare': self._prepare_snap, - 'prepare_text': 'Collect snapshot tasks ...', - 'run_text': 'Create snapshots ...', + 'prepare_text': 'Collecting snapshot transactions ...', + 'run_text': 'Creating snapshots ...', + 'run_button': 'Execute Snapshot Transactions', 'finish_text': 'Snapshots created.', + 'finish_button': 'Collect Backup Transactions', }, { 'name': 'backup', 'prepare': lambda: self._prepare('backup'), - 'prepare_text': 'Collect backup tasks ...', - 'run_text': 'Transfer backups ...', + 'prepare_text': 'Collecting backup transactions ...', + 'run_text': 'Transferring backups ...', + 'run_button': 'Execute Backup Transactions', 'finish_text': 'Snapshots transferred.', + 'finish_button': 'Collect Cleanup Transactions', }, { 'name': 'cleanup', 'prepare': lambda: self._prepare('cleanup'), - 'prepare_text': 'Collect cleanup tasks ...', - 'run_text': 'Remove old snapshots ...', + 'prepare_text': 'Collecting cleanup transactions ...', + 'run_text': 'Removing old snapshots ...', + 'run_button': 'Execute Cleanup Transactions', 'finish_text': 'Old snapshots removed.', + 'finish_button': 'Close', }, ] @@ -116,6 +123,7 @@ def _init_step(self, index: int): return self._continue = lambda: self._prepare_step(index) + self._ui["button_continue"].setText(self._steps[index]['init_button']) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) @@ -132,6 +140,7 @@ def _prepare_step(self, index: int): self._ui['label'].setText(self._steps[index]['run_text']) self._continue = lambda: self._run_step(index) + self._ui["button_continue"].setText(self._steps[index]['run_button']) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) @@ -170,6 +179,7 @@ def _run_step(self, index: int): self._ui["button_cancel"].setVisible(False) else: self._ui["button_cancel"].setEnabled(True) + self._ui["button_continue"].setText(self._steps[index]['finish_button']) self._ui["button_continue"].setEnabled(True) def _finish_step(self, index: int): From 39f633943349ffd90741a0cea9722110efc129e9 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:21:54 +0200 Subject: [PATCH 080/105] ignore specific yaml files only --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 05a8957..9120502 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,6 @@ pip-wheel-metadata/ .ipynb_checkpoints/ *.ipynb notes.md -*.yaml +config.yaml dist/ build/ From 0589db9a2e541a9940ecac4876f4fea7e9fe5a09 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:23:00 +0200 Subject: [PATCH 081/105] added translation hack --- src/abgleich/core/i18n.py | 54 +++++++++++++++++++++++++++++ src/abgleich/core/translations.yaml | 2 ++ 2 files changed, 56 insertions(+) create mode 100644 src/abgleich/core/i18n.py create mode 100644 src/abgleich/core/translations.yaml diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py new file mode 100644 index 0000000..eede576 --- /dev/null +++ b/src/abgleich/core/i18n.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +""" + +ABGLEICH +zfs sync tool +https://github.com/pleiszenburg/abgleich + + src/abgleich/core/i18n.py: Translations + + Copyright (C) 2019-2020 Sebastian M. Ernst + + +The contents of this file are subject to the GNU Lesser General Public License +Version 2.1 ("LGPL" or "License"). You may not use this file except in +compliance with the License. You may obtain a copy of the License at +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt +https://github.com/pleiszenburg/abgleich/blob/master/LICENSE + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the +specific language governing rights and limitations under the License. + + +""" + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# IMPORT +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import locale +import os + +import typeguard +import yaml +from yaml import CLoader + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# CONST +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +_LANG = locale.getlocale()[0].split('_')[0] +with open(os.path.join(os.path.dirname(__file__), 'translations.yaml')) as _f: + _TEXT = yaml.load(_f.read(), Loader=CLoader) +del _f + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# ROUTINES +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@typeguard.typechecked +def t(name: str) -> str: + + return _TEXT.get(name, {}).get(_LANG, name) diff --git a/src/abgleich/core/translations.yaml b/src/abgleich/core/translations.yaml new file mode 100644 index 0000000..60bfef0 --- /dev/null +++ b/src/abgleich/core/translations.yaml @@ -0,0 +1,2 @@ +Cancel: + de: Abbrechen From dd5c366b2fcdb00c691b1afa9af0d0add380ade3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:23:40 +0200 Subject: [PATCH 082/105] include yaml files for translation --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..f11b7cc --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include src/abgleich/ *.yaml From b9abda8621d4d07207ae581f9d09135e2790cda0 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:28:37 +0200 Subject: [PATCH 083/105] first use of translations --- src/abgleich/gui/wizard.py | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 241f8c3..0eaddd1 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -35,6 +35,7 @@ from .wizard_base import WizardUiBase from ..core.abc import ConfigABC from ..core.transaction import TransactionList +from ..core.i18n import t from ..core.zpool import Zpool # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -55,7 +56,7 @@ def __init__(self, config: ConfigABC): self._ui["button_cancel"].clicked.connect(self._cancel_click) self._ui["button_continue"].clicked.connect(self._continue_click) - self._ui["button_cancel"].setText("Cancel") + self._ui["button_cancel"].setText(t("Cancel")) self._ui["button_continue"].setText("") self._continue = lambda: None @@ -66,32 +67,29 @@ def __init__(self, config: ConfigABC): self._steps = [ { - 'name': 'snap', - 'init_button': 'Collect Snapshot Transactions', + 'init_button': t('Collect Snapshot Transactions'), 'prepare': self._prepare_snap, - 'prepare_text': 'Collecting snapshot transactions ...', - 'run_text': 'Creating snapshots ...', - 'run_button': 'Execute Snapshot Transactions', - 'finish_text': 'Snapshots created.', - 'finish_button': 'Collect Backup Transactions', + 'prepare_text': t('Collecting snapshot transactions ...'), + 'run_text': t('Creating snapshots ...'), + 'run_button': t('Execute Snapshot Transactions'), + 'finish_text': t('Snapshots created.'), + 'finish_button': t('Collect Backup Transactions'), }, { - 'name': 'backup', 'prepare': lambda: self._prepare('backup'), - 'prepare_text': 'Collecting backup transactions ...', - 'run_text': 'Transferring backups ...', - 'run_button': 'Execute Backup Transactions', - 'finish_text': 'Snapshots transferred.', - 'finish_button': 'Collect Cleanup Transactions', + 'prepare_text': t('Collecting backup transactions ...'), + 'run_text': t('Transferring backups ...'), + 'run_button': t('Execute Backup Transactions'), + 'finish_text': t('Snapshots transferred.'), + 'finish_button': t('Collect Cleanup Transactions'), }, { - 'name': 'cleanup', 'prepare': lambda: self._prepare('cleanup'), - 'prepare_text': 'Collecting cleanup transactions ...', - 'run_text': 'Removing old snapshots ...', - 'run_button': 'Execute Cleanup Transactions', - 'finish_text': 'Old snapshots removed.', - 'finish_button': 'Close', + 'prepare_text': t('Collecting cleanup transactions ...'), + 'run_text': t('Removing old snapshots ...'), + 'run_button': t('Execute Cleanup Transactions'), + 'finish_text': t('Old snapshots removed.'), + 'finish_button': t('Close'), }, ] From 20dba04d1af7b712db1451f0f944c221306f51f2 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:42:33 +0200 Subject: [PATCH 084/105] translation class --- src/abgleich/core/i18n.py | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py index eede576..2f126cc 100644 --- a/src/abgleich/core/i18n.py +++ b/src/abgleich/core/i18n.py @@ -33,22 +33,51 @@ import typeguard import yaml -from yaml import CLoader +from yaml import CDumper, CLoader # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -# CONST +# CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -_LANG = locale.getlocale()[0].split('_')[0] -with open(os.path.join(os.path.dirname(__file__), 'translations.yaml')) as _f: - _TEXT = yaml.load(_f.read(), Loader=CLoader) -del _f +@typeguard.typechecked +class _Lang(dict): + + def __init__(self): + + super().__init__() + self._lang = locale.getlocale()[0].split('_')[0] + self._path = os.path.join(os.path.dirname(__file__), 'translations.yaml') + self._load() + + def __call__(self, name: str) -> str: + + assert len(name) > 0 + + if int(os.environ.get('ABGLEICH_TRANSLATE', 0)) == 1: + if name not in self.keys(): + self._add_item(name) + + return self.get(name, {}).get(self._lang, name) + + def _add_item(self, name: str): + + self[name] = {} + self._dump() + + def _load(self): + + self.clear() + + with open(self._path, 'r') as f: + self.update(yaml.load(f, Loader=CLoader)) + + def _dump(self): + + with open(self._path, 'w') as f: + self.update(yaml.dump(self, f, Loader=CDumper)) # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -# ROUTINES +# API # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -@typeguard.typechecked -def t(name: str) -> str: - - return _TEXT.get(name, {}).get(_LANG, name) +t = _Lang() From 447f4076617579cb4fc9a19d47c77ee0cfdbe522 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:59:20 +0200 Subject: [PATCH 085/105] translation debugged --- src/abgleich/core/i18n.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py index 2f126cc..64a1dfe 100644 --- a/src/abgleich/core/i18n.py +++ b/src/abgleich/core/i18n.py @@ -53,7 +53,7 @@ def __call__(self, name: str) -> str: assert len(name) > 0 - if int(os.environ.get('ABGLEICH_TRANSLATE', 0)) == 1: + if int(os.environ.get('ABGLEICH_TRANSLATE', '0')) == 1: if name not in self.keys(): self._add_item(name) @@ -69,12 +69,12 @@ def _load(self): self.clear() with open(self._path, 'r') as f: - self.update(yaml.load(f, Loader=CLoader)) + self.update(yaml.load(f.read(), Loader=CLoader)) def _dump(self): with open(self._path, 'w') as f: - self.update(yaml.dump(self, f, Loader=CDumper)) + f.write(yaml.dump(self.copy(), Dumper=CDumper)) # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # API From aef6793b0d422f419e69b6de715f800dc1d7f6f7 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 17:59:40 +0200 Subject: [PATCH 086/105] translation fields --- src/abgleich/core/translations.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/abgleich/core/translations.yaml b/src/abgleich/core/translations.yaml index 60bfef0..1b36feb 100644 --- a/src/abgleich/core/translations.yaml +++ b/src/abgleich/core/translations.yaml @@ -1,2 +1,18 @@ Cancel: - de: Abbrechen + de: Abbrechen +Close: {} +Collect Backup Transactions: {} +Collect Cleanup Transactions: {} +Collect Snapshot Transactions: {} +Collecting backup transactions ...: {} +Collecting cleanup transactions ...: {} +Collecting snapshot transactions ...: {} +Creating snapshots ...: {} +Execute Backup Transactions: {} +Execute Cleanup Transactions: {} +Execute Snapshot Transactions: {} +Old snapshots removed.: {} +Removing old snapshots ...: {} +Snapshots created.: {} +Snapshots transferred.: {} +Transferring backups ...: {} From 5a67bd79bb53c716b1296cc7d1bd169a39571949 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:04:33 +0200 Subject: [PATCH 087/105] include all shared files --- MANIFEST.in | 2 +- src/abgleich/{core => share}/translations.yaml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/abgleich/{core => share}/translations.yaml (100%) diff --git a/MANIFEST.in b/MANIFEST.in index f11b7cc..ab70d3c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1 @@ -recursive-include src/abgleich/ *.yaml +recursive-include src/abgleich/share/ *.* diff --git a/src/abgleich/core/translations.yaml b/src/abgleich/share/translations.yaml similarity index 100% rename from src/abgleich/core/translations.yaml rename to src/abgleich/share/translations.yaml From 316b8198a9357ce4dfaa69b5d4e3a3cc871956c3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:04:50 +0200 Subject: [PATCH 088/105] load translations from shared --- src/abgleich/core/i18n.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py index 64a1dfe..f096f1b 100644 --- a/src/abgleich/core/i18n.py +++ b/src/abgleich/core/i18n.py @@ -46,7 +46,7 @@ def __init__(self): super().__init__() self._lang = locale.getlocale()[0].split('_')[0] - self._path = os.path.join(os.path.dirname(__file__), 'translations.yaml') + self._path = os.path.join(os.path.dirname(__file__), '..', 'share', 'translations.yaml') self._load() def __call__(self, name: str) -> str: From 007536311224a1407706cf36306a3d6f45895b21 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:05:14 +0200 Subject: [PATCH 089/105] app gets icon --- src/abgleich/gui/wizard.py | 7 +++++++ src/abgleich/share/icon.svg | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/abgleich/share/icon.svg diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 0eaddd1..0a8f684 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -28,6 +28,9 @@ # IMPORT # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +import os + +from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication, QMessageBox from typeguard import typechecked @@ -50,6 +53,10 @@ def __init__(self, config: ConfigABC): super().__init__() self._config = config + self.setWindowIcon(QIcon( + os.path.join(os.path.dirname(__file__), '..', 'share', 'icon.svg') + )) + self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) diff --git a/src/abgleich/share/icon.svg b/src/abgleich/share/icon.svg new file mode 100644 index 0000000..d6bcc45 --- /dev/null +++ b/src/abgleich/share/icon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + From f02916e0d70328fa61ee569ad2ffb8ce44b9c228 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:06:10 +0200 Subject: [PATCH 090/105] logged changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6dabb8e..5a36041 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ ## 0.0.3 (2020-XX-XX) - FEATURE: Added wizard GUI for backup tasks (`snap`, `backup`, `cleanup`). +- FEATURE: CLI and GUI translations - FIX: Added missing type checks ## 0.0.2 (2020-07-14) From 7742465b643bbdde5a79195007fb060dc7e5bea6 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:10:44 +0200 Subject: [PATCH 091/105] more translations --- src/abgleich/gui/wizard.py | 7 ++++--- src/abgleich/gui/wizard_base.py | 2 -- src/abgleich/share/translations.yaml | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index 0a8f684..e95165f 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -56,6 +56,7 @@ def __init__(self, config: ConfigABC): self.setWindowIcon(QIcon( os.path.join(os.path.dirname(__file__), '..', 'share', 'icon.svg') )) + self.setWindowTitle(t("abgleich wizard")) self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) @@ -139,7 +140,7 @@ def _prepare_step(self, index: int): QApplication.processEvents() if not self._steps[index]['prepare'](): - QMessageBox.warning(self, 'Warning', 'Nothing to do.') + QMessageBox.warning(self, t('Warning'), t('Nothing to do.')) self._finish_step(index) return @@ -171,8 +172,8 @@ def _run_step(self, index: int): if transaction.error is not None: QMessageBox.critical( self, - "Critical", - "Transaction failed!\n\n" + '\n\n'.join([str(item) for item in transaction.error.args]), + t("Critical Error"), + t("Transaction failed!") + "\n\n" + '\n\n'.join([str(item) for item in transaction.error.args]), ) self._quit() return diff --git a/src/abgleich/gui/wizard_base.py b/src/abgleich/gui/wizard_base.py index ae1eb3b..f15e1ab 100644 --- a/src/abgleich/gui/wizard_base.py +++ b/src/abgleich/gui/wizard_base.py @@ -50,8 +50,6 @@ def __init__(self): super().__init__() # skip WizardUiBaseABC - self.setWindowTitle("abgleich wizard") - self._ui = { "layout_0_v_root": QVBoxLayout(), # dialog "layout_1_h_buttons": QHBoxLayout(), # for buttons diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index 1b36feb..8581347 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -16,3 +16,4 @@ Removing old snapshots ...: {} Snapshots created.: {} Snapshots transferred.: {} Transferring backups ...: {} +abgleich wizard: {} From a4d79db950a13650478e768bf704c10119533d1e Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:32:47 +0200 Subject: [PATCH 092/105] more translations --- src/abgleich/share/translations.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index 8581347..ba90b0e 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -1,5 +1,5 @@ Cancel: - de: Abbrechen + de: Abbrechen Close: {} Collect Backup Transactions: {} Collect Cleanup Transactions: {} @@ -11,9 +11,25 @@ Creating snapshots ...: {} Execute Backup Transactions: {} Execute Cleanup Transactions: {} Execute Snapshot Transactions: {} +OK: {} +FAILED: + de: FEHLGESCHLAGEN Old snapshots removed.: {} Removing old snapshots ...: {} Snapshots created.: {} Snapshots transferred.: {} Transferring backups ...: {} abgleich wizard: {} +ancestor_name: {} +cleanup_snapshot: {} +dataset_subname: {} +push_snapshot: {} +push_snapshot_incremental: {} +snapshot: + de: Schnappschuss +snapshot_name: {} +snapshot_subparent: {} +type: + de: Typ +written: + de: geschrieben From dd3326493f24f28aee53be6d002477b1765420ec Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:33:57 +0200 Subject: [PATCH 093/105] more translations --- src/abgleich/core/dataset.py | 13 +++++++------ src/abgleich/core/snapshot.py | 25 ++++++++++++------------- src/abgleich/core/transaction.py | 19 ++++++++++--------- src/abgleich/gui/transaction.py | 9 +++++---- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/abgleich/core/dataset.py b/src/abgleich/core/dataset.py index a036514..cc0f64a 100644 --- a/src/abgleich/core/dataset.py +++ b/src/abgleich/core/dataset.py @@ -35,6 +35,7 @@ from .abc import ConfigABC, DatasetABC, PropertyABC, TransactionABC, SnapshotABC from .command import Command +from .i18n import t from .lib import root from .property import Property from .transaction import Transaction, TransactionMeta @@ -125,12 +126,12 @@ def get_snapshot_transaction(self) -> TransactionABC: snapshot_name = self._new_snapshot_name() return Transaction( - TransactionMeta( - type="snapshot", - dataset_subname=self._subname, - snapshot_name=snapshot_name, - written=self._properties["written"].value, - ), + TransactionMeta(**{ + t("type"): t("snapshot"), + t("dataset_subname"): self._subname, + t("snapshot_name"): snapshot_name, + t("written"): self._properties["written"].value, + }), [ Command.on_side( ["zfs", "snapshot", f"{self._name:s}@{snapshot_name:s}"], diff --git a/src/abgleich/core/snapshot.py b/src/abgleich/core/snapshot.py index 671eec0..f221e36 100644 --- a/src/abgleich/core/snapshot.py +++ b/src/abgleich/core/snapshot.py @@ -34,6 +34,7 @@ from .abc import ConfigABC, PropertyABC, SnapshotABC, TransactionABC from .command import Command +from .i18n import t from .lib import root from .property import Property from .transaction import Transaction, TransactionMeta @@ -80,11 +81,11 @@ def get_cleanup_transaction(self) -> TransactionABC: assert self._side == "source" return Transaction( - meta=TransactionMeta( - type="cleanup_snapshot", - snapshot_subparent=self._subparent, - snapshot_name=self._name, - ), + meta=TransactionMeta(**{ + t("type"): t("cleanup_snapshot"), + t("snapshot_subparent"): self._subparent, + t("snapshot_name"): self._name, + }), commands=[ Command.on_side( ["zfs", "destroy", f"{self._parent:s}@{self._name:s}"], @@ -123,14 +124,12 @@ def get_backup_transaction( ] return Transaction( - meta=TransactionMeta( - type="push_snapshot" - if ancestor is None - else "push_snapshot_incremental", - snapshot_subparent=self._subparent, - ancestor_name="" if ancestor is None else ancestor.name, - snapshot_name=self.name, - ), + meta=TransactionMeta(**{ + t("type"): t("push_snapshot") if ancestor is None else t("push_snapshot_incremental"), + t("snapshot_subparent"): self._subparent, + t("ancestor_name"): "" if ancestor is None else ancestor.name, + t("snapshot_name"): self.name, + }), commands=commands, ) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index a204d52..2dfd71b 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -34,6 +34,7 @@ import typeguard from .abc import CommandABC, TransactionABC, TransactionListABC, TransactionMetaABC +from .i18n import t from .io import colorize, humanize_size # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -182,7 +183,7 @@ def table_columns(self) -> typing.List[str]: headers = set() for transaction in self._transactions: keys = list(transaction.meta.keys()) - assert "type" in keys + assert t("type") in keys headers.update(keys) headers = list(headers) headers.sort() @@ -190,17 +191,17 @@ def table_columns(self) -> typing.List[str]: if len(headers) == 0: return headers - type_index = headers.index("type") + type_index = headers.index(t("type")) if type_index != 0: headers.pop(type_index) - headers.insert(0, "type") + headers.insert(0, t("type")) return headers @property def table_rows(self) -> typing.List[str]: - return [f'transaction #{index:d}' for index in range(1, len(self) + 1)] + return [f'{t("transaction"):s} #{index:d}' for index in range(1, len(self) + 1)] def append(self, transaction: TransactionABC): @@ -248,7 +249,7 @@ def print_table(self): def _table_format_cell(header: str, value: MetaNoneTypes) -> str: FORMAT = { - "written": lambda v: humanize_size(v, add_color=True), + t("written"): lambda v: humanize_size(v, add_color=True), } return FORMAT.get(header, str)(value) @@ -256,7 +257,7 @@ def _table_format_cell(header: str, value: MetaNoneTypes) -> str: @staticmethod def _table_colalign(headers: typing.List[str]) -> typing.List[str]: - RIGHT = ("written",) + RIGHT = (t("written"),) DECIMAL = tuple() colalign = [] @@ -275,7 +276,7 @@ def run(self): for transaction in self._transactions: print( - f'({colorize(transaction.meta["type"], "white"):s}) ' + f'({colorize(transaction.meta[t("type")], "white"):s}) ' f'{colorize(" | ".join([str(command) for command in transaction.commands]), "yellow"):s}' ) @@ -288,7 +289,7 @@ def run(self): assert transaction.complete if transaction.error is not None: - print(colorize("FAILED", "red")) + print(colorize(t("FAILED"), "red")) raise transaction.error else: - print(colorize("OK", "green")) + print(colorize(t("OK"), "green")) diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index 579278d..faaeff5 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -36,6 +36,7 @@ from ..core.abc import TransactionListABC from ..core.io import humanize_size +from ..core.i18n import t # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS @@ -60,22 +61,22 @@ def data(self, index: QModelIndex, role: int) -> typing.Union[None, str, QColor] col_key = self._cols[col] if role == Qt.DisplayRole: - if col_key == 'written': + if col_key == t('written'): return humanize_size(self._transactions[row].meta[col_key]) return self._transactions[row].meta[col_key] if role == Qt.ForegroundRole: - if col_key != 'written': + if col_key != t('written'): return return QColor('#808080') if role == Qt.BackgroundRole: - if col_key != 'written': + if col_key != t('written'): return return QColor(humanize_size(self._transactions[row].meta[col_key], get_rgb=True)) if role == Qt.DecorationRole: - if col_key != 'type': + if col_key != t('type'): return if self._transactions[row].error is not None: return QColor('#FF0000') From 61441f81baa4521c47d0af614d6f83cf0af31b42 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:39:50 +0200 Subject: [PATCH 094/105] more translations --- src/abgleich/share/translations.yaml | 36 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index ba90b0e..895f579 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -1,16 +1,27 @@ Cancel: de: Abbrechen -Close: {} -Collect Backup Transactions: {} -Collect Cleanup Transactions: {} -Collect Snapshot Transactions: {} -Collecting backup transactions ...: {} -Collecting cleanup transactions ...: {} -Collecting snapshot transactions ...: {} -Creating snapshots ...: {} -Execute Backup Transactions: {} -Execute Cleanup Transactions: {} -Execute Snapshot Transactions: {} +Close: + de: Schließen +Collect Backup Transactions: + de: Sicherungstransaktionen sammeln +Collect Cleanup Transactions: + de: Säuberungstransaktionen sammeln +Collect Snapshot Transactions: + de: Schnappschuss-Transaktionen sammeln +Collecting backup transactions ...: + de: Sicherungstransaktionen sammeln ... +Collecting cleanup transactions ...: + de: Säuberungstransaktionen sammeln ... +Collecting snapshot transactions ...: + de: Schnappschuss-Transaktionen sammeln ... +Creating snapshots ...: + de: Schnappschüsse erstellen ... +Execute Backup Transactions: + de: Sicherungstransaktionen ausführen +Execute Cleanup Transactions: + de: Säuberungstransaktionen ausführen +Execute Snapshot Transactions: + de: Schnappschuss-Transaktionen ausführen OK: {} FAILED: de: FEHLGESCHLAGEN @@ -19,7 +30,8 @@ Removing old snapshots ...: {} Snapshots created.: {} Snapshots transferred.: {} Transferring backups ...: {} -abgleich wizard: {} +abgleich wizard: + de: Abgleich Assistent ancestor_name: {} cleanup_snapshot: {} dataset_subname: {} From a1c23f3d0f3fc5a8d30384f42f85f103e13ece8f Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 18:56:24 +0200 Subject: [PATCH 095/105] more translations --- src/abgleich/core/snapshot.py | 2 +- src/abgleich/gui/wizard.py | 2 +- src/abgleich/share/translations.yaml | 40 +++++++++++++++++++--------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/abgleich/core/snapshot.py b/src/abgleich/core/snapshot.py index f221e36..ed4ec52 100644 --- a/src/abgleich/core/snapshot.py +++ b/src/abgleich/core/snapshot.py @@ -125,7 +125,7 @@ def get_backup_transaction( return Transaction( meta=TransactionMeta(**{ - t("type"): t("push_snapshot") if ancestor is None else t("push_snapshot_incremental"), + t("type"): t("transfer_snapshot") if ancestor is None else t("transfer_snapshot_incremental"), t("snapshot_subparent"): self._subparent, t("ancestor_name"): "" if ancestor is None else ancestor.name, t("snapshot_name"): self.name, diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index e95165f..d24d94b 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -86,7 +86,7 @@ def __init__(self, config: ConfigABC): { 'prepare': lambda: self._prepare('backup'), 'prepare_text': t('Collecting backup transactions ...'), - 'run_text': t('Transferring backups ...'), + 'run_text': t('Transferring snapshots ...'), 'run_button': t('Execute Backup Transactions'), 'finish_text': t('Snapshots transferred.'), 'finish_button': t('Collect Cleanup Transactions'), diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index 895f579..85aeb06 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -25,23 +25,37 @@ Execute Snapshot Transactions: OK: {} FAILED: de: FEHLGESCHLAGEN -Old snapshots removed.: {} -Removing old snapshots ...: {} -Snapshots created.: {} -Snapshots transferred.: {} -Transferring backups ...: {} +Old snapshots removed.: + de: Alte Schnappschüsse entfernt. +Removing old snapshots ...: + de: Entferne alte Schnappschüsse ... +Snapshots created.: + de: Schnappschüsse erstellt. +Snapshots transferred.: + de: Schnappschüsse gesichert. +Transferring snapshots ...: + de: Sichere Schnappschüsse ... abgleich wizard: de: Abgleich Assistent -ancestor_name: {} -cleanup_snapshot: {} -dataset_subname: {} -push_snapshot: {} -push_snapshot_incremental: {} +ancestor_name: + de: Vorfahr +cleanup_snapshot: + de: Säuberung +dataset_subname: + de: Datensatz-Namensfragment +transaction: + de: Transaktion +transfer_snapshot: + de: Sicherung +transfer_snapshot_incremental: + de: Inkrementelle Sicherung snapshot: de: Schnappschuss -snapshot_name: {} -snapshot_subparent: {} +snapshot_name: + de: Schnappschuss-Name +snapshot_subparent: + de: Datensatz-Namensfragment type: de: Typ written: - de: geschrieben + de: Geschrieben From a7585ec602073b09bfbce8488bde94ee590aac95 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 19:42:09 +0200 Subject: [PATCH 096/105] more translations --- src/abgleich/cli/backup.py | 5 +++-- src/abgleich/cli/cleanup.py | 5 +++-- src/abgleich/cli/snap.py | 5 +++-- src/abgleich/share/translations.yaml | 6 ++++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/abgleich/cli/backup.py b/src/abgleich/cli/backup.py index 543e75f..74303a2 100644 --- a/src/abgleich/cli/backup.py +++ b/src/abgleich/cli/backup.py @@ -32,6 +32,7 @@ import click from ..core.config import Config +from ..core.i18n import t from ..core.zpool import Zpool # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -51,10 +52,10 @@ def backup(configfile): transactions = source_zpool.get_backup_transactions(target_zpool) if len(transactions) == 0: - print("nothing to do") + print(t("nothing to do")) return transactions.print_table() - click.confirm("Do you want to continue?", abort=True) + click.confirm(t("Do you want to continue?"), abort=True) transactions.run() diff --git a/src/abgleich/cli/cleanup.py b/src/abgleich/cli/cleanup.py index dfc63a0..52a08d1 100644 --- a/src/abgleich/cli/cleanup.py +++ b/src/abgleich/cli/cleanup.py @@ -34,6 +34,7 @@ import click from ..core.config import Config +from ..core.i18n import t from ..core.io import humanize_size from ..core.zpool import Zpool @@ -55,11 +56,11 @@ def cleanup(configfile): transactions = source_zpool.get_cleanup_transactions(target_zpool) if len(transactions) == 0: - print("nothing to do") + print(t("nothing to do")) return transactions.print_table() - click.confirm("Do you want to continue?", abort=True) + click.confirm(t("Do you want to continue?"), abort=True) transactions.run() diff --git a/src/abgleich/cli/snap.py b/src/abgleich/cli/snap.py index e3d1d04..a2d62f9 100644 --- a/src/abgleich/cli/snap.py +++ b/src/abgleich/cli/snap.py @@ -32,6 +32,7 @@ import click from ..core.config import Config +from ..core.i18n import t from ..core.zpool import Zpool # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -47,10 +48,10 @@ def snap(configfile): transactions = zpool.get_snapshot_transactions() if len(transactions) == 0: - print("nothing to do") + print(t("nothing to do")) return transactions.print_table() - click.confirm("Do you want to continue?", abort=True) + click.confirm(t("Do you want to continue?"), abort=True) transactions.run() diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index 85aeb06..4cfd5b7 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -1,3 +1,5 @@ +Aborted!: + de: Abgebrochen! Cancel: de: Abbrechen Close: @@ -16,6 +18,8 @@ Collecting snapshot transactions ...: de: Schnappschuss-Transaktionen sammeln ... Creating snapshots ...: de: Schnappschüsse erstellen ... +Do you want to continue?: + de: Möchten Sie fortfahren? Execute Backup Transactions: de: Sicherungstransaktionen ausführen Execute Cleanup Transactions: @@ -43,6 +47,8 @@ cleanup_snapshot: de: Säuberung dataset_subname: de: Datensatz-Namensfragment +nothing to do: + de: nichts zu tun transaction: de: Transaktion transfer_snapshot: From 4abc952bd60ce9239384fd1ced3093cbded1edd9 Mon Sep 17 00:00:00 2001 From: Akhuna Date: Sun, 19 Jul 2020 20:48:03 +0200 Subject: [PATCH 097/105] New Icon --- src/abgleich/share/icon.svg | 45 +++++++++++++------------------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/abgleich/share/icon.svg b/src/abgleich/share/icon.svg index d6bcc45..4bdb0c0 100644 --- a/src/abgleich/share/icon.svg +++ b/src/abgleich/share/icon.svg @@ -2,36 +2,23 @@ - - - - - - - + + + + + + + From 63321794ee01b632abad9de4ddc59c6203168c31 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 20:57:31 +0200 Subject: [PATCH 098/105] config options for snapshot task collection --- README.md | 5 ++++- src/abgleich/core/dataset.py | 11 +++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a2080fb..9b85e9d 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,9 @@ target: host: bigdata user: zfsadmin keep_snapshots: 2 +always_changed: no +written_threshold: 1048576 +check_diff: yes suffix: _backup digits: 2 ignore: @@ -75,7 +78,7 @@ ssh: cipher: aes256-gcm@openssh.com ``` -The prefix can be empty on either side. If a `host` is set to `localhost`, the `user` field can be left empty. Both source and target can be remote hosts or localhost at the same time. `keep_snapshots` is an integer and must be greater or equal to `1`. It specifies the number of snapshots that are kept per dataset on the source side when a cleanup operation is triggered. `suffix` contains the name suffix for new snapshots. `digits` specifies how many digits are used for a decimal number describing the n-th snapshot per dataset per day as part of the name of new snapshots. `ignore` lists stuff underneath the `prefix` which will be ignored by this tool, i.e. no snapshots, backups or cleanups. `ssh` allows to fine-tune the speed of backups. In fast local networks, it is best to set `compression` to `no` because the compression is usually slowing down the transfer. However, for low-bandwidth transmissions, it makes sense to set it to `yes`. For significantly better speed in fast local networks, make sure that both the source and the target system support a common cipher, which is accelerated by [AES-NI](https://en.wikipedia.org/wiki/AES_instruction_set) on both ends. +The prefix can be empty on either side. If a `host` is set to `localhost`, the `user` field can be left empty. Both source and target can be remote hosts or localhost at the same time. `keep_snapshots` is an integer and must be greater or equal to `1`. It specifies the number of snapshots that are kept per dataset on the source side when a cleanup operation is triggered. `suffix` contains the name suffix for new snapshots. Setting `always_changed` to `yes` causes `abgleich` to beliefe that all datasets have always changed since the last snapshot, completely ignoring what ZFS actually reports. No diff will be checked produced for values of `written` lower than `written_threshold`. Checking diffs can be completely deactivated by setting `check_diff` to `no`. `digits` specifies how many digits are used for a decimal number describing the n-th snapshot per dataset per day as part of the name of new snapshots. `ignore` lists stuff underneath the `prefix` which will be ignored by this tool, i.e. no snapshots, backups or cleanups. `ssh` allows to fine-tune the speed of backups. In fast local networks, it is best to set `compression` to `no` because the compression is usually slowing down the transfer. However, for low-bandwidth transmissions, it makes sense to set it to `yes`. For significantly better speed in fast local networks, make sure that both the source and the target system support a common cipher, which is accelerated by [AES-NI](https://en.wikipedia.org/wiki/AES_instruction_set) on both ends. ## USAGE diff --git a/src/abgleich/core/dataset.py b/src/abgleich/core/dataset.py index cc0f64a..88e1a45 100644 --- a/src/abgleich/core/dataset.py +++ b/src/abgleich/core/dataset.py @@ -87,13 +87,20 @@ def changed(self) -> bool: if len(self) == 0: return True + if self._config["always_changed"]: + return True if self._properties["written"].value == 0: return False - if self._properties["written"].value > (1024 ** 2): - return True if self._properties["type"].value == "volume": return True + if self._config["written_threshold"] is not None: + if self._properties["written"].value > self._config["written_threshold"]: + return True + + if not self._config["check_diff"]: + return True + output, _ = Command.on_side( ["zfs", "diff", f"{self._name:s}@{self._snapshots[-1].name:s}"], self._side, From ab6cf21376f6231e927854e50526c8c6dd5c4cad Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 21:07:23 +0200 Subject: [PATCH 099/105] more translations --- src/abgleich/core/zpool.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index 49ddd19..a795236 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -46,6 +46,7 @@ from .command import Command from .comparison import Comparison from .dataset import Dataset +from .i18n import t from .io import colorize, humanize_size from .lib import join, root from .property import Property @@ -258,7 +259,7 @@ def print_table(self): print( tabulate( table, - headers=("NAME", "USED", "REFER", "compressratio"), + headers=(t("NAME"), t("USED"), t("REFER"), t("compressratio")), tablefmt="github", colalign=("left", "right", "right", "decimal"), ) @@ -295,7 +296,7 @@ def print_comparison_table(self, other: ZpoolABC): table.append(self._comparison_table_row(snapshot_item)) print( - tabulate(table, headers=["NAME", self.side, other.side], tablefmt="github",) + tabulate(table, headers=[t("NAME"), t(self.side), t(other.side)], tablefmt="github",) ) @staticmethod From dfc668fca46d32da738ff125964f87fc21910832 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 21:17:03 +0200 Subject: [PATCH 100/105] fix yaml format --- src/abgleich/core/i18n.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py index f096f1b..b772efa 100644 --- a/src/abgleich/core/i18n.py +++ b/src/abgleich/core/i18n.py @@ -74,7 +74,7 @@ def _load(self): def _dump(self): with open(self._path, 'w') as f: - f.write(yaml.dump(self.copy(), Dumper=CDumper)) + f.write(yaml.dump(self.copy(), Dumper=CDumper, allow_unicode=True, indent=4)) # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # API From 4390888626752f721c89840d42167f3aaae33659 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 21:19:13 +0200 Subject: [PATCH 101/105] more translations --- src/abgleich/share/translations.yaml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/abgleich/share/translations.yaml b/src/abgleich/share/translations.yaml index 4cfd5b7..ae0b469 100644 --- a/src/abgleich/share/translations.yaml +++ b/src/abgleich/share/translations.yaml @@ -26,11 +26,14 @@ Execute Cleanup Transactions: de: Säuberungstransaktionen ausführen Execute Snapshot Transactions: de: Schnappschuss-Transaktionen ausführen -OK: {} FAILED: de: FEHLGESCHLAGEN +NAME: {} +OK: {} Old snapshots removed.: de: Alte Schnappschüsse entfernt. +REFER: + de: VERWEIST Removing old snapshots ...: de: Entferne alte Schnappschüsse ... Snapshots created.: @@ -39,28 +42,36 @@ Snapshots transferred.: de: Schnappschüsse gesichert. Transferring snapshots ...: de: Sichere Schnappschüsse ... +USED: + de: BELEGT abgleich wizard: de: Abgleich Assistent ancestor_name: de: Vorfahr cleanup_snapshot: de: Säuberung +compressratio: + de: Kompressionsrate dataset_subname: de: Datensatz-Namensfragment nothing to do: de: nichts zu tun -transaction: - de: Transaktion -transfer_snapshot: - de: Sicherung -transfer_snapshot_incremental: - de: Inkrementelle Sicherung snapshot: de: Schnappschuss snapshot_name: de: Schnappschuss-Name snapshot_subparent: de: Datensatz-Namensfragment +source: + de: Quelle +target: + de: Ziel +transaction: + de: Transaktion +transfer_snapshot: + de: Sicherung +transfer_snapshot_incremental: + de: Inkrementelle Sicherung type: de: Typ written: From bc2c3c76c5a33618b21e56ce03dff17e09e721d3 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 21:55:41 +0200 Subject: [PATCH 102/105] logged changes --- CHANGES.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5a36041..a3974d8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,8 +2,9 @@ ## 0.0.3 (2020-XX-XX) -- FEATURE: Added wizard GUI for backup tasks (`snap`, `backup`, `cleanup`). -- FEATURE: CLI and GUI translations +- FEATURE: Added wizard GUI for backup tasks (`snap`, `backup`, `cleanup`) +- FEATURE: Added new configuration options (`always_changed`, `written_threshold`, `check_diff`) for detecting snapshot tasks +- FEATURE: CLI and GUI translations (i18n) - FIX: Added missing type checks ## 0.0.2 (2020-07-14) From 41b72f03d108d546c279e05317e429e07c66d04f Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 21:57:27 +0200 Subject: [PATCH 103/105] black --- src/abgleich/core/command.py | 8 ++- src/abgleich/core/dataset.py | 14 +++--- src/abgleich/core/i18n.py | 19 +++++--- src/abgleich/core/io.py | 4 +- src/abgleich/core/snapshot.py | 28 ++++++----- src/abgleich/core/transaction.py | 10 +++- src/abgleich/core/zpool.py | 77 +++++++++++++++++------------ src/abgleich/gui/transaction.py | 40 +++++++++------ src/abgleich/gui/wizard.py | 84 ++++++++++++++++---------------- 9 files changed, 169 insertions(+), 115 deletions(-) diff --git a/src/abgleich/core/command.py b/src/abgleich/core/command.py index 7dfe918..94d9bf8 100644 --- a/src/abgleich/core/command.py +++ b/src/abgleich/core/command.py @@ -48,7 +48,7 @@ def __init__(self, cmd: typing.List[str]): def __str__(self) -> str: - return " ".join([item.replace(' ', '\\ ') for item in self._cmd]) + return " ".join([item.replace(" ", "\\ ") for item in self._cmd]) def run(self): @@ -93,7 +93,11 @@ def run_pipe(self, other: CommandABC): ) ): raise SystemError( - "command pipe failed", f'{str(self):s} | {str(other):s}', errors_1, output_2, errors_2 + "command pipe failed", + f"{str(self):s} | {str(other):s}", + errors_1, + output_2, + errors_2, ) return errors_1, output_2, errors_2 diff --git a/src/abgleich/core/dataset.py b/src/abgleich/core/dataset.py index 88e1a45..8182b31 100644 --- a/src/abgleich/core/dataset.py +++ b/src/abgleich/core/dataset.py @@ -133,12 +133,14 @@ def get_snapshot_transaction(self) -> TransactionABC: snapshot_name = self._new_snapshot_name() return Transaction( - TransactionMeta(**{ - t("type"): t("snapshot"), - t("dataset_subname"): self._subname, - t("snapshot_name"): snapshot_name, - t("written"): self._properties["written"].value, - }), + TransactionMeta( + **{ + t("type"): t("snapshot"), + t("dataset_subname"): self._subname, + t("snapshot_name"): snapshot_name, + t("written"): self._properties["written"].value, + } + ), [ Command.on_side( ["zfs", "snapshot", f"{self._name:s}@{snapshot_name:s}"], diff --git a/src/abgleich/core/i18n.py b/src/abgleich/core/i18n.py index b772efa..5007675 100644 --- a/src/abgleich/core/i18n.py +++ b/src/abgleich/core/i18n.py @@ -39,21 +39,23 @@ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @typeguard.typechecked class _Lang(dict): - def __init__(self): super().__init__() - self._lang = locale.getlocale()[0].split('_')[0] - self._path = os.path.join(os.path.dirname(__file__), '..', 'share', 'translations.yaml') + self._lang = locale.getlocale()[0].split("_")[0] + self._path = os.path.join( + os.path.dirname(__file__), "..", "share", "translations.yaml" + ) self._load() def __call__(self, name: str) -> str: assert len(name) > 0 - if int(os.environ.get('ABGLEICH_TRANSLATE', '0')) == 1: + if int(os.environ.get("ABGLEICH_TRANSLATE", "0")) == 1: if name not in self.keys(): self._add_item(name) @@ -68,13 +70,16 @@ def _load(self): self.clear() - with open(self._path, 'r') as f: + with open(self._path, "r") as f: self.update(yaml.load(f.read(), Loader=CLoader)) def _dump(self): - with open(self._path, 'w') as f: - f.write(yaml.dump(self.copy(), Dumper=CDumper, allow_unicode=True, indent=4)) + with open(self._path, "w") as f: + f.write( + yaml.dump(self.copy(), Dumper=CDumper, allow_unicode=True, indent=4) + ) + # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # API diff --git a/src/abgleich/core/io.py b/src/abgleich/core/io.py index 1ad69d4..bd2fae0 100644 --- a/src/abgleich/core/io.py +++ b/src/abgleich/core/io.py @@ -63,7 +63,9 @@ def colorize(text: str, col: str) -> str: @typeguard.typechecked -def humanize_size(size: typing.Union[float, int], add_color: bool = False, get_rgb: bool = False) -> str: +def humanize_size( + size: typing.Union[float, int], add_color: bool = False, get_rgb: bool = False +) -> str: suffix = "B" diff --git a/src/abgleich/core/snapshot.py b/src/abgleich/core/snapshot.py index ed4ec52..1a5841e 100644 --- a/src/abgleich/core/snapshot.py +++ b/src/abgleich/core/snapshot.py @@ -81,11 +81,13 @@ def get_cleanup_transaction(self) -> TransactionABC: assert self._side == "source" return Transaction( - meta=TransactionMeta(**{ - t("type"): t("cleanup_snapshot"), - t("snapshot_subparent"): self._subparent, - t("snapshot_name"): self._name, - }), + meta=TransactionMeta( + **{ + t("type"): t("cleanup_snapshot"), + t("snapshot_subparent"): self._subparent, + t("snapshot_name"): self._name, + } + ), commands=[ Command.on_side( ["zfs", "destroy", f"{self._parent:s}@{self._name:s}"], @@ -124,12 +126,16 @@ def get_backup_transaction( ] return Transaction( - meta=TransactionMeta(**{ - t("type"): t("transfer_snapshot") if ancestor is None else t("transfer_snapshot_incremental"), - t("snapshot_subparent"): self._subparent, - t("ancestor_name"): "" if ancestor is None else ancestor.name, - t("snapshot_name"): self.name, - }), + meta=TransactionMeta( + **{ + t("type"): t("transfer_snapshot") + if ancestor is None + else t("transfer_snapshot_incremental"), + t("snapshot_subparent"): self._subparent, + t("ancestor_name"): "" if ancestor is None else ancestor.name, + t("snapshot_name"): self.name, + } + ), commands=commands, ) diff --git a/src/abgleich/core/transaction.py b/src/abgleich/core/transaction.py index 2dfd71b..3c2e558 100644 --- a/src/abgleich/core/transaction.py +++ b/src/abgleich/core/transaction.py @@ -224,7 +224,9 @@ def clear(self): def _link_transaction(self, transaction: TransactionABC): - transaction.changed = lambda: self._changed(self._transactions.index(transaction)) + transaction.changed = lambda: self._changed( + self._transactions.index(transaction) + ) transaction.changed() def print_table(self): @@ -243,7 +245,11 @@ def print_table(self): for transaction in self._transactions ] - print(tabulate(table, headers=table_columns, tablefmt="github", colalign=colalign,)) + print( + tabulate( + table, headers=table_columns, tablefmt="github", colalign=colalign, + ) + ) @staticmethod def _table_format_cell(header: str, value: MetaNoneTypes) -> str: diff --git a/src/abgleich/core/zpool.py b/src/abgleich/core/zpool.py index a795236..ca3015c 100644 --- a/src/abgleich/core/zpool.py +++ b/src/abgleich/core/zpool.py @@ -88,10 +88,7 @@ def root(self) -> str: return self._root - def get_cleanup_transactions( - self, - other: ZpoolABC, - ) -> TransactionListABC: + def get_cleanup_transactions(self, other: ZpoolABC,) -> TransactionListABC: assert self.side == "source" assert other.side == "target" @@ -109,9 +106,17 @@ def get_cleanup_transactions( return transactions def generate_cleanup_transactions( - self, - other: ZpoolABC, - ) -> typing.Generator[typing.Tuple[int, typing.Union[None, typing.Union[None, typing.Generator[TransactionABC, None, None]]]], None, None]: + self, other: ZpoolABC, + ) -> typing.Generator[ + typing.Tuple[ + int, + typing.Union[ + None, typing.Union[None, typing.Generator[TransactionABC, None, None]] + ], + ], + None, + None, + ]: assert self.side == "source" assert other.side == "target" @@ -124,8 +129,7 @@ def generate_cleanup_transactions( yield index, self._get_cleanup_from_datasetitem(dataset_item) def _get_cleanup_from_datasetitem( - self, - dataset_item: ComparisonItemABC, + self, dataset_item: ComparisonItemABC, ) -> typing.Union[None, typing.Generator[TransactionABC, None, None]]: if dataset_item.get_item().subname in self._config["ignore"]: @@ -133,19 +137,12 @@ def _get_cleanup_from_datasetitem( if dataset_item.a is None or dataset_item.b is None: return - dataset_comparison = Comparison.from_datasets( - dataset_item.a, dataset_item.b - ) - snapshots = dataset_comparison.a_overlap_tail[ - : -self._config["keep_snapshots"] - ] + dataset_comparison = Comparison.from_datasets(dataset_item.a, dataset_item.b) + snapshots = dataset_comparison.a_overlap_tail[: -self._config["keep_snapshots"]] return (snapshot.get_cleanup_transaction() for snapshot in snapshots) - def get_backup_transactions( - self, - other: ZpoolABC, - ) -> TransactionListABC: + def get_backup_transactions(self, other: ZpoolABC,) -> TransactionListABC: assert self.side == "source" assert other.side == "target" @@ -154,7 +151,9 @@ def get_backup_transactions( transactions = TransactionList() for dataset_item in zpool_comparison.merged: - backup_transactions = self._get_backup_transactions_from_datasetitem(other, dataset_item) + backup_transactions = self._get_backup_transactions_from_datasetitem( + other, dataset_item + ) if backup_transactions is None: continue transactions.extend(backup_transactions) @@ -162,9 +161,17 @@ def get_backup_transactions( return transactions def generate_backup_transactions( - self, - other: ZpoolABC, - ) -> typing.Generator[typing.Tuple[int, typing.Union[None, typing.Union[None, typing.Generator[TransactionABC, None, None]]]], None, None]: + self, other: ZpoolABC, + ) -> typing.Generator[ + typing.Tuple[ + int, + typing.Union[ + None, typing.Union[None, typing.Generator[TransactionABC, None, None]] + ], + ], + None, + None, + ]: assert self.side == "source" assert other.side == "target" @@ -174,12 +181,12 @@ def generate_backup_transactions( yield len(zpool_comparison), None for index, dataset_item in enumerate(zpool_comparison.merged): - yield index, self._get_backup_transactions_from_datasetitem(other, dataset_item) + yield index, self._get_backup_transactions_from_datasetitem( + other, dataset_item + ) def _get_backup_transactions_from_datasetitem( - self, - other: ZpoolABC, - dataset_item: ComparisonItemABC, + self, other: ZpoolABC, dataset_item: ComparisonItemABC, ) -> typing.Union[None, typing.Generator[TransactionABC, None, None]]: if dataset_item.get_item().subname in self._config["ignore"]: @@ -228,7 +235,11 @@ def get_snapshot_transactions(self) -> TransactionListABC: return transactions - def generate_snapshot_transactions(self) -> typing.Generator[typing.Tuple[int, typing.Union[None, TransactionABC]], None, None]: + def generate_snapshot_transactions( + self, + ) -> typing.Generator[ + typing.Tuple[int, typing.Union[None, TransactionABC]], None, None + ]: assert self._side == "source" @@ -237,7 +248,9 @@ def generate_snapshot_transactions(self) -> typing.Generator[typing.Tuple[int, t for index, dataset in enumerate(self._datasets): yield index, self._get_snapshot_transactions_from_dataset(dataset) - def _get_snapshot_transactions_from_dataset(self, dataset: DatasetABC) -> typing.Union[None, TransactionABC]: + def _get_snapshot_transactions_from_dataset( + self, dataset: DatasetABC + ) -> typing.Union[None, TransactionABC]: if dataset.subname in self._config["ignore"]: return @@ -296,7 +309,11 @@ def print_comparison_table(self, other: ZpoolABC): table.append(self._comparison_table_row(snapshot_item)) print( - tabulate(table, headers=[t("NAME"), t(self.side), t(other.side)], tablefmt="github",) + tabulate( + table, + headers=[t("NAME"), t(self.side), t(other.side)], + tablefmt="github", + ) ) @staticmethod diff --git a/src/abgleich/gui/transaction.py b/src/abgleich/gui/transaction.py index faaeff5..a94f1d9 100644 --- a/src/abgleich/gui/transaction.py +++ b/src/abgleich/gui/transaction.py @@ -42,10 +42,12 @@ # CLASS # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + @typeguard.typechecked class TransactionListModel(QAbstractTableModel): - - def __init__(self, transactions: TransactionListABC, parent_changed: typing.Callable): + def __init__( + self, transactions: TransactionListABC, parent_changed: typing.Callable + ): super().__init__() self._transactions = transactions @@ -55,38 +57,44 @@ def __init__(self, transactions: TransactionListABC, parent_changed: typing.Call self._rows, self._cols = None, None self._update_labels() - def data(self, index: QModelIndex, role: int) -> typing.Union[None, str, QColor]: # TODO return type + def data( + self, index: QModelIndex, role: int + ) -> typing.Union[None, str, QColor]: # TODO return type row, col = index.row(), index.column() col_key = self._cols[col] if role == Qt.DisplayRole: - if col_key == t('written'): + if col_key == t("written"): return humanize_size(self._transactions[row].meta[col_key]) return self._transactions[row].meta[col_key] if role == Qt.ForegroundRole: - if col_key != t('written'): + if col_key != t("written"): return - return QColor('#808080') + return QColor("#808080") if role == Qt.BackgroundRole: - if col_key != t('written'): + if col_key != t("written"): return - return QColor(humanize_size(self._transactions[row].meta[col_key], get_rgb=True)) + return QColor( + humanize_size(self._transactions[row].meta[col_key], get_rgb=True) + ) if role == Qt.DecorationRole: - if col_key != t('type'): + if col_key != t("type"): return if self._transactions[row].error is not None: - return QColor('#FF0000') + return QColor("#FF0000") if self._transactions[row].running: - return QColor('#FFFF00') + return QColor("#FFFF00") if self._transactions[row].complete: - return QColor('#00FF00') - return QColor('#0000FF') + return QColor("#00FF00") + return QColor("#0000FF") - def headerData(self, section: int, orientation: Qt.Orientation, role: int) -> typing.Union[None, str]: + def headerData( + self, section: int, orientation: Qt.Orientation, role: int + ) -> typing.Union[None, str]: if role == Qt.DisplayRole: @@ -111,7 +119,9 @@ def _transactions_changed(self, row: typing.Union[None, int] = None): if old_rows != self._rows or old_cols != self._cols: self.layoutChanged.emit() if row is not None: - self.dataChanged.emit(self.index(row, 0), self.index(row, len(self._cols) - 1)) + self.dataChanged.emit( + self.index(row, 0), self.index(row, len(self._cols) - 1) + ) self._parent_changed() def _update_labels(self): diff --git a/src/abgleich/gui/wizard.py b/src/abgleich/gui/wizard.py index d24d94b..44d0476 100644 --- a/src/abgleich/gui/wizard.py +++ b/src/abgleich/gui/wizard.py @@ -53,9 +53,9 @@ def __init__(self, config: ConfigABC): super().__init__() self._config = config - self.setWindowIcon(QIcon( - os.path.join(os.path.dirname(__file__), '..', 'share', 'icon.svg') - )) + self.setWindowIcon( + QIcon(os.path.join(os.path.dirname(__file__), "..", "share", "icon.svg")) + ) self.setWindowTitle(t("abgleich wizard")) self._ui["button_cancel"].setEnabled(False) @@ -71,33 +71,33 @@ def __init__(self, config: ConfigABC): self._transactions = TransactionList() self._model = TransactionListModel(self._transactions, self._changed) - self._ui['table'].setModel(self._model) + self._ui["table"].setModel(self._model) self._steps = [ { - 'init_button': t('Collect Snapshot Transactions'), - 'prepare': self._prepare_snap, - 'prepare_text': t('Collecting snapshot transactions ...'), - 'run_text': t('Creating snapshots ...'), - 'run_button': t('Execute Snapshot Transactions'), - 'finish_text': t('Snapshots created.'), - 'finish_button': t('Collect Backup Transactions'), + "init_button": t("Collect Snapshot Transactions"), + "prepare": self._prepare_snap, + "prepare_text": t("Collecting snapshot transactions ..."), + "run_text": t("Creating snapshots ..."), + "run_button": t("Execute Snapshot Transactions"), + "finish_text": t("Snapshots created."), + "finish_button": t("Collect Backup Transactions"), }, { - 'prepare': lambda: self._prepare('backup'), - 'prepare_text': t('Collecting backup transactions ...'), - 'run_text': t('Transferring snapshots ...'), - 'run_button': t('Execute Backup Transactions'), - 'finish_text': t('Snapshots transferred.'), - 'finish_button': t('Collect Cleanup Transactions'), + "prepare": lambda: self._prepare("backup"), + "prepare_text": t("Collecting backup transactions ..."), + "run_text": t("Transferring snapshots ..."), + "run_button": t("Execute Backup Transactions"), + "finish_text": t("Snapshots transferred."), + "finish_button": t("Collect Cleanup Transactions"), }, { - 'prepare': lambda: self._prepare('cleanup'), - 'prepare_text': t('Collecting cleanup transactions ...'), - 'run_text': t('Removing old snapshots ...'), - 'run_button': t('Execute Cleanup Transactions'), - 'finish_text': t('Old snapshots removed.'), - 'finish_button': t('Close'), + "prepare": lambda: self._prepare("cleanup"), + "prepare_text": t("Collecting cleanup transactions ..."), + "run_text": t("Removing old snapshots ..."), + "run_button": t("Execute Cleanup Transactions"), + "finish_text": t("Old snapshots removed."), + "finish_button": t("Close"), }, ] @@ -105,7 +105,7 @@ def __init__(self, config: ConfigABC): def _changed(self): - self._ui['table'].resizeColumnsToContents() + self._ui["table"].resizeColumnsToContents() QApplication.processEvents() def _continue_click(self): @@ -120,8 +120,8 @@ def _init_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) - self._ui['progress'].setValue(0) - self._ui['label'].setText(self._steps[index]['prepare_text']) + self._ui["progress"].setValue(0) + self._ui["label"].setText(self._steps[index]["prepare_text"]) self._transactions.clear() if index > 0: @@ -129,7 +129,7 @@ def _init_step(self, index: int): return self._continue = lambda: self._prepare_step(index) - self._ui["button_continue"].setText(self._steps[index]['init_button']) + self._ui["button_continue"].setText(self._steps[index]["init_button"]) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) @@ -139,14 +139,14 @@ def _prepare_step(self, index: int): self._ui["button_continue"].setEnabled(False) QApplication.processEvents() - if not self._steps[index]['prepare'](): - QMessageBox.warning(self, t('Warning'), t('Nothing to do.')) + if not self._steps[index]["prepare"](): + QMessageBox.warning(self, t("Warning"), t("Nothing to do.")) self._finish_step(index) return - self._ui['label'].setText(self._steps[index]['run_text']) + self._ui["label"].setText(self._steps[index]["run_text"]) self._continue = lambda: self._run_step(index) - self._ui["button_continue"].setText(self._steps[index]['run_button']) + self._ui["button_continue"].setText(self._steps[index]["run_button"]) self._ui["button_cancel"].setEnabled(True) self._ui["button_continue"].setEnabled(True) @@ -154,7 +154,7 @@ def _run_step(self, index: int): self._ui["button_cancel"].setEnabled(False) self._ui["button_continue"].setEnabled(False) - self._ui['progress'].setMaximum(len(self._transactions)) + self._ui["progress"].setMaximum(len(self._transactions)) QApplication.processEvents() for number, transaction in enumerate(self._transactions): @@ -163,7 +163,7 @@ def _run_step(self, index: int): assert not transaction.complete transaction.run() - self._ui['progress'].setValue(number + 1) + self._ui["progress"].setValue(number + 1) QApplication.processEvents() assert not transaction.running @@ -173,19 +173,21 @@ def _run_step(self, index: int): QMessageBox.critical( self, t("Critical Error"), - t("Transaction failed!") + "\n\n" + '\n\n'.join([str(item) for item in transaction.error.args]), + t("Transaction failed!") + + "\n\n" + + "\n\n".join([str(item) for item in transaction.error.args]), ) self._quit() return - self._ui['label'].setText(self._steps[index]['finish_text']) + self._ui["label"].setText(self._steps[index]["finish_text"]) self._continue = lambda: self._finish_step(index) if index + 1 == len(self._steps): self._ui["button_cancel"].setVisible(False) else: self._ui["button_cancel"].setEnabled(True) - self._ui["button_continue"].setText(self._steps[index]['finish_button']) + self._ui["button_continue"].setText(self._steps[index]["finish_button"]) self._ui["button_continue"].setEnabled(True) def _finish_step(self, index: int): @@ -203,13 +205,13 @@ def _prepare_snap(self): gen = zpool.generate_snapshot_transactions() length, _ = next(gen) - self._ui['progress'].setMaximum(length) + self._ui["progress"].setMaximum(length) QApplication.processEvents() for number, transaction in gen: if transaction is not None: self._transactions.append(transaction) - self._ui['progress'].setValue(number + 1) + self._ui["progress"].setValue(number + 1) QApplication.processEvents() return len(self._transactions) > 0 @@ -219,16 +221,16 @@ def _prepare(self, action: str): source_zpool = Zpool.from_config("source", config=self._config) target_zpool = Zpool.from_config("target", config=self._config) - gen = getattr(source_zpool, f'generate_{action:s}_transactions')(target_zpool) + gen = getattr(source_zpool, f"generate_{action:s}_transactions")(target_zpool) length, _ = next(gen) - self._ui['progress'].setMaximum(length) + self._ui["progress"].setMaximum(length) QApplication.processEvents() for number, transactions in gen: if transactions is not None: self._transactions.extend(transactions) - self._ui['progress'].setValue(number + 1) + self._ui["progress"].setValue(number + 1) QApplication.processEvents() return len(self._transactions) > 0 From 510e69768d0586e47104978062aa6f916545304b Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 22:15:40 +0200 Subject: [PATCH 104/105] new screenshots --- docs/demo_gui01.png | Bin 31154 -> 48511 bytes docs/demo_gui02.png | Bin 46883 -> 52300 bytes docs/demo_gui03.png | Bin 43687 -> 42978 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/demo_gui01.png b/docs/demo_gui01.png index cffe6984db570dfcaa9053ef85cf1b16e33a22d0..57e6dc4684f556cca6a956a270a13f73163a3b55 100644 GIT binary patch literal 48511 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 diff --git a/docs/demo_gui02.png b/docs/demo_gui02.png index 82f999f27c7c324e91230978142a3759276ae621..9a62c713cfe898cc4c3fd5fc5e946ad4c7132429 100644 GIT binary patch literal 52300 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%0D?SvI;5;k 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 IeEjl%0qP|hEC2ui diff --git a/docs/demo_gui03.png b/docs/demo_gui03.png index 8ed6e9bd619fc8ce604f18b821336c48f456ee1d..8da247b7c900551b11801a72fe5dd0cd510f6e71 100644 GIT binary patch literal 42978 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�GoA7xd7klmgkF)<&;0ReR9o>G{tA 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 O1OPSe-6>Oh6#8EcpK;j$ From 69525601ba733a309d39d47b28e832599fde03b1 Mon Sep 17 00:00:00 2001 From: "Sebastian M. Ernst" Date: Sun, 19 Jul 2020 22:16:11 +0200 Subject: [PATCH 105/105] prepare for release --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a3974d8..30a41a4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,6 @@ # Changes -## 0.0.3 (2020-XX-XX) +## 0.0.3 (2020-07-19) - FEATURE: Added wizard GUI for backup tasks (`snap`, `backup`, `cleanup`) - FEATURE: Added new configuration options (`always_changed`, `written_threshold`, `check_diff`) for detecting snapshot tasks