From 04bdc76e6b29bef9701bfdd3ee03afe8d23cff13 Mon Sep 17 00:00:00 2001 From: Philipp Schlarb Date: Thu, 7 Apr 2022 11:36:16 +0000 Subject: [PATCH 01/10] Switched to sharedGHA Signed-off-by: Philipp Schlarb --- .github/workflows/publishRelease.yaml | 120 +++++++++++ .github/workflows/push_pr.yaml | 119 ++--------- .github/workflows/releasepr.yaml | 71 +++++++ .../{test.yaml => reuseable_test.yaml} | 0 .github/workflows/tag.yaml | 64 ++++++ build-scripts/ubuntu-1604/Dockerfile | 30 --- build-scripts/ubuntu-1604/README.md | 30 --- .../ubuntu-1604/build-3rd-parties-docker.sh | 24 --- .../ubuntu-1604/build-3rd-parties.sh | 51 ----- .../ubuntu-1604/build-indy-node-docker.sh | 31 --- build-scripts/ubuntu-1604/build-indy-node.sh | 42 ---- build-scripts/ubuntu-1604/postinst | 8 - build-scripts/ubuntu-1604/postinst_node | 198 ------------------ build-scripts/ubuntu-1604/preinst_node | 5 - build-scripts/ubuntu-1604/prepare-package.sh | 58 ----- build-scripts/ubuntu-1604/prerm | 7 - ...{build-indy-node.sh => build-indy_node.sh} | 0 17 files changed, 276 insertions(+), 582 deletions(-) create mode 100644 .github/workflows/publishRelease.yaml create mode 100644 .github/workflows/releasepr.yaml rename .github/workflows/{test.yaml => reuseable_test.yaml} (100%) create mode 100644 .github/workflows/tag.yaml delete mode 100644 build-scripts/ubuntu-1604/Dockerfile delete mode 100644 build-scripts/ubuntu-1604/README.md delete mode 100755 build-scripts/ubuntu-1604/build-3rd-parties-docker.sh delete mode 100755 build-scripts/ubuntu-1604/build-3rd-parties.sh delete mode 100755 build-scripts/ubuntu-1604/build-indy-node-docker.sh delete mode 100755 build-scripts/ubuntu-1604/build-indy-node.sh delete mode 100755 build-scripts/ubuntu-1604/postinst delete mode 100755 build-scripts/ubuntu-1604/postinst_node delete mode 100755 build-scripts/ubuntu-1604/preinst_node delete mode 100755 build-scripts/ubuntu-1604/prepare-package.sh delete mode 100755 build-scripts/ubuntu-1604/prerm rename build-scripts/ubuntu-2004/{build-indy-node.sh => build-indy_node.sh} (100%) diff --git a/.github/workflows/publishRelease.yaml b/.github/workflows/publishRelease.yaml new file mode 100644 index 000000000..7753c0aa3 --- /dev/null +++ b/.github/workflows/publishRelease.yaml @@ -0,0 +1,120 @@ +name: Triggered by Version Bump merged + +#disable all tags and enable all brannches and only version file +on: + push: + branches-ignore: + - update-rc-version + - update-version + paths: + - '!**' + - "indy_node/__version__.json" + +jobs: + release-infos: + name: release-infos + runs-on: ubuntu-latest + outputs: + isVersionBump: ${{ steps.get-release-info.outputs.isVersionBump }} + isPreRelease: ${{ steps.get-release-info.outputs.isRC }} + versionTag: ${{ steps.get-release-info.outputs.versionTag }} + component: ${{ steps.get-release-info.outputs.component}} + CACHE_KEY_BUILD: ${{ steps.workflow-setup.outputs.CACHE_KEY_BUILD }} + UBUNTU_VERSION: ${{ steps.workflow-setup.outputs.UBUNTU_VERSION }} + # Expose the lowercase version of the GitHub repository name + # to all subsequent jobs that reference image repositories + # as the push and pull operations require the URL of the repository + # to be in lowercase. + GITHUB_REPOSITORY_NAME: ${{ steps.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} + distribution: ${{ steps.workflow-setup.outputs.distribution }} + steps: + - name: checkout source code + uses: actions/checkout@v2 + - name: get-release-info + id: get-release-info + uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + with: + versionString: "${{ github.event.head_commit.message }}" + - name: workflow-setup + id: workflow-setup + uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization + + createRelease: + name: Create Release + needs: [release-infos] + if: needs.release-infos.outputs.isVersionBump == 'true' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Download Node Artifacts from Github Action Artifacts + uses: dawidd6/action-download-artifact@v2 + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: releasepr.yaml + workflow_conclusion: success + name: indy_node-deb + path: artifacts/indy_node-deb + - name: Download Node Artifacts from Github Action Artifacts + uses: dawidd6/action-download-artifact@v2 + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: releasepr.yaml + workflow_conclusion: success + name: indy_node-python + path: artifacts/indy_node-python + - name: Download Node Artifacts from Github Action Artifacts + uses: dawidd6/action-download-artifact@v2 + with: + github_token: ${{secrets.GITHUB_TOKEN}} + workflow: releasepr.yaml + workflow_conclusion: success + name: third-party-dependencies + path: artifacts/third-party-dependencies + - uses: actions/upload-artifact@v2 + with: + name: third-party-dependencies + path: artifacts/third-party-dependencies + retention-days: 5 + - uses: actions/upload-artifact@v2 + with: + name: indy_node-deb + path: artifacts/indy_node-deb + retention-days: 5 + - uses: actions/upload-artifact@v2 + with: + name: indy_node-python + path: artifacts/indy_node-python + retention-days: 5 + - name: Zip Files for Release + run: | + zip -r artifacts/indy_node-deb.zip artifacts/indy_node-deb + zip -r artifacts/indy_node-python.zip artifacts/indy_node-python + zip -r artifacts/third-party-dependencies.zip artifacts/third-party-dependencies + - name: Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ needs.release-infos.outputs.VERSIONTAG }} + files: | + artifacts/**.zip + generate_release_notes: true + body: "[${{ needs.release-infos.outputs.VERSIONTAG }}] " + prerelease: ${{ needs.release-infos.outputs.isPreRelease }} + target_commitish: ${{github.event.ref}} + name: "${{ needs.release-infos.outputs.VERSIONTAG }}" + token: ${{ secrets.BOT_PR_PAT }} + + publish_artifacts: + name: Publish Artifacts + needs: [release-infos, createRelease] + if: needs.release-infos.outputs.isVersionBump == 'true' + uses: pschlarb/indy-shared-gha/.github/workflows/publish_artifacts.yaml@parametrization + with: + COMPONENT: ${{ needs.release-infos.component }} + UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} + distribution: ${{ needs.release-infos.outputs.distribution }} + moduleName: indy_node + secrets: + INDY_ARTIFACTORY_REPO_CONFIG: ${{ secrets.INDY_ARTIFACTORY_REPO_CONFIG }} + PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/push_pr.yaml b/.github/workflows/push_pr.yaml index 6cd230ab2..d152758e3 100644 --- a/.github/workflows/push_pr.yaml +++ b/.github/workflows/push_pr.yaml @@ -16,118 +16,39 @@ jobs: name: Initialize Workflow runs-on: ubuntu-latest outputs: - CACHE_KEY_BUILD: ${{ steps.cache.outputs.CACHE_KEY_BUILD }} - UBUNTU_VERSION: ${{ steps.cache.outputs.UBUNTU_VERSION }} + CACHE_KEY_BUILD: ${{ steps.setup.outputs.CACHE_KEY_BUILD }} + UBUNTU_VERSION: ${{ steps.setup.outputs.UBUNTU_VERSION }} # Expose the lowercase version of the GitHub repository name # to all subsequent jobs that reference image repositories # as the push and pull operations require the URL of the repository # to be in lowercase. - GITHUB_REPOSITORY_NAME: ${{ steps.repository-name.outputs.lowercase }} - GITHUB_REF: ${{ steps.cache.outputs.GITHUB_REF }} - distribution: ${{ steps.cache.outputs.distribution }} - isDev: ${{ steps.build-flags.outputs.isDev }} - isRC: ${{ steps.build-flags.outputs.isRC }} - publish: ${{ steps.build-flags.outputs.publish }} + GITHUB_REPOSITORY_NAME: ${{ steps.setup.outputs.GITHUB_REPOSITORY_NAME }} + distribution: ${{ steps.setup.outputs.distribution }} + publish: ${{ steps.setup.outputs.publish }} steps: - - name: Git checkout + - name: checkout source code uses: actions/checkout@v2 - - - name: Convert the GitHub repository name to lowercase - id: repository-name - uses: ASzc/change-string-case-action@v1 - with: - string: ${{ github.repository }} - - - name: Set outputs - id: cache - run: | - # Set variables according to version of ubuntu - if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then - echo "::set-output name=CACHE_KEY_BUILD::${{ hashFiles('.github/workflows/build/Dockerfile.ubuntu-1604') }}" - echo "::set-output name=UBUNTU_VERSION::ubuntu-1604" - echo "::set-output name=distribution::xenial" - fi - if [[ "${{github.base_ref}}" == "ubuntu-20.04-upgrade" || "${{github.ref}}" == "refs/heads/ubuntu-20.04-upgrade" ]]; then - echo "::set-output name=CACHE_KEY_BUILD::${{ hashFiles('.github/workflows/build/Dockerfile.ubuntu-2004') }}" - echo "::set-output name=UBUNTU_VERSION::ubuntu-2004" - echo "::set-output name=distribution::focal" - fi - if [[ "${{github.base_ref}}" == "feature/did-indy-new" || "${{github.ref}}" == "refs/heads/feature/did-indy-new" ]]; then - echo "::set-output name=CACHE_KEY_BUILD::${{ hashFiles('.github/workflows/build/Dockerfile.ubuntu-2004') }}-0" - echo "::set-output name=UBUNTU_VERSION::ubuntu-2004" - echo "::set-output name=distribution::focal" - fi - - - if [[ "${{github.base_ref}}" == 'master' || "${{github.ref}}" == 'refs/heads/master' || "${{github.base_ref}}" == 'main' || "${{github.ref}}" == 'refs/heads/main' ]]; then - echo "::set-output name=GITHUB_REF::main" - elif [[ "${{github.base_ref}}" == 'release*' || "${{github.ref}}" == 'refs/heads/release*' ]]; then - echo "::set-output name=GITHUB_REF::rc" - elif [[ "${{github.base_ref}}" == 'stable' || "${{github.ref}}" == 'refs/heads/stable' ]]; then - echo "::set-output name=GITHUB_REF::stable" - else - echo "::set-output name=GITHUB_REF::dev" - fi - - - name: Set build flags - id: build-flags - run: | - - if [[ "${{steps.cache.outputs.GITHUB_REF}}" == 'dev' || "${{steps.cache.outputs.GITHUB_REF}}" == 'main' ]]; then - echo "::set-output name=isDev::true" - else - echo "::set-output name=isDev::false" - fi - - if [[ "${{steps.cache.outputs.GITHUB_REF}}" == 'rc' ]]; then - echo "::set-output name=isRC::true" - else - echo "::set-output name=isRC::false" - fi - - # Ensure publishing is only performed when the build is executed from the main (hyperledger/indy-node) repository. - if [[ ${{github.event.repository.full_name}} == 'hyperledger/indy-node' && ${{github.event_name}} == 'push' && ( ${{steps.cache.outputs.GITHUB_REF}} == 'main' || ${{steps.cache.outputs.GITHUB_REF}} == 'rc' || ${{steps.cache.outputs.GITHUB_REF}} == 'stable' || ${{steps.cache.outputs.GITHUB_REF}} == 'dev' ) ]]; then - echo "::set-output name=publish::true" - else - echo "::set-output name=publish::false" - fi + - name: setup + id: setup + uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization lint: name: Lint - # Reference to workflow-setup job is required to access the GITHUB_REPOSITORY_NAME output. - needs: [workflow-setup] - runs-on: ubuntu-20.04 - steps: - - name: Check out code - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-lint - restore-keys: | - ${{ runner.os }}-pip-lint - - name: Install flake8 - run: pip install flake8==3.8.4 pep8==1.7.1 pep8-naming==0.6.1 - - name: Lint with flake8 - run: python3 -m flake8 . + uses: pschlarb/indy-shared-gha/.github/workflows/lint.yaml@parametrization build-image: name: Create Builder Image needs: [workflow-setup, lint] - uses: ./.github/workflows/buildimage.yaml + uses: pschlarb/indy-shared-gha/.github/workflows/buildimage.yaml@parametrization with: CACHE_KEY_BUILD: ${{ needs.workflow-setup.outputs.CACHE_KEY_BUILD }} - GITHUB_REPOSITORY_NAME: ${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} indy_node_tests: name: Indy Node Tests needs: [workflow-setup, build-image] - uses: ./.github/workflows/test.yaml + uses: ./.github/workflows/reuseable_test.yaml with: GITHUB_REPOSITORY_NAME: ${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} @@ -135,22 +56,24 @@ jobs: build_packages: name: Build Packages needs: [workflow-setup, indy_node_tests] - uses: ./.github/workflows/buildpackages.yaml + uses: pschlarb/indy-shared-gha/.github/workflows/buildpackages.yaml@parametrization with: - GITHUB_REPOSITORY_NAME: ${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} - isDev: ${{ needs.workflow-setup.outputs.isDev }} - isRC: ${{ needs.workflow-setup.outputs.isRC }} + isDev: true + isRC: false + moduleName: indy_node publish_artifacts: name: Publish Artifacts needs: [workflow-setup, build_packages] if: needs.workflow-setup.outputs.publish == 'true' - uses: ./.github/workflows/publish_artifacts.yaml + uses: pschlarb/indy-shared-gha/.github/workflows/publish_artifacts.yaml@parametrization with: - GITHUB_REF: ${{ needs.workflow-setup.outputs.GITHUB_REF }} + COMPONENT: 'dev' UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} distribution: ${{ needs.workflow-setup.outputs.distribution }} + moduleName: indy_node secrets: INDY_ARTIFACTORY_REPO_CONFIG: ${{ secrets.INDY_ARTIFACTORY_REPO_CONFIG }} PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/releasepr.yaml b/.github/workflows/releasepr.yaml new file mode 100644 index 000000000..26b4adffa --- /dev/null +++ b/.github/workflows/releasepr.yaml @@ -0,0 +1,71 @@ +name: Triggered by Version Bump Release PR + +on: + pull_request: + paths: + - '!**' + - "indy_node/__version__.json" + +jobs: + release-infos: + name: infos + runs-on: ubuntu-latest + outputs: + isVersionBump: ${{ steps.get-release-info.outputs.isVersionBump }} + isPreRelease: ${{ steps.get-release-info.outputs.isRC }} + CACHE_KEY_BUILD: ${{ steps.workflow-setup.outputs.CACHE_KEY_BUILD }} + UBUNTU_VERSION: ${{ steps.workflow-setup.outputs.UBUNTU_VERSION }} + # Expose the lowercase version of the GitHub repository name + # to all subsequent jobs that reference image repositories + # as the push and pull operations require the URL of the repository + # to be in lowercase. + GITHUB_REPOSITORY_NAME: ${{ steps.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} + distribution: ${{ steps.workflow-setup.outputs.distribution }} + steps: + - name: checkout source code + uses: actions/checkout@v2 + - name: get-release-info + id: get-release-info + uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + with: + versionString: "${{ github.event.pull_request.body }}" + - name: workflow-setup + id: workflow-setup + uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization + + lint: + name: Lint + needs: [release-infos] + if: needs.release-infos.outputs.isVersionBump == 'true' + uses: pschlarb/indy-shared-gha/.github/workflows/lint.yaml@parametrization + + build-image: + name: Create Builder Image + needs: [release-infos, lint] + uses: pschlarb/indy-shared-gha/.github/workflows/buildimage.yaml@parametrization + with: + CACHE_KEY_BUILD: ${{ needs.release-infos.outputs.CACHE_KEY_BUILD }} + DOCKER_IMAGE: ghcr.io/${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }}/node-build + UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} + + + indy_node_tests: + name: Indy Node Tests + needs: [release-infos, build-image] + uses: ./.github/workflows/reuseable_test.yaml + with: + GITHUB_REPOSITORY_NAME: ${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }} + UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} + + + build_packages: + name: Build Packages + needs: [release-infos, indy_node_tests] + if: needs.release-infos.outputs.isVersionBump == 'true' + uses: pschlarb/indy-shared-gha/.github/workflows/buildpackages.yaml@parametrization + with: + DOCKER_IMAGE: ghcr.io/${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} + UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} + isDev: 'false' + isRC: '${{ needs.release-infos.outputs.isPreRelease }}' + moduleName: indy_node diff --git a/.github/workflows/test.yaml b/.github/workflows/reuseable_test.yaml similarity index 100% rename from .github/workflows/test.yaml rename to .github/workflows/reuseable_test.yaml diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml new file mode 100644 index 000000000..201d83d7a --- /dev/null +++ b/.github/workflows/tag.yaml @@ -0,0 +1,64 @@ +name: Triggered by set Tag + +on: + push: + tags: + - setRelease-v** + +jobs: + taginfos: + name: get Tag infos + runs-on: ubuntu-latest + outputs: + version: ${{ steps.get-release-info.outputs.version }} + versionTag: ${{ steps.get-release-info.outputs.versionTag }} + prBranch: ${{ steps.get-release-info.outputs.prBranch }} + BASE: ${{ steps.branch.outputs.BASE}} + steps: + - name: checkout source code + uses: actions/checkout@v1 + - name: extract branch + id: branch + run: | + raw=$(git branch -r --contains ${{ github.ref }}) + branch=${raw/origin\/} + echo ::set-output\ name=BASE::$branch + echo "::debug::BASE is being set to $branch" + - name: get-release-info + id: get-release-info + uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + with: + versionString: "${{ github.ref }}" + + + bump_version: + name: Bump Version Number + needs: taginfos + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install deps for version change + run: pip install base58 + - name: Prepare package and set version + run: | + ./bump_version.sh ${{ needs.taginfos.outputs.VERSION }} + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v3 + with: + author: ${{ github.actor }} <${{ github.event.pusher.email }}> + committer: ${{ github.actor }} <${{ github.event.pusher.email }}> + signoff: true + commit-message: Update Version number for v${{ needs.taginfos.outputs.version }} + base: ${{ needs.taginfos.outputs.BASE }} + branch: ${{ needs.taginfos.outputs.prBranch }} + title: "[${{ needs.taginfos.outputs.versionTag }}] - Update Version Number for Release" + body: "[${{ needs.taginfos.outputs.versionTag }}] - Update Version number for Release" + delete-branch: true + token: ${{ secrets.BOT_PR_PAT }} + \ No newline at end of file diff --git a/build-scripts/ubuntu-1604/Dockerfile b/build-scripts/ubuntu-1604/Dockerfile deleted file mode 100644 index 1c9f348eb..000000000 --- a/build-scripts/ubuntu-1604/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM ubuntu:16.04 - -RUN apt-get update -y && apt-get install -y \ - # common stuff - git \ - wget \ - unzip \ - python3.5 \ - python3-pip \ - python3-venv \ - # fmp - ruby \ - ruby-dev \ - rubygems \ - gcc \ - make \ - && rm -rf /var/lib/apt/lists/* - -# issues with pip>=10: -# https://github.com/pypa/pip/issues/5240 -# https://github.com/pypa/pip/issues/5221 -RUN python3 -m pip install -U pip setuptools \ - && pip3 list - -# install fpm -RUN gem install --no-ri --no-rdoc rake fpm - -WORKDIR /root - -ADD . /root diff --git a/build-scripts/ubuntu-1604/README.md b/build-scripts/ubuntu-1604/README.md deleted file mode 100644 index d972042dc..000000000 --- a/build-scripts/ubuntu-1604/README.md +++ /dev/null @@ -1,30 +0,0 @@ -### Build indy-node using docker - -``` -./build-indy-node-docker.sh -``` -Built package is placed in a docker volume `indy-node-deb-u1604`. - -### Build indy-node - -``` -./build-indy-node.sh -``` - -Built package is placed in the `output-path` folder. - -### Build 3rd-party dependencies using docker - -``` -./build-3rd-parties-docker.sh -``` - -Built packages are placed in a docker volume `indy-node-deb-u1604`. - -### Build 3rd-party dependencies - -``` -./build-3rd-parties-docker.sh -``` - -Built packages are placed in the `output-path` folder. diff --git a/build-scripts/ubuntu-1604/build-3rd-parties-docker.sh b/build-scripts/ubuntu-1604/build-3rd-parties-docker.sh deleted file mode 100755 index e333bd28a..000000000 --- a/build-scripts/ubuntu-1604/build-3rd-parties-docker.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -set -x -set -e - -if [ -z "$2" ]; then - CMD="/root/build-3rd-parties.sh /output" -else - CMD="$2" -fi - -PKG_NAME=indy-node -IMAGE_NAME="${PKG_NAME}-build-u1604" -OUTPUT_VOLUME_NAME="${1:-"${PKG_NAME}-deb-u1604"}" - -docker build -t "${PKG_NAME}-build-u1604" -f Dockerfile . -docker volume create --name "${OUTPUT_VOLUME_NAME}" - -docker run \ - -i \ - --rm \ - -v "${OUTPUT_VOLUME_NAME}:/output" \ - "${IMAGE_NAME}" \ - $CMD diff --git a/build-scripts/ubuntu-1604/build-3rd-parties.sh b/build-scripts/ubuntu-1604/build-3rd-parties.sh deleted file mode 100755 index 4b7311b73..000000000 --- a/build-scripts/ubuntu-1604/build-3rd-parties.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -x - -OUTPUT_PATH="${1:-.}" - -function build_from_pypi { - PACKAGE_NAME="$1" - - if [ -z "$2" ]; then - PACKAGE_VERSION="" - else - PACKAGE_VERSION="==$2" - fi - POSTINST_TMP="postinst-${PACKAGE_NAME}" - PREREM_TMP="prerm-${PACKAGE_NAME}" - cp postinst "${POSTINST_TMP}" - cp prerm "${PREREM_TMP}" - sed -i "s/{package_name}/python3-${PACKAGE_NAME}/" "${POSTINST_TMP}" - sed -i "s/{package_name}/python3-${PACKAGE_NAME}/" "${PREREM_TMP}" - - fpm --input-type "python" \ - --output-type "deb" \ - --architecture "amd64" \ - --verbose \ - --python-package-name-prefix "python3"\ - --python-bin "/usr/bin/python3" \ - --exclude "*.pyc" \ - --exclude "*.pyo" \ - --maintainer "Hyperledger " \ - --after-install "${POSTINST_TMP}" \ - --before-remove "${PREREM_TMP}" \ - --package "${OUTPUT_PATH}" \ - "${PACKAGE_NAME}${PACKAGE_VERSION}" - - rm "${POSTINST_TMP}" - rm "${PREREM_TMP}" -} - -# build 3rd parties: -# build_from_pypi -# TODO duplicates list from Jenkinsfile.cd - -SCRIPT_PATH="${BASH_SOURCE[0]}" -pushd `dirname ${SCRIPT_PATH}` >/dev/null - -build_from_pypi timeout-decorator 0.4.0 -build_from_pypi distro 1.3.0 - -popd >/dev/null \ No newline at end of file diff --git a/build-scripts/ubuntu-1604/build-indy-node-docker.sh b/build-scripts/ubuntu-1604/build-indy-node-docker.sh deleted file mode 100755 index f27b9bff6..000000000 --- a/build-scripts/ubuntu-1604/build-indy-node-docker.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -xe - -PKG_SOURCE_PATH="$1" -VERSION="$2" -PKG_NAME=indy-node -IMAGE_NAME="${PKG_NAME}-build-u1604" -OUTPUT_VOLUME_NAME="${3:-"${PKG_NAME}-deb-u1604"}" -PACKAGE_VERSION="${4:-$VERSION}" - -if [[ (-z "${PKG_SOURCE_PATH}") || (-z "${VERSION}") ]]; then - echo "Usage: $0 [ [package-version]]" - exit 1; -fi - -if [ -z "$5" ]; then - CMD="/root/build-${PKG_NAME}.sh /input ${VERSION} /output ${PACKAGE_VERSION}" -else - CMD="$5" -fi - -docker build -t "${IMAGE_NAME}" -f Dockerfile . -docker volume create --name "${OUTPUT_VOLUME_NAME}" - -docker run \ - -i \ - --rm \ - -v "${PKG_SOURCE_PATH}:/input" \ - -v "${OUTPUT_VOLUME_NAME}:/output" \ - -e PKG_NAME="${PKG_NAME}" \ - "${IMAGE_NAME}" \ - $CMD diff --git a/build-scripts/ubuntu-1604/build-indy-node.sh b/build-scripts/ubuntu-1604/build-indy-node.sh deleted file mode 100755 index 5ac86fc2f..000000000 --- a/build-scripts/ubuntu-1604/build-indy-node.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -xe - -INPUT_PATH="$1" -VERSION="$2" -OUTPUT_PATH="${3:-.}" -PACKAGE_VERSION=${4:-$VERSION} - -PACKAGE_NAME=indy-node - -# copy the sources to a temporary folder -TMP_DIR="$(mktemp -d)" -cp -r "${INPUT_PATH}/." "${TMP_DIR}" - -# prepare the sources -cd "${TMP_DIR}/build-scripts/ubuntu-1604" -./prepare-package.sh "${TMP_DIR}" indy_node "${VERSION}" debian-packages - - -sed -i "s/{package_name}/${PACKAGE_NAME}/" "prerm" - -fpm --input-type "python" \ - --output-type "deb" \ - --architecture "amd64" \ - --verbose \ - --python-package-name-prefix "python3" \ - --python-bin "/usr/bin/python3" \ - --exclude "*.pyc" \ - --exclude "*.pyo" \ - --depends at \ - --depends iptables \ - --depends libsodium18 \ - --no-python-fix-dependencies \ - --maintainer "Hyperledger " \ - --before-install "preinst_node" \ - --after-install "postinst_node" \ - --before-remove "prerm" \ - --name "${PACKAGE_NAME}" \ - --version ${PACKAGE_VERSION} \ - --package "${OUTPUT_PATH}" \ - "${TMP_DIR}" - -rm -rf "${TMP_DIR}" diff --git a/build-scripts/ubuntu-1604/postinst b/build-scripts/ubuntu-1604/postinst deleted file mode 100755 index cf749a657..000000000 --- a/build-scripts/ubuntu-1604/postinst +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# Automatically added from template: -if which py3compile >/dev/null 2>&1; then - py3compile -O -p {package_name} /usr/local/lib/python3.5/dist-packages/ -fi - -# End automatically added section diff --git a/build-scripts/ubuntu-1604/postinst_node b/build-scripts/ubuntu-1604/postinst_node deleted file mode 100755 index a13ddcad6..000000000 --- a/build-scripts/ubuntu-1604/postinst_node +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash - -# it should be fixed -ENABLE_STDOUT_LOGGING="enableStdOutLogging" -GENERAL_CONFIG_DIR="/etc/indy" -GENERAL_DATA_DIR="/var/lib/indy" -GENERAL_LOG_DIR="/var/log/indy" - -INSTALL_DIR='/usr/local/lib/python3.5/dist-packages' - -NOFILES_SOFT_LIMIT=65536 -NOFILES_HARD_LIMIT=131072 - -CLIENT_CONNECTIONS_LIMIT=500 - - -# create general indy config folder if does not exist -mkdir -p $GENERAL_CONFIG_DIR -# create general indy data folder if does not exist -mkdir -p $GENERAL_DATA_DIR -# create general indy log folder if does not exist -mkdir -p $GENERAL_LOG_DIR - -# create indy node config if does not exist -if [ ! -f $GENERAL_CONFIG_DIR/indy_config.py ]; then - cp $INSTALL_DIR/indy_node/general_config/indy_config.py $GENERAL_CONFIG_DIR -else - if [ -z "$(grep $ENABLE_STDOUT_LOGGING $GENERAL_CONFIG_DIR/indy_config.py)" ]; then - printf "\n%s\n%s\n" "# Disable stdout logging" "$ENABLE_STDOUT_LOGGING = False" >> $GENERAL_CONFIG_DIR/indy_config.py - fi -fi - -chmod -R ug+rwx $GENERAL_CONFIG_DIR -chmod -R ug+rwx $GENERAL_DATA_DIR -chmod -R ug+rwx $GENERAL_LOG_DIR - - -# init_indy_node script -cat < /usr/local/bin/init_indy_node -#!/bin/bash - -if [ \$# -lt 5 ]; then - echo "" - echo "Usage: \$0 name ip port client_ip client_port [seed]"; - echo " name - node name"; - echo " ip - node IP"; - echo " port - node port"; - echo " client_ip - node client IP"; - echo " client_port - node client port"; - echo " seed - node seed"; - echo "" - exit 1; -fi - -echo "NODE_NAME=\$1" > $GENERAL_CONFIG_DIR/indy.env -echo "NODE_IP=\$2" >> $GENERAL_CONFIG_DIR/indy.env -echo "NODE_PORT=\$3" >> $GENERAL_CONFIG_DIR/indy.env -echo "NODE_CLIENT_IP=\$4" >> $GENERAL_CONFIG_DIR/indy.env -echo "NODE_CLIENT_PORT=\$5" >> $GENERAL_CONFIG_DIR/indy.env -echo "CLIENT_CONNECTIONS_LIMIT=$CLIENT_CONNECTIONS_LIMIT" >> $GENERAL_CONFIG_DIR/indy.env - -if [ -z \$6 ]; then - init_indy_keys --name \$1 -else - init_indy_keys --name \$1 --seed \$6 -fi -EOF - -chmod +x /usr/local/bin/init_indy_node - -# add systemd script -cat < /etc/systemd/system/indy-node.service -[Unit] -Description=Indy Node -Requires=indy-node-control.service - -[Service] -EnvironmentFile=$GENERAL_CONFIG_DIR/indy.env -ExecStart=/usr/bin/env python3 -O /usr/local/bin/start_indy_node \${NODE_NAME} \${NODE_IP} \${NODE_PORT} \${NODE_CLIENT_IP} \${NODE_CLIENT_PORT} -User=indy -Group=indy -Restart=on-failure -RestartSec=10 -StartLimitBurst=10 -StartLimitInterval=200 -TimeoutSec=300 -LimitNOFILE=$NOFILES_SOFT_LIMIT:$NOFILES_HARD_LIMIT - -[Install] -WantedBy=multi-user.target -EOF - - -cat < /etc/systemd/system/indy-node-control.service -[Unit] -Description=Service for upgrade of existing Indy Node and other operations -#Requires=indy.service -#After=indy.service -After=network.target - -[Service] -Type=simple -EnvironmentFile=$GENERAL_CONFIG_DIR/node_control.conf -ExecStart=/usr/bin/env python3 -O /usr/local/bin/start_node_control_tool \$TEST_MODE --hold-ext \${HOLD_EXT} -Restart=on-failure -RestartSec=10 -StartLimitBurst=10 -StartLimitInterval=200 -TimeoutSec=300 - -[Install] -WantedBy=multi-user.target -EOF - -# add supervisord script -cat < /etc/supervisor/indy-node.conf -[supervisord] -nodaemon=true -logfile=/var/log/indy/supervisord.log -logfile_maxbytes=10MB -loglevel=critical - -[supervisorctl] -serverurl=http://127.0.0.1:9001 - -[inet_http_server] -port = 127.0.0.1:9001 - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[program:indy-node] -command=sh -ac '. $GENERAL_CONFIG_DIR/indy.env;/usr/bin/env python3 -O /usr/local/bin/start_indy_node \${NODE_NAME} \${NODE_IP} \${NODE_PORT} \${NODE_CLIENT_IP} \${NODE_CLIENT_PORT}' -user=indy -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startsecs=15 -startretries=6 -stopasgroup=true -killasgroup=true - -[program:indy-node-control] -command=sh -ac '. $GENERAL_CONFIG_DIR/node_control.conf;/usr/bin/env python3 -O /usr/local/bin/start_node_control_tool \${TEST_MODE} --hold-ext "\${HOLD_EXT}"' -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -autorestart=true -startsecs=15 -startretries=6 -stopasgroup=true -killasgroup=true -EOF - -HOLD_EXT_ADDED=$(grep HOLD_EXT /etc/indy/node_control.conf) -if [ ! -f $GENERAL_CONFIG_DIR/node_control.conf ] || [ -z "${HOLD_EXT_ADDED}" ]; then - cat < $GENERAL_CONFIG_DIR/node_control.conf -# Uncomment this to run agent in test mode: -#TEST_MODE=--test - -TEST_MODE= -HOLD_EXT= -EOF -fi -sed -ie '/HOLD_EXT/{ s/\\//g}' $GENERAL_CONFIG_DIR/node_control.conf - -mv /usr/local/bin/upgrade_indy_node_ubuntu1604.sh /usr/local/bin/upgrade_indy_node -mv /usr/local/bin/upgrade_indy_node_ubuntu1604_test.sh /usr/local/bin/upgrade_indy_node_test -mv /usr/local/bin/restart_indy_node_ubuntu1604.sh /usr/local/bin/restart_indy_node -mv /usr/local/bin/restart_sovrin_node_ubuntu1604.sh /usr/local/bin/restart_sovrin_node -mv /usr/local/bin/complete_rebranding_upgrade_ubuntu1604.sh /usr/local/bin/complete_rebranding_upgrade - -chmod +x /usr/local/bin/upgrade_indy_node -chmod +x /usr/local/bin/upgrade_indy_node_test -chmod +x /usr/local/bin/restart_indy_node -chmod +x /usr/local/bin/restart_sovrin_node -chmod +x /usr/local/bin/complete_rebranding_upgrade - -rm -f /usr/local/bin/delete_indy_node.bat /usr/local/bin/upgrade_indy_node_test.bat \ - /usr/local/bin/restart_indy_node.bat /usr/local/bin/install_nssm.bat /usr/local/bin/upgrade_indy_node.bat \ - /usr/local/bin/install_indy_node.bat /usr/local/bin/restart_upgrade_agent.bat - -chown -R indy:indy $GENERAL_CONFIG_DIR -chown -R indy:indy $GENERAL_DATA_DIR -chown -R indy:indy $GENERAL_LOG_DIR -chmod -R ug+rw $GENERAL_CONFIG_DIR -chmod -R ug+rw $GENERAL_DATA_DIR -chmod -R ug+rw $GENERAL_LOG_DIR - -# Automatically added from template: -if which py3compile >/dev/null 2>&1; then - py3compile -O -p indy-node $INSTALL_DIR -fi - -# End automatically added section diff --git a/build-scripts/ubuntu-1604/preinst_node b/build-scripts/ubuntu-1604/preinst_node deleted file mode 100755 index 4e1addfb6..000000000 --- a/build-scripts/ubuntu-1604/preinst_node +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -if ! id -u indy > /dev/null 2>&1; then - useradd -r -m -s /bin/bash -U indy -fi diff --git a/build-scripts/ubuntu-1604/prepare-package.sh b/build-scripts/ubuntu-1604/prepare-package.sh deleted file mode 100755 index 50d827506..000000000 --- a/build-scripts/ubuntu-1604/prepare-package.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -xe - -if [ "$1" = "--help" ] ; then - echo "Usage: $0 " - echo " - Set to 'debian-packages' when preparing deb packages, and 'python-packages' when preparing PyPi packages." - exit 0 -fi - -repo="$1" -module_name="$2" -version_dotted="$3" -distro_packages="$4" - -BUMP_SH_SCRIPT="bump_version.sh" -GENERATE_MANIFEST_SCRIPT="generate_manifest.sh" - -pushd $repo - -echo -e "\nSetting version to $version_dotted" -bash -ex $BUMP_SH_SCRIPT $version_dotted -cat $module_name/__version__.json - -echo -e "\nGenerating manifest" -bash -ex $GENERATE_MANIFEST_SCRIPT -cat $module_name/__manifest__.json - -echo -e "\n\nPrepares indy-node debian package version" -sed -i -r "s~indy-node==([0-9\.]+[0-9])(\.)?([a-z]+)~indy-node==\1\~\3~" setup.py - -if [ "$distro_packages" = "debian-packages" ]; then - # Only used for the deb package builds, NOT for the PyPi package builds. - # Update the package names to match the versions that are pre-installed on the os. - echo -e "\nAdapt the dependencies for the Canonical archive" - #### ToDo adjust packages for the Cannonical archive for Ubuntu 20.04 (focal) - # sed -i "s~timeout-decorator~python3-timeout-decorator~" setup.py - # sed -i "s~distro~python3-distro~" setup.py -elif [ "$distro_packages" = "python-packages" ]; then - echo -e "\nNo adaption of dependencies for python packages" -else - echo -e "\nNo distribution specified. Please, specify distribution as 'debian-packages' or 'python-packages'." - exit 1 -fi - -echo "Preparing config files" -GENERAL_CONFIG_DIR="\/etc\/indy" -REPO_GENERAL_CONFIG_DIR="indy_node/general_config" -# Define user config directory -sed -i "s/^\(GENERAL_CONFIG_DIR\s*=\s*\).*\$/\1\"$GENERAL_CONFIG_DIR\"/" indy_common/config.py -# Create user config -cp $REPO_GENERAL_CONFIG_DIR/general_config.py $REPO_GENERAL_CONFIG_DIR/indy_config.py -cat $REPO_GENERAL_CONFIG_DIR/ubuntu_platform_config.py >> $REPO_GENERAL_CONFIG_DIR/indy_config.py -rm -f $REPO_GENERAL_CONFIG_DIR/general_config.py -rm -f $REPO_GENERAL_CONFIG_DIR/ubuntu_platform_config.py -rm -f $REPO_GENERAL_CONFIG_DIR/windows_platform_config.py - -popd - -echo -e "\nFinished preparing $repo for publishing\n" diff --git a/build-scripts/ubuntu-1604/prerm b/build-scripts/ubuntu-1604/prerm deleted file mode 100755 index 40af9b22a..000000000 --- a/build-scripts/ubuntu-1604/prerm +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Automatically added from template: - -dpkg -L {package_name} | perl -ne 's,/([^/]*)\.py$,/__pycache__/\1.*, or next; unlink $_ or die $! foreach glob($_)' - -# End automatically added section \ No newline at end of file diff --git a/build-scripts/ubuntu-2004/build-indy-node.sh b/build-scripts/ubuntu-2004/build-indy_node.sh similarity index 100% rename from build-scripts/ubuntu-2004/build-indy-node.sh rename to build-scripts/ubuntu-2004/build-indy_node.sh From 4b3739350ad378f52a90e854876fdc8e515d2580 Mon Sep 17 00:00:00 2001 From: pSchlarb <87540518+pSchlarb@users.noreply.github.com> Date: Thu, 7 Apr 2022 16:19:33 +0000 Subject: [PATCH 02/10] Update Version number for v1.14.0rc1 Signed-off-by: pSchlarb <87540518+pSchlarb@users.noreply.github.com> --- indy_node/__version__.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indy_node/__version__.json b/indy_node/__version__.json index 1319e6fe2..822555dcb 100644 --- a/indy_node/__version__.json +++ b/indy_node/__version__.json @@ -1 +1 @@ -[1, 13, 0, "dev", 0] +[1, 14, 0, "rc", 1] From 3f3e6c6c318eb08bf18444e96433eebb4d162e92 Mon Sep 17 00:00:00 2001 From: pSchlarb Date: Wed, 20 Apr 2022 10:18:47 +0000 Subject: [PATCH 03/10] Added PlenumDependencyWF Signed-off-by: pSchlarb --- .github/actions/getNewNodeVersion/action.yaml | 30 +++++++++ .github/workflows/updatePlenumDependency.yaml | 66 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 .github/actions/getNewNodeVersion/action.yaml create mode 100644 .github/workflows/updatePlenumDependency.yaml diff --git a/.github/actions/getNewNodeVersion/action.yaml b/.github/actions/getNewNodeVersion/action.yaml new file mode 100644 index 000000000..8376fb7a0 --- /dev/null +++ b/.github/actions/getNewNodeVersion/action.yaml @@ -0,0 +1,30 @@ +name: "Get New NodeVersion" +description: "Sets version parameters and makes them available as outputs for subsequent processes." + +inputs: + isRC: + description: "A flag indicating whether or not this is a release candidate build; set to either 'true' or 'false'." + required: true + default: true + +outputs: + nodeVersion: + description: "The new Version. (Bumped Patch by 1)" + value: ${{ steps.versions.outputs.nodeVersion }} + +runs: + using: "composite" + steps: + - uses: actions/checkout@v3 + - name: Get Versions + id: versions + shell: bash + run: | + major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") + minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") + patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") + if [[ "${{ inputs.isRC }}" == "true" ]]; then + echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 + else + echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} + fi \ No newline at end of file diff --git a/.github/workflows/updatePlenumDependency.yaml b/.github/workflows/updatePlenumDependency.yaml new file mode 100644 index 000000000..79417c56c --- /dev/null +++ b/.github/workflows/updatePlenumDependency.yaml @@ -0,0 +1,66 @@ +name: Update Plenum Dependency + +on: + push: + tags: + - setPlenum-v** + +jobs: + taginfos: + name: get Tag infos + runs-on: ubuntu-latest + outputs: + version: ${{ steps.get-release-info.outputs.version }} + isPreRelease: ${{ steps.get-release-info.outputs.isRC }} + Branch: ${{ steps.setPRBranch.outputs.prBranch }} + BASE: ${{ steps.branch.outputs.BASE}} + nodeVersion: ${{ steps.nodeVersion.outputs.nodeVersion}} + steps: + - name: checkout source code + uses: actions/checkout@v3 + - name: extract branch + id: branch + run: | + raw=$(git branch -r --contains ${{ github.ref }}) + branch=${raw/origin\/} + echo ::set-output\ name=BASE::$branch + echo "::debug::BASE is being set to $branch" + - name: get-release-info + id: get-release-info + uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + with: + versionString: "${{ github.ref }}" + - name: setPRBranch + id: setPRBranch + run: | + if [[ "${{ steps.get-release-info.outputs.isRC }}" == "true" ]]; then + echo ::set-output\ name=prBranch::update-plenum-rc-version + else + echo ::set-output\ name=prBranch::update-plenum-version + fi + - name: Get new Node Version + id: nodeVersion + uses: ./.github/actions/getNewNodeVersion + with: + isRC: ${{ steps.get-release-info.outputs.isRC }} + + updateAndCommit: + runs-on: ubuntu-latest + needs: taginfos + steps: + - name: checkout source code + uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_PR_PAT }} + - name: Update Setup.py + run: | + sed -E -i 's/indy-plenum==[[:digit:]]+.[[:digit:]]+.[[:digit:]]+(.(dev|rc)[[:digit:]]+)?/indy-plenum==${{needs.taginfos.outputs.version}}/g' setup.py + - name: CommitAndTag + uses: EndBug/add-and-commit@v9 + with: + author_name: ${{ github.actor }} + author_email: ${{ github.event.pusher.email }} + commit: --signoff + message: 'Update Plenum Dependency to ${{needs.taginfos.outputs.version}}' + new_branch: ${{ needs.taginfos.outputs.Branch}} + tag: "setRelease-v${{needs.taginfos.outputs.nodeVersion}}" \ No newline at end of file From 66f1a9f0b8185e9f1b79afcb5939d1d129c6c971 Mon Sep 17 00:00:00 2001 From: pSchlarb Date: Wed, 20 Apr 2022 10:19:06 +0000 Subject: [PATCH 04/10] Pip get_installed_distributions fix Signed-off-by: pSchlarb --- indy_node/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/indy_node/__init__.py b/indy_node/__init__.py index e231f2a84..17c0aa94a 100644 --- a/indy_node/__init__.py +++ b/indy_node/__init__.py @@ -4,6 +4,7 @@ __author_email__, __maintainer__, __license__, load_version, set_version, load_manifest, set_manifest ) +import pkg_resources PLUGIN_LEDGER_IDS = set() PLUGIN_CLIENT_REQUEST_FIELDS = {} From bf6fbec265b169debc0497d923563940e3cd7ab8 Mon Sep 17 00:00:00 2001 From: pSchlarb Date: Wed, 20 Apr 2022 10:32:16 +0000 Subject: [PATCH 05/10] test old newnodeVersion Signed-off-by: pSchlarb --- .github/actions/getNewNodeVersion/action.yaml | 2 +- .github/workflows/updatePlenumDependency.yaml | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/actions/getNewNodeVersion/action.yaml b/.github/actions/getNewNodeVersion/action.yaml index 8376fb7a0..834b79c71 100644 --- a/.github/actions/getNewNodeVersion/action.yaml +++ b/.github/actions/getNewNodeVersion/action.yaml @@ -5,7 +5,7 @@ inputs: isRC: description: "A flag indicating whether or not this is a release candidate build; set to either 'true' or 'false'." required: true - default: true + default: "true" outputs: nodeVersion: diff --git a/.github/workflows/updatePlenumDependency.yaml b/.github/workflows/updatePlenumDependency.yaml index 79417c56c..8f73bd8f8 100644 --- a/.github/workflows/updatePlenumDependency.yaml +++ b/.github/workflows/updatePlenumDependency.yaml @@ -38,11 +38,28 @@ jobs: else echo ::set-output\ name=prBranch::update-plenum-version fi - - name: Get new Node Version - id: nodeVersion - uses: ./.github/actions/getNewNodeVersion + - name: Set up Python + uses: actions/setup-python@v2 with: - isRC: ${{ steps.get-release-info.outputs.isRC }} + python-version: '3.8' + # - name: Install deps for version change + # run: pip install base58 + - name: Get New Node Version + id: nodeVersion + run: | + major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") + minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") + patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") + if [[ "${{ inputs.isRC }}" == "true" ]]; then + echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 + else + echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} + fi + # - name: Get new Node Version + # id: nodeVersion + # uses: ./.github/actions/getNewNodeVersion + # with: + # isRC: ${{ steps.get-release-info.outputs.isRC }} updateAndCommit: runs-on: ubuntu-latest @@ -62,5 +79,6 @@ jobs: author_email: ${{ github.event.pusher.email }} commit: --signoff message: 'Update Plenum Dependency to ${{needs.taginfos.outputs.version}}' + push: "origin ${{ needs.taginfos.outputs.Branch}} --set-upstream --force" new_branch: ${{ needs.taginfos.outputs.Branch}} tag: "setRelease-v${{needs.taginfos.outputs.nodeVersion}}" \ No newline at end of file From 814ba493e37c404cd79b5bf30e5f7acf4ba32291 Mon Sep 17 00:00:00 2001 From: pSchlarb Date: Wed, 20 Apr 2022 11:34:40 +0000 Subject: [PATCH 06/10] getNodeVersionAction Signed-off-by: pSchlarb --- .github/actions/getNewNodeVersion/action.yaml | 4 ++ .github/workflows/updatePlenumDependency.yaml | 40 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.github/actions/getNewNodeVersion/action.yaml b/.github/actions/getNewNodeVersion/action.yaml index 834b79c71..1a8b1d073 100644 --- a/.github/actions/getNewNodeVersion/action.yaml +++ b/.github/actions/getNewNodeVersion/action.yaml @@ -16,6 +16,10 @@ runs: using: "composite" steps: - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' - name: Get Versions id: versions shell: bash diff --git a/.github/workflows/updatePlenumDependency.yaml b/.github/workflows/updatePlenumDependency.yaml index 8f73bd8f8..70b8f92c9 100644 --- a/.github/workflows/updatePlenumDependency.yaml +++ b/.github/workflows/updatePlenumDependency.yaml @@ -38,28 +38,26 @@ jobs: else echo ::set-output\ name=prBranch::update-plenum-version fi - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - # - name: Install deps for version change - # run: pip install base58 - - name: Get New Node Version - id: nodeVersion - run: | - major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") - minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") - patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") - if [[ "${{ inputs.isRC }}" == "true" ]]; then - echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 - else - echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} - fi - # - name: Get new Node Version - # id: nodeVersion - # uses: ./.github/actions/getNewNodeVersion + # - name: Set up Python + # uses: actions/setup-python@v2 # with: - # isRC: ${{ steps.get-release-info.outputs.isRC }} + # python-version: '3.8' + # - name: Get New Node Version + # id: nodeVersion + # run: | + # major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") + # minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") + # patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") + # if [[ "${{ inputs.isRC }}" == "true" ]]; then + # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 + # else + # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} + # fi + - name: Get new Node Version + id: nodeVersion + uses: ./.github/actions/getNewNodeVersion + with: + isRC: ${{ steps.get-release-info.outputs.isRC }} updateAndCommit: runs-on: ubuntu-latest From f63ff840649ac1c51158d45ba98f80329244ebcb Mon Sep 17 00:00:00 2001 From: Philipp Schlarb Date: Tue, 10 May 2022 15:41:30 +0200 Subject: [PATCH 07/10] fixed references, Release Workflow Diagram Polishing for PR Signed-off-by: Philipp Schlarb --- .github/workflows/{push_pr.yaml => PR.yaml} | 17 ++- .github/workflows/Push.yaml | 75 ++++++++++++ .github/workflows/README.md | 20 ++-- .../workflows/WIPupdatePlenumDependency.yaml | 83 +++++++++++++ .../workflows/build/Dockerfile.ubuntu-1604 | 30 ----- .github/workflows/buildimage.yaml | 75 ------------ .github/workflows/buildpackages.yaml | 111 ------------------ .github/workflows/publishRelease.yaml | 6 +- .github/workflows/publish_artifacts.yaml | 83 ------------- .github/workflows/releasepr.yaml | 10 +- .github/workflows/tag.yaml | 2 +- .github/workflows/updatePlenumDependency.yaml | 82 ------------- docs/source/release-workflow.png | Bin 0 -> 146883 bytes docs/source/release-workflow.puml | 81 +++++++++++++ indy_node/__init__.py | 1 - indy_node/__version__.json | 2 +- 16 files changed, 265 insertions(+), 413 deletions(-) rename .github/workflows/{push_pr.yaml => PR.yaml} (82%) create mode 100644 .github/workflows/Push.yaml create mode 100644 .github/workflows/WIPupdatePlenumDependency.yaml delete mode 100644 .github/workflows/build/Dockerfile.ubuntu-1604 delete mode 100644 .github/workflows/buildimage.yaml delete mode 100644 .github/workflows/buildpackages.yaml delete mode 100644 .github/workflows/publish_artifacts.yaml delete mode 100644 .github/workflows/updatePlenumDependency.yaml create mode 100644 docs/source/release-workflow.png create mode 100644 docs/source/release-workflow.puml diff --git a/.github/workflows/push_pr.yaml b/.github/workflows/PR.yaml similarity index 82% rename from .github/workflows/push_pr.yaml rename to .github/workflows/PR.yaml index d152758e3..8daa03daa 100644 --- a/.github/workflows/push_pr.yaml +++ b/.github/workflows/PR.yaml @@ -1,14 +1,11 @@ name: Indy Node - Push and PR Workflow on: - push: - branches: - - ubuntu-20.04-upgrade - - feature/did-indy* - pull_request: branches: - ubuntu-20.04-upgrade - feature/did-indy* + paths: + - '**.py' workflow_dispatch: jobs: @@ -30,16 +27,16 @@ jobs: uses: actions/checkout@v2 - name: setup id: setup - uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/workflow-setup@main lint: name: Lint - uses: pschlarb/indy-shared-gha/.github/workflows/lint.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/lint.yaml@main build-image: name: Create Builder Image needs: [workflow-setup, lint] - uses: pschlarb/indy-shared-gha/.github/workflows/buildimage.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/buildimage.yaml@main with: CACHE_KEY_BUILD: ${{ needs.workflow-setup.outputs.CACHE_KEY_BUILD }} DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build @@ -56,7 +53,7 @@ jobs: build_packages: name: Build Packages needs: [workflow-setup, indy_node_tests] - uses: pschlarb/indy-shared-gha/.github/workflows/buildpackages.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/buildpackages.yaml@main with: DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} @@ -68,7 +65,7 @@ jobs: name: Publish Artifacts needs: [workflow-setup, build_packages] if: needs.workflow-setup.outputs.publish == 'true' - uses: pschlarb/indy-shared-gha/.github/workflows/publish_artifacts.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/publish_artifacts.yaml@main with: COMPONENT: 'dev' UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} diff --git a/.github/workflows/Push.yaml b/.github/workflows/Push.yaml new file mode 100644 index 000000000..13126bda9 --- /dev/null +++ b/.github/workflows/Push.yaml @@ -0,0 +1,75 @@ +name: Indy Node - Push and PR Workflow +on: + push: + branches: + - ubuntu-20.04-upgrade + - feature/did-indy* + paths: + - '**.py' + +jobs: + workflow-setup: + name: Initialize Workflow + runs-on: ubuntu-latest + outputs: + CACHE_KEY_BUILD: ${{ steps.setup.outputs.CACHE_KEY_BUILD }} + UBUNTU_VERSION: ${{ steps.setup.outputs.UBUNTU_VERSION }} + # Expose the lowercase version of the GitHub repository name + # to all subsequent jobs that reference image repositories + # as the push and pull operations require the URL of the repository + # to be in lowercase. + GITHUB_REPOSITORY_NAME: ${{ steps.setup.outputs.GITHUB_REPOSITORY_NAME }} + distribution: ${{ steps.setup.outputs.distribution }} + publish: ${{ steps.setup.outputs.publish }} + steps: + - name: checkout source code + uses: actions/checkout@v2 + - name: setup + id: setup + uses: hyperledger/indy-shared-gha/.github/actions/workflow-setup@main + + lint: + name: Lint + uses: hyperledger/indy-shared-gha/.github/workflows/lint.yaml@main + + build-image: + name: Create Builder Image + needs: [workflow-setup, lint] + uses: hyperledger/indy-shared-gha/.github/workflows/buildimage.yaml@main + with: + CACHE_KEY_BUILD: ${{ needs.workflow-setup.outputs.CACHE_KEY_BUILD }} + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build + UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} + + indy_node_tests: + name: Indy Node Tests + needs: [workflow-setup, build-image] + uses: ./.github/workflows/reuseable_test.yaml + with: + GITHUB_REPOSITORY_NAME: ${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} + UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} + + build_packages: + name: Build Packages + needs: [workflow-setup, indy_node_tests] + uses: hyperledger/indy-shared-gha/.github/workflows/buildpackages.yaml@main + with: + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} + UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} + isDev: true + isRC: false + moduleName: indy_node + + publish_artifacts: + name: Publish Artifacts + needs: [workflow-setup, build_packages] + if: needs.workflow-setup.outputs.publish == 'true' + uses: hyperledger/indy-shared-gha/.github/workflows/publish_artifacts.yaml@main + with: + COMPONENT: 'dev' + UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} + distribution: ${{ needs.workflow-setup.outputs.distribution }} + moduleName: indy_node + secrets: + INDY_ARTIFACTORY_REPO_CONFIG: ${{ secrets.INDY_ARTIFACTORY_REPO_CONFIG }} + PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 05c141f22..a7db6f885 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,13 +1,11 @@ -# GitHub Actions Workflow +# GitHub Actions Workflows -The workflow in the [push_pr.yaml](push_pr.yaml) file runs on push and pull requests to the ubuntu-20-04-upgrade branch. -It uses the following reusable workflows in this folder. +The [PR](PR.yaml) workflow runs on Pull Requests to the ubuntu-20.04-upgrade branch, +which only contain changes to python files. If no python file is affected it doesn't run. +The same applies to the [Push](Push.yaml) workflow respectively for pushes. -+ [buildimage.yaml](buildimage.yaml) - This workflow builds the dockerimages and pushes them to the GHCR. -+ [test.yaml](test.yaml) - This workflow runs the tests inside the uploaded docker images. -+ [buildpackages.yaml](buildpackages.yaml) - This workflows builds the python and debian packages. It also uploads them to the workflow. -+ [publish_artifacts.yaml](publish_artifacts.yaml) - This workflow uploads the packages to PYPI and Artifactory. \ No newline at end of file +The [tag](tag.yaml), [releasepr](releasepr.yaml) and [publishRelease](publishRelease.yaml) workflows are used for the new [Release Workflow](../../docs/release-workflow.png). +They use reuseable workflows from the [indy-shared-gha](https://github.com/hyperledger) repository and the following workflow in this folder. + ++ [reuseable_test.yaml](reuseable_test.yaml) + This workflow runs the tests inside the uploaded docker images. \ No newline at end of file diff --git a/.github/workflows/WIPupdatePlenumDependency.yaml b/.github/workflows/WIPupdatePlenumDependency.yaml new file mode 100644 index 000000000..1cac61b41 --- /dev/null +++ b/.github/workflows/WIPupdatePlenumDependency.yaml @@ -0,0 +1,83 @@ +# WIP to Update node after a plenum update has occured +# name: Update Plenum Dependency + +# on: +# push: +# tags: +# - setPlenum-v** + +# jobs: +# taginfos: +# name: get Tag infos +# runs-on: ubuntu-latest +# outputs: +# version: ${{ steps.get-release-info.outputs.version }} +# isPreRelease: ${{ steps.get-release-info.outputs.isRC }} +# Branch: ${{ steps.setPRBranch.outputs.prBranch }} +# BASE: ${{ steps.branch.outputs.BASE}} +# nodeVersion: ${{ steps.nodeVersion.outputs.nodeVersion}} +# steps: +# - name: checkout source code +# uses: actions/checkout@v3 +# - name: extract branch +# id: branch +# run: | +# raw=$(git branch -r --contains ${{ github.ref }}) +# branch=${raw/origin\/} +# echo ::set-output\ name=BASE::$branch +# echo "::debug::BASE is being set to $branch" +# - name: get-release-info +# id: get-release-info +# uses: hyperledger/indy-shared-gha/.github/actions/get-release-info@main +# with: +# versionString: "${{ github.ref }}" +# - name: setPRBranch +# id: setPRBranch +# run: | +# if [[ "${{ steps.get-release-info.outputs.isRC }}" == "true" ]]; then +# echo ::set-output\ name=prBranch::update-plenum-rc-version +# else +# echo ::set-output\ name=prBranch::update-plenum-version +# fi +# # - name: Set up Python +# # uses: actions/setup-python@v2 +# # with: +# # python-version: '3.8' +# # - name: Get New Node Version +# # id: nodeVersion +# # run: | +# # major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") +# # minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") +# # patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") +# # if [[ "${{ inputs.isRC }}" == "true" ]]; then +# # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 +# # else +# # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} +# # fi +# - name: Get new Node Version +# id: nodeVersion +# uses: ./.github/actions/getNewNodeVersion +# with: +# isRC: ${{ steps.get-release-info.outputs.isRC }} + +# updateAndCommit: +# runs-on: ubuntu-latest +# needs: taginfos +# steps: +# - name: checkout source code +# uses: actions/checkout@v3 +# with: +# token: ${{ secrets.BOT_PR_PAT }} +# - name: Update Setup.py +# run: | +# sed -E -i 's/indy-plenum==[[:digit:]]+.[[:digit:]]+.[[:digit:]]+(.(dev|rc)[[:digit:]]+)?/indy-plenum==${{needs.taginfos.outputs.version}}/g' setup.py +# - name: CommitAndTag +# uses: EndBug/add-and-commit@v9 +# with: +# author_name: ${{ github.actor }} +# author_email: ${{ github.event.pusher.email }} +# commit: --signoff +# message: 'Update Plenum Dependency to ${{needs.taginfos.outputs.version}}' +# push: "origin ${{ needs.taginfos.outputs.Branch}} --set-upstream --force" +# new_branch: ${{ needs.taginfos.outputs.Branch}} +# tag: "setRelease-v${{needs.taginfos.outputs.nodeVersion}}" \ No newline at end of file diff --git a/.github/workflows/build/Dockerfile.ubuntu-1604 b/.github/workflows/build/Dockerfile.ubuntu-1604 deleted file mode 100644 index 898d7b430..000000000 --- a/.github/workflows/build/Dockerfile.ubuntu-1604 +++ /dev/null @@ -1,30 +0,0 @@ -FROM hyperledger/indy-core-baseci:0.0.4 - -LABEL maintainer="Hyperledger " - -RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 \ - && apt-get update -y \ - && apt-get install -y \ - python3-nacl \ - libindy-crypto=0.4.5 \ - libindy=1.15.0~1625-xenial \ -# rocksdb python wrapper - libbz2-dev \ - zlib1g-dev \ - liblz4-dev \ - libsnappy-dev \ - rocksdb=5.8.8 \ - ursa=0.3.2-2 \ -# Build dependencies - ruby \ - ruby-dev \ - rubygems \ - gcc \ - make \ -# zstd is needed for caching in github actions pipeline - zstd - -# install fpm -RUN gem install --no-ri --no-rdoc rake fpm - -RUN indy_image_clean \ No newline at end of file diff --git a/.github/workflows/buildimage.yaml b/.github/workflows/buildimage.yaml deleted file mode 100644 index 9b4b110c2..000000000 --- a/.github/workflows/buildimage.yaml +++ /dev/null @@ -1,75 +0,0 @@ -name: "Build Docker Image" - -on: - workflow_call: - inputs: - CACHE_KEY_BUILD: - required: true - type: string - GITHUB_REPOSITORY_NAME: - required: true - type: string - UBUNTU_VERSION: - required: true - type: string - -jobs: - build-image: - name: Create Builder Image - runs-on: ubuntu-latest - env: - CACHE_KEY_BUILD: ${{ inputs.CACHE_KEY_BUILD }} - GITHUB_REPOSITORY_NAME: ${{ inputs.GITHUB_REPOSITORY_NAME }} - UBUNTU_VERSION: ${{ inputs.UBUNTU_VERSION }} - steps: - - name: Git checkout - uses: actions/checkout@v2 - - - name: Try load from cache - id: cache-image - uses: actions/cache@v2 - with: - path: ${GITHUB_WORKSPACE}/cache - key: ${{ env.CACHE_KEY_BUILD}} - - - name: Prepare image labels and tags - if: steps.cache-image.outputs.cache-hit != 'true' - id: prep - shell: bash - run: | - DOCKER_IMAGE=ghcr.io/${{ env.GITHUB_REPOSITORY_NAME }}/node-build - TAGS="${DOCKER_IMAGE}:latest,${DOCKER_IMAGE}:${{ env.UBUNTU_VERSION }}" - echo ::set-output name=tags::${TAGS} - echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ') - - - name: Log into the GitHub Container Registry - if: steps.cache-image.outputs.cache-hit != 'true' - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - if: steps.cache-image.outputs.cache-hit != 'true' - uses: docker/setup-buildx-action@v1 - - - name: Build and push image - if: steps.cache-image.outputs.cache-hit != 'true' - uses: docker/build-push-action@v2 - with: - context: . - file: .github/workflows/build/Dockerfile.${{ env.UBUNTU_VERSION }} - no-cache: true - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.prep.outputs.tags }} - labels: | - org.opencontainers.image.source=${{ github.event.repository.html_url }} - org.opencontainers.image.created=${{ steps.prep.outputs.created }} - org.opencontainers.image.revision=${{ github.sha }} - - - name: Touch Cache - if: steps.cache-image.outputs.cache-hit != 'true' - run: | - mkdir -p ${GITHUB_WORKSPACE}/cache - touch ${GITHUB_WORKSPACE}/cache/${{ env.CACHE_KEY_BUILD }} \ No newline at end of file diff --git a/.github/workflows/buildpackages.yaml b/.github/workflows/buildpackages.yaml deleted file mode 100644 index a5e82d926..000000000 --- a/.github/workflows/buildpackages.yaml +++ /dev/null @@ -1,111 +0,0 @@ -name: "Build Node Packages" - -on: - workflow_call: - inputs: - GITHUB_REPOSITORY_NAME: - required: true - type: string - UBUNTU_VERSION: - required: true - type: string - isDev: - required: true - type: string - isRC: - required: true - type: string - -jobs: - build_release: - name: Build Release - runs-on: ubuntu-20.04 - env: - UBUNTU_VERSION: ${{ inputs.UBUNTU_VERSION }} - container: - image: ghcr.io/${{ inputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ inputs.UBUNTU_VERSION }} - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Set Build Version - id: version - uses: ./.github/actions/set-version - with: - moduleName: indy_node - isDev: ${{ inputs.isDev }} - isRC: ${{ inputs.isRC }} - - - name: Build Deployment Package - run: | - mkdir -p /tmp/node-build - ./build-scripts/${{ env.UBUNTU_VERSION }}/build-indy-node.sh "/__w/indy-node/indy-node" "${{ steps.version.outputs.upstreamVer }}" "/tmp/node-build" "${{ steps.version.outputs.pkgVer }}" - - - uses: actions/upload-artifact@v2 - with: - name: node-deb - path: /tmp/node-build - retention-days: 5 - - build_3rd_party_dependencies: - name: Build 3rd Party Dependencies - runs-on: ubuntu-20.04 - env: - UBUNTU_VERSION: ${{ inputs.UBUNTU_VERSION }} - container: - image: ghcr.io/${{ inputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ inputs.UBUNTU_VERSION }} - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Try load from cache. - id: third-party-dependencies - uses: actions/cache@v2 - with: - path: /tmp/third-party-dependencies - key: ${{ format('third-party-dependencies-{0}', hashFiles(format('./build-scripts/{0}/build-3rd-parties.sh', inputs.UBUNTU_VERSION ))) }} - - - name: Build 3rd party deployment packages - if: steps.third-party-dependencies.outputs.cache-hit != 'true' - run: | - mkdir -p ./build-scripts/${{ env.UBUNTU_VERSION }}/cache/3rd-party-dependencies/ - ./build-scripts/${{ env.UBUNTU_VERSION }}/build-3rd-parties.sh ./cache/3rd-party-dependencies - mv ./build-scripts/${{ env.UBUNTU_VERSION }}/cache/* /tmp/third-party-dependencies - - build-python-packages: - name: Build Python Packages - runs-on: ubuntu-20.04 - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Set up Python 3.8 - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install required packages via pip - run: | - python3 -m pip install pytest-runner wheel - - - name: Set Build Version - id: version - uses: ./.github/actions/set-version - with: - moduleName: indy_node - isDev: ${{ inputs.isDev }} - isRC: ${{ inputs.isRC }} - - - name: Prepare package and set version - run: | - ./build-scripts/${{ inputs.UBUNTU_VERSION }}/prepare-package.sh . indy_node "${{ steps.version.outputs.upstreamVer }}" python-packages - - - name: Building python package - run: | - python3 setup.py sdist --dist-dir /tmp/dist bdist_wheel --dist-dir /tmp/dist - - - uses: actions/upload-artifact@v2 - with: - name: node-python - path: /tmp/dist - retention-days: 5 diff --git a/.github/workflows/publishRelease.yaml b/.github/workflows/publishRelease.yaml index 7753c0aa3..ec77e9df1 100644 --- a/.github/workflows/publishRelease.yaml +++ b/.github/workflows/publishRelease.yaml @@ -32,12 +32,12 @@ jobs: uses: actions/checkout@v2 - name: get-release-info id: get-release-info - uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/get-release-info@main with: versionString: "${{ github.event.head_commit.message }}" - name: workflow-setup id: workflow-setup - uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/workflow-setup@main createRelease: name: Create Release @@ -109,7 +109,7 @@ jobs: name: Publish Artifacts needs: [release-infos, createRelease] if: needs.release-infos.outputs.isVersionBump == 'true' - uses: pschlarb/indy-shared-gha/.github/workflows/publish_artifacts.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/publish_artifacts.yaml@main with: COMPONENT: ${{ needs.release-infos.component }} UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} diff --git a/.github/workflows/publish_artifacts.yaml b/.github/workflows/publish_artifacts.yaml deleted file mode 100644 index cb7aa2c4c..000000000 --- a/.github/workflows/publish_artifacts.yaml +++ /dev/null @@ -1,83 +0,0 @@ -name: "Publish Artifacts" - -on: - workflow_call: - inputs: - GITHUB_REF: - required: true - type: string - UBUNTU_VERSION: - required: true - type: string - distribution: - required: true - type: string - secrets: - INDY_ARTIFACTORY_REPO_CONFIG: - required: true - PYPI_API_TOKEN: - required: true - - -jobs: - publish_artifacts: - name: Publish Artifacts - runs-on: ubuntu-20.04 - env: - GITHUB_REF: ${{ inputs.GITHUB_REF }} - distribution: ${{ inputs.distribution }} - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Setup JFrog CLI - uses: jfrog/setup-jfrog-cli@v2 - env: - JF_ARTIFACTORY_1: ${{ secrets.INDY_ARTIFACTORY_REPO_CONFIG }} - - - name: Ping Artifactory - run: | - # Test the connection to Ping the Hyperledger Artifactory server - # to ensure everything has been setup correctly. - jfrog rt ping - - - name: Download Node Artifacts from Pipeline Artifacts - uses: actions/download-artifact@v2 - with: - name: node-deb - path: to_publish - - - name: Publish Node Artifacts - uses: ./.github/actions/publish-deb - with: - sourceDirectory: /home/runner/work/indy-node/indy-node/to_publish - distribution: ${{ env.distribution }} - component: ${{ env.GITHUB_REF }} - - - name: Download 3rd Party Artifacts Dependencies from Cache - id: third-party-dependencies - uses: actions/cache@v2 - with: - path: /tmp/third-party-dependencies - key: ${{ format('third-party-dependencies-{0}', hashFiles(format('./build-scripts/{0}/build-3rd-parties.sh', inputs.UBUNTU_VERSION ))) }} - - - name: Publish 3rd Party Dependencies - uses: ./.github/actions/publish-deb - with: - sourceDirectory: /home/runner/tmp/third-party-dependencies - distribution: ${{ env.distribution }} - component: ${{ env.GITHUB_REF }} - - - name: Download Python Packages from Pipeline Artifacts - uses: actions/download-artifact@v2 - with: - name: node-python - path: dist - - - name: Publish Python Package to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} - skip_existing: true - \ No newline at end of file diff --git a/.github/workflows/releasepr.yaml b/.github/workflows/releasepr.yaml index 26b4adffa..42e136c33 100644 --- a/.github/workflows/releasepr.yaml +++ b/.github/workflows/releasepr.yaml @@ -26,23 +26,23 @@ jobs: uses: actions/checkout@v2 - name: get-release-info id: get-release-info - uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/get-release-info@main with: versionString: "${{ github.event.pull_request.body }}" - name: workflow-setup id: workflow-setup - uses: pschlarb/indy-shared-gha/.github/actions/workflow-setup@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/workflow-setup@main lint: name: Lint needs: [release-infos] if: needs.release-infos.outputs.isVersionBump == 'true' - uses: pschlarb/indy-shared-gha/.github/workflows/lint.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/lint.yaml@main build-image: name: Create Builder Image needs: [release-infos, lint] - uses: pschlarb/indy-shared-gha/.github/workflows/buildimage.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/buildimage.yaml@main with: CACHE_KEY_BUILD: ${{ needs.release-infos.outputs.CACHE_KEY_BUILD }} DOCKER_IMAGE: ghcr.io/${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }}/node-build @@ -62,7 +62,7 @@ jobs: name: Build Packages needs: [release-infos, indy_node_tests] if: needs.release-infos.outputs.isVersionBump == 'true' - uses: pschlarb/indy-shared-gha/.github/workflows/buildpackages.yaml@parametrization + uses: hyperledger/indy-shared-gha/.github/workflows/buildpackages.yaml@main with: DOCKER_IMAGE: ghcr.io/${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} UBUNTU_VERSION: ${{ needs.release-infos.outputs.UBUNTU_VERSION }} diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 201d83d7a..98bdfef56 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -26,7 +26,7 @@ jobs: echo "::debug::BASE is being set to $branch" - name: get-release-info id: get-release-info - uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization + uses: hyperledger/indy-shared-gha/.github/actions/get-release-info@main with: versionString: "${{ github.ref }}" diff --git a/.github/workflows/updatePlenumDependency.yaml b/.github/workflows/updatePlenumDependency.yaml deleted file mode 100644 index 70b8f92c9..000000000 --- a/.github/workflows/updatePlenumDependency.yaml +++ /dev/null @@ -1,82 +0,0 @@ -name: Update Plenum Dependency - -on: - push: - tags: - - setPlenum-v** - -jobs: - taginfos: - name: get Tag infos - runs-on: ubuntu-latest - outputs: - version: ${{ steps.get-release-info.outputs.version }} - isPreRelease: ${{ steps.get-release-info.outputs.isRC }} - Branch: ${{ steps.setPRBranch.outputs.prBranch }} - BASE: ${{ steps.branch.outputs.BASE}} - nodeVersion: ${{ steps.nodeVersion.outputs.nodeVersion}} - steps: - - name: checkout source code - uses: actions/checkout@v3 - - name: extract branch - id: branch - run: | - raw=$(git branch -r --contains ${{ github.ref }}) - branch=${raw/origin\/} - echo ::set-output\ name=BASE::$branch - echo "::debug::BASE is being set to $branch" - - name: get-release-info - id: get-release-info - uses: pschlarb/indy-shared-gha/.github/actions/get-release-info@parametrization - with: - versionString: "${{ github.ref }}" - - name: setPRBranch - id: setPRBranch - run: | - if [[ "${{ steps.get-release-info.outputs.isRC }}" == "true" ]]; then - echo ::set-output\ name=prBranch::update-plenum-rc-version - else - echo ::set-output\ name=prBranch::update-plenum-version - fi - # - name: Set up Python - # uses: actions/setup-python@v2 - # with: - # python-version: '3.8' - # - name: Get New Node Version - # id: nodeVersion - # run: | - # major=$(python3 -c "from indy_node import load_version; patch = load_version().parts[0]; print('' if patch is None else patch)") - # minor=$(python3 -c "from indy_node import load_version; patch = load_version().parts[1]; print('' if patch is None else patch)") - # patch=$(python3 -c "from indy_node import load_version; patch = load_version().parts[2]; patch+=1; print('' if patch is None else patch)") - # if [[ "${{ inputs.isRC }}" == "true" ]]; then - # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch}rc1 - # else - # echo ::set-output\ name=nodeVersion::${major}.${minor}.${patch} - # fi - - name: Get new Node Version - id: nodeVersion - uses: ./.github/actions/getNewNodeVersion - with: - isRC: ${{ steps.get-release-info.outputs.isRC }} - - updateAndCommit: - runs-on: ubuntu-latest - needs: taginfos - steps: - - name: checkout source code - uses: actions/checkout@v3 - with: - token: ${{ secrets.BOT_PR_PAT }} - - name: Update Setup.py - run: | - sed -E -i 's/indy-plenum==[[:digit:]]+.[[:digit:]]+.[[:digit:]]+(.(dev|rc)[[:digit:]]+)?/indy-plenum==${{needs.taginfos.outputs.version}}/g' setup.py - - name: CommitAndTag - uses: EndBug/add-and-commit@v9 - with: - author_name: ${{ github.actor }} - author_email: ${{ github.event.pusher.email }} - commit: --signoff - message: 'Update Plenum Dependency to ${{needs.taginfos.outputs.version}}' - push: "origin ${{ needs.taginfos.outputs.Branch}} --set-upstream --force" - new_branch: ${{ needs.taginfos.outputs.Branch}} - tag: "setRelease-v${{needs.taginfos.outputs.nodeVersion}}" \ No newline at end of file diff --git a/docs/source/release-workflow.png b/docs/source/release-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..352718881bdcbbcb5bde094c30751b38c4e72d09 GIT binary patch literal 146883 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%0D~guTi3rlMLDl5DN)_s0AbF4Cy+ zqZ~$OJHL_Lp6yO~?4dMNWb>`Aj-TIAOHqvaHrh#X^5Fk}HxrVv=G^ywo7BV$zb`uFeDvz@8ZbH%o%l};DW@nNdHcX}wTdayae znDSs-T_e?STbtEMOlaW@Qp&T2;77L|19sKQJtTJKTL;0mfXqMJ0{_8YE`?Mjph7jS z6aTScOgW=trWIeBz*cn4e2OlL###ZRQbwzta_(qTM=ej9-?lmp#YdjW7*bHm_G_ro$1V;+WDV+T@87>a>*4Aw^R4F3D1<<Of(5d#Jsg?arM$H*QD(f`~b@NpUm+rGeHPb>?I= z1e`MmqZ>rpG0z@0cb-!bfz^q4kEcU{W}a! z_hx+0d|#}Pt{%6A$K@FdSg$K>FmrFHsR19j^+q1WgxcEL-5s2Nju$$npgO?^6({Bh zqpu?REILY;N-OlL$8}iSo|Dq{k8?Qam0BKbv6EpJF+X*(erpL7<$|{VCia*k{?Ya> zAR#TSbe+WcVFZDtN=c?VxlwzxWkj5)^WlN$(cO&otBYqlV~I_j>$>VbPZSwn8KX8c zyUih2nK*xQg@t(;q7DG~clY*sy<0vgq$yEum|1GXFj9A5 zX*23K8K*zZN8Z;`qnEAZS;+P+Ck z8inCO`#8I1wB8oVCmfWpR%^X2l21M8U`^e2TRfj}R1^6pxbS6V=iyOFR+Q(L3lk9* zmJ^dpshhAgQUb6|Frv|CG=^W)FlylR~kH4PWE%6}!XtLgGqrK>zQ07cQRDTEzA5DM%aAiBVw2Cxi0)s-1jOUrdWqwkodlzFsmxLDVwuIZuZr>Y!qE30x96jo|>ZsQ$p|9?q&bH&nmTjTW7@3Wz zoBT5h_!=DhxhH9kqC=Mf9#JM3Z2uIOKQun`{0 z9kx#rxyJN5gX)6Tm7@o{l=NgED(tQx+p79y+9FpmN2a4w-{oR!V1Yg{-(XP2{44F% z>(^mDA8r_2xQ-4-6LrbLffQ@kX?IiIT_Q~*a+(m>Z%~v+k=Lg;o;#^=csnUH3y)1!_E}2 z04}bRI{oZui0|31aW3{6NI1?y!#-d3gvHnodwYASC;=4M51IJn=VL$1#r3ehd4043 zsAlX3vgN`yJFt7(>(BGsHkZc`2t*P{A*>@N_FH0v3d4vX+59`-UO$f=I8Ch8bJ(E< zy-s-A8=LzGN23$ecY%? zED4X^;HCf-wzr`v!uu4#d=+YDuGkX7qt6&(J%X{w(yIMUi-$?lwqT}xTaA<3N{=Pod1GEDl$8Ng3aUBh(B;r; z7G|iu(ANu%&R@TNjbziu&wXhy9lSV5lkzxqsZ)8+gKtE${9pt(1dz7YhA2Vb2=Ba{ zd~+Q`LxGnsLOMDqGBAdpG1TmzDajcF>$xnO?~1&eo|(#j+r({ckiW4I78)9wriNXB z2x(>%!bm{H@A7&PWJ!fx%bA?Z#EnnV$F2xUI@;G{K1aBXx%pmm7Zv0t^OobQ^C#}^ zs@EJUYj$>@__LktGG4wOu)RL4f5OACo;r9K%v31__gA|!;{dlp-Y~aq>-ma8IV!bO zv?nndb*4P11_vJk-p9%KNgwF$eCr)Vop}tZ{u5|t&#Mf=XYDF%X-RS-9l&#SYoQ3$7eBzBP|MXUT2!b%q9OfWN8j8g5R%tguQ^IJSqc69ubY-r)ocdrHn zY1N7z@_NMzUU@bJIn}hh?Sks9lB^WsXZ>MjR~`{CI>iwl+z)>KXX(7cW}=JFwkz2@ zag7pK0ARB#V^AMdbtm@sD(9~n=>~Uq)E(@gU#dn6KE4@l6q(Z3TS(fkSwNh(3M_>A z0C$LKwq0ibXVBkKkKpUi=78eR)iw2$?QOs|A?etP6(;W7K!q@;_kMayS`TQVKUvwq z{@mkKy%zBSzBkh@V6t5q+(|HaOQqLHkpHLY>eqDIsS?*rT)M}!Z=EQJyhj>y&#@Mz zFD?q!{(JD3Cax|Q=C=UxHC<$bmPhpWDNRb7w#9>BP*RbdU4fH^v{q4(lX!2sgKf&J z(_VN1i#?w$+f#4-2qBntC> z5as;9_vk!#p`w#=3?BaQ6XZ1@Ay^B#c??RGGPOjr6`+c$u33;}T$7a$Z^tWT8**9W#d6yoE(y2Acqr&Xf^IFMgI`h>87d=DJ>Q*ly?GY7C^S zfpvf-i%Q#U913I%giX@8Xw~rE*DDF3){N7g4y(aham^Uh!e$v*n@HZMm9_N z{7!3GQlr6i&txODm9{KzO zp6}7j`)-Ckc_;7B)<&fLL&+jQj@zJBk?O-n_rr3#UfLF9fh7&ayMG zs+;`{@(^b@`ds0x)hPX9?w_wSh|l-(E9j=(rnUaXV*Aq|9ywP1N;!YuM&QB6&94em zfO^zNiTf98Y2;tKtmC&7FLT$r^E}r6IEt{y^$_CR?b!H7QefAJxyCkYe zEND=zgz-q_pJG9?nN#|BruHXMH;-grCoX;6d?9j8T<^PO@Va|eTYo>b1q6BK|_*Acg!+`epxBoo(D`xzhKW{qyHf`lz<= zHhfIPgc&;?&J{@ymEUGiY1}XR^acrNarDhYB+W%VZb(X6I&ldgCB<*cQSy)?=#KJa zKHWbPbwPuv$jJKSjM0_FYB<1t58YLt5HEUB-+`~san%+i!o$G>@e%AKMQ0BZK!Lmq2%=)^ znP*Vd%6DePbIG^<_Me!OUHjS)&?Ueo0rB!w>$Rt+a*ErDVq7wBJxan9~?MB zIlva!u>t9ko0C(8t7G%vWz7WHQOG6ssqc{qx@-@K;X)Q5OU1p+b#*x`Myr6(;74ue zfEk{io?c#FUWdnxDYxCY4c~fL$$um5?3&jSlag+dyaoPi%xC=qgx|kkxL8wavDW}A z3$gRgLVk);LLuGzGXW549{u$&EGA!Jeg7*gKA8;h_up^vS6H0fbnDz>wq>U$)(|0E z-#Ea(g!r?8ka*-%ls2cG=)4@_WrvMgV>6>h7!f%u_+LF*3isY-m@d7i>^a$I-Kcu~ znVoJmt(FijI(CE5uV$I+r1(Ey#>Cd%T##O3iNP_}uX`w1+4U-+*qxK20*xOJQ2Fo4 z?*DlVRi1F~gYtr;bDKK{osFs6yK*8i(xc^bNe;5{XSz}A+okV?Tyoh2RMcGlYyoYg z@}+chI{?X!1m>Q^`|}x%`N~}O`x8Y#1^nxOwL?S8LAO$0~}q znxv~&3k#mk&h})^VF#D4b05w3>o@_K*L|^{?&pr{&!6voKES}0ABM~u6ui;yDSo=w zN^jI;Tj8aA%*7&omfKc*ll)!zPmDih2P%Wf*AM4=B!3;f5V64t(#5jZrpG0CHB?Gj z*K3m-8muT#AC>Lsn;M_ovpb|P#Pu_m=*R+&W`~QlZhWG!pXS5&)()E;A4D15&%9w; z3nXC-QO3;Z4_)qJdje+2jEqU~@k?~q1CF*&7i(d^?WTN#Id933Guec3fF^( zuzC0L2;`u5?|!{^Rp4lhFWA_7@J+NP=$cgwS5Ehr6rifg6>Cs7+Xogm-csfN>q_|# zjw&O@J(Fuo$rT-y(^FUf(np~2ELAR&KE88-?r0t`@eUzH?ujRTcvvz;yNbSOK{aFC zE>3&?$)$g;sTBtjqhh-5)8mSY%IVbszHuo+{QpMwTj?qPj9rt5z1r?Onx(iqcXw;w zoV(R;Xx=Z!8hQ)<{i@ND*kEuxn$}nKofnS1N7O9$6S&p#lOv2inb-RM!Eri@15juF zJglMp>J4GNr_P33mfHQ=ca*u(Vhn~#C-lwDF_3BiPkC6D^jwVUXg2r+g`Dt?j*su&JsEL$bd1X3X-j2gWvA43t@ochj>lun zhjt_O?Ik4n;)+OLBO@YFCC4E4 zg)Xh{o3V}+{}$}-uj(r}L2t+IL?UA%$W-%8?ik2UU0}HNi8I}5#FZ``Vt&Q(h+;d! zuM2*3=*}-OxAPyV>6IY~n?K$~rKL3(cYMyVp84Rn7_8TwQ4Q$?G&ZG$_2(FM-uO&= z!KeH{wMe$};24C6hgi5#=R0tRgo>uU`Cey1!x#G{=BtzI0JE2G>Gh0O2Tp^=+(m7J zCuxsUUt1eluAG5taa(^Qa5#6P;bqVNa)+8Xr~mais~(BBhJ}uCK0Y>398+*&e-A4K z*eKiGyS6V3>ISLkMK|Kd;v?4Pdwny&8trn<%53L7(HgQGnZ6Y`A`rz(+#a}<*O;Zj zUDzf){Wh1mZNeTtbr(X}GaiV$e}=`r4QoA{D76~N&m&;JG7PkYehP9=(-e&voa;&s z9E4nBf1fYjajVUFZ(VJpIN{uN?99Akf@#0gwRt3`WbmU&6pv|NizlIiR47ZHpjT`h7veEG2vEw5S^?%{rU`W;H{hCh4|oaU(ocWT4? z?G|S}BbjV4i|485q`1gwe)wP35WX1j;=g_$1d&f~CX+*b-TTn7vZSJP+3%A{QDl%k z++i%s0i>qn7IYS<^T{A}Zgxs4jvX~gB_ zuVO*nt1Knt0a%5!T8CE%#ri-d_d*Q>F`V=KQ-v-NY)6(8x!@cId+`i1+mX-StJMYr z&>f1=Je~B2>&_i;^8CYO13GgB+XdlA_elaF;SZ}X01dqHh7$QvcU z)2&6Gjcw2oB$+0`f^>n7R!UiK#O?BzL>!RTZf-txsCaR(uibg>rFmkKX`YG2<3W49 zyqelDlkG^gt=9i~6!iA~csNdrG zLF~+oenfBxa*I6mj&?9Co#Y4m$+fka zN^p5bEvUAH^E`i6aZ41Ml$-JKE9xFOCZSMDSY=^N}QGw5=9jhY4%zd$Yv3)Z5? zAePdTV@R92p-vOfcOSjVb^QE2C?j*p86U@XXO$`2tWEpQ3x(?eg`(I)&aybRk?pYF z0650u40W@yABAZkHT5>J5jHO-BgRJ*{-3B;TL;b1W&R5~`@0ssyN=YYtE0js>tA1> z?uWw0U1X=OUUok6>a!k9=K7N_>i^!m`OBR=Q^ZCJrFv}TBZ1}%yml^@DDtX9Pji)y z%u`p_E<7&(eK1IF`u1%&yLonUyz&H3sI#MOOXc(CmGw3m&7&hOexfmzB=pr@!o&gU zjY6H(@+jCl&4zuX2n!1%pz7FajeA~UddHso*Lh}(F4FkdQ;g4NA}(c3aUY&{t#OH4 z!Pd5Rb|FqHv45vymw0}&=wc{KiH~*^rIGJ?zGX$|(ENzS9LoZt6bI*@(|fn1avJ;l z^hVD}LJ|mx9*ivs4F93M%>wE1483NeHM#`E^99|A0nV?b8iny_eg>4Zlyo>Cl2VCAXP!w8HR@4S--Q* z$zn#=tDFT@BwC@}nk+0Vv&d})=8&4IDiG)17ZUyF)XrFPYDfKD>aYplmbob6&bd9% zofd&fTo@V}A}I!b=~p;04~3IZO}ks;!+sQ;Uee$i%RCseIxE~ZGoqkCJ5sv2%`I-R zGHisy$#oBLyo<5cYPY)HZ%I6Me|T-Wi>N$SpfW94+`F&`t!=Y+oX~ee^gg{ zEUv8>-@P@bPfx}3(3;M!wsB!H(iCvqHSG)Ii^|>U5S7yNC(9BHW`_h9dgM}HzG)Q2 zp-~>ZH@gT5T$+XY3Djg{B7SEbOvE@B(eT>s4zu@5hCmuYaCq(7>wqTn>dDel4V{T1 zoxO{sk47Tj4x-9GUhZFFyNLvFWrNM?$w2$q{W?qoG!XwzL;Z6;eE0ytQXN(BCJ<(t znwqrbi`+(Wf#mmWj(xO7B_IjGayTNDs}Qr>xfd~rksEH?lg0{oBOUm~ zwjy|dZTg*V%hz1cijl3Vt`-&%Ib=6zHnK8+(21;Qvf8(-d)T~XwoAN*GgxlT(vFhC zat~sxG40P?XwS6y?c~FJp*fspBse5i@UtWm0!sa5Vu*oMqoA0Et`FrN-MxX2S8ScU zyH{jdPFNqbl|I69435p~A|3Es=4P)@@l+c&;J5T>t zcE~}!6($aKv&_Vq=F6-9D?2o+tw<)=OXt(*9~Q#1Xz#AWpGSG;I=$rgEoTygdY|9# z>5|;et&4ka^VjpO;r()a>DMy8XW({u*XLf!(d5AK+8(Q?V><85W(c|AMVs)K|5t99 zi4okmZPYv}5Us;V<(QR+^C#zzpSu?qlZL5OefOQw7?12|J=`nmNis2Xy}1tMVE_8x zHYYYynNSMICJ+Ad=RCUD^6Eluw*GQHlggbfe$V+Ia@QgcOTI2l1`;5K6#^rd%ZV-L zkHIhc>#*#ux3Ks?u|c^WZmxs5@crqUDG1W&EP((ds z*|17|W*0+gbM&E2oa(*WV^+zM&ypJK106&tcq!fuNk8~f?40cDG)V)^BcKXpX=!=b zE}}M#I2sdy7urK)Zv#@PyH1ata{CT>pN?~7Gt+WhsoSseuh_&Y(Z3VxVL>e6-uv~s zy^g|)wC_*vm}uVcJE=4?qSnTLhdoKrUqtOAN-nene)Af67gc&$2j1fV8;w zh|f-tPu{-pC+k%KsmS{6uRL?h&#mr!43}wp9L)+Hdsri?<3rkX+Eq{QP~^tp z_e-KVXz_xPhk4>Dplq3fBo>iJ(22{fG~q?MpfmLF8a~r(JH=o=Ay$L!U%vd3KMgK$ zLs(!aSLhDo*(}E#OkC_nN4lCufhPCeyP5zA8;)!)Yn-F*Taiu(0yO|R4bbLjy@H{n zrsgnHH%6BYpzvLaA6mps^sbt&jB^*;7}KjK8`>^5)Vbuan>y1~K&4FeTT;@D=2Rk! zaC=L!Gz>z0uw#SkXo0J&e8CjfK1MS#2)C^Od`yA`stDSd$rokY$Hh0FbuNQ2@Zt7KI1tGGM}Zjg@~%Ca zRab(R`%6$T5N+^t>+9+qfduoT6V)jzK5J|11Kx}3$@0A+EHYN)H4zbHP#M-{!_IMg z2*{M2{K>{Sl_wt?L)l)N7Cx(9gN|(&H9!CnSDrDd6&iPs0x{AeFgTD175uN#Ni-dd zj2a-3HIVY53JPY9sL*god>tlNP&#V?0HVu=daV0NQ^yfkEl$yjU%70=I)W$xI^uKm^SnAY@qua|* z*M~Sm-^X$&n z(S3~_#UJ87eEDDpt>ba@NpIr&;s*F_>LTRTVtNing*)=mzKQzBt%J+=w|%aJWiaJF z?azz)nxcf9fqEyKSsm=!j92*q0h3l4d&GM_oLsKB7s$@B_?uaV?fiWQPX%4Q z1e26*_w9-80AK$_SILmwnVG-R#bpE~LnM_qdb0zqpSP`E?`i}@cxhz<$ClX+%P^4j zVp>J^U#T?%LO<>>v$hV*!W)H_oNQ~0wQzSeAyHw%JAG$pCt-S%CX>Z>tt2;< zJ{XCcemuJa)MC#cJ@`cl!|np7f$ImSU`abBIvin^f4X$$DuUP}N%V&f163v~S4 z4{*Brv!iocBC>JHo!V9vgN1dGXmV$g3hWn9)!2&1@9fN7vH)jKYd#c`tOhM1C-V; znve|I*UDauC=WQOZUI}1c0S-(khLM4UpIjwImIHys8GzTI>!pM@!iqzICah_EBhT~ zyJvdR$xgEjg(Rx}Vdn$tX3OB$87Ct`Hb5`pe9aTFO-J&yZqk}gSDsp0Qf6l*zR_6 z6=&-@OtQUvL0+Ug{kjy)U1m>}aJ9E{0)UsY$j{b4HZH}9YEIvsz6^z!2r=ScM*{$Z z0IyXA2L{T(G+NtQRbZ4^oOI>B^fW!OOsmMc?hO&5S1%?;O`s2}xK!$(TRNq4SP0pT zNiGGoakHV_JwS5sDTdREaEq!^9@p#ZRQ2_90ULiRU8Q_qZSmbe%j5G-Lm?3wJ&mv@ zRGAEw&`PQmI?~&97HIN2SmUM|<%TphMmcW-x8t8T()GEN(xX2WA#J9z@c#5v94ac( zsS8MI4Xq+)dkoTkkM|R+LvL1c#b647DZqzXuxhN;EDp@+-x;2r1`@m6(SExxHyX-z zmo&?jeQb*KXO_=X6iBZt5cghWG-odrWc&@mU6MLv!hQw>mL)k8ahiooUKTKHyR<<- znZP>m^XJmi$O5qRMuSCP6U)jSI9kB<)U>M%l?^D(m7yAakK9~_owXafWD(0yjH#%1 zSd6LJUZ<8%@I)ol)6+aITlVzE;$UQPReKU*I^Ny=j>j`+uM1>r>Z3F5#C*1n%7vCZ zZ~1TkTC?1|dC@d&ozTJNl&<=?hp4SpK3ai_mnT<8=2eI0c3n{W&W4TSF1Kq&rkhZ^ zmeW?`-&cQ%erTe z0!kHZhZ3cTRU`TA@NYMV^SB0+-=Z*w5(4nO2QYDlk{l&%;0g*q8ZEhwA2PD4Xr>4E@Cfwj$69|XG7qMnfu{UkXw^n zl(r$Z@?yG|{0O9hL&~m&Sa?Ky6bkU$)(m$dX}c&M#YAoT2<&RJO&ytzqAJ4yA=I;4G6uUJJb6$YZjj2kA z&=PnxF~{qF0h=_vyzAFY0HI-4s5dz_*FX+kRn;>vV0{?5(9#f_1q#wf(6>f;9oXQZ zy607L{@3M| zwByT>fv9uye#IG3uLsD+p>?78DHqpE1@hR>m+5w2km8>TY;@WTxk(g<@Qva4He8R@=K-@v>Ch#Q+5Zx|a)0^d=MWW9M!VfZP!NL!!MEYyp z9~F8P97;K4S%t|f9g0smK-`CL|FDHcDJ|DLKNE#QwPG)EOe5i;hy;FS&WpgEZ4YGG z5h>4;nn+KbJLRUmDsTS?8eSTT;xHKq)=-oGs@>f&`^{$FrAQZ9aJ%S5c(TvKo_gjL z%I1WVKf$TE!;Y2Q+OG-XtW@MnRoR~OH@kXIJw53c-IANh+hGVkP zxDnMG=b0X(-I^q$|Mk#Z%JA7U@Po;(cq$)}s$8BJcOe72v8ez2xrEi?KmlM%XSjYY zw7fz%u)F2Uw**<$g)tW;&b_I9_`sntXb2=|iGAYT7|p8IG?D;-xY z{hg5>y8hW$Ri4MECVi;2pC5?&ji61DO#FGe@ik|KaNSx{3(3o{1~qbPQX|T#nI`SF zZ;?h0zYAH~qo61b5|-!B(I`2dJZPYNsDQ{C066&&HfGa;_@_ ze7*IOl#-v3Qu4TxUAZFC)340V#bwm;P2}26c$a#~CTRq(ju`4@>ZssehtE37awUy` zCIz2D7P~&j)0v_|YF|^G0DT~McAa0eDOobh=I2F3g!4`3eh@UYwQX*%ix0%`ax3cb zS=(VC<}w^#xo-y30Ra^RX(gqVZj^3R zKsuyzP-&2ol9n90Yp79>?uH>oq;n((7-l#d^^M>EoDawA@{89vv!DI!eeZj(d);eU zEGBRpPgNBtQViC5)Te{-g2Bns%9dFncdn(Ap><~dY}f+Q;qQk z9U-~LXO`G5P`(7~1W8_ab>q?3Qv>9ShaQh{rh*q;Fa{Y zVlD1ViH$y_=^V-qC!tjo^MMGn59({RCi4q}wR=+dXvdYJo(;Y8V z)>2x{0oezA6_~7bj_Et1kb4GKRQd}IyidJ_5VyRIz6Ug2T%p4|j=%E@9tc1i)!?a0 zM`(C_8=8+p_=8GwON;k2<-EL4!eMwyyHUi^H~Oic z6(|l8B)Ya7Y&A16?!eZ@9Qf?nDiK`4w1!TpBn-XJm~L+VbR%wTBwvF|*ef^9=(O0t zY9PKq)7g4B=SB@SORo1pyABZ(gCgh&!rk^r9jJXn=^^^XhIzxYsy-y>7U|^wv*w>IIitvRGZkj9SV_+)vqeZzxKkOAc^;so+7FCh%)}5+)e{%PD3v%8w0Po z=IWSzYbCIcn4tOUQy?g-~jV90-v=u@gKx9?w zQRR5Fvt(hhdx^NP-b60YVX;R|ZP`Juyt4^4UbLQdtm?gq$bPUmT6}V}yhTiW+H|8o zY)y33_DOw4j#;-;vPQmkI@qTsjjn3DC8FmdMf2l;?u&LKLu`+6^(X`tC0Tad;@Goo^oB*ZH|6z5&3(lg2?^I@w@Tm#^5Z`V1&J<- zWDBPx78jqrmL(7#Dr>^1>jxaXP9zaYX+}O@~Q#zPE?l0IdsgwOwG{revI zofSSd|5J!yf@6SeM@dM->D)Ff@g55s+XsB2d^8%#(cC*>FLr9Uk3UzST=weH^z4VQ zP#|>D)m>0xU!fwXlGf+3XC7eRh}b^ZYKL6Zwp`O6HJyt~45)uRnud%x8u`CJ1--Km zNrX?`2Y!R$RTibAOhR)A35!ReIfu7O4m6b=$`O6c%LBDKp z8+|OouAckikq;y(gp9o_mOG8Vgjc9uUo@!C+*HGBBv(2`NQ;8@F5~k5$CHaWn6w0v zKm+}WvO`3iEl1v+m&j#I6G>8{_6r~eq|KPp=#U1KXV>E4VK9x5W~Qbx#m$DGCZ7|x zwg@qo&%L&@PU)E$git6QNFA6Ri;6$*a+EO)GQV$j7F&WiQWr1U6ZTb7?VDD>kV#iJYO=E#iu2Fysre# zgzj<;8?)ssl!og>gZt6XpXrsjaU)OFP{*XfuRUqV0Nu&2>0Ejefx7AM{m&lpfLnr5rgfju3N2nR+&N7TsKxg3QBog zZmGcv6JECwUZpz5O;${LW5)O%JpxuaC*wx^z~0XqDH`Toa_~d5&>plUGuqYUQ?##p z+WImob# zt+p`j5oUnTZ#y-%*%_U{s^zlKC?Lw@ty1A?XQb=6v+y9>A+gGNyEmzRXtpnzQo&iF zT_R9k1#jivN;&u|yK-;DuozJ>%wuPmnkpsiBkH-T+Aipf!#X_$amV54b3CWm;iGtJ zKBt^z62jI6uq9Q}W8xgR}vpyv=fC~G>6Jd65#qYrNHefmrK1If}n&CEU4#>&dMl#{pu{0qIkS>9M zi$b1C-;!HR#E1e>0HfSsi$D-#fEy!62Fl_RQNGL~VCikBL8S#AtLL;8sdqXIX1HvS z9S=igfcfj!o*wg!2}WK^ZTv>ebAjgW?AYcCXjV@OSGH6F*Xy>n){PAo)u0N6WZv%Z zF>Az#)c(Vd(PrK_cN#$Ow{8W zbXzhn*ILwzEXl~@_B)L~)Pk0Ww~zT=$8E8}GzrKf+ zTVGYjQ9kiFtKEKF!GNO(IA?|5o_yx^@dDHyEz%3F#VqQj4-6Z$cb66;Xw*(qA1D%^ z9b*|Zn=9r0(@|@Y-I9q&MTFEZr4|MPKvMw2YJWkve)cXacOCh=uWp?0cB-%b8i?Zx zMy~88C1lz?#{{;|A11wL_+2aglOzPi;Z9-;&DS%PInIrxtZ+ty@5O31Y~nn8kEY(K z|IcU5=k2Em_QqvRYAp7cdU1lj#b??rfBj*kKl-F{rt2|q>58Q7Nm268PQ+iJlwOyS z)I>r=11bPySFRXybJK%uDJpu3^V5>8gxP{k9tr8K#}Bz~qy@zeoIR%kAfT7llCX@QPb*~CKATO!6;GJg zv%!o@Ky|3W1BA;OXl*SIG*r7um~}u089moRT^c5aKm$K7Qxo+OMBSk;{_tw|_wP?D zbwbG(K^{-YnfQ8dMS9wu+%}5$r&7zO4#&DDzx0RH&rC5x5#>;^aB8klK2g3 zoA@6-xIxA%C<2ZaZpR#&l)YYl_PkYUeh!IcP-Ba+=e7wTX46VZ(TXnU4hy^iGeLGNwO!69|GoF~}t<+UZ^y6O%ScIH!~#`zxS zzQ#Pyl0MizRu~Cgo<=t;i=af%jr#&n^z_t^{q@OahtZxyQ;i2!mqtPhDMq~74-5+sRZr6z6V{XIn!{>RM8Ys`xoc0T#3E}q(n}3wWdcss@esVT6TMv z4j1@bTt+8{@2;o^vW}1RtIPl!M3Dy_SnsD;G{S^>4BX{9S{ zKUg7uiKST)Xi!l423vDGl+NPO z{_dQ_GP9cQ&(|~~)!Cro2v1J(srvloh>D!$g4ILwl+T~f#PDJPA|S4B=9jpVTlz~RnT z8F?1h%iSHuk`J*-{Em9nh59Qk)Hb8iD=7<($-7bY04?$(|1sZQVA#UwshPqgVR^Ww zkuzTmTnU$Yee5od-K^S-zPC#ZytxvWupgr;NNb!*od-c=g5_i`fWM~xnE z_aD>y0uy%09gWst!(odFOoFz|!7bNT=OZIpJvzybYc$cN$oY-Kggv!d!cNl@+|C5V zv@_9|2ENNa9pGR)6vD5PwjEfW3RIHII;`L%1eCHw5bQp_>k|&`NP&_7_0(NY7KW1S z#X9Hin_cgaYSLj{$t)6#Ec)40jfdXqBbT`__#`=Xb%9e`vOuya-LvQzc^ z>e1Jt#^(9L)gwzm(MbkgXJt_7#3#X_mGKPS&Q__%h6>Oh_kI7wV=Zar`W1`HQ&A`R zuK8&3DDi8ZOP%iS1Ir@V9-(g@7k`QJF2uy##9bQ)+x}W;!+|GoUZw+G1|Qx0Uk!o1 zCKqEt0YCZZexx&sVxFoo>+2qmN1|7rhgP+{h_~xJF`xXF^)SV*v_F&Wd9$CA&e3{F za25iDP|&x&bF`b8hv*mcX{`e7qVr3=Gk%_P_md7*FTCEEcT$zykC)FJK?R&Lw)AP|6WfZplNEDE%~{VzjQ2(D0DTVY`S{sc#A zq2#f(3i-ltrV`7s!dG|6;LGWPtv@m$CCEs}-Pg&XWH+`C54W3l-Y2w2Kqsfh8zBa# z_zOO#1)n|M$G3bzJ#AXKt2D`9&>W=Z<~mb~G#KwVAcW>ejPnX=5FokbDZ>0%0g zKFR2@NQv?RFduLUnnwo!y~U+C4ucOV241^L-Y+jo7FOEm#Tv$NnJQASnRDv1YJNxG z@rgcxHrL2bAp@1K6N2y7yzzc!mEUFHoB#9Y2v%J86ng%3?Hdw*U~ig7jQ*K<_T^tt z*B3}HK}dG^nLPS0msTpteM|Oa5L>Vhd|6(evT*KQ-2)tm0sSg^EphG;mBq>fc)kFz z9;rMJDMo$(Hf@US2E{trE7%VIuod%p+7L38h$-WM89wkg?x*K$N3HOqYYREI0 zJOB{L0Au-P$e99k?ddIouS~hua}M(%KC|w;?8CaaOOwD(7;z3R6R84h(K_1olj{fj zzfsZo2QQ>$wO@)sRo16uDl%TVawYVaN;0g`FKwF-5M!Bg4wI4GFp^?K=-3W_2Ux=c z#D^m9y_&&{i!x?~OPKTzdP#_1lTfbAj4rG!fuY{$CD-GUtM%!*shY}M<9p`eMev3Api~sN3k^}swUE!T5%j?R5#w=vMq)cWgw^O z`E2*Mw}D08A91t@T*UUt*i4TRP71+Q)UVH1zQaDvsO37w^}k=X%+Ez6Jy#`VE_?Y^ z?U83cAJxQGu~kDu!(ZpQ?S9Fo4W^wZ9&w2@Rqj~rJ%JbzOij<~bc2|>dAI|Uj!MexBwUdObD1n0`jr#)n&6_to4}f-W zr-LxwgBJs((61_X=MF5aPHOP+E&;Q7+-ze@vxdjjRjSR!%zLRVmarn9qn#$(83bYX zt|;I!QIMCj>GH^Fe`;aV$rz3&U9W|0&558#3(QpgMr(l?&!j=M4#Y0IHKpn*SX$x2 zJDybGpt8fmvFHG!!@GEu>VW5PmHk@UzJJiK9}VJwz-?!e0qd?}(PcBS$UrERyt$=@ z$3hi=>AUC73xYtNTr^W-r;#F<1|%U4Rt7m9ZBGP~!g(##LyIyNfuq*Y`&bR*gS2yq zD1@|jc}ZL%6}N*49ZQ~0#Tw`c(^y9~c}LdB^U_Q2f%dCdb`rYT=rz!ooNLy9pphQ~ zk_<62!+LUa<6$7=(}Sp6%~pV@mmAA0(P_GnB_OhB%6ctYh-sR#5`FPq9UYT;3H_7Q zh;M7F;12*tB|=z>0tB@RtMzhMuyjPt#_E%BUkER#R(iSemV#Z^kLJRUcDnZ06|mCX zL_Uf!b!rcTkekfY`5N@P%F3b^uT*0ir<<3Ros&}nhe)ANG5Z(sYon~Jv2*%D4a>Nd z=ih)?ue_W9{WN_jEjINs*tfbuL$7&!q{82U^$ivka5CVz_nV9!{@1fFpI@r@rp^Af zCq3{ZGv-|6ow`HpRLycnr?>=vfWM9HV8&Bj1kBH`^v3<3^M7fId3!W>TKpVH7s;hM zDucPd*@3l3M1)Zer)7+xU{^LRspmd=^E&JSFZk2l{>~(RG-#4Oh!8t)*!M4}@avSzAE*Sg zXUX56lk-ro2KS|R$-&hqORz#=9|mmi&k4T#{8CybH5{hj6fT)oz{G_15Qko;E%jxw`(W-an!*rXn4<$#VV&Foq@?<~?No%OUUd)5W4}vU zT3W=T5{MSouAO+!vK05ux4WKs_EZI$L?_p(q9E<{o27#Jr$&A<85j9-Euo zD%K;m%F7Jr@m-NcfIff!}IS$l{fSCY6SI&FKhSidRB$mcfPCwe9x6{ zzH7P1B6eh2JMDCyt2(*1eY=>wy$Qp{Cc>-wyE}`h{88B^2?_p>^SGVvh1o{|Ir~p-{o7-Y$6|1iL(o>{C%)uqo5AsC}2<3x3oO4Gy=$=3F18&YqgeBJ&eAW zoU{2(aY8ZQ1n<2{`sYo`4J*VvjPD-LWrQzl#Ey7ui6Xdh-~5; ziI$1DS6Gx}i^P!vIy+$DX|OTmjkJ9GX1wtdFqM&~3ZJi`@3N09L$KDJ`UUFDfP5ko z&_%dDTJUtg#ul5dS5v*gHw@%rfMXm`?9Y1Yo7f(K>Uh0-wA-$&{Ru2K%$^0h**}cm z*6C$hgq)#*4P;wt^z-K`YsdT+=gx0g50Zqks+E8W{2~U>xCbqI0*FoxtF`K3h`xdu zeKjQygB7`p`1RX@-`Cc%1i9r8r&qH=Q*|A7I-}?@k$cg|3bXtJm>QxQOGk8f*02_& zH8_xkfnKKZg=v(#n+Heg!ryt|%UM83XRrpOn#)&FU5vflqx<6H51P@3^ zumH;D2@6H~0x8M_vR&gvNi9cM5G7^5a~RD+tFLoRs(bFUB#wP7jIIu+S^uJZRU11o zA=0d&4;a*PX3PyVcaOUOFMfTzpDfObMolwxr%c#hn0L0d zNlKG1^1KB8FRvHsR0FsY#0QetW+wy^v5;n~E3367-CTzv51oDur;@>ChY)$s=HrhA zaSiZ^uBnlVr=y--O)K_nBS>G357T;%&+ax;mHm_okmt!fPGX zR}?S5x&~W{J1P@s!sdXk=twyrDAxU}Yot4#6KLb@;Cr8)zhxlD1j5C^p`PLgx=xoL zSjAu4;NW4p5alqNlNy!~>Acvq|8O!@1hl>ZZT^h^p+brM_|M3d!HJYA=EPR|?tGr2 zU&=i8=Ztu$__e(IBJ7%Tu=};r{XMK`Y>MpGWY6ustjSi)*%dUX9|ZM3Q!n`RuPk+z z{xlJ$v<7pdRt^T9r({Ah5uZGIZDN}}*L^QjW*CE3!11v{`3clreg6eM9>$U)12SF{ zhb5VpW2;@&9~ zM~Dx5tizAgz^(A(Hv81`u{R&Aw^Uyr0LI`3x8tYjVcD@auZhn?NWK9VMqu)zrK+k5 zS{^%vxyZ!WdXPxu)YO#mE+5*|mew);nXrNW^`d!Rr%M(Y=mE+z!aX4P4+v{ueLH9z;O;&K= znDufAUfomr=r*P>)y5=|f9K*9SUV{yGT5kshQKHIuNvRWk@kDy?`q-Ae2$WvkCx7x z?M(&S?)TQiV+h+yye#yO zuJa36al#dUT_b~~IlU3Y_{7>^@MDO^9l0}%@7L~r%h1{JliPx+WK8I@lgyAL{GQEU z-7W++kAsYe{yVJa%6lnN?`z>6M#pjln4#^uqz^^}|MLM5M|yiicaOcFTb&NkyfG^} z_n#qmV*x^9dEsBr(kP+@%TKXV?`mexJ(9a>3LTG?3V;J!9IOi8(X zouTFop*gbHwYYOpV=c;Qi^V507%Y%KA@Xt-v?-Xj?Cr)fI$cebHtnW7_4@@Dxi=2( zVX0@0fsOC~X$ktZ%4u6|O83VTSbJ?ES@o zZPSBd;KKcTQG9uLZC2+{judXo563^A?>F753}sc&_YVoUQ@7BXl8H0jI2f%Ga}*3w z*Vb7q8OO(OCyv?SG{pwr6gyJ!2k;}DB;{TV_k}?bg0Bf?5l=}eq@{uj zf#dk^@jbk{GXbmtX-3{>Qw{r4v#+aW4q2|v=3 zYosI85~2YJ(^gWfd)JBU!l2d`-9h@x>UN8l=H}*#idTugpJ6cCCwqU-`lP{FUpc1iJpyV2D}i{bw2YUBm=>`<)H) z7id!I{tsvpbn@-rS$VcTZBRFoEL1~;E|rPUl?u59Zj4tCelB#*<>W{iHhdbbbB-M? z5GrdHX92k&;KKrc=HQ0cqg$*>X02v*yLZGHE6W;GfY7~%M`7vhPP+7$(!RaJts0Wt z0skzH&totO&g#{PGC@6MxdgRxld`T@c4FGw-{e6t$=oa+7PpLUk03Gb1_ciEs#?9x zRDQ#2)AuD68ew)X3%;<>khoIfFyH8ki_sAKy^R7-fyBvVQaDhzj9H_+Jl`*N-jCP0 z6Wo}o_)dPD>EyFi0nMDE(r0Qe8yzRZM@zjrb1V!=3u||LcmOya2|@+l+n1lmP=N1k zn6F;OZ^sp%nIWyMn@CJKWIx+bZN15l963E&E*av%cPaYo#(1KMuV}44 zVn9~LCu6*AE6fKO*iRsxH&U90wc2|}+nynAf_G2Ibr$p=UL85c7HC!U_JkP1xZ>gr z3~Y|~3o0zs#(`o?Srusd1ERxfixt}#b#FdUO?mAa1# zlc(f={*n^}be6JC|NlmAY7a3bIhMd~ZC>7XI+B`_vPk<;(W};Spq2XAbqhH~05ndp zJKe`iORZ34nsWQO3p<{cMY2)NMY_BhRiH~!Nin3n@rneNO}Fy$`i<@R2xFb2Dyw&V zeC%v&J>Xgc^mEz?QL`c==`Hc9e{DbNl{<1GI!{vb2nD$*Lta`xd&$B!)L2 zz-8kpn14LHfOooZsMCh_%uFLcyVLr?#ZGJ(HL0Q^p_nJ%ZeL30(vsBbg*!^VNVq#U zzbK?3#b965+ww}%s6y&YLe5n>^m52u{3NG^9JKi|y56-O_|qPz`6$mez~HLca3LrtOS|_W8 zzVbsueb3R#X)aKlrzdAR>D8R>Gh9W91K=t#Sjo(bSK10hv&fhF=}775lEGDX1X!=y zS-k6tXLlqfcJTyVS_jI@Hxl{!MeUHOnX`3uf@Oh~U$8Att7u*(Igv|x`ruCXP;gI| z)u8}#-0?bIirs+1SeY@aN5aC6GsAJB3%KNw&psvJ3L2fGaaTGkzJN3y5AW)EB?ug} z=0!8rxM4l2&ngLmu_MJcl(eD~{ryc=GKU^aN|TyuK|Dk^3;IMF@n$O2W+^~%CDTA&Y`Uh3Tium78+?Zo#Xs0x1d$qy;@ z!3-%`pYf8kDL6dE(svTmh>%w2H@ki;V%B0kI$2RKX9FXgZxbjb96|IXgj4FA`h0Jw z2CFh(3fOxXX+6fT-bQM@Ozqgv){t2S=v*Vr)CN`!ULynA`pZg=GSZu$#T#l;kMN=WtG_ShS=UEYiV( zFR>=`=tLI=>u5bqkq%4OZ);yrN3nR0O&W0oeYFmrp8{l1hKKg z2*~+>x~JyO>Pf1AcTeG6jNaZ)cH7OV&!{a(v}?cKT1B@6V{}v$ux-J=bg64`2dK75 zSh=kHK(obj9DzPW^G$@#O__GXhN>j~epmaITwRB?kz$}KRj~**lrUUtD(E5IKBltL z5%i{qgzUKCPAb<>?u7S|ufaogZ)TI;ywi zwcPw61&@j0c4~h3O43d#>BB>Pf{5lJFIvRrk%XX*sNZGAO)F5ZX{y@l1_ zvmw4U;C_m8&O({>xjAnl;(Gh9A2;UE{~yGHs8y>kAJK9R?}e0JXi$4w`SnU60G zm`_OS_R|7bvQZ!Q18A)X6iNb!EE(6+lb$^6iB4G%Fe_`Xrm0uAcXefA-rm{S+1|d( zd$*fJ=cr%|0vM}jsEeg4*c4;Fc{f{LCo&cXz+NChR;XF@3iP)FePhs} zLqdWS&zHx^Q zM%|p94`|n%@+AF9Y}M=6Ichmqb!+X#k9Okp>5Ge%rze1;;2vln z2)ue3e(td>i<_I9vWa>2qxqBoedp%owE%*4+w(%@llnFwJ{f}s#w@wbVd%^i3clB; z_de5rxSR=kj6pmbDALnA_%Ko}$ElPiN|UQlq<8A-!%ma1un-Lnt-G-RH^rCV3?Hdx z76wZ%Yqg_*=-jT)5>%1|X_eQ+jW5em2mnFxr@4z4$v%8Y3~`3L%0n@`ue zfR-iMNByZYy}Fl)T>#>A$=&4)aMCEz7ibjs=UUiWAM2evN!6u~ZSZnWLrCv^qTtLJ zD@kKzlM%I;K#zO$8L?zg{+nrcw4rt%kC19WwRk-N(4hfaKEi%ANa)Hw%lXQ@C=U`o zZQQ*7z`UsRubtH$bZSquTtv2&6p!)Ww~||zRChf!(wUCF`=!1Zb}%P1JFv!KqXr~? z;X2zfa$@+HM5bssI!aPXs;s~NE^n02AZPiqd3xC0 zAPDK^%7WEo)Xar@asL@_WFj)UiyOwY``L7~zjIEYQ8iBy{83g`mXm`$cFhDgqqX6l ze(|S~DzSSLUkHKLRFgkABtS*_?2yPiYK)Jki1wtTqvOJW<_{(1l4G{BT52yyyBa@zL1*N|3G@+PS}H2yLf(bLNA0?&2{YBZYH z3RREO0@H9n8`Wt7U>hJNuMB*rBAQkHfyJ(VIGIEHv?3o5IC4$)qa>hN!fpCqlH&}m zoxTO=NHRNA{R>_Jk^0jl$R8n+-*x8)|HBb2u5~Cfcu`? z(as{)*ykge?Yt3UX$_FP2NZu@3r`A%^{Hgbhg_Nz#-pbz5(JV-D?-te$OA0%8QJAm zAbWS6f_ihtO|R!;-|Y;t&bm{VcP!YP=GJMbU$;Jieh`VjIEv>^e{>dYTcJ(ruh zb;y&%4x#vn&C1DGStBbhol3SBlEtF^lp_K?woywIOz6 zL%a|QUB=&iNBGciH|`^&N3Y{z2_7naP~12`ni$i6BkVrabDmVp5&%s^y#f#5Ck9y7N^Lxc5{N|gMn>F^lJ{R3c!pNz(c^tx<(zx4jMGP6!Z~*0Q z|H3`5(E&jKwTOH4^kSb#)ZYqJzQ(usk;D=hkRJ*?@K)1lcAO3;3qeoeCB==005}V(X_gKp%lu7NZ_jb80C^l=~ z8j;D~_~$Y1NZEEbcM@Y2TunKV!PF*pq7{dkvjfotYMsNz-QJ8okYWE)P7<-_T#zI=+fmSkb3x zd~KJE?|r)G0hs#xa*rn)?;D2C4JWaBbi;Lw3PA9GKSo_?y*2Y!4bQng-Io7+Jh8EL zDw=VtWH18$mn`)^PlVlFS_MK_t{ryQW*lqx&4<3J9XR?GL{0|;m|6~Tj;6+AVd`b_C(Ouzev{^6wOuwD+-}~#GCudjH-C2-=p2`r-Dy(8{NP$sNMX5 zkD0iJhB@o3??nhaE2wF9RPfNXmTq&u5Cz!^M1_}j3o{eh3G5sdUBGpWQT{!I1+(9< z6)OW8dV4AI+c)J@EZ=_Nv-E3{KR^&ia~dz7NhY)YE18U6r}+ocheFR}GGtI0>lD{mak8y}qUr_L%E!GFPJ_HIzg z`k)eyG+#zte4e$d2DhCl?akO;|&)A|e3nqc}tUKtoS5057T0k0{Hko)JT( zlVYz^&oY@$brI%yYuPeBW!93^fwu4;K&|WEBdVbQ#HA95fZU-KmYt{ zSNL|;;oNZCn$)&$flCAxkK7qiXCSJEwgD>7{~yn9SwiB-M$$c zaS`!rzI|1j)aKUpoUXfn^NTWT2u_J2x&J^~vNzM?z`6ZgC=x(gGE6@Jq$P83dH?d$ ztAbsnGd$HI%bfc=JA_xSeh3Ls1vZTQPx}5GQg@z@SSE15Tx@PPruZ-3=v?eZ64blS zHLtvCC4_nx?oO8UGJ-BD0z#@UtS8H9lo50)q?%)PJo}UFP$R&!V_xn*#Y{VY$a$BQ z`Gfn7`?b5IYuDf3axzyRo;dgf*1UsEHDW`A^4$}L_ z?o%sy}f(`3{beP`D^qh@}sH1pn zFSP-@>czZtJgCz8FCK@GV@DL?KOsHqYS)TK{)89?!V^)YR#ZjAn2J&nGM+_4Q4$Uu z;78IWe1{xPrk#6s87Nu@Czth8?gd6%v3Lcqal=UT2DE>04nx-RuTGCzI~hel`mw>a5Gj4M~5TL$luzFv4|`{CZ6Cs%X6hQi5DiTWG&74tP%%iJCL zHE~mRz{0uc#cNGq1o=Y^T5aOr9!_L6SzexJ5e3)^mo7ni`OL%tq*SfN|R1{$C8bfecB5F+JOteO*pO+ZnJ&rF$mth}`4 zrjJh`AX5(PrU=6>ZU!x*$HqnpO~0n@Y|pn87Uq9SqOh4LO;#K;s$$H3p1CtS>pfgf z48&pD^r}rn>$OT=57XLBf4VarmpX5j7JHi~_Z*G3;LYavOppDK)+kaYNS;TGpOPuu z%23QPb%dgVwEwYzp4e)SYbFWrdQFX6y+rS&)(-}3BiQ6ak%Ya8GGbtxP+DQNk4C0b z(oqRBZCL`9wTZIN4vP+CEHMc}XuVXV8Wymxh$x3-YyK3$0KMrZ;(d3!PMD*t?_d2_QmJ7K%DVUH1kxOEJq2!#SUD= z{)PiVi`CKFb17-U0?PM)Lx$-e0VkNlP*|rb%`&a9RCN5luK8s7-75Y3n2Q=sZiAdj zsrK7wBc=1w`&o-^M6jr+LEvfv#ApPaGOMVP{vRlC z^|Fa0i!*vF9niKaf#$bxZBo*dwWcf=dwdD7p?C7V#0w*)dt3_qla4n=VXml$thYrQ znD(QoRwpY&L{ju>xQu{_#a}koy3dl-cZafl_$dz5CMe@-AL~@S-Zy`1Gx1$~b0D%q zBcA81qJItmt_&f%aDFZp9{U%-$0{elpNMgaJ{ay`%GUYHX;0Rn{?jMByq|j(?HDvv zb#84mB~>_~+Ai%p%o?Crj9>dxdn+pnZ0(HVI~x(bphZBt!R@inu@0OYMv&EwJjy2La9a^oZ-DS)ytxevlHE2tT5B+r0=;AN2>Kl!o9(R#m_ilTgolMC(fs8;XUgt>CP_P@8#8k(z9Aw7Yp&JzD9 zJ0$5){|Dr3K9E|>`ZPPMz+-a=I6QLYd14FiojAT0CJL$n0O83OOAl!PX9W^(KK1_> zNFB0}&XzZ|kSPAO`kL~Q!`JoT5RNJ!>hlG#e1=9yUy`#Qe-FL9a(DmdAK29C{TXaJ z2wCkE^>hhIeVnrU&~CPFKTz!S>I*$sJ?D=&|MZH_-(S=Kep{Xrm!0MzK%nyqoKl}~ zQchiuud(YN+*(QYV@)?4eE3;9*VyTH?)l$LIb}HkiDd?-doouNkD0Hg0L67%8tQe4 zz|gu!=Fha)>$3O&f0YCrNOzv|9Es%J^?dwVahQNKvBETaD0sTBx2PgJI}Z+Tv4ihh z4t!3wck~c)-Oz57i{3HW%`b3ED$$>e%8J&*v{GbuqRzULU-goO-x@Rl)rrbj0I?ES zS#La;-O?U8(1}J;Q&UH|R5VA?Cp{LZx_R7q7U4iw2<^xDE)(pi%coS`dY4gcIm@+V zPA z=UKb-j*fU5iln-G4|hafGB80wQD!JK@Tyl-iO4opT?PkFXUhmn$pFgd$aE*@dZSJi zAP9-WOY~v4VN_Nyu+M?+_~O_Q(1;%fJ-|xc3tfPTw_RQIEdA=H?ZHM={$c~s>cYzn zZG270LPtqYKEJj7>M-;?YZjIqaQD1otYZZMH|zwM5^PhcV@&+_HLy*J395yWJe7d5 zL`mgw@52B}fc&ObBv|qI2^h4KqS(W^%rs_R-GFyI9Fxm zqgnVVI96l6qa&q|(WZGbXiA^M2;i$>fLSyMqnzZcQClNO`S^x}Q~#&N%#}B|6Ivzg zO_yL6)MUknf}|+HGC$j1jLDXiTxO76oF`m-*rPn@hvc8b<0RJ_h{zaHG;YyOuR9 zAmDwj0{upJB(ek3d<<1Nmg~zAqEC+j3=~XZ;6Tcl?y|rmkAmYx%BZz^ex?6E93P{QLO3;@Bbc zZGKC=tibI+f3te;HUQ;b-M2If=W+h$&5LXtW7BNu?*)<&+YYqUd~$wbfQiHn)9a6= z>X#m6LhNj2Vm!5r^(}5lR&}xNc``x2?k&RiO z!QBRC)n>_WRFMk)L(CwKk*vt(X&5(fVd4Y*Y7Gum-c3#xSILI9wC|?i zJ%n@Wj(qCl*G|tgo~Pv2E!g**qa6kNn0Q!?9%|M-@~&T$H6aXHVuY01Z$3KQ?giqG z-wK3HWLsicg*5X`l#9Hv&W%!`g6f6lsfmIzo7Lj*<;L3}p9;AvYNn7}ZWdsjuhR;*N7+ zN^jD#&|{|s8_dyi?9i}rQ6W`{_9J%sby6)qYE}HlMjwJE+6p}Ys2?8QsII5h3;5e- zH9xSs5$MU<;SJ; z*XD-s9!T~7Aoi%^#{9zJf`Ni@t#|LNa=ElVDT%oc@&Kv9|J|~wvk}JaeDpM8ZuXHN zu3F?K=`B<7$}`^t{^brXF1Au+E~qWc&vfo!6wo0_6HTF|6ev`rRQo8U{60-AO{XC4 z{^}j}f|=xz$?1j%>~dl$)X!vdPLHkbRl(fK zlxFHo9fp>fRB{p$$$2IIy<+Q*TT_m4XZHWo(%`&2;cJh%h8kaCGJxNX*rph-sY*A2rfgvkr-kxj;04jdotlC9;diDu+>0~3#46u6l*rx zbesrx(TWHoqtt2wtzczvT%Pd%L)n`^L)pJ?;G?2YX{8df zL|H3a$gYsBkbQ|{$ySIMMumhdS+XycU6$-iOhop*?2LV9?1LHn@2U5Fd*AQxfBxtE zJEzmB%rnpPc|Oa1U-xxg_t=iCVs5`tuN(BP_}^Ma)z-}~pLF;iEDhTvC$kdUojWle zB+X3v-VbzCuGUE2;CCr147VEL*#8Wj_MrXYOy{D5K`nPjIEQA`+|=w(UhQay*W2rP zN!_Kl!&Wvn9M{hC<}R@D%)5)MefVT392`}7#P#_^*9W@*JV6N+4Q$CmgPK0rpq zG63$yxaApHuM`y#9bL_j4fitMY2_q<<}&i6I;)D!-HI=fKJrF=bQTWE+cEF>YhSf+ z$l=(O3Atd1+JxoM;Dh7Amm;kdiR(*A!xPRIAl0GvETRa601sLLPFc1ykRm`+#N0Nl zSreEg!}fEL%kq_|(-{azYBJ>CuQI7_Je|A7Q44Y~o6W6<8*qR;+7VNln2=MO!aa&^ zKy?cR8s5zqCex={qou!MREX_ZuNW$G!!U=`*G<;X$S+1tfS2}U16H@-(fDv%`@olH z;C&ofdRHSW#^Alw+29AN?n)??-aNCjKQF5#hx#>MdXEX2JWAK+@g~!G#P>ic;LV*Z>&`axXh>td%vr?a`|$zK2@NG$sAyAtiicxqQW#8&-#-~6 z%J)8|IBv|_usZ`S*hMOZf+Y=@;yFU%dY&p8TH;7__m7jJlQn*qRvs9Yyk`*=6<{*% zulB(l(zKxY=g^NL7^IrV3&R0@jngV8=LXyHj8?g$(%;^kbcySQfnzTM3!$yHGxTEiShDJTc}zudVX*wvbzo zrBre(gz|lPkpg>SR^9Y{8(7hPPnWf{kb@|qM2MQ}Ttrk9E2P;BylOb(j0}K)Ch`PxFbq7ET!Iw&ozvpW!3si%{CH_qc-YR(*Kw zT9ximkvkdP{p#x&3C|0!!V<5Se0ofau^G#ES93k|FL-d}g7DT3#H~kV)hLO8;=R8B zMd;VwaJzqNcajlmQvQ>~nv}Q>;eGrc1Z+Fw`32`=`h>XR>rQn1cFji^5|LZ;jn^JqhByZ`>{VQyD{m2A#Atv<>{r>9_+W_yYcn6C21wnv5k!jx<`@ zWPFfSJd)lM`D(7hSKn2(Y;$|w$gb6N^4XVg3&&-#XqC4O^nbz4s@|w*Xf)H7{j@}H z@!(gs=dY;$c`%6$X){s>n`6|}g-*LGU+Ew02_2|sZ zOoc^8?aI@k)$lDsj?_kHdQ)Wc>#nmiQc=_R1wE8dFurb}aC>*Me$cflvK-l^dA+mk zp`D6{c6g-F-(?zA@7=FNan!SRhUjMqF%ltyREAYTrupjTr#=3+v|D&QY(q#BH*0DS zaSX#a8OR+wWK_a05>88)6*J!c7DmQ(M4uJ6ti9LRvAFQ{pBh=h!HCh$G$}njJ&=+{ zD}T>=~pA zPszqEQB3~mrGBrp_vx%1D(oo*gd@+_{=%T4tfe|0F<9+3DPZCq!>YOwRT$`~_cfb> z1Ib8gi=vtvlUd1=wn}xX_5vX_`8sTkb9dym2L9f znrWVuEOb#Os<=D9-0-s_ew|PUrYWoH4upkUHXL@i9Rc>_?2!F z3n;$-UHfXTyd^Dn@U=UqQL$pOH(qYdyg~f@JsE++h1fVvYz7uELPXk^fyr zg172v*J@|=!-`$}x(T;4{VBuIzcw3qHx}>Z7qtW4L?~NIlQq8@RXG3WV~n}s$ahO4 zoe7&AAb$C~Z08kIw}Y&4Y6%-n5tFYd;9B}wE(68T`afeBd|}Eio})(PhVuw+gmPbl zWBX0M7u0{ga=AWpz+HV=EuO{Du#7EnSFqx{22!bi&Nz}N!v33SUuVvS4 zw#%%Db$2&RUo57v^W6(37Jzm#3=>Qs5~AHl0GKqcqC)W^f3C%>hu48 z$FLB(AY;`o>1iCsA$0jLKesU1bCT$m9ym~RO3$8cn{E=|JTjb5oUV>FN=*=NWek? zp+B*naiquoJUf@CuX}={?eyj+0aa0e&6 zE~B7)zqPYF5e-(d@+;G3=H{2iD=z%`l0?cGr0bmnTRT3PWzejxerehaSoHt-5f&w> zXM9^b7q#UG$Ws)g|NXz_Zx23?<9vfo*0W12QttaR<{eki?hZHJq4$kD{TZjk7Z@6? z|KESL8^=LgYf5+^#09cOS>d;s?9DD8;+5sT!o?`z|B3&1%7_Feu>uu1Yx6ZGgDIRS zsv02D7J|Hi_Yn-0G|rK11S#2xD;+thsh6PXD~=a&V7v-D^XV!?Gq)m$uNtvJ0q0^p z_Sd=i{3S^m4fz=hEj_&$)wFT^S;RiO5gbufUpT$iPE-RSoV~Cwe~#l&l$xuW|NOYC zt1B3kVpIPFEM*_->q}W>g>RR*+P*$ zf3CL)_*%zTqB@Cq^*RpFh16qzDU|-c`k8t+Xdd;~#fi5pG30?Q+J_jYAQGp3pM$nh z1#Q@S-TM#-AO-yTM;mL(anHCZT)u?mUIqmM!SIWkgr!ES{PG%Pa9 zj`WAZ`^S?{2m66b8l(@vqj_I74o4rB_gV`x8J)}V_nV06-$GKV z*M5E+>ZxsOGo2;D#HQ`_L*>YOk7gR6fJa%LqV?H$u*?bU#47!11&gbyyeQq5YiKGf zD+yef{Uxnt#I(ks%|m+fdu=TUBa@-+wBd>qHV%yMp3eSg2;+eEll^^t2E{=_Pr&wi z$IyL;AN`2C-Ay9hZgXkGpxmV#&`uzeuEAG$>};=(X>Okxm^|;|YMV>Hq9BPPA&$`S z{yN4-KT_`&*$lpUb6DdVim>_W2<@YhW4#i>_dqjHNPzb5*b01r`YVTY=vx2j3P1l( zP^Wfu1XJ(!&x;1(T_brzcu$L)v{@%|a`a<>bH6TbQd7N83~HGIzYixbMZ%CnqKK_VfgaU-j0?GgS&> zzXy*h2!`mvhfjnM>OTPCNg z$v__+qMfFi1YP7GUleg#{9-?KbPDH3&6OTh^Tm19 zJm=!Yi!iwL0|Q^6w+8e!eh@wFBq3lkunEUqzJwWF2&H78S#qf?`2)-b3+$CvcW%$ykbKl>bm5zqmwa537vQNF7+jK$p zQ!Pmb?NY0g&0ynD1-+SJfJ{wW)4Q?t^Jz=VW3@_Ad_s?hpXU^Ty%jLz4Y5is*ck#$ z)yYbagGbKsfyMUeF7*Y(l~cd;iDJ)%4hWHyK!Zs#?G`AUM@YNw?cfF+OkR%r5E9^_ zt-$7!?OL}{qX}8n_JDzUib%+|!(5mD51FT>yx@ikeQ^WrqrZ3z&_tx(BY-#W(KA;h zp5C|;aaKe`B-;=j7Y2gj>%zjfWMy@=wDN5+C?EqC{0(e37O{M@C0MEF<-^A^oIZieh9{WM!g!NZn!2b)jdSjAsTWI*61}z@j~+ z*L5yKym2#i)2uZvQzKJH2YiTGSQR54Pq#6eeg|%D%+-*Tqx3f-sO1VkhTWf}K*QPq zuK=5CS_d2wr~X1~G(cmU%VVOVqPqF!%ZodM8IPtgYWyyihmgqOuOyH=YK#sK2l->r zowdl2RbEj_kNPzdLSZ75qd zke*i1Mt$8QA>l$WZIUYVZ*qsZT{$?YuNB{~upwM?M%dv}UcQr15Po$E_n3wUR*h=8 z%LE3cd+Ad$n9>gAhv`))7qhb&Me`~uDb3I809HKH5f63{6c16C8g6d{32&@-$M&dX zwSa&hnBvE6G6YJ}3G%#FS}Nk`)1Y{ICFIr z7C*GKwzs$c*uJv4{9qCXa^fSj0$+eiAtfaRHBmWL8cr>VSKF{-S$1cIUAp^HpnL53 z_!;oifHi7P1C$eR3ux`Zd-blu>rGcrlcGDeU7l0a-roM>1#AaEv)0zp>FD?GkLeGm z$3z2csI|J&@`CYKn7Bj|BOP@2G`C(v_0}NLJHczBF+Ai}D5rKX-^4p3ZrhvN+Z1#5$a){;@@LB*Bt6JX*crm`Z*VBIb$?(!VfLN_(C5LkhA>=t z+(@b1drNd7Dt{fS_FxJE6&Ht@R%kVS{=6_z>>~=OFZ5N)x|b34Sht}5-h|4zNdT1; zU|(`vo!s@N3UplPbA+BiRZ*NbYM?Z+Tlbc^F^t2^#>U3X%n4S46Fc}qNU4maz-H2! zqLNa%0c$!(SI6>a`oz>!Em@cWS>o+5CkRks&;8()n8*UsgWOdo?2eeIXgTb4aBR_R z?}$j+&MZi$a8pxLFZ31A@;^FNK3EK91T)L!Y4uny{=Gr)+$1h|^5qpQ64IN{gUX^e zsQu2^j5=bAE*o-e7r9m4(;5GP2oG#<`|gcWVSJeA-QFIT4+V=v=mDsaddIXc|GkC9 zl$DhZpS4c-y}UfjpScgEf6n2)G&DzdGh9m)2~&v`_ME+P@uJ6+W9a))+`N(hxqCYK z=0QsCxkRBOkPvJ!V&KSDLMu3a_8cKDPU?LVm1bJyxop)WSFqeLYo(8jqsK$+ivV6+LAD?{W+p{Ykff>~00X;3Ic`C1f zI4>{lXaS{Cry^Fg<{(cjrS;Ga!vas5C!Y-}mnDyrkF-}wz8t?IIZ_4H7+mKM2BTJI@uL*B}1KqQu7HT8V)&8le8W$p-F5fsjpy z70bp$W5dmPe8XG7s_T;hv@eWBwB5b84lbz-4=nptI|=8xS9n~=Wl3LFXZL^m=kYyP zzFywoz_%}J9WW9Sy&u52x?S#f2e1B77!zyWnOqN!R1ZzGa~}!SPs6rh5(zaP?TUdC zt*a+H?zCXN!sO*GMnEwGbqZBk|Jk|ep2mjs&$C%2TR8RFswyb$^n*o^($1Fo_C`T( z4&!QlN7}wvogf3CMkLmyi+li!+%mSOAKmb#Xu`F~=0l_Gzn&A|c3xf960_BHuzP8W z6U}wPX5S9I0tg)Y@3&9)6Z(05e&yRHjYaOYcdhY^rohhPB&09VtDPDs z_2rVe3D80HrQiDqd@chtz03rN<$|JD*aPY2?xeI#sau0o@+>>9n}Q=Hr54VV%D&RH zq=)sfA~Zzfm)l_tzer$5ZBa-4l6N1U<(uA{k3FdMQ)938=7EEwS!GYVUg*q8JRW-# zTcFb~Y#?iyc`yHw_lJT<8T%HscSLlwtI99UeYli*>8Q;4A|0ona|jx4J<`*Qdk3ei zha$#bU0}vl;Z|K4;)CpiV^{>ITu<1K>^J>dS*cJQnOIljtG(A6;CG5K;~fquSj1!6 zO5bS6>m^X?FheEkay?I&fWwmB)T_hxM$3iz)0zPxW$!tnb$cCSQ2cnM(3+#n$?3y8 zId1LI5d7DQ2heVX@0=185)87z@!`~-h3=iyulE_L zASl0oE1{7rxlVO?3;S)Lv>-z@$qrhc%E=3TXy;7Ws;F2Epj#~}+`)Mb#?p>2kll&?i(AcXB#YNX4)}Z(2MW#vI{$LN7!iYZm|VqaB`1o$a#OT z>g}iv#CN(t6s%~sH|VstH5o0b?oAkK$r?{qLcgY=X+2)V#$uA@A+0a$;=Y>(#G6mU zJIKf@B~-KGL*3m@oykfl6iPUjTTF}|MRi51j+n_s9G}j8aro`GF1whvw+#nZD}58kP%B&JTcS?GfL?jF3-gsp46Y($nunT{a)P zV~6N&hq2$yHc-lRBthpEzoy)B!*5{K%tbqs{Xe*YFgK!4x=R@+AWpdQ(ng@#&u{8= ze@LA3N2xhzzXz>1oj{LOI6Aw17JY>9*e<)>9FPJ88KpDv5aHdYFAyY|-RphG9z+arr|WC%?q+zy6;=py4rq_KHX7t{?Y}r@6|2rfC$#Eyal;1~8>3 zP+}5B`#ikBvk>w8>)I}C`%x|zL5w&l6%0{@WTF*gW4+u(-VSR^qiYXL`$SA z%+>k=2;*vBch{;P{q5(frKD4+?5J|bSGJGYIKWl;B$M_sbf$?}ZquPn(L1lTmXG@# z9j7;upWPWB_7&|xR5EZ*8%C)lRgqGF_zCV8Hi`ykrDaj~)%cP&r&4cR{?;i5L8t2A zYu`L9L`OgcgT+#n91K2Bf6ZROCxGwPV-M1Y8TwP@gZf_gCL%862& zZ1Kl_`fNr?QomQ{S8OHi*Hh3UD@M#M>cR4sjk6e&Vn_&C-$PIj~NSd7|Ivkq9R5GNqnlt- z{@6YKa{bids*{mQuqsI-FjE>+q!cHdR(5xg+ruMc2N73v?Vh}LeLSyc{?nk(*jhy~ zZi_Hkv9@;dwGi9-$a{M~YO-*wRLcCPl%gdE(}OVEU+B$$ksu-BGndA5813qU7?IE1 z8#J}#Nq)rI6gc&26k+z4D}M@p-OD;L^g`N0-{R66D71O;nw>m(5;M#r1u!iI{JsqD z=eg8TS|;(W@sOaPW2&y@1}d-EK82oE;T}B1-uZ9}89)5F+-q{}%U0iq79$2%X@=*5 zn|>_-eFFS>pNOX=1bur|7YKq>48|~}v*!Ev;30C3`rvolOzG=&!@m0Q1{h{)*=kig z(+ZIzuZ=#M+3op%)FY}rNQZG>Pr=lYVDw%EWhnOR*RP_;ji7$`xZRU`7oH}P8yOfs zl;Pw!%QLGbVyinPUF6)W>I%(QT@a{*h=g%0l} zCGKP~^}tU|s%R@86fA9g{F#%9Iy^LSziy-BQS)UXeEj(dq9%s@D-QqpL2U<^S@`)! z3aC^yD>}du;G6o9rpBj)Lu6-596gIRL!Ws939L%ojrR)qNy;D`9vXUoo&nsZ zozWUvBnHxp8f34ZqY#XuA#NvLG3U2;3Z7q@y=l9!Let1(>?2h4j4`(D`Boz{6VvF} zn1!B#vNCnt)8oX~=8DFxu6~?>T&jJo{iCc!sbb`{HJ+dEh32}mQ)X-{wq7Nxsi_SP z41hPX_LpbN5Ev~Cl!RpZr&*^c&d<+-gR#!IA)1Pcswg+tWiGQQ3na~uwlnQX37-Dm zy)*Qq!J@CPZyT=7Cu&r6K*t2G!{;_qMH;o(SHPjh~^udA>3$-vIc$aC@Nm##%zebBRaUrr2dSmtOQEBrK7XRa&Lc{#4S$ilF%By_;{XlhJ%WV2)Dq^>JuT`OF>=93zK3PbG|5${BF3-aWW8v zK@>|nyYPK{N`11O^z`(6qP9afwu=B3`mVU}(Zb!`J!%(Pk@+oMg1k#zJ#^Wyf2;?Z z%fD4bvyt-X7IHcpSy^%33&A1PIKZYQex|mq?M@U5TaGi2vWiRY{-iD4sql`|$j{Fx z6WG-xmuDcK2A64Nyzwb#&@%xXp-9#`n|I51XLr0l1i+ZuK!%jY{_gH@8#($L&%RPS zIXEOflurggq*A~vbOkxfY<@7(q{zD85dh8n>s)enoIR(Fo9#S)3}3FC@-dl0pqV-)sV5NdpNlnS zov!GVcOfr3GmoBpILiw0+|7-q+ptn^wGc(h>XkL2ya~vs3a{^!~(b<#IJr|O@9dd}c(D$Jk1gy^N)Y0Q|H5cT&&6TyZ z&iGtFcAAcT_veGI8tqnZA=c~Z>A7>+nK7^2Zld8c(`4oO7}9e}`0}QPUd??`0@ml~ z>6M>~ZBH|A3yO)wnRaFBhU?~?=>o@6o6ijL95b?Zmd@y@SWKe2e&bF8w)+HN+Glu84DLrXnkeB?KE2L!{;ql!8e$tFS3pEcSAVbaWLLUyq`{YAo}%$$R@#1YeY_b^TCwQKZ`ME5N&8}>_$>=9Iw!*oQSU_0hEUqpwj04b>YlR0S{Crcet#@^GSp|T{ zLG#vXtGJ&@g_JbI9BeFkn&vUFvHp8~^eK5w9`cWfJJ#+Fo~E9_#L97P0(XsrZQ3ys zmALT*H-ub!0HO-*e$Z!YlgevleE9gWHxOn&fZE`)U_`Z|5--*~3FXWTXV~>Uole#F?a^HwFi}TK0o~QG0t`7E*!SQxF85#lY&m7&GtxLM0A)PW!@d6 zGWK1{DJp`dJY$1p?W0kgc-&rlqP*xbp(>GAC-0g){38qukq#ldj6Dtts;>rXYUI>}cs2yQzCpgb-(K`aoQv#3DtH3N6 z4wo0(p&dEhWj8Ky?M>Bdg}H=lsK!9@D{iHjrtw% zFw#1%ADM^+wk!5WTFCGYw7#VY2?)Qe_WkG2FgM0~^Ee0ZE0$fHswR&fK`C!NpH>!sQ_xg>c4Fe@%Fc8< zbA4f?j?Z0(>Cw^A^S+@YgrOfAxf8$U(Zjd#C>8AzJDvVQ?B|)()Pm-ypFC>cZQ2qR zaagQ^`yjR^>6A*VJn*k`3kocLq;6EW(RT7;6wV6eGTh5hOZooAIqOY|0eu{%B-dBCRoc&@7ks*K9e z!ro>5QG95=rX9!V_t#TP%tLgK}2`<7b^Wcmos0M}J8AR2Su z%d~9&&|dB1F;na5DVO_mc=#d}!(xh%wD-pCsjYI8nfKBLCiP_BHd0g`xNjPH`YBjO zl{n`ii)^gvMTI4j4GJFBpm+P2N;qj&kQ^KthN!c$*3of(&LjNKT-e2LPPX06`A)&p!v@Q$bp{2A$Y@i#RPVSJTkXP zT@+vd2rZ_qVchw|xR1BoWM<`WW@wbG&vpCUW3DXteED6lohMvO6%wt*d5{R-?o3{{ z5azUUE_f8y^(nGa)I8kq9U*QO?eg?Z7&QlUd1Kbh()!GqAz=xoT2#^S>T)tOk60{& zL`-bAn6l`En(lGITQ_9S?=Id^fT+8w;<7?UK_T~TZ-rcWf`C1Wr#HRCUSIajbff93 zSKQFmXCKf84qdmORD?pTu*39Yp&P841bRCvM9!U+N-TEBAGNg-QG^=+MRgv|=#q_% z;nL6e;%8Uiz3NO|Qgm1H>qkL*vV9G3ubghIe34-iJY>RqV90 zEzQLY7S<^$wih)WAE!1>D#qP#m~6@}rhpkJW>@Xh^(nj8UF7lAg42=@Sf+C17LOJr z>X%LG(Xop&m#=XMpA9lXmqbX`jB%W zI!D}?lsNY1w*VHY?aiwdu+kC{+CnJt=x*%CDMnFF;ewMgG|LLCdZ$+=-iRECwecE` zE>2M<6&4nFPkJ$YLJ9>*!c&2r@%s11HJ|EB>cdJ3oS(Tia_z2Je9Fvh4&&&DH+1#! zea&5$@uDjJTc!cyFy?^XRkF9e$b}*I|20`+Fbai_hHi8leRIj1dHwn)aW!1Xo5D2i z`&wCHICrPoKr6`Y0_=4PEaE$2{QMObo!j%0#g#ebfKMhy2h!7Np?9YMcD{3&c+d7z zrC?I$I~gO+(2;&`3?SO%C`xL@?dgv#bNaQ_D2gkCHd(IT{4&d zc&otTN&4f71_1$HPAj42#LP~`jceu4e(hL~b>9xqJtEHpd_K$3@gn4RkMSEeYDy>a zBMXf!E$z40G@fK!A|Z(z-v*8NQ+qrBOcaN_Ms|=(ra6_Dr?3DDKKBYfi7u)}8!Djo z$k6vI?s(zx1r6dS{sUZuoJ6aLnI&+qJ^JeMnK{aO7^nSxxa^&B2JYqQ|F@rYTZ$-c zTWzHAqdWe2AZB@~O-sl*6O&3{hP;p+XlAZ)7{$@#8dNI}DdPD)73h|BD0ACrV9Cc= zR)$lsogtt@1K-xzsIVmqcdQPv)ux^SLlt@XSFFX$+k2X)5eN$5Kgne)0jVfQA~*X@ zS|_@&Z}%jiB?EwWilyN~JUAT8lv{Clk#<=Nu`mi6;LyBO0P{W_3H9%qR!&=fO2JYye1;svWWD*oNJ6wVPd z&Hb$=`L&jwYVc7ju72%KyPR7ed-E+q0s~d<+_|Hu_@?syvAE4{xQ){gL6a1H7?qpz zXmmp7+<4B)&ACd&*)FN}V+J759CpCo%Fncn{PU;kqfdTniCBhb zt>bWPXx#ex5pr@Le}5&YKE$p6ec7ulINjS0hjN|X8(H{Si&)=HSvW#Q&Ow5ZkYt-8 z-YF4TN}$k>17u0#*5Ald)O(C2-??kZ6=W{q_3K0B2JxYxHMYd=WyD*(>b_g-E1a8o zQN+~2>}KEe&?3^PkTkihP0=Tgmg))mDLFdj4AW1I z-DH{sF5`}#KQ|wB^;GZx-kP-p*Wf85e(joScK2^i(xFz|++TPcOId%wZuUUGQ>CCK z;5s1#EBNv8@y=3FU3SNAEsiy<50+f|k8>EX_7_j)ou?n`1UNpLtXU zO?*Q#6X;Xnc#tFdo_|mt$4O3o$f-C&T=G+4 zeE=uiPE5y`ZY>QRLLW?r6_DH$wYAfi6XoVbia^}CUdM$N+|Ag`fA&Uz)1*gTX+3U0 zB({TX>dTMA*j5e@#JDc5{{{GN34gHpP!^D4 zvpD=bZIp>+PrCc2&Mf5!>3&3=f?Ye-|3*z9`~v1x2iZ1{;hf;N&fnO+p6kE>7e|FO z`eS94?X=Se0$`F)tmqNzJyW?TRiVPmN&BWl|;Ye z)$)oPV~eO7Waehrb(X!qAZ60Au!eodO1WE_oG|@QJ-hlM?W_n@G*k?fJZuPwtl&A6 zZIe0yW(jmV(>c9m4DTfK-P+xh&bP8;q@<)e=lXgTu8}PZDR`1nQ^t}C(>UCk{?gX_ z-d@Jcw}mE_U)ZTP_}83yS&DM+>eSW!Wc}DV95ClZu^TMA`$S$|czFX|f~__Yw7xpk zmM+S0UWDySDm49&HP{sO&_;o8KHK*4^78mwNIH?6{;>*z!5FMwsifBZ&u!WX_L63v zoi4&^w)cs4TX#qb;N7m@9C$7CgZVtYFyq7!$>-_|hnPYRy68WP9eUvy8-RaR-phOu zA@OcJ7PC51R#ADs*xcd{kIcs{a`cs7L(1r_+zMq3bqOwXAg!3L?vE{ir;VRT9+Q!e z!weLymXp9z_N5AR@z9haL1+hyqikmedXX^zq*RPm?F#~BLh5sN;?qWNzvNvVtZ8_8 z;q}Um@(Q+M8nFJ_yNAxy{#2INafD7i_Hu3)e@+zxl~7lqp=hDv0E2IL*WM|3mR+DN@6 zmPzXLhjF)`V;TVoV-IR2PC21j(iSd*OOB@wNDgrpIc{}6JbmSfvW$$3tLvA_`#}Gr zHh>&;em`1sAHe`hXLnw>Zs0>YH4gR_e#@?s2^vuBTW(_?EOI!T)NT$b^}352kZb8j z_6OPj=c~{=gDS=@fz*BEFE0owz_|q53bE@M1%G zyS#L)pZJ;jtqDI1*TMYlJ;KfoV9RSRZmO!mOB4qXCMP$`PYmOr*!O~BJOv}Zg(rJT zLWU_Y7Lh#0!d7xFCypCTZ<8u2Di|5h8s-x>e1jK==T`gvJQHCJpSa&$mFBT!IJ!r9 zh%+s1*}|f>W;Kk3t&yqMH|hK%1&b6Dn}wqZevQad5u9%T97g~5BFHXM*veincs7pJ z9`t*C9VwutxB9PC{b6JbCr8NUGc;sLzEe|X#t+JA1wL`bW#0hzPY#0t=$unA`a$rJ zQ|ip{c#e_t@x{=Ic3CEjRQPFqJu#cboMQ;P<9{ADA_ar_Qlg;8Qs+k_n>HCuuC4rz ze--+Y zkj(Aw=$kXKKe7f>n8wi0w0x=f9X!5+cOkOB>!a+!TLJU3NkG($5Nze&SqI1c_l@TS zv!t`Y6uTC*|G6DqnRMp&06ei7`chdR^5PS#pUKSbjyrTe3%r+L5!L#rv^bxh*YrMw zh9VBn_FBaYxO4?T3jQNdJivr2QQ(dRq!;?7*P#VmC3QH4M%d=lIi);i=y=J6R=0C9 ziK_Gx`61#+&?vI;Umg?x`0DL+=V;^IkQUYR~RnG96p3p~#;93&_nD37K-Puc``anOuJ%gB5R zc%#<|L3cP$;1epndNn^2tzF;#A}0pn@taH!uUNTn^KE!D+zN_s&kg7C?(Yp7D72m^ zMG3fA=pg1FAFw3>;&+5N<k$*+i{*fzFQ{GY*)d)S++&3c6kFGB>bzTIGWSX>NlYQog>v#w-~fJZ z4Bv~0aZP~CiQiH~=qY>9e4Y%s?uvew6jh+Dg(%F+xjy~}DY*kQD1~XQ_T{PYs6M(# z)5n%$;^-6~QcBkLw5`Rmy|w8Pt8^p1YPQ8AI>8Swi#!|+^d!6t=Avwc!@OL^^aD+G5JKcTakv(kQ&b{Rd@ zH$1sfqiJ~LerLX%UJO-1kYcEtN@$d|wSMUQl}5J_s1|1Z__0{W=b=lB!GdSfS5s9| zN1cnb-?=!%p4hepb1FO}7?{Ge@e_wRqqoV>4$y+2X_JJ2J8to56ZWDYqZTtxf`tIRzt8lG3l zT8e19|DTN~2xD15SvLi^>hyxB;LcO@6w9;qM@8?rX!R@3D|ZSHQV6&=N1avdEqVPg z;KZ5Y9C!C{6|os=SP$ad#C$w8g3?`APdSz%k(MgGwf=*5ZP7rkO8j@I{ppqDDs>E( z$i1V#QS77E1h`NP#-6`sNIp$1g)BNG#`SAo>2wI2cPLgtxD{K{!RaJBaM;Fr1%Qq# z+@mLPWU%(tzhfU#huR9^-X3dxOL*N9J=L(YC*iQ>GKpJ>J_h^&2?NAGX9tPGGTxgC zrbG8gpIEyo(j6zLW?}x&L+!l$I#0U zXigVwRC+`hy3@59SerGjxGOZl{IodfuqPp*TNWd9bW|u(Y7D zwM~t5b!w5R{~#AgJVrj;WcD|e^f^&jUw^QJ z*U-b}N2);c-mpjEypnn0{7k3rmM+7M&2N$(rS{@Bn2K}&J)jS`lY^Dr+VtdFcf7N> zJH0FiBgw_F^Sq`PN@xtJJzl-+ z@tJx@v{Y!qi)ycF9YT~G`m=SeK&Z46lK$CFm=_~$#dhfBILlNxSIZKff9^gbVjM(w zf4_`66*L>uIrqY%ewyF0k-{7fFeCY&$YMMXv&WAt@9Nvy%5*c9lsq=x9K12A z_1Kw4sVJNHin;%FRWr1^>&Q7!w$<}i2fVyc7hMBD2AO7NG#i2b`2gv^0@-<7^^cSv~k%;73aDnt+vSN;iD_fUJIBV%pp zfL7xBnW8M{O{P<=U{D% z_2oee**p@JZ0vD7#mfs6_9*A?+0E@6@d@qbb@TPu`jtQ7W!3)wgqNwK@C29~i85sn zSh4`HkVz_eZ0pNyQ5R?ka88Zi`jrLXqXfbx&s5M$7B)7@Y+-~1^w9n%I?zGIgE=(I z4ffO##O$dLWrxwH3$(4S9D4aWWMiec(#-nVpx9ZJMe(@0aUjU~-#U5rY+Co+%r>|t zA2)dVpP-eP&j<Y}M|9)Zmr%!2um5C6`q8Mhc9 zo8!?vFH-%~Qak)`UUs*Nh&>~@=-+94Y3|Yz{d2v4B_EIeO59I84gLK2bLnuQ?F9@Ju>>rRxlLnWHB5Qnp0D zjqMN!a&x`B$c+|JeGvyz$wiVnXaMl{{7CqKp>_5J({J!cJ$vd@HNCv5O2dFxMz~zw((18Qt0zI{A??b);u;2k9_dYG@acpUpA}}JagEkT#S{K zm5GUog~hYRGQ_G4z~e>}u1JJC=h!V)ZBWF0Eyo}Nvx^vpU{YA~Jt-qJhk zLY*k0Kq3bO}HeToB* zf|ix#-U__1e|L!T`R%p>3C#ogG!9SyKW}+*7G ze_?fE;oaVk-SQI}lgZh44DTTjm!|)0fJ7(~;H;xrZ5~fM3Ea`UNn7gddO*RW_}3mo z1pJV~{)4KyC)a=Ig)5QgTf0B&;WQ#%tL;D6Ixz6&x{T=4$6kvx?+&(A*PJFv!~;p8 z48L9ln#Vf{f7T*6slFy>@8+)?x|pg+Gn-p<3Y$=1*Qc>}(&*yZWb_^H^k!|Eav>5P|4C3upbKP8S4S+bK}B}EERmq-wg2B= z&E-c-Usa;Sdpl=nXLG5JMzC`?__bw`kWY}It2Cs z5d<}tZJ&KHCqo7kHW7%`e{CL1$kmjfI#EhB0-bbn`-Ldz#St9LbmKgzP7VM4)@&zF zv6q+``J#7L87`i7uMMCZEPZNkXO~-4vj8Hi{vHqz0H@s-=|c#F?LP~Y zI4Y(J@57MPYVdhzf$b!)GZAhGuo{TuEG8PltOC&Jy`_%jx(6} zF^IDrLvMir?A)BllTn!#tUT@@6@3%kEf5L=I`e0UqZxyc+{QIDcsDt@*FdfS;uMgK z&ePEWkpRCvascsM@ITYWo>`$J&{wBFMMZX*u(5#YHm80p4rZIhQeGfyxaDWrQ2nE! zM(7DsLLE93ij}iJ-ew!noz!e}KH!_(IdcF|I>H%EDAz&JO)Xi`8H(7J2T#EOp8C&| z_;OAdu+j>)?2d=n35j6wP%5h=E#P9-X3 zN<3#%y5ZuGfZ8dlkNEhpTMeS{Q)vW9)5^b~E@p6Rw(NE!Edke~n!|{L>WKcWid`J0 zbgtVe$j`QKjgspoHER4dHdD8Zh>JKKCE)B|SGb8(JbR+vfwidIe{dHHs-H~iM;-bl ztf9-WsP$W4xozA+|FhLe?!E>!G_L#+fjMbJ%N3Q)`48>g{c}K>8Ld<@H(H!Q#&$ ztftM|E+bX->ec0vGDqlvbrAjTFcQVk|Wlmeo(G)RZkz@UU6h?ELQ zhai&DJ%k|A-67o!J-{&V-*`OdJ>vO&-&yZk=dAS(GtYfLckF%b>$>*6?pgp&>cJ@% z6niww!LeaSXrj8dBQqhh%6?+M;eGIMVFoYsdtxZ{1n*>FE{hrQ42~u^@73 zGd-NgEfUgi?C3H-KK^gCQ{!tB|Me$_pSTY(A0F6KDC`lGVb@j};LCaoAh&_Ta6!n9 zwR>=IA9_nbRDAgAst>u0@Qv@S3fEa0vBD!!M9$GsSuWIUU3 z@OlOM-HU}iamM|F8ztvryJl}6lMZ~a?MhM}COYzuU?fQR&k-E=rGd~?RrtgG3^L6@ zbd^<;U~!_Go2GkI*MEFC)cDc^CxsXN$wbFY4!mAO=tURpsYmv<_DlZ)a(!?d2|N79 z13AbWlF?Y1GyM65QkN8+YD&Pzo9Y1Vw#KOw_8~3?S+R&4s#z6-zZ^kR^JmCL3KFq_=YzP35iJM>!_$G z2x9FtMD0j^#js=a*$Ual*>2fk{s^-2=Y-Emkm)CFD1M^pWoVY8Kcyl@uUn>VL_|bh zIJ~l5KRuIqc=8$v`Tx&f9#7af<~9uW3Gt}C^2~A|lxO6FORT4lX^Civ@{1LT^Gg<; zD0oD2vircC%g{QN~g zD5c@IeXUBCar2Me`vhMk_`-z?0|nLwAM#;a6roF{&cMIv!%z+@3`V%J7l)0uRe^&% z)e@&5FArpLNwMO02MG@EpL)E6Q#L*Dqrl+-e%lr>vJD!;?^+|brV}p<)XYI|QZN=A zh`H_QurdL^Hks3L(C5&9e2HBTprGp6h5Y)v7ff_Tb8jy2vnpr0V=c>FkH&96f3kD@wsXK$qZV{* zFS0|+f4m25QNL=@L94O~e*x?PQf|0F|9QF8A)?KCD5uTVC)X8IRmj*nDUSUy`DK%v z4RmHI&3a&bFdo59R-hSh0-t;To)r9H?cjX8OM;-#czVyQRmfS z_-7L~)z>4Y;y9!3c@R85g#X9NIWjlRX)E>pO}m1%I`?Q!|>4Cc|p(j)SGW$Af4hr{{XU#AycXEL?Y{~?Rw^4OcPmVvP;S@YSG`1 z{$szrIEy1@PRbfo`AmzGYU!B!izz^A_{SVwWLQIH=7w+tVNbTO4V)WFVKMpRNVyd_ zV2axQRnsT9^v4AH(~YX;ibZ^?Bf8o}2;boT$2XLbszQ4QDy6LSj02>H_C18d48|yl zEmBQ3nwjRy*E@C>KmSn$G9Og<2;fG&^>d4>sA{cl1v1tfH8_D&T zQJEC^Bu5@F|4R<_$Vh45Ggx)~u6znGm?+X*(m?R5xINZBT~Xrq1{b+QMsaC^rf{_} zzv$cQ7JGB<1;P?6R$5lb;FQLfgne^77CR(-)0Q>+sT>rQA!mWIZEz&=kjSYHkWw@k zh!MEf6&d>E2+mHk6r0KHJJx|zkXVOEcAhkSh81X@{rd97MX$oU1$I9cn@?~aLr-CT z>72kY2u=m}N6V=F!>K|?sTGnaR)f6h@M1T$NImagWRFhg4PT9P039HSPaviF{RHs0 zM#)JzlXN)RTU4d}#I26FUetdF^wk-x&QMVq-&?xzd&mOppX_#u!aVF9yK}6z$KmrFOn32IYoB#yZ>uG?g~~hq zz7=l$B>j-8cR5Ch4OLL%=3$0p_8vYJ*#Vt+6oE54HS6afbuXg zy(%i)KOIZhG3#T6@#)7>D3TAuLsGk;RSJS)m(RxcPQEN@TjIAB;u9{qL^4uNYsR1{TJ!+?;A?#l~k=+C#b1-dLGmDf#suY4Ku zp?KxHX4aOFlx3Yo$#s>Vk6UZ^0u&(4=Qaf!bgf<8g1v%2Hmf&42%rGLF|bq_>F1wW zJ*}P5EXvgxt3d)EvLi`BXHeh~k}Ch1qa(7;bgL(;a>O~la%7~{u|DL5O+MfLGWA%x zzf1I2UuhX%ifnh|v4*gsZut?u?PtsAw@0wdyo`Sp&y7rNMA1V-j0MQ0^9vdEQNkj{ zMh>XmCKtyxSDR)>2-i!tRH1g zLu}huM^(|22!MjT-$NAQw!D{Zs-rN`d;$io@neJeDfsuI^O&3fr94CLe9D!Mf#QTPaYUM=3 z0@St~R;S8|Ls?r)t_*@CS%mlEQCVE;h%M&~>pzR$d_gE>nkfc1*~$o1ZyL zo*ORoKHIAI+c^&Lwg)nId6zLme1$!6Cy;t(Dy0)p`k(q#ShR~tztxNv!oAcaY-!MV z#2Gt(Dzr*?ciRozG-N$Jh)4!D)$&hW?U6ORy-n;kM&e&AuDeGhkosS!bV~>;7|OSK zg$Zh73NMM#mHGhrba!^X%=Wtm1yPC*Z9t*TjDq5}KdwDZT~M%1{i@=Xx|twZE;BX8 z2m`A?<56zM$wunW&DloIA0qj?-XReDoHn5wnPuTy)~(iam~Fqy14qdmBF-@GV8Ws|kmjEgWb zB2`tC3w7nyD1Hhx)J~s`-ON}!C&PqYXccNZQy4?2&-c!TFJES*@4LsYmcPKEz%DOo zC_Me7I{nJAY79_}6iE-_*k%6ahHrAN)R1UqmgEhk1%9C19YmnPKrH-0oDlvAWne2G zZsQp6z}C|8G$_9r>opWS!{DTmBwqmOD_En~Ka~x?X}`6~rp#5MLA!|fE>@EaKL45c z>`1nPxfEs1HuBA|AIVvXlkqA!pIZp!z%8Q3_^KLsTXOF$v)9K6pMK%}r;Ogq$5Quj z0t)4{ZDK4W*pmD=@!H;)M*^M;w>L7Spi0l6ff@txtRQ042aGiwbHef|A1RkII4cQb zQ}D=IE|oYVK%lR)`EfOrv4H0K#nEbUE6duc78+|PA)U>E0xma;AtS|(r^xbgNex~8!=;nb2NjNX;5?NyvqAN z63ed=Zo-~>Tgw0($x^4|BzgP+C3&B6O*1GQ*%}|i3H@%GXGr~5Kua% zE@tgA1*!=|V30%+-+=9b!{xo{%Ld-Yy3~Kq!q9f)Th5DRSx~B8kC4s0j6f7c@Vg*3 zEOtT75onVsHqjJyA0UjiS(gN((}thr$XaFc3HCNm7=Kre^`sK;>2JCS0WrSXCeJ@| zQ%2%*0RmH~nr92mnnZtK0(}-syydeEfd@tV=KKlnZQer4R;pEb4Jq{%7M5Sn8sfV+>*MQp`%iaDF7R}C&C)T5_jHr$ zNVN78oZ}B1!I3q^@aMs;*49AA_ob_?YxX4STg)J&4+T|g1MzqT3K z5WlvHMvF@1IIiU#J2@p<8yUIjOq|9raOaC$x^4rUS~iBT3($_ zH6aXqM$Ym9w)#=N5N0K5SnYeqeXhA?2b_()Bof~kY^v$uun%g)es;5mIW>PtQrsG( zcZBBH($B-W0*6z%Yq>v__=*l{IyV(qN|~XNLUi1KQL~iq6HVy7IQp_*f1yE%XdmKEh}OCNvaY73h&mje?@P%QH-o<`0)h%m+GZbNRGRPXb}-dM1QgEWK~aY zG2}Mw9s4_8*SUT+f0lCJ2>woW?pRc@?xi|m|4Vf`PvRoS2Ai7vwj*~srfq=v3oPjV zXZz#nf}t~DA<->gxbjB-Fr;^k>wC!$-LE{$mhxlA(>;@3<>KOE$yM;;1-)m)+qYlU z+xJD-YD zhw#{KXa{O1wm%iCLk9&0zBy_}oYE|#Gw(E~$|F!Caf;(EC@dz)S!y=G*CR`R3Zs(x z9>L+MK)${R0hLEl?7p0&U>u`+495HoLxVrf^FX2f)#(n)?$FJJN5x%(Z#pl&4>=Oi zwfWKKOhw7BESzIu0U^9CYTWkbrG{x;`G=3jHFGfdo*={oGqgx{EQw^*DD9_$-vMf} z#)-dgRu&W^G!KBmfLHEUnw?%bMm$CA^-;Y8M?@5*-w|ii$hAABjMeY8gupePXTaE$ z;}6zr?O(VpXh?zs0|P&yX>~4|AIHaEURhpOF0MuNI+5?W-?)zOukz1i;$9*dSw-uG z2Yr+r&9?_;HMwyFM&40TH0qJk3)8M-#i5mDzvGgS!&B`(baE???wZxn*0$lh@XTv2 zDQ2%cpK--05ph3wo*$eK4_rG{cwm}6-Y0-tW+U8R=9e0mn`3@8~M^q63oSRT#Nl&$j&i43aa%`E?Z&BtjZN{9XfEcDs~ z3k~}gP)PG}QpE&RO1 z)kMaNfZUS27Vsaa+9Fnsajkq5R38d12GAA~ci~wN9-cJWPs5>N`;Eu;pPw5oz(gPT zH%@Qu0oYB~q1X}edZN^=O9;~oH!9sbrY`JuY(oX@L=(-a7yD;#(m$JmjV%qoy<{NR zF%LNWqvB2ouy$}8+8y|*$N2|b+p{_f*UY_X>t%eOmx50rAobyR4GHe1C9!TyZjbw>?h=2{Xc8~&1dka2N{R9D$K@=B|5%kS9MtFeC9F^@ zB`@~wjagc45?++k4d1&(r6GFP&%!wrz2UTP^DJU{epFR{i+PAJP42@ek7#`1x=j8S z7-g*)q*=Y5)h1VjX!Z|rhw$b?;eFMVd9XQ}^YPLfe>l^!Sm>O~efAV$>J(`d@$Z-Y z0c4aqwPt=oj;+uQhr-9?BvP*-Fz}VWl=Z&4x>|IJ_m4-KTke`$8^bi2&z}hcL!G+_ z%WI$1CZDIp{pG0h^NPt_Ora3^^Dj@gY-E)Tl%6uatX=RIxi5{0*9eKwAJ4|3 z@eg-!&dY0jVmtG-X8b7Dg$jJZphJ-1cJ+P~4qmdVK!J^$;|;eam7hK!V0Hl}7X@q} ztn>5oYMxyK470*ov*wS@lO@*rLO6+{D5p;I=Z|$R9Nxr(#du^E|*BtvEY5bu;rFa}%*&AlP@X9^7!w zy}y6~W&_9xL_jhC?y^GWk;by|oBx((@PPLrgytHBHca<03$m7$LYy2zgXtP2AEt{5 zA51A<TNs{G*i1R9j-4y~njLUj_-OI?0<192PGo94CgvVh^Dzp<+qX1E0<5F+R&2A!vP?)h`4a9;DA-} znvw(5)j{ul$xag#-{1v(=Je$P{Qj5A6=>cVp0l}jQ;R!Lmi02uEJHUO+`n9fRIe;y zu^0?wf8he>Y8qboteg`nmUB$N%QI?g?F*6DR2k zd7`;EpDKneoHBe9q@b`q7Ur&MMZ!9wR}i02{pizuZULvGE)2@pD3_-NlbHUOlI6f9 z*DN(E1UHK5P^_3S7_B_{pAciny9~|5{7BZgZ(Wd^Wsr7<;p@j~`J%fB9xGkp&q|51 zz78vDdhg$z+}1ex=Q4e};VfCx3icCTlZgh7*Dsg`&ViDGk?szdy&lD5bAXHvc=3Cw z0vXYT<;%C}OOSu5D?lwQJ1M9HXp+xZrkb`kk`Wc`B;&P$pl?FM^LAhsH{Mfn>(yqY zsbAQfox}=q{Q%-Rq$IKHZGM4>uco4zidH;4=ChfVd&GYnaAoSht)9y-MC#X~kJezF8$LYjZaB z?AZZq51jl*?9dM|>APAsW&i;Hdm@4B(3_J?KnTrD;qfNu`Wog5O4m+<*TKhxYPpa_ zhmZGw^ps`Z@%cuZnrsn0#W44!f@{H3Q)`NJhLADE>B14vgzn2RZhV+P2%e?&xEete zv^)Ey``0WaZS;t!Bo0z-p~BIhON$n91N>g8zWFl2Bj~CXaw?;MBG$N z^eq-oH=<|TH_^;@fmNQ8>LcV}<)x~$xPt>+WslR;(JFKPNF$nFYTRz6J?R!?f!Wbx znV{&QaNB=b8W4b8M=0+~GN8ybHy6JFNq=<2$?(HOJS@h^xMP*Jrx$>{^gs1IY>}pj z+1>(c<`338PLd$rnC)^2dk7X|Q@~oG%NY^N_x+&qz7CCQ0y6|x6bcXeZJV>bVox<4 zuQdYA0+r(yXXo1?#-C_FUkPFW*g)YCVM{|O%`e(lleR%(zqK*Sx;>A-9ogFtY3%w= z$(YCw0DWP(Qd|pJZIOro=vYG42rN8a5@yi_kLP*QY?Pe+j{{;Gn*;PN3fAy#D0Gvu znL*}Hm?^hz#y5m!0-o08HWuZ~{5YK;Nafqkw<=HscYeJ0&afpmKs+lN)I#gw2oT@r z=5m8u0~uRIReR>PKiYPF=5fO73s@WmNG`1oL+Rt(Hrw{knNW$>R5(2r&eVk5-D_O2 z4meUrW124bkapKes(nQXd!8JGRgRsu;EB8vQh$tqFY}f2sRB6}yMh z*FuM1TnhiA;@(6qw^J%o5>jrL+D$@I*U<5N%|@j}@V(aY$v-cos^m!~pofB!)lZ!~ z@TL>Wzt849J6rJ|_j2Yh4I}^F?MfwNDOHsQWWxXasFhXk4Crc;h<7nqty6WfKSh#m zg}yI`R{jVXv+BSJ@)Iq8o_);yGbDBOd-WpGoFJsfe|&c6InEhHz={qGq}!h7^rB}d ztXoWd=xE5ZD~vEWL?O1hYbkas;Pw%7mX%Uwxg%_g^~_Q-4f0aVE7erVF1A+&F%R`$ zJBkom>c`5|Myj<}?`hAjjox41^++=M5PAWx|Cz0w5V{L9ZoD395DEWt zaE`*f&XOYCjwE0(IUo&U(~IhoKrX>QfMPpZt+}dVu!|O#C9l0)QF@u<((45JhOkSN zzWQL7Hw+CtzI;haN`hQdc;@QiGu#IlK-lWf3O#BLAALR){6>@9JkDl)rQ&`J`{g$y3T9sB?Kj>g?>sS$!RSCX80 ztgIHI>?wvKFEi3w+La)Cy(4l~9{Kl6h>KfkHpXoB8FDUvQ`LJ?ajfhJC^%X@pl4z9 zfkmu5fEn!U?5C@pqnWyHbQbmX=t(Wch33*=(i6hN$whA`q@Isg&wd|(&CoXF<>d{n zek;z+!xJn#_#ab38Q1cuYqqVe&CaD%rp@uD9#5*&ty%&d7a~HOXZV(_TY-1r{}e?^bEQDN|CtRI(KNrM#bX9 zb?^!%U!0&ia0YbCk`%3wx*aM*)6j@7fkYWB`ky|1DlaeZLSq$Qp53AgJdm^YZ`&QKnuB%marq@cV&NlVE@$@YJY z)m-FkT~lMDzL+pDodwvrxYnLu$TS}(zt@9RLY8Z4MKxb(e%$Ppp(00nG>Zps|9;Fn zt=82wyGAkRA4GEEZKj+U!{X23SU7I(U$uxQMDZqEZY_Aftz|^n_)dq3t#U|af$<9+ z+Vjo_6d{x#`ezOg21|vF_MC5!>e*{ol!||za{t>R&L11#tX5hmk2f-_<))*4vod|x zc$4Y?-qHQL|1h;@p z&=jrAZak>Mh@$f3*m(G2)OG)xe&N6I**RMeXR9=KkBL7)?OVul#5(7N>hvT3@x1Qa zt1aZFJw)*vZ!?+JIVr7>IWIL&+~nN-+ zL$sKshu9xsIaiPTG2#bliQ(;hScTd*EAt-aou5zrG17XH*?|ao+mSXlX#Pm{{P&UF zj31gD0>O5LUhPe4s-GC73jL5b$Cx<_Un9lGlqGD zIWOg6tR*^+toIo`?mquDjgl?iH*!~Eb;r|TbDN-xq1>JD`3X=l#}gOb9xu$Jx1;ETdXj1j6iYBZb5og#!ImY1zDxuc^7t*DBJ$2UcSM+!RX+Qj7s9+ohw z$G(yy%+Fw*&_W*Ey_|dFy4K+*u3$MZEeb7R?;k*5uoa%fF2{Rrg^tf2JG?p^Mok`m z?V5nct!{m_J{0ar^OZt1Odgf>q&&m!(_H#}e_phX2*k#@P0FkA@)|X|6_1KWh+Z_g z&VHss+u7CD-bV0Tz?17|UyJLQnX&GUDD7LCWoft_&w^Q|#BkLTwNLktyR&>7sKX0X zDLp?r$i;FMtjY}x4EjEd==^@Xug_wXhnzH5$B@hCV+1apf>ZsZ=joYs-=*mQ+lwBr z%R5PFet*vyk5Fva`iIQwy9kf{$T{zh6PFc_g+-WuFvx~4B9%$#_g(uW5$W=*=|(NX zmY0mEf#}7#E3J%89XB`Ud$T+K{B8x5oC`l^n$?fW?K7fUd!Js=l)8lSqh{w~Vqy{$ zR8Q}s@)h41PdoDa;(Q*lNC?U#m;yq0G#dZikWz-_U?YauhH(fA*!Ysrgz)a zCCZ=f9d{q_5OO-B-lQd^Bq1gSO`7y{b#)C4R@k-}iT2HdAJS#i;@HPP;~{Z^hbLZS z6y>kWkg7KgqglKGl=buLnzlLS_QIt_*mB>xK&&Dd-sxUwKmIVuCLlO?XL0!MbRZ*5 zh0dw>k`i}k>xgG_QYxaEL(?Wrttno5dUB*gI^(z_w)=JevhP64MRguKnqz0p3`PpP zPZf9P=5AN;NekFp#5$~iO<&^Ow~zUWXm(}_CMm6@x^*Pw{7jmoiSpd9<{7r!>ORhv z(nav<{j^~ir-S%oRt{ZTnWZOqRhP>*ob4q)$(%Uy`;dS5BQ@_^j3gy~PFLZYU7wHZ zN^|DWz7qv(^yA4l0-{{P8xM3TdC+$f#S9VnyF>gwtrxSbj3^#~M(lhcJhKTLi)-`fG+_t3&9D9>(~LAPYSmn%_F>GPNf z^=>8c4e16J)d}zc{;0wgRbV{?PF{$U2#nbiYO*Z)BHL7L`p4ZDvdgGO|93vwa zY@)2kYlY0X_;Sn2Y|T-E-3_TulZ{PLLaC-ezVVc(0>!{}GWUVuTR-Y^{w}RK8 zWCyV6OP-X|y)q3wE0B-v&9M&Ey(#Sow&{FNObgiy%h=>K}$=qH$$H- zDCVNQB2`<4-$R3g1Kd#j|NHvC`FRN1#9iaGxrbe62@emK#LwxaSIjq4uK{sODE^oi zD{Esx!I0F3psE#a>xEujLY_&F|9jyb`-(nuV*OeaZryr#1u@J(=OiTbF2pLZUB6+b zr6Ms(mQv91fI_};*Jt^S5<@$8mS(NjlpRq_#qfF`J)&S&$)(Ie&tfrOJlu;nJ5|{@ z>TLXtjD}6P%lsaW0bp(2lgdIh);r)FPcA$G| zzTc&PLAwO3?F(b+dOLL<1Sdqp45VPWG0IVEeDsE1ss??z4QJPYIn*sdQ&QKyz1DRn za>&Olu+f1zLOqgQ?`yGxPH4sJlQK-(8rl36_8iXan{=SnpPF>BMzS^6qhrILEwcM>Jtd9b7-=pXWp4e)?H&Nals0C+$ z9PsaKpzIQE2lo6j#^t?gEBJi+>VN3#<9qzdj(VFQg$+{Pr5gjzJ;vMt2V!k?X#j~(4USLc>%mMuQwWMhWeWQ zxAoixj`ClLom8^Prw8l0=MBINJNzrGA)1EnP7a@*cGMD3$nM}U@vuLQbEJw(1UWc@ z*0u!SU3Ku6-d*boXb9U)myMWlaF|vc0*CjfLiQG}rZ1SF^S~=$j(x11Y^(y4?G&xb zM8l5Fm7-5MaT0m@dd^g5yVHR0*RSrfHBC3n5L+QZCLlNfOL)b&t8}{cBUcl;M`vRP zYtb1P8ra^>^4jskEK#~gmcgi@1a{ptTH%IP1#^5&KVK`7t@lE%9^U~rHVh8SGd>pI zT0nU{+Q$h+A!y%;7VGk+t`DSd({TFI*AT|UV|M=Jar*@yHX+i1_lUEY1?NXu`tN2s zoYDQf`eraEWDBlqh{Ch(|2Zk^Qy8lq;pt z-34L3&kL7EFrDYkOixa(3+3SNX$TFZmBFMQ!W^|}dbl91_30Pb_n&Rkf>)CZ^jhWk4tSzDG ze$HSCu7DU#Kr@bsg@ZlZKjVW+0)G4QJ7(+{);XrT+}cH0V(;8u7?O)~i+RD&gv8F5 zzpf?78?W*raehfO&tysWYrOcw1zbG+6RtRH4mbU&eUXhIXtq-#<-em_!aP2&(z%T- z57>FiL$~@<%eQI1yndn zi?seOJL{oKj7W`aNrg@}lNIu?)5rgakRrPu#>w@5ViJ7_!5FLjR%udd5976K^$AA~ z?F$Pbbfdz#6n(~AbF!B=lsfKyL2NKpM>c6%%HX<_hR#rQ8ZpJ_GPs|}fgsCg!)#1frr=HQyD(1529U*6R#rmyIB3PN<|w#p zBJ*!wCLJe4=tUC-(+%csB;YEU%K!KVEIb8E1tsV(2hhRn1oL z4>ZD5Zw2r4Z35gYw|(Jn(GbMn-~wrTk>0FK*Ec9CH+-l(`T@+)FZkx`=pB9S?t*u9 z9Cqes(nM>B3rPXnk(uY`uI7rK`r_R8h>MxWYCO`JgAp(QR((}_d-Do+!duWyi1!!p z_5_WLf*!IF5i%zpCAQ6PUAyL3(?0dV*}F8?>sGh?*Y>$MXCrUh7M1F`yHlZd3*XU3 zyfe3kruGB|5 zOh(pD$L4Sq@F*KrkPl8?Jk{w#U>v&{{6h!Sv~FUp9*6e;#2+BM8@U2bhmJ6*;2^l- z^p>5SR{mtYPvb2H8@oG9`~td{pnEiL|Exc&RN>9((;o@mu|6s^G?iJ9A^(t(g`jd-uS0BGIN^h?9_*c<9(Y z(f=Vn&jW7<)2O@KFtr}N8%(brZu6?u<6bbcdUh@YhJiq)dlB*V3_)Rc8Wj0Ppry*c z25=o|epSgSuEp^B*(jGJ23-3&eeyn@Ps-hZ%2=ZVs*$^Cgb=3L`88h-*<)!3n&-zaO`iAXxuGjBee%c`o1<6IN08(B6dGZ1$A4S%0ZH+c`8a{l!TU|xVHpZnoU z%~U0tMDCh9MVJ`rzrO-3AnISdP1V1~z9l*?dNGAGmZEQzSqOqo^1Bp7Cx7CL)FFqN zR2v@au6ophysV_anm>~UuGk-QbE{pN93g%ZZ;CZyTvrB)vfN{peNfSMtW{L-R;^PxqZ1uB!g3bM^oH z-JB;PdEj2mURO|HU0ht-l`{Rs4sDU3yScm|BI1(%?zr_!++0=%$nj+J@Dk-ztI{BV(sK41uj7?$S|2YsO zv=^Q8CR0c5Y?`VN5zccP-j5@saZMhj|+?9BY*lZcK+mNQ(l`MVZ3`6!XG-OSJhRovPr8OoC zBO}>H3N#aC0)pyb-=MyJ|L~!i>x3^o2u}_0i)oKEGsrk4S+sw8FNhGj&DB5#efPw{ zEX$B0RpsG8mciL{iKV66?qpZAb?|tej@>peX^qb%q*Nqd!;1MF0+Rqq<2;jT2@ibw=!OosZ`rA$g=F-HiS|twhbIvhC3N~ns;0J?3&ND&% zLGnd~@4?7wV!SS>rs8`Rn@0GLiHTyQGdetcdaPDavb8CH&h_X(nr4*k*6K}_1Q}P? znbK`5oj^o_p1jlG3Zf-pqJH|O?VNSCEqZX6?CMR_)>CU0A&Vz;4#MdBJ(HM<5(NmN z#eB{CxECiHes~ZR-LN|p>j7PIlI5#>?}YQ7G)FH_HkMSH25qsXSPWO#&xqZ*^FVW zyL#-uH<1`_C(f@>`a}Es`2Nbuccky{QF5mgyX<;}gajinX%aNStc1&$^oC9s%s^-S z=<7OteOcCxN!#eK zAJeJdy#BKY^B0`06VO7jhQ00Str5a&HMVw)@G1vAtV{=V$@6m@eC{u8~Z6bPj)d z0$2L9!+Y-AE*2$w+mrj_(adcmj{cJ069xsdko#6JoZv3vR#Ugv=+cBe`gDyg|#D{n9*! z`O*3hq0i>+HJ*wZ*^6Mga{TxP_O1X`Kerh3eTA{rdiD#G3UUr7aD!DPKgrZd!kOiWCkKK-nbKKcJO5~jjuh(eVdZ>aoyQ_V}@ zK&eKBsp@tIv&k*5+6-jG@VtXFgLz?rbv6By)=&XQmWW%e?xb`SxcG=78MK(~^ z!x`CoF^&YAAHEQquz*SdtNt|DDuH#gW5 zawEKS}Q3jt_{-7Gkm~x^{IbBh0Zteqet2=9R)iU>z(b!&CT8E z0K=nK`%x};Rwf=^RkWbK5$k|mhaIX}Qix4aMp9F!wHICB-=Uto_!_A>K2xQACTo(c$HBRb!G|8ZI`cmt9Bed+(}#(p!8 z!D9Rt*PdaAJuU4P>eY&JgY)b*;oyw*s4z{Xz@VE-9XRq;^AdG*@Cdp-gBo0^>OW>s z2P;@r?6AXS>k2cmF0 zs4bgO>M&z;TRD034Cb+{jfsq@lln+Q{O9g_WP9-QzmA)-(I-EO_^;X|NH-*y z1Y*wyKhJ)!vI)f~?SK<~BgiJ4={;sK#rBI6-!@j3CoFXsg)NBe}sEku8hlAu?D@KJ=~X@|j%0EnHTUl4@=W79t({ zy5+bBv@{dxgF-Lj#A;6dJ~y`{!_C=D3*PV#6g{YYW4Z2Uxir)^Muw#S(fnAqB3A;H zu9|mxMIv+WTjW13zaFABVchp_E(s$Sm0N5cH%9Gz+$h|UntWuu@$UI;oq!XnQy97_ zSfa>95k@(=F1}|15EUpa4hi!}wd8+kN>jhRvN8!yhB0vPJ^Y+cc)oklPnh9Gm_n&a zA*UDR(mJcKfvkjn(CD|Jsr~|@oSx4Q!TIOqgI7}%#h^CZX%c*tsx3wVXKs>09~tTH z(SG(S>5%4^Mb`=myl;DI0EbWC1HVz`!$$Qt;+Vka&-v<=w6qR)7m=uZQf>n+=B`SP zz~@JHQT!NmrL6S%dsL1N?`XI_>or9-H8WJW-FZy6f2IB773@(-`Cv#t8 z*YeqN25~90TzdbGiwibHQ4s-C=BJ?`EVtwT%(Bu6M%@Z&#ZlQ{@KJTnkZ1sXu^SI<;>L$DZw#6*;cgw=5c3tL;hXHVxo zN}cKN56?5Dk_=;0>-H_6|8aq?LVn+p^0JDa<$vA(ZF9AP$M~U_7=wv5(gnB0IYG;W zE<)!*D0LW5+|fRt^>Oq3*ms@+ctNpPQK89yKh|`8xJ`QxVyN(JXz@>lZYTL z`;oTxgA-^RO#IV3;-xoTkdy4YdJvArhFOoU&xf*=c7GB*I+<%~T)ZMX3$26}`i%fq zv-@Ii`6Nnc&7pxj1cS(}fUOhP7dYL<-|T!ywYvnNzEQGv2x{7hfBcT~dtERUUO})f_f^@u)p26e+D$#vq zy{{?gF?xW1FOE~(fc1w@7S3ZjV?Eos3c*cycx~WNkV{bM?s}g)znwn3=Tu7_8e8jJ zu4**lOQylW@vhWanJ}35W3SjvnG1P&l+qVA>p9-7ZoPuwG>kh{kgLcU>vL2eY8ez= z>2h&>FA1r<@f8#_SC*12wpJg1R!dc>f}0n!03M-;!X*nkyO@ZHF=@@*6vVk=7xRYS zFAj6NaD0uJ&B?IzH>8QKkCuz@-&VrGR{eSih0%DPp00}98hkBJL5h;Pohwr)tR)&o zEf{$T)zlEdVI<%8`5|**;rrR<7;>$|x@pW(2;?QqWkL7ouR*K{^A^p0`#cR|H+#&{c(%OYvIe<7Zt3lUlV1w!QbA+3bK5y zB8&<8G5!#_z0t{{qUh^Q`L$EzF*k60jQ_QK=Ly6Y;nloTvb-T&v~dTD%pP_r2RUPsVl>EhM#unZEfbl&?f@WF-rst|JQ9qQsX?V}+?G%sb36S6^Tlgq`@ZE6SB>BqNbS!Fseal3 zi<|kDI8U$%N=%#t!vU%FroJ3OavCN*WFpZ$ewNbhU!kQfI`6;$6hVt?B>1hx07k88Fgb zSA{m6p+RbB8@ugXcTG)=QCmW)deM8PSKi)~Tu(_6gJn8!(NZD(GWI`5-6w^G&{OdD zxM&f#5Du_F&j&D)Ng*KvDOV`0{ng8*>4Log9PofgaPON{Q*y34!7~C?(3O5{6KLg5 zD-#XS3-)bjXiup#Rwj%ahaq)sg)6Wxe29^raJF@viI}(x(rG@MPh=Nx7<4JbszI#* zVPPxgD48esgm$-&Ue!X5MUu~Su8nYY6xj)0)hxd0&l2-K$(?(wviS6{6 zu9N3lZ$CEc`EgZ9rs*&qk!~aLC?;WqAm4FqW^iz@Em02IkCnT~Uba8^*WIQ)a-T6V z(|N01*lr;LPB9s{U|Dm;e7uiDEFqxCIUzkRv4soeFfYiz>3|4EA)P6mr6tea>*&o* z4G89u$TxO>dib~FvxM+63&zTov&8Y4ramtZ2AirXoTk>}Lq4U`6p2hP=|p3Of))ll zO#3&W1DlWw?%AEjm&Nw%NX;wu-hMOh_r-($KwuCW@ymF=C0hPSZs z^NWh0)!z2T(tJO@noOeo;*UF<%V~}{>IgGcU&>Ob56yjss`l>Ew?PRr$vS2w|Iml2 z@>PiSxf{eZk-E6ZN3wPVU=jDxFD;E#y)e7+`&}|Y*+Hc_YB9G5+h3#YWX0*!x}ROQ zcA=DElw&_xnBDr70ZzQUAVdEV77o!96|4zNY~2`TjJ-Prar-D%QGcsAl{Ro!SF%&$r~RyqI}EH zpir;rx-Gh0;1R}y`B-7p*2{q$O4oE7t_*9bSf6LBT|#)Xq2@Fb&a$O1KT4A(SGx5{ zVBZ;P>Z?%B%(Waj?Xyw>(v27WPAC*Bl?e&)&T9_1~) z!8IH`9LD)UHc~oVGd1RLe&OU5m+bQt5YNM#fE?4;-ogT5c1dSaAu(462d0cC0J{ll zNLOx4eti-JZdiS3>J99>xLB4$<;Q-H{;9?Syql1yby(3#Y2g4$emh1uW5Jx^H;f+a zkcryqg@(N$V5HtgJKLTV2|SKeXq0dp`m!$85Z)FY3>S70u%mcAL{JwON5NyV(cb#8 zT+^i_*Fa8q87o>2^B;Ize1R5$60^<{kGm@?+gMX`{p?A(WicnRMh)`m%w{xZ?wt4u zgBpK^{)){NpTXoy?+kE}_y80pjzdyBwjo#*W-cT}wmwhAs^)QP-@cHECyQD_$dA1` z<2g`-8339Ca5Q$Ynv|+9FqF8O0B7j=S9uNZST2>IW7&8e!nc|>S*aoRX-|(Qb%B=E zay3W@aErHJmuH~Nhh%3vJ+33!u0`D#eO71??RE)eXJ^+}xTdqWj>0w1hb-q+$!giHkSDGH#+1eJ`FQL(0>_`^~ zWdIDJKi6ht*~9jwDjKa92__`g9fyl;l9 zP*(-=c#3>g*cktnPhdKt5=zCYA>bR|Usvb6y>aR2QO0g`*K)1PCViS--OI5hV2d<< z;Bp)+{u2A`d!IMrq)CQVdW+!?jNDlt8|5hsDGABp2nesf&aRzd(~RUa>$iUEDul~6 zE*D1meTT`X&?GGh-h;%E`=1$z!nTA&+=&}RG-?Hmsl?33(31i;uC?kxL?%Z4 z+tbq+@*C5>&f~;1HE&n8h1kp+VOl1)1pTJlc1>xJe*VXQ&-b_q8ZPriu-Z10l3gvm zztH1}v5{pJSfZ(TG(4vlz#6uKI5Khq@Aowv=0U0y;caegWiCIy_o4s159J@j7ZTQ% z+K7HA z@J_0}Lj+wlV1pMEr-btJqY3=5^&#VYj3T_Q&aeMN8~O;;s)lmxZ@1$~(N3`Ra@$=J z15Os#W$m$(_n<~@aQu<7(4gv9LqU<1y{72%HNOUZZ5RV6vw*W>N`~6y*VX6XkZ1~< zWK+}YxKf4u=4Z}wO_A=NWh4t|XiE9*EzW2a>`TN3-~2_7mf;4jGf?9DQVtIY->-cW zLQ$)!#r27;opy#|ts0Z}Z{Wu_h4zcbCg<+U7<$!&fTGBP(uO4*xgq@W2&IIlHdW-??15G&YO zTd%JqKZC%(I?LL65^hw$Ygic#_?(?aePe|+uvHY!9z_UUtP74y2f}E`>IB!`cEyUl z_P{W$(SOy{~Iu zT=)9D)Mq4pACF&uRrlWa`!&w%yv})^bDn2o<1Qh&(9US-?FD5{4NkxhoSb~y!;|pt zS~_-{B&2)4(N8;fYwB70Vu`Z}3_mcH*rt}El;IY3Fh>Bl^8yI()9NN9$L#Mz%t(0fe4^;KG!qH;<5Wbf+W}pz+m| ziQpvzy;ts#t)m9M?t}$*`h&YXF*l#tH~UK%ZTEV;>zRGBJq=tH{<>0Lb&*VB!3XhM z#Msx>)if@HwA6w_UNkdt5`@NvsINdqL|v9}dH2rIi$!q1ReVWhQ|Y?aWq>|)dYL~L zWVKLL|L zo!pf0C%E$Um9{L0qhGn%E>i-U$Sb+rEu=D71ptDIK~yS3E0sZ9IH<_?l@Hx59i=K4 zfMV7J_bm-po{TlICti1kD>9Zi9UtFB6^**{SCNCm$yxI@`DX=%O~BiAkipLX0OYW9 zx_=doej^_r0^{U=jxIO9V~{4-&NmaYa}ciQY8jUgC!XZfbhi#yRnk$c`y7V;n#7)t z$!(OICt(Yat>s=vM~j+1)x;LzYTnWfq7B9hfoW0r)OLTt^@p$WRecy3`eSwd+H=2b z!E35}yxWeEAG|hZEoq;^%)wpoP0!F+CHCqlZdt(2aJjTp4ZOa{_I}Ra7W5?VO!$y0Qj9AM5UvImXa>s23Ge z<;L2hGjUjc7X0BnLYofhU_f~<9NFe~Ik&0y9UWb-UtfqRm=atBwuzv;+lxaQ#K|6P z%53rjhBRzRLF-{r(Nh9;5~&xdBv(FvyBN0QcI2Up)Z+Got(7)i9ExUPJe*iGE{&$a z+B}b3UKakk>~{HS)y6k}3Sd&-3%YRoXJG|XghzM|pe*gq)D_Yx1WmA$Wc^Hsn-gvt zE^8s7teMQ>Pp>o}EIL2Zg6uJC>-jJqUDLCvR|&Ebxm~Kv?kOCkqSmCFzNG%{mT(gR zX2j-#JzRrUybPnhGOr&1Q#J1XgunzpeAHh!DgVl5@Yn>k&sM?K{$@QkJPbq`WG?ddfA?l~Dsy%8`P8r1OnbhB@mktRYz$9`DF{zsTvAs9S&;O8 z0#lco2UMP}Bg%TY#G58IE#|l6Z-Gb;2>HpqStmr1m4Zzx8vQ)9D8GZMrm@`&qx^9) zL9Ce1h=!V4(6W00a2o?|jm;qssxAV?)(fMMi3l=3f7P6@4@q-QkJwS}Mzzl?z!{ACVPO8HjO(^f^soqr%b3ffjSw!Q851-gFovc*zNh9B% z+fO>JEO8nn`}Be19-(qJLZs<{@g|oo{L%}~YvyB*=bf)i&%Ywbk<~M%9te=TxTCEk zXmcF?2>^L=5ZY8B`uUdH4;~Ehp|_-&LB+JERwFZFE8D!|0~9d(nKnNwsD+=5Jwh>Y zr`hu&?Pk@I^SwD8ADd48SDPp!kLW0TWzk)!i*OKJd{`tp+63`1fEO)pEa%&SN=i)` z4ceSDzr3zClxv6nzAv9=*>;;m1b!1~v5FZKME4fhU_d@@+xRuxk#7V%E>6t35#%GJ zl(7(m52<>QSGd=O(IZxnJF9tv{Va);XLiTkowGg;qg}YR zIND>9VY^K(_rtFHz;DO_vT;FG7`gqclsVvGeY~Ijf>>x+bLy@;A0KjYv|d!ShVz?NVe38&)e42IL#T23epWoiRH(%f&A=P z1<$Gy=1)6?;FKcYDfe8$Uv1oHmNc=P@!=qFA+#w}?t~+m#TyOOK=;H$^oM~tsrK+C z_sO5J)Gwp1ifSo?)3gq7M~9Zv{W1@ACdo2`F@6=aTOU41dHoMtkV1MSW9@PRMmw7; zc`m|^@v$EH+BKM$fr4_{leHZA@ax+|M%Z7{U%{?W{Sr;uDZruW&5=R-RoDBv(H$2- z>r^1$U%n^ork!7BC^IH&D1Yg`4&b1L+puy+@iI{T)D8RbVq z`<)y*g)qxqpo22F=cZTPZ%X!Jq0|v2wvbcxv$sVoRAGPj8+u-XxuOvu;T2ZDk zM#xoL!3G6_t7>hjoy_L;tcI{#`lmXwL(egF`~I$2T8D8|i`a&Z!7;fWIH=_LGjg7c z-$A{Tna<`!0~M$ybaE2RSjY34*vjcStc`ToUb$6r>=}rc{_+Hc8nmOEmS34c7xR;* zC-PIihe~`;12WV4kYdR#=|$Cvt3C)^fCa69X08WsG|H5x;~_+p2}~g#sOEptv_ZA& zT@@9b4~}b1HS%ZPT`XrBl^R?eSS8>rw}R%ouV#%f&qIj!78H$}U2>r`4Z4x*Zi0;eg}FC?w^_xLKBMs_aoQC9ty z!U`&OU&T$>Tt=f2JTg?xCDAhwb?%Xq!z&PVq$1`?%2!z{{A@0 zEj{%ut!#hF;|Yj>v)j6cTk7G<$Yb7nDv9eRziuyGGa|yFh4QA}hui|}GkoCkY$LgR zfS3y;vzi?dqVvO(3R4`H9!JL>221cRhmnC0m3M4+GBMc}6m)BVCY(v3!d&`%(-Tz% zvWm@~R7h(9P4RE_Qj`zcD8q5FD~u;+>nR4hf+OW8ZD_q@*;9x(9t<11mi);AbL%kn z#6z4dw$GHV-)dRy4&5fuJPb^r---vpfnsUf zTi;}vi#Ry@)#G$SR2LcnQ7)`?wOwD(0vs48!gQ|#0PANZ6Psz@4#IWYq1Y zoSEqqXY_a9G9%qBxW6nT=A+S`{ap$i#RFs|*7d_Cs3-u?wJWw)2sDMD1kb9ydntvOv?EvDTJoy=y#fJ*@RHHN7-NzNNh5|zf&gEAq~N*iU1 zRZpRVSwTrjUzY)rxZHGev=VhoikO(BlVeDCUF>n?EWrG)Ig=&!1vRL<00#?{66L`3 zKq-ioFl^IeprjzR{3y*SPOY_zgj97QP!|FEmvC^y$v?md)Cvl-!NEeU@n_CN4>7R` zy(f|;y>!j6O>yw=e_n$~IAXFfySbU;eW;3x%2=%q_7taH0k7fEmn@|Nc6u~4ll}cT z8Dg1n1E*oK(sh$byDlX2`Iyz!%y0KjSb3M=5^-wgF(}E3#Id%$ z9Iq7t9fVu_LA_G?6WpLP2o8V-o^`1zGCLJLf)HEj8SjAiM9JANhjrYDL$;0MLqosi z)GxSgRIj)R+S%Pzc&KmF6pxLq!;3 ziS{d;dkY6RR{HA+f{A{wtZ!%RC+`EI89<5r)QuzGAN!cAxg}PDo`yku$%AU}(NU0a zu|~w7tmhxF$TQb)NV<5k6^<1o> z7gk*VG7SS+R^l<*f=hqqF|!kL~Z3wAMmk$69pWn*_%_(`1Cnlao|!uj*BXU zkj~xAQlj^anIy%hC%f#XTZhU=Bs(*-qO>ipF>z=$ zzHaOQjLAKnK%iT!I&9D|bZ2J8rSQSQ*vQBlS7NMUsCZCN=P$)X^+~3niQk8s(zojCO}R6Uv(gb-tp-mo z#4n(0t+N;f|2|)FaM5(#g8X}S^Lp-}LX1w(-N&3)n;-j~rlchXbR?qyi%l5urIINy z3K$N6thu@r;V@_pHn!DZ)ytIUnq}H?GV~`0!qT?~oQFUAs9atq5#L?6Piri}Q5p?S ziXhT-sf#f?EctBMqE3dVT;aItOhr1_++?X8Rbn_28wT$Z`E!+e> z)kubk^)^EcB1>o0%S@Vz0R?bzQK${3?EB(qUu1b83!%8UI2wrFhCHt>5^BY{vXItY zQUF;l5!Evi>Z07)K_Zc1SciWd)OMcb(li|?ot3$#f$f{Ad%Imz~XJ zdehub(2!{`n3%gwf1}_Cu2djGLK=Dnffn3C$t30$0(<(b6D=8NeDY6y1h_VuVhoUX zj2i2a{tlc8vPEp%2fsmw29io@O>wKsc%~#oC>rb;Wo<7tqWfQ7E+TfHj152 z6Z=_p2+zHDAa^OLBAB#9t_Trc0U{YEI$$SbKMvk5kvIZxO59@(vwmOqh0e}x4^-Dk zE8psV461?7N|Z9wC$^a8TMy7NF)`88N4W?!?9t!{7#~w~By>gG;_YlFS zB%JEo#zCy5xO|C(&-q>TKa77~IniIZTYhlA0PYt2T;0`q{m&MVF4Jp;7vdaQeH@PZCtccgHpW2@-X~b8+3%!5u*O}g3hFWZ|wl6 zz2diH);z`oPJUZ;>-xmRL{3HKp9JZ)cZ+HJ>?(ldOCT8PHmARm^UrlXYcKnS!-eA2 zuN*GGk=x;L@sLXTJic{J1^#XjXNvBvtd$@bQ~GiEapQ-7#3GIW*W#BVu^s*#U?c-# z8^sk6`~jY%>+no931@DxlEUEqX*zB7#aifthMA`7f2)8ZD+6VN0sBlCVPWun?H@Gw z?c-XDfUUNg29$wSly#rVcToOA`Ol}ibEl;_bP1Ju@FLhtW9;O+>O_N@*Kgij$~1}X z5y17gb+;UP2dY{?SZ2@BL@?a{t_uFBsQCN&88IDhQ~FZKLcVNWFd*g35t37JlNwO4 z@bpV1Tuls2Tuf9;%1%0YjqOK(X^+@%M_lnicFh7`9Mr>raRYzcjP60)X>V_Dn_Sh4 z6Fi9_j92+W(B;+%+3_b6Y!h1kUr$|sd*&yvi%Xo+4zCNtjgcK*mxDieUEOv=F|0ATf_xOjs$le0G^`nBP<~;C9sJht*n$`&+D4TJbt+P%?{SNpY@;jQb zdJWoY+!X&O(aPM{wYus`JU|#TytO}hPCfAOkKcK@r%opR>H9m`vJ-i7CwJ?|vxYV4pmdrqL+7gk)#)y`D5;FKZ` zF)k6FpLw(KlmLv`<4j8o**D~y2xLaG?10d}J*VS@Uc+0qeo(7Qi^0ynAy za0uC&cV~W0ac%ef(|tlAy^|hH3Uu?i-*lq`o*T9Ug6$o#8l{7acOXGHF7_XwX^;3* zBpNabXYq6eF1lSu{IBQOe{(&cR;%J}ejeeq`Ny$;VZfjy%V}C&uqB9I5R(oafqt-pR<*$~g8X4N2vB#SXzK{QlEId-{;eot-R% zJ!g^X>67u;*THSlX=6k5%%F|W+}vD$zaB}@-~W#*s^@9fq_KrUHYOJ-d-?p)p4{gv zQZ&g)iXG0?NL&9CFvN64z7AD;*5Hqu5iDNB7c(+Ba1GkafY>${M0n{Z{PB#q7x4v- zm@tdP^de+I-ZX{$=AYgL9S^xT&z!yva)r^{NBT69kSUhljAx65Wh?)9MVhBL*fn|H zSWpR`w*H1R&DcZMcewp}W`~@+c1=I6Q$PxjShYp717;rtw-}o3}yq z_&GEJDg8U}B>_?hyRQr1PZ_ZvkNqt9@!SNF!Q6Wmf6RXoZ?Si56xZ~p9g4f9)S1%P zrHf3M2i1?3qa6>-?O8!8`Py-I$uX$L9*^$MN~#HS^7>o1ygfW*&!^RVsEV{M{Ej>^ zU5QW!?IcC_U_j4g($-7pkHsUBpikL2Igi*OIrmI(s9a+!CT1``1cf3VvU9DRyMUkB zx4QrxL{^wSjxg&n11NfPI}8xvwDrqw16)gLUSt37+e0CJ?mL7w@Xm@)V~`&xWxbZ& zf(FLeTer|Xu+nq(_c$6S#`htx^;|3<`@5FWf(EwFAHOQXk55&rC8_03mO}ssPc=$$ z4{Y>>L8-PACt^89R-|=!&l>$G1%0rxn~3daf#{z9{pE@q>OLgLOm_BH`x;Q4wN5-0 zlv}^(E) zcunst*;y~k9gUb21+)8=>(S;U&_ZFP&T`LQVx)8D$$Z)p^U}A1n@NyFJfyyElIp@b z-|xagx>~b2K^V(V;>i2%N-+(Maj@>NgN>PJQ(UJ!5m{2e$P5W4oz2QAiI);7aCHH} z3P8@#eg@@mZ6}D~y>Vb`_^<6f;(l9sxWXIaX&L{1&C%oe=7KWSQ59^gdhEW@*$rse(AXc57fsN z_l`OgG)DmZjtT4BdwzAs5Vj0!2`1Fod)2=Bge)`>4!Kic^F}q`GdagKtDB43zY8Gj zHODV(W>v4E-`r9z^0y_w42s>^CHGQ-asaluq+2Ng-IuP(c*a!XgC|U*x16kck9;@T zBS);PL~L_m?Q^PS)kD`$K1{XU);Y2PTX~xfR1HueuBbsk*+2o^OSu^obf+ZFdi_=c z%f&g-H77b+{fvNLG9@`dFTmZr3}0}!Z;>+lWFS$wM<7w7rnbgXX(=BK*28swvR#-R z(c1W({|v-jF1|5Y4fzfa800>4%TwPQP?`Bzb_aE+sj2CCI=4e5HUOzUiR?^K}st0yFF@?btDk*r&WIC-yRwpy9cnpP%e|h8CMh9tSnl` zXraTy6$W{xEzhU{q)&e>jiuj5o3;Nfjjb)${{6Ab3u*E#xv2&^I>NaZ+9o_G*g)ks zVjE6(fDw>sVLs8f?!)6SGTrA-Csx(Vs;F@G!OGj(V4#z`gNo<%$OmE>Pk%%Ne6*wY z+&STgBH^mUxF6oMM`eY-I<+Bj8UWFH*^e%3 z8JcYXhBg}N5<8EBj)QQwD+A$70k!>Wg(@wzZ8T=j{Q( znmi+|=;uk0XIiR%sOv5_R6Nsmv=~6a%2ATRK{?5H<}4%n@^9@!Pwue>Zr^&nB?+?S zZ+e$4tT;fNxa*_2)W>CfQwED2K})i(VrQGCkK-G}HEe=}tHb&%l7)tEK1;0vpBm@X z%-Q>-Cdh1ufvo;%jP-@Ws<-bpSwTWn$*N_PT`Z;!Vk}q)SEX2(MZN|pL^1qEf5GbO zl~UAC(iFT9d>;hBJv-+M#bJ%~3gQFL?+BSR&@lqqBQV-m*1E0FFw1+TOgaT404fqz z>IL#NKSpSq4u*mZ=f+pU9NZmjH_rl&!SWf9b8FeZJ_vYzBB)I@K&pSe9S|&>7j34K z!t%swRpNSrEwO>kd_`C`v9>Wmfl}-v?ULO;)2ip9V zrxQt2Et!7wT}EM}BbuMGK+k%slx9=$yIIj~AW3;AqmUW##tdMtAW-(67#p&42tfMM zlcTqXcjRp#3{N6%ZH!I}r_=GYJq!S`hRmA3`m|f}X1lyUo3*X9CMSw{e*1R)BSzqB z?C}<>+aU8~4_$59t&m<&_eBIOZ5TLVBhLZ@suz6-yaWI#lh7!!=QfFr%-c3nwXCU! zxTcQW*E_M5bl&c8$nAZBXARG8_!RmU+SO!pRxuwqTQqiRQQ8aoS;35*2Q*lCp?N4I z&3FImD+;M=FTQDTA8EiTo5c7DOka_yeP1)Xu`a%ONFdmu_kCPb#s#bKbvY(l_b&Yb z-xnwne6Vzp{GfxFlVwT&(^QpA0|b#{v@CpaB1&Mk3mFwHKKbo+3m~O3k zjuE(*c4v6GDHpMI75TnQ2+=sxyh2P@Z`90u6w-w$8PK+)?CGf+3kl;xEPcqJtA?(6 z952TAm{d8;c53D`h)00vYxEkMlwS;k}6IodBQ?*JhnT&+RDR7pugY;1a+Tr3+fH(p~=$z#t+& zvKkHJyXjgW7vN;aGY+!W#!4BUM)8jcCM9u=Po{>n<7HBsv>7)saV*R#AcrXgQx+Gx znm7grLBnzCwK?tNIgPl`E?j8eYd=(xP9CSwKzqM&lvc9h=cWSn?Vdxf1Fe*Q8f_2$ zjh*O}+i_~kFRGZR3WtYp%DfLu5$-17Djb{fblly~;>v`)r_0a5sE#({lch1x5N2CpbqrzSNuN3wo+v zRO>?{!jWaYckXRD5E_IGAWxrwYmC=oU{iG52isRr{JuMoC2FFPkq^UDZ6#m`&V-xR&W8Kfw-*|T4WX7m1z2cFM$(pgBmkBiOpEhj6{B_PML!O zDAL;FLf_gyYU^8TO16HPt!<7oheEe_3O>&?4$ESF&89w1`N(D+*%dGeN!ke9?*u6BJkah zslHVXe$lQVNbd4jq0JkjaJP#mriXC^zS~C~vCC zYUj(XBX%A@EWj0NGvw$I`(Xvu-&pL(#~@KG0>q$e@*WbZ(RgXf5kho`nS;${CIf|F z_3c%OVOqf_^NzV#2^$gHN0V%E9|>)7yx~-w3rg4iB(Fz1@HS;4xiEqzm|-jep1667 zqzXaNGwLh&Xg?~j9?+?kt?37SInEq#yHG2Hu?);8Fh8rlLU_?-(Df7tWQR}(d2hP4ynNufmX_>Lx+2B^zJX}^8jtgU zYLy8T&1TI%FZehpEn6AHh5U$Ls%s0`CcnzGf;xCqa3~em@UZxbET&@r3M@TZ4nxHZ zpJe?$_M+H!pqPeE$U04AX{x1R$*J5kp)D2i-rBM~jWj>-y78G-aYlH@TM5Tn5vMuS z>P$zLeu*r|+|S($T5u6ai>x0qXGbkowf zD%4TK1E|NDvvDw|H>7*y1j&V;6ESel2FVFCAl<-j>uHudQ%D^19qWhl{c;q?ra-mp znhkoOH(ec&xgZo_G@E}qs0Zc<0wzn7O>xa1d*ZmX{H=RGx0Je!c3=>=C)^?ZKou=n z6*z9qR z_nCIYXKPqYjv8YvA+K+8ngEs6?DPfs&ea6&9k+G zZ{DyjO$T9@rtd<{k^RzexR2i3&2U_}tUtqU_kJ@o&2+S(0#ls7J+1Dxl3dO1JX*-rrkU+Q zT=TXP>;w7Pr%#(=&g#Q<4z31z?lxdZ;tT_ybtiJRvQ?)Z2db4-s>WK;cCF-f z%v&3rjEj!uhQ)!17HFyv9zMDF^s}@3rH8w3cL)Th3UykendTm*nGP9U91Yja(H$^C zI%U8b??yFTHsXWvg~r9iVC{-Zp~y98z@^`8jLFog`pDx2ej)^JQbd(Yf{F`+x4;O4 zV@Y3zV|LShcH6j+kTdHe4BF)|$+$oL9=o7rV6{b1=TFbHaP<}&4i!L8%(4WXd@(xf zmyz$peAzjg*t;)38OdSGtfj;|IW|_P#~VABBE)a9pE}t=W zu4xa`Od(7|#k3yEor?2(dKS^y2uLBwWLT zzi$E}^T~*H5dJnn$S!wujZW~sj@!~3X&1>LZM)R8P4>m=Jc!Hwq~|}ZZdjWS5!Nn2 zF;MmeX<@le%{i3>?KES{(Lr*Dy?uM0ete!~o;-WEX}2w9J|Y&=2s&$cS6tX&uSqK% zyO~g$U(&A-!LOS#=gHAz<{V=3+}WpJ+0LX!A1rx4>>KR-Z$}fNqTpW82PENVR}og) zP#Pz;%a;{zRfem+R-dd6i4k_pcan3t?CjmoVb@j7c*!}qU)wIchLO#g*_Qd$Z=(C+ zE$_;PJ5zvM3Osqq9<)>y5CA0xtQXbmQgit%ipIj)Bah~Z)e01ejj05d$j+Zno*U;4 z7E_s*9FaWn+qNHgf3Ivwk3=F8VpL3^(AZmJVM}Hei9&|8gP*1xvHnX+^OQyEV_AV> z@-B_BIaEHo$5O_fmVjG)dgB7}#gj_pvNd337*4*8?8kdpb6dI`$lVkK=)_KrzTfO(@$+F)RP=c)? zEVjPgVrE73^CcPHGo^2Hip^d-mNXX2g_dHHq3F->r@`Btu}S2N?;YlN*%KJeVk&B^(M$}sn>3_X5o&b zY!)oXe_O#9y$*FA+kS+Zf%Tf+L*I6r83FN)q!6ongj{56dWT2cN531tJ)d1cXK@xM zkTruGcz)>1uRp%Afh7odrIMDXA4Y1PGrE@VK+mea)<+)KjC-V)b|GL`AQj#sS$Ok{ z5O+7(zb+BGGYsL5dyY>nUFpp82+{HuIQQ^M4r!@?C}6OiFmxMRF(A5Y2q8&jc*ZBV z!pDh97t>o}>sphn7K2X8`^M5EkmTHnKFBvR2dx$#1bwmg;H$v zLRKZp@Xywc4khl|ne!_IQhmCClf)JE34dpAf1WMtRLM8z-h861(vO^dw{kmk@H*sb z#pvR?ds%t8G&cO3%&uGW#uT2I^-y5$tms_aYP96bb8i;t*#ayL5EVBR+$W3utPA>P zS9OBccP)bFQw-vo5Y*TYT(Fr<=MS>zRRtJW+qPrNQZ~K};Kme`?*IM^I}Ab64wOKy z&o^gpl0CXo?#9sgDtOfnn-=Nf(s@a8my{&*w4f!79JHLv<@FC(lxpy}BaR)V@9ZKZB}>8UskmcxCQ9+b|<<-Qw;>9g_7e|qkX zJYC64KV6thfT!nQ-W7lmgzKSgOKiExujl6cH3Dg+MjD(ys>%8m8Y+*IBBMh=2Xf4_ z^w!J)Bd(KEK6sTYsuvlSvwK@i*N6y7lH%o~&Ldo#BVb-8?y)&~WhX|A`4p9ulvE)E zk9?p&2_1I@cd39w4Q2Rwch$?jNFml)U+=H4q8C>u&TL4(iWAj^z4iyD1UxTfH;5pe ziwmt8nbM3Z1GB28U1B|NaOkkQvB6gUE<7N9YmHcdu||yvo#nh&IPs2)hR0P25y8K- zG_t)EUir>X%;}?P&yr5jki%ttH>}2{1xLw>);+oOMk&a#L8Qj$i|AHtfpfbJw^`|8 zWse-FbDL|yadzC#w^Rf`$x0tzyKunr)@bT240-2&8gv|m3t(;vtxHwKH8iOL&j)0S zel^Ik>Bk?eP{KrsQxFT!Uu8Tv8fhXM{vql%oq+L{I(l)x|FUosqq!DByx zjuT8U)+VO-zw>7S;v|Ql$v+CP^_lZ1C4{b?PBZ6)i`t}W>wXz$sBQNP6jah=M zNJroqBtDo#`p3sn6BlPVYP_Os%AnRonwfQDLwJnpb>Y*F!VE{pPoG*>uB&1;0dd`i zI7ot&N8R}8LT4NTks>WQ2HY-SFR!-9;i5#APfiKDABnLGx;8wh>68gzd^^vyZ&n8?*H#j6 zIJQX+p;ja&b7|Op$FqC7@W8de+G<>IyqZdK9oMlsnGT^fD%8uTx7qR)SAn|Q`t&!# z@T(jh90wSG-w1>Ig>HTMT^7K_Z4|SWx~aJdrHmDrYyr^2Rojv6)u|Sho{VXNMustd z&ZX}4X)(x#;XoY8VFSI5(s8OeJJ~?LJsRK=e0hLx!+L_jQ2y!;E|^)x4!y`bM=zTY|9@MGh|S|^42_wOgiBI30|+TK=&<%Uwv^>4@~f1qM+48-RdH%M>1 z0{Oc94yKs+No1^fv#Kv?{YzOml@)*_?FdU)+NF)m>} zEjL!XP)qP}58|+Q!8mz1&LzYezS=R(4Erowq^Z|0Fk?h~i+jP(AGWo%%v+?)VPiBJ ztm+@49*R5tzA@DKy?acAxzx#W0GAzs|(VwE?Ab(h}abgG;mKtp@VT$U{qHPHW}BLQi5lW!-> zt^Om$&tZTFfX67w(A1Y&*+)_MG_e_vdiT9HOTtZ4;cfBmh0F}s^j-~LuNu&Jjy6O%3z|t{=`me z-7plF-|@eA`EdmXVCjy>0Qu#4o`xeNjV(i*%Cn&tH7TP2i+r^dQI?JvCW+?%5*u&Q#9dzD*@W7;Q44kKVc!BVRsNfK61 zpW#p^F-1fq#-C4;cP7mcj%=E>Ff(`KXDG6ul&+UIZ5zwN>6KJS7-qg;9Bn%})Ya_6 z`?V;W#(PkK$KqoGe72A$LkP6R5%=s8JMFUNqRH67rN}_lIRH|VQ#F@HK>b1BLvhHD zhBh|U_}mJrcriNlJ@f7(2ZsTYI4+>E=*E}cT|e4UX4CpUFsEg*PdodO*Y?(AOgvDI zRFd*mU0LHJ-veR{Ft<7K&D!)h+Ux6SLhwrf$^!L4C!a?2ug7g~r2=#U^dq^BAbAF5 z30riY%cCi<*3Y_^7Y(}VIR7=MGjylPVBpkBTOwqz5a$v58XldC1B6gE0Zdq6)4NG6 z7l+3o23cu|{q~Pnh3JLHB7lbD;qK>&%b;MILRz+0eg11@eeov1kOppgcS@4hpENAv zpJ(&p%Nd;=6jTi^QDo2`Z&VjhbcLy;t0+LG+`j1i>!+RH+8iA1xu4#e93_NaTkVPx zbtt?5P%FOD1y6?UY8H>su9_*rA0iX!%d-TNIL5Y2-M-UoPE7xX5{yOx!iv<+-K_LO zRxh3kClZ|1Fo0w6a&=aPxBUyKn)D|pEZwQ8pqJU%LR^@%!U63(bN#RwloBPhY^x?C z%l!Q7bO>TK<88^g6Z+s!T-v&t6-f?pmhLMet$0U(nd;#KN|eN?pQ&$taK+WL07 zVtnb_>ut7h0FB%B7CsJ1R<1z^Lx~mI-;4zsN~Oko9I6#Ko?wIRVC+$GQYCqD$Z1;V`~FRs`#jWDBc&m!JemOk?6m zSBVgS&GRu%x^fELU$%vI@b|-=L0Rj)7Hy#crU0l)Q$?8=p}Ie4DD6Z~ZuaGxXsCT! zrV{5Orph2nZ86~vmua4Ctv`-k$%ebR(3&)k*$foBx2K_}onxx*kl^QSrXw~<*`Sm=wP-fe}0pbNxB+uR{l9fM8^ zU^>Whu`+Ti@3^aoD``j7N&l*LgN1M?YC z$3L-V0#?DGvhae)$Vipcw$VjXw0!Mu2>rq!{-Vj3r*2-91QUtW9VcX~vWBIv3v;Cz zn&}Ihwy3G8xqB8MdV*0PpWg&<901gYaQ1g|nOL^{acI;LR#n}<2wW2{%%YCFtZ=|+ zR=uP0X3vK~^SJCg?4E6uucSbNvxK9&o28Icw&RItMeE%VxT(J z@~oJ!xwF{9mN?w(^3RbiSE&Y46rog{3DL=?@U>j_?H}&Mmhy3Px5K@DUmP@!)l{4* zpl-Yt&QddI{7UKKnqo{oexu4e*91YmUE7i=C`;>C5ot?7!y{bE3q||dCcG4X330bx zo3O_Bapf0inA((JANEDrf@P=`z$@Mz8yl-0H7Gm6tJA+5(*om$uDeSDc*jAM)#2`B zS>cE6w2)0y6Upi1K^Ae@3duFJ@+Te_4GuzKq42o#1iLL?z?SbuEyICb9@Tgv?@ zC@8Z2gW`x7gFk4>>nWu5tpRZXzGTmTDy807Zy`|FAxNo5;U?Skj(hwH0XOTXx2Zg< zyFt%!*u}GMRPVK$%a}pE)&%>mGs{i`!)@~{4p5#GPMJ^3zoNU;iYJYH!~Z~_TrL_+ z^ng6(l@$lz#QE?)S<@=iv%5W0@72r5PQN4{R+TIMVLUri+=?&2$)(<4s}P_2fc*P^ z)|SYOo6Ljp61^;d2ZCA+9(HniYSabwwU;tT3+H&tY8Gv#rlqv}{JFEc4sS?FnHGB} zZq=35qu<(jU+oR}qnAoOgdqOUVs`|`0=WZBT<+=WuI9TPWSc4JLe|wrhh`FNG5}y&f2b{ZUH)_K&%GM6G3iT~x!<|An+>}v+TZUGDJ^Izt ze^w@^z>w!w8xpfIxv!V;71^%cZpO3M%%dS(>Q1EY1AqL~f8TZxhuh?{s?TC4_U(Cf z+2NyxWsRoYx`XpkpX5vEhy8y85nUDgaZy*2(@f(^Sr=J;!$>8r?H`5GDvsE|7C68$ zUv&lNG_Oml`?r9A+<90(#bwea;c{KC?1N^|AUL>e*04aal%9gWJvAbLaF-R(gRNO&uNpUuqas)8SayGf za7e4S5Mr|P7&pXH&UHt(ntcEXHLB!G{cW9CdN#hJ_*Y(UH-t$YywcmQ4L|i!NCQORwu;R zk~Og-X#?t~FlsDe(@ZytWHC`v82TT%E|TRj1|wXyHnVv7M~^^NCKsrq0+4%*N@~^U z#&C6kH+AYqi!CjHQgwvd7*$f-fdgIn&l{^Y35}J-8{f1>2aR(c;Hoq)hJ`K4t&pJEm!+~rH>^nT?b^w80|jAVC}Z*e4J9D{66R>9bts2h zRYnE~sTgSl7pSBLgUO2gGTEd{-a_+190YP*&9657)gvqo0XHZXuo=^fx?r0#n&P zQxtY$9mmg?15x;N|3}W0(Gtk8>pM1tpE%CUroOgCQDx>#cEj-P_rNj;+s{?1XPa~Wtg)hWi$8bs6X^aDiKdlwUw?by=6o4p z{`r?L&$s97yp?*k=UP=u$jL6&0B-8Y*jT`xK^5vUB5Li1a zubc;Bjp|N6Zfvp>3WnMt-_^pZ0SOecD??w5h3SV#d^eo1E7EguanXGS=m5A~!3G`o zg?7!8J(Is!m&om(bIVnnDXuB?zaM~@rxMh_@P_Tvi&6N}8xCpk9KveQ+GDJ2LF~ z@9uj6cI zU#&{WC2P(;@-;`6hCBLg7pFJ{+`N5vg{|U2$gHhtwldSOT+U!;)=K=54xLPDKzz{{muDKs%sjqZ9P1Bb| z>SK-6!bHNqW5F_1GZVHN_ig78vnO#F`1;i%uMokT3^2Lm&iRMPer*>%GYxCU_E(`u z4r0xfbK|bn{1>P!wfR4190C?C8Cgh?DpVy`E>E@Oqpnlk1+(iVXt!;^woif&yRebO zw%zrzq8$2e{^JL+*?gZ-E(o}t>26^j%A3LE3{_8^EGSi?eRXL?f{e^)*0SHAw*{I2 zbMkdlBoRd>gVz=N`!*$lA|eXy#%qC153-9>+ol(v!iATxUk_yPXU*9778^Ns@LrPK z(OzU^wQoK1l2rH_POnK>of9p(_ZnG=YA^<%<7Nr}II&FPDJOcH=@r9|*CpRWpgYIy zjQSlbtwqskSL{{hP!y`$XJ6vO{Mpe|+@gL7pKY-~+PY zoncD*g6rU2|1a0U&!5}vKMlclQn1cz<H$`Bn!t$6 z0xrxzj*)LEUrMN{w;uteAUAMY6;hvi(2ilh)Buk_iIJ zYAl+YgG`Qfx?Pm@Wh5w8>YpK)<2{<>dr~!uGzM#Tg4^C<-JdD;eZlPrwP#vf08_4( zDe@cfU9UuE`*e+J=YC+Afa84 z*Gj;|&$V=Cf~a@yN~}V+LXcWUKh__w&?&yEotkH)AYY?K@O!oUr^;u2i3fJa4B6DH zp27nt=&8Q~y2VY;!&_^-?=JLntJ<73m0fgvna)7P1#ytoDF}1q7y$+h1?xK{PMMjS zrp=2uJ>_7szjZqP8M!hZGt85d<9@JHw!F{0kTxI>3eA|9ZchV9!qZdd-_a565CCrQ zcK5OxgZ?5-Z9b2cJWd4U)DZyiED3r!h?UQRlkd2sed-qQqY#op*9U~rkC=oz7Dd4l zvX@{`bGJopEeCqAXcPPMFn&vs(LeSfVP4HrNhdkW8EFeFQ8^epT!_qd1POf>SA71FimotaR#wMu;(Ge2>$(P~p6Ewf-ehFQVF zbSb^`kwQ%#x*Hj}ZWb`*;E!#O9XqPp5b|BpY;uh}sAUszQZ>`ymbN?$#w#1YYPwPp z|IK?JoJxM-Ix^FcD{GwuJ!oXJ81vMpUTHOPss+s_mqi@Y!VgjKF*vs)ZjKq{oxG%e zy$cl-Iu0EQYrwfy!)<162kGV>ZlHaPvB~dTOSDCp!McdgtegetQ3ifnVV-J@l>_LH z(9*P^NbBX#iWPs4-Sy)$qt$zBAOmFpDhWFRh>Sv`jm|uItENWl(P@VCwvF!n@0}74 zE5Bw7lu9L<*6gfK`f>IVpnA-uh!?zFLmiK{Hxb|nw|^;hKF-{D zp_&K^A9TptN0E>z7nuSz9Y5VBhni)qP7_5+-(o6&03o4C_mJo1j1x!Sp@P7JO$uZt zSxJwMiW)&LH?ZggYzKv;^jTMh1b{sikUJoed`L-&wXN-O$Ds@JOa>#k-Y!Twm_y~# z@NFf4VKhtz`}MP*e3Ne?$T>Sf{-)+`@8XJIo2$u(mUs0T~~F3 zYh&*e z&gZl9&!yX0uGL772Nhjit}9A=okf1r1=gTWDvypmk-yeg+TGv6L7rKcMCPEUeOzf1 zO&d@MVvdTW1o0b61Gro>qHKfEL$L`LV..[-rc]"" + +Examples: + - To generate an RC Release (marked as a pre-release) + - ""setRelease-v1.12.6-rc0"" + - To generate an official Release + - ""setRelease-v1.12.6""; + +partition "**Workflow**: tag.yaml" { + floating note left + Workflow triggered + by the ""setRelease"" + tag being pushed. + end note + + :Extract information; + note left:Extract version number from tag + :Bump version number; + :Create Pull Request to the branch, where the tag was set on; +} + +partition "**Workflow**: releasepr.yaml" { + floating note left + Workflow triggered + by Pull Request affecting + **ONLY** ""indy_node/_version_.json"". + end note + + :Extract information; + if (isVersionBump) then (yes) + :Lint using ""indy-shared-gha""; + :build Docker-images using ""indy-shared-gha""; + :Execute tests (""reuseable_tests.yaml""); + :Esecute ""indy-test-automation""; + note left: WIP + :build packages using ""indy-shared-gha""; + note left: packages published to workflow + else (no) + endif +} + +if (**Review PR** - All tests passed?) then (Merge PR) + partition "**Workflow**: publishRelease.yaml" { + floating note right + Workflow triggered by + pushes affecting + **ONLY** + ""indy_node/_version_.json"". + end note + + :Extract version number from the commit message; + if (isVersionBump) then (yes) + :Download artifacts from last successfull ""releasepr"" run; + :Create a GitHub Release; + :Set tag and title to match release version; + + if (is RC Release) then (yes) + :Set pre-release checkbox; + else (no) + endif + :Publish GitHub Release + - Containing the artifacts; + :Publish Packages using ""indy-shared-gha""; + else (no) + endif + } +else (Close PR without Merging) + :Release process aborted; +endif + +stop +@enduml diff --git a/indy_node/__init__.py b/indy_node/__init__.py index 17c0aa94a..e231f2a84 100644 --- a/indy_node/__init__.py +++ b/indy_node/__init__.py @@ -4,7 +4,6 @@ __author_email__, __maintainer__, __license__, load_version, set_version, load_manifest, set_manifest ) -import pkg_resources PLUGIN_LEDGER_IDS = set() PLUGIN_CLIENT_REQUEST_FIELDS = {} diff --git a/indy_node/__version__.json b/indy_node/__version__.json index 822555dcb..1319e6fe2 100644 --- a/indy_node/__version__.json +++ b/indy_node/__version__.json @@ -1 +1 @@ -[1, 14, 0, "rc", 1] +[1, 13, 0, "dev", 0] From 1957de02cc6b3e46337d98df54c94f48d263fe7c Mon Sep 17 00:00:00 2001 From: Philipp Schlarb Date: Fri, 13 May 2022 10:39:08 +0200 Subject: [PATCH 08/10] PR Suggestions Signed-off-by: Philipp Schlarb --- .github/actions/publish-deb/action.yaml | 23 ------- .github/actions/publish-deb/publishPackages | 33 ---------- .github/actions/publish-deb/upload-spec.json | 8 --- .github/actions/set-version/action.yaml | 63 ------------------- .github/workflows/PR.yaml | 21 ++----- .github/workflows/Push.yaml | 9 ++- .github/workflows/README.md | 2 +- ...endency.yaml => WIPupdatePlenumDependency} | 0 .github/workflows/publishRelease.yaml | 11 ++-- .github/workflows/releasepr.yaml | 4 +- .github/workflows/tag.yaml | 16 ++++- 11 files changed, 36 insertions(+), 154 deletions(-) delete mode 100644 .github/actions/publish-deb/action.yaml delete mode 100755 .github/actions/publish-deb/publishPackages delete mode 100644 .github/actions/publish-deb/upload-spec.json delete mode 100644 .github/actions/set-version/action.yaml rename .github/workflows/{WIPupdatePlenumDependency.yaml => WIPupdatePlenumDependency} (100%) diff --git a/.github/actions/publish-deb/action.yaml b/.github/actions/publish-deb/action.yaml deleted file mode 100644 index 6b8c56d74..000000000 --- a/.github/actions/publish-deb/action.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: "Publish Debian Packages" -description: > - Publish debian packages to artifactory using the jfrog cli. - This action wraps a script that performs organized publishing of debian packages. - -inputs: - sourceDirectory: - description: "The directory containing the packages to be published." - required: true - distribution: - description: "The distribution supported by the package. i.e xenial, focal, etc." - required: true - component: - description: "The component type. i.e. stable, rc, dev, etc." - required: true - -runs: - using: "composite" - steps: - - name: Publish - shell: bash - run: | - ${{ github.action_path }}/publishPackages "${{ inputs.sourceDirectory }}" "${{ inputs.distribution }}" "${{ inputs.component }}" diff --git a/.github/actions/publish-deb/publishPackages b/.github/actions/publish-deb/publishPackages deleted file mode 100755 index 76d7fe868..000000000 --- a/.github/actions/publish-deb/publishPackages +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -SCRIPT_HOME="$( cd "$( dirname "$0" )" && pwd )" - -sourceDirectory=${1} -distribution=${2} -component=${3} -uploadSpec=${UPLOAD_SPEC:-${4:-"${SCRIPT_HOME}/upload-spec.json"}} - -export CI=true - -fileList=$(find "${sourceDirectory}" -type f -name '*.deb' -mindepth 1 -maxdepth 1 -printf "%f\n" 2>/dev/null) -for name in ${fileList}; do - shortName=$(echo "${name}" | sed -rn 's~^(python3-)?([^.]*)_.*.deb~\2~p') - architecture=$(echo "${name}" | sed -rn 's~^.*_(.*).deb~\1~p') - startingLetter=$(echo "${shortName}" | sed -rn 's~^(.).*~\1~p') - - echo "=====================================================================================================================" - echo "name: ${name}" - echo "shortName: ${shortName}" - echo "architecture: ${architecture}" - echo "startingLetter: ${startingLetter}" - echo "distribution: ${distribution}" - echo "component: ${component}" - echo "uploadSpec: ${uploadSpec}" - echo "---------------------------------------------------------------------------------------------------------------------" - jfrog rt u \ - --deb ${distribution}/${component}/${architecture} \ - --spec ${uploadSpec}\ - --spec-vars "SOURCE_DIR=${sourceDirectory};PACKAGE_NAME=${name};COMPONENT=${component};PACKAGE_STARTING_LETTER=${startingLetter};PACKAGE_SHORT_NAME=${shortName};DISTRIBUTION=${distribution}" \ - --detailed-summary - echo "=====================================================================================================================" - echo -done \ No newline at end of file diff --git a/.github/actions/publish-deb/upload-spec.json b/.github/actions/publish-deb/upload-spec.json deleted file mode 100644 index d98c56a72..000000000 --- a/.github/actions/publish-deb/upload-spec.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "files": [ - { - "pattern": "${SOURCE_DIR}/${PACKAGE_NAME}", - "target": "indy/pool/${DISTRIBUTION}/${COMPONENT}/${PACKAGE_STARTING_LETTER}/${PACKAGE_SHORT_NAME}/" - } - ] -} \ No newline at end of file diff --git a/.github/actions/set-version/action.yaml b/.github/actions/set-version/action.yaml deleted file mode 100644 index ceef38bdd..000000000 --- a/.github/actions/set-version/action.yaml +++ /dev/null @@ -1,63 +0,0 @@ -name: "Set Version" -description: "Sets version parameters and makes them available as outputs for subsequent processes." - -inputs: - moduleName: - description: "The name of the module containing the version management APIs for the project; i.e. load_version and set_version" - required: true - default: "indy_node" - isDev: - description: "A flag indicating whether or not this is a dev build; set to either 'true' or 'false'." - required: true - default: false - isRC: - description: "A flag indicating whether or not this is a release candidate build; set to either 'true' or 'false'." - required: true - default: false - -outputs: - targetReleaseVer: - description: "The target release version." - value: ${{ steps.versions.outputs.targetReleaseVer }} - upstreamVer: - description: "The version number to use with Python packages." - value: ${{ steps.versions.outputs.upstreamVer }} - pkgVer: - description: "The version number to use with Debian packages." - value: ${{ steps.versions.outputs.pkgVer }} - -runs: - using: "composite" - steps: - - name: Set Versions - id: versions - shell: bash - run: | - fullVersion=$(python3 -c "from ${{ inputs.moduleName }} import load_version; print(load_version().full)") - release=$(python3 -c "from ${{ inputs.moduleName }} import load_version; print(load_version().release)") - pre=$(python3 -c "from ${{ inputs.moduleName }} import load_version; pre = load_version().parts[-2]; print('' if pre is None else pre)") - revision=$(python3 -c "from ${{ inputs.moduleName }} import load_version; rev = load_version().parts[-1]; print('' if rev is None else rev)") - - targetReleaseVer=${release} - upstreamVer=${targetReleaseVer} - pkgVer=${upstreamVer} - - if [ ${{ inputs.isDev }} == "true" ] || [ ${{ inputs.isRC }} == "true" ]; then - if [ ${{ inputs.isDev }} == "true" ]; then - rev=${{ github.run_number }} - else - rev=${revision} - fi - - upstreamVer+=".${pre}${rev}" - pkgVer+="~${pre}${rev}" - fi - - # Set Outputs ... - echo "::set-output name=targetReleaseVer::${targetReleaseVer}" - echo "::set-output name=upstreamVer::${upstreamVer}" - echo "::set-output name=pkgVer::${pkgVer}" - - echo "Target Release version: ${targetReleaseVer}" - echo "PyPI Release version: ${upstreamVer}" - echo "Debian Release version: ${pkgVer}" \ No newline at end of file diff --git a/.github/workflows/PR.yaml b/.github/workflows/PR.yaml index 8daa03daa..feaa70c97 100644 --- a/.github/workflows/PR.yaml +++ b/.github/workflows/PR.yaml @@ -1,4 +1,4 @@ -name: Indy Node - Push and PR Workflow +name: Indy Node - PR Workflow on: pull_request: branches: @@ -6,6 +6,9 @@ on: - feature/did-indy* paths: - '**.py' + - '.github/**' + - 'build-scripts/**' + - 'bump_version.sh' workflow_dispatch: jobs: @@ -55,22 +58,8 @@ jobs: needs: [workflow-setup, indy_node_tests] uses: hyperledger/indy-shared-gha/.github/workflows/buildpackages.yaml@main with: - DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} isDev: true isRC: false moduleName: indy_node - - publish_artifacts: - name: Publish Artifacts - needs: [workflow-setup, build_packages] - if: needs.workflow-setup.outputs.publish == 'true' - uses: hyperledger/indy-shared-gha/.github/workflows/publish_artifacts.yaml@main - with: - COMPONENT: 'dev' - UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} - distribution: ${{ needs.workflow-setup.outputs.distribution }} - moduleName: indy_node - secrets: - INDY_ARTIFACTORY_REPO_CONFIG: ${{ secrets.INDY_ARTIFACTORY_REPO_CONFIG }} - PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/Push.yaml b/.github/workflows/Push.yaml index 13126bda9..87d40ac58 100644 --- a/.github/workflows/Push.yaml +++ b/.github/workflows/Push.yaml @@ -1,4 +1,4 @@ -name: Indy Node - Push and PR Workflow +name: Indy Node - Push Workflow on: push: branches: @@ -6,7 +6,10 @@ on: - feature/did-indy* paths: - '**.py' - + - '.github/**' + - 'build-scripts/**' + - 'bump_version.sh' + jobs: workflow-setup: name: Initialize Workflow @@ -54,7 +57,7 @@ jobs: needs: [workflow-setup, indy_node_tests] uses: hyperledger/indy-shared-gha/.github/workflows/buildpackages.yaml@main with: - DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.release-infos.outputs.UBUNTU_VERSION }} + DOCKER_IMAGE: ghcr.io/${{ needs.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }}/node-build:${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} UBUNTU_VERSION: ${{ needs.workflow-setup.outputs.UBUNTU_VERSION }} isDev: true isRC: false diff --git a/.github/workflows/README.md b/.github/workflows/README.md index a7db6f885..adddac7af 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -5,7 +5,7 @@ which only contain changes to python files. If no python file is affected it doe The same applies to the [Push](Push.yaml) workflow respectively for pushes. The [tag](tag.yaml), [releasepr](releasepr.yaml) and [publishRelease](publishRelease.yaml) workflows are used for the new [Release Workflow](../../docs/release-workflow.png). -They use reuseable workflows from the [indy-shared-gha](https://github.com/hyperledger) repository and the following workflow in this folder. +They use reuseable workflows from the [indy-shared-gha](https://github.com/hyperledger/indy-shared-gha) repository and the following workflow in this folder. + [reuseable_test.yaml](reuseable_test.yaml) This workflow runs the tests inside the uploaded docker images. \ No newline at end of file diff --git a/.github/workflows/WIPupdatePlenumDependency.yaml b/.github/workflows/WIPupdatePlenumDependency similarity index 100% rename from .github/workflows/WIPupdatePlenumDependency.yaml rename to .github/workflows/WIPupdatePlenumDependency diff --git a/.github/workflows/publishRelease.yaml b/.github/workflows/publishRelease.yaml index ec77e9df1..14d790daf 100644 --- a/.github/workflows/publishRelease.yaml +++ b/.github/workflows/publishRelease.yaml @@ -27,6 +27,7 @@ jobs: # to be in lowercase. GITHUB_REPOSITORY_NAME: ${{ steps.workflow-setup.outputs.GITHUB_REPOSITORY_NAME }} distribution: ${{ steps.workflow-setup.outputs.distribution }} + publish: ${{ steps.workflow-setup.outputs.publish}} steps: - name: checkout source code uses: actions/checkout@v2 @@ -48,7 +49,7 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Download Node Artifacts from Github Action Artifacts + - name: Download Node deb Artifacts from Github Action Artifacts uses: dawidd6/action-download-artifact@v2 with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -56,7 +57,7 @@ jobs: workflow_conclusion: success name: indy_node-deb path: artifacts/indy_node-deb - - name: Download Node Artifacts from Github Action Artifacts + - name: Download Node python Artifacts from Github Action Artifacts uses: dawidd6/action-download-artifact@v2 with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -64,7 +65,7 @@ jobs: workflow_conclusion: success name: indy_node-python path: artifacts/indy_node-python - - name: Download Node Artifacts from Github Action Artifacts + - name: Download Node third party dependency Artifacts from Github Action Artifacts uses: dawidd6/action-download-artifact@v2 with: github_token: ${{secrets.GITHUB_TOKEN}} @@ -92,7 +93,7 @@ jobs: zip -r artifacts/indy_node-deb.zip artifacts/indy_node-deb zip -r artifacts/indy_node-python.zip artifacts/indy_node-python zip -r artifacts/third-party-dependencies.zip artifacts/third-party-dependencies - - name: Release + - name: Generate Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ needs.release-infos.outputs.VERSIONTAG }} @@ -108,7 +109,7 @@ jobs: publish_artifacts: name: Publish Artifacts needs: [release-infos, createRelease] - if: needs.release-infos.outputs.isVersionBump == 'true' + if: needs.release-infos.outputs.isVersionBump == 'true' && needs.release-infos.outputs.publish == 'true' uses: hyperledger/indy-shared-gha/.github/workflows/publish_artifacts.yaml@main with: COMPONENT: ${{ needs.release-infos.component }} diff --git a/.github/workflows/releasepr.yaml b/.github/workflows/releasepr.yaml index 42e136c33..d51d64fd4 100644 --- a/.github/workflows/releasepr.yaml +++ b/.github/workflows/releasepr.yaml @@ -39,9 +39,10 @@ jobs: if: needs.release-infos.outputs.isVersionBump == 'true' uses: hyperledger/indy-shared-gha/.github/workflows/lint.yaml@main - build-image: + build-docker-image: name: Create Builder Image needs: [release-infos, lint] + if: needs.release-infos.outputs.isVersionBump == 'true' uses: hyperledger/indy-shared-gha/.github/workflows/buildimage.yaml@main with: CACHE_KEY_BUILD: ${{ needs.release-infos.outputs.CACHE_KEY_BUILD }} @@ -52,6 +53,7 @@ jobs: indy_node_tests: name: Indy Node Tests needs: [release-infos, build-image] + if: needs.release-infos.outputs.isVersionBump == 'true' uses: ./.github/workflows/reuseable_test.yaml with: GITHUB_REPOSITORY_NAME: ${{ needs.release-infos.outputs.GITHUB_REPOSITORY_NAME }} diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 98bdfef56..9e346ae7a 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -43,7 +43,21 @@ jobs: with: python-version: '3.8' - name: Install deps for version change - run: pip install base58 + run: | + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9692C00E657DDE61 + sudo add-apt-repository 'deb https://hyperledger.jfrog.io/artifactory/indy focal dev' + sudo apt-get update -y && sudo apt-get install -y \ + rocksdb=5.8.8 \ + libgflags-dev \ + libsnappy-dev \ + zlib1g-dev \ + libbz2-dev \ + liblz4-dev \ + libgflags-dev \ + pip install packaging \ + importlib_metadata==3.10.1 \ + indy-plenum==1.13.0.dev14 \ + pyzmq==22.3.0 - name: Prepare package and set version run: | ./bump_version.sh ${{ needs.taginfos.outputs.VERSION }} From 75e3c89f08e107841117bc9926848b6c578a72fd Mon Sep 17 00:00:00 2001 From: Wade Barnes Date: Fri, 13 May 2022 09:00:39 -0700 Subject: [PATCH 09/10] Fix workflows - Separate the `apt-get` and `pip` commands in tag workflow. - Fix job reference in release PR workflow. Signed-off-by: Wade Barnes --- .github/workflows/releasepr.yaml | 2 +- .github/workflows/tag.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/releasepr.yaml b/.github/workflows/releasepr.yaml index d51d64fd4..0cab3bd0b 100644 --- a/.github/workflows/releasepr.yaml +++ b/.github/workflows/releasepr.yaml @@ -52,7 +52,7 @@ jobs: indy_node_tests: name: Indy Node Tests - needs: [release-infos, build-image] + needs: [release-infos, build-docker-image] if: needs.release-infos.outputs.isVersionBump == 'true' uses: ./.github/workflows/reuseable_test.yaml with: diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index 9e346ae7a..f35663023 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -53,7 +53,7 @@ jobs: zlib1g-dev \ libbz2-dev \ liblz4-dev \ - libgflags-dev \ + libgflags-dev pip install packaging \ importlib_metadata==3.10.1 \ indy-plenum==1.13.0.dev14 \ From 0b82d765346b38cc989f9ed715b5537b22e797ab Mon Sep 17 00:00:00 2001 From: Wade Barnes Date: Fri, 13 May 2022 11:51:41 -0700 Subject: [PATCH 10/10] Refactor the "extract branch" step. - Factor out into a shared action. Signed-off-by: Wade Barnes ````````````````````````````````````` --- .github/workflows/tag.yaml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml index f35663023..6c2bdf82c 100644 --- a/.github/workflows/tag.yaml +++ b/.github/workflows/tag.yaml @@ -13,24 +13,21 @@ jobs: version: ${{ steps.get-release-info.outputs.version }} versionTag: ${{ steps.get-release-info.outputs.versionTag }} prBranch: ${{ steps.get-release-info.outputs.prBranch }} - BASE: ${{ steps.branch.outputs.BASE}} + BASE: ${{ steps.get-branch.outputs.branch}} steps: - name: checkout source code uses: actions/checkout@v1 - name: extract branch - id: branch - run: | - raw=$(git branch -r --contains ${{ github.ref }}) - branch=${raw/origin\/} - echo ::set-output\ name=BASE::$branch - echo "::debug::BASE is being set to $branch" + id: get-branch + uses: hyperledger/indy-shared-gha/.github/actions/branch-from-tag@main + with: + tag: ${{ github.ref }} - name: get-release-info id: get-release-info uses: hyperledger/indy-shared-gha/.github/actions/get-release-info@main with: versionString: "${{ github.ref }}" - bump_version: name: Bump Version Number needs: taginfos