From 6951ff5e60c370de71cd264bb54b156416b328e8 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 13:29:49 +0000 Subject: [PATCH 01/52] Move almost all of the docs config into a "common" file With #631 in mind, start by moving the vast bulk of the documentation configuration into a "common" file, and just keep the `nav` in the main configuration file. The thinking here is that I want two entry points -- one for building the full docs for the Textual website, and one for building a local version of the docs. Because mkdocs doesn't allow for inheriting a configuration and also splicing into the `nav`, we'll be looking to duplicate the `nav` for now -- this will likely change eventually as that'll be a maintenance overhead that we don't really want (will likely look at templating it or something). For now though, let's look at the best way of splitting things up and seeing how we can generate two different versions of the docs. --- mkdocs-common.yml | 113 ++++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 116 +--------------------------------------------- 2 files changed, 114 insertions(+), 115 deletions(-) create mode 100644 mkdocs-common.yml diff --git a/mkdocs-common.yml b/mkdocs-common.yml new file mode 100644 index 000000000..0e3c77e1b --- /dev/null +++ b/mkdocs-common.yml @@ -0,0 +1,113 @@ +site_name: Textual +site_url: https://textual.textualize.io/ +repo_url: https://github.com/textualize/textual/ +edit_uri: edit/main/docs/ + +markdown_extensions: + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - md_in_html + - admonition + - def_list + - meta + + - toc: + permalink: true + baselevel: 1 + - pymdownx.keys + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.superfences: + custom_fences: + - name: textual + class: textual + format: !!python/name:textual._doc.format_svg + - name: rich + class: rich + format: !!python/name:textual._doc.rich + - pymdownx.inlinehilite + - pymdownx.superfences + - pymdownx.snippets + - pymdownx.tabbed: + alternate_style: true + - pymdownx.snippets + - markdown.extensions.attr_list + +theme: + name: material + custom_dir: docs/custom_theme + features: + - navigation.tabs + - navigation.indexes + - navigation.tabs.sticky + - navigation.footer + - content.code.annotate + - content.code.copy + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + accent: purple + toggle: + icon: material/weather-sunny + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: black + toggle: + icon: material/weather-night + name: Switch to light mode + +plugins: + +- blog: +- rss: + match_path: blog/posts/.* + date_from_meta: + as_creation: date + categories: + - categories + - release + - tags +- search: +- autorefs: +- mkdocstrings: + custom_templates: docs/_templates + default_handler: python + handlers: + python: + options: + show_root_heading: true + show_root_full_path: false + show_source: false + filters: + - "!^_" + - "^__init__$" + - "!^can_replace$" + watch: + - src/textual +- exclude: + glob: + - "**/_template.md" + + +extra_css: + - stylesheets/custom.css + + +extra: + social: + - icon: fontawesome/brands/twitter + link: https://twitter.com/textualizeio + name: textualizeio on Twitter + - icon: fontawesome/brands/github + link: https://github.com/textualize/textual/ + name: Textual on Github + - icon: fontawesome/brands/discord + link: https://discord.gg/Enf6Z3qhVr + name: Textual Discord server +copyright: Copyright © Textualize, Inc diff --git a/mkdocs.yml b/mkdocs.yml index 1748de127..87cf933be 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,7 +1,4 @@ -site_name: Textual -site_url: https://textual.textualize.io/ -repo_url: https://github.com/textualize/textual/ -edit_uri: edit/main/docs/ +INHERIT: mkdocs-common.yml nav: - Introduction: @@ -176,114 +173,3 @@ nav: - "api/widget.md" - "Blog": - blog/index.md - - - -markdown_extensions: - - attr_list - - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - - md_in_html - - admonition - - def_list - - meta - - - toc: - permalink: true - baselevel: 1 - - pymdownx.keys - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.superfences: - custom_fences: - - name: textual - class: textual - format: !!python/name:textual._doc.format_svg - - name: rich - class: rich - format: !!python/name:textual._doc.rich - - pymdownx.inlinehilite - - pymdownx.superfences - - pymdownx.snippets - - pymdownx.tabbed: - alternate_style: true - - pymdownx.snippets - - markdown.extensions.attr_list - -theme: - name: material - custom_dir: docs/custom_theme - features: - - navigation.tabs - - navigation.indexes - - navigation.tabs.sticky - - navigation.footer - - content.code.annotate - - content.code.copy - palette: - - media: "(prefers-color-scheme: light)" - scheme: default - accent: purple - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: black - toggle: - icon: material/weather-night - name: Switch to light mode - -plugins: - -- blog: -- rss: - match_path: blog/posts/.* - date_from_meta: - as_creation: date - categories: - - categories - - release - - tags -- search: -- autorefs: -- mkdocstrings: - custom_templates: docs/_templates - default_handler: python - handlers: - python: - options: - show_root_heading: true - show_root_full_path: false - show_source: false - filters: - - "!^_" - - "^__init__$" - - "!^can_replace$" - watch: - - src/textual -- exclude: - glob: - - "**/_template.md" - - -extra_css: - - stylesheets/custom.css - - -extra: - social: - - icon: fontawesome/brands/twitter - link: https://twitter.com/textualizeio - name: textualizeio on Twitter - - icon: fontawesome/brands/github - link: https://github.com/textualize/textual/ - name: Textual on Github - - icon: fontawesome/brands/discord - link: https://discord.gg/Enf6Z3qhVr - name: Textual Discord server -copyright: Copyright © Textualize, Inc From dcdad6230fe6b7e898239d6c1d76b9dffeb8a0c2 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 13:58:15 +0000 Subject: [PATCH 02/52] Move the blog config out into the "live site" config --- mkdocs-common.yml | 9 --------- mkdocs.yml | 11 +++++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mkdocs-common.yml b/mkdocs-common.yml index 0e3c77e1b..f2b4a9d1b 100644 --- a/mkdocs-common.yml +++ b/mkdocs-common.yml @@ -64,15 +64,6 @@ theme: plugins: -- blog: -- rss: - match_path: blog/posts/.* - date_from_meta: - as_creation: date - categories: - - categories - - release - - tags - search: - autorefs: - mkdocstrings: diff --git a/mkdocs.yml b/mkdocs.yml index 87cf933be..00ab04b57 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,16 @@ INHERIT: mkdocs-common.yml +plugins: + - blog: + - rss: + match_path: blog/posts/.* + date_from_meta: + as_creation: date + categories: + - categories + - release + - tags + nav: - Introduction: - "index.md" From 9acbc0cd67717dd355c195f1da7863709a27abc7 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 13:58:44 +0000 Subject: [PATCH 03/52] Add a method of building a local copy of the docs This will build the docs into a directory called docs-local, sans the blog. Note the near-total copy/paste of the `nav` due to how mydocs does configuration inheritance; this is fine for now. --- .gitignore | 1 + Makefile | 2 + mkdocs-local.yml | 175 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 mkdocs-local.yml diff --git a/.gitignore b/.gitignore index f97bd86a6..9922d3d18 100644 --- a/.gitignore +++ b/.gitignore @@ -110,6 +110,7 @@ venv.bak/ # mkdocs documentation /site +/docs-local # mypy .mypy_cache/ diff --git a/Makefile b/Makefile index 9d71e69d7..dac8be349 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,8 @@ docs-serve: mkdocs serve docs-build: mkdocs build +docs-local-build: + mkdocs build --config-file mkdocs-local.yml docs-deploy: rm -rf .screenshot_cache mkdocs gh-deploy diff --git a/mkdocs-local.yml b/mkdocs-local.yml new file mode 100644 index 000000000..c922851f1 --- /dev/null +++ b/mkdocs-local.yml @@ -0,0 +1,175 @@ +INHERIT: mkdocs-common.yml + +site_dir: docs-local + +nav: + - Introduction: + - "index.md" + - "getting_started.md" + - "help.md" + - "tutorial.md" + - Guide: + - "guide/index.md" + - "guide/devtools.md" + - "guide/app.md" + - "guide/styles.md" + - "guide/CSS.md" + - "guide/design.md" + - "guide/queries.md" + - "guide/layout.md" + - "guide/events.md" + - "guide/input.md" + - "guide/actions.md" + - "guide/reactivity.md" + - "guide/widgets.md" + - "guide/animation.md" + - "guide/screens.md" + - "roadmap.md" + - Reference: + - "reference/index.md" + - CSS Types: + - "css_types/index.md" + - "css_types/border.md" + - "css_types/color.md" + - "css_types/horizontal.md" + - "css_types/integer.md" + - "css_types/name.md" + - "css_types/number.md" + - "css_types/overflow.md" + - "css_types/percentage.md" + - "css_types/scalar.md" + - "css_types/text_align.md" + - "css_types/text_style.md" + - "css_types/vertical.md" + - Events: + - "events/index.md" + - "events/blur.md" + - "events/descendant_blur.md" + - "events/descendant_focus.md" + - "events/enter.md" + - "events/focus.md" + - "events/hide.md" + - "events/key.md" + - "events/leave.md" + - "events/load.md" + - "events/mount.md" + - "events/mouse_capture.md" + - "events/click.md" + - "events/mouse_down.md" + - "events/mouse_move.md" + - "events/mouse_release.md" + - "events/mouse_scroll_down.md" + - "events/mouse_scroll_up.md" + - "events/mouse_up.md" + - "events/paste.md" + - "events/resize.md" + - "events/screen_resume.md" + - "events/screen_suspend.md" + - "events/show.md" + - Styles: + - "styles/index.md" + - "styles/align.md" + - "styles/background.md" + - "styles/border.md" + - "styles/box_sizing.md" + - "styles/color.md" + - "styles/content_align.md" + - "styles/display.md" + - "styles/dock.md" + - Grid: + - "styles/grid/index.md" + - "styles/grid/column_span.md" + - "styles/grid/grid_columns.md" + - "styles/grid/grid_gutter.md" + - "styles/grid/grid_rows.md" + - "styles/grid/grid_size.md" + - "styles/grid/row_span.md" + - "styles/height.md" + - "styles/layer.md" + - "styles/layers.md" + - "styles/layout.md" + - Links: + - "styles/links/index.md" + - "styles/links/link_background.md" + - "styles/links/link_color.md" + - "styles/links/link_hover_background.md" + - "styles/links/link_hover_color.md" + - "styles/links/link_hover_style.md" + - "styles/links/link_style.md" + - "styles/margin.md" + - "styles/max_height.md" + - "styles/max_width.md" + - "styles/min_height.md" + - "styles/min_width.md" + - "styles/offset.md" + - "styles/opacity.md" + - "styles/outline.md" + - "styles/overflow.md" + - "styles/padding.md" + - Scrollbar colors: + - "styles/scrollbar_colors/index.md" + - "styles/scrollbar_colors/scrollbar_background.md" + - "styles/scrollbar_colors/scrollbar_background_active.md" + - "styles/scrollbar_colors/scrollbar_background_hover.md" + - "styles/scrollbar_colors/scrollbar_color.md" + - "styles/scrollbar_colors/scrollbar_color_active.md" + - "styles/scrollbar_colors/scrollbar_color_hover.md" + - "styles/scrollbar_colors/scrollbar_corner_color.md" + - "styles/scrollbar_gutter.md" + - "styles/scrollbar_size.md" + - "styles/text_align.md" + - "styles/text_opacity.md" + - "styles/text_style.md" + - "styles/tint.md" + - "styles/visibility.md" + - "styles/width.md" + - Widgets: + - "widgets/button.md" + - "widgets/checkbox.md" + - "widgets/data_table.md" + - "widgets/directory_tree.md" + - "widgets/footer.md" + - "widgets/header.md" + - "widgets/index.md" + - "widgets/input.md" + - "widgets/label.md" + - "widgets/list_item.md" + - "widgets/list_view.md" + - "widgets/placeholder.md" + - "widgets/static.md" + - "widgets/text_log.md" + - "widgets/tree.md" + - API: + - "api/index.md" + - "api/app.md" + - "api/binding.md" + - "api/button.md" + - "api/checkbox.md" + - "api/color.md" + - "api/containers.md" + - "api/coordinate.md" + - "api/data_table.md" + - "api/directory_tree.md" + - "api/dom_node.md" + - "api/events.md" + - "api/footer.md" + - "api/geometry.md" + - "api/header.md" + - "api/input.md" + - "api/label.md" + - "api/list_view.md" + - "api/list_item.md" + - "api/message_pump.md" + - "api/message.md" + - "api/pilot.md" + - "api/placeholder.md" + - "api/query.md" + - "api/reactive.md" + - "api/screen.md" + - "api/static.md" + - "api/text_log.md" + - "api/timer.md" + - "api/tree.md" + - "api/tree_node.md" + - "api/walk.md" + - "api/widget.md" From e6fbe71c0475c791136579fab630c77c15342e53 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 14:05:21 +0000 Subject: [PATCH 04/52] Solve the problem of local docs and directory/index.html links See https://github.com/Textualize/textual/issues/631#issuecomment-1418960080 -- this addresses that problem pretty much perfectly. --- mkdocs-local.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs-local.yml b/mkdocs-local.yml index c922851f1..d6249854f 100644 --- a/mkdocs-local.yml +++ b/mkdocs-local.yml @@ -1,6 +1,7 @@ INHERIT: mkdocs-common.yml site_dir: docs-local +use_directory_urls: false nav: - Introduction: From a8ded8f0a6720239649574360110c7fbbfb3b8ae Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 14:28:13 +0000 Subject: [PATCH 05/52] Move some more live-site config into the correct config file --- mkdocs-common.yml | 4 +--- mkdocs.yml | 4 ++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mkdocs-common.yml b/mkdocs-common.yml index f2b4a9d1b..4f1fe51f4 100644 --- a/mkdocs-common.yml +++ b/mkdocs-common.yml @@ -1,7 +1,6 @@ site_name: Textual -site_url: https://textual.textualize.io/ + repo_url: https://github.com/textualize/textual/ -edit_uri: edit/main/docs/ markdown_extensions: - attr_list @@ -64,7 +63,6 @@ theme: plugins: -- search: - autorefs: - mkdocstrings: custom_templates: docs/_templates diff --git a/mkdocs.yml b/mkdocs.yml index 00ab04b57..d75186c46 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,6 +1,10 @@ INHERIT: mkdocs-common.yml +site_url: https://textual.textualize.io/ +edit_uri: edit/main/docs/ + plugins: + - search: - blog: - rss: match_path: blog/posts/.* From 4e4353b2ce1c1eebe0e50d64f0df6a2d2900db91 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 16:04:52 +0000 Subject: [PATCH 06/52] Remove the dictionary example from the front page of the docs Sometimes, when building the docs, this would end up being a bit of an "empty" example in that the time taken to get the result back from the API would be so long that the output would be of the request just in progress. So we've decided to drop this from the front page. --- docs/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 4d1c05832..1ce69322d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -81,10 +81,6 @@ Build sophisticated user interfaces with a simple Python API. Run your apps in t ``` -```{.textual path="docs/examples/events/dictionary.py" columns="100" lines="30" press="tab,_,t,e,x,t,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_"} -``` - - ```{.textual path="docs/examples/guide/layout/combining_layouts.py" columns="100", lines="30"} ``` From aece00e1dca8fc688149c1fe47ded3b6e2601a4d Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Mon, 6 Feb 2023 16:06:50 +0000 Subject: [PATCH 07/52] Remove the keystrokes from the dictionary example in events guide As well as not being necessary for the example, it also had the problem of not actually having the input in focus (there was no press of 'tab' to kick things off) and so the other keys didn't go into the `Input` as they were supposed to. --- docs/guide/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/events.md b/docs/guide/events.md index 2fa5195c2..1b50d56a4 100644 --- a/docs/guide/events.md +++ b/docs/guide/events.md @@ -183,7 +183,7 @@ Let's look at an example which looks up word definitions from an [api](https://d === "Output" - ```{.textual path="docs/examples/events/dictionary.py" press="t,e,x,t,_,_,_,_,_,_,_,_,_,_,_"} + ```{.textual path="docs/examples/events/dictionary.py"} ``` Note the highlighted line in the above code which calls `asyncio.create_task` to run a coroutine in the background. Without this you would find typing in to the text box to be unresponsive. From a8aaa7ad820afab39202f5a89ad0cb9d755214d1 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 10:06:05 +0000 Subject: [PATCH 08/52] Experiment with the mkdocs offline plugin In doing so, don't emphasise online docs over offline, but instead make this about an online/offline split and both are as important as each other. --- .gitignore | 2 +- Makefile | 8 ++++---- mkdocs-common.yml | 18 +++++++++--------- mkdocs-local.yml => mkdocs-offline.yml | 6 ++++-- mkdocs.yml => mkdocs-online.yml | 1 - 5 files changed, 18 insertions(+), 17 deletions(-) rename mkdocs-local.yml => mkdocs-offline.yml (99%) rename mkdocs.yml => mkdocs-online.yml (99%) diff --git a/.gitignore b/.gitignore index 9922d3d18..61f16442a 100644 --- a/.gitignore +++ b/.gitignore @@ -110,7 +110,7 @@ venv.bak/ # mkdocs documentation /site -/docs-local +/docs-offline # mypy .mypy_cache/ diff --git a/Makefile b/Makefile index dac8be349..44a28966a 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,11 @@ format-check: black --check src docs-serve: rm -rf .screenshot_cache - mkdocs serve + mkdocs serve --config-file mkdocs-online.yml docs-build: - mkdocs build -docs-local-build: - mkdocs build --config-file mkdocs-local.yml + mkdocs build --config-file mkdocs-online.yml +docs-build-offline: + mkdocs build --config-file mkdocs-offline.yml docs-deploy: rm -rf .screenshot_cache mkdocs gh-deploy diff --git a/mkdocs-common.yml b/mkdocs-common.yml index 4f1fe51f4..995a1aef9 100644 --- a/mkdocs-common.yml +++ b/mkdocs-common.yml @@ -62,12 +62,12 @@ theme: name: Switch to light mode plugins: - -- autorefs: -- mkdocstrings: - custom_templates: docs/_templates - default_handler: python - handlers: + - search: + - autorefs: + - mkdocstrings: + custom_templates: docs/_templates + default_handler: python + handlers: python: options: show_root_heading: true @@ -79,9 +79,9 @@ plugins: - "!^can_replace$" watch: - src/textual -- exclude: - glob: - - "**/_template.md" + - exclude: + glob: + - "**/_template.md" extra_css: diff --git a/mkdocs-local.yml b/mkdocs-offline.yml similarity index 99% rename from mkdocs-local.yml rename to mkdocs-offline.yml index d6249854f..6a8a5b37e 100644 --- a/mkdocs-local.yml +++ b/mkdocs-offline.yml @@ -1,7 +1,9 @@ INHERIT: mkdocs-common.yml -site_dir: docs-local -use_directory_urls: false +plugins: + - offline + +site_dir: docs-offline nav: - Introduction: diff --git a/mkdocs.yml b/mkdocs-online.yml similarity index 99% rename from mkdocs.yml rename to mkdocs-online.yml index d75186c46..2e4f2d1ca 100644 --- a/mkdocs.yml +++ b/mkdocs-online.yml @@ -4,7 +4,6 @@ site_url: https://textual.textualize.io/ edit_uri: edit/main/docs/ plugins: - - search: - blog: - rss: match_path: blog/posts/.* From 496667abedf7340cc217db75bfc924961f4c7280 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 10:29:20 +0000 Subject: [PATCH 09/52] Tidy up the Makefile a bit This removes the duplication of the screen cache cleaning, and also turns it into a target so you can do it yourself from the command line if needed. It also marks all the phony targets as such (that is, targets that aren't actually items in the filesystem). --- Makefile | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 44a28966a..c72c8d742 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,43 @@ +.PHONY: test test: pytest --cov-report term-missing --cov=textual tests/ -vv + +.PHONY: unit-test unit-test: pytest --cov-report term-missing --cov=textual tests/ -vv -m "not integration_test" + +.PHONY: test-snapshot-update test-snapshot-update: pytest --cov-report term-missing --cov=textual tests/ -vv --snapshot-update + +.PHONY: typecheck typecheck: mypy src/textual + +.PHONY: format format: black src + +.PHONY: format-check format-check: black --check src -docs-serve: + +.PHONY: clean-screenshot-cache +clean-screenshot-cache: rm -rf .screenshot_cache + +.PHONY: docs-serve +docs-serve: clean-screenshot-cache mkdocs serve --config-file mkdocs-online.yml + +.PHONY: docs-build docs-build: mkdocs build --config-file mkdocs-online.yml + +.PHONY: docs-build-offline docs-build-offline: mkdocs build --config-file mkdocs-offline.yml -docs-deploy: - rm -rf .screenshot_cache + +.PHONY: docs-deploy +docs-deploy: clean-screenshot-cache mkdocs gh-deploy From 19bde351a650b2a8ff5326405ebc66184679c6d9 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 10:52:46 +0000 Subject: [PATCH 10/52] Get search appearing again Search had gone from everywhere. Turns out that there's a very particular way you have to specify the plugins in YAML if you want to use INHERIT. --- mkdocs-common.yml | 36 ++++++++++++++++++------------------ mkdocs-offline.yml | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mkdocs-common.yml b/mkdocs-common.yml index 995a1aef9..231012723 100644 --- a/mkdocs-common.yml +++ b/mkdocs-common.yml @@ -62,26 +62,26 @@ theme: name: Switch to light mode plugins: - - search: - - autorefs: - - mkdocstrings: - custom_templates: docs/_templates - default_handler: python - handlers: - python: - options: - show_root_heading: true - show_root_full_path: false - show_source: false - filters: - - "!^_" - - "^__init__$" - - "!^can_replace$" + search: + autorefs: + mkdocstrings: + custom_templates: docs/_templates + default_handler: python + handlers: + python: + options: + show_root_heading: true + show_root_full_path: false + show_source: false + filters: + - "!^_" + - "^__init__$" + - "!^can_replace$" watch: - src/textual - - exclude: - glob: - - "**/_template.md" + exclude: + glob: + - "**/_template.md" extra_css: diff --git a/mkdocs-offline.yml b/mkdocs-offline.yml index 6a8a5b37e..417646d1d 100644 --- a/mkdocs-offline.yml +++ b/mkdocs-offline.yml @@ -1,7 +1,7 @@ INHERIT: mkdocs-common.yml plugins: - - offline + offline: site_dir: docs-offline From f2f33233d9ae53f240874539d05f1396af749498 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 13:25:12 +0000 Subject: [PATCH 11/52] Upgrade mkdocs-material --- poetry.lock | 168 +++++++++++++++++++++++++++++++++++++++---------- pyproject.toml | 2 +- 2 files changed, 135 insertions(+), 35 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7cd75899a..178f54a9c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -654,14 +654,14 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "identify" -version = "2.5.15" +version = "2.5.17" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.15-py2.py3-none-any.whl", hash = "sha256:1f4b36c5f50f3f950864b2a047308743f064eaa6f6645da5e5c780d1c7125487"}, - {file = "identify-2.5.15.tar.gz", hash = "sha256:c22aa206f47cc40486ecf585d27ad5f40adbfc494a3fa41dc3ed0499a23b123f"}, + {file = "identify-2.5.17-py2.py3-none-any.whl", hash = "sha256:7d526dd1283555aafcc91539acc061d8f6f59adb0a7bba462735b0a318bff7ed"}, + {file = "identify-2.5.17.tar.gz", hash = "sha256:93cc61a861052de9d4c541a7acb7e3dcc9c11b398a2144f6e52ae5285f5f4f06"}, ] [package.extras] @@ -920,23 +920,25 @@ mkdocs = "*" [[package]] name = "mkdocs-material" -version = "8.5.11" +version = "9.0.11" description = "Documentation that simply works" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_material-8.5.11-py3-none-any.whl", hash = "sha256:c907b4b052240a5778074a30a78f31a1f8ff82d7012356dc26898b97559f082e"}, - {file = "mkdocs_material-8.5.11.tar.gz", hash = "sha256:b0ea0513fd8cab323e8a825d6692ea07fa83e917bb5db042e523afecc7064ab7"}, + {file = "mkdocs_material-9.0.11-py3-none-any.whl", hash = "sha256:90a1e1ed41e90de5d0ab97c874b7bf6af488d0faf4aaea8e5868e01f3f1ed923"}, + {file = "mkdocs_material-9.0.11.tar.gz", hash = "sha256:aff49e4ce622a107ed563b3a6a37dc3660a45a0e4d9e7d4d2c13ce9dc02a7faf"}, ] [package.dependencies] -jinja2 = ">=3.0.2" +colorama = ">=0.4" +jinja2 = ">=3.0" markdown = ">=3.2" -mkdocs = ">=1.4.0" +mkdocs = ">=1.4.2" mkdocs-material-extensions = ">=1.1" -pygments = ">=2.12" -pymdown-extensions = ">=9.4" +pygments = ">=2.14" +pymdown-extensions = ">=9.9.1" +regex = ">=2022.4.24" requests = ">=2.26" [[package]] @@ -1215,14 +1217,14 @@ reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] @@ -1541,6 +1543,104 @@ files = [ [package.dependencies] pyyaml = "*" +[[package]] +name = "regex" +version = "2022.10.31" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, + {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, + {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, + {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, + {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, + {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, + {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, + {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, + {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, + {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, + {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, + {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, + {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, + {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, + {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, + {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, + {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, + {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, + {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, + {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, + {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, + {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, + {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, + {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, + {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, + {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, + {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, + {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, + {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, + {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, + {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, + {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, + {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, + {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, + {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, + {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, + {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, + {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, + {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, + {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, + {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, + {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, + {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, + {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, + {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, + {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, + {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, + {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, + {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, + {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, + {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, + {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, + {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, + {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, + {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, + {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, + {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, + {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, + {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, + {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, + {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, + {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, + {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, +] + [[package]] name = "requests" version = "2.28.2" @@ -1583,34 +1683,34 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "13.2.0" +version = "13.3.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.2.0-py3-none-any.whl", hash = "sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003"}, - {file = "rich-13.2.0.tar.gz", hash = "sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5"}, + {file = "rich-13.3.1-py3-none-any.whl", hash = "sha256:8aa57747f3fc3e977684f0176a88e789be314a99f99b43b75d1e9cb5dc6db9e9"}, + {file = "rich-13.3.1.tar.gz", hash = "sha256:125d96d20c92b946b983d0d392b84ff945461e5a06d3867e9f9e575f8697b67f"}, ] [package.dependencies] markdown-it-py = ">=2.1.0,<3.0.0" -pygments = ">=2.6.0,<3.0.0" +pygments = ">=2.14.0,<3.0.0" typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} [package.extras] -jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] +jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "setuptools" -version = "66.1.1" +version = "67.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, - {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, + {file = "setuptools-67.2.0-py3-none-any.whl", hash = "sha256:16ccf598aab3b506593c17378473978908a2734d7336755a8769b480906bec1c"}, + {file = "setuptools-67.2.0.tar.gz", hash = "sha256:b440ee5f7e607bb8c9de15259dba2583dd41a38879a7abc1d43a71c59524da48"}, ] [package.extras] @@ -1837,14 +1937,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.17.1" +version = "20.18.0" description = "Virtual Python Environment builder" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "virtualenv-20.17.1-py3-none-any.whl", hash = "sha256:ce3b1684d6e1a20a3e5ed36795a97dfc6af29bc3970ca8dab93e11ac6094b3c4"}, - {file = "virtualenv-20.17.1.tar.gz", hash = "sha256:f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058"}, + {file = "virtualenv-20.18.0-py3-none-any.whl", hash = "sha256:9d61e4ec8d2c0345dab329fb825eb05579043766a4b26a2f66b28948de68c722"}, + {file = "virtualenv-20.18.0.tar.gz", hash = "sha256:f262457a4d7298a6b733b920a196bf8b46c8af15bf1fd9da7142995eff15118e"}, ] [package.dependencies] @@ -1854,8 +1954,8 @@ importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} platformdirs = ">=2.4,<3" [package.extras] -docs = ["proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-argparse (>=0.3.2)", "sphinx-rtd-theme (>=1)", "towncrier (>=22.8)"] -testing = ["coverage (>=6.2)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=21.3)", "pytest (>=7.0.1)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.6.1)", "pytest-randomly (>=3.10.3)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] [[package]] name = "watchdog" @@ -1989,18 +2089,18 @@ typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "zipp" -version = "3.11.0" +version = "3.12.1" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, + {file = "zipp-3.12.1-py3-none-any.whl", hash = "sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3"}, + {file = "zipp-3.12.1.tar.gz", hash = "sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] @@ -2009,4 +2109,4 @@ dev = ["aiohttp", "click", "msgpack"] [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "b70dc64a3c9e7a7b765252f5dd1a5de8ed6efacd0695cde32ff983b14ec55ca6" +content-hash = "8b7c3330ea6ad356b3d0c2e0ee7a2bea7674b482982dc57fe36e88638ca0b4ce" diff --git a/pyproject.toml b/pyproject.toml index 6d283c933..3bfc8dbe4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ mypy = "^0.990" pytest-cov = "^2.12.1" mkdocs = "^1.3.0" mkdocstrings = {extras = ["python"], version = "^0.20.0"} -mkdocs-material = "^8.2.15" +mkdocs-material = "^9.0.11" pre-commit = "^2.13.0" pytest-aiohttp = "^1.0.4" time-machine = "^2.6.0" From 45af25a248afc509b697612283cf14844959f972 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 13:25:39 +0000 Subject: [PATCH 12/52] Use the privacy plugin when building the offline docs This has the effect of bundling up a bunch of files that would otherwise be pulled in from the net on the client side. As well as enhancing the viewer's privacy, it also means that we increase someone's ability to view documentation locally without the need for any sort of working net connection. --- mkdocs-offline.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs-offline.yml b/mkdocs-offline.yml index 417646d1d..16b3d7993 100644 --- a/mkdocs-offline.yml +++ b/mkdocs-offline.yml @@ -2,6 +2,7 @@ INHERIT: mkdocs-common.yml plugins: offline: + privacy: site_dir: docs-offline From fcd84c564c107ccadf47079dbe03afb8e44fee60 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Tue, 7 Feb 2023 16:46:34 +0000 Subject: [PATCH 13/52] Add a build command that also builds offline docs Also include them in the source tarball. --- Makefile | 4 ++++ pyproject.toml | 1 + 2 files changed, 5 insertions(+) diff --git a/Makefile b/Makefile index c72c8d742..d1fab0705 100644 --- a/Makefile +++ b/Makefile @@ -41,3 +41,7 @@ docs-build-offline: .PHONY: docs-deploy docs-deploy: clean-screenshot-cache mkdocs gh-deploy + +.PHONY: build +build: docs-build-offline + poetry build diff --git a/pyproject.toml b/pyproject.toml index 3bfc8dbe4..4dc9fedbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ include = [ "src/textual/py.typed", { path = "docs/examples", format = "sdist" }, + { path = "docs-offline/**/*", format = "sdist" }, { path = "tests", format = "sdist" } ] From e9fab413779a6f1e01b5b8fbdbff380fb29f7fc9 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 08:24:08 +0000 Subject: [PATCH 14/52] Relock Updating mkdocs insiders' on my personal machine so I can test building docs there and it wanted to relock again. --- poetry.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 178f54a9c..cf9699dca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1280,22 +1280,22 @@ files = [ [[package]] name = "platformdirs" -version = "2.6.2" +version = "3.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, + {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, ] [package.dependencies] typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -1937,21 +1937,21 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.18.0" +version = "20.19.0" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.18.0-py3-none-any.whl", hash = "sha256:9d61e4ec8d2c0345dab329fb825eb05579043766a4b26a2f66b28948de68c722"}, - {file = "virtualenv-20.18.0.tar.gz", hash = "sha256:f262457a4d7298a6b733b920a196bf8b46c8af15bf1fd9da7142995eff15118e"}, + {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, + {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, ] [package.dependencies] distlib = ">=0.3.6,<1" filelock = ">=3.4.1,<4" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} -platformdirs = ">=2.4,<3" +platformdirs = ">=2.4,<4" [package.extras] docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] From 4055373725165495153910d74561ef3e1be2c3ba Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 08:24:50 +0000 Subject: [PATCH 15/52] Add a Makefile target for cleaning up the offline docs Sometimes I want to be able to test from a fresh start, so this will be helpful. --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index d1fab0705..cdc58649e 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,10 @@ docs-build: docs-build-offline: mkdocs build --config-file mkdocs-offline.yml +.PHONY: clean-offline-docs +clean-offline-docs: + rm -rf docs-offline + .PHONY: docs-deploy docs-deploy: clean-screenshot-cache mkdocs gh-deploy From 9500fa925a49c90bb7ad603f1c8a81deb6bf7cd9 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 08:26:34 +0000 Subject: [PATCH 16/52] Add a Makefile target that cleans everything cleanable --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index cdc58649e..08665bd2c 100644 --- a/Makefile +++ b/Makefile @@ -49,3 +49,6 @@ docs-deploy: clean-screenshot-cache .PHONY: build build: docs-build-offline poetry build + +.PHONY: clean +clean: clean-screenshot-cache clean-offline-docs From fb5346c8943c493758b0213113d0e88617be5579 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 08:40:47 +0000 Subject: [PATCH 17/52] Don't show the repository stats in offline mode They require a connection, which isn't very offline... --- mkdocs-common.yml | 2 -- mkdocs-online.yml | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mkdocs-common.yml b/mkdocs-common.yml index 231012723..5b21dd4fc 100644 --- a/mkdocs-common.yml +++ b/mkdocs-common.yml @@ -1,7 +1,5 @@ site_name: Textual -repo_url: https://github.com/textualize/textual/ - markdown_extensions: - attr_list - pymdownx.emoji: diff --git a/mkdocs-online.yml b/mkdocs-online.yml index 2e4f2d1ca..57b7e98f5 100644 --- a/mkdocs-online.yml +++ b/mkdocs-online.yml @@ -1,5 +1,6 @@ INHERIT: mkdocs-common.yml +repo_url: https://github.com/textualize/textual/ site_url: https://textual.textualize.io/ edit_uri: edit/main/docs/ From 93f449366fcb6f12585d885ba9c407086cc58f2e Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 08:41:16 +0000 Subject: [PATCH 18/52] Modify blog/rss plugin config to make search work again Inheriting config for mkdocs requires that you use key/value pairs for the plugins not a list of objects. --- mkdocs-online.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mkdocs-online.yml b/mkdocs-online.yml index 57b7e98f5..274f90ee9 100644 --- a/mkdocs-online.yml +++ b/mkdocs-online.yml @@ -5,15 +5,15 @@ site_url: https://textual.textualize.io/ edit_uri: edit/main/docs/ plugins: - - blog: - - rss: - match_path: blog/posts/.* - date_from_meta: - as_creation: date - categories: - - categories - - release - - tags + blog: + rss: + match_path: blog/posts/.* + date_from_meta: + as_creation: date + categories: + - categories + - release + - tags nav: - Introduction: From fbdbd8928dd39ce14ae385ff27ba58ce48997733 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 09:46:47 +0000 Subject: [PATCH 19/52] Always `poetry run` commands that need a venv It's a `Makefile` so it's handy to not have to think about if you need to be within a poetry venv when running `make`. This commit adds a `poetry run` before any command that needs the venv. This means that people who aren't in a venv can just `make something` and it'll "just work", and the same is true for those who are in a venv. --- Makefile | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 08665bd2c..22c059f59 100644 --- a/Makefile +++ b/Makefile @@ -1,26 +1,28 @@ +run := poetry run + .PHONY: test test: - pytest --cov-report term-missing --cov=textual tests/ -vv + $(run) pytest --cov-report term-missing --cov=textual tests/ -vv .PHONY: unit-test unit-test: - pytest --cov-report term-missing --cov=textual tests/ -vv -m "not integration_test" + $(run) pytest --cov-report term-missing --cov=textual tests/ -vv -m "not integration_test" .PHONY: test-snapshot-update test-snapshot-update: - pytest --cov-report term-missing --cov=textual tests/ -vv --snapshot-update + $(run) pytest --cov-report term-missing --cov=textual tests/ -vv --snapshot-update .PHONY: typecheck typecheck: - mypy src/textual + $(run) mypy src/textual .PHONY: format format: - black src + $(run) black src .PHONY: format-check format-check: - black --check src + $(run) black --check src .PHONY: clean-screenshot-cache clean-screenshot-cache: @@ -28,15 +30,15 @@ clean-screenshot-cache: .PHONY: docs-serve docs-serve: clean-screenshot-cache - mkdocs serve --config-file mkdocs-online.yml + $(run) mkdocs serve --config-file mkdocs-online.yml .PHONY: docs-build docs-build: - mkdocs build --config-file mkdocs-online.yml + $(run) mkdocs build --config-file mkdocs-online.yml .PHONY: docs-build-offline docs-build-offline: - mkdocs build --config-file mkdocs-offline.yml + $(run) mkdocs build --config-file mkdocs-offline.yml .PHONY: clean-offline-docs clean-offline-docs: @@ -44,7 +46,7 @@ clean-offline-docs: .PHONY: docs-deploy docs-deploy: clean-screenshot-cache - mkdocs gh-deploy + $(run) mkdocs gh-deploy .PHONY: build build: docs-build-offline From 35be18f0e6524a88e31450ba26c1126a7c1308fd Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 10:00:48 +0000 Subject: [PATCH 20/52] Explain the elaborate include path for docs in pyproject.toml While it's still fresh in my mind as to why I wrote it like this, comment to the effect so I'm not surprised by it in the future, or so someone else reading it can know what the thinking was here. --- pyproject.toml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4dc9fedbf..086780ec1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,8 +24,13 @@ classifiers = [ include = [ "src/textual/py.typed", { path = "docs/examples", format = "sdist" }, - { path = "docs-offline/**/*", format = "sdist" }, - { path = "tests", format = "sdist" } + { path = "tests", format = "sdist" }, + # The reason for the slightly convoluted path specification here is that + # poetry populates the exclude list with the content of .gitignore, and + # it also seems like exclude tumps include. So here we specify that we + # want to package up the content of the docs-offline directory in a way + # that works around that. + { path = "docs-offline/**/*", format = "sdist" } ] [tool.poetry.scripts] From 5e172dd6357d7d35635ae6b16db3cea619b07592 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 10:02:02 +0000 Subject: [PATCH 21/52] Fully exclude the blog files from the offline docs build The blog files were still getting included and packages, just not linked to from the resulting "site". This meant that the final tarball was much bigger than it needed to be, due to animated gifs and movs an the like. This brings the tarball down from around 27M to 6.4M. --- mkdocs-offline.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mkdocs-offline.yml b/mkdocs-offline.yml index 16b3d7993..228d03b9f 100644 --- a/mkdocs-offline.yml +++ b/mkdocs-offline.yml @@ -3,6 +3,10 @@ INHERIT: mkdocs-common.yml plugins: offline: privacy: + exclude: + glob: + - "**/_template.md" + - blog/* site_dir: docs-offline From a295c5f9687ce4ce2ddcae373d6889ae48bfe351 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 14:36:56 +0000 Subject: [PATCH 22/52] Work towards having a single nav file The idea here is that there is a single file for the nav for all the docs, both online and offline. The nav will be the full online nav in all its blog glory, and then the build system will strip out the nav items relating to the blog when building the offline version. There's a wrinkle or two still in here; the main one being that when doing a docs-serve, it seems that the cleaning up of the online nav doesn't happen when you Ctrl-C out of the server. I'm not 100% sure of the cause of this (there could be a couple of different reasons). For now... I'm ensuring that the online/offline nav files are excluded from git. It would be nice to find out how best to always ensure that the online nav file is removed so nobody attempting to update the docs gets confused about what to edit. --- .gitignore | 2 + Makefile | 25 +++++-- mkdocs-nav.yml | 175 ++++++++++++++++++++++++++++++++++++++++++++ mkdocs-offline.yml | 172 -------------------------------------------- mkdocs-online.yml | 176 --------------------------------------------- 5 files changed, 196 insertions(+), 354 deletions(-) create mode 100644 mkdocs-nav.yml diff --git a/.gitignore b/.gitignore index 61f16442a..d0620ea4a 100644 --- a/.gitignore +++ b/.gitignore @@ -111,6 +111,8 @@ venv.bak/ # mkdocs documentation /site /docs-offline +/mkdocs-nav-online.yml +/mkdocs-nav-offline.yml # mypy .mypy_cache/ diff --git a/Makefile b/Makefile index 22c059f59..788471e86 100644 --- a/Makefile +++ b/Makefile @@ -28,17 +28,30 @@ format-check: clean-screenshot-cache: rm -rf .screenshot_cache +.PHONY: docs-offline-nav +docs-offline-nav: + echo "INHERIT: mkdocs-offline.yml" > mkdocs-nav-offline.yml + grep -v "\- \"*[Bb]log" mkdocs-nav.yml >> mkdocs-nav-offline.yml + +.PHONY: docs-online-nav +docs-online-nav: + echo "INHERIT: mkdocs-online.yml" > mkdocs-nav-online.yml + cat mkdocs-nav.yml >> mkdocs-nav-online.yml + .PHONY: docs-serve -docs-serve: clean-screenshot-cache - $(run) mkdocs serve --config-file mkdocs-online.yml +docs-serve: clean-screenshot-cache docs-online-nav + $(run) mkdocs serve --config-file mkdocs-nav-online.yml + rm -f mkdocs-nav-online.yml .PHONY: docs-build -docs-build: - $(run) mkdocs build --config-file mkdocs-online.yml +docs-build: docs-online-nav + $(run) mkdocs build --config-file mkdocs-nav-online.yml + rm -f mkdocs-nav-online.yml .PHONY: docs-build-offline -docs-build-offline: - $(run) mkdocs build --config-file mkdocs-offline.yml +docs-build-offline: docs-offline-nav + $(run) mkdocs build --config-file mkdocs-nav-offline.yml + rm -f mkdocs-nav-offline.yml .PHONY: clean-offline-docs clean-offline-docs: diff --git a/mkdocs-nav.yml b/mkdocs-nav.yml new file mode 100644 index 000000000..e453e9276 --- /dev/null +++ b/mkdocs-nav.yml @@ -0,0 +1,175 @@ +nav: + - Introduction: + - "index.md" + - "getting_started.md" + - "help.md" + - "tutorial.md" + - Guide: + - "guide/index.md" + - "guide/devtools.md" + - "guide/app.md" + - "guide/styles.md" + - "guide/CSS.md" + - "guide/design.md" + - "guide/queries.md" + - "guide/layout.md" + - "guide/events.md" + - "guide/input.md" + - "guide/actions.md" + - "guide/reactivity.md" + - "guide/widgets.md" + - "guide/animation.md" + - "guide/screens.md" + - "roadmap.md" + - Reference: + - "reference/index.md" + - CSS Types: + - "css_types/index.md" + - "css_types/border.md" + - "css_types/color.md" + - "css_types/horizontal.md" + - "css_types/integer.md" + - "css_types/name.md" + - "css_types/number.md" + - "css_types/overflow.md" + - "css_types/percentage.md" + - "css_types/scalar.md" + - "css_types/text_align.md" + - "css_types/text_style.md" + - "css_types/vertical.md" + - Events: + - "events/index.md" + - "events/blur.md" + - "events/descendant_blur.md" + - "events/descendant_focus.md" + - "events/enter.md" + - "events/focus.md" + - "events/hide.md" + - "events/key.md" + - "events/leave.md" + - "events/load.md" + - "events/mount.md" + - "events/mouse_capture.md" + - "events/click.md" + - "events/mouse_down.md" + - "events/mouse_move.md" + - "events/mouse_release.md" + - "events/mouse_scroll_down.md" + - "events/mouse_scroll_up.md" + - "events/mouse_up.md" + - "events/paste.md" + - "events/resize.md" + - "events/screen_resume.md" + - "events/screen_suspend.md" + - "events/show.md" + - Styles: + - "styles/index.md" + - "styles/align.md" + - "styles/background.md" + - "styles/border.md" + - "styles/box_sizing.md" + - "styles/color.md" + - "styles/content_align.md" + - "styles/display.md" + - "styles/dock.md" + - Grid: + - "styles/grid/index.md" + - "styles/grid/column_span.md" + - "styles/grid/grid_columns.md" + - "styles/grid/grid_gutter.md" + - "styles/grid/grid_rows.md" + - "styles/grid/grid_size.md" + - "styles/grid/row_span.md" + - "styles/height.md" + - "styles/layer.md" + - "styles/layers.md" + - "styles/layout.md" + - Links: + - "styles/links/index.md" + - "styles/links/link_background.md" + - "styles/links/link_color.md" + - "styles/links/link_hover_background.md" + - "styles/links/link_hover_color.md" + - "styles/links/link_hover_style.md" + - "styles/links/link_style.md" + - "styles/margin.md" + - "styles/max_height.md" + - "styles/max_width.md" + - "styles/min_height.md" + - "styles/min_width.md" + - "styles/offset.md" + - "styles/opacity.md" + - "styles/outline.md" + - "styles/overflow.md" + - "styles/padding.md" + - Scrollbar colors: + - "styles/scrollbar_colors/index.md" + - "styles/scrollbar_colors/scrollbar_background.md" + - "styles/scrollbar_colors/scrollbar_background_active.md" + - "styles/scrollbar_colors/scrollbar_background_hover.md" + - "styles/scrollbar_colors/scrollbar_color.md" + - "styles/scrollbar_colors/scrollbar_color_active.md" + - "styles/scrollbar_colors/scrollbar_color_hover.md" + - "styles/scrollbar_colors/scrollbar_corner_color.md" + - "styles/scrollbar_gutter.md" + - "styles/scrollbar_size.md" + - "styles/text_align.md" + - "styles/text_opacity.md" + - "styles/text_style.md" + - "styles/tint.md" + - "styles/visibility.md" + - "styles/width.md" + - Widgets: + - "widgets/button.md" + - "widgets/checkbox.md" + - "widgets/data_table.md" + - "widgets/directory_tree.md" + - "widgets/footer.md" + - "widgets/header.md" + - "widgets/index.md" + - "widgets/input.md" + - "widgets/label.md" + - "widgets/list_item.md" + - "widgets/list_view.md" + - "widgets/placeholder.md" + - "widgets/static.md" + - "widgets/text_log.md" + - "widgets/tree.md" + - API: + - "api/index.md" + - "api/app.md" + - "api/binding.md" + - "api/button.md" + - "api/checkbox.md" + - "api/color.md" + - "api/containers.md" + - "api/coordinate.md" + - "api/data_table.md" + - "api/directory_tree.md" + - "api/dom_node.md" + - "api/events.md" + - "api/footer.md" + - "api/geometry.md" + - "api/header.md" + - "api/input.md" + - "api/label.md" + - "api/list_view.md" + - "api/list_item.md" + - "api/message_pump.md" + - "api/message.md" + - "api/pilot.md" + - "api/placeholder.md" + - "api/query.md" + - "api/reactive.md" + - "api/screen.md" + - "api/scroll_view.md" + - "api/static.md" + - "api/strip.md" + - "api/text_log.md" + - "api/timer.md" + - "api/tree.md" + - "api/tree_node.md" + - "api/walk.md" + - "api/widget.md" + - "Blog": + - blog/index.md diff --git a/mkdocs-offline.yml b/mkdocs-offline.yml index 228d03b9f..0d367af42 100644 --- a/mkdocs-offline.yml +++ b/mkdocs-offline.yml @@ -9,175 +9,3 @@ plugins: - blog/* site_dir: docs-offline - -nav: - - Introduction: - - "index.md" - - "getting_started.md" - - "help.md" - - "tutorial.md" - - Guide: - - "guide/index.md" - - "guide/devtools.md" - - "guide/app.md" - - "guide/styles.md" - - "guide/CSS.md" - - "guide/design.md" - - "guide/queries.md" - - "guide/layout.md" - - "guide/events.md" - - "guide/input.md" - - "guide/actions.md" - - "guide/reactivity.md" - - "guide/widgets.md" - - "guide/animation.md" - - "guide/screens.md" - - "roadmap.md" - - Reference: - - "reference/index.md" - - CSS Types: - - "css_types/index.md" - - "css_types/border.md" - - "css_types/color.md" - - "css_types/horizontal.md" - - "css_types/integer.md" - - "css_types/name.md" - - "css_types/number.md" - - "css_types/overflow.md" - - "css_types/percentage.md" - - "css_types/scalar.md" - - "css_types/text_align.md" - - "css_types/text_style.md" - - "css_types/vertical.md" - - Events: - - "events/index.md" - - "events/blur.md" - - "events/descendant_blur.md" - - "events/descendant_focus.md" - - "events/enter.md" - - "events/focus.md" - - "events/hide.md" - - "events/key.md" - - "events/leave.md" - - "events/load.md" - - "events/mount.md" - - "events/mouse_capture.md" - - "events/click.md" - - "events/mouse_down.md" - - "events/mouse_move.md" - - "events/mouse_release.md" - - "events/mouse_scroll_down.md" - - "events/mouse_scroll_up.md" - - "events/mouse_up.md" - - "events/paste.md" - - "events/resize.md" - - "events/screen_resume.md" - - "events/screen_suspend.md" - - "events/show.md" - - Styles: - - "styles/index.md" - - "styles/align.md" - - "styles/background.md" - - "styles/border.md" - - "styles/box_sizing.md" - - "styles/color.md" - - "styles/content_align.md" - - "styles/display.md" - - "styles/dock.md" - - Grid: - - "styles/grid/index.md" - - "styles/grid/column_span.md" - - "styles/grid/grid_columns.md" - - "styles/grid/grid_gutter.md" - - "styles/grid/grid_rows.md" - - "styles/grid/grid_size.md" - - "styles/grid/row_span.md" - - "styles/height.md" - - "styles/layer.md" - - "styles/layers.md" - - "styles/layout.md" - - Links: - - "styles/links/index.md" - - "styles/links/link_background.md" - - "styles/links/link_color.md" - - "styles/links/link_hover_background.md" - - "styles/links/link_hover_color.md" - - "styles/links/link_hover_style.md" - - "styles/links/link_style.md" - - "styles/margin.md" - - "styles/max_height.md" - - "styles/max_width.md" - - "styles/min_height.md" - - "styles/min_width.md" - - "styles/offset.md" - - "styles/opacity.md" - - "styles/outline.md" - - "styles/overflow.md" - - "styles/padding.md" - - Scrollbar colors: - - "styles/scrollbar_colors/index.md" - - "styles/scrollbar_colors/scrollbar_background.md" - - "styles/scrollbar_colors/scrollbar_background_active.md" - - "styles/scrollbar_colors/scrollbar_background_hover.md" - - "styles/scrollbar_colors/scrollbar_color.md" - - "styles/scrollbar_colors/scrollbar_color_active.md" - - "styles/scrollbar_colors/scrollbar_color_hover.md" - - "styles/scrollbar_colors/scrollbar_corner_color.md" - - "styles/scrollbar_gutter.md" - - "styles/scrollbar_size.md" - - "styles/text_align.md" - - "styles/text_opacity.md" - - "styles/text_style.md" - - "styles/tint.md" - - "styles/visibility.md" - - "styles/width.md" - - Widgets: - - "widgets/button.md" - - "widgets/checkbox.md" - - "widgets/data_table.md" - - "widgets/directory_tree.md" - - "widgets/footer.md" - - "widgets/header.md" - - "widgets/index.md" - - "widgets/input.md" - - "widgets/label.md" - - "widgets/list_item.md" - - "widgets/list_view.md" - - "widgets/placeholder.md" - - "widgets/static.md" - - "widgets/text_log.md" - - "widgets/tree.md" - - API: - - "api/index.md" - - "api/app.md" - - "api/binding.md" - - "api/button.md" - - "api/checkbox.md" - - "api/color.md" - - "api/containers.md" - - "api/coordinate.md" - - "api/data_table.md" - - "api/directory_tree.md" - - "api/dom_node.md" - - "api/events.md" - - "api/footer.md" - - "api/geometry.md" - - "api/header.md" - - "api/input.md" - - "api/label.md" - - "api/list_view.md" - - "api/list_item.md" - - "api/message_pump.md" - - "api/message.md" - - "api/pilot.md" - - "api/placeholder.md" - - "api/query.md" - - "api/reactive.md" - - "api/screen.md" - - "api/static.md" - - "api/text_log.md" - - "api/timer.md" - - "api/tree.md" - - "api/tree_node.md" - - "api/walk.md" - - "api/widget.md" diff --git a/mkdocs-online.yml b/mkdocs-online.yml index f35acfe80..58aea3fc7 100644 --- a/mkdocs-online.yml +++ b/mkdocs-online.yml @@ -14,179 +14,3 @@ plugins: - categories - release - tags - -nav: - - Introduction: - - "index.md" - - "getting_started.md" - - "help.md" - - "tutorial.md" - - Guide: - - "guide/index.md" - - "guide/devtools.md" - - "guide/app.md" - - "guide/styles.md" - - "guide/CSS.md" - - "guide/design.md" - - "guide/queries.md" - - "guide/layout.md" - - "guide/events.md" - - "guide/input.md" - - "guide/actions.md" - - "guide/reactivity.md" - - "guide/widgets.md" - - "guide/animation.md" - - "guide/screens.md" - - "roadmap.md" - - Reference: - - "reference/index.md" - - CSS Types: - - "css_types/index.md" - - "css_types/border.md" - - "css_types/color.md" - - "css_types/horizontal.md" - - "css_types/integer.md" - - "css_types/name.md" - - "css_types/number.md" - - "css_types/overflow.md" - - "css_types/percentage.md" - - "css_types/scalar.md" - - "css_types/text_align.md" - - "css_types/text_style.md" - - "css_types/vertical.md" - - Events: - - "events/index.md" - - "events/blur.md" - - "events/descendant_blur.md" - - "events/descendant_focus.md" - - "events/enter.md" - - "events/focus.md" - - "events/hide.md" - - "events/key.md" - - "events/leave.md" - - "events/load.md" - - "events/mount.md" - - "events/mouse_capture.md" - - "events/click.md" - - "events/mouse_down.md" - - "events/mouse_move.md" - - "events/mouse_release.md" - - "events/mouse_scroll_down.md" - - "events/mouse_scroll_up.md" - - "events/mouse_up.md" - - "events/paste.md" - - "events/resize.md" - - "events/screen_resume.md" - - "events/screen_suspend.md" - - "events/show.md" - - Styles: - - "styles/index.md" - - "styles/align.md" - - "styles/background.md" - - "styles/border.md" - - "styles/box_sizing.md" - - "styles/color.md" - - "styles/content_align.md" - - "styles/display.md" - - "styles/dock.md" - - Grid: - - "styles/grid/index.md" - - "styles/grid/column_span.md" - - "styles/grid/grid_columns.md" - - "styles/grid/grid_gutter.md" - - "styles/grid/grid_rows.md" - - "styles/grid/grid_size.md" - - "styles/grid/row_span.md" - - "styles/height.md" - - "styles/layer.md" - - "styles/layers.md" - - "styles/layout.md" - - Links: - - "styles/links/index.md" - - "styles/links/link_background.md" - - "styles/links/link_color.md" - - "styles/links/link_hover_background.md" - - "styles/links/link_hover_color.md" - - "styles/links/link_hover_style.md" - - "styles/links/link_style.md" - - "styles/margin.md" - - "styles/max_height.md" - - "styles/max_width.md" - - "styles/min_height.md" - - "styles/min_width.md" - - "styles/offset.md" - - "styles/opacity.md" - - "styles/outline.md" - - "styles/overflow.md" - - "styles/padding.md" - - Scrollbar colors: - - "styles/scrollbar_colors/index.md" - - "styles/scrollbar_colors/scrollbar_background.md" - - "styles/scrollbar_colors/scrollbar_background_active.md" - - "styles/scrollbar_colors/scrollbar_background_hover.md" - - "styles/scrollbar_colors/scrollbar_color.md" - - "styles/scrollbar_colors/scrollbar_color_active.md" - - "styles/scrollbar_colors/scrollbar_color_hover.md" - - "styles/scrollbar_colors/scrollbar_corner_color.md" - - "styles/scrollbar_gutter.md" - - "styles/scrollbar_size.md" - - "styles/text_align.md" - - "styles/text_opacity.md" - - "styles/text_style.md" - - "styles/tint.md" - - "styles/visibility.md" - - "styles/width.md" - - Widgets: - - "widgets/button.md" - - "widgets/checkbox.md" - - "widgets/data_table.md" - - "widgets/directory_tree.md" - - "widgets/footer.md" - - "widgets/header.md" - - "widgets/index.md" - - "widgets/input.md" - - "widgets/label.md" - - "widgets/list_item.md" - - "widgets/list_view.md" - - "widgets/placeholder.md" - - "widgets/static.md" - - "widgets/text_log.md" - - "widgets/tree.md" - - API: - - "api/index.md" - - "api/app.md" - - "api/binding.md" - - "api/button.md" - - "api/checkbox.md" - - "api/color.md" - - "api/containers.md" - - "api/coordinate.md" - - "api/data_table.md" - - "api/directory_tree.md" - - "api/dom_node.md" - - "api/events.md" - - "api/footer.md" - - "api/geometry.md" - - "api/header.md" - - "api/input.md" - - "api/label.md" - - "api/list_view.md" - - "api/list_item.md" - - "api/message_pump.md" - - "api/message.md" - - "api/pilot.md" - - "api/placeholder.md" - - "api/query.md" - - "api/reactive.md" - - "api/screen.md" - - "api/scroll_view.md" - - "api/static.md" - - "api/strip.md" - - "api/text_log.md" - - "api/timer.md" - - "api/tree.md" - - "api/tree_node.md" - - "api/walk.md" - - "api/widget.md" - - "Blog": - - blog/index.md From 5376b015f58bdf8eed5af54f5331ca759eb869dc Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Wed, 8 Feb 2023 14:58:06 +0000 Subject: [PATCH 23/52] Bring the docs deployment target into the new approach This one's a little vague right now, and I'm not sure how best to test this. Looking at the mkdocs documentation it isn't clear to me that you *can* provide the config file to the gh-build command, but there's example command lines in the docs showing that you can. Need to see if there's a safe way to test this out -- the last thing I want to do is nuke our website. --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 788471e86..6daaa8e39 100644 --- a/Makefile +++ b/Makefile @@ -58,8 +58,9 @@ clean-offline-docs: rm -rf docs-offline .PHONY: docs-deploy -docs-deploy: clean-screenshot-cache - $(run) mkdocs gh-deploy +docs-deploy: clean-screenshot-cache docs-online-nav + $(run) mkdocs gh-deploy --config-file mkdocs-nav-online.yml + rm -f mkdocs-nav-online.yml .PHONY: build build: docs-build-offline From 1956f7f9d768f888ae437857af44108c1528a3f8 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 15:36:04 +0000 Subject: [PATCH 24/52] Rename the switch--switch component class to switch--slider Following on from #1751: originally Switch was called Checkbox and the moving part was, for the component class, called a checkbox--switch; after renaming the widget to Switch that component class ended up being switch--switch; which wasn't ideal. We decided to go with it as-is, but I just realised that internally the code calls it a slider. So this leans into that and I'm renaming the component class switch--slider. This removes the doubling-up of the name and also makes the code more consistent. --- docs/examples/widgets/switch.css | 2 +- src/textual/widgets/_switch.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/examples/widgets/switch.css b/docs/examples/widgets/switch.css index fb6a0d220..20fd57ba8 100644 --- a/docs/examples/widgets/switch.css +++ b/docs/examples/widgets/switch.css @@ -22,7 +22,7 @@ Switch { background: darkslategrey; } -#custom-design > .switch--switch { +#custom-design > .switch--slider { color: dodgerblue; background: darkslateblue; } diff --git a/src/textual/widgets/_switch.py b/src/textual/widgets/_switch.py index cdc9f21a6..f6aa88601 100644 --- a/src/textual/widgets/_switch.py +++ b/src/textual/widgets/_switch.py @@ -31,12 +31,12 @@ class Switch(Widget, can_focus=True): """ COMPONENT_CLASSES: ClassVar[set[str]] = { - "switch--switch", + "switch--slider", } """ | Class | Description | | :- | :- | - | `switch--switch` | Targets the switch of the switch. | + | `switch--slider` | Targets the slider of the switch. | """ DEFAULT_CSS = """ @@ -48,7 +48,7 @@ class Switch(Widget, can_focus=True): padding: 0 2; } - Switch > .switch--switch { + Switch > .switch--slider { background: $panel-darken-2; color: $panel-lighten-2; } @@ -65,7 +65,7 @@ class Switch(Widget, can_focus=True): } - Switch.-on > .switch--switch { + Switch.-on > .switch--slider { color: $success; } """ @@ -128,7 +128,7 @@ class Switch(Widget, can_focus=True): self.set_class(slider_pos == 1, "-on") def render(self) -> RenderableType: - style = self.get_component_rich_style("switch--switch") + style = self.get_component_rich_style("switch--slider") return ScrollBarRender( virtual_size=100, window_size=50, From 451fa3e50a06fce87c789535c36d4a2589918d62 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 15:52:14 +0000 Subject: [PATCH 25/52] Fix a typo --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ba65722f6..954588fbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ include = [ { path = "tests", format = "sdist" }, # The reason for the slightly convoluted path specification here is that # poetry populates the exclude list with the content of .gitignore, and - # it also seems like exclude tumps include. So here we specify that we + # it also seems like exclude trumps include. So here we specify that we # want to package up the content of the docs-offline directory in a way # that works around that. { path = "docs-offline/**/*", format = "sdist" } From be9e34ba9a0e6dd309b70e2f3031dd50b5660880 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 16:06:00 +0000 Subject: [PATCH 26/52] Switch docstring additions and tweaks --- src/textual/widgets/_switch.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/textual/widgets/_switch.py b/src/textual/widgets/_switch.py index f6aa88601..c0a01188f 100644 --- a/src/textual/widgets/_switch.py +++ b/src/textual/widgets/_switch.py @@ -144,12 +144,17 @@ class Switch(Widget, can_focus=True): return 1 def on_click(self) -> None: + """Toggle the state of the switch.""" self.toggle() def action_toggle(self) -> None: + """Toggle the state of the switch.""" self.toggle() def toggle(self) -> None: - """Toggle the switch value. As a result of the value changing, - a Switch.Changed message will be posted.""" + """Toggle the switch value. + + As a result of the value changing, a `Switch.Changed` message will + be posted. + """ self.value = not self.value From 9dc0a4b57df9f99174cc52db4aba02303ef3964a Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 16:18:34 +0000 Subject: [PATCH 27/52] Add setup and update targets to the Makefile Simply adds `make setup` as a shorthand for running the poetry command that does the initial install for local development, and also `make update` to do a package update. Simply aimed as handy extras for development. --- Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Makefile b/Makefile index 6daaa8e39..de1bea195 100644 --- a/Makefile +++ b/Makefile @@ -68,3 +68,11 @@ build: docs-build-offline .PHONY: clean clean: clean-screenshot-cache clean-offline-docs + +.PHONY: setup +setup: + poetry install --extras dev + +.PHONY: update +update: + poetry update From e8d8c9352795ab1e7357a841f8470a674a3759a8 Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 16:25:53 +0000 Subject: [PATCH 28/52] Remove hatch.toml --- hatch.toml | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 hatch.toml diff --git a/hatch.toml b/hatch.toml deleted file mode 100644 index 1e25a12b1..000000000 --- a/hatch.toml +++ /dev/null @@ -1,38 +0,0 @@ -[envs.default] -features = ["dev"] -dependencies = [ - "jinja2 < 3.1.0", - "pytest >= 7.1.3, <8", - "pytest-aiohttp >= 1.0.4, <2", - "pytest-cov >= 2.12.1, <3", - "syrupy >= 3.0.0, <4", - "time-machine >= 2.6.0, <3", -] -[envs.default.scripts] -test = "pytest --cov-report term-missing --cov=textual tests/ -vv" -test-snapshot-update = "pytest --cov-report term-missing --cov=textual tests/ -vv --snapshot-update" -unit-test = 'pytest --cov-report term-missing --cov=textual tests/ -vv -m "not integration_test"' - -[envs.lint] -detached = true -dependencies = [ - "black >= 22.3.0, <23", - "mypy >= 0.982, <1", - "pre-commit >= 2.12.1, <3", -] -[envs.lint.scripts] -format = "black src" -check = "black --check src" -typing = "mypy src/textual" - -[envs.docs] -dependencies = [ - "mkdocs >= 1.3.0, <2", - "mkdocs-material >= 8.2.15, <9", - "mkdocstrings[python] >= 0.19.0, <1", -] -[envs.docs.scripts] -build = "mkdocs build" -deploy = "mkdocs gh-deploy" -serve = "mkdocs serve" -help = "mkdocs --help" From f9a5b2a0e8282b005fe8d9779a9d034f70727bb4 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Feb 2023 17:27:39 +0000 Subject: [PATCH 29/52] typing fixes --- pyproject.toml | 1 + src/textual/_border.py | 2 +- src/textual/css/_style_properties.py | 44 +++++---- src/textual/css/_styles_builder.py | 45 +++++---- src/textual/css/model.py | 3 +- src/textual/css/parse.py | 3 +- src/textual/css/styles.py | 137 +++++++++++++-------------- src/textual/css/stylesheet.py | 4 +- src/textual/dom.py | 6 +- src/textual/drivers/win32.py | 10 +- src/textual/file_monitor.py | 4 +- src/textual/scroll_view.py | 12 +-- src/textual/widget.py | 19 ++-- src/textual/widgets/_tree.py | 13 +-- 14 files changed, 162 insertions(+), 141 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1d8d28a24..5f7ca9aa4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,7 @@ syrupy = "^3.0.0" mkdocs-rss-plugin = "^1.5.0" httpx = "^0.23.1" msgpack-types = "^0.2.0" +types-setuptools = "^67.2.0.1" [tool.black] includes = "src" diff --git a/src/textual/_border.py b/src/textual/_border.py index 2da79b0ee..1a0c10ea0 100644 --- a/src/textual/_border.py +++ b/src/textual/_border.py @@ -191,7 +191,7 @@ BORDER_LOCATIONS: dict[ INVISIBLE_EDGE_TYPES = cast("frozenset[EdgeType]", frozenset(("", "none", "hidden"))) -BorderValue: TypeAlias = Tuple[EdgeType, Union[str, Color, Style]] +BorderValue: TypeAlias = Tuple[EdgeType, Color] BoxSegments: TypeAlias = Tuple[ Tuple[Segment, Segment, Segment], diff --git a/src/textual/css/_style_properties.py b/src/textual/css/_style_properties.py index f69d10f16..f892ac4b9 100644 --- a/src/textual/css/_style_properties.py +++ b/src/textual/css/_style_properties.py @@ -10,11 +10,12 @@ when setting and getting. from __future__ import annotations from operator import attrgetter -from typing import TYPE_CHECKING, Generic, Iterable, NamedTuple, TypeVar, cast +from typing import TYPE_CHECKING, Generic, Iterable, NamedTuple, Sequence, TypeVar, cast import rich.errors import rich.repr from rich.style import Style +from typing_extensions import TypeAlias from .._border import normalize_border_value from ..color import Color, ColorParseError @@ -51,7 +52,7 @@ if TYPE_CHECKING: from .types import AlignHorizontal, AlignVertical, DockEdge, EdgeType -BorderDefinition = ( +BorderDefinition: TypeAlias = ( "Sequence[tuple[EdgeType, str | Color] | None] | tuple[EdgeType, str | Color]" ) @@ -153,7 +154,7 @@ class ScalarProperty: Returns: The Scalar object or ``None`` if it's not set. """ - return obj.get_rule(self.name) + return cast("Scalar | None", obj.get_rule(self.name)) def __set__( self, obj: StylesBase, value: float | int | Scalar | str | None @@ -233,7 +234,7 @@ class ScalarListProperty: def __get__( self, obj: StylesBase, objtype: type[StylesBase] | None = None ) -> tuple[Scalar, ...] | None: - return obj.get_rule(self.name) + return cast("tuple[Scalar, ...]", obj.get_rule(self.name)) def __set__( self, obj: StylesBase, value: str | Iterable[str | float] | None @@ -289,7 +290,10 @@ class BoxProperty: A ``tuple[EdgeType, Style]`` containing the string type of the box and it's style. Example types are "rounded", "solid", and "dashed". """ - return obj.get_rule(self.name) or ("", self._default_color) + return cast( + "tuple[EdgeType, Color]", + obj.get_rule(self.name) or ("", self._default_color), + ) def __set__(self, obj: Styles, border: tuple[EdgeType, str | Color] | None): """Set the box property. @@ -452,7 +456,7 @@ class BorderProperty: check_refresh() return if isinstance(border, tuple) and len(border) == 2: - _border = normalize_border_value(border) + _border = normalize_border_value(border) # type: ignore setattr(obj, top, _border) setattr(obj, right, _border) setattr(obj, bottom, _border) @@ -462,15 +466,15 @@ class BorderProperty: count = len(border) if count == 1: - _border = normalize_border_value(border[0]) + _border = normalize_border_value(border[0]) # type: ignore setattr(obj, top, _border) setattr(obj, right, _border) setattr(obj, bottom, _border) setattr(obj, left, _border) elif count == 2: _border1, _border2 = ( - normalize_border_value(border[0]), - normalize_border_value(border[1]), + normalize_border_value(border[0]), # type: ignore + normalize_border_value(border[1]), # type: ignore ) setattr(obj, top, _border1) setattr(obj, bottom, _border1) @@ -478,10 +482,10 @@ class BorderProperty: setattr(obj, left, _border2) elif count == 4: _border1, _border2, _border3, _border4 = ( - normalize_border_value(border[0]), - normalize_border_value(border[1]), - normalize_border_value(border[2]), - normalize_border_value(border[3]), + normalize_border_value(border[0]), # type: ignore + normalize_border_value(border[1]), # type: ignore + normalize_border_value(border[2]), # type: ignore + normalize_border_value(border[3]), # type: ignore ) setattr(obj, top, _border1) setattr(obj, right, _border2) @@ -513,7 +517,7 @@ class SpacingProperty: Returns: The Spacing. If unset, returns the null spacing ``(0, 0, 0, 0)``. """ - return obj.get_rule(self.name, NULL_SPACING) + return cast(Spacing, obj.get_rule(self.name, NULL_SPACING)) def __set__(self, obj: StylesBase, spacing: SpacingDimensions | None): """Set the Spacing. @@ -594,7 +598,7 @@ class LayoutProperty: Returns: The ``Layout`` object. """ - return obj.get_rule(self.name) + return cast("Layout | None", obj.get_rule(self.name)) def __set__(self, obj: StylesBase, layout: str | Layout | None): """ @@ -648,7 +652,7 @@ class OffsetProperty: The ``ScalarOffset`` indicating the adjustment that will be made to widget position prior to it being rendered. """ - return obj.get_rule(self.name, NULL_SCALAR) + return cast("ScalarOffset", obj.get_rule(self.name, NULL_SCALAR)) def __set__( self, obj: StylesBase, offset: tuple[int | str, int | str] | ScalarOffset | None @@ -734,7 +738,7 @@ class StringEnumProperty: Returns: The string property value. """ - return obj.get_rule(self.name, self._default) + return cast(str, obj.get_rule(self.name, self._default)) def _before_refresh(self, obj: StylesBase, value: str | None) -> None: """Do any housekeeping before asking for a layout refresh after a value change.""" @@ -795,7 +799,7 @@ class NameProperty: Returns: The name. """ - return obj.get_rule(self.name, "") + return cast(str, obj.get_rule(self.name, "")) def __set__(self, obj: StylesBase, name: str | None): """Set the name property. @@ -929,7 +933,7 @@ class StyleFlagsProperty: Returns: The ``Style`` object. """ - return obj.get_rule(self.name, Style.null()) + return cast(Style, obj.get_rule(self.name, Style.null())) def __set__(self, obj: StylesBase, style_flags: Style | str | None): """Set the style using a style flag string. @@ -992,7 +996,7 @@ class TransitionsProperty: e.g. ``{"offset": Transition(...), ...}``. If no transitions have been set, an empty ``dict`` is returned. """ - return obj.get_rule("transitions", {}) + return cast("dict[str, Transition]", obj.get_rule("transitions", {})) def __set__(self, obj: Styles, transitions: dict[str, Transition] | None) -> None: _rich_traceback_omit = True diff --git a/src/textual/css/_styles_builder.py b/src/textual/css/_styles_builder.py index ff66e9c84..26b67b07c 100644 --- a/src/textual/css/_styles_builder.py +++ b/src/textual/css/_styles_builder.py @@ -113,7 +113,6 @@ class StylesBuilder: suggested_property_name=suggested_property_name, ), ) - return tokens = declaration.tokens @@ -182,7 +181,13 @@ class StylesBuilder: """ if len(tokens) != 1: - string_enum_help_text(name, valid_values=list(valid_values), context="css"), + self.error( + name, + tokens[0], + string_enum_help_text( + name, valid_values=list(valid_values), context="css" + ), + ) token = tokens[0] token_name, value, _, _, location, _ = token @@ -239,7 +244,7 @@ class StylesBuilder: return if len(tokens) == 1: try: - self.styles._rules[name.replace("-", "_")] = Scalar.parse( + self.styles._rules[name.replace("-", "_")] = Scalar.parse( # type: ignore tokens[0].value ) except ScalarParseError: @@ -390,7 +395,7 @@ class StylesBuilder: name, num_values_supplied=len(space), context="css" ), ) - self.styles._rules[name] = Spacing.unpack(cast(SpacingDimensions, tuple(space))) + self.styles._rules[name] = Spacing.unpack(cast(SpacingDimensions, tuple(space))) # type: ignore def _process_space_partial(self, name: str, tokens: list[Token]) -> None: """Process granular margin / padding declarations.""" @@ -418,7 +423,7 @@ class StylesBuilder: spacing_list = list(current_spacing) spacing_list[_EDGE_SPACING_MAP[edge]] = space - self.styles._rules[style_name] = Spacing(*spacing_list) + self.styles._rules[style_name] = Spacing(*spacing_list) # type: ignore process_padding = _process_space process_margin = _process_space @@ -444,7 +449,7 @@ class StylesBuilder: token_name, value, _, _, _, _ = token if token_name == "token": if value in VALID_BORDER: - border_type = value + border_type = value # type: ignore else: try: border_color = Color.parse(value) @@ -464,7 +469,7 @@ class StylesBuilder: def _process_border_edge(self, edge: str, name: str, tokens: list[Token]) -> None: border = self._parse_border(name, tokens) - self.styles._rules[f"border_{edge}"] = border + self.styles._rules[f"border_{edge}"] = border # type: ignore def process_border(self, name: str, tokens: list[Token]) -> None: border = self._parse_border(name, tokens) @@ -486,7 +491,7 @@ class StylesBuilder: def _process_outline(self, edge: str, name: str, tokens: list[Token]) -> None: border = self._parse_border(name, tokens) - self.styles._rules[f"outline_{edge}"] = border + self.styles._rules[f"outline_{edge}"] = border # type: ignore def process_outline(self, name: str, tokens: list[Token]) -> None: border = self._parse_border(name, tokens) @@ -579,14 +584,14 @@ class StylesBuilder: color: Color | None = None alpha: float | None = None - self.styles._rules[f"auto_{name}"] = False + self.styles._rules[f"auto_{name}"] = False # type: ignore for token in tokens: if ( "background" not in name and token.name == "token" and token.value == "auto" ): - self.styles._rules[f"auto_{name}"] = True + self.styles._rules[f"auto_{name}"] = True # type: ignore elif token.name == "scalar": alpha_scalar = Scalar.parse(token.value) if alpha_scalar.unit != Unit.PERCENT: @@ -608,7 +613,7 @@ class StylesBuilder: if color is not None or alpha is not None: if alpha is not None: color = (color or Color(255, 255, 255)).with_alpha(alpha) - self.styles._rules[name] = color + self.styles._rules[name] = color # type: ignore process_tint = process_color process_background = process_color @@ -636,7 +641,7 @@ class StylesBuilder: ) style_definition = " ".join(token.value for token in tokens) - self.styles._rules[name.replace("-", "_")] = style_definition + self.styles._rules[name.replace("-", "_")] = style_definition # type: ignore process_link_style = process_text_style process_link_hover_style = process_text_style @@ -653,7 +658,7 @@ class StylesBuilder: text_align_help_text(), ) - self.styles._rules["text_align"] = tokens[0].value + self.styles._rules["text_align"] = tokens[0].value # type: ignore def process_dock(self, name: str, tokens: list[Token]) -> None: if not tokens: @@ -766,8 +771,8 @@ class StylesBuilder: align_error(name, token_horizontal) name = name.replace("-", "_") - self.styles._rules[f"{name}_horizontal"] = token_horizontal.value - self.styles._rules[f"{name}_vertical"] = token_vertical.value + self.styles._rules[f"{name}_horizontal"] = token_horizontal.value # type: ignore + self.styles._rules[f"{name}_vertical"] = token_vertical.value # type: ignore def process_align_horizontal(self, name: str, tokens: list[Token]) -> None: try: @@ -779,7 +784,7 @@ class StylesBuilder: string_enum_help_text(name, VALID_ALIGN_HORIZONTAL, context="css"), ) else: - self.styles._rules[name.replace("-", "_")] = value + self.styles._rules[name.replace("-", "_")] = value # type: ignore def process_align_vertical(self, name: str, tokens: list[Token]) -> None: try: @@ -791,7 +796,7 @@ class StylesBuilder: string_enum_help_text(name, VALID_ALIGN_VERTICAL, context="css"), ) else: - self.styles._rules[name.replace("-", "_")] = value + self.styles._rules[name.replace("-", "_")] = value # type: ignore process_content_align = process_align process_content_align_horizontal = process_align_horizontal @@ -807,7 +812,7 @@ class StylesBuilder: string_enum_help_text(name, VALID_SCROLLBAR_GUTTER, context="css"), ) else: - self.styles._rules[name.replace("-", "_")] = value + self.styles._rules[name.replace("-", "_")] = value # type: ignore def process_scrollbar_size(self, name: str, tokens: list[Token]) -> None: def scrollbar_size_error(name: str, token: Token) -> None: @@ -876,7 +881,7 @@ class StylesBuilder: token, table_rows_or_columns_help_text(name, token.value, context="css"), ) - self.styles._rules[name.replace("-", "_")] = scalars + self.styles._rules[name.replace("-", "_")] = scalars # type: ignore process_grid_rows = _process_grid_rows_or_columns process_grid_columns = _process_grid_rows_or_columns @@ -893,7 +898,7 @@ class StylesBuilder: value = int(token.value) if value == 0: self.error(name, token, integer_help_text(name)) - self.styles._rules[name.replace("-", "_")] = value + self.styles._rules[name.replace("-", "_")] = value # type: ignore process_grid_gutter_horizontal = _process_integer process_grid_gutter_vertical = _process_integer diff --git a/src/textual/css/model.py b/src/textual/css/model.py index cc68ee0af..3766606de 100644 --- a/src/textual/css/model.py +++ b/src/textual/css/model.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, Iterable import rich.repr +from ._help_renderables import HelpText from .styles import Styles from .tokenize import Token from .types import Specificity3 @@ -155,7 +156,7 @@ class SelectorSet: class RuleSet: selector_set: list[SelectorSet] = field(default_factory=list) styles: Styles = field(default_factory=Styles) - errors: list[tuple[Token, str]] = field(default_factory=list) + errors: list[tuple[Token, str | HelpText]] = field(default_factory=list) is_default_rules: bool = False tie_breaker: int = 0 diff --git a/src/textual/css/parse.py b/src/textual/css/parse.py index fe23c084d..a9a8fd668 100644 --- a/src/textual/css/parse.py +++ b/src/textual/css/parse.py @@ -5,6 +5,7 @@ from pathlib import PurePath from typing import Iterable, Iterator, NoReturn from ..suggestions import get_suggestion +from ._help_renderables import HelpText from ._styles_builder import DeclarationError, StylesBuilder from .errors import UnresolvedVariableError from .model import ( @@ -130,7 +131,7 @@ def parse_rule_set( declaration = Declaration(token, "") - errors: list[tuple[Token, str]] = [] + errors: list[tuple[Token, str | HelpText]] = [] while True: token = next(tokens) diff --git a/src/textual/css/styles.py b/src/textual/css/styles.py index ba2efa93c..644d94f74 100644 --- a/src/textual/css/styles.py +++ b/src/textual/css/styles.py @@ -367,8 +367,8 @@ class StylesBase(ABC): def auto_dimensions(self) -> bool: """Check if width or height are set to 'auto'.""" has_rule = self.has_rule - return (has_rule("width") and self.width.is_auto) or ( - has_rule("height") and self.height.is_auto + return (has_rule("width") and self.width.is_auto) or ( # type: ignore + has_rule("height") and self.height.is_auto # type: ignore ) @abstractmethod @@ -603,7 +603,7 @@ class Styles(StylesBase): Returns: ``True`` if a rule was cleared, or ``False`` if it was already not set. """ - changed = self._rules.pop(rule, None) is not None + changed = self._rules.pop(rule, None) is not None # type: ignore if changed: self._updates += 1 return changed @@ -622,12 +622,12 @@ class Styles(StylesBase): ``True`` if the rule changed, otherwise ``False``. """ if value is None: - changed = self._rules.pop(rule, None) is not None + changed = self._rules.pop(rule, None) is not None # type: ignore if changed: self._updates += 1 return changed current = self._rules.get(rule) - self._rules[rule] = value + self._rules[rule] = value # type: ignore changed = current != value if changed: self._updates += 1 @@ -646,7 +646,7 @@ class Styles(StylesBase): def reset(self) -> None: """Reset the rules to initial state.""" self._updates += 1 - self._rules.clear() + self._rules.clear() # type: ignore def merge(self, other: Styles) -> None: """Merge values from another Styles. @@ -736,25 +736,25 @@ class Styles(StylesBase): left = get_rule(f"{name}_left") if top == right and right == bottom and bottom == left: - border_type, border_color = rules[f"{name}_top"] + border_type, border_color = rules[f"{name}_top"] # type: ignore yield name, f"{border_type} {border_color.hex}" return # Check for edges if has_top: - border_type, border_color = rules[f"{name}_top"] + border_type, border_color = rules[f"{name}_top"] # type: ignore yield f"{name}-top", f"{border_type} {border_color.hex}" if has_right: - border_type, border_color = rules[f"{name}_right"] + border_type, border_color = rules[f"{name}_right"] # type: ignore yield f"{name}-right", f"{border_type} {border_color.hex}" if has_bottom: - border_type, border_color = rules[f"{name}_bottom"] + border_type, border_color = rules[f"{name}_bottom"] # type: ignore yield f"{name}-bottom", f"{border_type} {border_color.hex}" if has_left: - border_type, border_color = rules[f"{name}_left"] + border_type, border_color = rules[f"{name}_left"] # type: ignore yield f"{name}-left", f"{border_type} {border_color.hex}" @property @@ -770,15 +770,14 @@ class Styles(StylesBase): rules = self.get_rules() get_rule = rules.get - has_rule = rules.__contains__ - if has_rule("display"): + if "display" in rules: append_declaration("display", rules["display"]) - if has_rule("visibility"): + if "visibility" in rules: append_declaration("visibility", rules["visibility"]) - if has_rule("padding"): + if "padding" in rules: append_declaration("padding", rules["padding"].css) - if has_rule("margin"): + if "margin" in rules: append_declaration("margin", rules["margin"].css) for name, rule in self._get_border_css_lines(rules, "border"): @@ -787,90 +786,90 @@ class Styles(StylesBase): for name, rule in self._get_border_css_lines(rules, "outline"): append_declaration(name, rule) - if has_rule("offset"): + if "offset" in rules: x, y = self.offset append_declaration("offset", f"{x} {y}") - if has_rule("dock"): + if "dock" in rules: append_declaration("dock", rules["dock"]) - if has_rule("layers"): + if "layers" in rules: append_declaration("layers", " ".join(self.layers)) - if has_rule("layer"): + if "layer" in rules: append_declaration("layer", self.layer) - if has_rule("layout"): + if "layout" in rules: assert self.layout is not None append_declaration("layout", self.layout.name) - if has_rule("color"): + if "color" in rules: append_declaration("color", self.color.hex) - if has_rule("background"): + if "background" in rules: append_declaration("background", self.background.hex) - if has_rule("text_style"): + if "text_style" in rules: append_declaration("text-style", str(get_rule("text_style"))) - if has_rule("tint"): + if "tint" in rules: append_declaration("tint", self.tint.css) - if has_rule("overflow_x"): + if "overflow_x" in rules: append_declaration("overflow-x", self.overflow_x) - if has_rule("overflow_y"): + if "overflow_y" in rules: append_declaration("overflow-y", self.overflow_y) - if has_rule("scrollbar_color"): + if "scrollbar_color" in rules: append_declaration("scrollbar-color", self.scrollbar_color.css) - if has_rule("scrollbar_color_hover"): + if "scrollbar_color_hover" in rules: append_declaration("scrollbar-color-hover", self.scrollbar_color_hover.css) - if has_rule("scrollbar_color_active"): + if "scrollbar_color_active" in rules: append_declaration( "scrollbar-color-active", self.scrollbar_color_active.css ) - if has_rule("scrollbar_corner_color"): + if "scrollbar_corner_color" in rules: append_declaration( "scrollbar-corner-color", self.scrollbar_corner_color.css ) - if has_rule("scrollbar_background"): + if "scrollbar_background" in rules: append_declaration("scrollbar-background", self.scrollbar_background.css) - if has_rule("scrollbar_background_hover"): + if "scrollbar_background_hover" in rules: append_declaration( "scrollbar-background-hover", self.scrollbar_background_hover.css ) - if has_rule("scrollbar_background_active"): + if "scrollbar_background_active" in rules: append_declaration( "scrollbar-background-active", self.scrollbar_background_active.css ) - if has_rule("scrollbar_gutter"): + if "scrollbar_gutter" in rules: append_declaration("scrollbar-gutter", self.scrollbar_gutter) - if has_rule("scrollbar_size"): + if "scrollbar_size" in rules: append_declaration( "scrollbar-size", f"{self.scrollbar_size_horizontal} {self.scrollbar_size_vertical}", ) else: - if has_rule("scrollbar_size_horizontal"): + if "scrollbar_size_horizontal" in rules: append_declaration( "scrollbar-size-horizontal", str(self.scrollbar_size_horizontal) ) - if has_rule("scrollbar_size_vertical"): + if "scrollbar_size_vertical" in rules: append_declaration( "scrollbar-size-vertical", str(self.scrollbar_size_vertical) ) - if has_rule("box_sizing"): + if "box_sizing" in rules: append_declaration("box-sizing", self.box_sizing) - if has_rule("width"): + if "width" in rules: append_declaration("width", str(self.width)) - if has_rule("height"): + if "height" in rules: append_declaration("height", str(self.height)) - if has_rule("min_width"): + if "min_width" in rules: append_declaration("min-width", str(self.min_width)) - if has_rule("min_height"): + if "min_height" in rules: append_declaration("min-height", str(self.min_height)) - if has_rule("max_width"): + if "max_width" in rules: append_declaration("max-width", str(self.min_width)) - if has_rule("max_height"): + if "max_height" in rules: append_declaration("max-height", str(self.min_height)) - if has_rule("transitions"): + if "transitions" in rules: append_declaration( "transition", ", ".join( @@ -879,74 +878,74 @@ class Styles(StylesBase): ), ) - if has_rule("align_horizontal") and has_rule("align_vertical"): + if "align_horizontal" in rules and "align_vertical" in rules: append_declaration( "align", f"{self.align_horizontal} {self.align_vertical}" ) - elif has_rule("align_horizontal"): + elif "align_horizontal" in rules: append_declaration("align-horizontal", self.align_horizontal) - elif has_rule("align_vertical"): + elif "align_vertical" in rules: append_declaration("align-vertical", self.align_vertical) - if has_rule("content_align_horizontal") and has_rule("content_align_vertical"): + if "content_align_horizontal" in rules and "content_align_vertical" in rules: append_declaration( "content-align", f"{self.content_align_horizontal} {self.content_align_vertical}", ) - elif has_rule("content_align_horizontal"): + elif "content_align_horizontal" in rules: append_declaration( "content-align-horizontal", self.content_align_horizontal ) - elif has_rule("content_align_vertical"): + elif "content_align_vertical" in rules: append_declaration("content-align-vertical", self.content_align_vertical) - if has_rule("text_align"): + if "text_align" in rules: append_declaration("text-align", self.text_align) - if has_rule("opacity"): + if "opacity" in rules: append_declaration("opacity", str(self.opacity)) - if has_rule("text_opacity"): + if "text_opacity" in rules: append_declaration("text-opacity", str(self.text_opacity)) - if has_rule("grid_columns"): + if "grid_columns" in rules: append_declaration( "grid-columns", " ".join(str(scalar) for scalar in self.grid_columns or ()), ) - if has_rule("grid_rows"): + if "grid_rows" in rules: append_declaration( "grid-rows", " ".join(str(scalar) for scalar in self.grid_rows or ()), ) - if has_rule("grid_size_columns"): + if "grid_size_columns" in rules: append_declaration("grid-size-columns", str(self.grid_size_columns)) - if has_rule("grid_size_rows"): + if "grid_size_rows" in rules: append_declaration("grid-size-rows", str(self.grid_size_rows)) - if has_rule("grid_gutter_horizontal"): + if "grid_gutter_horizontal" in rules: append_declaration( "grid-gutter-horizontal", str(self.grid_gutter_horizontal) ) - if has_rule("grid_gutter_vertical"): + if "grid_gutter_vertical" in rules: append_declaration("grid-gutter-vertical", str(self.grid_gutter_vertical)) - if has_rule("row_span"): + if "row_span" in rules: append_declaration("row-span", str(self.row_span)) - if has_rule("column_span"): + if "column_span" in rules: append_declaration("column-span", str(self.column_span)) - if has_rule("link_color"): + if "link_color" in rules: append_declaration("link-color", self.link_color.css) - if has_rule("link_background"): + if "link_background" in rules: append_declaration("link-background", self.link_background.css) - if has_rule("link_style"): + if "link_style" in rules: append_declaration("link-style", str(self.link_style)) - if has_rule("link_hover_color"): + if "link_hover_color" in rules: append_declaration("link-hover-color", self.link_hover_color.css) - if has_rule("link_hover_background"): + if "link_hover_background" in rules: append_declaration("link-hover-background", self.link_hover_background.css) - if has_rule("link_hover_style"): + if "link_hover_style" in rules: append_declaration("link-hover-style", str(self.link_hover_style)) lines.sort() diff --git a/src/textual/css/stylesheet.py b/src/textual/css/stylesheet.py index 0b676776d..975326202 100644 --- a/src/textual/css/stylesheet.py +++ b/src/textual/css/stylesheet.py @@ -4,7 +4,7 @@ import os from collections import defaultdict from operator import itemgetter from pathlib import Path, PurePath -from typing import Iterable, NamedTuple, cast +from typing import Iterable, NamedTuple, Sequence, cast import rich.repr from rich.console import Console, ConsoleOptions, RenderableType, RenderResult @@ -248,7 +248,7 @@ class Stylesheet: self.source[str(path)] = CssSource(css, False, 0) self._require_parse = True - def read_all(self, paths: list[PurePath]) -> None: + def read_all(self, paths: Sequence[PurePath]) -> None: """Read multiple CSS files, in order. Args: diff --git a/src/textual/dom.py b/src/textual/dom.py index 07f994958..0497f623f 100644 --- a/src/textual/dom.py +++ b/src/textual/dom.py @@ -132,10 +132,12 @@ class DOMNode(MessagePump): check_identifiers("class name", *_classes) self._classes.update(_classes) - self.children = NodeList() + self.children: NodeList = NodeList() self._css_styles: Styles = Styles(self) self._inline_styles: Styles = Styles(self) - self.styles = RenderStyles(self, self._css_styles, self._inline_styles) + self.styles: RenderStyles = RenderStyles( + self, self._css_styles, self._inline_styles + ) # A mapping of class names to Styles set in COMPONENT_CLASSES self._component_styles: dict[str, RenderStyles] = {} diff --git a/src/textual/drivers/win32.py b/src/textual/drivers/win32.py index 34edc9930..30a335bd9 100644 --- a/src/textual/drivers/win32.py +++ b/src/textual/drivers/win32.py @@ -7,12 +7,12 @@ from ctypes import Structure, Union, byref, wintypes from ctypes.wintypes import BOOL, CHAR, DWORD, HANDLE, SHORT, UINT, WCHAR, WORD from typing import IO, Callable, List, Optional -from .._types import EventTarget +from .._types import MessageTarget from .._xterm_parser import XTermParser from ..events import Event, Resize from ..geometry import Size -KERNEL32 = ctypes.WinDLL("kernel32", use_last_error=True) +KERNEL32 = ctypes.WinDLL("kernel32", use_last_error=True) # type: ignore # Console input modes ENABLE_ECHO_INPUT = 0x0004 @@ -130,7 +130,7 @@ def _set_console_mode(file: IO, mode: int) -> bool: Returns: True on success, otherwise False. """ - windows_filehandle = msvcrt.get_osfhandle(file.fileno()) + windows_filehandle = msvcrt.get_osfhandle(file.fileno()) # type: ignore success = KERNEL32.SetConsoleMode(windows_filehandle, mode) return success @@ -144,7 +144,7 @@ def _get_console_mode(file: IO) -> int: Returns: The current console mode. """ - windows_filehandle = msvcrt.get_osfhandle(file.fileno()) + windows_filehandle = msvcrt.get_osfhandle(file.fileno()) # type: ignore mode = wintypes.DWORD() KERNEL32.GetConsoleMode(windows_filehandle, ctypes.byref(mode)) return mode.value @@ -211,7 +211,7 @@ class EventMonitor(threading.Thread): self, loop: AbstractEventLoop, app, - target: EventTarget, + target: MessageTarget, exit_event: threading.Event, process_event: Callable[[Event], None], ) -> None: diff --git a/src/textual/file_monitor.py b/src/textual/file_monitor.py index 778884865..a50625566 100644 --- a/src/textual/file_monitor.py +++ b/src/textual/file_monitor.py @@ -2,7 +2,7 @@ from __future__ import annotations import os from pathlib import PurePath -from typing import Callable +from typing import Callable, Sequence import rich.repr @@ -13,7 +13,7 @@ from ._callback import invoke class FileMonitor: """Monitors files for changes and invokes a callback when it does.""" - def __init__(self, paths: list[PurePath], callback: Callable) -> None: + def __init__(self, paths: Sequence[PurePath], callback: Callable) -> None: self.paths = paths self.callback = callback self._modified = self._get_last_modified_time() diff --git a/src/textual/scroll_view.py b/src/textual/scroll_view.py index e50bfcbfd..53c6c238a 100644 --- a/src/textual/scroll_view.py +++ b/src/textual/scroll_view.py @@ -30,14 +30,14 @@ class ScrollView(Widget): """Not transparent, i.e. renders something.""" return False - def watch_scroll_x(self, new_value: float) -> None: - if self.show_horizontal_scrollbar: - self.horizontal_scrollbar.position = int(new_value) + def watch_scroll_x(self, old_value: float, new_value: float) -> None: + if self.show_horizontal_scrollbar and round(old_value) != round(new_value): + self.horizontal_scrollbar.position = round(new_value) self.refresh() - def watch_scroll_y(self, new_value: float) -> None: - if self.show_vertical_scrollbar: - self.vertical_scrollbar.position = int(new_value) + def watch_scroll_y(self, old_value: float, new_value: float) -> None: + if self.show_vertical_scrollbar and round(old_value) != round(new_value): + self.vertical_scrollbar.position = round(new_value) self.refresh() def on_mount(self): diff --git a/src/textual/widget.py b/src/textual/widget.py index 4cb9fbbc5..197eb6147 100644 --- a/src/textual/widget.py +++ b/src/textual/widget.py @@ -117,7 +117,7 @@ class _Styled: """ def __init__( - self, renderable: "RenderableType", style: Style, link_style: Style | None + self, renderable: "ConsoleRenderable", style: Style, link_style: Style | None ) -> None: self.renderable = renderable self.style = style @@ -133,7 +133,7 @@ class _Styled: if style: apply = style.__add__ result_segments = ( - _Segment(text, apply(_style), control) + _Segment(text, apply(_style), None) for text, _style, control in result_segments ) link_style = self.link_style @@ -141,19 +141,22 @@ class _Styled: result_segments = ( _Segment( text, - style - if style._meta is None - else (style + link_style if "@click" in style.meta else style), + ( + style + if style._meta is None + else (style + link_style if "@click" in style.meta else style) + ), control, ) for text, style, control in result_segments + if style is not None ) return result_segments def __rich_measure__( self, console: "Console", options: "ConsoleOptions" ) -> Measurement: - return self.renderable.__rich_measure__(console, options) + return Measurement.get(console, options, self.renderable) class RenderCache(NamedTuple): @@ -1414,6 +1417,7 @@ class Widget(DOMNode): easing = DEFAULT_SCROLL_EASING if maybe_scroll_x: + assert x is not None self.scroll_target_x = x if x != self.scroll_x: self.animate( @@ -1425,6 +1429,7 @@ class Widget(DOMNode): ) scrolled_x = True if maybe_scroll_y: + assert y is not None self.scroll_target_y = y if y != self.scroll_y: self.animate( @@ -1438,10 +1443,12 @@ class Widget(DOMNode): else: if maybe_scroll_x: + assert x is not None scroll_x = self.scroll_x self.scroll_target_x = self.scroll_x = x scrolled_x = scroll_x != self.scroll_x if maybe_scroll_y: + assert y is not None scroll_y = self.scroll_y self.scroll_target_y = self.scroll_y = y scrolled_y = scroll_y != self.scroll_y diff --git a/src/textual/widgets/_tree.py b/src/textual/widgets/_tree.py index 9421d47ad..3786b080d 100644 --- a/src/textual/widgets/_tree.py +++ b/src/textual/widgets/_tree.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, ClassVar, Generic, NewType, TypeVar +from typing import TYPE_CHECKING, ClassVar, Generic, Iterable, NewType, TypeVar, cast import rich.repr from rich.style import NULL_STYLE, Style @@ -783,7 +783,7 @@ class Tree(Generic[TreeDataType], ScrollView, can_focus=True): assert self._tree_lines_cached is not None return self._tree_lines_cached - def _on_idle(self) -> None: + async def _on_idle(self, event: events.Idle) -> None: """Check tree needs a rebuild on idle.""" # Property calls build if required self._tree_lines @@ -891,6 +891,7 @@ class Tree(Generic[TreeDataType], ScrollView, can_focus=True): Returns: Strings for space, vertical, terminator and cross. """ + lines: tuple[Iterable[str], Iterable[str], Iterable[str], Iterable[str]] if self.show_guides: lines = self.LINES["default"] if style.bold: @@ -901,11 +902,11 @@ class Tree(Generic[TreeDataType], ScrollView, can_focus=True): lines = (" ", " ", " ", " ") guide_depth = max(0, self.guide_depth - 2) - lines = tuple( - f"{vertical}{horizontal * guide_depth} " - for vertical, horizontal in lines + guide_lines = tuple( + f"{characters[0]}{characters[1] * guide_depth} " + for characters in lines ) - return lines + return cast("tuple[str, str, str, str]", guide_lines) if is_hover: line_style = self.get_component_rich_style("tree--highlight-line") From 4fd7e19e8991c19cace092453f1c01abef023a41 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Feb 2023 17:30:02 +0000 Subject: [PATCH 30/52] lockfile --- poetry.lock | 53 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index a2448ef8b..a1bdd2099 100644 --- a/poetry.lock +++ b/poetry.lock @@ -654,7 +654,7 @@ python-versions = ">=3.7" [[package]] name = "platformdirs" -version = "2.6.2" +version = "3.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false @@ -664,8 +664,8 @@ python-versions = ">=3.7" typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -959,6 +959,25 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "types-docutils" +version = "0.19.1.3" +description = "Typing stubs for docutils" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "types-setuptools" +version = "67.2.0.1" +description = "Typing stubs for setuptools" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +types-docutils = "*" + [[package]] name = "typing-extensions" version = "4.4.0" @@ -990,7 +1009,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.18.0" +version = "20.19.0" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1000,7 +1019,7 @@ python-versions = ">=3.7" distlib = ">=0.3.6,<1" filelock = ">=3.4.1,<4" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} -platformdirs = ">=2.4,<3" +platformdirs = ">=2.4,<4" [package.extras] docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] @@ -1032,7 +1051,7 @@ typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "zipp" -version = "3.12.1" +version = "3.13.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false @@ -1048,7 +1067,7 @@ dev = ["aiohttp", "click", "msgpack"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "425fac5cc893af33128a6baf4fc9e296781d322e64eea5d9341d1265c6637d3c" +content-hash = "ddf5ab753228b6e3b623cd1ef4d26dad17348e6d28b1b8d39e21989be0e7b5fb" [metadata.files] aiohttp = [ @@ -1685,8 +1704,8 @@ pathspec = [ {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, ] platformdirs = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, + {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, @@ -1895,6 +1914,14 @@ typed-ast = [ {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, ] +types-docutils = [ + {file = "types-docutils-0.19.1.3.tar.gz", hash = "sha256:36fe30de56f1ece1a9f7a990d47daa781b5af831d2b3f2dcb7dfd01b857cc3d4"}, + {file = "types_docutils-0.19.1.3-py3-none-any.whl", hash = "sha256:d608e6b91ccf0e8e01c586a0af5b0e0462382d3be65b734af82d40c9d010735d"}, +] +types-setuptools = [ + {file = "types-setuptools-67.2.0.1.tar.gz", hash = "sha256:07648088bc2cbf0f2745107d394e619ba2a747f68a5904e6e4089c0cb8322065"}, + {file = "types_setuptools-67.2.0.1-py3-none-any.whl", hash = "sha256:f15b2924122dca5f99a9f6a96a872145721373fe1bb6d656cf269c2a8b73a74b"}, +] typing-extensions = [ {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, @@ -1908,8 +1935,8 @@ urllib3 = [ {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, ] virtualenv = [ - {file = "virtualenv-20.18.0-py3-none-any.whl", hash = "sha256:9d61e4ec8d2c0345dab329fb825eb05579043766a4b26a2f66b28948de68c722"}, - {file = "virtualenv-20.18.0.tar.gz", hash = "sha256:f262457a4d7298a6b733b920a196bf8b46c8af15bf1fd9da7142995eff15118e"}, + {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, + {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, ] watchdog = [ {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a09483249d25cbdb4c268e020cb861c51baab2d1affd9a6affc68ffe6a231260"}, @@ -2018,6 +2045,6 @@ yarl = [ {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, ] zipp = [ - {file = "zipp-3.12.1-py3-none-any.whl", hash = "sha256:6c4fe274b8f85ec73c37a8e4e3fa00df9fb9335da96fb789e3b96b318e5097b3"}, - {file = "zipp-3.12.1.tar.gz", hash = "sha256:a3cac813d40993596b39ea9e93a18e8a2076d5c378b8bc88ec32ab264e04ad02"}, + {file = "zipp-3.13.0-py3-none-any.whl", hash = "sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b"}, + {file = "zipp-3.13.0.tar.gz", hash = "sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6"}, ] From 99f1bbd8f446272e798e05d76bb0e0726dd1d27b Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Thu, 9 Feb 2023 21:19:16 +0000 Subject: [PATCH 31/52] Update to messaging --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3bdf8ffc4..587bfca33 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ ![Textual splash image](https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png) -Textual is a Python framework for creating interactive applications that run in your terminal. +Textual is a *Rapid Application Development* framework for Python. + +Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and (coming soon) a web browser!
🎬 Demonstration @@ -22,7 +24,7 @@ https://user-images.githubusercontent.com/554369/197355913-65d3c125-493d-4c05-a5 ## About -Textual adds interactivity to [Rich](https://github.com/Textualize/rich) with a Python API inspired by modern web development. +Textual adds interactivity to [Rich](https://github.com/Textualize/rich) with an API inspired by modern web development. On modern terminal software (installed by default on most systems), Textual apps can use **16.7 million** colors with mouse support and smooth flicker-free animation. A powerful layout engine and re-usable components makes it possible to build apps that rival the desktop and web experience. From a87181dd12e392cbebe374a89bed216cb8a30f1a Mon Sep 17 00:00:00 2001 From: TomJGooding <101601846+TomJGooding@users.noreply.github.com> Date: Thu, 9 Feb 2023 21:22:09 +0000 Subject: [PATCH 32/52] feat(keys): add space alias to displays --- src/textual/keys.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/textual/keys.py b/src/textual/keys.py index b4253c3ae..81e0aca38 100644 --- a/src/textual/keys.py +++ b/src/textual/keys.py @@ -229,6 +229,7 @@ KEY_DISPLAY_ALIASES = { "escape": "ESC", "enter": "⏎", "minus": "-", + "space": "SPACE", } From 101604bc04a2395d127870895947b6ddfe99aa1f Mon Sep 17 00:00:00 2001 From: Dave Pearson Date: Thu, 9 Feb 2023 21:41:45 +0000 Subject: [PATCH 33/52] Add missing link for Checkbox->Switch CHANGELOG entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c26553d34..974e5ee86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Breaking change: `TreeNode` can no longer be imported from `textual.widgets`; it is now available via `from textual.widgets.tree import TreeNode`. https://github.com/Textualize/textual/pull/1637 - `Tree` now shows a (subdued) cursor for a highlighted node when focus has moved elsewhere https://github.com/Textualize/textual/issues/1471 -- Breaking change: renamed `Checkbox` to `Switch`. +- Breaking change: renamed `Checkbox` to `Switch` https://github.com/Textualize/textual/issues/1746 ### Fixed From 1ca9c5f481d8e80ce3d0e11f0a786d08fa5de0c1 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 10 Feb 2023 09:13:35 +0000 Subject: [PATCH 34/52] remove text-backend --- src/textual/_text_backend.py | 159 --------------------------------- tests/test_text_backend.py | 165 ----------------------------------- 2 files changed, 324 deletions(-) delete mode 100644 src/textual/_text_backend.py delete mode 100644 tests/test_text_backend.py diff --git a/src/textual/_text_backend.py b/src/textual/_text_backend.py deleted file mode 100644 index c707b19b2..000000000 --- a/src/textual/_text_backend.py +++ /dev/null @@ -1,159 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass - - -@dataclass -class TextEditorBackend: - """Represents a text editor (some text and a cursor)""" - - content: str = "" - cursor_index: int = 0 - - def set_content(self, text: str) -> None: - """Set the content of the editor - - Args: - text: The text to set as the content - """ - self.content = text - - def delete_back(self) -> bool: - """Delete the character behind the cursor and moves cursor back. If the - cursor is at the start of the content, does nothing other than immediately - return False. - - Returns: - True if the text content was modified. False otherwise. - """ - if self.cursor_index == 0: - return False - - new_text = ( - self.content[: self.cursor_index - 1] + self.content[self.cursor_index :] - ) - self.content = new_text - self.cursor_index = max(0, self.cursor_index - 1) - return True - - def delete_forward(self) -> bool: - """Delete the character in front of the cursor without moving the cursor. - - Returns: - True if the text content was modified. False otherwise. - """ - if self.cursor_index == len(self.content): - return False - - new_text = ( - self.content[: self.cursor_index] + self.content[self.cursor_index + 1 :] - ) - self.content = new_text - return True - - def cursor_left(self) -> bool: - """Move the cursor 1 character left in the text. Is a noop if cursor is at start. - - Returns: - True if the cursor moved. False otherwise. - """ - previous_index = self.cursor_index - new_index = max(0, previous_index - 1) - self.cursor_index = new_index - return previous_index != new_index - - def cursor_right(self) -> bool: - """Move the cursor 1 character right in the text. Is a noop if the cursor is at end. - - Returns: - True if the cursor moved. False otherwise. - """ - previous_index = self.cursor_index - new_index = min(len(self.content), previous_index + 1) - self.cursor_index = new_index - return previous_index != new_index - - def query_cursor_left(self) -> bool: - """Check if the cursor can move 1 codepoint left in the text. - - Returns: - True if the cursor can move left. False otherwise. - """ - previous_index = self.cursor_index - new_index = max(0, previous_index - 1) - return previous_index != new_index - - def query_cursor_right(self) -> str | None: - """Check if the cursor can move right (we can't move right if we're at the end) - and return the codepoint to the right of the cursor if it exists. If it doesn't - exist (e.g. we're at the end), then return None - - Returns: - The codepoint to the right of the cursor if it exists, otherwise None. - """ - previous_index = self.cursor_index - new_index = min(len(self.content), previous_index + 1) - if new_index == len(self.content): - return None - elif previous_index != new_index: - return self.content[new_index] - return None - - def cursor_text_start(self) -> bool: - """Move the cursor to the start of the text - - Returns: - True if the cursor moved. False otherwise. - """ - if self.cursor_index == 0: - return False - - self.cursor_index = 0 - return True - - def cursor_text_end(self) -> bool: - """Move the cursor to the end of the text - - Returns: - True if the cursor moved. False otherwise. - """ - text_length = len(self.content) - if self.cursor_index == text_length: - return False - - self.cursor_index = text_length - return True - - def insert(self, text: str) -> bool: - """Insert some text at the cursor position, and move the cursor - to the end of the newly inserted text. - - Args: - text: The text to insert - - Returns: - Always returns True since text should be insertable regardless of cursor location - """ - new_text = ( - self.content[: self.cursor_index] + text + self.content[self.cursor_index :] - ) - self.content = new_text - self.cursor_index = min(len(self.content), self.cursor_index + len(text)) - return True - - def get_range(self, start: int, end: int) -> str: - """Return the text between 2 indices. Useful for previews/views into - a subset of the content e.g. scrollable single-line input fields - - Args: - start: The starting index to return text from (inclusive) - end: The index to return text up to (exclusive) - - Returns: - The sliced string between start and end. - """ - return self.content[start:end] - - @property - def cursor_at_end(self): - return self.cursor_index == len(self.content) diff --git a/tests/test_text_backend.py b/tests/test_text_backend.py deleted file mode 100644 index 135931e3f..000000000 --- a/tests/test_text_backend.py +++ /dev/null @@ -1,165 +0,0 @@ -from textual._text_backend import TextEditorBackend - -CONTENT = "Hello, world!" - - -def test_set_content(): - editor = TextEditorBackend() - editor.set_content(CONTENT) - assert editor.content == CONTENT - - -def test_delete_back_cursor_at_start_is_noop(): - editor = TextEditorBackend(CONTENT) - assert not editor.delete_back() - assert editor == TextEditorBackend(CONTENT, 0) - - -def test_delete_back_cursor_at_end(): - editor = TextEditorBackend(CONTENT) - assert editor.cursor_text_end() - assert editor.delete_back() - assert editor == TextEditorBackend("Hello, world", 12) - - -def test_delete_back_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, 5) - assert editor.delete_back() - assert editor == TextEditorBackend("Hell, world!", 4) - - -def test_delete_forward_cursor_at_start(): - editor = TextEditorBackend(CONTENT) - assert editor.delete_forward() - assert editor.content == "ello, world!" - - -def test_delete_forward_cursor_at_end_is_noop(): - editor = TextEditorBackend(CONTENT) - assert editor.cursor_text_end() - assert not editor.delete_forward() - assert editor == TextEditorBackend(CONTENT, len(CONTENT)) - - -def test_delete_forward_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, 5) - editor.cursor_index = 5 - assert editor.delete_forward() - assert editor == TextEditorBackend("Hello world!", 5) - - -def test_cursor_left_cursor_at_start_is_noop(): - editor = TextEditorBackend(CONTENT) - assert not editor.cursor_left() - assert editor == TextEditorBackend(CONTENT) - - -def test_cursor_left_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, 6) - assert editor.cursor_left() - assert editor == TextEditorBackend(CONTENT, 5) - - -def test_cursor_left_cursor_at_end(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert editor.cursor_left() - assert editor == TextEditorBackend(CONTENT, len(CONTENT) - 1) - - -def test_cursor_right_cursor_at_start(): - editor = TextEditorBackend(CONTENT) - assert editor.cursor_right() - assert editor == TextEditorBackend(CONTENT, 1) - - -def test_cursor_right_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, 5) - assert editor.cursor_right() - assert editor == TextEditorBackend(CONTENT, 6) - - -def test_cursor_right_cursor_at_end_is_noop(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - editor.cursor_right() - assert editor == TextEditorBackend(CONTENT, len(CONTENT)) - - -def test_query_cursor_left_cursor_at_start_returns_false(): - editor = TextEditorBackend(CONTENT) - assert not editor.query_cursor_left() - - -def test_query_cursor_left_cursor_at_end_returns_true(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert editor.query_cursor_left() - - -def test_query_cursor_left_cursor_in_middle_returns_true(): - editor = TextEditorBackend(CONTENT, 6) - assert editor.query_cursor_left() - - -def test_query_cursor_right_cursor_at_start_returns_true(): - editor = TextEditorBackend(CONTENT) - assert editor.query_cursor_right() - - -def test_query_cursor_right_cursor_in_middle_returns_true(): - editor = TextEditorBackend(CONTENT, 6) - assert editor.query_cursor_right() - - -def test_query_cursor_right_cursor_at_end_returns_false(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert not editor.query_cursor_right() - - -def test_cursor_text_start_cursor_already_at_start(): - editor = TextEditorBackend(CONTENT) - assert not editor.cursor_text_start() - assert editor.cursor_index == 0 - - -def test_cursor_text_start_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, 6) - assert editor.cursor_text_start() - assert editor.cursor_index == 0 - - -def test_cursor_text_end_cursor_already_at_end(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert not editor.cursor_text_end() - assert editor.cursor_index == len(CONTENT) - - -def test_cursor_text_end_cursor_in_middle(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert not editor.cursor_text_end() - assert editor.cursor_index == len(CONTENT) - - -def test_insert_at_cursor_cursor_at_start(): - editor = TextEditorBackend(CONTENT) - assert editor.insert("ABC") - assert editor.content == "ABC" + CONTENT - assert editor.cursor_index == len("ABC") - - -def test_insert_at_cursor_cursor_in_middle(): - start_cursor_index = 6 - editor = TextEditorBackend(CONTENT, start_cursor_index) - assert editor.insert("ABC") - assert editor.content == "Hello,ABC world!" - assert editor.cursor_index == start_cursor_index + len("ABC") - - -def test_insert_at_cursor_cursor_at_end(): - editor = TextEditorBackend(CONTENT, len(CONTENT)) - assert editor.insert("ABC") - assert editor.content == CONTENT + "ABC" - assert editor.cursor_index == len(editor.content) - - -def test_get_range(): - editor = TextEditorBackend(CONTENT) - assert editor.get_range(0, 5) == "Hello" From d15a854d528ea614fe1ec509b1a3e9dc22ec775d Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Fri, 10 Feb 2023 09:59:17 +0000 Subject: [PATCH 35/52] typing fixes --- src/textual/css/parse.py | 2 +- src/textual/css/query.py | 2 +- src/textual/css/styles.py | 2 +- src/textual/dom.py | 2 +- src/textual/screen.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/textual/css/parse.py b/src/textual/css/parse.py index a9a8fd668..d1c5f709b 100644 --- a/src/textual/css/parse.py +++ b/src/textual/css/parse.py @@ -183,7 +183,7 @@ def parse_declarations(css: str, path: str) -> Styles: styles_builder = StylesBuilder() declaration: Declaration | None = None - errors: list[tuple[Token, str]] = [] + errors: list[tuple[Token, str | HelpText]] = [] while True: token = next(tokens, None) diff --git a/src/textual/css/query.py b/src/textual/css/query.py index 7e5c149cc..428209fa4 100644 --- a/src/textual/css/query.py +++ b/src/textual/css/query.py @@ -255,7 +255,7 @@ class DOMQuery(Generic[QueryType]): # The IndexError was got, that's a good thing in this case. So # we return what we found. pass - return the_one + return cast("Widget", the_one) @overload def last(self) -> Widget: diff --git a/src/textual/css/styles.py b/src/textual/css/styles.py index 644d94f74..b23bad368 100644 --- a/src/textual/css/styles.py +++ b/src/textual/css/styles.py @@ -474,7 +474,7 @@ class StylesBase(ABC): @classmethod @lru_cache(maxsize=1024) - def parse(cls, css: str, path: str, *, node: DOMNode = None) -> Styles: + def parse(cls, css: str, path: str, *, node: DOMNode | None = None) -> Styles: """Parse CSS and return a Styles object. Args: diff --git a/src/textual/dom.py b/src/textual/dom.py index 0497f623f..1ed204aa9 100644 --- a/src/textual/dom.py +++ b/src/textual/dom.py @@ -111,7 +111,7 @@ class DOMNode(MessagePump): _css_type_names: ClassVar[frozenset[str]] = frozenset() # Generated list of bindings - _merged_bindings: ClassVar[Bindings] | None = None + _merged_bindings: ClassVar[Bindings | None] = None _reactives: ClassVar[dict[str, Reactive]] diff --git a/src/textual/screen.py b/src/textual/screen.py index 86ea1c4b9..5a0ccb7b4 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -231,7 +231,7 @@ class Screen(Widget): else: # Only move the focus if we are currently showing the focus if direction: - to_focus: Widget | None = None + to_focus = None chain_length = len(focus_chain) for step in range(1, len(focus_chain) + 1): node = focus_chain[ From a37e7fcb2b50cf3d86711b228f237f9bac174093 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 15:37:24 +0000 Subject: [PATCH 36/52] fix modal example --- docs/examples/guide/screens/modal01.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/guide/screens/modal01.css b/docs/examples/guide/screens/modal01.css index 8c7bea071..a6c01de21 100644 --- a/docs/examples/guide/screens/modal01.css +++ b/docs/examples/guide/screens/modal01.css @@ -1,7 +1,7 @@ #dialog { grid-size: 2; grid-gutter: 1 2; - margin: 1 2; + padding: 1 2; } #question { From f5723f933e989e3182ef1db76408731862c078d2 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:08:21 +0000 Subject: [PATCH 37/52] new blogpost --- docs/blog/images/async-create-task.jpeg | Bin 0 -> 293045 bytes docs/blog/posts/create-task-psa.md | 26 ++++++++++++++++++++++++ src/textual/_doc.py | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 docs/blog/images/async-create-task.jpeg create mode 100644 docs/blog/posts/create-task-psa.md diff --git a/docs/blog/images/async-create-task.jpeg b/docs/blog/images/async-create-task.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7a06ce3338a378e3711ef4ef75936e28e72de121 GIT binary patch literal 293045 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 z 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­t{nq*1e1vTQE=xtC&L z3*zV<(IM?9YDTTZ0coV-SucsJAXK3GfkTqYgMI5}o^tPS@;NQ`37k^7qXwaJP z?mVY6AJv&+?vQ=Y3TWZI+*G`pDceFyz5w|;&Z$9h)h1|zC46Si3X7-YhVO}EwLq1e zMjurPjsprHp&!GFJlgf<#(-lHk%cA|eb41^8{zLOHL;{&jZmHv?+84+=SNeHKVim7 zEylZqN|8ymc$jp@YW)IS{?_wdN1osKU+COj+m>fC0jdxU@&9GLmJ&T>aY&Rz;No=Qqs<5 z@z0lnYIVbYoA2zj(uI{>bIM*})yvtYhUA9}P`y~Z0<08|rnZ)CpAT+IdY$-gunLsXQH?O7k zytp0=(49>x$^$y`$kT#_kHSN&em|b2`IOPCqiCtJ?%k-cqTEIET-CLg%B(w=aF4wa zzlqM)J0lT|Dxr*gje;Q&p2$$XtF9^R#%j`Ft;ovcc+74BOOwCl5IL*3v3_UpNf%>* zzdLW$FJ)rv4z(kZ~O>tN-mF z>Bc|e6O9TV5rW*?0?0Wpc8(D)_j{wVht#!P%wSQai8fszUR3|_E-(q`3p9r%=VTr> zJ(6b-HYADya%M`L=D!&zvC@ufGy{ZmrdGM`QnPjgoQUB`v_bkf zXQEg)El6;T4%eGL`)Q0|2Vg2jOZvric+&GLb!iv4ew}pbC5Ksj6h43@iu5u^^ z3QIq?_1u&#L5!_c3A>n~r2gDH*?A_+Fe=oC`?z?8!7A*gp)b};neY_$ZT867>31yT zm|3p1?NT)klb>&*%9~n9oWbWvXA(qimK1OUynv_dv}C`=kAZ3MsIty+37>K~7Enwt z$T>MTUFHPJk?<~@(}EyCW{0mny*FCs7Tm+K+m9f(ovf+_VnmBv9&W^WN_&n$I|vOJ zOPZD63g)UaI#BL`%*o0%jq7T4$ZMdN%E#$Np-vQ0soP}nf(Z01p{EvnK|KLpn0P5S z7)eqRqXT9Xl;68-<>mUPmW`_6OI=99QfAEDT_!?74t0vi4^1Gp*Y%l)5|p4136L~M zMD$aZoKNz;J30ig*)d%7Tq`L4nfH)SwH+m7KaS*#@MT)li0sLP6~%+p_?5Z~qx*nO zR=f2mZH;s-!*E*+JN@35{aeV>ABFMeI^(WEqqkPCQBTA$hDQUSj&;*qOt zm=@gZ#V}7=Po+gsJEbC1U0-zV*7Pn(aW0< zmUVmHcwl$Y)%jtKX8Vs)>yO!&jUj`U+Tr6L@_FvJwbx2%)SvV_8l`nXTrCty7TqVS zKh8U~DpFCc+z?~7xV;gf1xVWgV*+Bxi+}l9MKvn7D_)lNhf!+GUmwL?y8?5*?ETh+ z`n_Ewo`0@MYGh){f3Y>5RcZ&LcwYIdCV!~^Bs051`TA#m!k^EKY*73TT4CJL@zwXB zZ{U2zrtK*UA^87c`lU%ob|td%&oSQhgZAuS{HrUu=`5G`DVZ-As32exGXpMC-=PU( ztG>U{^;$tQPKIPcU}EZ9Wj7jAY+0(!8lXQ$~^;PP#V&t-OvLc zgIq!|sMVc9Coe0AeneJkpC&yFHG(bK7VqXUbMi!OaWdD5Wk#8zbJdqyN$S@8$~}i3 zQ-I!w6KebEe`!gsZUf7?&(_xe1Q+RQY!{TZ4D?+DdCtfVvUxe8Fy@o#wB8gf3#tqk z+rkWaA16TmK9HsMAx@8o@-kD`#_boC^klTaX#1(xR0_^?N;a5#>JC7u^PLTfRShyZ6`o zy%f80*^y;q^yh?TBj0EpK~ar!{=BQGD!urnUy$u7-r-q->R#Ik zhMmn!_gA}Yf6Eh^Fj3AC-XS1A<@-8Q9$j@2NfndQ&^hPH59ZV73!^>p9F=;x?sC2t z+giRA4?ms502O%6dx{DT@A-_2-YcSSs@JYF?89jk&x~ z40h-e2RFf{d7Ffh&3;r3Cr#YIYBV7QcS$wa-O`Lc5bxp_0J0OTtoHvMkg^zHV zmKdIf5()J!q36J!3;D>jVmqr~_QURcU#D%(G~b+Qc7STAXb0z&R-u!1oc>77q$ZX# z;*|!J5*W7%5N@X)AjMumo1idyj%)P& zPOfe-C~g{biLUmz(fTYby_`qYtN6YXq#fiBf9!MKs}ZzNr~5Lw!l-D<1>xd0sJj1t z?m{p)-b{-97OvX89;M48wsjo+u6(1w=_KJoHKC93>dH0wC>P(-o2sVz+1z>0IqJtb zh9B&T@`~$AVa|jqM=aJ#i<)ugx$S|d673?8mLf!ogK&#~i9S7HKA(6l3b7%S)seIP zJ}I{jf~Jm&J;cKnOkWg?z7ZtXJ}q9wQb8TlJZ+E*lYx7fw4R3ods)LSZKy@ZUbWI@ z?|m$*`b;TQuMVxA8?a!XRHI~%)6c(fSv?Tzz&<$z%zn^M!HDd$!w)=vj9lf$yC7ux zo1#ShYG>cGgoX{btu2}AQm19ldpU!GO{lT1C@a0MSK%E50t?o#x$>5bg?MgXAE_ZTMiuE6_XVLW zwkmm}t1GJju4=NQ@}eo3RT zSaUJzk`KZFXeq>zgq4$ixL)I(xmTU&wRz}~dX}dVLaHVju|qCluysebs1pa$9=2Om z4s@61&N%_y1o4PD?payt$TyAS2M=Y>nJ5Lf$T-Zf=iSBE2zKUw5_sL_vgPlA4VK$_ zdV2D;lO<%=TAg9%vQoQ#pTpAmx{cf(8`G0NfCoQ~S*}%158tOXNGR0>st=#nL1;e- z)1}U$kM zHo#pf{@Ghn&u)N8NO$+|lFFQ)&@$GxXw+r59LF*&EGkvW(q!ms)rEI<2mz^i9R`0^ z{jE=3P}1%5?M=&@2J5d5;|obV{$nkMI=xAgs^Xipv9rmDQ%6QIRHx`lvkQ7UGA^hh zn|ucY!f!59yLxBNAx*+{Z?QR_j69UBDC=4#<4G3I*`I1IDx2JZm1ELfjna>BC>lLw z$8KF~qrbI|SwFS&ThO!p+K`(x-%n8cSz)#;cbmd|p+|mbIpKnWlHx3G?fLnD_Ef3D zij=btsYyfNL4$ldQ3pND8M|5EHzomW;!O$5#gkrzUd7zOiE_3Xn`L|oB~Tfk-{Mup zw7O{ciBvbO#YR11igzeUGmBc$!Qk-+@r`z-AzCUnmD*BQtQ1Uus&Oj>@mtoerVx$X z>$WZL_eEUMXYzsYn)8?Cohp0-v>*Mu{9%vYbdFQ!I5xa*X8i6dYWf-UilcMn^W)d- z(A45a98L!>&LZ{vYUPg((d;CIF$gQqW1FgQ%K3&Va792Pc_4R<<%-CWjaFB>g~*)j z)aJ|t@PQG34o4hSoZRDMCD~p{^?izA#`fkDGwUH&Y&A*O8Ht-SBU5LW{f(mb`2^_G zr=;%Ujf)FB<)M5^b&m9lIQC~W)wtIpJr;(DmK1<`aD;aoUR*%h89j8%H6qrhR#81J zG?Fz`n(UYR<&jh+L1((h^sPEayt(yACXMKoSXe{*}TKWJ{bXvliLw{ z?3D&!H2#vhMNMc9O?=^W99?WHN(bUj;?cd!AoX09Q}QO}rnQtoxh3!fo#qi?!!u>Q z7P(odsdR@c*?S3vbex`QqSfiFYShTqW8+Zbp$@#h{4aQ#?0Xhg^6E{eznL!7HxKXd zcHR)`(f@vrOF2#kpxcg#9%1d3jfzB_x zb=8g!bdI6=n-vH93h&Dj80z%|fKeyS|0nOZVE!h_p@((ePdHFEL*_J$`}(=Z41&Sq zB%8(`19>nj!=Q;jm$_N-@+=M#%^W{hKP%U_2d+sw_r-?zM$4+dcq_51!Z3kld6-G{ z#mnH~5>Ee$>jeXU;qMtk=BNGkYM??HCdK-L8)ol#V-pld`jS^g`hf8!U?d#Cej znk;GuM2@OsJg2n0#jP6p=XV!=Raj53C0Tqk{!aaBm=4@pm+ z|7zEZxM}n^6OWbP@zifS4SPuJm$>Mj7uvyLqM~Uww~`(_|5Yw;z+o=LWSX&c)snXV zN6qDx;QOR#DeYh6mb(`e^7NlT{~vr1jc;;a6CZr!J*>)nfK>r7n2t|&(j*Bo0x^*2 zbB`zA-F+Z`<8DC?2NO5sKL7R660g?d4jYQypG*ZcEfv{X@XPt?_1y%#*SWc|YZ-E< z1cvFHxrCom8j70~q>R12uQ!`<=L^HH3WxBw>mmd(M(wqorol z7M!J>41N=BMS_IvKYGuXCihoVPDM`LEIi>IdKo%(EhQbRqje=gztEuHcB%O?`gC!2 z=$?yLYb^C2Z+)I!S+IINJe24DR7eTtZB>(O9`fN-ftFF4!hj(DQy`2V;@}4|$VZz) zT4G%y4Ku+R;_?vRke-ab=6C>>n6Ok4g_)t*DL2_;Ua6w@Wsz?QK4roSgZDFm`th_2 zo@ZmVx6t#*WbhnB*sBEHe!d9Kj8rNF7iH5wYA97Qs1}n~APZg{t~)(lCkL{w@tV18 zr)lHj9)&j^E5_mOdEkbvMiifvIpEN*p5Ad)|9G;3Q9O6zRB(cJAt(IJNl=S!JKT@hG%bC8Dr0exWAD+N~%C-`RKVhm4ySHl~MB?FxTCqcB2f0WQwDs2!ZJ zs6${fs_i09BRf)frDeUAr^mE9>e{eZ$1Ts$%Y)7Pjpn&-fZhk7A2mDL(FJRB@pp++ z5B+9?;s$HYmCg+Nsy z!0P7CIF!Oez2R}>m574`Cxns_#-gf>A!2&8=7!a?h9n$)RjtN?MBk{`9vkU`4L4eq z-w>y7>gX+$+L*q1$^6>`wDn=!%9EXqE1^f<|MA=FZ#DnY>i%Zx2QrFhYzhyrTe8DDE&`Ey18@+pqOrR{z0^j*_8`QivyWbo`e5o?wDiK;U~@^6L7D~_7dK{XB$Wy|1 z&lWJMk?VqG#cETAyO{SdzTo~g{KO~r*?i%eE&MXd&-`p;e;Z{Sq;Vj_Sa1Z|jB1!n za$p_Vu`SvtpgF6V+Rx$_Dq#5XTU}~5`cIc2%(4^po*eXJ_W<*6?~Lg6aEl^H`q_@U zsvcbTT<=Oy1fQ0FNq6rZ#uPmk+C5)@`Qh}6QwZ|}B^`F9)i(ereix=QSm+W}W!imW zTXJ6MBT1W;OeNjOQT@dz8k7}5YwM$Anf8NHuEAHinto7{E;!D0J3oYw>m;)=(A=}ZNDReUlf8Zhv@{i@Iz z8M46lmog5Q_#%r*!OS~?=39Fn$TF3IGsK&&sAH1(b8bMn>vaDJNiO_ys-J_@+MikF zi-DIvZWf167d=WQDtlvf-*%j!c>n}$is@jQ9~~Z;KC4n!*Wc8&0n3}S8jlQY zsh?y%Zw9y$5i06idzh4}FmnUsPA9u>0L&h>_ZZT02bRm{6lg{Y&Cj@C(Np4m(fC(v zUh__n@_N)IqhhINXDJAlixM}kczL&Ru2f?MLeAn`a{D|>Q7Tsno&w$XCeK1BLdHd3 z#rh~B1E1;yhSgC^-JI93RqU2~SbsR2Fv^L>Oq|?sTj1762gUT@<-AgB-kfN>M3J!q zfiG&X2-q3+qh9D`6RR#kSE?LysuZ2R01|GDd>pKb6Mypv(t)`drz`H+^b^$5XE?c_ zYYWxSS!yEK$^tfShebInk@H#aNuy09GqK#N3;dOvUW6&tuc@-toPD>n4Nyz1S|OeJ z$n#l-{ZlQwF_{_NV7gWUJvu0ta`#rX9?o2`zZ&ooQrrl?CU;GDqnUl_6ui#1p)lVK zvST@h8I04?+~_b|Y}PPRQ_X&@L|%Z*4S(e*3Z^MhQtI@}xh**IFM9nem6b|6*SnAw zprnI})6lw%pZ>Efj=x~ipXcDtew!Rs+`BZ)$rEepsX z19fHOac+VA;Y$;^@IN|!7uQqQ?Fjmlf2xhEbRYN&`zcVBWrbk7ZynXa#TtFD^zJ}w ztbw9WF2)=hxDe~4kn%^pqhIGPrbg%|CYZ!MPG}qMt zT`({T?;nX>z8m|zhcBI*AUV+MYAWhqVXMe;+L%<5*QoX{{J`m7eIj{lBWmpb7klp+ z)#TT|djisX7Xg(Hp|>EQqJ)~zLLijT1f&E6X+cm?#885Ol+Z$umQX@dAP9(vH0eTU z5&04eO&CClREXbXG@4fH#-PiTG=9%9cS*E);KY;mV z3O}G^ZCEvg6+K*e*fZh2ORhw9T-IX&hA1pDazQ zoWS!4Deo6R%sfz$I~j4Z7d0^fAu8ZH1HIJJn(QzGF~~+haR_!=>O|_3(QZ3&a|(kXc!7V zA(X(vs@b>d@Y=APqP|Lmp+)na3D!Ch-pBlTyhaxx-1e$l=O{o;wR6po;_HBSGV-_)X zbM6FmWcguQ)rmQPQg1AD9>fV!oQTjIea0s}g;^s_vpcBRoTMnrwmv@KGt8SMClqCb zH(;2X_C$7e1nTA(3?C$Q4d#b4&WzOhJu^4@ZaU&^tRiwU;5{hhN;$=u0&YOFIid?9 z^(`B~nk%GD$^3IZDcTJe&We7*m{Ys5>Pfx9GU?ictY7d?wFlT05am~yO@#=mPFihI zkaV5BBFf?A`5q<5tOa2eOZo*L`=ivBT;C7r=x{yEtfYrhu6hlYj7H#Iv0DMPit>|4 z#wPEUMU{-xk9#d69VL;%UDb+@45`G#qdIvQ-7+9B+6>T=4@@5MvB%{*NzN318ITAx z2toB_yxGuUR6?DzV_^?Mdk9XUHNApvImHu`%ul>NkLla&QFMacNaVh9%XHa+NeLEqPQ_@qhgw<(8cFaT zbLDJj#XoS5s~naDw>#oyNuIoQx}@EsEKzFZA|3^8&+45bTGj6v*3{tNzV6UGbtb~uuT5Z{#Yv6U1u#f%Wd1o^~yP}Je@Ay7&`qnjGOt;3@3wScl!|q-s?Yn=ViCR%TR= z9Wqw@($Nc9b_ZMe%av_nw2~Mj<@A$)e%-V#^__#@2t!*bdO$qXwDei@%*kl}R&B+`m7Vwlxa+O;=jNVk z9_DQGbS86@KgOMM^^u$*)Kw+v|B`XAJl8o=vh%|{o8Uq(l9TB)?1~epSexa^&R6q% z_w}BdVddTpsb*MTN6XborzdVU9-d~$WuLl!VL@|WQE~dJ>-pQ#1NW;PGTvu$gQ{3W zYV2j_(yabyY+tz7$GM#!@f=R4?v+6;xnQ|4K)`0)r?)<1=Ooo@yR%?ZeR9UFQZZoS zf(@tf&JU7J+`F{`UqHYcz2A|LsousK!7;>@N_^V{8>0z zD8i1tP3IwLma{OF7N<3NBkiBjryahr#n3)c4I4E&gmY%w-aW4FnFXI5c zJjr}j)bIgTT${&COS82o6zBQ5F3Mw7R5w0LeC?ds(JWU66?x{I*bIoF98Yp~jB^&- zSbtJ`{AA)r8tZ~h%_;Ww+3kkT@_IeSopiUFc1`nA-!0A7Y&Fhm%hzIlxm4%+ZITO} z$)a2}_9Qz`YY{^Kawr<#_DEz|yl=$a+_}1dXN+10voV*uEj#)T!#@l%0Q=NLO<`Kf zUWTh-WU`l#jdtnsbOm|M>X+PRv2I4DG2JUmx6`qqHhgJp6;kg}4Kd(+iHUe-I!!NE z5pVZL(BdSobgVrWja1UD3l__Vupb8q?P+c9zxbJR=B~;=4DDLCcw4uFVP(jKZF0Cm z19*`GQOJ%b8!`pF5oJ0@h>;ICrzRbo4Tf#Qp%nGOS zlpFEmoafu|i0SE6gsA+fnRm}yfH2JI1qkKp%0>R%DtXQnWPEO;x9(w&#IbAb99!0$ zSWv%VP$#tRB+)m-C0p3c*I9MqTKM5U^C&e=`+}*uyOl!!C*OyyCj_^sC#F2jIQ;9l z!1_7tL^os{6Ao$1kBa3${ag6ks6~0|lQ%WVX5IRV%RH2Boh+ zL)|TqKv0VJemdI56`Ds!=fQ=vXATFy@VDzNd{L?ISxvv91qhENRa{J_xLN8YDyy=$ zl9+OjfN{L~Os`QT6}RS~QL4r{Du!4u0x5Uz3Gue|I)SE;D>mLW$*A^$r#!a&|9z9; zszoQCXBfTN7_I2X2)PKUHV5BVs{n+-YF?ohGSY}1S3MP>zke5R1b9SFt3Xaf*%^fe zwMO>ok@7yLmU>^8pA3M|-15SFeCkG|rb~g@9z3!A9WCl%l2Mhtfqzo4yxA}!DWLA3E47!x@=ZTr6S4pGx;r$z^ z-1oWsQkug|Zl@G9v|A2Y_@#7v(IF?|6K%R z7Y6@JyIVCEI6S>7iFn9q)n~0i37u7vX*8_ISTj|M$Lm zx{x8In`f@P`lGeMeRq}R@6iRV7n)m(NUKm91}F-`|E+Li29pMz$`Nm^oJSoeH2+?U zOkN0Tcdve)3}3lP3x5Ch02gvGNS9wUkwq>wLH`GfZgP>w-GShB6ofbj=i$_YOid-#6}qNMNSRY{jL7h^Sv9fzHVA1ium!{CKib z4(c%Z9LS01ABNFB2qs!>)iVGrJ5con}} zOXr_~xO;9x$GNyir9W7$FIKXlGQY>2gq`w zrUmh-0K(DJaluJN)_v8zN-%HB4c7w(ILOo^C&{1C?|n52@tVY2GE;^C8@*9o(HXYn z4iaK7a8qr)zcLej7<^q6@zj~qyr#Vs-^J9vAM~%CNta*vvSxYRX|-=9A>wqn`Pq24}I-$8Q-ry`Yt7fdkL@MAZ z4{s_Dy!7hdRj9$%+>RD}!6U!jbz!7ki6stHl_8XW>-A4#gQp4^--fg&0+`^5u?VM_fLMZUt+~ z{eIh9$3d06=_!}}#8a~{TF<4xR_VuKO4iROe*$mKmZb6hytMzyu#ja5xah7G4+gd+8qZ6ej^S-lJ zFi>U^Re5Dj1sCa#_MokD3XlF_$e02mX@^yEXI;B(vC9j`Df!_!jnAA$9lyPx#=R`?jK`gT5^LHxpcQ*9bvVXUQX+& zGn?oB?EP&n36Qi>fRB3a!@UW9Td+Udo z8}pRQ5_LE6!*98TbUdXRF2X8aYyvYSb;01{S>=Bw{xmqhqp8-Qoz2lGj2NEwARklX z-IQJSeCu0}I~1rXOJ93R;~^a{3kH~Vwqv=3?%`IoY(n(5=3FcQ^jY4Sym}2Awg!Ww ztdId>AmQ4E?AOW~n-N{52W@?ivJk?Rh$5Sd0Y{0I_KCQwS#{yQZ=~+d1MfTGU}K0E z5zJ?(HcGM0vw9E%lfWf|9|(DhSl)1Qqq^ml~gaPy=$Ydy8-bm^~r{TFiX zMl@p2ea-!Xi&IlhSPozzVax)74o56rX~24TmnCI)%Wb<=pLV%Cxt|?M@e6qaF=w8- z`M6yOek_cHh4m;-8RnAJDK*H8mv#i{5Ni?r@fi^ARKJH+b!4jAgEt}0S61MWN$dHl z`;~5@%=d_PphK4}sIr~Y1sni2o@tM$nXz<>ARB+4HNEOR>o4!I>HOJNaZ*UBD8#y5 zmqJ#&r_l1Pw<$8M;Xcj=QGF-WCYLH7!s6rcm$pB{ejyquKHCssJe7L0tfo8n!bq}i zSW-@f-)v2JouiPoEKzvJk#Hhig~vwNH7=|^2AE3@%T6BCWYKlcOWzCru16#ySOrqn zyBXiBAp&9Vj-_42l+1A)kvm>k4foQjrE{tePw?~IPhr&(SqmGH1MNgJ?mW13l_y~K z1v};knZ>#*sL?`Q>I_WMCmwM&go)x1#1L&>j;=+<>Je{qRjbS`F9kMwsWY(G>!e-2 zkdIQC8^W;M{Kd^60Q^{K8PJP2dco!=b@#tb@*fE$Jb>85YgG8VQ^!HzMHo^#?vc3g z8)(hyX$jBX|NIhTeu(tNhGhu!=v%NaOUnL#_hp~l@y`F;I~>j~>(9NN5e2Fbu^P?2 z!FzYL?Y~;YcfICmqz*Q1tC#I$BzO9jeG>a{Yryc#m;e8l|Gy9Z-<$`@{P#@nC(9TO zem*(BO#Rw^`lr{Z^Yhy&KV`eU0+QzFYd7}pYIz>*%kDm8jC&;E6`b{s`hI$#7w264 z=U{b1Jm`hT6|>QfWHuDiYY{x9o-~OUB^N8Zh?GIa?(8%IDeSYkWN&q;85I$>$#tUO z_&bWO=aBH{2UF^-le0kf_?9}N1tgpQU)+U~i69j8RO)vi^P0I#hV+O(PvUlNHNE&g zZXb-ImAL+%CaKArXn8_@4ews_Mmh2C_*bJK*>PuVw3ToCgd{>jjQBKX0ksS{q@|k^ zWo*C{`Fo%m;dqg4C^MJrIG&topu178tSct;IrX9Px5liqS7W$#KhuA@XZ&tt4gQGy zjC;{kplz!L4U-JgJpH8hIX&){W;$xo;lcJbr_8f?9)ly(-UC(?Xy{WBMQ&N=TPd$% zp*>uwa2P|4+_Gq*;R~2OHdx++tI{{+p3;7vr0(&>u$pK*6;FmKp9o+Sal>bIzLyvv zN}&at3hy+P*vR1T6h}k6@?G4527BJ9*C+#9=GKfKbi>t@B66@iuB6`LGa_OFE`kRQ zBG&c8GATV-KaJLRK0dv{#|UF0aWh+AB8fB>K8vChV0trPiB&F22pdyTuc#eXG%T1! z@S{X`4J?t{KrXTP)~z8K5iQMHH*1bL$tT%G_Z(Rf``OS^WgEtIrP=zcS3*pK$;9X2 zvcm{n1yP53U0acRG9!tvc*0Kv@L31FyD<=Fnp&Wo8@&_B#w25(U2d>d*D*Zs!*v?_Vl4xquZ#RXgMK-^h+|7tdM2&-0dj9^4S5U9zEE6Xhl~KKE z_`9f{X%Tt^$x&Z^u8*&V548GC(C=u9!xky&EcPs0`6mM7drpH~U!JSXU32W+NUype zeYa(){No#Hmq0^dlwL`iYXjnGGP(^_ua&nm!pnP&mDCj1$qcZl;396qyXb2b>@?bbOs|cT|1of|WyVMBNG9J+iBu zkF~H>$8|A!nThy(l`5NhGe@4EZLmlt2&?R8Cheb)@VM$^N0x*54?htZAk1BtkYW7t zPv8yIr>_#x7d*kezrBTkypWg-2<@$k%lJ!_v19GasL`vYRFF} z-8p9%B(E-8*?aHSi#PROqOOZC|9L#JCtemxdgz@5G{5Qux*BLc_J#Vh37?qZj_pbg z!-=}23sN%Py|Dw+sRdqo2uk{PC9rs~+7K~=AgcVy(oh%{^g@@CkzKMnd&v&!<>iy* z+aMm8e);JeVF-SIM~7IzL@Mg|1(C$sH_dJ}TBkx0d}vD-HFpMQ`v+rN35z>sjaGb!yb4ok5d(crws751JJw2y53F)24aUe&pQ+A(6c zR~fN}rDSo1wTUx`ip*pTAYk);>f68SercAO?rd&ZKitdy6xIC8m^JeZkO_G|OA;q! zODA8=RJLXn4>#`3M4??w6J||zL@X;=MR$@?F1HnIhBTzDw$#Zi1-<^lEPgpQS#X8d z)O4i)Go@!dOZu2*%3^aqWS)B{St9?&fO}3*A~*EzLd9{cFs&Gomt)3UCCf78to}3x zfsK&IA@6AsD1_aYrX9n1_!*>)w9QE;s@w!Ut-?)tz5B||zMzfMhNF9yHHim)O7m6} zLV)0l8-I`{fd#J5$EHb+j}XI;l;OI13Z)P)@9x&=S?0KcOr6k<{DfbYwx-hoEI;y@ z_@%k^sx$y~Y08{+yN?Qt#ssbfJiS?1wQsyVLg7b{Gjl?Bpd15ydeLM9QmUAB#rT_* zoM>6jn?Gfp8=UFQ?3_?$N#lgcn7aEAI1uYTstDGZZ7l8zgp$Fh?J2JF1;jk$+ zQzTTTU|+$0Q!O0Y=AC#kE{ig!V(1k*8sr{Tso+WIFVQNM&35ln=-K&x; za}a;_$U%Hz{0i-f_N8q;tbXs2+K!Xu4$11dDh(w^hs5+HggU3`)zXB#4zX$jZsB&b z`(>V*egsA5IyX~H+Ld!CcYbNZny9xd8u~db<#h1PqunX)v@~=7r4LfNIgs3Y54QgBmpQsPQ3%ulbI*{Yvt*EwZ&@4lonn5=_OuO==<^q~?x@t=-MD2sYfJX=tb`-!k zgV!Y|2*Wwp8kEdTt=;h@r}}QnAZ&JBA;H(VaX4&E%lFpdtfVa_fmlVS@_XBBL>pXX zqjFq9sjzroucthh!&sskOr+k_rXoJfba89)^>_#M3Y;*{PBc#|#G|_r>th7JKa0tq zgao%uKq@Ffs%jb(S2ZKIyA@Oo5mX7$Y<%qwwWXH(uctblNL3@6#d+APol|}LtcXz4 zxs%UsqOLQxVa}j*n;RClj4SDI?z!{_X`cNPIDP+*wg_nN_^0v^&Qx3X$G2^rQ)$go z_Uli$!bQ6X7AXH}t}g!5K>~DQW{4!@gRa$gpcPyeivcvi_#k-G>a8Gn-?S-^NM8E` zc*?gpF5QY6iOgdM9DY?-L5P)C=+ zZ!zuqaxI0z-iEY=SpmM+9pHy2)hJJ@&W>|D0UIn6(QtT@3@Kmc8$vk3Sxn={7b=d7y zmGx8C5Wgv{eGf0XS0?;6T~;a^V`&fC)m?*B!X*nUdk_!uEhigsitETaJIf+iE7l6F zcN2;M;I=PT1xH7G+PC31jnIPGJf{hho&?~s3)fCqYLO|LBwZD>t>Kivn3P588v34c z*Hgo~BU&&{`1h3;6kDpYFj5Pr@iXeKoopHu+OE4S*IpgecI<13ZK*_r&y-Y9^JO_p z8=e~Va!^5HVf<^IX*oHthPP#u6q>PGUXDlaVYoiz@Nw>@s;ciV{aa;LdGnE5q*P@I z!c0E++U(@Eqd}!YvDMT`dm#8Ne@J_qM_Ax;T#QMmOZHQWBYNw>scX`DPWN{QQhvVt z4G|bi+(tXQ&hZS}T5&kPEM++l{#9x~QdQ!lKyuvU;MwV?wds(1RwJPa!nXcazcLkO zhn=>k!{PN8;oW&QxL7d4ArJgp#@1sSuU3Y-qg23=j}~tck(s996YG=~OGNp~x9^1I z36)lQ!M@E3z+Xh!=pH^BE&ohn6SR2E9*zT@Qy|LagL$0KTBG^%@WZx-&4U(xH@uuJ5q`^~GP9M7 zXPb84bV}*QpZEVTz+&arm+Bu}b9zLDfUV0!^_fEWg=%0A>K3U=j)at$yR!g=|9agTb-)BHvCvrR{tM{_lg$*e}$SI^t=kX+u+sE z^PM$|`7=yEFX(m6$-W4FSpYMZYbj+oG94<&kEM_hhXO8h2LV*WiR+IS^4(zv(Wj#m zkx!VXl%}`m>NmXgfU|$D%oU^FbipT9Q?~pE**3u*RvFhYX~8_;pBD!NAJ*}(kqSbM zb3>XKjW1ZA68TV7TxQs8lDxwPvm=$c;7J?MRi2K;+L7zNXeGG_6-zDEr*QY@atala zeOlUuX06+zu)w)pU%A>Q`#na%Hy)TMgQrR(N9_mW4u#&+O8?>_G^&%Etrw1(V~bG8;Fa6&BFL%F_^p6>i~j zC7A#4@E}y4&N^9V!()Wz9vk{G+FpG++?ODF-D_G9&C|AXlUgHHa~l3rNf)tzFg{9g zPu{&jj6S}fxra;gCrkdJ1vz1NGmJ)Kbz}XKC8@mt_Ck9tb|@A(2E7n$>R(`DVm7Kf zSwG&MsF^O>S`gk>HdcRaF1JQ8e)9rsp5rj8 z|HdtWMxwP*z?Qlgg*7K3jq~OHdE0uSkQ-&T7nN%;)n`Q`lMz4Fb<4l#qR`zY4&upR z!>;V5;;DiEZB+UHYT4x{SI!6^4BHjtPfs53Ne91iK-X!JNdk44I?;?LoY}dPI%@Tk zLDNqXOu=fXYM+X&{|9otIZvTOYh5%UK|Zd^%u2eM#>?2#Y8CT3>|rsp17QmxA7aap z3}jWfg2araf%cGu*{MqTO1H_6u-4&wZV!Z&%dpBGEJ0`t=oIawnnndN@6DG6<*t{a zMl`z9nsZHhf?p><`|(EXNOm zySD6UCY_hJ(rC+WV+|`qgW!G)_j}oicDvvF;m4GO4Ek*!SVV-!6_FFBq)dA7fIOI6 ze@}9tZ#GLCpWujsGu$j~)*fDv5282`#7*jP77FX4L7dVz$Ik3FLnV|Ww@g=ZWq$6C zD%Uum8zqgj)T;9_L0x2!jb#s5NjF?!&ACBH^-l`Hy@#a~`@Xt>Ce$;JyZ>xj2RAp} zdyjlBVL00MlUOdd=4wl%gb)f+DGwKIAqEkaxvigB%@PO^8kUvzLrG_B^jKo}X#8+G z;Z_{GC)@ND&5y|h_hB<-!N5lAO9lqmzLzzp-AkwfO6`?+qm&WOXw!ylLvTn-Pk;4T zT+B~tOSj-)_qW>vAgnqjAHE3CM-C^PIxkj&Lk_FY$xeNU@9j8)jsyu;L(89Q{#x4* z5@ID`%rj%J>E})J)PlNKq_$k47;D}43$QEm6-0jzxoZ=-s{b<3%VU}NxTT@2*i;}T z+)#cqk30>!RIi1J&85t!~PhAQeO^NV`csQajPTsL$@tzkdKZEJ% zNVw!#ecNWJEq1cT!KVhQ@PcSKMF4%1VDlar2-hMl=5C~`^5?yNT`vD_THlptqG5@c zJHY%W6&?Dxc~#7^PI^J~LDKdVM0zV|%7t)Z>*4&zz^X?eg&vh-Uk<_}Z^)XUqfk>Z zkaejxP!JwylCUlh=AiS_-ekMepbH$MCL96g&osR0u`jJ<5J4X0pS{i35YOGuOWRP( z7yVlHD8FVtSR3WbFZtP6iGH1eO&X+JHZ+)9AJS8+i+fzJW!OWW$O5e6;Y#gJy$@Lv zYcAX<9klvTlShnXsqtly{ff#ZD3STfzrT2J9(N72_)u_Vv9VhhoMKGolJ0a49fz%Qo!BnGXf&;iN0^C(QQyp-gtv|A8kI8Q(Ty5kNkS8 zUNd*MRS<^T!5(+kzU?xN%X8gIn;ubqTVq64a&OymVFm#H(VXVh3e@v9^|>h(fW zAR%Wz$0i9_5ksINM-cf(AQk41>qBZJgxid6syH#`PnZ3r=0_%>iPP`;FvfXt^X4cg zF3@O7D6$ixe^j#c=)czEe)Zp)8+_Pwf#qvVNL+)(ow<)nxo$&z8W>4y!&RFdQM@4j zsK9DUd&8s025ylV&ix^?wI>DEI0{*Jn+$Xq`=s!zv^>%R7rj?M=PXvJW4pt7()2xB zK7#zns!Sn?_^_*IH(UxnMU(OPmK*uN2D(ohKrVUgls{&BSuCXfuGWRUn={}iX)$}L zmZ!YNhE<|VV(PMEnf}e?!c`JYusOQnMK*C^JE6LHv-jYPqY({AK6yJSq~-Q!4^$WeZkc#dcjL)Tn#yI((si!F zShW-JjdDYT8!qq;MTQG37mj-*Y=boOQOH4f^@Z%g{2Yg^a7R@9`BO2l?AX`4Ya-IR zr%bMO?!#9rQ|!EwbwKjE@~-*aMZpe?LJyOR8@>zgzaF(}cqJ6VqjHF~>fCP#52QTI z|BsGMSnDmSudL+WkBY||D>~90uop(>h*p%DtXG?28+7RYZtapp>M6+8s9XK5r~1D+ zyqW~!#25<;kkyUsLfbU=H70O6e)()mjbmOG-3 z-FZB`c+T-_-)?P2_DG;SXuHpZ=is&YhMM}@G^C3uy@WW|g;#?{&>h%?fCM_Te%M9G z=~!HspK?x6AR&i+vI9DCeCERv2^xu^Or>TTJ(6X2%8riFbD&n+F>+g1GmxvqG2a0K zZtZch>^{M8_M^x6g*z!phu3ximiXGV(7}f!-Ka$75g^Uzw*ZgL`Ae_G5PRYBy72&n z-&Adrhaa0O=DrZQI8;YSTa}Bie05TguR0mk%Qf&EKJYL%s;o8f_0+@h zGjBZ8CSP+zX78PQ zPABh8d(S{$A6!k`<5Ka2{tdI{9yRD#Kx)=>-5s4*>?d<12Bs^Nt{jAP>i`j3Vx`HE z;XUVKx{1HbUW>C0NTZV#$#{g-ImJnKC4%6dLYM9*{a~(1ap=wdIF_%@%Y*U5p#?FM zOa|RF>Ydyfw`2u%w0 zpwBKPQ*(F(@gibu)uzH48HdRJXOY!b_kT@1m-?AlV=}2T#}k+?S-LZc|nrey4uMbt4p?c-TGHp1^Y1C7_RzElw|HjzFz4)OOQ9w=e1R%aTe{P=d6rUFKw zUeU^u2QCHLs&*bE_b1+Z;qsgO6E>$h%L)mr48tWbL}DCw5>^TB(&Oxquw;Xw_JLfh zj#bOHl>|f{PVVzk!tS$FUyBxWo_d7!h2eUX!#%8;4snUJeD@@`R(aIT1g|h;=-G1V zWQBnCwc1qb4Miol>H;eM-mR#&bOF`l&4xU+_haoQdxK+ZSKYz;!XA9Jg$1skc&swSSmdhMf0qhmRJdLDyE4wBLjfD9frf?i^KactRrB!A zT>W%+TpDydkRW0}I-`4|!oNT+LU+5QR&G*lO4fSWKjJPiLC*|Nx&*4I4_#keef1&b zy7~C%LEc*%<4Z;e$A5_3A4{aD|fYYeg?ZIK=4IjvU4o+H@Jd3Ia92A{IM0$ySyrg zJ$?V4cgyoj)XohN`=!$m`Abxvo%;^WlY5XHgLC7KwyboAY=3j;4QFPLoY)Z4zP?{` zhVcGNq&pMhR*qz@qN|FWkm>vrIx^KNCmy=nwGL!XcO(}3?ACwpYj~I|?eK8I)7)K! zXI%YmaSPIdpF}%dl;;Yohh;Xp@-LJ}7U{Aut}O2)wU}qXLuNSJmL;BOj90}j)(%sV zwxFcNyr|alJ&rRKtWh=`rf!iT+^-wJ4_8)BdS49NL0$Z!ru=TIQbAG<6yI$SVXt+$%{(JNK%})4X)89jpDyrMwgOPD z@)T>lroG*lzAimIk3>amoo#CT8><^5WAYJj-6JEd+#){8F|`mJHrWS4!=bN9XGzj6 z*$@PSf&$?>fY*m(UUmfe@kzT`Lb~^cMR(LYscO3Cs?QEHZ#9(ru^!((qA5gGEXfUz zUG%!dPRu37Zop>AdT@$|gG-PvajeFs4s=fSPFBSo0G5@fXtaEn{raBDs*vTe@k{&p zA@KIuX_-E!4#M&Wa1tV0J+ubCJs{t!59I4vl)tDu-_U)bI3dpDkYprk=3b649J@ls zG?ZD;p-G5bCQ`1uO5P+^^a;1@wTI5f`+-|zCLl8YdFjjBZN+e#IcHAO-F|kH2cka# z#V`$!hK-5qOdBc4{rTKG%J|eOYe%5sP&*jDE((P4b#x6{1quTRH)|zsobuP6d3dn| zd`fp^d`cH~yIb%eKr+0tglUE}m3T>Mfk4#V3A>Xecl>cW0nw!I$A~T_hEq8oiYdiS zYN^ujBpKjoEFcRjr6eK`Ys2_*vp$)wx|Si_xFZ}!-`8w6c<6rTRotJjc?resWlx*1 zx8B|!g^-O!8#jL!*_O1sV_g3*eEH(xT~rnDvp4YSHO-dg4`k`81tPILCxw@r&&gif zFLjZo~NO&vN&9yvEfa+y!t|(`be_2}OSJO4W3!`j6iAGva!TJ{Dm&c~vKY?*@_=vTJj$P91>kVKobLYWk11mrl<|1YM5!k_|Q;H^4Tf=*KD(p800BvLfsj(c9ZP-b3SE*{rD zGz`*@f8TxN$K{tVYL8iKGZ!-0hvN`CMUgK{Z; z&bzx}8;5K)17ALC%%rGrs-IMudn!yaTiJk(Z=KKjUUYp^so}E26dmCWsu9(F#uOJ$ z63lgUC!BfyL5JsjO@Wwa#*;ZAL&K1GHE!K0j|m=tGI>m_^zXNi7na+e_cLvyS^#ahvN5 z_u)Q~pO`J<-T+aER)IAEKORRRZNqVQ_j35!kQvnBzOhTm$59>qJKBLZ_JSs(j;PgebhVX0)lx7G0tU3{|UX>(f3aQrXz%#05+j0=A)@;Ip!v^z5)}e4ieXV!m z-DQwW^<=$Cmt~d#&w~8MNyy_w*tv)WWata=S@l`#pdAm7Hzql0p295){-XDiJO|A? z4(laq&BJz6OX8+G*p*SOPxuS{9h>5z^l|Rq;G3@f0TiSPXLu>Kqi!*5y03GD5~l7x zqeldy_K3>tVekc_f=yEs-B`parnhq`wAK~&)`Hi$YT~I?qtkoKDp{Pjt%^&~bSAelCb}7Wkg>6dZXZ#v7L=mF{wx@q&W23X{TVz>e-gM^>4AL$*ZZuj z^%T`(Zg{gsc)TiV{C0WQq{B=(67`{sdH3^gX(2B4mVIqE^CSjk6a#< zVT-k9X6(bet4QtCsi?FmQT2#$8@{qT{OuO79ub?x&zg(R{LIu+IXA`E-%h>rXoh$T znfv&Cvwv3S1pl9Ag{O%oy*Mvw1ErhTne2(_PZiOp^b)K=V-fxA4X?-flS&+L9LSzt zmVCHqA}9Zq?G67T<1uM?pN;R}XJ^OMdluh5Cn~GN+lh3s+d_xSg8EU&k$MMVfINcJk-VX&(z0 zCPzn*q^}3_uV}mZCyAMSx)gc7fl2*GkC682L+iHUrJ$ya(BnM(QuNCKiTrETMS1z|wiwt@ruIG!?E=4?pliECD z@N~}cPn6SHa~D=^10tG^F2gD}rYDYBVl2QRdf<>!-fHb#P!JTk;Lp9=@fHmm8nwpXuIcPWnZY7a6QvBhUw(Tl-(1rtGEL2J2If0b z@7_dGC13XI|BRB_;nh6j?|+r#+@E`GA1Frn4i1q+ld^w*%)UI|BIgZ9Vjt-7&)1H#4L~*y2~h=ZNaeSE%|~OG zDSa8?@dFp!%u~ybI_2=7bFsV`;p2lQ>pN=()n=TUSviBXz&xM+)hHr=PPWAz8PYPfw;!m%7c&#tl--qO9xd@zdY>OwSni( zO`k;cA``9UH=9aQ-d3xactstj#H0{*w8}C$138G87eo(n;p0UZ84hWh-9< zKstYCF<0~cr<*?n{!h8&Cpu6{%UiTWAn&oIu@;7?m0rcC^2xwgAlYRQKCzj{bO{TD z*##VgCY;O3A2U!7ByO-xT9*F9aQZ(Ms0KlmZ$pC3_aPLE%;(?WvXj3nU#c6fxLqED0rnI+ zt%aBZX8Yz-c_w5+Q=YRiKJ#GgY4qMOITq@@u~ZqY-11o+m0;njDG=7S!V>=A9fn7- z9;iaM^oC9Wci^#ptX?5K={vxybN^Ma7lW#*q(hEt@xZ+XN+gR-pY|f~9|lL>NX?|$ zTkQ22Ef^$q^FNaJ$|$Mg4>A@j=mm3 zet`+aJbIwP2i>BvJty|}4Qw(wgV+oE5)K7`vnI%$h*nuq!Jp94T)5%qKn(UEzck>y~5D zm2=s=_P0j{10@>(IoF5i!ijaBmf8AO91F}JQ=IkUo`#H1<;x#vNS8*mZHg}&j^&a= zSH)-4KxQi8`ewu*gyYYtbL<)i1DGqcowmMbqm(t!vdJ6o){-JLSBtj`uin3QmgsW0 z0ELeNE)%N@$qv7O6cOGs(oywGj7}Pz__gW3w@ix?fywNWX}=7h!3Ot(&tiBgfKd|< z3MZ?+XNmlKAJ~Garh%`GwNO8c^!05niTQp3=)ZqqU8RwQSg`v&{edQrHN!_O1+zxm z5*Da*Dc!|Yn5!;Rd#_;i3`iMy#{S|NO{Dt%=@U!{U&q4*OD|+Z{Av&vq)BQM7!kdh z206GICBKJ9dhgZJu zjEwNX2ux7Fz`n>$`=gg>a2G=!1)~IFip=3Di=Jb^VK&oVZMe;VM^=Rw-1z<+i8RiSj<}iKe=r#~z8}ed$6KMVWh7J}lwq|CcsN>h`UMQy43Gfq zJ*}V7Lg?|!+dnbfuhgIbzHn5uV*|9g`Co00CuNd|DeG5TsZu*_;$fPJ#q#F?-s!U7 za{sfC=zL<(oFU)<1NIs=5h3;7dmwGZI3%@BBsAr3>HeMqHpAjB6}-}6Q~zdmq)pNc zZ7*J72$<0LDF1@BzY-#0w(Y?Ie>{!aNPQzAkIKXEk5%%o>oBZ}pZmo3!xyo;3UwKE zR{ASIOToSFI|1uuKK1a@#E*nc@l8pX8#z=V z0c`!(Kjz#`9hwdP0FK{L2c{TEvl6_w16L-^@yjBnS7DKVy>w-NcSE=FEnjM9(SNMF zoWfzRkg5V^!yW{zPapOSJvS5iDn`tM;m};1piFlbQA#d* z|9q|6*8oA<)}KAJU0b)~F!+;UYE6*A&9cLs1drZ%AsvD%a6Ky#Rcm8p4*X2AvX7MDV9NpnSLb+DpxQOKd|?=#M3h_x`syG-P_qAzShdidGTt{s-hHSXaqeS4rL zAH~B00DlXH3Ohv>O1hHd4$lWL)h_)wa$-U#u`->k)vM`e-QnIL7hyuBKrr|#F&g(d zH-2`JpY}kkGK}a~4yS?a@8K+3P+XQ_NsBfuV#|UVNmI8Tl+VoJRf;qhoC5-1XQLf% zg;+VtOKR#SZTP*hvQl@s)-7Ptb0RW|TXZT8X^AP+m31$k(VPF?_r(5~`4&gAf{I6p~8>tRAQ^{=F{^G_o0Mah?PvPJIj-o_ekf*5yS7oP3wgJdbjrFgXE{P zN%wbv>PvWGdZm0$!bQhlqmg;?6H_?21XFI3=p;4ByXC|Vzx;;$Y!$xvDL7_s!aGE1 z&T(C6d(E+VtuUJPQ|)hW-g64WqW2x~m04qF2RuE_7suSGJgKAFa|%OH66S=w3!Cvv zWI1cuBlhd=w9j9Ue<6`JRJvr`slph#MnfY~G%MBZm$k#V(St%iyAO?q8rslXpHfSvlvb=4-o`tHZ zzjxH`Hvg9>>eSCKpEb9Mw$%MeSB&eD<)#iMM%s+0wSM~7tfF7xe6Uk=TxK&VAzw|S z3Crm20}C+Ib6uz?UobNY9)8L<3Dwd9lZ!M)4I7l&7=_fJ?(!ZsL(rWcb(cUnIzDT+ z@7fFQ8#F6xM9u*RrNcL6gnQ`!!QOj@HMwo=!hj+j>C&XP&|9b$szPWX5PAy;5)h;q z6qZO!Kzd8)C?x?BI)si$m#zd7q$ypB6~Th-i)+7Y?S1xs&-GpB{5ZefAGt2bGc)Hi zN9Hp#<{0C?Z`ov=x5G_SO{Y*?kS$;QpND^Dl}eA3S*T8BdNjv|`GAVx9}H4;%`REO z{&aSwTIJiS{XwJIcc7tzylS`84af=0hJsy-2)&box<9QiMQ)#f#yUc3PfU)wx0mhA z4BJk7sZj%W#+Q_;d1y~97@l!guP<9RXwpi$p{u;!P;M_$$sJfoScXTR50T~fy8;!j zTD7gQaU4fkOitFToPMoaJKC4aH5o!S;Q7X;tC_!enUiZOfU`FA96+8U}KGzq} zG6BBmO9#U_ZoHd}`T2|ah1PPPetJv$4xt|T7`W*XY83Llq=RaLLRD7=p_}%D^e?)7 zXbbU(&cmcMcMR}|KQcZ*(Bo;%Ve{vg*+{2kg&>|d zZ3?q=HdLbbl3{YYyDeKfF7BvhkXgFW!d#~)49*@3nX>_yiaM=$waUbfAtocDf6*}R zjJikt@HDR-edlKD*Nx*j>kw078U1cs(D9Aveu5emuewbe-`;d=EI->{j>68n+En;l z#R{3bprTshX9%^DIN5+lAs<vhWD;eBRMyg-g#%gQU>Xa6seD zJ#O{=P_y9Jh7!|C#=I!2vWX!y0mdda=Rr^)Gv$XtnYG@i>^Uw7nm6Y-Wa&TKWHA|; zCd`=_34vtfD-D~sJpR{w{MsWWmq2a!?td)#(*`~*Zm z5BZ~0fbDBr2^^vH%Hw)*(Yu$<2z+aP|J!ve|5WATf_(rqPUc8<_Bx!XZ40K8y7%rE z4N+gY(qMx*ka>2=s+xn2u+(3J>QK!0kAt)nQCVSsli?PByIcbLk^4an*Z1+Gy>+d5 zQ=1+R%F_NDz`C=&nh)E$v7&|pIN2o&-3ZEbM{P)5<Fm%76sxvthH0vE4U95+6c3h*>4v6fY3AG>~TH z;YV_60!+KtLwuj2M;l_?X=?31y@N|(Meb)}F!Y7l#)jw&;` zO&InT00YQkk^oD(^4x||wvgaLO{*$Q`w8S(vxi4aM0+t>X5_*t9@kuZ3Q(Pc!i*q1 zG{rIZQ%}%2>6JaeP=g>0c?s7^2;M$rk%-=Ejn8mB3c=ocI-9QdvGICqR+4WZB#|xp zE-drOk1N0ZtE8nuctFk_GP{(Kv~R+sd;__Y(YnyLWmA5SW*sG-=NxoQwF+sa^6DN7 zbCK^K_Qwg_Y!-^MMoV~I{vX9S0Yt^3mON(gJlAd*Wsg{H;Oz$qt!A+R8s%L4Aof|? z4l*#I2`y^or7AGkDl>&tiw`@B-eQuGDs@}00T|uRbcg*A+yxX+cp=$ZTN@67_u6aN zpBqoVRT4Ln;Z$aFKXXc5A&rU2S=Lbti$>%0pENXm%5aCAxG9titNxcL2{rxmaEIgj zV-kRH@veBsLv0E39=osi?jjLGCzm1>f=F+LE@oF;dLIK$y!ZVstL|rp6R#h8-z#oY zW!+B({&P*k`^O@V?V_@liMTyxEKkXO>_yoNq^WLlcrf;=b{;hth%?pXRKdCoj3Zus z+)FyjT~#EFQ`t4{Tq%N89GKXy>4e02`|-6N(W(78V$Am#^u^D=XtK62k?r<}S>zkm z*Q0o4C6*_nf20OYT=r9(9g(PhMxdO@Af0jEoUPWXrWnD%ZWeTX6~DCEuNlaC3#G>W4H9JR?<`e)yB=y8?+|VTC z%W~{{DQcp}Ugb>{!;hSpDk_uoxnutPIj;1479Ax?fvt- zQnwKfBlDr8XSb3!N+Q@A&J6!N&usVRPlj#S?|qQjSK8v*@7g+JtBDI+>paA3mT)CM zmM-n6PycaLke54kkfy7ZbG9-6bll>WToyxZUJA|qGM@JYgF!W#LEKi6veKNXH$6A& zUid;)!3+wr_aYJKLXz;JuC*>Pwo@;hH`zyqPnyUL>i2ziBW#OHFCk_ zb?UOXIe^?^XVq)ycneJ$jc`HAh#9YNKG?BA!O-?pky(|W$5d!}w~(K=z4-*rQ6T`^ zZ)D1qZ75{Uu&{Omd)85A?9@O7wNoo}+_(Wv%J2J?NTE6T&KxW6P2^24JKLC7M(b2h zZ=OMeqROV{^>5uq9Bw|zK|bsQQHi!ky9Z@315YO$|uOis&+$?3|OddJeP*-M?; ze;;T`?PF_++TCw__?kVId;k6K%XT?9v4@UvCb0}MVxkOiv6Jt5SqkfKq(nXAsQ7c5 zQ3>U;M$fpGtcxC34osu=*4zy}I_s%ea+Z4DgTu`KHDLGC``;pOgNR2$l~DD>besT0xO<3P^;9+cjqwwo53UzCo=~s9(&0q73CY6OJG3BK0?quqml5|_s-btqzK@I3 zJFF=%xrBkKLf!2DHirQPO#VWb`vghYvMy7{sN|gdK7?aX(C(vhaJ#qy$wkFsFyn;R z#pqR0Wis1~hn7-iyQBkRZNcj*A%z?DpQ-08kJ4Fswz+FKXM_W{4)IK_OUkxcsEf*# z{O31F$MP6dXX3>9oAm8>_@jr%@i(1Q1*ccakyh+Cq4XDCAgUR;55n5Def+E3ujg3) zqM294CtLBfO~`&5apYW}gEc_{O{LzezS4ZQ)sEr}BR^tC0SS?n!~!k|X}_@WvPnqd za>*>LYT<~~z5EYATht}`HADtp@nm11)uC4FJf6qwn^XS6gDR62ce*ELj1CF2R^Ra?fHya}FHO(bo z(~rU@V|BGSBTZEstGK`EU%_vmCJ!A!qROvz5D=}VRhO^tel-TFYBvw4&iB5~!IgsE z&fvjYb~#gls{#_lI{oP_vJUeH+i*E}mpSjW(!`cO_dz0#SQ6`{=Z}#Fml;0Xw5j1(S{+UOy}+GrWUag=%%+$IdaH6TV83@CXY$o!F}y% zD>sd_93o%f$}UP{s@Bx&!jIw|$a;J1omIvT@&$rJ_2d3IM6HTq3c-CpsUR}l;`KWj z0c=ad6}Gl}?93(Jk>O#zi_#fjtBS?3e6aVlKwr8p^|krbHFuYF zW()@7Hbq*MXA+<_OjEf!Gx0GpR$iPaU2!y2mEKO}C){&p4^Fb;A`*xhVR=Kv2H>JA z?Z#K|lxIbqt(ZG;Y*p6gH?0-4zR1owgrc^mZZUOZQdAc8j+Uit>|DsVr25jm35L3B3_8a-JhprqDR>;VdfoHao-p zBvIdrLy|n2U3K}Xy0c5G;rh>W|5nS1Qv3W6t>8SMFZv~>*Xkwa!B38!$J<>t@I*5j zUS96KQ7L0$`~32|>OPsbVs|Rkl7ePNzQbC@HRKWlLY$slwzs;hwaL7&xp7b$ZL3d> zH{NBs+^ZHu|Hu~W=%S9HyZF9smmL_lQ6e$fc*#qn^r)Y&ys&>(> zw;>OaR*4-qwEuXl^WZm0pnOrv0Tb5pp6EWOg0}%dK05SIKOPQj#P)myCg1G6%fYSBZ2Zu{O~?1n(<9R|K7hwO?Q6=IX&a{fKdjgabi!l2lb; zL7hEhu8fc%A^6kJ5N4~Zj1hq*H98a1_6sM5VbiYnHC-Za-SIRHYxrzBjKs2j`K@+I zMV#8PN+SgWJsQ+5$uP6D3#F(}UCI2`{K4KjdhjO)1{sU1TZ!8En;Ew~5OCLHZ?Klj_vZ-pHiT}_)8F@>tH7FECHrA`tXE8+#IL^=G|Eb58+ zUgUG?WBmbs0p{kQ2A-PlW%M`cWtx@ISlSx?2$R7#=K|p#V~$iloBXUF8(zO?7Blw} z?a{Fg_V!U9(xpGy42NkbPwIWm@8EWVM;S~Y15LTe0c@<=pG+*B9}%DzZzabA>L{E0 zRiY*GtNSo+`ID#t&+FfYQ?f}ffrh;8t)K5pAGsgl1A+smPRou+ zbh;1n8{-FHP==aZ7Cjkw#o#m|cqo-*$6CkPk~nJn&F0F5=PoEd%%JY9VN`L1@5G=0 zgxh<+Hci09rm5XpaO5V5HA~xrz1h>HsVh>K!mV8CdjH8f{f?gyB1sRj^WgxwcV765 zxBqpwG_9^hd^G5GPF%{PXEV7hHz7!H%A0F3P9{GyLlv#C8`f7&_x?x@KhO$cK5_tt z7s2k1G!wIJkyOYwSG62f2PiZMeaWg!I6O)Efe?$x*iK7s*rd-c?@mGJtI`E4{k~2; z3)8+OVQ@wK+NJNC!PDGrq2hq^#*7iroUArdzHf<|@;bd$nbe%zgGh2aj$T5Vruc8J%itM*D$|cE3WL_AT0g{ILZoWC5yaNkU-)7P@vs&~r0aotpf;i~M*P@2yUEmaV zuUpr+Lp~eAxm#w~SsZ*;nT<*)dg}x-cU_NawGa~oA1Mx$C@D%x?<6ztt67QTC|xor zkQy(YC?s)WrMi(Z^wD{pG1ztBtM@b9+A5mM1Kyc{m8WiM`c(d-g6jt+!@U~?uh^x{ zt%^JEo3u_Cnku0A8FYS zdA`5pHj`Lr4EG3X;M>V5fP1A#v%OD}A?m*=)9;%rG?FFu4h8dl7P&9C zX+|u%z7O1qR-t* zo0JcpIJ10kkffQI8kt@H(jsgA(d(qa99*tzpymHw7-ijsY9MK9)j7f1mLEOO%qCykGF@yh>v_1^-IH(5@mRwaaR@2j#$Sq7GBb6GJpY~fk zt`tJbO}8s?`jlM~`j`NvR=7AVg^Bj+w7W3b5xTA?Unp6nCMxR#64G3LW|bfw6CD3h z1e0_Kc<1?lM%(fqFp-bE|Jnr~2Ip6eycPWI^uNANJp6|MSeUpKD`aggC zj}iW7CH!AM1@2$p#ABq%?3}YbuYbQdI_zBJKKv6r{ZaZKTtuYe*TmziCATGK^s`@` zAN!cG75OCW!e$ramB&$!uUy#dVVpfMG;-qju2z>iqNnY~%Bv7ZSHAExQzixOjVkae!@^h4q+70`es&rRq zEj@q2-xK=h=l*S`|8wC#zWo13CTSuDeuf`W2m9yxq>DmPL5PulG3TVRF=loYj-nH< zX+lsJx|+AcS2ZJC5nFCy3USP_1U&sk^SsDzoVQuOiu1xJq02!j_o&M^i&bT+sC<53fQ_**V70A7c4MC-CaQ^XTkb7A*sn8IY=`q}9S#Ipm7{B2KQk zusH`}n>3$mX+R)zL0<8EVh$)bC^!+Fe|%G^d{e1G_3@h%thkA%pS+p|K&N&!AF6V| zanwikW!1;qtT|l@vb+()7t*6Z!gM89gsZ6~@{fS2%g*n~@XRGPV?Z!*t{sadd{ybQ|vEa6?jcA2Li=da)137x&>-4%eqk`GlkgkJN zO(p^65AoOijI<#NM2-Dr6^qYRYgW`XJOxgZ97m+cKb`gq@7g`;SWHFk@S zr4F*YbBvA`U71C%I-b3xVI+SsD)V64AO7xBJm$X|IAKMHaLP1SeI(3d9LLN& zB%dohWY*rEw;H5b15QzsFPA@~T$`LMpvSwvBHn+M02DWc+zfI)7Ec~$byzySfBHHL z{1M-Y2tb>c4SfQuE?G6Oz5JCw;uby%r{T4@i44Sz1I`qrm^{@9a-+Z;rH9kXsA{07 zuCO?l34bneY)ejGF!n(|fW1v|xi-{)iSI2t5UB^MhlwjJCN1K76}$3TCBjIJZ%zli z->~WF*|#K0cq(;yy!?yEx0N_=^C}P4oIoVcX4HD_Mah zw`70ONYYzYkiwr}@R41&dX!!9L;gNLv!2hI-!5@SwS8Z26W8vX#hYy|oKuFHd-C|O z;|u9QW!XmeO2RvG>Mhb;Lpbtq+YemsbErwL+JfTSa}9K41gDf9OrSU1Qc5mz6?mBknXH7DkN>Kc>N^Bye-R67a4qf<~|8 z>KXadv=zHrh1nePz8l(dT-+}F?m4;e_-wZ4^}OpJVpKf7Uowq;;QVmp`=dYJf93si zJ2^c5Z<>ZJ`59h9<}!u0xnaD|X8m|*dJxo29O`!^teWA|17QXZ1wXg!D`=&F=k3I?xLdeDCOVI!>_={5ilFnh8`dF7b~&g>g9z{$<{IHX zV9OFP&?io}fYPDZ;g~q+brD!O=-eQsz$y6E?|2kLN32Pi*!`ArJN>z#dr=#92|Iv6 z=h;stzbNlFl1|J7-`zpUXCe0|GrPKfxSGmzKl=RWLgp0T zX#47}&uhj!O#P`DpO4FIQx@e)^*B}}JtAdDrMjYcF(fMLr|^BqGaROfMqGm}KC6M@ ztJvT6xmpz3kLg?_A_j{hx5@)<(?lEbhd2!9u*%e0vn{!7?kDGyTb}XAA_FN{f=5MF zLGXYbJAE8^5-KMZ<^9H6X=ia^ju#Z4REhb-vu})QQF@IMe+5CEQ^>3_4q8#^BOdv% zi7QymTZ=qUeGVen#T|u>m*E+nq@uj%l^C9}T3Cqx3{JA1D+LFU&g$*sP4X3-{8!`z zc%RIk;&e^-F^erv9nOR&kIKx{TZFB(4x2nETj2yl7q|{ww~+uI_8)FP|L{6E+Gq<9 zzVmIJ*tCb}^(WY+S-OwZKlIv))@EMDz>p~BMT|G(`Yv(j^2Mw~7qCkyn8*lyS zV_aLuGVYFcZ?+T!h21B&4QS#n=bZg}YXnsZ_EsyJ#hSExj(U~Dna!v88!B5q3L@LH zRssH*TJLI);|n8RGh7Iq5Go8lN^si~3H(L#mG@*I*tv(x%3A6$-`#J!WP0?%%U&E!vqZ{!p>2ZOrOE&{o_DR;#0O2QP%iFDFxHaizKaQ>Q(p<8-w){fxBtH+z@nSC|9ajdfr?w%P9_sv5MH;ljf1ba#=VH8 z-wxc?JJ5k1lzfefI}Z+$lVfQZKmKCfR}Nlc&b$WHLi5nS zztnxl$Q#PFE>j6OSkhsLI>9SQ@JKC8oxhidTba>`}Fy_ys&gx0%4S>b1RK4v7AFj?(4x_K;s z+MFJmc&cIjz7A|))>tk5_eKtceWZ^w>?))^)n5~fOI^Y*1LJoxN(yfubhuesO!j?y z-N}*Df&x=YV57PR>E`7_VYS3c^2Y`4n}ne8#6cBC2Og}lkLBKV7pd3ktNs_CC7-#D z(Up3;2MtJIlkfp`DHeH8!twUzKc|X|T!R(G=Pw?hl#;hC%Gqk_X@Px$h;-$x9zWs@ z3F4Cl=FrcGecx`3u!<@^U4u%vG`G(nwBYP=$<+$2x^D^0n`6t z%-&ojoF4?Ogz;8Uy+@0N10M7n#dS|h#pyl#BF>SH6v9bGvY`(JoXGXg&lZl7e2LiQ zL(+W%a^ivU$21FttMH&dn1D*1Ej+6Go9sWZ-(iK3R~HngS`CyOHyXxR8Qdctnh)7= zg(X$`d)ipXWNj4$nosu)nN{KCYR+(Uxy#N-4_XhFES=99O+km-yPZ=S=r@eAF|!IJ zDG<9+Mz<2XD5d^OM!W`SYp8KS~y*?sIZ}LPh zC!$sU%$6+dV$-+aG37Ap_ynj6jH~ME6KlH` zOy+DAZA16tJ+qJb)vY|It9Y&n0c@vMy=q2nEe1w|tU4l$7DJ#4JZg^lb$%vj?Rl$v(a+wb z=^W-U%f;EHIc=c_?fb_nc~2@}Nn0;(=(KE4nlccC^Xw~I)khq~gHlLbCe>PKp``(0 zjhP90cx1)Z3eKIWU}{}+sRt#bbDgP~*>~v$y781p4f%0JRa*ZEe!x}@D@)&a`RGy& zGTflS~4c|A{S{Tar0^)>%_hT`nBw3ij1vB<++P80RMT)lm@>^ zaksvyuGF$c*At#%!%^K-E{(H+a<$Kj;?m4*b}7Q#{!AbeNx@Agj>YcK287of77Ma zwzp26_)Lboa#s1^ZFjJ35ReJTSt-LUso~(Z6g*uAV6zOrI=`HTw3m&jPScy~)|s9J zIEwq54jbQHFv3;6J*RUBNUB5=6RvUvUu^*1+{I%oS+(rq%U>?Z837BVsX{`ai!w(; z=b#;eyosU_&S9jMowajCY5EfL$cclSX(0IrodNDH>Y;t-@cfKMxTl%Ej+JwKwI;xqCm4 z2m4ysXWID}&7ew9BB`ONAj(-#D`*N3Wg9mri1A1%wY3UmJBbuv8diO=PS=MO`gBE$y0*qyYb4 z|0tQ=s5h{eZMgiS_w&zpN14B9ZeILF)AK{(YatNSuY(@KR>5h%(M9Dyyz0*hZyT-$BNR<+Ef(shw=<-#1vMZ-09l#<@^;%7^ z_QQ{pKQxwbdYr$D3j~9%a?>(Kx5>R{-rgCg&S~5bj@4Nv)J#hT+=9ir|LD_%xEG=-b{1RL(J$xa;@JQ))?|yS{|{| zFlPD!@a!HTEH!@ssA^&FHuskIG^xq*MGfNgtBK91I6Ra~xaTl&aR<;Q#(Z!(@LcjZ z;2_=0g6&xB74suLodi>MXlo5EE-S02HE~HDz-Yzo?lmFe_n3KDY^EI8YSOk%0@x=W?Qe#hvbs?mP$%iEoL3OI`?4@e zS|%%NUyX35AEUkwa77#TL~-Ry}>NkQAdQjJ+19zPhF-Isu-0LbgnI z%F)Ck7M=T`?h#m3eoY(s88~DMQFzgXYqkR2X~E58ik8AlUV-vrq!5b<#W{Lwb%pj| zhlx$5d($oKA_W00l}=;blWWPz*N8=4H|xU9wT3dICBiJF7t<~39THz~&d_xCG&cw) zJaITJ{$zwNS{Tn&b7LXWLWj|pN{qR2Ui10-gnbx?NB%r2r^vkP*|0dWo=oZ)a(sU?I$f7osan7%Y02_DMW6S50-_>dkb=bJb4=4(NigD8U339RGxxDdr z2=Fk9T;Ffk%|WmqQeWt52=VwyF_K4hhv0bXbZr$H+t43G&A~?14?-goDc!?8LqX?Q zHjcU?tC&vl7eefTlTy$AsI=cd4rB&4^24ERj6A0IvbUvtkmth(6cnV5)AYX4Ug?M1 zmIS_fp?o3ybcy)kb8@`g5_^me^;fH1aW$-I@YdbsjJjG*gsC{?o#2S<=?}^9_8IRC zsgjLP4m`To2H)Rwh4M356pe^5@+NCjV1cA+XR5;QDj&LK(jPn zxv!^*6@8Er(E|Y0zK?TX4{o9Rx|}?u@F7Vg?<{vu*q7m|&ZQ-Ym5t}LxMF(?b%+-6 zn^d&I;DF!corV5Tv|i4-rkD|UGTG_I>2Z*X^&2m_9i-9>LWTXTsOMxEj8-N zGEUY^`=MI>tcfTkY;tZTWKz%i8B0>m+>E|rcATT9Vh>7ND@kkEvw`86Mn)Jhfa@L+ zu&r0>B2;1Nu@s+6k+^2v*}fma2B)RnOG-YGgL=EzD_Nm zj-E(h!=BQ)u-FA@w)C@nuC|0{}0Rll-xPN0*r0?X=6-7axLZ zY=Qg9Pj2$cUVojLO=~!eF7K8k!MLr<@=}y))|vA1LG_^qyxFvp;$seNr?GyPTI-Q| zRmJ@$-k&yB}{A)eNBO1|@i1aU4x#2c$+`_!(@r1@>HzSL!-r=JT8 z5aiAx3`S*^J7Yz@vUUF})|#mj=0dp?Q>;WMH~ekhrKrfnjsv zNK7I-o+$Cy9-?B$hC!f5TOrgECzqAGEK@zE?hzvrAC#Xtx;NLciK!g8rg2pX+3MyL ze6SK1DLyh3kC9*a zI+1k(yCnanki#ViWagghOs)%PH|lJ%W2zoQrvfm>=^BUeM&p?$c!q9 zOo6bT?j-S@F{ooD$w=2oeYxCu1Bf!!f>9IR^HNd>S`i>t zg(5kkg^bQVr$gckTjEX48iHShU7|mLwJFq9(V-`OjU|KK+B;*3$DF)7(~hr4PTNvQ z&EJjW=KQZNa@co8peu*VOsAVjyc8}5=|N}0j{*S1kRdLmebT>?Y$dU!N`g{2!~rIi znF*!6;?*y&gXi>XHa#GJ8utP@^M|)m5R<_^T{hK5KfEv4$z826Js-p(I;(@S~t@SlS0~)CA6RWzvl;VTHE4 z8vf)VT?jPutTPo1k`syJs~0!lmryq8F*sfxuTv7Mi77h}V47wJk35zxIvX4)Fw(}mpW>!KEB{+t zCsN5GS(eZYf%Dd2y$lnGs!#a|e3-L_TN>)&u(D^`EQa0Et0CmTAgKp44%ZZULg^jv zo^;83-w$QJlrZksb`Igr;LyCQJ3NJ6nd#MvH6*gvlz|%?&KrLBIJ2BgRX{eZ z*|MDPU1PuY*mOq-$ zS#}@p@W@vyZ*oIgtv!6t1-+^jC7ln&Gkra&$?2sQc&+K=Wi^3OJ4FX%DIX9HTOKwpri;|l1*LkfWSHOw2aql7z8@7gdf!}iLV?+1H!TnXVRTA1g z%p*_n;R8+;4aH(V_q#!kX)$obD^VT%WQCn^`$lolF!`F_mCIO&yF7foyJsfkmHx7w zqmPG}7c5cKY7AJ@_<{c+oL`#zG~+#cw?wYzE;+o9&=%SX_QVsmv3giNPrm)KmdBf} zg3zzP&PB83b6(|K55pcNiCarNvQ<%-@w@Np>xg;7y4G1(m@f~wdd`+jL#ujRp5Ph? zG`5-8-5b~DAfOtEs$Vb-#A@d2w8@3ec@L{dUnq1=1!t=^iS!cDK^;-^O9uP=tT24f z@!NOwr&=VO$Mf8yOvPTH5#LFI>NCn#Fylyl*`xO&h%Vh#F;FvLm0IeXXLLTO+*GaWH!3ye1=d?NE2{&_S$!Q0bR4>$GFvcE(;Lpr41m$ zf##Fa-KkWH&4UCLSDA!s5o4W&Cs&l7(e3BZ8b2X#`LJu5io=frVZigf$)v=0^g zvT{Ifq2+Kx%^IZJBv)NRn_Z{`KM7)m+ZNYCi@c=Bbww;1Ss6Qe*M#boTF&CQP$yAq znx9fFCUGhh*65J6h}8fxB0+pN8IRwyC*~J3wXYF|rY9ymWpJ-ida6f5He-@b&jV7- z9mb#hDCatu-OaNiD+3VN)5nYy=>W24=@-|1l;i=kVQzqFHH4{cvOJus$TD5^JXPVn|!nU0iVwI?uPPla64-&WDKyhG~#jJt@ZE( zQ{Lk$?zO;ZVdMWZM2Bmw@rLEhR5>gDb+HX&0DSLS`=q!zbFW|;?B?z`xQb6}?hZ|X zVW?JJI(9*lIaH^@nMZc+FlO}KUkA}2Wa|!`s4v5=Y*HUj-UJ#~R39+))#Rg;1wiwO zljSXl2-yfRJ$~k(4Gye+JDGp$M(rwFQ#BC9gqwdlUgO~wIuxEEiv5=!e|r3#()}9s zR|ZdI``|Bc<8l7q?)<+rolx4|%I2Dy6<%M(!MY!StMh}x2KDTI(Ile+pop&ZZ$%}} z6%cutvLwQ&vY#s;uf46JVSQoiq0wS9)+^WYJKklQE8Fhe;10j700x(NTnmE^{KFY2&JVkg~ai} zs)L!-#|X}&NTxJk=}egf!afFk=`Ze;1^_zaVh@ra?LgC3<2Fw=CFwT3{T3sy@uv*tE^eQX?e zxJ~sr;l)##_JMB2JIBM~fQj?DMdH@l=|hhUP zIdonr6t|gM-Js*v{5;<|`sl2LI|Gjl29@O5r0$PJzM8-he^yOb1l4=p=_kePaHf<$ zk@cWFdrbm1z|U;QcYuqGTQcjFdA#{_20jcyTDX1H5=r=~WAm!9tBfYKd&QgZa zdbY{{9rSvd^l+&QrDQKV3AY^X4DWC%kN2wo+O%np3h=X)AGDIcjbT&o%2uE2biAK< zx^oHX`7y6f1Lu!iv+$H1)gkn<1s(;HQ}F7Y2>h-ZNm>L{@fqQyYKrx)o@IO` z{LUjbA_qI@CLrgCNk&YGn-pia_MD!g9#iJTiVWtb0^o)1O>U9C2oI4OO3T~21ae6@ zX8Jj#=s7o=-lJ_nKGx^9LOZ;z@y(;;O;(@dJ@VeOlAPfk zk;r06!~vF6+qd`e9TaHNY-*JsqD_c6A#(MiB|!*Ev*AT$T_dgCgk{PnfS5e#V8=4P zf|Pd98&pH++IHtWGfZ&)(X{i4Ca(-PKz*l+oecv4zOfAGA6yPc*7Qn$3gH<(S#LT_ zXl3q4nC_G6aZd>VGbee*NPX?Om+a?un8?K-0DJrV9$9RohoOa6L2*Nn@nxtdT6*iL zj4!Yv$9u z79OXwd)QR>)92ST;`2dmsm`_)uz6XaSezi9!t7yeou_x(lkx6Zexsvom zLl&pvP@|~9P`=Y%Mc9Ol%<7^G+5v+wat`ZWQybDLu+F+xOb+8^GHJ-Pd%jT@n|ymE z;OngvId;w~IQ#vd1j8i0Jl#ijUGvr)c`^bBc>(ZE2igC{OEK3tIWl0LMCvU!Ct zb2y_njOZZ<9ln}soEowfE8f2e>u|_zbt2EGLJn^e*wy~vVm6|wL4Xgq>*7glTm*0N z%*Fd26NEM&8@ixyL!*7yBt|WZ&b+<81~t_c6395EOQ9-68V9L|MyyCO{sza5RlBWP z3Sck+LlKo{A6hcF)>qdVPnU!GP?C&(_Pl|Yp7ICS=eDdV!vq>+IvAJ8+DwK8Wp~}? zzp#$cSGNXQk&}Y2LvSpR=homZc)L-7ji5KHW;!40WrX}_Y{cLqo}yDiFW~^MPs%lD z+(?q4>V5#Jp}&vQE}w-ApDdp3B{?Mf#M5;iR=ZhK>^Tk}$WwH-pEHKC?O^AP1gT_# z&xxr%5A_y5MfF-AFY*SDjq-PGiBYWJ*OTqq$yCRmvy zmw(Z)QBRX>0l-^LvVk36ELHxIECuB-Swq*E!DjT%4<546rTzJQdlfLs0iiuLUUpe9JIld;^m zokjM6J8}W7&OQ%94Z`4;M`ysEBwZs+BUMZ`7U6BW#sdJ@{{*K{%H)c*R zY(7ik8o-RL+@V6A%{!wP`JlqPt`n1K;y#(bS8Tv4^>+M9^S8IZObYOW=5N2nOoX1>A+ zfu9A20hOxHy4}d~8SSP{?zGkkPh}QE|33^uIpD56ArC6Sw-k?0@pT_^L?t8B|M z=(=Fjx7!HEelqTe_t*h=cfF?t=lzO@>p?4@)(LZW?Kyy)R_9XoEm zp^(I!SC*wy(5%5IfBc09u_blv@O$bc;u$JcBZPY4Y*{U#IhjsI1wzNwW6OJ{w?l6O zd{IU*=m_8rP0cIIrob#K5bCeRZqnc6hkV`N;RwUma3tTt3-&16rejX+r&A@gZQBZAOM9TGO4L21Lfg>XKLl_|+^OYW zWZr~3qYShJ+|SX83VJ<%h|LZxb(rDSP6Fv^V&)@Pn;PJW!RkQ8GDX5NL`lxcx0+9t z)%iR=N#zf*&KDc7EMYY+-fM}Wx`p5*r4tQ%+$dF#oiU|8Rt4Vrkhb4C3{qF@U_#y) zGYw4J!WM$t4Q;;!-bz(lbojt{_O<7=Z0@AFUKnQHF&~X#J0^p>kk4S(vb~IBC2z=j z%1ej-yq(xBmY(Ogq;Ml6)?)5x?af+QZ-t3|LE)4I19+$ce*_B?n%L`#D3xFlCr z5KuLMC0P~aq!!}1mCG5+WFDG3i@4v)#FXD^lD#v+D}ENPk4$#{7oVoLmO zOPNGtG8@wtYQ<Vqpb z1|2J$%Lz#KCWRES?4lTB7ZQ^BrHBOi><-;3tePOf0Z~4m5&1kC!H)Ko%IvG^lEZVX z8XIcp4TPx2i`M;8fK7B&EDq8vMKMW;NTB@Pwa;W;bJ%<5hK*lw0_No#--ol7m9e@v z)zfIoMM^QMwOSz<1*ZjttK)xH61<5C!U&rd3ub)_SKlMGsDA~5E=0#Lsctme#IV|p z%F?O=v5_T6HM?RB+atB_7_iC)XtYbvUqQsx5HrEe<%EV&vVF#k9g zE2Ou$d(Ssf`dG7yWT#{2OEwtfXnL0(=91K7~VZq*rgeiqy&t`$4gc%FZOo zx*dLW)I(9}bVoja*iWlj^2rC*U}H_?it}=q)c3d{KcE)qDF!F{i?1|<&2?u2OyV zTfiIeNIQ)GNy}w>xDKaKtb?_7em_Qo;ivMiCGp=TLRJqLC3YCoGEwDtYOB~0p{sJm ziZ-E9S3*;zKH*23Y8t^E8Eo92BEb=p;2A$IM>uB2O zzRWeDGu*z{@qi+iag?*Mi^jze(hx?&=2(19QnOA>Zi}`%(HqFS1dNVY=*szx`l*u8i9Y-rIPgEX(XK=7x#bAh$J-hg z_tnt$_BB^GSLO3oIMlW^Nnd$j8;k5h5Ma-l|31OhMF!5I#Xw^ji!aTiM5<2Dy-NWe%u*vm6gH znJxPTeQ{mpyP7qjKFb+vype^5r8sHA3RW#|{74e>KdluRs0Z~*_J#r$fg$fR*F!BG zBEudBaw>~55IlvlwzP{ZBxJ9({@vBqMyoj@tGXFBJ4H~PIoPX|2p~!351_{b3y7z2 z!%?tyi?lF!+fnQ4b5wAKd??Bs6bq=?MKCpW!1Ixd)_)gSO_?D%rDL~9dcT8<>jf^= zxp^3XQXI`jh6d~s78OUz@r2D?j7}_(u7N7~3?KTTwhPPP5<|oFrwpD|u^pgEq2_PM zIbuIZJJ1n5ZOyykeo!GGYBN*Mp*n6fJZYtB7}as`gT@yakkB*J6wLY-Bo5>=UQSFc zJ!aLR9q5K^*NJ}nH>c<|_>@VC@x-G)kvO>;)5{AWw5-J$ooQ*boFzb23~L8WBx&Q)sCY6}rdX5ofb^1}>d zFv_i=v?aFJ1a&hCasS@w{~>VZ{|KZPp=bj!#|LO0)R)g&fe*JLo%KuB5nN+Eb|2L~ST*f9O-#_#E)`zKXC+b;aGvUo|pZLL%~G zS2vpB46pHyziKn30{q;L%(P944i7N33-T!Wyw4Kau%AiRv17+b03Y0MmLDciKNa#} z?{mCFe54z5V-b8~d%}3f&}3G9e{=O1`&a_o<1J$gYK;d6NAjQ81 z5B*<+>lZ57$?D0eNX!hwFze~Kf7e|^F|b~;55*)JSHf!5pTZ~24)x~P+G{)_oELD0 zNYmh#f$T3yX_BWzfW#mRxyVGf+(P=h!?C64L^pNK%q(YXME*T}@n4xmWRhVm zQuU?B_^Y_zji>~83TYpEhpoJ5X}Jy8G6w4yQ~49Fr9g78V1AmlqM<(pWc^wEr&v5b zP6EDjZ)cCw4=NLMjP_0-{;~6Kh~^I6k?c>?y<*7RmQ>l5BJYnowx zzegn(#&In6na^@nYC`IPQM*QylpndOY_R@A~6l9Yy=6It^Y<8AbX?L7ls|LF4JEA^)kA{y?HQC}>k z%`gof&t}q%9Ony&dA`|Wu(T1l)g`EecGJ&Nb-gkz4IVsdr%hxEJSf1eQ$8jMW#0#@ zY7wA&bFnqOLMI4WQ+;-tX%7v-<+iJ;E+UEOS0`z%C)A3!ea2aHc=~tfXH|h59QoE8 ztoXF0ZV(YAJ2VfG)3Q&+Ym3G$W`R8HCxo+VORSwPjAsqwBQ7v_c*m7Mk%{NN4T;cS zSp;wg;Sl$bf?3k}qGH4;@3W`;Pwm~+d_Irbk6DbC6>6ET=OGOGX7+MC42w2D!yPy# z?|oFt(bc(MB}M?fUUN15QyCRecqiPEajWz5%q^*?3UE|#Z&*61raS6w7wztdk{HJ8fH>sAeKOb+Won5Qw}6bs|EO(4lFlOml+DcCFBi zsCYa)bgr@ti6mxKqpz#9*tFUM1?bHdJd$Kn_GSkjK|hkMFxuQQbbe29R3^@86q{OV zeak~vPYSw`C?dvD>!WS(t=Ma;L7HOGVxWkCp&hP+I3ynWPn6ca%|RF!!loD@Wb^fk zX_g%rR^Bnv-n1mjsD4Bm^WRTj5dZyeRbQmej%;+2g#Ba&RD@tT&}U7oRJZgkWzdhz zBEx^!w}ZdXv^4EdU3tk$Y(3Csf zoP<3RYNY%qt)bGI83T2Lc8d$P;#}-F1NRnwH58i${;Xsc`J`}cC!>%B{s_uCzEb(`kxO7kEqjC;Y%I|x zv(seHs#M-$h$A52y>nDMEe0x_uaI2rJ1EFER^@|TYO`3<{YZb?6|cOy$E9kmhRCf0 zse2XTsd%{Z50ajomzB{YA$0uF6t#-TF8u_L5ZQ3w;!)S0&-NI{nK&{>0y*w zW8&OY1JQ{ik{*?i!lfXxWJd+Fa|bEokOkD#WaH@U6*wCG4(d-IX1z;baFLZH+$Hf0 znzVVU_et3@m5vyyTdI+%kD1lA9Fp3Dc9_$x1=a|j`bi-Rfya@WjWp~>Ry{lFII4cw zVHt^O>N#+_@0zT#_$-*L?kCklx1Av>XC|m=vr$oTz(U_&fW2)ht(aQl zq_hf@K=751egCWoir-%MVHsD2aMg=|xxh4rnu}CK@9?d=*TGCwF%Adgt6+*Yay1xK#9XdXCG;9EBm$q1^ zGJ4NR*ry)NJm_DVktN9JUbIcmV}mZ{p~T<&RE19L4X-vDsiWnpfUL&A@9wsflB$_Y z3*E`0(N0>>4(GtocToh+b^fPC=qJMM?7UuRB;2cu9)Tk(s z-&m4>W-hLQR^*5U_s@ua8Z6t!hTx35-1%QJ?jdbKT5U(7a^Bqj(|*OronBLj_wng( zIufK1qu}<@S4_LQO9|xu=c*ZOYo#N!D3;zr0%71ss|GrD!1yj_&M)5x{nAqH?`F)?1zW>T2 z`gZ`pj132Xhl58%LINPb!2w<$Z~z=?4skUzmrLxxguGcQ_S)VnG3Omq)xWC%)Yl?# zqSP1Oe^@G53~a2F$Fh?@GJ0yBm91#hmHhX|{|mjLTBADi^gHM4x$@!n-x{rlFY_Fr zXt>d4p~&@{Cp&nu5>vYW&qURIsVq5@6`m*XM#7aMO*$G|GOzN#I_!o`VsE`orI5JQkExKo^ohaQusQtM8h9`SBRXZ*Gv~YW0TAn z3KpNtlT%iBVKq{<)S1pJ)T|ud)m|EnySwZQAYkaSg_ep`Qy?xGze*V248I6Rh@b$$ zhomY{=g-1lFSk-3pBfHR2U7=JY}}@g+gE|ow(rG|R%(avxWc|Aw@g|I7c75O&Etjy zgd@aQQDrL5L0gu7Pa38s<5W2(3pqgIujO=dkRAA#T^Ul17G~^t{sM0J)GAZ>?`aio z*Rt#o_#0h5<-`HQB94q>a1Uj=SW!&Kw7jH3fap0?8P1Fb21!E*04@yRI1wm82Fi_l ziL66<86a^<{suW>ba3SR#3_lU-WVh(-FllWC8cA8cMiQue!7CnCSFigEvkD0)I*P~ zJ?UKP7$5YDkg5X?tH4`OI#k~Y(HDP6qOZ&R?X^(gI+7@!}OPT83$&yO@jiKPvhx@Xq=s0BZw=a~@ zGgr6*$Q=b#9@SoGi#DyW-qxX>FOwujT8nA#^uD=CJAY-D!l|82pCeG3ivQNGNq9_x z%2_pUe(L^YvS2iK+so;~s2A?p6C zh(Hh89VCxPvswh_&EpE%MZt{xed*7X>?);W{_J1{ zM=0 zbZPE3o-5$ILmdey&MZw?jPmRHj*_J)?>}m?Tz;=;bo&zzAMi8%j536$`pu9^e^0Yo zJ?Yx^9^#A=YlYCVfhzDbiI6aM4OyXL?GsvLW^l{f)|{UYmy+&FHR!9YC_3*IlXiCn zebWatJm0Q-Hlg@4yhA(pNv($!x%G|40Bi~ui96?!1Lu!&qtR2Vp3K7j1t7e zJOblZOe%9cyZJo422mG4enPM41O z`n{en9sKc6{6RNSn#ZByZ!Jb|OeVS`xxAUDkgbOO)^&D?tY8R6Pg8>`RPU8u3Y5)m zf2LZaPJ@}k?=DhmzaRj&G%AFD?HF`kk)q}lR5uPd&V0l$H_VPdDg2Ms?42|$u4CDZ z-;8Oj$Gliuz^DYnL{$p&bTk_``5N?=`xium54m8hJbd?eX{>wBtZ^=xCVbibMN`S} z#Uv2xAFZ?1xszsz`mTQ(Lz6q^C0`!J06C-&QWhYAMQT#MB$69)ZSvg!4ny1^rSFcW^e}Z|5%u7wgEswWf ztyER}TP)CBD&qaf_q98=c!hCezJjq&?n`#CJDf=qi;5N?Q?cmf@cxT`*Wvd$Za|=e zOd_$w%)Ae)*^2hJEMgBA$Y{@DD41=HWv$4ckfIQ7-TDjX9(vht&JfItN>#;IK#sA%8Oz=>^uhZaF@yG}1$}N(*9R7ZYHvaAlGz=1_*+ zG-om5Pc3mKjMy_?Z+1dBy!XVw?nK|#>*Vqef`PN;v3T&y6$aK9bZ4G!WxHNFUkQup zZ>HKN!V0uahHtP80l6Iphbnq)_1C8|%RJ%nuS<0T=UR6V=0Z-&WDG2casO)*q8(Iq z9ePSRI(#Xbr^BC(OITteN)Gxe&q(s4*5d{>HJ;nLh$BrG&Mc-%^%wf`xI_h?`%Ur& zGdvZ3i5vp98ryX@zfcPbj>1x!o+fUOHXoU3Y>8cN%5laWYPrCeUT&q}(^bZ@&3M*y z5hV-5+2bUqf;EkH$d_Fcg37J*zW@{ZPTbXEe_a>`cDYYQU;I@V*!6l~VNgx<-$C`!U;fCq`xk&9E##iWDzJ+Ixn<$rcWSL5AUXgfiY6`S1NK z?7c}=!mP{AsM_*V)xX$Y#+cd24Ijh`cxqO;O>~|!_r=KT&h`qinG1@B=FtMpXR5hP>)VJ&)=?~|;gwXvkoDG6%K&^a&sz~t@5l@J!uHyxV;R1>}QM1NF z(Yrpjd4chV?v8}FD#Yg56ZXGy?q@q}pv67$0a+feGq^3LzrVb_{tFN_dEG~-$wRPA z?I2TO#qI*-mz3^995EKeLmaUOPDdrT8cz&=@L!_7N{i-ypH=zK85vFX<32kd z!|z_7j1OU&B;bkvqU8JgP2}t9*`-dAm4B)?#w>p%kdYC;we~J;hy&s=HoLy2>Gbp$ zK>sf{{^wE_#M2@B&}i+JePm))(l;+?|C;?DO7XqFn_cRDaC>d-e{uD{%nQPf^*Fuz zCG;1tnmsMr(on9YDxv5@6C+jUqjeTDfdt(SNx4;|tanfat~T^C4Bs-&T6Z7V{R&LD zdlA~4zHur*a#VR|@kU%bni2|GJ>o$wGx(z&u!^0xR4%nO^k|@PMA)mnpO`TE#B?pF zY4YGBjE_=qRv45KnKi6l|I@aF)73}825jG;cY7@qB0_*--p9{~CIs(u zEg3P?JqXNkQSRiW8^>@H842-Z%qe5vFtYH~mX>}h5$rPS{4E_LNv+iGIi>l)jjQkQkPPTuW+S>7svLXd(dHj^&ny!wUm~Mj zph~qyg3jP!U_kkW5o~LP1au`G#zURBX=3jxtyV1*xI6EB#SlVuHILTt|*$UCGiedZFOTa~^ zLX!b(wGgiZ>!QXM`eV)zTkn%q#?W;(#1B-Zy7+Bt?<=H;!c>nfDckja1bsxeHtlSg z+UwoEA+39ZG-oyJ5iMHtN870HRNs4iJl`?beLWjiU^JYRPW6DvI_o4RnKUkmMr+9| zi^l2{j*|1Dx>YvMRc$mgJL#}bnXOO>MHZ}`W|^z#IA1StT9a?OPSOXW7ao9jv(05%0R}P%0YN(3eS_Tq07}b-Iu%v9}ty3C#Hds^?E;`=@ z_GkB0j`=HmgrS1Rv~~xD z?5nmBPK{B8*43E~o3q?MA#vC3_8K|c`*4?4l~h4fjY9^+H(Y((qXTGGJogWA)A6v4 zEZ5|`1NdaAQ^6LYYDEQy-AT++K0Qa1*ceuf5V^L=9aBN|mVW$tMT#0uXjK^nT0Ii& zej17hg`25nPINyqoiFtq%0{4mhp|*E=&mf|SJamFx997VSElZV1_q}Cg8)&RkPaI? z46-29F=XmpK`(Cb?o-n{YKq}-h~T3VNlMYW`j*aDdQjDtxkL>*@sIajy^8IYdj{Ua zS<1(F5T|{jeb`O(S1(q0fgW#x)|<>A_~NVrO5A|tXa}PF6lIl>4zeHo zM|Oy%jPUdfqs6H|GVyTwRgPkl8x>f7ECB?$(1r0362<=lCwfc4fqR>ZJ}_W^tj|;q65KPOdYo~4YBDn>8Sx4p6PSS=slMohQYf&OFm6?u zTEfZXyf1oiTh$DGp6XBPGriIF1yu#m*^rAm1LXr1Y9C_*1VofyC7Sztt%Yu_KRe

2}#;NErmLRx8bdj8&`(eS+NqLoV{NP_#2syLl!ThqH-cwkwEW%a~7r+m<21B z#VQycA;KBX*2_RI}qorO@^f>3X6?d)b-L zN2aUg8sBr3*vLj~j*xxzW75t%y{5UC0Sm>q13w^Axv|48u^+z#aL$8;askF(pw-+w zrB4arET@0_)bX(yUbvLeftEcY2U(TkO#kYA)!uq?fSrr>`i3typ8A+ka+fGQJFuWV zZ59o+im~@|Z;Qmj*pacPT}eoJ?Tr1&uZAgJH0Yj8t!$E5P(1CUJ_22aAfRq`>23~@ z*_uZ~A$vZ&Ct;2o_g4^ZGD`=8_Y3Irh>yW31xpI|*G=cibZ25>pFykkibTKnlMPRo z{v5XqLAh8#HK`SO=Gh}qe*qaHldu7}X|@XOs(G!o{1Fnx_oiX(yBw9%8HX*?otLp& zeaxxvR8dP1aMp~6a_OC#iUYZP)}^&!$J+uUE;DmD5sU~GgGq$-OvUagB+i?01OH2t zGmjmxWPyi-FPDahZUNVBZih@snc}_uf@cFV-$I*R(0biY^KAM1O_rOE>vsK3fOuL9 zN>cf5LE#%Fw%iVIy1^&v25{OAa*Bg7JO#SzT`tE)P7Z{hhx>I?SM;5E9gutm9~hwe zgY>pJi6f;%Ch9?$VIw6;Ge;?n(H$=>|1?(@ep)yvv$m|wA>j^EeqUnJ?EUFr|3p!D zh%zN7y*Xd#H>dAF^MR(Q1siA%Ot;BeV zF76a=9oymkzlu=M;8PavHZx)B0_h#i25bC|Ie3C`*uq@fQYfEhO@&AH>(!9jW;-_J zWyVt3d@_FcjH@Ep*LhSiecQQz2btIU&gQw36*^K>Td>|^>wA$=Km z4O?=oY|NyG88yI)(m zk3o*ES$PoThuhM=69V{)s`5_SaHj!KwN@%tZLcL`Hfhj|;~PF*7iNQo%q|j>;3fzV zc<@D&xjE@m#Bqq*Tvr@MwWvVjhrLaf;fg|lPR1VgLf^!9f#1mn=&fGfv^{>GqK4Y> zSg*20+8^{Pg|OY%?bA2{{d5#cJ5A&*p6YX5J!C#a)P_?B)>%%G9*y-Ljirq&fspsd ze;iuVmlu>|VPo^q^U{T>9hHifROmrQE2mXLC}J9tNmFHTH|5VI)ygsYf^jEINcyvh zXEc~$!}?-DBT@WGZ~tUKf0pd-VV_4Er4GNN!Nx>4euwNqtf{S+zrbw)@(h79MREZ* zfhPcs=wYe^whqNJ#@;rSgAOjev@(aZxTo8l(YF0spZjsrilZHf34UKP+I?$Ot5kTx z0ExjGx&zr53XFE?MDM}iR$QyR%WwtC{jl2@CpHWA z4ZS!$#f>)C{|P!}Ufk*Mo`FEb>7g7nHPB*(OFm2uGL};=?@udR$ov>BA^B?N}T7D@YR;GwT?Sj=OFc`7nI?8e8p! zrTF{tkTHWjxRdS)OLjv1D2g@XR<;QI@Xb9rs`>0bVWP>j0E}>gerPuj?azL5Fabs@b;_fN ztut@-T{OOAM6+&r?4G>v{tJk}93dnyA^r;hr3WPO=@b;-m@X0Y9G1VzX!i?)O8d@- zrGI|>7l*%!vbUju?;GUL|1d?&5XRukr~c{ft5tGe;x>Jeds$|0h9cr3t)1R!Em+F) zzUljCrJxmXBHw~&chi~0u(I2dTTXq}UDjd6p|Fj>slc?}l+Q59+CWnloJ&*V6M{mA zoy}Li2SeCbUDhgZk>KLSf@dXXUrnydM}@c=AlZ;Q*R9TpZ}izd@9NDlPhknt&@%%MKRx;smJ4We$C$eIl!Y|5DNWf&2AxTJ=!tTo z7=mZK@)E%f_h2>yVAqU{G%H zvc@xI0$)*-t-$N$a(%apa6osx-TsMVFzJyt9j1=yzy~5o)8%FfaQ8MT+#U}OT06$A ze7|dwZXIl5?h1L=Q|o@cb)pj?X&@>3UA`I@WnXp11BOQ!=93Ltw<8nV{TpicF8hjcvtIw z@a03FkIYB&;*-?_>I#PO`QQ#|C!Qq>5wuUPXB08ld-FY4r#?pCR{<%u%{rLPN+$9I zu3z%GAGw?j3$@FQ#v+g49~w(i>KTxEGK-@om`MqH1cj>SoQr#V!MCyZ>D>=P^=xtN zqL$G4UN;8~YjFzVMiv!HJ;@$4@2g`Rq-#z}dOkq<8~UHRni1~=qd@JmI*asTv33m` z=~q339qQSaQaDOvc8H4H5tF1!Czz-Wx)ase+y~yWc8Te`pu4>M<;PcG!pGjArD$9x z(#0R%N~0(3Q1q5iWZaRrd+`eWik(IEXRq3*G7LelnuT#A>yF!y z^dI#mFW=p!pGjR69?DM&?onSQ_ng1>FWI_DH27fn9T2NRv%qXz5^oDuZmErj>V;5D z`bel}Y71`V6C`KWUs>K60P9<0XsR_e^e?*VrH*8W_B-2H2dGvZ_DxpMiSl-|A$Jwo z`F`0eW?l&`-89GpN^!MAT1lqdd-+@+ww=9S#%jo~PL*}(&>j0W|3|S+ot?PxG0%XN zEf@L=d))}-?+sJ(f}Q;;KZ=78#Kr#<5G&&f7XN-4dtv7=>^WvVY(`Ii@`+w~HApC6 zd{{`^jy1&~%)Z}>UQOY|L~|W)X*_r&ElzNAvaoW9sxwCI1c%l9j}B5iB!h?DghkwR zr}D;!dsuZe!Dtm_(r@QZ3&+$RLp_3XPWF;iN)t@41ib!SWVuKq$k@)ZpB&2ZVrUKY zXH6y$wsN_TpS2{fy5`!qjzDF%|AjQ&M$A8y31S@fAqU+m)1_v5SDZ77Ixpk@V4 z%iR1s{~6d#zwgdq!<{5+w7}_X=!eJ^d;%r-OSevi}uTTJt84orv(qGax7rO22rL~03Fn4s9@Z^LS< zFU-ec>Jvf;upRe;+PdoH7va?>z3cTxTC+5DuCA!Q4i_%()0^ZFxvq-{mbHsg)cZc# z)jZx^RnbK*=RW)e9RCt}IYy?9Y?@+nWH*zVJ33};a@ze?l(d}mNi?$2Tw5`}T$w)4 zJt%J$XU{VCfp@+wm@SEUj2Hod#c02w2A3PE?cj6vNr9Jg0OPG9U>UmRzS1DQ$hXhH zL1^l4Y*`&lu*BSm+v&(w=wZf4qt@aa-3k=)YaLL{0du%hRCzxLkCQf<5QmgVB?1oG zq-pGR#Jhy8^mf5r*_SEAyE)oIwT*a$PrSJ+zfYY}zMTq3!ThW{#^3$LI~rD{sI_AN~msOVt+r9p|32E%0T-+SZ!5uFB<+us37rXab`t1}W9(zBwq&yrHljp@o^6diT>bNr`Bo}I+wA-{taMJX} zpx){*#uvr@8GvAZ8LhC`+a=i>GZTC1J#lrf!?NuXT)=`Ykm43b-t9blThX&cxa?*3 z`?9@&{Y3u*8C$8BBa98g3-TswJVnW9{M4dl{DKS&Wq&1E%8puz_{D6$=xdIfjjM!^ zaf~lqYYE!yv>}d6d-}4glW&@lT07pmMwO9H?iC5Jpx;eOJ&>>7I z0=JGiC*vi~-fs6hz@#h&!wCy{DB)+Q<5(MG(;me>M87&lLL*;3z|H8LHG+$LJFKGj z7iigAzsaCmkyxf6yCR8>8=gs7>PrK*JopK=Vv zfA~B{G}l_lGiQVFyV-qv;L}ekFQhOUO`I{dH(#WI)=gr)$2{S(E*_(Cr$#)Ie#h{l zI2INdS++;KYX@Y)=zIBJ`;0(HuA zvA7CPLA>@gz)dKh89tep|6d_33;);_H%x2Tv$wk~e)-qj`TwvP_E4{i50Ti#0LC7c ztR5rJqLEG*IwGgSdHh*SJWnpch zqZ5hA+v&tc-%_S59nvqqvE1q7P4Or3*1Vf|%js>1VXNDs!`^V^OZgRY5c$6Ex7*qj zeG7KY$gLICB76(g>q!>9S$Bzydzc2{nb=7Ci<4SrIo`k`Qs|w$?Dc~-fCkHXLPE{Zv-5zOB~hfXEB9=Et>1Yed4_v zsG+ZYB;hS@^E7zJGb+cT-3%-iv#KBC7xq()?DX?17&$aW*f;b|NZl#^7LWD4-O)sz z8tYGrW9fBiKo`l)kD0iGMa}5GJi6>O zyx^hE9|+Cj$)NK>sU6Ztee_)sXI|y}zAak%mfOhvv*LN$vFcl4GkbEb)5)9G*jl;4 zB`or<*>Iou1r+Bku*G4~f&~88z0j-0AOavNd#2N4I3doG*r#i`Uc5^=0Uzf-(i^M* z6A62rl#gWUc1OeS2D49I!);I89`j7h(g&4-I}A8g){76r+~ChQ#`E?=U6giyCb1S! zSFZ8UTX;NI@M-^k;$m~u?S5QixgarMFuM+TkJkG7MXWN7jtXT)n`90v+&1k6;9tJ! z@)!%&NaW=qprluV-Q$%Utiq@9ngAR{$^Lw$}T~t26`j4Konn?<>;Mx?tu)WIW7qO<$=ukId zYS<&5F3JxSg+2|Rk~*BpH=T|j_{an@-Lm$^%xW(X@FNSKd$QUO86|X}ec4JMTHY1T zGvaTqV;4xp66r*EPw3M0m{GvTF<07U*(k>|^@eN15}0}%SAh(9$W4pmzdBvmvk{GD zqoYiJl&d+{tuR2{j#NHW>zXiUvd>s7t$ZDrdHVJJX3SAQkgSHy(>Sm)XP8XMuO~~b zNKo_}Ha=$_t-(CAZD=Ahf%_FROfMw*p^DD3mzHUn{&x-;IgBWelkwT`Nuox}d^a=R zPFmT9%@VI5rMa*><4hAqOcf@H@QA$-#^xoxIxEgp>)aM6gEtwh=V*{0oxjJs;8K;V znw1qQdd;$ye`kfTj=amxZj|aLR1~~UXf9B&U>99JiC(1eZ86AxPm{)!%Dk5?xR7~j zIh!L~wVgt64X4SA{G6qmgSTlf4mpvS%q1BwD)(nKh>^qeiD5(c(PC4tmdDM$R2#lDBQL<{sQt_xE^?w zQ>XdgWvtl@d`=I%E%~xS5~_TgAv4-OgU8 zhmhO9sp@hL!*H@#zkbjv!gR~;j1YXKiIt-7d@loA*{=4j{z+ARL(;$nokb`0?+&zI zYiVYrn3ju0;iUhHz_;kH+gT(=TDy3;<;zt6Eknp|2QFFj6l*x9>v))c42JWjMUp(4tgl`}2ib{{NjlU-PB+rEE@^09NF?7sO9!CYAFGyX>Hh4cVy<|3m}~Z36?Fl)uMd$vN#>TlO>h=>4caRp z!#2znI2jNw49>g8M)GUtyDk-kzcr*v-ka z@SulLCB%?=G703A%M>~qU6`YciBU1>21$cQm!SYxtSzOWFeNa3?9M{`B%$~z5TZj@ zE<9%1R?qs=>9{X$OeUWE2wA7EL;$nTEVgoE%A(RBN^ANHHTp+648F@^pf&;cePnr@ zfU)2wgkc!&N-fBa3qXb8GXK$p63^&=s&{;t)tVh4<-pca(s(yl*p%q=jY^PSyrJrk z`%p}@PvokH9B=u!zr4|f=TNkE;J-OQbU;u=u=(btg+{!ggRB(C|0^2FKr5_fr~UFu z0Dsn3j^fg?a`5BBnDT8Gmu}foY8w{IDM}1tb6=dx6Go!G!KP0Clu?b+2L12&8_+7# zU}u-3joWTocA&q~#kv(=%`LLZey|FWVQs+cf)v-I(?A=nOJVaTCFPp;Ty4iguHiQ4 zVF=S$WKrSrc^D!S)R@ff$gdk3(RUVwZ#h;WLyB#`s>Bnn)_O6smG5r(Txc_a+mx$m zVJ4Ur7Uce8Z1khf8;W2Cy9&nN$4ucBVqbUPO;T@*)R`I6|Sw8n^(jhad7>>0zW2ZjdW@<)dS^kWjS-O2^LpEW_5m;vR3>Fes#@FE@1BS zlpdVgTQ4`;%29gmRS*cdOcr)A>lAKrALeQq^m!7{R>OkU)`3ixhwP4JrT&QISw0yy z0w4BmGZXYk^aJ~=8=&xl`LijGNjhqv%|)##rw=aH`v*EJfQ@k6X}t_M-&KHCyr9^z z4cgWkdggaS+eQPQLHeReWBtPVB#yLw^Pf6`Wetmc2wKS{qF8Nz0jA}pZ}i)w?X-uS zv>bKNH~E+1%gL3e@+Zba6&J`}9bMeiT_z2E1uxa}977@|WEHE^0^gg<7I)6~`Ca=7 zI>B9dEOd(rWc*|r4>)7{(9XG=Of{{wJ3fGQ;f(%=cfqr8eHFM*$Fprj;AbI&4}5s{ zt`Wl+Jo1Bos>~B)FMNFH0xI>M+T}Ixp*r2Nqp%wI< zLm!@72DK{-q)q~#&gl7+OSUrVNH4wk!q~~m>6GyS?bBFWIw?<%w?U1Jp4&>wyuKSL zAN~}dNIZHYa$b+SPtT?F40?Hy@w4fWAz7yVl_AKxfvDqS+E9A1&nJK@4CD3Wc--(a>ikO7w5m) z^ec0eOt01Z`z_EQ>p|QzbIErEwat|r{M@U=(1d2CUt9H9FP-7U<-cgZuNmOz(iBMH5*D_)O!1w!tjp*0 zJwbYh-nTc&yoK&MrcLO1tm=XnT4OAxd;EKBXdMZInW^dZ9Myxn7NgCfc^ge?==S<$&TS9FZHSRkPC9NuEAD~ zSBLgezN*TB;cGubyqy}H^8qzsnL865h}$F&5u76zTftwWl6d|Hdv6)sMz^kQ%FN76 zF*7sA%*@Qp46);wIcAKRnVFeokYmTpGGh#}{f^&r_L;Ny`D$vunfWn)c4<|$RBCm% zRgsNhY=V;%SEi`@k^dO{a`d!Jcb(XqP+PQTAPg z>VoQXZKm=Quan-J)B~!d))*y~wi*BN5%t6oXwU4HP2h`PD0PDyzB=>Z#AA5+Msiu( z_NirL#CVsUOKn*KFM6DFvE|#S?o8{6Yj?k&rJ;}3J`?I)Nd|~|NB&A^B7A7i2~1$E zN4WMAog#YBf!zW}@lC`7eN zgLyw7tG382KEfF|uBXjG-Qcvp0H_J!SvWcoq!0^^Un0;Jvl@LWIkWlewIBZi5Eg!f zEeaLr-IY9No1g&S-A}yn>A9AC&NqZhmALM5F6&CGR>1c)ujv@}y#g4ERpl;uPb#jA=9~7W+nbtaCYDoqf96Dj%b*)9`R&bZ=`~a~ z80gJ4n)TYsYYDXD?M&R87q!z*{rcsCX886QjZ7-JMyRXuSYI8P)a~dXB7rbSdr7!TyY0tN(7(&`Jg(6f0x~r8Wh5Bmd80-X z%%7pLiqxmhhDUDrH(p`&2yK{L(e(&st4S2W8F%dN(uJ$r z=~RQb$|Zezr1;mXu79s)B@ekuP z59{hq;nPBW4&-^i4y~pNo7EF&@QyJqQ{%Ljp6`Fqd=3?=VEJ^}cdkZpG&0~_Nm;P6 zP@3u5P`zEcG9N}RrZAs^x3wAZ8B2}OlG@Y>)+*IpjM$6EAjNENcyyXLH@Vv5*{koldSL4{8Wio&9V=!TxoVv_5ohjjLRxjG>vXF^uqwkol zjwzFT2ME71sXjxVpdwyP*(CB+&x>4BRrA84X?dN|+h}OD?fH+ehFQ7gbtu+{vm0@` zyxfLMzYgUW8O<>r1HV2|BpK*2ESEZZNmzr=RNBy8{O&hWqUP+yKA>(jFXpd=2Z zq^5a;Sdx9dI}+!c13zdx!HM2DSQOiBi(sqrPFm z(|Hc$x-q=2yV0Y)07Q=^yv`l>-bndr<>Etp+;Ij)Z19sf4ehrc+LX(v4olzrB}vc_ zLymEq@T-CYa(m@vud0QS*BGeV_K!q&%S@<0k$KOdIf@YK&HpScTPVxW4U*z0R&NaA zqc|@a=4a7dLhDqpjViFO+~cX8S`n9BkC;8L%%(^KNHMz-cD^2-t+yc`Lk5>8K?U?b zj-adJf##as!^Db%HN{bhRd}v(KAIr@;qU;$KaDTbNB0>nu*Z=3*R=)<)G-@mRN8{I zFG{Q-!E!!l?!yPSsuy#d`|e7f+bQR_-~PC9=Ivb>;U$*V&7ni$^Ncn_cA4{}%WJvs z+e0|Zhh4@#TNn+fOuZ`9dpA1g-GL8TKbB^zrWTi^so}JKwj)fAjD0L|3yf~q3y6OR zeLw37t#0^R=YnXk6j>sX?ds5`W@TFN%XVxA3TH>!X)n~X{>&PgX4!Sug9@$cpBe* z)GHEqLo2m#g%FF{35^%8=syMDE0y&q`OT11Qxs+8to#^9pRmGLjH@s^0GQ2w`!&Tk z>EF|f?7{bgh;lrb!K z;@Z@&2&b8)FJCdNX)8=SC@d^~wfxgJ)C<;#x&(5<(WC^daEu4muNRP&6M_ILDnY&$qCHi^>TK> zDha0MIRqnv!*T_iY%d6=-Q(h3c&R$5-jBhmTu!ctj>tqX6GJjuF(VF$65jrzPc5rK z_sco!8fv*c-eX=Q$z#nM`ye5a4zDgh; z(K3OoW)4)whl!s8+*^mNX=O*+Q&o_Dxhf}!C>b^==xOui2sKKFS=vp)PTL8Kfa2CU zrxG5p`k4Cp;T!$c#Kp2!xgZT0+U?oFKlHbCc5y>tY!*-O7E}h+Ch@R@l1n1+Hj_Qd zDbgW%cf(hH8x?>%)C#2eoll$YY^iczM%aCtZ%o`J3Gopzg!;{HcuBao0a5xol18Xh zYJeDdWxaN%Z;BjupnVEXS-2hA=i2@aRa?^^XQ`CaxJhxy*_pr#{dq>+W3Idnjeetp zv)e73v$ZnWMe!st1zTzFLUEy&#DL2WEJ%iMA;Q)7IK*ww+#&WmhW;l4j>{K26&Er; z>}@2;0Vd|M4pGcK@PnIv&fIbm-H0*zm~rEVCIU*OOOZ7So+WQW1qo6v>EXZ^0&Uet zCF3oy4397mnI}SmeyJ&AVX&*}QrV)0x!UJ28pXReEDyGuYw%=1~8;({|KT6PD#pJQlq{rhS-e7R`A)L6n|8dh-934g~ zTFx~bH9fI;lofJl)h-zS6~EDjR_~<%G~NhBt_Z^Z8~IoGM0M)38sZ72TA1OlqX1eA z-zh?ZbcQuq$6QXANo1|XjI<8_C-m!8Tm0!f(WkFTM-bk{!O$P0v2_l|9A&SXU$%If zYRMlgYIr{Aade@`nQ6c#WMmeHjW>mr^J>U|y~Ie&IxF{=)JlnmF4wp;7j99h*<{F2 zjvu3CN+&J0cDn&;cJmbDscZC!$BAJwaB$c+Sh8xVJk0tIAm`tZ4;q>L@s7Px^Wk}> z?Y2uaR=)2;3v`^w`6E4pbh7IqcHaH;NnM;RX*zW&G%$GzPSbgMTGiUA!$qL+2tEi? z5pxTMrdp*e&X&@q4Sm#R4|9sv&9S=VfY$ooqju9{TQ=Hw{;2LQJE=e-#9Ee?L-+;d zdw~RwP)LwzxSWn$U_>Il3cqS?j}v$|C%07jtF`dmLBn!81bqmfUd!OpObH|+k(YJX zRoJq%_15&P^@B%G*FIsqPQg;X2oy>T!5QK69Dfwzo%zSJ&d}1elu9KoxNyohn2vg2 zrjkA_li)M zapk(T$xuP45SSM;w3;EW?5>yx>b>U{vFe^~rq5q+Fr0u#-UX!mE2H>#&-r z*5R0rl(|vpXHZ6$!d@88hPFi9G9jcFhG7b)(DLPc?lvI&w1&;hqIJryngL4Oz#r7q zOn8E=WuFLTOiF&HTHV^A&xw4o`Tg`>Vd)Dhttr%zbvTn1XDbL??7EpkE<-|=*}(;RP1!eIxgzYW)L%n}S&bshn9f6-0TZtMrf%9!`U=PnlW~$OSu5A^k zQOjJ@tNLI)b@}|LjGF^aTNc&W_d2cP^3-tv6Woj>%;(mtZ8mE-e4rxO-_KXSH`bwT zgN1X*)bOrW>D0!q;)oD_jwL%$ZJ2E6r}oA;j#m%+!@8*mR4KSnMijS%<=! zg6TlS+LD7eU=`1J`&BIZFjVXKLu2)P0T3Vss0x4i1H#6uC3{m(jfp_liRAeYjg?Jh zE51?ZY43;5>hB@M2WaEJq*om+p;axU+?voQ;XKc!eDC46 z_|yl8&t6%Me{6VRKdmH-&eh6(CY57{OC8^7nItyd(p!l%M!&9Uqc_AvRGMZ(4HP;W zs1(NgnhZn{&(e(a!A6a@kj@TjH=^RHu0#;8G`e-Gm>|++=@Fa}C{$d)fo#O~Jo_mcoEh6>?Xpknx5IsAtDJxI(Ng-6iq$ zn||eTkz)4V;Xi@Z^&xL4X_0@}L?H(CsXZ@Otru8SqugMB@UkeXr?u(J1v5^vH*x{f zaKUX3kgWzM6e(sBI`b}~m<+S9v*j|R?sJ?O486r8Z{}n?D6P%cpQt-KPVPXQC)6CM z?nUX>sO_wLQLM;?ixZ-rSU|EYd8uaNjwkQjdDQ4-+v6@UIz+wD!p!Ydo7Mogse+a) zZT^;fz9PFX9vN)wD7d<|=a|xIUSM~JX#nwH8})lLV|uJupKI_5ZILKPYOFQCTLwKr zUlO(d7!12^>88V?-jVy^G4dBtFlYaVcML?^Pd|G_ORb^Sx!Y^Z`qWLeQ83$sn?@Nx zq;)53c9gO&z;Bx23geVpE;0XIeS^%K*tcylekiQ0rdfm17WAM{eL9Q5ucR@V%Tl{r z41QRsqvgH3(vkI=GYpt3yT?mFYX~np(tkIjYO-e?R*DyJWx`;Zyf==B zYw&M|!8{4UfOZVd*d2GvwCsn`%?gZMhGk{^QZ-1YjTFt2E4CEW??m~1VyCb=6RHSJiN~6uiFEpPe%b z-O{(WFhAR;m&r+V6&KMc#cke1txM)>bn=kf8sQeYHfb|{qj69bgrK-sbDm-z(WjF#X88*8oSnJbG8 z{1y2qT8PRUfNjaVr)$ZoyxW8Z z(L=*Z(WV$xA@<*n?=e=*W|?CbFP{P`VB3(defkj!M{w{yYcFK?0@XBtFawn(U#yLo z3adlq-D=!iW4`qjnMB&nMCd8C%9`}hGA^`zL(O~)&rh>;%)BLSXr3gTpLQ~lQ-=s? zVXzK&I~N?(O0r1byx-1Ts4i zG(QXqS6^Sd;ZV|)enZ=peI(H)E@VNsiJsDcLxi2a9s3^w|2DdFfegQxbzo?p-s|Uy zw`B9Tr;C1IM1%ED6HMne^>^eNMj|hlW1m!d1;ed;grZOFR{ck0PM55c!(9nuf07`& z_R%XW3Oq)HbZ||ywwl^$>JW3cu31oubRzl$FmW6{O-$SZ=e31*x_wulUxy^31927( zaSDbVn<0iw@F7wmvdn(jN5qOF&a#EdI2GjT=JU3pL zNaq~Y0(JSv>(3m@zNk8Q9Kcx9@=EcK`x1#gic8I_jZnR$IZE2-ILlMSqRmrPBMbpD<)&(Ohm_dAUU9oQ(Op~ zG2EaJN~@Te%95Je$s!=t=RY0q!E+(}2))dbXp&NF5h_37h^kH;RUV+Kg6Yki2WobjP{{YgRo9#lm4)ySvVE$|AG@Nrd;^=qrluyA+r^}_a z-`{8F1~TgP&!2_;-QH~W_0K7VqH1~wcL+c)(ceJ^-p)7*c1j)w`xqVYRtw@=Unm#nzL!(2ptqHtLyJUB?wy`vZ zhqWj&9!~xrJ}taKUqlcXKGkZ1T~(ql%6N7`LXH^`qf4e;LTEx}yE%*rb-W!kM=#oE z87)vc66#js?R+&g&D=Bh0fX<$J2w;MoyXj>l_JS8?cc?@HKS&7Z1_MNG2FNn)hOez z&8SJ=P;Y-z0CXV?4V-d30L&7FsWAG4;Fblh%Z81tg-$HboD-rn?T0R9*eA8$AzaC( zr2X*o%T#F}4kzeA0JV|g$m(M>8r52Xp8vRdJ5Q0ap$*DgHHfr`vCrfBEl*J1sKws7 ztP017FXyh8{#um($^{Vj)G6Ef$m2_GHp?8Eb-$ZzM??Hg zv$?ZC3pr|L6gC(0{1lePgaad;8eHRC>5R<;y<}Y%^0P%-a$MVDVtV8H5HN44eyTJR z3Ko@|x|r2r9Wn?GFU#J6oHs+Mr}(*mu6WlQ@k_Gc*zU0DrFJ$)<}6LB{agpbe@Xj;i&)~nK9e?q;KXnO7SZwM{f_GQIAAf$Wo}azE%t9Y!Q~m@T+Rdq z)DDQ|_MNQ8r|h7#u|Xm_^-GULXm(A1QTMNDJ*D6?q9G+1;~yBI!{)<2U)vBNpP@;u zH!^(uW!mg3kJ&aqB#M(@Kpjj>6u2#k8Zq0RTWP{@wTddjW)PF>c#qomo?}85+y$a=kNJ@u*H1T&AfT{1 zO@Nt|P%$%OHdMdK1{GWj%GKUcFzLf^ec=`1cD^I&;*Gwoa{fXs+b?;gsSE%0Vy!FU zy&*z<9XP)kR*3Z~sw%b1Q5s{_j^7k^MQfOAY6BszCtPMf>f!j^#D-%s2@qEJI2-u%kmMaPnt3pYX6HK3B3_^d3TCXxHrr3RAkXfrN<7-Nufvi8~eJ ztdXjRvLqzQ7sxTs)eR-{DGxV30-bX&uZS*t=s^vV^?_x2KlU!L}kn^wlQQ zRK1H^#&tO#&%vB$aCe9x;4ttUdVIHD#I@h66&?OtCALS%25PkD#L_&ir}@yO4b>p= zCNMOG8KD&h?!w`Pscb;brmYCR(c*_23T3VR1*ll4_*HlibRWd`KKh)|xxNY4Ehzf% zkyy>sUHIM{W6w=>jdpt}jyl7P>j4=k_`O=Y#%jCqQ6{hujdWto8AvlDxJkSYtA7EI z{xJr4|2ERR+M7C#MC$fUtr&4dZlppJ(f-rllqiwRb+{E8D zERuNB&P`&dy4YAx*7}tDWGD6IVsl=!(_`0Vr4gAyE@Y)&MbFLM(nR`DQqz_`O%Tk& z-mTLa8DT@D5jNZsDtEzzN?XYz)JzO<@DLxyX<#G$?4Dgb8P-ll?`1dc^aGkV6lP<0 ze%+k?qITAson)0q%ssZpp*(`V8_YyD1TV?cQC~7H7CPLkqc}Z52=e+YFSd@C_*VIO z{CZ8ODTjuku?H`5f@LMxr39c&xoKU1n9Uk{Ysbso&fS38k=FQ~;V;0JZYmF-Dj;}g z+S{r9_UpQvGpFBgHzo&D6z^P*{T3#iWP4;HFr>jZXvf>Wl=Paa+9SQ$Sm*q}W>ytK zY$VK%?Sx;yg>R*b;298x-wi26Yh7gMe%V1p+&zOa_w8fO-fm;!$t!q3jcGqK83VPv zr8-{Y_oKIj(6^xRJR(JH>q!|Uwp&_8&kwcXSSH=#*L!D#ICo@!FX?u*KX5oEO1RwfAotxhTtHwY!xY_BSF$qHSV5$-%oGC-q>xS21of!ufk%8d- zf_<`N*=shrw9QNx+8}_3!AYls1W{JE(LMpyc$@?CKSEo&+Kgg6;$e?%VYuh@^y`DQ zizorGHEli5qqC?y)LD#eDaPq$L5zf`j>mEX{RvDkYJk(2sX7nsIGUEZeQiSpKwGO( zSZ+H(^28p>8#ykUJUKKNcigib-(Ze>oLvOAmwzpz$8sw~A# zrl(dkuxC0HML+wvRY7agtC^+3@oBn+3%;SqCf)4&wiUl~9ja**m4%=Vy!lTf_Xsra zfEs{l!E~LN6zAR8$`zI{8b#vf6T|hoeevLGN3g0XKkP_SIt1*V3<#=tx5d39?UF?= zgp`zLT0)ZjOfll9yv$aa*^WQsicQZzCu#c&NlirY!Iw?3u9LGOK%paQe9UTP#`zF# z_He=%9Zb2ggHfuQBUNGG9$m;+Le>S&Cenfl9p7DKgbIuTc%{BS**FD|X7pteJTSJ*$a*aPJ7 zryRQmHvITc7TUk0EVR6~2W@?Ss&A;?C?gVJwzy6o<`M`CUrhlZ!=U9KI{K1VzEz}2 z?+&5e#;=)3X}?-aa-Z`z__HYt>8YIrmy*-7>crd`KB2~9)|R;$xFz_-v^%~Ga8VQg z?nE)Z!*Ir-&<^8PbxCucdSPhaM?h)#9&$~}F*%yS?NslKc`1uobK&}GRs_c}=k{i& zmB!D|?gDo>X`F&z`!v&hs{z&EtK@#uG-hv?U@7J&a5rM{+o`)?`bVfUCY>tm@EDAs zR3j7`$DVk2*~-cLu1)&yxOLKikq;cq!aL>7!#t}>;BdnyLKteA!+7>$RMg3(u}H~P zqgUL>_;BV?H0*W+Y&s~jeQb8~Y+cR1UK;tT4I#Y3K)N-%WF89+3k>2sWA*z5-2@q< zWSY%SGD$nVnIlleIf3sKYSoj%=#r+DYR&HpVz}hN3^}MBOfRSE`;y zs0BV{!f`M13>RtDWq=^5k31R;*mvs2xHnN!)W$}CBcprjra5uO{E8DWiDMu3 zfVH2lGevH`5A=jwBQM%vCE06NooxOEX#2ZKxm#0xJET^Ytg!DVUA#wR>1ye3cs^Gv z?A>R>T>jepp8fYut^XB~_cwy?L$CZcx*Qtq?bK6q$@K5n|6e&!&9g4eQlj`4^wF3; znf&;Tb{PCO#cAV}b^b|EPjKX8wOje-|MTW(&hh^~jkG5G=b6MY$L8N;{`*3r-_c#p zjM;SY^{Frb$|6^>Tx>Y4kd#+2t%1QqeeD}0(9H1@B&aT@QYHD#e?&C|j80lsT`;PG zwRa%lPkwkPl&`bAl@`9F$9iT5aV)&4*jE|~MXOxZR-~&;V#DaehlmqL_tekOwd)L; z`a;Ix`p0WtZ@vqU=h1%WNu|^rBc}zx2YCeoTcEUnb;3sp#QN1^iOWOrMlAIY z@UYRY9YSIxu}dn2$uM39wTkdaMR^VY>|2sTkX7K+TR{myn-hM3)%>ZYuUEX zvy*#TxW5d;86=-_84TMjr>R23+vv>x{tLi(_kqoMKi&-vwCB1`0v;3L@oZzY^RIW5 zA~)p`#XFSm@m;c@LIcT`=lbmCE`UDF!>z>Xxkq%AiVHZ-11i47qy@x$=|Ar>ebdSW zT&mgCy*i!$0!Xra;_if}QPZ~-aJWFxL?OxB;ec6ar_UU2bwP`lQ17v3wyyHj#0ykO z1MyIFrXCv>VWkHo^%d(Mw0IjF(57-_wwXgSRW^bUsLxc(gy@~j1-?uibPreUJbmk1 zwaA5K!=qVQDuE?SsKu*&Lki4+ds*Pha14+6XCs`+S82VYerB+LR!9KmCHGC*ypm&%c z!``d<2Emdfbbin7RXXI_>wW|)v$klQrIiJJnw&6g?2RYUgVNf)`57M@nC8OtBj*r+ z$jbTQprGi$!ymF&o9Cx!I8P4F?NQnxymm_C-dSB|h8^MWvLk}~;THwPGo6yIGJ6}g zpsBqvp6)aDPQ%08$I!27L88;ni+_x8y`aM!u>lOwQ3rxO=&O{Lenb)%M0!zi-@5c* z1vPy3S+=N|=J-&onaEPKn!3D1K7*i0emvte;C!%>w`E;`p#xc!N)atlR!1FWALhd^ zfdGG)rI0Ai6)kpp_g`b>l6N8<_# z=S;@+RVOlA-qUOt43?(e-rbBS`mbM3ML~=cC`}K7Der4B6s?9v!`k>NZXt@b(UB-TR58Uh&nuE^P>S+u$ zG@he_~<%yxlphi%Vtw#-{Pvz`iAPA|wyF&Nb;CeH}j zJ1|o1g~2J+KU+|zGGLsP#LG4x$oOsDs_2x=0)g(RUt;>qz8C`EK%Kqrw3yczUzIeH_GhAw@7JVi(MVcsiO}z330R$)R=Dep^6=ZvE#S z4DOK%o_Ow+5eWToyKWFwb2<+kQdYXF9Zbcd8T>M0L*sU;N~8&O9JYlYZ=NGMOC0!;hE0*uhq;>W5p~8u z6LPUdkj<7#4`Obc9*3=7CnhOOQQQnrU=hm1FflC3P>I5Ti>vp$O@M*ev3yFaMs)0n z9{~_0q^OKBvat1!-I`hK<{lZMcO%Fzb3(+dY#yy)qE5eaq0N-~>kJVb!Vr;F@F$WS<3= zjWx1F;1NmMmm9`J)RAE@i=lB9phqgm)$11K0ah@**jxHeCAo}#7(y?Wzd`-r(<_%^ zMj;?7+2%&w^gtl#iyp zKnpwbR)UQ6V1J6?ESsnx-vn|1GeV7TU<_z)?t+{Dbg>qc~HJQD6v5V>J)fJbsWtB^CIW)dtB1^X;0H@t1Fq#s*Q`yz6 zc|lC@lYj1R7!$&@bsYIaNyGk$vs`6kj#R5WEZ7xcy(RHdNlHPd&u5N~PTOv5bwWio zb$dGThmug48ct?5A4Ti)I1*{cw@F`eX$W_mC;}k@pLc|O)(Cx$YsM||YRhSoJ8658 zFc@Pdiv`>mo?m5w+;HrJ1it1)o?+@NWs8Qw6^)UudkLiVAO-^+E6akw5%X3TMkeA; z3~~1H>&M5>!V^2spX^^HgJi%6+8gez#p9pE2O)~B371{Ipn1Kj1g5x5?~M;aF2by; zZ>8azwk$WR_+9l-A(fHP^+zqjK(Lh?6%0_cM*T**Ai-Xs4C5t?9}uKB23;$BFs$@^ z1o$5@A2FSemD4Qdtm_tBqh3r}FtBxrI@YkHJZwJ(a_i-`J9E!t!s`+O1HBEwjB{4+ z@U&^ah+%ww*5U}F?y}==I%e6ZeR0^R7 z!`c1@e0S;g7uxgRNyP12>vQmNJ-Ol_*H6{E!3-HbN%gXbP@H{dK72k8L=Ul0PTK7y zzEUgPf%}`6rB5~i$C=$;S}CfA*`jQ6p<>t=?zpYxdw7xyJk-3kj6WjWeqGmVt9m^G zBRge_R!=pAJPh%G0d}qcbeS?w9b`pdB3l6@$V9;tXH6dq0i?xK9V7Z8T@qOb1Zr5B^LT_^GCJPc!WLQ}a7Ly36YhmUNL(s^1mfHUO>x75SbEv9N24V%`qQIdSoAlDbsGZji z6M<*OggrOWPrdd8tAp+to7mZFmMd{{*K}WIWML)6)tH#tRlE=9Bd1p5*w661#o|ZO zKb$aE>Kb%8z^qBj_Ph>#NStzF`;y!-Y*2d$wBl6F94&*&&iCm%h(^^p3>|wo*1tWDcL4W=q=oglz|9Gqqo-6o;`YXYyR3iw zQ3V9{x)pyE{(U6x+Q|jE$jqh;eK$qOL+94B8s!Vay-~itV1TH(37h1QII|~k>PVt1 z;}p+-#=<$iRi|d$xXImrHgl@%p*HYvH(*6*V@6w9yx3ZCu+T&yrYyPZ+*9#T(#*dzY?DjS;!$J7GNBspS_1gov*=YmiD*4=M@k_ zRWS~--0{%nOZp^@zlXa+82BES?Da*6IB=0*Rp!;TTWcyFv7H}F>dLK$nk#;7D|lDy(1Y<| z6}X&sg<)Bl%~kzoL1g48@k+9h2c0fG8#_H;zW!Q2zxpA>{t^ECx1A=fU*3^V)|QP` zUfbWBe|-Ai-#F!^|HtogvnKy%%4Cxg2MYO3FKBBDu>Sn#Z(|)u{^O*6AuupxFNy!% zuegrt(5Hjv9+s?^A-h%B5rYA9;-7Z(;lHSTKXtt`jlu+>(*9gBta(uC8z>P}^Vn>E z|8v{_Hyiab81H!CGj|)LK8(}P3)Y}DeL|NxGb{<#j7t8{t342mOqLgV3F(W5M%l}h z?H9$k*Ki5?gxiyTZ|w1HdHefcvfojGBU;-fJl_`_+&u&NAF6;so-t~t;J`N_n9snU zl{QEf27dvnc(i(aKrY%>Pn5v2^mV`4Bn8wB>8z2uu>71SHl!x2p4NC6+#S?>1_^y7 zsM&>_^?}TttQ`67`?w!v3e`(DxY?)Y0uf1&!R+W#!ey}Dw^mAvTVD;({C;+Si;ADI zC$@Q8DNEB&Y&as;T8)lF}21CJ26M6(j zFZlT*ali$pQuRG~(-sQ_GZl}-K{hC_CT=voXXaU{PM{}aSIsWZbVJP=PE4FatXJnR zfX}nZ-*E9qQKY*a+HEn+(z2PJ1Ys4uQdFEHvYh8R!(gM#eM)UMZ08y*Tp)@g3#m;c zsloAPUjFw7iZ#`)RViUv47F2t7ntYcX()zws6Z`1#IMoBSv2 zQuoaeo?K=kYCEqCpJB&6)NG`C$Z%DwbGcNnr$q-YGY4K?=?BTBp^TJOSJhi_zpD30 zX;#Yg1%WT15o5f{^GO98AX z)D8IUztwiH0QEf-|1@DIm8KDj0W?7_m?*3;UB+1 zVLZ%=s7*(QP<8eTeR=$n_WZYFg~xTj2m=XJ_PhC?!PNUJ~BpWmM{5H;uyD zn4i3#+)nCgz!Q6C0klC#YzP&;7OKxY(2CrYnuOL)n9SB4qpw*3=TADoti(M~yY_}3 zPa*1?7W!X+&HVzb9<6+z^B@Ex?=8ckC;YT+{RKSFt7uiKV5*WT2Phw+kHzMFd1y8k za>wo`-}Agxp+V@Ai;BnGF9$U)kBcPQ44i6cUO|PkAIOQ}S~DEDG~6|r+()^dVx@ow zMg6POLm+5rrw%L-UF!k7{r0&+|K;iP{%1r9(Cg~2F}t9{}f#cb((Y z|F#VIyZ(KN_;jKnCnu?tZny7|3rZ{qB=6Nj+F0Mew=&eoW4*N8p$|gZ)>%Cfh}+4y zU)|@>Ln$Jj2Z-a2u3?KgH2zR{n;{KrA2o6cbhyb?xE2F=n^8cSd-Mb_z$;M6n%;-N z;0t|0(R&##F18tc=mEu>%0euIn#u`E^O4qo&AU&C^T3bu#^f8h&geEO5zat{A9Mgz z)$a8zy^8w(srZPVll^BM-QiqklF6g@-mlLbQFr|O@|89nM(1w;nSF#=wP4EQ|Cw;; z)y_e@yS}EcbBq5@|IUH`H#so$%8E>ui69nf-P|ea(JAV-QH@hi!hd*UbwjN8VY>6S zbn`xWnJbcT{A2aOFVwKSYuJp0BFn}7s^JH<^EaLvS^UD(oNcZ8On*Semk{~1w5MFHbyNeq7DUf! zP(eacKPOg5P}Lqvl&N-$AqL8Uwt?J`IBP%6O}YNie(S bGzyZ=N1{VbeairD40r zv2Fb08Mw(-3aYjNKUt>vuh?<<)1k>cp(0tymDOFfUB{C<)JKS)S#t-FqKA>E2R;1v zgMeoG8YFz2;9bX50#4(r7skpVyxeXPR7DCGFz{l5=V{7^lmT0ZY-TE@6`HL2-en>T zd@vVF)yf~ENuUq9O2#wOEW$XY7~nXT`jU0q;d_niFgFHk`aQ(OL1SFxY9fweijT-mEZMyOjR8! zVx^^TsElztX7JO(g0a1-WE+GG@3b93Du<2{urN4eEjXmA+X`m5fBr-!kolbpyAELo z{H=D4F;ZP?E*HPP3CBQTNZ|S|d_hDti&%%cw0;~I;%E}7H3bbS5`ozw688SzvI z?ZeQ%N{`Z0HS_!K>c0R>tV_n}0ySA}M;#SN#uglL!xF@Pv$?x|I)IgkBOQGmSp;k5 z6<^qM36BCY+Cj3FMkjstV-DLGZnG(2p!$O$ls4uZm+11ZIRJUl$d+x00llWZ6vzb$ zVlizDzcgF-Av8_POZHkRlb)ApfdBd~2eRbe7~h+*OhtCJ0*TArsfMfz;UsaUlyWV> z(5#>;Uf&&FD1GlT++!hYdf5Forj_{_rkM-QbK;D91oj^X7Xy|0(yA5bpOuKg_S{Lb zHYhv{ucBifRnz?X0HZS4$R-jpb?Gnn-iNz3%Qp#8HQ28#0)mK2g|MvE7He~i6NC<3 zH`$eiip2}4Fz;V|wYt?RkG(=05Tvxex3+NJb{1`u##IIVO}9sR%W-^`Vs85>@T$zd z%eAi-efrb7hy(bRY&bAI3F?%BY39@MCMi}J(}Eby>_B0#kh*w>3!Ackrh$lm1V(!w zA?M@W?H55fma0|a>GeQw<}1_OXFmQ`vhFSp#tT8RB-MEMZfHau!bL)`t(4`fw-eGP zQgz@pR_FbXz1(ATi3u2q9ehQ-nz?^=@3C3HV4z*w|a z;B=}?%J}cHH9Giw+-Jmw4alb6_QCdWEEfH5WOt0$he!i$A}9{AOF9OAbDw|ZdktB% z{Gv}cf~`#CIB|I28MH@<9@CYEM-zT6fSr#1r>nB;A-to5X_p57;AO_`WieJ%S6#F< zuM%v1=?$tR5U*PLbv)8vtLCpdi@BkNUfI6dL= z`-FgAn4r!Zhuz(#%-x>LRz-LKs>53ULKYNIj#k`x{P3rIfB2^;nTp?jUUe*qd|g$| z2znnZ-aHc?eD@BWD^K*qKoSqRhaPS*_hc$!W1T2FfM81&t>`wc?;8;=R4K-(W%yF~ z3tH-aXAdj-{V21hMvys*TIYBeYFvn0(*W^ws%X_jkqxrzs&6bYj^Y8q%UAsnx{JJo z#z+@GtNRPO7&QtB`8tVa>F zlnAPB5YWuMYN^pL2`2bQnzEM)pZfWU(u{4z@rt;vj*V`C!B?9(z8Jsmhg76x2b;*y zE}$7mPB@BaUu(s>HAkqeEZzyswiB_GR|_jS=Q@0H$A)fM)&O;3+1yUzxE%vkc7{Hy zHzm}_xY=}ye+OM5*7Z<6^pD}2u9+JmQ&oQ`?SWwQH8ul1RkzzJ`+DgCEb7=WQ<4} zg+_x_nf3kO#;Ol@dW3#0tbsE&P$*61cBNP5PGG@M%~)2*x?o1e?P{3;IJ!ljMb<#!+O6MMy}RgZ ziqlVGN7*eO9gz_k@P5aviy1s5Q+%T^B%n|6uxaa!iqYacsc*XS@ax8rS zHSvFc$#>FaPnJ3Qg)3m?F(m>E#fxeg_5%X9SjdNSlG78*{*#5F4En*C5O zdp`hapsf=>M;X5MS-A3${^eN_UZ|OrFNV*I>*YTz5{LjbW-zO@BC71Fdzn_g8w%Hj z&ixG4OM^94$;s`=gW{ii+;wt?#V!uo^1q@OWzTuGo+j!>K{2`3_H~MlO2(L_?YprK zg?GJH)vKUBeCj1aCiGHtS3eeGN$I%uRXZp~bgz9mf)&HI+Y>N}*dU0ojH+@fGR{@< z)Zw`Tkyk0r#Rbe-XML@8nd$7R3h4 z6o;+3LzQ9)ZyU#YjDKr^X+=@e=Ij3r2W6qu+I@Bg7|Nn`a+A1fs-A-jBdBg_knmL! z1J#nl0}uy@{R;*#wR9PJi)!XVDLgo4yU}0ik>MGBo2cpLfI1d0Yvz(=zQ@r|wV!1Y z0MyE(z^+HyQ7d2TZD|VtL!G`*)W_Mt%5f!fK5i{9nIm)#u1%t6yfZ#5EnD*r-{pbq z%Tnli+pEYu)dX_Y35oO78?5BeC-YG%8pp{KwPQB(Ng_mFurS)t`pNvk=K>p7hx@@U(?b$mi@)UdjOnO zP~TW0q6RdAoO00N<)#b1-bGm2Snzts$2H7bA95X27$Zlca*Co&0`3?7KPL?ZG!9zbJetu{i%an3jYE?s20V|O)aRaaRfaWk)FTdtwmyH zQX_3>eK_%KeZr#QIPi3-8pAciO{IsMNhc_%wi23-V}VOY+)MYHIp)QI;<|--h!#22 za=w{SnSn4QVDC#07+u`q^_=8~@Jod?36Ufs{O}y{A}yao(tqOQ)!gBktAP7P76i&<|bqn2A$4Ra=;`KP@tPV)Cu%^Zx zY2C^J88R>?hw}3xmnQbZz7RQT9O&(ltpA^ zi66o*gcl6OTSy}yRH%L6N!@1|RJo<~eJSYkB;0E~CW{?ta&TcheKImwW$1&3fcl{K zbE37BWowH)U=Ud1|3nhsp2Ojq)UN;)`WP}B>=DSJcN%a+k69_BB6C+voll$U6k>T0 zIEyC9hAOvqJ;0}i*~Q?fe4nnY``N%JipK&_;aYz(Xj>u5fcw0&a57ffgj=;$5KE1o z11e~;gN-*q3YT(cqovt_vIHsS#s!yk?hmmy-ym=FF8So!zYD>BE1>FQ3 zQShn5D*=f@^JEz}%+;@JINE%(Wb=CJ6=@)lT)Oj!^}dCXkt}lu+aF0hTO*-)a^e1)IH%ter*=rwn?NMf9N{0!mrj2XZzVIz0=aPKW&Fcq?ISsplPcJ zrpD+6E(fKW3q*rV0DEdj+=$e&my5=y@g|4wV&FHbX6iT<8MVm}Q;`!N!y-y6Y1<2b zn1vH@i`q-`6~a1(eJJg8RGgz?ZoG8LusX~udpj1%j1`@aavegAt6fL$x0x-KOR7^9 zLnC6jbU_PI*er-x0r!IDDnf^Dl)}@e#aS#)3m_oQlw8XVj$eutZ|WKXk1jZuC6(jE zG1igtU~~?4OA53fp2|pe3X86WnD3nC>Z8cz8EjMwVys|V%Q(r1B&BDsMejun{_ORl zth#2@J}qq6PBmP{uJITJtrK2B5~`DpZySS$Pd?_1g27MMztP5j`8GmzJ;Z#_O{*)0 zAj`jG>m)@c{{dCpLFekJb(xKg`xX>JRfts>Mm)zrfFTzq_nzs5f z@vn#bL-Mb^rJabozUJBAqn z^g8j!^KUY;Pqx9<_R}&%vl#9}zYZVkI*er1MuM~JJx5FsCjJ6oz8NUDa~ofQhC9xR zvRP*-78ku-xpvK`#A?MA5{n>2JG)GCd^)i>qSc7Oo+r>A1$=?GeNb^dkjYMOJt-N8TkfDxlLUS zoB0ndK-+`*MfDHU{}1-wDmsoP>k=(7Gc#GTn3=(1mW3r|W@cuxm}N0DGc&U+X118o zqh2%p^?W@&_x|&A@58Ljhl*N}m635OBjTLcXYX(@-Hc$k@-eI^#mA-z_QJqWT-x$| zML4hS-oN+7yxB7KVr7w0A8Cd0j<+%LuBc6MWp;R@seUz_PHX}bDLSFPPnK;^4_m}! z%Fp*aDbptbLl2>~AhZ0#$f|Mal{TCg(a!88U>OV1}1^>#w*LMfX3| zYy9*>QQP9^Ig|JL69?wkLb@Y5#srp?JTD&`kx5U6(9NY ziuRgCN)8`^Qw+$42ox`Q#fWECCe$ZWfxbdC(ONDGmO!%KoEje zpQ3~+EJ!Iv>n>*&Z4#Ti!1RB)ScefZ!dAk2WSDcH=dryg(AY1)qsU^I?z^&ftK4>s ziA3%vptCr;xk;;CO)SqJ=Qpag%qtl3e!5O{<)r0&ja3JytB?T><9FmkYuY+L7%u|Y z+b#al8pCgc%UQHjyNK<5FitoUZO>}z`ARH8Reu0K;f0P9lv37jLUjlzao*NdHOoD} zdG?&a0+zw>6mi=U>0|KeTiqw3e;ijMnW#c+aL6V-=`T6Y{YdTd7}lFtKyYN+0x^Zp zc*TE1n|%Jg0z;yxZJ3FR>u$?Lv)wu24oBz`ghb%3ZE7xSW4e*sS>~Rz+b~V#_Op_o ze`+5ANt(3kCqqAEX%uEqxAjBt7ljut%d!7qL$Y$2h{EFi$4}uL@-u#|zWe|J$zrV} zf+Qeny)CsrF7re~TiIg}ykH?hu~$)5AzXeaT$PT!^rzkiean4DV_G>@Vd_-n3B2SC z?DF-F^n5ti&fGMY9^plQP+#ngkXNT3#?OEf^Mlp}FD~MNzR61~x5CD~_ID3i(|Mw8 zD%}uObQK}7`^w)YUl*K=2yF?RlGn*CgUumDcUi&l^UUDfFl~Pu|B97?uL`~7pHMko zyCv_g&WELK0alKk`|thW&cDC!!s18m)MS2oDwr4Rn3f%~FPMj+17wq)-X zh;7cXhykVE#yMzq)@Sg(eWGfsZkI{HJN`Yn+`^GT=T|u>s}t9ikT<~a4?s+{WN=M* zOG}PHb@>K!XC(DD3zuUEsl@Hc(o*z8=HaK5u)*^gZH-H3exxCC$Y%d2l-8jsR+~k` zRWEA^uHDygI zoNK5V7LX!$I6A3&;Z=CnEQXC#YU0UWqXx^Ol2NbMdk~Hz%-R|!)C$&L*i^a&gf$f{ zoWsa2&)G7lTCA>{8U~caD-|7i&OOHm-p#KcT#3y*G%%c=eXy}eN1c{B;qFqIOIp== zHS(t=&$qV!Z6(Wr2~t`sZ&vJvOt2dr{^}ofJWt<%NZW^JF5Ghd>Cx!j#TJ;KBqTta z484b2W@$V5!3DufR>CGywzloK9uPo3+~9khVT&1+oAvUlv$WnAR#Y{VQ@8l7xbOV| z7`V!Dx|ZU!9S7Rkhol$Z9}t}1to!tBqQ3GQ8AySvTge(4&As!-ca8`0G~R{RR(2ZZm3@bvR0IaGI!Y?T^}uBd;K8y@cE zX}6;=5uhS$b03qckMoI~2?Fd{;kpsE;61Fl_mXeJQV!yCS)&!l{aP@_*CsEqs$`>+ z>M!mwr1AuBnuSuU+e#GWwxLlBJ|Ir2C9201z&Rr^cH<&i7%P{0^;q?N z#^)5F!^6RHP1}n{&NNikKHqScte(%f!o@+dJPDx5r0)#d3CO)mmLcY; z74RRr*9~FiwolY7!;B%D_Yf-|v25&6j%h@_oKOADaOiZBll-1QYM~PhU4~#+*<$t& zfPe(Q0kj6{=HW^>ofRw1M=v{~TJe>P3D(+AUWr;wT79`K@?iVUIH8Zmv_QyFBtMOy z%LJ5maPB73T~(S8ES!ag{9!N@i)I3_p4*q&N}l1RB6=&&k9gEFrwK%VCjT-zUiVU; zXSerN7aH|uvllbcDU;A5EP~qv|H7|6i=P^{> zKLGU#)m=^nF{Q-S;W(d+puW^pAj2xNyO17~?E158>K@kl|q^k{! zxH3+w6d(IWTGuBv0!hOzEmsFJO$?cQR71rCu3|T9rBTXqSh_p4`L~ARDOY-&%@%%W zU8!;zZ_EZ1D11a8uUup$aKu70P6xkX*8>^EgLT1W}Ekw3qI+ z-0lR?Vv2)vz>u+d9dsipmB22Pd|*E8J`!a@kQm&whFVUjqG8F&YhtvWy^*6?Pml}t zD3U#?L#<5!Z%OvX2kfI9k+|dZ*`xe$XpIklWhQDT>~La{7|4~j^^}^UoQ^ueEh|Ly zwpBX;$pb&`Welr_ptdb&HwyB1HvD;Sd#rpchCY?1vJ5|$Z2$eXw#SU^i~T{J$%FI8 zTEU%(Q1E2pd;~$tT*CxU@P)0_@Wrw>`9&1}9Yh-$@Y%`C!lyuL0(!VBXf7#%GH+Y1d*`KsEfm5pst` zH=22@(_I>+JY1N*li8DL1>jN>FR4uX5@>qNlh8jJ zlM5b^)@;q?hRX*Y2ySoKryb{j?ie#M&mV1oc`9;DkN1&#FTfH-FkO@b0*f>Z@$Hx! zB%xsO74q$Z5Vu6bM-HAcU$X%OvJq`OB)6cGlC!^B5935@_i+zVI~LCUSHEf>JIsP} zyyi^)Q-UkE3CwAb{T4uGRs4o0JTrb_DV05+RY*_Z_WT}f`x#*Fo62z* zz=-f7c7j9kmQF|FN}G=nt^zdaH~Ry)cNg(1U+I`(k60}Hb%JvRSoE5dCIJX?YoU9D zBT5~XM}3mee|Inz^T&QCDYUDAfGN2Ox~e$G-*$jp^Xo9dP!KgY$ZGBXSw4<0s&oFv zviL*zy6jE1h;M#QfUk{GLGSa|+dBjB%GTY+lu>?57|$(NrTf?bK_AFmy__SR1;FP% zA)m}>?H2fVWN9?ELn5Vl0=5F6@`?7c=B?fx@U08HMcVIK2cyrev7RZK_PX%&svf&x ziwvL$+q?%e6>MwqiwlQ?=x$|Y^NEz(kb})Oj_{=(hmKSC`mz|F_F*nDiC0#}w0KHt zsx9UHW+lH>0$BAJ74>L!QTAYVv{$)?40B6h)Q@0}k^^FK5fw5(`weF*nHLn652NiO*6BRvnU=qF( zx}aZ}WI=xb+t3AmuvZg;#4+KIewQ0|j>f?e!8B=TL<$mD!>f)f-{ucIPJOSX1vGLU z7VGa4dK8g_SdQ#=pA64Iw)z7jh634_?LfYdMJ&IY2jyXO6kAkyT~)Ytz`A)KmGeCSjIxfz+XjZ zw=lQ`R_$+rr;>JT$sR*}YyJ~W9rG#)Y^@hDy>F=r8+&acBJ)T*q&uFSlunQ%nc?Zz zjNzx^G9IoFe~J}jxk5)mZp8>n(I78Qk!m>0PZN-`x~iBqIS;PD5_1+`O`$7EeSZdA zk2v!)$;!!@+eCLv2SgG$GPYD*n3Xc>C3w#)XWR*O{`0ANoG<<*!UM9L-28AzxUyiq zP82&M9AyZyN_j8#85n0Ails0X*}kZpXGGYl-E;zkplHe^H}>h+CZ$p{-b9kU-~pL7 zdIvn!62v5;>wCh-RdO|~U3{baJx6iTPwqX5SYC*=%~%u8FsdMhb=h7NUb1?cef&vk z=E=!|LE<$8*c0KE;{oT8{uOv=z4wJG12WRNG)ZU3aRx0xI=KDEi1jU3SB8xT!NB1C zECdt5Xm+aY!7so}SylrYJIzl%HxyoE8R`{!2!w3}0@RlonRd zkDvabzLcJhk#|qw`$!`8$PoB=ZF!9Vg4yF5H36q4Y!RaxxiA3L?b>sONwEg`ay(&1 ztW*EdyHZ%q;Ndi3^$qA}OV=a#z{WAtE_%*+wi}Ey&1oXy&6ocPBBV(W)FGT1N8X&| zwUqo(m{YxRfQh5hwf8?8^c^6vWR7pC?yiXwq;@SgW`ZmTQCm|D9hgKn$GMQ#$_lY_ z4hIhXdwyO5HSf}YC$NLXp?xRU<7B%ct8mhB=ZJ+iiXeF7Dy(G4D3N9Z_qtCLNfi8z z`cj*C#U#O8DdDR~6^^Y%ZXg2Vyrt0Rb-P~_E@ObU*f424poFz`E4&!#N1%$(^L{9j z^ID@z4S|?I!f9}$Ulzm-CMUR!d~FnfMJ;Cpl1Ga2$lyXNJyTl>IJtpYF9vz=gGw8% zCt-T_NVGxx9-42Iuowd(7>(sFRo({7$qCf%ML!M@wxBd*NUrRRcS<=i(y9Zv2u}NH z%DfIW$Bm6jpUqj3w8_x%u+QD~%ikOtoo14uZePw#oZYvxfm4@5L`9`+tyjU(m6%^H zv~X%*S)6cdsYIlWd7s=^(fo=Pwbhwj>IHM$2W_eEm^qHgriel7e#n7)?ceR)aZ)y<>LkeFYf+e}y7#qv>xG(xe&QV|KR21+y&EtJ&x$ua z{%v=^v#$yoYLiVY(>5w~xMNR61eS;E2@@{RQ7jr?eNF2CIY)g8tKLlqB@dsCdu?B+ z!cQq29t!0_#uL6n_k1wEw_kwcd-CewMCp2F z6O{+DKByUBjytxZt?}R`){knH~B1u@Xz3un&) z-lr4_3Xke1kkCB59H+5SLX9mg(dgc5+hHQ2$?w!dh}jxGK6rQuqqtvw+V3QDJ#btV zA;zypPI^E@AqkgiyeZy~vs8(qag?DY`x{g(k?5hbzgh!e&^&wt;j-<*E(US+l~kue z8Z`j2(-+zzER7PuFsVptj{=_{ll%+iAR@C^0KUa{pJmo{3i4Yf#iXEp(zB&E+79(b zJ=$B~RiYpY@;zHn*_N>w#P6B(7pD{B4LOT`@bBl_{ZLKoV3oFQXy8?Tc>iIsd?KMkA@jW%h*hFv)P5F6pWt z+@u^B=O_rj#JU&ynQ?ZGiQxovo_(z({Ei=TjMVm86g>2%*=1d8Porj>E(L_V$8;MP zPwHkqquu%W%F-ERwrH6F(gv*wsc~Y(06mL{n`M1Nyd+5VEd(s=l~-PpWnYURmK^_w zC%~`9%~|;8ue72c*4DA^dg*HQ0UupfRgrq_Y#lQg1plL;I22WVWM}+E)rUW zNoPJ#L&+u0rD4Sbtd+8xO@iai-AwW%e8lZF7{F`VVHgu~<%IygMg!fiq*mEhdLn`9 zxpyov3GP>nE9-+UAse#Qis=k7y>jwWkLlEC>c+gYtb1Ybw=DLsEmaRlde@f=a?BWA z2~4Zka91uZtc+cib^Y1~hBEXp`KJ>slR>qSC$3Y} zPV~KQYR1e{eWy5t%QPdCONSY*OZ>p>Gmz8rsP!detqC>Cn0uYx;*yuASF6@6*bP;V zz)Y;kqU@w2y6|8t7P(EOurJNv)hlzVjT?*d>)CON2zXl{CVD_hxRX??f(bLxd;KE@ z*1B?et*UBs-*Cqf=yP{3xG!H-s?u%mORoEX9Py!6@X91$i%Ghtt>@OLdY|gIr~LJ; zc80ExNd(yto;~gHHMDllgw-=jkPouoZiw53m7TNlLyXsHmqej7y$+^un^x?P2`l(N z5V^}$PazaaEqy_K;jl;}xsQDvt`X9zm*q3>(*+A(pbvsS65h(vV#?TehpX6<=U4E_ zi+9!bf|=JZ$he!E8YtMvs8EM$)3oJVR4VOXE&qlzdJ(;KhK!l6n41ljvYn=h$DiYrCC2`6Sb85V7-n&LPNXKBU(1gs;l_hde}*eQ5e`#7^1kA&Mo5%wxCl2i^Yu zl$uc<84x3@&iMKY+C_Y}AU4RCDqs;9n0 zm#ga)x^iv=<1WKt#SjW(g?81=SryDc5e;_()(zM!8OPbH0f(61l|^AMKhh?6M`n6- zt8?Tb;yOC23fbjQbn?5h9clf<#!y{4x}eW;JOVO!NoPKlHR z_0oq6Dt|{?2TYj%ut9t)v%`M#7;qcmwdnZNA(%*-K;Y{rG-SJ_+L6{42~%)0BLke) zlX$OB7rB$82NvPJ%sP;|TXbJLK$ zPJPmnS#9Q#qUsw;6q#n>!#>upzh`aGSIW2@+fV$qG|o|6uw^Q!GSm6(uEgGb@$EB| z2}r|T$dz}(s3S?gSv(IH0Z#jY-<0Sm0#E%9ExvInE7c^6p~TICKqd9GJC$-=`4Bsf zC4NoK27NE00P#^c+QG$CTxsf3JLYBY3MYa>EUf(gYkHOrC#yTiGjqGjK4bAU&_@BH z;DjN@_-U*PmRmaC8CSy&s*yfw9JqreeG7&g|5&~VT#Fi9*&Mb9uAIOBDFFezM9_bwKCxThUvbbp?Y#If&-RqlKA*5V2xJ#381zCF+k(yKLSNj$R z9VwN-X@cCyyLHot#B`4MS3wr~xt~5y4G*b_iY#2<-+ATsx#W-mcV?q(uHbR6tK2*Y zW2lxYAv((~kYL$^zlbahYYE0%`;_xrdARA%As-)bZ_BZKC zL-^8+LAj)|2z{cuiyNnnccQ+;@q!8#BRI!R^E0$*yzMGfn*pD; zTGYQaeGTK_2zJem#mKf0Wcp-5$9B38E0#%*=>2gRYrurM1WeHCAZ_*L2^~5)b#SEn zD^-%#&<|Yc;@nuuAOVz-eEuPf}#n^gyNT-g;5nLdvUPM;>b%EN4Jp_Ep`qLDNiPPp*}E)=bZU0q%=*JN~}td*J@NUsib;gC#HFG}l-jx=OJyjIck*1oeh{ zv)u1N*p2h@2jCKoC&19%Zrr&0Bw)BXq007s$cp@0Z26I^>Z3+m>&6>O)>8aeFNZU? zZ12VvUCDvCh zI~oJ8SEpX>9M(_~#V>3i8MTN4-K@Gh;QO8G4v7a3QzaEBkA|JHT0g0nS>TJ^9?tDoXiExy%M5f7a=JsrxE~92z7k+O_-F6bmyw2Xh zI=h|#6bkWPn}tKl>^b`ukZ`h(8sXIM>5=iyDE6s9jEX zov&JbAr}0+Jig6gyK^YC1O=UvdVh*Ev;mV@bk0AU2^4QBCczY9A#%acvE3u*T= ze_{=0-`=-0O(xEeK{*8+o-*X%dQM2FQMLOJc^2a<3eKjp%5b;NAp|ViGai<2ssWj! z;fRTkKR~e@XBY|TU8;}=YuXOr34cGTD?6?-pdmgUv8gFwNjCF}53rg$Tp;B}Z3K?8 zFSEjX)<6>Y>V`TT@yLU-2ZK?Xcm)`4dy>iOLt1Qc&J@ChNgwgJLXUgxmzLypxcO36 za%7u1l?QG%h^huox>&eefS+rjM2F^Ih_lw0;S=(tahm@yU+PaZA=8Y6dh{Wv{u;6* zqIe^4k)!S8JPS~0f)eYU%ONgJFY#^<{V@M~Fiml)a85;a2V9QD?A*Ji))J)m;Pob` zhWY~DmRWnWN_L%d9Jwj}x|gS9%LrKCH$J84EC~FNNahB8429o=M`GM3UNx z14ZTb+c?-WZTrS}HBcE=Ijn~Javzzqjh-vtuoPc|r)_4LS;f5Rb|!0c##}*F8&D0F zJ`9N+*nx9iL8Pf-EC*Ye(U+1GKG}0*W5kEO9*r^M;dq;NUzKkMsM!#LWm-!+>sE( z4P;knX2(Z8bh)-^C#82R7<@!&p<~k}8+P5M!82&2udU!~5X;n&;bD_$tdSh3*UGSF ze&bi0;QGCgdV=U+Kc8`p%Uqj-QuA9dx<5BP>OrA1-N}6yhPxEW>w?TVGJ~k+?u)8zZ0Js zW{n5{U6;M{!_W}rrhe#Orc*BqMIndhjY;XQ=cyp{2N7B<*6pZxK5?kD#fJ(-4!FXF z;nQ~%Nw>0%wufS0lVbdX=_@vr5++bKZI^{WZ_z#(ck!HQr*E}H<@RcyxyxY|Efm_v zhk}RzX?|m2tC(X?|XwLGUF}%znRo?N3*Uf zqOzrb2{T6p4++Pj%@wrOC->*leZ;2N;vYcT-?1-iRD5JIjpK<<1rCG;qrCQM*hut`+rRn`L{KN zz^}7^U5^z0rSz7k|M9OA*UvHUEZOuS|JDAzD*j8w z2`kUWKt8PhxxVa(rF=ET|9Tts5?Che>-OaG8I-;7e`~>ixoCL8{>e5o`p^14csMc3 z9=rdzSweAHWYYgp+y8In|GJ(3|JhePU3hDkQ;vLX|N8rz__kI4BXjQ2dc2oV=x!s@ zL%R>T!<4xs`F=~80LNh+oYIQhQwpFq8RwlJOWCcs+&rd(Lrhb_0o)`3S8jlrK2J9f ziN5uyho?@!SH4vDGcD`YWGjUmO&-PLi%qP`KeL_p*w(F1^!Z{_Wr@pqm%h7gB1&j@ zQeiRt#pTJ@(BF%E7b;E#t+mWsT+%#byAaM&@>A1WXkh4ZSxBFMHKJJdw)iG^o!;9XuM%1tkBtE30xP*zUnl);u}O6 z$3K9Dl1&)oGyH}DJVQ#q=BaB3p{QJ$^c_H|>+f1Moi8Enzxhqwo>J*wl4AwXMVX^4 zqfUxDS`Gc2@2z4(t7pA5%5jwv`Y!J|re43d6MRJ{L8@DpjJ(pbd2A<(#ne20Onw+) za}?iwdt*<3m5Uuc^_}T#W~l#U=h$dw07U|6x0|^aAA>VjE`s$sf#VJO)vMz)}p{&zXpwKzhn_n_eMYJ zS-#>Ztqa{01}uUB^M-Dm3F`~FsY%&oYnyY=!<9W*!%XJxXcRAgOCx*I4jVX? znQ2M`A~g&oLx(JaZs| zaz1d;6v^h>0TGzy$bd$XV+GMrD&QCZAE~wmt8hGXsKLz#wthQ6Ndo{2OB?_})=FhJ zY1gTEvb_^#spfy`e>waPx90H5H!aY)=I{rg^RV7E?KpkuvfjP?FKgdlT95z!WNiF= zo!&kFW9<%=Ox6XDU|}n2&7XQ|Q8VltmUlpew#ES_w-QIwCym;=L_#pfv5{xF#$VvH z=Vm!%XfeT`tRQiSey2wt3Foce*+)M&&s*I%QQL)|?gQsjg?eZz=JM-ldXmelnv3gl ze(TA~Jw|*JOO~UhLa;w$LkiRDNV~3K=PnK&Dz}A7ZhJvGizDXL3zLe_>23EIm^Jp$ z3`y@nBG(!BuqcdP#%d0~@G+QNrBJcS>mv63<(-`|cwN#lB4FfW!3!7dWqZPTDGfy? zZJ}|V;baQ8HPV@}99LS}`JnaO2hox5(V4*dLMr)#Oh5gOZyL%1Z)%fJVg`&8+U0;o zEy~^>;@}14d7mIDNXF_H1_HC4IX@|fJq!+;+EY`23 zIY@9R=~b`=-L3MPR05vS)=|Pd&n#t$_g==fsrDxX`k^tHWTAUywEjRr>q*w0mN{5y zDgB+;?qU6rPhClkxc_jEUozY;mZut=ubLO|f z^GE0{!)O`$_v*mF^XB-?E=~ulMxw7j{ndjPQ=hwt1NE?ud%>~yZhMtASqWvjsUa<$ zCpQN$OFEL@y{xKWWUDi8)C6z!XW>lD2_>0PgpwR~4iIMu+%hj70-7@G<5Dtn8$=+y zHM~gsA%`yF!=r$(Nbq*iZV2`H4SO7Vdvn`&5fI>tW|))wgAW1Z=`6Tler-b&RNBb3 z&w63pvWHRclKXDNl%i4efjx{d9dTL-?__1X{M9ZS#7Bnu?pFwO|x5 z_gN{$@7E$k-xqpIDc#})H)Rm%q5wk)(|{jyb8mDOv4Y=Bw`n%|-|PX@CNrlu{YTYX zxqfF}-3_P1qHf#seS-~Mx^MvNQuFqDT) zB|(oD?cmoQ9BIo?AVaVZNoVGst@MI~VPAWNBDovthfVLaoXKc|H4vRMeZ;z?`?;09 zPsHKR0Z}fJX}Gce_3$C;-WnK3f9U$wYj0+pvZ4KBccE>97n2m*fBV_Q!q@^No7b~8 zZY_IR_RY{2FpMI-J0XK8VgZ&i1p`@1SaT(<@?eA~)*Y@UC9P(1tD^um zXe%8Unsz|o=Gr;^aDPpH{aw#jxNUs!R~Hg$;|bkPI9h7+gvAnhV+3l5LC}NS2TYvdnA%iI#0{z$yF8{6+3(z^7 z>ADK4@dS;cCh(MxPjBy$hH}Y64Sp-)u4rMTY4eaGLw&WdlKXiqA=N53sgHQKrmJ#g z9*v6)qLytfFjG$11ebYcvsHBwwbaTlMS^)>?yR3SXB`g{tMh@F&2iNB9{1tmZK4DI z@;P94W}Km|on)}oIrZ-GZnPMI$b6ty9ZzktH^c-8Q7rR3M)LBT2ic>ND}MMrnO$OL zcdtu<%UgJY{_JOSI6&oFJNt&a$UaoAjX-#QG0>=X%a|6z({TY?mp0#$eE5GT5vobMnfNd2hH$#KB?0=X9UAaq~4Rn)lGi zu0sdPhJW6TItNyrd!m8kneEx6=7ZVx!*l%MZCJRa-Q%;xf4SRKWspwWBs%Iu`uKY~woOQxQN=Iv5n`BU__Uf6h zYc0D`wN$4)=i{to%3KG%1f>)gLHq&cpYo{-C?gufRQ8!vpu7>l>3Pr`ff=cM@N+~E zG>Q?YKy$~s51NHPl(`}GFCqHW2x8^S>C`1ou|{Gf>CY<7hA*|qB#=ih zT6#p>_SyIseCnf%7f7aEgV@weS0^%E%g32B1y{N$5voomah_GH~2H9!eEW<*TaA#BE?f_{0yWg94~#z62<>eySeD_~mc z8QXa`m*TPA{#z%pWcQ1C^XbeGW#2q@rzhV8j>s$*Cr+VX@Ii5>CAR%~#Kq_kHNYF` zS|`5V2gxXndU*;Ywwc9>6%B~uj%?ZRq1R$2zBw>K&ua+Z^?L1Vif9Zw*_YX36gFBp zfl&$+QY;6J`{w;KRx<3kyvc2|k-As?eEjuIM(ms*BNr7&Ye;K|j@No(kBKvdSDF)R z5_n#8e0oB3F9cerr-_u&TSr~pfvLY&xN$;sQg)Pyv-X_{=_~R}xQ$?$g*g~s-P&lr zL%!Z)CJ?`Yx}G(DtSDf^x%DlGA0a0M7V%(mjiy2g%|!Kk>vVsl=>fxZ5S9>_YW?*Y zyTD56XWaF#fzSC1>EOXL+t;({;G^?jt*!R_=ju}TY;!GT zT4Ju$QXE&@bf)P;%;ekTJzja65PnIXD z9%z(LU;7|Z7denz9#cQXispZDD3g$Po72Q{%T7yAMxHcpJ01c&*w}oUF2X+F z>1EH1M!i%%hPf^a7(8Pp;NY`+A1dfHKOM9n-NC5dMY4|H!{zvm?zY%UY1U;Qd_sr8 zZ67tl!)7;JP^(yW$&MVl4Q0-R{zbLTX(7e?j!M2PNGn9puuE}q+^oyfD+iWKa5K_- zbO7laE5nCWLs==fxQg+}`2LdxiG|9(yC`l85F_fo8bbgcq-=+N@kp2F1T=a;#QB5l z;wGRnma7~Bjx6IEM)4dA3R90%CXcF$fzGTZ)T3_l)yLS=3^R!8B~5=;<$LFg;6n{W zHg-BPW~SFpo+xURHQI8-2?N<;V&m(5n*TlH;2t5_p%~UilAHGC@N`TnM6F;KM2Wrs zrwbdhDR+w^ENWRSE9tr=oEW)MTdB-m0-ggz=fYQ4(jHg1NslIO!`DyvkT~ZvNItRj z3ic404NF&e6Kw8^yt#={ahsf+yJZm~!Ghizs3)b$tDa_5o)2!j_2X1WN*$;KM%M(y zwYlwk9b|QyQoNjjKytS`CKv6#XoX8@H>M*1;f(VNor^^WilN2nif#=sJRL0&;bjPM z=q;#F2;cX{=9AfK?|AnpXk|a=q4IytLuPb4X+VP8 zKxbAbJ00&!c7`?LlkFVp87al7c1?iChu#fa7K@rrjh%DYC6NC%a!&p$m95xI@Xy9! za5w3-ppoy#${(+8xt1`9%(KKPzXRCj+JkplEP2g(z!&GfidA4+JF!ib_AkL{EQ_Sq z;*iNr1ed=Jbt-HHtX>+}yQwsP9Ues>Ex)VfF909(f2OPNrrb>*X?T}O^6hi!`kLq( z!le5EjRI$XHu9GRpH>DQEcaDo|XVyQb|fk+}Ug#Z`Ckz|EZIQ3Ixn7krwdY7Fzc^>824lD2< z`-adewv*nuymRCJV_JDiPuhO~(-I#+-~AmHexxAa^$-)P1lZpryI{ zW>ndx#>$|M@$edaaN2(f6pF?RDL9+!Bu%no7AS4;s7%6Of@7{KHY@3w!Yp{q(ytW1 zO4DY(p(REHq1&2+EeNI^j_avNMWyd!!?c~{FgdAQjxLr25OAb+E?c&$_~;NXHQ=?D z`j|CDYEjXpT7TpQ=dPqLU*iUbDcptyLC85)H^8X=8Vm8YZ-7M<1MsVJDHpwLRkl8m z`^zA#V`1h%xb1s%CE#f%ZSg%1Lgj_K`aPry!t#P50~w{`M60mgAJVRpOs)%{EO7B& z`dX+G-UVOAR1Hn2_iaDK>e{i;V8afpBW@CVoSprGqLPCoF3z0DYGDc2s$c29+ZmsH z=QL_gFjI%O?2gTcjuO1c)Uu1O+i$y*m#`Hy#=<;gwYsQqJ)pCZP05AI!FQQw(zXrJ zj&cf-|M>YYw_&R}+sW9`a`G!|Ck`n9eVA|F*dX94U-cNy`gVJ{D?|fQ7LV5JP1&gNk&)hp})l zFxb_QOSo$V06=m?j8;Jx3en=lOk_y)Gc&fmq3GdMlJ3F@GKAi~9%$g(Q0Xli&Ey&( zCNu~rq&tvcoP~?J-3?(1%>8hyB>qI6*&&+QBR5)_W#zsEPd5}G14`$biXK*%v^MV+ z=k*%fPWQOD(TR7m;(L4Blt@9Z^DKntmVwg2P_Se{m9IIpFAOfH5XMmG!VPmB4%!Tq z5nBf}0006g9>ol1A!TN~MPd-9lHNuf__x|bkll(elM?E~QV^8CZi1&8P(no=upby{ zj9DxruTS>MlmdoaLQfr>CRGeC+f&XE=X00@uBo#xBX}?P^`$Q%|u?sqp*^lA-okb+*u%1BTYm*p{(UrUD#^{BXd2shTkFXt?%hd zjVu272k`wr&bhVQ&cCwG$r-6^Lj4P?h6JI>@G)eHM4$SBR&JjT4aIU6GY z_!0roSTbh<U4=dDffH072%JQtYM5w}v!3IfqRCxF zh)g<}k)0-0bWEBpJC~a}9JEdh)x5cMVFNC2POyx)>P)cT!0xK$q^3p82XAqXu77Y= z*f>JayfYYASPnXUHTpMOegws~p}Npiu)wtOKLFc*4X)m?nQ%Rf&s;J|3ai`WhpDv8 zJss4Y+Y2+6>O{hn4KKnC-L4fi>xn9M4F1?ZY=VH?syr*~pIJN>wnvP1BEWM+Y~za? z?&}$;Ea6d3T>DDl6D%>ce7EEsF}>ri2=Y*?*`gGyQdt*$>*5Lz;1jE%1cee$8yxwq zf=$3x(_6lQ&xoG(3*jvbB!+`8VO>J4>e|RufA5Y5EA`?RhGUMd)&Ma!-{vG`t{A=2;s1`abX89 z3JnzOmVnQ1O`B)S{i>%(`P}9G58(X$uYhcmmZTk-g%Y1D#>pU-&Mi|J)em9!)0Z*D zRT9e21fpt6YzjRKtHpAlxFg3=@8uaR)DL%^vnc>Iy{NFh9O?~ZfZvq1bo#?bn^H2q zbR5Ob=)o;Lo~)MiV~aopBJ%F}fUTJ#5;?pVRBWQ_5S~XD>S~dXA^tj;LXja8IEc;M z`8XsO3O8iyvCzQRrncSY_`>9om_XGvw%D#^`oW|URf^feVQhzW5`_w0rF#v#&bME` z%*||us!xFtzUu29d2@mgKF#Vkek>JiW;|S4JAmF}Ut&dLS5wSX8zCu0bvNXOn!Wbf z45mgg7#T%6H*HI0+A9Qa3@UOnx^z--Y`P)^T?Ney4Wc|15uVnkq#S5JgX3ia;yXGX zUYF+}8~RlI#R~HyjABOrPKFrtR?TH|O^ERgF_Tt9cj+4U+Q#qJf?^&N+F8Tgc=-dA{jNCm97;~@hT%=z{@`9 zTAHq3N;$4G=TX2AFc2w-yrN=NG#g(#RbNP0>w4(?y{m^qC~O!6kpDVpFVhXZlr z6%}HK(Bm%**rn49%I&p>Unyp&xbr@viG)q4H99HsDYkPnM2=+ean6+=|Rbi^kt z@KDzWyZh1@Ta6ylDB!9LwNb+C*CD&L|Q-I)HvvXdnhYi3l=Wb>T8$|`XdB%)Z z(P)|y=37xphh-cawptp2((n=LJM3kLRLu=>Oga(2+oc_zFFD67;~xWVOoEUNCsW#H zqx%poXPO=arT+ayoVG?&LgA9d6WDX{7iTZ}Pf%hDH!sMGD7J9&?v)U9RJ}VWO)S$S z4)Ie8&wihZj*IuPrx|S7SbqRyrB0ai)ks`2YZA@G>B@JRKG^z;=Csn*O$v;|hkIA5 z{*G_9Xz&HPu2H-!xUQDwDlOkB#=~4gFysXYzjA>|3Yt@CO>UmxlSH4ze1jKk|H5?$ znX-K`r!}VM$bEKzEESJ{XHEkZ=dnl3^nk$40?m_@U~vlHF)M}NIHVbEB{h9&-~ihR z$+ljE`KSmWj~w^dN<+=eahf)aQn7JFsi4(=Cj8}@s0T=~YUdC6sn%7GVA^k*Sgh8o zczXh9g{4^EAoru|@ZwsxW61OZp*Q0P9#WmyaroFDukjp{z~mUP`H{kJu?zyhBhdGT zC4)kt#$$evp0;6<*&>@^tG%a=@&JySDOq{F%G^h7x8qo5(08iR4^EX`PT zHC$ULw%G`4ZP6pnd`o&u0%rrN-78BT0R#X2fx+(jcUEOpY{(9%O|%$4WsOK{!N%Y3!92m>Da~J@tF)M`bP4wK;{H4Z%TX#58WV zH1dS}3`E%=W$LKflZ40Q{lQ+6P>pw={#_#P3E^&XqMEj`esH$r_ZOU5H&)Eq}` zQaWY-87p@A=cY;5MgZpEi0wSZ_s^)WJX)aDzBFDK9EMtT#bAhHJFx*yVAfS9akVW$ zl}_|I7 z`+zdX*S6}=C0ZA_$I(O{2RSTyv+ADg7sl|s6Z-=!&JOy9>UA#+hywSgjr(-EG{=>d zp6SEG1N0e$?eB1+Qq7_2W6baYd&ms-Q$DlAjfIJ|Lid_}(*+|=j^=UC;cg~-vF&Fl z&h8W~eshy_nm^Z#5y4sS`+CnY@TZ?Ct;Jf#hWK)INfjs;T_TKYch9@=Bo`iVbv#7t zp&Ql7sWbwW3*LLfOp|Owg<$osv7&*ns$%44&9^ zrjUS`E#T}+>9dq`G)xziBLEq1Z(oq1(shQ7%0p|M=)ubuMg46jsvE7H5yHS`+n@qX z(ie28()4jJo0tuddudm1(YU3Nu%%TpOoe_(dF~|Yp*ylb7zaEovEC$;(3@gBMS)4# zNwXm^Kg5)*v1%5}!QI?Npapl@i*xC!2O57!6tgzsMe}YCut;eA}oBuys1!sL?p`rNZoE zn8S#MY*8%nnm)G-6HpKf#T!p@zAuRsUt4(gc4-j*8+-2o7sayejSe{tIOH_qkkgQ4 zzyU{c&N(YdkRTZpkeorX1Vtq0AVG4@IY$KqNdjUZDp9}2y|;UN_Sxs2bIaMh%3hqq7%|E~9_mRe z84RhCY!USe>)8Qer93B_)1F(~BIVs3H&?>Fa-Rg;h>2`rj`CNzL7jI^CTcWTbwT*q zqVXB9KJ=38669fp;V$dQG+RB*f`5`UPh z$vRe^iFnZtLYp!{6BmC|>F<`k1!CiThwkSBZ0Ef*9vy%oz@g)=xsIl;5!@`2kw88` zVUE=?uvj@TIh2E{{QyXWg+<|TFn(WpcL&|yZo5+xygdTQXwn#PeK=ih9aCzH^>lVJ z`!Y@_4|&M#xz5wHk0b?s z9z@i=A_B;2NUWWMVmGM5DlV2lMJvV137*hbERnUlO^vNVz_^cQQ^!0c(YtzWPnjH!>Y51aCT1tJ{3s8oPG&2GLbF{W6Ebpf z_MJB)1EF2chNn%66jW>7CUR&Y@4$0ZhNS*jH(K<=IF)?1-~cX24Jr3*ad4ZkVoS_2 z?FGq^3ei25!U5^ZKs`nLIe(2rnW5YKnQkgx(!e}G=FE*=LQSRk$?ix~zXZlZ=o-PT zI)`oS3S`s({e~oKPI=qAOJiNZ`IdyY$lrXC0_Cm)Ul>f%w1ML>SO;E0%wd1MBI6*S z^?K;;;M7jUV6_2E>%%o+DVi(=JV%iywth<uU7O{vE2_-G|{!7@85QE{sIellpO|I#sEklr*@uE+0=gn33;2mvP|R5sX2aD zQBvFn1J`8En1-?iKWztY5yU9@4^%f5E^rRYM$c5Gb#&;+^$4>RUIXYpk?PGf`1p}Jevj<(* zFbQ=PZZP-7b=ZDn92+CtRP)Jauz6)J5>{fQKj~xuIogIav?|5>^PqE1fI1><_+xB# zcuVES>hn{d1^OwiW@X5Hoh3WR^%&e>kK=qacv)`w?gH{kr5;tny4NRbC5_Tz%QTN9 zeS6%cG!C8iZ8Te-behzAH3&MA*M2k=ZZ8HP#L0=z`2q>Y4oW;FxZV)=((-gOxg|>r&SiLD>5ef z@fSYci8 zAgr2}Th7UPK9WO`_l0YGHJ?dYZF=&BTi~;gyj#64!-}2$s5S~!_$N7%r;o7U7jsSopj>v;Tup zB8awQ+{!}Tz+1IR#w3y16Y`q8Z*4Tpv|UFtiCV|Zp8LZVRvZR#<&q5D9Xtz9Ke4UGY9rUlbb3;aVMCK6!$i}dYog?QG}oG%z?z>y750^9}T}felSAC zC9_>JR~vo&j04>Rfu1oEwxJW?j6R#X#S7e-Yy7#YU#*-qz%%7u1Rs^&MRH?il`-pZ zLc`W;p4BH!Rf^l1kES{$ri2db3Cl3vKnnP>ZSpo1TsGH{)QHY<#=yB8n&VNkIX~*4 zpGmJtL1F!2X z%SjEh`?hEoZIS~um0DOD@LX(Ju9r~c=Ll`ZEqg(#M&KD>Ax0PyKZ?B1G!iBM7%%d#OKdvEWp_zGJgtT94ItR>O-Q95vAh+c!PADJm zv%OSZpeykWWO3|zyA>`WE;yXtm78I5_kBliy&+*uz(YNf2BsQm0}~@!#~w; zu&nJiv6BFpFJba7)Kb|FHT#rio3r|sVz&*+*-0)1mV@G+0{rEeiiLBG1M(fbbct`L z8hL9LB1_%o8{XL+ykAEYl*(Sc;><7Jc#xKYUv7GmGk-KlPANDbtfgWZ?1B=gWAT6f z8G&k24#t!pp>Py5q0H%azvX zhIw~t#b1XkOKH5C&3~Pb1yb;)r;FD=AR)1e@msNpoh!#{piDnl`h5wu6EIKT0{pj%rpYa$k22Menc!fEYgUNjVsKYDB~&z z>nA5u5n47|an2-egZ5({7W#b(4N)|CmAwBo@%KTeN=I7Kt|Dz;Q1U@#v)~h~V$d!L z_Cw`%P319HKe#%A{V~T5xf)U$KYy2JXFHl_Vm%OtwRZqJQ^p%>;v9FMN?}Gf$8D&F zqqHI5SYS)%>m%BTk}5Mk9+v0E1A(|Nb@Ta2k-2qJlzLW{ClVdc$O}>qFchk;9@J>B z`r3w&McFIQ3KW}+yWbx%_)z$uHK(0=%Ib23SS=d=%FHU+(!B9O+3z;Yqj+3rv>u1* z54h`1+Z4Zr>hsCWDmYB}0ODhNumkZiS0o_E$sry)Y2Ut2u2GF@A0LT}5~S$4fk;{B z3clg`SlFZ@oqgfhyg9Nli193< z`m5Q7wjHLY5zWo=fWyxvWjdgz%Y6q8z$=51?K>2+`}rrjf46SD@X#nuczeF1A!@Ac z{d}(vKW7zd$AHGbc;+c1Uq&;Xa~2tqKqBw`*@2tV`@PtugSyG%7F?SOMJ82P2!mT9 zdte0Niw(8<&jHhEJUmz(ulehzpWWdlh*m|paVu{}U%7d|35wyhz50yx!Nc+3mvCdk zgLRDaFi7{clX$&chgMiB*3IY&SCjP6>@DIK{s z&9je4{+|9-bud{DC1Fp!*v*da+T;lqqCE_XD%2>uH%>&|%Ol*JUCA~urLgS?)ir_@ zDUE^(RTAsBQdb^6C{*~IFwkW0ed7k?WZ8&Xu9+s9$wb&7bg2F#(aq{hE1BR3!zdpf z%9p&J4<32EVS6U8=D}l8HfBLMoDw(J8kg+a<#vc#&tpoeYJXree1oIH<52lzBbXQ)zQd>vWUu@@Y(9 zg;QET;svtVEz<9uxbT-A>zXJ9HzMvldcH>3a@C6&of3Pqz|XN%menDr#|f+f!-6D- zPpLC%C9bCGWmQa$V^J7f3pcfYcIUwRj@L4Ax~#>$;+bps);Aqn0y1h5gns+`c5iCo>}- zwv5S`s)>6Wi0z)=_CB33YTJ>_jt+hirBQybEaC|*@PUV3AEZcmrQQ?q`+`%xq^d=v z_iSvmO)#l!zsu{33IXUHJ_J zKTJ9xVpn{ig8ANk?vj^DRK9s!eco}5u#vbU2;6#EvH z$^PLJ>wC2e>vYUQL~~j^~5!!)A#6CQ0&$Bu`U1 z9QEluAxW{c2BY-igJ?W$!_ixKcnKMq-XO~pDO5I1)7BW?lvhixFYpoKD%|qd@i)HJ)qU!(INAG-;%2 zG}v$|eLDih{&;P|nhqP)lsy4z_Hq|k3i4LynQ7965~ouZ)0SJf21$$avFtvu;8B=?s#b+JFVv4m@DVi%z1@rZ(2E2F{jbuS8l7dP$OTA0pSMb zZra?q^}HHNg(2Xv?Zku?I-iN%dwh*gjUkY8rPa3JT370)QeA<)t$M(Ry63tdc=fEi zQX*gPCftA(IZvyZ?VVw#?dTEd%ifDU=epxUk|YG zhAkJ2o6mH0*0aNL3ZvvP#n47vBXupFb4MbkYv6m{*RCA6*GtS8^Tt24M2t^aeVLdz zy6mj4EK&xc{PgazKgq891eWgmkOhUwlKWXR2HWpWWmz7{?eMLy)5T(KueLuwV|6Um^5e!y}RMJe`@ zTx&d`J>agiE@w#TEMx6Ms_XSmq;#ytiGg8YyUm90k zzkf+#Yl#ZO_I~{Xv7RU6O&KGZ9x4m7NhbG0bjga^jh_@Pe{v<(4mecg&u6j2>0*Y{+fULYc_&Qd9l)%XTRn-RWr9vhOzV;=fUl7prBv9f{(|*ZGe{VkC8v` z285&V)i%I^- zRz1OXx4%xf$hA!z6Y}@z(kM!EK;<~F)Oq96$tR!c&gi|e=Bm}}PD^(WUW}q9-@8p- zM$HrL&Z!FTpHe3=-v2B1MU54y;Z`Wqb&XLl=q^rVi12QGUWF#@BZ)~nZG8{ z1R{4rI{FZde#jSK#OImYn<7(JzJYM#Mq#Vqnckdexf5zGHU?)TCyA4I8lLMwaW&ZC#Eegl=%4&E&v1z#N{@|{oLABFA@ zf_DbNd!s0z)c8liJEN$*PAKmn%4HC>GYGBdgqHta-Gnay{s*c0KPn9^gsN{>#933uda~ii;umq7g1CFVpoYS4W}CGH}OW1iB(FdOKMb8dQ>y z$}|`iAI-FXlBaU#L2$HJ=#_;P*}tRRuLkS|U+skM4uVHU;eg)-7#+OR3E%An2<$ux z-ycLdjY2C1;k*7QA7B&T!|j{j8V*uNPc1|8?h+vB_W%p zrtbm4!I6snk@NkLnhT~1YEl(Zq3|n`3+s(wJ{o~ujY6&rQ|+rDy4l9%k>&~z z|6oXYC}O;AL>}mNB3f0@Gtc7nGtS>Py}#6dtJWKOsi)!f6hjo%E*9B^Ab`H(y9oT5 zI)7shqIQ>V{L<`?W}Eg#Zwmf7@^73Au_KUuFk)31F*(dT8N<5=s0}cO5Es=;1-Y;E zo7mry{GF_ST>1`gbpRZw3ils|?+r1P_n|tZ0SRO#ootMwaB(b1HX!y#{QoL&0q-Y* z|9tv4SO2Tie_*|za`~_1{1*8F-Vkpm_&-9w7H$UMu>n5Y_v7ye^WXC55aa!w`;S5Z zwhMRzWIGXH5U3aR0z;TytSSK0-suuUlJqzZMLH2@Avpby5N1NCLo+ z4oJobCJY1O2LkbSf_Mi&ur}cF!{6XxVv2`?jF}1OaJB8OM~K6$(*GzN&CtCl`zdf&@2VqOc{7AE@q|-%B3Gwj)MR)`VAfs1c5MdzyJ5+ zKyqPH%uL`I1YrMXe!s!X3ZXI?0%e9VK>{#$RoNs$kT1|6+2XhuL2Unwm>+R|ho^)L zK!<5y;?ny;9NQr1xS(-AHjF@A;;X%V1_MeFR&qM(R8_m%hV8nl@>LEKP z4pIBNH@+-+|3~OExtHdssOBFAr`7LG=9eQdXifgof<}Ob_R|2?`3wJ-qw0@lh^`B? zTmWG^7}8AzQ6SqN#AQ%HWvYTEM{zNRaK}gCWRei6 zE`gftVPkv;NkAeawu zw0cp1E9=q;AM1th_d=b3W&}7~gSZe$=+#cRV=vg{0_tz@F2V>vwaJ+8$d$hzV^F^; z`@>BEv{wDj1TFy{JrEff-G90IJ>hTgn05xJvWGDxN8vleWZ8fZ(SbQB#kMMs3+qRz z_h7DsQ>k?`1>%7BWSKJL!K;|4_#iU00p7hXz)(~b=!ni9GCBikWTZh* zw0!Tp=?H6e zU?>m3h5btu2v}b8!uS}tuq=5{mK;+S0W1KIEdZBo5)1?Vi_!vcMSmT0cXSkj zKf#Z{Mo7DxaWC-aS2K|>S9giLg1CyDEp7-A@Y9>h^8AA;^hbEVVJ7$vPEJueadqcAoJ zv;GxCaEbO~J-J4teXY?@k_ zCTVOVo}9m)V?O4`NWD&Rl3*L$Tp~-Dlm~Sg4r!8$-k*)|6Fdkb7HU>=U)1?-6ImX`hG-rY-;h+KMjVSnE+Un0@e}V^C1Mlaw zVZU@TKQsT1(SAhuBfKBX|9;?a;r*km|CwBVg6E1)5;0?zDbVvFJ>!3V2_;!?|^ zmX&}}0I?&Dx!g-R(UAigpw1K{BaOfflm`867C*sLfK{Ng*hF)ngY^8v29$=#i*dnx zopmc%aGgjtE^OYFQ37;%F%0}<;u_w{P;?FbIQ_p>2Y@$yF)V)Xmb-BsRoP5}cumm2 zj)d^oXeNGKGKeKqEr1FVfbj34TESxK2mnhG;a2qE(u;vB6qsPxm_H%>2_8D{4%^8# zrl$DEU|$gT0CReNm$MkO;0SM9BmrVu-FBmOpBzr)`aJg0^(hLSBr_>XO#?NFpAi0J zy_kzj^b#mo$4_y70`TYh_D9Z7@W2^y`0wKHJ*r=H&-iZ&{0UwF0X$%qH$w&UQOLgl z=`Z2Q?a8O2g{C?t=eV@vRyf^^?c~;_L|p4c#C5};bi9w#B^ygqx+)1yjQvaSe}u<` z5lrUTiCjlVISnC*LxBkg)I18Y>W_NV0ogUeY**zq?WgLDK{|K+Wk3JJdicLh;QzfT zo5Qaz!EZj^zv-S`B>(QQ{0HRx2I*TDh?^LMj)sAbiH(kd2K+8&v}nZie5UH-;&D5> z5SWvHW(BW_So^Y?qhBm=uL>6ph$jjGwhr4ONiKUBAfM^q*S2Qj%qv6%jU!sAU1de<3SS)>aE1JM~V;{GV* z-(_67p3B$vJE(t89661&mq}2W)Yr4yq+~DstwW0f0(K3hg`!=3ip$g+V(=f%Dp7_q z);)b3lPUg;WpOP_TPk7?Z=_p6wK@#T5*~WnK5(VXR9-$+@7{Q0RDg-ys2PUK*HC7? zXmmCqYDPo9=g+XOO4aDfPBJKDttBvvHwz|6$&_IS3HdNjV@0#DUXRGfqGmVt=MN=2 zW+fN;1`6mi;9!^5nU68e#8Q{i%Lz|K=8ryv#U~AHegkDGFs$;DG{ql`wMZ=}=_=E#vIjuM<=WrR$@o`gD!?-9uWCzbK~Tn7F@WpOI- zLwW|f4dRU0qIaAejo$bNn^q2w)|h5KSlMt(Pg};*hiCCqM|Kp}6kD2B)TITJC8h-! zH`oX7iO3NO@e`K3UJSxx#-*ipB6(qy;Wrt_%<2X1=-ITgf3(IKU1rJxr3>VhaK5^X z)>3h{g=2BTov`@Y$HkB2OQe0t3PVL(#O%Qr3M-g#81 zR0H$7o}QH0_=sAX1|o9d<&cacQd4`m8E$)V~EuY^YX$AJaxXd+|%*IP%5MsW|mX&kw%Lzen`94Fja=p z_B3bwdVJozQk068j15O!TJpJe%RGxd9ZBS5Siorx2Q%pdCvNnzWQIs1ykP3wSL^~B ziEMAZd*;~*ZLdgN?o%QUP%v>rYRfFwy zxa~kZ7YpaMxUiFxZ-&$4Ol!4paB|Gti{11u3lNy$DdsOq1tl4+pyi-=U z(()WAD~Qy_r*zHA%3CDM>rWPLn^Jxma&F4Z^G3nO5HUP8dyB%27V<{6M3xUS;Gz}J zsBbKaesZ^9u-I45Sb3USTlItQh=oET2hY*_u;IqRxD+K8jbyx`0V*jcrp>J@61I+7 zj-mdQ%GDe_8U?a6@=ok*)b z2njs{3}G%G#UcR<5{rZ6$q`cH28jbbY0Ni}p{s*<-N|`jUlZJCx>wcU8))^tLr~KP z?7qj)tExJ zLqh89xv%1rrx0Bp{aRW{SF-G8!M6r!q(pA*IM-Z)kot;AE!Zrw+vlwr{VcCwiq-?4cSN*5wep#DLDYI)er-rjGZ zhl0{9vW$#zaeaMjx1FyFQ9~o6WqxDuWtL6Q%ELZ&9sVs6CVyhCSLAEYmh%dW5}KeINenB)bSoT<%B0rt zst{`-yP5C?TNRA?Tr_PFZa%tAyRmoj>V@_R4)1TqDzIoe%=Pz`&%8}?^%T}zP%7+U zfvP+r-s5udB8pC@7!H5=mSuP^h@nA~u7)Yw?~sYL?!6-BCQMZwGpIg@n%=*Pq-Y#} zRWP{NRn9@Hs>DFL@SOUIq)lWfLrALN68@le?a2T~VA2$!wG=xnF)U%aT6BR)#9uO? z_(^f;Ri4yXjpb6!hm#U2kN5|SmTS&KNHCWP1>dDkON>S4;@}Ccw`$enH_s&YF1Trn zr8GXa6RHuoQbePm=mjOolhU|NKjspW(1T5u@m6`xl9DplB>rBJ^2e>)v2_{&AA<_E z80-^^vOd#1!mn2zsukvPBfD=aJft+o;KGQ=NwrLf!g@u_=J4>I3hPQ%A+WJLb8Duc z4P=)=r(a%njA_E!bMS<^Q8(;>EN+yv_0P+w4BIw;gZ0Torl(9g4P;gRGv-=>EKjt~<{=#iymWsOJ7OB&AMnAKjl$N=a zPi)Cq^s+`cns^B`3x_E%ODVq8i58gNBFiXXl!r<_9d_5$PzcXUsfw|1=2!41RgdnyG(nyo_xi~E zNDK|4psd)@(1?wF4RO4I(t9qnQ$iPd1*hP>5OLe1 zu#fzqXVQSFfDg^V>WuCpO3z5+O4-(TR*(jTA6fY|@U1r5hsK5UnAsML zf~q0O*CG;AxcLlvn($#$QRJ89x9jQ>N$ehK7#=H(_I=!|FC=8)d=nDXsv&r{82z3F zTU^56&J&s-wpZPJzRqf^vti2|JMC;!0-OAKl5F$V%NR9kJ@W$vpC@y(a$&(VZi`Oi^T$F@ciRx*BLK1$-36aYD>^%{cRh0aRTD z$?sUTay+#>UB8YcurV@*VvD$tkLkQJ5_08HVKA9gTX+~0)~M}9nrKiq9c61X^isx4 zxBM-eh^v+z_w+PTb`br$>;)Hw(h(R=HNKR&AbVc++5^{!cMK&l4(k`yejwqPainS3 z!z2do`}(3?BpMx33*#?BQ*%W3Z5_mZ%eY142#T7$BaPXw99 z+sn}i(j=BfT8^U{8jO`!QKGG}7SJj0N%ZzD9mMpYLX)3Ph zMLE%RYh%aVSYLisQp z!&fvu`!hq4UUE0}EATqBKWD^c1Vor_z2jEkXvSwrxpHOoLj6HFr@Ap_zqc@dJV=ry_X46_`t1;B_CX>?<*!kvS(Y=#RGj9} z#8X{dTS@D#Mc3P<%?+_s60)K~ZAMQ*=X{22k-_$s81eh0>4DQkj90dxs;lR~D<+wp zPc%h{9S-hVtB8)rKV>Da_6R3^^9`gRabxO{+8j+=zv2^@H?97gwyk z8PTV!W4i6Ro#q-z1H^K1uaa<<4Op@@Lk0sWaf(Tm6?Qb)N=eo031drGQW6k_;nAd| zC0+A;g`I9l4UH!mDQ=RPMn@F!Rmxt(E=Upq4XGqiFp#`E*WM~1VHmR)FMP(#C8#H# zFj@9ZP?C63<^#MDQqokGJGa0jUQ)7fxv4z8E5TMNQ7W`lEURzkw9U*C2AnlDB#?wE zv<1^LU6UHEAs77Z$^>-W-0o28pi)D%_ehqb}IUHVT_0)v{1? zsT~j=s7_M-dG#ydpi{yLM3`R9o-A7MU2Ru^WODFl4rh5dB#MJsPCl|wcTBP7)PHMY zvq~;CV(^jn66M!urDu+%AH}SQJ2aVC%1k1sF0DD+f!#3AgTEMKRatYyQc4uOy3L*x z%3^(FEGc0}fkjd1y-S-BeT(vCPE^0RSq=$Pd_JA1ISaY_dv@ve6THk>gE3RF^~EJK zmJFtN%AJc=|F%x_x}5c{gyOjnFm5jDW6Ld^J#Z@vOsP;=iR~asjoNzWQ>b^BrO5ie z6G1RE{uJ3Zq^+aVdE>QxZW0DUJBhrKeU?JLl{dVzij}n9~UNI3m}X z9GoYZSh3zS6_F9Hlh7(C$V^qM2UYoW+)mM=HPa54Q=_M6JjewG84tB_Ok&Py1HR ze;F;O`{{@;KPW(8zJJ^?B4l` zjoQNd0Q};+tkLBAf65EU;{O8M{ggQreyJrq{tsIHU&@K>p{Z`nwdvD4&|9{mTBP*d z)2k0dBPBAy0Z(T>U61TE!@`dtuL-POq;|9Y?BeVD0`iI%Rx9N;yt7@UZHmn~Y@xfl z&bIx$s`RjKL9Jt|gU^;ziNMhHjkS@eqgf}!L{DR4YrxYSUc}cXfSv2ySvpjeV1ELSl?>OK+IO1u>=@Gxt6PyI}c zu-{^*d4ygYZ!dtha`%yuVs?UBc~yUX2fQeX?&)5z$|k}1a~xKIH!FtSxfH=z*3Vo= zQt4SaZ4JpS@yVRjwkb=<-Ea<;qwJn}_z1+XM@%$u>5B2CcQyLNsb_~5w+K*fJGW7K zGV{n`!w>{KX*LZl#4Cw!;5EtCt5UA>8m_jRG-%2K{&H)#1SmdnD^c~pjf*AO$T031 zlbsG|>N5Dd={^-(PvX^!#^N|eJf5;h(L%@0z!9$XAr@1sl@WI<{owXFGWTwi(YE3i zo}#tJQ;Kl=-bFsK_z<;ntl3YIT{RVbaD~N3d^1J$X!qUpJ)9!YgBz|Alsed!)lQ{q z)|8I;xtMf3Y0OpQGH9)Ge16SDuiAo#4s6F#N8U-~HX202ub!w$A9D4M9dqy#H8lHU zE8(~58EDFs_JOI+tHizxL9d?Q6kHU+WJZ`1*)^&dnOxNhtDmW>Ow!*_4Vt>^XR+cu z=5wUzYCSh>Z@g;lrA3Kfr0(S2C5Ik`c0W?%z+Dxb>ptVvx(w`Xym1VEK#;rR&*E>Z z_S)D}p-m#8vTir)XoYh(BV*OjNarzUYI$Yf=Ia2THx_*~3I1BCcV`3xus5&n)@--K zn8X^gx@%^PJQmcuxh!eiZ<@W^5Y9IDwb~0nvzScWU*)gvLJQgdvaa^JprIJ#R4bV( z1fGyOJwwgtZ>4}<1SZbVP7)uitL2v3-X9E>@iQROSiDTIDoa7tF(LltXc7CB!dOvL zHpcyoZLj!e2s5hMvP%_cbtK6q>t^a6*^~r$ch|YAYi?NNBF4<2^}9FCxyIH#8wUmi zW)3}ikZg|~k>^8ve0~*lG{_uF9Q=~U!Z8%buRoz_m(l2`;hDW%zc@(UF-2l&uzsfM{#CQLg_qF5Ry${5*JiU>@Z_+XF! zCTU8ih3kOB;e_`+y&l`sxvfrjnno%KEH>H5}WBqUWZ45i&V=GgLoZ{FP+)GPfAM(jI$b7}g!py{u|HEvsGcSS`qQ zu}^$qXADCIvwO-Zo`P;Lw}meJ@3jTP;fql z(O5cFwUS1bf?qEgd31@OeZ{!WY3k+gJFU6%whDL)uZSY}8)%&%kwdHOpsTgC*Z63- zRM0r622UA>j@V8s_nrIJeMrP&)#FnkpYf$JRk~|mdSaIn9ZCcbBnR+ICfpeL@)4uK zd{KgX)Pv6-obyYTnq^k`!0GNP~ESg!mojPr-(&Jm5T0-30~ zE&?Snh#D09s&tAr*ts*)t-l7=_mX#dY2K=EPCLbZs1;AqzRp9kdo?~<=%r6CSZMOD zQ!g-2!=ALaZ(WySNipdSWg{Viu0i*QM#}EtzPtJOQdeQE(i`x87fW&L~vlapUT!i4MP_mY4|;vba(w`okWEyZqyeHER)i4j}n_6?-{EU_}p zO!UmF4Y*~)XQya;(|Pg;h8Nw`8iCHc1tAXI(y~jeE@+e$i30(EszX>CF~->VT~69=9%*fc5UjWEtIx}w<2SKFL5WtClGF4K1lKoPx3 z1m6eXZ96%5$A3PNjmWUgeXLd@$83niw%KPal7?V$OOMiVh6jjZ zt|%dnW2AAZY(U)(r%YLBm!&d%A;W1rl%bHLtZYjvjfhSW{+fwjj-B$1(m-sU*G*&F^L#La z+R>v)?>pw6yjLFGGaLd@9&cujmhexNP3QZM>hj9C{*Mbs(R??PyGY##ko&F1KI1QZy#hg8MyU<$OJaW+u~zI)vTtZRlH&J^J$8 z8$C;|Rq-hgH{G;gC#AF6lT-w#`1 zz?M7lKA*|h6XMInyfIg8Q|d#b3zSY0XkX|m;6L7=SqNq18(*YKB}1dgeatJv9$wx3^aD z6DvoEcCQDhXMJ)8_CeK9yW1KccE|R_Oj3-B15^A4BRt%k`Zcjm{izAO@!rQsbh$|>C!A%aJ9OH zJaq|Kkn)hQF0H~{0K=0x{n}v$I2E2vL`8PBNHWo8dS9LA_2xJTO)GpkSAm1^>g*5F{pq zoJd){6{i?wV^z}nwjVo1&9(rjNBNblny-ut-8pGY>k3Hi(Y@cplJN@uY|_>M`|BA4g9 zu2&u1x8C_Ux%@i6vr#qlUOLf-|7BOf$O!gP{%2lKj#-m^FP(^by&Z-5USaW(Utj9{ z8nYzyqVGy?e|o&f{T;wd`Z98N4`+Ap&RW{dGttfS{ipw9QX0dAPL+dRN*5UWklM{o z*fpFe*BZ;$Y;Os^_GXzc%b9mOcxvDB=zlN$BWo~Bv9{usM{7rTZN!R(h1wJsjy!1Y z|M-QqaUt>@N@Xwp(BbussZRj$vOaBiP`LPK0&$m~<~KZBL3;Iie9XU~a?}HWvGFHb zp*bGef3326*{j$6q3YucssCRm>M8eU8;uKTpPb2LlMmiWMnnwp8af$+nFkv4qzx5X z#wPBlzuZHs_YxImqlIwG;2>r416}NIrhD zV!wz7=YsHA+swdlao|lkQvZyI{nb2~Sg;>H(s`f0LcDUc}X;(G> zgL3WtL@FvaPX%Rk;V=9&)W*q2QJ3CNeU&TnDaJW0(f$TPh6TsEXq_7dp zYIPT>=^&S}DC%k%zFK`Nyd$f&nlRO{oSUkwE-b2`T1wNji;7~oUX90q%uZvXy_Qls zxFeQuF0&?rEcZpWV&w|Xb5i>DFN(WUDbqTZd~xUt4{K$8f`Vkg~su->gm}Z$y9TrtvrtaJ-6@aYIEcOo=$Xk?U~Nk zZzJ!W(Kezu@#qp-3FT>;G8Z{kx`k(=)4WAnJ=^*gme*>>C_US&>UN`-<`b?31_FdP#BZMT&<>}ErQW&rmF1$kylF|_Kg#k_7hy{$Q;lHl zhTs-{W*rdk3~Yl77f=7fBfe8w9!f0gB)9ezW@Dr-E&SyxLsXn*3RmqpZfUsq@;4Bv zbxWD`Z3aLOv8Ce;gOJ*Y4QQT_4WC%pP8apvp4_!Cf}|zV zZRfJPoLDY5kzF(F!J{a9HNj+E-Smulw5H3Zw};S0y-}vwW~e+VQY9JeVWBjQV&L;g zdeQ}sLzYG?!U8-oW8IoG$&dZ&?RJ^D6Ia2n*jC*GN_dUuFu{u!BZ;dA985Uwrm@XD zk(JHZ^-0lo~Z?GUMy8N|E7le~Dnd(6I!8g#mv9H6bt4bn?9BfzGjTI85 z6l_>xa<%gK3sonLbD67C4{Ey9E(vKozfp6-kpFe@!csKq=6#I`k}jQBbL2P|Vc{OS zAE-!)9Q5yg@;^!m?Tn)=ycW5zuC+F@YkQY7o#qpyjfh`|L$Npz=UU81c#YnEy*Xvf z^&`KzylCMS-S`&ZBRzyQS(&mT0%VoUd6(A_!^S!Cz*m|b8^4;Uxo2XbTvCoB+LS$J zQ~PN-4@n;CAEk$V1Jz#ii&G!_B9_+FidgB-?>$#tiKyz;8>>w_Qld6&S(ka}Yf zD)MQ5E3q=T>XUX(U6uVoj5F80Y&E<*q|!rDe~+2w6&B*@IYKV-QK7xZLByu=DL!Lq z#3FuRUZM4QeKj`j5c8MnU(O}G&(fTyhT$F$&yE52)VXngKI=fo{_01_-8>}|M3706 zk{}>XfS^t0OF=5}3YAD+BRnnOfa!brz)}MmJISs1K4!6LM5FlGg=_Xa#A-6Ep|FG| zo*0`jT*|!iofnaN2T2ezr%~Hvj!zv})oA!W+oRmX`s{ZuxhEx|a~NQR)cfg4hOs1V z$3SHoc6LXHMv3oSIy(W(bY^?Zf&p>e31a}JoGPpYgf@N^G0157%kl^m_fdohbA$k1%_3pWK>zrG+&Z+zA zRlRqox~f<0+S9vN@7=xkTC3OhQPfJd)R#CCKeOyoXMCFYx6GBWqh*?1MC!}uLfa%Q z-*}My%kP<(-XV)Q^0MxqTvF3mSOf5v8s1vJT4v@AP&?`7_ISmvC;4rid(lWeOTi|r zw+qRtFp9(zCZKa)PjO}Y<&ns%5su>cM-=i!jTo}R(N*Y`ejbEj**>W>(r>Dgb%?x3vMq1@3HnV3vZ_GLzC&QbNX{zc1-Ry6x@uj(0jf+ z)3zSD3)AEjwf8V1ZhQTuX}&*SRjHya2z|qKw>IAVjvD8QyX8yB-*0&FS`|^G^OZ@A zCp1ZF-eg)Z{oSDRR5U&_l=wko_0siQ1UqF>e0LYu zR!J$&zFA4yL7N{6LnC;Jjq{*H?wc`sO6x{(4=s$uf}OZFWNqk@hc3|6kAGNxF3LBd zH!~xtc~li$3tbc0bQb(w#HU+2d34$4^pW}|68Y*ZxYX<5HO(zdqh@K{m)y|nB=c@O!aN?_UokoT2&3t_Jjw%emnX&9a&@fh$jhUGL;wD zOSLtEUwISh{D>;*UBGco*N=J5j%wO+t=yhLOw-2@lJ{EJI}9v8^w;$av)@ML#CtU> z824P7{O9KB7?T@LLMas-A*Avryru8D^Zes?-N;q%H>vb@aEc&euz*1dgWmHj_&Be* zlB?yf+W&Nm4bey<+`;7}h(Gg_AfMYc(Sm~x7IGNjDSc1S@FGH6zi2B*;O!l< zMMi*=d*(1RNl_ztN zb2$s>Xq;ypG1rh`;qw{FUrDcDx2Gpzsr>OYQ}CKnXX|H#=MFOHFFSn?&n+OP8%43K zZ(;ee!h%Rx{Fy%k0jCg@^A}`6Lm={<)6=6vy12`8A09md&VQW*jXGp+C>)Lnrhf&_;DyjE8YZpc(y^@ zkUp|xhmh1?Y+FSz3g##urCNeBEp-08ddXgh34GHx4i}d)+_zcZ#0e#ziZ( zQJiCNG57x);sZ%T#OwdWy-6POnjVsz9)8&W$#DWcWHLbjp_j1KLLr1l zW1kgj>;IkN^l*k8$vt-s!IY79Qc(B#|5N^-5%|A%1l+L1`D!2FIDdm1%u3dKd`9Dj{p{{NFQ zK8KF*!RvB=Q2zhNia3*gdR0g{mg;2>j}BO?e)b*xz-=Mo{w2Le(LVs^@&47{Y)mEc zGkzGkq_^nu+ReT96Gs%Lp`l-kJ)x6lIne*!U12!BA{zDJFFap}c6q?dPkno27ww#9v&ETwkyYxtsWy$iolkp|VAxA4)Cph?&qS5r;wjI* zTzUs8CJSOSCqs?ax>yygVX}3I7}q&AI8XWioHw<4p~yWkF+sp$L9Gt+1{TH zS!siCR>|xnRLNxo7CgpPhdVXex))y2l@aETmDtB)eBE#i3?ee1;gTF*sE-E$6!n^~ z_UrU0K!==F=Xh*jgGP&#qhaTF~CLO|vT`gQ%Vtl5WdQ zOUY(y`uAc_UY0yVd*!Xm^?Wo1BUAhV?S2Ym`ZAJ=t3=AJKGYs|$i1$cFHD#oVu`=W zJ9=*)@aG06R?6K-R(!lmuaN$3vtU&z0H8au=`)kCB?LPx$i~KdMMxTV#E&()$;9xZ z%3`Qos1<5$s5nK*=^1X!FE6UrdJ6ZxI*sPgHH=g|aS;0yaikD3I!Vgllk~GlAKf+Z zH=JW}qqh8~rSe!R_Z_CMgHqCnH}uu!1MmV|bGy>gvS+=X0HE9|S;fB$i78#b$v-gue zvmWYr5!Yw0n!MOJ#>!r}(f#$%s8>L9MBS9QprPRhZ3M13#q+bZCetqjkdfo|!4L04 zagDN|d`RFK%8XDCR_?j9JI{1Zgxn%e7xlA#Bp;s=95lQ=^W=f?IVR+w&YT7o6)?i% z@N$P(f|!ddcJ!?rKi2x_RCMt`N`T_-_}(OX$#423K>j1uKfq9#XE-9vLOFSdPRw{P zLVxqy6~K=4;vC}r3rUm4fnZYhkK_M}A0X%zXa7Xr?(?+c;`U)Hl~SonO6VGa1RgV?t&n5eKI|2^*-aYu=e}J~AKlgDEKZTIbAV4hX2^uUK?0#;k+?(=CEUme`*eBq{ zPfr3o2P~&9f@UWzE>-tdKiu>yd>*Ow49qxR&H@cV+9+U6*TkLi(k zfV|#+))oj%Z~+d*D@`uvsijm zKiA~Aa&gd$3yZM2wFzwTM;w^VpWEM2gMW~AP$s4?@QJ)HIb;t2T&4r>E@_fUVPek~ z*hHByIkgYWZ#VQ_;@VSQ=5XV}Q05=bC&SZME+msV{C&9-H*+m}41&gPGw+M1B8Ox8TqVobo;kO$9JJEeW~%mc^QT8vk!+Q~IL1rw4OE8IQr%C(Zp{iij^l!- z8$|QQ#xyVI!)$i3^?mOz-oU*{Tq;-dXk18c1_ets2#T8CvkBUFdA$A<35Q){vZ)xXLP$kkRv{TX zGAm+!qz9{uD_h-e#f{Wz-ua^Q!3!{|Fv?&jlp(o_D=)~;!ub3&G3Qw0iRf;}u3p~~ zmj3RDtk`9PA*1B^wp#x>Gc?t37=ABdQrPU%Cy<{f$)zj2Z15RdeGa58IzL5ly$2AGF3Lw2}Z+>TJ%-rLw@#stW(?hX4k=8auy>hQx=qjnS#&c z``${0X`7Yfj3B8h`=*^$lRvyO>2;#5M;oRx+q363jU${w^;wQB%3_>!PMjePEmg(* zPa@mg9syp0<*PH9f+KgDuY=q7cYV1e^yuHSn3GhI6%dx2s@{Dh9a$*}Im16V_U4v6 zlmE+*MIj`in5V8-_QuR3vSBu+S?VN|GmfOuORN!gY9x7?C?6fG9BNu4Fvw6{78Opa z{BjhdR{e?lr8bmg2~dXYZLz@X=KDb4Npa}HadBJFLF-?xJI>eEw(2W%(vXN0BK2ph zrDIa&Oc#gL9bshnq!as$4Q#nmhn(VyLi-s(X%>vFLIyITTI!FJJ*E$WLOpg}Eg;>!o#u1m8cB!TB|0@WQ1O%wW&MDm2Mn zHJ&aDD~+~<_EN*Iog0pn*as(c?SfoNF1{t#MMOg)HggOE3g&ToGq{naz9&L?t)CEF zKd2=Y6+wy;CPLg~8863#QvWpQ9QnOZ%d)etT6)po1|w4kt17Hd4jP@3IZC1D1i|;3Jmzd1h5g}8aI5oM=GMXn3n_6k@HuLybDid;m;!)ODTY0 z5PAn;{Sw<*X-V~iL$}b1B2!-_7mbftLOg&@6kDM}iMxnnvi&X*X_V7T;*0@B2bgv6 z4#X)mm~>!&@s3CfcOIX+{s$Ncau+;iQ8eL6di(oBi0ixD7yFCqyMZpLQ04$_5B}#Y zR-$eIpyitP50^hHa^hbnn*KYX@tD#7)r)}#lT`Ze|6CxkKmRIkFcyYw zSl#){|IgRx*Ps8-s*zC3EX_YFlyDo)a-5G%Gymf*HQCZ3*}2{b7}F6c;seltS8e~B za!daa-bD22arcdzF8xQ{|2pzNDOkb25UITnNYpl?@ec$b@CN@!M{q4q8mNJhev}k<0<2Q+KFKOI zqQ6-8!205SPm2#TKa>0$H@S-wJGD+?v03?3u4b6Dn~T{ZzbWK;S67*xT>BqDyD)#& zeEZ;Y&pH1}@`x4V-^>b&-{U9;ajE;KM~t4B8rNy>lWR|3dZsH}Gnt!zfJ3%_fK{fV z;3zqlKos*s%HWJy_Vl}Aa8UVA+Yd>8Iw33B_7#j<4z$jR2&zzMIX3IidRyzQ2g5Xk zi$}&RW0l`D<|SOm%fF5)>jk9COn1S5MRZ&yVn7JNlYv*_nXlApgzXuj?i5i@fb>?oKB=Tu-y?+L(Yt17l>S?>9c{RN*ldJ%qd8UD4 z@Hd};Q&mx^%_Ox-Q;jBbDE_$jlr*-LfnlNIq! zTZ>s{F0QCAt7R{kPnBOv5c<9~lRNe~A=U|l#U$fhG4v2As4)tr;i$5!-$*}E` zQ_wz2%h-eSwYg7aiI$(G+R<>9=pP>4x{lwK<>IoYvk%_HiAGQc5cQyTIZFD`ls5Mb zqJ@DAN>nl!M$fRqSxS`ncKDE@lNXGpF^diq&GP{+9IGWg6N|6`*@ z#PY0fJp3Lp$;}p+L*a|9-7#jO+e%UrOcQh!V@_InRdh9SgaDANeV+>4#s$KU0IsqC z!?FOBzSgQNj)l}vq(`x@Ap|sk{d~4?575_UI}T;>($s#ed;oWzGx`T8y(bTfiAfq% zd5-%`J}we0-Zs%3sJWxnE<9K?n_k@XM4=n@@rd^@@sa*zqJ(#T<<8bd=`Bv@DU}kO zTiTi|U<>+Gp2Ljv4bJv}=*I+6sIpI~1J~jQHT5arh9TUR(cQd8K2u_=CV%_8Z zF?k{8@>8AZ0}gymUOX;jV1t&l36N$(`F%xprM~DsrYILL^b4R5jMs1g#1E!S%4L%G zYomDz(_<=tm58XOjk7~b0Mw4HG;o-Xcr-%@#B5gWTFX5Z+rJ>pw@_SADr z#QEUu6>QF@=xRc)>q3TS_q*=#y<~G(E;GgP_VQ;qHN9s16C7lJJVUS~kt3Lbl1V__ zjjDD~CZDVIS6n?{FNv5>m{<1{Eb#(fZ&}zIsV)=VfbqI;Zi|<9L_bUEl)iGczRxcR3cz4IZYG#}(4`jq_G+-VO6=U*Zyl zW3>$%lK&o*-$Ln)TWIptV!Fb*0aEf#_$1q9>xGf9N$I>J9ZwG&r^!`SLBYQ!;@iYU zYHJiSwjS0DGdGrZBiy|m$k!fn_b-0@?$L_K^_X*?oFcRp))z=z&sGcpG-ifx~*{)Omu1zfao)-2s_K8%~a9R>3tSP*5f zf<~+|&VBi=M^UNn?BcoP`$g@u_7Cv`+8~{~O5jzu2O6F6j`eHx7g!!E@^w_mKCZ@F z09(0R^~Ab~_wxZWKdSPqFIYA)3gXkL(uOtBOIKF>oIZgG^g7~>qT+t_c@7bNu}(ix z!SCeX4R3zn0%Nw?thOR7If7n?n9ymExA`#Awj}|TKLr!f$l1~*K!-nAa$gHDjZ)3c z?_P_zn&$%%#HfpVUzO3?MzZT9wOT${UV9QR#Q1amoC-BANYW(4Ht!jN&cx+X-X_>|1eJ)9;?+ zVSGF)`~_X@yY9z&M9DBnyoO%X%3!|_C2-ll0;^txi% zKDuk{px4L5@XZ%2f^JH>O-3w~r^lH$P}6Te@b3jEJOWsp=Hqw`iaj*f8Vp--2otJ8 zH&Bogzjyc7(WEnEgQi^*^&01{WM`847%Ny1WI6_LGw!^c$ExD={I+Qyt@~xJpGyiZ zdVeULw5U_4t%m29>+1Z{OYLk23mJynCt_vN$rXsk8`N-Z?5OSu?N}LrER9yOEyBN7qckC@))Y zPb}lWs1vHpJ{?R~VWof|>i0OJt25}}S475}%w;fTJL3kWF~=;}X~&|Qv;-6iJD?Ov znyUq*k6s`c0oL&l3|*xSevC+he>!U(8P#v@LNTrbB)e;5P{T^pKc0)@;jn^#dh%do7^NtKEN)~qN zw`2k>L^Xz1_hjj!L!rGmTTSG9VMHLW&Z{VL+e|9bLn3M<`_g5O2FH6dEHL6*!te#A zgaWZq*_!55UM)soU5Ea-S7zX2%f*mIn|>~wDx?vleCDeu+J}VSos5}-BCzl9 z$f9j>c(QW+_4mnY+RDzNQU34B$S0s?g`Pki1x1Y9ysOVZ zA*^IMM{y~aFslwhhVxAQ1U=iXY91-t;Ab}hTbT`G2V=Kn|KuyEE$#)#`kh=6b$U~R zX~>LN%NEB5-}X-8V>&$(f>1dWE-I>9^FL7LR!N1c-{SN*J`ja*VKN>bmh*~n|CtYM zPvSP^(dt*EkIV$bbXc_zs90t(lZNvt?$k9#2a{geXFu%ZNjAZ6J3o^)lTULnOkveD z@pi)+)usdQte(6HM&6mxLOKC3W@ge-#iKXcpO7fsbbD+B`boS9Dy)M02n=7S8Ph@B z)`|LZxr99}ze}(2J*YDt+)lx>sMLSeEg*H37PA7%l{~k-pkR~d zKT^7j*5vHMPsNF!%kU>Beqt9F*Sv)dSEwCoe}r?{%Mw9sX;7T)C8pq{AKd_;LaKhV ziq5V%5x&6AjG!PTEMW3P7I9Q^X-U+OHlboO7M!9bJru@=7O7k|^3+}WL($XW`c;-R zKFj606qEq2k1d}BlqyJk*!9xOCl9qU9U#lGf*djqVGTTXGq1F)lkFQxL(TE)7T+=i ze6`lD6Y}Plq3ACx_36|EC$*=xLaFE|aX3lIhiiC%&*vJD0$oBb4Nvj0ng{6^y(S;E z3^O3afppkd)n<)Pg5FTmxzQh+r+UiUaI*QxY|lO66H%k#An_65@p~!!4GwM%n=jDQ z7p`{c_dqBp`S>|(s+S!@9rba(UTrN6BrUH&GB(}&&^Ocbm3gOr$F_pbW^uSmS`3HU z1O}PU6mdb!o2TuYpqAe~2w zLz%Hs9$qQtvJ7?42uQS$8eH&KY?Ul?6U5AR{${pr&!0Dov#`hn(|ipm8mhMaVCH#s z#*#Es;*ULc|AVGbev(3GZNMgnBwJ0=U?C~{wV-V#t|a!%)X*FQnb26G^ed?`6Pgkg zb@;2uxdE)Jj@adTee9*r5U1)Hdcy(mY|XzV5N$u~3a@ zfY3_h+|Hh=a7mC(_|R5kxmpXjpwf2qWE&LFHs(8xSO%ko2n3XJ!<0b?jS%Nm8kyRD z#SQC=&cY)HLGjG>kbA)i2m%TOzRIzv9v?DT2bsiO_}4fOo22oDkp1 zwdhq$drpoa9x?CTN+icrFyb z#8^XB*;XmJtHQ>U+^w;VNt<4Huu#9b zMw2pHX#a+(xqI8qy)TQ_)oL|mZUw|e&h7Dvbr2_3tl=+9OZk<x0yo2X7 zzY{A$|7v1RBT^U0m2@kII2jQ}Aw${2;I8P%nKdy`J`;SKQ!6Zj@xkICs@X>`V@r&s z{g1{k*zy=j+5qwMx|Y5dZ?~RI(RI~gahZtvv;f1y;x6^=GvSTm1KodJ%Ov=aHV5nA zAycx@9$pUTCP6xjO5$cEdspD9bSEwlb`O3^Nj)Xf9*xd=)4&q)Mdn?-A`h4XnmV1m zpx4|4Ffs)K&36b?ozz-vopKmYD9PCZisdP_hCfJIS+pjAuF+Q?oFx=q2mpb|EkEwh zAW-Ee!{5lxoDqAWXNBv&KT(uqz7y5L=5zeG@E3JlUUX`Otv>WgKE}#vbdcQzWzmw_ zW|~S2{J|Sgh%{v*QiPvBA|7Wn$d9*w{|C5tiAkELj}_}%8taItL05Db0b6IY%Q^jZ zSr92NU;eGCi??crZqvOg%5Xd)`Ufblbr}-7Bl!BM>HF!Q4mpAUCJa9RYB=}RmrW&5 z;uc&=#_f9{_g>DA`vCokJ-Li!?tE;4<JP$kmc|;zNoZT)*I-h;a9zijw{^wW zvZjC9VGgF{zi=cZ}$IA-U|+$7PC&4q3RQ zB>RVUpcDnJ_KyVj5#@fw7ihwI`G{7 z>L2|AWdHIQRS_}+A|yBMYCaxq08H_uAKaUTYvhh0w`v+U($wIJ%W+I z5f~UZxo}J3)t!V;A7-e4;Wa5E97-1M6+61+ZaVX1$o*6BC5VrNYyl6x-5S{n z;UcV2Q89xY7XiFv-w|QG!;ua9{!19;aAdVd@$B>0->)~S>tbI()m5)JzDF-BMl`lE z6f710184-WNzVU`^Jb3p*NeJmxNN3U9@N7h1Gsi@JY!121MK3=96|>&n{oGWH*nJG zrN@xkL|T_kxb3)AucZpV+omVGB!Y`f?9M$g3PG%jfiVLKWwhfS{)%-8zBM1R9p^>6 zg*?#Xg_T4bD$u3eS&lv_@%HU!zbS1B8YO0vRG69;Vz{_aRT_MQe;W@l>qS^UZ!J_# zLOZ7=o|5NijA4qt9CLshh1m57D|f|Red9}u*lbPoLh1V$__jNjlg|2{qj@4Q9&Ecc zRk^Axo6I38cB-02joIks6feFE!W1K3g@SAlWg!=-`NR)#TLRSvOnUw0*nr(hCE=T1 z1>u2;-=aW|z)Q5K;|vyL91DA{y`Lk7oMCsxs^Qv4a&Uhd*}VPYDs>?I!Ax znDpki6^`R~Qp9M5sSxQ}*IBifVy#eKooWQK?~G2iPW>Ti)|J(hCt@TggGUy`NqXJS zu>S)%`A{V}JUMj$rd0y(XPE4+Alxp8{dWWrW}z)nqywZ-J=meGD*miq*gwEzc;=O- z5Kjd38~t`C$~gAtOa!iW1>AZzBP1hPKRuAp!F2;@xqR3%rz%8}k(5^t1Xb6u9oJKK zVT-d8azq>R^4|h57%ED>h8RLozT`wtlohlP<4WKDxfvlp6*a|f!EY(h;N3dCXTNqYW*qR$7i3jTNVg(Twv192b$1gOm z_JW8wF#SHMOpxG)=Ty2ST*skIW@WRf?Nf(SGMs-&xvnHX@GGqz^D{h_syf}SlVfg^x-pRm- za<;nCRw*K4nRv=`(qTJ^YvAxo?->27UB=_ikLdwjT7AF5hnk-TlhRCzj! z3eADNYzK}8Svd9J9pXOq3#p;Xc#9@a0L1?Q9$^qe{CF-vKV$F+&f-778?Fc~x+B5+ z+sel>o7!~^k6d6Ns-c23k_adGZdEa?H3W?hV{|SLdE2L#hfpC#0YESYAYQc7FkU9S zArR+*jS<+F0@XxqoRq|mNLH0LWq|P4wL|g)`nIS?G=(5Xq7K?=)({FJtcn7&*Lb%a zB+&0jloLGJWx*jQ(tn1;&xYsZhxeWutb5{}5H?N9%K5Dc;L{w_=e}SS-^Nmn zdM)>uSM48w0Ss4r2FZ)fd_2#Z618bv%EUZs*ND4o#r=}gR*Z5t3^VJ?v{W}m=8)PK z6t+_H=xYSykw}4m)zjt?Bt^#K%6{J`@qwrzAceN}qS8Pzj$j)xU1`Zjmkl$B$A_a` z6JeuMDjR0WKO8xyj;oSiTZ0e*fq+QcnNAyd&<3zOJ9$}zBwcYI8uYngJ96F>qfkA! z+PkJGl0luac2Gw^Re|>Ruxe2vABKF}#~CmO_`V|b*leYqq4`6+60lbORiJvBoPHFz z`G8byr8dLWmDQXo$gdOx-=9f$8FOL`J<1y8S}saWQn z<-5LNDrx;&sgTVl*%Ci^e2Bs3Rry|gRT4yBCqtSm-#>YD^?KkR01$I^OY>HBX3Ncb z`^Er=ka26^=dHHN@O6a=o*-YIiEwI0EmHQgf&2*z)(qr!cQ^MR1wH2 z35!qiA~-~*K1=WZvq;Fh+agh+wc#rXHm~EhQ)BQQcG_Y|dBfQ=sw=gVncp>4FInWn z|DJSWVk|sDQ8$!(%R8k#XA?0o?d!^s0u&^N`{xHZOBpb&Nt+98byoL)VL3I$yGJUN zAO7M1bQ)1zjYh#gZ3UT+zW%pPUou4MUSPHB<_RZc4=dQ$RDqLTcHR>zXNPWz`r{I> zev06USLyVe`jI^OSrMQI#9NkkK0-BGL=rH<@?1@yH zaHuy=Tyqrr-ye%7o`UD4AJMc*TKO;3j|)n+5KlG$e*izV7#h%!N5C0c!y6qG8Oi;` zzprMsl=RK!H~s^tUP#7CzOsEYK;a8!j2ydRoF^m-3qzZPE^4A&o2}4&TERroI{+l2 z@KAE~WtII915wmD?@_E(DJ(g1hPOX;olYZ6mG7HH_sFDD5;i9fs8t%1_sr+R?{ZD^ zQzI2UC{uW@#*OA^akzuq)>ZYi8j01GzZYDH%poq91e;k!drsO{$zS_p>ys2Ow8opd z;=4HC;ioA~k~}G!JH5RlJ3*0DrXE!tTF*n(N&=s4R^9~jTz+j$70RwZM!_7Cv1#A~ z?6YM=$`97Y0GKr_AA8F~>UC3Q34}s*@p<8&GgP}gnqDas z89EpN?jovYm$7X?{?iysEAW77zHe!sI7Hkxa)j$sXoad4U}_o1r*NwTXCC+bfGqws z&MATj=^q*7X-{XZ9x-3wPPt$AqUh3iEwJ_645XP$N8d(B2XBkjJY)+(T+{Hyh5%J= zJOWt$fa*`5@AXM%%T~Rx(Z{x`e9zs)e@F~~_E(PlwFmynD|YztF5mk{U5M}3FKxdU zA9$Z)!zQK<5Ih&dhs$MfDo_ECPeTZnZ%K3$OnHMg|oj?^BTGz6h59_lJzz2*v;1K(2|cMR`?5`=&^@YP@CZ z3C9c^`~OWJC}ZKAn+JySBTiK+V~f@VjKp0!{)TI-Ol!pmf0urzzysh$fVi~=`*MnV zw;`L~?)?uFzPmZ*Jg6bO7WfOlv@@by}0={7)iAZ%Y0@Z+Sjg- zI#kyn3qHIKNlYjJ>QPq<5unNVa-7R=*jF>rp^o~KJ??+o?`$iPqbUf0qh1pSoEU?* zz}~iZH1ZQN+B@Q?w*1ab-7deKg7ZCN$_sJ;MX6w%y%Q-mUNYB#kE1J&6k3$TmIMiu z)LxR+GnKVZ08~p#muYrIy!0{W7R`EvYm~zR&hh$KBrqt!tM-o91?)ps)OmsFE5^el z5^Wci6A2}#m>jly2LHIfwyiknIv{Sz$3#{8_z6=Ag+=w_y{Cj@paTJfkFlY-NGt-? z0~+#EQ4)5#>~E4EQ_K+H!;WVB{z^1TbWqu`WK1&flP(rQt!YHSMD`mRNeBzWrI)C$ z9H4BtSV}$a>E$gPVxM7e)-6(y&po!LXwc<>P^oWbSmEj2xP)=#iR$Ds3n+7C06=qe zbNR;M2~Oi2Mdsa&Lt8~uHC4UB)qg}CFhzRWosTVnac|Z9@Z$Rionj4(wJ;H00|u$= z->Mc2->wE~)YOXxqZx%N6km9!4sAYpS}ecjp3f#E0&gh-<5A{NJ-8SF={8v!{p()| z_Bt9%+Uco0Jg@a{YQB@ws{`20j|S8hrq8B5Oj7rmlj3W^_VZrwB3Z9|ZZVSZ_s6mj z4szPkIOZl*BCy((WM^XFYfAMY3cg*PpOpLImpxg%f4+&j4 zdp{P|P60QyEE<{|5B$r|dnY?LSM^89SYIL-gFV(#OH`Z0PsZ%BM)NPW6$os*CkW$0k! zVLHPdZU6#Q5v6ss8boN-eHOygv1mtbDNTW+d7VY^XMn=xlSlM^4i5W@w$6#)Kl%b#EGCA z5m-Jb4_28iEa7$!VSd#`5FhIkp9s@^Dqd2|_!k50KemN%*^BV?l2~rSzVgIqWSmV{ zD7FvQkW}=RQRG_B`-5}3&K0-kzjxBO?-E3G(o@FI@QLsP?S-6r5tPVjL;ok19dh|& zN!gq+fVfF0J#R&SR|j zI6wXv9z=YL#Q|Z*iRU}&dQrRGul;lqt{{w5^a9R8uLzqUF}Xz~0jD-!kqZ5cdO`|VvPA-z+W4|A6b zmc2<50^$^4ebdxTGUt{w9Poh7)nIXY8LpQFghH@}Q)y!lDJ*s z!GskuKklqCF9VggjI8F*-WfyZ{n~d~FAQ3+JTy}Mhv{~7IF!XRXeO?hN!X z;61}|TC7IY-@Ct$r>X$hlWVM%LDuU`A(3k`WMsX|MhkMmj8K`(Uqs7foPG<|R>!Gkrl+gqtE)OIS#*WqKSBovD(YQx&^ zC7$X8l%p!cG(rAEWb-*$B-bOMvSklMT5TeeFVeeiuXPy^g9Q^DnWk8_bm4jHW~p1! zG6ynd+7^A|za*keK4ZPUy378a`WOUuRnk-qlUMdte!3A5oa%->D$V$=n+wm>Ot+ko zobaNai8B96;DH}!`IO$o$7a@#UF(J|_ zaf-W|Z07j@ezloKC4J@S3b1mBKht`8My8^N2g~IS4=j%Al@%DSZs%N^k=p)#K6#5Z zEfiCRv&3_7DW|D`gUjvL`w%LX4U65jYEpZJ1-$DCQsmYnpx{as*T*&gdl};u7Z`52 zLDQ$n`HVR0yqAM4kcailSEaD-Og}@XxeiaT?AzE6roNhu!XI{jUVAqzQe_tr@WTXZsTeZ6vA66kvvP++!A z^Z}h?&RB0{Ps7T%teyD;8TU&;eC&?;ERrG3Ko*Z7fVBNMv~TOL;5o+L#IZII6>@6- z$_b!vF++#0M5uclibv*V)3wSyfIyb%Rmx+r)nR201$60R42 zjuXRh63bYTO^#yy;Sb6_5`0tkZkX`!x3+b3BJLU*46 z!$G1nU7cSx{{S7JMj|u`G5HZKOVpx+&z0IE`^b~W%M1e$djA+Bmu89 z9116ew1ez)4lAhvdpY&WOJC-2aE(W@f==%6XUa;v zlMKHdL3`?l3GEO_fAHWN+t3cPI|#4!skET-a-amzPv3@+%*l}%1WmmR$%sK{=VL-& zx!(T`Lvzh1L>Hmx_%(ou%xgN&Ik>oxdc$?V7ykEilY3a zr#j&#o`blUnAj4HMi?~-->AGuc6Uq{o#aIs5z0(xVL7mQ|;({E!q)cj@_ea>fU zlA7ZD_~0A658@Z_C<;7Mwp z`k$6aUMukwH+PbQgdHL*8~PWrZd{7r0i*$?cfzzT$DSSQ$DP|l??%XC4JU_k&4XXD*pH56h()3< zXt#jBA;Pfc?#u6wrK$wpQw*_#gRReovx(*`JHXR3da89R#s@^dy^%h+^1z!fQmWm6 zh}|C>IIXZhs)GXZX>*k73W?@+C%K}b@&$zOkk#i`Tccz;Tj8AYG-UNn;({pR#L}VJ zm$J#m!AgTM{b!~VPIZz8OZh#8)aEC7n^#ON zH>bCpiHz({x437cQ<@&VM@y6W{Eozo!mr64^gzR{0778yrU03HV z{X($(+m!fseEy8COX)$1n(A2EFFwX>Gax&Vorbr~!oX`G$vG-O%ZM|W*ZwLW`1q<%(?%Lo^aVYNY1TD0|-JwMb1b3&nTcO2W zTBJbmmSUx)|HHmHd!ISy=A4UjwP)7FnprbhYu@$Em*jn)=lAsduIi{U7+d8s^F)8Y z;@%7(M1K)ztx){gJ-GoUM-v%ZJXK{Ow%yKjiGF^&P~akYE>!rc=V|j%_N7XBY7q;+ zp%_EXSI!?1WHrP5nm$jj_wYL^`DsQQ~I*)e(WzEZ0xYMNm2{RTf1j-yNONY_@ z6Pt+Ci6$x{uMWUk>2cI=u*G5p*A3Up+Azd^{sL97AJTF7Bc z{RI*`hBPHXO;o3QW6U7?cT}_8m5MM|30@K{hjiwxFvnWk1VkA?e9QyCfAwC`L|zJJT!CzJyhd7LKL2Z%cVBCs)8z6LWYICg(0Iz|k_=oTGb;@cXCUe1ELsJLEVDqip7&C10UvV5|6}w z`J$68fnj-eSTvE6)T-ur|Dc*xwUJ_y4i6|SMM|*x;o=pg$ACOm=tOpu!3-Lyq=TO1 zVR-@U@~)yG6b8d15Kuf(k@4_a&_Wt9g0Z<|di`X!T!8JnO_OrjMAxchhvaf>9uzgs zOCI1Fp!um>N&KtwCQ^q^{*J%U=L}uef4k&bWYNapi9HZxa@nn%o9j7|)?UPu zRjfDK5Hj=rXIi|>2=Bt8Z$a(e1ak4ctr%129_}Vp%JZjS&8<}`p4g-6ATq~{N4%Pi z<(!S+)SsvvYM-)i4&HsXr{XxQUaPfDT*sFcF)Qya`-A`era3l*x?zh^LEg5-$!YVd zTXGIuVvofD80gUd2vJ~AfU9G0`|}S72#2bXMqITWq5lCqFfT8rLKHkC{C;kKI~lx) z2;1G;x$Zadw!UibOTq`5tqHC@%6#rMCjaH%Qc^3Uf6w$h5D?e=8DL>( zK?lq6h&-7H)f=>4Owh~RVaL+9cj&s(cg?aNz+S4tAJsW=BGOkh{?t${=J(b?#+n&S zc-B6F&z_{*vSj}RHKy=XS##KXEYz$-fn*J&ZQ}4W;Py`{%lRNF5#oC-)rG#9D6hJg zx0sQq2%H|qM|nxFc^DE>6*PG2?7goIwcY)W@@)sjy7CzdmH zDXnbOyS!a~o;0}hWAcv)s(V@sRg;34j>{i z5uhN2JFh!U$Q2GHCgjF|owj0`&~Q!%Wrz^3*P{FCy`W2|0pW?RWS5Un&MZe7VdxUg zHhfyP*eyrXkh5Ga&%-Z8Sz6$H<6}fxjjG&RX)T_~LaKMPV8Yfir>dgLxx4{#*fs= zaTQ2pZVkD=t&OX);4f{P`5-&;0Iv+Zuh<%nlKqLa+_#=d@?Xeam_!`JCF>QQ6Dl+a zRt#-5@r@D)_y?e^LQF^5N7Q6T(8ow{TvsuB)Jt`L55itCb&RK+pB zT$8eljak+Ap`T@f?!$>9je(=yjNg5>G`)FqPtje1k`4&6+S%bvm=9QnYU>Y?mcj28 zYTRUOq~ZVuYV&23wI7;!??`~|s$5|0yf&rMF>hA~LUgUGux7f2IfI#qYw0kt<|HOI7q*SJZKg=jBMwde>dhmH(}XVfP2;!Qg0dP6bN}L}>ko}( zB}nDv&*=5w$XN|Z=25LYU5Fn;2;X$~t7@-^zHB|5`lK?9Wq2~? zxuGS22}u|jpWqc+Ms)^3SW%PgoVi4T#AoJW`9vPJ$$3jJWV2`K0J8B`I=+}e3RaJnW$6no2H41_nWS z1!Y>kJ7!cbVQ(Eg-sy*i0q2)<-4ko&Ya^US!uk(Z4@-W^Y7N9>4E#D>mE1~VvZpTt zhA;6Jr-;yCIThwn#o-RxMmeXZz^bKbzJ{zn6uA*)lX?tX2vf_ z);SV}FLL>&#His~*nIdG=XHdTj+dt?*rz}yQfNao0w$y$@wiNSt;!~N^RyqLT+2#1 zjkbW?!<85`gr(K{q=x3rbWvqJ_mkP>D|))qR6jGTewWnVCWVvT48>n#SX7ms#$}!M zHL|gAC}uL^KilHcD@ZCzkl>UxPC~nP%Z3J!i#iW9GM6C0pnu?JgVwSE3}ognzfiog zc>o%kfoEP>;f?XgJnlh;OBnV`LrFP>b)HkWJXSG}cR)P{hPMZw#P245WHdolu&=b-ttl;)HIe3+~hRwK7S5! z2WL1imGqpVZThU;W*nb_x?)aSL+uLRHA_Z6LLef{=^z9rZ^K>?(*x0Vy_9+c?gr(J znJaLeGL+;EAC*h;jUZKZ@b-7DqH~1K*dm~U@0vO_#fcmTSxp;(L@g=R6O(d zkvlAj6rw($WzgyqyShj`I)8k__HR$J1VQS;Q8$4OB`|L&)gU~ppa1zU>2&n>-~Rv^ zw;^x$kOB5vze9dL2L1<-z8Sb?x914i{TLGwl@+b3=%6Q(Rt;4r7K}BZ+6jDQW%Mr> zN5+K8pe%HTGSZE4%6Sj4$+R}P+6`}Qb{F^};qOk?emsVVe}C;$g=MwcbWG?M1qBNv z(yFwJB%-W;TaZ)d{k>XzoEt7(7rw*z5@wKPx`Mh9KXI(%C2O2=y#5)7ao;3B&(O8) zy#8WI{pMzz2_ad*(>|gRkTHX&i=tw!Iz3>oXCCittEQo5Kl>p^dC*E(cFi0 z*f4PF%Ex9TM5jL5o8Ug_s>>MkT8erK(3nFnGCMBCjSD>XcY#~HCm-X~Lkol8aUCZumDYJ8k#OE16V*A*h z4!Pz}%$)ct#xv@0J@`!(OJEB4++d$(g<43lEp z5YvMKW{DWoKc%HVDMu;u>WCQGD5CM#M67`%uX{rMQ`_3Evnvd=8=uY6)}O=v1H6HJ zr=;%#5)9x^-&rtaZ@-p?PwkFINYMOvGbpd|#hk(_qKO>rZ8txg*eS7mg3#x(QgQ_x zY|&`#X6cHq99Rj)3QtrIT)5XBC|)+BRjqN0a{l^wUM;bHKD_e6)lV>yXH?SXk(=33 zJD+m4RO8D0%bZJxqDwI)NtTUzNj<8skJ@)mZ|vj~wW7*U9nICbXH3F^giic!O8n*k zWHHJzjo#Y#EuTwDej4>E(ao^DXAFAd`fAtfUkM0<3Uevz3d^#<5wbMGjuR)AmOKH> zBuU!D5P`;GcYyPc;xlxxA}Dd?vRhSxX*@lh+=Wo`*`b|-xu#3cih5;N)fdM%AJ;pA z3BbhU1VHebr5DZ`1tGqXy74f#%e*hOeu?PKdhh+y4=^fWG9>BXeyq@pCj7nbq4*=Y01X!?Yg7fC#bk1!&}zoEHdgNhnNt3=uw19@^q@$K(CFT z^3Ue0BZIY`!w{o4vCnR1IN`JZ!BvMwJ~5%^RLF$(r>$6X(J=0`wZvw+cEY%uG#Ra2 zVWnkjZOznGq0^D0ZVtlJgeY}&?;0!^oA0vP^6otHB3kW6cp{L2d0F}q>1|xHTJf zj$z>Kv~B+whpG4&O}Mm6cn7ay#j%W*_>3Jm?xoh=-Y6U==hlSrML?F4y%*zLr3cXR zxkF_B?=t8%eso@!MIh6syJ_H+3h6D%y6QbAqF*8&?chW1_&P!A2K^mTuGB*y>Z|kBx&K z75E)lL{j5vy!5fr&$q;nidH3UNq0fvhLjM_A*h^ae9s7LD{*AJk?i|jJ~mp`z(SQu zR{xbS0o(NaLcQTvYO!tr!@>wN^6Uhp*Y!7TR5Z9bU9MmbSHOLpni%w2A=HLt8kAP& zKl+k_c|Xh(K!x6^NznPObVr7yFmB$pIyQEE>Q}toSalpgiMxfi>n*=uk#?Sx<$YSw z2n~(F3)|7go=W7BLS+?&*t}k?Ij}*&(hASWrcRF%Q20*Z+?HaftZ;Wt+sMMhYbH7Z z>*`IBSqg^4GqF}JSN3u%RpjcvOJmkVn%x0a@T_O%2-3O0N)!ZZxd7&A@fOmD+10)W zB+1w@s$mszmF~tROTJ}@SCEOp(sSB-b71pwoeTaZj-Q|Ugp1@nS1kh*$yIHo+UOe6 z-2Uh-gEvKfF}F@ou}tJ1U}#Vuv?gZ!4$If$IuBpEwn&{|R^~x2%EUQuGx9`Xk7he& z)i?&9guh7K7?60Y*6)S;9K4kr%`|R4`}<4H*C0XIFWTErZ(x5%mcL+8U=Wz;?8V<} z9z&N})(d#Y;XyO50MSBEd{I58MsoHM_4u002byrW+h~J@J%bDF>+ZhKmp4(>_C|lZ z007vOk*NuaNtMV5;~;@DEwxxH$ZI zE|V3D=%-a}qLi*Uxnd39qVJ{Ao~yoxv&1ywO4Tp*Xa=e7?L3SOFNXM9+%B>CjZFrm zNUEzea^d8ba>;*Tx-tpNGY2e!R#7IA6u(E@BI~|%81-!vq2$iiOMYS{9|SV+8(sDr zHyZAzsoH^x!-RwfMvanw-Hua|bUe28(fJsSd+0|_ zF?6Ym-lBJ`ue)??TmaxwBFuy&n5w6M9_g#lqpsjkMo8o*)T4?lN*7-hjpr+$KImi_ z2)goux{syt{J{c%3FY1o8*jxZi`sYhc`Dl1rJK{<^!sl|TsuL_68+0Z9A!zeDy;(i6X-9O&a@^@QvX&GvAag16&t^4v%6QN#x!l+`YQPj^58rr_mqSPE=Mx9Rh?Y1 zV%jvDxDIFZ!j+O>VkyPjjTiW$+yQGOYp8>JdwB)nk?s61Z_7#@&>PZT)H!{2Gz8RRAi9=16*5^=A0AmKTMI_aI}X@)6Z89kHS-vw zzaplMpuRiwR~aOwZaVT}Hr}_H)yPRF46{@hDg*H+oC3BAls#`LdZSg0IN8*f++Fld zDCrhO8j`JW^Y>9WSk#iEU-;!!7y(YVOm@$pM#|d!s1?>4734&+PNY(+4d{Q)Wl~n4 zj0j~)W2Q~C^)k&#D2q%mY$BKp!Ov1%54T?kf~H8N3Njo*OwfJ5~-Fn5DKjThHHYb>*n)!po|;d}p-`x2vKR>Hf-If2UJylll zRm*a4`2^(n1xDVJ%W~#>@xE^!|Kjuad469vL~Tilzq$T_YwtTIT2T<$&cxU-VCj%xO~a8`eC#$4_8f@Fj_2O;$iHiCLR;F{U|Dr#iEQDOlX;= zbo1mu;-2l=d(M9*65kcS_PQ}OAVsjSaZBunj@+Mr(IrM$297j6Jr??z)ni59mCD6E`d?^rN!vCy9o@j7l!WrR%z3dnx4Ike)A=^f}jCe{IDuh>$@~ zVny1Z#-RH#z#jin2GqLG%B0MC?v(8f7f76ecNI;EO3{v)gx%PZ7`HS`df{K8uOV6B z&E{;X)^P2srWa{Z6zN1SvTfuogc4bKaE$))=f^k-r^ejWaSV)gERfLdzu0V40M z4D&^z?y`L1^THsaO-OL|O9CBI{hk+O!_rHoSb;+=zHwOeO%#(X@kH<-4#i(`SX!{m zXuqlKptYOru4!&J+@;nT>S7Gt@l~lsQ8cDJsi;%f;3hU%UGd1j%*D1JL3MT2qs|Z- z6fux*e_7C^9K)i1?Wqu@ADMWeg9fhnZ{JK%G$*3fzGLW$l9&t;k{o9A&IoyvN~j+% zrAkW&!&&V+Sa%$HZj{Hmj!KN~c;uE)iB-dC*b{(AT{1!@G^_W{c`Vh{KifXlQjK`n z_J~931UAD$BluL#YP91}ElRvgYMId;_~6{tc^)cJh@lA7sVJPZQaO5FAU0!Bs@p7I z4XmX5aW*6NTZmj^_ht~ugtG5<0o-WBkAxjRj#}P`-W3Ko;3RS{sb^VxW}`$sIS%rp z7F2o|UTwXjTT+4R<{pTROiEfD_?y#C^_W`#b_vMcD z;8M~SRpH6XLiV%^#t(t}ZkY#2lE(GMknQ`CG7Iz)Hwd5f%b5K{Dox2oKiKCKSUQlU zhh6dXUfuZyaV>f`OwDuG@jZ6-3|rWi-`s`tA8z_9mJ5u=*f|Jys8zRI;!{TQ%}i8K1RqO_IS$r9=&l z*pj3)hORkO%B0a{)Q2mmSjl?qU?@|SN^>pb`Mb2pji2MR!3SQyqV`hJTVbYFnlY-n zE>7F3ThEpbu?Hu%ET$}Pb!QzCP=Y*=R$y1cFd#eUev17YW3J7Fw8@@6A1nYUqecjR zxGI6A?tu$WVyd6QoRXf7=5QYwSW%cVO()}l#H*ckjy(+HOTZxxcU6gLcck zS|63o^w^e91{(PmPocJLN=WibN_wO_^u&6-QWz~oA|JXZ*^CZC9#F4SD=qmIhZdTW*pPV%NABI9{_qT@zndvxoUw#$P`u>2 z;^52@k9I&{_YYR7XN~NiLYm0}a^FY6nspT?sp9M#WvyEm`7Fg&7#dsikxpo}D)<~L z4%qL1&zsjv>j6C%Tt{7BRJ#{DhPka11j6Y<7{<4T6_`y+ZhVgvHS zFFq6znzI@}>I`d^%xH2|sNjWZ%wbqEG??;Bc*b}jVpI2);Ijmud>f{fX}8Z9Uxpua zhRkGtUUSZmkSHx26mGkg@{sH-kGQYY8R0A|AbRCEc zu^-%ap*_3T?W!(zhR?&8pZ<`7eTG-tFHN#9p?Ji6Q#E3So6J2x_!AK_tl})9hEy*C zA3xA-Ejbici?ml*huMFc(nKw@;C#hs<;8!p(zQ2Uo~-ENq2n=7B#MqNAVw|Ff6_=O zRbYDNZ7q^1frF~_K{0r_f{JQ zcPLS#*=YcNaYdZn2aGt|`thN)i!?saSY{|x&bGDo)=gvN=S|2vgY@96N&K7W@y}vo zG8e;OV+}&zL;pl_JaB?^4$9NJWQ3KaRbXf!?a>KemFk!!1|bai(8J>BeR) zi6(Ne=67>uzEtb7@*ALjB5{Ulva~Nma?GFk# zVWjAP>^I?#dJL^+NO(26h5AvCvz!!BdDAo5&(pp?0?sLvZ7wDpUgky?NtLfuezg7B zL0$S<)ft!4%S;zv=vApZsc~#dX|ozYzTarJa-%$dcen3u=EnDj&TuoC;kPWdIazh8 zp-&2Z57h5i14&YoYr1HtNCn)A6arkoM(ji=JZ$aLcip6wbnyc*ek2MH@HFig4A2N@UGoPWajvDh-G`m&qeO<3X@zmz)Xifh9h^R+hC8(i8ns za*K6hjR%N{GuoZ@IBCPr*S2fkh3yVqdWE+pcYHl23q-M|wVHhk%4Yw4tW5-qSVT4Nz>eAHep;&O0t ztMeM8yruqm-ld#NKh@t3Z^mqC! z0fYG>V?Fe@@n`poN`sNQwSAOb3Wvn72ZulV8+D*DSdjA4EaBaEL!69W4cP5Yg#qm5lSSx%d~CITALWyoiwfWmmri7kS-|pAaWo`=u%oDXo*V=VN^AgHIjjuIs(U_%T1OPu zMkw~@Y!AQBCX9fntOmRa&=G!<=XN6g^s7_i13Se2ZQO}(u$nKL$r5fdQ;j@vpU5sH z$7nnmr~Je$&7K|5IgV#>=v8gs6C`@W7?Dz)dF>QC{w2xV(BSiMyNs4n7Ng-tpn05w zHe_6_aagJA*T4;NI!NWcdgfN}Tgmm0A2(9koO*uQL^;YUF&2=Gz5^i2i@^A7yob3i zw8x~WJXya2(c6^7i33J39}ymVlLUa>7-B+5GUf}_8hNG#!43s03p4Bv&UbjOTO0oY zzLasK%L~Fvt!9PX#o3AE_b#4>^e!k~e_$fGV@JgpYQ#iUSqA<}r~pN-M5Q7EAt6s( z<`K{WMzu2(8dyLmGMaDat(6|UQMZ3$XRwV@+3lSX&PIDf?IS%5AOe+_l&{Q3zkl*< z_vb8)=`1+lC>^fM!dLt}a>5LlTc1-%TD5wMY^vvxH}oC6z%uG8@v*Rc z)1r?1+;DgpF7m$l45n?xP0?Ho?t6h+ninp`37d-xB4Rz>A8 zrd*{l%JQr1GQu@pw20%?`%Rk981&k1Ff!HJ2e)V+D+L;03A1#OAWjB^H-$s6ED-#v zNbYoE`6#=9h)9zGM|VS=#|Wo%g-t22gnM14%PIT3XayLhXwH%BG^wRu3oe-kM=}Lk z7+J~;t(Vo6?_~iBtY}LSIcbWGcp8MU9PNCgsl`eX0$Ds{Zz;kp8mbnecQ-W5{X0G6 zSzD@=iGSAF1KKr6m2o04EU`EY7!=i%?cvmhoIVs_rLqMnW+ha@O(}kHFawg?Xdd$i zwnwxc*^cIuAXve=2LpG4by(~Ri(>c8tRw>!36s-)Hm;Aste^BLIyJIP#vBx^C&pQK z01_%Tu(36$EwcHQR?3l!;9wgzCz%B&ju(x(V$Ud|cQfHK6u2)RSBl)Xy(v%Mur0UJ zLqKR74v;jt<3KX|ZuDB7ienJ4LiMBpOu&K1BNr6~x2$KtGP0pH6gaFt&QRvwUR-Pg z7SdPO7?MT1Fe&XRvnOkeM0mu{b5-h$YJ> zN3>jm;#7-&PAeNXTKbHiDAl7wscHFCE*0Sj#fY+yeg0)1$Az&XIMDiv4kxbQ< z6(i9YL8_YSLzt4u(TFnYqZMqE&BI~r`>N%gXR)1483PUg+|BkIH1a;oxFW@>v%#LP z5*LZ0gal0!A_dbG=n&xIX(=*zynDWJ9;q&eQOO8%&92!MMZCOMTi1@^4~~IDL>`F}ePn#$WI`^`w@f+O)gKe<&Q%JAx?nKG zGfRm!k0rb=xf>B><+dHt+^oaEjkvtAD^ zPtl}=f-95|VV$SwM>N7L^&`&ahk_~?i@w0=DDFoaiXu3Gk&yd;m@gIE3-eN9!k#sp zMzaa_1mw)%pbuo)L4yUEE!t_2aw98(PQNo}=%-zRE!s%pkli`iW}0;0=9W)YVGaV8 z)x+{6F^6)MRLXn^gkLG%k4xpl`TArIcxU{dJuwWDnquj1u^-oZ^w!O<5KvatS&oq_ zL8YLzkYn5&4NOesQ(#E0jqAYa+xJU4c)PrqrA|L7msaQ@?vVh$o00J%UNB6kKY5amzw&)r4X?CP1Pu+KMgu zYU2HR>p6X8Xk0TK_9;yeAin^4u8avjHknz~!J7B+4Fzra_s<^Ohejr~P0NH`F(1-p z9?#{Xp-$G6f+HD_tF-b%4}xK#I}tjo-+%x4KI;+yw18m%>;dhByX?cOvApqNFnM+5 z{{>m_^b(egzZL7avToD=egLxt@Pck~ArC-E8k<56=@HXI&t%~}iZW^&YA-G&;a93W8N{a>%uhXow zGNXB2k9S0=^N`NEBCj550De@nvF%yve6g|)OhqV}iPYj_PMp4u;F?O2k{H#iWC+Hm z9Ui@>z(XKqX$*7{H)}wQaFj?BH}B`_3$;F=$qQB6Bi>TtS*7oPSiQlWPbYdIyxgb)-jpx=s8GTShZzoK#_ad3eWM*NXM%GEVCUI9N(t^{M(_oHk`HQ@-mX zFZY^DJA4YcWGU|3=VG|{iUf3&xia)rel28c(qTxW6`WGYFx;dw;mPn_;wDI?8mF*kAy+7uY6;+A#CVlJ!AXX2d?OU_h7s{?b#%3LS>PF!|Aki`c&rIj(M z2bR8aJ^6-3@_u93ARR-><0J}GLERg#v%Y*ba?CP;+|x+E6loJ}3vw{_fDtKTCYV|q zawoK7h_>ROnPAU;1U$e0QKy35;d?Vu+o9onvR_6n7hFc9^KlF7AxSPuZ5fhspA%R& zV;rlh!qkXQOUnB>qr+JQ1a@4vP|RRl)ejI`3evuYnl60wK_Nv>B5Kf@6#f@o(h^$l=fIX~kJ8PP&K z>Duf0oBz8TUfBp>Rw5LDNkaOh0m3KREyJ=_yUYKWt{5pe%L?2!~ z2r8+>^iotns=P{otAmc%Fu>7kp^cEVni!QoZTw^qlae8p%_wdg5H|qWQ}+boEJ38F7fIVUPmaag;6ft) z1N=FUk1r%s9M&D2#ftiEHaHMQclW=K|6PIq4;5gK_-*!L!0#0Si~fHA`i-i|pZ@_E z{=R*2zI5>X!_b~d{bZ(C>Ta&+wexI$+p*QguO^S*Yn@?dTXF#x|36)L?u>*<{zwgD zE(RZu{J%Pp@Qgqm|F6$YOzczqn3i_@lppq%zMh*Wn2X!yTXvBznJCOnM>F*owo=q&P@ zc8q>*rE8KAYjc~2S5N83e*l9A?-O(Q=e%TXX_8wY1F#k~41tdNmM=YKNKn|#n2LWB z6Z9gHpYZny_fINqlmQB2{bDP=pI{I0 zdC6>A_S%K|#Uk&SEjLRj_3-Iknomn@UUcYLD!cW{bZ4L$J97F3VSiz9_*x<~ z5+Y4ID6grhM98@2n)>H09j<-lhk(X%^`s#_!Pql;` z2lBZ?7s`McVOQH##3xE9X588v^6v|KwE&8u820nz@nb`DeFn<=(RuRMzb|qx(pCjt z3fs}!aE5Xm4zJ*dcIjG zNp8YiTr7#EyE=j&Ij| zxeIW!NomlcBcW^IpjYxSnZK5avcAv!ykI%bjb*Q0{?C`2La`I!z_aH%A;6Mj*F4fg zcIbl4YDkRZ@}0C;;b&nGqZtjNC4Z%pndk}|AmUHn{11>$Zz}M|XhV^36}yHiquhtK zD|-+8%l(fXeIvRZ9CQ1j5M(22&2A_t1QZNCJe-U^6U3~>L{EPP?>syO_t#Sf(_9Rr zUVzcuuo(65Y7-?>9ox);bjR#jc|3?cYx$Aus^%1yM_-m~O2 zIvX$XZ$zUnw~0gJcIJ{r&xTV)w~;>LS*LMtob53pS12&-C*Hr)bP43-#>!kJPUI=| zrO9;lWoUk^TThQgnrQS+9Cnnhz}jh#>e@NbKJ2EkGptYWDZj)iLUBT&4We~X3qnzI zI4RO2s8N>^2FoZUeikuVY9S7K=VV>zc%gFO7>uaMcRJvGwQp_L|50NCB@gX-3^d zA=3IIoPj^sV1rYiw-$v%!gcHLF^NxJM6`>TfYP$-Sm*dL<`@)>uXBUB?nejik7&k_>|NAYqy8 zxI3-RyicHoKdy3rB^=@au%}jm^YzV_oG%AVTf&t8WLPzZ6~8Ubw>{$^e{K{DF-8Q( zb1MzWVrfaLDIr3rQY0V*$S1H%CK-$5(FY-5p2`Rs0Flt(4WfI7$zGNF?coD)B55yU zmvtl<91)(Zl(D=kWB`uS^`wfew6W;)@_VR=KG7;gg-5x%-Lu)3zZ)(eHO~xjUmB2#a7f4W& zxt-9Bvm#(Vsl481#OLj*lcuX;SI zuFcup=vRSjn$r^EB$V=!hg@syojkFdSb&8n-P&G&Lq~C1&iW>_n$Q2{rmoomF30b2 z%b1G+Nqecq&EeluonnFAsGs;}Pp!x-TbJl$yzYh(sb-pfoF6=e<46q#0fB5CeSp*| zz3R~Ds={sU-WB_U!CurxvI1zH1$(;Sfb0%qUL64PC}$1~=lu*@*hM{yV=-AA$9WhR zJHduG*fFG)H#{bW9#O+un}D~1dQmvRN9mzdbsTIZ-ux2fX6Z$eEm#p+MeG?QEeo__ zFDd8{q2@LOyxB!>3OD~AYJWIulh~v+<2>^SqoDVg1eT~UVC$nMU~|q?fW&N7ZKREk ztql`eKS1J|@6PrMQn@}-JmK4G7UC`iRRFQzk^GURZ97oLRNzvK@YNFEIXcB@r$9hd zGRx4~I4JOhBVu@bY+c>O@B8k%7Arwz20bwcNW6LFg6M<`Vu352sHS0$tM9CYUyuK< zg9z(QiRI`W7Q;e)&vnnAmeAdful{g`sBH!rd4bxb64!DnQi6hvZ)%4lR3K82^bUS? zp$}{Zu&E&oGT?s&lRiA|O#~pYv3DRD!FBVaw^G1yQjHc6lQ(s|jkc1!5gs`f-fw*loklLZ>HAIU5t%D$9fQy%)oT+Y~Nnw$0w zBnH>N5n$A}lH=TZ))h5XGsJ%B{zf%PJdD6q&{2(fA}V2WBh?E%4gYD7E2Y_Mb~D(? zGi}FV%_c%{-{6DU)OSEvtFr9H?97+*eg6mnu>eQiVP&L<7>&I8PGTj~A{v9sJwIGO zvmT2bF=V97b5L<`mHA#BgO*O^*WF1XVfKPX>U-zMenDe#JL|SWv;4R!RYF*2Hse!L zp2>F{$k^d)3iq^D7vKk}@Qu>>I5y*|+~AY==^|$0^Q$c7>PcsEiBI~n)-*qhXvVP1 zJ`@({NFHMz44)aKhc-O@&>|5rPStS~^6vRCT>=jM@~h7ds^ihiE=7E$v#nE&P~atB z%#$FoI7Xl@`-1`{)OPG}SpN{DQzi}Xs^LfnEacP7%UkY*4*Vt&k*w5g;|dhYj52s> zfYYmjN7Xm(^5b@NFwyQ>M=F$ai15UR+q(75Mx#guT0T5ZPAh29RY$TdG8Ec4J6Ukd zZz@Rj;?P^@cG6#7qr$jc_UA^302VWJI!PgA54G{3K)?%MKK)96Yl;={C69Fktb5_g z@V*km>U&Cr*<#Pi@ct5^Fdc2>wJ@8Q6oYijYV6hxwlN!Fm*g3C=1`_m{UCDZbHyM;tPG6Ar}Lxztgt!^%WP9C61*$q zL44<%#x-bKjx9^9h1tAHZ>mLtg=E+>;qz5Sc=l;JZRM~mC<6#Cv%4pgNjAaBbb4ir zIG}}1QM{9%Us2v0!d26VCuP>Q1tr+2P4b9+E>d2z)UUtjhJt@+Kg4Q4#i~>!tTf-I z{JUCU6ySbs(-wW)Huy04>HhJ=+DMy3e#jeiWJh=g2Xf%aYpMo`CfaLO+0dXiC>#ab z9(x0nDnE>k`b85e);!|5;sMYzj3NM_fl3G-(0TggB*lahjHOZMAl_u5HGb&A`Wt6} z;;REakiV6^Y_=~|f3?V-U$v2fh-Yl^oG?H6yOvUBnH^g64gVTyuMJqfc(V20!|(?u-(3tQXD3fQl7HnhsxDbxd=U%M6cp(Nv6V@Z5V2IRBWz`H zpPz?RIf_oNN?aV{8<)UnHKL&F#Rd$#l(R>N$4#3kVs?W+CqMP~Gt)gm#TnS9gab0} zItbj`(Dlj3n$n_>gt5S?6KM_1sC)*)+8fbR=E{<_RW<2vGcSIZD5f8DK0d)4S2l;wUvfjNI>k0f>ff>Ib*sIeWGX@n%uVO zMZ{2oH1=R`>>xNkKq(?xHFVS`W`XjX05!I9;B!&JIkF}3(?vspd?P%9UuVW%DGbrx z$5|Yrw{}h{Vas)GMq*D@NR7X=>lauK*Z4%#s<$6fNn6O~sNgC_f()KcV)q$=#!%cc zr@uflKn7mXa)!+9zRCINp>abJq>aAkGkLqy^O*TJ*)G?7#3zt^*A$l!JO&R`renSv zdSK%c7_v8SnzvV5z0w*EPiVHB)Qi->(iYpd)AWCJ-@!jvWXw{<|d}3 z{Xam;1i{*UI{T%=HI}8ZQtW7Ql4^zMQx-dhipquZ2Z=GPNydKnDf1&oQ|-VK-9AKO z;BfW3i4TFP6C`o^_(3R0R}yJ&*sD*Mdm_ADuaOwP_yUNP!UIh1htpx)uvoW!MTASy*VOqfM?BENI!0M_vTuTiEAs$n;o1n+Sn+Ic_%5_yWpYCxZ z4Am~S$tA9Jt}HDRZx)|(-qHq~?4>0PH{zAkadSLQlYqd1u7dIKLKgDj7+7id5I)+F z?KR>VDfv3+SWbbU_xCh%pP1QG(XH=tP<1p%SI;Q0_QGe%mP@Xd|LblLHqjlC;;^9d zd?%AnLd&&nI|CH0Uv-1u;w#T?L|~4@=|OU7XG*mtO;=(5sY&n7_1*&!C*MAk;%{;J!$bN|2zVX!L}CIf_f z?;=$y%8G<_&op~A7VD|GS^aWrO^I*<#t)}IlRHAFcoS;_`}V(xD*7QIkEAmTw7ix} z&N&vPZRD1Q`nQSq6ST|s9!z;2if3`SQ9e?UY zG*xt2fd~1+xfw+$YiSKW+S6vt99YDiV66-3hOY@!a1EU;v31ky{ts1rahZ!tbbRS| zom|Cgly*74l47MvHZ#@6s!92Ua1MyJeSM=J^Ldy|o*DUp%AVK(SewJQ#-HLxUrulH zN&enqB)bm1Nh_gRRxN7mxKgP9Wg^u}tKa>!zPY4zfMYh`jDE|GWN>b;%ZRidZs3%x zm)D>uN@RaN|Afk(eLlZ+o?)a=pwCufw-ob+1E1xjkPOvY*Aeo1caejMfdROR^?qP#$^!L?NA*0)*6_}MC$!&K zOD+}8T26KhaN1Fx(bpNZQb&0eA7Cj9zxkwx(%(A9)``ofTB{0knMZTEepcCk=HyBy zXgv?6JOJ41FGdte`q&GrKI z*SONrq&LGXdR2#)!k0{8b)TbU+jv#{Cf$vS#_Q&Gzh`P@>TP=bz-4G3yJW9vhCBqF zk1F*XV1Tc6Ew5@%l5L@A=|44@I&4-kzUZroVsI2mfC9 z`2RRC+4FP%f75}%o}U~4w@ZNlvlsjQ9p`nyJo(W7d1KpR?G%hU;#kOaZLR_+e#bho z`=3tUY>KY_uLt;#`~0OS-TV6J+4KBshaZ1lH+gvSKIQHt5^d>W$JCetIy)K9UK%#D zi9Mj;pPJPGK&1|`b-u4Mc{Yk3VPm;c5aAr6gkl??7ruH@x%b3%V(A`lIm+uXcg%Zn zsZTfSj9>4Be*Jwe_sIb0SuZPGZ8ccMVf~`jp{HsCy@d$gVKvn4ht(2wB;qUQF>9(Z zwyH#Z;TjS#V`mB@{I=EsqoRm9@+W@Ea$}wR6Fr?|j=K)Az&UkOttX&1QpYM1Cwtl| zFH$N&7hSX!s)s{>-#(J2es$;x!u^H^9G<$qRft|zFX2%VBTO&?FxyD)SF`2;?tSEq*gp`9B7^M|@IZhLWd4r z%MA8BMOH=f^vAi~8Dz)2@XeZVX-;x&3>JhvL06GHT2(lg;{Xz&n>O>XZc2V3)i6n4 z7tH8N{`V5Z-A!#S%=>-%^;=5eG!uQjlH*La8k(Lw_w11;FX3`61vwpspDM0NOAkKD zCI0Klz=6D^)*vDE*M;GDnw*H0g1aqgp<-B-Z|9fK_Ogp6{vN4XOt>tf!4kv9M({}u z7s)6(0fiJ*|$3?(tW9@@M$#8JNILFs5k~l&bqs7(4s>pDFb!E!eIz z^L+aafkFxC4-OFnOF214leNX#K|8(JyVyuE`UZM9l?(nlcG;aq-YA92%t6I)$CER= zmArGB7Mm14!|>}{B4i3qtnWq(Bqm;}f zH$0`1kM<$5DqxhcqAqwO+h4ct%iYc@7e|Y=W%i*G zkxwY=`0Nqnlmj>7o1ctL;z$as?$0O2Im58YOUDB2hgz&DETNZ}OX90$%I&TumjzUNfN9JiE#toi8}(|!p5NCv zN1sQSh5F49^aFZ+2sJhPjmGR~prT6+$2{>7a7p`TiyS5cu`sxShx&vN*JLk%YsW?C zX*^IPy;M|trlW>3>xHH;RJ40%69-93S&t#dv^;v+veHY!jbFw!dGjU!KFAEH?o)7% zEm#FoB$M%(`1gY=d`jui-!h$*Y!iB7^E5`!cps(1Lg9WIzH6Id=i|#e0qz2eST>uG z^wLmF>Cs`Xa+5;eX@NBK^7YN@|C%OrLKtX#-`Cy~F9?YUuJm2~4mgSLq?XPXLpTxkQ#SD7JaaY?RY4c|v#V7$0Npe5BRo7CStwId|1q!_8tZ==MHHX7S13@TUE%+@$D zxx`MeDV;KwFVexQWe)l9JJ@0mTeB;=Tr*OT{G-rEhq<7 zXpID#ueN5N4~gM-)nVl)oejZwo9SbOhxWaySP9wy0xydCHq%FgBBBimCuUs) zz%e3t-#>haPRkj8D&RI(2Y(* zXLesuxzHsnQd1Vu)`;&Y_*s6}O8}Ss@JbMoIlA!Q&M#2nlYNk@DYq~s2>Az~#Zx)7 z-MHNP5T zx!u)$`e8d83N}PKB&4MYn*~MUJ6RGWr^qyuBK-o1tbnUo7RA8oVK7oPX`SM9#O(g- z$j^ISC54;{)C&&Sr>ciC(-m)23HSNs@ba~E-M-z?c*v|x@K;RP7Xg~M=oKkXwF{d& zK%nl;U{N4k`rD3XP+h=1?W7*lt6u;Bz@4!;A0IW+;m&2rpO!0e%ehBKdQe4rW+^uz zEHy_u?6MWy-|VkNwm|avN|L04OzP&6)dpUC{e_7W!sx8Iu|+E9tt-~=j>e1dRnGzd z5ID(Ir3fa7gz0NTKqg{gJ-=#{-dx}Bqey27?(EgD?p0!P{3Rd-lMwRz)}LPJ@Y~N@ zvCJCp-|x1gvD6oG6$RzsQn>haZE$`#3AuxMqfs4*OBKYCzXNfOL)esFS}{ zWM{MDRwnWR2HiELdVD;T8S&#oyOtM?|7XYlzv3Zb%E>ghKC{{Nd|Xl6jI!_Ym+RMy zG_r-E^N?q>AMRMW3j2@XSQ+j^E|A;e`ZI+cy}lJ<5C46ZeDC~4LR)F=3Q&pxEb>85 z$l4KlBxLmQd5aZfoeW;DzVs>Zf{TSDw*2*cQsm=MVAZdB#)|lA53OEkDu(y{B5R7b zjm(I)-o5dw6MIg1f1@`qi;l#lA(~UW}h<^TpW=_m~iJ<+*2Yo zxUb3oE;t#f9Y^KMB^HvUFn9m@k|RK@fk>A}`~y()b^ATeF7DFvTt$lKX8UeIbpKY6 z0@?M=<35ZS0IgRwvj?+$%kzD$HZEyIm*?dv&ZtlroBq_%DdkSJgXE)Zs~?a9#SI#kRZ2r%_i41syHFke1G(}R*oqQxh)wK%DDnn~-P`??SuYrK~pChjfTk3VTlCYau<$OBPkP=B}_5 z=M0mg?tWTF@8tTeb#UnAFS}CKmIY!qZFaLKe+}H^oJ1{In#ED1R9j}>lSM{-4Cr?D zT(0?7rEPn8_c%Bi52M6id3tz@>}lcT-lR#@{moxg|5V)P+(h>5%*dxQN|-8r1O!yI zT24QdBW#9OUgPZ1TZV{|<2)+enN&f&$Ce??K3H*_aIpr^8eSfnW_c2d z`%)`zke^0KjxY5Y)`_|u#ahu2sNndwV;pI|KBlF5&yX)e@8ym&+`Slsrox1Jl{O^@ zdk+LWRTDM=^TLL)n$PP!4$^0Otg{_cER$Nkb@%*qo{Tw=lirYO_8tC9G3r%LBxJLT zbKri<^1xjcBapnWWUV{5hYrwm6rx!RL+f1eLA~5H4{aw^?kD|o5Ks28Hx?_Zy^+W^ z(9h%?=j(oTZ0UF|8-X`npHC*s3ntxdS!DbA%VtuBhdp$Sp&tSMrtesSNK5dl&I$D8 z|HkFVPrNT%O<)n!NKzp({pB8{5`?YYD|Inudr+@${}ULws`vnFm>u?^*fb{}CMNIX zXq@|-_3JE1*;hhD%=m9)?mgDL(YCErx)SbZ5we*Tf7O3SSVplBI5d&EX65`bH;lzD z70HwRckD{$p7<7xkEXE7xShJM^kgCuS(9rmKqG=-jaSelMX$n1C1hEZbYRwKQM&=u zBSOwK_QdCPnc3>vblHgQ$e|xe#Stvs2U}fiEG{SgJjQB0`Xe@DFW}t!yzBR*kj5j< z7)y8Inh=$g3h0Nr1c=>c1lF0PC5KWaYw-s>MB;k5Mo?I}Hs?qm8C|i((x}VN_#F11 zVoreDOs_tiuwbr>CdlM;Ll{nyNyPyE4Je}+UhR?gac?27%0{27HsAei+QRI3! zcuPI_fOdWPj0L{AJh^rQ?Ej96fMg!BxDXsLWSv1qaK&?C@l^tOA%!{;5WlC9vE3M& z#y)%J-(w}MZ6j@&#IOTIpx$fkr+J0qb#Ct5C+NBqKhar`&rB4pNh=C{UmB7iwr|g% zP?0CkVVwCVYnR~fb|wi$>aPGti#c=cAb#s3uAG*NV+xt_efxXrY-JP+(Fo^B(BiaGF}dN!&$RXj<|?WLMBp;wWFY>B1hw$Y!mQBnDi z-o`!m z$LLXwRh?k>CPV@_-VM~<21(}0WvV1e2z;`F~j}W_pDhaJC0XqrJ^M>5--rSoeXGHsl;8Jx*TkK20OqF#xFOi;~LjE>3Ur( z9042svP1T0rOE5fTfWX{NNhlWyQPo=eIu^je8{4`k~MS|LrAYX-kqY>jH_3`p>lB>4iTuhW_#ql_FNt&L> zAv_S|>ag}pD;r9BGMix9(6^roH+m}nZjvz#(gaH1-8|ZH@|$lmeJB1ZZA;tA_$0e? zH@HzydwB4PmNN!-f#ULt3cL@P(r%?*EVIk?#_MrPK`&@BQLf|kO_Vc;UbXyoPhB|xD-Ext>rV~$4MPzc zggTAbgVe(kW2uvP_`&g?udLoQXQ{{GVYd9LPM=Z6aXLKO>lnil6b2z7X$N@(xoRqk zU|JFBX7x#O@wd$-Oj_x@kzZp@Z$Lq5qH|e~{{Aj0ks(5U1%1WCO|5T* zEZMcxvx@i`DCOVOZa?#b;rIl@J%e z-p(I`1wc^MK7B^XSm96jvchU;iBIaz#wUS4WUTorzAurO{O@?&gF1UAOH3OWCn{pW zanh^`62mgOts_`UB&sxb|6|NzBH}qY?3XqkmC)3ZuIX>8i-wi94%|=0hh4?IbUbpE zTEj0R#%UwWVK&eke)pUwVg3Np&(z3|?nZqtrRdMiE*hSH#G1FvQtT^B8n3z;9m$B= z?HQH2XH>*>%7R+8JvaiO$>5LE9ydsrqn{x;LYWbNFe%X#Nbb#=S74Yiji)xy+)8bydtV_ccXb zXrLXq3oYdGxv=3|Yi!IG9c`NA2zVXnu@w=r}P*XS^#OJw#y!pjqr)| zwlwNyja7^0hJR7~iC65Tw^!$f7?aVPI*9$sfyW`06q8{7Q|x6UA)pqO+dAwWXT@WQ zyo=wDZ0OXFrWm{ofu7m8C}tbc;JqDBSk21Ih;Al;J7(%q&)ugXOQpBAx$alrcv<FzFpp=ab zsJda}KXv*0@h!B+h7cXtAN<~33Lf?r*Ii|JpO**+sUu;ZlGk}p0eM~l;^|F#5b1xh z_3K$a;nIB?+03FtJRHlh6AQ}2r72DFmAVLFVj%@OTJr!M5fe}~jl5qfOwr30@^n&h zf9Jj`6UvpH>mf9{xLUHB?LT;~8M1o@W_t_WrWUsR4t^GwjKiFn%ZXk|istk(^N@zVfG0ZLQl_C=)ySR!y0(n zYDwP$i9Saw4-`zh`C$(`8)~RA8v7>uRZscr=frm;|KK6FX$Z&6eW1DK@U{Q>dEw?& z7~*LsWxky_A-&_5t5CiB?uZ^WZ#z*i6SZ2;} zm`AcAKbWS%NOMsRcw4rz!NR)*cbF}qdOE;dkar@}5W>8eXTK4KMYuo^h@Aa$9Q{bRZ5jVaNwK07lHK$Y%%N4t&6 z#I#9cAB^BN4zhwG_4#(>54YS&hu}-gK0uGhsS$ zlX^SlCx-_qd)gVPf6M3|dYF>j7Y1ImO%wRHYrxa#5>RXDA4gRMb_$1gqQ&}`W-XCi z%89&nj9gsdOAc1OAz1ZvL((|lw~)hD5akQ+S*W-FaZH{F6#gJ#BP#wO8_S+-{lQ0q z$py;%NJlG9f}&8qVwwg6qx*4by00!jK|vKeV_t}B$;|R^2$eK(BXaYhq}^A;*!?lM zDN&(vRdmdmWOZ>yxS<`k?qP39+fDfCaT*3vjl&EGth(ve`k_rMwv&6frebkn1bB~# zXPk?JIx-fdCxyNlMg)l6S#1ba_!JU5^Yf^)kG)7oYamR+3c!uOrKLCQ^SRuVSupDdfT1z^d zh*tzm)c_EAuo`oPK4_R*n(QTg%0AQ)Mq@z+>vp2Eh(V7-Tg&BN4gk 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 O(|-Ub4GD>V7XA;0bK_tD literal 0 HcmV?d00001 diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md new file mode 100644 index 000000000..bc6eda1a5 --- /dev/null +++ b/docs/blog/posts/create-task-psa.md @@ -0,0 +1,26 @@ +--- +draft: true +date: 2023-02-11 +categories: + - DevLog +authors: + - willmcgugan +--- + +# The Heisenbug lurking in your async code + +I'm taking a brief break from blogging about [Textual](https://github.com/Textualize/textual) to bring you this brief PSA for Python developers who work with async code. I wanted to expand a little on this [tweet](https://twitter.com/Mtrl_Scientist/status/1624439847174676480). + + + +If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. + +The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may simply disappear, without warning, when Python runs garbage collection. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt: + +![create task](../images/async-create-task.jpeg) + +But who reads all the docs? And who has perfect recall if they do? A search on GitHub indicates that there are a [lot of projects](https://github.com/search?q=%22asyncio.create_task%28%22&type=code) where this bug is waiting just for the right moment to ruin somebody's day. + +I suspect the reason this mistake is so common is that tasks are a lot like threads (conceptually at least). With threads you can just launch them and forget. Unless you mark them as "daemon" threads they will exist for the lifetime of your app. Not so with Tasks. + +The solution, as recommended in the docs, is to keep a reference to the task for as long as you need it to live. You could also use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. diff --git a/src/textual/_doc.py b/src/textual/_doc.py index b4921ed70..3b4c9d08b 100644 --- a/src/textual/_doc.py +++ b/src/textual/_doc.py @@ -99,7 +99,10 @@ def take_svg_screenshot( async def auto_pilot(pilot: Pilot) -> None: app = pilot.app await pilot.press(*press) + await pilot.wait_for_scheduled_animations() + await pilot.pause() svg = app.export_screenshot(title=title) + app.exit(svg) svg = app.run( From 05042725cdab032f19e3f998f5bb4475cbbe273f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:11:38 +0000 Subject: [PATCH 38/52] words --- docs/blog/posts/create-task-psa.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index bc6eda1a5..42da994f6 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -15,7 +15,7 @@ I'm taking a brief break from blogging about [Textual](https://github.com/Textua If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. -The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may simply disappear, without warning, when Python runs garbage collection. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt: +The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may simply disappear, without warning, when Python runs garbage collection. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine): ![create task](../images/async-create-task.jpeg) @@ -23,4 +23,4 @@ But who reads all the docs? And who has perfect recall if they do? A search on G I suspect the reason this mistake is so common is that tasks are a lot like threads (conceptually at least). With threads you can just launch them and forget. Unless you mark them as "daemon" threads they will exist for the lifetime of your app. Not so with Tasks. -The solution, as recommended in the docs, is to keep a reference to the task for as long as you need it to live. You could also use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. +The solution recommended in the docs is to keep a reference to the task for as long as you need it to live. On modern Pythons you could also use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. From 1540f120ccf9c4ae651f02df3ad584a26688bddf Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:15:35 +0000 Subject: [PATCH 39/52] words, non draft --- docs/blog/posts/create-task-psa.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 42da994f6..580b28f30 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -1,5 +1,5 @@ --- -draft: true +draft: false date: 2023-02-11 categories: - DevLog @@ -23,4 +23,4 @@ But who reads all the docs? And who has perfect recall if they do? A search on G I suspect the reason this mistake is so common is that tasks are a lot like threads (conceptually at least). With threads you can just launch them and forget. Unless you mark them as "daemon" threads they will exist for the lifetime of your app. Not so with Tasks. -The solution recommended in the docs is to keep a reference to the task for as long as you need it to live. On modern Pythons you could also use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. +The solution recommended in the docs is to keep a reference to the task for as long as you need it to live. On modern Pythons you could use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. From 6004d7c731e0a799f35a15d7d0ce1556b7481b03 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:16:01 +0000 Subject: [PATCH 40/52] typo --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 580b28f30..a3a7eb772 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -23,4 +23,4 @@ But who reads all the docs? And who has perfect recall if they do? A search on G I suspect the reason this mistake is so common is that tasks are a lot like threads (conceptually at least). With threads you can just launch them and forget. Unless you mark them as "daemon" threads they will exist for the lifetime of your app. Not so with Tasks. -The solution recommended in the docs is to keep a reference to the task for as long as you need it to live. On modern Pythons you could use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. +The solution recommended in the docs is to keep a reference to the task for as long as you need it to live. On modern Python you could use [TaskGroups](https://docs.python.org/3/library/asyncio-task.html#task-groups) which will keep references to your tasks. As long as all the tasks you spin up are in TaskGroups, you should be fine. From 93746b75a135a26d356540abb8fb18bbc2f2bb8f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:20:08 +0000 Subject: [PATCH 41/52] edit --- docs/blog/posts/create-task-psa.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index a3a7eb772..2422fe8ed 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -15,7 +15,9 @@ I'm taking a brief break from blogging about [Textual](https://github.com/Textua If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. -The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may simply disappear, without warning, when Python runs garbage collection. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine): +The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning, when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. + +This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine): ![create task](../images/async-create-task.jpeg) From e880f273293ed50c4f94d1fded68dde4e6e89d19 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:21:47 +0000 Subject: [PATCH 42/52] no comma --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 2422fe8ed..60a84280b 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -15,7 +15,7 @@ I'm taking a brief break from blogging about [Textual](https://github.com/Textua If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. -The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning, when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. +The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine): From 48a4c7cb6883b9e8cec4226aa900d28549196114 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:25:22 +0000 Subject: [PATCH 43/52] reverse words --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 60a84280b..91913812b 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -21,7 +21,7 @@ This behavior is [well documented](https://docs.python.org/3/library/asyncio-tas ![create task](../images/async-create-task.jpeg) -But who reads all the docs? And who has perfect recall if they do? A search on GitHub indicates that there are a [lot of projects](https://github.com/search?q=%22asyncio.create_task%28%22&type=code) where this bug is waiting just for the right moment to ruin somebody's day. +But who reads all the docs? And who has perfect recall if they do? A search on GitHub indicates that there are a [lot of projects](https://github.com/search?q=%22asyncio.create_task%28%22&type=code) where this bug is waiting for just the right moment to ruin somebody's day. I suspect the reason this mistake is so common is that tasks are a lot like threads (conceptually at least). With threads you can just launch them and forget. Unless you mark them as "daemon" threads they will exist for the lifetime of your app. Not so with Tasks. From a28c97050623d1a81a34ef8673caeb7eadafa595 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 17:41:48 +0000 Subject: [PATCH 44/52] Wrong link --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 91913812b..358c3b5fd 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -9,7 +9,7 @@ authors: # The Heisenbug lurking in your async code -I'm taking a brief break from blogging about [Textual](https://github.com/Textualize/textual) to bring you this brief PSA for Python developers who work with async code. I wanted to expand a little on this [tweet](https://twitter.com/Mtrl_Scientist/status/1624439847174676480). +I'm taking a brief break from blogging about [Textual](https://github.com/Textualize/textual) to bring you this brief PSA for Python developers who work with async code. I wanted to expand a little on this [tweet](https://twitter.com/willmcgugan/status/1624419352211603461). From 933138b3a616f5e7d2f702c200053b43116cf7b0 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 11 Feb 2023 20:15:23 +0000 Subject: [PATCH 45/52] fix link --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 358c3b5fd..2cdb9da8d 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -15,7 +15,7 @@ I'm taking a brief break from blogging about [Textual](https://github.com/Textua If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. -The root cause of this [Heisenbug](Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. +The root cause of this [Heisenbug](https://en.wikipedia.org/wiki/Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine): From 8e82d110ffb43e55bebeedb3ab88f3c827ce8799 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 10:01:45 +0000 Subject: [PATCH 46/52] docstrings --- src/textual/app.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/textual/app.py b/src/textual/app.py index 4398bca2b..f90bfd0d0 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -657,7 +657,7 @@ class App(Generic[ReturnType], DOMNode): Like asyncio apps in general, Textual apps are not thread-safe. If you call methods or set attributes on Textual objects from a thread, you may get unpredictable results. - This method will ensure that your code is ran within the correct context. + This method will ensure that your code runs within the correct context. Args: callback: A callable to run. @@ -753,7 +753,7 @@ class App(Generic[ReturnType], DOMNode): svg_filename_stem = f"{self.title.lower()} {dt}" for reserved in ' <>:"/\\|?*.': svg_filename_stem = svg_filename_stem.replace(reserved, "_") - svg_filename = svg_filename_stem + ".svg" + svg_filename = svg_filename_stem + ".svg" else: svg_filename = filename svg_path = os.path.expanduser(os.path.join(path, svg_filename)) @@ -832,7 +832,7 @@ class App(Generic[ReturnType], DOMNode): driver.send_event(key_event) await wait_for_idle(0) - await app._animator.wait_for_idle() + await app._animator.wait_until_complete() await wait_for_idle(0) @asynccontextmanager @@ -1230,7 +1230,7 @@ class App(Generic[ReturnType], DOMNode): return screen def push_screen(self, screen: Screen | str) -> AwaitMount: - """Push a new screen on the screen stack. + """Push a new screen on the screen stack, making it the current screen. Args: screen: A Screen instance or the name of an installed screen. @@ -1259,7 +1259,8 @@ class App(Generic[ReturnType], DOMNode): return AwaitMount(self.screen, []) def install_screen(self, screen: Screen, name: str | None = None) -> AwaitMount: - """Install a screen. + """Install a screen. Installing a screen prevents Textual from destroying it when it + is no longer on the screen stack. Args: screen: Screen to install. From 17d74c2cbc438e54775cd669337c25b41a66462e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 10:09:18 +0000 Subject: [PATCH 47/52] fix typing of css paths --- src/textual/app.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/textual/app.py b/src/textual/app.py index f90bfd0d0..f8a647dc9 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -209,7 +209,11 @@ class _WriterThread(threading.Thread): self.join() -CSSPathType = Union[str, PurePath, List[Union[str, PurePath]], None] +CSSPathType = Union[ + str, + PurePath, + List[Union[str, PurePath]], +] CallThreadReturnType = TypeVar("CallThreadReturnType") @@ -241,7 +245,7 @@ class App(Generic[ReturnType], DOMNode): SCREENS: dict[str, Screen | Callable[[], Screen]] = {} _BASE_PATH: str | None = None - CSS_PATH: CSSPathType = None + CSS_PATH: CSSPathType | None = None TITLE: str | None = None """str | None: The default title for the application. @@ -270,7 +274,7 @@ class App(Generic[ReturnType], DOMNode): def __init__( self, driver_class: Type[Driver] | None = None, - css_path: CSSPathType = None, + css_path: CSSPathType | None = None, watch_css: bool = False, ): # N.B. This must be done *before* we call the parent constructor, because MessagePump's @@ -348,6 +352,7 @@ class App(Generic[ReturnType], DOMNode): css_path = css_path or self.CSS_PATH if css_path is not None: # When value(s) are supplied for CSS_PATH, we normalise them to a list of Paths. + css_paths: List[PurePath] if isinstance(css_path, str): css_paths = [Path(css_path)] elif isinstance(css_path, PurePath): @@ -355,7 +360,9 @@ class App(Generic[ReturnType], DOMNode): elif isinstance(css_path, list): css_paths = [] for path in css_path: - css_paths.append(Path(path) if isinstance(path, str) else path) + css_paths.append( + Path(path) if isinstance(path, str) else path, + ) else: raise CssPathError( "Expected a str, Path or list[str | Path] for the CSS_PATH." From 7fc475fcdc74360dfddbf1eca2361ebb58db06c3 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 10:16:05 +0000 Subject: [PATCH 48/52] docstrings --- src/textual/screen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textual/screen.py b/src/textual/screen.py index 5a0ccb7b4..7a3d21aed 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -63,7 +63,7 @@ class Screen(Widget): @property def is_current(self) -> bool: - """Check if this screen is current (i.e. visible to user).""" + """Is current (i.e. visible to user).""" from .app import ScreenStackError try: From 1a5a3e95ca3ee9085236cb645483246bd2bc282f Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 10:21:00 +0000 Subject: [PATCH 49/52] make tests more robust --- src/textual/_wait.py | 2 +- src/textual/pilot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/textual/_wait.py b/src/textual/_wait.py index 92fe8f761..a3c574422 100644 --- a/src/textual/_wait.py +++ b/src/textual/_wait.py @@ -2,7 +2,7 @@ from asyncio import sleep from time import monotonic, process_time SLEEP_GRANULARITY: float = 1 / 50 -SLEEP_IDLE: float = SLEEP_GRANULARITY / 2.0 +SLEEP_IDLE: float = SLEEP_GRANULARITY / 10.0 async def wait_for_idle( diff --git a/src/textual/pilot.py b/src/textual/pilot.py index 5f4ca11b1..02362e5e1 100644 --- a/src/textual/pilot.py +++ b/src/textual/pilot.py @@ -53,7 +53,7 @@ class Pilot(Generic[ReturnType]): async def wait_for_scheduled_animations(self) -> None: """Wait for any current and scheduled animations to complete.""" await self._app.animator.wait_until_complete() - await wait_for_idle(0) + await wait_for_idle() async def exit(self, result: ReturnType) -> None: """Exit the app with the given result. From 6f815a3b39e1319a8a4e9d868a5d8791e157743b Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 10:22:52 +0000 Subject: [PATCH 50/52] docstring [skip ci] --- src/textual/screen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textual/screen.py b/src/textual/screen.py index 7a3d21aed..d1354a106 100644 --- a/src/textual/screen.py +++ b/src/textual/screen.py @@ -63,7 +63,7 @@ class Screen(Widget): @property def is_current(self) -> bool: - """Is current (i.e. visible to user).""" + """Is the screen current (i.e. visible to user)?""" from .app import ScreenStackError try: From d0a1eb1783837c3562c312cbab920992a52f4170 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 16:12:02 +0000 Subject: [PATCH 51/52] docstring formatting [skip ci] --- src/textual/app.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/textual/app.py b/src/textual/app.py index f8a647dc9..5261b5b6e 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -1266,8 +1266,9 @@ class App(Generic[ReturnType], DOMNode): return AwaitMount(self.screen, []) def install_screen(self, screen: Screen, name: str | None = None) -> AwaitMount: - """Install a screen. Installing a screen prevents Textual from destroying it when it - is no longer on the screen stack. + """Install a screen. + + Installing a screen prevents Textual from destroying it when it is no longer on the screen stack. Args: screen: Screen to install. From 555cf8e6ee9932c15996a0d127e4b775079f922b Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sun, 12 Feb 2023 09:40:27 +0000 Subject: [PATCH 52/52] comma --- docs/blog/posts/create-task-psa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/posts/create-task-psa.md b/docs/blog/posts/create-task-psa.md index 2cdb9da8d..737316bf2 100644 --- a/docs/blog/posts/create-task-psa.md +++ b/docs/blog/posts/create-task-psa.md @@ -15,7 +15,7 @@ I'm taking a brief break from blogging about [Textual](https://github.com/Textua If you have ever used `asyncio.create_task` you may have created a bug for yourself that is challenging (read *almost impossible*) to reproduce. If it occurs, your code will likely fail in unpredictable ways. -The root cause of this [Heisenbug](https://en.wikipedia.org/wiki/Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning when Python runs garbage collection. In other words the code in your task will stop running with no obvious indication why. +The root cause of this [Heisenbug](https://en.wikipedia.org/wiki/Heisenbug) is that if you don't hold a reference to the task object returned by `create_task` then the task may disappear without warning when Python runs garbage collection. In other words, the code in your task will stop running with no obvious indication why. This behavior is [well documented](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task), as you can see from this excerpt (emphasis mine):