pax_global_header00006660000000000000000000000064137644467610014534gustar00rootroot0000000000000052 comment=a853dff25de36cc637b1f02029343790d2dd0199 audio-0.7.2/000077500000000000000000000000001376444676100126435ustar00rootroot00000000000000audio-0.7.2/.circleci/000077500000000000000000000000001376444676100144765ustar00rootroot00000000000000audio-0.7.2/.circleci/config.yml000066400000000000000000001436151376444676100165000ustar00rootroot00000000000000version: 2.1 # How to test the Linux jobs: # - Install CircleCI local CLI: https://circleci.com/docs/2.0/local-cli/ # - circleci config process .circleci/config.yml > gen.yml && circleci local execute -c gen.yml --job binary_linux_wheel_py3.8 # - Replace binary_linux_wheel_py3.8 with the name of the job you want to test. # Job names are 'name:' key. executors: windows-cpu: machine: resource_class: windows.xlarge image: windows-server-2019-vs2019:stable shell: bash.exe windows-gpu: machine: resource_class: windows.gpu.nvidia.medium image: windows-server-2019-nvidia:stable shell: bash.exe commands: generate_cache_key: description: "Generates a cache key file that changes daily" steps: - run: name: Generate cache key command: echo "$(date +"%Y-%m-%d")" > .cachekey designate_upload_channel: description: "inserts the correct upload channel into ${BASH_ENV}" steps: - run: name: adding UPLOAD_CHANNEL to BASH_ENV command: | # Hardcoded for release branch echo "export UPLOAD_CHANNEL=test" >> ${BASH_ENV} install_build_tools_macos: description: "installs tools required to build torchaudio" steps: - run: name: Install cmake and pkg-config command: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake pkg-config wget # Disable brew auto update which is very slow load_conda_channel_flags: description: "Determines whether we need extra conda channels" steps: - run: name: Adding CONDA_CHANNEL_FLAGS to BASH_ENV command: | CONDA_CHANNEL_FLAGS="" if [[ "${PYTHON_VERSION}" = *3.9* ]]; then echo "export CONDA_CHANNEL_FLAGS=-c=conda-forge" >> ${BASH_ENV} fi binary_common: &binary_common parameters: # Edit these defaults to do a release build_version: description: "version number of release binary; by default, build a nightly" type: string default: "0.7.2" pytorch_version: description: "PyTorch version to build against; by default, use a nightly" type: string default: "1.7.1" # Don't edit these python_version: description: "Python version to build against (e.g., 3.8)" type: string environment: PYTHON_VERSION: << parameters.python_version >> BUILD_VERSION: << parameters.build_version >> PYTORCH_VERSION: << parameters.pytorch_version >> CU_VERSION: cpu smoke_test_common: &smoke_test_common <<: *binary_common docker: - image: 308535385114.dkr.ecr.us-east-1.amazonaws.com/torchaudio/smoke_test:56c846a5-acaa-41a7-92f5-46ec66186c61 aws_auth: aws_access_key_id: ${ECR_AWS_ACCESS_KEY} aws_secret_access_key: ${ECR_AWS_SECRET_ACCESS_KEY} jobs: circleci_consistency: docker: - image: circleci/python:3.8 steps: - checkout - run: command: | pip install --user --progress-bar off jinja2 pyyaml python .circleci/regenerate.py git diff --exit-code || (echo ".circleci/config.yml not in sync with config.yml.in! Run .circleci/regenerate.py to update config"; exit 1) download_third_parties_nix: docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: small steps: - checkout - generate_cache_key - restore_cache: keys: - tp-nix-v2-{{ checksum ".cachekey" }} - run: command: | mkdir -p third_party/archives/ wget --no-clobber --directory-prefix=third_party/archives/ $(awk '/URL /{print $2}' third_party/CMakeLists.txt) - save_cache: key: tp-nix-v2-{{ checksum ".cachekey" }} paths: - third_party/archives - persist_to_workspace: root: third_party paths: - archives binary_linux_wheel: <<: *binary_common docker: - image: "pytorch/manylinux-cuda102" resource_class: 2xlarge+ steps: - checkout - attach_workspace: at: third_party - run: packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_linux_conda: <<: *binary_common docker: - image: "pytorch/conda-cuda" resource_class: 2xlarge+ steps: - checkout - load_conda_channel_flags - attach_workspace: at: third_party - run: packaging/build_conda.sh - store_artifacts: path: /opt/conda/conda-bld/linux-64 - persist_to_workspace: root: /opt/conda paths: - "conda-bld/*" binary_macos_wheel: <<: *binary_common macos: xcode: "9.4.1" steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - run: # Cannot easily deduplicate this as source'ing activate # will set environment variables which we need to propagate # to build_wheel.sh command: | curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh sh conda.sh -b source $HOME/miniconda3/bin/activate packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_macos_conda: <<: *binary_common macos: xcode: "9.4.1" steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - run: command: | curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh sh conda.sh -b source $HOME/miniconda3/bin/activate conda install -yq conda-build packaging/build_conda.sh - store_artifacts: path: /Users/distiller/miniconda3/conda-bld/osx-64 - persist_to_workspace: root: /Users/distiller/miniconda3 paths: - "conda-bld/*" binary_windows_wheel: <<: *binary_common executor: name: windows-cpu steps: - checkout - load_conda_channel_flags - run: name: build command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate base bash packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_windows_conda: <<: *binary_common executor: name: windows-cpu steps: - checkout - load_conda_channel_flags - run: name: build command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate base conda install -yq conda-build "conda-package-handling!=1.5.0" bash packaging/build_conda.sh - store_artifacts: path: C:/tools/miniconda3/conda-bld/win-64 - persist_to_workspace: root: C:/tools/miniconda3 paths: - "conda-bld/*" # Requires org-member context binary_conda_upload: docker: - image: continuumio/miniconda steps: - attach_workspace: at: ~/workspace - designate_upload_channel - run: command: | # Prevent credential from leaking conda install -yq anaconda-client set -x anaconda -t "${CONDA_PYTORCHBOT_TOKEN}" upload ~/workspace/conda-bld/*/*.tar.bz2 -u "pytorch-${UPLOAD_CHANNEL}" --label main --no-progress --force # Requires org-member context binary_wheel_upload: docker: - image: circleci/python:3.8 steps: - attach_workspace: at: ~/workspace - checkout - designate_upload_channel - run: command: | pip install --user awscli export PATH="$HOME/.local/bin:$PATH" # Prevent credential from leaking set +x export AWS_ACCESS_KEY_ID="${PYTORCH_BINARY_AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${PYTORCH_BINARY_AWS_SECRET_ACCESS_KEY}" set -x for pkg in ~/workspace/*.whl; do aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/" --acl public-read done smoke_test_linux_conda: <<: *smoke_test_common steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} conda install -v -y -c pytorch-${UPLOAD_CHANNEL} pytorch conda install -v -y -c file://$HOME/workspace/conda-bld torchaudio - run: name: smoke test command: | source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_linux_pip: <<: *smoke_test_common steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} pip install $(ls ~/workspace/torchaudio*.whl) -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/torch_${UPLOAD_CHANNEL}.html" - run: name: smoke test command: | source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_windows_conda: <<: *binary_common executor: name: windows-cpu steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda env remove -n python${PYTHON_VERSION} || true conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION} conda activate python${PYTHON_VERSION} conda install -v -y -c pytorch-${UPLOAD_CHANNEL} pytorch conda install -v -y $(ls ~/workspace/torchaudio*.tar.bz2) - run: name: smoke test command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_windows_pip: <<: *binary_common executor: name: windows-cpu steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda env remove -n python${PYTHON_VERSION} || true conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION} conda activate python${PYTHON_VERSION} pip install $(ls ~/workspace/torchaudio*.whl) -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/torch_${UPLOAD_CHANNEL}.html" - run: name: smoke test command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_docker_image_build: machine: image: ubuntu-1604:201903-01 resource_class: large environment: image_name: torchaudio/smoke_test steps: - checkout - run: name: build_docker image no_output_timeout: "1h" command: | cd .circleci/smoke_test/docker && docker build . -t ${image_name}:${CIRCLE_WORKFLOW_ID} - run: name: upload docker image no_output_timeout: "1h" command: | set +x export AWS_ACCESS_KEY_ID=${ECR_AWS_ACCESS_KEY} export AWS_SECRET_ACCESS_KEY=${ECR_AWS_SECRET_ACCESS_KEY} eval $(aws ecr get-login --region us-east-1 --no-include-email) set -x docker tag ${image_name}:${CIRCLE_WORKFLOW_ID} 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:${CIRCLE_WORKFLOW_ID} docker tag ${image_name}:${CIRCLE_WORKFLOW_ID} 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:latest docker push 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:${CIRCLE_WORKFLOW_ID} docker push 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:latest unittest_linux_cpu: <<: *binary_common docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: 2xlarge+ steps: - checkout - attach_workspace: at: third_party - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: keys: - env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - save_cache: key: env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Install torchaudio command: .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: .circleci/unittest/linux/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results unittest_linux_gpu: <<: *binary_common machine: image: ubuntu-1604-cuda-10.1:201909-23 resource_class: gpu.small environment: image_name: "pytorch/torchaudio_unittest_base:manylinux-cuda10.1" steps: - checkout - attach_workspace: at: third_party - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: keys: - env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} - run: name: Setup command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh - save_cache: key: env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Install torchaudio command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh - run: name: Post Process command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results unittest_windows_cpu: <<: *binary_common executor: name: windows-cpu steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: keys: - env-v3-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} - run: name: Setup command: .circleci/unittest/windows/scripts/setup_env.sh - save_cache: key: env-v3-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} paths: - conda - env - run: name: Install torchaudio command: .circleci/unittest/windows/scripts/install.sh - run: name: Run tests command: .circleci/unittest/windows/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/windows/scripts/post_process.sh - store_test_results: path: test-results unittest_windows_gpu: <<: *binary_common executor: name: windows-gpu environment: CUDA_VERSION: "10.1" steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: keys: - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} - run: name: Setup command: .circleci/unittest/windows/scripts/setup_env.sh - save_cache: key: env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} paths: - conda - env - run: name: Install torchaudio command: .circleci/unittest/windows/scripts/install.sh - run: name: Run tests command: .circleci/unittest/windows/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/windows/scripts/post_process.sh - store_test_results: path: test-results unittest_macos_cpu: <<: *binary_common macos: xcode: "9.4.1" resource_class: large steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - designate_upload_channel - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - run: name: Install torchaudio command: .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: .circleci/unittest/linux/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results stylecheck: <<: *binary_common docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: medium steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: keys: - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".cachekey" }} - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - save_cache: key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".cachekey" }} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Run style check command: .circleci/unittest/linux/scripts/run_style_checks.sh torchscript_bc_test: docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: large steps: - checkout - generate_cache_key - load_conda_channel_flags - restore_cache: keys: - torchscript-bc-test-release-envs-v1-{{ arch }}-{{ checksum ".cachekey" }} - run: name: Generate Objects command: | .circleci/torchscript_bc_test/setup_release_envs.sh .circleci/torchscript_bc_test/generate_objects.sh - save_cache: key: torchscript-bc-test-release-envs-v1-{{ arch }}-{{ checksum ".cachekey" }} paths: - conda - envs - store_artifacts: path: test/torchscript_bc_test/assets - persist_to_workspace: root: . paths: - test/torchscript_bc_test/assets - run: name: Run BC check test command: | .circleci/torchscript_bc_test/setup_master_envs.sh .circleci/torchscript_bc_test/validate_objects.sh workflows: build: jobs: - circleci_consistency - download_third_parties_nix: name: download_third_parties_nix - binary_linux_wheel: name: binary_linux_wheel_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_linux_wheel: name: binary_linux_wheel_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_linux_wheel: name: binary_linux_wheel_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_linux_wheel: name: binary_linux_wheel_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_macos_wheel: name: binary_macos_wheel_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_macos_wheel: name: binary_macos_wheel_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_macos_wheel: name: binary_macos_wheel_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_macos_wheel: name: binary_macos_wheel_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_windows_wheel: name: binary_windows_wheel_py3.6 python_version: '3.6' - binary_windows_wheel: name: binary_windows_wheel_py3.7 python_version: '3.7' - binary_windows_wheel: name: binary_windows_wheel_py3.8 python_version: '3.8' - binary_windows_wheel: name: binary_windows_wheel_py3.9 python_version: '3.9' - binary_linux_conda: name: binary_linux_conda_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_linux_conda: name: binary_linux_conda_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_linux_conda: name: binary_linux_conda_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_linux_conda: name: binary_linux_conda_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_macos_conda: name: binary_macos_conda_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_macos_conda: name: binary_macos_conda_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_macos_conda: name: binary_macos_conda_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_macos_conda: name: binary_macos_conda_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_windows_conda: name: binary_windows_conda_py3.6 python_version: '3.6' - binary_windows_conda: name: binary_windows_conda_py3.7 python_version: '3.7' - binary_windows_conda: name: binary_windows_conda_py3.8 python_version: '3.8' - binary_windows_conda: name: binary_windows_conda_py3.9 python_version: '3.9' unittest: jobs: - torchscript_bc_test: requires: - download_third_parties_nix - download_third_parties_nix: name: download_third_parties_nix - unittest_linux_cpu: name: unittest_linux_cpu_py3.6 python_version: '3.6' requires: - download_third_parties_nix - stylecheck: name: stylecheck_py3.6 python_version: '3.6' - unittest_linux_cpu: name: unittest_linux_cpu_py3.7 python_version: '3.7' requires: - download_third_parties_nix - unittest_linux_cpu: name: unittest_linux_cpu_py3.8 python_version: '3.8' requires: - download_third_parties_nix - unittest_linux_cpu: name: unittest_linux_cpu_py3.9 python_version: '3.9' requires: - download_third_parties_nix - unittest_linux_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_linux_gpu_py3.6 python_version: '3.6' requires: - download_third_parties_nix - unittest_linux_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_linux_gpu_py3.7 python_version: '3.7' requires: - download_third_parties_nix - unittest_linux_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_linux_gpu_py3.8 python_version: '3.8' requires: - download_third_parties_nix - unittest_linux_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_linux_gpu_py3.9 python_version: '3.9' requires: - download_third_parties_nix - unittest_windows_cpu: name: unittest_windows_cpu_py3.6 python_version: '3.6' - unittest_windows_cpu: name: unittest_windows_cpu_py3.7 python_version: '3.7' - unittest_windows_cpu: name: unittest_windows_cpu_py3.8 python_version: '3.8' - unittest_windows_cpu: name: unittest_windows_cpu_py3.9 python_version: '3.9' - unittest_windows_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_windows_gpu_py3.6 python_version: '3.6' - unittest_windows_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_windows_gpu_py3.7 python_version: '3.7' - unittest_windows_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_windows_gpu_py3.8 python_version: '3.8' - unittest_windows_gpu: filters: branches: only: - master - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: unittest_windows_gpu_py3.9 python_version: '3.9' - unittest_macos_cpu: name: unittest_macos_cpu_py3.6 python_version: '3.6' requires: - download_third_parties_nix - unittest_macos_cpu: name: unittest_macos_cpu_py3.7 python_version: '3.7' requires: - download_third_parties_nix - unittest_macos_cpu: name: unittest_macos_cpu_py3.8 python_version: '3.8' requires: - download_third_parties_nix - unittest_macos_cpu: name: unittest_macos_cpu_py3.9 python_version: '3.9' requires: - download_third_parties_nix nightly: jobs: - circleci_consistency: filters: branches: only: nightly - download_third_parties_nix: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: download_third_parties_nix - binary_linux_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.6_upload requires: - nightly_binary_linux_wheel_py3.6 - smoke_test_linux_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.6_smoke_test_pip python_version: '3.6' requires: - nightly_binary_linux_wheel_py3.6_upload - binary_linux_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.7_upload requires: - nightly_binary_linux_wheel_py3.7 - smoke_test_linux_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.7_smoke_test_pip python_version: '3.7' requires: - nightly_binary_linux_wheel_py3.7_upload - binary_linux_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.8_upload requires: - nightly_binary_linux_wheel_py3.8 - smoke_test_linux_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.8_smoke_test_pip python_version: '3.8' requires: - nightly_binary_linux_wheel_py3.8_upload - binary_linux_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.9_upload requires: - nightly_binary_linux_wheel_py3.9 - smoke_test_linux_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_wheel_py3.9_smoke_test_pip python_version: '3.9' requires: - nightly_binary_linux_wheel_py3.9_upload - binary_macos_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.6_upload requires: - nightly_binary_macos_wheel_py3.6 - binary_macos_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.7_upload requires: - nightly_binary_macos_wheel_py3.7 - binary_macos_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.8_upload requires: - nightly_binary_macos_wheel_py3.8 - binary_macos_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_wheel_py3.9_upload requires: - nightly_binary_macos_wheel_py3.9 - binary_windows_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.6 python_version: '3.6' - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.6_upload requires: - nightly_binary_windows_wheel_py3.6 - smoke_test_windows_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.6_smoke_test_pip python_version: '3.6' requires: - nightly_binary_windows_wheel_py3.6_upload - binary_windows_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.7 python_version: '3.7' - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.7_upload requires: - nightly_binary_windows_wheel_py3.7 - smoke_test_windows_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.7_smoke_test_pip python_version: '3.7' requires: - nightly_binary_windows_wheel_py3.7_upload - binary_windows_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.8 python_version: '3.8' - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.8_upload requires: - nightly_binary_windows_wheel_py3.8 - smoke_test_windows_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.8_smoke_test_pip python_version: '3.8' requires: - nightly_binary_windows_wheel_py3.8_upload - binary_windows_wheel: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.9 python_version: '3.9' - binary_wheel_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.9_upload requires: - nightly_binary_windows_wheel_py3.9 - smoke_test_windows_pip: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_wheel_py3.9_smoke_test_pip python_version: '3.9' requires: - nightly_binary_windows_wheel_py3.9_upload - binary_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.6_upload requires: - nightly_binary_linux_conda_py3.6 - smoke_test_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.6_smoke_test_conda python_version: '3.6' requires: - nightly_binary_linux_conda_py3.6_upload - binary_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.7_upload requires: - nightly_binary_linux_conda_py3.7 - smoke_test_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.7_smoke_test_conda python_version: '3.7' requires: - nightly_binary_linux_conda_py3.7_upload - binary_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.8_upload requires: - nightly_binary_linux_conda_py3.8 - smoke_test_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.8_smoke_test_conda python_version: '3.8' requires: - nightly_binary_linux_conda_py3.8_upload - binary_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.9_upload requires: - nightly_binary_linux_conda_py3.9 - smoke_test_linux_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_linux_conda_py3.9_smoke_test_conda python_version: '3.9' requires: - nightly_binary_linux_conda_py3.9_upload - binary_macos_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.6 python_version: '3.6' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.6_upload requires: - nightly_binary_macos_conda_py3.6 - binary_macos_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.7 python_version: '3.7' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.7_upload requires: - nightly_binary_macos_conda_py3.7 - binary_macos_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.8 python_version: '3.8' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.8_upload requires: - nightly_binary_macos_conda_py3.8 - binary_macos_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.9 python_version: '3.9' requires: - download_third_parties_nix - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_macos_conda_py3.9_upload requires: - nightly_binary_macos_conda_py3.9 - binary_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.6 python_version: '3.6' - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.6_upload requires: - nightly_binary_windows_conda_py3.6 - smoke_test_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.6_smoke_test_conda python_version: '3.6' requires: - nightly_binary_windows_conda_py3.6_upload - binary_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.7 python_version: '3.7' - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.7_upload requires: - nightly_binary_windows_conda_py3.7 - smoke_test_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.7_smoke_test_conda python_version: '3.7' requires: - nightly_binary_windows_conda_py3.7_upload - binary_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.8 python_version: '3.8' - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.8_upload requires: - nightly_binary_windows_conda_py3.8 - smoke_test_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.8_smoke_test_conda python_version: '3.8' requires: - nightly_binary_windows_conda_py3.8_upload - binary_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.9 python_version: '3.9' - binary_conda_upload: context: org-member filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.9_upload requires: - nightly_binary_windows_conda_py3.9 - smoke_test_windows_conda: filters: branches: only: - nightly tags: only: /v[0-9]+(\.[0-9]+)*-rc[0-9]+/ name: nightly_binary_windows_conda_py3.9_smoke_test_conda python_version: '3.9' requires: - nightly_binary_windows_conda_py3.9_upload docker_build: triggers: - schedule: cron: "0 10 * * 0" filters: branches: only: - master jobs: - smoke_test_docker_image_buildaudio-0.7.2/.circleci/config.yml.in000066400000000000000000000543751376444676100171110ustar00rootroot00000000000000version: 2.1 # How to test the Linux jobs: # - Install CircleCI local CLI: https://circleci.com/docs/2.0/local-cli/ # - circleci config process .circleci/config.yml > gen.yml && circleci local execute -c gen.yml --job binary_linux_wheel_py3.8 # - Replace binary_linux_wheel_py3.8 with the name of the job you want to test. # Job names are 'name:' key. executors: windows-cpu: machine: resource_class: windows.xlarge image: windows-server-2019-vs2019:stable shell: bash.exe windows-gpu: machine: resource_class: windows.gpu.nvidia.medium image: windows-server-2019-nvidia:stable shell: bash.exe commands: generate_cache_key: description: "Generates a cache key file that changes daily" steps: - run: name: Generate cache key command: echo "$(date +"%Y-%m-%d")" > .cachekey designate_upload_channel: description: "inserts the correct upload channel into ${BASH_ENV}" steps: - run: name: adding UPLOAD_CHANNEL to BASH_ENV command: | # Hardcoded for release branch echo "export UPLOAD_CHANNEL=test" >> ${BASH_ENV} install_build_tools_macos: description: "installs tools required to build torchaudio" steps: - run: name: Install cmake and pkg-config command: HOMEBREW_NO_AUTO_UPDATE=1 brew install cmake pkg-config wget # Disable brew auto update which is very slow load_conda_channel_flags: description: "Determines whether we need extra conda channels" steps: - run: name: Adding CONDA_CHANNEL_FLAGS to BASH_ENV command: | CONDA_CHANNEL_FLAGS="" if [[ "${PYTHON_VERSION}" = *3.9* ]]; then echo "export CONDA_CHANNEL_FLAGS=-c=conda-forge" >> ${BASH_ENV} fi binary_common: &binary_common parameters: # Edit these defaults to do a release build_version: description: "version number of release binary; by default, build a nightly" type: string default: "0.7.2" pytorch_version: description: "PyTorch version to build against; by default, use a nightly" type: string default: "1.7.1" # Don't edit these python_version: description: "Python version to build against (e.g., 3.8)" type: string environment: PYTHON_VERSION: << parameters.python_version >> BUILD_VERSION: << parameters.build_version >> PYTORCH_VERSION: << parameters.pytorch_version >> CU_VERSION: cpu smoke_test_common: &smoke_test_common <<: *binary_common docker: - image: 308535385114.dkr.ecr.us-east-1.amazonaws.com/torchaudio/smoke_test:56c846a5-acaa-41a7-92f5-46ec66186c61 aws_auth: aws_access_key_id: ${ECR_AWS_ACCESS_KEY} aws_secret_access_key: ${ECR_AWS_SECRET_ACCESS_KEY} jobs: circleci_consistency: docker: - image: circleci/python:3.8 steps: - checkout - run: command: | pip install --user --progress-bar off jinja2 pyyaml python .circleci/regenerate.py git diff --exit-code || (echo ".circleci/config.yml not in sync with config.yml.in! Run .circleci/regenerate.py to update config"; exit 1) download_third_parties_nix: docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: small steps: - checkout - generate_cache_key - restore_cache: {% raw %} keys: - tp-nix-v2-{{ checksum ".cachekey" }} {% endraw %} - run: command: | mkdir -p third_party/archives/ wget --no-clobber --directory-prefix=third_party/archives/ $(awk '/URL /{print $2}' third_party/CMakeLists.txt) - save_cache: {% raw %} key: tp-nix-v2-{{ checksum ".cachekey" }} {% endraw %} paths: - third_party/archives - persist_to_workspace: root: third_party paths: - archives binary_linux_wheel: <<: *binary_common docker: - image: "pytorch/manylinux-cuda102" resource_class: 2xlarge+ steps: - checkout - attach_workspace: at: third_party - run: packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_linux_conda: <<: *binary_common docker: - image: "pytorch/conda-cuda" resource_class: 2xlarge+ steps: - checkout - load_conda_channel_flags - attach_workspace: at: third_party - run: packaging/build_conda.sh - store_artifacts: path: /opt/conda/conda-bld/linux-64 - persist_to_workspace: root: /opt/conda paths: - "conda-bld/*" binary_macos_wheel: <<: *binary_common macos: xcode: "9.4.1" steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - run: # Cannot easily deduplicate this as source'ing activate # will set environment variables which we need to propagate # to build_wheel.sh command: | curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh sh conda.sh -b source $HOME/miniconda3/bin/activate packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_macos_conda: <<: *binary_common macos: xcode: "9.4.1" steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - run: command: | curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh sh conda.sh -b source $HOME/miniconda3/bin/activate conda install -yq conda-build packaging/build_conda.sh - store_artifacts: path: /Users/distiller/miniconda3/conda-bld/osx-64 - persist_to_workspace: root: /Users/distiller/miniconda3 paths: - "conda-bld/*" binary_windows_wheel: <<: *binary_common executor: name: windows-cpu steps: - checkout - load_conda_channel_flags - run: name: build command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate base bash packaging/build_wheel.sh - store_artifacts: path: dist - persist_to_workspace: root: dist paths: - "*" binary_windows_conda: <<: *binary_common executor: name: windows-cpu steps: - checkout - load_conda_channel_flags - run: name: build command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate base conda install -yq conda-build "conda-package-handling!=1.5.0" bash packaging/build_conda.sh - store_artifacts: path: C:/tools/miniconda3/conda-bld/win-64 - persist_to_workspace: root: C:/tools/miniconda3 paths: - "conda-bld/*" # Requires org-member context binary_conda_upload: docker: - image: continuumio/miniconda steps: - attach_workspace: at: ~/workspace - designate_upload_channel - run: command: | # Prevent credential from leaking conda install -yq anaconda-client set -x anaconda -t "${CONDA_PYTORCHBOT_TOKEN}" upload ~/workspace/conda-bld/*/*.tar.bz2 -u "pytorch-${UPLOAD_CHANNEL}" --label main --no-progress --force # Requires org-member context binary_wheel_upload: docker: - image: circleci/python:3.8 steps: - attach_workspace: at: ~/workspace - checkout - designate_upload_channel - run: command: | pip install --user awscli export PATH="$HOME/.local/bin:$PATH" # Prevent credential from leaking set +x export AWS_ACCESS_KEY_ID="${PYTORCH_BINARY_AWS_ACCESS_KEY_ID}" export AWS_SECRET_ACCESS_KEY="${PYTORCH_BINARY_AWS_SECRET_ACCESS_KEY}" set -x for pkg in ~/workspace/*.whl; do aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/" --acl public-read done smoke_test_linux_conda: <<: *smoke_test_common steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} conda install -v -y -c pytorch-${UPLOAD_CHANNEL} pytorch conda install -v -y -c file://$HOME/workspace/conda-bld torchaudio - run: name: smoke test command: | source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_linux_pip: <<: *smoke_test_common steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} pip install $(ls ~/workspace/torchaudio*.whl) -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/torch_${UPLOAD_CHANNEL}.html" - run: name: smoke test command: | source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_windows_conda: <<: *binary_common executor: name: windows-cpu steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda env remove -n python${PYTHON_VERSION} || true conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION} conda activate python${PYTHON_VERSION} conda install -v -y -c pytorch-${UPLOAD_CHANNEL} pytorch conda install -v -y $(ls ~/workspace/torchaudio*.tar.bz2) - run: name: smoke test command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_windows_pip: <<: *binary_common executor: name: windows-cpu steps: - attach_workspace: at: ~/workspace - designate_upload_channel - load_conda_channel_flags - run: name: install binaries command: | set -x eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda env remove -n python${PYTHON_VERSION} || true conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION} conda activate python${PYTHON_VERSION} pip install $(ls ~/workspace/torchaudio*.whl) -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/torch_${UPLOAD_CHANNEL}.html" - run: name: smoke test command: | eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" conda activate python${PYTHON_VERSION} python -c "import torchaudio" smoke_test_docker_image_build: machine: image: ubuntu-1604:201903-01 resource_class: large environment: image_name: torchaudio/smoke_test steps: - checkout - run: name: build_docker image no_output_timeout: "1h" command: | cd .circleci/smoke_test/docker && docker build . -t ${image_name}:${CIRCLE_WORKFLOW_ID} - run: name: upload docker image no_output_timeout: "1h" command: | set +x export AWS_ACCESS_KEY_ID=${ECR_AWS_ACCESS_KEY} export AWS_SECRET_ACCESS_KEY=${ECR_AWS_SECRET_ACCESS_KEY} eval $(aws ecr get-login --region us-east-1 --no-include-email) set -x docker tag ${image_name}:${CIRCLE_WORKFLOW_ID} 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:${CIRCLE_WORKFLOW_ID} docker tag ${image_name}:${CIRCLE_WORKFLOW_ID} 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:latest docker push 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:${CIRCLE_WORKFLOW_ID} docker push 308535385114.dkr.ecr.us-east-1.amazonaws.com/${image_name}:latest unittest_linux_cpu: <<: *binary_common docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: 2xlarge+ steps: - checkout - attach_workspace: at: third_party - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: {% raw %} keys: - env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - save_cache: {% raw %} key: env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Install torchaudio command: .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: .circleci/unittest/linux/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results unittest_linux_gpu: <<: *binary_common machine: image: ubuntu-1604-cuda-10.1:201909-23 resource_class: gpu.small environment: image_name: "pytorch/torchaudio_unittest_base:manylinux-cuda10.1" steps: - checkout - attach_workspace: at: third_party - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: {% raw %} keys: - env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Setup command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh - save_cache: {% raw %} key: env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum "third_party/CMakeLists.txt" }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Install torchaudio command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh - run: name: Post Process command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results unittest_windows_cpu: <<: *binary_common executor: name: windows-cpu steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: {% raw %} keys: - env-v3-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Setup command: .circleci/unittest/windows/scripts/setup_env.sh - save_cache: {% raw %} key: env-v3-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - env - run: name: Install torchaudio command: .circleci/unittest/windows/scripts/install.sh - run: name: Run tests command: .circleci/unittest/windows/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/windows/scripts/post_process.sh - store_test_results: path: test-results unittest_windows_gpu: <<: *binary_common executor: name: windows-gpu environment: CUDA_VERSION: "10.1" steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: {% raw %} keys: - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Setup command: .circleci/unittest/windows/scripts/setup_env.sh - save_cache: {% raw %} key: env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - env - run: name: Install torchaudio command: .circleci/unittest/windows/scripts/install.sh - run: name: Run tests command: .circleci/unittest/windows/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/windows/scripts/post_process.sh - store_test_results: path: test-results unittest_macos_cpu: <<: *binary_common macos: xcode: "9.4.1" resource_class: large steps: - checkout - install_build_tools_macos - load_conda_channel_flags - attach_workspace: at: third_party - designate_upload_channel - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - run: name: Install torchaudio command: .circleci/unittest/linux/scripts/install.sh - run: name: Run tests command: .circleci/unittest/linux/scripts/run_test.sh - run: name: Post process command: .circleci/unittest/linux/scripts/post_process.sh - store_test_results: path: test-results stylecheck: <<: *binary_common docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: medium steps: - checkout - designate_upload_channel - load_conda_channel_flags - generate_cache_key - restore_cache: {% raw %} keys: - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Setup command: .circleci/unittest/linux/scripts/setup_env.sh - save_cache: {% raw %} key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - env - third_party/build - third_party/install - third_party/src - run: name: Run style check command: .circleci/unittest/linux/scripts/run_style_checks.sh torchscript_bc_test: docker: - image: "pytorch/torchaudio_unittest_base:manylinux" resource_class: large steps: - checkout - generate_cache_key - load_conda_channel_flags - restore_cache: {% raw %} keys: - torchscript-bc-test-release-envs-v1-{{ arch }}-{{ checksum ".cachekey" }} {% endraw %} - run: name: Generate Objects command: | .circleci/torchscript_bc_test/setup_release_envs.sh .circleci/torchscript_bc_test/generate_objects.sh - save_cache: {% raw %} key: torchscript-bc-test-release-envs-v1-{{ arch }}-{{ checksum ".cachekey" }} {% endraw %} paths: - conda - envs - store_artifacts: path: test/torchscript_bc_test/assets - persist_to_workspace: root: . paths: - test/torchscript_bc_test/assets - run: name: Run BC check test command: | .circleci/torchscript_bc_test/setup_master_envs.sh .circleci/torchscript_bc_test/validate_objects.sh workflows: build: jobs: - circleci_consistency {{ build_workflows() }} unittest: jobs: - torchscript_bc_test: requires: - download_third_parties_nix {{ unittest_workflows() }} nightly: jobs: - circleci_consistency: filters: branches: only: nightly {{ build_workflows(prefix="nightly_", filter_branch="nightly", upload=True) }} docker_build: triggers: - schedule: cron: "0 10 * * 0" filters: branches: only: - master jobs: - smoke_test_docker_image_build audio-0.7.2/.circleci/regenerate.py000077500000000000000000000131511376444676100171750ustar00rootroot00000000000000#!/usr/bin/env python3 """ This script should use a very simple, functional programming style. Avoid Jinja macros in favor of native Python functions. Don't go overboard on code generation; use Python only to generate content that can't be easily declared statically using CircleCI's YAML API. Data declarations (e.g. the nested loops for defining the configuration matrix) should be at the top of the file for easy updating. See this comment for design rationale: https://github.com/pytorch/vision/pull/1321#issuecomment-531033978 """ import jinja2 import yaml import os.path PYTHON_VERSIONS = ["3.6", "3.7", "3.8", "3.9"] def build_workflows(prefix='', upload=False, filter_branch=None, indentation=6): w = [] w += build_download_job(filter_branch) for btype in ["wheel", "conda"]: for os_type in ["linux", "macos", "windows"]: for python_version in PYTHON_VERSIONS: w += build_workflow_pair(btype, os_type, python_version, filter_branch, prefix, upload) return indent(indentation, w) def build_download_job(filter_branch): job = { "name": "download_third_parties_nix", } if filter_branch: job["filters"] = gen_filter_branch_tree(filter_branch) return [{"download_third_parties_nix": job}] def build_workflow_pair(btype, os_type, python_version, filter_branch, prefix='', upload=False): w = [] base_workflow_name = "{prefix}binary_{os_type}_{btype}_py{python_version}".format( prefix=prefix, os_type=os_type, btype=btype, python_version=python_version, ) w.append(generate_base_workflow(base_workflow_name, python_version, filter_branch, os_type, btype)) if upload: is_py3_linux = os_type in ['linux', "windows"] and not python_version.startswith("2.") w.append(generate_upload_workflow(base_workflow_name, filter_branch, btype)) if filter_branch == 'nightly' and is_py3_linux: pydistro = 'pip' if btype == 'wheel' else 'conda' w.append(generate_smoketest_workflow(pydistro, base_workflow_name, filter_branch, python_version, os_type)) return w def generate_base_workflow(base_workflow_name, python_version, filter_branch, os_type, btype): d = { "name": base_workflow_name, "python_version": python_version, } if os_type in ['linux', 'macos']: d['requires'] = ['download_third_parties_nix'] if filter_branch: d["filters"] = gen_filter_branch_tree(filter_branch) return {"binary_{os_type}_{btype}".format(os_type=os_type, btype=btype): d} def gen_filter_branch_tree(*branches): return { "branches": { "only": list(branches), }, "tags": { # Using a raw string here to avoid having to escape # anything "only": r"/v[0-9]+(\.[0-9]+)*-rc[0-9]+/" } } def generate_upload_workflow(base_workflow_name, filter_branch, btype): d = { "name": "{base_workflow_name}_upload".format(base_workflow_name=base_workflow_name), "context": "org-member", "requires": [base_workflow_name], } if filter_branch: d["filters"] = gen_filter_branch_tree(filter_branch) return {"binary_{btype}_upload".format(btype=btype): d} def generate_smoketest_workflow(pydistro, base_workflow_name, filter_branch, python_version, os_type): required_build_suffix = "_upload" required_build_name = base_workflow_name + required_build_suffix smoke_suffix = "smoke_test_{pydistro}".format(pydistro=pydistro) d = { "name": "{base_workflow_name}_{smoke_suffix}".format( base_workflow_name=base_workflow_name, smoke_suffix=smoke_suffix), "requires": [required_build_name], "python_version": python_version, } if filter_branch: d["filters"] = gen_filter_branch_tree(filter_branch) return {"smoke_test_{os_type}_{pydistro}".format(os_type=os_type, pydistro=pydistro): d} def indent(indentation, data_list): return ("\n" + " " * indentation).join(yaml.dump(data_list).splitlines()) def unittest_workflows(indentation=6): jobs = [] jobs += build_download_job(None) for os_type in ["linux", "windows", "macos"]: for device_type in ["cpu", "gpu"]: if os_type == "macos" and device_type == "gpu": continue for i, python_version in enumerate(PYTHON_VERSIONS): job = { "name": f"unittest_{os_type}_{device_type}_py{python_version}", "python_version": python_version, } if device_type == 'gpu': job['filters'] = gen_filter_branch_tree('master', 'nightly') if os_type != "windows": job['requires'] = ['download_third_parties_nix'] jobs.append({f"unittest_{os_type}_{device_type}": job}) if i == 0 and os_type == "linux" and device_type == "cpu": jobs.append({ f"stylecheck": { "name": f"stylecheck_py{python_version}", "python_version": python_version, } }) return indent(indentation, jobs) if __name__ == "__main__": d = os.path.dirname(__file__) env = jinja2.Environment( loader=jinja2.FileSystemLoader(d), lstrip_blocks=True, autoescape=False, ) with open(os.path.join(d, 'config.yml'), 'w') as f: f.write(env.get_template('config.yml.in').render( build_workflows=build_workflows, unittest_workflows=unittest_workflows, )) audio-0.7.2/.circleci/smoke_test/000077500000000000000000000000001376444676100166535ustar00rootroot00000000000000audio-0.7.2/.circleci/smoke_test/docker/000077500000000000000000000000001376444676100201225ustar00rootroot00000000000000audio-0.7.2/.circleci/smoke_test/docker/Dockerfile000066400000000000000000000036761376444676100221300ustar00rootroot00000000000000# this Dockerfile is for torchaudio smoke test, it will be created periodically via CI system # if you need to do it locally, follow below steps once you have Docker installed # assuming you're within the directory where this Dockerfile located # $ docker build . -t torchaudio/smoketest # if you want to push to aws ecr, make sure you have the rights to write to ECR, then run # $ eval $(aws ecr get-login --region us-east-1 --no-include-email) # $ export MYTAG=localbuild ## you can choose whatever tag you like # $ docker tag torchaudio/smoketest 308535385114.dkr.ecr.us-east-1.amazonaws.com/torchaudio/smoke_test:${MYTAG} # $ docker push 308535385114.dkr.ecr.us-east-1.amazonaws.com/torchaudio/smoke_test:${MYTAG} FROM ubuntu:latest RUN apt-get -qq update && apt-get -qq -y install curl bzip2 sox libsox-dev libsox-fmt-all \ && curl -sSL https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -o /tmp/miniconda.sh \ && bash /tmp/miniconda.sh -bfp /usr/local \ && rm -rf /tmp/miniconda.sh \ && conda install -y python=3 \ && conda update conda \ && apt-get -qq -y remove curl bzip2 \ && apt-get -qq -y autoremove \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* /var/log/dpkg.log \ && conda clean --all --yes ENV PATH /opt/conda/bin:$PATH RUN conda create -y --name python3.6 python=3.6 RUN conda create -y --name python3.7 python=3.7 RUN conda create -y --name python3.8 python=3.8 SHELL [ "/bin/bash", "-c" ] RUN echo "source /usr/local/etc/profile.d/conda.sh" >> ~/.bashrc RUN source /usr/local/etc/profile.d/conda.sh && conda activate python3.6 && conda install -y -c conda-forge sox && conda install -y numpy RUN source /usr/local/etc/profile.d/conda.sh && conda activate python3.7 && conda install -y -c conda-forge sox && conda install -y numpy RUN source /usr/local/etc/profile.d/conda.sh && conda activate python3.8 && conda install -y -c conda-forge sox && conda install -y numpy CMD [ "/bin/bash"] audio-0.7.2/.circleci/torchscript_bc_test/000077500000000000000000000000001376444676100205455ustar00rootroot00000000000000audio-0.7.2/.circleci/torchscript_bc_test/common.sh000066400000000000000000000040101376444676100223640ustar00rootroot00000000000000#!/usr/bin/env bash declare -a TORCHAUDIO_VERSIONS=("0.6.0") declare -a PYTHON_VERSIONS=("3.6" "3.7" "3.8") export TORCHAUDIO_VERSIONS export PYTHON_VERSIONS export KALDI_ROOT="${KALDI_ROOT:-$HOME}" # Just to disable warning emitted from kaldi_io _this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" _root_dir="$(git rev-parse --show-toplevel)" _conda_dir="${_root_dir}/conda" case "$(uname -s)" in Darwin*) _os="MacOSX";; *) _os="Linux" esac install_conda() { if [ ! -d "${_conda_dir}" ]; then printf "* Installing conda\n" wget -nv -O miniconda.sh "http://repo.continuum.io/miniconda/Miniconda3-latest-${_os}-x86_64.sh" bash ./miniconda.sh -b -f -p "${_conda_dir}" rm miniconda.sh fi } init_conda() { eval "$("${_conda_dir}/bin/conda" shell.bash hook)" } get_name() { echo "${1}-py${2}" } get_env_dir() { echo "${_root_dir}/envs/$(get_name "$1" "$2")" } create_env() { env_dir="$(get_env_dir "$1" "$2")" if [ ! -d "${env_dir}" ]; then printf "* Creating environment torchaudio: %s, Python: %s\n" "$1" "$2" conda create -q --prefix "${env_dir}" -y python="$2" fi } activate_env() { printf "* Activating environment torchaudio: %s, Python: %s\n" "$1" "$2" conda activate "$(get_env_dir "$1" "$2")" } install_release() { printf "* Installing torchaudio: %s\n" "$1" conda install -y -q torchaudio="$1" packaging -c pytorch # packaging is required in test to validate the torchaudio version for dump } install_build_dependencies() { printf "* Installing torchaudio dependencies except PyTorch - (Python: %s)\n" "$1" conda env update -q --file "${_this_dir}/environment.yml" --prune if [ "${_os}" == Linux ]; then pip install clang-format fi } build_master() { printf "* Installing PyTorch (py%s)\n" "$1" conda install -y -q pytorch "cpuonly" -c pytorch-nightly printf "* Installing torchaudio\n" cd "${_root_dir}" || exit 1 BUILD_SOX=1 python setup.py clean install } audio-0.7.2/.circleci/torchscript_bc_test/environment.yml000066400000000000000000000005101376444676100236300ustar00rootroot00000000000000channels: - conda-forge - defaults dependencies: - flake8 - numpy - pytest - pytest-cov - codecov - librosa - llvmlite==0.31 # See https://github.com/pytorch/audio/pull/766 - pip - pip: - kaldi-io - scipy - parameterized - numba==0.48 # See https://github.com/librosa/librosa/issues/1160 audio-0.7.2/.circleci/torchscript_bc_test/generate_objects.sh000077500000000000000000000015241376444676100244110ustar00rootroot00000000000000#!/usr/bin/env bash set -e this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" pushd "${this_dir}" . "common.sh" popd init_conda # Move to test directory so that the checked out torchaudio source # will not shadow the conda-installed version of torchaudio cd test for torchaudio in "${TORCHAUDIO_VERSIONS[@]}" ; do for python in "${PYTHON_VERSIONS[@]}" ; do activate_env "${torchaudio}" "${python}" python -m torch.utils.collect_env printf "***********************************************************\n" printf "* Generating\n" printf " Objects: Python: %s, torchaudio: %s\n" "${python}" "${torchaudio}" printf "***********************************************************\n" ./torchscript_bc_test/main.py --mode generate --version "${torchaudio}" done done audio-0.7.2/.circleci/torchscript_bc_test/setup_master_envs.sh000077500000000000000000000005141376444676100246520ustar00rootroot00000000000000#!/usr/bin/env bash set -e cd "$( dirname "${BASH_SOURCE[0]}" )" . "common.sh" install_conda init_conda # Install torchaudio environments for python in "${PYTHON_VERSIONS[@]}" ; do create_env master "${python}" activate_env master "${python}" install_build_dependencies "${python}" build_master "${python}" done audio-0.7.2/.circleci/torchscript_bc_test/setup_release_envs.sh000077500000000000000000000006061376444676100250010ustar00rootroot00000000000000#!/usr/bin/env bash set -e cd "$( dirname "${BASH_SOURCE[0]}" )" . "common.sh" install_conda init_conda # Install torchaudio environments for torchaudio in "${TORCHAUDIO_VERSIONS[@]}" ; do for python in "${PYTHON_VERSIONS[@]}" ; do create_env "${torchaudio}" "${python}" activate_env "${torchaudio}" "${python}" install_release "${torchaudio}" done done audio-0.7.2/.circleci/torchscript_bc_test/validate_objects.sh000077500000000000000000000022151376444676100244060ustar00rootroot00000000000000#!/usr/bin/env bash set -e this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" pushd "${this_dir}" . "common.sh" popd init_conda # Move to test directory so that the checked out torchaudio source # will not shadow the conda-installed version of torchaudio cd test # Validate torchscript objects for each for runtime_python in "${PYTHON_VERSIONS[@]}" ; do activate_env master "${runtime_python}" python -m torch.utils.collect_env for object_torchaudio in "${TORCHAUDIO_VERSIONS[@]}" ; do for object_python in "${PYTHON_VERSIONS[@]}" ; do printf "***********************************************************\n" printf "* Validating\n" printf " Runtime: Python: %s, torchaudio: master (%s)\n" "${runtime_python}" "$(python -c 'import torchaudio;print(torchaudio.__version__)')" printf " Objects: Python: %s, torchaudio: %s\n" "${object_python}" "${object_torchaudio}" printf "***********************************************************\n" ./torchscript_bc_test/main.py --mode validate --version "${object_torchaudio}" done done done audio-0.7.2/.circleci/unittest/000077500000000000000000000000001376444676100163555ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/linux/000077500000000000000000000000001376444676100175145ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/linux/README.md000066400000000000000000000002641376444676100207750ustar00rootroot00000000000000This directory contains; - docker Docker image definition and scripts to build and update Docker image for unittest. - scripts Scripts used by CircleCI to run unit tests. audio-0.7.2/.circleci/unittest/linux/docker/000077500000000000000000000000001376444676100207635ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/linux/docker/.dockerignore000066400000000000000000000000131376444676100234310ustar00rootroot00000000000000* !scripts audio-0.7.2/.circleci/unittest/linux/docker/.gitignore000066400000000000000000000000561376444676100227540ustar00rootroot00000000000000scripts/build_third_parties.sh Dockerfile.tmp audio-0.7.2/.circleci/unittest/linux/docker/Dockerfile000066400000000000000000000033241376444676100227570ustar00rootroot00000000000000FROM ubuntu:18.04 as builder RUN apt update -q ################################################################################ # Build Kaldi ################################################################################ RUN apt install -q -y \ autoconf \ automake \ bzip2 \ g++ \ gfortran \ git \ libatlas-base-dev \ libtool \ make \ python2.7 \ python3 \ sox \ subversion \ unzip \ wget \ zlib1g-dev # KALDI uses MKL as a default math library, but we are going to copy featbin binaries and dependent # shared libraries to the final image, so we use ATLAS, which is easy to reinstall in the final image. RUN git clone --depth 1 https://github.com/kaldi-asr/kaldi.git /opt/kaldi && \ cd /opt/kaldi/tools && \ make -j $(nproc) && \ cd /opt/kaldi/src && \ ./configure --shared --mathlib=ATLAS --use-cuda=no && \ make featbin -j $(nproc) # Copy featbins and dependent libraries ADD ./scripts /scripts RUN bash /scripts/copy_kaldi_executables.sh /opt/kaldi /kaldi ################################################################################ # Build the final image ################################################################################ FROM BASE_IMAGE RUN apt update && apt install -y \ g++ \ gfortran \ git \ libatlas3-base \ wget \ curl \ make \ file \ sox \ libsox-dev \ libsox-fmt-all \ cmake \ pkg-config \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /kaldi /kaldi ENV PATH="${PATH}:/kaldi/bin" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/kaldi/lib" audio-0.7.2/.circleci/unittest/linux/docker/build_and_push.sh000077500000000000000000000014001376444676100242750ustar00rootroot00000000000000#!/usr/bin/env bash set -euo pipefail if [ $# -ne 1 ]; then printf "Usage %s \n\n" "$0" exit 1 fi if [ "$1" = "cpu" ]; then base_image="ubuntu:18.04" image="pytorch/torchaudio_unittest_base:manylinux" elif [[ "$1" =~ ^(9.2|10.1)$ ]]; then base_image="nvidia/cuda:$1-runtime-ubuntu18.04" image="pytorch/torchaudio_unittest_base:manylinux-cuda$1" else printf "Unexpected string: %s" "$1" exit 1; fi cd "$( dirname "${BASH_SOURCE[0]}" )" # docker build also accepts reading from STDIN # but in that case, no context (other files) can be passed, so we write out Dockerfile sed "s|BASE_IMAGE|${base_image}|g" Dockerfile > Dockerfile.tmp docker build -t "${image}" -f Dockerfile.tmp . docker push "${image}" audio-0.7.2/.circleci/unittest/linux/docker/scripts/000077500000000000000000000000001376444676100224525ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/linux/docker/scripts/copy_kaldi_executables.sh000077500000000000000000000032571376444676100275220ustar00rootroot00000000000000#!/usr/bin/env bash list_executables() { # List up executables in the given directory find "$1" -type f -executable } list_kaldi_libraries() { # List up shared libraries used by executables found in the given directory ($1) # that reside in Kaldi directory ($2) while read file; do ldd "${file}" | grep -o "${2}.* "; done < <(list_executables "$1") | sort -u } set -euo pipefail kaldi_root="$(realpath "$1")" target_dir="$(realpath "$2")" bin_dir="${target_dir}/bin" lib_dir="${target_dir}/lib" mkdir -p "${bin_dir}" "${lib_dir}" # 1. Copy featbins printf "Copying executables to %s\n" "${bin_dir}" while read file; do printf " %s\n" "${file}" cp "${file}" "${bin_dir}" done < <(list_executables "${kaldi_root}/src/featbin") # 2. Copy dependent libraries from Kaldi printf "Copying libraries to %s\n" "${lib_dir}" while read file; do printf " %s\n" "$file" # If it is not symlink, just copy to the target directory if [ ! -L "${file}" ]; then cp "${file}" "${lib_dir}" continue fi # If it is symlink, # 1. Copy the actual library to the target directory. library="$(realpath "${file}")" cp "${library}" "${lib_dir}" # 2. then if the name of the symlink is different from the actual library name, # create the symlink in the target directory. lib_name="$(basename "${library}")" link_name="$(basename "${file}")" if [ "${lib_name}" != "${link_name}" ]; then printf " Linking %s -> %s\n" "${lib_name}" "${link_name}" ( cd "${lib_dir}" ln -sf "${lib_name}" "${link_name}" ) fi done < <(list_kaldi_libraries "${bin_dir}" "${kaldi_root}") audio-0.7.2/.circleci/unittest/linux/scripts/000077500000000000000000000000001376444676100212035ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/linux/scripts/install.sh000077500000000000000000000024711376444676100232140ustar00rootroot00000000000000#!/usr/bin/env bash unset PYTORCH_VERSION # For unittest, nightly PyTorch is used as the following section, # so no need to set PYTORCH_VERSION. # In fact, keeping PYTORCH_VERSION forces us to hardcode PyTorch version in config. set -e eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env if [ -z "${CUDA_VERSION:-}" ] ; then case "$(uname -s)" in Darwin*) cudatoolkit="";; *) cudatoolkit="cpuonly" esac else version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" cudatoolkit="cudatoolkit=${version}" fi printf "Installing PyTorch with %s\n" "${cudatoolkit}" conda install ${CONDA_CHANNEL_FLAGS:-} -y -c "pytorch-${UPLOAD_CHANNEL}" pytorch ${cudatoolkit} printf "* Installing dependencies for test\n" CONDA_PKGS="librosa>=0.8.0" # TODO: Remove this after packages become available # Currently there's no librosa package available for Python 3.9, so lets just skip the dependency for now if [[ $(python --version) = *3.9* ]]; then CONDA_PKGS="pysoundfile" fi conda install -y -c conda-forge pytest pytest-cov codecov scipy parameterized ${CONDA_PKGS} pip install kaldi-io printf "* Building codecs\n" mkdir -p third_party/build ( cd third_party/build cmake .. cmake --build . ) printf "* Installing torchaudio\n" BUILD_SOX=1 python setup.py install audio-0.7.2/.circleci/unittest/linux/scripts/post_process.sh000077500000000000000000000001471376444676100242670ustar00rootroot00000000000000#!/usr/bin/env bash set -e eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env codecov audio-0.7.2/.circleci/unittest/linux/scripts/run_style_checks.sh000077500000000000000000000014771376444676100251170ustar00rootroot00000000000000#!/usr/bin/env bash set -u eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env pip install clang-format flake8 # We want to run all the style checks even if one of them fail. exit_status=0 printf "\x1b[34mRunning flake8: " flake8 --version printf "\x1b[0m\n" flake8 torchaudio test build_tools/setup_helpers status=$? exit_status="$((exit_status+status))" if [ "${status}" -ne 0 ]; then printf "\x1b[31mflake8 failed. Check the format of Python files.\x1b[0m\n" fi printf "\x1b[34mRunning clang-format: " clang-format --version printf "\x1b[0m\n" git-clang-format origin/master git diff --exit-code status=$? exit_status="$((exit_status+status))" if [ "${status}" -ne 0 ]; then printf "\x1b[31mC++ files are not formatted. Please use git-clang-format to format CPP files.\x1b[0m\n" fi exit $exit_status audio-0.7.2/.circleci/unittest/linux/scripts/run_test.sh000077500000000000000000000006211376444676100234040ustar00rootroot00000000000000#!/usr/bin/env bash set -e eval "$(./conda/bin/conda shell.bash hook)" conda activate ./env python -m torch.utils.collect_env export TORCHAUDIO_TEST_FAIL_IF_NO_EXTENSION=1 export PATH="${PWD}/third_party/install/bin/:${PATH}" declare -a args=( '-v' '--cov=torchaudio' "--junitxml=${PWD}/test-results/junit.xml" '--durations' '20' ) cd test pytest "${args[@]}" torchaudio_unittest audio-0.7.2/.circleci/unittest/linux/scripts/setup_env.sh000077500000000000000000000016171376444676100235570ustar00rootroot00000000000000#!/usr/bin/env bash # This script is for setting up environment in which unit test is ran. # To speed up the CI time, the resulting environment is cached. # # Do not install PyTorch and torchaudio here, otherwise they also get cached. set -e root_dir="$(git rev-parse --show-toplevel)" conda_dir="${root_dir}/conda" env_dir="${root_dir}/env" cd "${root_dir}" case "$(uname -s)" in Darwin*) os=MacOSX;; *) os=Linux esac # 1. Install conda at ./conda if [ ! -d "${conda_dir}" ]; then printf "* Installing conda\n" wget -O miniconda.sh "http://repo.continuum.io/miniconda/Miniconda3-latest-${os}-x86_64.sh" bash ./miniconda.sh -b -f -p "${conda_dir}" fi eval "$(${conda_dir}/bin/conda shell.bash hook)" # 2. Create test environment at ./env if [ ! -d "${env_dir}" ]; then printf "* Creating a test environment\n" conda create --prefix "${env_dir}" -y python="$PYTHON_VERSION" fi audio-0.7.2/.circleci/unittest/windows/000077500000000000000000000000001376444676100200475ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/windows/README.md000066400000000000000000000001241376444676100213230ustar00rootroot00000000000000This directory contains; - scripts Scripts used by CircleCI to run unit tests. audio-0.7.2/.circleci/unittest/windows/scripts/000077500000000000000000000000001376444676100215365ustar00rootroot00000000000000audio-0.7.2/.circleci/unittest/windows/scripts/environment.yml000066400000000000000000000003501376444676100246230ustar00rootroot00000000000000channels: - conda-forge - defaults dependencies: - flake8 - numpy - pytest - pytest-cov - codecov - scipy >= 1.4.1 - pip - pip: - kaldi-io - PySoundFile - future - parameterized - dataclasses audio-0.7.2/.circleci/unittest/windows/scripts/install.sh000066400000000000000000000017021376444676100235400ustar00rootroot00000000000000#!/usr/bin/env bash unset PYTORCH_VERSION # For unittest, nightly PyTorch is used as the following section, # so no need to set PYTORCH_VERSION. # In fact, keeping PYTORCH_VERSION forces us to hardcode PyTorch version in config. set -e eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" conda activate ./env if [ -z "${CUDA_VERSION:-}" ] ; then cudatoolkit="cpuonly" else version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" cudatoolkit="cudatoolkit=${version}" fi printf "Installing PyTorch with %s\n" "${cudatoolkit}" conda install ${CONDA_CHANNEL_FLAGS:-} -y -c "pytorch-${UPLOAD_CHANNEL}" pytorch "${cudatoolkit}" # TODO: Remove this after packages become available # Currently there's no librosa package available for Python 3.9, so lets just skip the dependency for now if [[ $(python --version) != *3.9* ]]; then pip install 'librosa>=0.8.0' fi printf "* Installing torchaudio\n" python setup.py install audio-0.7.2/.circleci/unittest/windows/scripts/install_conda.bat000066400000000000000000000001531376444676100250370ustar00rootroot00000000000000start /wait "" "%miniconda_exe%" /S /InstallationType=JustMe /RegisterPython=0 /AddToPath=0 /D=%tmp_conda% audio-0.7.2/.circleci/unittest/windows/scripts/post_process.sh000066400000000000000000000001631376444676100246150ustar00rootroot00000000000000#!/usr/bin/env bash set -e eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" conda activate ./env codecov audio-0.7.2/.circleci/unittest/windows/scripts/run_test.sh000066400000000000000000000003701376444676100237350ustar00rootroot00000000000000#!/usr/bin/env bash set -e eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" conda activate ./env python -m torch.utils.collect_env cd test pytest --cov=torchaudio --junitxml=../test-results/junit.xml -v --durations 20 torchaudio_unittest audio-0.7.2/.circleci/unittest/windows/scripts/setup_env.sh000066400000000000000000000024011376444676100240770ustar00rootroot00000000000000#!/usr/bin/env bash # This script is for setting up environment in which unit test is ran. # To speed up the CI time, the resulting environment is cached. # # Do not install PyTorch and torchaudio here, otherwise they also get cached. set -e this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" root_dir="$(git rev-parse --show-toplevel)" conda_dir="${root_dir}/conda" env_dir="${root_dir}/env" cd "${root_dir}" # 1. Install conda at ./conda if [ ! -d "${conda_dir}" ]; then printf "* Installing conda\n" export tmp_conda="$(echo $conda_dir | tr '/' '\\')" export miniconda_exe="$(echo $root_dir | tr '/' '\\')\\miniconda.exe" curl --output miniconda.exe https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -O "$this_dir/install_conda.bat" unset tmp_conda unset miniconda_exe fi eval "$(${conda_dir}/Scripts/conda.exe 'shell.bash' 'hook')" # 2. Create test environment at ./env if [ ! -d "${env_dir}" ]; then printf "* Creating a test environment\n" conda create --prefix "${env_dir}" -y python="$PYTHON_VERSION" fi conda activate "${env_dir}" # 3. Install Conda dependencies printf "* Installing dependencies (except PyTorch)\n" conda env update --file "${this_dir}/environment.yml" --prune audio-0.7.2/.clang-format000066400000000000000000000050111376444676100152130ustar00rootroot00000000000000--- AccessModifierOffset: -1 AlignAfterOpenBracket: AlwaysBreak AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlinesLeft: true AlignOperands: false AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: Empty AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: true AlwaysBreakTemplateDeclarations: true BinPackArguments: false BinPackParameters: false BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false BeforeCatch: false BeforeElse: false IndentBraces: false BreakBeforeBinaryOperators: None BreakBeforeBraces: Attach BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakAfterJavaFieldAnnotations: false BreakStringLiterals: false ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false ForEachMacros: [ FOR_EACH_RANGE, FOR_EACH, ] IncludeCategories: - Regex: '^<.*\.h(pp)?>' Priority: 1 - Regex: '^<.*' Priority: 2 - Regex: '.*' Priority: 3 IndentCaseLabels: true IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: false PenaltyBreakBeforeFirstCallParameter: 1 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 2000000 PointerAlignment: Left ReflowComments: true SortIncludes: true SpaceAfterCStyleCast: false SpaceBeforeAssignmentOperators: true SpaceBeforeParens: ControlStatements SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 8 UseTab: Never ... audio-0.7.2/.clang-tidy000066400000000000000000000020321376444676100146740ustar00rootroot00000000000000--- # NOTE there must be no spaces before the '-', so put the comma first. Checks: ' -* ,bugprone-* ,-bugprone-forward-declaration-namespace ,-bugprone-macro-parentheses ,cppcoreguidelines-* ,-cppcoreguidelines-interfaces-global-init ,-cppcoreguidelines-owning-memory ,-cppcoreguidelines-pro-bounds-array-to-pointer-decay ,-cppcoreguidelines-pro-bounds-constant-array-index ,-cppcoreguidelines-pro-bounds-pointer-arithmetic ,-cppcoreguidelines-pro-type-cstyle-cast ,-cppcoreguidelines-pro-type-reinterpret-cast ,-cppcoreguidelines-pro-type-static-cast-downcast ,-cppcoreguidelines-pro-type-union-access ,-cppcoreguidelines-pro-type-vararg ,-cppcoreguidelines-special-member-functions ,hicpp-exception-baseclass ,hicpp-avoid-goto ,modernize-* ,-modernize-return-braced-init-list ,-modernize-use-auto ,-modernize-use-default-member-init ,-modernize-use-using ,performance-unnecessary-value-param ' WarningsAsErrors: '*' HeaderFilterRegex: 'torchaudio/.*' AnalyzeTemporaryDtors: false CheckOptions: ... audio-0.7.2/.flake8000066400000000000000000000002071376444676100140150ustar00rootroot00000000000000[flake8] max-line-length = 120 ignore = E305,E402,E721,E741,F401,F403,F405,F999,W503,W504 exclude = build,docs/source,_ext,third_party audio-0.7.2/.github/000077500000000000000000000000001376444676100142035ustar00rootroot00000000000000audio-0.7.2/.github/ISSUE_TEMPLATE/000077500000000000000000000000001376444676100163665ustar00rootroot00000000000000audio-0.7.2/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000026471376444676100210070ustar00rootroot00000000000000--- name: "\U0001F41B Bug Report" about: Submit a bug report to help us improve Torchaudio --- ## 🐛 Bug ## To Reproduce Steps to reproduce the behavior: 1. 1. 1. ## Expected behavior ## Environment - What commands did you used to install torchaudio (conda/pip/build from source)? - If you are building from source, which commit is it? - What does `torchaudio.__version__` print? (If applicable) Please copy and paste the output from our [environment collection script](https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py) (or fill out the checklist below manually). You can get the script and run it with: ``` wget https://raw.githubusercontent.com/pytorch/pytorch/master/torch/utils/collect_env.py # For security purposes, please check the contents of collect_env.py before running it. python collect_env.py ``` - PyTorch Version (e.g., 1.0): - OS (e.g., Linux): - How you installed PyTorch (`conda`, `pip`, source): - Build command you used (if compiling from source): - Python version: - CUDA/cuDNN version: - GPU models and configuration: - Any other relevant information: ## Additional context audio-0.7.2/.github/ISSUE_TEMPLATE/documentation.md000066400000000000000000000003411376444676100215570ustar00rootroot00000000000000--- name: "\U0001F4DA Documentation" about: Report an issue related to https://pytorch.org/audio --- ## 📚 Documentation audio-0.7.2/.github/ISSUE_TEMPLATE/feature-request.md000066400000000000000000000013201376444676100220250ustar00rootroot00000000000000--- name: "\U0001F680Feature Request" about: Submit a proposal/request for a new Torchaudio feature --- ## 🚀 Feature ## Motivation ## Pitch ## Alternatives ## Additional context audio-0.7.2/.github/ISSUE_TEMPLATE/questions-help-support.md000066400000000000000000000006301376444676100234010ustar00rootroot00000000000000--- name: "❓Questions/Help/Support" about: Do you need support? We have resources. --- ## ❓ Questions and Help ### Please note that this issue tracker is not a help form and this issue will be closed. We have a set of [listed resources available on the website](https://pytorch.org/resources). Our primary means of support is our discussion forum: - [Discussion Forum](https://discuss.pytorch.org/) audio-0.7.2/.github/pytorch-probot.yml000066400000000000000000000000241376444676100177150ustar00rootroot00000000000000tracking_issue: 736 audio-0.7.2/.gitignore000066400000000000000000000030251376444676100146330ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # temp files ~* *.swp # C extensions / folders *.so _ext/ # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ docs/src/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints/ # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # dotenv .env # virtualenv .venv venv/ ENV/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # PyCharm project settings .idea # OSX dir files .DS_Store # mkdocs documentation /site # mypy .mypy_cache/ # Generated Files test/assets/sinewave.wav torchaudio/version.py gen.yml # Examples examples/interactive_asr/data/*.txt examples/interactive_asr/data/*.model examples/interactive_asr/data/*.pt # third parties third_party/archives/ third_party/install/ third_party/src/ third_party/tmp/ audio-0.7.2/.travis.yml000066400000000000000000000012721376444676100147560ustar00rootroot00000000000000# note dist: 'trusty' does not work here dist: xenial language: python # cache miniconda installer and similar files cache: directories: - /home/travis/download # This matrix tests that the code works on Python 3.5, 3.6, 3.7, passes # lint and example tests. matrix: fast_finish: true include: - env: PYTHON_VERSION="3.6" RUN_EXAMPLE_TESTS="true" SKIP_TESTS="true" allow_failures: - env: PYTHON_VERSION="3.6" RUN_EXAMPLE_TESTS="true" SKIP_TESTS="true" addons: apt: packages: sox libsox-dev libsox-fmt-all portaudio19-dev notifications: email: false install: source build_tools/travis/install.sh script: bash build_tools/travis/test_script.sh audio-0.7.2/CODE_OF_CONDUCT.md000066400000000000000000000064171376444676100154520ustar00rootroot00000000000000# Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq audio-0.7.2/LICENSE000066400000000000000000000024721376444676100136550ustar00rootroot00000000000000BSD 2-Clause License Copyright (c) 2017 Facebook Inc. (Soumith Chintala), All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. audio-0.7.2/README.md000066400000000000000000000240741376444676100141310ustar00rootroot00000000000000torchaudio: an audio library for PyTorch ======================================== [![Build Status](https://circleci.com/gh/pytorch/audio.svg?style=svg)](https://app.circleci.com/pipelines/github/pytorch/audio) [![Coverage](https://codecov.io/gh/pytorch/audio/branch/master/graph/badge.svg)](https://codecov.io/gh/pytorch/audio) [![Documentation](https://img.shields.io/badge/dynamic/json.svg?label=docs&url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchaudio%2Fjson&query=%24.info.version&colorB=brightgreen&prefix=v)](https://pytorch.org/audio/) The aim of torchaudio is to apply [PyTorch](https://github.com/pytorch/pytorch) to the audio domain. By supporting PyTorch, torchaudio follows the same philosophy of providing strong GPU acceleration, having a focus on trainable features through the autograd system, and having consistent style (tensor names and dimension names). Therefore, it is primarily a machine learning library and not a general signal processing library. The benefits of Pytorch is be seen in torchaudio through having all the computations be through Pytorch operations which makes it easy to use and feel like a natural extension. - [Support audio I/O (Load files, Save files)](http://pytorch.org/audio/) - Load the following formats into a torch Tensor using SoX - mp3, wav, aac, ogg, flac, avr, cdda, cvs/vms, - aiff, au, amr, mp2, mp4, ac3, avi, wmv, - mpeg, ircam and any other format supported by libsox. - [Kaldi (ark/scp)](http://pytorch.org/audio/kaldi_io.html) - [Dataloaders for common audio datasets (VCTK, YesNo)](http://pytorch.org/audio/datasets.html) - Common audio transforms - [Spectrogram, AmplitudeToDB, MelScale, MelSpectrogram, MFCC, MuLawEncoding, MuLawDecoding, Resample](http://pytorch.org/audio/transforms.html) - Compliance interfaces: Run code using PyTorch that align with other libraries - [Kaldi: spectrogram, fbank, mfcc, resample_waveform](https://pytorch.org/audio/compliance.kaldi.html) Dependencies ------------ * PyTorch (See below for the compatible versions) * libsox v14.3.2 or above (only required when building from source) * [optional] vesis84/kaldi-io-for-python commit cb46cb1f44318a5d04d4941cf39084c5b021241e or above The following is the corresponding ``torchaudio`` versions and supported Python versions. | ``torch`` | ``torchaudio`` | ``python`` | | ------------------------ | ------------------------ | ------------------------------- | | ``master`` / ``nightly`` | ``master`` / ``nightly`` | ``>=3.6`` | | ``1.6.0`` | ``0.6.0`` | ``>=3.6`` | | ``1.5.0`` | ``0.5.0`` | ``>=3.5`` | | ``1.4.0`` | ``0.4.0`` | ``==2.7``, ``>=3.5``, ``<=3.8`` | Installation ------------ ### Binary Distibutions To install the latest version using anaconda, run: ``` conda install -c pytorch torchaudio ``` To install the latest pip wheels, run: ``` pip install torchaudio -f https://download.pytorch.org/whl/torch_stable.html ``` (If you do not have torch already installed, this will default to installing torch from PyPI. If you need a different torch configuration, preinstall torch before running this command.) ### Nightly build Note that nightly build is build on PyTorch's nightly build. Therefore, you need to install the latest PyTorch when you use nightly build of torchaudio. **pip** ``` pip install numpy pip install --pre torchaudio -f https://download.pytorch.org/whl/nightly/torch_nightly.html ``` **conda** ``` conda install -y -c pytorch-nightly torchaudio ``` ### From Source If your system configuration is not among the supported configurations above, you can build torchaudio from source. This will require libsox v14.3.2 or above.
Click here for the examples on how to install SoX OSX (Homebrew): ```bash brew install sox ``` Linux (Ubuntu): ```bash sudo apt-get install sox libsox-dev libsox-fmt-all ``` Anaconda ```bash conda install -c conda-forge sox ```
```bash # Linux python setup.py install # OSX MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install ``` Alternatively, the build process can build libsox and some optional codecs statically and torchaudio can link them, by setting environment variable `BUILD_SOX=1`. The build process will fetch and build libmad, lame, flac, vorbis, opus, and libsox before building extension. This process requires `cmake` and `pkg-config`. ```bash # Linux BUILD_SOX=1 python setup.py install # OSX BUILD_SOX=1 MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install ``` This is known to work on linux and unix distributions such as Ubuntu and CentOS 7 and macOS. If you try this on a new system and found a solution to make it work, feel free to share it by opening and issue. #### Troubleshooting
checking build system type... ./config.guess: unable to guess system type Since the configuration file for codecs are old, they cannot correctly detect the new environments, such as Jetson Aarch. You need to replace the `config.guess` file in `./third_party/tmp/lame-3.99.5/config.guess` and/or `./third_party/tmp/libmad-0.15.1b/config.guess` with [the latest one](https://github.com/gcc-mirror/gcc/blob/master/config.guess). See also: [#658](https://github.com/pytorch/audio/issues/658)
Undefined reference to `tgetnum' when using `BUILD_SOX` If while building from within an anaconda environment you come across errors similar to the following: ``` ../bin/ld: console.c:(.text+0xc1): undefined reference to `tgetnum' ``` Install `ncurses` from `conda-forge` before running `python setup.py install`: ``` # Install ncurses from conda-forge conda install -c conda-forge ncurses ```
Quick Usage ----------- ```python import torchaudio waveform, sample_rate = torchaudio.load('foo.wav') # load tensor from file torchaudio.save('foo_save.wav', waveform, sample_rate) # save tensor to file ``` Backend Dispatch ---------------- By default in OSX and Linux, torchaudio uses SoX as a backend to load and save files. The backend can be changed to [SoundFile](https://pysoundfile.readthedocs.io/en/latest/) using the following. See [SoundFile](https://pysoundfile.readthedocs.io/en/latest/) for installation instructions. ```python import torchaudio torchaudio.set_audio_backend("soundfile") # switch backend waveform, sample_rate = torchaudio.load('foo.wav') # load tensor from file, as usual torchaudio.save('foo_save.wav', waveform, sample_rate) # save tensor to file, as usual ``` Unlike SoX, SoundFile does not currently support mp3. API Reference ------------- API Reference is located here: http://pytorch.org/audio/ Conventions ----------- With torchaudio being a machine learning library and built on top of PyTorch, torchaudio is standardized around the following naming conventions. Tensors are assumed to have channel as the first dimension and time as the last dimension (when applicable). This makes it consistent with PyTorch's dimensions. For size names, the prefix `n_` is used (e.g. "a tensor of size (`n_freq`, `n_mel`)") whereas dimension names do not have this prefix (e.g. "a tensor of dimension (channel, time)") * `waveform`: a tensor of audio samples with dimensions (channel, time) * `sample_rate`: the rate of audio dimensions (samples per second) * `specgram`: a tensor of spectrogram with dimensions (channel, freq, time) * `mel_specgram`: a mel spectrogram with dimensions (channel, mel, time) * `hop_length`: the number of samples between the starts of consecutive frames * `n_fft`: the number of Fourier bins * `n_mel`, `n_mfcc`: the number of mel and MFCC bins * `n_freq`: the number of bins in a linear spectrogram * `min_freq`: the lowest frequency of the lowest band in a spectrogram * `max_freq`: the highest frequency of the highest band in a spectrogram * `win_length`: the length of the STFT window * `window_fn`: for functions that creates windows e.g. `torch.hann_window` Transforms expect and return the following dimensions. * `Spectrogram`: (channel, time) -> (channel, freq, time) * `AmplitudeToDB`: (channel, freq, time) -> (channel, freq, time) * `MelScale`: (channel, freq, time) -> (channel, mel, time) * `MelSpectrogram`: (channel, time) -> (channel, mel, time) * `MFCC`: (channel, time) -> (channel, mfcc, time) * `MuLawEncode`: (channel, time) -> (channel, time) * `MuLawDecode`: (channel, time) -> (channel, time) * `Resample`: (channel, time) -> (channel, time) * `Fade`: (channel, time) -> (channel, time) * `Vol`: (channel, time) -> (channel, time) Complex numbers are supported via tensors of dimension (..., 2), and torchaudio provides `complex_norm` and `angle` to convert such a tensor into its magnitude and phase. Here, and in the documentation, we use an ellipsis "..." as a placeholder for the rest of the dimensions of a tensor, e.g. optional batching and channel dimensions. Contributing Guidelines ----------------------- Please let us know if you encounter a bug by filing an [issue](https://github.com/pytorch/audio/issues). We appreciate all contributions. If you are planning to contribute back bug-fixes, please do so without any further discussion. If you plan to contribute new features, utility functions or extensions to the core, please first open an issue and discuss the feature with us. Sending a PR without discussion might end up resulting in a rejected PR, because we might be taking the core in a different direction than you might be aware of. Disclaimer on Datasets ---------------------- This is a utility library that downloads and prepares public datasets. We do not host or distribute these datasets, vouch for their quality or fairness, or claim that you have license to use the dataset. It is your responsibility to determine whether you have permission to use the dataset under the dataset's license. If you're a dataset owner and wish to update any part of it (description, citation, etc.), or do not want your dataset to be included in this library, please get in touch through a GitHub issue. Thanks for your contribution to the ML community! audio-0.7.2/build_tools/000077500000000000000000000000001376444676100151625ustar00rootroot00000000000000audio-0.7.2/build_tools/__init__.py000066400000000000000000000000001376444676100172610ustar00rootroot00000000000000audio-0.7.2/build_tools/setup_helpers/000077500000000000000000000000001376444676100200445ustar00rootroot00000000000000audio-0.7.2/build_tools/setup_helpers/__init__.py000066400000000000000000000000411376444676100221500ustar00rootroot00000000000000from .extension import * # noqa audio-0.7.2/build_tools/setup_helpers/extension.py000066400000000000000000000062771376444676100224460ustar00rootroot00000000000000import os import platform import subprocess from pathlib import Path from torch.utils.cpp_extension import ( CppExtension, BuildExtension as TorchBuildExtension ) __all__ = [ 'get_ext_modules', 'BuildExtension', ] _THIS_DIR = Path(__file__).parent.resolve() _ROOT_DIR = _THIS_DIR.parent.parent.resolve() _CSRC_DIR = _ROOT_DIR / 'torchaudio' / 'csrc' _TP_BASE_DIR = _ROOT_DIR / 'third_party' _TP_INSTALL_DIR = _TP_BASE_DIR / 'install' def _get_build_sox(): val = os.environ.get('BUILD_SOX', '0') trues = ['1', 'true', 'TRUE', 'on', 'ON', 'yes', 'YES'] falses = ['0', 'false', 'FALSE', 'off', 'OFF', 'no', 'NO'] if val in trues: return True if val not in falses: print( f'WARNING: Unexpected environment variable value `BUILD_SOX={val}`. ' f'Expected one of {trues + falses}') return False _BUILD_SOX = _get_build_sox() def _get_eca(debug): eca = [] if debug: eca += ["-O0", "-g"] else: eca += ["-O3"] return eca def _get_ela(debug): ela = [] if debug: if platform.system() == "Windows": ela += ["/DEBUG:FULL"] else: ela += ["-O0", "-g"] else: ela += ["-O3"] return ela def _get_srcs(): return [str(p) for p in _CSRC_DIR.glob('**/*.cpp')] def _get_include_dirs(): dirs = [ str(_ROOT_DIR), ] if _BUILD_SOX: dirs.append(str(_TP_INSTALL_DIR / 'include')) return dirs def _get_extra_objects(): objs = [] if _BUILD_SOX: # NOTE: The order of the library listed bellow matters. # # (the most important thing is that dependencies come after a library # e.g., sox comes first, flac/vorbis comes before ogg, and # vorbisenc/vorbisfile comes before vorbis libs = [ 'libsox.a', 'libmad.a', 'libFLAC.a', 'libmp3lame.a', 'libopusfile.a', 'libopus.a', 'libvorbisenc.a', 'libvorbisfile.a', 'libvorbis.a', 'libogg.a', ] for lib in libs: objs.append(str(_TP_INSTALL_DIR / 'lib' / lib)) return objs def _get_libraries(): return [] if _BUILD_SOX else ['sox'] def _build_third_party(): build_dir = str(_TP_BASE_DIR / 'build') os.makedirs(build_dir, exist_ok=True) subprocess.run( args=['cmake', '..'], cwd=build_dir, check=True, ) subprocess.run( args=['cmake', '--build', '.'], cwd=build_dir, check=True, ) _EXT_NAME = 'torchaudio._torchaudio' def get_ext_modules(debug=False): if platform.system() == 'Windows': return None return [ CppExtension( _EXT_NAME, _get_srcs(), libraries=_get_libraries(), include_dirs=_get_include_dirs(), extra_compile_args=_get_eca(debug), extra_objects=_get_extra_objects(), extra_link_args=_get_ela(debug), ), ] class BuildExtension(TorchBuildExtension): def build_extension(self, ext): if ext.name == _EXT_NAME and _BUILD_SOX: _build_third_party() super().build_extension(ext) audio-0.7.2/build_tools/travis/000077500000000000000000000000001376444676100164725ustar00rootroot00000000000000audio-0.7.2/build_tools/travis/install.sh000066400000000000000000000045761376444676100205100ustar00rootroot00000000000000#!/bin/bash # This script is meant to be called by the "install" step defined in # .travis.yml. See http://docs.travis-ci.com/ for more details. # The behavior of the script is controlled by environment variabled defined # in the .travis.yml in the top level folder of the project. set -e echo 'List files from cached directories' if [ -d $HOME/download ]; then echo 'download:' ls $HOME/download fi if [ -d $HOME/.cache/pip ]; then echo 'pip:' ls $HOME/.cache/pip fi # Deactivate the travis-provided virtual environment and setup a # conda-based environment instead deactivate # Add the miniconda bin directory to $PATH export PATH=/home/travis/miniconda3/bin:$PATH echo $PATH # Use the miniconda installer for setup of conda itself pushd . cd mkdir -p download cd download if [[ ! -f /home/travis/miniconda3/bin/activate ]] then if [[ ! -f miniconda.sh ]] then wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \ -O miniconda.sh fi chmod +x miniconda.sh && ./miniconda.sh -b -f conda update --yes conda echo "Creating environment to run tests in." conda create -n testenv --yes python="$PYTHON_VERSION" fi cd .. popd # Activate the python environment we created. source activate testenv # Install requirements via pip in our conda environment conda install -y pytorch cpuonly -c pytorch-nightly pip install -r requirements.txt # Install the following only if running tests if [[ "$SKIP_INSTALL" != "true" ]]; then # TorchAudio CPP Extensions python setup.py install fi if [[ "$RUN_EXAMPLE_TESTS" == "true" ]]; then # Install dependencies pip install sentencepiece PyAudio if [[ ! -d $HOME/download/fairseq ]]; then # Install fairseq from source git clone https://github.com/pytorch/fairseq $HOME/download/fairseq fi pushd $HOME/download/fairseq pip install --editable . popd mkdir -p $HOME/download/data # Install dictionary, sentence piece model, and model # These are cached so they are not downloaded if they already exist wget -nc -O $HOME/download/data/dict.txt https://download.pytorch.org/models/audio/dict.txt || true wget -nc -O $HOME/download/data/spm.model https://download.pytorch.org/models/audio/spm.model || true wget -nc -O $HOME/download/data/model.pt https://download.pytorch.org/models/audio/checkpoint_avg_60_80.pt || true fi echo "Finished installation" audio-0.7.2/build_tools/travis/test_script.sh000077500000000000000000000025211376444676100213740ustar00rootroot00000000000000#!/bin/bash # This script is meant to be called by the "script" step defined in # .travis.yml. See http://docs.travis-ci.com/ for more details. # The behavior of the script is controlled by environment variabled defined # in the .travis.yml in the top level folder of the project. set -e python --version python -c 'import torch;print("torch:", torch.__version__)' run_tests() { # find all the test files that match "test*.py" TEST_FILES="$(find test -type f -name "test*.py" | sort)" echo "Test files are:" echo $TEST_FILES echo "Executing tests:" EXIT_STATUS=0 for FILE in $TEST_FILES; do # run each file on a separate process. if one fails, just keep going and # return the final exit status. python -m pytest -v $FILE STATUS=$? EXIT_STATUS="$(($EXIT_STATUS+STATUS))" done echo "Done, exit status: $EXIT_STATUS" exit $EXIT_STATUS } if [[ "$RUN_FLAKE8" == "true" ]]; then flake8 fi if [[ "$SKIP_TESTS" != "true" ]]; then echo "run_tests" run_tests fi if [[ "$RUN_EXAMPLE_TESTS" == "true" ]]; then echo "run_example_tests" pushd examples ASR_MODEL_PATH=$HOME/download/data/model.pt \ ASR_INPUT_FILE=interactive_asr/data/sample.wav \ ASR_DATA_PATH=$HOME/download/data \ ASR_USER_DIR=$HOME/download/fairseq/examples/speech_recognition \ python -m unittest test/test_interactive_asr.py popd fi audio-0.7.2/docs/000077500000000000000000000000001376444676100135735ustar00rootroot00000000000000audio-0.7.2/docs/Makefile000066400000000000000000000020251376444676100152320ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = torchaudio SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) docset: html doc2dash --name $(SPHINXPROJ) --icon $(SOURCEDIR)/_static/img/pytorch-logo-flame.png --enable-js --online-redirect-url http://pytorch.org/audio/ --force $(BUILDDIR)/html/ # Manually fix because Zeal doesn't deal well with `icon.png`-only at 2x resolution. cp $(SPHINXPROJ).docset/icon.png $(SPHINXPROJ).docset/icon@2x.png convert $(SPHINXPROJ).docset/icon@2x.png -resize 16x16 $(SPHINXPROJ).docset/icon.png .PHONY: help Makefile docset # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) audio-0.7.2/docs/make.bat000066400000000000000000000014161376444676100152020ustar00rootroot00000000000000@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source set BUILDDIR=build set SPHINXPROJ=torchaudio if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% :end popd audio-0.7.2/docs/requirements.txt000066400000000000000000000001771376444676100170640ustar00rootroot00000000000000sphinx==2.4.4 -e git+git://github.com/pytorch/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme sphinxcontrib.katex matplotlib audio-0.7.2/docs/source/000077500000000000000000000000001376444676100150735ustar00rootroot00000000000000audio-0.7.2/docs/source/_static/000077500000000000000000000000001376444676100165215ustar00rootroot00000000000000audio-0.7.2/docs/source/_static/css/000077500000000000000000000000001376444676100173115ustar00rootroot00000000000000audio-0.7.2/docs/source/_static/css/pytorch_theme.css000066400000000000000000000043771376444676100227100ustar00rootroot00000000000000body { font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; } /* Default header fonts are ugly */ h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend, p.caption { font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; } /* Use white for docs background */ .wy-side-nav-search { background-color: #fff; } .wy-nav-content-wrap, .wy-menu li.current > a { background-color: #fff; } @media screen and (min-width: 1400px) { .wy-nav-content-wrap { background-color: rgba(0, 0, 0, 0.0470588); } .wy-nav-content { background-color: #fff; } } /* Fixes for mobile */ .wy-nav-top { background-color: #fff; background-image: url('../img/pytorch-logo-dark.svg'); background-repeat: no-repeat; background-position: center; padding: 0; margin: 0.4045em 0.809em; color: #333; } .wy-nav-top > a { display: none; } @media screen and (max-width: 768px) { .wy-side-nav-search>a img.logo { height: 60px; } } /* This is needed to ensure that logo above search scales properly */ .wy-side-nav-search a { display: block; } /* This ensures that multiple constructors will remain in separate lines. */ .rst-content dl:not(.docutils) dt { display: table; } /* Use our red for literals (it's very similar to the original color) */ .rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal { color: #F05732; } .rst-content tt.xref, a .rst-content tt, .rst-content tt.xref, .rst-content code.xref, a .rst-content tt, a .rst-content code { color: #404040; } /* Change link colors (except for the menu) */ a { color: #F05732; } a:hover { color: #F05732; } a:visited { color: #D44D2C; } .wy-menu a { color: #b3b3b3; } .wy-menu a:hover { color: #b3b3b3; } /* Default footer text is quite big */ footer { font-size: 80%; } footer .rst-footer-buttons { font-size: 125%; /* revert footer settings - 1/80% = 125% */ } footer p { font-size: 100%; } /* For hidden headers that appear in TOC tree */ /* see http://stackoverflow.com/a/32363545/3343043 */ .rst-content .hidden-section { display: none; } nav .hidden-section { display: inherit; } .wy-side-nav-search>div.version { color: #000; } audio-0.7.2/docs/source/_static/img/000077500000000000000000000000001376444676100172755ustar00rootroot00000000000000audio-0.7.2/docs/source/_static/img/pytorch-logo-dark.png000066400000000000000000000364111376444676100233550ustar00rootroot00000000000000PNG  IHDRigAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIME6!,u;IDATxyUʊ` l^¥oKt^_0QD_F*HGTT90G"!.<[0ӾGY>!@{ X-"!= @ i_ʅ{@ ^wd\FO!@=;\>ٛJ/  DdzJ<*?o X^@kޗ2B RyI+zsЊ'Lc?U]"ؠ{У@P4#z!dJ, p& @ 5G#I-ی{y{r2٫u @ r;ђ$6zqtoҌ>0P7l.WtGF/獷7Q9Yym!4!@N؜}-@@B>b_Y BG$q! i*s]ۍƌ$ٌ S۩: Bzm```j:JH[a"q$ֱ `,.{OO#xvJY a4U"r}ZUfVDH17YA@U`fUN]=I^wuT\yȼF1MfuܨQU."4uj|#"-#>CoHh-+o<&ƚ8B 'm;Xy4zodddΠRU]t֙5DDF0|VJ`ڠW y>Zl3{͹YiyST*gtϨ=] G>@Ge<%Yj٢y{  pr%h9+Keu2^#"=ŒɺVAA:mYjȋrTifv]UvU=ZjYBNuV1^y~){ZVt<xNDB40k8|m0'&sK_8I9`O ,o+Do7ePVgw~_; ms_6Yun43T"rSVT@U$S;J<!c,<kSk2:/!쩪f\N^ofA?٫TmN]ӥn`I4c3 V.]QѧlE5 6GgGkA+]Qd[ :klwVÌ҇s}ޖx@D^{KUf. O/JLVՏH+ tF1CU33;9˚A0wvO3fgVU=4 dsl] 91mϛ׾VIA_d69n[y |nZ@D^ەJe^4;ե\MFiB3DjzWg4"yhhhΆjBe"rb6l:~,CqtY˩z#)6g<@d[&ov% }\p=*HUu#s###UǫC&^"rDc|#Ky$ }`xR,ڢmqt Q۲|-Je[U]20O{BdV]YDB)ސ 7Wo|,>6A3{!m^#",X#"X+~MlY3xרd68ZnUF}!!!ŸL1L^'Giv\bC4!@g74(gIRyFUEGw1z```>^hPFm= SwSƀJZSoއJf&qta69QW2> m4ZzaW)BӼDLIUJQ#zG3o"20!U}$E Ncֳj:ا}Wc{N8oL9Ἂ*fk5O6YVS6l3̻UUotܟ6 j('}~#{"efݿ{^B?ߓ_Ny#&c}|ǧ7{.QsGRnD&*ٕpT:lH%tk:㩎027~a?U=)&5gƫYS|/,}GFi= 5Νڧ=@Wy}dBf􁔧5W>0S>X0 g> ~fyot|ppp׺nI7<'e=7llF_!(u0UUr 8]'}q1rJ0|QUv~f?o;wٻBfVt+=,MDt%ק0<*v5!E!v+" :.pK:H,gǟN.wS;#3Bχ V.s,_T!@+JP ų T\JeXC٢LF_ @U`TFbxxQe_ WftlgPސqm0fz^sTu>瓢+~vC>7Y ޡ}4mpaɿ۪Ru vogxX}cqts6oBn(X^V';8@x^ۤV/ժY+j0MUl 8kl`MCi)zAR~_|z$.My bObqCBJe[O5{$Mv|͟i<^~܇B8{%efr\= !@aNXRe iJ A@4!bOBS_ 4fvޗm3didddra```5TUas!@nl}%"[RڝH<3;ͱg1#} B ڣӒ8Zbrɱ=2 LN}!ӫT*;w,;_O/aA«s$(sp=:\]k8d. r ߘQ[q4ꄀؖC9slifu6[݅[Usw"; ^\;">.Q fcԮ[KC5ZR6@ЕXK *Ɗš:!`B j5U}KGUw ?q9̪9@rIϏKq`8o.Qc= Xx8xB|###ͬ/Wwu˓_j3gmwՓs2>a>\1xc|+XrK "/*X{ͱOLQ<ȁz#Q4mYodTك dfU37Dd3of EdTDP7;UfUU3K,w'|T*g@ᯞM@J8 Wq7c5|gy ٘_w؝L@xTK[uv푶MIhV3>3̮l vk3ew;E$`lK'uj5sJ-!@e͵ck;JBǭH3̈́@- _rOSb$q9Y !_kۯV틓Nux͟]BJ :/&^55L@LT7Үk CCˎeIU}Q㷊tp~oDWT evs(勢'@H'Xk^Xl| j썎{$OM!U[{V эJ}yUq:@)O; ڵl5#N pVaT{$ p.pxo+P!^{VM|w|'8:^L@-w%RX8TnǶ6WkZNv {:l#W#!@ÎRZ~a!@柣';NЋ I7f ~C{#IڣJsUկ_c!UuoAGz:vx_+H-o)*фG](贤I1|*X+<2E;--cJP%CCCp";ƌ+/#` .J3VN\tZ47Y ph'}I\pv!@яO`o˳jpܝM+Hm%Emh2/9ń@'۩ hQ7k/"f}ڲRl9=k:L0N.h!\ޛ\yG/r vإO9\& JmX؃vJbU?'fv.Jm񗬵s}N_TUcg鱍?sk|Sm,:]FFFӋ JZq6 D+qt!@\cSU<<? wQkELFcy!!\f=z]#"WwUTf&9@UfSM7;ßֶ(8zUʉG;Q.4ifY+܋`Ed:j 4)Js?;ݨov!َ!@L/&  *eSɮ47 -oN# (zC(uCz=!@_vsZwCyc>^L@XGJ*fkY>/e|#(`mAD ;&HBQ{,Z "9TǻsW>w!}x(tv5EɗҴx+zMGP\着}Em qxwn7&o#M%V/q|}^L@ԏ4PlG%)cք\|q@5-}.%蛕Ckyg7u:}_Ƅ@%躔A\E~, _*{  ߾pK[Vg <)T0gΜ-6}lJ ޝMzj5>!@0]V̈́@CI7>I%ye'q*];1I$(F1ЧD?!@g7Ϗxw>/uل]k;'`/7$6=.0iGT3M;DH%dno^˿G0iﲛz~qC %Zq̈́@'?J`J_Ѻ{3A% ʠV˲m׉3/`WdϏKxg>/w;ck.fBB!@}a 91mϛORePMBM4~0c:o_'L/c'xLvu>  1]¿ܻ1ZӌK]Vx.$(Y;G<[=ϛB!@RqsO88bB Y}ZU_η !!Ph~hF>E57ѮIq:!&fΜ9[YgN?-pT _B}q >;yzvɱO!BBڣӒV,$n##ӓftE"$(i[̡\0m~򁁁JK5 LUvhK7>ߎ ;h43\5\?)[qPSzӧUuc+'@-kgp&U}\}[^I̠+.*JPQYKU wy7CN:?/{swq'!@)V,ۆ(8zVA@GI=󼥋$fST08Ӿj9}Jj_@UN1aNކSD:Z҃v$!)yKZ`G2 N'ftz*!BP U]:i2#Ky^{G |U]"(NBB%qPAX\|llS$ծh̠g`v˯azwU* 7tk)&L7g~UVUUvUK0i}):|%0ތޜcqNE>߾yS8|GҊdX #IjgLHOVUw*cA~+ccXzG 6?eQ?qtBjr;$qkaLO$4.ph?8C4ͤY͙X۫UO=yyV)x" JpVҌnBoE_] |V4 $qk4 O/$ %.K}ߗ V.D$TuiPj;ӽ6٧IE}|%nI%qtB{ttZ?fY.]Z-oE_- )zCyWl2lV3tIӸY ~c V#!@n޿J٧7! J`Y++U] I]px#YNS @spMS'`["% $kZ_;I裄O]9OUW D8yk/Oh] I+?K[5H.EyLRTvv9Y1HP3S%Ԫz_}x{"iG >ΠOoP.woKh}'^We9}V$ƻ|7 <ϛbf`Ҵv>Čhj tu}-"_تO]|U]J@`ftlGz8k\8z&ȿ'0n^gK8A&?P҅ z9S;׬OyLb%$u  xv􇴪l3{C lX3:ˏVIy344}jBBH/H%%OI,_0NV%,}Rl>JRRyFY2Ed BBh3[sv`o-_>!& ׽y8ǝojx9~ufvM2 2n=a|ߏd聃jog&q`'KQ&\p$ZD:ٷO(!@߯{n0NrM@8 hcqtrG 3oFW$qj{Zf^mMPϤY*3;9 Ù}G 7MU߬+ 67fSwg Iާ I]:֌Ok N181$HRllZӇ t/XEU|?VT'BBOhHⰕхI{y}3hq r#Bg%PL֫y< ?jg0]DNmC@`s9chG&hM&wђG+"g,3gΖT KJegU==>jV>JÀKD> 1שTy޴^ԅvpqg3k8ZI$.oo_*BUO`` !Y}YA; cI+ǚ;\ъI3x3AҌIdQΤ(teszZ6׊E=kf_c'crj9ODnIU}ߏD ^{`3ݷ8)ipYoHY?1hI?<GkEoKVpXk^^([PA!r,CCCk;'[|_UoK ]c9̎g-&ܹscfGd4'VT"r6}ߑJl,UD!O0A`f/fvH瑦(923rlj'z,QU}יؿǏQ3/"󺵛? ̎ri@#zC *@ p|4zU=eF1'FFFBS=(\@C=~A#CCC;H@Qշ;<PRٖ_!  DT>""l("#T sn""9n:@t(}BD^ CT1EU}W@0CO'DdUQ }BU8Oju\B*@-@D.O16|*@0#~ كUj)S_H)Y Uh;nx&-@ 1Ot^UO` ]Tv6xwa8 %)&Uf&FcjuPD>SmYL+؜ #+3o#Dd̎4w'T!s}V "rlFn\w nG+UaN5A "C#zȱQգs ` @TI+###i22Szu]y4Z 19|`*-@!94"tVf:bOk#"2T;z4)T12TOO7OD䕍Fc GժESzV3efPQǔ l/Yv&GQz6kZZΦ\N/m%tEXtdate:create2018-10-30T01:29:00+00:00(R%tEXtdate:modify2018-10-30T01:29:00+00:00u?IENDB`audio-0.7.2/docs/source/_static/img/pytorch-logo-dark.svg000066400000000000000000000040401376444676100233610ustar00rootroot00000000000000 audio-0.7.2/docs/source/_static/img/pytorch-logo-flame.png000066400000000000000000000546041376444676100235240ustar00rootroot00000000000000PNG  IHDR 3PLTEL,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L,'tRNS0Ѐ@` Pp'XIDATx`@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8 @s?B :AvW{$k[81I$`Ls09ӜiN4'qc81I$`Ls09ӜiN4'qc81I$`Ls09Ӝ٭` ?s[cr81J\%`L0&WU*qcr81J\%`L0&WU*qcr81J\%`L0&WU*qc: AXi㰥X3x,'q1I@p;,'q!I@p?[5@{u'+8I$`px8p=p<'qI@p<'qI@p<'qI@p<'qI@p<حA_#Ip0< 'qIp0< 'qIp0< 'qIp0< 'qIp0< 'qIp0< 'qn0 N8$ x8N8$ x8'q$<ۢ8`Zp,NaI+|8f'q$>⇓8`Rp,NAI$8v@a=NpIN3I%r8T'q$89?B8FpHNI!v8.'q$8;}IW<uI<mIV=eI=]I0vaPpd'q@UpD'q@Sp$'q@Qp'q@$Y858 fpNIP2s8Bv'q@$X:S8 bp4NIP0w8'q8In @# v:.ߪ(MNI6z8V'q@$=]Ç8 kpTMNI4~8'q@$r8zp~q8zs8q8zs8~v@tp8?p9p8?p9p8?p9p8?p9p8?p9p8?p9pwK PEC(ІZt֤N wiz@ikW)?4\oy/k|mop|%~`lBBsڦZ Ii^N[ G7h8 G^JP FÅpl+4a)P9gNõ5:8Hi8+4\JS `4K~ypjB5ktWh8 yGO4\Kڌ g34p NڡģS tq4\5Dq N`**h8 w\, pnL {w PZlL nP$zg5]7\Uh8 P 8p^é8pbé8pnS@iWqPs Gmwkn+4x4O>h8 K p!H@ J8 Nt pn5r4+!d@)Fh8 Wㆸwh8 w>pT?T@ij'SP ޹Nոו4\S /-7a è[hS-jEa?>g çƣ4Ʃ#|4j 4{KNqN9 V(4(4Kz0pWŮ8p.豆GhN;ˡ`0 ~;w\N%e4/rW0pOX0p}L4\4<4˞0pTT&p.-Oo0p/Ei3̢4܋?4܋]Z p-X2ranb  P"8{*a= b4yQ p۫ ֠4\J84܉z@i3eKp.eKpܳ i8 wg4;Nu @> ShN]{0#dp.raVLiԈ\Nrd43@0 Ḍ4LJiD4 w@ #ο[$pN<NÉ8Gi8h8 'w/G 05@GK gaIpN@ fDܳ ~V, N<NÉ8ȣ4ܜ{t4ܖJVЅp{+Y@Nmz`=h8 뺂] Zpni{t4ܰ nЂpGW.k@iq⬉ )4Ap*48j8xNxn49p*4ɆhN<)H4Л `NMK4)Η8i8 eNrb(  ` \ux2rKqXN)H4,#O@, O4|y-Ri8 TPNõO @( zM pFS@" ua4ip.ȣ4#i8 Hr(4#Ȯ pm_q<Ny_<N=Gi]GqqpMQ[p]QTh8 H8h8 4W.\M p?TDiƟpen(MvT<SHd$pn. h8 )g pO̴PL pͳPL pr2$N1/p㮽 DiCf,qpnYp&ooK[/QA4g饘h8/H{/a*A489L pڊppn"4\%*NDi T pU 8 @ ;L3p^J~I`f]6n"o bh8 Wec54\=>ik޽6C WH>b9[pR;@NÝT9z5pڞq ;p̶"p}1oMiӛXp k٭tp1/h8 FYNd FiH}2n/h8 3pģ4\<E*Nie;Gi{Ա4l\!Ai8 ݟ;pWpj۹~@`N]ƸեL^?4)'f1p4Қ6PoKʯn /+:6j8hpncù [ppKnþ25\b`_Ùi8hpfqq:6YA g`cÙi8hpfqq:6YA gӚ4<|j)D4\Sܱ-HA˲F4hd-v3.  O%4tk_ 6D޻)z|- 8pP]Dsgu ΝE4Ll8wF~\RĞK."6;#_p0  uE4ny_5h8p>nx @1U3sM  Π p`E%P{ KO@1UKX٘`OTjecM gPuV5A(5j8XpUVט`]TVUc} gPJU66Axw' 1!>{`s kX*ULpP g*P6\*M7UMa ȑv7\r @gZh8pyźp8K*.pM  gP2"NAKnEmXeɟRqopUqo때pVq˕pWq{`q +ΰ8`4pPYqujpYq6UpZqXH Hw*k8h,TCQ CQ-E:Ph:QpBG9g8@1p0gaAL_g虠 mr&j0Á)No3AWñ?mNoӿ~Gy `S܋$m[2P SAH h

4K~Uv5F@!i:Eq@C4 t h ;8! dz8s P DqA7{@ 0xO7Xv~HOvlgOjAQ{ q8QsA q8QoA qDqUq|k*= \A@,p|N@ 6n(HX9y~f`=#.s[Σpej`15e Paglgψ(ؙ `,u,l<%6S y:,u|\g` 0; `†(97!sBnW+kBl#qYQW$@8n f*k@ N35TٻUO  bdWPE{a*:W)LbUҊ~PNZPB-a*T#NmVi#[@LjBI>cDѯ0 T˅P9(.RkL U \ӧ1_80O/ch)Ͽ_E70)%OD9,c*⠫8TS*⠯8T"_l5@!-# "BgQ ZFE#cZx ZF5V4 Hj@IZF%V۰o?8Kmm|ػ 0Z{AXwwYJ M4`}]c oaW Pm0S*5Vj1QjuiT9#7鰜=a\522`A0Ai*tt*To7E %3bhkS !* +P;6aY*9GB"҉\9*aas8jP\bai#5#B/,.+.r2%#B/,/{cDY |9T)L8^?⠫8 $Ώ8h|"$1w @}@MD`{`&⬊Y=TU[${*X{&qQIq~pPH }!J*)Ϊ8 qIqW ,^9%A\$} -9%") xb*")<X< 8j8T`,(`, n` ⠩N4U]4Ry*` h3S?n.S;\!v# qHqi7.$S_#%xkc 2S_B쥐Saq`X_ˀsw:JVj^@ 4Ͻ=<a6|Tg <8f婀4qSE[gWN+_Xq^=_UԯG=<*< 婀CaDȳɏXQg* OY@+^OY2p%_o/pK'( n@.`O;-ę{B-#F'!Ђ-\L4eDC9`Z@kOg0?5U_(obOj^ B3P_-9k@>`D9$w|⑙ jAL91!j *d][@9`Yd͟6# dͷ6ʛn!l=!]Py y 5F ?Cݽ`\f^> i _ Z[cB| @x+WBT}!q:-!qwoXi琷:?hN?!q- $;4ۜuGwS r }Y$*-Kq@p%o*`w/)1@#O+s7LC44UIW⤩@BISeNB JBl6 d:"%N=s 5yON: l>=w @- w ,ӮCó{i)^w"< {W D$#@摑}w%dlE*ңٹK\ @tAb5~ޒls jۥJ6ɹHlWFpcp@pz+SN]{.+q@Rܵμz6 t`aH^1(p;a@~M(|)⤓w|TXՖH@eHŹ ~RM̈qr\n׹rx 4H_ 3-Xm]9 ~\P=mT q`9F=H,ʽRO˩ @~n"@~K| ~ ʩ:[o9ժ_`_T o{^/+1j4*1##@ZN*׮Օ/aĻ1Mgw8@ @$>@t;D( f@ر; @{`>5aD(i61r]5%͆c& @G، *髮KmNMQ 2"PvԴLjyIkS86/2c*k9Ҁg:>.t Yv_z\7A#88`J u/ՔE- k%(Z"pL+g5YOW6D0eHf,K= Zj&a3 aHFp Z1. ж+1M0`YՓ --@\|`B'Tݫ' {WALgY5qM6]$[=} `kT&Cd4q@ M܏;AaP T Г48kEqJdJP}HO2~mޯ@~M0IT;6cL5}+2(q@ͤ%FRQ[W@)q@tff+ ܑy /b%΢s ĹTR'Tc@%K 1 \L78@m&%/q䶑8HnwcLM.4Ǝ0L4w/' Add?Z#Щ gB#^Y^I"趙Dq~#G4g4P:DL6Dm38@Վt (f+ L"tL"q@$tL"q@$tL"k6~I"vn$F9"h&h"h%h"h%h"h%h"h%h"h%hn0 @ tTBwC$8 =q"MĀUJ4V&b*D X@H1`i"? MĀUJ4V&b*D X@H1`i"? MĀUE#=dĽ$8LfU&H3q*8`?;v QtIL %ksXJTqV"&‭DPJ"qJ%lGe]RI8N"qn$N"qn$N"莸8rM8a@8\:8@D[:} tꈻ{: -D3nH%쌸TGs Z!$(,{)9L ~ܛpS.玞]{v́_T 8u §~Sz_ |W9Ȭ:݀r*YOW$O*T-)kU(ȎyoBH\ |Sn| { vSq H4~z,O _k+zPSN Bq@n$NxK(ȍt э@ P $%s{EdgLg)]{@I#@֯[7,S*sRV?l=WdN6QKqȼ+hO6Q2{0dCpbdKHO64N={. =xsKO6`r @| 25)|%# ˿U Ah Xq#.dyc`JF.5 }1< `ͫ{w  F(5{Og X߃014w!4SH {*Fh50Pݯm}_RHu8y*}8y*<p:@kvS Kq>`mT%=j CA4 P8$W 5$ɊblNP/¾ 9Pl2{BP/V@ hP5Eޓm(~&s(l N0TK .,y?e(],dzz C-ŷP,}%I4(1G.Sq++c)[>N.A(50 C$]>2"mNo]5GF (>k006@p9 P'?k8@Ȉg FڿP5w8 @ 77&6"]D#_y(gq %No 9*Aa߂̇[ꎀqb0t^X.!u:2UGR pBԋ8kqk#6@B(1C%R#ʵESH TBH`U3z;$p1* H8Je6HAzۀEFe8*,"i8(LRg<7ea :LQBy8ov,Sv@mQt4uslpīZ;ܠ jJ]{5mCUm58 ls@UU gw6&eDY G/l۰g52Bʈ}8@ʈ88OWD|nS!Ctm88MWDE* @Yq|]@T_Wʈ8UV/t &7 Ud7ALJ@UCtR,)ECҴ5S"t%p!N_ EY"Խ1~m)-S|. E[<1e9d UQL$) 96SQnoPm.n6 @4)B\--3h}B1qQPCڙ_APMZPCT[@5y_<|Pvq|P/>ۗ}PC4Vrn3#@Ai5/1㨾* 穭{(K;Oi‡} ‎8#Y q@W3WqS`+J|,s]deTx\ݝXȆPUdq]d@aQ ,8ɫbEFqgx 1HQܼ0יHTA߂|$ Fq=u[8(n>p$ <_y'2FqϬ8 E v-;M (: 1hZC2{Xiz5 qq@Et% ||)Q#1lڝA 4Ѭs?Ϧ(n1e,:-G^q@Nc Oz1!3xeZZiUNt?ȗl28 0`3u+*(Z<QT8+{Ff  \%-a7**#s^ *4ظr$ETA0U{w0Q4%@I*b5{ t'^@LwnU4E|Y_S/`bV/Un  dwmu)RvP.bhz8ꇀ싺8PgVh׌Hq é#@Au')^3"Ł ^hO1Evm,:Γ@Y@J~,3x @Qfpe xKq A7p U`GSsIq0:Ý@ф)&g8GS 1Rpb f8[ @׀ ȣn5uF ,ǣ=8hiLW尨5v`[jù?* V$85ܼ>pg⍚Zy= *J 7OP] U{p_A"Ty",SquΊ8#,Nőj8+‎KdY#,p,SqdΊ8>W{ zJ*׷~ +}1PqԔ0 [T1so \RqԤν-4P.P2T@Pi:s.H80hJ TU3LRUoH-6LZy,cR S@Uű/{b0$(2 0{=L;a*,lZ"U& T3{T:|Tyo 8PUj Sǽ T2_T́_x SniMZ<1'2MCӈ-1x8W"FD^Y93DFh/.D06KȒ*%^7֖@&UkKU zP4e4je"[9PҴenj3fyO#ߩW|U&?s9#r*4WwG @@ Ai"?m+KlX{w@1S|#qlF0 "Eaq\vGFucx~SUTmx~X#T9*qbqFȫr@XÖDmqbqF$T}* gJFGqbqFdT}* gJBGqbqIv@X_r]+XmrR ~V`'Ԉbhx)>ʗu T 吊HFל6uНkΒnp!qnY W(e@Z7{w Z#DM(9`w]a@@>^* ;+ͦ8 'W8G2\)> _㨀2ܒ%+8OΥs`Eaˉ59&^ΥM̌ ( c`Ł;+ᆢLc%;4uj&zö^TMo]:׶3~]pgi!=UI'5I0 tz.Tc 詢ZpKD5NOIMLJ'pbSw D8FeQTGD5ņ~1FH2U +n?8>,x:Far>ٻa(E# $Wk12oY 7H_R81l l>3.PC#V( g\7S|̖N- H9ϐa\ IƑV4@u ፵q 8pVE Dx%"jd1PoCb*N!4@DFe@@D*N!4@DnqHbFe/@D*-s;IɸI8  Ӛh:I85JMnݏ_AVlͮpƁ @]\Cgfp@#T58Ĵ@4ޝ6C fնjEW x8g\~Q;]H)ȉjX|R/i8=[ᶫ4@Z ݣnWY1psUdKrdȚs#p *q\vi8"q\4!(;B[8(;Du.|Tg'(L0: D}j\k8Ӫ 3 :*D1u6t yRslXQU@pjAI!wmT2ڱDCzk7@B9.Uz) k@v9.Aj0%bRq)&8G!8M(k 6ػ܆a Y mE7-frS' }O}gQ}\,2? ` jCj.I6Vf4䚢\e̋E)8zp%=y2C6t (I!DC{yROdg,1;r!9#n(܍FT;\p!,k*?bX%C&&w~۲*pPzro@/Иߺ)Ő I}*ۻr]܊o{w0$d\lo[C(?BHS8^r=k]O#;qT# x#YeXZӺ7m{IeV֪dQ|YOU~\9Z[tӻ:uQzj$i Q.ݽ%Yk7=kۭInc)f˝Qߌzh=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU؃ FPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@TUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU=8mUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUa_AUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUڃCA_->ʠ IENDB`audio-0.7.2/docs/source/backend.rst000066400000000000000000000176241376444676100172260ustar00rootroot00000000000000.. _backend: torchaudio.backend ================== Overview ~~~~~~~~ :mod:`torchaudio.backend` module provides implementations for audio file I/O functionalities, which are ``torchaudio.info``, ``torchaudio.load``, ``torchaudio.load_wav`` and ``torchaudio.save``. There are currently four implementations available. * :ref:`"sox" ` (deprecated, default on Linux/macOS) * :ref:`"sox_io" ` (default on Linux/macOS from the 0.8.0 release) * :ref:`"soundfile" - legacy interface ` (deprecated, default on Windows) * :ref:`"soundfile" - new interface ` (default on Windows from the 0.8.0 release) On Windows, only the ``"soundfile"`` backend (with both interfaces) are available. It is recommended to use the new interface as the legacy interface is deprecated. On Linux/macOS, please use ``"sox_io"`` backend. The use of ``"sox"`` backend is strongly discouraged as it cannot correctly handle formats other than 16-bit integer WAV. See `#726 `_ for the detail. .. note:: Instead of calling functions in ``torchaudio.backend`` directly, please use ``torchaudio.info``, ``torchaudio.load``, ``torchaudio.load_wav`` and ``torchaudio.save`` with proper backend set with :func:`torchaudio.set_audio_backend`. Availability ------------ ``"sox"`` and ``"sox_io"`` backends require C++ extension module, which is included in Linux/macOS binary distributions. These backends are not available on Windows. ``"soundfile"`` backend requires ``SoundFile``. Please refer to `the SoundFile documentation `_ for the installation. Changes in default backend and deprecation ------------------------------------------ Backend module is going through a major overhaul. The following table summarizes the timeline for the changes and deprecations. +--------------------+--------------------------+-----------------------+------------------------+ | **Backend** | **0.7.0** | **0.8.0** | **0.9.0** | +====================+==========================+=======================+========================+ | ``"sox"`` | Default on Linux/macOS | Available | Removed | | (deprecated) | | | | +--------------------+--------------------------+-----------------------+------------------------+ | ``"sox_io"`` | Available | Default on Linx/macOS | Default on Linux/macOS | +--------------------+--------------------------+-----------------------+------------------------+ | ``"soundfile"`` | Default on Windows | Available | Removed | | (legacy interface, | | | | | deprecated) | | | | +--------------------+--------------------------+-----------------------+------------------------+ | ``"soundfile"`` | Available | Default on Windows | Default on Windows | | (new interface) | | | | +--------------------+--------------------------+-----------------------+------------------------+ * The default backend for Linux/macOS will be changed from ``"sox"`` to ``"sox_io"`` in ``0.8.0`` release. * The ``"sox"`` backend will be removed in the ``0.9.0`` release. * Starting from the 0.8.0 release, ``"soundfile"`` backend will use the new interface, which has the same interface as ``"sox_io"`` backend. The legacy interface will be removed in the ``0.9.0`` release. Common Data Structure ~~~~~~~~~~~~~~~~~~~~~ Structures used to report the metadata of audio files. AudioMetaData ------------- .. autoclass:: torchaudio.backend.common.AudioMetaData SignalInfo (Deprecated) ----------------------- .. autoclass:: torchaudio.backend.common.SignalInfo EncodingInfo (Deprecated) ------------------------- .. autoclass:: torchaudio.backend.common.EncodingInfo .. _sox_backend: Sox Backend (Deprecated) ~~~~~~~~~~~~~~~~~~~~~~~~ The ``"sox"`` backend is available on Linux/macOS and not available on Windows. This backend is currently the default when available, but is deprecated and will be removed in ``0.9.0`` release. You can switch from another backend to ``sox`` backend with the following; .. code:: torchaudio.set_audio_backend("sox") info ---- .. autofunction:: torchaudio.backend.sox_backend.info load ---- .. autofunction:: torchaudio.backend.sox_backend.load .. autofunction:: torchaudio.backend.sox_backend.load_wav save ---- .. autofunction:: torchaudio.backend.sox_backend.save others ------ .. automodule:: torchaudio.backend.sox_backend :members: :exclude-members: info, load, load_wav, save .. _sox_io_backend: Sox IO Backend ~~~~~~~~~~~~~~ The ``"sox_io"`` backend is available on Linux/macOS and not available on Windows. This backend is recommended over the ``"sox"`` backend, and will become the default in the ``0.8.0`` release. I/O functions of this backend support `TorchScript `_. You can switch from another backend to the ``sox_io`` backend with the following; .. code:: torchaudio.set_audio_backend("sox_io") info ---- .. autofunction:: torchaudio.backend.sox_io_backend.info load ---- .. autofunction:: torchaudio.backend.sox_io_backend.load .. autofunction:: torchaudio.backend.sox_io_backend.load_wav save ---- .. autofunction:: torchaudio.backend.sox_io_backend.save .. _soundfile_legacy_backend: Soundfile Backend ~~~~~~~~~~~~~~~~~ The ``"soundfile"`` backend is available when `SoundFile `_ is installed. This backend is the default on Windows. The ``"soundfile"`` backend has two interfaces, legacy and new. * In the ``0.7.0`` release, the legacy interface is used by default when switching to the ``"soundfile"`` backend. * In the ``0.8.0`` release, the new interface will become the default. * In the ``0.9.0`` release, the legacy interface will be removed. To change the interface, set ``torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE`` flag **before** switching the backend. .. code:: torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = True torchaudio.set_audio_backend("soundfile") # The legacy interface torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = False torchaudio.set_audio_backend("soundfile") # The new interface Legacy Interface (Deprecated) ----------------------------- ``"soundfile"`` backend with legacy interface is currently the default on Windows, however this interface is deprecated and will be removed in the ``0.9.0`` release. To switch to this backend/interface, set ``torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE`` flag **before** switching the backend. .. code:: torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = True torchaudio.set_audio_backend("soundfile") # The legacy interface info ^^^^ .. autofunction:: torchaudio.backend.soundfile_backend.info load ^^^^ .. autofunction:: torchaudio.backend.soundfile_backend.load .. autofunction:: torchaudio.backend.soundfile_backend.load_wav save ^^^^ .. autofunction:: torchaudio.backend.soundfile_backend.save .. _soundfile_backend: New Interface ------------- The ``"soundfile"`` backend with new interface will become the default in the ``0.8.0`` release. To switch to this backend/interface, set ``torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE`` flag **before** switching the backend. .. code:: torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = False torchaudio.set_audio_backend("soundfile") # The new interface info ^^^^ .. autofunction:: torchaudio.backend._soundfile_backend.info load ^^^^ .. autofunction:: torchaudio.backend._soundfile_backend.load .. autofunction:: torchaudio.backend._soundfile_backend.load_wav save ^^^^ .. autofunction:: torchaudio.backend._soundfile_backend.save audio-0.7.2/docs/source/compliance.kaldi.rst000066400000000000000000000013101376444676100210150ustar00rootroot00000000000000.. role:: hidden :class: hidden-section torchaudio.compliance.kaldi ============================ .. currentmodule:: torchaudio.compliance.kaldi The useful processing operations of kaldi_ can be performed with torchaudio. Various functions with identical parameters are given so that torchaudio can produce similar outputs. .. _kaldi: https://github.com/kaldi-asr/kaldi Functions --------- :hidden:`spectrogram` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: spectrogram :hidden:`fbank` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: fbank :hidden:`mfcc` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: mfcc :hidden:`resample_waveform` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: resample_waveform audio-0.7.2/docs/source/conf.py000066400000000000000000000207621376444676100164010ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # PyTorch documentation build configuration file, created by # sphinx-quickstart on Fri Dec 23 13:31:47 2016. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) import torch import torchaudio import pytorch_sphinx_theme # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.6' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', 'sphinxcontrib.katex', ] # katex options # # katex_options = r''' delimiters : [ {left: "$$", right: "$$", display: true}, {left: "\\(", right: "\\)", display: false}, {left: "\\[", right: "\\]", display: true} ] ''' napoleon_use_ivar = True # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # # source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General information about the project. project = 'Torchaudio' copyright = '2018, Torchaudio Contributors' author = 'Torchaudio Contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. # TODO: change to [:2] at v1.0 version = '0.7.1' # The full version, including alpha/beta/rc tags. # TODO: verify this works as expected release = '0.7.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'pytorch_sphinx_theme' html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = { 'pytorch_project': 'audio', 'collapse_navigation': False, 'display_version': True, 'logo_only': True, } html_logo = '_static/img/pytorch-logo-dark.svg' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] def setup(app): # NOTE: in Sphinx 1.8+ `html_css_files` is an official configuration value # and can be moved outside of this function (and the setup(app) function # can be deleted). html_css_files = [ 'https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.css' ] # In Sphinx 1.8 it was renamed to `add_css_file`, 1.7 and prior it is # `add_stylesheet` (deprecated in 1.8). add_css = getattr(app, 'add_css_file', getattr(app, 'add_stylesheet')) for css_file in html_css_files: add_css(css_file) # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. htmlhelp_basename = 'TorchAudiodoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # # 'preamble': '', # Latex figure (float) alignment # # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'pytorch.tex', 'Torchaudio Documentation', 'Torch Contributors', 'manual'), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ (master_doc, 'Torchaudio', 'Torchaudio Documentation', [author], 1) ] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'Torchaudio', 'Torchaudio Documentation', author, 'Torchaudio', 'Load audio files into pytorch tensors.', 'Miscellaneous'), ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/', None), 'numpy': ('https://docs.scipy.org/doc/numpy/', None), 'torch': ('https://pytorch.org/docs/stable/', None), } # -- A patch that prevents Sphinx from cross-referencing ivar tags ------- # See http://stackoverflow.com/a/41184353/3343043 from docutils import nodes from sphinx.util.docfields import TypedField from sphinx import addnodes def patched_make_field(self, types, domain, items, **kw): # `kw` catches `env=None` needed for newer sphinx while maintaining # backwards compatibility when passed along further down! # type: (List, unicode, Tuple) -> nodes.field def handle_item(fieldarg, content): par = nodes.paragraph() par += addnodes.literal_strong('', fieldarg) # Patch: this line added # par.extend(self.make_xrefs(self.rolename, domain, fieldarg, # addnodes.literal_strong)) if fieldarg in types: par += nodes.Text(' (') # NOTE: using .pop() here to prevent a single type node to be # inserted twice into the doctree, which leads to # inconsistencies later when references are resolved fieldtype = types.pop(fieldarg) if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text): typename = u''.join(n.astext() for n in fieldtype) typename = typename.replace('int', 'python:int') typename = typename.replace('long', 'python:long') typename = typename.replace('float', 'python:float') typename = typename.replace('type', 'python:type') par.extend(self.make_xrefs(self.typerolename, domain, typename, addnodes.literal_emphasis, **kw)) else: par += fieldtype par += nodes.Text(')') par += nodes.Text(' -- ') par += content return par fieldname = nodes.field_name('', self.label) if len(items) == 1 and self.can_collapse: fieldarg, content = items[0] bodynode = handle_item(fieldarg, content) else: bodynode = self.list_type() for fieldarg, content in items: bodynode += nodes.list_item('', handle_item(fieldarg, content)) fieldbody = nodes.field_body('', bodynode) return nodes.field('', fieldname, fieldbody) TypedField.make_field = patched_make_field audio-0.7.2/docs/source/datasets.rst000066400000000000000000000036131376444676100174400ustar00rootroot00000000000000torchaudio.datasets ==================== All datasets are subclasses of :class:`torch.utils.data.Dataset` and have ``__getitem__`` and ``__len__`` methods implemented. Hence, they can all be passed to a :class:`torch.utils.data.DataLoader` which can load multiple samples parallelly using ``torch.multiprocessing`` workers. For example: :: yesno_data = torchaudio.datasets.YESNO('.', download=True) data_loader = torch.utils.data.DataLoader(yesno_data, batch_size=1, shuffle=True, num_workers=args.nThreads) The following datasets are available: .. contents:: Datasets :local: All the datasets have almost similar API. They all have two common arguments: ``transform`` and ``target_transform`` to transform the input and target respectively. .. currentmodule:: torchaudio.datasets CMUARCTIC ~~~~~~~~~ .. autoclass:: CMUARCTIC :members: :special-members: __getitem__ COMMONVOICE ~~~~~~~~~~~ .. autoclass:: COMMONVOICE :members: :special-members: __getitem__ GTZAN ~~~~~ .. autoclass:: GTZAN :members: :special-members: __getitem__ LIBRISPEECH ~~~~~~~~~~~ .. autoclass:: LIBRISPEECH :members: :special-members: __getitem__ LIBRITTS ~~~~~~~~ .. autoclass:: LIBRITTS :members: :special-members: __getitem__ LJSPEECH ~~~~~~~~ .. autoclass:: LJSPEECH :members: :special-members: __getitem__ SPEECHCOMMANDS ~~~~~~~~~~~~~~ .. autoclass:: SPEECHCOMMANDS :members: :special-members: __getitem__ TEDLIUM ~~~~~~~~~~~~~~ .. autoclass:: TEDLIUM :members: :special-members: __getitem__ VCTK ~~~~ .. autoclass:: VCTK :members: :special-members: __getitem__ VCTK_092 ~~~~~~~~ .. autoclass:: VCTK_092 :members: :special-members: __getitem__ YESNO ~~~~~ .. autoclass:: YESNO :members: :special-members: __getitem__ audio-0.7.2/docs/source/functional.rst000066400000000000000000000053331376444676100177730ustar00rootroot00000000000000.. role:: hidden :class: hidden-section torchaudio.functional ===================== .. currentmodule:: torchaudio.functional Functions to perform common audio operations. :hidden:`Filtering` ~~~~~~~~~~~~~~~~~~~ allpass_biquad -------------- .. autofunction:: allpass_biquad band_biquad ----------- .. autofunction:: band_biquad bandpass_biquad --------------- .. autofunction:: bandpass_biquad bandreject_biquad ----------------- .. autofunction:: bandreject_biquad bass_biquad ----------- .. autofunction:: bass_biquad biquad ------ .. autofunction:: biquad contrast -------- .. autofunction:: contrast dcshift ------- .. autofunction:: dcshift deemph_biquad ------------- .. autofunction:: deemph_biquad dither ------ .. autofunction:: dither equalizer_biquad ---------------- .. autofunction:: equalizer_biquad flanger ------- .. autofunction:: flanger gain ---- .. autofunction:: gain highpass_biquad --------------- .. autofunction:: highpass_biquad lfilter ------- .. autofunction:: lfilter lowpass_biquad -------------- .. autofunction:: lowpass_biquad overdrive --------- .. autofunction:: overdrive phaser ------ .. autofunction:: phaser riaa_biquad ----------- .. autofunction:: riaa_biquad treble_biquad ------------- .. autofunction:: treble_biquad vad --- .. autofunction:: vad :hidden:`spectrogram` ~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: spectrogram :hidden:`griffinlim` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: griffinlim :hidden:`amplitude_to_DB` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: amplitude_to_DB :hidden:`DB_to_amplitude` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: DB_to_amplitude :hidden:`create_fb_matrix` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: create_fb_matrix :hidden:`create_dct` ~~~~~~~~~~~~~~~~~~~~ .. autofunction:: create_dct :hidden:`mu_law_encoding` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: mu_law_encoding :hidden:`mu_law_decoding` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: mu_law_decoding :hidden:`complex_norm` ~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: complex_norm :hidden:`angle` ~~~~~~~~~~~~~~~ .. autofunction:: angle :hidden:`magphase` ~~~~~~~~~~~~~~~~~~ .. autofunction:: magphase :hidden:`phase_vocoder` ~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: phase_vocoder :hidden:`mask_along_axis` ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: mask_along_axis :hidden:`mask_along_axis_iid` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: mask_along_axis_iid :hidden:`compute_deltas` ~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: compute_deltas :hidden:`detect_pitch_frequency` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: detect_pitch_frequency :hidden:`sliding_window_cmn` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: sliding_window_cmn audio-0.7.2/docs/source/index.rst000066400000000000000000000033301376444676100167330ustar00rootroot00000000000000torchaudio ========== This library is part of the `PyTorch `_ project. PyTorch is an open source machine learning framework. Features described in this documentation are classified by release status: *Stable:* These features will be maintained long-term and there should generally be no major performance limitations or gaps in documentation. We also expect to maintain backwards compatibility (although breaking changes can happen and notice will be given one release ahead of time). *Beta:* Features are tagged as Beta because the API may change based on user feedback, because the performance needs to improve, or because coverage across operators is not yet complete. For Beta features, we are committing to seeing the feature through to the Stable classification. We are not, however, committing to backwards compatibility. *Prototype:* These features are typically not available as part of binary distributions like PyPI or Conda, except sometimes behind run-time flags, and are at an early stage for feedback and testing. The :mod:`torchaudio` package consists of I/O, popular datasets and common audio transformations. .. toctree:: :maxdepth: 2 :caption: Package Reference torchaudio backend functional transforms datasets models sox_effects compliance.kaldi kaldi_io utils .. toctree:: :maxdepth: 1 :caption: PyTorch Libraries PyTorch torchaudio torchtext torchvision TorchElastic TorchServe PyTorch on XLA Devices audio-0.7.2/docs/source/kaldi_io.rst000066400000000000000000000014461376444676100174050ustar00rootroot00000000000000.. role:: hidden :class: hidden-section torchaudio.kaldi_io ====================== .. currentmodule:: torchaudio.kaldi_io To use this module, the dependency kaldi_io_ needs to be installed. This is a light wrapper around ``kaldi_io`` that returns :class:`torch.Tensor`. .. _kaldi_io: https://github.com/vesis84/kaldi-io-for-python Vectors ------- :hidden:`read_vec_int_ark` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: read_vec_int_ark :hidden:`read_vec_flt_scp` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: read_vec_flt_scp :hidden:`read_vec_flt_ark` ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: read_vec_flt_ark Matrices -------- :hidden:`read_mat_scp` ~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: read_mat_scp :hidden:`read_mat_ark` ~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: read_mat_ark audio-0.7.2/docs/source/models.rst000066400000000000000000000010231376444676100171040ustar00rootroot00000000000000.. role:: hidden :class: hidden-section torchaudio.models ====================== .. currentmodule:: torchaudio.models The models subpackage contains definitions of models for addressing common audio tasks. :hidden:`ConvTasNet` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ConvTasNet .. automethod:: forward :hidden:`Wav2Letter` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Wav2Letter .. automethod:: forward :hidden:`WaveRNN` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: WaveRNN .. automethod:: forward audio-0.7.2/docs/source/sox_effects.rst000066400000000000000000000020221376444676100201310ustar00rootroot00000000000000.. _sox_effects: torchaudio.sox_effects ====================== .. currentmodule:: torchaudio.sox_effects .. warning:: The :py:class:`SoxEffect` and :py:class:`SoxEffectsChain` classes are deprecated. Please migrate to :func:`apply_effects_tensor` and :func:`apply_effects_file`. Resource initialization / shutdown ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: init_sox_effects .. autofunction:: shutdown_sox_effects Listing supported effects ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: effect_names Applying effects ~~~~~~~~~~~~~~~~ Apply SoX effects chain on torch.Tensor or on file and load as torch.Tensor. Applying effects on Tensor -------------------------- .. autofunction:: apply_effects_tensor Applying effects on file ------------------------ .. autofunction:: apply_effects_file Legacy ~~~~~~ SoxEffect --------- .. autoclass:: SoxEffect :members: SoxEffectsChain --------------- .. autoclass:: SoxEffectsChain :members: append_effect_to_chain, sox_build_flow_effects, clear_chain, set_input_file audio-0.7.2/docs/source/torchaudio.rst000066400000000000000000000023461376444676100177730ustar00rootroot00000000000000torchaudio ========== I/O functionalities ~~~~~~~~~~~~~~~~~~~ Audio I/O functions are implemented in :ref:`torchaudio.backend` module, but for the ease of use, the following functions are made available on :mod:`torchaudio` module. There are different backends available and you can switch backends with :func:`set_audio_backend`. Refer to :ref:`backend` for the detail. .. function:: torchaudio.info(filepath: str, ...) Fetch meta data of an audio file. Refer to :ref:`backend` for the detail. .. function:: torchaudio.load(filepath: str, ...) Load audio file into torch.Tensor object. Refer to :ref:`backend` for the detail. .. function:: torchaudio.load_wav(filepath: str, ...) Load audio file into torch.Tensor, Refer to :ref:`backend` for the detail. .. function:: torchaudio.save(filepath: str, src: torch.Tensor, sample_rate: int, ...) Save torch.Tensor object into an audio format. Refer to :ref:`backend` for the detail. .. currentmodule:: torchaudio Backend Utilities ~~~~~~~~~~~~~~~~~ .. autofunction:: list_audio_backends .. autofunction:: get_audio_backend .. autofunction:: set_audio_backend Sox Effects Utilities ~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: initialize_sox .. autofunction:: shutdown_sox audio-0.7.2/docs/source/transforms.rst000066400000000000000000000043451376444676100200310ustar00rootroot00000000000000.. role:: hidden :class: hidden-section torchaudio.transforms ====================== .. currentmodule:: torchaudio.transforms Transforms are common audio transforms. They can be chained together using :class:`torch.nn.Sequential` :hidden:`Spectrogram` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Spectrogram .. automethod:: forward :hidden:`GriffinLim` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: GriffinLim .. automethod:: forward :hidden:`AmplitudeToDB` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: AmplitudeToDB .. automethod:: forward :hidden:`MelScale` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: MelScale .. automethod:: forward :hidden:`InverseMelScale` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: InverseMelScale .. automethod:: forward :hidden:`MelSpectrogram` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: MelSpectrogram .. automethod:: forward :hidden:`MFCC` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: MFCC .. automethod:: forward :hidden:`MuLawEncoding` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: MuLawEncoding .. automethod:: forward :hidden:`MuLawDecoding` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: MuLawDecoding .. automethod:: forward :hidden:`Resample` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Resample .. automethod:: forward :hidden:`ComplexNorm` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ComplexNorm .. automethod:: forward :hidden:`ComputeDeltas` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ComputeDeltas .. automethod:: forward :hidden:`TimeStretch` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: TimeStretch .. automethod:: forward :hidden:`Fade` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Fade .. automethod:: forward :hidden:`FrequencyMasking` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: FrequencyMasking .. automethod:: forward :hidden:`TimeMasking` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: TimeMasking .. automethod:: forward :hidden:`Vol` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Vol .. automethod:: forward :hidden:`SlidingWindowCmn` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: SlidingWindowCmn .. automethod:: forward :hidden:`Vad` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: Vad .. automethod:: forward audio-0.7.2/docs/source/utils.rst000066400000000000000000000004421376444676100167650ustar00rootroot00000000000000torchaudio.utils ================ torchaudio.utils.sox_utils ~~~~~~~~~~~~~~~~~~~~~~~~~~ Utility module to configure libsox. This affects functionalities in :ref:`Sox IO backend` and :ref:`Sox Effects`. .. automodule:: torchaudio.utils.sox_utils :members: audio-0.7.2/examples/000077500000000000000000000000001376444676100144615ustar00rootroot00000000000000audio-0.7.2/examples/interactive_asr/000077500000000000000000000000001376444676100176435ustar00rootroot00000000000000audio-0.7.2/examples/interactive_asr/README.md000066400000000000000000000046401376444676100211260ustar00rootroot00000000000000# asr-demo To run this demo, you need the following libraries - [python3](https://www.python.org/download/releases/3.0/) - [pyaudio](https://people.csail.mit.edu/hubert/pyaudio/) - [torchaudio](https://github.com/pytorch/audio/tree/master/torchaudio) - [pytorch](https://pytorch.org/) - [librosa](https://librosa.github.io/librosa/) - [fairseq](https://github.com/pytorch/fairseq) (clone the github repository) and the following models - [dictionary](https://download.pytorch.org/models/audio/dict.txt) - [sentence piece model](https://download.pytorch.org/models/audio/spm.model) - [model](https://download.pytorch.org/models/audio/checkpoint_avg_60_80.pt) ## Installation We recommend that you use [conda](https://docs.conda.io/en/latest/miniconda.html) to install the dependencies when available. ```bash # Assume that all commands are from the examples folder cd examples # Install dependencies conda install -c pytorch torchaudio conda install -c conda-forge librosa conda install pyaudio pip install sentencepiece # Install fairseq from source git clone https://github.com/pytorch/fairseq interactive_asr/fairseq pushd interactive_asr/fairseq export CFLAGS='-stdlib=libc++' # For Mac only pip install --editable . popd # Install dictionary, sentence piece model, and model wget -O interactive_asr/data/dict.txt https://download.pytorch.org/models/audio/dict.txt wget -O interactive_asr/data/spm.model https://download.pytorch.org/models/audio/spm.model wget -O interactive_asr/data/model.pt https://download.pytorch.org/models/audio/checkpoint_avg_60_80.pt ``` ## Run On a file ```bash INPUT_FILE=interactive_asr/data/sample.wav python -m interactive_asr.asr interactive_asr/data --input_file $INPUT_FILE --max-tokens 10000000 --nbest 1 \ --path interactive_asr/data/model.pt --beam 40 --task speech_recognition \ --user-dir interactive_asr/fairseq/examples/speech_recognition ``` As a microphone ```bash python -m interactive_asr.asr interactive_asr/data --max-tokens 10000000 --nbest 1 \ --path interactive_asr/data/model.pt --beam 40 --task speech_recognition \ --user-dir interactive_asr/fairseq/examples/speech_recognition ``` To run the testcase associated with this example ```bash ASR_MODEL_PATH=interactive_asr/data/model.pt \ ASR_INPUT_FILE=interactive_asr/data/sample.wav \ ASR_DATA_PATH=interactive_asr/data \ ASR_USER_DIR=interactive_asr/fairseq/examples/speech_recognition \ python -m unittest test/test_interactive_asr.py ``` audio-0.7.2/examples/interactive_asr/__init__.py000066400000000000000000000000311376444676100217460ustar00rootroot00000000000000from . import utils, vad audio-0.7.2/examples/interactive_asr/asr.py000066400000000000000000000026661376444676100210140ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright (c) 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the LICENSE file in # the root directory of this source tree. An additional grant of patent rights # can be found in the PATENTS file in the same directory. """ Run inference for pre-processed data with a trained model. """ import datetime as dt import logging from fairseq import options from interactive_asr.utils import add_asr_eval_argument, setup_asr, get_microphone_transcription, transcribe_file def main(args): logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) task, generator, models, sp, tgt_dict = setup_asr(args, logger) print("READY!") if args.input_file: transcription_time, transcription = transcribe_file(args, task, generator, models, sp, tgt_dict) print("transcription:", transcription) print("transcription_time:", transcription_time) else: for transcription in get_microphone_transcription(args, task, generator, models, sp, tgt_dict): print( "{}: {}".format( dt.datetime.now().strftime("%H:%M:%S"), transcription[0][0] ) ) def cli_main(): parser = options.get_generation_parser() parser = add_asr_eval_argument(parser) args = options.parse_args_and_arch(parser) main(args) if __name__ == "__main__": cli_main() audio-0.7.2/examples/interactive_asr/data/000077500000000000000000000000001376444676100205545ustar00rootroot00000000000000audio-0.7.2/examples/interactive_asr/data/sample.wav000066400000000000000000024505161376444676100225710ustar00rootroot00000000000000RIFFFQ WAVEfmt DLISTINFOISFTLavf58.27.103dataQ  FEJKC@EC78A9B;::<<5240635746**)')($( #!%%#"              ! %)&"! $ #$)'%'&!)"$(#"# "!#%-#'('/-,,.4+10*<.71756.8-:5579;74407778<:46+..++)&("' # #  $#                      &"$!$)"+'1093=;<E@LHGLAPQNTLKPNPOLNGJIIGGFAFB<D7A*." &! "%&#&"&%)'&('! # !"!                 #!$+'/,((1136183600)'& ,*')            #$(-.4=<G?EHLSUQXT`Z`XaXd`a_\ZW^]V]OOTVS\SVSWTV^\ae`behdlbfifolsm}t}{wxnsbigllmjmeoafb[ZSKKE@K<L>GAIEI>BAAGFB><45676;=<<711<8A;::56,.(+&&        $.&-%"1#1%)(,07:<?9D@FJILQNOMGNFPHIHHHJJKONWPSPIJFJ>F?B@@7;;C:?HBURGNLOMHDCFGG@F@@=8>0:/1,/(*02-4(,(&1*::.6*21714778:567::=325267/-3/473:3<-7*3,82?):*!%#&       !$ )+434;:9A<CDKGQDNHRKPHMPXV^OYJSKTNUORNNEJBLFLNSEP8ICSNPROKOCLOWRWU[X]V\]aZ[YeVfYbjnhodoiqkmmlijcgbe^eW`T\R[T]XaT]HTKRSTRWSYY^\cU[QYWbT]XY][YWY[WaS^VZUXKQS\_fU\`g\cOVXXSMTLIF=ACE@A=A6<7;,0"') }|~y{|z~v}mvgpjpaebhT]GMPTHMENDSBSCSANGXARAKEO@KEPBN(8/=:A5=5>8A8A:HARCQ@L@O=Q;HGORcK\LVPZJTPXS[R_QdNb[ibp\p`ofncjbodtfpfvh~nrt~u|}   '!#!*%%(  *"/#, +'3//0(,0568=CFQHNRZRZ[\nqejims{p|xzz~nomtxhrhthn[`fhimfjhh_eRZRVTZQSSTMX=K9EMWVVLHEI?GLW\`^_dkgivr|}yuxlllqp|hu`jZa\_`\WVPWPVMUO\LXPWNQ<CDRHTGOHXBP@J7ECQOZHSJVGQKOEI:E>P4A/7-8*4)0$,(#"                ##%!#& + (085>16'--5@C64!%""*.1%&%1)1"#   #& +#.2=)5!+1<2<,3/548487532%,)14:5;08-:9??@BIAN>LGONQ^cipjvv~{}yurqzxvxtwrzjrikgl`q_scm[eN]U^WYLLAJ9F??DA:?.:,8-5-5"+         $*%!# ,,#')426,/0<7?AFDKHNPSW^dmfkipeminv{soulnqiur}ovilmjytz~|w|qrtrqttkxbh[VQLUXLIM@F>;5MLF@@699" +)'+ !    &&! #11;41(/-,2<@CL-;-2)2(5,2"#   %+,-3/;.:4964-/1563.,0-=6;5413/0(A;AB058=DBJEEA>:FBGEKKLMORX^SUNPJODHFIMOLR>HGIPNBABD<@/*3,*+    )##     0)%     /-+-,,(*5865--041855;>;D/3,/12;6<;,+.(/(00:>57&'     vx~uu||~|vijPXDKKK?>/6(0"##$&(&'2,)&!0.*)%&*369FC^Xhebc^X]Tf_uif]JHTI_NMP;D96GBHE>A3;'-29:>>;PJOSXdrsojll|}  '("     !/)%!-/?9<:EB=655CHGOHNc^nk]h`g^\^Zjh`g^`aZh^nbfb`ZVJPL^[ed^Z_T[SVUhl]dKS`ad]YY_`^]gg|~tsnpsotjfe[SU]azrtkmgsn}r}pzv~|gfkkvvfiY\LMRU\aQSUSQOONb^`]ecldd_hhie`^cbwsyymvz~{sprvZjP]LMIHQPNQHL;<DBKDFFAD87DE;7.$3($#     #)#(07E.A.C,= 1.?3=  %%+-AH\aX[WYZ[gm|yi|d}~sy^gPbiofdRTJQI[HWHLMQCNDQOSLI<<AG\`VSMNEEABU\CL3?CKHMLR;D1ACP=I4<49-:072:.@4==@?D6>*349=B%44+;*4'6*       ')@542#  )")!(:ILXOO\[luv~fiZ`t|{h|R^OX\_omuv_]MLUXtsuxolpcksr}ptpn`\CG.:6>82"  $7:FA-1'38a^ifSULPFHLIJL::.(./54410/'!#  x{suleUMZTe`i_dT[OVPZQL?B8EB:,B6@86+,"??^gOX65<:8?:C38 '#9D5B8F^lgsef\XZ`Wb`clgWP]^Z_PRa_JN8DBKBK<A@C?L?MQWGD577E3A=JJRDOF^^vg{ot}~o}j~{]sp|ecFRARBI//%+2   ((~ "! ".-459:?3<@M:;&%-06-   ((2,1',,:(7+FWVb=E1939PU>C!.(2.9>'.*$+4/%%  #",! &$ ##4   rilxV\@@qy{YX^W^\ovv~xzv|ql`^ppYTcg~|QULSloz{jonukokm"  /,LQNOC>UOgfam^qgknfsstyhjgs}lphp}cmmthgkigmU`qyx{+<B?B/5-/SSxuSL%   $~wTHXJhjlxSTG6<-IRt~VNE:VVekg[OQeoxbjB> "-$6x~s{uvxuz}}oi^|bSNO^pyoZY[R\  ! ! .+63iqZifhjrOT^T\Qckgxdjvkv}{_Sx  % yhKTdEe  *?GC@0.4=W.; ac=)J=>S9T58#'6BXJH5 %749.FQS`89"??soyabC>]^y_W\]|+( '5/0 9/USTLB4a]tkh}pdt{ekJQWKiVCH/GDK]MaZNY_j{{SYYmhtj^PBT]2TfD@Th:8v|vq{pyy7698ICZR?>/3PHoUZed,   632)M82 "00<7:B?LI@AHRklB>+)89DKIP63J=qbzrtzg]34>C^[ogGBA<sv~N^?<UGT\dHI93Bl~|yB6..:JKZFJC9?1 !%=1Yc_Z]`8&JH32 `c}YSa`zxpmu|vtkhou]_qhnzlwnfscZYX__[i]SR"78kltzjqbh}}|{~~zoqx{~|irTMdNMCRb\nMJG9+,?KVWG6+&JVqp|uOUK\{PWG>>63$`aq3= $!19@G}poqw]TPRpq+ @:F9+)of84NW^Z<2HCqi8-7fcozEQ?Cy&!agcedkWegllx/:MT HR_e()bYcW\M`TfcKM^cuHZaxB^1I3=NP & H;BB  -<;'&#  ~iM7 LM" <N soQM?@34!\kK]%:~|%%&1LA&pt`MfU*mH$5 U@oRS:OVgn@0P\FA||doAT[^DI*5.+25 xSS|boA:**?:P;_;D1YOl_uZrpO^>_GWc;e3P:kBnL=F2t~\qXmMM;xlsd{H:TJtb~i[QDggy}uu_koYls]wxv2#TTcv 2_Ysu\g"#W X a o   ' 0 g } N N ~ _E%2,xSU,467AZ_n#_a)#|qv1D    QYb\89q NZAEPFvvVL''JO%*|4-ecqe}JKbX%, srsljw1-0.x{ !  d f DRMY?=rj&-SP\UVLqt58@B]b OK^Mi_!*S[ *:bZND# o[ߋ߃"SXނݓ܁ܞܹ<;KIgZڻ٪ٵإG6VE-ؔ׀פ֥=N !5L]-CՇՈfaԄZfGԓ`ԹԐ<&D7-3өӱmӔӗ-^ңNo%< ёѣяѲkѴсфYы|ѶѷъѪ_љ\ѕnѽ=рRtҺ9;j\ѤGаkP-ҿҙ;Ջ։ا ܁ݮ߬SFM> ##bW|vwp__gvJ`5Ki/&HowbS6 + T JF{1y7c}Zp'D d '""""##M%r%&''#(r(()L))***++,,,,y-P-.O.S/2///0/00C19101,1 110000c00//./{..#.5.--A-9-,,m,f,,,++**))((''''&&%%^%l% %&%%%$$$$/$<$########@#Q#x""""!!!! FT4-^bhn!/)858 : O N w w n ~ h {)-xPA*hjPk qh3,wk51@Xmb\Zgh  ':1? nc>V(q % CKpo~pjKW\z}fI |R0TGK%[Rk2(YhxdqNfJZ H  o  , & = j  ^ ^ ? 1 iO3994Gy>~u :M c; ezNbRvapK@!oJ~\7LEs)=z 4e  & ] / &  `QD&RXhK` m 9{s(kjA{3!>$F1lUtv #DMB)U/0.bVs~`߇^}݄ݡ0ܿM ۧڬV_ڞIٶfקtjK׺֨R-ԌԆ*ӑ}ѻѩbFѦЅϒY^GβA\͸`ν͓ͦ1s͵P͎ͦPgB̦`!}NA)<"ˣʇst79|xʒʈg[ˣ˖fWˠ˕jHP+b+ѹ҄ґ[Ӷ{3LPڹE ܭD ݛޢ.Y(B {eQFQPskbRCQ%!TP<2%#//^T eY@  m T l^vd'1"# / !}!""X$_$d%X%4&(&''))**++++Z,`,--..////00K1H11122)3#333 44s4v444g4j4m4s4P4P433C3C32242321111y00////=/E/... .--T-_-u,~,++u+}+I+c+u**))e)e)P)])((](O(''P'W'&&&&&(&%%##}#z###"" pZ` 38a`YM> 6 O R nt+}DAC5N=v[L QGD0eQU>s[l9vZyPfF.%H!h'GR3q:^-qOQ'gmquW/8!52 :  \ m B 2  8@27_q@T~+5Y+6i2d +T1j 7>w)hW :$aFKDn<dF 13)? &%}%=Rm bW-4*PJ_nnvA2&##$3+i^* `P+ %$ ޷ݤݙ܎5 ;* 3I9מ֋ ZL҆bJ8ЯH$Ϻ\7Ϝ΃ ͹a<̇x˕r|b-paʣɐN>vld[ȇfYAxkȱȦȌ?* @.66bN.2Ǡvc9ǯ>!:% QDʒˈ&;)αΡφN?h\eS U\ؠٚنj]F\^qmފw+CJqfK`n{\ey~bn&95ENj8SbzhNcjn>&%@U s $ R T,k_>q=r39W !!""#$p%%g&&<'t'(())+*e***++, -M-o---c..(/M///>0[000000000 131y00//////f/// /....3.0.(.-.--E-A-,,,,b,b,++0+"+N+2+3++*t*+**1***)U)/)(w(.(('''&_&=&%j%$$$##u#"" "!+! 4 3Wn ."tIW|?puL K 5  # c  b ; Sv|\0FV8gXBL/y&QK(kcP!(69#%9@c^;C8K\KRDVl wr~"\_(1&7NHG\zys@{v v;b$ @ z ) M S m   > a w0<b~,n)>_@_ * :K@U&2Wot?WQ^If-(|LMRX4,L-  v Z 8 !<Nc5D%_dy`B'h*w5[GO>ha[KjcDؽLSףח׬ִ_g-1fxԉԥ@V)1$ӉӴ|ӑWc3 5 ? әҨLҁM6MfmMqZB@Kҝҽ:A3ӄӜB^Bd8[ք֗֝־ִ#@`ڿ2l}Uo I.VKaJ]JlNuIY*0psNic}->6H-C@J! *be8BRS~w - : 1 9 uSY  (1yPZey@Oi{kjgzo. ! !!!""8#)##q###)$ $$z$% %f%`%-%%$$$$t%]%%%%%$$$$$$$$$$>$$#########w#U# ##"#"6###""j"P""j"9""O"H""!!j!@! ! ! ! f R [3FNd2  V92rM*:&SGCG! nyY6 V d      X ` wx@oZ~<1VW :1Yt'9m^+AaL,X~`{!H(xMHlh6e -;>b4/`Tuir.0) mymp'8 `Qb[`cEF zh0 09,OL)$ 55+N\VHToo GBpf%_` 'kbUi"fISPTfo6)  =76IOLzkdb\fJ6bh H ; T >    / 3 / , * 9 y`ILclz|("3#RT 9+kTs^ 0,=)F2hZM6C'%>7UQf\}hkyw"', B`8N / JtXp-H{_}*HSj>[h+G$AX~2Z+NZnXqUwKc=S9U8N&4*<N/ w}NS ' " a P f K  n   B  !\.VbAiIvAU7SF[?,]T_R|oq8BsKKBJnLX=BR[Pi-TUwBk>h$=BX')ABXcXG Y`O5$} (2IwB+@YC5(/nnXCS4{EEZg/"hU}^o  0JA8{rPD@4AS9,#&PF?0;C+Z/UtyzGErn) bY#&>A  ;OR]S9):C>$&&"EO:=FGrl-^PF?1=LJ V`jz"uo(-[X/;,}1%wy01 TJ ߶zoM@[cߊߎ߅oߊ{cew_ F-wLP$]5K" w:PF z4[DFwv@6xCg? d: `,i"uvN 0 W ; ` d s  \ 4`rp:y}G*]~+NQ'Z.nA 2@"74o;u<#$lH|<,uT S;0{BPMJ H rKLe*iV>U+1i $=3Mu~tH8  KHfh[|h ~ Z O 7 R z L  ' A NBmfa2\)wS ?8Qi/\)]0Gu@u>qH3*_Wmh[KN>lY/J1}ua0d.vg?Z1rQ zJe%W xs@IY/[]J~NcM`{mD~I&=~P_0m-\:MwIkU% %ZP;Q7m5p&{0 0 !  j  D  y ^ w X ] 6 _ P Z 9     F H  \ F H1>^vMwvioOlP 0)K=}C >'a2D'vse!m@Fky8[Dx[,s@8KQ;M-JFIz>\v2uUa!jb)>0N;EYa{h,6eLi -3% o5`B7S,F(tL( a2MtedjCoT^Tt?_2DUwdK<>)[.l:YND>X]q)2j!k)n.k*.n Y)JGfz0fB~!>5  8 > {  { i s  ,^Fi!#;088@C  =J*pZ-wy0x<a5B'>rMu]: g$,?z3iu @>\1E=y=S_)~X  MZ]\XG x T g ? R 7 Y 7 C  F  D T Y Sz{Bx+/\: zp_st_mj5jyXg:sYte${EkEn)[49\OpIewn$GZ(%I{yaaImztKPIHBZ;FGi7fiI_l+@G]Qb7s*L%PROnq;;%\W(8/ZtMR > e }  Z z e x  F  C  - C { u 1 ` " / , f w J j   I  E 0 e Ou!  y0IU^}AJv,PDv#lZJvHO(G%`z>UK<$++{>5mLg$Xu*9 4e$%wyqAtkX%oH`qt rfN0bZ9^rX>42E* g\l}`LR+"1rgRm[IGi.^b9@J]]|b)Da,@[4y :ALU`e+ \E npk(cn@LJRi]  475&";Rfvf_uh}z;@   t % * 7 < R M ` P   ~ } 3u4)GL2'#* /Zq{WeL:ozjVH6 '  y=0xKH}RBSKvT=@KA5zjz    , * ~ | 2 <  Z O K ? ` e M P zt5?zdf8;#4We <@DE{" @Vo16dg_oMX/3BRRc!( 5?JY*FJgId&@AKFNuxdofefMP5Dk}]t V`mAC,2ER  %bu z}Wd}~x}ah:?TU d f jlq s 8 ;       gh3 3  YYmmno8979 / ( f f 7*\Mke@>}WS}C6D=! #z-tQ" w9.6B&pPP es,s:<QH>\T%%di3U7$EBk?b4oxh*Owf/`6IJ:TM/\QiO.Z7M&oXC z2Ntk/V/Z%; e@v'S 9x*G1 5U]OQ+Uk_+b5>$95H8 I M`V7() Z ljR ! 4  X>wCIO6rvDA *jie 0;R(Q['94&&EA,O:Uf n5  $UL& 3  ) { * 2 ? " ^~{ J D  7 Z j i  g  1 _%J  d #5rjNW[ K i S f3  J z[)3CP?R=?!0:{w1VjS'ns#  ~a{9.^v=>",bew;?  .V^xFEpuXT',*3s>=Sf kk{fi`;C.P sd)H>`ZEY:*$J BYgcBfX8TL>L%TF | UK?m/*L IZT"jWh&NooO; Mzh6zHߦB'ݐVݔL((ڲL ۷f۹ڟ Dڂ*ٮh_P ׫փַ~hSmrB:W8\AO7σk$ ιοήA6}̈́2Bѭԓگ15"rU}3VrHv`(+bo}Y n3  J ? HA lEz0 cV"k"%%&%P'8'[+N+l,x,*+k**,-4--+,,*****~*b'C'M#Y#!!+#e# uefGaBvLDh0jD`SlGsL\y r EC] R  !ccO_Ia I(oC=* F(pCQ^cz=;  @ > -!-_[lZSP jv63   } O!H!F!Z!;"="##~#}#!! 3!@! !!$  i~[[{Y% u   h 3 ' 8;kVnSWG|e>W.|>8]0l{TB7,Tdja-krPQ}l Or'MKE:_  4 Q q C g , N Sx >L "Ui'!y|&f[iWj{alXMMAhqOo{gSY+TD H BI y  & _  7 &  I % 4 E 7 q  mrgy?*qwzGt So+]C(.5n]"_<N=, x|.5Zx"?C%o9B~OxCy)J9[q/x wIX-@+?#']U4d/B1dr<*7U wg4sJZ 335*#0ORya")fEi$m~_\ 4:8-AX1f\!,De&ߙ~0ߥޤK܎܎9ۚ܀ܙage)& M9غاTVm\iL9މ݆nlm*9>xbBv&NX 6B I T b3|t^/tj = "#$C$?$o$##`###$&#q#!!w!!!,!,__w7;2.g)1 e u q V KW7EU Vd8: < ~*"QM@{0~P3'JF] INYma[#f+s m 7/m|XiTQDC|#UIpQk9!2/z{>7FP-D N3"  v4d_-)4`t  k | > H G7- !+RGP&V XBD2}:NT@CP/]3lsx'W;=%P/I+Et4U`NA  x  } B c +   8  > 3 8 c ? l u- 8 4 0 c! V 5h~V Z d= 36  Ap6j_P $  R 3 G  > & a q C 2 H ^ * B e8=jp H z\G   X 2 I ;z  ; s  % q ) s < j 2 J [*d:l?zK x^ c:08.{ bW) #&M uI,[nt aZjo/]^'i A;V +JVO[y>J cu|KUYw8w-m F'.l5:..l0VP=2ntylMT8FpTJ2pcgH]h?=X[Np%g|v*'f $Cv  CR\-Ybj '-#d!BokWyw2l'0\ chm8 ^y  7 C % : J h    - =5aHj 7Rpwu-s *ZMnq ! y   T , 4 v ;     ` A  S  U   N Q8MB2 75"- PVKs0#iL;3W c  l  % } ? D HE#5 + L  S~ v m U . J . 6 l O  z @f8.0 . ~ { C E [ G O 1 :  5X_gs]hT /i4VNxxNG'kd y& +2/XAI@qvk&rH+P#?Zq..<w-x0C  t  m~|vd I ~  M  ? I D b L  r 1 Y  ) _  X S C   2)HB07^} gn|9  FI : ' 3 N3 p  O    e Ar q   n v   H Gb`*,^B&|\{Sc-R:4 `e->ihM$\/ f("{aYJ_?CDBm U{ri4^sDM:9j+\xYINHOzmPV$+ur|i9tSeDO!: Em)X _y'L_T^XC\"qaD$*F>FAPdZb~-BD<@"0 3lPmmjSx<],[3}AK/Q ^ H "r c    "@?u )9^UG_46jsys9 = B d     B^[<;_vTA AbnYZc;>;e6`A^:.~" X(jq*Ivl62-@c3gD-{z:;P Av;2]r~6+dko>rZt[$[3Q&V jKCdd7,#d^3JI:-;,? -05g.GwTSsv>Mpsd2Lf.qa~=-\04^@~ $Yrb I(A{S*<=;FWrS(Vz`@ _T E(kj6:yte*#2*$J1w]`bLpDg\E 2#*/aJc%-a*KsA u s s a 9 { 4 y  _  V  e Qv&IhyO@7;)&Ao   B B   C d $ 1  w 6    K <  we =W_E=EX`\Q FZ|B5JG*@DA""8\n5+#pMu0vu ExrSVw`V]j m ,Zid @ k  s A' o 1 J < nZcdX4=X@ eL1B&f0u9yF4"'lX]5k-ZKJD3 zis~9BCT|c#P!|"pQ1I/H0Ky]i(Wq/H|k20JM]be y.s?$dC2VsJ8J>l(qfE(LworH @r>ah~!A.K21 7rr |k5 F%K3a*8I= 1J+pY PcLrj{: RsV?%^exj?j>57WGz!K(A U\yUs#j7{psQ#,eTk_Io5';SS*q ma57UJ_D yY3<h!b'`Q?LPT@zwN61 YCb1~G%{s I@A,hj"l?RG4KU"AX,/uqex0:k]DOHiGB(;Yul| )X8*[)`|f~j`!528HTgq%[Eqs}2@"LL%P@b*t$td*F6>BX{ &* 52iA&Joz 6O Q%? :0 VM0]: O8 e o at [  > % IA@D(F=cdy_edhx+N>esLoUz J3u[yh!3G9 -A&|UarS _S\e6C(tTC7( khF[-Q*9*nj\Bv~ E].W6N<OBgPrXSK# 0 - ,0&,@'B@&1'0ft%1 ECAI\`SOLWw)3..mpZ7aDT 4I e_1G>R@Tc<X.?) &/":#63 .-2>D,)!+//;(/"/'D3VGdFY/G8>#C2HM\M]VhQfGb`wm}Zi2D5 -  %7,J"A2"&15*!:!NK.].WL ?, xvnPf:S'F"A!*8"@ASgu65/G)L/U;X-J:TAOV_cmu1B6%I(MC-O8dIx>`3OBd<g!O4,* evE`Hj>[CTDU= /v{:C#1 **?>\=h+T$E9VZ|]o}{vn{~psgr\hQZ;E-5 0-0175/57AMZ]kSmDcFTW\hwo"#<5RGcGaI]PdPoJpUnlwarLjKh`ounqujyhzp|dpfvapN`Zl^k[hT_@P3K7DGOVb`mYeU_djjnnrlsfuf|y}{{zisgxvm_s@K&1"/zz`_PMHP/|chT^JWJHRZin~+,JJ\[ll}} $0@Zj &-BL>J<C?>>7E:JCID=73/0)6.<79717  }urkhegLW.B&:"*jia[\XOK@<25&  %&=;XXrx%*@Gbazy 11:8>:JFKGAB8?:@GMDN<JCOY\ihchrz}zy{~}pshmmt_^D@(&_^>B-4! tzfgb^[_R[EKFGHA4/*/'. &}{zyvzoxs?Bdgrm %/EFJGNMSX]dx}~xvqnxp  "   sYbEK"}rs`lYdPYIP??DBNF<393I2: '0:EFO[g -1HJfi  6?MYYcnqmnpu}y~puppliRU:@24&"s|U\CD34$) " o]fSOF>=8<61/#,,#((&$& ++9==AKO_b{     !!#$86NRP]Ygpwtxqtv{}yxv{nqgjgk_aQXCH--$$   vzggUXGP7G"4$     #$#)')/4;DEEI=I:HCKLGHIGYTWRVW_hq| $&8B=MNXW]]fZjUboqwqztoun}~{oxeidcigbgP[;I+8-3-3#+      28(",-:=STVPZOccfoss|  "~bjLQ6=*-trqisbiTbIWBE86,,  #/.>GVUaWc_jou{y}vyfm`deqjtmnhnq~ #!2" .E+7F?lfry  _v397GM^q*+ rOZ;Bx{YeQL%2+, Y^urDJ:B)&:I4B  SSO[!"'mpclKY}ox /3  %,% %)<IDDEBKPLK94<<<=+/(*   ddSQ]\R[CQJNPJ6929FF=>168IM`ZbZkg}ovpsgp\kLXAL;@$-|qwckW^KTQ^_``_ef__epw~*17DBOQT_b`]UUSX]VXTIQ@G<G>IBFHJ<D(5"+  zvghdceaa_^^[ZZ\Y_X`VcVe_khmnqz!(:;SRX]^hjoxz~vw~trtpjlW\SVTYTZW[QTHPENFIFJ;B358274596:66>;C>=<FGJM9D4C9F2>0725../127136.6/1404.,+*(, }tu}ulykuadY]PW??42//(* !%&%+0@8C8=CIDKKN[\^_nrwz}}||wvrtopd[c]`X_QTM><965/0.(0",   !,-20+(0$5(-22*. #"&!!#)    &#,(**-/.96::@=IGEDLJ[[^b^c^_c_olzzyyzzoukvrvy{}uitdj^gTbQ]R\JPFLLRHL;D.8#'"#%!#  }}otfodmbkai^aZYRZJVGHA@ABD@<75368:8;.1.29BFMSXa_iblkqqyv|| !!",)G>QGSL_]kfuixpkkb^b\X^KVFL?E3<*4&."($ ~xv}z{  !#.-8;HNYe_nlt    }z|orNUGKDD472:.8'-)+%% x~enbfolghdiyuz|}|~w} *,EB^^qqvtyyz{wf]LQLTROMHA=-*w~blWXONKVSZMLHMDN4?'.%(BARI-2&84;.2KQ[ZVSur{~q{ )(;C,1.);?NQXPDIJShmem^asq w{'*1+27in"!qaznkc6:2'da>I9;A3;C H:`bSZzNP ,icshx}GI$*20]T%"jiloTT|pntyekr~~'(=>wn68@J e]CLlvtqDL~G=^bptFVNTV_gwDK?B2+36:C][59roqnfi"#;E=Aie " (*WXgi 89qhopTb[`* y.5BQy|\m90\ekgC1ysbT%opMI4}Z1aKa,'YyHD1$'@>=Y%PJQFX^^e3]n CT_u<g~6de~e E_|/mT( V-8 %"+ct>bf 0a}5VvC-fS5caelY *5I m>nh 4ZXt7HQ $ 7[8 L[ 3 At X L 2 J^/@7JB])-cR0XdjQsl_  XN : E n   h XZ + 8 q V?f   :Y7e b 4lgy-Eh')'$]\qVOqT7-^\Hon/eNx<] 8Np#\E)U>*O 75B D* RMcuCpLO=40Y$n a w  S 0#!D !k(.,f({v&JYp l;tn8lRcB yQ!| kow{W}F kTk MDo^[|i VjcE\ n  T:vh N ua! q 2y :;\D,8i)G!>PHt#$V5C,>s+Gd! @5 K lX; w ?5Wo_vq"|-=yFQ OM)+P>Z'r  j X y PoA%AQ *W( :vo/  # X $ Y KCjwd?`[Pr]2g/"3p6WVj#B0Fk @f:SQWRm,E$['{h# pbq 9QD% 7>Ry92%';kJRNj = ) Nc bF ]o 5rj zXvzIcU]9F\-p#>AE>Hr_-sRVMFMx3Ud8ZH$Qc }r}7!< y}eP)# b*Ra `d(8gepq%[>)$lJvw;_ _#l/U<Y{PQR;5,^;3Pw]:skL] ;qRB_|_dIJcOdNN*#z:  ( o mj:tI % K.S6 /hj K ZWR#Of%wj NSA2L6fjNekWlj`:%'g1zieR7DnI)3oje><#TRFieS3E"; T~qj".x=^'AwsIW^Y/o:Ws{uf Y JOIJ   6 { V $ ePrG5.~Vlvf-`pE-A$wx TbD ejaw ;&ND\6v;8Vi-OrbO\'>>!^"!q|DY^vjA]ddT EE!VVD*}<q&d&KZ WQk=;y7# $('Et @M{11zD9fg+sX/-esMz|h$h_7x?""dw2GSiYvoq N#1kUOfU"Z[8:#G}-0`:EH I v~GAr8;=wj{*LvV[ S8M`q[Ts# DaliPR]!/2O_soyfW\>EmuWImX`BkN%@U:kQ~G"DopUA"; &JnT;H:(RYe0{  !sx)fC*#UP=A+:i\|' T\sK`/ehRS\2XSlgE.- E^sc;Wdz(gL0M5 :rh*=;t=Xn2Z&Wu[/8 }> &4PB' /6k<6%93]< ER\NO = f p ~yT> HAMT[q8<L8xl!b}ix=CyCGlY0[& ucUc$8GcfpqF`Q"7ox_?:;:e% B+whv| Q]l ! y9Zq62DN!UPwsH1~Oi } g K j )-LH[ 5 ~  . eLT|^$^v'P#w<!LSatPj0:'K losZn:  ; f DrH  H 9  /   ")hQ{72vj liqC/=#Ix>A0fZqs">\CemwC 0   { i j p(BJna#:XAjq A,0|X  Z~XhT g ? x   3 x v 3Mc_ Zp#WBM lyV\U}Yc+v]CB$j-o](&qXH)kQ4i ' q" $ @ u ;Q  tO{3v{[Nqu),+`C\W  _|h69sehlXnRdVP p|Wm4sX%&"#gE ,ki0j=o<^ FdV~TV;Wm]={j8W)d G#N5]7_8r~i-\B )vw1#CHJ4_[PMXJrkNaPlk^+3|')/'SPb_xpMa+-(6 ga)$08&iM.jhM wz@s.G]Ui!6^kEa eQH+$AG.>VPkoJDeV]T7 xpd7!TYvk ,[oK/}QDPR,YaNr}?S{E9 "{n1|} 0qV;SREI$.Ftf00F5/O=]x5uaOG&*#^f05uukXXa<~~kr%*Wp'}Vm !U^ g?oPcR]54u65[ky~C?pymcdcr] 2P'+>{CIp>I9Xl`G*gsH)YiIc)Q*y:OMsjjS8$59A1K:A0F999OHKK]b`xp4G/IT?83#$gOV\7H"M;6K04}0  I]8r+C&><0bdb2q *HUw'T~;?Zvgl=ry$(#8heC9wt\_CW:qulwm$50A0}>Y-f)& B (?EjeH-:< C/+`35Q`&9 h\hO:~3~ri0.\S!O2IJY+G8}8l7nPuE2nZT&CCFaZIJ!UQ,wSX}{GzwJx$o:>xA`FYyiL;>6J+d  K2) c 1{Qu-|,L*zDK\Ep,p%w :RBPvMM IJTGB*o[$ucien4hZ$S21;@<j*gu1w8agY'do4Bc' U9c9K h-~B5wk3"AUt?ii90c  6 va rtDh7}q{ds 0f(M)k&AKO@N/`Wt p` \ 4^'  {  = % $ R i z8 |hy]7gu|gTjbv#giZ6sCVpB51sT&ai>7;' ]7I o}Rrx| v|~$s>gd(dZ~6 {-b\;/q? >*Rs<^22ZNW^ 5$x{/BGLK3 |u\[Ho{m&X<^Xy$Pp`ED0y>YBm:-}VKi?Q%]s,<P8|:fH<( # ZdPbmbGO,R ILv*|+7?S5F<I;%0YbDTOTd[51t]9{`? O y,] !k SAJ i!0OgkXMe0PbFx3 e ` +V/ -twxA'okXIy2"\BDdFp:-p[C~NjP8<_`KFEU#62XV yNF C_i8)'_@ A g{DU" 9Rtfz 0UKM{F! A! I  p +  "uRx $n%tvqr|W&YG   n ` x e %Fy@tk4+C!(& VO&ohPq?L`f# S]zKqMl@|RW5|  , ^ 6 >x4g ieWx6H#ae(Jp8W_^ Z=ECR2]}tx{amUsRy4Ze) J18S$Z*,8q]~!Jl` p=+k 8U  P ^   V 0~f-Da76?0^7?&#Z B$0W605V8}SR*4RqinpeoT=O I)gjl4}ߏECZމI ݱsܢE)ݸnھڬۋڛg&سhAױ׽֩[՗7 ӟ|ҷѭJ6̾˝iS:Dvǘ;{ƙQ|Ft1eؾ»''qѸ%/Ϲq/ μvMJa¸ƬɹtHVK68C)Izٴٓۄ${(x(x ( /9 L > 0 [FUL6rvq^_gy7+8Ge_~ _7{WAPQT,Ai!h"!" 8, & uo-,Ku  5 2HSOBynLf:d8RhKgI2'g9LGw A :  2 j D Z6DRoE8[m_jX.9m5lK)WfSn1UL%e  + ^qcI:r4OWz  d f@ q1:%T;CV5e"pF6G:-pf t x 0_"E/N]iBO(X)4Q vlNC K4YD&mRFa=H  O S@-/AwFywk#OXޘTWc4kҋ+Kϒθ"e̟͘4Qyˍyʑ%;ȵʛ5&teɪȣǸȚǔȋǪdž!ĕCÂfnv %پfXnGl ո[;g-۶6S̴綽㶵M~vJ`tVJ8T=pƋ΄ͬռ`ق؋۞vdݞE]ob=xC` 5 N 3[`VLV a],N"Ky }{RqQG F * L !!$$&&%% %%%%&&9(o((#)))z))((((P(("*.*H+h+* +=)z)'>' 'R'&n'O%%>"S"r Yy / 0Lh7h9lZA}D/mw#VKwN41 w n !uw& ,A7:_Yz[Sci?EZK.Cf ""$#%%'0'(())**4-1-J.l.....002222J1W1//S//I--y**((&&%A&#a#],UL R ) a1x j .IujDIkV}mh0o`G4sR[p+5hIqO{{'G|"c{z- < L V @ JfT  !#m$M$/%u$M%%%%q&&'' (/&&$Y%I##!" B!W5` ^:b0  B / `yM V@5`qjC9?Iqrܴi ٗ>׳2FѧEo)˴ȳ;?IJ äֿ+sdNr !˷{ŷ۴س9:uɳ%R״س"!-ƴصVr4!X&5# /̹8VN\ʹ۸}zwDF*ZѶ8_NHfy`3PŸv̪^ҬަU!cg* Y {/B 'Fqai~^9!,JxrCv:_@~u|W$& ##!'K'O'O'$$$z$\(e(*++))6(2(s''&&/%%q"c"j r (;  8(?6Dj`TpQ h T R8W N 7mC)9zahMDXBnf3#"#u#$w$P'&H*)-,m..0>02H23L3q3.3632D433y3032f2200$/..-^,,(i(+&%%:%f$9$!n!8[wQ .(&<d H 1 U  R  I  8uy "W a /DZ-z"Zty + *?2\B-@~^w< !"$"#c!""L#H$S%}%&%N'I&'P()(*y+*,+ --.I.e/L./-.,+.+,d+,)*&'$%Q"# !->? . ~e!g)4eݸȷLv^7d.|d~ƴo/FlۯixݮM߮ 65Z۰诸³ŷn̸AW}3J*q%B5=OSo`;7vp?  w7R%OIhE! ##&J&r'''c','(m({+5++u+''#"^[t ) aW ['u8s@tR*: 2"=oYgoK+ p T,YETG=]Tv|LNpk`,I  P : TQ+T1 ##%p%}&&'&(!(t) )(('&$#8#"! *p3u2E!%!#L""N"$P$&%''(b(r)((''e&A&%&e&' '%$"*"."!"!!;!}mr<e7Q V [   4 qlROdy`'Q+[  Sxw1!]*ia{Z8_b\Vbe':  k ~GuUo0K,i%%,PZM|* ! !""d"/###e$D%#$ ##"#D"@#C"1#_"U###$3$L%E&Q'9&5' &' '''(N'G($%#$I"f# %@^ C FY:|W.i#=@w;Iw?bV|~׉awխ7rӍҝRΜΖ5˥`cLj-ƞsFÌ=MAU04umz3%dཛ2N/𵢴3{Z*I ۴q>w,*Y=J ջMqĻw"VMFB ѲE8۾8e~ }*LM c7%A@O-$n f m| """"!!_!o!( ctiz; i=V4`iYwz( P   a c03 / b` YcZe+Tor/   0  &JMuijZD3*O>7[Hn#"%p%C''(U((((n((F(B(';'&e& &&X&@&%%9%$p$$$O%%f$$#1# #""""""v"v##E##"!b! !! V UP[-gB!!""!!b?oWpu: 0 / _Fsm     k <  n{4H@] k S l  xmoG4o]MEu^  1 &%^6QH_O?  U=}9>wiu3)?1e:C a  D r iF8?DqjYbtP #nu{߯ߥ݄ەزqiעIֆoԀԺҦ Ңϻͫ˷^ɇ`ǼNƜ,X(ŝIfRuŤAŸ¥0e'm9Up߻ռúoB`߶ٶõе)%ִ3KWE[`G;Tp(Ĺv76ĵ_Сޮmv]xorc߿cUޜܥ#EZVc{jI> . =z ""v%%$%1 S M  GCHXgCnuwixcL)P!c9^3/ j > )7N*sGR: h?=@|>'fcat5 T u0R Sx#L)A[p. A b H^zWgYkTtXj` Y ##&&& & %$$#""+!!,l0  ##s'P'**--V/2/0g0L111100--*N*H('o'E'&&~$Y$#"m"]"."E"A!H! 6 M + @ ]N::2" !!! @Vr(S6Z @X;Z .'"m T Oqzt  r ?e<  ) & I L  F H ] .  uKrc*^@X*^X$b>E iTtr )!xq N*H<HTxQU ` 3  #rk4,`# 80F&cQkCtdeGku_e-ޥcr+' ָ%ӯԙ{{x`Љ_|ГЁΔ̢˻"Iˊ1mȶ.L)b/Pơ0!FqŅƱ$:gξ޾˾ܾVʾ⾳VqļM?F$BHEX^X߻½ý% XV?שPG ۭ}+L޴u/r %xhc>U  %Is 4! c  +   s{aa " p uco!%D~ !"V3&<-a 1 9  "O_Si a  I    9 8    ^ W  ? . C O^R7cT]%w)&X9o.:!!a#`#$$&&''O*1*,+*,, -,7--",+*t*x)) ))''j$]$0!D!!!"! [IP5 F!N!!m!F##T%/%&&2''z&?&`&)&%%q$J$o#B#  58%+ )Ie<` &a;j.a(0;3oLyM U   6 Z     Y b L 1 $  e y p  _ c y d 9 { T va!5 kc+VU{/K%`1 5@EO]?Ayo=:ZkyXh6>IFKGsH[#<pmg2z߾^Eݻۼۊxכ֟թ֙;rՖ\wR݃B+^1^{Q3GhzY=_9}mM"8.Hm {   =Ca>@KLB<"V6Z=E+ULu%=>  +X_Oo11n_[FYmW:l[eFUcZQ M "!^!$!l!^#{#%%>%&&&&%%V&0&&&%&O$m$##&$>$0$m$##"""$$%%%&g&F&&S&'k'''&&&&&&d&&% &%%+%@%$%#$##$$~#|#!!5!=! TH[S? a#>/,QU$T& KRwuK9 f 2 L v , ' J ] p # y C m Uq-cZ Cf.`C=kUmc(K1; v@.-d K1wt:YH:[}wUOH$h,5U6]M<3vsNgE8޾ޤrSߨ98ߐpcݟ']*eܕ9[7C8(ٜס׏֚8cՒִ#`*Ԙԁ>^ ԶԳԜԷE0CҭTχϋλaсьҜҸnփ6עًّH\ ڹۢۯۗ?db߁RImaS\h]#NHnmJI$r~\ 9F8CgZGN|=_ !EdB}]%S guPuX.$ZQq.nX})$,BrcO@nSx--ck8+:R'3CDF{ERy f !!!#!!!6"2"##h$r$g#z#""""""""@""#"!"Z"Z""8" """#"$$##:#h#~##F#y#G#s#""""!!Yt(-?C4S) 9 j13XSIF68! & 0 2  0 7 {  zm4.OFkiB &BxSFWS&.3XQl G?X3~2E`-Im6 W i'@1 m+,voyK@!KZPoj<*?ow2 =(w^vtbNlPn+LsII5X0+|ޝ??޽iޢޯX<+OLXrPrj/p8\Lޢݒݔݘkroޓ44< `u2SG^+pf3v}  V% W( u S    ] c g u $fmEy$@/pl]uuj YSbCv]\xWU[:V?3- v0z4n s K   } 6 V J  h L f ! . u ` f Y k H K ~ q /   k L , 4B8J stVWLZ#.tfvI.uR/"3  n = k H , bF;X $:<=E!;i"#$khd#HZZ)-&]2 Rdh+NX!qgOP-*#!?l}6 ybFqp=;=uG0QqosY;V*:'FKie?-p>|ngw9b8h N92#8bke{soUR7 !&l/tDryx[u5>h_~,b0")}vy\PQZKM)"7-iHygnCG](vo29JPFI~g@  v Y { E # SQ ~ m Vde@ifC}maE|]t~  ; '  % , m k  iP2K n  8 8 c e2"SvN{}* 6  D_\ !M46LD]tIK+Fln ; 5L<Nz%   U Y g ` S \ N R ! , n 16'A%}, wnSx;Z|b<R#SFzVx^w5{ 4:sun+ T[\g xr~2-^q)]EkA!J>#y&%rm_{-?2>FysE8ivH+OBh$Qz 33UMny<`P`~A? `_.G BO31hTjt&0;WQ;ubaf~c_-&EGEKEi4UrSgZ WZu/ xWl_y(H?&];&> PT2$sl.2 Ol?-uqqqR>fSN\NU!$oZtk%I-GU$!WG..Ze%9xe'CHsmjRUeF"ew&' fK^*UMe67+lz3xyIHsl ;F0F^nrj}dm& VF+! 0!"EM:'kgwg yWUmYC$F/EBdkcn<M/:;05+EG8 cR LKinDRLRC&K"\Q26TU@!xIJ '<;=`+3|lf{}ma 29$ mv38?5ePbc,CN\TR{#IH0'chno FD1+/|JR:@{UEyWvSOI^sp &,VSNjUu4yrocydZpm" HOTb)AZbsRO@(CC-;C#ck B,"viGCLW{{|#@ "$)QR>'}kE:9?KU>;82 s",  ;Hm \\+9jiZ]OLg]XQgbGG ./shvh %;## / (2/=398KSOf ZYqw87 hk! #jTuicq`:7`Y2?RUdZL<yu @)BDf\\^jkDAEQ(^n|JXzgvnc{{en]^]ROKJNA@79)gHhPfY`Z[GB9)WM/UFna}}TT574/ys18 }m3,wo2,pj4@\`0!:&A.D4PC.}#?DsvYZ,~GZ,7|velauosl `V f_#{ua\JQ*@"@063JHvm %=APew$6vwJBkRva %<-?;@A)1(%$*;>MYcxx=ITa]nM^HJ?9J=N<B4QEE>RRsrw{TUGL6<24((LBudr|mzjrzan]iFQ&sr8>'1 1*-# cpJU&:#:  0,U\q|lxSP=522=3vl''EKxuz^W:3.8Hi}"0OQmczckyz}diBC5+hXt~Ye9D Xo>X'?0!/*5&1 tRGXf-C n|CQ)1 *B)^If`^WXC2 %#@=bY )2?Sl 0MQ2p`E;wsxmva]UM/1 ,-][o~O`!6zqSQ2.\`/11$KE~olmffd[YQwu 23[` &4=Dbgrv|}v~pv,#=:FJ16('!%!:=fX~x{EO$5]j?L" xw:6ny11{}qw_g^ankpdoQvYq`ZLE9>1*#   RA'#ig+=Y].?\[unv~}xvu):@MO]faockriswqrjlf]U_YRR1/}fjEE"%owDG XI%~`ZJF*,ff$%[`1*%" !'Ug 4=DUOXad}y+%lg9Fbn #. 0$OIxp7:|(!LIji    ij33yUZ?E)(zqfRG) pr2<}stagRP@Af\tk}wsyusxw{]_4:]h/:   b\ "PWutWT=7%}myfprx /1bcAJ  <>jr%OQ~@=^_~|fY<4$u|LT (z}jeV;5osFG+KO&$wxIL)7-zvw$&*. )+!(! 0,KDkg1-wn?Btq*1[g " ' 3-NKvw*/UWnhTW48ipDL [\LX xlOL)1+.LM '.IPI]O_coq),U_u    !,-9672:6DBMPVW^a_iiq{~~{egFEUc#uzVX7>"(   zZcHQFPKINIYUnk~}*(6.?OScWd`isxz{ *1MNlf|zgl[d\b`bZYNSIL@71*#!  }ncaUQJ20 irWVG?2' uzk^TG?D25%rm^^TUKLJGROPWbe~z :8st !*ALs~<F\\akkr|rvrrcgON=@&*  &;AFQPa^iuuoisWcEQ:92'0+%(+2;8H?E;F9?(8'kobf`iarhtw} %(     '$*88G4F0I9 nzV`@@& }ow^cW_aiW[>E&1xrfoepgicxo}ywusl~z:T@qb  '$.!+(2-69<T]p} jledXUPLQQLQR\DQ.;.5ynocl\jYrimhg_o`bQ=2 }oh[dVeWYRG=A/B7KH^Wrh|z/9H_j*-78@NUhh}vphX\FV,E:(9,93G<JKMONNJaY\Vb^rp{u}~jrflfc`cv} .XP} +!#`dMQ9E(]TF1F7@46" }_kNSDEBBD?C?'+!#601)<FHN_dow|zkg[\JPEMGW=O3@+6+2,3$/&$,631(&& ewKY6;r_QA/#{lY[QQHB3%#!*--DBaaso +"@?^`vx-/EGabvy    rfTB1{sqwrrhiN_CF/8#(%%  %0!2#4,.).02FUYrn%4:JAOEUPbVkRdHREGIH56"# ||lf\vPiSbKRJQAEACKLVQvkty  !*OCqe $ N4lV|j:'L:[Ki_f^m_`R[P[NE6B18&*,1:&<(>-A9DG>F<?>==8MHNS@I5?$4&9!: &ewL\$0z|qy^j<I.pHU/1 dkDP(6 % 6 E)L4VC_BhGpTx`u$ =)J=dW~mu ,$<2SCgWk -!E8cTp_tdurhpeohl]^ZZTXIPGKDIDI<;%$lwKZ#5m}Sc1C' !(289ACLNNNMNSDMCSV][X\\bjm|!&,55,7:5/FBXYujt|wx~ "-$)*3%0#/!1$*%,*4.*,! ~{[Z96}nj`_accae`kgqkyostnwamRVB=/1'  2,@5G6N@\RcWp_wdvdt_jYpcvjvo)N7rX{ !'"34IKSVR[V\cblg|rv{ntWbJR9?!*  zmt`fJN*-ma[XLR<9.& ~rkcfjgqi|ZeJQ6B%) $,1I,V9hNoXnYu\pYweo& )4!7&O>aNeXpi&'24?EF[H_Pf^uspnvlmeZZNVQSNPLPJDJCTIRKQGL5>+}}p~cr_qdsgrbjXaapfzcxsv{{w{qx~~ !($+$*+8>M]h}ypdvfu\kShevu~pudhTO>21"(}nl_]LGA<;6;6721+*"'!xloU]LF5/ 91TQ}|9+WKsh  "#+!1&8+85><G;J<K4F8F@FAHR_ht 1IZl{u~}j|fzk{ZnM_JbCbC]C_A\@[:Y5R.L#= 6 ;8"9 82221  xscfPU1/qwae`ab\hbjkpowmsdtispkdcUXKGA825-2)*)"" %3/42?';,)  $'&(+&#("!)*+/12F?HAJIJILEPIPKWIQ@K@RBUEHA?7LBVK`Wcdnr)B7IA_Rj\obzE:]QviztmVdUYQIE=80'!    %#*.-,*)#%  |{uqdW[M3- sfMP=C2@1?->*B5N@XKRQNKNHVGYGUPa]kcvs /,EC[Uj`h^aRhY]ZMHD7*"  $$-0MPXVRPb`_ZTRKIGEAA62@<CAILSYT[ZfRbUfWeKYNa_olxetvy}myTn5T1G%80 4 6*@0G,E,B!4& (0(::EAQ<UBVEUBT=N@I8?"0&2#' {tzfrhpadkmkkbcmmfgdiaaQNCH2<'/$ A;VO`Xukwy  $'>=OUMU^^oixm~y}  &%.5<:9C>QNa\vpz{vod`Yk[aMVMZMR9I;:57.2) ~ywlohoTWLKDI9@;=7</8'( |zsuqslneldsltr|~wwojlj^[WQ[ZSXY_[]VQ^^[bW\ZXXTYZddtvwykwWlKXEN+;&5+/*-&* &".0?8AIKUXbipx +&2+J?XLeYwm '$),%..6' sx^Z^MR@H<B;:695))"% vsppgkUUQGC8<2;./%1/+$(22'-(-38::B>EDUSeaihqsx}w|wwz}~  &0*<6DA\Xtm{sxti__PO?F5B80,"      ~ &')+-.886.4$7**$$#%!##  (7,96<>PU^egi{zx~xt{p{sxlzitfqekg\\WP^R\ULDMBWOH@=4:44//.      $%2261=8?@69A?C@:5E<A9GCUPRLb[k_rizyuwwxypxlurxtxx}}yv}sytnjpirkmiqopts}x~sboU]JNAJ>H.7 zizkjc^YZOUI\\HMLK[NQGUUNJZNXRFFRJI>PD^MQJSUXS_Xfclkrtvy|zwtrusu|z~xzzve`PNKB?8301&)"$$2%8+0%A1E4@6H=@-A.K>HDNPU^fl{}.2DCGG[\vx}~x|uvmsjj[UOQED;04(# &* +/>7JFXTebort}{x{|romkoekcomnkkfijhgmkhi`Z`UWKO@H8;+1#"~|~zrsonsfre\^NQQHJCIHGAGDMQJIWQ^]Z]de]_[a[dTZ\[X]Rm_wrv}x %%41C:DMSW_W_ckkqhnsu}}~rqhncd`[ce\[^ZTVD>MA?51$3$! |}tmcaVVSCG<>;>.4&-%'   "(!)(.+23:E@D;B3C5D:B=FEB><9@?D@IELDJCKLVY]bWYXT]Z^]``\]ZXNL?6:'( }|z|ozdojkdbY]YcX`YY^]Y_W_cece\d_k`mbmjnnokrp|#$'+0.;6=CJPYVa[mjzy{{ysulrppkffda`d`gjX]WVZ]KQ><8242'"  $*(7%6-92<;K<K5@=M:L:NC]AYLaPdQfd{eyk}{~/.65?BOTX\chlttywy}y{qvqwjjijglZbOWLNOORQOINCTEUJSLTKOIIDA>67313+)#ynp|ggNYAR5=(         ~nZxRuHk7]-T#KC 9 31 |nmpidcffgk_Z^SK}N{UzYyOqKnQoPjTsUtLaQgTtJiGaF`JdPhKeBa=[<]7Z?[PhI_HXN\ETDVK_LXJMMOILDDNJMHNOYXVN]Vb^c]hcabhfkdc]e_cWeRdPSEJ7O.I'5- ,()!!' 0/ 24(&+&#!')$%*024; Jf)v:t_Jl&U}.Q6oMzFzHv5d xKLuN%OzGV$W8h <(jQx   < < d \ {  # / E O \ r |  ( # G ? a U y j z       j Z F +  n  m  g L ; .   e N :  h E -  u L ' s J  Z-w:nH!e*jCn4k;^0k|9Jis9D e`:3 nnQB,* qVxDg0VRG D J FI N JF;+! ,'1IUi y'}0CMQgtzwlbpL_8R)@'slUOA@-- n}@Y ;eCc<lGxX>c:| IWc(`%n8u>MRyEw@ [!Xv= k7p8KsEY:mC}W2t P(jN/\8#}gRtIe>]5X/O.B.>/  !,6+XImSnVqB f@kGp"m:j,{2+KHHFbu<;ezEXi?pPSh?J)K 3 85fx/Z  > @  f  l ( E  r  R # m  h8C!y&D+ZHqQ?{   #-/5LTlXjOa>\&M IE' o_M/d>eL(l+zA[!E [  V [  l  l q  s ) > V  o  h B5{49EBI-C9VFZ3dIHp.k3Nf&~=W CJCBxjMA$vu`sS^5A7 ,%  &.>MVc#l({3EQhL{)P|E|>t%PEuO|C~']*i9 fAqP/q7dN;(j\(\SLFur)/PPsu7C\ayy%.22,,3468 8<<5*! xhKr#F, fId(B"nMn'F_1MTd'_{2h#=g/RYn!4n{9ELL VU i{/0RI^\{}!1@P^x .?O\o-N\k{+AL\w .8VZ{*?B[b~5rG5v(eJ S0cT?l, Z 8 t <  e C w  A ' c Q z q  $ D . a N u c v   "  + $ 4 . / * + ) 0 0 * -          u \ l 6 E *    { f | O ` . C  %  r ] u 1 K & ^ s 2 J   _>i<[u0FZf,> S`,DOr~AK!weoKV-:&t~kqckJWHJSKVJ^R^Z]ZbYdXk]n_j\h_iesizhm$=3YNth#D6[Qqh  2)PAk_|$0&B3WF^JdKlRkRtYilmxw{em\XK@() }~f[D1sbL1!`N$pb5$}=:^^;>?>%2lp QV87uvjtZa WiVq"qA/Za9Wh(Xy!JR{%O\3W6 dNj-H(%8AVTle4!hT:!x\J)uC)_J5 vaN9; - ~tr+N K%gIY qC"LAcKhRtUwajX]EJ 9 /    ~ b X 1 . eh$)t%*jo6:u{!'NUz;Jatn~Ud8G(r}G\/p4NBW {;Rcw( r % 9 ' A 1 K . 8 / / ~}"hmTQOXP` MYgq~0D8EGMtz9D `^%'vyLI)#}]T3+pjYSJF8.!  /I+^@mLz[v ) A#aAp.`N/\F E(kH(~_ K,kW?y WR caPN79wxNK&&JHmr'MHso# + 1 9 M V j w y w u c A t ) U  I  =  q>wFpZPJUN4h_mk.q}7/zxUz%l i=sNV.W6]+[:hA 6HCce' fc kY ^4}\V' 2$X^l0k=p1X!Fq"[2b=R^wOJ+4 :3qT0]8/SNwFC IHq.)yyNMxlns "=408 QK-3y +=;GBvxdbCIzTRw|p5(y)\a6  I _  * . O  !  ) ; U ! j S ) e z G A >  DH. E\f+?* F p?g LYE =GD Z u woH3aM} ) .  & 7 ( 8 + 9 z  G B  ? q # vm#O  zoVCo/:g-cm$X ^*kA-n3Y5F7m9TwYcn) [#{`ChY HXy;UC`?Cl<>z r  ! 3  " ]2<7$ +1RUz+=e3 fq(~T8eiY|Z|)K#_j6ec) 3 a70 p @ :  q A q + dwm*.x.VX/8cN)Z:|(ce;0C2u}@oAhj-yj =H<[IeK܊۟oBp}[;طmBAե;}(ֿoGcmh x ӠK!};ѓQkЃ+^1еφϜ6!ή'ʹ̗͆˯˛ˀʑʹ ʭɾȝ?CȀǝ^og`ǣljƽŸdœ!o$ŷ9.:b@`r»B¬]ö:heɹɖtʈl+zӅUֽ־7ݗݭ,r@{T"z#tGma!Ta^5z}"?zi6`H1 xz b$ (mbASodwVxg{V_p1 L  u r  } L v   HDI BD^8ifLA}y(K;Q8kT`| 0 Hfs X;iS2e ZXRT  o   0 { =ze N%U n ./ 2 R 4z)DfJ^" p1V i){?R%t `5Rq`^ ;  3 s  G % l U~1/4| '9,b "oNxTpX"dF\ i"Ov%|M;  a }  -  F)uI0R ' #g#&B&'i'(;(+*..%0//U/K0/21j444h4494545544W44v546f6:66 43<333333V3R32222332'251?1f1s11111D1G1@1W101:1>0(0..../G/K.U.,+**)'* ).)&&R$1$#?#!" {)}LE{ 7 geq<L-m> F5e0RF QgcO1Pa>gR/zk19q߻?lE޵۝rڵ׼MKqr9ׅ׏רםׂا؝%izگq^ݵlߟb߽߱IbE*)Iݕݮ&jܕڀ۬I ۅN23فvr׮֟d֜،ـ،֊ؓYx4ًm֫`Y@آ׋ׂ`վԽ&D&1'%Q'A"f#hO"F |8:#'y z 0 h !!! t jb|SUY/O-Pq-  5 F x i % d 7 E  =  ZHRbc mfq`I 3lvAm/% =  m m >  t & ~ E n Z  W+`H[rh$ 1 ] Y JC`zx[('40A$4Bl%d(:U  t p  w > A }  z N ; C >   D $ c x  o D <.F.Z' Lzi kv l4TROhH ~\U"eHi$IG:Bvx!DlTVP - Q + H 8:'S $Y! =% $''%A'%('@+*,%,,1,,-..//..-.-h.e.y.k-M-q++*J**)P)('g'%%%j$ %G$$#"?"6! ! v!(!``;{PF)u:!E X 6<*ak'""sx29O2vm,! JmZߗi?ۨ4ڭ wֆ״֔Q}jϷMϏ ҖYEζ Ё6m$6a;B\oϡQge%`Qѫ*~dzՃzإM )V־jד`J:Յe4tR0ҨЀUtѻϮΓjзҎ QDZЮѡ^ӥύGυ[҆Ӵ{hjͭ48ҼЍͼk̙ɛ͆˒żSE hּ˺󺎽uÿ3}ù!:X=صFg:ddG}k`A0FW&sGI7/KJ> {x~ @ %$v+*//2A2m5"4h847>:999^7655,4402+4-S'M(3$%!$  t> 4:!!m%%g)(+*,^,-.x/[/0/..,-+6,(c)$& ".nTn.c D 4 O AGk7E0mJNr6VS5 G ) Q  c " <Va*^CQ=HVV~{{ lIqj{& < ^  $    c -HT.%)=^0uOCC! /zO`5d!)j%91a6yXh9 ~D54e uV y$_nJRE=; qhU`!P'W-}aKk_A2Py/:&:?- } ).H!#&Y9WW'O+=!#"F#?&",)$*%f*%@,"(/:+x0,0-E1,/3Q24333243234635b14/!30 3Y/2,.V*+-\+-+.-))%Y&%U%&n%i&*$$!$ $ j$["l!!M!W  Gr d  0nIf t_Vl"b;OPY,J pܽ߼91wxژ;m؄tLҶքarqzոO`Lמؕ׃ٽ״׺%ݑ#كٔڟۭ"ښ!Bڒ`yհٺHYԩ/اԖQW֞_pY<;Lwّf'rخ֒څْm'֭[׆{A|%ңҞ=rU3ϗʕͶl̑xȚ[ƨŁX^ƒo% 5Gdzvѵ&ؾ3¹@ǯЬRTX<'F\KJV\7k1V3[8,"Qik r$!&)-03#68;n@J>&@=?=u>:a;76C2?1,+'%D"9Cc({? T ]#$)W*-.5/0'34#7E88e978564f51X1,+&&!!,= M{)$ IRbu%VfQry" e L [ Es*om 2 u[&~ToD4d mqO ) E r;(%zipZV6oB6fO[1M !!$!"$!f#@!#T!# #w""D"A! i _EQc B   [bfp6?eEk~ 3Xd``4S!,3w\'(Ggea,s]>}!iXrJ@  M u f F Q *X0tFR5!!]%@$b'%H((n*j,-:.*/..0/213(2D3 130M4a1300a-*/,9/R,-+*( (U&&%&%B$W$"#!" ~" # x#B!#"!$!$# &#&#&#.%"$"a#<"<"!~ JHIe> U o:PFUyv$^[g4QN]lpm~Bg<( ߐ ކܼۉ ۚٵ0+>ڼۧV.݃ ߑߝlޒd( }Co]!%ۻ ٔذAؔ׫?P8֘v.;" n׫@+NէZՓьt+Ԣg֪ԵӶhօ}E׮ӎQӞբһӷңPQˣ:ʜǙE5IǦÇ{Üa @Šz=%#ƾB ؿ%lnڻԽ hܺ^ͷp7Ѻ%$ƳVЈά4f}'gKW-rbV\w `M % 272"/ 'O%+I*A1h05547478989 8696735&12+g- &'# %!v*/]t@! %$}('H*c)+*,+,l,,,*7*''$$< c-C 1I [`ZKBa Y Q Y  z  }  8  d vk\o^tubZ6-^Ifjv|en l Uz:pA$"+ Z n > #;>v!15! F"#"g!."g"l "%!! 6!r! !"] ! +n  q 1s0,mXd -\~ `,V3cC#emsF2fN)D+UxVbsKFLwjIZ4.|Lsgoa' 3 $/N.  0 c T { E 'ib|Z '*#!$"&$(&(H')(J*^)*J***)/))(('T(V'"(&&G%&$%7$%#$ "s#"y#"V$q#$"$f"##$&%%%%$$$$$<$$#C$c#"!! 5 -`b&<~D$ j > _ M o8Is:j G !B(Ui:5{LHKO(NSݜ$xڬ8>ZYN%K"1t~خfyi4Ib]a٠;wـIB׹{ד׃wf2iXGܸ٩4 ّؐ׹$`٥٫o149ܧ7ߥ_ޡހihZ܊ 6pWvggӿoQԼљ^K?4MT-S'jѽ=BӦӷ1qשם׆'؟طٳxJwնդՀҁ;nѬ%#6΄;̻̇BHẂe~ϛϒ!Ϡgi'Oo̯J^<ƮFMŇŐؾ#*O0%=V̷ dhb*:o #"#p#%%)|),,=.+.,,--.+/./.S.,++Q**)9*'>([%%##e#$?""| 2AP9Vbv1K  ) m k {/,r N7u,o5 /$((kzHIl(Cb<(q8]%Co j7..hoy @,**'܉Lکڱה֩ AלվRAӬԎуҧ3 ϊM#ksB˫aɟ48ż nĥH ?Ÿ}©hп5r/ݾ0j7|ST:qlֲ!&ʱZ(߮X"iϹ bzՠWb|V W _ j R f  rDC3VM&hM #@V""d#$##%&)K)4))%&v!!) kh0| & E l}9~x=%j(WZ~m"tX)#oB!!!![##Y((+,,-..01}4567454>55^645T34@00,-p*+')$ % !ghthM-Sy M1j{ \Ue g%Ytm{D0UY6M%i7e:~ m u z `hXr$TT ,wo},4Jl}: 0 A !r!"#!B" WM4 op W tNx  >  6 -7e?Kb$  sbT S\  xSQ%7@9n@< !-" &&'_(l))+,,,#-.7/!///001H2b3C3`4+28302022312#--.*+1*a+C+Z,()#$!"!"=!n" 7cH %Y,@ R K WF(%`bMsh83Ne{L#MiV 7N708&$#kV=Up;|J}8u??u](%֪ӻίͶ̟ͩʘɽʍ^nWʄtȄxQʫ4 %ZȶnȉƉ $dǓ|ơĢnŸĴ¯ GBÒu“c fµa!2WA|±?ɥȝ;ǩǷŇũk17Ę:1a:;Bٻ,Sζ4go͹/%uaay?-m 8 7i.  2qj6i4Cl{$ nmP .U ':WM ?A-MYeuSq6%s  ,$8`  !}!<$$%>&%&$(%/$$% &W&&H$$""#!! e!v F Y0SQO J$$((,,1..0x0335544/ 0 .[.G--d++&2&_bcHrc)N S   ` {   {  -  G * } V 0 6 4 Q "   s oy?;Pn$Q>&}[v c<u=2((% T  R W M $ y*t(zGDS)~z1<<b|ns<f1P  9 < M Ih+nl O6`z s _ j = + j[)/ 0!l%:&f T ;H 8%5%(())++w-7-40/1l10=0////00//Q-Y-++*D+**'M($;%##"#!!]!90xvY|i$gJV[$ a7x`D&U(_S;Z#>)Bc|6a n%9qt{.h-Uߵݻݪ|ڔ8ظ y`{ѽo t Ϻ|ͨLoG˷!s΍Z``̪08˥M˶3#DɓȨȁǰ*|DŽZdz,?0hȴsc ,yNDŷöǺMq0@.ŻdǩȎǚǏȳ.ǰɒDTQUƮ(y[+§ƒ¤Çæŏ(%01mJê8@ A!ïӿZ[廇l/<̙n~4ܦp+1d C @ D   qM: !-C 2 A^Y q}']]z# wJ o 0 E cto  o5h d`" "%$]'&&%%$9&$-'%&v% #"D!_  J ! _cPE!P!%$)(,+/.1/20200/F.-:+*)(''%%"o#=vo1'0a=\l  i  d ' 4 V  > R V N .  M !0x1fq};4&wF !p8(Q 2 % ) M  d / X v  D+\9 , E *J : R T_G%Rm?Y37nt65<} =5+ul _*Kx # T } *T<<OBIh  Tfk b (O_8#S$(()&**]**,,0021`020n.V...,.:.:,H,)*):***()+%y&!C# "8 !. 44COy$CfP4G'lb  @  QO'C 1 6  | : o  =  ( eKd9UM!d{LoTD(EAh e=3}' x! j"!$S$(-()))e))y)!*))K)&&##"y"6"!Q PBy_2 [##&,'4(z(*+d.u.2265}54d4322&2}10E0Z,+)(&i&$$r"Z"?i&jYkY O{G   D ) c  ( q ? _7 uL ^   N  ?4&[QT`h4B BA*+Kx@IE^ 9 1 [M}~L|P  U < - rJ^c4C  !m_sm4B8&d` 8x P L E  8 NA Q h L 1{ v+KSt;jjZ}JpHthE TC VN2o5)!R!$$Y'&++-N-.E./x//h/..l-i-,,+!,v**(U);%%#$"#2!"!)  '5 }y+3?rKt5X?X_mr  v L B Z G ^x%zZ7W M w |   @qc 5++c~`-$[3`t:|N,-ݍw6a%|2ֶFO:ҞCtmҭAfϩ^ѝ΋ήͯ̽;qUk>k%8{ƿƨ!Xƛſ24ĠaĴ$ J_ ŵēèoµ(n-Ġ=~nīľû!jCĨaĂa\ƠŤpŊĞǭGȭ ǍiY̢ǪǟNjǜzǕlȩqʠTƼzĸãāå(Sʽ">߿.ʿ#=>ՕAڗ:Rm \  o [Pq9jG/8y@88V! g2siW4TH9v?F I ,  Qc*.Kgb_ y &BN5i "Q"$$((+*))''& '^''%w%!!`w.":p# !d"#%'e)f*,-6--.O/0q11G20q1X-,.+,+r,N*+y(G)&'@&'%&}#)$ >![=T<   ( , l 2 1 _ -hgxX{K  n p RgQ`DY/YBJFD[    j  Mf-EK q $ S N "  0 h Y  - a 4ra|\7+MMv Q-4 5 Az S  8 8 n Z aln k7.eN Q  Qw ?  Ce_X!.!##$ %'^' +F+@.*.4--,+6-,/.G/.z,++K*,>++*(($1$#"R$#""N _,_tGFGW^7ik+ ( = $ 9|Ayng>& wq     p ' p + O /h7xAD> 36tQvzzSPmo }si;!mdJK1nק8םւՖZnҸԴEԵy)O^ЙБѠo@^ʘ\)ɹȥ-JcȞt2#ȼi{fDv{Y;y!9k1|J+5ѿ4.¦‡ŢÃŲ ĵlDĞı żQ80CfP‰aƾpC 6~_j/ƇBs.{'æɯȳ=bѦY|w]zT 22M~V q X.~ EQb  :  $ C] , ( = y8 UKV/t a+0("   V  bz^*4})l"!&:&M*)**F* *,>,m,, *+&'$%%&#&'2$%"S#" ##4#A"."! !3" "$$%&''+(C);*+h+-y* ,Q)*(c)')}'e(5&&%)&c&&''''''W&g&K#i#W $=^ [ C *^)[X<d}`b N 5 H  \ W (;?U n W  N >\q<(/U9+% q "  . & e h T \   F4i^ ? > + U  ? 9 r  G o 6P >g  x LC o n D"W!9\ t P ^ 3 X ^ z A l { #&xZ:GyXk#8wtm;M t!!$%%&&))w,',.I.00000j01u1 1M1E..+^,++t)*& (""T9ban GS5 lbS$? &9<#4r@C | X  iuKQ(o}bwC / e nA  } d]"C~v$$$6hnmbkA ]CKZt<ߩk~j (Dݼ4{OwsKՓ7Ԏ.i9Ѓ5Θ΂˿ɌfȺƱukżě) œģħ;bũƿCW+$ɋfv=ȨDZDzd2Ɗ^įo†T\f}׾hƽ]M<1˾pk3P @@BĽ¾|0ąērū(ۿV~Կʿ R˾%&:X%ʼ"B3Ɣ-8VԼԵib|# X> K DA-o^8w )SPU[O i y 56d (,p}y+ k F $ :oOk}[""f$f$p&&t));,,\..3/.U/îjílS§ıĄÄÇW kƏY+3—sI#T𽈽Mۻxa/,HvT{.T0/# -l : )yc$XOZ:Y]CJF q}^] &h%Pi N`]r>4+}Qs_XM>]c  4:? 2  ! m#"2'&)T)+**6*h+,+,,-g-,>-',-g-5.-._,#-);*'J('O('.(&&%(%%$$$ #J"[ Wh`x%:wa ! ""!|"wM Zpa@ 3B$| 3  M t ] 'tkMR1$(RP ` K P   - PBT[Hy xDiJ/D  b v u , S  , .  C m p  8 * L , f & \ - F  sHZN$,@ L d > z . 4  z r$T ; / x } Q [gG *."c9 [V"O"K%$m'!'((*++,B++7**[)))F*(X)&8'E%%##"" RX ^ F_0 u<#CI3!7|1T c / s J 7 *6^R.;SlIrwYu_;[R_Niy#OFYހwwRܝHܸ6D|݋s(gܵ۲b,ۿ}ZתK(q!U2N>˹˧̮Sg>Kͅz y[6,hv˾bʕot2 m0Ė=ůeš>Ľ¬ “ ąD>ëtt^fƋ qǞ;ƛƆƏwǗǐ^x3~)Wi9ž Y‰lDD\‰ @mǞȫ>bɁ͘/N|{MWUXu:J%v@ )Phi;_U:o( a !,BILpM+LB?U%3,o~! "w"3#" %$'' *)))))++-.S//N..,-,-,,e,p,D*9*k(U(n(N(('%j%!/!1v[\!?q]WX(i# =qQ4 I_L{  x  / O"IJp/&#\mdAO~s@;!s#/ K EZ^z^fhd>|P/h % I  , 2 ^  4 N S 2 LE a#'3vqMg  3 }  f   U g F y 6 F  M t M Obl\L2fh6jIg2K|GR]v!B!$#`%9%$%>%%e''(')5((&'&L'&x'$$"P" l  Lj Ez1.yVp )LhID 7y S- Q (    ~ N.tFxK3K3UT?o>h 5=VZ@?UCS gzߓDޘe݄^ܙjێDxۣ%7Oه'iۈ<Pkڕڃf؏V^OjlҜѡ?K0οΫβM̧̺̍y˃^%=ʝʼ\<(6@gǬƄƌ 2cdHlk1KBxhȸXM)*3ɢɷ7)ɀ@ɸjɥɛɅɲǒǖDqƐUgn5IJvk+&|Cİ Ē'jśE%gĀ+8x۽)+@CW)9r N  ? * } / )na;YA47 rhL ` i 7n`>pCzVb) +F l9yEuPc8zDV@^I c !!##% &((+?+,C,%,m,n,,q--x....../?/./$-8-**)(&&$$!!z|p8Z1hS}N 5;OC:.+i=#1 J e u  x\G5OPT6HgT Bc(_ 5zlbFaU+rIW_a<w  r S . LvDkIP,Z$ U   4 r , F |   Z F   r ^ mSt2( bg $/T ##$$#$#$0%%%S&$w%W##"m#G##""@ f,w2bUyd$c.gz  ?S  Z  | } Q 1  'G| A \VV+ a b O  _ 30hp]4w|ET:S}HyKa_66z0;+ݢݬLN۠yڤ%;ٗXؕXد֌x7ՄO%&]\pӮҋҜ}'LІKXxiyˬjtBi<ȿ`yh^ }Q[\ŞęœŦNJǒȗȇǮǑǬȻPP\/ɑ\.ɑȧɚɏ4 ɜUɠ3JʨhFɇ%ʃŞ$̛ˊ3˿gʕcʿV-f)ǥX*ǓǠeEdȺDg@ZѳЩӼ]ALf bqy W 1   [8Q: Z [ ` S $  ~9j.5>Jv<S<>S} G X *y0Ec moN%ak !:^(iOig&]X)j!"o##;${$8%w%/'l'()C)x))) *;*+6++,++/+6+**3*]*5)[)''I&&<%%j$$Z##!!  rB Ys NNr:0-Imd< | o &  } @ & Y :  ] { B!K,jT3It L j|:e!%Q@nbUVK\a | R  o @ q Y h .   V B  & >  t  : i e t u a S # & / & H %rE y      v  I 0 H N z M n " # f g zXNZ/i9:Rj[bL !.!""# $###$W$$$H%$$##<#]#*#h#;#v#!!#F(let91A" X? a    O! N,Y-buG! : O o { N P  {  +  k ]R,4sb kc~ULja/xQp._iZlN4n"ݎ`.ܮqِٙ% ׻֊>օMH okIO ֟cAԡe5ԴӮOӄbM!eGФ Ѐб;ʄlʉɨǰz,h7dt»ý.cź cagFȅȩ}ʞ̘m_ ϸлfX AYЍЅKМqРz0Ѱlͷ̦͉͊̕Lͅ)ʿVkIɌɄ"ǸbƱ\>ʎḭ̛Њ/'_i ic7 cG ^  o i ` ] y " _ - d N <#XoTls%A1rN J n q < " d n>tWSe4"7n0/NS 0* ! !! ! 4 mxLF= / x 5!6!U! !  $m rO)3m&<g->5_7 l c  R  @oM~`h%iG Z2U}nlg  0 3 ?  e . ! 8 X uFR5AH,hP]6lS |q(X>/  0 <  @3VP</PG;'L d 6  _ x z7Td<;Y @ & % y H a#]Fgk3hmr?Cv?g` ? 7![!!"!!!a!t":""""#""*""W!H! ;.KDz HG2,!(un~* T0{cs' SM (   _ )  D C ] 1|;({z\4 8]S)1F*R DVVa WR+ ^PDEMP K'ipyvf+ޝj}Jݠ~F,ܒk܃UrFۧrڷc$۵zaloBظeׇJp{U׮֔Z.֡tQ֋ֻԿӖSӲӉ#ѪPϛβ̩͢PrG̢8̨?|[˖ e2Bʞvʰʣ8?yv59zrϫϚQMo:ҟtAԵԛsոՀ1y>3Ժ{ Ӽuo ҘѾ9Ћe1p ftЉognИ\'Y>؍3=ߣj/hbx 2\"v,R P ^ F ,`pXguxzby5yGo`: p ~ \  # " 0 ,  C  O   k  g..0 :PN=;K0LGqQSq |!!!"<"K"E"W"#-#;#\#F"~"!!! "!"!%!N  %4:L\GbS> eC- nE?!ZaRRL4%1*CSrMv G n  Jjmf.!ziB5}w LW7 |;jVk   [ W l d I T ~ > N  -   / 3 @  3 ( I u O w  0.TErSLfX@yXt@U UV y q _ S {  R A  >  FJp%,3I EOtpBfisc:; %!-!n!l Vm} 3bl<: )zmxzqs=" ^ 0 Qe}7ja-Q@q9vW~{(>GLSet%me&|I'.ep6".D! ;GJX{x_A(o^7BT[PiߧzPbB&R,ݜt`-ێ]ڮڂڂeYQeeVO׋՚ԲԹԼxҐ҇җZi7nҏҎ >^ӉӇӸXyVr9X4Afuռ5%DD7V(M C7ׇ֠I"֌g֦ב-3J@ַ־կՇQ9֗~>4GԲԉ5B*. vYDK-1־צ׫ى޴. &np9L7Q6PCg{ ' Q   8 J 4E^+<|9>M% "7;V. X4?gM|~udo9#:&`T:)  p !%!n!|!P!|! z  0*t]@{Y3/0F>\UIHs`rO epIh.{ u j |   _ >+L8G HV VbCUJg # ? c  r 4 f . \  4  6 29+<fS7"~x 8Aj_) 1#O0E_&# H  ,    %  A & u K  z N a / K E - 3 d q  & iBI  i:L49,!/nXr2P"/8GL Tfz~iU9   "  1 0 m e W = |<@_,!z[$&5(/S]XKH6JovVh>nWD?c5]l3YxGC]6H;>UgMf{x2>=@NZ++*0ߗߑ߆LH;GOY ڠdّ^{A`ؗ׹]~צ׼ה׭׬גvi׷WWPsW׬^פA!u=gה2b֟:gּ`֧!q׹Rץוn֨=`8/Eخ:٧kړ/OHUڟڣڇڂTK?-P4٪ًN, <5هzڌڇgTۅkjT߾ 22[^ (/A!&@l ;B4R Yr,  =  k ^ w ! yYpO2R.hCcy<fFF\yalQ:G~[Y #bJULlV&B?1R{e*  pG YEV'}CM$o#^]";e"'.t uRl 'tok t [ e A ` T $ y 7foc+oJhPE}e v;o:7h*=(|Mz  n s } ~ gx0!w':F<nGuWHljmQ ^ \ 5 # ( E 9 u  |  l } n S ]  # n  =  E 4 ] 0  ^UElYv~E"SDK=c Vg_=M69l D/L&j3&29fL6 ! , M U 1 N Q<>AEl&0B/}h S}  - j Je"\E7Fn-mZ'8|yEJQ 1po6m%g<-AGE Zk5M`IkVf߄?K&A(ޕݠTdA#GN\ٙ؝:cm֙&;fքֲֶ֖֠PRI_ֺ֡֔֜4׎׳׋ׯד׷QaٹٽzmS3۲lb܃xmc59&ۙ۹aN۸>ۙtI:۫~ڠ.ۥZMّ Bڽ1٧ث T؈؈ZؑXچ۲%ޔLg9c(}qM+iZ^LED9%d2% 2 t "     _Cj =po *R#~(f=w/VxWkd?bC b2_Bqrn=i=:y#3HgH/ aLku%H]u8mC_2OzDS/^5rLdC  t>quzN^:k= `# x~ g9 \  0 E  o j s G B    [ S D8v ?"W[l]E%_h6 ( h v( h  S + T  K @ w  X 2 B  T '2sw7('7_F:adJQQw  #19s<!G|'dv+G  m   C  T c8?&3!]<N:w  m  G = z B -[ EN % K    8v_  r  v =T   " /  M  c J R " t rlD#\fh sL)iU TS8[7U:P_Y3GuHD\DMu5d%M;2f+zQjE*Cv!hr 5*+' KJ nߌa߹8'އݡ ݎG$ܐ7ۅ {~چ0ۙ"ۨVۖڔ Caٛ\vwIYڡ1UyXش:َُ&ى#ـUٸ^ك:ٷmkYٯnNٷ'>h4VܑAf2l9ھ0qyےۮkܹۗ۫Puܑݼݜݾ/g݄ݤ'i%c K3gNY37@e7=0 T^Ciw7t;Z^^)*cC q `  ? \}r:3T]s-=i\`}K_!_#vR,&( 7&aRaa=NBR VFTPe~Waf U|=Gu-0Yye 4:6ma/<y>r'oI25~ _g0V2\_14m <1k Xi%,Z    s  xO=  )Hi/Pr2Os~IKPP?;-hzre(.+6[%X+N` 8B QEma*=dK0($rTw?Xv|X | ^ i   v A a * \ -9 > 5 | _>^]rBb.?`gu{D vk{gv.t9zQd@Pa$PVZ)0fb1 \ ` S Z  A g    | ! d  }=K ;[S^_!`9f pJVy.z)IJ\enNs}/UQL2m J|; d'tCGqRu RV>S ]${J2޷kݸ:ݍ(dݿܨܝܭoܰv܏LBvx'1x%f ړڠګkڵmڒ چnzYu=ۢl۽ۥۺqۛ۶,ۻۙNۖLەLqہۿۍۗSPu[V&<ݍUݶݎ`Hީބ-߲A߭ߞ=}_cpX*, FX^dQt#Kj"Q>tTP13V5  l bdbSBbrIy!z UbP,& C1Ig= ]0$ SX%z,A[8Q1a\(U):*iku~NOOwP  - < V / C ? 6 5  | ;OQ~#v]{M^C''%lA=qm>}L|PSs'GKCF?M t(3dUyF  P 8 @ , 8 % 4 T J\w> j S@  v3  g 3hH1  +  K o c  X #  oCA #"07S;U " 6 4  y 2 5 =  / 1  pr<R&,v>Dg8WWC9 IHc^K_ doVP4'7dZ0mFJmA/>sx 1ߦ߃r݁G;ۓj5٧ٳlv2OCتؖZٗK كFڌRښN.lb KWۆۑ^ۃ 0ڼSjOjC_S܈ KݏRވ'ߢ 2,0A0`2f5uMjaArG";XtDgZRX- LKl pq-`p6'|";aRUcR(%:ikR <U,a:8R*d T  w  ^/H_^fXk`5HB$Tq7=]Z5E.C1cv B8%S x[$?aI^m^#TTY z:d{`U.0JxzCN ]E+~]7 EY=vV.c&giTc 9 F   [ d 7  | g t t L D 6 (   qi JX4L21i opU\A\wx1El  eGH.6;j\|a|XBbbq ^ g r     P & z k G   Z  Y O 1 f    &@TOi   6lx=f*Y:|G -FSQz*2%66,=  5 0 5 ? H  W P x G P      w A,$ IX!"-3)aTd7o=\d:VyhGtL)l^a%+lB1$i+u_vg3mh:߈ sSݲCM.݀ ܇F'ܢۊkۆ2ܵm۔=tۍۺۿ۽۠KV܄ܦܦ|ݗ>O^AuWiN{a;A f=TGP @]nx e 5g;%m?y rL{$xLEu U5rr88>2AW=SHosp43j0}s2C" (HYIy4B3t`'s!aVim'P#5Z<GW9yU a#e<_"a<g{' d>h ZR7u4W | B } 0 E x  0 0 Y  7 h v e  3 rc)E`n.'80#  0-DP9PMhf}pKW]eAH@A3/0.fb G_b~.M(5 ' { a y , 5 [ b  $ B Y  6   M w # 8  C S h  ) e   7 ]  6 r5#kCc5eU:L(f|0@Tqp=lQV,<e+= \gPo*$625dlq`uKT.Tcy\w8Mu.K'c=`7[VX=% MB)8LQlzXe/(YY5~inwx7e UXDwrYl/ic&5BWH4 +PyBY[\gm\v,P:q z8=3SN& O;01IYzNaO-W4 "yZ6Q SJ|>j-((|`Sk#D]& ~'"-Q:#H}*`]CSE uPwi{qoZ/3 YDy )6(:_g(j+P.aj42quDOy3 D x ) B Y 3 b [   #  nw :@q>kW|,[ ; 7Z3zNx?ui~&fe D<xM<w9K!cpm3lK!YE+nf9B7-t0rav#RY1s6z_ h{nlDiSx .s  x 4 ~ A J R  n . [  > : w + q e Q z O ! F iXV@{n.YfOtw0Z$ R#Pg$?Fy(&<;i ! 4"1H=5yn>7BOWjB4)3r)ST5|(vBsE+oO\gavww[J,X1zqD$o8ucE(1SGb+ SMF70kW9`_ uX !cQ,Nh_tp[`18X:$Da!*yx)uv;,WL./mc#(D)$`^\Rme8,;/?Stx@5#7AQ_v]VL^>7| 7SE/$ BQ4@:+Q[Lf9";}OV3>Y\0Y?:Qq $5|G6$u~NH !'. ``t`KS5 5 zI1MEve[;h1<nKA0L;Z`T}|Mj1w8HNbq %Ps\Fu}y$)~ R i * > : F j l W 4 1 t c p  I 1 ] j J  ^ 5 N  R q m ' D . h ' ; [ @ C  3 $  a Z  K e s e e h " 2   ` 6 ^ Z S l _ _GqFO1-3(aj;HhIXn(Gk$  "xECcwj 9w fk )'?0<9Ej%"+|@|nt`zq]OJ~JD5u<8H .OT]`qux[;ie+]Dy]tI )2.IA!? ;' ]"+-, :VRKI n8=~Hr!at'MWx7_%=.pZ~~uk4*;Jg3Ca.$:T|e~Se[~Kg:U9</VBeY1f>&$XOH)#CoTP#F&~rrW1b(DI|.h]TTB"YjJO, V \O=xdAQUUq @Gydrd/d/.Bly9/EbTyvmOuB+g_b0x$_Ss[~S_?Q)DpUS+VIvL } Z *(L.AQOX rRPLxYaO5a[<D,JQ@!]tP&t}7S<K&^8kuYo,'" O+% KX!82R} KEUNdaQs(4.$},g4"!Mg cjL5RDzAMJSK+o`xDx.:xi3/%q /Gr^n[ ^V(r?yce/!mW#VGITzCm i|M{GM*8)Gs{ J =RlBBn!P7rE9tq:]_R;] xMjy_-O6%e^Jf9bd9aZ`Q^y6vO6bd_gF*d^bK,0*>`PM&vhSI I5 oyuQ<<#"{Cw_Mr~QKiGQ*pM~D6M&LZ/xMv}`SjE, E 'h!+=I0 w$RRr]`ZjXst-Z]Ut `q>T4#p~uE-t4MessoJqUhm]11( yp1~KaQPAi:959:u@K$(WlSK>F4DTCktX#nWfJY  sH^6a|lo;Owbf Y,peF~q\&\ EbBAls^/G"Wnbo7X2IK U GkGWnf0"j|a4b{; > NnCr<;!:\G s]va.LENg;Ta*t 9#F[bB' `sc?Y$k}=_,xU)}L ?Ly eW+p)pJbmS9B[P"+n^e"k85,0Q'@]zC8.MyYtT [Eyn4m*:/0zyVU%G&aI4o ! 4qBF$SA,gjZ>IJ;l 5M/dD"X0jWrt*+K0lPKxeX% 1?eQ=]\\2qeeD_e!#0Bl/S  8{z{~hSxonbT2M{x7" P#Hkb\sfX6!K"H)r%#wp:^G7_d S*7l5/SeJHW+  F$J~Tys: 'Qv;mm'T}qB-,R<u 2tJ0F=z&Mw "q#&cY-T\] 8`K:Bn7GBVCG`&e[J%}wct~:0A1Tyw>Fq_ d7|u{~/q4RI,h&{Z2\UQ$7 (96!/!U&sbIrTJ"1TMMI6Ox] E Opw#r;wwIFr\4.b=2^SA|2e5WsZ!dkD_`H (n'0%u&{ 4&Q4?:o]xgQufrK#Y! 3Jdk\^ZHzX#+k6%a"@i/7WjRUn"zL.4,u?F5\MW &]T?k3pA 3dL'K#F-u^,7.h@'`I| XJN[H2Ry)Ln=QO2tam20IS 5)E?J4nz8HR ]lA5GQb!?&JPmYwYt+mO,F_Swabh)>,<M6h"{2dhos-8SlR+@pP!z;rvhi3"; K3),|{ 3,]DQ=>x!,>>Sg??amNz~NbwP$ck*;Ml]x$INs7M fk8M_%<c ^fLfB|&Ppc)S hHV~> hvV[dI>767W2(Qi"[>mO]t^M2wv6*^WyuB%vjp-Qu uXym{Uen5|cKwdiBf!P``zKo\` 50j~VC 0@pR`9mH)D2=ABn!>#yVWlOd5=..Y VXz]>?utC\\ z<p0%b&{\+APy{>r+^hD r RgTdq'#Ad%[6Z$!ca?Ps:OXZ ih#9o 0!<+E .SHvaF<$D/G(D0VA -4Z9'n9Z:X*R`4q_}k'! ^s 4ecGa/e4,>97 ZuC5&kA_Kim v1<}0hF[vhmNQW1" #@ _GkWB&&O};54#e^J_q(e$?kn5kDr6 xaBU.u^&m+)4G/8A`4:Zw&L F4/E*2?S,,1>+gp875W]wr;Ge;xXZ;|Ub0'~hbj0v]9K$'#RrL}]v3ih%%/>qe^9CpL\Ih=!pwd'$7 o;$m}}3Ahmj[tT7NEkK:P /iZ7 Q@_ptSD4kSy;knM0jrJ(>B3l[o9>(T+"`Am'g(sGLSR QMy~N C: Y)ctUAW#AwrxKbAQfkQfcpze`:.S}XT!~BiA`-H!K0=](F= D1XFvwV[=6Ba (e,<\)TfEqtZkqmS&R~2/0 ~m|#4g6=q{8m>+l7\=zT%.KRk K/;L6&1=P nv~-'f-iT.QRp\&]<)\Y~~v_vsGK- dW+'}h=RC!-W/qz3<)Tis94^a-Fr(U!- 7}_[M!EDl ksI_Au6dz* ?j422SjcE48m/"g/`mE ot |cN'[h<02oG(ih!J))*?(\8U; [q_J?)[q N ;>yvQP;Foo]A!LluSX7+g-EV~XDu) C["Vd]Xj55<xj#G#@l+EwL]vlu31z}&4grENdPp8_ ^<{?U#28f}<ck1s]y;g_Gds*1\4gS MK@7 poJ M/X)KVw@q0(\Dt5G) N;Wovc]Sodrm5^"M&mR7n C+1 nr$C}_IC>1 2 &9 z s>=Jm%C&[`Ku Y@}TU,\ ;l|x\G Imsxno5-r53x~h.  V>dfClP'L)d $zD+|au+(H/bAwO\$Qk3 t ?*X.ZPTD5o11%->$ J EZpHD^vN%C=F?V?DGUHl`7{~u==I'!GkO_4J@(zn|mx36s?$gla^ #5MIsNd1F!NU|wi zA k [:8upFn -V>DH#G B M{N( EqWX8ISlF}~)OVBX tMRt'|7TN*x_h   &X yv n=>+e=Sa` / rJ-!6 *v(+tMc?a)rJ 4 -nlIFLWn^:qO;:@+U)Az^. `[ J(T 2R9 }tv&:S>NiWGR>-/ M)'Q|h ;YvQy!]2h%]lZ;:" S8y>h";[BKW9h##0)r4[u%=(3< /No~l?^[ |%aa-u*Bl r_Puik#/6`Nzj.#jR. 78FLUP;58n+R::BZz;\zL}E]3f1Y&oT,~ep;>( Oz;>b"wd :=2_EcfD_ S+ aph'wXM/6''^,H BXC%%c@8-K;"h_x-YZ"".&cNEa+b,D<A)^XOV PUi?LJ&>[?Z &|Gr jXZ *Q<.:u7  ?USESvnTb  @ISUMT=U4(xzT u%'Vj(hJcwb <l'#%!F[P8/>iC=V)d:{]()Q ea D]jDWzSuiXujkT~m,kc ^GeA"]s\J = \6F2c\P}nYN -0hB$ & #??UoBqA/O|?xt Wl9qo[p-a\Cg\HWqc*A*}^E> 3]>$xRV6B%bAlAb$O8zB.W-m cAXd<n  c%dBcfUbT}9v5;:cse]X O "zV (l>W\]4iXpL =3V7G.1\hTfoG0t0ac0Nv_]BFzQi#Y\4^tW RH)wZ/e2>z#='>Hu?:7?xZ"[  [`2vQ L;6~dX*$rX".CZ<j&sM)N=eG&P{[oTWkc9jMM,2 HI`Py8I u9[R~/p`S4>D S}4. 8 'I H|i^8&FL#(H!YcDL%q3@^XIOIpmCV9tQc;Vr;d "a(B YCa#nTl^~%'f*neyA,F.|{p&Fp!6; UE8g~~a"My4i2 Z&(C5^{GX=p:l-p  Yh7o#Ntc:=6wl@|[w$M1#1a bgbiaD|$Fz*oE_tW+f3}9- *L,_s" tgcdn>wjO%2 z!G39 !qEcZZ)U+qn+(M;LrF^b&d@+8}%&}Nz[,Ko /Q]* %kwlp01#gIP}4e^1Uwk:b;VA>@O|wYZU^6t_bpHU3->]GwBEv) Pa"Obg   [1 I{T_> 7 bpDyP6X~*f kw2S[N6= J+ H\A84)9H)4|j\^'rgC C0kBZ.n.LKNC>rRNr ^zb>N_tN"MA*@p#cL $Bh6w9Ei|*jw$XGBn%r}Wop1QK|DN UWSh XZr4^qh9iG}cM )wyAaIgqr\WBiiH2U>X,>k5!o,.+:m|VQ#j (ivhe9N0g7P K  ]YP>Cz>k_ L Oc{wi-KtS{[h%n-UsCMlXi^Xi[N!i &y2gA:"MA XsN'L[N`)gL})'tz:U=kr=Z%(IJ !h8H!XA]*H?^MdHy-Nkq CdY!9iZoO)KnJxa]x}3$>i@M%o[8]G#/[W0~,v Uptb04VvBH^;  pgIJu6 Ni(3YBXd hDm#Q(ZYJwP&R<YX a oMO ai4$c YKv0( @4c"(b #PL[T2d-@#5-FU B7AR7r"=!Y#SWHu/ t2`6C@mC$U ReFD3J^ !WsXd(AwHU2&Wg* LU^F*btR,o^PwF|_&l/T^]y\Wu *Zr QqOq O aj"=ga#[/W..3FOU^~ nW 38[i_ev8dgT`Myc[Rgse@+iu6lz=}4,Ok# GX-QgB|o%$E[z{ qW!tE6(Nz\aSr RLzO7k,I;} ml!W\p%Re QMC5d|4F9AY3 }1j]m;VF2+!:RE97 H:L:8\/PNFhX%cTGx ;<~i fwi"@"78|[/q,1ko;QLcSL<2})% X V/2-QGFZ2:DF B% %kB0M?izN<<De  (  Yaao  = ` f 2 > ( + l i + * \ [ j p a f } { h n s } ,,z  3 )  f q L V {od?GEWgj>PGAq\[hN=66 {mF[=Kz B= +wrwyPI7>35cTll=$Y6  25{oS:aN B + !  , G C c = 5 +  F S v \ U < X f  H . Xb8"K2_U~t# thi u A 1 Q F T^;O:NRbIUUu.$8D(F$@ x  . T m e @ x + D GbR@D*(g iNN>.y"*~2,wM>Ay=yUBjw! nn w  ; = r s  @ _ !:!    | f   ] a S B C O <DD>;G~76JG.$0-#3:97=rfHEr|bc p w W R : ' 9 > L F   ? G \ a A W  , A @ ?4@2 >;C Xy$7sstQK'LZsSBdS.97F߰ߘev޴Sdުܥ|܄XޮݾaR#rGۚښ\x܈OoUIpYTp>H֥&ժYӻeѣ` 7δ͆̍9ɷMɌmȗƟVźg[e@u-tt4e$Ʀs.ڍ!=~tPxc !l vH}  !|! !4Zi : gx84vuPYuIpx7q7! U!<UoT$0.4\YP3$TjlX& _ ' A  F1Xhbzbx !!##%%''(())N)D)((e(S('u'r&g&d%f%3$4$?":"S!Y! >=`zMk n N ^ L {}&5ZsI4@'eiWiPE[aZln[WWM<('gvYbzvp bC4Zcr^bk|zf_emQ X d Y [ L F M .-|bVd-<MQZr5>83 S 8 B R \ w a i >@jV==9Eii=4uaA17Be\B; Nd'Rvg6K>gdaoL*noO8ORݐݯ܊>({٦?ؘr؈l7Tv>؟Nػڍ8ؒמ!֌֬իCTٻړڿMMEkjwۇ_ڎۀۉڜ 6شvz#Ծ ԶN} zѯu;пbͶz/I˄ʆKȅ@`ß:le cϺj\ϽAN%ǫҳM;?/}L~"8Cg:gx [K=a  !;!!"!!e""S""=!!mi\ *Z 3ivpdRu(c%7z:^p]O ? y ] @ ^ *   W u Nb4/Rhn!$AR  q ^ ix/l$(6 !"#8$%$y%$% $$#q#!!  QFk% yO y " t,W.0.X.:FFG*"0 'r G O N d , 4( u,k\  M Z ,b R  - 6  q D V W Y C=Uh3O  v v c [ 4 ) UY%, HMUY im#_`'(?>onyxj k   { { \\ce   , , f e  ~ s r   7 6   U Q } y +-bfvy99ukjgdc-6gjkfW_[^THrq  1 3 E:%#88|up $   @ I   n n / 3 : @ m `  J9B:_i $mq!&xmugm|~%+18gi\d1 ߛݔݩܿܨdwܯ۶<@E`7'>4I.J !1Brٌ٪g~ڽ۬6t4_ۯXqY܆(c7Ah.1:`܃۩-eaڌ LZoךzرؿr~Zefiȶl_B#2!Dͺm9лԽWʦʦVр8׽l53[ejh ' DiiD! I! #B##(#q#""Q""! Z 6 Y +Wo9( q}PygR5UPw`H.?4X.  l e . g 9 O N 3 a dror A</PS@9L j C |  >4+>oS 4!>"""E#5##"##"}"tj][G~>| N QZ%kt"% 3_{i  uI`JXWhJX!SU$   ^ V e _  % ' A > $ 0 e V d _ <K  G9s~xXa/5F:r~&0\^md.0(*HJ.!me V k  * a d /2 {2%AA bQeSe[ u n   {    x = @ z z m Z S R K  0)CK%7|xAB~b4$$9%=#6>"/' ) n i  mnyzjgqk??iu,VYC; ]Q}y ' +s]D(y1$!Z^IZf/2@ kva*2M_2HX"nU/S0F{#u&3s&dGݿ܈mܳ~7H'ێ<ۄ}<ܖ WPݔ\u84ڃ۷Oxkdܽcq_06ܔhr/ۣ[ټp}]vJ KBӛӆH͏XΕ΢|.ɪ^yʉLȃƌƘȕ _A} :´”VKĞR͠:> g;aV@vc+~kJ^q6 = zjg/%"!! Bc. l  Y ;7Pp M -&gS5J<0sh#0 =p}9)? e}6Tr p q  v cp 4 \  xC;j_>i_R~ v  0&<6v'/* !""""! !a b jbqjL9X<8 A BKbrKfVR-oj6I|mC0~b Q EUN].M(/5/%R<|mHR=5 Kd|W c c oSc. ! B  Z @ y G | J Q Fr<V{JxFKs;U)xs'm_PxNVHdRN  z h ' (   1 ] l *E]uFI} J 5 ]  wd]uvIn@)jXv@xMu$  + l 0>AF,k~w[F2oDc$>\' M " [pL' MR`Of,|G:-T2rTA*n N g   * }  Z ) q F ?Hd`VW7Mo?L~b>? iQ|RT7Kw}PVm>TiW_e^rKm5޿`[ߘފ_gpi޴ޙXa޼ݎޑޞގppuiޏwއݟ&jV']ڃْ؛PRצֿ mds΂aSkv<*śĤčٿ"M 8n޽5J]Q~xʖҏҀ{Qfߦ;/x|f ] "fNS"!T!!e"m##2#p#! " >[ 7y 3 W+#K{XIQrd{-%wJfeA  k 6 ] < C [ : c  d4f?0|Rph.,W>In R H Sl@'z }!!"s"<# !!l! a w u ~>tTTedB!+OS G=O, G W @M cn/!h1=%heKUF~hv  |mfIn#?zH 8  q ?  Z t f + f x "  !@ MGU35H RtG)BC U  w ' d { q  #  d j  7p: BW   [  'UmZ9x91!/0!h$O@W2# o 6bQsrHRL36Y)[TDp1vAd876 ' _ R kd@:G7stag{g]}D5HZ~7   ? I 2 2  )   2'E5 v g ~^]*%B?[\$393.4%.&  v]  ew4CUj$lrw6 TCwuy ` m pA*}hnH 5 plJo= Q d s m x -  {nQ`M zj!a~Daew.6ts^cM@7'(ksl y a q E \ }   %  /3#}n   #  &  }!2CIZ`:;XOD>QR_`xy0< \Z)5+90?%.]_ 7'. YU@<tKL .7'77Zovw(%% /3j g  \ W (~JPggygv^    "  W F   ik=Fv?Y:VP1.Z2[0@9&X2wDl5z][~$tޢJa ނޑ݀tt3ޏaT~@?*s|i5#N ;$߳߼)(yݸ8۱4i׸ Ӳx_о2zqʚ0fz6ƴ|dlļqTWk]{iP#n gj΃n7Yz Y 3 -  ##&& &c&%S&$]%#l$"#k 5{ nv} &rEIXdsSFAGZ^w+G 5  d I B  x J L ; F 9 9<B|N=c) :  V c m 3 g? """ #_"^" 0.4@VUO=15$ [ V 1?MW9+ZY spgQ8CxuMUXXP E =@q|#n ";I9ou|onu*4L E x R a "/)\_mw $ . E E m a H G s y   $sqnbbX+n\ 'wIK14 /9 r c i 4 3  y  K e G K O J ?K73(&QvGObVuDJ E = ^ 2 GX WN&&]@}u@im%BA!$'"Zd&>h^ f \ m u `eOX G>H:`k+>v< P u E 1 *  + & E U J G _ \ M \ x s } S Q  l j f ^ X H Ta IDaTW]#-+&NE~"56RTRF ceyq_V7/gjQW +#..--zߘߞ߸ެ޾޴! ܌ܑ _jPZ79SUҪѦI/# 1ic2& r Z Q p f y j   ) 7  rqPJw~ / [ w ICG9*fa=6 !"+"""!!!  # Xa_TiZ[f4M%6 Y N A;DA[Ve\OKRH~oe i  2!QR z|zpobWC < ? = c o PXJL 32WVML7 0  * - ! v s T N  s|efelka^`siOYz;<( ,    t } } s e w u iIc?fG?eAhFB!K,ZAi[M3gT  $  b A $  B8| &}`w,GQo; T ,  A 0 c , 7 t o + ~ 2 w 5 . k e  Y Y k 6 P9ztElzO  ?  b;Nm-E F [ # 1 W o   < O Z  p  ^  x - jh6&: LN *`Y%tH^@ 16o)YcyX|Q,$a> Jrxb@>R$ 0{'_$ ݴޱNTܡݶ 0WGڷ{z>p;`و9ٵ׀_װإ?b5 YӸ0gPJtE˫ɉǐ;Š;>>-A=ÉZϔGժܤܓ{5a2 ? \G|K ; !!`"#P$#$#Z#0""!" t VL [ e)V~[`5!wJ6>.syLZc  vR FlV  } g A UYY79c!S!"Y"[""!! E +6| +py@LLWpcc6 =  "$ `_5/.7bqt(!zg]+A Q T  A<6(YX2@ju:Ks w F 7 D 1  ~   9QwnR9< ]Bhp"i W R M h+}+47RN\tA 18r@7$!-Xj #Py?K"  @ 9   =B I  @  A F B?~c8LE)Y2e pd E v q c y F _ @ Z Fmeiw Gq) ) H 8 X V  A ~ ~  $ H W ` Y -  - 5    SD?=!'QN"7& }Z]GS"ldHZ$[H>qf kw s~k yq4X+ N`eY/> - o "  YG"#`m<YL~Z2:Bg_H)VR 1 b # 9rh yVe6*8}DC#%% _ * s { y PyVYxiVj<z^ q Vp 8 q  Y n1y%Ct Fw6o,mS /:)qgV{ET( + U~Wjd~d\0RHs)s;`9s R'sol{n\5, }ߥ8߾u߁hީ޵}ލ޲Uݘ'_z۵ڏ٘46e[إz_XֵbՎjhУ}·*S̞<˩/yLn˵ɘ=͢ϩKoX Uf^%$'  "*qZ{0N[ S_(2!{h# ZQ u-\J! =kc1-Ho4Ir]J  Z9mMXAd O.FD7  6mj5L>$Eo8lJ'.-&EC.0D2h)/ { & ~ *Q6~8!{0KFh;|HiGK' F 0  } B\cU/omX*9y!h  O j EK*5j]e"+*HXd1 "" lm~P-:'Z@i!5OmmcM<pH=Cj^UmM $3qG!dtM 3 2 h  ! 3  '  " Y S / E {5)[J)[F&1SVqqm \q1_.1z Gs 1jIc`NH !RA5 \vq^W4hzI;+.UC FUMR('E' O,Au_ lz*%+1})Q/R3s^P 1EDHE.B8gGG,D}dGnpDq F9tkiqV"!F=,oNU[ 00 #lhK3,bOlRdw   a b  S  2 \mSo*_t S%QI2y7m e y Ergzi%Zk mJ-xv053R@mypso q * [ f  u 7 b ' j 0 N U  W3:;7tUJx_p#9N$@yPJz> F2`M!rs=>p_WS |3)?`Ph6|^@Yp^)w83Utn6 14 b8&0m[l,JR@SGF7il4ޜ݅OQ#~z8Lڊ۩]ڐْlڛٖG܎z*ޅQ;6.#pyE+ , qxXs: 4ACkrdXr v}[t5F"UdQ7&#s#8A: l#zo0]aG f e * 'q*GE@V>  e a L c  G berK U F O  | d0M:MV?.m hiLGl(W z J  e vV048tnheRlEQ|]?z   u >-cgcW5r"' h)f0y.}f5 Xk;M9<pt"3VX# i fSP,Z,Vu:|oXW#2z l  ?F}wSK-()$ /@}~tVp`U[T1d(G1g  $A|Qgs Dij.@D&^Y P"&hm6d?K?)ZturdvvG!0lV0h/-q 71N%` yXry!oc)t:R[Tn:g`w]c]541r4^'} KCBB/+|DBXv@cr]E9AU-J}0#P]scQN4(L<[TCSip+/vN'!d6FVUaRH ^xEOa<5O 6?/g(e?{Ia$t*t**0Y8%b=4,P ) +k\<6%.ItQR9\db^kuT`.lr?:  Te;p < e1  }::~ {p"J`w jf-5j<-j63Q)pn GDw,G^oS5rHoMGY: cKK [+U,% MOabR yiz>1E'R=%Xvc"23}kd3+`}R5%0xd;uxn=,XvGP`ySJ+!SC9.>I|<-X|IT).;nn!tm ;cW>nk 5eZ_H=!k }+N!l45P=ox`xy[v2(c:d)b9C l(9` 1 S z ! &0I33Y {  B+P Je6')?<9`A%G`,58J>b3%H2bl  # ] : K 3^ s    k U k { & ; Q o  o  o   W e   V  6(ZKK C w G , 8 X  PLosS@ kqnv$LSg~I5^1nea 9 c o 5#yEc=oI2O- '  7  ` 5=s5au\O!^;()762{HP+NAFeQe :_i, ]S]m3nb4Y_)>VD\6l]dnM#E=G,/xtUVb_bE`Y~#,{!*|>@|e!J$JB)XPj#Of5drHtz7"nKfsig_I_c%~pEa6vmQ5B;bp-VCRE"0[@tIZ;";jMr 5{`lrBH>)^F"c6 +wi%uY*MA$7MG<?rqW*)iA0dN+E}TKmQN/HPM`*G|^W)ct4UQ'ec1!8 1OYh'DXKo h  1 p m VK< o G  | M 8 T 3d*vi(c|No|A[,_5s^>soIV40.{ju]p~I7Yh:|Q7W ^ R  h &  D 9 Q X ++kE`T m H  N  N *  A { 6 i9 ,~WF{C0 "0"(d}M   9  l y < ( y 0 c f = D 1M7^Bzhn] A A 1Oa:hr-m[mM3jV=@<`uEJ K.47 ~FRXe=UpMt:'tolk  |FR*jIM#wV\[&}Mi3J"4e[RRx6.T&`wM JVi'+j@{V#3+g]AFiPJ:+!5A!5LUHJ<5iiRKME}h\F=4c[_M%sCCn`lQSK>gk  a#Bav'JE Z_-Ta62C@D P'A  PMZSt %*wei[bjk? "%*C!yavi9?]`.8yh {ju<*. $t{V| SMM0<-+2 nY1M:kYflmj_l =3hu|9RycE2&66oo 7>JtkG`W[8:#&jq yF3:&$`enc p dHd=B,tu_q:AG[csi$*PCNBI;B+()UQ%Wa>1:? rUX_J}ePgFS[o,v^G?%"1z!`r)&Z\v :9dPu#?'*oty:6 4 xm'+H?$$!WP;E:RMPX$'.o]pg(0EYxj}^K@GDzvTL SU  )0SSz@3HS {ap9B )7/GN5@ES YK<Ipmf_13{Z_`F+/-?Y];T)+02fB[zt0%F@ )IQ_[:6LHZ^XY z~66wjXuB8cZ@O5()(#' 4*X[am8:w  ilk^PAy{{TY1e[ztu14riMHCA6.8He 2%@: U`ABrnFOI(uW_=$ ]dcjE_WfweREJK &xx{ rnav nq FH4 +|l?2]JngXY@H~8@ rX1^]rmkm?H)Bgx" RU' +(0 V^12BO\IFQzku"'  E Y 4 -  } >H40F4m &Scrl>,|xTDk=LFV\lIbuxG.e De"/%Q|[[qZQTplnLa P o u ? :  &  ~   z/ 6 = D  6  TZ@ ;up0lB;ZX+bZ&rfapqn`vKPeLnjAIl$.54 @\Y9jS-  O:@E#9d <aV^cx+)%* {lUOdd*2UG&QIKa 3$2.WM&isvmo$PA /20)f[|n0A8IVRZh'IJqND~CM@QiWx.:!;Fhr)..6jhaK.7 &( _b$) &$ qQI%. T c V b < - ~ g 8 B #k :1LTB0vv4I<- DT~|qUdRT@8V?p z%,}pYNuX82fI:H746;V7.RPmbKBHe29 %i49=CjdLKki 1,jdzABu]B>eTKC.1q_FJKr$)fchn>9irYQGC #,nw ZYy!0CND8<jdhp %]QLc{/43*_HYQGV,;{o21mm2&:!JOj}VYoe`uOifaALYf%>CKA~H873Ph*0p,:UKZhzs6D|xc:@ZNE!'3  B ' ~ m , R z v  u [UHG/":@ y3d]9>`v/)B>J?1 *+,0ENmj}k7Adw51s|z|KRcj--~F10Bit'5&'8.:1E4adt{)vNGw 3;liMC^N^RLUR^UT ig DDvb *7':-B?KaMe).  djZQX]:Aaf"50(*%+u{85_p|qeXK{Md9=31 LJCH )+>[nUP-  :CeQ ^k"#--Yc>DG8dt|#ji<EJ\DA;JM^:E#MB`W9.e^_Q -*=Nzi'+iM I[,9wjf^r}wHGUA5RL&*VX|uDfogYnsf?IIX?B.;<6TZgo}$'uF\:K#o .LeF-\dYkltIWu" D;{z{{jvsp zti\[G35;>>X\!+Ylymz -1*' gr/OK&`^U]lA<gvj  QPNH m#lx4/"><5OOE[!TG3= dRiX BDUdV_R:kc++J#*?+f\j\oe7 u=2iSRKxcsfR5A $}/2gH yvRNQWu'&' Zs& g_scd1[ -NDMV:B~'<Td#Fo(rgJ(q%;:7PEy(Q q}+9DL85eRaQqT:L, s0+,fB^f:BQN<5 zahrdi{X# TY%n~x3?dmrgJM63}dKHz fT\SC7|g^FB@uzod@ !}y|kel~?/D2UHafu<Ot|hCg/_,wcx2&(1':7MSg|c-A# isYYliyy _\qQkFu~|<9M[>6nGqZy xF3Lsxjl!jo $3ywFR}&&CEgv&ECIR\tP|L#Ty\kaK<%.3 7>#()"// *:?ju|ZAZBK"+~HMCNJm.)F1^[Lkbgx+1 {V7_HH< bo;$/*|(5MfXlf *!8\n{})\m4={$+(;,efxzUKbZF>B3 ]8)|}p 6_kQur+,KU2UG 3:vbhA$vWy?C"%vi_^p;R[ D_.:1Q5F+K4|`jBY$lRB2EV aOYCycYRNK= 1r`~^^A5{hH [5JbtYzP= ]T?& {ls+k^_c~znrSb:=P_#sb>>c`ZG" f3rDYnZ+.=yM|v"#un >%J;a\nOS';StJk9YEp'AHQXe 5WAnGu/'CTC|TgQ.7(=k~ Rrq3HX\ G>c`!:*<"kW# lYou K*cJ~o~nF6I, M1mY,*GRtumC~WH *x GQIBD,cJp1 mUN Ts),JcT3rl5AUO1+TPsM9@:TshoQ"%,= S-{=E"t:;;j7Q:8l^\hKwIleQ8d  \Si[? 1\xB9PTn*,~z4./7;L7$HeDY" \;jM5G1oUF/.&qvhZ`<f&Gt3{eWZ8)]PZ;;YU]zAh?)\Z>/}=>6S0`LFVs,1lZZwtpjto$e bnp*k\ux2[a+DuAvcm7> x J ; < | q " ) A U F q H   /kglZ?7/ 3,{|m? uQ{RO>#p)`>Q|)-="Bt}f[fy)d-dz^k8$NSy$kM3M2_B+XS[EuX|_6 5HH3du9K@}@d?pWC*iJaYm5,( }B[$20+CPBb-Pxi@/D2+! /RW{xhTE :`2n-&Zu"EV{NHC!I% sz 2;V+bGNW"k+_$l0,f |o\r1#X1uon Bg:z Jg)F&J,FWSjL0 ls(A8Dx)>WcY+lDZcD!='n0x-u?9-=78hG1cyd} 7y- rR&ClBcd=ot 2.3>QV@2PgrL lR0M{Jz_@O~NuR-\NWi0@(7 \JGU2;^XmD\a7!{: g%K{*$bPta] #wd-nRaS!  Ctk)2G}mE_G}Lut"B!R .3/yr#X9z0A Pe"%w97<:1&r}IF=-oL5h*JUmCdJ\dw:DH%Wxo S6`qQKqYl-1y|YD?/A% +wx6 "}FFQn HmJ aGXS5bXX^n~sjtrT~*7; XH<[&|iQZy6O*&p+(r;.JG-K`fu$ w:d z`*p55`,i,z0tqO`0 -Vzc@m7M6)h)v\r;OAY)]isXgnNnQ._*7mw$H-TJ%?g-htM+9(S=rNd P2v/J<:oWbt\rSm3\!nFAK_{Vui{wrr*dL le!L,|jm`" !Bd~Qq*A``~lff+BRc1%|#v5r 54@{M41Z& Z{1V6 n- V}Oxw=[~'w`I?mq<fMniCL!!gX@=yyN#o@jLb]hf99)L4< lB9tR H#L}*BIa^Ck8_y5AqF `4`z[9-vM; jI%yJV[_GS"`E^MShtgB+zJ6JbNmgmGfhl#cb'}7}Hw0"KLWU[?$6$1Wv$hO +<ol`89 D>3B8b~G& 4g,VZufx)E;k9fFM~ YTu-P%TGe77 wg% 6U'&L8-Hk .R:z\y=S "ER21J=D>I@v7#`e.3/G:R-O3k&"t+D r%md,0_G6-/'3xvJ'[Zpus|@]6],]9R zVO<;!&2;^_AP#+Y87 G: - l2h[~8 0 aQ2K8`myk` *y`svZYW42ek4sdD`gXLxq]e`l%4BX6E1>Wa cavkbI{e *5%_O$'`m'(2#>h~)L>Z{Pfz\n@[rI\!:3sfORNP ]J3F[S]\ 8YQzPJ^d1 2H8z{{|~:BztPF1<D]ge 9*>AO9Qu Ja<$P(hU{v/PTfq=^7_?iN~xmpkTf<$\Ww_w]Z>Y[rYvSbemSa ,;2PB;IQeXKqXTjYE<-%OV &<f\+<&! ~WR/\<6yINgo95R_! /$v^9g ^O&T4cDxYTRqh&/"'4 !99jbe5jyf5'm]nHniVt\{|w~U`&8jd[Hj:X, a|KRC:F1,E60Xqodo 27 py  L9SH""ky5H3>k!]j3)U_x1E6ETBk WM8D:,;N?=4"h{htU[(=?v>z5.Gi]k))<Gz{nMA6 VY#1#@5;spVr#D3C-+cVo>d$GGI9PQog.1*/$.7qEo@gVm$ OUbWvq6*MDdf;7JR2-.*&N[[[rhs?;+<uyjYDG!>3F***$,1PR]I%$3!?L^lM8&$5?~nl$/?dMI]tqaOryK`NRoky{TP~YK32gt(~kyl.6,/50swmh$RVJefofeRL\ly73-+0<@E93 }dW|iA<cqkf+> sptnGQ7*LLntn[B6QkSN t>A Q]ISYf8> 5,iosuTS.)mI=zkv4'a^>MWhQU%(Eb6 6@M]Qb$0QVnbaUxt'c[nat%cO^S&QF2/IIbfgpipTZkrXa&6D&@Ntp hpJN MP}LV +2(~sc`;I8<xpmX[SYNPecJR{g !#  ')AH45HKKW:7M<(%,6G@HH1B28=4"#7AKK>7?A&.#%2: ,8"%  00##<EXdNXXarsu{t{~fe]`PVAN=P=LGQ8F%  pge]ifZSK>QI[WMAWHwhbWc^|} /=<EMWmw{ ""# ("0+0-95?7=2*" emYhER(7(#+$<4TNfhiiwzwurghHJ>?02({p_W9;02  10GIY`{("z~wz}jqebZ\]HN/:2@.82;=H:H6F2=.5%*&.+**A:PNMNRV\bgili~|  (%,$  pt[^U[DL;C8<9>25!$(1$()!$$.';5A?76<5<0?:B??6KBFF6@:@INWd_o}wuiqsjv^`KJ/0"! !       !0?KKQGMAM?OGUblwz}|xyjkqq}|r{iffhpncd[`ltivhvpi]VUUFICI9A2:4:$*&$10G6:KO[bfr{y`bLPFJ;?%,-67I2F)5'%!& &%+2,5;BIPKQ@JBPP]O\BS@SHV3@&31:'(-  / 0'-2 2*=;N>LAKIQKMSQSTJTO\OQPLKIQNh_]RTLfXm[th{o{mpcaXYMH8B9?=15*3-$ %-&DJR`aosx~pzku\iSbLV,7*  !&*075KIUbXfghsi{o{gjWSOO>D-6$)   &/72==M9G5:EM;H:ADA<7693.2!( {vvwyw}fhgfpn`Yf\timevr~  #,0&  /5<DEKZXYXV^U`cmtvy}r}jiRU?Q8H+2'2,  !+,;GL``btnxcf\^=J,4%&          ##'  ycqMVCH??<<;B:C7=4764A=LNW\iou|onj`phoqouyuoqahRZQXY\bbllnpjkijqs{~(%241615467;;B-3"$+* #  #.0$'&+56-+*.!* wxyu}ltbobhbetw| %!$ +(6)2'+"+&"%% }w~x|oq[[?CC=G?;3.),,&& ~vrwtuba[abn]g[bY]`enuy    "&%%&42AECJ::A@GO7?'(! !+%4!"  "&((4266'(7>4=63F??;C:VFOC<=DQ\ieeYOYLWMgr`u:C?>PCZLA@28>IO__iMV=E:.6#::/G4\Wqi]bOF<USo`|QZ.,GEVWRM% -B$+3+"(".2'~okvswUEbUzu~) ')1($*#, sqnhxp\VWwnufZnwLZ>b9dIBq+;ZYrs|yfOHnu=:[`sU fp^nV^9Z1*$0F|/3+GEId:2gtTP[_Ut;4,HZ&9f.N[@2A~en@08622Y5Q4U$(I)}}XS< NrM0"7dPn))5!sd+5>=&%uGJE#>D,JX&"JHoy0O 5wY~ _u_p)"]I  #-#VI @FAGhx[QJ4beuZV_[eu jsn~HP%+ XcS_]V9 & 2 ( =EFJ/5P[} fc   %# `e|} S I EJ\c}{:8V R KFwvhh  q p QQll^^11 WW`bxw `[JI  QX{|zv0/v+ jxy b e V %   }s~=`  =   sX)*rGk'8_8_E: $ L [df|eO3ruV!rlZ\^!yaPM=pW|2Nh[EJo6+U PW}B(!ArB\~S.P2I)(@/T9G>G?[ umt'lD:5&#?RSQCRo0V/" oXUbTJ) 0c|.S01).RSbdS2miynRcejz":(7cA){N 2) 9 RYj$,3~ F5Zf :b"9mEB` qV4x 0 L|=B|nN" }^JWQy:ET} '0r{~xC0;flof@Xez-g.u>oQ,  M0*9J|2@p5b1RJMj$~QI EM?2?X$yY2f2PQSz^bXsxGR\  Z\$,1~hPZ$SCf5;W4gA6$#pW  R  x (kM\O] cO!/U qu\h^9agBmD-7)OsS#5o=cMyBZz&~KI"{ VYQ27T I {WR` X YeA%-l?: t:JVx,l0ivC j lqg\0H  u?SzhYmdOlSD`$O:N HHwv.9Fgk@yL cM9|2E\;Y\GU/r]SoiGT# 3 / L !oMC\xbO++UXY ? xT<}1_;q&I4@eLMF2 o H ' ?H>aJT@} - n i Cj?x^fw7pV^lu=M,r#WG+ Z Y"J } N *s% u eq~iW ~#XXj . 0n\',rw w?0)(o i~GE N={xR Z X+B ' F ,FmyfSM @ ?{G UL

Y8'm17  $`.8ea` o^,p{{& Q [!_bxX?e/+va 8/' oA{b R \~jZ:Z [0SAH ++ R u !> ] ?P*Z}F Ss} v gd)8u"#QM~y: zqQy7  4X  \pXUy +S  - D(Y| ' {NmEE;1I 8 3 NGbU6#GRzDX}#el]EMid 3K^h!*.|c+\Jjizpb jk_XF`X tM~x#Z s w L uKllJ!OMjz{ =; @AgG$  _ ' #TA{eRhHK }K &!%&|yuZCZQoNOUX:fM, ?-0Z3q) x q-Y-  E8)(^lxe 2pAmhSy:  } }c ]hZnJ' 4p[ x RRPug(  6o 66\ /9xH2wC  [j9pA}l F JCyt`jbKFl95EYK )-) +Xv5/Qz&\u 9 R0e}h=k9Qs<{7e'iYiq/Qq U"b"''& z>' 1BP>d" N ~aXc"KI6cSu* + L ^  ,3F%+ U>bI>"**&@$R,J8Zsx @$g<o==" Z { H  Sg1[ZhN]P8#6H0 ~SeQ->,/T)X`?O)RCy{:L 4&K.^33wdEhUHu9X3*V+d\>6| [EgZG8_J ( : EE] oeFd4 N t #DDybA( &81M`2g :Yc qLf:Y@  &D  t NB ml#r|n: H ] n .3 iRsWSP  ~LwV}Ff<;|l[8'UCxbj .E|" # =7PBypWZ:B su A9_T2&BK  t6 W "~sxdC8{ ز*=Z ^ <;D?90}TQLS.::9PFWX_f%%rۭۼ ui  %erS]sr}  6+   a \ /)!de^d  ) %W_rrYW]as6ECN,- ! & $.1Acriw#$8B"1;,5bb%&22  8;vs|x76KMrt[_z{    kf*'jl DE1 1   #$QVE J UZ2 : 1:QZ% 9AT \ OY)3LVV_elELw~ W ] 10n m 22MM uy+/"' ]b'.nu @H   x3>6AIT7A' 1 )25> e m  nt16$(     ::.- EB | y TQ ts-- +,LM#$/1 Y]qu@EX_V^y0; _i:E |$(49Dit % NYWb{ * nxenDMFN 04= @ JJ86b` 0,A="edZZhh -0X[/2}~fg!"  67y{6 ? ;D+6  _kuQ^^lIW"s ;H&coq|6Bht(58C .4?@RQPJ   {{$ & RV~9?V[}vzUW23?9;4%wq<7#!dcRRNO'-EN.8{ ! .=/=v _g  D H X["% W] \f}HV-2kf)# phmd4,RL/-OO8<RZpxliB=og1'OEg]  SL|1-uu  ~x :LMatۈVk$ : //#0Ar+8JTST # " ki~|BN%;Plrkay#vW^|~( ' 86ST 0 4 CL"   nwsvD A (% #  p n TSxxvvnq  (Xc $ BUdz+@4D'4DA rfH;;. E>KXId pHi]y}Wc"( } ND{ne Z 80le  opcd jj'&uo~vWM|oL=* |qk52  7CWb ;BpsG B cZ4'UElWra}pyC? +>#B"  ox $z' p g dgbgpxnz &8Yl.A itSZ ="<"83~q< ( 3E7||5:.C0^y 8 }BY  Y ^ ,*50 >8] [ yz)+ns~ ZrWo$; ]jSUj`4 $ U@I-fGNG;<mtNb&?!Ut|8:T*kq?0? * L7utp'&st69hn< < G G 0-`[ID61x"|s {r{ t ~_\'&!" imlloepXC6  W5a=3{_n#usIO*/ + (4_daYoa B ' U:bIzg98^`cjZc-: eu$3ivhrPY ##}mcM@%\T2Ep?SUb ?8wcU;+bUxo72%+gtvX x EJGG  2& ?u 6G o1 )  [d70h M dHt {zr@?Y_ {1JP j %8,: OL'L>t`qZ i 5%-!8< GPTYGIhg !?/~ { E < $:5 II(*&_j- 7 PW{{[W} ]94!JG _ti# > k'G<R SW%"D5 . $#))^\SQ!*:$3uvfkzFT>Ha]! | !a`QH3 $  X b q}@G,Duh 5 1 jyXxb tN\7 ? . [ "<x%!  K0 { W t++,8 oqudj% P JM0)WT /.[aV t VIp^}0>aZ ^'>! QKxV %VFR N`Xu%!`<p|is &B!9T9nB}]: A ?  a[iGf8po=  pv.m Q EQ  `1bJ :yNGu=]jRML$uYlD(mP!btN l+ 2Su6lfa(qaDzzR TZ = K L>EG g6 }sfu_~Q Y U^ < b [t*1@7J  )A9`AX]3n ( [ I 1p@P< N  4mi m 3R C3 ifz< 5/y%aSQ L5?#xPy9K_G [  4xT.H ~ b MVM4|\VL/ p D ( 0R I9Zl(6'fuw/ x @ , Z]E8KV'Xp$,ZoVWo p h _57Kn0Q!p4o5'Je >?p%?E K d z @%P F y@@I5EMQ)<OJ sE +:3 . $qYFtF ^ j !{ a MncFBceDb $lQ8bEJ4c3I 8RinhDN o t`}Hw J lr$ \(1zJk O?-~#j h:o R|WU)tLg7> FC)e5t& !K,2 \4vBVr_c!-/)gw j &i3}Z8Wcs j kR:  + ~ MR f;P9; `!|VR2@9ln*ao3.~ -U~+i5{e ~+KcL4[)Tq  :0y}RI . ` (*X>e_)  : H_ 3 mFjg$ <7> x"k)x"d*1yl3rA-tt+  i C 9Lm}y>v 1R =huD h \si9 }cQ;tAl_ t S ; $wO*,C6 +N"i)U%:?" -U'Qrh m,H%nTA(f`{ | [Ay 3 0Gphx D3Ffh}Xx[!lqE[4rd~P 3";lIQmcdLqE r  *G >w x i 0N$i2 2'&2Rl  uQ5=gj(}8  >;:/p  `8em /0L}  B `H )]w &0W{/{ WrXn _ .l\$ X /j[B^ ,  <[Ki cYs]f Jb"}   Csuar ]hV_O?F8WCa`M b+~k Vy T@8%C \]tu2kVk0P B=2wT"i_u SvU~ D6Nyw?n$/z{v8!u[0.z.)W*3Rvk^1=NfMX!$v l  rB- *hNc _h/PN*F#78D6 [ k GbxR   n2 z%,OK 6H E6#0%SyvP<h%*c*- A) u#ODqi @`]7S |!&a#O"rWr7V`fq^ -\%#U>F\yv\F([  8?R6O , cHC/~ p4C  *+[nPhfPKj,2|Z^d",;Q?BQt0vDdH "D wr'Ov] J 9ir u %\,&m%q w]-]%rXhV 1c<  9 Dg weNfn~*/jSf8/zj"5 T;_D*  1,')DMi[6J}Dx /3)MOX zEg6  ReD< ! z Ka .HCWh5+a KY1eIhG _;)Cwb d(^ y}"YO'83 D? w V&Sy U5j*HW  ~ZqL G[1| y,Z#J  f)\<Y9 &\ug~,tru"3av R Q6s$V7 ,  J!EqaS ] ZUl}/&|i2 ?YP h{cs8 1jn!boC=O~JB$Z?T,_GJ,7v b/d3}v , z }td q %83MXr"x@U# e A 8 9SQ$j `L#  x Fvy }(R .  )LEnB  8TPVS w B\V )^Z]?BxDM[D1v  GjSGzunV2]@`{tHHGb W8YO>_ ) S>D >Fߊ1cgXZ u[9}% `&Hm W7M,W3uG4 U:2$G` y7M!P5jt v V >xl{^B9>.F ~ # !X Mr ( (@9*c^k (MeIs3E <9Vd3 U:H-P+ _ \& 23VYd2f5  j YexM9bQo) W ? 8lJ1nJ j \G20y) T_io`& O)xR% #tJZU4 >G,vXy(8 | b?swM k(\a { QN [ g(u [ 4 !H: C0ou!L BGjA[9Y9 Y axW-939 D  z sNF0x V lWZw[8J ;i_M/-9n,-! hY ^WI;$J5+=R1o yu/-//>Ns KCrv{k<`3y[b ?dmvSI^{ O1b"  }W}eC-I C_R:Q*]V I 6:.W(Nh $iV/1L _];dS H 5D`LMg{{Z/-`  2r U"LK 8 i;ot?!wUEBT 7XpLlp R 4aw{ f24(=6 M  !1XXf6 =gPu GpsE%B}C4+m-n= ma07OJ C'j  /]Uk0H  2@@IY nA+V*FpV#x!N>;-#}B".!c?m 8ylXz }j%O t 6S++ 1K 9 d |)Fx6:*c P  *y vt%3N  W@ HI^0jL^tLdDjhTQbX [ k1;YyN%24I g 93!c  b +7MfcJKQ yjPv2e H{r*+I _  +"{Ha5/R. "* ] eCT(I ['C`i'G 1%0418H(de0 r2d5'[xc3LK"NIP- U~-WzRVpm@D*'ab*`fd[0/7 .zm0 (1 U?$X0 %aC2c.< nsj)6].v ;8s]3CcW .b(ABsLUE ` ~x)H  >* V\< Q)(J0L@f" x %Dy@ cF\6N6m6uDA 5gA*= f L 1i(uhcak/0NbM mn h~Hoa'U j8\KZK<Ky0|tI4J"9 D Oy(13i/~ ~ $ ERaZ w v .Dw~ I F \FO6E a}< P 1%Zq6BJATY6gw& ~F GNt`|_=, p|(=h@^Ph-am]0;W6& X @@Nzm2H { 5D):E|Tr d<]Lev+Fy(l7Qu @%&]keF*O8BN9:E+ , hc(Aq?3HX^8 Hi ];N f N w -x[Fy_Xf=[Y 'XHq.CU1UG]T:-%< q-QA"#f|%3q O%EL7uySaN^ZrIB@#A X zB>maTnr>"^}o{6%)fCz?jdNCgC$aQd-o P9yeUh[Fz0l~D=5=ryV_"#;I>l@X2ST2Chjh 8q$dg1-X@ X|XTL:oQqm\&Rk 4J}#k-L 5TO@YHlbve6d0V_@X[-"]"_(ifwJ0 B tbD $Pa'~z@ l(#xNw:!T"xX9Z/!'J\\I-\/jV3<'k7_Z_O{o  *ZNO"OAIpx! r7+L~? q]isXzQa5c)}$o0x"m2R-xf#Vdb,I3!QD9 $ .f hs8 Z,w0u,+r1op5]g.z^R}emQ+ 8>zI<.t;Q,za>Rj%Yw>l d}"?SX.V&tpY*|r np1Q+c|d&HHJ2l H  wcP&, "p^jOZ!{o?wcv\uva |^I@]wJ\(Dsg8<~( U%%",V1 l0pS6sE|Xr/D$^ .}4BMSsdgaOHB 3* SIh=J7V]=hPq/Ayy.?Mr& P?.>P{!^^<&3#(|Ah\v*S L7 Uc, s rR@A(6+!H_joCz1zRl@hSejJY "YNK]Yz$zv\>Z"5Ft lQpGs.):_[_2Wohui4*MEGFK!_d-0TgC&10']'`SLw >+HptMKg6*q7g7pDFv~bC8T\u"N2K+|g_j|XW3?{1Q sI+[U"xNkK9 qckW@El[ 3?0Wm'kE66;xVRL^?TsYHnz{KuILv{ Fx" w@5ypuk_-9{rza36<8# _n?7\Lk^U( Wi8-U~G.u!LW,?imvzXN-J-u4/ _Ki\T`P]v2r,qQWqub, jQ"#@ ) U8^ fOVl]X|ON21O>YAW V;E:If\fk MQ9&|[^zvoi#?1Z`gDO$h>#0jDkxF}m b6aTFN<*v&lIP8WHo3*0^hX_}Rct^# ;0&PQVrih_w& sy4>(*e3: -*w_ 1fM~('pWFx)tznj9I"-`B6 fFl\F+p5t\WVOQJj9<A I[Mie#t%'E3?%sOrsaHR|I7Z^Ntm@ xqoy" Rg'F) w>[+2H*'819NKd 0:T<-!65.O#tP#Th &By!L('E1,+-=6P6^cxA~ m[U\4ZrG!f]>KQEh- sdc 2%13I&[@]Nk|~XYAW ,!\S'>!e`e=S_nPvKFS}xz $# _V`"([o%OKVUELxpkp}~TR jYi{alkbQ'  +xYX>#fU_q<Ptph$~^ J]j{v{b$>->pBt'3"mqFJ!cnt;?Sf.>^\P3yUIz(M<-%L9R@w (jzou!#E53+&!_Uba]mRjcTFIZNJ=YRHf^ +CN:=hg\O(_yy0Y\>QicM%Ndaj@Uf]N7|"bdx~7=ET&b[Xa%4ofy"s`PL8D?Rx >/%[_!=!11\Aq@>ll6;xfog  2>,$cs0OOPE&,$ kiqg  @C[eJ^P\t`$'clPo!$VI&B ,R=aTmw+7!KCnDa2'8G+&85P97F@5$30J?7+# +:G]mbh~*W%)15 MiAQfPiq~*/$VOp2+2FH|pIIYb[b=@ &6>'' (9OOjdDH\VQ`RN nnbp$, Mbp`ez*~}Y\ikCL|*IiVKg7Q#6.&:-%{ j`h\ *DMc'y;C'.}xhXbSqsstyeSUSovgX[x0JS]k$$,(jk>?FD(& $-LEb*6 _cMi+C 3Y_hb f^98;B)?W]<2syDE." yeM6<#)?or='bONZ2B^`xF>E,g~o{*/ <3?E%/@,80<EzJCm|g! oV]r4H0?9??"xn>OIAXdMdYa_])2<EGR"41)t}L\Qg scwp  +*/7  !!QhjuV]0-PO }  9>FN--1*.!#CILZI`/@*E3b^Z[FKFJjaveSC ?U|{hc5>>zt``9-F/t@@1-or BY}wzgvgmaYA=<C?Nj~WL#I[_^' JP *Cza^,A?fPD`4-;=5/SN   ROPW {$0>ENSCP- _bx}P_*#!IW^pfp@F SR"3"EO KJ=6"HB[H% hm~}WUx~TL"KAFB  vt01& "#   nmD@]Ror w[qZUx  .:5Brbic_kuvp}=Bad *_`ygOeDe1*8@,9~pmyuci]njyz .( >A4?}OG]U503I[miyS[38_iu}id=2& ;=JK:=--RC#yv>K8$QEOJVPQL<?$ 4$O>VYAR<G-*'=6/)*0V]EI  62uhhs @9ZM_Y]fYiEO)! ,)CB$!4:74&.P]bjSY$ rk!1'-+ KHtQEI;7& ;7^`OV#3*67//++! 2+=:'* ! ! "!6.  |y~vruu{qs} RJ;:{[c}25"-KSMOw!" cm(7<$ ,C=DD;E]nhp7+1*^[:A(phu]H%'28.6!,$   49-1!)?V%9K;OQ*4hd/.ZZZU8* KEleHK '%5D <6L>! 7-8, !-&5021 6>`ieg-&*0*;=cq_Q&! *-b\c]D=*.4Ii~eW#bbuw]]$,2)lW]QEHCNjy=A75dl]f) D>ukzjfVJXIkb^^)6,ZgyofS@-!  $TKkb,0eckx$*IA8(7G .r HQ13 74g`oa2"FQQY=6M_3E[^-111 jokrfhce/&#w    -(@#5 &)@@NK[[FG #NYWsG_JQeYjVK36+c]\h5D#HFiaGJ KEH^E6\X21  D1nrv^fa^``NV.;%8$+BS~hj*2  *)tt_^  4D70!/[nmOax!lqrh*+,$0$255;LKQL" &9B"' '$* #% 1#bl6 }rA0H34'+=YpTj#105/4# %+,$"/;<@",-%)  /@SVOUcj )*-N4yvw "#-CKW]:5QYiaC? ,"Z\dn=I5<[ltswZR:. 9Fbaqp_d:G*;/9@HOM5/G[r8)-:CNLKBE@DOQaI[,91zuxI\&-  &9=I?>89KOSTW`La/AQF+,kfw{PS;6 2F=OCG1,$A31# ))& ?AhbY[)"1:;?;F 1 ,'EMZ_R["1,(%&.1AAN:@*( "-+-35.>"=, &,TZ]a42  -+;>26!:8A.2"!%%5-62 %Xgeh9:(3AQ2@!&  "$-+.2,3) 2M6D% '%  BH[c;? (2!2 %)'"$ " ,)alqy ! 0*1002NOHB2* 0(VIMD&*  !18K;CC=;( .4VRXUDA$"$UL]R23#c\XW(\emv`b?:'!$$18+9#0!/'$4(-"'-1OI`VA?"7;ROUOC;9+</()(-%.+OLFG%+",  %#5/#|tzqyxZ`^fkq^hio}uz|  /66:)(-KKWV=F+$4'3,0-3.RIogme?::BmroqGP8CDKDDPFME>;GKScesjqRT.-*!9/JIAC05HQYbadYT6)+&''HJ[Xeaopah[bRSHAZG`FbT_gWegcXMEFEU@MNIK<D2M9=-2'($*,HG[Vd`_bMWNR`Wi^nczij_PRAR?U]htfN]HVNRVdmw}wapPZWXxm|Y[9G8H=EYQpas|v][IE91HFfrv~nd\P_VnkoqNV'099NYTeBNIISOSOTI- '+>[i}a^+,)+>?NQ\ZYRPHMIPTT`XgIT96>/I:ZR]bFX'83R8^Xjru}tykqFN'0nrz~_`A90$72HFRKXP[ZfgnmhiR[&6$=:h\s~lebPVGQ\ggpgq`hXZb]cT`P\WX[`equsogZdWunpq@H>Jfjyvsy]fFM=JP]wyb^JKABLOYcTdEY7LAOdauqhKQ6G6GFTdlmiMJEBEGKNOSJRT`bm_dEB)%/(<5DBGJEMU\nmusIJ%/foz}YY")$)#!!47'2!  ! #"-!'  !      $tvupzqnk\USQnmbhgszltdepdzp{\aYWog\`NWRXns}|hba]gfyyvsdecbh`e]dg[jiskccawo              "$"      4+CB%%    .&!   !!' $=01! +#:0,-  44LHMC6.+#&%,00)79<;8>8GCRT[bZbOQA:D:[QliurZlPUZKXBNAXTuuerAH'*,*>/WAgSUK;@/;4@R]hphilao\h\d_XZJQHPT^ks|sYR9=$/)+/64:;FKQTMO96 )8<JAG=>?4H0V9cL^S9; 6@akenPQ=2. $&:2?4/!!      --<;;=32'#$*75@=>>66&&$"4.CBHM<>1/324654@8C>-2%')35CG^^haZSAA$, )CKnr~ymNI! 2.JKOPOJJA95.5:@PJ[OKD'+$-4H@ZLXNBB/;':,5<6>70.(+",#,78@:70-,   $ )2#-(     )-41-' "#&  '",&     #)$ !  '3364-/.,)&$!"!) '#"0('(86OSRZGK;6& !+.2DEOJ<0*$!'0;R\`dSW27!1)BEFORZRW9=$(!+&E>adoukm^fJUEGMLOPTUWXRTMQKTGT0;$*/176?DDGC@?>),*!5 .-./&  4.SMGG}}utky{xbZOWW_tlyxw|"   /%# )  t|XNud 3>  3) $#-&  "3>,.#(ELRHZOUPJ?3' )1SVpmrle\VOCA<;-0$),MD]TMNKK[Q^\O^EQEE77EAdVsh}~viygl[SK@\T`WseznjigppzucXTOMLRHnm|tkhb_fXeij{dlcga^ZTYSf`rfe]\__haqdufgXIA/=5@AFCLNEO?I?@?8D@?=,$(!78;F9>3*("+&1!6!>*;4>>F?D>>8;471-0#A>IPGPE?6'&%)83H>SCYFRE;5!,3CEYWNG7/2' $  qyoqry}xukholpkzyxt_aU[cbtq}z{yw||~wjbbenpy !1/'$ 56DCXOaUQEYSY[KSDX4JBEVOaZeaRTKO;H&=,;4=@IMTYZc\g_fdNJ1-.4;GNZcdeYSGLENLJF>2/)&-(08<FFPS[b\XUJMFA<36)/05IQUWJMGJG;>.=1;96E<EECIHMKEM9D49&.$#,.7:38;66))+KOS[LJ;;'##*.'-'/(2! (!.$/)! $)#     $'$+,),/5+2"+!,2,1 ,"/-6;-7  !@6F<?9KLNXYV_TPP5<)2CATG`[io[fORG;C;4:)3-6#&!"0+>4@:-*% !#0<JLPLG@6'&# !!",4+<&(vwrynxvv|so}ww{}~lepj}##(&  -0ABFBB<D<JCTKOBD8D8F:D?PM\YTXRYTUIE:6&*+-4<<LJ\V^XWOO>G6:3"&!$(67PRcc]YI?3-  436/'$ }|zw|zpaWHADA`^royud`ZX^\qiyoiPMGNYe} " $($004??Ybiulgr^sdskrlso{vy~}|zqtppqqszsplhmfppzw|mw_[XSjixnw|oxDI' .%<*/(wwmkTP@761>?[Y^^ebd]ML8: #'-C@QEYOdaprogcVML>D2500INO[UUi\qh{urrZ]LGE;H3[Dmhuszz~ouqsuqnpn %$/) "  "@BHJ5?&03<STXIUJMINHUROMYYWWD>;<)4#-?D_asp{swlf`NM<<;<LMgdoi^WMEB>;;28'3.6@JGOC==/;/II`ca]ZVXYLTGNDDA?LCL?DCAL@SESPL`RcROG>DFISONGZZsyxseYEECNKS<700II-1#()*##8/E9IA`UmhvxrodYYKWRflv{yztvkjqiz{~|~iikhwqxs^RHCD;6C<[RY\P^HEH8G7.)/'8.:.#%%(% {|ebCD0528T]`kgtuzzplbD@3163@@Ycpxtp}trtk`cVbiosuv|rxhn}}|psuyqx{  42G>;7,(0,9:B?GA:=5=CFPPQMHFGMX`go`i_chilmrwqurzqx|~{lq_d_hXdLSekqvwytwghmtY`RNIG151640OAIJCMMRGIXS96 }z~etkn||iwW`@=ICNORSffiqs{jg\T\^[`^[_^eldmqwz|gtVaHA><%1"3GKaVlmgppvy|ph][Wbw~{||t~vy  #.57?@O3L,9#. #)>DCFFI@FXVmsn~|  ^]LHNHUPQQPI_YZ_U]IRDGOR4=+&) |woqSXUV\\usywl`\2=9@WWptiiIH?AORTK1*77;L 9 "#-*  &8:216320"#3*F;CC??MH~z|{]^OQS[drZZD7=9jmdaJKZ]zztsu  $'/)%&2&/,7=WTcW]TJGHNOVLMICC>EGMKTJKEDB@EEITPXWfcnckcd`QMOLJGMJWVMOFH>=72&!#7+:*A8MP^a`ZONNUHHF>KCLGHC?6C<9?'- )"?;88,+&"   & %%" &/5*95/+(&(%*!+!.%#++2-1,,3,6713*1/("  (  )970/ '. #!." ',SL>1" &*(9*G=EA-*)-& )"' *):31* "SLWR@;%.B2:7:?81("!"1->:-+7!;1!$ ulrfxtr_`Og^_`gbsdtli_bWe^VKSH[Jj[gcE>D5N9O=E@IIwqs\LODwi}tpkooltctg~| '"8--63F?A31 B1D9# H7:-! YIS@E;KDFHNJTD]K\HG=ZUnaeUbOn^sjbZd\wc_xs{eqZtw~ak{tq{lrp^ofpXi\oemboexjwgtexovq\LK;^Xjh\[\IcK[N=0$8/A883)"   !  }}CK/6EDZWIPLY\fQW=>&'2/1&  !'$%  '(-. !"%!"7,;;HGYLM4H7>@EG]Yc\navp &&14;9NAPB:540HAPJLJON[W\YTP^\eeNI11C>f`c[TAd^yp}dgsfrffCG=?JHd\kgPR2564_WdeHI<3:3;1">571)"/+F<M=1.3(@/-)')>6HC12  +#(# !%  ~w " #0' 5- *)B3QDFI)' F>h\S@5(*6O^}vcT=PLin|t~vh^voysh~zureh{rt|rvW[R\pjENHjntwsjekRmLfVdlrop{zoxUgSdbdUeWooxf}pvdgZc@T9NMTPUK['6-0<:;>9>?A%- ! $ ~}w|  '#:6+):2HEGK7=96OGPP:G#. ?@V`U^9=)*<7E@ED,/$JHRI53 &( !#&kqdoo|qwfeijdnysvgrDX.EM\ZaUZLKBCU^apSd8@(//8E+7&*>8MEBA'0"#!A=^]TRPUklz}ywmtm}uyypz| ("50/"4!(  &"1$# %#      !%""($<-3!D=TWKPQGZM_`bca\aWbZfeus{xjkdjw{pn`wtx{jxlow~xddHFMI]]`Z\RE87.:@>?C5'% |op||x~vfmIMOWijyyrr`^PS;A>DNOLHEGAPI[[feiQ]=O9AEKaiej[_agq{wxbcJ^Opnwqrpt]has|     %0# ',**$+4;01,-((,.84*#0.=BGIRONJAB)6'.401//-21B9K8C>26"%,*1("%*%##'%((&&  ~yqukpureaZ^blUXVR[\LSAJ5?8>B7C/713/,-/-7(6)768=;8<)=80;@TTGO3@9BHQK\POOAH;DGKZ[YZUPUUWVXPc[ulop_elm|zx|z~~{{}}rsrgydzkqeosq~|}u~sv{tsswy}wszlnqp}|xznxmicjf[]NQPNHEUQSTGIGG@C@>;7/,"1707   wrtioijnhd\YRTEI@BH?A:780,))2652-$.$*,&./+3*.0%+        ,)61373?2<>AAG7D:@87AFPUUVe^e_bdijklz|{zqwrst{}|zsqvt|w~yz{xl{qvz|y}}vkqjtqsxtztwz|lnlfmewwnudmlpjnhnglcjceifpopsv}kr^b^`SQLJED>A@@>6>6-&&"#"#!"%'#%!$&")/.1+/+400.22=B@HFEJOP\V\LOG=I9J?G?EETUjaxo|t}swq``]ejrmk}u %$3:0:3;FIKLURYZXa`eciowx~{~  %.458B>B<?@IHUQd_ogtp $.+;4LEWVXWVYS^Z`]\ebmm~|   ! 12>;:745118>>@MLZWRHNJHFIFMNNLSPFEHEJGFCNI<9;8>9/37=85=5>.-#02'" }wrp_hUbTWKG6/% ~hpUX;<(# ohSP44 zuY[A?.,zvkgIP-5~ifPU3F$ nxMZ:I7F-2pmsoqtcjMX@MGMCA=4-$  "& " #&&=CAIJ[V^Vh`b\h`~n{j|yzx{wmvy} %.&95=5RH_]^`sr  4<NLYVbky +6>OLZ_iy~%(2:CPao ),8FTbu~/7BHOVSbRfetjrououdh    t}[`IM@G+1 ~_MH=&$mpURHB(  keME,+ " ikPN?2$l`RD;* wwnh_U<3#|ue^N?6.,hcPJ=7* wkj`b^_KM52 vwffb`YQSKKIBBCCAA:53-2'3)#$"       "(.76;;B>H?JBMQ[^ialpww| !/3=>BFCKDHFKKSU^bimh|q&,67J>VK`anux $&:8SRdj|)"A>LNZXlm++AB\btx+)ECac,(@:bX~yF;XIi_wn (<3MKZVlly|'!;4LB[QlcrckS]GS<F,.  }x_]PP>= gmRY>D,/ (zumha`USKE;5)vo_XMG=<:91."}~urq`i]c[ZFH0:/=-:%.)1'-      -#8):(8$5#8*=6?7?;GDO?O=N@N>N=KBKMSRVQXXbdlhqcoandn^e[a\aY\_dhmgi`]bXodpgjbdcTWWRfY[NRJOLNERC?5' )$~~mjjajYYQDF4-" |nrb_OSDOA=2+ykcX]NS<>2%"}ob`\ROJ@?8&! omggwn~vzh]ZK^TIFAAD@13*3()$$#$   /'?4D?JJDKFNVUa`jpq{x 1.<9D;FDLKTNU[bhu~")73C:L;C?@ERRbhx~ %+0<9CJQ[dcoq|x|-*8084=7?>JSdcom{}!8:BGPOZVOQZZicwo!(//;>RMdViZqgwm ) B7M?K?PM_Yrh}ry "*&-0;7C5J@PHd[yoteyp"$<=NKUUhmsvyxz{pv|     ""$',$0.*!,&,,.02(,%+&,*+.,-//5041311"kh^\QP=94+,& {qth_Y97 r~[hIS&1~efCC*.wvb^JJ*0 nuOS8: ! vQY43qjWM91xtVW@JIROjitr~#')47=CHHZUmnxz} %&.+,)241633FBPOPSV[_^jfxx-'0.8:KLWTb`giln}41B>FH\]pi{q}  !63ID^Zonwx,':0ICSPdZuf+%&-*+D6_Zqw|2+I:HCFJTWuq     *(WLTV:T;PBI5L)CA@eT^PW\kq{sukdxuwlk^hi`|eovbncq|p^P+689VHW=>'7G4"wmqxhVeE[>fNwW6$-% v^uxtEG)K7U3$"nk_jGF6<@>?,",* xtMRKGMHis{c<eHa^le_<6 7! o{y^c  ~l[H^E)&UK}=Y Th9z#|gXBv$^0@T. < Ryh>+oou0F!E;=_&,w48yGSd(GNlH#x\wH^jzj\1w:k,}gAAA2-*~wty~C;}v44NU{%][jcg^xrXK""APWQlo;B#&::idE1vq !" aZVTyY=0EG5A8Bgo]ajvBKyoNEkhIO7) |haM/W1lUtvkyVcPE|\HHn@B%':*@n4.D8kO*a} +az P7{b=X65Ebx1`>x{b^rGq)|NyS1&N?tw97 P99Dq+uL{,3@I(E M&TFRJLF??DJQVtcsI-C)tmI^kwFH-7!EK5WV giM=T6= "G;~jyp(QY4)3biHCnVJsgJ-!VL&3^TVDv|n}whu. xx10oc~~VI^T!\Y| GL l{S<5~^`  wdm6xdbZsxYb@/gNDk'HG2Tn@+b 81w1QfqLO OKCXvxb&6jx0(3Y Rhvi]3Fh/%FPzv>,srX>('X@{'Y3F)!u^)!2 E@JN\`DaNHxF%<mu{A%Ju:-U#J8*2b 9{ /P{9Lyu$,K6Qn_1 _W1#bQnK_N`-JE^t}[ .-m%L j$ X=<Yg]`,Pj[PIp[~;"f?x.4TP 8WLh>=29`o\BNU=Lk^0r`^;q; !7f1A1,U_Z^[cjy/\c Ve q". R*{<g.?hCl# n4 3V5b3gtjUBq!gd^alv 37|( 6>sPW7GdESJWw LXMOQj\V>e#-/4wMue/< 'E HE:eO*7yaocm(`\g1 NZxks"^X^s|WW.;|?K@"rurB7@Qjv!WFb94g(V 'xt_Dcz^@qLN]<.s4EGwK }YgW7_hG]Jhv*F~^oc.Y]>Au"LJ{ Id<8m.fGM U - L/ro Mi?Yp-B|l_yo[O" ;+:Fk  u  "p #mgjPo3P!{fI7#$-,RI  q H.Q<3WH>S0Q\;}TN=ln~*V)CLwh$;6Ic1~w;0idLKV Y 8+qoJ  8 h l aJO#SVF~^rD p  _CL //5z x >.^u x B /G'Q0cV+7IWHmKY~fu ~+ < iSr o X $tZ\  r 0 azmE< ' S % 0 MI_Q3SN>L&N7  u]1jwg{*"n0;a$5oCHiA%offv(T#V<JUc$##S$GlJH4-1Ws*4.W1=4T7 F @ (aA[_;]$!/KR % &gQQ=FRC_@/ C"}Zo5`kId4&cl1]pJ[ u^ 2!B Fc+ fye2 !r}H)gl8OXxiO{BuA(]~u.JU !U<%*`eX8{[0`n J W f O ? x 6-M|DEc~%#NS+8Q@Q|h # ! @G[r R k0Po m  p  ? D / + s]84l_P4s=h  rb (Nt kRA( !6- R/2}dQ   @*zC)^3< : j t 7 Ki t   I |Hh 4'P E^i"t|{ ` G  \rR { {[ &G`L ;[Jzy z Ud/<2} XF4C(taX&yX k 0 9Up/VM<%*H$ _]u =7,* T$ w8 \SJd{z]sq<) DZ6A (Ft  <Pnir w 2jif^a#RCG q&LL ItfIY-Wf2_#n t B?']7 U rpzT0'Ad`. o ; g "7f0x@BaP97 n 0 @ }dV!\z~>rAJ %7\i[,Xkl$Ho|sjnBJiM`/\LqMw[H ;7PalJk< ((( ^5QUwKdV 0 .)D@9EEYvJDEt oDJCS.Q8C@k:0 d:o<8pcyQ\YH  + ]C@fvq )g)S1^] nMI FaA eO  $0"]K{? V K ! y$yw H  @ Is\Alu_@vNRrH v 3))< Y -3Ff NO  # @ # $Jv7 [nAH(f @ b515G^c>=VX}u k Z T'O(N@2s a /Z"@/ M|Cm~^oja# ~ M > kbst+o4QD.+M*u ~ X   l ) -   r_QME$+uMt 6 X 5 ' \n-* , b "=m|r00,nP rt^T  , ) N 1 RdmT  * 2-}go N '  }  .A1fp 4|X9G5o[v$8 t-GRMzk)p/Yo}rj06*)0[vJi#]0\7&#>RU]cC4V}$h.5jfUL v2(\T43Rn|/t8N=p1ow?qt|w]R܈IJXtOj qnQ}}9 M,)yp~Du)rR|Nz"I5~Z/tcJ7ca 97cNI-G/6"J{(Ud^3  =9B !Z ' S5|4y^V| g   Q  *Tbe+ fbCd6V1j]  8Esz5`yz=V   & z r 1*=KE>2c r CS  ' Z  I ; # " y G ztDy)_eM8fk&^O2L &JV^! 2W9"}Qn6*O/ tU61uoI<-P]}ms5cuC5ly%-Q0(mqL-zFx bCP+"5(8_`!&9'Hltn,? Z*chvn)M/IKH_|UA~\1:?$   2  ,m z D)@V+ [ 6  V 1  P e 5 { h y  {  * C  F y 9a '  4  k Q Rs /  C(_3N$  3 p {  o C UBQdpYLZrCI^@ _fS4S] 9&B 3v,*e@ p!A!b +Gkc#yVYPY;X8lo`h5".y/o*fHg8G%&HwHa9~;8?^ *GQS:hCgRQ=b??J^?<|c! w< oN7n   a , k ! { d "  AY>|` x^ Li `H ?) ! v lz ~fa3SFR] ~[  @ 2 3 H  y z V k T  Y ~ x ? Wj>An@w BWp}JPk=P3VX>G:p'X D2Rk=/AX7Z O60oKY@ tXF;lL*"wc:lAeVd"Ua Lgf_ql_)s=FR=;XkoD|L/aadyE'mb4(}XrUDgp|A ޘFFbߖ߿"^4G-GP|HuA1+K;~4biav$'~Kt9g5}OK,UNW T ! { _ & u6    ?q ( j6DMem}U=0]8It5][o"j2\c5$r7CwZSu/,7%fd  ` Y h j O  7      + H  - ez .#Y640hoP\d(Qh^b8bX:<#Er5JKn ;*`,e#Q  @ h Y B   ;S)^Cx+_  c *  >zaPHfzcehiqux,kL,zS.=R DkdltfZg*A^'z"LiIG Kdk|0XJ5[!{QH9&~C"voq VR d *  i nh }O |U2$J &Y3guuLIaB:g{*sq#2#*~B\>A6"9 l z6 K 45aRc(gS_?"Q~xS ea]r>YHl&2{)9z?#Yv1To!A#}5g`67>dNY{3CVS]*+8sDEFPvC(}:^PW. hގ܃ܖ;B Gv+ڋ޺ݦ;= )=noG/HKEgBCz bLhx 693vU e X q  ^z=[:GIP,M?p3Rn^v g!l"!"(!". /! !!h# r"qc|!y "Ub-NHb^%>vEWN! S~{\,  N ; n L  X0  Ao I%mmE]Q|k$x]~#*f\4mWHo[2?$eZ ?tjE*  Q { : : V Z ] z  m U % ` D 3  =K 0~  i 0  )c   ) 4 } M  | + 5 c | c [ 58,7,KhQGJrR.& "maE13 R_#x06b2-a Bl&Qh/{0Fv%  'YF  b k  @ & z B  x ! q fy8(=q$aN t%E:c9]i"Pr6`a,P(}4s '3ba } _ u \ 0pkL,:?| y!uu! Db46h8iCna+VTzZ^ =9^2*\?; ik%Yj@;E{L3!>ww)!( g^g_\xp%<Lu4|]2"*{(LXW-|ro AVMW4gRG&  0 b | $  a Q Q  M  RaXQ"n_1)>t[4*# 5K>d7o.{lg7Drv3:FE1VC3omi\chdJNtaPr0 E .2vHENbWTMH26F]=*M0K|IJ?uADFh0< b ! 2 tmz>kX<}>A GarO:^X8gEJY+=Q9(M2VO"VR ' @  o 8 j * a  A z Z  3 F {   G o u     t7h_"GS U ? % 0d2kk7/)u0Sm7+ >o^w-@>LV*&  1 0 J  z .Z W up [E+/,ONdH%?iW{-U4& O ?!r?8\s+DhyrE{%|V#3q ]]1't_1%(bwt25 dFb`M>.[M^dJsh*!Xa#=t,aAbuN7OZ&9޲܀ݩFޮ%ޫpiܿܶTz[yܶۿ. ݘV"7l"ڊ%7ai׼.ݺݢ߳۸ܕPduf6_ޅއ}Rpރd=W7 fF݃ܜuܦܳۘۊsۀۨ3ۣ K\vMْٔZ/JhժԧF١yگڕjuz;q\K tg."D&c m 2@ W {m U  xbjCl^37 :Ru'xuX( #  2: 0  B  ( M T v Q k U > N z ) b 5 ! E %J PVSj")F[+3" ?sQU)&tRT _y!\8 1KB H6pX ;  =  Y* /p   l 7# n b tY kE3 @ a%p"X%9%%Eut B. pR  W / + e A  - { _ @ E 3 ,   m h x j E 8 8 - P  ( H2{IH  tL  ^P2h>0Pw']!` >]}P>yiYERu<lCgu*bc%  7 < 6^ Z K]?.E5bo}g+];OCs{,">WF|]wOS>a$ : A # LlYB'NVk[irAUKwMJFd~}Ch0E$NDw-UjWKF8#= L;kjbLz~fW9 PXzCuF5"*wB 0 }NRz|yNw0_YGIp]?ߔDNݸܫۗ!3>ٳAג|֣ p֙vkg;؝נXدV۟ڻ"Vفۧڶ -i܏{ݏ.Dިnކem)Q݅Nޖܑ ۡHSٳRצԐ]֮}EԓԻ8֗ב ֏ RvӌX2ҭқTъ#GL҇q+$Է֎ ݗF|ZWZ 8]U#Kt\:(  H , $  r ? d C 0 "   = >O   > a ) N  ] p D u ~ M Xm+ k_4C55w/[/%G7"z y}|!h+oi9!P!u"B"<#!":!!""n##c##! " (!"O"w"" 9!/hN THl? u~O\z :6r5l " ^2   b x 0 [  N ) h @ r l 3 ) P * I  g{  /' o  } W . 7? D  .    Am n r u  l ^ M % p P  Q Bf S4MBVI iccth{MB$) # \  M 6&ewR 9[OIX?PX+hW;mL;>=;FIL Cm@A9y h >) ) & 4 H 1 p s _ > }h  9 #PbF!'5| K?WtB"}p $|1q JZvCnwwd? O:T(< 85~,As,6FݵSRMp1jܰ/GaJ_;٥&֜Zا׵a׸ֿ(.ٳז(ح%٬H ٩ْ٘$I4_{n׷؆E֠{գ"eԶHo Ӻӂ վӈ&һZq:ӳI*<7@Х4ϊ#қ҂8҆WՂ3զSpגv޿ݶݪ/~46Ru0:[*JA'iB p n c c { U F T4@ a 4  F?w\udmRi  @  ` J UFE2PL =K@TV<(M`XIcY'J3d-yjsB74= -+/J9Ufi{\ Soj Q  FM'=C3@=f^S% F  p $ r z5 } 6r5{ q'  j { L ; , a u w ) / V j 3 , =  9 f w / J [ r p d W  S xQ& $ " ? J 4 % ? z { M V w > [ I f n ` OtJ$6^4z 01{Hme`F@&R0m~<D \d' ykJ08/M7 2   W k  "U>'We%<z 8eT&h z]<5tC$ iWM&Y).Mw<*>kgX89gNܜwmaCܥUۦOE۰{ZMXNӅԦ+=iӉӟdԒ \ҦҘѸ#/?ӓgӄӫsӿ%QկYҘFӢD6Sҗd՘@RՁӀ]l[KՉnӸѸѣѱe\ѮБ ζ<#"Αj̓Ň?̘̐U0 EΉ/Λԗq,ىDd7y2@{Z73 <0xLPv^zhT6en ; i   C { 7+ Q >  a  +F Wa! ,3tj47TZvP }H0OQKP\@yU-6\;GoX#n]MS9a+I!M!""""""""##U%N%%%%(% % % &&'-'&&V%%$%{%%=%%#/$i""!!"!" }!fAk0b%G8w5sE9z DP'    c L 3 } I   h _  / ' N  n ]<q @[fVOj ) jxIXt = T  g  K  q TA    AE&eV*HXr !~?`d EnEb|c/Oa 02l=gb2*dw?{y=< |H *w/<&#wt=N7TY%vL/>08QKp2.88  ,J0- 2 : | S t AL+_c1#QLnA.y&F:*a|+5q {GOB@rZ0ߩK݌%qݑݨ+ܰ@۶5@a۽?ڏ)ڌف؀> w;7dԘӋҢӿӐuӖuћ3K8ѡЈv[ϰϦϨD8qωSxЙ#" еqWBp̪̥̘̦zͥ):l˅wˉPR[B^Cƭǐp1DzA.ƏĒň5qǓJfK& ͯЯֿ֫ذZvީDz?oAac&877i/& 2 1  O -]A > '  z 8 &y x  NFeV/:;)@#$pov b iZa'7E#r&]JpzBz QN9R)p58 $!! `!!!:"""#"_#"=#T##;$$d$ %!$$1$$$R%%%s%5&%X&"%%$r%#$B#$E#$ ###""8 I3T7d3^3=z9r  < & L  7  :  . a ~ 9 ` T ` o ] n u h  TvA'KJU^%Z=}Cb%Z  h,`K[%&,)8&C3& F Y ^2cq)qP4Ty J 4DUuyH.@)VE[+,~#ikY9.X&e>\^!*}lT'7$MeC#V6vIRv~=M3 9 [ -     ]244co A6~H+LB{/"-I MmfdM:r'dbv[:"r?}.WS Y2aYbnlIY    c  x   k R H O v U p / S g 3  I *1abJW'/Y[yz}<6lx.FJFVLr3[2L' sltgb4yY"`1K"p߮vRܞ]Aܫڿ*ڰ Ulټ׈ظg׊?l0'Gp-7ӕՖJfFaӍLQїӒAPHjzѐ0%%B:Q'))))*e*u*.+G+++ , ,,,,,-*-|----..m.n...'/0/~/x//////0//////z//t//Q//./.... .$.n--,,,d, ,+m+{+**1*J*))+))b(h(''&&r&C&%%$$##c"L";!$!   ~r[>5=BF @@90/G"  Z 3  z N y T  s`^x""cow>dIlP;tZxH=E|2* !o~ik-CbV 1yKmsd!>S'2p{.M9V )m1T T  * I+ c> h c S ` N ^ j a  k . [ n 6   }   h v 6 0 T  8 T gDD!-H[J]PL/;Gk f]lhv|6 -7c4f!)qt**9ݘ>4فe>+ٚl؁?֮փZ֐.Iԕԡ#bӞ*}<ҡѧ #pbtНYKq%{>}nБ L- н5nћЇџJBѿ=IӮԼպkeղְ יٺG]وuٽۗ0,+J56YKߐp"/Z C'E*E] /m>7   o /   bN+QjE:bdKw R "!n#"$$ %u$%C%&^&0'&'6'(()) *)|**o++,,l-,-R--Z-Y.-..G/./P/f/ //(/@0/0Q0\00$0/a0/0>00/i//E/./Q/0/g// /..a...D.--F-,},+q+L+*-+**X**))))))))x()(''''&e&%% %9%$$$#L#q#""U" "{! !  ( y@ zG\LEYUV;|*u4 v 7 5 n q ( & eZ7=VuA_  w_lUn'I 3 50Gp,ZW0_ o]Ho%pFX s0^//#_@O0jD)/4yXI\"2<U!a=] Y(g_Cr.`g5A*y`$&%J;_3Y@ydy Qw3ki8^rh]GS t[ )[3OA (e3ap9iBi)Xo+&DBt2vkJߨ{ޭ u-ݐݷ$܅|/q۠1~ڴ٩Rׂ׭0i״֡fևCmR֐0֖ս8`9omդ4b2 >?ua՗sլ ?Bo֘H]aeׇׂBXّٙ?FگڇۜNXܗܑܽܭ@4soߢqqG=pk2+GF#}yl_^S$/~RG} kbu0`x!cv%<h Rnzy,(; hwC` * J b < [ k R y  <  P \ 3 _ q ] p  I ` I w \ ETXoW|o-)TXP}BtjyaKut2ZC7lrl4`$X ]RNy; |f`Y - +- Z  J  I  @  m 0 i ) W - W 2   9 \  v C S  .   j C f  K &   I&j; +ZT~,Z}7k9QkQ:c(E%g8S=,^qIf 8w7h 2grye@7;}yZ^o}&qj|YG=2[W&{wQ k 54yFkb<uRyS}DzYF_+}~Q: q6R[(9d,qYNC] `0o>%vdl~`+lb!EMa #[kaGnyll|.-na`Z=LAX @^z(\w`R*$TI[) 8z;`M y7PEbm7Mh5g/g_XAW T$kjk)HDQKp;.S$o6Q- |>TY'-O)*|xH-cMX&rQvWEYKyk~B&, kji]p('1>%#@JHE>Apzcjonbd|l~ktNSuws37=I5?{AQ$B5F&+ poMbMl@R'+  sk[^R[^_AB(&{hohfkbNT>W?X/?;EVY~ (.3@6B.2MMgmxdnRjdbtpiczcni{-F';$5 )nUgGO~{xYh[jQXEPIZ=JNQc^VUMSvly}guhexZytsuy}~uro|j]sWhXSBC&7.:-+ 9(A4Y;['`4G4*$ ' (!:8?=I#7&' %8c.cA}i|d(c3c-mBo+I8yZp 1E'w]o & <#/3!vdjUe=J,?A6&.)B:3 ) %$ :!0$1% 3 6(D1P:}hwl~{}z\W\M0H1XTihlzsspc\?8%*# yt^`UP:7 `gRTMJEB1>ks[qB\,! + "  &.7 '"E@*5/$. G&H/VBlPdEiY]UeQdm63CCDg8M_a~ &</9Y!h)z<b/kAa5CSJI8&qe|LWjgWL(43,#&B>;Q,^=|\zAO'[/lEf 6P)S7K>L>I1O1[EeZlapZy[sWgWc\i]w`vbwfidhNYC_EZ?W=F,/, )%2)B6@5H<TGE7#zps`o\cYaadihhpiniiltuz x{ioag_\_U\UTSNPMNGI;A8@FJUQ^Y^\\RbWdibrr{#  "(" ~x^U6.rophtohdnfxoohnjqjg]XNH;G=HGB<=+. ysg[K;# %,1#4.7/B3H7G:D>A>MDXGS@O@J>D6:0   $0#:-8.:1B:HAPPT[\[sg}v|||5.PFmg -.@ALIRN`^ts~{vzzsytwzwffXSOLMIQMUTUWV[SVKIEG<B-1&(#  "#,0;@HJ\\vs% !&2010;776HFZSPIJJOP[S]S[]\cyz{x~z|fjcki]VE:1'c`WT7:' }tpioeTB2#2(J:VO\Xy{vF<G2lSU<W7zQoLG)s=+A;RRGFQJ88A v5c{8lO `tdN*^/`Mz -d{8MXl,7J':/E2Q3$G -{k#^T3eAv_+jNRRR?p]}r(=pzhn`auj+_K?fCn{ x8}|=k'4 = 1 &    4]tes2c LmKb p=p&N $~g%d6_L?f c s Z 4   ` n J  N ; I  ~ M s 3    @e:N,vMv\r?3#Er%}V2c:Hq/E[s\ -P%2{xX$],(\?vfl\e}dG\/++AF'{bg k=7wUX6]d>W@ " C`s_C}u1 V H"W8@j4SX45qE'SD_/  v !=N $y ?԰xAKM݊b;3xQkznޗ`G'l7 n?#3e7h~| qi$B; eUd 1g>flipA$ Z/uz 0 +3<1R?#L@bdAXU2jQ_YHbT hgKE151^=DR,e.y} 2 m  q ` Y=A@  w #k.!TX~8Fzjh\b7x;G@oc_xb 8 ]7s f  M # =ozY E Z` @3v.dCܚK;n :$K\yjdhdqf~)6d< an:bK *oGL! yo , |C_zny9  zBvjc}M }/MWqm 6d"N# @! !8 %q/5 q > % SMd<Jv'i}1%\CSlTyv"0 ud w A rY  .r7#bv^/(B 8 m*98VXM g6>Mr9MN G ,?{b#%pJ c g l# 7 | HqP&b^Pj J 1z>RbL^ n mI m ` X= zTn Y:"WN uX []4- t bDzO mNae >(7ޚ+@*%%:wl $7I8 l$&, :*PClHBS # @6'I u xc> ( uH Jj/Mz <- !` BQ?ot- @6VxD *Z'u WP)rQg 0S" 6 ~4`W7\  g$W_l= ?bTZE !a A%P+E  8Hm #@ q ~ A FSAxIan $ z8 h p  #qN&^ { [! * @),?`(0 8 K< T 1i & ! (}'('D eg2  m_3) 90!{X oaN6 ( x 8f/~T~]trI/Q GR h&'~sR2#{ ^:'' ^P`Ej`  o 5 -! h% / `bDnf'%  YR?| Kee5 z+ ~i %5$he > 4,.Fl  ts#|Z=S D ;d; {B b  X$ %LSj[`N  \=  [hEiz E ߱߮kw5o ) \ t DT%j`Lnb zN q[   w 4A2#3h;X2D v ,sJ .iyY3!_d 5iV/3m G[Sx"1CBa $*oT$Ky  (-` Q B" {9OKi ZG$x&* f L`9 h?p|7z;_a\ A[3AO""' c]8iT Oj:c =4jt V:G3K 'Y 8 m A n|^g_kXRAuD_tv$^U7+CI %5x s2 H@ =LO G` d. 8>x R  :Zi sFi8,0 VSfM)~4 2:TGq a   = 7,N& Yc2F{(b R Sv G  ,Z,OB}"wqaE<;%.@ 1! J 0phx pb tldcZs" $#l&n E jS I " M& ] E@VS\I dq!N 8ox h  q iyc  ! ,w9 H9/Q0A!$KOC'# f 8I+Oq!$F Gd^  K a :Wc  ,i kXHdF5h bKv A1WC 8N}ZZBK W7Rv  [<qv  /zoH?VKf| IU߬S=+ [ d R#K  S;eH )a\U x A67]0kWU{1_er1%w %G^8 2e8F;p/|V # Nr&#4N  a c  RD!)v E[>W+ GpH!MR5!?~p9muF 8 ! $9,O W #.<&5z.CV2 .ul(i} 0 .c # Q'AJ ho/Zy  &r- -S% (y&VBk #]$4 d9S}, 8skE~cRM'i G`!?A= o?Oy'~ b u y=? !_* 8&?VIzPMTT^  f]! D*< t Q*^ p:~~ 'VTc= VY9(eVJ& S G > 5Nl =u=!p۝B$$ wkIk!1xbt##/Y?63qdhD  A(Yi06g k%>HH+k WW35 n#)SRn r].=  1e>pd . }%?u  9%0%zd>O1Qz*F;z2vkjZ  -Z | +]!(w!$!! 3 * R %k7/ u ;|  -vqbV ( qD*x0rn.8[8K ^WTZ,#iW S3,!$|\ 4 " vr<3Ph@*M#Q'b*; 5G9 Y Hh , 5E M] `WmuEs2-k :Dx)?Die!&Rv 7 tk\o H Mx;U0XjcO %\d&I{|&RAn\N"fxljtX% ) ^u!=o M<;uF!j nVHL&B?  ;~r(SY0^ 9U 9\AAR  `i0,x  +OxN]g2 *  PXZ,  ~b41&+&&!C!GZ5R j]_LP8%  /'4d*d,nS+  f7=fwsp)7[gvXVH?. _I,6GT l < ul/Jhl[Wd8 -,!'6M-L Ui(vp>+p K  uZa Tz#X, m 3z{Q1]<]-* X?S0hGE * pZ2#~ Zcau)D.IWsC\?Udu!OXl]~c^;y\&9  Y0  5DsG d 0JavJUqv^TK = &G L QcO:3'  i0]8f)`w36{ - K&kT'hb ( d " h !YA s ;Eh#Mu^zn 3<ZNI. _(K X*kF/  WFB9xw ky07>R K 14 b Km!Sn(B=w`k4XWYUZ d ax^{@{G7: e XLta`DoHdD{Y? w L _v7l8 LR(1~ Za (=??'e3MN]c  I? %%R% ]- E  ] w@TkM w ?7;Q=z -LxM(PHq  $k{m_n1 6 uzfLVm""0CZi s hi $  x]  h $CVf{72 . B}.`(W3A  PGG O QHxNX C`;9/ vnx9.) Ac(hYHo\syan"3,?89 +  O-IC V {sX9e j  O3mR0&lXf V +J2I |^mm'enc?3"hy2=I ,Yy B`IT!Lg?( H>1O, 73AE J" iO9T7W  l'K{sf4&R/C} 3@8II D ],)2%Q1lm16fO x,cOzgQ26B, uWcG RKtxv9Au/`Sin-=]jdjoCq5ic6['oF{O^gHnI1qlJS[-yLv(2Qc5IX3}IOKg _LXGHUwyaQzMcq;k8a@v  m{8-2pk46Vu@.i~ kQC{DiyNMy'ne'ut+ |]UimFbO_RU ?M4IiUY z3]2,UaB O Tp"p_~aV9(I01E.B7-,)`kdtm(mA"?b!1 nexx=" wBf_ph Vn)y|!J&R-+i>J$\ t6[e{-~zf5V:|h GOtM!h^yS7::h2,. KUm 9"`wp4)OQ)H5v*^Qq"dB]\.z`EwoZpC)rb" Fz!$ w%w9LI G&t@ %%%g7[N+'NaJS F#kSxN:<`vJ\j#cZy/ Ui -60;E=1~$u&v`w)Lk%TTH+$ JyP*(X@gl(Zu1F*{BvQr7 b~'\r3>c\.\NYE ]c! [z :OJ|Ae -H#ay!I$@WD-D;te.YEHaHtx%mtd %-;`6Gm(2F-)_q]>\O<2C,kq)yQ !.Yj{4IlVQEe7R+X#v`Lbn)`B+w?`3iVX=&,hP,94(AZw8oN|RKB5;qx27<=c>:|w:+N8vFC?&+DeJ2V(sX^SW;,,Y^@[P d.M7r]kiU + o9W6*`bF-YNJmZ_5,JxhwQ: ?bF;!pv<{MQ\EEa6[uNQZ\v`CSX]K s v > C  q4 U _Ild`H, 9T]  olVRX y,IAE!+^<}Ko)G0BHpR lIUD0W>c_\jeERJoi(A{eL(o>'&D.?W<97&g>8Wqql  !1   + g "#QsKb_]P=7oeUJ %YV. '.YR3qv*_j" ++.yC).Mߺ8e^hߍޢލܳۆv4ݸsܾ8e!؞|ٴڕڠyqqeg+ׯ:~עԥԐ҇td^\blҫуP<|цL, ѴЂѹѮӨӛԎԈyOGБ!&Ώ5!ΉͩBp*"E lgc12?`rrHmv5_U R i 3e]p D=*C[Y#o0[# [ &!!!#"##R"r"!"X!q! ! !?!j!C! 7g%EbIL2{ akkrS0zQ0c~".|( u  c J  n 7 , P  c4bh  + b m + , * D ! W . + % x A =65<\@UA$ "N"-Q[,@FY#Sd 7 () _a]& na}V m5'P<5b9 b 8  b W 5 I HE.&|><<SR_(wb~u /jaNW]:3O<wKh ; a @ W ( u * }eA3 D.. ^}Z" #{mW!_ J  G  * n4"F{T3P?: gȿȯ0Vdzǫ ǶPпSÎ8IC< 꽴@? àdĚiƌɣ:VѨ}U{^ײټ3ۅH޻0* p^$[yI]vKjFOu-am- e  gB o7@5!!@"@"d""# $;%J%%%n&f&A'y'6''P&&&&'X(''*&Z&%%b%a$$#$3"o"} ! $<p4'a,WN,_6nwr X!7S*= { 6 U x K F "   -  d Z = : f ! % .  x A gpJo4?{q/ 96<k~ } @ F !!  x6  M-P!]!U! ! mF c + ~R-1l`Yr]c I~v}7? _  s * )B 'R_,[] 8 y;J%=   5   = V  1  U I17pcIY%EOc/M^i8@e%CqjtsyWJz~a3hU7~E,s+Vp1E K G   $e'1<Y X(N@#]rzxxzv}}S8gwfܪiH֞ԕS{0ժ>Jִ~,ғҭҘIӔӸ$ӊ`ҩRӯgҝ\>%ӱNЋЈ^Ѷѷ.ϾΆΨ3T?π/nŸ́ͩ͠͵̡Z3"e5̬_Mb3xe˥R?hqƲ)ŀsÓìh:y俵"۽Va޿Yӿg<<ōu<ȷͥL. |&ڲܧNj'h[ @e$pn;B}:d G e O Y  ) [CTP ._E\] B!f#$$%$2%%W%X&&'z'\''_(`(>*>**+,+6*2*))**U++5+Y+k++c++))&&$%$$3$<$"#!!6 p&-Ms} # O  < H  | X m`u)w< J    b C 4 { !   G O    * T > R 7 1  q \  Q b ? F  n k : +MRXG 8]OcCR x ! 6! 5 ? V  X  5$H(BT=.VA A W %     ! e  C  VU4y1L#w=(Trh 72P:JOf~Ejk<@}euRJ] [-L]BX~g vo#G69VNf|s> . { } _=sf?>l-\hF`6B@9:*LC,:BC$)EwVTX+ @߾ޕ݉mLCۜڝٽd?ٓv1E/ؠ׋yaF/#ԞԼԌzԈ;Z%|ҏlӘb.Гf1ϾϭK.jhΖΜAkͺnͦ^͍8nΦ?Έ̸SuY`͵̯sHˉ Χ[t@YͲ̒,ʝ0ɭȞaȧbƙV’WϿoۿFYL4 F7ƥ]e6͠Ϣfa'׉ tC{ @C Z'PD6*SH:3:*7- ? n "d%5+Z Fc$ep/D !!""#"##$%%O&''7'(+((")))J*)]*)|*)]*():()'(T&&w$%#3$j##E""G  ?PEX-] Z 3 @)h d/FfO-Bk r ` X  *z yOu9cCCtX5zF-GB @;=U?)yIAu7~6Kj~G@+fn3vlJ,XS`O. o  u  Y  ~ AgmMH-23?jtL&e/!w&3l"2PQIcZ ^q-1-Aq 7Q<M[+ S ^  6 r=uS%W}/|?nP`Dj5" L9  }vt.!yqkF-8a<o:<Cn~g[W 8 6  ALZsh45d?`R1@- 6C ~4D&ݠh/ܒEڋgN WՍ4(<Ԭӡӌl:U#ѭђ[ѨYwіѽх~E0$Ц~Ъї:ѵ=7бΧΪV'Ά@KΊ@͎͞I͞(pỌ%o ˙ʻ\ʍ4ȂȃȰ6ŁOÚaÞ m']r־J+OǼalpIž76|Ν Ш]ѓ s`Zߊ8*q"\,5"lTa 2 G D$]Vjb3g k!C!"/ $!H =!!""k#"""J# $$% %%%%i&6''(&'%~&&''1(&'%v&$[%$$I# $O""""!7"3 [Hw&G3:-(lcZ ?  "Zd3$MS4~F LI(mEtn N X % t w Q w &,:dkg 3sw[+o=? UsYpBqC~HE nZ1J*N !+89W#:Kq{&ja|eG = C  r  m jVYAWW ZrBD32p s\=&X Z" E&9QBuXGFA $4-$\v  c  \I^M^~L/ . | !!N"I"""!!p!b! 0 ? hksw?D<Ig3=  l >  ('V#Z>r9%m0DvJb{+7V4Mn0?n@b8 %&.rۅڸ lTּ֗jչG3Yѣ1ϾΗ΃JW< ͔͕ͨNB̵G͢X4Z}A@lE\2Ϋq_NΌJo2ϵp΅3Zˣ ̱$8GǵŗKƺbLšI‹lj1ƽսɽۺc1\Wд4}۹ѹϺŽeP}ɏ/ɒ+Ϳ̊'Ѩ$3Oܽۦ'171r}9#$qQ j 0+ipVv5e2.^c fG g 5 9 Y " !e"##%"O$"k$G$%$%&#%v$&%'%4& #'$(#8$<$H%#$5"r#M"#;#$w"#!K"t!"!" j]l aE@ T - 2  SU)$bYN/ !\)qh`_LH ! .  +  T U  XJ`(>:/ Z:K6/u e#(Xg%zBuc|apyS9pkjq`&WJfbzXWHY[x-=lt .~I  $ _ A  s* 3CYj.n0K7hN 81cb[xq xZpK [  %  C #HoY["ZeBV0V4d&,J z! , \K6!!f##$$$$Q#[#!!!f!"`")#""8"!n!5 + O@ <)'Wsp k 3 a p 31f:Z*CMqO)Bl@f 5XU VOrhߍߺIߤu9ۿڶ6v]՘ՙ hr-Р}n3;|u˹ˬʯ Iɨ YȌɡf+=nj5ccŹŽJ!ƻƱEƟz+DȨynƜƁǞz Ɔ\ǖǚƀļĹIJ)ņ_*q?4P˿>Gsz建BB~Ժ^ỗgÇ4|Ɂȟ0`]lϊ}ѹծ7<]H?,BLE` '   t=6roA_qI !]!"P!"_!" ": 2Eu E!4"1!"j ,<    8kNWgy{{,.QU\1A9X\sDg8jA6GP%G7gD] 1mf " J < _ 1QM5(r1L=H8> i (  y  6aHF,h|#4w ']4K:=r%v2nwZfQObViW x P#K@0N;tE \ U v s ) Y VkgK2x{D5~"O:Z?&l?m$z`eJhp{ b  9 `] H>3\* 5 G! "" " !p!l"F"_#"#2"K#!#"+#"%# "#""/# "3#!"@!s" !$!/ Z (~ o .DizS@p$+#An  R @ p 2 02O:LR?q"+BB=&(?8J!U1-Ws2dۡ؈ !Psէ~Ҹў,ϓDήR͕Ḁ@E ;E`#xV˻ʜf^dyhʙʿ ˰IXfʔʢe1RʘʰɳKʚ$.b[ɚɥșDžǨƑƅƪD2jfpF `]j߾Vs,ܹmk۸ոX仔%LfrMƻŴeGO˶ΐ8<ӥCـLGߢg\l:WVZFYU ? 46X8";  5 +Vc#Z#EL ?MX`WiJ[6NqV6Va:v6w    c kO q|=v0O]ZI*Q5V p 3 ( us,WQO*4\T]8r= {9"qyR+uQJ`f~tY+  ZziX 1~ A9^0_askO A ipg">[a"5.3-V4_c`^ @'@&?N b | + &  lq21\Q?E3Du` %""r#p#####c$$$%$$$%%^%%%%$%$$##F#1#"""""D"!`!L  $}+ sh[ddV C  V  Q,W@E>fcxuWf*.t2پYqԢӈҔ{;ϓ4͞ʹ.`˻4#ɬ`mSqE-ɻfɹʜ<ʔ`FPtɗBɋRzqɡʛɩʆɻɟ Ȯʉɚǧrɛȭȍ;% Ũ^ąĕñCd cݿ' #ͽglz %F%~̺^;)?ƒŭ\ l6Ȇ́˞бӨl44/y1\wx ! z  5E{S" !d"P#"#0"#!" ! !"#e#Q$!n"_8n? w 9!A! " !~ 5 +Gx1&2]:Jk^D `d  * Y|l9"(vP}] ) 9 G D 4 qe1 CMoQU3n/Rnb7= ' B 6 U N- wxi/C]NIOmE(!`OztpF<<Dx~<'|J~orQ[O/t |x0=XSu9#H2sH`W 0 E G  7 8 GsBgCCK6-,GG >Ph m*yY6$4>lNPY e ?-cMn:,IrIj) c!a""##$#$$$$%R%9&%&>&&G&&%&$%($$$$#$r##x""X!!* |  $/*Aa"M8Y6_?BC;'|f  |  |E"Gqe )W7Ac~9sStLflBDiT- ܼ܇ڤy գ#kҒ;ҨІDπ͹| P̲2Pɴʸȷ);D}˕Ɍ˴ɧɦNopSMͱ˃v@ϼͱJΊoμΤ͵f΍͹wq>˂NQ0˲ʤɉ]ɺɚ{Kǔ^Kd)ƴv̿rPxu+ǼXz ^$º~^•<ɹi>ȩvx͛ϼ֫ڦ*+4wCP:*b6|R Mf:e>6sd < SNII#z<'P9G6;w;.M(h|'!!b!7!l!L!D!?!  Xq SullI }i N 7  NCbr fQxUP>lk z'y%o>I H P # :a7Eo,z QW{ S6?z;w-b3a q9 wcG%/Qc6m#+6W3^2 j : a j e G : # , ( $<H1nj=<*)+J7 g$y$XgS.7Gd 3w-D$P h  3 { 9EUEmX h)r  !P ! 4"&"##%$0&%6'%O' %|&F$%$%%&%F'%&$%"#!"%!A"n s! !N; {P= X9u%2aS Q ]  #m3G>E'G?ƶpŖĩ6HUʉɤȄɛ8"QжӿZ߅Av8uZD'C] eLu DLriR4":"Y#h#W#l#P"\"'!.! !!"R#}##$"" w !!!! ! D U  ztk7r}c/~ P! &! B V V  g r o    L K"9 $~ Z j  fK}WIf)~4 y6u rw^ l ? - z U Mj#h ]w{;#Un)&o</ic/ <N"ZQ5_U(g ?<xZ)-749$R / L H 2   / )e  h 2 z / 0 / B =@}ChU#JM:( {2kr~J174i&(mVE+|&[f5 0 pa]sOEVN!m!"A#Y##"##_#$%{&&N''-'r'&&%%$$s$$C%j%%%$ %#&#!!Rc bR3<]8>!n\ #  o k O D w5IzBnG 36`/| ifRI"*Dn#Dd 24R ^?[ܵbڻ٢=n֘yӘNd& ]o2f jV?T sn6Igh H *! @! !p!5!!^ x M !  ]7{$AQo;2GM7,}@K  .   y A ,xwSllXN8B4M~64qs\.*Gu^s  X H !'i_$ {bG%!Zw-(1/~}  R Q  N D c o ^    ` . V I =   > 1 X -    N  { > P  \ p D u  oBY#: ~w*n#sCICD9N)h:i\8]rC e_ Y{y e ? r   ^1q&g*':R ?<x#f_hgtU"t<xh2 fN&R* u l h s I E  kn(!3<@ZSfqsi5,Y^@D,YZ J?ߠޚދݎݸܹhbܫۨmvڠٶ٨ٲٷ[Mً؊6'،varآؕwl״XTRXz؅؃x3ڹڠTDڋمٲٳۢ۷9p~H4."0Aމލ߬K8c3ݧݜc_3?d܀ ܐܙ܆ܔHk۠ڻڗڇڛc:وؐ@9wy׍סػװI= `'۞ۨܤp|Sdlߍ߬vx^d=N]uWJ<.   5 N !<KqX`6 K09) 3   vev' 7H88RVol'{%$,I3=n_a%9IzI+47ptM;W*     tKMqZGEtwkFKUGLHjlf`v93"    J N n l ? C g j e a   r z } | } T T    | Y U  ~ n   ! '      }mn01&(,.?B78-#_X,,53}wKDd_L-K0/gyt31ss d6I1=    W . s B  _/,eX:(<0l\oTeD y}SoIgJ  x O I e c  ! , = ( ? Y i >Gw'W.*\A9\=2/ ==JDn&#L]&{LGj*dw?2.E4CwpKxgqWG(mE<nVkt|jT[AKciMoh -KiB=+$BMtE9 * +Y;hu96O#8V>sE?V]83 ߳޻ތއqockޣޒުߍp ZU}9:igD4@.&d-5 ( s i \ y r "XW2._M'inouA7j[n:0@7bg"L8 ^}`?6xw8y{   #  _ V @<?Fr|fS<5S- ZB(@*/%5H > ( 4 4 " z J . q  9  @ y  C 3  m U   i M  V 7oYMD&xw;bl4C46z`9%`B su2BAt,V 77pt9AE1 "UOB6&_P(.:ZH0pmeAF/b`+A.@Ms5tfX{G~FuJ4M >1 l z   + w C U  xBi8nfy+ A,  :`De+ ~w&r1i_XdEl&B'~[x#+D2t|F)kgp3lv9K\m )${i6rL[Pav#plR as#_fY.K= VdLM#(Olyg7 Z66v g5UIuuVT\VDA4U+VOgXZWqqt-"QH#,}Pt76I}>j (&tEZ&hU)'!F4>FSd$CH(SG(%NX3>tu1XGwE8eNf2q H l 8 } " ` J * a < { :R52{W;EH*z)?SwIp}l dHd-5X} A&p$ }CIF3`SA!\U5LfD U $ J  " z x Z ) w U ,   x 7  _ : k J   { ( t  ] h % % W j P . 7 ^ O y a r W J  , y   % / L f  #7a e {k AG"7T`jEA%j.?S[|5NJ >GSD:-HB'/b~z&i/vk= _^~Z atI'9E*m Q'O"b:65|QUw`{9[*v~rquW oHZ7rv8:^x2OBbOI/% {q CS -%0-GX5?ep Sm O\sx)7HgRac">$^n` G|aL(?74w|,FrDf"XVe 0+z+tq;Y(DpWLE V~;%I`4 L5(rI, IqzH#S9jb]=;Il z,8za,R"nwSO>oS}r:~aA!AqOhoSJvWOU|`Zfsv4=Qf--*f>Db7)wamXh\9D.#FeY>^s}n.77=LG [ =[,Cbm n _ c y  ) 5   C)- >y3;8/6LeR;} *O>]~iXvn 6Ao'.Xx!@c C w ~P+sr qZ 3   2 ~  ]H u o   s   M " d f% %3<m]BRXA%l^b_lPQmWR$sLlw K@" H=KFuhn~uU4tNnC|?b3qH$]Dg(p-2E8i&d/{W1Anzu`0^z4[;1%W%VGsDA@o?gfW0iSA9"fFnH:qE}+OVv}O8 E=akYX^^l<=a 7Z '3Ug /fOuPGI[]"Z)]kk .]hSSX^;lzEjfZtRu8=+5K7 b  P 8 d 1c N #F  @ N  T u ! 4 B r X k p   C [ " :  A a GzCU: & JKY;)4Vf F  vN]8RKMgoWtOx-}fCUqx]'+;K[7rB'A`g|dYyI>?"PN c)gcj/},qH0#5<qi04 ?f9H kj>G ^1a"D8vU5 ]?YB{lZ;&`qSh}s&grRRLI%8J1=nTW yX~/. 7'Io"JgqWYNchLmu6#<QBu,8t},-jU3t}Od/ g, OA$mEAb/{zTt9-0Zc2bi2g:7Ns`|n.=!Wu9OhDnO%=)wd2^`woN>CWUA`SoF(SBtM%dP!H0 q.(=MB#y(:Ory8IHiq~)LBfC"i, wfBH4J# %Tk%@YBz[|#!% sqx%3tVcvz,HD XCz2K ,zlr&,-||18[o|KA'dOTA#'E1 [ /(|mGx7!/#%/t4^ (   0  qhABYH  N3 m C A L ,JyLN cnB<{{&(/) r {33bKLp3TN?#eh:Kg/@*YU"L`_,0k*<>G;P %Plcwp<G>ulf{L(-6FcDZlFu BG ([|fWU%cXA@QW3&TT{- 2 e@ac7)VRp^w@~/Af{00'sv," 0GJ#Ww[phy@N -S?gO3Rk T~GMZ~8hA1XA|'3MZZm,> Sfn9v,b-kOkdXGzLI:J$zD:lu D~V+]&XSofSX@zC7E?}RL2*ZN\K)_?c^pE6wtps PIs}OMRP?@x,KtH;G(t]:CbgK@XTF=97.gzW"_2!J#]I"<8H 25XE;p$rg^Pbr7;3\5n|[^- Z~x^snto*3Yk4jffFAK8xXoW5 QEN4jx{Pabnv&U_1x=Vj>a?Cf}8R}Twva1Ir144 &E"9` r T_8D\7 . 4.vpsZ@0xzu,EqT$= Q@SK_9!W!deeFHj@KT6 X{*9<ZcVa+Mzm`kp5 -=bTXocJ9kb@gN I SIUl ?KFD8sN ~t[TA5;)W} )x*ch<HFImVkK@HfaSa cl(,!#3Od#*~qU8.+hXpw(xh{tnv,&H`of-A x`e.BY{#?\`^O<*\[J]od'B 43>YRb=U5B^ ~GI#'vnDZ?YXN-45%'v?Zip~^p 3cwFE{g^>$@L>&9~BaF;AgmMiZSR "}hv 5tueXf&e"i00 Q"JTvivk$ +I3F&(5!#?e : 0   ^ ^ ` x  H m  ] > g W ? : ,   | K  ; - Q f   $ O f ! P  >  L  + R w 4 < A > y v      b - j;i(e7|ZcExyH;h <TUE >M5A|sK'B bb@\H 3]7F[kSy@>v0h5EAuXjJn7 rCeUECtg\Uy Hn*HK(=Ifx1W}{YF~mzoTpqhaV4%@ 0,j2b 'ER 2~\~CaFg+{{y i13_6Wb##b^[vPn"-nxkwߗ߉ߴ߉W#ޝvOm%Q8bwYrFm>FgPzp9Ynu\iTP]Z?/P'${ I 7    #zSU9_=JXU1.!8PMw ~ ##c O 3 7 B :   2 $ &1 x<W[sMSNWi./Nff 6Dc_fww`WxZ)j[ssi N | / l n , b N g < @   X * E 4 %   p C { u t V 1  R 6 5  $  U j v }  = # N c ~ & E ; D 4)."'eb>!u1dQ|q!utizi5FpkorHw^FcE_0Ch::=#3#O Q2qw+Vq-S&-XUw+:0;lXh*W!@&R3f=s`[a"^Akijr 8%L%WIoizea`Ur ,2%W@yS nfEH+Q2RD  41Ud&=cCsAc$H'Qb.P2$1*"mj(;X+' w6 [c-1dm#@@-0>=ZPV?K.)W:gB34.,) NH:<_d&5O]oys||eZcY;/ENICST25&)ruKPU\).#&)-49HL]\?DS]NY WR+F85( >H[X(qiwEH!"paDEdGNhj^nyYl8?,%@Glof^B6  xgG*0|~tkz{ZPh_n"Bw [?}QYe-\+7xGRM7g(7w]M*IP)!_^>#CpD^2V 1H%k,6 BZf.T!=nv7 K.V@e6E=FNy!*Q7WQ" G8w- |Gn+N Ni;/"a6+Vy'SaU#{TE;mDw,\yޠ^^߸D1ߧMb7%2_B }6meWD3G^ B Q C v l|aY%wt^dH> y ~ }w(YG <7C>?D//"!8ACND@ | \X{& ^U hoRNGFXQff40 '&0684xvoZY%)[W0(`o}GM+{ q Z J e Z t z 7 : 7 8 \^ED[Z\NOTKTALr|# fp{zqyXY\LA/5) 6p_ XI/AH_G)w)V`!j]I&K\(C"k  +7Wx4OtERs  +C?ajoR?$j<>:LY!5_`KdwigxxlW"7D:I0<.K.R4ao;U04c^0ElG3NAzs H;cHoi-/s~$(% M?eJV2T<QE>3e3N>N>HgXR;aUKJ!&>?PV<:0*RSV[FC:4((VU)'get}sCG%KHqpskrhE@|w@=yyHIiu <;G<:0BDkojduw *?0YUkuq~ldFA#*sqCJU]BHML9;ytdbz|PUTXOR%!Z].A+7.0 %",';.EFRaj@8aVXT`d} GQW\@MP\ #(!DFc^ONC;a\YZEDIL4; a]EDl^zo2;&5IOC;?0FCAAI;]OE8JBWM$&  ?]NUhA]LMidU] *>1:/n-CW8Rmk]ZC-<<?ZC H { q  7 0 j w 3 / zPgb c 20&8DN jg%Apayz.bY%)"#6x}yph`s s]yf |(+"ot1$zHMQZ@:)3G1d[ga%(8?sS/ YBo.[X}ri#&OI]YG^NcSmC2 u^"*W\ n ga.J+E69)_<%6i]HN5SR~t{|rA<\Or}7)A3`^13YT  (%MSJ\#9mi%-,;=L'bn|TfTW~8GP`+r2Cv.A3~"Few]w8SP^-BZ6Fdy%'M)f Wjp,3bwDa#CBWZe>Mrw \hP]g{--`]FBSL\Ub`OU9.XAT6X@zlE@pvRT XUGM#%{mQ;hLj`N(O:{fcUPJSQif 9,THTT ,31-8@A"#%`_*= -:HV>Imr8C5DENQV7F$r{ulm~nddjFY n^* 6   c23A`[qG:{zrr~`X{i{ASL`?8j}}r3sSggFe[ _ P U   , P  C N d   1 O v H E Q " Q s[+1  B  F n A B r I+xptJ x;u.Z' z:Eo Z;V &grklkz**a}Vv3Hu|dc}4/6B(Nq{[zx?2"-Iv.OiVwQk =H{;c^ alCE e`6IomiC^%>Mhm mu.%\N$'^Yzr6@ED{ ft#'}WR1=:Nvn9 ZgAH%.+Rp]\6<ikbq&*Zao|>> Bd3Yx IZB1Rs1+!x$ ,&%yXB|0..+tgnq@~Z3(;@$}oQ^s!ib#.5BMCI g}JRi`~cG_xJj,)` ,[UQ`_Lb@1/pkuE>^N]OuU t '|`/q:1cI`9M// tV2G+C%p>Z;9;Bhm;<5BUj+*7!&'.3b^n{`TfjK85? iYaK6,)(8-dKq ^8w}'RBn5 QT#c@M'*R$kG|T<: &IBeMKh)bQyz?@ja !L#=759E;w7_Ik1RRbzf +`y:]a/b,($*J}%_lIrC[&f|dk;@~kX!8ZtdBcA|gyGncPR8gzwjUMMY<(=4|d (hM4i*|7g)0o @x' :"_yv&6jmp G oR93cRo"s`N6 R-B] !_^?<^#T)_wxTZ@AEQ#x"iE_Wc"cc6f0E z4tv{(1mJ!W.$:sB3_BF-r\^:u J* ngpGW" h` ?%ilW:X4:8zi[O82s9NAh1ahGG wUh%rEU*hN:wq!mrZwfVy{-0\"Js.,D2r\E,[/w9Xm1@ %V$~QQcl(K?ijX9K &yT.g?+h9ma9]E08GU_|?qR~pH\=BM?- Wfr5'^Xec}ir7T5W 3W~q ,# }yflUdMrbn_GI0@')'F$87G:}cv'%UGC>x%!v 4!kV5[13r,fJcN?Cvj Ig I@vq?OSXxo5 d:c`#^@evR:3ye+GR&c1ycso2M'H-R'6!GUtyeTw`rQ/N6N9p`ekw%/?\rWrOePh'2/+a="   2Yjs{(:vq& M6bo/H +*Kdy%GFO 7vmOa9T,}&<;Tv#J-$v{ B"sPYq8Zl@o~OgJ.&D YaFSSpW^ 7^8J7d8Sk|iQ1a9EQT@? 6lDgFveOP' %'Md%l#ZsHi013#ph;K[p4j<o'$b r_WxN_&:~=\&28=`iBd#v0fhc; p0!$[{ G?BJ+ZsD1pqbk{}Z3wgagKjZ3&ebxHl<j@q2Q#.bFFn&ol9 mK+ X;6m~P~0TmZl QF|2[GO7M,V?H?yu0w5. [hcmoSk^g[h[suAKQBuvF`)Pdyp,371oh IBr}x~FQINQOXO=;eo72FM157BH]@Q$)0,MO\ZvwU;4 ;<n{[dPl~BX-HGYMW5(}]IQLLM   z_AQblw:?=( t\bT*  { kAc1OptYrmz>;[Icu//s(L} d\p_ljZW+&;BGJ3:<@\Y fm>MCG  41?>[^'%``769\]Ha,i|y A= Q`8K'7=@mTqsv~p}]lgntZ{i[WmY("/v!0v}lm.,UZjzyw"/7Gw[X~^Ry9+|ukNT6TJSTPJjgYb9?KS*)nnXFu8%q~3Bcl%HW( AJcf% -"lJ5-ZYwNN;Cpz|-aVVwgthx)4>G%`JpwO^\`=A4@MakuRQ;Ck@SMCk}ewZ_=3H=OD 77=9|K$~o.((eute2H6- .FL9$eK;DYRWMii !nSty^doiA8JXd|/4X`( 3><ED"4CX\))j\`Jg]=G:!5=7IFR11mu36  5';7fn2-<4 0.+')_bHn3W|LOxlccQR1 +*..k]vz msSPO[{uigA; <6SZ ~teR=60|]Z91?/mjhx(&(,F_#*pwJU#;Hff^cTP\T>208@'>9BG{ HCA 0 d g P ; _ Z M W ` m > ;  % N Q Q \ u  ? V : H ^ `  + E P j o    >    JP-1PP V\A:4ukJ?6M9QUMROl7Lmn$ MF(tX] V\4@v1!M89/ ^jo  ]G7; YCt]c~bul],+ih RK 724-zolHE2)  V^]^VV62   bXhgWF ]i=D fV[1/^f)$y57amkf{5IO`|/G g|K`Nf9D ,1DIVaZaXc14}}npY^  )(MDcXME..$(PJq9*EBTL|&*%% 9,",oXG6ys8(+!zs KB  fXx}x$%pn%$&)jqrl^[43kmy|  GB/)^^kl53^cUb   ..PK#51x|MK+0ZT+& ws=;73JP=GWRc^ }qrb`/4qm}}|yrj{XU% %:Sfss&:(wq\T&-'>5 O@y{|~MG|}34\kDSyv^hMO>E otVQ5B\]<@pZsVP/AYds^!NPC-7-~k &jlVtr<7rk=:ZeyMMv 3(qwkt|bh,wj\W*2I;  oi_R4#uZN16uq'&= - ^ C sd5   e L ~ f f m q | A & n W  b Z & "   % 1 d d p t x ? F $ 9 2 lx'J$?Fd@mQ2t]1e,T-8wP"n%d@s8P6}7p]}`7q"w-E-EQWJTXk /S_<:!}zs^[=^I) e?5"T Hx6wBZ}9xK-,\ktG.efBY>^C97y (<- "9(ne5%PLRLXb AP=@ ~LW(jP.99(&5&2u}9-to)xzAB83GQTPKDv& , . ' < 2 K f     " r k ~ k R p   | u w = B     5 + + G?reh<>!)?=5.FD 1/CNLT otl}/>vMU=@.( %@3doHD)!  HIkixp72 PG z~|{}QYDK\bfi`afdBEy~T`=Nz !%##ONJJ25/3>@=D:A;;51F@B8UP}svhTJ?<4-~lTV@-uxbfN`LE7:-7( {}kiqu|-+32B:`^} "),*6*>3B-67@KTOQRRX^nsuzw   {nyxys|yuu~ysj]oZmYjY_NJ4K3M;B26.( |gjSeYhZJ76(1+   &#)410"0!=AR^hc]OXUnwwvuzw<+OAUJth!;.<8]^||,*G7SEQ]_bgclpzsxz|vZoF\>JEQ?W*J$>"0,0'&%  ${uyfp^cWZIKMU;G3A/?,$3-&#"".$  rvvno`_X^\IL:@*5 qgZWQE;+-$ wuh\XGD@3.    ! :*3"8+_Of^nj!54PK^W[Vjciimq )-+6)85HDYGXWc_qkv    &(5:CMOdfouw{    "%$*$?=DFPRWW_VjW_NWO]PeP`Tdf`YM6Q<82/$;"'#     !"$$*#5,-+)#2&1)5.0'7/?=3698824,0&      (%0*.(-%$* 2)036;B:E;HKISLUR_Xjcmgejemkmk}y|}vvpmncpb\STJWG=7054694*&  {qgfgZ]\]PPIJPQWQcYXRaUeSXIeXjaiad_dhiqjqnuggpnuwpyptzz~~|{{|{x}zx~ylgyhsUYQLPGFC>F:F8D$5& s]cHK45(%{xmzjj]_WQKA==8+(&&"!   *"82<:@=QHdWuhz')2FL[hezz'26>BKZdbmpx~w|y{}tyhu^nV`QcUhXOAD3K7=03+3+.&)!%""$     %#!$!&(#$# (&82D>ECKHQQ_cuw{znhpilpajabWQJE>?,0%&yxnleeZ[QUNSRSUTPMIFEEBA>=ABJJEFA>LFKIGFOJRNZZX[PP`Ya^Y]dgbca`fcd_ldliqt #$4-A5JAVOcYg`lpsy~{ !"-1;>BDBAC@@@:B29)*  ~vz|woqcd[^X\RPTNJG64(# wxsotkqZbSWMOPP[Z`Z]UQNOSOND=GA>92145)+#%  !#(*')!1-3.4/?9=:B@JIQSZW[Wc[f^^^YV]Xdehcfaa\h]ojontpokwmywsrjfcfieiiec]VRYRWUURLJADLHLG?@=855,+'!$! ")))'%#(*57@?RKORZ\mmkt $+/6<DFQVR[[`ps}}x~szvtrqkimjjlbkjpbbXTWUORJQBG9930%&##+*#     )!'&&!-(-17?6;449521=ABA:4?<;<;:85-,,+-,.0'+')*) %"& !'##",$1)-,,/176=@GDNKRVXLQMLSPLOLMKKGKFKKRT_S[VZTWELEKDJ;B::78.6-1//+*.36@:<8:5?;C<E?CIFBJ<HFIMNNONQU[RWGPDM<@9@>K=HAB>9,($#'*"#   #/(60:2?7>6B5G?DCCDEFB??==B<9<3A=DBEAHEGDD=D<B<C=JEKIGJIKMGF?9<7;>;A?A?:8/0.-&($$1('"     yzfkipekadZ]VXa^`\^\cb`[[SVORPPTSV[[_d_fagitnvggZ``nmwx{ **?FYYeYuqtQSQEB<MQNNIEjkvy{zmref`eZjdozmdohrgukyyzy~wun]X<>5?#+ '+.G(  (% (1LO[]wzbhai6@ #ioHP`\VR%}w%`\qu+7=0MP?@4--%=494>0g[jl#aRSLM>my :+@RL>Xl:)i]*2FIW-~DA~v $5(-LPMNP\S 8H %'!(JE{{w8- Wi87Nh~\$!f6STyoM1f/bAt;b/U3m}&JMzP{ R?ve{"13>S5=-P%gpJffXrh`PGWw#h'Hx*"K} mwSp  5S)7VMmr1B4=-Isq%{ Pl$T[_j%z8D=?m:H'. Mw6F-R>Q6l@i YSts7zBPE?WEYs#U N ,vn SV'zQl,CLkxA?*[M>cRXyN92p$U"O*x_*%IEj?1/XR=Dp{(44aCAO|ttOq0]!S&O),<~ V Z_N{djdibl*  J@|VF!QahPs=+Mj-VCVkG{F} Oy{0sUmdFR,Vwow| T!"}TlJ ^m]tvU<!<qS~NEI!2k=Y~4\O SG} >sbN'oR9-c/j5Rn` &5ceQ\/G=mD&BBtqj``s[tDJJYP;]LruK#2o{m'SG\da*p%!0R_ N)g7!wKcaQ.RiQ?JWI<M$($#2@4m pLJLc@r6e%k mMbvx|ymZdC*v~}|EA3w6)vcwU#M:|]=" xeRqJJW}XHP5>/|$LSWFR+`p{`MNTk]kp!q0APK IeMd6-"B9f " i\-Q q{zNm ( qg_M ;|mgwx>0ZTVAG#1? ->U>Nc_PuP8%CQt@+ $D03D5|Le7G^`!rW3$87>#lJJDS9LoLR= |_>kqGc`!( czuul GF0MqOGO]WltYhDFGPm'c {cyyjfuvX2G'nz]P o\E)Ex*f* unmd^-NUtonJrb3~xKhc+V  W+v~),8pLDl?D`pv3I;IYjJ' xa,'ks') zD4)T'%H/ cDtoWc5$.6CVzw=G)ymVscKTs_S%<"g=wOR< @A|:}vyp1~7c:z *=>.c[&=h )Mc3Fc+Pe MX4Xl<^>UVRhQL,U7Jb/lX13,o|2dM Lqx-2| x NJ<5g e ^ ] my] NFwO9nG$2%aBo2O{ C&:=- a % ? ^ g b W  pA t_3/ c agiaGv^>2 ?J 4J n Y F w  $ *  _>e&<.hF|(I4f [^m9:'zx(\,M4hV_I6 o}|hOI@r>Cyj]= SFBs`=.KOSOELH?n:`D1v=O)>Fr`{XUwRDgxIBzzތݒ29 #@պػתںيޤ 46d mr:mSC4[b|6`a< _} F n  Mo ] n  p] R=l*:r  m +yPi ,  * 4p2mIN|Qz{ Ko GTbO1>Aor9PPom@D=Ack  2b==jN-kf E&:# =yI?I  Y r H P j x i : 4 e I  } | vc0&CQc[@ja$4//fg@Koa[4. F=t|/B\a$,pcYIw/Bhp~# TI=i & 5 3 Q @ >  }c~pcB+41- o"Fn 1B 2; !UgXkk$ 52jp`dPN LI|o='&a`.07A   ) 4 7  w   #8Khgs? < ; 5 w*=QTm^-$-6 7 6 S P vgrkb{~<H$3(WT!>K'4o:?<,9*MD & D@y_O`XLBUQ{bm!A/YiiU0 3dk'_fZ?]{i "fv01sBSs j.=< (Fo_G  o  ]u q h LD "kt <2'D?NXWa4Un9-iJtQ(;#l|FNWPG5op%- 3d R  \ I 7 n /kgD<i9k+x{-[Y(~k0gZ O X M q &WygJ6St|#BwB0 5X23Y;Vi_"[F<- #84_2R7$o hxEQ &v5 >  @  b z w h ) 8 b ) /{rf6=A6 ( M~  c{Jo Z u y!SY0=-TJi6=$*9Q'EH1^AUWiy\Bu ~EK}0T.~+*I3=)r<qKL49jcj}CRo:Z)wS14%8]Bb|/T[mWi* 1bjO #1 a 4 y $ j ) M ^ m   5 F     % ) L \ ^ t jS O d b t qG T zed;% r * zalM( oS}5H<N ;9N)yMvw! %$~o ^U;@jk_A ^~BiNaF! S&t~C M0P_**/_\IhzYW *PdNbU[s[IG0:0sZ W:jD]4}iAf*L GW{,T4(s>{:Z:߱o;9!/Bn޼޳TZ :_ekq ,%;yYr|pu )hH; ? C #qSz4 "p { 4 Z v k z w 7  ;"tr GJ;O3.K' 'T,R M  l  Two-  XB?`S0R%{_,@riGbGpDm  & ! o5Vay!@q6~+?f4!VmJp9 L  K ! _ Pxtx-$d >#d(C5\_?TKDJ/CA~#:sP}6xol#`"LMG.7wpT; ? 5 M ZoMb2I]j D/rT<? U8PK}557f&gq0r./:VPqRbrh9=vfa y)qC {?uE |np9s9MXK,K" U@:{0> Y H ; Q & \NM|Yk]nh}z_|.`\ zJNx;+ ;  ?: [ : n ` a 8 E j r t _ q  >PGc,5/50Y<8N SN0|$8Ut^b;/UJC8u~yOkV2Pjlj8~];l1}iA"avRx09Y[lIi{3'QZTO  }80C+}-0804NIvU'+%S *4^,`IrqP*haY*@2 _Gl\a7/  x g  . * 8 I S LlyK^\@{CHhO7[xp6#.3O9G 0  ~ 8 = e m v;/QNM47X?prm4AWHpbE9r`<aHY}EwA0c< o' # \ ; [ ] 6 f N  I a  O g k | Q W w f  @+ C>)Ia z  ] l 9 T F g  d O  H u,Ie| O"<}'.# L?;*_Of;sM cuNi?c-eF~@5cacF3;uTagq[ito_]t{ 7*tf#4T{2Ss TWidD]B z:F`Z}!Q-c 6Wku<s$Y $PWFgk?Cp;b,[$W1NHu  kMX0lE h [ ) O " @ $ B ? ` \ ~  C ^ : X  - @ h = m I ~ ( - H  g = Z 4 : I D g s ~ h o b m   N[O]9D?N1G}=NT]% .KPJPak~ WMSFHHgldgEUy-:;ERX*9!6;OX6aIi<F#K6_'"@r7[5 7OZu%?O%2{~qm%bNa%[2C6y[1 13C$@' ALrAh mxA,EO!J8`1iIPxnYdk{nTq e`d+WK`-S^a-)%D-@,=) z z - 4 # 8 J `  R/@@ _gaN#&}Y'X(z]JnzSxNbm@ 8 V V w j mCh+"B:|2?'eVTn' &z ]&GEqsbsHJl0WFY7W.$7e>g0%F    / S  % S @ X t z  1   B V  r {  / < L U 3 2 #  /%G1Sm#eYL"uAv<=WY6kO@( IedW9rOc#ES eQ&`^62|FWF55Z|I? jzb% tP+xrLF*5J\UbkwMLofw  9 1 vlIJmZ( hWC;G5Y;oNs1(MfW\?9RX.N#_s",F7hHmH_j,fj Xw$4#,Jo'3D0B{X] &;hsYdPXAT32L44IJW") &S[C?RVVsEs')1;gmb~Bl+ ZZ/.: = IW&(NUjSKY;E0K &* 51J'hN@xsAx"UtB/T'OzBva%B'6~bL-*|Tbnx{  + V ; Z U    : m 5oKU$;u;zR?mHQ;vRy3]?M)wrYd3;  B T * , = 9   % :G&5 d $?KZv 0CVz   xLLrB_;LRO* G$dA$3[4f?rhF/aWlNhB9qOjfuPW$Y^4MBPHO4$lQuY|^>+7A<d)RCJ@M,htx(P%kLe=S-J9VJe F.mO>`]RWug')#`^#Gtg/S\ R  D u , b " M ! '  N D > M * x  4 t + ; 1 o D L  ` Y 1  s  s  J k+a"yAk6s (^t4S)LKMGGm:A{%;}L9zEF)U[a]Q{_Xfe39 k-S+O0>@@+iqLCVFF>X}>diD]LV2 z% 4!/ vM)?"SEZ@9S#sSS0$lKcBY zfKCYi&28':4ETXhzqvz||cw|VfJAj>Y7#fLdd;@L"O? 0&E5TUxy/)mm #0z r  * D A b  o  * R ^ "5,H 06$!.)3=Z"I'/3)Ihy| , - ` t       mk',= S!1vHe40U Am"? (G3HwTUFvUmba"V_PN d=v!8<eR1BQ:fU xgxuvnZPdfdxk?N]g06(*ZNt>)O;|f:P9i]#"vQ{7% k`zmlc <&9+,,LIgcj+7/Ns  1   50%9B\a/alz!0 .Hl/KDN3+|Na ' 6 8 C Q i 7 A U W  3 @ Z 3 H M j ' G  )  V . ] ; y 5 p e F ~ " ]  T R;&pe74db $T}S-iB;bQ7Z.4gs #oWM*"!X=t%[e>)3zT< c}&9>UJiGu@- QD Su 05D^$E@ C;Y7r6si-[{=@/^g(%x#@FA=|.\wtfh_a`[D`.x cIpM; W=@PHa !]zXYpi R;Or 94Y z[xy8iNv:Fy~ C _ e  m  d y S ] z , , ` ] h Z [ N J\~Z<O9hr.GO n ~ ! 2    # ) Q W < I yG;pydX/i_X61%g>J~},$uGP3   Sz('%jq W8 <H]n/~zynIh#)$E9%u 2}m())DB, .jfAAmG={jWhRwoho34{n}jXly_5(!ICsenhIM/5YVyv*-9f %?Jk8=78tALDVFuA9CZGBIf~  B - T / ` ' t T ) b S  =    ;  Q .  <  V 0 6 j 8 M  R m@hmxJRK~N~.2BcK[)3jng {_Q iYwg~ip[\=u3 Y"i' X1[1,fyR) qWs`O`RgWXHA*pk|_z}xV>\G^A~Ld\%6L.S38LO6gWtQGys47.J'|WC6|qFzO ZOzBf! *'IEjAnx\{ ;@@oux?$\El C|?P?|O.A e(S :G8f'Cl{9H~'vJ U  6 P a m Z ^   S g    A C = *  e g C 0 )  f Z j A  l ?  1 x | p S , $ /  6  ~ f z ^ q ^ !  L T   hd%qo)"]80vH9l:yy%T=1Q OM Z'bd3( %Dg6,'\O/T\hv,n v~w- q1Ho=oGx(}QlDE_>6\c3lCXG+"ST`d$rqd]_u'n8I 9^L}9QRz[0h*p[ A#aOv<:}[Ft$ZK?rG,i?;t^u|0\Sf<0=JHVfW " T q  = &  * 5 9    P 2 O : Is=fRHAW[=h  SgNO*ed</#MA:2%C@t)ZOfLX2iR1 vT)iaE jgA.yp$$T%W@uW8-jL u0;TTe Q\F*YkjkI_B,yV[Ki6/4|O%*3?MRlxy_H$;Im$u}CDhRqGVp*I0K t%D&t4yU?)3*LsCT{JWM^)B@R{.J5=g$y0 Q5 (iD@7r\,W=I'g#lO0"ygeRAq~\5nJ1  s j i P B ! m D 1 P B K ; ~  F G @ K $ - Y P  p v f l  r y V g & : @ I  ) 0  y l | N c  k u J Z  Q e  }#-lr%6 5(  HB;@+<(C2lxUz$)6SJCq/RGM}?W)-)+$<0Q;U6?(2.BMg@c 25K  %=!D+\nxw f'SLw|K|'u[N!dJ8<9 N}V8S_$\.R1L : BB/I/U853`?m%^AxzV}Q~!RPq-X@Id][  /N%R6bB_b{y (  *    ! & -    " ! ,  ~gI^2G%<fYiRx?D ,AqPdutOvD^`v?T\mv2;o;FKR+.!/$]`>24$LEM5yw6.oj,RQ u k]2-36~aXRO7.jxprp%M?QK8/0C;nhk8{N{Pf-v-u'zEC$y $.!1I"f9e6U8&|PrhCdD n!LOvACa] XA}N4 fk+tG O$t\w^*  h ; 1  q O N 3 )  ) Y 9 N + E * [ Q X  j = K   | r 7 g 1 N   v e 1 (  r < 7 %  BXW5k_ol 3m?Y9bTc`c[F5,8+4!C?DF7/s^G&!wP6A:SK4)!HM49&#?F&/::iwqyp}T`.?,?'5DXzUnRvlVqSlj) }vwVWna[rl8_4fYH~%VHpQy&U*^bwsKm60P&J+L;UF_2N.D4B klczSsTrNfOo^a2*Ol:N_.Rn0JxAg#OF"'L:c@n1,$J>iZ~C])M<n>!Hzyc{,"-z@Z'V IZKE P9o.o5YD(t'gO1^)<`#h2p C\$0M 8;\gPn8Tz#~Nq4t+K&@&u  I'lHk#5W)i!GgFd-_ P^s3:yA]g$?J@6e#Ie q?SO8=O*K=E,gP9#588 R@&l/#h9A$bmcD~)d'J) 1*]42o?z][s>c}[|<[;CYXaf <;]Y* `>XkEm>e2A,(\d)B $ #vmx}wx^A/; kSeZ +6')#IBZQC>=:up (  8GDV8MWebiEV)E(FA[?Q-+7%  , rIc; 42/OMdz:h {jZaJx&vIJ6;52[SFA gSX~K"2YPW,6go3X,UC`!JW!z- 48t93n#.SYn[$:;sv@ [ ^ | 3 h ] 2 4 r } .   = e * J 7KNg=rr?(TN~7] (jfL;UIbwVno2gub watZn Hv(FIdy8F-h9z~r[|+W/ 58)+oX2%\hblh2w)+&G5Q%#`aE[7${J^]Ghx;0%~N9/1t+8az>0 $;*G8JVL'!xaV+\:c_/ bG%)aSVmM.SS "awp<I#RO** ( @ J~mNCh~qBLvRcS_ r+^ % _   n W [ [  e V T B K k > X 8  5  P { }X  0$YNOOn.=)q g(d%m"+_&A+ia zgO~rgh[@)$F y ' D F Z p B g + q ~  7  F  5  My?!dSCGB6Ir1SV7XfrJtI6ydG:g]]p9H%RV>>F}gNFHaEe K8:4CyUO)2(er/H,r)Fspe^7aWFouo#zB8S;0}Mqe}j>Z2&&];&KAulI0U0^Od-y:WjiY&2c)8ht,X@66Apv@x? D + s m G  r l  p o  ~ = , _ b %  W k  f  0 V  %M(YBM"Pbl/`[PytKU/? Wp\y L3* fK>hNj)LHQDp~X4_M;]0EFDRp RfnR)9\Ek_]Ib|K"Tm j 87Xk>Hl?l] ceu%M ZW)# _BTo>g"up(P=&gd)xk`3Dp EY#LT :0G$,z<{aBi! C 4  O < T H  I e ~ q , ) =    L 6 E S   b  d . .i  2:+i|frR`k`M"n![f fULY B@*^d2+ I:-<{1Vm(C(WB2]V%/P,0qmyDy.,h8I*b q*-cwAPbn.6~v,m[HDV8%pUNBv]dZ}XF G=G}oC_,f$YC%G_Ugdmy'>`-\ fzU%<qM9 0 _ _Z  $  $ A  k k 6X ? k - 6 s m  x   = ] C n w2g ; x a |j_*{%=,dHDVCi{R9DD Y`g||w\p 9^9jV[j,8`xwx7zK"lyNhL8+!Bdq#$lO~.(7517_*f;CH`&= S~7J:%=Y 09i +~~QL ;] *_}l\zvp n'uPz#aqjOaQQO ]1"whC=;us]JYmi @6Dp;ZQ.mZ6T^UBX>+CkrjanJ5k F 2 |8 t  6  r y " RI R JiqP_2sw82C:, 2   V  MQ5I  9ICB)Lx}U(nQj`}PeL<RR?v/. SfP& {C'=c<HbPv[Os 1 .w?, g HB  V 1 Z tu + (  !  ! V{0nMLRwp?,G2MI%O m> -+)_g*|3/^C9>v<WM7>di  7Y  = N H  ? E G > ` ? U  H   F  B7  C KG|9mT#a&8.w(#MeNK -Vd.gurSXF|}W+8?])(xv'T!-S~p%t>0;nrM5F@6B3zugTFO[# 61XvE$ |.*d&2sH<~3Z?K`D>rW,JQ)3_Rz'n`+e8]>^~n#0*A#$zx_Y"!];MCzUkj XDsteUFB?GKA`Ewq&V-dC5*`%rp}i -a j w=I = = &  { Kg5 =Z -NWH  Q A z' D Y 0N}HXK l * c *  p : IgqFR}3D>n| =I<@<uF\F[Vv9 Zi #[WC.66HO'`)kdOV w XtF c n  B  v 1  =-Ic/  { k  w M r  V k Y )WI  x2 t f ]yI_J X  zs U>b{(2b*[V`&+%j{=U{D(JAK?)-?oSAc$~e(Dhy:JWRYc8toq*\ pBuS5a=WBnbyn}H84Q&P"[b<$? | U9}b_$Y3^ B F+4.0 & nk)kC %B  v3 Q xKta)[BF!QPO9VEg`7e}pr!,ypjGKW?=t'x.vIAwWZ[M+V,=ck7*nwsv\u"&'JThF1w sMvZK 3rZ9T8h_.X!jb=C0T3O93!utwp* zqKFC:%J& dV11zQi?zxn PA9w]G\Q 684t5XdE>|=&G~,K{lqrQMCfUkK@Rl?RMi i(z|`(_7F>: g>VyFuo^%S8^3tJ~9rXb@ O%~Xs97S 9 m- a < +  Mc@mH{R] * N  w H N  = Z ` 0 [^h 390PDk"U1Qs(43k]m>$%2yq vEF4?=IrI\AKd L?w"^@}RZ8 gYofhtzL,Xd/t7 m $ H j + g /v " \r}(E*hX$ yCf>|=|?hv(u'  { ! F e  H 6 A M   H1,tvx"AJbQf+Tnb} ;Wwrdh.trC6>~0 H vL0wmU4"+) g%9*wLCJ?umf<`nF*~D_N@tx9S(>-ZVW` zaOx0<gVT3z^`;vb)(Mi=u~"n6n!!W-j_t4*@Ewo8D {!Pnt$LV]v]XuMD'\b@@Cr4j"U=# nzor"CBV./k]`t=QBIKpN>u q u y ^ ~ x # ' W Q < F g | p 8 5 e B ga %>9I^JQgB CoE  ^ w 0^ .  N T -  { 5 `" O K*v@zGV:;oR)V}*X<?%4/f~k'oi*s(FccXgVA9>q!n '^/`A=f$~l)Q~WY;siNP[zxA FYUj < 8z,?Sk"s^nxYQjt<:yy3`/|O!B'q0geNc4&K xF?RA  ^ %y - T N  + < X v  O  y >  V  = u y r  g } t u ^  3 8  C } ' :   f% H ]%8}6/+e!gum8@Ud,^R;5O d|R6niC<6/Z>hN #z\lx}#Sur;K m*i7.k45\^VoWj(F2>LW'P``v?heU@CftSS@P'r$k\1F8h;k&7zMU} >rmJ6|4_p x"{ gF@ v!9fl?7t/=.`Ap/v$Y1Eb\J^)6X<YRof nr&xJA T B R ? @  ? + } ' { @ Y o  3 [  X P  |  ~ O  m>  Di*   7  $  3  2 1 ] !  ( > a A u 0 {  Q 9 Lwn<B?op"7W T/qt|5e&VpeGpO(g+xvh-=^TW~dsr&fc,E@O(wl|W]>?ll\vSQjOP.MNnw$ix-A%/*g# hr m@0zN'iL17)0IuL:o4W0s s)P_d5DR&+E|Faw!5X^m0=nciKwIFs 8 @ & G o>' r B   j B j @ _ # 9 x J }  <  ( h ^ ,  ? 8 3 ,  u ( V ` Z [ D)uBU]llX>< VH;0- G*n) q<#B)&*4lo:0x(f]M L\Kt\\ gc~SpRpZxxt?-u*2zSQ7Y$w8O,wI"Jn <Z^R1Fz#\cEA^t4J/^GYVF $w/c3A &gFVg \EWHW$0v'D[p5<27r&  %BBmMu'n? *_" >> .S5 RsQK ,Q!~Q|FA:UK.RCG[1t=J{KH N   |K[;{ V M b  \ a #    4 [ G t [ y H K  : b  5 l J R q    1 L 9 R h / e  r.n_q JUc|&!D.D^3p;ed/srzJl^W"F<~Y}I*Z /B243Z34V5pTVSH74AXs9s(e{%,$: =4# a =e$L-sA_no .50ju2x |@Oe^ )UCdp"l4}t #5+e_OM5BiDw]-`Pz?VP-bFD?$c}fvb ;|m7L){kV7s`[<2}drJA P)<zMx0d|bN)!h `d 5 $ S 2  a  9  , F / m/ P g   _   \ l f q OZ _ F ' \ o $ ! , 3 , ! ' : M d @ d g  . v ~ q ] !   Z q ( ouy C u /8bh/PI6`9+ -H2V~I4S#tvQQZDd<KG@>if{p .XEk4ENFZ'dqy\m,Cd}abXq-Z${z_FI;|"n9N>T{ocFu!Y{9mUx* WEbUx@& $D, Fa 2B],<sI9 {CgMrn ` , r YKM t ;>E - yp0*  {   g s t   3 E 5 Q 3   r 1    B [ Q  9 I fPj:\\|59 (U hvMR4)oaI|'[Sw]V~r"ZLB4*u.:Gzp\ Ii<3%>,<&1/43k?lS\w1^zRbh]VV!343sh:&,|l.oQe,e@J`7JT2Lm.>TgJuVe%0} 1F7))/O +ob bYy/$f;:X[8|i AFOd%yCiK,G5psRBnhJT<tShDnBIpI'lV` X2{+`VuC(+uqQQ"5 )Lrm w ; W  " # < 1 Y  2 yW c    J / P   a z * L c  L Z  $ ! > ( E    0  7 j P i A   q q } X x  `_Kqb O   nTbT| 0r{Wy84 =q_ 8 8;C.iHO#$quSLL735!&~}I=<Lef~;L8*)B^AJJj^XnH3ENHz& d*M8/ !4FTU`[~/E2F !.G\ { (?|4 S  jJu,-JM\[sM#FR0pyetd@0O9M5.(-!ZQ,%}r+?B1KFrQd3U r,'AH[nXi YXIq!5) wCrc8i~G Yo>0dm'gh l iS|A*"}"G"S.$RH-Kb!'vot6Ltc*:7m"`O=oY?Z.'n4}/|IE <Q*\'F$?.M%u~ z&+a[ DcMO9SKoT<|$=+y ,yqvU"mh]GXUON5zqZpCYgOJ}Gm3`#B:&"m>DJg1( U 5 ^[ > Z 0u] L ]     L ' n L i  A N  Sz  j  Y . S ! C   # d   S $ L OV*`$C*EeDd   %$-jvGP;=*.   sn\W;5$upzt& -',&]S<,q`nrawTDfW}\Lo[D,~s]s`RD $"moBNu!9'7O[AL>JTb3C~s3OmGVZI 'GH__ 8bw!/364Yj@[.SVqrv(`6kLaNvr|o x}p[M)"""~_b10NJfoVn@>_olnL9xoxy]iC-GB#(":0VmP6K/}"P wYE!A?:}U "B1@)/ ~dGSq|3Oz Nt&@\(`#Sz(52Z=bh>+J4m CeDweWQ@Ngz%I"15UH XFnK}uaNhr[D/J t;7#z8 03)G@8ON,4#V"+s&k  bFbly+-=Of ?=0<]tY]^gvR , X 70%bQ:2-{ n r g Xmu!  8 > >Dq1 b  | H V_3~n//!=X  t `  ?i K q A G^ d H  ?~ q,fqhC9),1 ;_slvr%Amxd%qYgSsM#03C;+Q  ;m1Xd9NWE=Mm Z[adm#l,5V4yUONb$W=^HY32&St+f$}R_>r{>W E|+~.=3-lX>g;H~ Ktu|Q-F/2$,g0B6:1x b {1kRm;veHiubvc[D>ew(,bBkk WLX%{"`o9A{QAA `e*DJkN8nIW~@/m~=um\am,7QNV}z{$g8@=R{&Xh$ +hFK.1h8zQvqY{BuE6 :l 3&l1C$]SG # i( ,wu,xw6.=pgqnI3*S)@;/\DFD {i:W>) v&!i>^?i: ^q2kPxP5A*CW  j^nh8Axgvt`Q n&Jo8e}_Im<T2LX L k$<vhce fM,   N}rlGO." WgNi UdF$oO-%o(Z`=~j~WlK   r qC '  Q `. tsCk< a,w~NFb ]B~(;I, g 8 (E!)  {x < )  Bq2@i  [xzcRE"k2 { "=w +yp  O 3 )Nm jS[%fY~ShX]_UgCrMr23eW s qVD|4yO;RXX9&tI#SG}Q}Z(  eZ3XnFYRdgB)C4&79cweC>d`N\C I~$n=Xm5c+F5DDWKF=@E3 ApQ@/sDGHAy$T`w8}1TXm_'1gY {#k>F[Tq.Q3%N+w1= NH[vOHcv\T' -=b{c#( ~&S+=FZScrV (E1)^OM WL/5vT|HW : eH FpZsHO3|E.1gZ4kF_xwo2ndzL6IJ}l ]J;RU3hC #t# xkEF}6D &5+t g^s Q^<Eb$.fH"5GKBz1 wt-9 K mW^uHv.4(M ZadnS .k+'|=3q eU)  npFNxp}_rKrUXXOr}N4)?;LuAzm_kB J _TF=;O  y~vk*T3Z QQS [8 8I1 6_XP^ mSld^X&8 {s(  a]L^n;Q#CCc[|\ R%F!4t4*. F}\ F|~n&w3 @ X]Q3:TifKxG L,\M`]MSj4 /Xm!EjA5gf [E*]`~>l+4;` :Jq} @4+@kv`i.536[[]\ [^8<(-wN[S_7<vrMD   cVxk%YKpX|B%w U ha9Ec% uAO\h^1X0f;W& U` ) n5P)u*MrGJ# _!t2HUk%S?H~e)w8|9x;l.]V"Az.sY iS(% > ' =( N9SB{~nm}FG 1/  ,.uq& GFKNWs UajMf& A;`2 2  C 8vLnX-F I{>+}ele&fC_em-uj:i W n:G \LOi%QUo:k >S _/4p[XnQ=Q.!m|BMfqVN"YCm"fhj,*foQlAX)|0 ua..DjE c_o$sWC7@u&yC}eSxYY7su?A0L1sBReEJx)=bd} k I-.K%?2Oe< Z:O+hs6 *}iX*1W=YtFmI  [fl4xD.GVuwv@{$hW@[5!  V'?TO9  o  %YUL|-Q G  ' 3uFE#,JB' s JTXx? A = ir!>  r 892JZl k R ( ~6/=dU  v  Q V   u>X I |  p }1B,s<:k 9  czza i f/=[)2@2 w\Y[jt.p85|aXy7 2M;bj AM8?|G03'oKP+_F[*Pb3^%VDn% 3E F0, SD{|CHpY<><--#]Qx9O_b)QDQukTA9m`w3'& f Y  m 0 = J K J D % # l erE*;@& N y"7aY* IM=3FSRN Q / 4 `=cR4&X`wa ( !I<^|%j[<gr!Nv<RWfW>=X c2G@^< w_kU,>@Y(p4O,z&b$(W*M"WpYGmA9?x#=8y>$q92uTd_G@ cCZmh2C~{l J"r5\2rdIX"3i)9d*GuOs\$h4oV[ c W8NIQ81qO~$7_>q in5[6S 3`8>  X L w 2 3 Vn>O)x I < E    Yc4!& * ".}%0+-\8 Lx~|  *yS"lm]%pfO8vOswDC`m EPpoC bd>tmy8 \*zo+_> oD|?Z;0Q+xc IVd@/N!C;X9"wa.O[i^z d6 'v%jCy#Z^(yMSj> A9=gG6TBHO2]%HAr3IR#@4Nq-L l#erFxo #  m  (  9 . ~ - L]:[Bjls- Rt< L 0m#0 ~ \ t !e * ' f {    B v 0 O  0 m V @ =t!5hM$s_Ds<*^% #c9[\m6WD*/yx lrV=D*ByHKL |,{Q {RZ"g`t @08;-waR^g~ll  Q!~VGU9[y H8I+tW@HsN&Vou!]h=geH nNrNjFP <w wVwr "?d{i$1RdjLt@bkV=z8y=|U0#eUXqh|};=%<(/22w$ \-&jo;LR>dLiP   q\  *  \ @    T 3   (  G  9  u !  - u  v2mGKi'dZ0l&R<|6i~QXL3} wBH ^/"w8CXI9;n)^ ggJzup"]A]8u[s=e :Lr=k2AL{@P`uFr kJK2{'P~9Al<V]HpDXLwbE!7B5=abR7aHPBWB^a^f<'w4&|s7Tu_F)eX@ XOzx,oz}Cx \ R m O ] E I  ^  | a z ? M,;B/Rs `["E $p[L;f%1 9q 9 @  F w & - k + w l b  ~ c Q   ?   lz2)z"6 dekRwMMv6YtkGJ;*p=BFe%:"#(nGrb2Zo~ ~]5z5cjk&I*WW4R(Y/?8N#+ B#s?9^9;362M/xn; .>7I-%C#Q+ZETJ$ncm=O)q\~q;PF$"&78<f_%%7?)U0QD_oa yg+tTfSe9rXGqdP##WWjl#)L0u\GY[]ylZ[G Zso%(6u> B#`;FDV< I [Iq  .  4 h D He  J o M   4 ; y  e J L 8 @  < j _ D \ y    ' t`s$[8*h O]<Je B|1f)UH-?#<AM2\ZVNp6,Sosa|JobN?E&kjAul.7~_; ]`:]e2rRri ;'~g_D!X/ SI&o`nYp^-+60RJVM% R75=TK8nF`X< ?#tK!1 l$!T4a:ySd; E3~fu#L}i-/B"j{i&kwefg 10O" NJy"8qqZOp\PE6H8G_T  ' 5 3 "  Z l G [ q 6?cB K c 1:8 657Z0#>>=A Y ( U n `B#  _ & C . ?     w b ] (.@J+Bsk[ =l?^-V0[ZY+O=b=iy ]bq`%:gZ 0<3z[%Omd_"B@]JI"yzHE#?"Ch{)!$Yt?''%;YW  @ru10H~5l~\b( CB {'-35@>qkK~?3rivwcKT53(.eOGDM//_LzyS;Uj|Q72r|bN$ XV**;MXg,9P]QVj\F8=psEb H5PU<_QBYq U8m{Ur[eNo_1~FB w 9 &  I ;  C Y O : _ "   L R 6 Y D I T t D  <  4qe 0?`H]nq, alb{CW]T8\-eR S3qZHg<6zOR &)>=WRFnjNQ5/9 tdxfy}V":?6B[LSqZLtU-g1C-FL$U 1 xN:=yaGV5XE\P|D02]/xFt`8:2@VN8P\&v^Tmgb)W ">PQN)~U^d9 NKtL;ALF4laIT=Q|@YM}U$6 tKaj^d 5_J#k,x85~m1#4lQ!=ngpd}QSBElav`G{\Y3 "xf<V>B/#|j6ZX6 Jc&RgBq<w)uR o @7qG;L[c([GD3K wH`F:S=B3pf>E XIq ; # $ )tW c  ( g  ^ q / 7 + y @ 4 o E . y  '~H  ^ y s-@!eN>|L #O j7``z(CSgX35(D`M R)fRfW|nTR%(bf& ]>:p},L{Zt4qcl}MY[( sW"5*AB~uv@gm XmBuqHO`xWI"wLAO2ZIt :aB ="Pp m g {  S 6 !   - h 4 n "t/o$!mN \Wt^79TM%Scs~8?}T|+t1Kx; G     K 1 s W > z M u N  6&r><HdUVf0-Ul?r5dE:J`Et= 'BEDrAB;O)F?wrno}IAb]y.zT)\J &kqLG|2c]Aj2Q ;z6;5mZUx0JV`I :q\vNH.bJFEKq)e6*\$g[%j3)E/s_p >byaw&[m@%T([aJqbR-ps<n0>1E@?pPO7sz]^kj|Ti C<H;;$zl9^/T,s4.j^ h " g! =\:  Dl@ 6 mYe V cUZ+ ;7d1|I>Ae+HG=2 N3j/z),1+ ]WqktY ILq_64&,! {#SE$6%*OD)Flgc>zdnik}?s*qD7/Fe 5MG%a1` +"!!bh{QG$Y1+'5C/#"^*XIf710)rXI;&$ (3kg%ta*TUUMMLhnC\p>^".)<In8JAg_{  zzIM0CWc 2,P4t_rYNHFvh/E4\A Q? (qN_GQGnSaT[hk~x-6xtAMnQe"/`k26y~JQM_ G>K81'NY1  w l    1 ' M 8 q a \ W D J ~ c d B J * 7 $ &   \ V , . * :  # ikyvxum]QM,8O`'et@L okie\?C po'wJQ   xn^_<< zwSP1* }}zhX.)")*5 1DEP$"  $*$#82EIKSEK>FXXmhkkippz&"GIdhnpzum`]TP^\;)ha}st}|4:ZP^MmZp_vhF+h`T[Pc_n]]kan`hfpz8BCLXaakz|TMSO]VRTXeCS!- ~mtSH0$PFyzpjL? vB3 lW:1xR8$l]0%RNtyEVS]*8 kiJD  V\=WK`KSDRf|xvxPZhQ;$I@E@!&"$6!SLFDPJ $.^^%%6.B:_`0a^&!$!L9z+<6+ECK^"*\a.7\Uo(9\dkzpBYj,-enjtLK_hv #$6U`z~  5/NVVfKU)0)ej|s  ,2(;>9OVfjtu~ 5J?R?RI\gz{spwSr6X<Q@P[q{dzdqv[wciV\`amnW\40.%<=W[baNKEDFL:@ !26  8*B>0>4DV^}zPK=:OJTT;9)=Onytz{{|{rj[W@@(2"D/J4$ " ,"reF7J8TD%mbD7+snNC,47.+!tzadoZE2"gT;/# ofJ4 + 6>. aW69 # jM=#03 2|zof_0!yla9$ ""j_JG6L=\FdOhWgVaUG6  /*9-@+P:cOn`tk}p~q}tpw%)$ D>eZz  2#_Ni{'*!JH}|$%83CHFWYjs{|"-OUafajdpijyw "==Xb&$9%8 (>Vcyy 01CKVN`?U1D2DMYx$$?CXWc]hTh6O4MKomn{^iVeCU<UCcPpsuQa-?%7+;(4BK\cQb:Y"C+   {brSqMpA`F`TmSwMoCUFXZpi|xlybvXjSk\w ")60G>S-E($,?HOYTbFU*."$.AQ_epviqP\1A!#!)'16:6=",   cmjrxef]bkn~zv_Z=850C9PGlcueXDC5C=DH8A$ +#}xwsus}x{pjX]PRPSFQ9<*!~wcdRTHH:2+(# ~|iyanT_NFD&$ {utmovw%L5`Mtcv`UD;0B6_Rtjyuxrqpr  !'#-''   )F8WIU><).( 7'I8NHc]_\SSPPVN]V\d]kenwx>=C9H:?5,)FD`Zi`c\TV[cX`LPIGTPpl}~~kdVIA@CLCI[_wnujsirfiadVaOXOWLVLRRRHE13!' #-  !%!01633127$1",.288LJYWZWPV;G59:0I=VSOSQS<A+5BHRNe_^YPK`\TZOZORICTNXTmcpf`h[k>J<CKTS^[^LJ>>41E:SHF@LK98/,<61,57392494000:& lwW][]bafcfcXVPOYUSN?7@593*1(4#'2);5--$)    $&?EAD24*,*%1+:;BFKTMXVWb\gbvqyvio^ePOWUsq~{wnukpwz &++'%"    )&   00.*1&(" 86KINOII??49/557EHCKDMLSKKVSLMFGTQTOVPQPOUTUWTS[GXPYQTGMDJLLZS^ThaeaTQ:@*! *&5(4!) wmzszedpiyomeqlvqzuu`g[bLLDC>D;BHIBBAFCGHF]Wf_tlwp '6+7/;+I3SCUK^W_Zcb`i]mx}sqhvgnmodbXTYVQTX_mpwtrvty`oQeYcwywytqb_^]EM"#(%ECc^{wqohg^Zfnz{{yzlmQU((    ##/-2507.1/4=;6*!   @6XEhVWS* '(>HAP22+oMZ6l6\5@ W"Xsn-@Znx0)l:1J< 6AU@.b0qT.,GR `  g ViJpmA 1 L>4u+B - x C \(MlLFkF`K:ZE@<ig< 4]N Q q i$qR=@`WXgHzEKP8LF*{] Asc!z {~&S ;fIWZC_~od1 u/: }fn^E EgZy v` b * ~T1<;JDL d K C # ?1t#K~^X5vD!@ u tNxwN~2q WQ4iQ)g% -iCZB OF+um' $NPtB_4pS#5rZ!:x7e DF9] L = ':- mj5c0#qd\'5di~BQ Z6"#9_F)V  a>XLW8nQt:;W/LBn ZN =v[zZ:fVrP||3LnH)-zz$%.>]zNT2;GEEL{A>ho Y LJI3q.Lq)~[UJf+\,)1~X2`ybTS _J? ;idB,.N,rvcn^#bkoD-($]8arz5rOZS1UDBD~t:"ZtXs6Nv_5)J# @rtou{uuk2g(N? 6B~XA\H   [hX:?}`G: K B U O # U 0 _ )  C   g ] , U j  / : b + u 3 q . J i + x +  e { / * P I M xib]F w 5  x H  ;l  VE 1 $  j(_z H t s@ x bX5|28D  ^IV 9   v x F  {  o 8 l  J f U Xi u f   U } '  s  V , X f  3 o z?0   i|n]<= ! v o#eD=xO)y~?$`A/eZ` hN-Li~pNjR^Ar#^ Ya-m>\-,(J_5q 75\1.'*OS ^ d 4  ` t  O $ q   D Q nn H "& R D p  4   - $O 0 ~ ) Q 3  6 e 3:X7*cczlD^ItS*a MavH*EhX@f):3zNc;pSMq>u oF4Ga@6]d?y'!ZYcQM:AnOb[AW'}wg(*kxn\H%%^]t<-z Q _;cP~zwYB<ߝ^ ߻fm0, 8K"fNKpiz[x Wp $ch~rj P b {  =a?sm*C~6(elMCj&Z>`0T YHUoU'w@Ul2= j ; p   C~k`p0#?*8U=i"IKm  e%n'BI^dW +sB.(Y.UBb S " [ + _m?E|' C 7 )]d   S ` ~ y s ( [ ] 0 T b ) - Q $ l  & V 1 O oiF4$_hy8;  [W< )SZFUuDJ0wI6 V6z4;W , P Z - W 4 \ F 1 _ FW50#/'<vOJgemggwh7lx(SKM:*~*}t2SLu.sQo% JtRl4Cpaq#dNd,_SF:8Y4J?jr=t_k&W[2" k7uwk6tQ*aQ{5f!U(]NzV`?t?FvH߻ߋߜ7G6I%HI`(%qf%[ F2 {X0  c q _  a M 0 CTjZ{VTILG9L0$  - ; e _   z ] {  #  7  S d ,  " Q^Dx`w^H|M0*8ANL97-v i_ ' 9 > ! n F j E 8 - % < % s A > ; = Y N  ># $ q \|6E r : F  l3E|P64FiQY \g.Cph0 bv^Pl?z 3"N6q 0:}R9@Z+m!U;b@|pq -[1QES }Nqj~QdNtjd R(*[>J:??#5,'ED{P6+L&&$A(lu7g.nY{;8aM|}& B<v+NO,,{|_M=#IM85Z-u }e:7 JaR@B mZX4^9JUM]y hXbDchLN95,E@Aa  H [ k a     o j E P v {   F E E B  S d !  v v #6~ e w 8 "+cK2@GV(04$Kc+8[h21sXsg!3 ;+m}>u{0o0aoZYE -~z.J t `0IY-OKT%.#rk|/Eju!: YyymLI>[nA%nl}&R0nr|z1%zJ3d)rdZqߕz߂S!DThm ZxR[ZUpp\@!%D=&3, YV@ G i e  7 0 O M O O 7 1 " (I>jDSV Wm =">*8 S?qh(<<~~f@ J;%k#5tF:HVDEwWrTO^  [|Oe%&(vl TV-0?=bjoz~dI Q B w k 0 L ! G H b [ b = B jTN0TT,H &@y-#PA8,mv{3`<pn/6A^ 2&eX}bl%)V\/JQ[38<,/73it a e   ? 5 x s P Y    m v F ] @NcWn_EF7*t[0ZVAWIAAOUuY}~-3B](9*KwXcRpsPg0?*(gneg=.]R>: C8fnD5tUYXy0;% $1y}/.#>1Z3ycnm>a\Rhv}ka=-YPhJ@Z?fh/%*B4'b^$ "#aF>;8B^'elV4g B4OAWA>GSj3  ila]7a1q[V?]wY\H. cv;> 3   |1 } RSnimP3)6|-Af}gu ^rjiVO7gaJFal(>)?twiiru90!E3^5f\8HPfjh xZu3) ><; DLEM 0 @ Hb|!.a1Jg[zm}g2%-.uadJwhGO{[S-HB4.?L+bTpHTYruKs!@D]Q\nyrk^1 crSB=6 ( xUby "[091)<~n7XsWs6UbZMkm }]JN0 ^0PPVR 32[H  % F  / 8f~ p  D r   : I d P V u o   ! 3 b b )  R X rg85tfyVp;N9'oSY:1*:Y#:>xD31/}@%  3F9: j+-?/KDZ7dbM%.< T4 t]e%1n07>G;\Aib[R1YVg|xpx {hyz3 n|Z6{_6n{("vTdDa(Q$9[!13=-;Kg,\_#HI^yV]G22B W0*el$އުVu߬Y4akzr)"l!.(I_Bh] t _ `lE F   0 OO  Y g d y p b I  # x q ` W * O t V  ~  M a }  ^DC15su7=cVpc;Cb0zU,2A&8 cCPOI:*  8  ( % ) & ypBI*Z .w,._Agq~qx<QvXi '  K S2G0  5!U>UD;`:GPCjZGF^>OfiJMfZRN`s^tsw!+qU[|v  #  >  B ! \ e * " p L @ D E J 6 O 2 ( E - 11Wx,/^4^F?9` VISABROF"1 hY_ (+7Zqq$r~eH]R\>rkp}yCV`C2!P3+3kB8< ud%%Sh?c6Kg)J( $:U]j[3iDG6=yi9Mnr<9 T7N)=1<_qMs)8VLU4`Id'+ff{~j30wOW aOEgw[ini-E:I|{Ay1 ?   v w  E 6 Q E T  oMS:??_hji ZJ1!= ;/D}d>i7D:#QrFdr8OtmE4,{y9[xJFF.7^j 4?QepGO"t^OB<8em-f2(3?m] V_{?Zje"3r`E 7$&!H(h[9 .47_|IV  SOzr~@, .+AKHRIS0BgC-&s;) uSFilzr9$) _n"r"yc|}|9-taks\=I@3-_?r+ o !  gzEa- 6  b ''/zk53@P^G: 6@/:=;1*Udqz`Z1=3JaRu:A bl*SP&)A#6R<oqZ* y_{ERCjZTX?_ZGVNmp4w5=3(U$`6qciDhYWolvNR>-i)x_R wnG<3G~| N`[X. _3qna01-)::~X _Q^eTQ(Tonc]S~vi.82(!{2x_\_ iZV2,VHee*wYIid(;ZKlYS8e5oPZ~N'4M<5/L1vu ~( F%z+@`vA'iV2Pz|Up #W>V.o"GFJ5}fQ:<?dT0G"+3rlDL@>@An4K})*VZYMn|lzj~TOAD%$  _h||clwsd[E1vjd *1mKftba t"X?tkh( M8v  g Y  d '  w ] ( * z   6H-cL;9_QxGML/)/:27kaQ`+v 301/9|o\Ssx C , [ G QHz+i]|c rkSJ//9 9 e o  & , x M J K 7 K 7  q~4 8 SYTa$ . ,  ~j}N]%*-"(jVyao_KK#_l:P%.# XRp A I  * ) S e O H x \ t z > R }   4?nN|}rut!~#!)LJ"$02D!%tp2. C[ SC[;6P=mnLZeb5.8@+5qabg^[VZBDvh"'!5n4 YXfob=R-YJmeck wg"8]zWN%3?>0ZKA9qpXxJ8 rzMMhTF5OO px42ZQljAN" @; 9>'-Pj~WTRExXYOMjsii~96vpz  >0|p35B30h\XBy de[XHCi``VfZ_T+O`vRKVcOUWF,qlPO=H>EL[amQKA70B<<}sfZ2,," O\7$wjqqp|e_!gPF0xZjQP[\+' go.!v'&8-@6[c^m"!ND6%A8 M:=-gboze}nYTIUR6+EM2?WKO), wis]T;lxEWsZg7;#%w~ 6$<-PRXhi}lSfn#QUa`[Tem .70?O]ypcN@{m[cOeB:.F-]d* KBqg=D]dQ> xwk@2UTjt(7E&9`nejUR=-aqxZ\ -cj556) Q W r r   Y d h t z n  ; ? Q G ` S   !   CE83 ( G : / $ 0&54M L ( % 85mg8>im(( "# 9F~ ox~CO!(QOH X   w k 8 1 : 2 { F A   #    * R K /  8 @   B D  zoC45. &IR"'<8yx A)ynryp(0 11A3aO:0IE84"-+qqxnY^FVRdkM0lA=3::TBX[^y_sz=O|zn011gl&&wuoa3;&>lnxu<=%J3^XLN''a`otbhzmCO )giovIMf__X ((noUGLA %vA1ULQN~bzd6;!$,#)YOA+bEC8k7:HHa\y{}cjDE~H*ch_Y!|J;8.<;ie.:\JYi7mi2B DH7+;&\L sW.;}B[6Op8RUo/?F81VTtrPD5"91C+ }q'%/(*@^u!+)3p6MOs1p8626o%|[mRs{`72~t}/neFga=bE_rGX24_d_n>HGFDAJC2iDslXS2a6vU@#aAXKB>/,O[XkVlM^>A!FEyzlYD mbswjp4.`h&* AC7K !,1L5cEXOL~fVNZbkalP\L+A;Wi{ub] &!I>w|"iV n}_^RP_`qx!"rp]g~|=Jutsf.E >8XfZ^  !K@>LYefajtmo~VXbY`oda)2l|thu0Fv*;f,)%?A2I+@WOk~?vH}Mf_8YE Q W  - d # l 6 ~ K  N<A 9  >k K ] X s R G0;b>kb|DR*V-ya*I Yp7ItbmDH+r{9%cg)o.y D8glkK{g3~+Yj{|!z(T5}ok4HM!hE'=N4}9Qowuyh;Oo82BK hgz^P%zq}(e|Mv]/U50 pWBBX&Z9{py7]6VjE@vWv6 ;Z.B,;! 5I SLus=3<pL3YU%2(KD%![0~ik  )  G 1 a  ,  ? M & ox/OEn.vG;j4:*v m D o U  : y #$%=LLtIw"| 9+5*9tpL/1K (K^u^~(E6A\lJpCt *3F4VaEP/5S: .G yVFERbz4CguBiR]u =Hr|WmRknY Q~t"w,k5dCESS Z14^*M~se@]2y=o_$O)M5 %/YD:fLV4,-qzjz&F@d^/~g3E_%YLdPn1 J "IY'=pj+1|{ HT0"6A{ BR NH! PYgmz)N:kat[s\0*!s!\Ts4@pXqPP7'kV f^mSC?7tEsBE ma?"":5l#GD/X'K.ffVJs b1'oY*kMJ?H&R(W+WJa;lPCO jPxT34w1 5 uN BB(0 $jJ09-|d/%hKyeyf{E(z]/Z2\R QE4P!dYg+d}qU|8)X@mI?f-/Z7;rB|C"g^=IWnh$~o`R\1!xM+X.R*vBx9%y@[ eE5;.yz, wZdR@10%86:OTm 1z]zfX @>0,37W>M/|}U[:+'%,#rWs*<(/6&Iaw(;^ P H 0  v k e c , 6  B D O [ E$ )]te|sWhPwJHtK~/Lp&A 1 toMBofs:2pbqcq58 :*}})z(W2~?3`ej  HArA2RWt"h8^/m)l[ by,Z rz [cb_W>>GU!OpOCw|TCE;47&S z50!Z{b/i&-[xz;+LB(:8N -]aaf1@k} K3ns#qT G#3.`aS?`dwL]7W;\(A/k+oC@O`l"jy,,d}]6oGr4efkzE6"/MY9Sn#o2CMV.1 (DS~Cd&4|{slaWylj_01WY Pjh'bv V`72| 0s~tNHmg}VBJEtZ`CJQlyb tSG(^B6Avn K^f~9D%`QvI=78^qk|xF566  ZJ'.&[Y  wl%)" zoYksbsVQp OG<7W\5AcjZa6>'$$SRQXjYL8r nb77qtEH MwsURhVZg# ?Q,D2=siu{<E yp"5*72 25q^cB9  Q=admWRWOvGMNO|%*ao mC(A=wx~28/?1(hi|v /"CM:> 3@zu^==</ RY,@  iSQ$ m_KG5>$Kg  4 6 B $ 7 ` l : 5 ; 4 |    F K  H W  ! / f o G ; }"jW[L_X>=@DW\~Yw{ ! $   ~ , 2 (&FVjnxm[n\BB8zwo ISHLtyald\ulNVH5$ zlMLxmdyyq5; _l!4 5&FU$!>/iK' *j[ufztd ctVp_v?Fsr.5yt&CsW\"sf=4O: 1BvT#qV4 ug)suUYip(="@=^v'284Q8xYpd^IdF|eU_im_TZX;L[w   / p mcu > A ; > 7 = 6 7   "G"xL$Y0=oW~aL1 |wvA5kZW__eF;X3~ToXC&w]YP EH?Ccuv@Un6HZl g v + C | ] f + H =e [lHF 4 ~p  >0B{_^#r8$Q:5+ J@RLhn[S  p~& 8 % d  V 8 w p } { C Q u   \h )LFjJRmuxBM)%v} J\t}y`$iUb4%bGNe;I$F$hSeS%|p?<sucj   BPhe BG "?\nxf|ZjdX# YXgS|Dw!U S<( z3 `n| HJ+0/$8A9Y&A,D4I*/@}#IDO/)d4E 9 #Ygu}L{'; 3G.zmA $&!#I:vvEU}CeFvb32Mkx--[|` RL:6:G" P>YjM;VTX#  LPkjRIvrq{FC|z^c9R'HH8`W+ jTAV:C0S}j-h9SQ_ ]QSJ  SB|]u~.&r^ldv*#tWfp9\Z^7i$c~p^zGD%D !}H{Ap]/%h:Y6X,y_Oo]lL%"n;g9y])Z7aIuYQ++%)rjQTmfps}j 1ukZ j+IUrwG,AnJqiv+^Cd-\penwD}<ergBl\Xzml} l<F%| 0zs%QYpo?Vv.gkvqK9%MHa7Jtw6% m;NE/q-'RX ml<vi+x:;V=S~{PI[VYe/  pP.pgj65rkd(2sttrol]q rr$6|,l ;~bzhk|stWt^X;z_zd/jOGIP\T; 5.Yd )e~>\4[>Y VCx+0&S^fhHO~g=$;]@P;U\>rUkaZR.dtdhXk.2FP4)6 |&W0 9 A8rq,56JNvm0P"( -L9|#xpE x Pd Y[e<f{{sow~ WEC.bS;0K@#>a'=RZbgShQk Zqu4?ndoQXcg-ZMi.Ev7hYb*kEXU /oq*-\j1Pa!1I9oWLx>0P%?RP@"9vvOX:=7o_P0:ZuJoBMQ\:e|[{v'G`Bsrj04G?8qF=F!6ci,+fG#^isYgo7O$ =)s~VRC2UgHgqb&(Qh>*^%M;X[ae_+OgNN %& sV) %1s #?|  ?<|}>H (\xuwy~sO[fj 06U"3Tesxc@N27b;X(<"/ *;1NskC3 m"\D+9%'ztn\=HG?+%0,)l\. <RMaolNAwO9zc9<ety3R  ^:6Budx VPimkN:/a\|tB7?nof94ipGc;U)q CU]\cVQ0+|zdS^ygv0IZ`WrM< K9ZIig-=;ej" t]oi*pyfu1<&@PIQXx83 %G2c#PWLF .D%+ "c|"B\sMDpZ|]$4B@EsUdRgkER!8#ZN^OG8]ehCps-* 8%N,Mp *" :Y;KDF;k"li- .gPHMZi(3ZIrU;jW>I]kW8>D; @Hv xM\85p|;K{[V4L7+dR&+#UR8ILS2vuG5H<sF085E0-jlwy=;AD:DN8138<h2]A: vT"103FV:/dzaeQS~z} X3i!WG\Pk5X+ } !B B  a` I3= B hc: . fH ~kS,e^E3 9pM\/.VZ*=?mk~w$s[O\v_9WgBJ1*vfG4Q uuuq+1Nbrp:Ht{ ?QrNKqslu)wy(`F* 3ta"vts9H #t~?MSWl{Y\]hK/.H6y <\DneR' \IvN [l nrXj 6O)WY^R_d)~zr{qKmgzz5D|"3&sa%KG4O8\u9%N?bd  B7qbO3I07" #A?=Igiv/:uxK=RF+.pkZE3)3(# L?ZK4B*~jCA*'UL Z[\]qzvfXN_`#QUwjcfWsf[@A/N9~w#*MM !ytd/=ReuPPQI(2 MPdc)" 3*REy ib lv7bZp |xsTJ)z:lv:;-,VJ"p\fUuE4da9:}wvt~J[)v,5\iew 9[/X !$Vj"0BG CN~xqu/B7~*KDY 8Ja,K _iV[JPNP%)@HrlHnd 7]6O8DPdixOR3:~yr 5BZhk2A=R5? D9a`J5}<FOHwgg\wou+I&;Uq T]?P;BJ-4 Z^%~m.6"2;3jos~Qbp~;h<^w]z_wCI(!,SQ>>y|yXWd]hn 3>ei"18!.xfh14mn"#--\`4?;K=HgYq03xM=\S"#aSx 8 p~>D*3xOK#bjk{Vee d)87AMN8>-7}|v*+ooaU}4)IBqP=5,+b_`W4#9BNB=6jbSJ%K/66 tbE;.!)>a_TCZ[/)hmco3>yxd^RHRKO_jOE@(194mU %-XNbV`j>+>4\Z +2 mqzE\(2oyP` |sQ_^eid SG v,FKK|'9wz;C,1'/CK:2D{;?9Q4@UV$F-1vzz|, +W@!gTNCH[Y&mq>Sg`mxs|3N;Wl!8'B:STj]M07?}2'%(ogpl:1,6*y]Z<O!zX#hiZK0|X{\ppVA:C5+}w%oT]1pMeX%H;mY<+>5lb[?puekynhN9-u^];A W= wR>mr1#]GW@*"wHL31p%/03Xgk}>H17 `a|jcKP5rpCB^I{r<+ULsl91ZYjL~1/VYKNNT2,ckc~uF=s|$'_ZOIeb ?:Oa&,vYy 5n^ ! '{3/B8eO_H F>PC^andwU45g}7+tKZ? qqNe`niut',?># usrX{tPD`btNIl ;9").)L>cTlWM9"NP]Qqz4 (!mY8B;;# >jlq}5@$!,*C6#xKR#Ihu"I\IP`^:M[}CJ#7G86"9&&}|B?k_w8 j%J8\Cib;4 qsCA5&~o]or&!|t1._Oxl NH^V11]TxnNJ21:6[QwqkOEB>%yzYXjf  plD@ ZUeatt23ldzSZIHQUyU^LWQ]/8M\$nk4z}MUY\FN*%<Fh^9@+45/NO92nkebfW%"6262y}9<#0:$*lk~xWIn <.+,GFJK&+5=`dNII=e`mrQW?4pX~wST=9RKw}}qsqn|VSZ`vccVO|~^]+/*8>U"@ \k6GADD536581%*$G2H1&.0@JK]TO]Dq{1 ,?A'!$#~nzx,'G+:]?*}1"`kY=!-o) *47J{z8LGDu^|dXRP5  ~OYQX|ywnMKgmrnDBliJIRWmkB9 XWYV#!!>E)/ '&356  5A'J[ulhjdxzws\RTE1'*#[TPN -*%'wcWc^~~ikNPPSNS:;>7H>0& <=JH<7=6VRPQ%$?7i^FA+'LCYJL@GEY\VZLNZTmf !/&61("&-$*+@F<> "% '".2.8025166(*)%3*1/203'8,8440:/@7LKJE<131)/3,=&>-AB><B4B756/12/33!)" &!#%827478=DLQ[USHPJQTDI8743=?FFCC78/-(% hgUM=5#$  '++7/;7<>@OPhhzyt|wyzxquqyko^\]YVXRS[X\\X]W\\Ze^^[][jcd_\^]`^\a^^_cbtgsfxrz}"$%'!&$,''#),06-327;>DDSOMJ9;56.*#!#&$) '% $     &00-)71NIQJKJ\V^]Q\Z```VUQSMYORJE<BFLIP4=!*##"#  ~{zy{~xry}{wecb{qycaXhkirrnxlov   /1**+*(+(238#$'$,. , +&!!$%+=?;955;4?:DGIMJLLCK@7652IEKHKGED;6:35-E4C:"'',%'     ('!"!))$!!) 7-GC:BFEWSJONRQSKELGFLEFKIRNSFH:?3&'   &0$42/,2-JAIJXWncjhxztx}|u~}|rumr^eHQ@F4A'3  "0&($D9GCGGPQINOJYVfj`hQ[VZkn{y~uz}zunwiub\WWS_Yi]UFEAE;1*$   $-+/*)1.>ETXUZ[b\\W[cbnm~|ymegZaXRJ1'*#    [OcbMT.+60ot `ZaXyya_shWA,QPl:') ebHRKN|   1*!  /)+.'%& *2@9=,(#($ (6A?CBH9A7/:08.<3,5)0/&    "$%)'IDNLEE<E3680GKMUNI<:76:96??E0/-0/* z{dgkpyy}wvsk9>307.OJKNT[afmpglY[ifomov{~nd]XTaDM@4<6*2""  %2158)YN[^ZWse{~{{srkftmokqhYJGA_ggkd_cbknlj]Vidyzlufojg_W[Zrx~ossxlpRSILDF><22@AKI;=/706><6.7315"'+0)+.-,,**/-43..(.368:?/6!%10?;./ ' }z}rs~{$'.2;7><:>8=DGPRSQQOFJOTjjifg^hZaUUNFA::$-,2<:>=NKA<454</9CKLVJRPPE>?8MKTXSTYOULOOZXOJ>>9:>;ON@I9EFL05/2DF9< 2 A3&'6579/8'2$-'!<8E=,)/..+0.:915=BA?>3%$$       %#0/A<'. /IJq`o_mfjjTZbk~xxuyvkrcea[XRigxznqb`SLGD:C<E61    #*$($        (#1+1,!#15;<IBD:-+&*>>]YWYUYXTA7:8:E<C=:#!$ ,"  (,<,.%" zsoxpwkodkeg`n`SJ4<=N;ODcfssBJ}\o~vN_##(DG>)Xy|VYRLj`_K:Hk'w$bZr4b(o=+M I slvD6ew# @.lVs09'XUy\@5C@-5(('!l8v75[b=KK6;PEn3O6r4`p`doo)p2T kC+n] |=n,< @^=p *d  f ) ; d q  Ydy 4_jx+ U4sB] S 2(_^(1 ]H/g1^A;WpN *16\Q>CjVPc(wt'pP :1.m)W]ZMZ PF{sb2mHoh CsB, 4t4A0MeF1@JG 9EC3[ O [dvyP{$6t]et]3J-BRN+d_82tT3/NX$WT&50=9gnWLT<7+ aVydX]`^P\1G'D* 04 ,VUnmTSZOaScbhi(-Yx! jid^pp EE !'4g}_HHEoo,47y,Oa 3(Hzirh/C88ge"t.Q7LKIULq_!(TSaL=QP6nqtkls*9 UO<3tukIsfto ZWJqD^WBbE7db"O[tX `a! |GzX%':Djh |!v` Xl5Z]~w$+Y?V14H"==N ko%m8$-%DI =W* t;sD:{%N. b PuU ,d</ q b c ~YM6_p< _ nX j { ><-"j\#)]*!{E4!8[:I"d1P)E\;Q7=;,Hfv 6?jmIJ{bKLO^[k JCEygfo$J>b5PAI["L:4EH:+(  %%}bGUNXdY/Mhs!usjVPe`x-+?9$ZY }r| _6(,{{JH$,B8\T`Z+WmZMbhuYdL.XS45lvYX8{x~W>*kqSIrtx:|CXwyk7b:/~Vo^Q  SX}}voh{.?ru%%&>~=l y e]ZmS}^pU;8&Zi  tcT40mhfrXsr0#GDC(..g[]cv%GMXjx"% sa *il; | lg,"YKouQru:[9eI3=NUfNe]BK`4ld`5v60tTJFu(+<'-GuhPfDdQOw`21 5F4`D0/H<RhWbs=S@3\[X\HN[lWW[[yxSzVh75WGAXV70aXxS;d;_ZrPPznu!!/_}Ka/,z c21Z==]LDH&-ATmr|tnqnzyr\@0!sj5$5<-0 =M>X1 OhZOr/PK9zXnxyERlb@8;JL/cxKk% _IZScoWS7?u~p_LUU.(tn ~pdFz]Anr!|ybHM9*4:Wc_cE'@IE/}pC@k6abRHZRCC 82Vv a|ztk}{(!z[q'{~-18I#4!`l?5 $bpB8^^;=zRAGW\O+b]DGNWw\5I;MhrO1nKIG  FQ;Pa\JQmQWFGG-)" t~1/j}f{2V15ndM@61NTza|#:f\S`[P6o5M.'4)0(;V\#g/FO>k\]R`\@  z )27[>7eB`zwt!#(|{ox7=l "6IJ^K`Xd`%38P+&wH]ZP8[#j>gm^[`6)SD{[S+;`p t?p {a+- Sp+#gJ )V9"<G kPE_b POe7MLNch^o#! oh;<63M@lqxEXymmV5hpm|f9:J5~{{e|IsOp}$;"\!:qoWBYa _VUq(C3C3!d3t3rUcrh`V [XtiM7]Fuo?0Xf1;alKcUP%* (-:3UU"V0Z/Cgz8CVDPI c5f&EfQoT{F. |z,*NZidUJOR)7 "%@> RXz A`2J?Qx|A-\S IRaM\HTWYh17EW vWJ4l[zhC#%ktQM)D2X}h ^{A"foj4%PI%*%;J`t/ XgUMRKIH36  }l>t8gCM"-_pfny 3Rdtk5?Yv() 8!TP CVtk}Ugk[> uWO:>k[rvmWh(" $ tqtb! C2bJWX>A!-'6_hyoUC ?6/KI4E.3KD#21XBdN\GS\oZU;7dHNM  ?X,&-3%@CQVXaKBR<r>@^[o^a^#8Z]'5KME\& bw~wjXeTWQ$\K5#F41$.$eVoo!_J}\5:PNbiUrZyxih<9'9>R^K>2h'#)Zogk8( 1&JH `Y>> oly8'11+L)(C=;3&Wg\^9<:HBQ aV4!i]rm[  ^X9.tXTGBupaLUy w00yJKPOcZB8NTPEj`@D(5HFV@<2>JWdFE JI$SIWK 4E\jFEzkklpP?L<FM{<=5CjsUD<=[bQTDI`k>3 #.#5:37( 0 (l_SNFD,)" 9C#;>L6,4V?(iU-0Pc 9/58df`NS@ntxO^m`PAfRXN jt"9[u*0 RGni3.C7AIS^qr; +r}-. %B6gUIY,;:H 9@i`_Umg|dVDdu`a`4 FDM=u%]WVh3E`<3}wreyWtx\fe|zzygg` HIxsWOq{w_Np}@Ex| pxyZRtSoN1.2CuzyEP*!8su[O m^mdE@IGrjnc(" +&3.'"j[C8NVKZ  )%xm{Z\n\pV eOdz %%  B4H>C=551%WF\V;>EEv~dsKgizs}{m#Qcj{aEQJ2+!"\ejr<;,,DNQ`HH`U|WAfHqa_U8'!>9HS`f$1`oN_+8LN=5'4nvbqGY>?9R]oYq_x&(, XDlaOF6/Tf'0#1M_ae96%)CRu|xwy~~PO0).$  ##!  ("H=gztMR5=>D'3|pb[bmktSQ;=N`Rj8?/+CEEO(,$;*00&76J?66 )UYhlu7-A.qt__FZF}m%6BE==8GY{^[.BMdou]RC8(++-(=2qneaqo}sjC=@>=40&5+ "%,9%$%- LEi\O@)#68PV07"  8C/5%3[clhc[sn{s{p]L4%'$XLGC #)=BGEB@IK\gvdmPXJS@ENSuvysshyk~zusq|yfbXBF*/;7aadtcqzwf_MPN\WXfO^@I3H;N>2 1,4631     }{bZK?3,64FB_Ly]wqrv%:FYe~vzyvqtOY=?vpqqxnloztXNH2O9C;%)6:bdJN!(#*"mh\\`{|  #81D6cUc`SXFJEEIR4E$6  '#,-1"zzwt "1GOfPaAG44 xs|fdmj^[VhSaGi]llgi 62ABOHY8M'3&) -%=;IMa]|yttnejZwhxnd[p]tfouzznzpxchGP69!$<:ZKhYge_mi}yrmsz~htIO.3% (01,+!$$ o~ysg|k{nwoy~93@;D:]Ruonc]SRTV_KZ0=9>RWmurzntzkdZlha\=3 !%*118-5(0LUl}wtwedl_pYZD9+/*;9E?J?OB]WahNXCHHNR[RZNRFKIOe_qfjeUW@CH@A3{} ztpj\UJI/,  95/((<)R?H<=5J;Q:cROP00)%#.)8CO]_xz&%5/REPD;84<9=H;QAGC7<IISJA?:F1E3C,1".#58CGPP[jwy{|r|sk}lqeocuev`~hijdgWHF#! "3';/7;DOMVJR?C96D>VPrjtpgclfikfi\bDPGPV]PWNUZaekhleagcenfyl|lxwwmvvx{zsiojdbXQZQ^^Zeboxz|z{~xxmpbd@?"xsl_]GL6?35,' "!-,@G75;6JOCMFQ;I(=%>%82>1;.82<+/%)   +'BBPK_Vnn ' %"%!' 3*:61-##( ##!.*:<8?99HEPQQSHG@:C:@8:99=31$      $ 6-B781"#!#)"   ")%))337485<7<<95*)/$"". ?2E:6,/,'%%#    *+=EI`H[QUZ^O_AUEOQXQYBGB=H:C8@9:*.,& #361;+:$  wrysvmu~x{/1FFSRTTFDICUTPVCK7>6<4A/D7C>:>=GNISCJDFA=;2E9I=E8A2+#.')! %:3<7;.=/H?PEMAI?KH`bvq{v||ytz}yvyirah`[XR`]jbh`e]ieuszvmmXWPJG@:054%2+"5#.#&! &28=A?DBMAQADHAHBD=EEOQZV]\eaqmz|vouww|uxorphbf]nkuuy{~~~r~q~t|nv`fUTJICH?F;982-4&5).,#)"(()')4%2$$ %"%" !"&'%   "2.7><FDIDC6; 4 -('%&#'           .*.393D8NIXIQMW[jWeRZW\\\[PVMPKF66$$   *!)&*+'/(3+5%8")     utfc^^^phme`]`\YQNDB?=BBGBKF[Sldxn|kwr}yjyduergkifab`_kd]\ILPKcRq\ociafWeXlgniphuqilccpisqlohlclgqprounqy|}vwmqerfzr{w{ty~s~fjYc_kevjsmopt}sx|  5.GCPUWdZcqxzxzxvptunv}xxyzqohg\_[[TSSVSWPV\c]fanpzw}ql]ZVTHG?AD@;4+*&#.*32%%*)899A5@,3==HF;?9>3,8+J@JCD<?6;--  &3(4%2 !   *11954?<4264IJ>@6:/;" )(**2/HDe\}mzzxsxumm`fQWQUhnrwqxozv{{poqfkf]eIVGP?C*2-   !-'"&*.*+2198)-6;GFWPkgolkd[UTVU]NTKLMPQVONRPOQDKBI25+.'& -)**'.)44?P_CQ?FQU>J.A%4%/)5' !   nwmrowjtgsislqy|}|zxx~ps^`][[]FR@KBHLLWS_`gmop|x&8.8/7.?B9>67%$'37@FFFD=@5=/<)4+5.<#-,812/6;9?CFFJLP[_X\^]jelnz{z{}zrvkwktq{ovvrthmdfaf[dXWTZZYYIPCS<P;KCLGOLUMSFKELJVJSFJKOFH9:27(.+,1..*+* " z~y~}~vx~{{}v|szu}ovkqfr`nancneg__cftjr`zs~~|yxtqsvy  ##'&37ILZW]aT_U`^kdlrv}~||zcx\pWcMMCA-3#-''!'! "           $$ %!,5;FE<9JA\RHCNHVSLLLKMSXe`hfkqriicj[dV_\gU\VX[[YWZV[S[I_IfXaW]R\SQEKDAE5=9B;C:;>B?D:;8:84>6EE>C:B,4"',-&" pvineeigrsrrz}tywvrzrtgdWXSNLBFFDJRS]]_`njyw|w{u "-'7/?<<><>EEFMEPFHGHLQIOYXi\aUe_aWPGKJ=@)*"! !%%" $%!" %49LNOQNVQZP[JUDM@G5;7@8D2904**4/20()48/6(--1(.'$!+'5098=FJLLDCQNZYX[^]\Z^a_eY\USTSYX_^a_a\id\ZJHONGK<H@MCJIJJLWWgeigegW\HMCF1:$       #"("2%;6DIJHLGZ^Z`Z`jji_g_[[WW]ZQNHG;>7>;=3-2*.+),-15/B9EFGITQ\\bedgffg`e]c]VRNOSUQLPHOFLAK>B6=5;6719255+.&& +$*%-(/*9840;.0&&#(! #+())--91?3?<?<C=HANIOKOFSKIGIFKDD8E<?>;9>8?3;.+$)$2-/*!      !"!&--'(/'0$0'             #     $$,12>9IHNLQROXQWSSPRU]EQENVZTU[YYW\[ejadffhkghggknwwxt{x~zv~yutolumywv{w}u~{~{}tz|}}|||zxz{||rozoqigwv}wtkqopsy}~y}qttzmo[ZffehW[]^VSKGGDE@EB37'+'%$"&&"!  !&030/204091@4>55072;755:9BAIGKGCA=?<<<>4864?=466=AGHCOFHGURZRSKjdkjUTURcafaME@9_Vnhd_nh}x~yspihniebW\W[POTTedfdjdh[J@/0$( &"(%-(4.;9=;75=;A=113677!!""!""$##    audio-0.7.2/examples/interactive_asr/utils.py000066400000000000000000000137621376444676100213660ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright (c) 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the LICENSE file in # the root directory of this source tree. An additional grant of patent rights # can be found in the PATENTS file in the same directory. import os import sys import time import torch import torchaudio import sentencepiece as spm from fairseq import tasks from fairseq.utils import load_ensemble_for_inference, import_user_module from interactive_asr.vad import get_microphone_chunks def add_asr_eval_argument(parser): parser.add_argument("--input_file", help="input file") parser.add_argument("--ctc", action="store_true", help="decode a ctc model") parser.add_argument("--rnnt", default=False, help="decode a rnnt model") parser.add_argument("--kspmodel", default=None, help="sentence piece model") parser.add_argument( "--wfstlm", default=None, help="wfstlm on dictonary output units" ) parser.add_argument( "--rnnt_decoding_type", default="greedy", help="wfstlm on dictonary output units", ) parser.add_argument( "--lm_weight", default=0.2, help="weight for wfstlm while interpolating with neural score", ) parser.add_argument( "--rnnt_len_penalty", default=-0.5, help="rnnt length penalty on word level" ) return parser def check_args(args): assert args.path is not None, "--path required for generation!" assert ( not args.sampling or args.nbest == args.beam ), "--sampling requires --nbest to be equal to --beam" assert ( args.replace_unk is None or args.raw_text ), "--replace-unk requires a raw text dataset (--raw-text)" def process_predictions(args, hypos, sp, tgt_dict): res = [] device = torch.device("cuda:0" if torch.cuda.is_available() and not args.cpu else "cpu") for hypo in hypos[: min(len(hypos), args.nbest)]: hyp_pieces = tgt_dict.string(hypo["tokens"].int().to(device)) hyp_words = sp.DecodePieces(hyp_pieces.split()) res.append(hyp_words) return res def optimize_models(args, use_cuda, models): """Optimize ensemble for generation """ for model in models: model.make_generation_fast_( beamable_mm_beam_size=None if args.no_beamable_mm else args.beam, need_attn=args.print_alignment, ) if args.fp16: model.half() if use_cuda: model.cuda() def calc_mean_invstddev(feature): if len(feature.shape) != 2: raise ValueError("We expect the input feature to be 2-D tensor") mean = torch.mean(feature, dim=0) var = torch.var(feature, dim=0) # avoid division by ~zero if (var < sys.float_info.epsilon).any(): return mean, 1.0 / (torch.sqrt(var) + sys.float_info.epsilon) return mean, 1.0 / torch.sqrt(var) def calcMN(features): mean, invstddev = calc_mean_invstddev(features) res = (features - mean) * invstddev return res def transcribe(waveform, args, task, generator, models, sp, tgt_dict): num_features = 80 output = torchaudio.compliance.kaldi.fbank(waveform, num_mel_bins=num_features) device = torch.device("cuda:0" if torch.cuda.is_available() and not args.cpu else "cpu") output_cmvn = calcMN(output.to(device).detach()) # size (m, n) source = output_cmvn frames_lengths = torch.LongTensor([source.size(0)]) # size (1, m, n). In general, if source is (x, m, n), then hypos is (x, ...) source.unsqueeze_(0) sample = {"net_input": {"src_tokens": source, "src_lengths": frames_lengths}} hypos = task.inference_step(generator, models, sample) assert len(hypos) == 1 transcription = [] for i in range(len(hypos)): # Process top predictions hyp_words = process_predictions(args, hypos[i], sp, tgt_dict) transcription.append(hyp_words) return transcription def setup_asr(args, logger): check_args(args) import_user_module(args) if args.max_tokens is None and args.max_sentences is None: args.max_tokens = 30000 logger.info(args) use_cuda = torch.cuda.is_available() and not args.cpu # Load dataset splits task = tasks.setup_task(args) # Set dictionary tgt_dict = task.target_dictionary if args.ctc or args.rnnt: tgt_dict.add_symbol("") if args.ctc: logger.info("| decoding a ctc model") if args.rnnt: logger.info("| decoding a rnnt model") # Load ensemble logger.info("| loading model(s) from {}".format(args.path)) models, _model_args = load_ensemble_for_inference( args.path.split(":"), task, model_arg_overrides=eval(args.model_overrides), # noqa ) optimize_models(args, use_cuda, models) # Initialize generator generator = task.build_generator(models, args) sp = spm.SentencePieceProcessor() sp.Load(os.path.join(args.data, "spm.model")) return task, generator, models, sp, tgt_dict def transcribe_file(args, task, generator, models, sp, tgt_dict): path = args.input_file if not os.path.exists(path): raise FileNotFoundError("Audio file not found: {}".format(path)) waveform, sample_rate = torchaudio.load_wav(path) waveform = waveform.mean(0, True) waveform = torchaudio.transforms.Resample( orig_freq=sample_rate, new_freq=16000 )(waveform) start = time.time() transcription = transcribe( waveform, args, task, generator, models, sp, tgt_dict ) transcription_time = time.time() - start return transcription_time, transcription def get_microphone_transcription(args, task, generator, models, sp, tgt_dict): for (waveform, sample_rate) in get_microphone_chunks(): waveform = torchaudio.transforms.Resample( orig_freq=sample_rate, new_freq=16000 )(waveform.reshape(1, -1)) transcription = transcribe( waveform, args, task, generator, models, sp, tgt_dict ) yield transcription audio-0.7.2/examples/interactive_asr/vad.py000066400000000000000000000217461376444676100210010ustar00rootroot00000000000000#!/usr/bin/env python3 # Copyright (c) 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the LICENSE file in # the root directory of this source tree. An additional grant of patent rights # can be found in the PATENTS file in the same directory. """ Following `a simple but efficient real-time voice activity detection algorithm `__. There are three criteria to decide if a frame contains speech: energy, most dominant frequency, and spectral flatness. If any two of those are higher than a minimum plus a threshold, then the frame contains speech. In the offline case, the list of frames is postprocessed to remove too short silence and speech sequences. In the online case here, inertia is added before switching from speech to silence or vice versa. """ from collections import deque import numpy as np import torch import queue import librosa import pyaudio import torchaudio def compute_spectral_flatness(frame, epsilon=0.01): # epsilon protects against log(0) geometric_mean = torch.exp((frame + epsilon).log().mean(-1)) - epsilon arithmetic_mean = frame.mean(-1) return -10 * torch.log10(epsilon + geometric_mean / arithmetic_mean) class VoiceActivityDetection(object): def __init__( self, num_init_frames=30, ignore_silent_count=4, ignore_speech_count=1, energy_prim_thresh=60, frequency_prim_thresh=10, spectral_flatness_prim_thresh=3, verbose=False, ): self.num_init_frames = num_init_frames self.ignore_silent_count = ignore_silent_count self.ignore_speech_count = ignore_speech_count self.energy_prim_thresh = energy_prim_thresh self.frequency_prim_thresh = frequency_prim_thresh self.spectral_flatness_prim_thresh = spectral_flatness_prim_thresh self.verbose = verbose self.speech_mark = True self.silence_mark = False self.silent_count = 0 self.speech_count = 0 self.n = 0 if self.verbose: self.energy_list = [] self.frequency_list = [] self.spectral_flatness_list = [] def iter(self, frame): frame_fft = torch.rfft(frame, 1) amplitudes = torchaudio.functional.complex_norm(frame_fft) # Compute frame energy energy = frame.pow(2).sum(-1) # Most dominant frequency component frequency = amplitudes.argmax() # Spectral flatness measure spectral_flatness = compute_spectral_flatness(amplitudes) if self.verbose: self.energy_list.append(energy) self.frequency_list.append(frequency) self.spectral_flatness_list.append(spectral_flatness) if self.n == 0: self.min_energy = energy self.min_frequency = frequency self.min_spectral_flatness = spectral_flatness elif self.n < self.num_init_frames: self.min_energy = min(energy, self.min_energy) self.min_frequency = min(frequency, self.min_frequency) self.min_spectral_flatness = min( spectral_flatness, self.min_spectral_flatness ) self.n += 1 # Add 1. to avoid log(0) thresh_energy = self.energy_prim_thresh * torch.log(1.0 + self.min_energy) thresh_frequency = self.frequency_prim_thresh thresh_spectral_flatness = self.spectral_flatness_prim_thresh # Check all three conditions counter = 0 if energy - self.min_energy >= thresh_energy: counter += 1 if frequency - self.min_frequency >= thresh_frequency: counter += 1 if spectral_flatness - self.min_spectral_flatness >= thresh_spectral_flatness: counter += 1 # Detection if counter > 1: # Speech detected self.speech_count += 1 # Inertia against switching if ( self.n >= self.num_init_frames and self.speech_count <= self.ignore_speech_count ): # Too soon to change return self.silence_mark else: self.silent_count = 0 return self.speech_mark else: # Silence detected self.min_energy = ((self.silent_count * self.min_energy) + energy) / ( self.silent_count + 1 ) self.silent_count += 1 # Inertia against switching if ( self.n >= self.num_init_frames and self.silent_count <= self.ignore_silent_count ): # Too soon to change return self.speech_mark else: self.speech_count = 0 return self.silence_mark class MicrophoneStream(object): """Opens a recording stream as a generator yielding the audio chunks.""" def __init__(self, device=None, rate=22050, chunk=2205): """ The 22050 is the librosa default, which is what our models were trained on. The ratio of [chunk / rate] is the amount of time between audio samples - for example, with these defaults, an audio fragment will be processed every tenth of a second. """ self._rate = rate self._chunk = chunk self._device = device # Create a thread-safe buffer of audio data self._buff = queue.Queue() self.closed = True def __enter__(self): self._audio_interface = pyaudio.PyAudio() self._audio_stream = self._audio_interface.open( # format=pyaudio.paInt16, format=pyaudio.paFloat32, # The API currently only supports 1-channel (mono) audio # https://goo.gl/z757pE channels=1, rate=self._rate, input=True, frames_per_buffer=self._chunk, input_device_index=self._device, # Run the audio stream asynchronously to fill the buffer object. # This is necessary so that the input device's buffer doesn't # overflow while the calling thread makes network requests, etc. stream_callback=self._fill_buffer, ) self.closed = False return self def __exit__(self, type, value, traceback): self._audio_stream.stop_stream() self._audio_stream.close() self.closed = True # Signal the generator to terminate so that the client's # streaming_recognize method will not block the process termination. self._buff.put(None) self._audio_interface.terminate() def _fill_buffer(self, in_data, frame_count, time_info, status_flags): """Continuously collect data from the audio stream, into the buffer.""" self._buff.put(in_data) return None, pyaudio.paContinue def generator(self): while not self.closed: # Use a blocking get() to ensure there's at least one chunk of # data, and stop iteration if the chunk is None, indicating the # end of the audio stream. chunk = self._buff.get() if chunk is None: return data = [chunk] # Now consume whatever other data's still buffered. while True: try: chunk = self._buff.get(block=False) if chunk is None: return data.append(chunk) except queue.Empty: break ans = np.fromstring(b"".join(data), dtype=np.float32) # yield uniform-sized chunks ans = np.split(ans, np.shape(ans)[0] / self._chunk) # Resample the audio to 22050, librosa default for chunk in ans: yield librosa.core.resample(chunk, self._rate, 22050) def get_microphone_chunks( min_to_cumulate=5, # 0.5 seconds max_to_cumulate=100, # 10 seconds precumulate=5, max_to_visualize=100, ): vad = VoiceActivityDetection() cumulated = [] precumulated = deque(maxlen=precumulate) with MicrophoneStream() as stream: audio_generator = stream.generator() chunk_length = stream._chunk waveform = torch.zeros(max_to_visualize * chunk_length) for chunk in audio_generator: # Is speech? chunk = torch.tensor(chunk) is_speech = vad.iter(chunk) # Cumulate speech if is_speech or cumulated: cumulated.append(chunk) else: precumulated.append(chunk) if (not is_speech and len(cumulated) >= min_to_cumulate) or ( len(cumulated) > max_to_cumulate ): waveform = torch.cat(list(precumulated) + cumulated, -1) yield (waveform * stream._rate, stream._rate) cumulated = [] precumulated = deque(maxlen=precumulate) audio-0.7.2/examples/pipeline_wav2letter/000077500000000000000000000000001376444676100204455ustar00rootroot00000000000000audio-0.7.2/examples/pipeline_wav2letter/README.md000066400000000000000000000066561376444676100217410ustar00rootroot00000000000000This is an example pipeline for speech recognition using a greedy or Viterbi CTC decoder, along with the Wav2Letter model trained on LibriSpeech, see [Wav2Letter: an End-to-End ConvNet-based Speech Recognition System](https://arxiv.org/pdf/1609.03193.pdf). Wav2Letter and LibriSpeech are available in torchaudio. ### Usage More information about each command line parameters is available with the `--help` option. An example can be invoked as follows. ``` python main.py \ --reduce-lr-valid \ --dataset-train train-clean-100 train-clean-360 train-other-500 \ --dataset-valid dev-clean \ --batch-size 128 \ --learning-rate .6 \ --momentum .8 \ --weight-decay .00001 \ --clip-grad 0. \ --gamma .99 \ --hop-length 160 \ --n-hidden-channels 2000 \ --win-length 400 \ --n-bins 13 \ --normalize \ --optimizer adadelta \ --scheduler reduceonplateau \ --epochs 30 ``` With these default parameters, we get a character error rate of 13.8% on dev-clean after 30 epochs. ### Output The information reported at each iteration and epoch (e.g. loss, character error rate, word error rate) is printed to standard output in the form of one json per line, e.g. ```python {"name": "train", "epoch": 0, "cer over target length": 1.0, "cumulative cer": 23317.0, "total chars": 23317.0, "cer": 0.0, "cumulative cer over target length": 0.0, "wer over target length": 1.0, "cumulative wer": 4446.0, "total words": 4446.0, "wer": 0.0, "cumulative wer over target length": 0.0, "lr": 0.6, "batch size": 128, "n_channel": 13, "n_time": 2453, "dataset length": 128.0, "iteration": 1.0, "loss": 8.712121963500977, "cumulative loss": 8.712121963500977, "average loss": 8.712121963500977, "iteration time": 41.46276903152466, "epoch time": 41.46276903152466} {"name": "train", "epoch": 0, "cer over target length": 1.0, "cumulative cer": 46005.0, "total chars": 46005.0, "cer": 0.0, "cumulative cer over target length": 0.0, "wer over target length": 1.0, "cumulative wer": 8762.0, "total words": 8762.0, "wer": 0.0, "cumulative wer over target length": 0.0, "lr": 0.6, "batch size": 128, "n_channel": 13, "n_time": 1703, "dataset length": 256.0, "iteration": 2.0, "loss": 8.918599128723145, "cumulative loss": 17.63072109222412, "average loss": 8.81536054611206, "iteration time": 1.2905676364898682, "epoch time": 42.753336668014526} {"name": "train", "epoch": 0, "cer over target length": 1.0, "cumulative cer": 70030.0, "total chars": 70030.0, "cer": 0.0, "cumulative cer over target length": 0.0, "wer over target length": 1.0, "cumulative wer": 13348.0, "total words": 13348.0, "wer": 0.0, "cumulative wer over target length": 0.0, "lr": 0.6, "batch size": 128, "n_channel": 13, "n_time": 1713, "dataset length": 384.0, "iteration": 3.0, "loss": 8.550191879272461, "cumulative loss": 26.180912971496582, "average loss": 8.726970990498861, "iteration time": 1.2109291553497314, "epoch time": 43.96426582336426} ``` One way to import the output in python with pandas is by saving the standard output to a file, and then using `pandas.read_json(filename, lines=True)`. ## Structure of pipeline * `main.py` -- the entry point * `ctc_decoders.py` -- the greedy CTC decoder * `datasets.py` -- the function to split and process librispeech, a collate factory function * `languagemodels.py` -- a class to encode and decode strings * `metrics.py` -- the levenshtein edit distance * `utils.py` -- functions to log metrics, save checkpoint, and count parameters audio-0.7.2/examples/pipeline_wav2letter/ctc_decoders.py000066400000000000000000000007041376444676100234410ustar00rootroot00000000000000from torch import topk class GreedyDecoder: def __call__(self, outputs): """Greedy Decoder. Returns highest probability of class labels for each timestep Args: outputs (torch.Tensor): shape (input length, batch size, number of classes (including blank)) Returns: torch.Tensor: class labels per time step. """ _, indices = topk(outputs, k=1, dim=-1) return indices[..., 0] audio-0.7.2/examples/pipeline_wav2letter/datasets.py000066400000000000000000000060321376444676100226300ustar00rootroot00000000000000import torch from torchaudio.datasets import LIBRISPEECH class MapMemoryCache(torch.utils.data.Dataset): """ Wrap a dataset so that, whenever a new item is returned, it is saved to memory. """ def __init__(self, dataset): self.dataset = dataset self._cache = [None] * len(dataset) def __getitem__(self, n): if self._cache[n] is not None: return self._cache[n] item = self.dataset[n] self._cache[n] = item return item def __len__(self): return len(self.dataset) class Processed(torch.utils.data.Dataset): def __init__(self, dataset, transforms, encode): self.dataset = dataset self.transforms = transforms self.encode = encode def __getitem__(self, key): item = self.dataset[key] return self.process_datapoint(item) def __len__(self): return len(self.dataset) def process_datapoint(self, item): transformed = item[0] target = item[2].lower() transformed = self.transforms(transformed) transformed = transformed[0, ...].transpose(0, -1) target = self.encode(target) target = torch.tensor(target, dtype=torch.long, device=transformed.device) return transformed, target def split_process_librispeech( datasets, transforms, language_model, root, folder_in_archive, ): def create(tags, cache=True): if isinstance(tags, str): tags = [tags] if isinstance(transforms, list): transform_list = transforms else: transform_list = [transforms] data = torch.utils.data.ConcatDataset( [ Processed( LIBRISPEECH( root, tag, folder_in_archive=folder_in_archive, download=False, ), transform, language_model.encode, ) for tag, transform in zip(tags, transform_list) ] ) data = MapMemoryCache(data) return data # For performance, we cache all datasets return tuple(create(dataset) for dataset in datasets) def collate_factory(model_length_function, transforms=None): if transforms is None: transforms = torch.nn.Sequential() def collate_fn(batch): tensors = [transforms(b[0]) for b in batch if b] tensors_lengths = torch.tensor( [model_length_function(t) for t in tensors], dtype=torch.long, device=tensors[0].device, ) tensors = torch.nn.utils.rnn.pad_sequence(tensors, batch_first=True) tensors = tensors.transpose(1, -1) targets = [b[1] for b in batch if b] target_lengths = torch.tensor( [target.shape[0] for target in targets], dtype=torch.long, device=tensors.device, ) targets = torch.nn.utils.rnn.pad_sequence(targets, batch_first=True) return tensors, targets, tensors_lengths, target_lengths return collate_fn audio-0.7.2/examples/pipeline_wav2letter/languagemodels.py000066400000000000000000000022441376444676100240100ustar00rootroot00000000000000import collections import itertools class LanguageModel: def __init__(self, labels, char_blank, char_space): self.char_space = char_space self.char_blank = char_blank labels = [l for l in labels] self.length = len(labels) enumerated = list(enumerate(labels)) flipped = [(sub[1], sub[0]) for sub in enumerated] d1 = collections.OrderedDict(enumerated) d2 = collections.OrderedDict(flipped) self.mapping = {**d1, **d2} def encode(self, iterable): if isinstance(iterable, list): return [self.encode(i) for i in iterable] else: return [self.mapping[i] + self.mapping[self.char_blank] for i in iterable] def decode(self, tensor): if len(tensor) > 0 and isinstance(tensor[0], list): return [self.decode(t) for t in tensor] else: # not idempotent, since clean string x = (self.mapping[i] for i in tensor) x = "".join(i for i, _ in itertools.groupby(x)) x = x.replace(self.char_blank, "") # x = x.strip() return x def __len__(self): return self.length audio-0.7.2/examples/pipeline_wav2letter/main.py000066400000000000000000000453021376444676100217470ustar00rootroot00000000000000import argparse import logging import os import string from datetime import datetime from time import time import torch import torchaudio from torch.optim import SGD, Adadelta, Adam, AdamW from torch.optim.lr_scheduler import ExponentialLR, ReduceLROnPlateau from torch.utils.data import DataLoader from torchaudio.datasets.utils import bg_iterator from torchaudio.models.wav2letter import Wav2Letter from ctc_decoders import GreedyDecoder from datasets import collate_factory, split_process_librispeech from languagemodels import LanguageModel from metrics import levenshtein_distance from transforms import Normalize, UnsqueezeFirst from utils import MetricLogger, count_parameters, save_checkpoint def parse_args(): parser = argparse.ArgumentParser() parser.add_argument( "--type", metavar="T", default="mfcc", choices=["waveform", "mfcc"], help="input type for model", ) parser.add_argument( "--freq-mask", default=0, type=int, metavar="N", help="maximal width of frequency mask", ) parser.add_argument( "--win-length", default=400, type=int, metavar="N", help="width of spectrogram window", ) parser.add_argument( "--hop-length", default=160, type=int, metavar="N", help="width of spectrogram window", ) parser.add_argument( "--time-mask", default=0, type=int, metavar="N", help="maximal width of time mask", ) parser.add_argument( "--workers", default=0, type=int, metavar="N", help="number of data loading workers", ) parser.add_argument( "--checkpoint", default="", type=str, metavar="PATH", help="path to latest checkpoint", ) parser.add_argument( "--epochs", default=200, type=int, metavar="N", help="number of total epochs to run", ) parser.add_argument( "--start-epoch", default=0, type=int, metavar="N", help="manual epoch number" ) parser.add_argument( "--print-freq", default=10, type=int, metavar="N", help="print frequency in epochs", ) parser.add_argument( "--reduce-lr-valid", action="store_true", help="reduce learning rate based on validation loss", ) parser.add_argument( "--normalize", action="store_true", help="normalize model input" ) parser.add_argument( "--progress-bar", action="store_true", help="use progress bar while training" ) parser.add_argument( "--decoder", metavar="D", default="greedy", choices=["greedy"], help="decoder to use", ) parser.add_argument( "--batch-size", default=128, type=int, metavar="N", help="mini-batch size" ) parser.add_argument( "--n-bins", default=13, type=int, metavar="N", help="number of bins in transforms", ) parser.add_argument( "--optimizer", metavar="OPT", default="adadelta", choices=["sgd", "adadelta", "adam", "adamw"], help="optimizer to use", ) parser.add_argument( "--scheduler", metavar="S", default="reduceonplateau", choices=["exponential", "reduceonplateau"], help="optimizer to use", ) parser.add_argument( "--learning-rate", default=0.6, type=float, metavar="LR", help="initial learning rate", ) parser.add_argument( "--gamma", default=0.99, type=float, metavar="GAMMA", help="learning rate exponential decay constant", ) parser.add_argument( "--momentum", default=0.8, type=float, metavar="M", help="momentum" ) parser.add_argument( "--weight-decay", default=1e-5, type=float, metavar="W", help="weight decay" ) parser.add_argument("--eps", metavar="EPS", type=float, default=1e-8) parser.add_argument("--rho", metavar="RHO", type=float, default=0.95) parser.add_argument("--clip-grad", metavar="NORM", type=float, default=0.0) parser.add_argument( "--dataset-root", type=str, help="specify dataset root folder", ) parser.add_argument( "--dataset-folder-in-archive", type=str, help="specify dataset folder in archive", ) parser.add_argument( "--dataset-train", default=["train-clean-100"], nargs="+", type=str, help="select which part of librispeech to train with", ) parser.add_argument( "--dataset-valid", default=["dev-clean"], nargs="+", type=str, help="select which part of librispeech to validate with", ) parser.add_argument( "--distributed", action="store_true", help="enable DistributedDataParallel" ) parser.add_argument("--seed", type=int, default=0, help="random seed") parser.add_argument( "--world-size", type=int, default=8, help="the world size to initiate DPP" ) parser.add_argument("--jit", action="store_true", help="if used, model is jitted") args = parser.parse_args() logging.info(args) return args def setup_distributed(rank, world_size): os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "12355" # initialize the process group torch.distributed.init_process_group("nccl", rank=rank, world_size=world_size) def model_length_function(tensor): if tensor.shape[1] == 1: # waveform mode return int(tensor.shape[0]) // 160 // 2 + 1 return int(tensor.shape[0]) // 2 + 1 def compute_error_rates(outputs, targets, decoder, language_model, metric): output = outputs.transpose(0, 1).to("cpu") output = decoder(output) # Compute CER output = language_model.decode(output.tolist()) target = language_model.decode(targets.tolist()) print_length = 20 for i in range(2): # Print a few examples output_print = output[i].ljust(print_length)[:print_length] target_print = target[i].ljust(print_length)[:print_length] logging.info("Target: %s Output: %s", target_print, output_print) cers = [levenshtein_distance(t, o) for t, o in zip(target, output)] cers = sum(cers) n = sum(len(t) for t in target) metric["cer over target length"] = cers / n metric["cumulative cer"] += cers metric["total chars"] += n metric["cumulative cer over target length"] = metric["cer"] / metric["total chars"] # Compute WER output = [o.split(language_model.char_space) for o in output] target = [t.split(language_model.char_space) for t in target] wers = [levenshtein_distance(t, o) for t, o in zip(target, output)] wers = sum(wers) n = sum(len(t) for t in target) metric["wer over target length"] = wers / n metric["cumulative wer"] += wers metric["total words"] += n metric["cumulative wer over target length"] = metric["wer"] / metric["total words"] def train_one_epoch( model, criterion, optimizer, scheduler, data_loader, decoder, language_model, device, epoch, clip_grad, disable_logger=False, reduce_lr_on_plateau=False, ): model.train() metric = MetricLogger("train", disable=disable_logger) metric["epoch"] = epoch for inputs, targets, tensors_lengths, target_lengths in bg_iterator( data_loader, maxsize=2 ): start = time() inputs = inputs.to(device, non_blocking=True) targets = targets.to(device, non_blocking=True) # keep batch first for data parallel outputs = model(inputs).transpose(-1, -2).transpose(0, 1) # CTC # outputs: input length, batch size, number of classes (including blank) # targets: batch size, max target length # input_lengths: batch size # target_lengths: batch size loss = criterion(outputs, targets, tensors_lengths, target_lengths) optimizer.zero_grad() loss.backward() if clip_grad > 0: metric["gradient"] = torch.nn.utils.clip_grad_norm_( model.parameters(), clip_grad ) optimizer.step() compute_error_rates(outputs, targets, decoder, language_model, metric) try: metric["lr"] = scheduler.get_last_lr()[0] except AttributeError: metric["lr"] = optimizer.param_groups[0]["lr"] metric["batch size"] = len(inputs) metric["n_channel"] = inputs.shape[1] metric["n_time"] = inputs.shape[-1] metric["dataset length"] += metric["batch size"] metric["iteration"] += 1 metric["loss"] = loss.item() metric["cumulative loss"] += metric["loss"] metric["average loss"] = metric["cumulative loss"] / metric["iteration"] metric["iteration time"] = time() - start metric["epoch time"] += metric["iteration time"] metric() if reduce_lr_on_plateau and isinstance(scheduler, ReduceLROnPlateau): scheduler.step(metric["average loss"]) elif not isinstance(scheduler, ReduceLROnPlateau): scheduler.step() def evaluate( model, criterion, data_loader, decoder, language_model, device, epoch, disable_logger=False, ): with torch.no_grad(): model.eval() start = time() metric = MetricLogger("validation", disable=disable_logger) metric["epoch"] = epoch for inputs, targets, tensors_lengths, target_lengths in bg_iterator( data_loader, maxsize=2 ): inputs = inputs.to(device, non_blocking=True) targets = targets.to(device, non_blocking=True) # keep batch first for data parallel outputs = model(inputs).transpose(-1, -2).transpose(0, 1) # CTC # outputs: input length, batch size, number of classes (including blank) # targets: batch size, max target length # input_lengths: batch size # target_lengths: batch size metric["cumulative loss"] += criterion( outputs, targets, tensors_lengths, target_lengths ).item() metric["dataset length"] += len(inputs) metric["iteration"] += 1 compute_error_rates(outputs, targets, decoder, language_model, metric) metric["average loss"] = metric["cumulative loss"] / metric["iteration"] metric["validation time"] = time() - start metric() return metric["average loss"] def main(rank, args): # Distributed setup if args.distributed: setup_distributed(rank, args.world_size) not_main_rank = args.distributed and rank != 0 logging.info("Start time: %s", datetime.now()) # Explicitly set seed to make sure models created in separate processes # start from same random weights and biases torch.manual_seed(args.seed) # Empty CUDA cache torch.cuda.empty_cache() # Change backend for flac files torchaudio.set_audio_backend("soundfile") # Transforms melkwargs = { "n_fft": args.win_length, "n_mels": args.n_bins, "hop_length": args.hop_length, } sample_rate_original = 16000 if args.type == "mfcc": transforms = torch.nn.Sequential( torchaudio.transforms.MFCC( sample_rate=sample_rate_original, n_mfcc=args.n_bins, melkwargs=melkwargs, ), ) num_features = args.n_bins elif args.type == "waveform": transforms = torch.nn.Sequential(UnsqueezeFirst()) num_features = 1 else: raise ValueError("Model type not supported") if args.normalize: transforms = torch.nn.Sequential(transforms, Normalize()) augmentations = torch.nn.Sequential() if args.freq_mask: augmentations = torch.nn.Sequential( augmentations, torchaudio.transforms.FrequencyMasking(freq_mask_param=args.freq_mask), ) if args.time_mask: augmentations = torch.nn.Sequential( augmentations, torchaudio.transforms.TimeMasking(time_mask_param=args.time_mask), ) # Text preprocessing char_blank = "*" char_space = " " char_apostrophe = "'" labels = char_blank + char_space + char_apostrophe + string.ascii_lowercase language_model = LanguageModel(labels, char_blank, char_space) # Dataset training, validation = split_process_librispeech( [args.dataset_train, args.dataset_valid], [transforms, transforms], language_model, root=args.dataset_root, folder_in_archive=args.dataset_folder_in_archive, ) # Decoder if args.decoder == "greedy": decoder = GreedyDecoder() else: raise ValueError("Selected decoder not supported") # Model model = Wav2Letter( num_classes=language_model.length, input_type=args.type, num_features=num_features, ) if args.jit: model = torch.jit.script(model) if args.distributed: n = torch.cuda.device_count() // args.world_size devices = list(range(rank * n, (rank + 1) * n)) model = model.to(devices[0]) model = torch.nn.parallel.DistributedDataParallel(model, device_ids=devices) else: devices = ["cuda" if torch.cuda.is_available() else "cpu"] model = model.to(devices[0], non_blocking=True) model = torch.nn.DataParallel(model) n = count_parameters(model) logging.info("Number of parameters: %s", n) # Optimizer if args.optimizer == "adadelta": optimizer = Adadelta( model.parameters(), lr=args.learning_rate, weight_decay=args.weight_decay, eps=args.eps, rho=args.rho, ) elif args.optimizer == "sgd": optimizer = SGD( model.parameters(), lr=args.learning_rate, momentum=args.momentum, weight_decay=args.weight_decay, ) elif args.optimizer == "adam": optimizer = Adam( model.parameters(), lr=args.learning_rate, momentum=args.momentum, weight_decay=args.weight_decay, ) elif args.optimizer == "adamw": optimizer = AdamW( model.parameters(), lr=args.learning_rate, momentum=args.momentum, weight_decay=args.weight_decay, ) else: raise ValueError("Selected optimizer not supported") if args.scheduler == "exponential": scheduler = ExponentialLR(optimizer, gamma=args.gamma) elif args.scheduler == "reduceonplateau": scheduler = ReduceLROnPlateau(optimizer, patience=10, threshold=1e-3) else: raise ValueError("Selected scheduler not supported") criterion = torch.nn.CTCLoss( blank=language_model.mapping[char_blank], zero_infinity=False ) # Data Loader collate_fn_train = collate_factory(model_length_function, augmentations) collate_fn_valid = collate_factory(model_length_function) loader_training_params = { "num_workers": args.workers, "pin_memory": True, "shuffle": True, "drop_last": True, } loader_validation_params = loader_training_params.copy() loader_validation_params["shuffle"] = False loader_training = DataLoader( training, batch_size=args.batch_size, collate_fn=collate_fn_train, **loader_training_params, ) loader_validation = DataLoader( validation, batch_size=args.batch_size, collate_fn=collate_fn_valid, **loader_validation_params, ) # Setup checkpoint best_loss = 1.0 load_checkpoint = args.checkpoint and os.path.isfile(args.checkpoint) if args.distributed: torch.distributed.barrier() if load_checkpoint: logging.info("Checkpoint: loading %s", args.checkpoint) checkpoint = torch.load(args.checkpoint) args.start_epoch = checkpoint["epoch"] best_loss = checkpoint["best_loss"] model.load_state_dict(checkpoint["state_dict"]) optimizer.load_state_dict(checkpoint["optimizer"]) scheduler.load_state_dict(checkpoint["scheduler"]) logging.info( "Checkpoint: loaded '%s' at epoch %s", args.checkpoint, checkpoint["epoch"] ) else: logging.info("Checkpoint: not found") save_checkpoint( { "epoch": args.start_epoch, "state_dict": model.state_dict(), "best_loss": best_loss, "optimizer": optimizer.state_dict(), "scheduler": scheduler.state_dict(), }, False, args.checkpoint, not_main_rank, ) if args.distributed: torch.distributed.barrier() torch.autograd.set_detect_anomaly(False) for epoch in range(args.start_epoch, args.epochs): logging.info("Epoch: %s", epoch) train_one_epoch( model, criterion, optimizer, scheduler, loader_training, decoder, language_model, devices[0], epoch, args.clip_grad, not_main_rank, not args.reduce_lr_valid, ) if not (epoch + 1) % args.print_freq or epoch == args.epochs - 1: loss = evaluate( model, criterion, loader_validation, decoder, language_model, devices[0], epoch, not_main_rank, ) is_best = loss < best_loss best_loss = min(loss, best_loss) save_checkpoint( { "epoch": epoch + 1, "state_dict": model.state_dict(), "best_loss": best_loss, "optimizer": optimizer.state_dict(), "scheduler": scheduler.state_dict(), }, is_best, args.checkpoint, not_main_rank, ) if args.reduce_lr_valid and isinstance(scheduler, ReduceLROnPlateau): scheduler.step(loss) logging.info("End time: %s", datetime.now()) if args.distributed: torch.distributed.destroy_process_group() def spawn_main(main, args): if args.distributed: torch.multiprocessing.spawn( main, args=(args,), nprocs=args.world_size, join=True ) else: main(0, args) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) args = parse_args() spawn_main(main, args) audio-0.7.2/examples/pipeline_wav2letter/metrics.py000066400000000000000000000023431376444676100224670ustar00rootroot00000000000000from typing import List, Union def levenshtein_distance(r: Union[str, List[str]], h: Union[str, List[str]]): """ Calculate the Levenshtein distance between two lists or strings. """ # Initialisation dold = list(range(len(h) + 1)) dnew = list(0 for _ in range(len(h) + 1)) # Computation for i in range(1, len(r) + 1): dnew[0] = i for j in range(1, len(h) + 1): if r[i - 1] == h[j - 1]: dnew[j] = dold[j - 1] else: substitution = dold[j - 1] + 1 insertion = dnew[j - 1] + 1 deletion = dold[j] + 1 dnew[j] = min(substitution, insertion, deletion) dnew, dold = dold, dnew return dold[-1] if __name__ == "__main__": assert levenshtein_distance("abc", "abc") == 0 assert levenshtein_distance("aaa", "aba") == 1 assert levenshtein_distance("aba", "aaa") == 1 assert levenshtein_distance("aa", "aaa") == 1 assert levenshtein_distance("aaa", "aa") == 1 assert levenshtein_distance("abc", "bcd") == 2 assert levenshtein_distance(["hello", "world"], ["hello", "world", "!"]) == 1 assert levenshtein_distance(["hello", "world"], ["world", "hello", "!"]) == 2 audio-0.7.2/examples/pipeline_wav2letter/transforms.py000066400000000000000000000004221376444676100232130ustar00rootroot00000000000000import torch class Normalize(torch.nn.Module): def forward(self, tensor): return (tensor - tensor.mean(-1, keepdim=True)) / tensor.std(-1, keepdim=True) class UnsqueezeFirst(torch.nn.Module): def forward(self, tensor): return tensor.unsqueeze(0) audio-0.7.2/examples/pipeline_wav2letter/utils.py000066400000000000000000000025171376444676100221640ustar00rootroot00000000000000import json import logging import os import shutil from collections import defaultdict import torch class MetricLogger(defaultdict): def __init__(self, name, print_freq=1, disable=False): super().__init__(lambda: 0.0) self.disable = disable self.print_freq = print_freq self._iter = 0 self["name"] = name def __str__(self): return json.dumps(self) def __call__(self): self._iter = (self._iter + 1) % self.print_freq if not self.disable and not self._iter: print(self, flush=True) def save_checkpoint(state, is_best, filename, disable): """ Save the model to a temporary file first, then copy it to filename, in case the signal interrupts the torch.save() process. """ if disable: return if filename == "": return tempfile = filename + ".temp" # Remove tempfile in case interuption during the copying from tempfile to filename if os.path.isfile(tempfile): os.remove(tempfile) torch.save(state, tempfile) if os.path.isfile(tempfile): os.rename(tempfile, filename) if is_best: shutil.copyfile(filename, "model_best.pth.tar") logging.warning("Checkpoint: saved") def count_parameters(model): return sum(p.numel() for p in model.parameters() if p.requires_grad) audio-0.7.2/examples/pipeline_wavernn/000077500000000000000000000000001376444676100200265ustar00rootroot00000000000000audio-0.7.2/examples/pipeline_wavernn/README.md000066400000000000000000000021471376444676100213110ustar00rootroot00000000000000This is an example vocoder pipeline using the WaveRNN model trained with LJSpeech. WaveRNN model is based on the implementation from [this repository](https://github.com/fatchord/WaveRNN). The original implementation was introduced in "Efficient Neural Audio Synthesis". WaveRNN and LJSpeech are available in torchaudio. ### Usage An example can be invoked as follows. ``` python main.py \ --batch-size 256 \ --learning-rate 1e-4 \ --n-freq 80 \ --loss 'crossentropy' \ --n-bits 8 \ ``` ### Output The information reported at each iteration and epoch (e.g. loss) is printed to standard output in the form of one json per line. Here is an example python function to parse the output if redirected to a file. ```python def read_json(filename): """ Convert the standard output saved to filename into a pandas dataframe for analysis. """ import pandas import json with open(filename, "r") as f: data = f.read() # pandas doesn't read single quotes for json data = data.replace("'", '"') data = [json.loads(l) for l in data.splitlines()] return pandas.DataFrame(data) ``` audio-0.7.2/examples/pipeline_wavernn/datasets.py000066400000000000000000000074121376444676100222140ustar00rootroot00000000000000import os import random import torch import torchaudio from torch.utils.data.dataset import random_split from torchaudio.datasets import LJSPEECH, LIBRITTS from torchaudio.transforms import MuLawEncoding from processing import bits_to_normalized_waveform, normalized_waveform_to_bits class MapMemoryCache(torch.utils.data.Dataset): r"""Wrap a dataset so that, whenever a new item is returned, it is saved to memory. """ def __init__(self, dataset): self.dataset = dataset self._cache = [None] * len(dataset) def __getitem__(self, n): if self._cache[n] is not None: return self._cache[n] item = self.dataset[n] self._cache[n] = item return item def __len__(self): return len(self.dataset) class Processed(torch.utils.data.Dataset): def __init__(self, dataset, transforms): self.dataset = dataset self.transforms = transforms def __getitem__(self, key): item = self.dataset[key] return self.process_datapoint(item) def __len__(self): return len(self.dataset) def process_datapoint(self, item): specgram = self.transforms(item[0]) return item[0].squeeze(0), specgram def split_process_dataset(args, transforms): if args.dataset == 'ljspeech': data = LJSPEECH(root=args.file_path, download=False) val_length = int(len(data) * args.val_ratio) lengths = [len(data) - val_length, val_length] train_dataset, val_dataset = random_split(data, lengths) elif args.dataset == 'libritts': train_dataset = LIBRITTS(root=args.file_path, url='train-clean-100', download=False) val_dataset = LIBRITTS(root=args.file_path, url='dev-clean', download=False) else: raise ValueError(f"Expected dataset: `ljspeech` or `libritts`, but found {args.dataset}") train_dataset = Processed(train_dataset, transforms) val_dataset = Processed(val_dataset, transforms) train_dataset = MapMemoryCache(train_dataset) val_dataset = MapMemoryCache(val_dataset) return train_dataset, val_dataset def collate_factory(args): def raw_collate(batch): pad = (args.kernel_size - 1) // 2 # input waveform length wave_length = args.hop_length * args.seq_len_factor # input spectrogram length spec_length = args.seq_len_factor + pad * 2 # max start postion in spectrogram max_offsets = [x[1].shape[-1] - (spec_length + pad * 2) for x in batch] # random start postion in spectrogram spec_offsets = [random.randint(0, offset) for offset in max_offsets] # random start postion in waveform wave_offsets = [(offset + pad) * args.hop_length for offset in spec_offsets] waveform_combine = [ x[0][wave_offsets[i]: wave_offsets[i] + wave_length + 1] for i, x in enumerate(batch) ] specgram = [ x[1][:, spec_offsets[i]: spec_offsets[i] + spec_length] for i, x in enumerate(batch) ] specgram = torch.stack(specgram) waveform_combine = torch.stack(waveform_combine) waveform = waveform_combine[:, :wave_length] target = waveform_combine[:, 1:] # waveform: [-1, 1], target: [0, 2**bits-1] if loss = 'crossentropy' if args.loss == "crossentropy": if args.mulaw: mulaw_encode = MuLawEncoding(2 ** args.n_bits) waveform = mulaw_encode(waveform) target = mulaw_encode(target) waveform = bits_to_normalized_waveform(waveform, args.n_bits) else: target = normalized_waveform_to_bits(target, args.n_bits) return waveform.unsqueeze(1), specgram.unsqueeze(1), target.unsqueeze(1) return raw_collate audio-0.7.2/examples/pipeline_wavernn/losses.py000066400000000000000000000074711376444676100217210ustar00rootroot00000000000000import math import torch from torch import nn as nn from torch.nn import functional as F class LongCrossEntropyLoss(nn.Module): r""" CrossEntropy loss """ def __init__(self): super(LongCrossEntropyLoss, self).__init__() def forward(self, output, target): output = output.transpose(1, 2) target = target.long() criterion = nn.CrossEntropyLoss() return criterion(output, target) class MoLLoss(nn.Module): r""" Discretized mixture of logistic distributions loss Adapted from wavenet vocoder (https://github.com/r9y9/wavenet_vocoder/blob/master/wavenet_vocoder/mixture.py) Explanation of loss (https://github.com/Rayhane-mamah/Tacotron-2/issues/155) Args: y_hat (Tensor): Predicted output (n_batch x n_time x n_channel) y (Tensor): Target (n_batch x n_time x 1) num_classes (int): Number of classes log_scale_min (float): Log scale minimum value reduce (bool): If True, the losses are averaged or summed for each minibatch Returns Tensor: loss """ def __init__(self, num_classes=65536, log_scale_min=None, reduce=True): super(MoLLoss, self).__init__() self.num_classes = num_classes self.log_scale_min = log_scale_min self.reduce = reduce def forward(self, y_hat, y): y = y.unsqueeze(-1) if self.log_scale_min is None: self.log_scale_min = math.log(1e-14) assert y_hat.dim() == 3 assert y_hat.size(-1) % 3 == 0 nr_mix = y_hat.size(-1) // 3 # unpack parameters (n_batch, n_time, num_mixtures) x 3 logit_probs = y_hat[:, :, :nr_mix] means = y_hat[:, :, nr_mix: 2 * nr_mix] log_scales = torch.clamp( y_hat[:, :, 2 * nr_mix: 3 * nr_mix], min=self.log_scale_min ) # (n_batch x n_time x 1) to (n_batch x n_time x num_mixtures) y = y.expand_as(means) centered_y = y - means inv_stdv = torch.exp(-log_scales) plus_in = inv_stdv * (centered_y + 1.0 / (self.num_classes - 1)) cdf_plus = torch.sigmoid(plus_in) min_in = inv_stdv * (centered_y - 1.0 / (self.num_classes - 1)) cdf_min = torch.sigmoid(min_in) # log probability for edge case of 0 (before scaling) # equivalent: torch.log(F.sigmoid(plus_in)) log_cdf_plus = plus_in - F.softplus(plus_in) # log probability for edge case of 255 (before scaling) # equivalent: (1 - F.sigmoid(min_in)).log() log_one_minus_cdf_min = -F.softplus(min_in) # probability for all other cases cdf_delta = cdf_plus - cdf_min mid_in = inv_stdv * centered_y # log probability in the center of the bin, to be used in extreme cases log_pdf_mid = mid_in - log_scales - 2.0 * F.softplus(mid_in) inner_inner_cond = (cdf_delta > 1e-5).float() inner_inner_out = inner_inner_cond * torch.log( torch.clamp(cdf_delta, min=1e-12) ) + (1.0 - inner_inner_cond) * ( log_pdf_mid - math.log((self.num_classes - 1) / 2) ) inner_cond = (y > 0.999).float() inner_out = ( inner_cond * log_one_minus_cdf_min + (1.0 - inner_cond) * inner_inner_out ) cond = (y < -0.999).float() log_probs = cond * log_cdf_plus + (1.0 - cond) * inner_out log_probs = log_probs + F.log_softmax(logit_probs, -1) if self.reduce: return -torch.mean(_log_sum_exp(log_probs)) else: return -_log_sum_exp(log_probs).unsqueeze(-1) def _log_sum_exp(x): r""" Numerically stable log_sum_exp implementation that prevents overflow """ axis = len(x.size()) - 1 m, _ = torch.max(x, dim=axis) m2, _ = torch.max(x, dim=axis, keepdim=True) return m + torch.log(torch.sum(torch.exp(x - m2), dim=axis)) audio-0.7.2/examples/pipeline_wavernn/main.py000066400000000000000000000260621376444676100213320ustar00rootroot00000000000000import argparse import logging import os import signal from collections import defaultdict from datetime import datetime from time import time from typing import List import torch import torchaudio from torch import nn as nn from torch.optim import Adam from torch.utils.data import DataLoader from torchaudio.datasets.utils import bg_iterator from torchaudio.models.wavernn import WaveRNN from datasets import collate_factory, split_process_dataset from losses import LongCrossEntropyLoss, MoLLoss from processing import LinearToMel, NormalizeDB from utils import MetricLogger, count_parameters, save_checkpoint def parse_args(): parser = argparse.ArgumentParser() parser.add_argument( "--workers", default=4, type=int, metavar="N", help="number of data loading workers", ) parser.add_argument( "--checkpoint", default="", type=str, metavar="PATH", help="path to latest checkpoint", ) parser.add_argument( "--epochs", default=8000, type=int, metavar="N", help="number of total epochs to run", ) parser.add_argument( "--start-epoch", default=0, type=int, metavar="N", help="manual epoch number" ) parser.add_argument( "--print-freq", default=10, type=int, metavar="N", help="print frequency in epochs", ) parser.add_argument( "--dataset", default="ljspeech", choices=["ljspeech", "libritts"], type=str, help="select dataset to train with", ) parser.add_argument( "--batch-size", default=256, type=int, metavar="N", help="mini-batch size" ) parser.add_argument( "--learning-rate", default=1e-4, type=float, metavar="LR", help="learning rate", ) parser.add_argument("--clip-grad", metavar="NORM", type=float, default=4.0) parser.add_argument( "--mulaw", default=True, action="store_true", help="if used, waveform is mulaw encoded", ) parser.add_argument( "--jit", default=False, action="store_true", help="if used, model is jitted" ) parser.add_argument( "--upsample-scales", default=[5, 5, 11], type=List[int], help="the list of upsample scales", ) parser.add_argument( "--n-bits", default=8, type=int, help="the bits of output waveform", ) parser.add_argument( "--sample-rate", default=22050, type=int, help="the rate of audio dimensions (samples per second)", ) parser.add_argument( "--hop-length", default=275, type=int, help="the number of samples between the starts of consecutive frames", ) parser.add_argument( "--win-length", default=1100, type=int, help="the length of the STFT window", ) parser.add_argument( "--f-min", default=40.0, type=float, help="the minimum frequency", ) parser.add_argument( "--min-level-db", default=-100, type=float, help="the minimum db value for spectrogam normalization", ) parser.add_argument( "--n-res-block", default=10, type=int, help="the number of ResBlock in stack", ) parser.add_argument( "--n-rnn", default=512, type=int, help="the dimension of RNN layer", ) parser.add_argument( "--n-fc", default=512, type=int, help="the dimension of fully connected layer", ) parser.add_argument( "--kernel-size", default=5, type=int, help="the number of kernel size in the first Conv1d layer", ) parser.add_argument( "--n-freq", default=80, type=int, help="the number of spectrogram bins to use", ) parser.add_argument( "--n-hidden-melresnet", default=128, type=int, help="the number of hidden dimensions of resblock in melresnet", ) parser.add_argument( "--n-output-melresnet", default=128, type=int, help="the output dimension of melresnet", ) parser.add_argument( "--n-fft", default=2048, type=int, help="the number of Fourier bins", ) parser.add_argument( "--loss", default="crossentropy", choices=["crossentropy", "mol"], type=str, help="the type of loss", ) parser.add_argument( "--seq-len-factor", default=5, type=int, help="the length of each waveform to process per batch = hop_length * seq_len_factor", ) parser.add_argument( "--val-ratio", default=0.1, type=float, help="the ratio of waveforms for validation", ) parser.add_argument( "--file-path", default="", type=str, help="the path of audio files", ) parser.add_argument( "--normalization", default=True, action="store_true", help="if True, spectrogram is normalized", ) args = parser.parse_args() return args def train_one_epoch(model, criterion, optimizer, data_loader, device, epoch): model.train() sums = defaultdict(lambda: 0.0) start1 = time() metric = MetricLogger("train_iteration") metric["epoch"] = epoch for waveform, specgram, target in bg_iterator(data_loader, maxsize=2): start2 = time() waveform = waveform.to(device) specgram = specgram.to(device) target = target.to(device) output = model(waveform, specgram) output, target = output.squeeze(1), target.squeeze(1) loss = criterion(output, target) loss_item = loss.item() sums["loss"] += loss_item metric["loss"] = loss_item optimizer.zero_grad() loss.backward() if args.clip_grad > 0: gradient = torch.nn.utils.clip_grad_norm_( model.parameters(), args.clip_grad ) sums["gradient"] += gradient.item() metric["gradient"] = gradient.item() optimizer.step() metric["iteration"] = sums["iteration"] metric["time"] = time() - start2 metric() sums["iteration"] += 1 avg_loss = sums["loss"] / len(data_loader) metric = MetricLogger("train_epoch") metric["epoch"] = epoch metric["loss"] = sums["loss"] / len(data_loader) metric["gradient"] = avg_loss metric["time"] = time() - start1 metric() def validate(model, criterion, data_loader, device, epoch): with torch.no_grad(): model.eval() sums = defaultdict(lambda: 0.0) start = time() for waveform, specgram, target in bg_iterator(data_loader, maxsize=2): waveform = waveform.to(device) specgram = specgram.to(device) target = target.to(device) output = model(waveform, specgram) output, target = output.squeeze(1), target.squeeze(1) loss = criterion(output, target) sums["loss"] += loss.item() avg_loss = sums["loss"] / len(data_loader) metric = MetricLogger("validation") metric["epoch"] = epoch metric["loss"] = avg_loss metric["time"] = time() - start metric() return avg_loss def main(args): devices = ["cuda" if torch.cuda.is_available() else "cpu"] logging.info("Start time: {}".format(str(datetime.now()))) melkwargs = { "n_fft": args.n_fft, "power": 1, "hop_length": args.hop_length, "win_length": args.win_length, } transforms = torch.nn.Sequential( torchaudio.transforms.Spectrogram(**melkwargs), LinearToMel( sample_rate=args.sample_rate, n_fft=args.n_fft, n_mels=args.n_freq, fmin=args.f_min, ), NormalizeDB(min_level_db=args.min_level_db, normalization=args.normalization), ) train_dataset, val_dataset = split_process_dataset(args, transforms) loader_training_params = { "num_workers": args.workers, "pin_memory": False, "shuffle": True, "drop_last": False, } loader_validation_params = loader_training_params.copy() loader_validation_params["shuffle"] = False collate_fn = collate_factory(args) train_loader = DataLoader( train_dataset, batch_size=args.batch_size, collate_fn=collate_fn, **loader_training_params, ) val_loader = DataLoader( val_dataset, batch_size=args.batch_size, collate_fn=collate_fn, **loader_validation_params, ) n_classes = 2 ** args.n_bits if args.loss == "crossentropy" else 30 model = WaveRNN( upsample_scales=args.upsample_scales, n_classes=n_classes, hop_length=args.hop_length, n_res_block=args.n_res_block, n_rnn=args.n_rnn, n_fc=args.n_fc, kernel_size=args.kernel_size, n_freq=args.n_freq, n_hidden=args.n_hidden_melresnet, n_output=args.n_output_melresnet, ) if args.jit: model = torch.jit.script(model) model = torch.nn.DataParallel(model) model = model.to(devices[0], non_blocking=True) n = count_parameters(model) logging.info(f"Number of parameters: {n}") # Optimizer optimizer_params = { "lr": args.learning_rate, } optimizer = Adam(model.parameters(), **optimizer_params) criterion = LongCrossEntropyLoss() if args.loss == "crossentropy" else MoLLoss() best_loss = 10.0 if args.checkpoint and os.path.isfile(args.checkpoint): logging.info(f"Checkpoint: loading '{args.checkpoint}'") checkpoint = torch.load(args.checkpoint) args.start_epoch = checkpoint["epoch"] best_loss = checkpoint["best_loss"] model.load_state_dict(checkpoint["state_dict"]) optimizer.load_state_dict(checkpoint["optimizer"]) logging.info( f"Checkpoint: loaded '{args.checkpoint}' at epoch {checkpoint['epoch']}" ) else: logging.info("Checkpoint: not found") save_checkpoint( { "epoch": args.start_epoch, "state_dict": model.state_dict(), "best_loss": best_loss, "optimizer": optimizer.state_dict(), }, False, args.checkpoint, ) for epoch in range(args.start_epoch, args.epochs): train_one_epoch( model, criterion, optimizer, train_loader, devices[0], epoch, ) if not (epoch + 1) % args.print_freq or epoch == args.epochs - 1: sum_loss = validate(model, criterion, val_loader, devices[0], epoch) is_best = sum_loss < best_loss best_loss = min(sum_loss, best_loss) save_checkpoint( { "epoch": epoch + 1, "state_dict": model.state_dict(), "best_loss": best_loss, "optimizer": optimizer.state_dict(), }, is_best, args.checkpoint, ) logging.info(f"End time: {datetime.now()}") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) args = parse_args() main(args) audio-0.7.2/examples/pipeline_wavernn/processing.py000066400000000000000000000034021376444676100225530ustar00rootroot00000000000000import librosa import torch import torch.nn as nn # TODO Replace by torchaudio, once https://github.com/pytorch/audio/pull/593 is resolved class LinearToMel(nn.Module): def __init__(self, sample_rate, n_fft, n_mels, fmin, htk=False, norm="slaney"): super().__init__() self.sample_rate = sample_rate self.n_fft = n_fft self.n_mels = n_mels self.fmin = fmin self.htk = htk self.norm = norm def forward(self, specgram): specgram = librosa.feature.melspectrogram( S=specgram.squeeze(0).numpy(), sr=self.sample_rate, n_fft=self.n_fft, n_mels=self.n_mels, fmin=self.fmin, htk=self.htk, norm=self.norm, ) return torch.from_numpy(specgram) class NormalizeDB(nn.Module): r"""Normalize the spectrogram with a minimum db value """ def __init__(self, min_level_db, normalization): super().__init__() self.min_level_db = min_level_db self.normalization = normalization def forward(self, specgram): specgram = torch.log10(torch.clamp(specgram, min=1e-5)) if self.normalization: return torch.clamp( (self.min_level_db - 20 * specgram) / self.min_level_db, min=0, max=1 ) return specgram def normalized_waveform_to_bits(waveform, bits): r"""Transform waveform [-1, 1] to label [0, 2 ** bits - 1] """ assert abs(waveform).max() <= 1.0 waveform = (waveform + 1.0) * (2 ** bits - 1) / 2 return torch.clamp(waveform, 0, 2 ** bits - 1).int() def bits_to_normalized_waveform(label, bits): r"""Transform label [0, 2 ** bits - 1] to waveform [-1, 1] """ return 2 * label / (2 ** bits - 1.0) - 1.0 audio-0.7.2/examples/pipeline_wavernn/utils.py000066400000000000000000000030121376444676100215340ustar00rootroot00000000000000import logging import os import shutil from collections import defaultdict, deque import torch class MetricLogger: r"""Logger for model metrics """ def __init__(self, group, print_freq=1): self.print_freq = print_freq self._iter = 0 self.data = defaultdict(lambda: deque(maxlen=self.print_freq)) self.data["group"].append(group) def __setitem__(self, key, value): self.data[key].append(value) def _get_last(self): return {k: v[-1] for k, v in self.data.items()} def __str__(self): return str(self._get_last()) def __call__(self): self._iter = (self._iter + 1) % self.print_freq if not self._iter: print(self, flush=True) def save_checkpoint(state, is_best, filename): r"""Save the model to a temporary file first, then copy it to filename, in case the signal interrupts the torch.save() process. """ if filename == "": return tempfile = filename + ".temp" # Remove tempfile in case interuption during the copying from tempfile to filename if os.path.isfile(tempfile): os.remove(tempfile) torch.save(state, tempfile) if os.path.isfile(tempfile): os.rename(tempfile, filename) if is_best: shutil.copyfile(filename, "model_best.pth.tar") logging.info("Checkpoint: saved") def count_parameters(model): r"""Count the total number of parameters in the model """ return sum(p.numel() for p in model.parameters() if p.requires_grad) audio-0.7.2/examples/source_separation/000077500000000000000000000000001376444676100202065ustar00rootroot00000000000000audio-0.7.2/examples/source_separation/README.md000066400000000000000000000205421376444676100214700ustar00rootroot00000000000000# Source Separation Example This directory contains reference implementations for source separations. For the detail of each model, please checkout the followings. - [Conv-TasNet](./conv_tasnet/README.md) ## Usage ### Overview To training a model, you can use [`train.py`](./train.py). This script takes the form of `train.py [parameters for distributed training] -- [parameters for model/training]` ``` python train.py \ [--worker-id WORKER_ID] \ [--device-id DEVICE_ID] \ [--num-workers NUM_WORKERS] \ [--sync-protocol SYNC_PROTOCOL] \ -- \ # For the detail of the parameter values, use; python train.py --help # For the detail of the model parameters, use; python train.py -- --help ``` If you would like to just try out the traing script, then try it without any parameters for distributed training. `train.py -- --sample-rate 8000 --batch-size --dataset-dir --save-dir ` This script runs training in Distributed Data Parallel (DDP) framework and has two major operation modes. This behavior depends on if `--worker-id` argument is given or not. 1. (`--worker-id` is not given) Launchs training worker subprocesses that performs the actual training. 2. (`--worker-id` is given) Performs the training as a part of distributed training. When launching the script without any distributed trainig parameters (operation mode 1), this script will check the number of GPUs available on the local system and spawns the same number of training subprocesses (as operaiton mode 2). You can reduce the number of GPUs with `--num-workers`. If there is no GPU available, only one subprocess is launched and providing `--num-workers` larger than 1 results in error. When launching the script as a worker process of a distributed training, you need to configure the coordination of the workers. - `--num-workers` is the number of training processes being launched. - `--worker-id` is the process rank (must be unique across all the processes). - `--device-id` is the GPU device ID (should be unique within node). - `--sync-protocl` is how each worker process communicate and synchronize. If the training is carried out on a single node, then the default `"env://"` should do. If the training processes span across multiple nodes, then you need to provide a protocol that can communicate over the network. If you know where the master node is located, you can use `"env://"` in combination with `MASTER_ADDR` and `MASER_PORT` environment variables. If you do not know where the master node is located beforehand, you can use `"file://..."` protocol to indicate where the file to which all the worker process have access is located. For other protocols, please refer to the official documentation. ### Distributed Training Notes

Quick overview on DDP (distributed data parallel) DDP is single-program multiple-data training paradigm. With DDP, the model is replicated on every process, and every model replica will be fed with a different set of input data samples. - **Process**: Worker process (as in Linux process). There are `P` processes per a Node. - **Node**: A machine. There are `N` machines, each of which holds `P` processes. - **World**: network of nodes, composed of `N` nodes and `N * P` processes. - **Rank**: Grobal process ID (unique across nodes) `[0, N * P)` - **Local Rank**: Local process ID (unique only within a node) `[0, P)` ``` Node 0 Node 1 Node N-1 ┌────────────────────────┐┌─────────────────────────┐ ┌───────────────────────────┐ │╔══════════╗ ┌─────────┐││┌───────────┐ ┌─────────┐│ │┌─────────────┐ ┌─────────┐│ │║ Process ╟─┤ GPU: 0 ││││ Process ├─┤ GPU: 0 ││ ││ Process ├─┤ GPU: 0 ││ │║ Rank: 0 ║ └─────────┘│││ Rank:P │ └─────────┘│ ││ Rank:NP-P │ └─────────┘│ │╚══════════╝ ││└───────────┘ │ │└─────────────┘ │ │┌──────────┐ ┌─────────┐││┌───────────┐ ┌─────────┐│ │┌─────────────┐ ┌─────────┐│ ││ Process ├─┤ GPU: 1 ││││ Process ├─┤ GPU: 1 ││ ││ Process ├─┤ GPU: 1 ││ ││ Rank: 1 │ └─────────┘│││ Rank:P+1 │ └─────────┘│ ││ Rank:NP-P+1 │ └─────────┘│ │└──────────┘ ││└───────────┘ │ ... │└─────────────┘ │ │ ││ │ │ │ │ ... ││ ... │ │ ... │ │ ││ │ │ │ │┌──────────┐ ┌─────────┐││┌───────────┐ ┌─────────┐│ │┌─────────────┐ ┌─────────┐│ ││ Process ├─┤ GPU:P-1 ││││ Process ├─┤ GPU:P-1 ││ ││ Process ├─┤ GPU:P-1 ││ ││ Rank:P-1 │ └─────────┘│││ Rank:2P-1 │ └─────────┘│ ││ Rank:NP-1 │ └─────────┘│ │└──────────┘ ││└───────────┘ │ │└─────────────┘ │ └────────────────────────┘└─────────────────────────┘ └───────────────────────────┘ ```
### SLURM When launched as SLURM job, the follwoing environment variables correspond to - **SLURM_PROCID*: `--worker-id` (Rank) - **SLURM_NTASKS** (or legacy **SLURM_NPPROCS**): the number of total processes (`--num-workers` == world size) - **SLURM_LOCALID**: Local Rank (to be mapped with GPU index*) * Even when GPU resource is allocated with `--gpus-per-task=1`, if there are muptiple tasks allocated on the same node, (thus multiple GPUs of the node are allocated to the job) each task can see all the GPUs allocated for the tasks. Therefore we need to use SLURM_LOCALID to tell each task to which GPU it should be using.
Example scripts for running the training on SLURM cluster - **launch_job.sh** ```bash #!/bin/bash #SBATCH --job-name=source_separation #SBATCH --output=/checkpoint/%u/jobs/%x/%j.out #SBATCH --error=/checkpoint/%u/jobs/%x/%j.err #SBATCH --nodes=1 #SBATCH --ntasks-per-node=8 #SBATCH --cpus-per-task=8 #SBATCH --mem-per-cpu=16G #SBATCH --gpus-per-task=1 #srun env srun wrapper.sh $@ ``` - **wrapper.sh** ```bash #!/bin/bash num_speakers=2 this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" save_dir="/checkpoint/${USER}/jobs/${SLURM_JOB_NAME}/${SLURM_JOB_ID}" dataset_dir="/dataset/wsj0-mix/${num_speakers}speakers/wav8k/min" if [ "${SLURM_JOB_NUM_NODES}" -gt 1 ]; then protocol="file:///checkpoint/${USER}/jobs/source_separation/${SLURM_JOB_ID}/sync" else protocol="env://" fi mkdir -p "${save_dir}" python -u \ "${this_dir}/train.py" \ --worker-id "${SLURM_PROCID}" \ --num-workers "${SLURM_NTASKS}" \ --device-id "${SLURM_LOCALID}" \ --sync-protocol "${protocol}" \ -- \ --num-speakers "${num_speakers}" \ --sample-rate 8000 \ --dataset-dir "${dataset_dir}" \ --save-dir "${save_dir}" \ --batch-size $((16 / SLURM_NTASKS)) ```
audio-0.7.2/examples/source_separation/conv_tasnet/000077500000000000000000000000001376444676100225315ustar00rootroot00000000000000audio-0.7.2/examples/source_separation/conv_tasnet/README.md000066400000000000000000000043351376444676100240150ustar00rootroot00000000000000# Conv-TasNet This is a reference implementation of Conv-TasNet. > Luo, Yi, and Nima Mesgarani. "Conv-TasNet: Surpassing Ideal Time-Frequency Magnitude Masking for Speech Separation." IEEE/ACM Transactions on Audio, Speech, and Language Processing 27.8 (2019): 1256-1266. Crossref. Web. This implementation is based on [arXiv:1809.07454v3](https://arxiv.org/abs/1809.07454v3) and [the reference implementation](https://github.com/naplab/Conv-TasNet) provided by the authors. For the usage, please checkout the [source separation README](../README.md). ## (Default) Training Configurations The default training/model configurations follow the best non-causal implementation from the paper. (causal configuration is not implemented.) - Sample rate: 8000 Hz - Batch size: total 16 over distributed training workers - Epochs: 100 - Initial learning rate: 1e-3 - Gradient clipping: maximum L2 norm of 5.0 - Optimizer: Adam - Learning rate scheduling: Halved after 3 epochs of no improvement in validation accuracy. - Objective function: SI-SNRi - Reported metrics: SI-SNRi, SDRi - Sample audio length: 4 seconds (randomized position) - Encoder/Decoder feature dimension (N): 512 - Encoder/Decoder convolution kernel size (L): 16 - TCN bottleneck/output feature dimension (B): 128 - TCN hidden feature dimension (H): 512 - TCN skip connection feature dimension (Sc): 128 - TCN convolution kernel size (P): 3 - The number of TCN convolution block layers (X): 8 - The number of TCN convolution blocks (R): 3 ## Evaluation The following is the evaluation result of training the model on WSJ0-2mix and WSJ0-3mix datasets. ### wsj0-mix 2speakers | | SI-SNRi (dB) | SDRi (dB) | Epoch | |:------------------:|-------------:|----------:|------:| | Reference | 15.3 | 15.6 | | | Validation dataset | 13.1 | 13.1 | 100 | | Evaluation dataset | 11.0 | 11.0 | 100 | ### wsj0-mix 3speakers | | SI-SNRi (dB) | SDRi (dB) | Epoch | |:------------------:|-------------:|----------:|------:| | Reference | 12.7 | 13.1 | | | Validation dataset | 11.4 | 11.4 | 100 | | Evaluation dataset | 8.9 | 8.9 | 100 | audio-0.7.2/examples/source_separation/conv_tasnet/__init__.py000066400000000000000000000000521376444676100246370ustar00rootroot00000000000000from . import ( train, trainer, ) audio-0.7.2/examples/source_separation/conv_tasnet/train.py000066400000000000000000000244351376444676100242300ustar00rootroot00000000000000#!/usr/bin/env python3 """Train Conv-TasNet""" import time import pathlib import argparse import torch import torchaudio import torchaudio.models import conv_tasnet from utils import dist_utils from utils.dataset import utils as dataset_utils _LG = dist_utils.getLogger(__name__) def _parse_args(args): parser = argparse.ArgumentParser(description=__doc__,) parser.add_argument( "--debug", action="store_true", help="Enable debug behavior. Each epoch will end with just one batch.") group = parser.add_argument_group("Model Options") group.add_argument( "--num-speakers", required=True, type=int, help="The number of speakers." ) group = parser.add_argument_group("Dataset Options") group.add_argument( "--sample-rate", required=True, type=int, help="Sample rate of audio files in the given dataset.", ) group.add_argument( "--dataset", default="wsj0mix", choices=["wsj0mix"], help='Dataset type. (default: "wsj0mix")', ) group.add_argument( "--dataset-dir", required=True, type=pathlib.Path, help=( "Directory where dataset is found. " 'If the dataset type is "wsj9mix", then this is the directory where ' '"cv", "tt" and "tr" subdirectories are found.' ), ) group = parser.add_argument_group("Save Options") group.add_argument( "--save-dir", required=True, type=pathlib.Path, help=( "Directory where the checkpoints and logs are saved. " "Though, only the worker 0 saves checkpoint data, " "all the worker processes must have access to the directory." ), ) group = parser.add_argument_group("Dataloader Options") group.add_argument( "--batch-size", type=int, help=f"Batch size. (default: 16 // world_size)", ) group = parser.add_argument_group("Training Options") group.add_argument( "--epochs", metavar="NUM_EPOCHS", default=100, type=int, help="The number of epochs to train. (default: 100)", ) group.add_argument( "--learning-rate", default=1e-3, type=float, help="Initial learning rate. (default: 1e-3)", ) group.add_argument( "--grad-clip", metavar="CLIP_VALUE", default=5.0, type=float, help="Gradient clip value (l2 norm). (default: 5.0)", ) group.add_argument( "--resume", metavar="CHECKPOINT_PATH", help="Previous checkpoint file from which the training is resumed.", ) args = parser.parse_args(args) # Delaing the default value initialization until parse_args is done because # if `--help` is given, distributed training is not enabled. if args.batch_size is None: args.batch_size = 16 // torch.distributed.get_world_size() return args def _get_model( num_sources, enc_kernel_size=16, enc_num_feats=512, msk_kernel_size=3, msk_num_feats=128, msk_num_hidden_feats=512, msk_num_layers=8, msk_num_stacks=3, ): model = torchaudio.models.ConvTasNet( num_sources=num_sources, enc_kernel_size=enc_kernel_size, enc_num_feats=enc_num_feats, msk_kernel_size=msk_kernel_size, msk_num_feats=msk_num_feats, msk_num_hidden_feats=msk_num_hidden_feats, msk_num_layers=msk_num_layers, msk_num_stacks=msk_num_stacks, ) _LG.info_on_master("Model Configuration:") _LG.info_on_master(" - N: %d", enc_num_feats) _LG.info_on_master(" - L: %d", enc_kernel_size) _LG.info_on_master(" - B: %d", msk_num_feats) _LG.info_on_master(" - H: %d", msk_num_hidden_feats) _LG.info_on_master(" - Sc: %d", msk_num_feats) _LG.info_on_master(" - P: %d", msk_kernel_size) _LG.info_on_master(" - X: %d", msk_num_layers) _LG.info_on_master(" - R: %d", msk_num_stacks) _LG.info_on_master( " - Receptive Field: %s [samples]", model.mask_generator.receptive_field, ) return model def _get_dataloader(dataset_type, dataset_dir, num_speakers, sample_rate, batch_size): train_dataset, valid_dataset, eval_dataset = dataset_utils.get_dataset( dataset_type, dataset_dir, num_speakers, sample_rate, ) train_collate_fn = dataset_utils.get_collate_fn( dataset_type, mode='train', sample_rate=sample_rate, duration=4 ) test_collate_fn = dataset_utils.get_collate_fn(dataset_type, mode='test') train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=batch_size, sampler=torch.utils.data.distributed.DistributedSampler(train_dataset), collate_fn=train_collate_fn, pin_memory=True, ) valid_loader = torch.utils.data.DataLoader( valid_dataset, batch_size=batch_size, sampler=torch.utils.data.distributed.DistributedSampler(valid_dataset), collate_fn=test_collate_fn, pin_memory=True, ) eval_loader = torch.utils.data.DataLoader( eval_dataset, batch_size=batch_size, sampler=torch.utils.data.distributed.DistributedSampler(eval_dataset), collate_fn=test_collate_fn, pin_memory=True, ) return train_loader, valid_loader, eval_loader def _write_header(log_path, args): rows = [ [f"# torch: {torch.__version__}", ], [f"# torchaudio: {torchaudio.__version__}", ] ] rows.append(["# arguments"]) for key, item in vars(args).items(): rows.append([f"# {key}: {item}"]) dist_utils.write_csv_on_master(log_path, *rows) def train(args): args = _parse_args(args) _LG.info("%s", args) args.save_dir.mkdir(parents=True, exist_ok=True) if "sox_io" in torchaudio.list_audio_backends(): torchaudio.set_audio_backend("sox_io") start_epoch = 1 if args.resume: checkpoint = torch.load(args.resume) if args.sample_rate != checkpoint["sample_rate"]: raise ValueError( "The provided sample rate ({args.sample_rate}) does not match " "the sample rate from the check point ({checkpoint['sample_rate']})." ) if args.num_speakers != checkpoint["num_speakers"]: raise ValueError( "The provided #of speakers ({args.num_speakers}) does not match " "the #of speakers from the check point ({checkpoint['num_speakers']}.)" ) start_epoch = checkpoint["epoch"] device = torch.device("cuda" if torch.cuda.is_available() else "cpu") _LG.info("Using: %s", device) model = _get_model(num_sources=args.num_speakers) model.to(device) model = torch.nn.parallel.DistributedDataParallel( model, device_ids=[device] if torch.cuda.is_available() else None ) optimizer = torch.optim.Adam(model.parameters(), lr=args.learning_rate) if args.resume: _LG.info("Loading parameters from the checkpoint...") model.module.load_state_dict(checkpoint["model"]) optimizer.load_state_dict(checkpoint["optimizer"]) else: dist_utils.synchronize_params( str(args.save_dir / f"tmp.pt"), device, model, optimizer ) lr_scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, mode="max", factor=0.5, patience=3 ) train_loader, valid_loader, eval_loader = _get_dataloader( args.dataset, args.dataset_dir, args.num_speakers, args.sample_rate, args.batch_size, ) num_train_samples = len(train_loader.dataset) num_valid_samples = len(valid_loader.dataset) num_eval_samples = len(eval_loader.dataset) _LG.info_on_master("Datasets:") _LG.info_on_master(" - Train: %s", num_train_samples) _LG.info_on_master(" - Valid: %s", num_valid_samples) _LG.info_on_master(" - Eval: %s", num_eval_samples) trainer = conv_tasnet.trainer.Trainer( model, optimizer, train_loader, valid_loader, eval_loader, args.grad_clip, device, debug=args.debug, ) log_path = args.save_dir / f"log.csv" _write_header(log_path, args) dist_utils.write_csv_on_master( log_path, [ "epoch", "learning_rate", "valid_si_snri", "valid_sdri", "eval_si_snri", "eval_sdri", ], ) _LG.info_on_master("Running %s epochs", args.epochs) for epoch in range(start_epoch, start_epoch + args.epochs): _LG.info_on_master("=" * 70) _LG.info_on_master("Epoch: %s", epoch) _LG.info_on_master("Learning rate: %s", optimizer.param_groups[0]["lr"]) _LG.info_on_master("=" * 70) t0 = time.monotonic() trainer.train_one_epoch() train_sps = num_train_samples / (time.monotonic() - t0) _LG.info_on_master("-" * 70) t0 = time.monotonic() valid_metric = trainer.validate() valid_sps = num_valid_samples / (time.monotonic() - t0) _LG.info_on_master("Valid: %s", valid_metric) _LG.info_on_master("-" * 70) t0 = time.monotonic() eval_metric = trainer.evaluate() eval_sps = num_eval_samples / (time.monotonic() - t0) _LG.info_on_master(" Eval: %s", eval_metric) _LG.info_on_master("-" * 70) _LG.info_on_master("Train: Speed: %6.2f [samples/sec]", train_sps) _LG.info_on_master("Valid: Speed: %6.2f [samples/sec]", valid_sps) _LG.info_on_master(" Eval: Speed: %6.2f [samples/sec]", eval_sps) _LG.info_on_master("-" * 70) dist_utils.write_csv_on_master( log_path, [ epoch, optimizer.param_groups[0]["lr"], valid_metric.si_snri, valid_metric.sdri, eval_metric.si_snri, eval_metric.sdri, ], ) lr_scheduler.step(valid_metric.si_snri) save_path = args.save_dir / f"epoch_{epoch}.pt" dist_utils.save_on_master( save_path, { "model": model.module.state_dict(), "optimizer": optimizer.state_dict(), "num_speakers": args.num_speakers, "sample_rate": args.sample_rate, "epoch": epoch, }, ) audio-0.7.2/examples/source_separation/conv_tasnet/trainer.py000066400000000000000000000117471376444676100245610ustar00rootroot00000000000000import time from typing import Tuple from collections import namedtuple import torch import torch.distributed as dist from utils import dist_utils, metrics _LG = dist_utils.getLogger(__name__) Metric = namedtuple("SNR", ["si_snri", "sdri"]) Metric.__str__ = ( lambda self: f"SI-SNRi: {self.si_snri:10.3e}, SDRi: {self.sdri:10.3e}" ) def si_sdr_improvement( estimate: torch.Tensor, reference: torch.Tensor, mix: torch.Tensor, mask: torch.Tensor ) -> Tuple[torch.Tensor, torch.Tensor]: """Compute the improvement of scale-invariant SDR. (SI-SNRi) and bare SDR (SDRi). Args: estimate (torch.Tensor): Estimated source signals. Shape: [batch, speakers, time frame] reference (torch.Tensor): Reference (original) source signals. Shape: [batch, speakers, time frame] mix (torch.Tensor): Mixed souce signals, from which the setimated signals were generated. Shape: [batch, speakers == 1, time frame] mask (torch.Tensor): Mask to indicate padded value (0) or valid value (1). Shape: [batch, 1, time frame] Returns: torch.Tensor: Improved SI-SDR. Shape: [batch, ] torch.Tensor: Absolute SI-SDR. Shape: [batch, ] References: - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 """ with torch.no_grad(): sdri = metrics.sdri(estimate, reference, mix, mask=mask) estimate = estimate - estimate.mean(axis=2, keepdim=True) reference = reference - reference.mean(axis=2, keepdim=True) mix = mix - mix.mean(axis=2, keepdim=True) si_sdri = metrics.sdri(estimate, reference, mix, mask=mask) return si_sdri, sdri class OccasionalLogger: """Simple helper class to log once in a while or when progress is quick enough""" def __init__(self, time_interval=180, progress_interval=0.1): self.time_interval = time_interval self.progress_interval = progress_interval self.last_time = 0.0 self.last_progress = 0.0 def log(self, metric, progress, force=False): now = time.monotonic() if ( force or now > self.last_time + self.time_interval or progress > self.last_progress + self.progress_interval ): self.last_time = now self.last_progress = progress _LG.info_on_master("train: %s [%3d%%]", metric, 100 * progress) class Trainer: def __init__( self, model, optimizer, train_loader, valid_loader, eval_loader, grad_clip, device, *, debug, ): self.model = model self.optimizer = optimizer self.train_loader = train_loader self.valid_loader = valid_loader self.eval_loader = eval_loader self.grad_clip = grad_clip self.device = device self.debug = debug def train_one_epoch(self): self.model.train() logger = OccasionalLogger() num_batches = len(self.train_loader) for i, batch in enumerate(self.train_loader, start=1): mix = batch.mix.to(self.device) src = batch.src.to(self.device) mask = batch.mask.to(self.device) estimate = self.model(mix) si_snri, sdri = si_sdr_improvement(estimate, src, mix, mask) si_snri = si_snri.mean() sdri = sdri.mean() loss = -si_snri self.optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_( self.model.parameters(), self.grad_clip, norm_type=2.0 ) self.optimizer.step() metric = Metric(si_snri.item(), sdri.item()) logger.log(metric, progress=i / num_batches, force=i == num_batches) if self.debug: break def evaluate(self): with torch.no_grad(): return self._test(self.eval_loader) def validate(self): with torch.no_grad(): return self._test(self.valid_loader) def _test(self, loader): self.model.eval() total_si_snri = torch.zeros(1, dtype=torch.float32, device=self.device) total_sdri = torch.zeros(1, dtype=torch.float32, device=self.device) for batch in loader: mix = batch.mix.to(self.device) src = batch.src.to(self.device) mask = batch.mask.to(self.device) estimate = self.model(mix) si_snri, sdri = si_sdr_improvement(estimate, src, mix, mask) total_si_snri += si_snri.sum() total_sdri += sdri.sum() if self.debug: break dist.all_reduce(total_si_snri, dist.ReduceOp.SUM) dist.all_reduce(total_sdri, dist.ReduceOp.SUM) num_samples = len(loader.dataset) metric = Metric(total_si_snri.item() / num_samples, total_sdri.item() / num_samples) return metric audio-0.7.2/examples/source_separation/train.py000066400000000000000000000144311376444676100217000ustar00rootroot00000000000000#!/usr/bin/env python3 """Launch souce separation training. This script runs training in Distributed Data Parallel (DDP) framework and has two major operation modes. This behavior depends on if `--worker-id` argument is given or not. 1. (`--worker-id` is not given) Launchs worker subprocesses that performs the actual training. 2. (`--worker-id` is given) Performs the training as a part of distributed training. When launching the script without any distributed trainig parameters (operation mode 1), this script will check the number of GPUs available on the local system and spawns the same number of training subprocesses (as operaiton mode 2). You can reduce the number of GPUs with `--num-workers`. If there is no GPU available, only one subprocess is launched. When launching the script as a worker process of a distributed training, you need to configure the coordination of the workers. """ import sys import logging import argparse import subprocess import torch from utils import dist_utils _LG = dist_utils.getLogger(__name__) def _parse_args(args=None): max_world_size = torch.cuda.device_count() or 1 parser = argparse.ArgumentParser( description=__doc__, ) parser.add_argument("--debug", action="store_true", help="Enable debug log") group = parser.add_argument_group("Distributed Training") group.add_argument( "--worker-id", type=int, help=( "If not provided, the launched process serves as a master process of " "single-node, multi-worker training and spawns the worker subprocesses. " "If provided, the launched process serves as a worker process, which " "performs the actual training. The valid value is [0, --num-workers)." ), ) group.add_argument( "--device-id", type=int, help="The CUDA device ID. Allowed only when --worker-id is provided.", ) group.add_argument( "--num-workers", type=int, default=max_world_size, help=( "The size of distributed trainig workers. " "If launching a training as single-node, multi-worker training, " "(i.e. --worker-id is not provided) then this value should not exceed " "the number of available GPUs. " "If launching the training process as a multi-node, multi-gpu training, " "(i.e. --worker-id is provided) then the value has to match " f"the number of workers across nodes. (default: {max_world_size})" ), ) group.add_argument( "--sync-protocol", type=str, default="env://", help=( "Synchronization protocol for distributed training. " "This value is passed as `init_method` argument of " "`torch.distributed.init_process_group` function." 'If you are using `"env://"`, you can additionally configure ' 'environment variables "MASTER_ADDR" and "MASTER_PORT". ' 'If you are using `"file://..."`, then the process has to have ' "the access to the designated file. " "See the documentation for `torch.distributed` for the detail. " 'If you are running the training in a single node, `"env://"` ' "should do. If you are running the training in multiple nodes, " "you need to provide the file location where all the nodes have " 'access, using `"file://..."` protocol. (default: "env://")' ), ) group.add_argument( "--random-seed", type=int, help="Set random seed value. (default: None)", ) parser.add_argument( "rest", nargs=argparse.REMAINDER, help="Model-specific arguments." ) namespace = parser.parse_args(args) if namespace.worker_id is None: if namespace.device_id is not None: raise ValueError( "`--device-id` cannot be provided when runing as master process." ) if namespace.num_workers > max_world_size: raise ValueError( "--num-workers ({num_workers}) cannot exceed {device_count}." ) if namespace.rest[:1] == ["--"]: namespace.rest = namespace.rest[1:] return namespace def _main(cli_args): args = _parse_args(cli_args) if any(arg in ["--help", "-h"] for arg in args.rest): _run_training(args.rest) _init_logger(args.worker_id, args.debug) if args.worker_id is None: _run_training_subprocesses(args.num_workers, cli_args) else: dist_utils.setup_distributed( world_size=args.num_workers, rank=args.worker_id, local_rank=args.device_id, backend='nccl' if torch.cuda.is_available() else 'gloo', init_method=args.sync_protocol, ) if args.random_seed is not None: torch.manual_seed(args.random_seed) if torch.cuda.is_available(): torch.cuda.set_device(args.device_id) _LG.info("CUDA device set to %s", args.device_id) _run_training(args.rest) def _run_training_subprocesses(num_workers, original_args): workers = [] _LG.info("Spawning %s workers", num_workers) for i in range(num_workers): worker_arg = ["--worker-id", f"{i}", "--num-workers", f"{num_workers}"] device_arg = ["--device-id", f"{i}"] if torch.cuda.is_available() else [] command = ( [sys.executable, "-u", sys.argv[0]] + worker_arg + device_arg + original_args ) _LG.info("Launching worker %s: `%s`", i, " ".join(command)) worker = subprocess.Popen(command) workers.append(worker) num_failed = 0 for worker in workers: worker.wait() if worker.returncode != 0: num_failed += 1 sys.exit(num_failed) def _run_training(args): import conv_tasnet.train conv_tasnet.train.train(args) def _init_logger(rank=None, debug=False): worker_fmt = "[master]" if rank is None else f"[worker {rank:2d}]" message_fmt = ( "%(levelname)5s: %(funcName)10s: %(message)s" if debug else "%(message)s" ) logging.basicConfig( level=logging.DEBUG if debug else logging.INFO, format=f"%(asctime)s: {worker_fmt} {message_fmt}", ) if __name__ == "__main__": _main(sys.argv[1:]) audio-0.7.2/examples/source_separation/utils/000077500000000000000000000000001376444676100213465ustar00rootroot00000000000000audio-0.7.2/examples/source_separation/utils/__init__.py000066400000000000000000000000741376444676100234600ustar00rootroot00000000000000from . import ( dataset, dist_utils, metrics, ) audio-0.7.2/examples/source_separation/utils/dataset/000077500000000000000000000000001376444676100227735ustar00rootroot00000000000000audio-0.7.2/examples/source_separation/utils/dataset/__init__.py000066400000000000000000000000351376444676100251020ustar00rootroot00000000000000from . import utils, wsj0mix audio-0.7.2/examples/source_separation/utils/dataset/utils.py000066400000000000000000000057241376444676100245150ustar00rootroot00000000000000from typing import List from functools import partial from collections import namedtuple import torch from . import wsj0mix Batch = namedtuple("Batch", ["mix", "src", "mask"]) def get_dataset(dataset_type, root_dir, num_speakers, sample_rate): if dataset_type == "wsj0mix": train = wsj0mix.WSJ0Mix(root_dir / "tr", num_speakers, sample_rate) validation = wsj0mix.WSJ0Mix(root_dir / "cv", num_speakers, sample_rate) evaluation = wsj0mix.WSJ0Mix(root_dir / "tt", num_speakers, sample_rate) else: raise ValueError(f"Unexpected dataset: {dataset_type}") return train, validation, evaluation def _fix_num_frames(sample: wsj0mix.SampleType, target_num_frames: int, random_start=False): """Ensure waveform has exact number of frames by slicing or padding""" mix = sample[1] # [1, num_frames] src = torch.cat(sample[2], 0) # [num_sources, num_frames] num_channels, num_frames = src.shape if num_frames >= target_num_frames: if random_start and num_frames > target_num_frames: start_frame = torch.randint(num_frames - target_num_frames, [1]) mix = mix[:, start_frame:] src = src[:, start_frame:] mix = mix[:, :target_num_frames] src = src[:, :target_num_frames] mask = torch.ones_like(mix) else: num_padding = target_num_frames - num_frames pad = torch.zeros([1, num_padding], dtype=mix.dtype, device=mix.device) mix = torch.cat([mix, pad], 1) src = torch.cat([src, pad.expand(num_channels, -1)], 1) mask = torch.ones_like(mix) mask[..., num_frames:] = 0 return mix, src, mask def collate_fn_wsj0mix_train(samples: List[wsj0mix.SampleType], sample_rate, duration): target_num_frames = int(duration * sample_rate) mixes, srcs, masks = [], [], [] for sample in samples: mix, src, mask = _fix_num_frames(sample, target_num_frames, random_start=True) mixes.append(mix) srcs.append(src) masks.append(mask) return Batch(torch.stack(mixes, 0), torch.stack(srcs, 0), torch.stack(masks, 0)) def collate_fn_wsj0mix_test(samples: List[wsj0mix.SampleType]): max_num_frames = max(s[1].shape[-1] for s in samples) mixes, srcs, masks = [], [], [] for sample in samples: mix, src, mask = _fix_num_frames(sample, max_num_frames, random_start=False) mixes.append(mix) srcs.append(src) masks.append(mask) return Batch(torch.stack(mixes, 0), torch.stack(srcs, 0), torch.stack(masks, 0)) def get_collate_fn(dataset_type, mode, sample_rate=None, duration=4): assert mode in ["train", "test"] if dataset_type == "wsj0mix": if mode == 'train': if sample_rate is None: raise ValueError("sample_rate is not given.") return partial(collate_fn_wsj0mix_train, sample_rate=sample_rate, duration=duration) return collate_fn_wsj0mix_test raise ValueError(f"Unexpected dataset: {dataset_type}") audio-0.7.2/examples/source_separation/utils/dataset/wsj0mix.py000066400000000000000000000047311376444676100247530ustar00rootroot00000000000000from pathlib import Path from typing import Union, Tuple, List import torch from torch.utils.data import Dataset import torchaudio SampleType = Tuple[int, torch.Tensor, List[torch.Tensor]] class WSJ0Mix(Dataset): """Create a Dataset for wsj0-mix. Args: root (str or Path): Path to the directory where the dataset is found. num_speakers (int): The number of speakers, which determines the directories to traverse. The Dataset will traverse ``s1`` to ``sN`` directories to collect N source audios. sample_rate (int): Expected sample rate of audio files. If any of the audio has a different sample rate, raises ``ValueError``. audio_ext (str): The extension of audio files to find. (default: ".wav") """ def __init__( self, root: Union[str, Path], num_speakers: int, sample_rate: int, audio_ext: str = ".wav", ): self.root = Path(root) self.sample_rate = sample_rate self.mix_dir = (self.root / "mix").resolve() self.src_dirs = [(self.root / f"s{i+1}").resolve() for i in range(num_speakers)] self.files = [p.name for p in self.mix_dir.glob(f"*{audio_ext}")] self.files.sort() def _load_audio(self, path) -> torch.Tensor: waveform, sample_rate = torchaudio.load(path) if sample_rate != self.sample_rate: raise ValueError( f"The dataset contains audio file of sample rate {sample_rate}. " "Where the requested sample rate is {self.sample_rate}." ) return waveform def _load_sample(self, filename) -> SampleType: mixed = self._load_audio(str(self.mix_dir / filename)) srcs = [] for i, dir_ in enumerate(self.src_dirs): src = self._load_audio(str(dir_ / filename)) if mixed.shape != src.shape: raise ValueError( f"Different waveform shapes. mixed: {mixed.shape}, src[{i}]: {src.shape}" ) srcs.append(src) return self.sample_rate, mixed, srcs def __len__(self) -> int: return len(self.files) def __getitem__(self, key: int) -> SampleType: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(sample_rate, mix_waveform, list_of_source_waveforms)`` """ return self._load_sample(self.files[key]) audio-0.7.2/examples/source_separation/utils/dist_utils.py000066400000000000000000000050311376444676100241020ustar00rootroot00000000000000import os import csv import types import logging import torch import torch.distributed as dist def _info_on_master(self, *args, **kwargs): if dist.get_rank() == 0: self.info(*args, **kwargs) def getLogger(name): """Get logging.Logger module with additional ``info_on_master`` method.""" logger = logging.getLogger(name) logger.info_on_master = types.MethodType(_info_on_master, logger) return logger _LG = getLogger(__name__) def setup_distributed( world_size, rank, local_rank, backend="nccl", init_method="env://" ): """Perform env setup and initialization for distributed training""" if init_method == "env://": _set_env_vars(world_size, rank, local_rank) if world_size > 1 and "OMP_NUM_THREADS" not in os.environ: _LG.info("Setting OMP_NUM_THREADS == 1") os.environ["OMP_NUM_THREADS"] = "1" params = { "backend": backend, "init_method": init_method, "world_size": world_size, "rank": rank, } _LG.info("Initializing distributed process group with %s", params) dist.init_process_group(**params) _LG.info("Initialized distributed process group.") def _set_env_vars(world_size, rank, local_rank): for key, default in [("MASTER_ADDR", "127.0.0.1"), ("MASTER_PORT", "29500")]: if key not in os.environ: os.environ[key] = default os.environ["WORLD_SIZE"] = str(world_size) os.environ["RANK"] = str(rank) os.environ["LOCAL_RANK"] = str(local_rank) def save_on_master(path, obj): if dist.get_rank() == 0: _LG.info("Saving %s", path) torch.save(obj, path) def write_csv_on_master(path, *rows): if dist.get_rank() == 0: with open(path, "a", newline="") as fileobj: writer = csv.writer(fileobj) for row in rows: writer.writerow(row) def synchronize_params(path, device, *modules): if dist.get_world_size() < 2: return rank = dist.get_rank() if rank == 0: _LG.info("[Parameter Sync]: Saving parameters to a temp file...") torch.save({f"{i}": m.state_dict() for i, m in enumerate(modules)}, path) dist.barrier() if rank != 0: _LG.info("[Parameter Sync]: Loading parameters...") data = torch.load(path, map_location=device) for i, m in enumerate(modules): m.load_state_dict(data[f"{i}"]) dist.barrier() if rank == 0: _LG.info("[Parameter Sync]: Removing the temp file...") os.remove(path) _LG.info_on_master("[Parameter Sync]: Complete.") audio-0.7.2/examples/source_separation/utils/metrics.py000066400000000000000000000174761376444676100234050ustar00rootroot00000000000000import math from typing import Optional from itertools import permutations import torch def sdr( estimate: torch.Tensor, reference: torch.Tensor, mask: Optional[torch.Tensor] = None, epsilon: float = 1e-8 ) -> torch.Tensor: """Computes source-to-distortion ratio. 1. scale the reference signal with power(s_est * s_ref) / powr(s_ref * s_ref) 2. compute SNR between adjusted estimate and reference. Args: estimate (torch.Tensor): Estimtaed signal. Shape: [batch, speakers (can be 1), time frame] reference (torch.Tensor): Reference signal. Shape: [batch, speakers, time frame] mask (Optional[torch.Tensor]): Binary mask to indicate padded value (0) or valid value (1). Shape: [batch, 1, time frame] epsilon (float): constant value used to stabilize division. Returns: torch.Tensor: scale-invariant source-to-distortion ratio. Shape: [batch, speaker] References: - Single-channel multi-speaker separation using deep clustering Y. Isik, J. Le Roux, Z. Chen, S. Watanabe, and J. R. Hershey, - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 Notes: This function is tested to produce the exact same result as https://github.com/naplab/Conv-TasNet/blob/e66d82a8f956a69749ec8a4ae382217faa097c5c/utility/sdr.py#L34-L56 """ reference_pow = reference.pow(2).mean(axis=2, keepdim=True) mix_pow = (estimate * reference).mean(axis=2, keepdim=True) scale = mix_pow / (reference_pow + epsilon) reference = scale * reference error = estimate - reference reference_pow = reference.pow(2) error_pow = error.pow(2) if mask is None: reference_pow = reference_pow.mean(axis=2) error_pow = error_pow.mean(axis=2) else: denom = mask.sum(axis=2) reference_pow = (mask * reference_pow).sum(axis=2) / denom error_pow = (mask * error_pow).sum(axis=2) / denom return 10 * torch.log10(reference_pow) - 10 * torch.log10(error_pow) class PIT(torch.nn.Module): """Applies utterance-level speaker permutation Computes the maxium possible value of the given utility function over the permutations of the speakers. Args: utility_func (function): Function that computes the utility (opposite of loss) with signature of (extimate: torch.Tensor, reference: torch.Tensor) -> torch.Tensor where input Tensors are shape of [batch, speakers, frame] and the output Tensor is shape of [batch, speakers]. References: - Multi-talker Speech Separation with Utterance-level Permutation Invariant Training of Deep Recurrent Neural Networks Morten Kolbæk, Dong Yu, Zheng-Hua Tan and Jesper Jensen https://arxiv.org/abs/1703.06284 """ def __init__(self, utility_func): super().__init__() self.utility_func = utility_func def forward( self, estimate: torch.Tensor, reference: torch.Tensor, mask: Optional[torch.Tensor] = None, epsilon: float = 1e-8 ) -> torch.Tensor: """Compute utterance-level PIT Loss Args: estimate (torch.Tensor): Estimated source signals. Shape: [bacth, speakers, time frame] reference (torch.Tensor): Reference (original) source signals. Shape: [batch, speakers, time frame] mask (Optional[torch.Tensor]): Binary mask to indicate padded value (0) or valid value (1). Shape: [batch, 1, time frame] epsilon (float): constant value used to stabilize division. Returns: torch.Tensor: Maximum criterion over the speaker permutation. Shape: [batch, ] """ assert estimate.shape == reference.shape batch_size, num_speakers = reference.shape[:2] num_permute = math.factorial(num_speakers) util_mat = torch.zeros( batch_size, num_permute, dtype=estimate.dtype, device=estimate.device ) for i, idx in enumerate(permutations(range(num_speakers))): util = self.utility_func(estimate, reference[:, idx, :], mask=mask, epsilon=epsilon) util_mat[:, i] = util.mean(dim=1) # take the average over speaker dimension return util_mat.max(dim=1).values _sdr_pit = PIT(utility_func=sdr) def sdr_pit( estimate: torch.Tensor, reference: torch.Tensor, mask: Optional[torch.Tensor] = None, epsilon: float = 1e-8): """Computes scale-invariant source-to-distortion ratio. 1. adjust both estimate and reference to have 0-mean 2. scale the reference signal with power(s_est * s_ref) / powr(s_ref * s_ref) 3. compute SNR between adjusted estimate and reference. Args: estimate (torch.Tensor): Estimtaed signal. Shape: [batch, speakers (can be 1), time frame] reference (torch.Tensor): Reference signal. Shape: [batch, speakers, time frame] mask (Optional[torch.Tensor]): Binary mask to indicate padded value (0) or valid value (1). Shape: [batch, 1, time frame] epsilon (float): constant value used to stabilize division. Returns: torch.Tensor: scale-invariant source-to-distortion ratio. Shape: [batch, speaker] References: - Single-channel multi-speaker separation using deep clustering Y. Isik, J. Le Roux, Z. Chen, S. Watanabe, and J. R. Hershey, - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 Notes: This function is tested to produce the exact same result as the reference implementation, *when the inputs have 0-mean* https://github.com/naplab/Conv-TasNet/blob/e66d82a8f956a69749ec8a4ae382217faa097c5c/utility/sdr.py#L107-L153 """ return _sdr_pit(estimate, reference, mask, epsilon) def sdri( estimate: torch.Tensor, reference: torch.Tensor, mix: torch.Tensor, mask: Optional[torch.Tensor] = None, epsilon: float = 1e-8, ) -> torch.Tensor: """Compute the improvement of SDR (SDRi). This function compute how much SDR is improved if the estimation is changed from the original mixture signal to the actual estimated source signals. That is, ``SDR(estimate, reference) - SDR(mix, reference)``. For computing ``SDR(estimate, reference)``, PIT (permutation invariant training) is applied, so that best combination of sources between the reference signals and the esimate signals are picked. Args: estimate (torch.Tensor): Estimated source signals. Shape: [batch, speakers, time frame] reference (torch.Tensor): Reference (original) source signals. Shape: [batch, speakers, time frame] mix (torch.Tensor): Mixed souce signals, from which the setimated signals were generated. Shape: [batch, speakers == 1, time frame] mask (Optional[torch.Tensor]): Binary mask to indicate padded value (0) or valid value (1). Shape: [batch, 1, time frame] epsilon (float): constant value used to stabilize division. Returns: torch.Tensor: Improved SDR. Shape: [batch, ] References: - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 """ sdr_ = sdr_pit(estimate, reference, mask=mask, epsilon=epsilon) # [batch, ] base_sdr = sdr(mix, reference, mask=mask, epsilon=epsilon) # [batch, speaker] return (sdr_.unsqueeze(1) - base_sdr).mean(dim=1) audio-0.7.2/examples/test/000077500000000000000000000000001376444676100154405ustar00rootroot00000000000000audio-0.7.2/examples/test/__init__.py000066400000000000000000000000001376444676100175370ustar00rootroot00000000000000audio-0.7.2/examples/test/test_interactive_asr.py000066400000000000000000000064201376444676100222350ustar00rootroot00000000000000import argparse import logging import os import unittest from interactive_asr.utils import setup_asr, transcribe_file class ASRTest(unittest.TestCase): logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) arguments_dict = { "path": "/scratch/jamarshon/downloads/model.pt", "input_file": "/scratch/jamarshon/audio/examples/interactive_asr/data/sample.wav", "data": "/scratch/jamarshon/downloads", "user_dir": "/scratch/jamarshon/fairseq-py/examples/speech_recognition", "no_progress_bar": False, "log_interval": 1000, "log_format": None, "tensorboard_logdir": "", "tbmf_wrapper": False, "seed": 1, "cpu": True, "fp16": False, "memory_efficient_fp16": False, "fp16_init_scale": 128, "fp16_scale_window": None, "fp16_scale_tolerance": 0.0, "min_loss_scale": 0.0001, "threshold_loss_scale": None, "criterion": "cross_entropy", "tokenizer": None, "bpe": None, "optimizer": "nag", "lr_scheduler": "fixed", "task": "speech_recognition", "num_workers": 0, "skip_invalid_size_inputs_valid_test": False, "max_tokens": 10000000, "max_sentences": None, "required_batch_size_multiple": 8, "dataset_impl": None, "gen_subset": "test", "num_shards": 1, "shard_id": 0, "remove_bpe": None, "quiet": False, "model_overrides": "{}", "results_path": None, "beam": 40, "nbest": 1, "max_len_a": 0, "max_len_b": 200, "min_len": 1, "match_source_len": False, "no_early_stop": False, "unnormalized": False, "no_beamable_mm": False, "lenpen": 1, "unkpen": 0, "replace_unk": None, "sacrebleu": False, "score_reference": False, "prefix_size": 0, "no_repeat_ngram_size": 0, "sampling": False, "sampling_topk": -1, "sampling_topp": -1.0, "temperature": 1.0, "diverse_beam_groups": -1, "diverse_beam_strength": 0.5, "print_alignment": False, "ctc": False, "rnnt": False, "kspmodel": None, "wfstlm": None, "rnnt_decoding_type": "greedy", "lm_weight": 0.2, "rnnt_len_penalty": -0.5, "momentum": 0.99, "weight_decay": 0.0, "force_anneal": None, "lr_shrink": 0.1, "warmup_updates": 0, } arguments_dict["path"] = os.environ.get("ASR_MODEL_PATH", None) arguments_dict["input_file"] = os.environ.get("ASR_INPUT_FILE", None) arguments_dict["data"] = os.environ.get("ASR_DATA_PATH", None) arguments_dict["user_dir"] = os.environ.get("ASR_USER_DIR", None) args = argparse.Namespace(**arguments_dict) def test_transcribe_file(self): task, generator, models, sp, tgt_dict = setup_asr(self.args, self.logger) _, transcription = transcribe_file( self.args, task, generator, models, sp, tgt_dict ) expected_transcription = [["THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"]] self.assertEqual(transcription, expected_transcription, msg=str(transcription)) if __name__ == "__main__": unittest.main() audio-0.7.2/mypy.ini000066400000000000000000000000771376444676100143460ustar00rootroot00000000000000[mypy] allow_redefinition = True ignore_missing_imports = True audio-0.7.2/packaging/000077500000000000000000000000001376444676100145675ustar00rootroot00000000000000audio-0.7.2/packaging/README.md000066400000000000000000000037061376444676100160540ustar00rootroot00000000000000# Building torchaudio packages for release ## Anaconda packages ### Linux ```bash docker run -it --ipc=host --rm -v $(pwd):/remote soumith/conda-cuda bash cd remote PYTHON_VERSION=3.7 packaging/build_conda.sh ``` To install bz2, ```bash cd /opt/conda/conda-bld/linux-64/ # install dependencies conda install pytorch-cpu=1.1.0 conda install sox # install torchaudio conda install /opt/conda/conda-bld/linux-64/torchaudio-cpu-0.2.0-py27_1.tar.bz2 ``` To upload bz2, ```bash anaconda upload -u pytorch /opt/conda/conda-bld/linux-64/torchaudio*.bz2 ``` ### OSX ```bash # create a fresh anaconda environment / install and activate it PYTHON_VERSION=3.7 packaging/build_conda.sh ``` To install bz2, ```bash cd /Users/jamarshon/anaconda3/conda-bld/osx-64/ # activate conda env (e.g conda info --envs conda activate /Users/jamarshon/minconda_wheel_env_tmp/envs/env2.7 # install dependencies conda install pytorch-cpu=1.1.0 conda install sox # install torchaudio # and then try installing (e.g conda install /Users/jamarshon/anaconda3/conda-bld/osx-64/torchaudio-0.2.0-py27_1.tar.bz2 ``` To upload bz2, ```bash anaconda upload -u pytorch /Users/jamarshon/anaconda3/conda-bld/osx-64/torchaudio*.bz2 ``` ## Wheels ### Linux ```bash nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/manylinux-cuda90:latest bash cd remote PYTHON_VERSION=3.7 packaging/build_wheel.sh ``` To install wheels, ```bash cd ../cpu /opt/python/cp35-cp35m/bin/pip install torchaudio-0.2-cp35-cp35m-linux_x86_64.whl ``` To upload wheels, ```bash cd ../cpu /opt/python/cp35-cp35m/bin/pip install twine /opt/python/cp35-cp35m/bin/twine upload *.whl ``` ### OSX ```bash PYTHON_VERSION=3.7 packaging/build_wheel.sh ``` To install wheels, ```bash cd ~/torchaudio_wheels conda activate /Users/jamarshon/minconda_wheel_env_tmp/envs/env2.7 pip install torchaudio-0.2-cp27-cp27m-macosx_10_6_x86_64.whl ``` To upload wheels, ```bash pip install twine cd ~/torchaudio_wheels twine upload *.whl ``` audio-0.7.2/packaging/build_conda.sh000077500000000000000000000005541376444676100173750ustar00rootroot00000000000000#!/bin/bash set -ex script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" . "$script_dir/pkg_helpers.bash" export BUILD_TYPE="conda" export NO_CUDA_PACKAGE=1 setup_env 0.7.0 export SOURCE_ROOT_DIR="$PWD" setup_conda_pytorch_constraint conda build $CONDA_CHANNEL_FLAGS --no-anaconda-upload --python "$PYTHON_VERSION" packaging/torchaudio audio-0.7.2/packaging/build_wheel.sh000077500000000000000000000010041376444676100174040ustar00rootroot00000000000000#!/bin/bash set -ex script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" . "$script_dir/pkg_helpers.bash" export BUILD_TYPE="wheel" export NO_CUDA_PACKAGE=1 setup_env 0.7.0 setup_wheel_python pip_install numpy future setup_pip_pytorch_version python setup.py clean if [[ "$OSTYPE" == "msys" ]]; then python_tag="$(echo "cp$PYTHON_VERSION" | tr -d '.')" python setup.py bdist_wheel --plat-name win_amd64 --python-tag $python_tag else BUILD_SOX=1 python setup.py bdist_wheel fi audio-0.7.2/packaging/pkg_helpers.bash000066400000000000000000000175011376444676100177350ustar00rootroot00000000000000# A set of useful bash functions for common functionality we need to do in # many build scripts # Setup CUDA environment variables, based on CU_VERSION # # Inputs: # CU_VERSION (cpu, cu92, cu100) # NO_CUDA_PACKAGE (bool) # BUILD_TYPE (conda, wheel) # # Outputs: # VERSION_SUFFIX (e.g., "") # PYTORCH_VERSION_SUFFIX (e.g., +cpu) # WHEEL_DIR (e.g., cu100/) # CUDA_HOME (e.g., /usr/local/cuda-9.2, respected by torch.utils.cpp_extension) # FORCE_CUDA (respected by torchvision setup.py) # NVCC_FLAGS (respected by torchvision setup.py) # # Precondition: CUDA versions are installed in their conventional locations in # /usr/local/cuda-* # # NOTE: Why VERSION_SUFFIX versus PYTORCH_VERSION_SUFFIX? If you're building # a package with CUDA on a platform we support CUDA on, VERSION_SUFFIX == # PYTORCH_VERSION_SUFFIX and everyone is happy. However, if you are building a # package with only CPU bits (e.g., torchaudio), then VERSION_SUFFIX is always # empty, but PYTORCH_VERSION_SUFFIX is +cpu (because that's how you get a CPU # version of a Python package. But that doesn't apply if you're on OS X, # since the default CU_VERSION on OS X is cpu. setup_cuda() { # First, compute version suffixes. By default, assume no version suffixes export VERSION_SUFFIX="" export PYTORCH_VERSION_SUFFIX="" export WHEEL_DIR="cpu/" # Wheel builds need suffixes (but not if they're on OS X, which never has suffix) if [[ "$BUILD_TYPE" == "wheel" ]] && [[ "$(uname)" != Darwin ]]; then # The default CUDA has no suffix if [[ "$CU_VERSION" != "cu100" ]]; then export PYTORCH_VERSION_SUFFIX="+$CU_VERSION" fi # Match the suffix scheme of pytorch, unless this package does not have # CUDA builds (in which case, use default) if [[ -z "$NO_CUDA_PACKAGE" ]]; then export VERSION_SUFFIX="$PYTORCH_VERSION_SUFFIX" # If the suffix is non-empty, we will use a wheel subdirectory if [[ -n "$PYTORCH_VERSION_SUFFIX" ]]; then export WHEEL_DIR="$PYTORCH_VERSION_SUFFIX/" fi fi fi # Now work out the CUDA settings case "$CU_VERSION" in cu100) export CUDA_HOME=/usr/local/cuda-10.0/ export FORCE_CUDA=1 # Hard-coding gencode flags is temporary situation until # https://github.com/pytorch/pytorch/pull/23408 lands export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_75,code=sm_75 -gencode=arch=compute_50,code=compute_50" ;; cu92) export CUDA_HOME=/usr/local/cuda-9.2/ export FORCE_CUDA=1 export NVCC_FLAGS="-gencode=arch=compute_35,code=sm_35 -gencode=arch=compute_50,code=sm_50 -gencode=arch=compute_60,code=sm_60 -gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_50,code=compute_50" ;; cpu) ;; *) echo "Unrecognized CU_VERSION=$CU_VERSION" exit 1 ;; esac } # Populate build version if necessary, and add version suffix # # Inputs: # BUILD_VERSION (e.g., 0.2.0 or empty) # VERSION_SUFFIX (e.g., +cpu) # # Outputs: # BUILD_VERSION (e.g., 0.2.0.dev20190807+cpu) # # Fill BUILD_VERSION if it doesn't exist already with a nightly string # Usage: setup_build_version 0.2.0 setup_build_version() { if [[ -z "$BUILD_VERSION" ]]; then export BUILD_VERSION="$1.dev$(date "+%Y%m%d")$VERSION_SUFFIX" else export BUILD_VERSION="$BUILD_VERSION$VERSION_SUFFIX" fi } # Set some useful variables for OS X, if applicable setup_macos() { if [[ "$(uname)" == Darwin ]]; then export MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ fi } # Top-level entry point for things every package will need to do # # Usage: setup_env 0.2.0 setup_env() { setup_cuda setup_build_version "$1" setup_macos } # Function to retry functions that sometimes timeout or have flaky failures retry () { $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) } # Inputs: # PYTHON_VERSION (2.7, 3.5, 3.6, 3.7) # UNICODE_ABI (bool) # # Outputs: # PATH modified to put correct Python version in PATH # # Precondition: If Linux, you are in a soumith/manylinux-cuda* Docker image setup_wheel_python() { if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then eval "$(conda shell.bash hook)" conda env remove -n "env$PYTHON_VERSION" || true conda create -yn "env$PYTHON_VERSION" python="$PYTHON_VERSION" conda activate "env$PYTHON_VERSION" else case "$PYTHON_VERSION" in 2.7) if [[ -n "$UNICODE_ABI" ]]; then python_abi=cp27-cp27mu else python_abi=cp27-cp27m fi ;; 3.5) python_abi=cp35-cp35m ;; 3.6) python_abi=cp36-cp36m ;; 3.7) python_abi=cp37-cp37m ;; 3.8) python_abi=cp38-cp38 ;; 3.9) python_abi=cp39-cp39 ;; *) echo "Unrecognized PYTHON_VERSION=$PYTHON_VERSION" exit 1 ;; esac export PATH="/opt/python/$python_abi/bin:$PATH" fi } # Install with pip a bit more robustly than the default pip_install() { retry pip install --progress-bar off "$@" } # Install torch with pip, respecting PYTORCH_VERSION, and record the installed # version into PYTORCH_VERSION, if applicable setup_pip_pytorch_version() { if [[ -z "$PYTORCH_VERSION" ]]; then # Install latest prerelease version of torch, per our nightlies, consistent # with the requested cuda version pip_install --pre torch -f "https://download.pytorch.org/whl/nightly/${WHEEL_DIR}torch_nightly.html" if [[ "$CUDA_VERSION" == "cpu" ]]; then # CUDA and CPU are ABI compatible on the CPU-only parts, so strip # in this case export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//' | sed 's/+.\+//')" else export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//')" fi else pip_install "torch==$PYTORCH_VERSION$PYTORCH_VERSION_SUFFIX" \ -f https://download.pytorch.org/whl/torch_stable.html \ -f https://download.pytorch.org/whl/test/torch_test.html \ -f https://download.pytorch.org/whl/nightly/torch_nightly.html fi } # Fill PYTORCH_VERSION with the latest conda nightly version, and # CONDA_CHANNEL_FLAGS with appropriate flags to retrieve these versions # # You MUST have populated PYTORCH_VERSION_SUFFIX before hand. setup_conda_pytorch_constraint() { CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS}" if [[ -z "$PYTORCH_VERSION" ]]; then export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c pytorch-nightly" export PYTORCH_VERSION="$(conda search --json 'pytorch[channel=pytorch-nightly]' | python -c "import sys, json, re; print(re.sub(r'\\+.*$', '', json.load(sys.stdin)['pytorch'][-1]['version']))")" else export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c pytorch -c pytorch-test -c pytorch-nightly" fi if [[ "$CU_VERSION" == cpu ]]; then export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==$PYTORCH_VERSION${PYTORCH_VERSION_SUFFIX}" export CONDA_PYTORCH_CONSTRAINT="- pytorch==$PYTORCH_VERSION" else export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" export CONDA_PYTORCH_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" fi } # Translate CUDA_VERSION into CUDA_CUDATOOLKIT_CONSTRAINT setup_conda_cudatoolkit_constraint() { export CONDA_CPUONLY_FEATURE="" if [[ "$(uname)" == Darwin ]]; then export CONDA_CUDATOOLKIT_CONSTRAINT="" else case "$CU_VERSION" in cu100) export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.0,<10.1 # [not osx]" ;; cu92) export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=9.2,<9.3 # [not osx]" ;; cpu) export CONDA_CUDATOOLKIT_CONSTRAINT="" export CONDA_CPUONLY_FEATURE="- cpuonly" ;; *) echo "Unrecognized CU_VERSION=$CU_VERSION" exit 1 ;; esac fi } audio-0.7.2/packaging/torchaudio/000077500000000000000000000000001376444676100167305ustar00rootroot00000000000000audio-0.7.2/packaging/torchaudio/bld.bat000066400000000000000000000001531376444676100201600ustar00rootroot00000000000000@echo off set IS_CONDA=1 python setup.py install --single-version-externally-managed --record=record.txt audio-0.7.2/packaging/torchaudio/build.sh000066400000000000000000000001711376444676100203620ustar00rootroot00000000000000#!/usr/bin/env bash set -ex BUILD_SOX=1 python setup.py install --single-version-externally-managed --record=record.txt audio-0.7.2/packaging/torchaudio/meta.yaml000066400000000000000000000016051376444676100205440ustar00rootroot00000000000000package: name: torchaudio version: "{{ environ.get('BUILD_VERSION') }}" source: path: "{{ environ.get('SOURCE_ROOT_DIR') }}" requirements: build: - {{ compiler('c') }} # [win] - {{ compiler('cxx') }} # [win] host: - python - setuptools - cpuonly {{ environ.get('CONDA_PYTORCH_BUILD_CONSTRAINT') }} run: - python - typing # [py2k] {{ environ.get('CONDA_PYTORCH_CONSTRAINT') }} build: string: py{{py}} test: imports: - torchaudio - torchaudio.datasets - torchaudio.kaldi_io - torchaudio.sox_effects - torchaudio.transforms source_files: - test requires: - pytest # Ideally we would test this, but conda doesn't provide librosa # - librosa >=0.4.3 - scipy - cpuonly about: home: https://github.com/pytorch/audio license: BSD license_file: LICENSE summary: 'simple audio I/O for pytorch' audio-0.7.2/requirements.txt000066400000000000000000000005021376444676100161240ustar00rootroot00000000000000torch>=1.4.0 # Required for Windows because it's the only available backend SoundFile; sys_platform == 'win32' # Optional for torchaudio.kaldi_io numpy kaldi_io # Required for tests only: # Style-checking for PEP8 flake8 # Used for comparison of outputs in tests librosa>=0.4.3 scipy # Unit tests with pytest pytest audio-0.7.2/setup.py000066400000000000000000000055371376444676100143670ustar00rootroot00000000000000#!/usr/bin/env python import os import shutil import subprocess from pathlib import Path from setuptools import setup, find_packages import distutils.command.clean from build_tools import setup_helpers ROOT_DIR = Path(__file__).parent.resolve() # Creating the version file version = '0.7.0a0' sha = 'Unknown' try: sha = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT_DIR).decode('ascii').strip() except Exception: pass if os.getenv('BUILD_VERSION'): version = os.getenv('BUILD_VERSION') elif sha != 'Unknown': version += '+' + sha[:7] print('-- Building version ' + version) version_path = ROOT_DIR / 'torchaudio' / 'version.py' with open(version_path, 'w') as f: f.write("__version__ = '{}'\n".format(version)) f.write("git_version = {}\n".format(repr(sha))) pytorch_package_version = os.getenv('PYTORCH_VERSION') pytorch_package_dep = 'torch' if pytorch_package_version is not None: pytorch_package_dep += "==" + pytorch_package_version class clean(distutils.command.clean.clean): def run(self): # Run default behavior first distutils.command.clean.clean.run(self) # Remove torchaudio extension for path in (ROOT_DIR / 'torchaudio').glob('**/*.so'): print(f'removing \'{path}\'') path.unlink() # Remove build directory build_dirs = [ ROOT_DIR / 'build', ROOT_DIR / 'third_party' / 'build', ] for path in build_dirs: if path.exists(): print(f'removing \'{path}\' (and everything under it)') shutil.rmtree(str(path), ignore_errors=True) setup( name="torchaudio", version=version, description="An audio package for PyTorch", url="https://github.com/pytorch/audio", author="Soumith Chintala, David Pollack, Sean Naren, Peter Goldsborough", author_email="soumith@pytorch.org", classifiers=[ "Environment :: Plugins", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: C++", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Multimedia :: Sound/Audio", "Topic :: Scientific/Engineering :: Artificial Intelligence" ], packages=find_packages(exclude=["build*", "test*", "torchaudio.csrc*", "third_party*", "build_tools*"]), ext_modules=setup_helpers.get_ext_modules(), cmdclass={ 'build_ext': setup_helpers.BuildExtension.with_options(no_python_abi_suffix=True) }, install_requires=[pytorch_package_dep], zip_safe=False, ) audio-0.7.2/test/000077500000000000000000000000001376444676100136225ustar00rootroot00000000000000audio-0.7.2/test/README.md000066400000000000000000000002021376444676100150730ustar00rootroot00000000000000# Torchaudio Test Suite - [Unit Test](./torchaudio_unittest/) - [Torchscript Backward Compatibility Test](./torchscript_bc_test/)audio-0.7.2/test/torchaudio_unittest/000077500000000000000000000000001376444676100177225ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/README.md000066400000000000000000000135231376444676100212050ustar00rootroot00000000000000# Torchaudio Unit Test Suite ## How to run test You can use `pytest` to run `torchaudio`'s test suites. See https://docs.pytest.org/ for the detail of how to use `pytest` command. ``` # List up all the tests pytest test --collect-only # Run all the test suites pytest test # Run tests on sox_effects module pytest test/sox_effect # use -k to apply filter pytest test/sox_io_backend -k load # only runs tests where their names contain load # Some other useful options; # Stop on the first failure -x # Run failure fast --ff # Only rerun the failure --lf ``` **Note** We use PyTorch's test utilities instead of `pytest` frameworks when writing tests to avoid reinventing the wheel for Tensor comparison. ## Structure of tests The following is an overview of the tests and related modules for `torchaudio`. ### Purpose specific test suites #### Numerical compatibility agains existing software - [Librosa compatibility test](./librosa_compatibility_test.py) Test suite for numerical compatibility against librosa. - [SoX compatibility test](./sox_compatibility_test.py) Test suite for numerical compatibility against SoX. - [Kaldi compatibility test](./kaldi_compatibility_test.py) Test suite for numerical compatibility against Kaldi. #### Result consistency with PyTorch framework - [TorchScript consistency test](./torchscript_consistency_impl.py) Test suite to check 1. if an API is TorchScript-able, and 2. the results from Python and Torchscript match. - [Batch consistency test](./batch_consistency_test.py) Test suite to check if functionals/Transforms handle single sample input and batch input and return the same result. ### Module specific test suites The following test modules are defined for corresponding `torchaudio` module/functions. - [`torchaudio.datasets`](./datasets) - [`torchaudio.functional`](./functional) - [`torchaudio.transforms`](./transforms_test.py) - [`torchaudio.compliance.kaldi`](./compliance_kaldi_test.py) - [`torchaudio.kaldi_io`](./kaldi_io_test.py) - [`torchaudio.sox_effects`](test/sox_effects) - [`torchaudio.save`, `torchaudio.load`, `torchaudio.info`](./io_test.py) ### Test modules that do not fall into the above categories - [test_dataloader.py](./dataloader_test.py) Simple test for loading data and applying preprocessing. ### Support files - [assets](./assets): Contain sample audio files. - [assets/kaldi](./assets/kaldi): Contains Kaldi format matrix files used in [./test_compliance_kaldi.py](./test_compliance_kaldi.py). - [compliance](./compliance): Scripts used to generate above Kaldi matrix files. ### Waveforms for Testing Purposes When testing transforms we often need waveforms of specific type (ex: pure tone, noise, or voice), with specific bitrate (ex. 8 or 16 kHz) and number of channels (ex. mono, stereo). Below are some tips on how to construct waveforms and guidance around existing audio files. #### Load a Waveform from a File ```python filepath = common_utils.get_asset_path('filename.wav') waveform, sample_rate = common_utils.load_wav(filepath) ``` *Note: Should you choose to contribute an audio file, please leave a comment in the issue or pull request, mentioning content source and licensing information. WAV files are preferred. Other formats should be used only when there is no alternative. (i.e. dataset implementation comes with hardcoded non-wav extension).* #### Pure Tone Code: ```python waveform = common_utils.get_sinusoid( frequency=300, sample_rate=16000, duration=1, # seconds n_channels=1, dtype="float32", device="cpu", ) ``` #### Noise Code: ```python tensor = common_utils.get_whitenoise() ``` Files: * `steam-train-whistle-daniel_simon.wav` #### Voice Files: * `CommonVoice/cv-corpus-4-2019-12-10/tt/clips/common_voice_tt_00000000.wav` * `VCTK-Corpus/wav48/p224/p224_002.wav` * `vad-go-stereo-44100.wav` * `vad-go-mono-32000.wav` ## Adding test The following is the current practice of torchaudio test suite. 1. Unless the tests are related to I/O, use synthetic data. [`common_utils`](./common_utils) has some data generator functions. 1. When you add a new test case, use `common_utils.TorchaudioTestCase` as base class unless you are writing tests that are common to CPU / CUDA. - Set class memeber `dtype`, `device` and `backend` for the desired behavior. - If you do not set `backend` value in your test suite, then I/O functions will be unassigned and attempt to load/save file will fail. - For `backend` value, in addition to available backends, you can also provide the value "default" and backend will be picked automatically based on availability. 1. If you are writing tests that should pass on diffrent dtype/devices, write a common class inheriting `common_utils.TestBaseMixin`, then inherit `common_utils.PytorchTestCase` and define class attributes (`dtype` / `device` / `backend`) there. See [Torchscript consistency test implementation](./torchscript_consistency_impl.py) and test definitions for [CPU](./torchscript_consistency_cpu_test.py) and [CUDA](./torchscript_consistency_cuda_test.py) devices. 1. For numerically comparing Tensors, use `assertEqual` method from torchaudio_unittest.common_utils.PytorchTestCase` class. This method has a better support for a wide variety of Tensor types. When you add a new feature(functional/transform), consider the following 1. When you add a new feature, please make it Torchscript-able and batch-consistent unless it degrades the performance. Please add the tests to see if the new feature meet these requirements. 1. If the feature should be numerical compatible against existing software (SoX, Librosa, Kaldi etc), add a corresponding test. 1. If the new feature is unique to `torchaudio` (not a PyTorch implementation of an existing Software functionality), consider adding correctness tests (wheather the expected output is produced for the set of input) under the corresponding test module (`test_functional.py`, `test_transforms.py`). audio-0.7.2/test/torchaudio_unittest/__init__.py000066400000000000000000000003541376444676100220350ustar00rootroot00000000000000def _init_fb_ctypes(): # Initiaization required only in facebook infrastructure to use soundfile import libfb.py.ctypesmonkeypatch libfb.py.ctypesmonkeypatch.install() try: _init_fb_ctypes() except Exception: pass audio-0.7.2/test/torchaudio_unittest/assets/000077500000000000000000000000001376444676100212245ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/000077500000000000000000000000001376444676100234425ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/cv-corpus-4-2019-12-10/000077500000000000000000000000001376444676100265535ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/cv-corpus-4-2019-12-10/tt/000077500000000000000000000000001376444676100272025ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/cv-corpus-4-2019-12-10/tt/clips/000077500000000000000000000000001376444676100303145ustar00rootroot00000000000000common_voice_tt_00000000.wav000066400000000000000000002354741376444676100351160ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/cv-corpus-4-2019-12-10/tt/clipsRIFF4;WAVEfmt @>data;   9pp =4 DQLW7FXrp /[ i(Y.565 AC|serG3jM2| ` B5 F_MI9_Z 7 kuH E!q !(h,oI8"B~Crx  9J:A &*^y < ?B>6X 4  I  .<\ڶHM 3u0 hJ( |& a '+6-Q@Ve'F xT /28P2?RN8S(&xC$U-ZzU% vh 8|  ^0 2( Vx& ^'w> . *,8kQD, FZ7s = 3 Mr*3_6IdL5Eg}$< Xvc?U示y;n BۅEn/ ؆p+o X)3%|Z z8޾v>+!lAYނY,1 /q$nRݘ^%.^@ $mT&D#P34oSW(78ST#"!Ta "i Eiޕ(6ZMD{&He P0 ;s$R$`e 'ݐ'e`!F!M! m]Mj$ 0z y֨j]ܚ/(S'_+99YNX ߳ڙ vӴ&o "S[l-> =O*:D sK"#Twܣ* &6DZC0 Ys#Q ?8 a Q5/"%&[ҝ#4I  L n#t &z^dV.Ͼq)! eA8VV al%J{ `\  > {%Ox7+)8 V2 1&U .B _ 8-KH ?4ע7*7~9$#27 j pFF$L t )nm ߆S'#hz ^rb aV ~OC\U`NFb6f%|:`9/p*mqY*h\ּ V$pJ?_44 G$#,)i (.} J `ޮ/v+n ,|uD1 *+oyV2 ~-x.!FvQջ9(I;  10g< 6!'Kߏ #?'M$&+$Ny%N*P*MNԪ(8 9YC9)/[t 0: 'LG3"1ԛK 72G Ӽ~^> $*Gܞ$΍yB>%<%!U,$$+ `$tHֻ 77<;]2 lC1(   #xD"Ɂm 2m!7 ()8Հ2ռQ3,܋wB( ߫ gi=HLQqY ߜ8: x? JR 3!V $+h t 7r֐=vQOS %i w$A\@7Bl gMe:ϐ W<' f'D_1~, BFe_ d "* R=;yž 7!ZAY  !W5ߗx^% )f3RW$;5ZM4T"5 IDrP zF$ G  C "3O =m#M  5e2/6$D0Y , -8,`g  6º&&ܣH .|g $!gCx&<Nz f$-; CjߎǨ kY # 5m< ?!\ p\ W&$ϟӽQ3a1B#@Tt,  6i /Ah !ٖ2[ c-!4k9Y ?~% p%j n*@D7T*+H''n{%`zrVVg o ẉq B2 _'87s4\+L `T< I 4.p!W `w%" 1Ymp[}OahC_m w թa FnԨ( $ͬ<(X? !Lcb /o_|>/U(@EG>2e>Mon@q qfՇ0& g a0 i'&[dMMcηL0p‚+CzK   1c=P ܇W b!4 jI6"a%r  $j ٿ&DZ  >3A-C/%<۴!R( 0q w{oB r#` 0θ :j̍%133P':e+mu D2EV!E5[[]OW(%j\ &d/p0)N~_E j*0f v<u#ٵTJ&PMCy  >5#?=9B`c Ϫ*Cb.jD(& + Ng!WP- ߮J vP# w~  :8!V#K F  ]: [8-.݅2$ޏ h EM hܣĹAj=)m@}@)|'8'igJ"St  <] N lH]"'i k{!* ;4K_P" |i Hթ _=rPKu! d] ;/2 ڂ)e (GWڲ(gB /KIt H_"IUlO&8 />ܛ X6=x#aSl)Cz-' $Z%jI$+{ T0`Fo=@JjqB- \ (Gj6&) e9+G$* F"% BAn( H5".  " ,!O+^ =ۤ9>)~,k9DGKC^6ߢ E[/[N $&uHg An AC\!DL66v TM[,c!ղ=2~ =ma1u_- d'<t"ci ,q^0)& U"[z{ G?O2 `-{@] V.Ѷ e~ 6 ^!`!XDoqs9`  w %%t ?'B,?' hЗb J.Y϶ K$H=Zt[ ybUx%q  vM~  `X2 G.#cPؙ W+/x)%~%1d{Gp^ )}! (As' g)/{%] c>3%0(3 pاq ;&dKP X 5F z7},E)[j!:* 'x&p 7 +L & DP9+]j <, /Wl5U (+9{ H6T2 (-,!F^щ G ir ֢&9(U. R s I!\duA'`F)p;\ OG*/ XF3`.x'h$z$idQ41]=k !&8 =b=%%EH6dc2)2q\{e#u +) ,, %+c"hl $" "k.9oFABF .amJ"' #'V+FM;,D#=@/q VW9n!N ?$OwĤz k:SD:& >*DV "ҁ D'o|$/ 0 [h Ee-> f$  46V(GKB2ڮ"#  y" Cb#F H]c7b%g{l (j34Z'  K g -|{h o   p[$5f(j)~ >c8 ޿+#/$K  a&Qn )( "Z kE X].!LJ5P "nא Ⱥ Pݑ;b 0@B5.\N  )2Vz@Z#":":D*Nuc4.ӒH  ^~ =.q =-!{ & C. P4BDpV\ H 6I"  Q  B+$)%;, 5۔@ ZgX|%~31ز{0@wIg]% ǡu)*"vd!U &؇._+e .!pS .![b>K~/ Kj,E\3CY Mw' +,kmg#'.M$4e3!sTT 4ײ Y/̘\d$' qQO$w(xP߆$"o p([78Vy:sK(% v|P _"4~Fu Gb$a+]'0{_4f/ Mv[Cn50(DK.bH1Ғ47z;  ! WZn9$ߗJ(A ^t`# 'U#m^4z|-tZz 2lvo ]Ay IoS `, (EXY{ 6` 0`v h& /( * --1- @KFY}g!u ۭĠlϫ.Z+A Uޣ/ { $L N6 & `3f A [4OI5O % #Yg9z9$Hmli5ؠS ^%5f ?(FHw2A@1 `v0ݍ+) 80<!B0~u_Z.n* P4[ .K ! D~]m(  U.e?8?d  i + u!<4$P - I9=)nD--Sԏ( )8 mL<ٰ   %s݉ j4k։˃)(޹9-bhvYr!q g*"`&{ 3fd2B&&& )i8"e%> iZ: G  ~y\si\V=8=i J%W! I  nAԟ ! {d$dLId%m %8(' ) ( }6Η ݴGm@ĦA34/= Rv< !h Y DL, y%a"Z _@$7~X2< ]t4d %Fj Sf2ߒi jK>/GEa\$zN[09Y t cwe5`q'}c< V\! 0ں(_)#3-(#%Le nX~ ـMڅmp=n +& k%$J+3 6G!H'(N!e wv# `YM k?r2 @sݮ " "T$(#B Mݰ:t-rF yLS !6;+4FS .( V#&mB 8# #S =߇6i CzQ- ?-j5&* 3H` U K4 ]2m! R&t 8P WJ '*1c-",bu>r U Th0- r<D"'KeQe f,WcJ  m)"lM_ OL 1"{һ'R ]nŤjN2;  <3 7K$}v [>o?7X*r ?_F >Os fSdtb ($_4%" l s1 +U-a ~(#4;f<uh PTر.@-I"(I - c$k< "9 h3M Ja-6!xco&A r[ִ_PSfm1$_5W>PwQ!Ңt2eݶ5d@7 P 8F V)#H PQ ^k 2~"@ Eߨx3";n\L'(&eD *$! 4c6/ J(7L z K{O4 i!"aqY K@p^3>Xc =#M7څI#?mGJe9*} xt&V&l%i+R *i%N!-IkmS+hї%'} aL H7 Mm ,e4J m e:r] zE> (x  I8? 'o^$ 4>VY@%1 7hu$hI-_~ #V' y.6g7 ^F ^Aq l5:,M0`W7/ 3! H>8=:N g@!Y< TAж!ҴFI:A  & 50~hx$t29Tو"ydR?܉ ;l+-j0r[} _ ZLnHV;q5oZ 5>j+\|N!&G0m ~ E\l<2N%"t: j;!j%ow U%|Va Y 6+ S/Y#*R"8z/bwR /5c9֞03g -"=!Uu}ɪ' t4c  *k.1e i7T\$5#.( րTHƾ_S" q"SiԽ)d*V)эV"/ G 6g 16 !p"3 X_TSO 9K 1"`!e ;ީժXH,uF I=&#^ 9m|BYeT%P0Y:5zƮ?& fi'#MTC . \ְ %l ]P<"!.Y. f;;g8I@VvY o e;һ$_Ya<)\ ?)DB,N))h& ! a;&#C<2ThO '& QK.]`2IV32L\! YKp-dBg7 |c'"0F# bM,@ />4 p=scvL# a 29G  NA^! ~ך"C~p۵$]R&2@\7y.ip<A%w #(%dGx0( ԃ_z& %m/"Mu .Oގ=&+H  r`0:= <{g 9h:׍THB5ٷ*M0g N2u  -R`)?:6Vh\? -*/a <,LAڋ8M"w ; 0< B.J77$g5rE٣i @=Av2T܈ [A}P 7}A!k(\r/   1 M X$N31R N pm, : '*C"h` !,40{ F2s fu+n__ag *<h:bS=\ ' ڄ&ɾnد2") $]ް  V!L*A,Mܡ3ٕoK\/8<&6aE&_\r&$ V0 Z I(h VKy; KkBlf{ #6:C'"  a"D R&$ +uT'[ z\ t:$ 0.nR"  ;!{ ) (QII X^)T;J0$ s'$ݸ&RRؕ WG/2?)g'\ %)K9 be q' /Ah"lf2l(5*!,o ܎-7 3/Wk BX Q- #.V p1'{FCR|CJ<[+M #L B9(tAbE YPx( s4w:| d (z=r2ߢr&e >J ~0/:e>;0 t%$u q)sz/Asp ;R8*)a uO LM`'^'k 1 zU)2R *< q+h% ʉl\: 46 ^: Ig+I g.l@'>u&C<2ش,U $(|*j!\;߫@:>(vi",\*$Jb ]M" %/݅8K v+1V0?Ipd,r,|I]%Z1-*yTwEҵ,'|49#2!% X{?+)i w% +ӭ9#C|T-AXlI%;m,'/v"LIk 5,Yg3}hY{B{yv7Tu4og-v \L/l<55&XYY٧46 D[B;zv :  o aw I m) Bo#A _ "*9 4 uC '?խy#Oʖ 5&""e,0w S$ Q %f'?m3Eْvg/(^WM#dh - w'Vy9=bweE5 ?) #6A;R$K M0 5 l k$-6/Ex2IEwU| 'M\`i 2 <}Yp[ 1]fUfNl#T4I)  E" - %ͣ4;,0 V"$\7 f$8| :DIהւ)0Y? $|$W-5{ж .01٣џɉ Y'F Na#lK/ (U@1Hb!캻} )5$Eܯ `n)#%$.ReL$?`$b]gj!"/ t0ʀǽ7A)nx+GխQ +A'Ӥ8 q%);o].V/d/Q DW\L.$#:a[Ֆi -c6^t Ӈ/sH_*ST!-57J b a+7  +G p0?6[vT/}435 Ђ| 5) IƜ Q1K?<ͭ"+D a!-u f"5KUs0f8K  5.X T}j5snI b NhRv{ y*O|) *F,E'\ *VX8El *9A%6y&oL  {vߗL33KnZ- e J7U g ۻAnv%xvS@!@PR~ m),ϒiM{3o2 }ޑ6u#=(gYK ߧUQ =e   @*H=1$-7eגS!&E1? U$NY 3, .Y UtJ!߹'i-ef> ;z$YIܲ !0$ۀ 5xn]'#D!B)  J@! 7 F>`" S ( 'p $ߢ"!L);@"M#h 8F_M Hpȹ+- b la r ,`ZW"7G6#5 +@f +:8da}60,V95!6[ 8-v3 dh(tqr  &*Gw807 3#T?"oO^d߆_X:a~aZ2\u4@ _ 5],[#/# C'#'oC8 " t T ! l4 < Fܞ/ eO[ JV-=+E.AB)@M+mPFm"}F/)l`R0B*"  v%^h'Q1hZ 0 8a%'6ut* LuYe6t5ex F{[+5aE&! (3/V,Lt)׽\ VS>\ # K3 1 )1p,1߰~ *)%d1ʝ .-~<Ib ~y/,>  }"sU=|N"8 iMI]c {!t_ٍ8lKU g*?p c6DU_v!%CmHzO +xz 3Ϫ g^!(h fuB,Z Q HD/44.y \ Z zc#˵"l  z. %/ ~@jaީBT&j  !ŋ %D Q)X.2L$E"ڿFŚ!1 &ld:w`Pѿ t/T't ؍$] AI+x&r@J(W D7#7C,1lO+(&K.aGqu–* \Q:e$:$h ah:[0 )0;21΢" G P sN 8*{<72+{*} ' yZLg 5z u  :) ֨$:Wg v !Bm.+Y۵s @ hl ,M>YJ\-? J  41,GuDs#h=J  M ,X c +1m[ %v h)d !=FTRwlp`1+T6+ljk BCS]U*2  ~Z2+>y PSKyT>^1Ql-lsf @ceh>?+k1 M"RLL)6UЉܲL,`1|a_#!( u/B $Dud?}6Tf-l7qH}$iC9[>2$DA[\t.\X* rg Px} &f-! 6"<+ 6rHL$|f `ezT 1J  h3cvnK)Hu.ql9n] /٦  c7x bH26g|K =nS!?/YI!?Cbܥ5Q,.wc@pf^/ x9f} Ym%ۆl 5Lh[Nqݕf) D,^U3 2(\: nM 甾 꼄*\dF"m IK G/: F0 ! I!]24I Z8>qA+ :' -2;JÍ&+Ν9۽J]Q'$kT$s޼ <D2, $ڰd_6mz@?5&Lx jsk&c:S{?vP})n$ _"+,׮oЖa^!ϵ ,'+hOU-eM<_ `vy eb]ޞy ((A%a!^?_ } # p_3w$2g &(b 2M P 6X  >~" 3 ;V)}] y! aY? o 6 "J#o#{(&"qQ g?:1|U #< %x&  L M/ RVg(O& HԌ(d5܉D409] "WԾ* +:^& i8D4"5-MAgYUߞgQ/f(% & Ѱr'2 _K2 @-@! lG P8Fg $%O L)U -!S{AQt l#Fّ?n IZH0+"!@5JgG]e I|*7dBmJ?𤹜( h|6^!k-L/o{?L7?k"|8+HGF ZOҰzh|  &miJV+}%1Ktw 8.{Yo D9%pEX5&7 '~f^5O Cwsx $/{Y%*' |oY  !2Q@B# : YU'$~ 6 ?x/!: τٗTu^ 5;u S2 }*Iq) b &|+5I #g գ?n+ En*Y-ƛԍO޶F)2L#c32l-Q4BfπF O R=` q,kXD!*fi܇;? T: j$.2hR!y L@Anu'#9+0)30sM#;jtuqO*#]= Cݽ 7 c5 @/m=+%$:$Tm$[#$1+y * 4Z-Q.$!"%V %PQ[>p޽W)dHTW*N| g ̎ =E hߙBzɏK1`z1b - l .;m/ݝ >or#;*% x)n\P^4'H$49% d*#e h" 1 UB}+ 3l7r}SoN|!|p (_Xؽ  wVsr ^;cEYZ2=< &8"%  j^ |y < ui: r2+ b; ,z)O}Y-r1) yo%vy }TsE'e\<lq ݗ T0# Zx}Y A@{S#p!ӻfV btH  CfXt)~w) )nxA!#N<AF _3| !%-M 2*MiU  e2cִْ! )fk 9٨F  R=1_@ Y;- *m:XsK4'<2&? .8:>}Cu.?ze"} -5 %448vF &(j 'B" V4sZ}q/!= wǏRW n !85"#.4A0i#S.?a?t ZEN Y] z B=,U K A3+6 r̂7+o P$ItA07pM|>Й;O!m f:J%P U|Jxۆf/ ڸ-z%)mh `7LOy M]$&#.* S|o3#e \g5s[ \#n>9[I-MnDY0:.u  6;7,^)G kӍL "88=Y  2\A 58 kcqSf;_8.!#vizE2h~ O'(Zr+8DO C#@G 6`(=dxCX0q'A?g\Q? y"0Rԇ rF>-<!rux9| a.*sA" LUB I6r fWG$o1wկ"c NFsr"A  " b, 5ޤfMTre?#,P\:o%8#~ *x1%%޿ ~@ Gx ?+ ޵ n)-;uH{[ ߮BH;G5Pm-H- hص s!Z)[sFD{ ? +$̯=$rs)eq &"23O _9? u!K`q&&<i 8!Di2o#ݾ=} '" 9 2q|Ԕߚ*7!i bv$X V-d)o{Z%LFz  ##Gq6 5Se!"v#j+, }1wbWc!ݱE]%|a K-T )T*FZ6Hd e"x];!Ma;1Yƃ- |, E s m nU E6ZjO٬<|&eN.+ mK=a&]3)uy6 BU :)wR_MpA UF FPB  [Z$* ?Qk^,A *#I[ B  `8u;'! 2d> uPb.(,R } () /)sN /30 c[a _Q,FEA(M%0L.K  z6 8 T* 8%Lά#M @j(oTt@#c/ X^ HVd"_#530e&*<0&)}2 c4n:)619b"hz!+ ; &/.nQ"m3\F:2d@" (m%dPj },! (] Gܛ#")= vܱ#jުWK?!oNu-.(o0~%$BW 5R֥ n*hH  &"  6l Nc'T^B% I܁"!+8%2`&4 h =z9?PR ; LSd  H (9*i>S 'j...aF !~ ]? "2  LE ͛L'D %1TNq u@Yz?x fS^1@ޞc09'BI@ `x Q 4 Jb<{/#kl\DNz[ , 'CMw >)yD7q '_L!,HJ< %0, d#H 5OjVz /! &k`O`>M#Z"= 4r ]&^F V$~9.Nl~v ]X= {$"Ox o0 QD4pڬ,9Mdz,և~9^!D(yj$bw`F'r:m's'>7%`%)_() a / 8x E a*ޥقaWn=u!tP} )!wͼ,"#&: yp*fܷ.,lb& ybU5# vRͦ0RW$uq̱ i} "uXJ| ::?,4%,$ .fߑ#./}!!j&D| 5Q"GAn < ;)()'1u#B7\.;D$/F"%d l "  ?'"8$Y}ݐVԙdd*h 4@ -d,_A,uh& W@h)+*/+}+j&#7K8ìks:&ZkQ 2%%#ED2 N \cZ(j P'rx J!.V3x\ Y: %ӿ} ( S'ַ&  +$X. RkcY'* $O M^vt=Ź D"^(  /;| YHrl;P( B:NQp\݌.7dO6#< ? g552( ifz ΄Y&y\5A ya FZd q/tnPho ߳ 1so48tR(ȸA!Lhޅsvu_\j !$3@,L ''+ִHt v?ޭ@ z%nmC3:CwJ 4# 6""4#ML `?G_Zj|  ׉ 3oX 8zV u,v4yHG4 /D)%9L _+ߡaC,s )4p$Y(k;<4k)% %{ R*)xI/ GLB۠:ӓ:eSl6. %e&݂. bP!h" g"1#V3 i `<j#C{. 1V\!"^7z o  b %@!&(& =R$ f IR 2bi\& n|LB\o ؇2JS 0ޙmy͉os&SP/V.&W&'U!i$ i]+.6X S$l J!!1! ؂uT?6(+$a\> v~Άђ H47 =!!R H )0C'}*cؔ8 C(+V$m՝'8 jO0)Y^ D +[<ݩ6'"P%#bD  P8c s)/z'uUQ-S.R"|_T('[*QcO:ۧpO"u5m)A4 V d*, 2747 (q3j->yo(ڶ [#(!{݈ 2t0/Co Pvg `a ' 7(/".ROP 6_0v9ԋ>ˡ `*n43;L!}ު)nT AsSBK.?$X&2-l%V X^(,{ +X -"@vMq-G%c7cп3 }b$%(1K+!qF( ;E(l {3Bw/c"f xx 0b^q6hy'N$5 l :]!ox%2)&*2r 3 Rq8 #6x u#yI4%!% FO) OCw{cU Vzlm 5yj"7[/-fD Fő!RcA8U^y?ڻ6QPLJ!B+>tB0+P E   .݌)$z <*8d& 65-| ! U&Xr xoi!6 -~EM  )V' wI)x J') z)^W 5 &'2.-> 7&;h##&/e&) 6`VLjU 9lZI@ \ cv /VB<0d-j!r?  &#ueF.]a%dN&a֝!%lZ[M+F@-Gm%/S \q؆)/e"Bصָ3Co!dz6U2;;4v 9/ھLK ( }~3@3 4o$u"' D&8R,^ovd )ۡD<j v0g1,.\wڰO4 g*&?AJ+qv{-٩7b>9A#q(%lsV'U 7-UsCHhB M; j{ <@{#:V""S#O #/PM" .] &6Sr֍@~Q xփD"* f*bp- kکB &*! BA?ؙ͢\}s):I!t_ y !!#D)I0?^q> \л# ZYT!F/9|@('t5 PA <#nJy#   L' & $uO`i~(/(N p"] 0&g  k7rU% &,01˸"/W| PM&Z& , 6BT\x߫K EB > Kހ *+(  A-Ld} : ,  Vu)n IYb I %T&y:6!j?. $$W4.o+  -q/AA *%-?-j@ br s u >yg). "Lm^+) w   A'a LxJ*-G}fӷf߾  N^tG"t`po "8ݴݷS.A"!xo $Qo!1 m!՛) R )? 2+TG(#AJU ]i+%t 3m: e m$v7!$09d )!K{ۦRRzDA'n!$BJ GgOqQ|  _ߦQt% c |[3m ]# M#ۇ$ڤs \v" + 8jI,#vT,v,\#Z6_LӆxgX3xB%ߐ# e$W 8S4 _l P GY $ ;" `!# h/p u!r %٫O+L %l: #a|!K{_&*J* lM<^vQ$ :du>1G4 ՇkN" FQAc 1_#YuUr !'; / [0L9Q d|-%Yچqf"Q-ו>2`pM 6T;u m #$ -pM h$DB JQB5)6"WA(8|%V,Yg v!=#) ?"=\7k~;j%Kd ) QM" $ox/H<bY %J p{( = ng4 mE1bj@ 1k}w MD' ;o pN 8snձi; g &؁) 4 [Wwna 4NcN(a`] -# /z4J; 3 x~ շ=.aU,LFz PF +-'a(e`F`4"ΘR $G<7:s+#&Dk,= @L#WZy#& qn:^A_ 8 c ?q.GB(!wGQ c_w F r2\l9\oF_}7wT~dxޒ&?= VD%A Vk %N863 H IO#zd ?# W1"15 J.{܆$('-wKyB^z"cz k  [x#j0e)'jmE0. ,z l!`}X#.- 2/ /sp%$l) }0  n0"# @ 8\} *--5s+@.$c 6oW#Dj)0 8H %8 #~^#"[$# jZ S !%B y_ .bΈU<ц% =/# "2)"T #(X9cniNCFbRVh(U{jֿZ=Ew-m" &PUN%(cF*#&iy.cGw @Xz =.:<(x |#El/,uYnEw%se/"$pЫ0 k}$)kn p !$5T f6,OWUNo\%U$/&~i>L3 G sZ- hek/r}'!}wm  q u Q)4 u^ghi&@HM: d q1 mxg T|IH̔;"[7m}h*%;P"v]h""Jv0|'#%AZ#E- ?,43A\y< [%44,) ِH&n %;lN& ((84"'/$72f XT]Fp  4jJ C.U &/Ƚ" =heȶQV$0# Y x-/j-9$ yr9طd114+%Q*dW# 03 ~rK%.:'"=t/'! n P b&V Ѷ QT1 2D1ގ 7[NY~ _!o@:oq!DrP'OG)xrk1θ8| / y,[xO0#` !4*." h?U khp R"0. G & :w W/pV0d?5//9 ڃ 50+ ZYuǝZr's%ܮ<\j*&m/]V/We   tC+l ]Ϝ_SK'`y $X8059(MS=` &Υ*+{L6 T&Dλ_(z4+]{) <<+{$ xOw[-0 2%+` 3)#uL s*.'_/2&3>G+l'0 -+N:*YanoGUao-]M `AkA9 |52C v\m  } 0G &:?9A9%Qo)o+ \ #vڪ,m x j!kr0/O&V[ ,' .J 5<%! > %Q /' O1!d45$xz 4UJ ^Ɗ d9 ) 7V $Uެ.FF 1 0~G= 'V&pv2Btjk3 Ύ  % -։% LH^ٰlT C>H>no0c G& ycBP޷b7 6`:F[.?:)Sv#6=. &6?)H ^ӝH. l ^y԰m "Nݥt k,g3#Iu}VC |""<<!o@%fVW/- G g   3g>GQ  KL]3Z8$aa !6- 9A![!?>4L;jݙ(fօZl= I!M"4{ ! { a b/1d"$TIT/q3 6 5& 5%Y"O>pBHaK <71y}oغd*Md cM|d {c2 Zyreh:|B j8e?d"r1E'c Ch^.c|Y6'-G4&N :z%'clI+?uX qݏ loB //DE|s3a{0(j Lұu yR,"DoB9r!& C%R k$š=tpD(RYT0 +ݶ'pUZlW"Y&~]PW ; / EIxE0 ٵ0g+s[|pi"lΪ EGXA8 $*F )J), & "8 -E ~ & %${i#I3'>l T#:q`sw[WzA1 _L  D " _S e2(-#1*>o @I hfwm\d8)ܓW&^ى, v$%4A! -vPOYM%la8 S +$TI}WuP Gu $pgYc-LR  kTe R~ˎ&!^_ R + 1&Yپ n9cFߘ Km n =s\{^vu&> 6nV ALkj,ʔ XzHyL-1nê ϕn&<Hd+|a-9xs9)4X *[&0_j vK5 B` !F5 ko!Ɲe9" N hؿ;p;T90& FpK7> Cu?Z%D ё΍ɓIa? j'#'"ҏ6 <ԲB M-Ɉ&eyۙLB &'Si3}`Ah0܊f.7m?f++ p# , CO FS"^f%uvcR>>Jd|Lu/U >&7(sA%BGyJ'Uݴ D +h~R 7!"Zם  {k մ(X. A|$QUME`sF?n Pm,D' [ZՁ.Z=T]0z3  ; &A2l\GC30FQs=1}(3>ر bZ{/Qџ HfM <5*upH~&-nyfo76Ap"F27s؋i  `.b.1ܥ{ !SU) = 0 ux1L%?] 8zԍ<]~Nl20? +*"0.$(!(=h1K&'f DA210yk۳L"qêI%2H+,72&K}&Ӻ:+@(P_e th0-a$_F@ 5 w2۾i ~(%ߒ6w 4 d %\y+9fٰ5d|(3*+Z+[[[ h)IL }$E 971Z 6 EvA55} s%B ؞,{)%&I j1, h  4{%`d_T% _ 9\% -YM+ObQ'ܺh w aLUZшS-#F ucL):` hVk d̤(10"?{bpKb*I! 0fn /* Q+ |)F %E&u }"F, uB$h ,V%(J!1 MFGڷ %Zc#\" { ;% !*~z"<3׸Jfg%Lޠp h(Pn-u=:XC У IE sAN(E$i$AK%2)/vy;FZ/ //'v!jUDtE1י ]e#zsn?J # -ݔ- pbJ02[( ^@V$+J_X ,+)`D.t 7Yxn 03Sd$ k3Ux!"]8k /HrD ^i4(&+VL &I!x`7_2: a.|n^mz #2 W]v)(  NiG"֛Gp] WG [9}; En#2?V6<8i;   (Y e h 0' 2 "qhÍ 0 U{MtD", '738- yl _O/m3 9 ')k$%ؐz"2 C/ )0W'*ܓ D>n* _%i & FX0 O ka r"k'_E_d<`7:pf/NR Mw <  ֓%<ߧr9ߌ\(\!G IO. ,TL,xc]eh& J(}'" 5*B[! 0&;` Dܔ i!>a$3]$ܮJTZO  k(#, AU%!Ui Jmv O$6}v!4 l18 C& @u3HqFu9*J0- /)(aA"14Ԁa%H])$%fB&x=ct [UԊg.O@@ G&4-N+s.III.T{6t Q #z5  Es ]&UR" D8 h , [W!= :g e{S 10 =ܾ\"  >,o̬ 0f5J~!Y Q7 3Z.i۬ 0Y(A5 s0ʷ p (Ծ6 S)m{ urqX> 0B=OQlC &}xbjzH!'/R !! ga+; ;-d#z YZ|JAP ,O+ g 8/O",b o*R4U\kY( Vf- `Y<#f~~-ӫ)sc/ SB,)+* W;(0؄<) 2N߆( ^.'{g+ə'ky! Y߆=}pK jCh@*L* m V`/$G)M u [A. - gY Ķ00@ 9$LPؚ p*92j؋YGj-{sL|A~l"bۿMzVPr ' ApY@ ZD!& 8=&XJi 3# }:)#9 -b- d}o' ZC_/ϩ( nC ^]$Ss t  i9,h '_r cJ peJs<TL6@!Jw؝ zg  cC&Tҩ "Z1a _ѿEʔm? -1kʆ:3G55* BJ<\vb; " B;#Y@ 2CR d&9e ڭUK5!3) *e aN(-ku}fݗ%: {1Y ev- 1/KбΪ* jf] >#g&B%-7f.& d2' ƁY 2f<0%09A' cQDc)J" n!!f`95&` $9T%%{;We#e Y -"lo?b&55S~Hc&+oJ0E "GX 3͒L Z 9ZX#9'Vk 95%, D) s 9k ׿{"4&n-y6Vk _y bH&Q V!xҤ  |'v -_ #1I~tE\ 1"| k˃m;t x*(TXފI02#-W1o L1/$]*0Pf ;c$V }, tCJ)^P)(. :WS J@A# mcBY,Z>̿.:#9+"* ;'=  & S aO>ߗcp׻ -k]>Y{T+  -'{7 /y W)[lވ <= d 7&7p"FZ uzb7Ӕ75yܔVv 3 yCsޫ`M r#rA r!Gm-8ݞ ;Հ-a,Dx !P/ dv2q ')~ at [ݦ& t  o%{rbܝ,m ݼ = f>\w0%-.L;ڰVCqI GɮN h c$ _ک׫"z ? XA [AD+5 U2f yq .$ҬzA:  ۀ'O /z a4%i FL3DX: V B3|PWx7%4 Ps#g#KEZ% x;Y \$'= "(%G0#MFL)9f' \' ~ K&βq"Ac>0 T$U#f^ '2+{"u o9;HՎb;M% ,0Scc) a~+M C/&)B"5o-"(m+"*) g F6d_"^ȓYf )) wBw)wK-0NS6".3PiCU4>5 k y ]1 RuTXo _R3ND,L݂d՘_O/z3X J&ܦ#vyk-Uq j"Y nϬO! $Rۯt(5c'`)'-Q0' (2^bA !=,Fn-0G If"-$ 4),xC#N 8vM?RsSN6K-}?(_ k9w;Pٕ='Wr|40@%,\TMFp V.9% QdJ=4T}=&/f{Z]S 6"޴#b W)6^ j0'>E!ؠ,{Dq:\ :m:TFV" !n ^z %-" h 3 H!j ܩ#cМJa ܼ&+ 3 y tCU v{t zT Q.t |'Vb3%TW;>bfξ" V3G4n `9'mZ Fq ?K hB K` Gqaj@[LW^5,bZM Gn% &j!<[h7Ոfo .%Qj#|/g% L8&9*Z +-.\b'yrf#i;P`2H "d:áeb2$avs 343}@xը7)jHvm\Le y #k <"ilN7 Gu!L#9 j Ԙ E(M3*'C|=9$B$6g *s\NL:{p+w)&\_ !)^8,o(wMA2!aȕ]81r u_ ERw^ܮ6 Q  '}ݪ&TX g~90 9Di ; VaI G55 5ԋ[g$DZa4A K$K*bަT\^o5ު /8+i'9 | EIA  "18K).2, O]>.͘l +5 xVo% G$KI'd!h'.f+v"G!%' .?I =TG/v FtS2&R} #!4%?b9N ycP i$ WS/b) "(itKt5{nD1xV 7n_Q, .('J#)B)hsx݊w0M3$4r\$1. zO)  /.)5 ḆM-t$ Ig A" #O   2[J `FH '5)Eާ KH5d?,d.^Hq~ &.i]2 !} 9%PS\,-,-/-& [6d)<9b $,A Z6 /62Ep Y#-3{ A{'=,4ZM'( $B c.Y) !y'%.]1%_3?v ?# 2[ 6%i& $c,kڵ &K',y ^#)s 5 $ );4Eg թ 5'g q [q" KEӁN"@7&j(/2Wk @;W*;RX ׊#"}Zm7Q,/ _| l Fq gz !mY؇wWt;&e Z(d> , r 4 FӦ[` ?1@v݇ȧ*2 !5Z ߮(& $QekU rHeA2?3/ 'h ?#2>NL t_ :B4 x b4$ #v\ "P`2Lu ޷R ^ =ۤ04#H:Gb7 B;I:Wd_*!FRv{ qVq'mً ^ 1# کȩ#Pf+Ly / %ep*   Egܛ3   I0 Y֠tP WZb A "H a̴%{/0*'*, [G &]! K/hP1@ M!> G%}m@I8S8A pGj&l*%F" i}.y3V r p 9}-,Vvi X (/(_$[) VV̬O%P) GL#8/( Roo\ ?9&@  E XY I;]H! \"A !W8߆ z L ,5I;1Ҍ[M]m ' sC\Kޫ8&ğ{8+ \& z 6` ١ .RmނJZoX {1ZMCO ".t* n HQ! (L?} .s~Dev7 ~  On.h ]  %R_ -^iJի2"b5I)T)[k]_Yh-;."h)a lQ 6/Ui40h - :u V& g +[8   Ԑ6*6x!G~mN* YA n$+7& x<]'10Yh1-%XWq1Bd(' $t6H"Ң |, WptE *FLd s&5yN"$24?v*>!3  %w6(/ %B 4۵ޓ'%Q 2O v8 #n2z/0X i(Wހ_o q' =\xlNJ  .c!+ R%w42+ Aε"{G8d Ed"kh-8~%bDD ? U 2 G]< Y[ (X{Te=rB^ =mz{)߂J B5m5 A0Xm #zz,X. _W:Hn5 5((>R- b S{U$=_)^G(5 "=w4 $9+>?=!W1q'x O. @I$6i yptz ݺԥ@\25= 6; +n 6%Q'0US\ Q@& d!x. *#M #K,"$  x %l"6~G #8 >:U֓$5"xs+ #O5V PK*? -2. JH{ā[Q( _ uXۭsmFT׿ @0.=/ Vۦ" *!\.([2KX^/]u e*,]@(# aT*3%$ IK(N ^|1T2 x $'~9ءyw"n{p'U'ke֧Sz9ܢ5;Q"9Xu;r HҒ 7' 1`&H#GmTTC'RݬCK H \%? &9 \ /{ Z.pj y #nrr !Y6Z fZki-؊-[; t!#߸ӾMO k-!.a>ˤ"u ]'v -!Q #> $!u CP [ XvLd%#)o+@,,n#J' v͆ %)C1o(; \A/G&6dV! 9:Qnטq> g/ T2خ%>L #D V K=$k[,rq[9` lچ ~W'J_| C֗!;%"e/>4 ik'c8~h,65'x +N* ?jR Za8-p9r=+ۿ/4 `# wU\Դ$p.r PAPBX''Y Xx 0r9u{s~/: l: (@޾SV \gK\x!-ر~r,|$'L#5 Hm. > Zr!&uL)q  ".$OX H6M rb8 /t . ~+ܱ 23H! nH6Fq $Y,P :/ i&TDE8te + f6" H$nlTs.!f )b޷S  cM k \ E%"$UH$[yMl؎i(V~$?HjD4eSVo;[z .5<Z 5HH*(!y\B:/!: ݌г ee0hɨڎSe:?-9Mwr U;"!q+ *k u**ʽ mq|K!]eD  & = -"m|9eF0*\%;%n  y)5 jF ]K&+ (9c>[M/ 6 ++ߔ\Zw10j(]b@=m4HG2O% uI3!Svq%e̟|LL) }+~}N [W :.# I8.ZbYN %ߟpG(- 'G.,5HYt!bJP-d8 S z m5Qt9yIO!-3Hs6 tx+B) 1z!*(sB   WQ#tP n"&җ I +`s(3J hL %&"F : Yo[ ] !GSn(B : -o "<'\b@?:R$u!YBm8y6$,1=D' !3?kU ,&si~%  #N$ '! W %X%OV([*h~@xk ǥ$Hyi+=mk&"r@<C q4Й#M<!@J(>om$/*DO& c$ Q--" X% "fE9ƞ%\F%vF0+Z=Џps0@%a2Reѻ("ء!xlk#8tC % ] dH , %mMF GO W[\ %&upڢ e[Nux89$8{Yw1Sdp0#՚ z "lW =38  9]e>T ɚ=#j z vH 3^i @3ͷ N'SX -d)XXm˨ uO `$ @%A d6,\ڡo;$/+2R* ; -H F798%{k%wq)*#&%=o.  2 BO{*kPk } w.*O-H$ݰ5\>#mBUmWݸ&b-{~  FBnlOe u RC<`*%4, C ((Е F5%fܻn Hh7@ܗ&;hem]K j SͻFk:>{#2 #12SE 2ޤ#1,fd]3y* 2 <'f'$XO5q6SM1e T- ew { QF+r@A̾#t3S_&-C)bk GJ/ ivJ3&:kR M N aKb Y/Egg"2 j 4 a} b *<Z'n No} d _ lacO%,!A#  S )=$ mfQ?3sGd#h4q8d Tטt!  kN Yxf0j"n{(%-Ӽ9(sލֲ'٠nh $g3 }s !o 6M 1",*"f5Q "!l Z x r5M {G )|?sUՂ "x؝x] (th/v)$ > kt"f4 ew C\J;_ʔ?\^\"I&_3]v 3cas6#!JF2E^ 6 Znl'm z!TJP $?j"1B(|V'"}&+%߭ @yNJgX2l(V ,@ ]:gaw|vg %߆.qQBGϦH"x ǰ36$5ڦ)3J3Cj0D Fpil<3% " ," izd[ ۂ O$+Q eY La @QCi!h1 E  e =!JQ _"'c0(]O&#(-j'[-#C 6ӊG 6Sh _^'i ? MJ,-g0E V\:`G` _T 58%U"4p5uX*> R G-!i ${ )%34r#9! ZdTw!4$+?\y@|[?ܚ5M lC e"v *w M' N(,V\|߆vx% ,r cSs T~ up  j֧> o2 ߑ**W%;.0&!-,v@|+2D#Sʉ /L 6)h"Y13'37 rB ܾ_A2*t'9 /FkKU!U ^ 3G֌-"K". xE-/t xQ  @o#R8q)+v Y(!ښF>H%`T!F] U .ĞJϠGu D  <]'hBV5 *WA0mD<$ZN ~*TZ  qյ$3nT^ZBuSJ+ +*p.9 WV *Md4Y6GܦeLc:/s#2oB?V @n9# ) h p<,mHwf&2 +ғ* _!_Z $Jz-ZU-f Y( 8  ] &w:֔i!x s m%(;+օj("Om/ZRn w## U-F tV:Zj / 5 , { O *V? w  |(|ܗx_ Hs"fYj_I'7ϭߎ"ed ^O h'B3PgaHV:lIH(L#9'&(V% Òc $Ld#}"&.& e*"9۔t '0 b6' T߳O|B>U C]@w o- Om3 9?Xڔ|*4̓ " &3HCB tM4 B%?C q$%7-a%,+2'[ri0:*; m bҫz 7 YA4.FK~>$TM J! ;?/* ?k<'N}Z1xum3V!:Q~FQs>lc>݈#=\:&M6! xg|Iha)'@-\ ,<5 28Fv:)o+=Ee4 `R $vK9N^Q @g.-`UN!}X K Lp !1;L >[ )a# w Cc_ nN z1;4}"Z.&U)1D- O/ (;ԁ)N: =, Y݁6/a6 "*{|e){!E  ,-I&Љ9 5 F(| } W#'+V.U4&cm 1Tk:m !z?xGK4 +H'8]1 s,qC<-cyb"x0U j_ۗ#ydx$ XB ږkb k:wܰv|*^]5*b?! 3|3 6С'c mvc3%z F<% [c#u:@IS ,xۊ f!i!$LQ!_/pVe Ĭ6 i&X}[V  ! "FF% c 2 +8Be+/ w\( 2~r2'R1Xٶue#:,j ݸ \ 8UA 1+J x#gҔs+. D\0TDw%3<'}r]ʥ) t 7&[OVs"m8n9ٔ@70FLN$B1 }C.]^%d-✽*) fT@*l!݊ 1{G oyu7w4\K = `(E E%׎ pK4)#A:!?vO [F\g!] 6B֩# \L yt$!Ko;(`5'K - 0-R?s@' mߡ,ڱ< Us (c Nm= >;%w m|A"G~`??^pOcM((FGp: `*I)REV)?e_2ٴ0Ewu"+< q72' 1.jNx+ [l)Vؚ?$k:#7 F<~GD %J"Cy  *l_ y{J'c0Q,!  }L@#!0c&& 2 `D#b&<޽ގmrp X ܇"I6 dbci pf9iU.&!sʼa&r8 :1K c 4 P .)Z(+ 03Kym.AS#{  ;x9% ./t * $~29*9Wb27{ lvۑa ` r ycMr H5q!p$qu/kBX ҷ!  $*$(+b"KRxȦQ,W]p n ",!d&.Dn`.0=.8 [ `B  7),KTқ{UW!wDB}h { z gJ{j@ \#1)+¤@2A *,m e/" Y:<9HUqB9z((  {tڦv}df+~ +29-_Z0 Nh*)! ps?Ij!#jD  D"ݙ3Lsvx]M)/>q չ?T5 it#  jt>2E'X'<| ,h,&cb Qر!ٱ'YZ>RHCOB}.@d"Q,ʗ>݉,* `قnT# ; ; 5#S{r _pd %=r &w( TF|X5="88 "ե\>m[mrf-- =,x0 /#!}F'vC2C %4w=܈cي1#[s5n9޴N$A1$8- }&4Td JD׼<\v@u[GfA܆*#7)t!V3JB18 d ?nRb :6e ,)oI {M/(XfU z&L  [2Y.ȱCfh))]1S ""0HE5$H1i ]++ (N> 61&gi .L \_`"0zz#,vK #R/ ! ӵу&15m h#'nǫR "nݙUO+8yuvL.,"6$8k}~I0!4## EՄ۝gq(2!sre$A)ܬ%#pރx,t n!S3 $tv s #B bz* O.} ^2yژ4Bd* |@\^P(|0HYdA!+ %D^ =s#:mMg6d<KE p{5:b&Tc`50QT dH>.376$AKzS uE!Ť(T:)e)%3s~  q 4H$[޺0D ,m+4W.Z2 Dp p{ wV |2A9' rO!>&BM<;iCL CT^rX=5HaJ[$T& >Vi] O 6) l[.&A"DSM} QR"se#uix)4~Z7%ޙۘd<&O׊9 =~ ,w! ;+!^%E7c5z_ _z'-@"c,hc7,Z=M Et?N.q Bu=Ǖ۸ E+ N(ө "4=7@ ӭ!(޹O0j|'X:K'߉JH/Ό8+a=Nss&e Y% 8nYDq f:5M7yXE h<7(z#P Sa 0$ݗz,0 (F$1 )ى] >1:L$I+qu w: @ %.qҟ")0'( Z# .k5R`=d()+D\utx]O$@bѭ @co#ɽ -+ ,6)u "8N\ l 'H/vEghy102 * #&52% {rLX $jיdZ =7N [o*A۫Fm .5  ' OfJS rA0}<l 3W)S1N`*0)~'b] 6)U@n8!  a \Okie6 w/R-oߢ.C v S+hy BLٛ:!A4R  Nޞ+K u ,b!,G3Q 5 t;#   Sޫ+A{L42+/< lO, xk | !/j2 ;d*-[b7ka^Nn^,&lI6 $  bW 3 p7?zknWt Mpya#P2B'C x# 24J;*/v &LW~p0(  5h S H@^$w | S4  8,Nm|audio-0.7.2/test/torchaudio_unittest/assets/CommonVoice/cv-corpus-4-2019-12-10/tt/train.tsv000066400000000000000000000006601376444676100310570ustar00rootroot00000000000000client_id path sentence up_votes down_votes age gender accent 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 common_voice_tt_00000000.wav test. 1 0 thirties female 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 common_voice_tt_00000000.wav test. 1 0 thirties female audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/000077500000000000000000000000001376444676100232445ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/txt/000077500000000000000000000000001376444676100240635ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/txt/p224/000077500000000000000000000000001376444676100245525ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/txt/p224/p224_002.txt000066400000000000000000000000131376444676100263550ustar00rootroot00000000000000VCTK Test. audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/wav48/000077500000000000000000000000001376444676100242155ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/wav48/p224/000077500000000000000000000000001376444676100247045ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/VCTK-Corpus/wav48/p224/p224_002.wav000066400000000000000000000001241376444676100264700ustar00rootroot00000000000000RIFFLWAVEfmt >}data( 1&:  u<audio-0.7.2/test/torchaudio_unittest/assets/io/000077500000000000000000000000001376444676100216335ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/io/96k_0_1ch.opus000066400000000000000000000201031376444676100241220ustar00rootroot00000000000000OggS[^9IOpusHead8OggS[^΀>OpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8[^Q׹#`: D6Xyuwb=.{v=W0YvcC[$qxlQ1CnW?1Z@U"vy2gŏb99*b.G0|t(qht<>%IOIw6?-tr𶋝<10r_ t"ᏳV-`ۧy(LzDn"M=pFl& ó2֢xnh{dQG?ְ s"O"[;å'#$N7gȜ&'U9Eݍi\!u:Y^gfM&77P Ĺ9381ZzOr޲&~OvUZ>Rj,m64 9R~oRq!_)=IT \b2kH0f+[vMQ7(IX86.1BnN%ɞD!Źz>sES Ҹ˶"פ̦3RgVr.bʇvrVIߧ lo2]uCjSWk.7rO{\,T}uHdba~oLqM>WOQJ.8>g:7s Q\0gM2i&Ѻ)}q, x5?R9h4|NѥW.?,jOW~ PvrK ܞĀ+xWSe5ʰTo:+\͎4er-] ?bem@`i 3Lرݏ;9 ZaMfI KOCr7Hjui-zHG&@A[ihNr7gh| :Ķ]l%c1'*GdTrcS(M#M+x(ؚNPJ=и ~ծ,`Zג=Jʀь(nyO;,tHRn/ВX3L )H+:#_pN-{3k Eաp%Ʊ3b(~\t A! FsjYJ+%$Bwf: &qA8xeߕ0yMyXwNP{G`mt("O O _"3sć. :M3˜hI?FYIB w-%bȫ~UIZ܆bwAβE װ'SƱ3bv<󧞖{ ̒8k4B@"{XO|>g@>!هsm,.ܙ>w ݸ)DfN ɷl@GDjZB<̮~,Nȶ|.pW;NP5b̶pmsԧUi+vju %TlZTn2JZr=ɈiX!yr1Q)!Z)GI xnVI1ux&lStf_$(=J0uAE""7Sn ,agl6 X]2|TsqިhD^Snߗ jZ^fWPo*pWNP5b̶pu(xZ䋥Z_;.ѻ3+f{Xu>ZG=K^ynC4:+WK4i9\u:"!hE"#S[禙X sF YtVx${PηUہ(0ܓn6-{%S?8WDZPA*\LJ^xPczAu&Iv_Rb# NEQ N'knMđ ͦ9+@paƒ:g4me1XNQ'bf;(PyO fdWO4B@"{X~#S5L,ހnم,:!n=ިx[z(0ܓn65%S?*A*|LJ^xP򵱅Mu=͐+MX˩¥F9Y* ;ar0mwq!o[.HjMjUH)*}N xS1XK%'bf;(PyO fd ,Q4B@"{X~#S5Plހn`Ln=ިx[׽Uہ(0ܓn65%S?*C*\LJ^xP򵱅Mu=͐+}NX˩¥F9.z4 <8dEm?CTmBxF)zO glbZ;TNQ'bf;(PyO| fdu,Q4B@"{X~#SlnaѢ"|n=ިx[׽Uہ(0ܓn65?*C*|LJ^xP򵱅Mu=͐+}NX˩¥F9.z4 <8dE *CTmBx\F)zO glbZ5K%'bf;(PyO fd p4B@"{X~#S禊lހnaѢ"|n=ިx[׽Uہ(0ܓn65?*C*龹|LJ^A zr@BkW*RC o=ʼ#O*{IuxqHJ+ Y#_?8.Gشe7g}5.?͔? fv{ buia|7ٸzH*{yI/94;k\LJ^ѼH F5a @1i9u!(˔5$+֌ufvdrs#i| $IUՅ;5_5*\`FX g;̻ܷkUtֵQW1UfnL{DއDoeMx \[=c{HOx[wֲ՜m@|۷ZFEtOsN<67[{/_l𡦯WX' e,r8eFLi^$4}t+ɥ,^ !$>k=kQtm qߑ' 9 eIJ&ӭ%@TwMkժ!1olcݸy: <_:#}4*km F${PεKmbݼm>j2,=WcUw?]i0~O7(Z*QJ^؛(f[%n6HTatg \֚SSƇ9FabӅ=v( S.ZW˕ uCsk0ϧay֓MG&A_xCb7=ۭDjs*k46 so#|GHm?D_@${PεKmbݼm>j2,=WcUw?]i0~O7{/_J^؛(f[%n6HTatg O]3kL'Ό^)zJK0~ʰ¿|V ΃޲rl9֓MG&C O_{1ūՙ20\84)4*kmAoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J\K[:|M\$/2f(Q5΀dzdټ 2NQP؈aWˑHClP0`SE(5bVJ(3UM֠*1R6ަXSDފs*k46 so#|GHGD_@${PεKmbݼm>j2,=WcUw?]i0~O7{4._J^؛(f[%n6HTatg \֚SSƇ9FabN1kWR#\(.S/o|y֢ͦ&ӭ%@TwMkժUKk?7=ۡDjs*k46 so#|GHm?D_@${PεKmbݼm>j2,=WcUw?]i0~O7{/_J^؛(f[%n6HTatg O]3kL'Ό^뭧YCׇ~B%L!>KT܎=#;ܬ~tֵQj|-C噷Np}& ̇Cb)4*kmAoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/WJ^؛(f[%n6HTatg O]3kL'Ό^뭧*ׇ~?%Lc犴BoyδbmtֵQW-C噷Npb220cCb)4*kmf|AoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J^؛(f[%n6HTatg O]3kL'Ό^)zJ:څ"F׵9X;m~?%&)H~p$a"ѵ'ZJ5T5g7ՙ{C08 T)4*kmAoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J\K[:|M\$/2f(+<[@%L~t oq}?J-uI]n&qsǣ9-X2`yKJK.cj2,=WcUw?]i0~O7{4._J^؛(f[%n6HTatg O]3kL'Ό^I)|Տ4xi5w7&iv L6vd(%7pc#abm:n֠*1y7bvw9Rz4)*kmf|AoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/WJ^؛(f[%n6HTatg O]3kL'Ό^졝ןU #LJ?pҬf?! U*X yδ~tֻ4UW-C噷N9L~Cb)*kmAoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J^؛(f[%n6HTatg O]3kL'Ό^뭧*xEwV*yю舉]1v zP߽ʼI&&$k]U}|_YN"220cCb)4*kmf|AoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J^؛(f[%n6HTatg O]3kL'Ό^)zJ:څ"z9f{my$\١g#ji9'`=l2CZJoT5gmt홭wZ84)4*kmf|AoF6${PεKmbݼm>j2,=WcUw?]i0~O7{/_J\K[:|M\$/2f(+<[@%L~t oq}?J-uI]n&H|bBCӝ2`yKRim F6x${PεKmbݼm>j2,=WcUw?]i0~O7{4._J^؛(f[%n6HTatg \֚SSƇ9FabӅ=v(-AS.U4_ezLԋig8(yQy֓GtֱxCb6=ۭDjs*k46 so#|GHm?D_@${PεKmbݼm>j2,=WcUw?]i0~O7{/W\ܸN{R…`d"T_ l8Aay`t5_1Wޫ =*D߽nTsa"$lA}-xцQ֘H*NoC:s\:00ѼSǾaudio-0.7.2/test/torchaudio_unittest/assets/io/96k_0_2ch.opus000066400000000000000000000151241376444676100241320ustar00rootroot00000000000000OggSdJD?qOpusHead8OggSdJw?>OpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8dJ4n6#;`Dr=h1Y,٪r -"V' *<.@,4¾e (-e_Yj$w/$"꤀ss{5G R@zO{m@3Q7CpՎ6(Ss@ǂcXL$I;RzC1Lx^#IByϢVcN5"&Tnh6c]5z~|rcS 8>hi =uJpD!ca/:I%-e4qdCOdpQvMV`"ZMـrÏ J _] HGI.E)LΔ  K0sT]PӿP Ĺ9381zJ'Y r$OBR/H_meޝ(~Hs z5Bz+,Bu*5h[=wSDDC=@H@^l*&-DAy0s}fum%^@݉2tqSlؒBog]=3 @sMn1^VBIT>DMN )Em9F[vv:T4 .p%~Pk&TuH'Xtt~Xi!p"Ѳ,mX-G*+C=08۴32I(hwH$i4V̂/"Rdtyv2*+ M'@{nuL"ͥdh Ǟ0ɐ 0Jw< c&~O +RJ-iG|!qftm`P+y$b[\Xɟm5ihn{!3߻a8۴32H|fE"Ϗ%=biIA9t+YD%s+cLFFA@-xp |0 P36|dE2^zA \=PnҵGEjUcn[ wO+Ȁ`k{euב͉ꛍfm>#ݠJEy#O>?\KuΤeVXd\F$?e R *~NQAzk[!MV2R=d*mMQ݆_^-DA6A,O`[B^(W_%Dh\cql+h`'A[d8PD{L%2@XٴtRҀtA3$9jF#C@ˍޔ ߾I+;&RT~Bij%BnfTr#i=\%+[>M8[:j 1 TRHa%u2Z2<{}..\g۞ lf{WpA[Ƀ8_̘pݠJ5D}#O eJfx5;.֘ ^$$3܍,C JpǒL]K_?3M8>u=uM\[5fs~T) ;z%~s0o eS t}:'nX $䖈^R#Ĩ=.5nzIƨ!&l-!_|7Ocvi;9f?E9` & ƚK?W3M8_[%)8/3G3_WDu*hE[T4@աGR uE:b @x^RΌK8?Q(fA3$ܓjA1*#P1? h[mdEmd _| qOcvi;9f:[ CMK IW3M-)!%-/H?(D8 E,ܘOHDRu7*?-սFQb)nxf^)59|7Z8`M>ڍ'QjP@"H&%Dj gAV#XNUE_|!Ocv9Բ-tEMիPɐ_hDM-)!%-/H?ˑJ~hkg GRíڃDkm\D%"l|^\Xb('aQ_:U=` $>jP@"H&%Dj gAV#XNUE'!Ocv9Բ-tEMիPɐ_WDM-=?m;o枝zHGP' [dBe Lj%'kROjAU$-$7>~Tb~`рn`%A4B@"H&%DlAiV#XNUV~ Ocv9Բ-tEMMPɐ_k PDM-kFS~KNZCG3hPjtE! /4 _ ڥw@ %|:\2y y-"sOOROٝ4 ]BFZFN_BIGM”|ŚCE~zZ&{Բ?tEMիPҶKd(UM-:3SUˮ'3ݍb sqȜ³ UC{Ѡ7ޯ(oA:(^iǬfّ¾T曕+ b 3 nb}tT8 z#Q nokX=[EA}p_lڅP:YiQMq->9|Q/U;whA.kEEOYj\ mD3{ewG3#L]IЭQjt###?jwMtT8 z#Q nx<,ְ8!my7zSSdeh>PM-:adBdx#g)vR0ii%׷vezЎR[dAQf=NLp6dqMLWd`tAb}tT8 z#Q nokXX1/A}p_M-:adBdx#g)vR0ii%׷vezЎR!kdA{m9k;6dqygMELWd`tAb}tT8 z#Q noXX1/A}p_M-7(<)L8ذC?Oͨc-o(CLzkNAJ4L}ɚ_YkFܰ״GfG6cݠRGwЭ3 +ѺFFF ~ Lp.Gݸ+9<7ְ8!պ7zSQ/VpM-:adBdx#g)vR0 4)Ch wxc [P$dwby!zUL򿤛 M&ѐ]wMtT8 z#Q noXX1/Bp_M-jɡleH.!נ. jrRhI"VW38VႲP qRy BӾ̎n$ǻ?pT WA^B20: ڡ]q+tT8 z#Q noX~X1/A~_M-k0rBG-U<06`dcիU1tszT+4eZҎhz G|ߏjN~AW5.潠du*M@&ѐ]u2jwѦtT8 z#Q noX~X1/Vp_M-1$\OK C.9jtTlfiIU#RUDex9"5;1n/Yu?D(O*dw)+SOq+q_bz7]@]q:*d騆7n4u|hAՅ/bzO,(ceENEvP9;OɢJ9w52i<bhW@guTzp.Gݸ+9<7ְ8!mU7zSQ/Vp_M-jɡleH.!נ. jrRhI"VW38VႲP)-C$X?9 H( W(A^B20: ڡ]q+tT8 z#Q noX~X1/A~_M-1$\OK C.9jtTlfiIU#RUDex9"5;1ntnq5V}ۅedsL{ bq+q_bz7]u2@]q:*d騆7n C@OpusHead8OggSn>4$>OpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8n>FQRSRRQPPOOMLH?{'(}U2XQH=ǓT=ܠN9GtkhFegZ{Cyo2[i{[T t]W98SSkWEw3 Xa!= SCeEGV@ IrXG.@)h;DoM/DB"w¯.6m^тdUhl78;ARSht$8 DlMOu 9^Mx(:TZjTlbiop6% Y9 V)BϠK0 MHHm `>))BɏscWհk;YPKy< K)&Tt[tgTWƛoύj\UrF̍^xࠒB\! O޺\lNQQ0R%,*:by_|ƞt}'qC=u "ZIq6~@nv4h#lYQ)#0 j]бy2!p98I6yŻcZ\4$9Cx3=N+w* .eHnKj3&BӴ;AcSI+Vc<_iZq!Sx`5Y7$3`˫W4t-pYS^n@B&T>K:ӯ-k~H07aӪmͥ/0`}jOi5w>p؊iyf$yٚx>2[МzPNښ=ұk3(U )\ iIUU~٪nPsb( 3Z;5W :zf`m>wru:Ҝ>INS$\HPt[XAN. vе3Xd`cBG*5K E`W6_1b^x'jtjݭl+٭2ɊNu-5^ǘ^G+W`b\ph$Ѣވ[רNT1ߝ՟\չrjްt} _߇'n. 4LS&O1K TEhxf XXۨdIYҩ, x5G>;fkn6J>9 N?/6@Yd7t^ؿ9aWQq42T}{6G߶uKg^'z,}|K=u3+bӞo 7ehXN-.PC 1iVEAs0, Bt>+2p MVCė" Y l8preo"Xho<P+z 5:>ѵ :92[ߵ-.1c֙s-=B^gLM`$հ\ؖkMy񷭵OZ՘K"nQi.hI%*QWih$l ϐ8Ivmh >SZL{cO]⦅~ƛBۊ$bY vw/z^, y ;bY8 50f% oRxـuGI@k: 3t]fau C|6xN_ѷ>Y#{ԳV~"|^eNtsK/ဥnUIN7XLyXIBas~>\@$EWNscޏ=5kq=w*:=Oy6?u`?ƉC, yL}NA tCΟ6h/18Ɍ#\`V)KGa Ghc!@_z9JǑ{rϧeQ8wZO`$F7k {z!YW5fGAIhHfBvßu4՗22z42~aye[DYǧ\% 3--%4{чMGOv˻Ѩӌ lV W:)-% IWy<`dD,KHg2<hК:]ȱ s\lsh6:,N_Q/zUkz|96(^D';`=PX/e懿ȟ]DLh6>:L <}ZnX灬2Bʓsf.D`Y0ee\~nU ƦY Lsx,:61/Oߢ8dYA+졅_߱27a}6/;AYB7ZI|)[J5xyV㪉Y^wRt;9xi)J6B4Ԅ$[*[BNy'S.l;F8tD Bhtg"!bT.3Qf'(>O,>סq)JsIF B7nQt6j4.0YXGуَK.-63Ӗ=}^~`Y0ee\~nXU\0oλt6U#2KV[PM.Qϔ0$@,@Ggk.E⻷@J&``H\ta n<+I؆3A:lÑhO) >4y.)> εwDGVXrLg2"<К:]ȱ&2U~\fN.Q|YG 3 JBstgx0: nn6h>S0YXGуT82dI߿]ϯMǬԩ(^'"}P{6HR0MyHbw1،y!a@CWBаfUqrG#%̔cz8W.|RiQ5 p,LϤ'l,q#̒H-'S._F8HD dBhtg" 0 _˔{' T,pOPM +qsp o9qdMNh1W!]s]=zX l,CǑg`ϝka|>Ǭԩ(^'"}P 6HR0MyH؈Ay!a@CWBNĸmqdONJ{Y^}Zj|"sx+c;Pxxj  ~~ٸPM+&j6~>GVXr hd#a:"x`r 4t3bLBͦ'_(\<:aAd4veU9^vEph%y@qdMNh1W!]s+]=zX 3,;Cϱaa`ϝka|>Ǭԩ(^Ss~:?mfE\r>;23*u~[Xnr}XXӞU 7Ofvओod$ހ|xB ۇ~I_"hL_m.H2 9r@>93N:BĻ{C! B!!43] ќc,R5rmD- >FNw/T/';/|jˏAKt4 yX[f4Naa!usGǬԩ(^dQH9oe\!uZ ۲+ .['k{~@zAxD1~nP7t-2PU:UMvu08CY}PG+s<.#.ײ&Aɟ,\%.vhd#aD$ GK9!XE$ˌª=ϓ >ƆO1#/T/';/{w" ihqdNh1ðC8 ,Tʭ9o|8zg`ϝka|>Ǭԩ(Y Wp@!TGP-]LLhREUWc| i-7yiG$D_ q6O<9R59]?D(('O7g}!,]t0)p^ տ 瓩GVXr=p!w!M.XSb8A@p'Yh'nߎ:aNvr ?__?ҵ{EHx%y@į"X)4Qf*N3/HˋuƗ*:|H15%|RQynt ]3 f`PQv}t(񃂡~qRlJ_gOEͰ??Tqb^2[8k< ͨ^Q ml){gI? Xjo*فTF{i&t&L|(PT'&e.~G3r.JX%ynCu}s)Ȫ .9mI's`2dɒ/zU55,.iHyp!RSmIi fI sjVS!*oABGSGaf䠦>,*; !xN̺0dn*blC`Z@pLK:Htiʢ }}_FQϾ JIi-t0EE:^a}I%-P6X6wiO["=(Zx.z'qՄ ZJ^ v^:6e(&2kS&q2k$̷ 405"X>O鵭6 ec_~8K@d!@uVBw[9KdJZAo1&9 =&Lki3ӅTW_V©dlNXw*tuEm.Bdu^V>  1 ,}<+;<<%o/8m&&:@F??-@^e4+l<;Fs'^g1Ezakezs8$aN, MઉfP`E\~zO8tGn2q7ByNNDO.’Ð-#nDńs;#ړLhLx_GTn]p`4~yԉAڮS ] 2'&Pglzc9p+~ֵ- Aij&}L$mMMˎ@R?[рpI0;XZ7  ^rea],c 8 2xد\`08 JH͂~#(;?%u ᦎJy,X]?OEI`2zVHе: ({YO(re@{UO\WYVz *){*AW#<_ j\3c1)</\1')[TK7D{oU5lޮGL&rNEm.Y0% cx+6[HfJKI0#I<`,56wT^]k.#(ZY[ԀE~Cw1G0 չW mP1@Mf ,7x@{+@%X h OPF !K<{\,'dMLOt{?%y ᦎJy,X]?OEI`2zVHе: ({YO(re@{[A&orZ$=1;.E, ]IhP*hIQx%tɚK_D_B4CLdBo"z&q1jZhh \J.dj~m.1D9ۚ8!RkDܜX-l=B<%\6hǨZH>cR fH^.X N;(uX6XF2sxNrHD)~b!QI HtX0L@Uk@P ` 33368, YNКK % ᦎJy,X]?OEI`2zVHе: ({YO(F+JM4/Sx[g@]g4X@DH: O9R(Y{OV8W@yr;F@y1_sR3݄ӣ}%{h(]=\ P>~cJ:zD֯s@4u%]ν{IAir4X[qDPvN+wED*w#on/I4z8t@fff`ŁW ; S- % ᦎJy,X]?OEI`2zVHе: ({YO(re@~='Ml0D8wY)gQOh7 x^փ3BBOy* |BP]~m ۓ]D oTe/hû`ǡC'57MkЎA +t2L:P3-̄sMSVR9 Ы+4${gµ Aiq[N+WϥyC/g*Y0_=*ɇC2ڕyl !P!&r<N>bt(JyŶ3z@ cȿBE(xViM&]r㫺y=|^Nij="f[N U;ǒ?AYob`?LIVBIIFu_, Z^j SPk=\,'hQTOt%u ᦎJy,X]?OEI`2zVHе: Z011#& rep9wrčokyAGdSؘċnߒ(8.ץ&<IHj ci6gU(l75}-ֺEy NPs%yOLJ19,Ä- %wM9dw  &=a95EFBߘL_UE¥b}]B"<1Ʋ P^3\3sq ,@ae%̶^zP2s'0H{ )!~F4k.lk]O:yY%?Zt,R3 Z02wX\ znkYíwsYN%IQpkW^O^9 ËN:^O~e[66cϫ-hR?SiA\8q^=}+Y*<Ӂ| D|1䴫LfU~|Џ1)̆~@ GmٝoRc{>3V8T9` @<0Nِv={\,'hQTOt%u ᦎJy,X]?OEI`2zVHе: ({YO(*$;E {e?P̓Ml /iʤَsl PD=^8c0c0l fCmѯ,GuYPC8~C[+yv_Tȯ%#Biz$IacJS0{\xfe}=d5e p`  TtV\{D|'t˟k1 L'XI'.ʯoTUbM5a|_K}pLjJF$^0ĿӶ*Ffgo t>S J 2 a6P.D b %^z{_S~:~4ya۹%I7RrcYrpzǀ @c`V`Puff`ŁW ; Uu ᦎJy,X]?OEI`2zVHе: ({YO(*$ / [ѡ5J#ޒpP*31[&f Torb A #A&h>Dِ0[7 )\nCXiq ?Cqr5Q13?$nWO`MbXd7l"I<6,[6B1F9G Ag֨4͸ /¬P+N+ϥz%Clʯrϖ};KUyc2_b/ <2Nay ԤjХiUd;.@ ,Xb @ 8 ` i\{\,'hQTOt%u ᦎJy,X]?OEI`2zVHе@X",,jh6Jd>BI2ԐGv+:*h#Ͱܭb ĀqMT9B310TfuXR']+1ZALx$:l58z N y_k$!#BUh Gp'si`"P4-meQm3k(kZN+WϥzpCҹ /`oπ+0={\,'hMTOt{%u ᦎJy,X]?OEI`2zVHе: ({YO(F+H4SoZL\v>*s<°05xQ8KnhOء=]~=O53;$` mۤQ@´ӥVI%DᏚeB 6:36P@h|LLeͳi4fa  RktFWo$Rj5q|L𮮛-϶P囄$b#i^zx̶p%RgrWAeQwt3+'X `"À <@@9=\,'hQTOt%:RV`'׷~y=&Y%,蜎H[/s&$N"*BwACZQEaV9=bo m1+aI&۵ɊOpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8k[Fj]`]]ZXLJIHE?2{da%Ḍ2X$bbFd"nkWT] p2U[ɝEZűs YPHsQ qS7m3jmAdQ<_ J0[`^HІ$)yT-~DfgKGeڄeƺ}Taxfe[`-m5}.ǘ0Ƈk5_ 'Q ^kiAM!>SCeEGVi)% a2h)QJҦ'"c>oCpY36mml*?ߴo|*ڜ ʉcŌXŊAtZ>7z nDRЋ! i6xĐ4xQ@Qdz ~_EEh캡3yYfsdͿ#%`;bmhv$݇V6U aAJRIS'(xbȩ9$qgr*&#5x4A.7I9{X@H 5LԈhs6ge*h1:[)-]qTXz(> ,bl%J,U=6;wM3в,y5Z$7u!#qh]`>6wEl1#M_"9*%.xS\]QYeԅIΏi+WX0=Fdh io -VQY1;Y<1݈yb5sMH1 ZhF}Eb?-Wc8ot @4@4@41^? #5pI%ΎϰSɦ 9 ScR^.$$D^TT sS3נK 6*Qdgu'#$#*0V7eot|VKZM*4qiE|J!",y =:rHU;2t4VA /B+F,mQsՏO#2\Xf\Z?DXr[sTA]c~^9oՊ;T\ K4 ]N}|] !u}XkrԄ٠;!R\f"(wU3("10b#9e/MgKeZ0|4BHYz^;kr8wy~i&B$5kpQ- L虆3Joz(+M`~1gF6_tsaƐzd߄k1f.`|pqFѨ\șvS`k.~"FOk,'gR󚚉mV&FuvQRN, ׾=70&,‹& 6EŽ'%-<1 ʴꁄ,ׯzk|r8I"U3e`1@ 05z*D4h/SI\HPݻy!MKu=8i׽݃,QC J(X5~ 2yg24J W=xDCm-v;fݙ-#{"D޵Eb{U+ehZvXb :5sSc\b@Uej%\HROK~5yߑ9#MD09wJeFۦ;6J_]2Fq=umǙMgߞɼ+$\Am&}E(d6Y%cbSSQ|0AY)EǶfNUΉjͪkLII۱ٳ5ԉvWtaVCѠI uӐm冸]4_[Aٲ?:m)@nG*ڗ.ݶ \sٮКO}]__ym~smC j>=TzKO Rݮv_ZfMy?iokseoAl 1.(mzәNU2>@!\+$͜s}n]bUPs%TU%d;qns'0n.xb<5%Յj}@_r_^p2*L?O"3R䊔|OђE-MYrOw:`sG_%>@YWfq{`/fv:wnDEsR֥']V[˜uZ۔Ͳ[{-_2b:ѽo㥈آqar=$a_C# ``ES1($3Պ}Uʃ;7*V ?*4bx*taI2լ'cNͤ@|33&y"v>54[{C#ASnS~^)Kp"dd ,VhukGDzO4db۲)(9ԗ)D%p*$ {l+q։1Ϧzܭ]M%W:-A6$XH<'"ZZ^ <<2H4|VR")EX*~F8t)К:]ȱ:t!B+luk*Yv)p ݺ*k9pʂJsI$gn<10!.,Tns=g˛7gkv&x%;B`:3zt ЃwCVp,^@E1'M9¢ឯ0iήw{vȧh.LltνJ"1j4RklS @|wS8jc,UYzwlApJDC"Rdz9L!KjM `!Cq&j gvttS%Si{I}D\᯲ W1/`ҟB'Ʒ"fpa+Cc=(ęj13arh~NJl) 䖟HGJg^N@sײZbxҏK*uh׆I'vc 9oˌ%%]@R>w~%joD_׿u6nOjMɣw~k~6wim@l ) ` E_i,aLt$퓶NܝMFocdFcOC>(~J򼔨`[((Zꈱ9Č]t{QyK B(*|& mF16HI ؀:^YDf"쫂D`42#-KhL:8!Jb>Vprd pElH%@79|'XiXW_+J|!Gtӧy<0@}P:᳆5 ׺ 70Mwzk~66g[#m@~ 10 E_i,aLt$퓶N܎Ê95K~vi_N3k-L/ey!{g%.i!Ƌ;:58U8hHjh5ՙ̿,I]~/jf/'g[E|{Jz0!_ppf:MDD5"q(E2˦؇ѹcK[p{#uY༘\qvnQ=ī G{JM>Ï /} F`Zڸ&vV)ʺ@v$xp(Y'}svR:fr !ҳFKnɧh*qAQWnBH52$B!g'G{;ZdzoXl2Gu%UICx 'ᖿ*2^/oyC{⫆5L/E:gSb)~7b;&6Ox7:Q` E_i,aLt$퓶NܝMFocdF&pV!4Uٵ-ZQet,D~}k/,k@{d øwPsͧ._5N TP(:/E]~ )4Q{d5X?˔K*XzvfmtZ>hU3c,W#=:Dl8ꐏqL(76(I/\Q +Es/eEhl"ّ`Vl\ l`?$Q`0wT~-s 3>&Ѥj>#OxP>ALR7`-2&*5ݹ AfMҾF؊pÿHӉY=/2Ѐ?t6seih n%,UY%b}9օ)y0jKf'r3@Xu7HTA)੐%zu(|Ċ"7ol'v/ݎv%`cD\<|*ujP޹@L[SÚ硣}juʦ۔ĵd!4ÒP㨪&(16kb>k6kb>kb?#a7Z uÅ\8]pEgOܟ7>orvEҍO"g'I+-EAdt #;oy{Ǽ{Ǽ{Ǽ{Ǽyí/5:6cEP*mN^0%ӿt Hح*$p$"Ehwٻ(W{խLbr{660N9XjdG_ѻ:T5dToxr.=۸(xNdj`9[gTj?@n&IHbd>.UQ'+ `ͯğӠ?? 9~“Xu˧>~RGr1/wk6`*VAc8S:Er J eNo,!Z 334U"UU}t v9*ptlll+7KN~@k8,xF4%%Ft$DNd#B Y_n|Fȩ:OB_w#?=(;=ou%^P8&%OȺ9|ܸicVnQIR-䊷Bn8S!SJ6WcР?6o#Zw&}aOP~бR~mlUHZQKg pW+dv$av`;E7;H @a 8/ 37\-@ba"-aCR:a׶AW|g+su{ST7]iRp_͉ T_^dF2njC k%T/2jM ^? Z07],m"/ҴtEU/}vv9*ptlll+7KN~@k8,xF4%%Ft$F+P)kf$tƖ*]5{`Rm~@=y%(+iöDtk/ е +e+MhNH^حn|+PA}YñBgVu@>sbj홝_ yx[ x^/,ݸĒt+tZL" 8{u!!W(H@/], X1 U Q ܾ fffo ZͺEk *EFIfvv9*ptlll+7KN~@k8,xF4%%Ft$D2kXՖ,eɠ,E;WN7Sryio k@Fư|͙\P=?Uiwzxs{w!VZg3jE@?N0 EciK1ܯXz*v=%uKb@ =?Ko`+Y~=KWпqiX ",v>|F@$l<@mM΀Lfffo ZͺEk"NIdveP<ӒߍKO[~Ƥ8Mks̬ BU}Rw@h QPfffoZͺEk *EFI`t v9*ptlll+7KN~@k8,xF4%%Ft$DNc՟]O&Kҁ]t3os6{uٺt,1&<,x^T=܈ܺ+<g:*]n(s/I1pfּ2,:_33 0E܀ &ЂꀑjC/ak'#7hQB7*X`qσ\L(-?yX ANmPtUU/}t v9*ptlll+7KN~@k8,xF4%%Ft$ZkG^ua8?YߏfH@ D''g0xsz6Px$j"Nh,3 "^-f]fW9isg%t)}x2`1_ù\nW#_A328ȳ" L jAC&2@Y@ (H?% c mPtEU/}veP<ӒߍK8 q!\%#+f&}kzŽ5-_<4⅁)Vz kk5p|Q` ffoZͺEk *ENI`t v9*ptlll+7KN~@k8,xF4%%Ft$DNd#?J:cVҚ-38nŔ؉=3Fg9;qUxtRm7ͭ LLXOV,5_zLr!g ~))-@gY  S[,ݸiҰ{A譠f8{><DBNph@] ,0w 1| p  -pmPtUU/}t v9*ptlll+7KN~@k8,xF4%%Ft$K}˻>0 OQ$Q:^OO7Aa '|=x0Yf­@VD<,q[Fl)*@:m+W(405b^}Iΰ7ݧ&k%zDZD3KٜU~0+SYEޯ]%1wl {XY a/p IMX `/;wɠ9o`HMƠ08\ljmPtEU/}veP<ӒߍK@b1WtcQǓݎqLjLmP%|oE H6VB=.Ŗ)5vlf6@H]yޞ#z'R變gmS$2Rw9(_yœ,O_( AF2zrA,j q' z8^t`13 `Gm/ҴtU/}t v9*ptlll+7KN~@k8,xF4%%Ft$F+H43{0JE0MxMRģ;fn09 *#R=YH򈙑W`wdG HF:䀰ڨ?;ߙ .<>`!d1|xbSCyR ~L;ĖT}~Eo|I %vܫ8,g`$1P!@P4@. mPtUU/};\iC.C`%WNgBIhE$>?nhT" KAZ !j$jvN9iI]Bϛ,Tg:,~9؄0#B7xs}\ԋX[$p` M Km':8XfbX8W)gˎrw#աl:c2!: 7(\'\'W]stDHwˍGHG2dn`;5dK&ݿ ;5Z-JIɰ7%Km-"@0audio-0.7.2/test/torchaudio_unittest/assets/io/96k_5_1ch.opus000066400000000000000000000314221376444676100241350ustar00rootroot00000000000000OggS_1OpusHead8OggS_R>OpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8_P981{'(}U<JHl=GyBE\y=Rs4SłvagW!p9tk~as==I8:4ٺ:i?y4ٌsK Do%e[7ar3/95/l"?*AƎ9_DHk4;؁>zbmm162 ?>~X46TQ=$qUo M,5r#y |J%I1KBĀZ*8Q9J-%|1@AL!Nrg:o1d\ҝҤvv̸k6<֜4j;_Z'H?ʘoљkVDs͉Q>t vwG{w}}qUʱy/ &*s( $y؍Os'6fcn\pHq2&? 0!=]r fӡ @vj`>Ӊ}@PcEl1#8pxsDQ K)&T$A[r-?HF=kZ_"*G"`aZR;ΐbEe# !ZRc%,d;o(b|m+|pSL`Xb6~@~YA(A!E>Or˻^s(ݠg=XN]ݍiCݞ_+JQqCsgi^alH<%~nf'}pN]JF@tuPӨƫ[&׽Q SWU3("15K mlċ:_( Ŋi\j("/s|; P `W @V ^"6G8T BA!`{&;F0)K-`0 1iE"uTC҈?>S~ޟJN9m*rQcsVS֌ Ee`FR NPuʙҚ!Dj 4{iO])@o DɊNu-5Z$,OAayj$$q~ϕfdH60B9K~w6Sz1&{&ldNF:L%aj- hh[՘w!>otK%'bfŏٚ7f_$ӐeY FE$ٝ^w7 ;=cLTeadwON۹,|.mKBD^ [31۔-JNZ,4> b-.PC " |Ooa _J)9LPGԁ-@s1!v &|tye6;Y/%Uˌ^Ѥcr͉`fןEey-GrOw:`sG_4{gb gWC!!Up}[.RE,F55|Eig#\BKb.dHWg/Ib.uոmY6WD--v#R6o) jgu Ayz86f Otm`x U/"ƫ(\hkI}< Yɳº$R#GҞ鵏ĻGQ+Oh)_0r̂ȥ6@vĞsM 3&;ț({a>ncnгKh_vH鐼nGF2 `$F7k {$\TVG%#P$VXbZ5n2 &8La+3 h'SP=F['? ¸?X( R60tg",sh6:,TY7v46`!dUl- “or 6Py r fL' 2HoP.XY0ee\~nU JCcINڀ~,t5΁_~PWܜH_"XH RHˊƻ+q':^q|9 P)tzps%L /$uբ%ܤl3@$Bhtg"'FmᯔO\cMC|RDžSOVܺlC2Ȫ|*7&r)8NJ,pOwX=P'!_adDCD[se8+`Y0ee\~nXPY*5(LY^zDP2Ɐ:Π1ٚ|t6bQT3s%M4>G(^ m s/$uբ%ܤl3Bhtg" .3Ya9P9if@k6` 7J{ɹ4v:1"0CwX=PYdc_af"YtsYX+ϯM\&ϝka|>ǬYqII_^m(;ۀ{ǚ,.t"₃7V3'v eLشM^JƟcl֦gN٭qw@GVXr"] ќ_q_(ȥ )v`T0\xfÆ *;zM {Z{!݉c P|KX"Yts؆\&`ϝka|>ǬYqII_^m(;ۀ{ǚ,.t,=؛5g٫+Dkt /w]dι6X6Ksx4m SbF)DI٤~>GVXr] ќߗ0Q9s-5 KWDh6`!dUp0̏ 8:< ȧq{Z{!݉c P|KkuX"Ytsڏ\&ϝka|>ǬYq*Fɦ*[4q-leJz)m]lOTB !4<[N1x?F6 ~^0ruW\"stޏ^K%"c~'S.#aD$ GK9!o.3ZzQ=s-5 KWD6`!dUp0̏ UujxO A<}P\5la 1뎱 Dg,s\&ϝka|>ǬYlGL#`||F:-2l[9!m={xA%)c+TĩpXa,"DNڞ 1FJ`,s%.#aD$ GK9!䰿.3ON~Q9s-5 K[`T0̲* 8:< ȧq{Z{ gc P|KXDg,s\(ϝka|>ǬYlGL#`||F:-nGᜓZީwi/i)YNks>؅1&Np1`N*% 쫳)Z-͸sy~q? 瓩GVXr"] ќ\ `E_(ȥ m06`!dUp0̏ 8:< ȧqgu==c P|KXDg,s\F1`eȺR3؟]~3BF2)՟y]gݔIyjCp$>N V ^'0'J4gSj݋ggAY !>PM]b 6׫I5gIIE. ="LBh Qd+8:< Ȧ~_H}P\5la 1뎱 Dg,mY}!{b0'X>+SuSOg,X X(RǵZXyzbc5N?a z4{\"24zToMki%9)2e**:SwlӶC1 G6fSxn32٨:(tl<9 9IS+$?R~#׮TR\'b\4&gz{ Tmca`-ϰVi)x-ڊ=xٖPvDڋ6MEJo¥7QaWast- Aȫ7)7)#ߓla1 k(݆?"1P4iEj4*݉c^Obs.e̼Iv!?Sgԟ:M'>*2/LښZ 6k:'xj"ӂdu^VsRE!%%<"/,%f"9n;;$[%|p bם@ lv! iꌖtAqkkQ8GIHɎD OW o0 l\H.lnO +V-mz¼/C l"-d;QSI]1a*-:2W}3Ny _.~*t@X@  , TLor y,T}~vfffyK Poul(ن(* +!("9n;;$[%|p bם@ lЀƱ4X46fuS{%uf׭B,1@ j'ޠ.++d2`-؁ar~a =4 +o02Z3guKUyZ6"1 ;5HD]=s:dynS[!v {`>KA.lS>ϱ)tn)^e VK``.h4e4>@@]/ŁW 6K Qoyl(ن(* +!("9n;;$[%|p bם@ l˄7RCfo%YPq{،Y @Ԅ'Llc-`2i{Y N]Ƞ|ZNin+K+ksN^!i#f|Y'ܗ L}vMA[͜ɥUn)iP rs$;Ưqcĵp٢^R'i#\EKt6N8I `;xUz`'M:^ !R`tbyJ:@!; ˴J!P F)YTuPH$:~{xg,X& *I܁kbYM<3336N=lK %l(ن(* +!("9n;;$[%|p bם@ϲxX@S<я%6ంwnҡqSgCI.@YMV\g `UdJ0$Kޔf{s#_k?^u?:/Ez4˲xA,PP,=WwSc:S WpOU&!al8Y1C8ގއcÊٿL'䛍XIs%cb4ٟ$m >eQO(#RÛTU%NH ?6=*eĞBPZ\e1œ^zPKʷdL#Ja̶^z2xwI%nĉ{(qnqG33ޤ,X"@(>_ .O ͗b%ul(ن(* +!("9n;;$[%|p bם@ l~?h\@Wh/ߵM/" V\#4A掩~K}\ xU/A3`\!|LN#m; C^k>ü>}ƚY|x6GUq=O0QoHtyhH_b_ ) nSuw^>{OpK@\-ULi*!?tZ"%ʳe~Z$ߤ .XX mTBEc@@]7`ŁW 6K Qoul(ن(* +!("9n;;$[%|p b|cl+fV08ϸ33Ig[#X^p~b^u~n4"ҏJTRU?A#L~W&qgTBx}ѝK`dO"l_v&U9np\kkt<*(;BFl!U&/*"aRƱ >VA h rYyzDKN g8 0ǒү=(f[` U]$ǒc)#tT +Y=bCwp1X3(TBEc@@]7 ŁW 6[ Qo %l(ن(* +!("9n;;$[%|p bם@ϲ~?2Bi?C :1{4ӌwfaUX͆# 4Ufٗ)2'隤r'gԲ4Sau 5.XL2% 8"(kD<_Q+4oþ3544k ȉ+Ȟ33U. Vv'CdEc[-6*6eg :L!KJF6e_w83U B}3/y~XhKH%*OX0$T]_ .O ͛b%ul(ن(* +!("9n;;$[%|p bם@ l~?Ukl>IEu%+4ȍ7ڏP j+udU t$6%QO~^z;ViwV~0ӏTy&_S J 2 a6P쐔 .Db %^z{_S~:~4ya۹%I7R p_VUTnf8yg@qk `B2^ y( ȮG1ͫb%ul(ن(* +!("9n;;$[%|p bם@ lvN;4m{fv_4&e2lUM\806AXVB-KQ h#T{ХbŴ0(͔xq1Rj=!SA5]w!J4aNg Ag֨4͸ /¬P+N+ϥz%Clʯrϖ};KUyc2_b/ <2Nay,΂hxgŕY)į >R"Z%K @`iPHK@@GIOŁW 6K Qoul(ن(* +!("9n;;$[%|p bם@ lxXݩrL51~26٨X|t={5N l̶ VӼ4+Of6ɭ?#8P?Y:[w;|ŐHD$ɩՊ~~?aF5 8lMi`"P6eQ-mm3k(kZN+WϥzpC-f SYX /`obάgmg RN#$bx/XY?^ŁW 6[ Qoul(ن(* +!("9n;;$[%|p bם@ lЀƱBҳu6BqcLVXDB{Ռ 0,|5E< ^">9ˎ'."2QFњBo⽙x>՟%q1.BXѕ:G C@`ZQuHH2yOJn٫'*CDJ -!P^$2<b#P{^zg_S|$x %LR(JEub <%K dTO, @]7^ŁW 6K Qoul(ن(* +!("9n;;$[%|p bם@ lxXٌo#!=`G")zy)?%U0ى/mE86g]]96<y-Eӂ[:,Q K:Z.+X}ny(SwpC.>4ojNi3DKM\?qK5!3ºl*+N+ϫ>C@OpusTags Lavf58.29.100encoder=Lavc58.54.100 libopusOggS8IgW?L8{vnmmmmmmmmmmmmmmmg{da%=4ȋ:S|!T8XȢ39\OpveP?\Wm%(ZP~<uO;WdwWh1]\ @$u~i"ߐ.PnY$VSkG"nEp+ 1RL񺼑l1K}T`0 ^kiAM!)#xi冰rLCF(T3Ѵ5-sٮ 36mml*?ߴo|*ڜ ZWC/%K,:A`KP<;Υ6Dno>LPٰqTTSC5ȸ]d_WfA?]&/ '{ [ɢ")m;lX*ӭA rs]̓%H~ǠESϲ&z 5Z$7u!#qh{~%|=$k*,G65x[ @ƼNjl3Y!uRw9N;z,Bܐ-S0YB(H4JH$\89D&v{#̑tL"T6m6?8af6LZk_b?-Wc8j0=S7t X3SuL4 xQ2=\.Q?+\ȅՋgh?d#ot~%}ރ4u٘*Nx{m& 8!-<Fj;pmlċ:_(Ypn^i\11 ,m _<iOfKxjKҮX}U_G9;p֘ A7`+L̀{^@3`~1gF6_tsdBEJՖW v:KS2ϝǯ;͊_Dϗ]c4w>F@(|2j8dN̮;d 3UA:kkڨbDE6|UCs'u)FO+}4EPIxb*&tpfרD_;Uvi7H@W {U3Gf1H ?;5+7?343^&h,BiiSɘ o4f ?]u?yz$R9Tz=>6(8۴/S] I)6mΓFAНydpE^*vKf59yFLJy aJLC j>=TzKOޢ:Ӊ~|Ӭ7qpC#YƩ &5*ooJ k:[(r^ܬJw e\1bVf_ ,SrprDϱgj>Jx*Ms<#a1@}wt{% -(~Tb:ѽo㥈آqar=$a[O.kh^%Xɇ<8J\r23aŇ挮vr3R$ tMUA9xE?rl>{m4VK+-pQc%VQGD~"E_h3J[P h]f ֆ}4!?@@ E,Sg>&y"D_ )C'{źx դ\d_+扇_id rňY8%kL_݈4qi"3$X{k*Yv)τ$m\ꋹJxFUp(2Gb,R֞L6Hۑdݤ;:3zt ЃwCVp,x GN\ʛɶI-Uٸp$POMlPe?/9v-k/h 蔟U3$XQˌY.|<'3$3թ Ȼq䔽zc7_OaLQƻ'wRdh &&.9p淚Ah ]?&PqY3T#ѡ^{$PE%wn4tFȅZ4j4ctЪ&&rNEu_(.M~ȼx1 T]23@Awn}y4*X7y}'a&UQƻ'kRi-%K`s.d\(:VO-O^}Pl;Czu \Q(tP~WKnVf!w}{Pm ,t侔)d bg$XQˌʒY/q}ǃ]uoXH26yy4*X7y}'a&mG+Ļ'kR{%#ڡ-P* E_i,aLt$퓶N܎BBpM.PXH26}0|5,)/yîL&&rNEu}_(.Mӻ\x1 N eW=lf/Wxhb9}'К0$\uikml(D`0wT~€p`4cCEbd;eF<4&>_O4Toii`l3ԜWEb_<*[ `pO PyW%C%OB9#^o=6OJw #V sVQRǟtE sL#ϰVi)x\%z!,#wCkh`@@].O2 \sk _1&^5+QTTTTFkd4ܱJ`d \&8X~mmj[-x,dt #Ӫ&74+H82`DX&ә\c&`?߱Rq"|RuF9hZ,>,h+OXc̠|Gw]a&DuZWC/g)ߩ\6lug7ь}4|bh*z`. i*l WP'&MY 6xoGq s@'jϼ P9 > a ͈)?KbmDt v6Pc0 L\5TJ='vkpƛ޺YDmlƲMq2J}Y7<+Yќ p;b n:y臱``ߕTxW5m\2Io9 > aĤ ͙D+@obmDt>ێ{U`؅)aϠz#7jp Zm$ !i@@*fiWi.|C.Au_gAoN:k24eъToS܃sWN=Sqò6gryjcsѢ1]XmCi(v*pGԶZ |adǒЋ) k!G٠~w0@ $ ܫU<# %4s|@ ͙D+@obmDvePƐpuLKA-!6?X&o#(5WxR],pe{4KAEu575Q @"xp64_煝1+b)}Fop IL i"v` tGO4E|E0B6 !uj aevƅRO c¨$emf ??~9pt?L8*H s 0Rcff"D76ߢfvePƐpuLKA-!6?X&o#(5WxR]-F4KAEu5ӬFS[R3aB0#CbxW"{rn8EOh:Kd"w8m3,: ޘ n{J|#3I{ ,/p˕# r7+lt?L8,~H s 0Rcff"D76ߢdk(S.n4oM 2^L+$PĮDwX%%m'SDd$: d~SZ\elRsb3MջA#}}kQl ^eT `(Iêy}X {0=4EBzͻO`"B]>'}ʊ+)t?L8*H s v aĤffD76"`tT7޶m40 L\9 Lc0DL3z+)徐,$Au&D> nk. ! F*O_)sbͧZsR],f@?/'IJuݘւmfk)s6bީ1lp  0&[`-w DFf`iYH_@>'*>@%6kp `'$NbH@K|@ ͙-obmDt ePƐpuLKA-!68*M^KٟzleNА;JA$|*9Ő,V;g+z-Qf86vGZ`+g&bf1p?A?2 {3gU߫JHmK F6 >V#åS2g`f4D.A_z͵[O`"B:}d3">'um_fܫU.2# %4s|@ ͙+@obmDk(S.n4oM 2^L+$PĮDwX%%m'SDd$: d~SZ\nA؟2dӦ&a]+9ZRas#Gi&vvljy ;jxšhҖ9i9$6,lAJBNNSri悡`) ҫlr AY r36m=) tՐH毭6$ nhĄ?L8*H s v aĤffd76"`t ePƐpuLKA-!68*M^KٟzleNА;JA$|*95V;2E$R,_^~cse͋9(Pb3c 2kẙWV@YsjKfh*zEL! *BEPW'&'O gI%m 6 kNeU<# %4s|@ ͙-obmDtT7޶m40 L\9 Lc0DL3z+)徐,$Au&D#"۲8Hl*u 8okDj;C'+RLVZ40q7aU.\`R%PP76, =Z`UmAhA[\G[a7`iYHVOyɥU?.xG~!!nbH@K|@ ͪ+@obmDk(S.n4oM 2^L+$PĮDwX%%m'SDd$: d~SZ\C㓀ҕsF =Ex1UODKU^9*lhu9IN[36!f$|<a\ u`Um`栯=NFf݀Me!};y1)hdʰ”+0tx8*H s v aĤff#d76"bt ePƐpuLKA-!68*M^KٟzleNА;JA$}rNXRztPU7zTsݧH h5B$ bRy UhH< !1bg7/qvG4/4%<>=Z`Uk2Ah3y=NFf݀Me!}tZc~4pvq@7y$ eU<# %4s|@ ͪF-obmDt ePƐpuLKA-!68*M^KٟzleNА;JA$}rNXRztPSBO4^Ä.">!(*ɟ,y$'{XaEvxxm q&`)a҇ީu,Um`=NFf݀Me!}t\hlr`~w2@" $ eU<# %4s|@ ͪF+@obmDt>ێ{U`؅)aϠz#7jp Zm$ !i@@*fiWi.|C.Au_g*'oCmXa]g^"'54eX_2Ru, |O4K48C;Q %ypJ]66ީ1l 0&[`;Z 0}Qw ~{}{<#x4q@7y$ eU<# %4s|@ ͙F+@obmDt ePƐpuLKA-!68*M^KٟzleNА;JA$|*95V;g+zy]eD\*\CѲrb1EDdT@c|Δ":щ 'YX mCm_(}Al[= VDj,Z ᅨF{R<|Ov_{҃eU<# %4s|@ ͙F-obmD;\iC.C1%WtT\NtzTuช nũW\jycL]bN%bT2Ţ_<ruKRY/wes mapQ $Q<?16D88B(N~54>ƣYS Αc& {zs>^D"!y{ ܒ-0audio-0.7.2/test/torchaudio_unittest/assets/io/generate_opus.py000066400000000000000000000031251376444676100250460ustar00rootroot00000000000000"""Generate opus file for testing load functions""" import argparse import subprocess import scipy.io.wavfile import torch def _parse_args(): parser = argparse.ArgumentParser( description='Generate opus files for test' ) parser.add_argument('--num-channels', required=True, type=int) parser.add_argument('--compression-level', required=True, type=int, choices=list(range(11))) parser.add_argument('--bitrate', default='96k') return parser.parse_args() def convert_to_opus( src_path, dst_path, *, bitrate, compression_level): """Convert audio file with `ffmpeg` command.""" command = ['ffmpeg', '-y', '-i', src_path, '-c:a', 'libopus', '-b:a', bitrate] if compression_level is not None: command += ['-compression_level', str(compression_level)] command += [dst_path] print(' '.join(command)) subprocess.run(command, check=True) def _generate(num_channels, compression_level, bitrate): org_path = 'original.wav' ops_path = f'{bitrate}_{compression_level}_{num_channels}ch.opus' # Note: ffmpeg forces sample rate 48k Hz for opus https://stackoverflow.com/a/39186779 # 1. generate original wav data = torch.linspace(-32768, 32767, 32768, dtype=torch.int16).repeat([num_channels, 1]).t() scipy.io.wavfile.write(org_path, 48000, data.numpy()) # 2. convert to opus convert_to_opus(org_path, ops_path, bitrate=bitrate, compression_level=compression_level) def _main(): args = _parse_args() _generate(args.num_channels, args.compression_level, args.bitrate) if __name__ == '__main__': _main() audio-0.7.2/test/torchaudio_unittest/assets/kaldi/000077500000000000000000000000001376444676100223105ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-1000.ark000066400000000000000000000037451376444676100256520ustar00rootroot00000000000000my_id BFM bD{7Ei%E.5-E)E*ET*E4*E *E*E*E`*E"*E޴*E*Ed*E*E*E>*Eе*E̶*E,*Eݷ*E*E$*EH*E*ED*E`*E*E*E|*Eʶ*E*E2*E*E*E*E*E*E*EF*E*E*E*E#*E*E*Er*Eθ*E4*E͸*Eo*E*E*E*E*EZ*E0*E*E*E*E**E*E*E:*E*E*E'*E*E*Eڶ*E*E*E*E*E4*E*E*EU*E*E<*E*Ev*E*E*E*E*E&*Eܷ*E9*En*Eݹ*E*E|*E *E*EH*Eʵ*E*E*EL*En*E*E|*Eη*E¹*E *E*ET*E*EJ*Et*E*E*Ef*E4*E*E*E*Ej*E|*ED*EQ*E*E*EH*E*E *Ef*E*E*E*E*Ex*E*E*E**E?*Ej*E*E?*E۷*E*Eĵ*E*E*E*E*E*E*E*E*E*E,*Ea*E*E*E*E*E~*E*Eȶ*E*E*E$*Eȵ*E*E *E*E*Ed*E*E*E*E&*E*Eg*EB*E*Ej*E*E*E*E*E *ER*EE*E*Em*EV*EǷ*EL*E *E@*E*Eֵ*E*Ej*ET*E*E´*E"*E@*E*E~*E*E*E!*E*E*E*E*El*En*Ep*E4*E*E*E*EP*E*E*E*E*E*EC*E*E*Eݶ*E(*E^*E*Eb*E *E*E*E*E*EV*E̸*E*Eȶ*E:*E*E*EԴ*E *E*Eȶ*ER*E*E˸*E0*E6*E#*E*Eն*E*E³*E*Ee*E޸*E*E^*EI*E*E*E*E9*E*E*E޵*E޹*Ek*E>*E*E|*Ee*Ee*E*E*E*E*E~*E*E*EO*E*Ea*E*Ez*E*E *Eں*E*EL*E*E*E*Eڶ*E *E*Ek*Ez*E,*E*E*E"*EX*E*EB*E¶*E**Eù*E*E*E*En*E*E*EV*E*E*E*E)*Eʒ*E(r*E|*Es*E\z*En*E*E+EX*E*E~*E*E+E*Em*Ez*Eu*E$w*E{*ELj*E*E*E0*E*E(*E,*E*E*En*E|*Eu*E2v*Ex*Ep*E*E+Eb*E*E;*E*E*E*ENp*Ez*Et*Ev*EQw*Ev*E*E*E*E*E*E*E*E@*E4r*Ex*Ejw*Ez*Euv*E~*Ej*E`*E*E*E*E0*Ev*E|*Ew*E*z*Eu*Ez*En*Eq*E@*Ey*E(*E*E*Ej+EY*Eo*E{*Ew*Er*E y*EBm*Ex*EC+E*E*E*E8*E+E$*El*Ey*Es*Eu*E,|*E8m*Ej*E+E*E/*E*Es*Ex*EK*Ek*E|*E;v*EZv*Ez*ECs*E*EU+E*EL*E2*E9*E*E*Ep*E{*ERu*Eu*Ev*E*x*E*E*E*E^*E*E*E*E*Es*Ey*Ev*E/y*E9u*ER*E*E*E*E*E*E|*E*E{*Ev*Ev*Ev*Ex*Es*Es*E*E*E|*E*E*E*E*Eq*EL{*Et*E@*Er)E: -E`$Er8Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-10000.ark000066400000000000000000000470651376444676100257350ustar00rootroot00000000000000my_id BFM JE~EAE9~%OEEDh$ioEE[DTŋ!E[E1Dm ŨEqECEwE[ZEEbzϘ2EqEvgz=[EE6Ęcv~EE\9CrEqE^DfQEaEfȾD8_EdEѯ&>E'EZ{u =EE ^EeE˸EEʖP„EvE\Ņ$C,EEx^DxE%E!DaDuE XE#(c EψE{o0E~)8EEEE"('Ŕw`EEDEE`lDduEuE7CYETEEÄT\EvE w2QE;uER֓~lcEkEíuEEWBrEAEw sh$DE6ٌE;~qD|E;dsEd$5+D+SELE))&EAEY$E)ZDEE,sD`%[WlE~EmDpEE'?DcFE>E( :CƝȍEtEh@jıEE9AWpE&*EEĬHĞ=EE#tHdEu{EZ#0z~CNEřEj']QDECEִDFEzgEX$&ŚE*E@E)H:)E"EJE($PE&ED.#ň#xEER&DrP"EEDmp lE}EA7VEE,EE{zhEJE+7#nE"E~ČE,(E1)XAEEREE~%ŔhEE:\D:ſEELDTEElCĦE9qEH;ËꆼEEQLFE{EzfĖzSE.uE >ûEfEKCEgELņCD(E׈E[ѭD E$kE%ņDEXCEѤ)Ř%EEE^)ŌYME@ED#żtEc~E DO"cmEED šҟEWEмB."(E1 E\yMĝAEnETpj EEBu.EbE,(5aE\ϧE#qCyE/ߕE=d?qD EE z;E)Ř.EkEyE_(^UEdED4"H|EjEDvVjERED_ŊEYEF=EϲE(EC,E`sxEE~U T]E'E`° EEzCEE^5DCE}E! DXEVEE(PELE@3/EQ)D":E5ErE&aE-EtDlm@E@EgD^EՏEh*C3źE:REUÂĬEE/6EEE}Ė+iEwJE6VxEEכбBEE (DdEFEGϟDE/rET$ōD iEJE?)3bE6E1#Ew).FE߭ED.%ūmEYED<HEEr:DŗE)Exv(ChQĎE\EsLnEzSEZ}ĔXEED8E҉E~bErE CLE3E$ŲUD2EE8@5D#ETfEW&ĺE E.>E)Ųm*E4EE(G1REED"SyEEǑDEE D E/EJ+E EKREaE0~RQľEGElIJJELEHHG9.E EUG2)CpEuEŹD}EE'!?DAEvZEx'EwEp2E)|6E,[E En'v^EE^iD$W ܀E6E uDrWEOETC\aQEAE(R%(E-E+|WEFE0sEE>ĈÀEEKBjETQEv{ ţDtZE$EX˘DZEϾuE#|DR-EzNEh(E E&E%)BEE`.D% jEɾEDq4dJER\EŶDEXiE%=LD)EuBE%)&E4E[E(ONE0EMD֮#uE[EDŪEHE(NDiz ŹYEPE` FBB9EHE ظEENs+oČME!Ep*Ħ5E EĘp$è?E|JETŀCSE0OEduD>EvETN ޣDE{ ^Ey'' Eh^Ep6E)ŝ2EwE֫E'FZE?E\D$!ŮĀEEDgEEVCsGKE2EM氶EEE LEʆE_ĺr~>hE4EdiĘE&ExEd EeEzK&ůqfE`%EC D8ꒆEE(UD ;EEħCIŞEExËÔiĂE9E%6EΥJEPE67ZZWElE%ļ^à)E EcĠ)CEE;DEEhB2D\EsmE,%5DEFE֍)3:#EPEOEH)ŶJEEiEGtDzU$LrEEDzŚPEEF(DN NEEB?r&EzE**?TEEXib EE`, 6EETäYE֨EńCvEEb~5hDEy3EtDkEnaE2&E?E :E)H/EVErBE@(VEED!~EVCED*ŠE_EHuCEE + 2EWEVTHĺEsEx:"ŊFD`EUEn^(EE-En)źY;E 3E7Ej&3bEzED4Ÿ΄EF|EHVcD蘗EOE(CL`mEME@f\ĶEBEN9\"sEE7xe-EBҿE&h'E!EX\B0EEl ̢-D%EE~8qPDEqEl$-DyEIEU)QEE!E|)ũ\GE-END$ŘnE/8EDRE؎E6Db\ŨEEPC$lEE$x}EE^;QEFE&@EE0܂gEkEQCEEVZDb$E&EDrEEC*eEu&ETET=E )2+E6EE(P`SEED"ōzEZE?dD0>ŒKEhEƃ Dn fEE9VĐE`EnM¾`E1EBEEPĈ|:E@&EVœyE%EfCIEEdQ6!DME%Em!ŭD0_E+7YE(XEE1Ea)Ǽ7EQE EQ'ŢV_EFED< ŷEz EpD2E EC>qݧEE6>EFE.rPEE@*pE :E`1'Es E$POB]EǟE 0 DEeE4,Ŏ1DEtE#ŲD@EEMEJ)jERE%E)>CEEDn%z3kEEDDūED&ENyCDŪuEɃEJCE^E@sN|EEEzSXģ~E"E{âD LĆEyEC&ÖsElEb*mCE.IE$MDEGE+DEhE%.bEECAE)(EyEoE(ŕOEEDPh#XwEi4ESDhᘎE E"D EE B~+EBjEâ:Y7EF*EpwE)Ec&ijEE*s hE⸦E:żCEE!‰zDkE܁EH ŴDE\E'd EcE"5E))4EoEj Ed'ʼ[EP&EP&D ]EEP~DwAEEC%@EE:Ò.EEL#<nEE9z6EOEtEE\AEcE{ PDEE KDlEWxEV7#D^ElPE(}"ʜD E;mTEl(EEL,E2)DfLE9Em8C{ڗEFnEXpEEZ}WCYE#ErKHĠEEEM$ĢE[E5CRE0E.,QDEyE%D4E}gEk(&[EfE@E)oN)EE@E(ŖQEErD0*#Ū5xEEXDX.EE@C]ŏ5EqEp:6EEąEFEKπjEE|Ļ7kEQEd!oE7vEB| V D8lE;E.lD}EUzEo"DVE$E.$ EEpĘ0dEE @ EEؓCZE+E*׈DwFE}E!żDE?VE;L(eETE/E)t9:E=EdEs&aEE">DeGE5E*gDW EEبCŖEJE9WòNECE~6EvE˜ćhoEDEhqlEEоBEE I)D?Eu>EsDE2rEX$DfEPJED)źtEE#E@)ŬCFEED%% mEXE2ڨD4ŢEEM:D\䔜EEP&CbHİEIEØxEKE<[B\EEDE EÕEEBŰCEP*E,OVDvE~EwCMD#EGfEL&řEzE>E)0*EEE(>FREEDr"űeyE}EPD^EҝE D E/Eر 6EE0(:Ė$EZE~!ķE=EٵN#ĘPE`EU#2EڧEaY̛C EVEADEE*0!ůDEEjYZE='ńEvE2E)6E[E Eu'P0^EXEIDYD E6ERuDZŷPEPEkCLłVE~8EH&.R/E(E+ĸްECE@lsJEHEx>EQEt:QBLEFE @DQE7EDaEuE#QD0-ElNEJ)EتE&Em)̜BEEd D%jEлEɯD4WEWE^GDR<EyE*ZC?EE8)EpE}1P7ĂEEԠ&O^EEdW&ExE ĺ]CEaϚEsIӼHDMbE9EKSQDETiE%,D"E|cBEں)l&E6EmE(GNE<'E=(DI#ŘuEXE^Dd EFEDi eE E`BB6EEV,EE>t}F(VEE+u*Ę=EE0x#JE)>EŊxCRSENDEj2;vD0WEhEJ VD@E]E>y'Ţ7 E]EW6E)2E5wExEN'ZE$@EkDt"!πEvEtDőEExCt74Ee"EaE0AEwUE~E~%~`pE Ë^_E;E/?>EE{ dD(E룏EPD@E0yE"ŁtDEkRE-(DE8EF*E;) ?EEEw&ifEE׶D3E2ETUDu.EEԉECŘEEoùMҚErENXEĆĦEME^E{ZdaE^E/*)EBE *CEwEř7;DEuE8MODBaE_mE/%qIDE#FE)ųP#EĴE 6E8)_KEXfEBD$Q$ `rElE΄DZEEd(D ŭĞEJEBi'EEEAaEEiEĵEREi5&#E{Eg*PST]EΨE{CENErkŨhD׷E,Eo}DmE`aE'ŷE=E9E4)B\/EuE&E>(c WẺE'Dh!6~EDD2MPEyE( Dc 搢EEc&EZEtVlE.E`1hEEeĦE2EE}P(́E~EtCIEE[+?DEEbt!kCDL`E!YE_(2EM~E@1E%)27EOE EP'Ůj_EED>m#EE*pD,(zE EC? EE0{7ntĘE]Et.\6g$EETp4oEx1E_wá)EE$-pBcEٻE ̜ DՊEVXE/oE\0}DJ&EE4C,E{E ľE4E$Ħa{E Ei{#E)vE}ZguEM{E ĀoAlE9Es sD E)E>D1E 8xE"cD!E, QEC(yEEP)E)(@EEE%DhE%EGDݞnREExQD'EeE CİEEL j@:ENE*4Hăċ[EEUĸEE#\b~EE|=P@CgEE$@D !EozEg-DHE2llE'%4;D(EEE(T)Ŵ$EBELNEu`) LE1EMDrR$ŔOsEEښDiЌEjE"D ^5EwE BENE^E4Emn ^`EYE42kfEEYGE)ENzDCE}@E8'lDTExsEy ϦDnE `Ek'ŽEp*E?|8E5*V0EfE<E_(źXEOED!a ELE^DŠyEsZECȁEEӟTߵE/Efr[oE.rENEEP ]9E:E*@E;EfŨ DTE;Evł DpE.{Es="DMDoEʡTEDA(m!EE,E)TydE|E"D&"EmEc_D5 SE'EՙCTEEHtΔºElE,=Fo EUAErĔ`ıE]wEJhiE~EڣNC\ErhE9j1D@EE "7DrEzoE%sDmEHE)Ŧ EE[ E)mHEBmEzD%oEjEHEBbEX'xÇE`E=.ŕCDEEţ^D4:EQ0E|zDVBE#dE v&ŵEDEEȒE&E4D"EgE%1E!E1@E#)ڝ)E_EfE2(=]QEE Dk"PxE(EMDyŖYEED ņE0E@ЕAeܲE -EgdEEԀzFLEdE8ܳ|!E)8EN`>EFET CwEE~D|EE,!Ű%D E@[E(k EBSE3E`>*^05ECE E'ŧ\EED ށEbBEhxD4@żEaE|CWֵEbEwřEeE@(޲$EEu~wEgEwbEEKĀBE|EKC RD,E,[E@DgEއvE;#@DE+JOE()ŢoE؋E'E*ŚAEEVUE%]2iEbEzDgGkEKEZMDzh:Ex!E_nCa7E}E?EEKĐETE,ēR(FEփEqEE%tĪQC۲ExE0yEDREZElҍDE9kEW%DECEh)&EEA E:(8ME]E5Dc#,uECE)2DŬE\E: Dޤ ErEЍBQ{EIELOAĪ-EYEqJcEXE(/REqEU6EEFp%LCEErpDE܂EP :DE^EI'P E7E?7E6*Ƌ1E\EuE7B(ſ;YE2:E+Dm! EE,D}~ E4EC ESNE€QErEXNļE\En+E,]E8? E Ew]$E䇢E_F } DELEbDE4zE|"źDEZdSEGf(q^EEɲ+E).$>E3EE4& eE|YEDz<N/EouE E(UEdE;D:d"Ϻ|E SE%D ;EV E0?D $ģE2nE`AžE+EaĸEE)`*EEV2Ey(|REEOD>"yEEYDUEٸEOD >+E(GE\?X_EE]ĘLE9tE~ćĔEUEt wEoETfTEEkV%C.EEχDEƀE; ŐDeE؉ZEg'%ENE2Eֹ)6EyEN Ḙ'T^EED] uEEsDf)JEB%E!CvAE_E+ïBEE|,DCEE-b7tăEOEߏظE^oEĸEB}E^Ei :[D2EȍE$DAEVuEF#`LDENEH)EEX&E )xBEEbD&-iEFEM&Ddkz@E"5E“FDkjښEEЋTC7:㺬E-EHÁī1E)EpOğNĒ@ELE͠QN E EàMEEbCEnE%l JDEKEŮDE jE%HDEBEz)a?'EgEE(XNEHE}Da#ź:vE_vEИDyŖ9EaEjD! _Er)EMB)EEt~* fEEzsFE(Eʰp)pE E^0%/E7E^_&C*@2EdTE=Et(ŏtZE ED`!ŎEEd΀DqũEEH\Co"EEmhNEE>!ē۵L=E]UE".UEE$ E2Eĉ$EEGL hDċEZzEŚ͑DhExED#]DE%REHv(ŸEEo*E)b?E&E1E%&fE>E8DŜÆE4 EVDLrEEQC]ŝ/EP%EZûE/E7D?E`EjČIY7EizEREE /Cp'EލE=OME4E9E~ELd[EE_*REES~ĜB8\EV.ED Ş/DrE9EDEwpE$\DXE>IE)E\E!E6)SGE{EDJ6%unEE@ΥD{ʌEcEo4Dx EECviEEhkĸܾE6E`ĴijEEXAEQ׺EYĤQEc9E"?CƽEoEa2LZDEEr_D'EdE&qE;EJ8=E>*+EރEpbE&m(CSEEEDam"ńzEiEBDE}E D  EKE~y ĺE8xEn2ĄĜE Èۈ*EEĨE$6EX @ǥE2E HClE5E/eD^E1E>:!DEjRYE'@dEE1EH)ž+8E8oE E 'I_EE)=DQE$ETJqD%E)E,CFECEB<îĐBGE.EzL DjE0E>t%DcE0tE1$řD'EvLEF`)pE͑E%E$)źCEEDn%!kEyEǬDwԈEdEAD!8eEXE@DC(EEýjmEE0+UwpErhEI}qLLEGE6D ÂE EZqtC9EYEPND!EE3_IZDEiEG'EEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-11000.ark000066400000000000000000000530051376444676100257250ustar00rootroot00000000000000my_id BFM |EZnE:.ipDEEĽ ī:E/E> DtRHfEuE>E%{DEHE&z.EEC=#zEE)E']El E#EfD%$9E IE)kE43ŠNCɕEl/ELFְECEkDb!9\MELE> WErFDEyE8ī;E ED2 aE!E9BE$8DqEeE$2ĪbOJEE& CjżluE$E.EK'.DE?E%L+EtE \B ŃEvE\`EN).cDEaElĨ 6EE^Q;a+E[E/E*3EE4Er>E;ETÜ{E\ED4)Ř\EEfENF SE)!EM:Ļ۠EEUDj(Ž(E:E<{EŔ$Cl5E4EP?wmcĖΩE%E$ D&%E) DEE mDĠEED+EnE6XE *? EAIE2EMŰ{#;EE ĪgEnEDdw)ųDEKE?El@A|E E)FLI6E0E*޴Do'Ź|,EʲExwE*CBEEGNK{E:\ED$\@EHEcEHnŞD#EE-ĝkIJEEND: TTEqEOE_!.cDFE^E}N5>REi'EDtj iET^Ed>;E"q%gDwEENZgr:?EEGiC@~|E_]E&E'(ōDE>EEu!55EEJ¾ Z6EUEE)ŬD~7E~ٖE'ĀE_oEV2ˑEE}D *vE!Ee]ELF}EE ĝ'EE,D~.)ŌEWE߱EKŠBEOEQIEzEiD'_0EE.sEFrCOE!E2φ+ĉEtEnD#ŜDEE_E%DyEEĆtǩE'E _@D&TlXEXE&KET"^qDZE$E/TՐH۽Et"E= ClE;E`m7EE &ĻDR3EcE6fREcE2CLzIEvE]0#E(71DTEWEhĖD)EE*11 E3jEfE)ņDŸE ErŰ~F#Ex(E/E!ExyD)n EE~EI EA>EFYE@EaDl(KEIE+فEۼt"CRE3Ey],tEEyD=&~34E7E2oE.CJVE!EOK\dČɮEBE~D0#tHEEP\Et|4DdEuE%PNĀ=E;EW 2DWņ\EvEGE'#66DE:Ej%ħ~@YE'EICH}lpEE}3E&0#DKEܷE4 [2EEBRv1 EEME(/DWE栜Er7ĝvEsEn8S ń֋EE E)Dw5EHEQg^E Ec([EߢED8)Ew~EE= ŐͽdEES+ĦyEED(r#E.EqE ŘnBDKEkE;<9ѸE{REG#DQTe`EE< DE#žDEܬEwE.#EC]EtElE/E)'žD|EE2IJ PEpEx@B EEyEE3)Ŧ.DE*ߚEJdĀ+:E=EnO(E_E'@E*ADE|E> P^ EE~t EE"BDT)ŖWEEEQ Ű4(pESE<7BĒ_EE}bD ('EPiE<|E%rC4E6E>t>WE[Ea'D\%Ū;ENaEmhED2MEETǷı E$EaDj!rPEE\TEk PD 1E ҳE<Ę_EcEPDH2dEE1@E$ŪDE7E̓oZEQECxEE+E'DEEJGEeDmEQE`XApŚӅE9;EEPy)DELE>;ċ"E EPx(wE53ElE*E!EiE4̈́YE!LEGþĸEE׼D:|)?E6E ERX(A1-EEB2`ĢERaED'gs+EEVxEޖCEbEręEED3$,?EEtdE(^DtGEʼnEexDzģEzKEaRD TEѿEލPEL!e|_DE4E+=PE kE=D#gEXhE6RD EٵEëā]EE|'D$żY_EEHEE$#,DcENE*h1pEkE]C0mQsEoE0E'sD{E,~E@m;$Sī%EEB`n|EEE()#DE`^EZjqE̚EPA+ņ+EErIEF*<)DEEWpmêLEEͪECEZDZ)ő'E@ElEb !f2EE3ĮHE3E^DE(2&Ex]EP}EŘbCEhEpċܨEEKDэ%ŵ:EXE:iE޴@D@EʁEx:$ Er`EDeD|!ſNEKEmUE .LDE@EtɰfĻE;E|Dp<#cEEEvEeEŬDEEܚA+EEnVDR REE:QE!Ŵ_[DE͞E-uEEp D\v-ECI,EJEDs!Eа(&{DEE].#iEN/E@,M ӊE;EM; E)uDEnEE:Ř5EEÕ$l\EED)a EEEER nw.EġE$|ĢEEDn(S!EEOERC8E?EbĨēE}EDI&ų5E&EJnE<hCEuEvĀ@L}EpEwD|"ſ#JEEOZEů:DE{KEZjĮEE+DB^EE\.FE{#ŗoD<1EӭEGEEFCŁ;rENE1E}&@cDA;EdE9VE&EBENEҞEI) DEޛE(ĊĶ EE W29ޤEEb E*ŖDEjE~E&HÁEUEѭ!E dE~Df)=2EEE p¨]EYEE[q0(riEQaEbDU(Şt%E*GEU~EŜSCQEEKnĠhEDEF/Ds%e9EPEjE]TCEE6ĸeĘEECiD$!MEE~VE<}HDE絴E1vĜԟ}ELEtDbEWEZPBE:$>ՊDE!#E+`|EOE.CŤuE`E2 .Eh'tDECEËĴJ (E(EpOEO^<EbE)D'=M)E(EzE CO`E1ZE31ygEBEݓDf %$=EpEfE DEdEioEE˪ZDz ŰQEERE 8aWDE,Ebă EEDDŽeEE$6DElwEX{}EܥESCVcžyEnE4*E'^DE1E\??EnE ŌESE.E)DEVEĐ}E)}E>űDEEQEi*pEoXEQEnHsOjEEWU EJTEDbD\)E XEAE@l BԪE|E HǕڢEEDu'[!-E ED%+nYEE KE"ŬctDp>EܯE-:<EE64CxbhmEO2E6E(&łD*VEYEĐeĸEyEL)C@HE E"E~(cDEEj 0D'|XEyEp˿ UE"ZExPEU*ʼn?DLEdŔEùSEBEdԿRzߓE E,D,)ŜG E'EGE$ p 2E! E'!$.1E)EGED#"rD E=E)wm EEȃCXv3qEE2E&ŚfD EDnEGYVYE`E܇B@rEE¨E6(mDtEYEX Ģ@E"DE$8 T&EERl E*4DLEEdlEE!VįE,ED)r#EEKoE ŐUEtER-"E0EDq(Şa$E4E#jEUCCJEE4vBKE~EeE;)ŜpD$E&E PE E=X{fE΋EE**DE2E TŦ/EOdEtXhoEED)EEE ۨ5EIE9ĞEE/8D(P>(EuE{EŨzCJEEvPE?EDZB%N~@<z#E-E,Ew)ZDEfјE2 WEaE ÜţŏEEiE2 *=E6EcE HjERE\bĭR0E{EmDn)KE=EEA[EEmDıO`E1GEDn',EEwE{J C&EIE(^IE$|E>DW$V@EE dElTŐ DlEKE1D[E %ERPDTa ţTEE&OENb!:`Dq/E^Eqږ#EDE#DJ`hE^Ej;E[%)nD.gECIEĖs< EEoCil|EhEC{'E(DgELE;Ď6E!E1 EE{,E)ūDEE EE8ՏEiED*dEEETMPEE[ ;ęEbED-)EEEBZ{EVzEPrİEOEdDm'/EE(tE}QCs2EE- fEְE*>DD#T+DE\EA`Ei<`$D(bEEqĹ{EBEAD{5TXEELEM"2pDETE¼KĠENJESCWlE@Ej7EW&OמDX#E9EFQvhĮEZE9CŜE'E#E(g?DEEZĄ*EoE@o¬, EˉE{ETE)*D٣EGEN3T{ï EQE06'ž^E.E^D)z3 E EŋEh :EgECtESEo]D(_xEEbEpgBE~ E\: YǥEEƦD&U3EE5ipE\C&2E:LEi9EJED(#FHE@Et\Ei2DJE.EԚěE\E,3Dnu-\EEPHE#ŕ~D)EEľĂ1EGE&E 7EcE5VĿ)EE*jD0$(Ő!'E^aEZ|ELkCE(EDrY'R%EtEDn%p;EYEhEFŊ D0EuBEjBĜձE;E8bDzz!HOE߻ETEP @OD5E[Eċ0E~ED_ŎcEE8@E$vDFhEcEĆ1El8ExҚCwEUEUU,E'ź=D7EE-u~EEoEjA5E KExEP)( DqEUE"tRE1E9}Ì7`EEAEE<*EEEwE~tExC|E[ED<)E(E"KEe)0@EKEA2E@rE,D^'@*E2ExE/0CEPE~ĒQЪEE﶐D$3C?E|ETeEd*D&"EڹE™Ă^ĶkELbETTD $|SEE^QE~(!0]D4EcEE:ĤEݠEWDBDgE[kE|E+ER.ćE"E¢ łOEǒEHfE)nDKEǕEhZԗEEձšݒEVEvDV)! EPE JE (ì0E&Em0ou7EEpDH(_EEKE!(TBIEuEfXzSğPEED$&2E~E xqE8NCHE@EXJĞEED\#ŬFE٧EX]EĆ.DExEĊݩxE|E6D0tZEPE'"IE#ŜyDvEEm ̣EoE^QCA2nEPE4Eޥ&ŤDbE@E`akEE CdH IEE E),DE.EXb"ČEYE @ ŤE EtL E**#-DEbܓEƆ(EGE|X䇔E6ED\D*3*6 Ev:ESE] ¼EE%ĊEElDn(y"E/E݀E"N)CTE.'EbcrEEDD%J6EPECmE,C<EXE*QEsEqvD)K"%KEEYEV=DkEB)E^GNEEL*DyŰ#_EEEE_#DE:Enu #bEĩEVrCsEaEu1E5&DwEfΤE\$SİEE7BSbEzESEA)DbEnEG@#E\EW?VԌEΨEE:A*ZDfaEWE,nfÏEEúpPE3ED*ŘE E"E8y Hn¹qEE}3UⓟE(END(T%E3E*}E7BXC_`EqEypfĭErE펙DN%:E8EiEŬ6CjE:E|+ę@ENZEeD"0QNEEUET JJDEZWEܹ EEԎDTbEfE~AE5$ŠpDBSE>E|+:,nEEpC?BvEE--E,'FD%EEAGĈEE+B0:>EyElE&)4ADgEE0ĠݺE0EMNkfhE#~E*Ee)ŻEEEH|àE^EXEE'D$S)EE{,EE~ UEE'U=ugEEgD'80*EE]zETN͆CuEEh|ąa.=EEg-DU9%Ŷ=EYVELeEN DE E ǚ$PݲE&EWD !*RE EQE9!XDE̼EZS.EĭE D&H6fEOEġ=E.G%ŴŒDEE{gEYECqźzESlET)Er'(ō DE($E:Ĝ^>ğE{E( {цEEBE$)ŖDdzEEĴ E)E".jEE:uE)EEE(Lf8EŜE 4E]ED6)E-EEG0>BEdEIQ>EEqDL-'Ŝ .E^EyvE(V])CEEFZę&E)BEbӋD$ʼnHBE\EbEڌgDEkE>PĵEEJD+yVE~EXNE!"iDԬE_EĜ FEEԷC+=Ŕ{jEDtEXM:E k%GGD+E^EkYmڐEHE,OSC}E&-E%EO(oD3ElE(~2 EVEH5O mEҏE5BE *^D\:EE(Eİ*E EGkEŀCE=E`ĽEElD,!XME;E6WE<5HDEE/W^'oE!Ep DyŴaEtECEB$ŐdD^E0E06EECFRuE4EH>.E'rD[E$WE(MIJEsElDBZ~ETEEX)a,DE/E3o&ě!EKEPodl:"EbEET*EEGɐEFóEMEf$EElYD)KE0E1E rDEE;İΠEElD@(*(E_EzE.C1$EcExkVE@E#KD3$W=EƈEtgEG DEҵEZ*ڠĨEEy]D zQEEgSEt hVDEmEBČEK.EDMeEDE,?Ev$ŜʑDE˪Ev$|EEÏC,LŶyEE*E'DEޡE*~?͊EIET@ BE>EEJ)ŃDpEErLEE/1E+/EpEF)şuEjEEEUh~+.E0E|KVBYEwGED˫)(E/E\E ŀAkEEG,7E; EpD'h,E,EZwEw.CE.EEnfkE=E?D$y@EfE-cE¹.DDoEhEL統E$EMD4| TEjEOE"!*bDw/ExE-YkRCEdEDźhE9E:E%"4D3dEܨEĩrV+EEbCl|E?E'E'MDDE#EWĻ3EE Ep? űjEE*E2|)`DXEBErE.ED]hEBE@D)gHEEiE@EΨEA+^EE39D;(P{EEվEVŀB6E`EsQ<]}ETED&0E< EsEDCyyEEēqUEED#ŮEE̼Ei_E1EŴt'DEEz˝EE>DۆҬXEܖEAKE"4qDEE<ʽEE0C@«lE E7ES&&DE./EľgBE{E,Cp=EE±"ED(zD)E&E J)Ĥ EtEx ( EiFExE*BDӝEޔEŚà ELE_ξ !~EE_D@2*Ŗ EEWE7 ŔÒE E ?ĘܜEE D)ŽEE#E  CRE9E]B0E-EO DG&?4EB>EI pEC||E2Ei EE~D"HEEO\EJ^5DE EZޞ3mESE!o2D]EEGE|" DXEE2ĆOE[=ECi,IpE/E3Eh&DE(ĥE-ZąIEfE .BN-œUEnEdE(yDS~EZEyķEiEl EE E0*ţnDEjEMEݱE~QiOEd{ED *nE^EEEL 0EGEJ,: ȝE&~ED(#E E=Ere:CEs?Ej2ṿEMEDb4&ş7E} EkE,tC_=EmEyĔ7[EiEjmD+|"7LE֝EWEv2BD8E;EVEv+E` "DuLR`E`|EPCE.$^D^E٨EnZE>;E 'CŐtEE1/E>&Ŝ[DEE|?ΧNEEEBBxŬ4EEE(BDJEE ĔETE2Nþ\ŦݍE`EKXEn)DEE$>3E:E ěTEf5EpD`g)tETEEr h=2ETEs6pyE EjD'k (EE*W|EJxCEEFsSE~EX ŀʍAUEE,EeBΰ=MEvEW)DHf'Ű+E!ExE)*C%EE~ĔSĂ6EEFD|e$^&@EEdEMŹDpE`EGāԳE_`ESD? YTEEfPE!/aD4ECE5>bElED+ŀehE2EmKE|ED*Ō1EFE7En ŠkEҶE\F5)՟EED~(Ťl&Eu;E|EiX aCQE8EHrNIjϨEjE}D%j:E E^Ez1Dy)ŰD;EEzj)^CE6E,EYjE,EA1El?l CFEEDDJ'E E@E(u|UEE5(oEh ^+ĴtE@.EUD)DpEEA>Kł^IEEeEĥ#EZ4E>+E 8dCGE8E>+.D@& E EvEmSĽ@9EE?iET 2ӿEE(tD;!*DEEZÇObOE}EEn+̥EsE3%E"CxÐvEDEӶDg*ŧ DJEl;EځP^[Er(EE%Ĵ-EEE@$NCEE`qC#ńEfEiTEϜюEEZ]WEyňzEE1D"_*ŶžD-EE֝6ţ^aEhE EȎ᧭EEE %DEmElEGEĖzOŲE EmEJb'I=DcE@E=+C8/EE-SEشFĜJERENEEЉ``VENjE?UD)LDEӻEt8jBb$sEE0]ERXiĞKE1EE*(SDEEHBH/F5ENKEBE)ı. EEhE2-E8 HGCpE]Eօ5Dd'Ż EbYEEz\fHEEf5kE &=ďEWExD*ɷD>uE~nEtbŎbMEXELE2EyE-'E/!CE E2DjC&E8YE]EĽ*EEAeE/"2 bErED:N*䈣DE3EŢ\SEEE_0ļEE !ED"ŐCE>ED>% En>E ̬EhO E.^E}H_Ex~ØEEںDi*ʼn$DlUEE-r,]YE E{ލEoZ2EE2E"$ŤC:eEfEjCE&$ř"EE3EfEELYE/żÙEZE Di*7ɺDE:EyW_ExWEE?6ЬE>@E) EoB%6 DAEEC "Ş0!EEEL>ĹXNEE[SE`EZE^E'A qQeEEJE`E%QEE@&pVDEEC!N4'EEJE%@hʎEXE TME@ktÊwErED*QD\EXEyĂ Ű>kEE>EIĵEVE E'F5DHE$EHC- ŊC-EmE9E/ęXEEoUGEy"ÊEFE0.D~)ŴnDE$EjA2ij x qEEXEoĀvE)TEE'j.LDDhu wEE~E!h\EBE D^(ŶbD7EEAŮO9EEɜEeEEM?;EMQ@EMEkjD(@DEEWոŤ|EEyEſJjE EvD$)ŢyDE9xExU­^Ű\?E:AEWE:o6ErNEx>5E,PBEsESDz&(EEICE&ik_E'ERsEG>8*EE AD)ųZD0iEsXEÏaEEE>E+q˴WEE>./E(+C:EUEU2=Di'ųE EEbzEMEEB*mE ;%>EERDp)dDnE)EYө{eKE3EyE#6R E0E))E-!HCzEOE"&Di& ExE7El56EE=gEb] ȉěEH}EqD5*DpEEŭjQEE중EjXܤċE0E,#EJ"LC]EEmRDA%"EJE E.͎ĴĖENjELaEf"E*ExD`*YDEEqdWEEӎEĉÜYEfE>E4#ńCEEĆCx$ 'EEE$ĵ(įE)ET[ET1):EED*e*żDIEpEK>?\]E>E Egj~NErEE$JDmE#ECc#2E˭EkEBďEEXUE ;RX4E[Eh%EgwEɥEy?ޚE-yEZOEIŒxE)E؋D* DEοE~$^ RiE>E5EKĄ=$EE( E.&łW.Dl:EDEDcC =E+E.EEHiEE"^IE3M=HE~mEzD)żbD0EjE}%,B 8oEEKEt E*EE'ŎDD:EFE8 C>|R1E`EeENW~AE֟EOCE-@R´ EEqD;w)TZDcEE>.OfuEEfE/cĠ"EWEh Df(fq[DxE7E hBŬW7EEdE"lEEzE=EPŀ>/ESCE rD )DLEE0CQĤŸ{EEzER#P@EED(|KrD$MEn%Ef `=EE8EcE4~E~=7E֩@kBZ@E E4;[DX(%D(EEYcĝoE EuEI<*>EbE#D|)ŰDE^ E:j)dCEЙE)EBVcoEEK81EMG,CfJEBE<{DDP'ŘEE*EKuUEE6(oE +fEXzE:J5ŨuUElEkE\DjxEwEW Ewe#DWC+E[EDv$t9EiEE|o[EF@EN]E:dÎ~EGEжDg*vD:E6ED\g[Ej(E EN;ĵ(EEE$8DC EECA#K.EjlEnOE Ę|׎EEXWE9ŰQúEEDV* ־D1EE.qdaE_mE E-ČEEE̙%hDjEEC"b4#E7EE>6ήE$EYQEҔNEjEHeD;*ŸD~EEh Ť_gEHE%EĦ BEE E&&DEEUC*!v?)EEEt0'Ķ}EF2ESKEZXí4EfED})MkD+E8Ev%( FmEE@EbĪzȲEE-Ew'Œs=DfEE@*Cd(D/E1ENEҴ5LE EMEEŀ2L\E*iE@DԘ)eD"EλE 8=Ū.sEEWEhNECEE2(:SDEEBBx'dP5E`JEElħE=>E H?EcQ~E#EZuyDJ))ūHD(EaEd KCņyE9E?|E*V̷E^EqD(ŦjDE'E?(Y;E@EڛE!rfėҜEcE>9E$#AE/EbD(n@D%IEEI]ĸv~EEzvEŤD9EE*DW)߀D!_E8E ʢT_AEpEEcιĞEdE53EŰB|E&EKD'!ETEAoE^oĒPfE"ENqET J1įEEaEoE>DLL*DE0ZE^ ĤWeE=ER!EĜiE|REOEf>&(yDEEFC:!y>'E EJEPĪvEWELMEstElED*WDv]EEjs $DkEER9Eİ:ġEWEE&'5DPEE(FC3 ŰO-E^jE4E*}l]E~E`LGEňN""EED)DʖEEJ2 ŧ-qE8EePE=oE!PEE'4LDE:EԦB Q3E$E~E2B*)EnEGAEpŸ¦E]SED[Y)n[D8E.EOD0jwEE0~E\ķE=EUD|(Ŭ"cDiE>ELocC ŵO+E<8EE$rE:ENKIE*Wd)=AEgEnݏD)PlD/EjES,Ľ BoE(EGECĵtHEwE E' EDEBEXC8\1EE6bEIsD8EFEDACE8`#EE[Dlv)aDeEE>ĨQ/&uEE*bE\ c(EED](`[D;E@3EdfB4h7E+EĦEWHEYE& D})D\EpEX4$#oCEE#$EĈAİqEE*01EAHCOETEoDD4'Z$EEzEMuīYE|E;"oEP Ũ^+YE+E>)D])*DrEE'?CxIENE\E'qp&ET-Eg%+E fC0JE41E-D&x! EE EgĶAEʭE}-iE ؿEELD%*ʛDEQE0ïJŢsOE|EEI{եEuE %E$"XCB@EgED|%(E"E!EX ƕģ(E+{E8cE4EĝE}D6U*YrDhEvE|æ/Ŏ}UEEEe$OyEXE E;#^>CL*EEiD$y)E~EvEE7oEr:EH]ED,òE=EӸDbi*#DE2EÉVq[Ex'EE?ĿijEE E$C EECF#ū3E_hE$KElԜ܎EETAWE9~,ETEDX*WDX-EE ã$oaE.lElEݻđ ETEE%mD2EEp?C$">#E9EME$&EzEFQE< E_ED)* DlEEhK `gE"E EĤ2GEE Ez&w'DJEFEC(!NJ)EvEEŁE5EIKE@+X 5EEDX)+DE1E%Ė CPmEQEJE ޤE`]j%E[EEME7FsàwEgExD*űD[EE$ tLkEE8E<ăETEE"'5DEbEEC5 [Z-ElE0E9ħtĚbEEAGE>Ő!nEEDO)iDEE\K2x =qEJE(NE"nEdSEE'|LDEHETB[3EEzEh7&.EmEE EELY^Ed&EC[Ey*sGE E|D'h*ŵDJElEj2'Pb]EUE+E1bEEE$"<DΫEcE CW#CEpE`bE¯||ĴяEEEUE9хE;]E} DJ* +Ĥ#EE E&Ţ.D@E;EbC \Z+E08E EHs^EE7IE!M,E8Cv3f1EE\EuM=E^E7CE4Š/£ESEGDr)lDdEE ?ČS0uEyEWEVbĠ,E>EDV_(b[DE2/E`RdBӤ8s7EԃEzE),RēEEZ4=E7E$?E̠qD(aD5EEHbQÕL{E|EzEPo Q"EED(NrDRE<Et=EEEي|ѾsEE27EԸqBLEٗE.ZD](ŋ\D8EE֙c!tEEtE%lK>ĊE\XED*u)BDoE<EA§AwCE}E E IJ.{EsE%1EFhC.SExELDDޥ'm(EE+Eyu߾cEE& oE ŕ+~E(ED)@DuEEg@ATIEEdTEĐĀCE8E+E |fCQE-Eľ-D&) EյEd EzĦFE|E2%iE ƫݿEE7D'*ޛDE9ErLEŝ}OE{EЅEĚf1إErE %Ey!"lkCDE)kEdD%4EE{E'-EwE0cEu5EElDX* D,kEhrE.A*ňUEEOE0?'EE Ee#C/EŗEF*D$:ENEEĺ<" E8ER@]E^ŀ*E`8E Dk*6DE.EEpy[Ek+E`ތET EbE^EDʛ):D2EƻEX83&AsEE`NE1shTE{EEL)(ŪVTDh EUEǩB#f5ESEE1+E0EXE^UE8D9EE!eE'z ļhEvEiD\I*DaEg,E÷SEE8E܀ĆEE!E" 3C6EREt)D/%R8EGEE hb+E SE/_EŘľE(ED+i*IjD`EE,!Í|YEEDύE>`DEPEE 0$|CE:#E&E(ģ*EuE+YEt!iExNEޮD`j*"DEErüsv_EzZE"EMܬEy9EzE>% DMEyE<Ch"RP!EE~EW4̐EлE:SE5QuCE_ED(*ŰDdELQE űfeE0EEXʈĂrEUQEE`B&DEE_C!`P'E߸E٤Etq_ԜE[E6ME0rËyEdEuD*ŐD_EmE^l ņ]kEܺE5EnāwEVE E*'@76DEEiECq6 żc-EqoE,EJiĘgEE*6GEŀ!ߨE;E:D)kDȚEE2 IqEERJEĩnEkKEE'LD[EExB zZ3EE:vE,)3ElE?2AEmEPEPhDL)V~DE$EDEf %wEE&~E-4\aE=EDH(ŲhcDx@EEA Vt9EKE巜E;ĆEpE";E`Ô@XEEjD(WDdE׋EX=Œ|EExEMKa[EEfD|r)JyDEIEX8mW@?E"E:ܙE¼ĤE(E4EyŰBE'EERDc(ʼnEEE.jPExErEż8BĻE4#E N"ŐC E{EQDY%$EBEzEwNĀAE+E#qaE,ňECEND*DL E|E26+WEEEej ĺExEITE#,xCIJE,E\C$vErEܪEĉLEEZE O4*EE+D*D.EKEar?]Ez EŋExEfEE1%ID0EEC#źEEgAEr/ďEETEpnEn8E{D*mDLEEb8cE]EnEZ8xEETE1&ŖD[E EJCX"ū%E [EÙES,*EJ\ENEŜcwE"E7D )ŜQDEs޿EzR+ ӣiEbEGEıtHErE3 E&/DcEVEofCk +EVE(E$9E,EyIE7EEIDs)DRVEEd+Ŀ ҖoEEMZEҐ~sĵгEEEEl'ŬiFDEZEЁC0ӯ1EEzE ĞfEճEqCE2œ:EE=D;)DEE1> CyuEFsEZ0a UE*EDx(̼ZDEEEQBt<7EbE}EoČEE=EEEK֡EZEZ6EqdB+E yEȥYD(}DEEadĤ[EfEtE0T9?ĸE7EFdD)RDE\EX?fACEH|EEqģ^E4EV0EŴbCJ*EE8gED@o'xEEꭳEt/0EVEICoE *ʣE~GEzDş)ŸDКE>E<&0IE4ErEӮNEJEJ+E jC xE9GE.D*&Ŧx EEb%Ek :(ąoEEQiE$J ůxEJED)źsDEeE2ŐOEEEߦĩEEG%E!ЧCgEEMD&%xEE0E!:LEFEgcEk#>ZEED*DZ>E|UE6(bDQUE E~EO`bEZEET#/CEtEbD%E:uERëE2CKEvE\EŴiüjEEzD*DzDrEN E{:K[EEE.wEEEF$"CEEHC#řE/OEp E8ĻȎE|EVExïEEWLD*DTEE2|AaEOEՉE@i͛EE`E%"D!EE@C!"2#E[EoE覤ĦbļڑEܴEvQE9l( +E,ElD)gDESE  ŰgEHE3E@zqjEE) EFY&Ŭy(DE*E|WC )EEEIJx:ERREfoKEsŰS_EEDʯ)PGDEHE$% mEEREsZyĀE" E8)E.'Ŭ>D_E E,CnŤ/EbEA`E)`wEEuEE:XX.E~EvDV)ŀDh2EEP:jd sEE*E :ѓiĀ8EE;Er(Ŝ{SDEQEeBaC/5Ed.EjE6*#E@E'>E\iEԦEwD])|D E4EnBLJņxEE.}|EyWEEkXD)ŝ4jD>EE8TX7;EEE}ąÜEĎEw8E/bAEEx.aD (ŏ D)E羶EA^~EEvEŚ'Eo!ŨGC/ExED%ډEyEnuEpL\n%E-lEdEi ;MEBETD *IDElE HSEEE(raHEgE E9#ŴCvE EKDz%E)EEtNĮhE7E^E |֢EPED:*ōD@AE:ER%DYEE*EP-(ExEʲEm$*CUE0:EkCa$3 EEEΩĺhĊڍE?EXEŀ;E.0E[7D*ţĺDEzEx&_X|_EE E1֐ĩETE&E% DVoE,EC"~!EOE(E@İEEnSE/gEED *ɇDH8EiE$ Ġ `eE(E/Eb OCElE'E;&ł Dx:EEqMC[!ū'E4EE“EzE[kME@mâE.E8D})EcD^EEU hkEEJE ď!EpE& E&0O7DEծEUIC-EEHE FSEEHFE 8ŀ$EE]hD)Ş6D~EhqE3ĦJ ŝqEȸE%EXBƀo(gE.EE-(KD vEnEhBf,63EELEdΝEPLE@E;@"E,EDL)ŞDE\EfFVkvEEp~E*)Ţ]EE;D(nbDT"E\EKAD8=9EEӓE.FIJ؛EEM:E?@EEhD )ŸD>EEXıb|E2E5"yE wy?IE_;E#OD,(d{DEʈEO?EdE*E Ī֞E/gE8W5EB:E)EI%TD+'yE"&ETEhĴşE-F|,sE6C E. EÏłRQEE"oE\L3EEȫ"E"Ŭ0CEED%EEnE?ċE>IE`E*[ÞEED* D[E؈EXŊJWEEEvěvIE>EکE@$` C%EEJC6$\E:EتElĝߌE EZElÿeEGEpD%*_ķDrEET~]E dEE !&EE'EP$NqDE2EC#ŨEE|EC3REEkUE44[FE7tEjDm*D0E5EwĺcEE&%Ej$.轮EͿEE.%~D1EMECN!a%E2E|ԥEVİ̒ELEtOE ŘlîEED)PDE߿En, WiEE=E>ĸMQEEt E5'-D'EE ]C /.+EbE5E G0ij\EEFHE(?0Ez?E"DP*ō2DEh;E-% Ů(oEȭEsE}pu|EҋEeE'ԎDDFEELCx@1EZE1E"+'EsElBE:{KEeE᥃D)x"DKE\պEe@`Ũ uEE/E$.scE}E9D)(p[DE EOBKXE7EgE:yEĔEE{Eu0OϸEEf;D&(ŰsDGyE:E=E8EE7ā4TEBE V7E|jBpE4E[DH(3D|E(EcbT~ҠEFuE1b=>EvEND8)ŲgDEEz\CEھE5EqčEER1Eh%C{EEEDac'(EhEE˺t2ēEAE;oE *E>E.D*şD^E̳E`Ewş]IEEc,E:ïxE< Ej*E! cC6EEn,D=' E\EES+g4EjEhE2 IǿEDE]Dj*œDEBEFìzxPOE _E]E5ĄΧEFEZ[E,NEEboHEE:.EQ$ŀ^C6EBECr#˖EqE[EĀpE EMoWEhLd0EE7D*D UEENÎeaEEE7S^Ī߭EEO'E`%[D EEpPCv<" #E[ETEb:Q:ߑE|E mQEhŘ3E|E4ӟD0a*kDCkEbEħ{ ś=gEXEEF`ć.EE} ED&<&D̑EqE=zCc!))EnEΣEh=sEEJE\Ÿ [$EJED1*"[DEEE' ,mEE E$Z8{뻲EaEE{'7=DREԺEx.$Cť7/EEE`dz=EE DEm@éME8AEeE'E"qEH.EP3ErPBgEE]4LDj'zET0E\DEp] mYEEpE_y m2EveE^cD* )DEggE)/XGE!EE}VdĢ4EEE,Eʋ PFC,EE3DW'z EFE෱EJ(@/@E`EIjE ŸĘED.EDU*8D_E:E0{#SME>EMEDt&EE&E!ŘCʉE$EcDo&,E`>E1-E؉T#EoEzdE|:~ UEXEJD*`DE>E\}~ŐSEEE-Ģ_ħɧEEX1!E¸"$ CE0ME_ D$ŚEIeE׬EZ_ħoDEvEl\_EKŠ+ÕE%ED/*űDE}EudSYE5E4Ep7!;mEt6E"E#CEtE.EC#ŲEBE>EPs\ĤE1E[YE@,E(lE&D$*pػDpEEh#&_EV*$sDFE&̾E J/kEE`EĤVE1E4E,h'Ŵj5D(EjE@Cg <-ENE-EtGQERE"FE9#ØEEHD*KDLEnE$4ĆłqE E{_E[bmYEkEEj'8$NDEE Be3E9E0xE E#ENECP([EEh3Dv*DE\^EDA)CjEaErFEW"/TIEEW.EL;#EEWZEx%C˝EҢEEx5ijʄEEYEBX/M^E EVE0GyŠ2EĆEaE4grn!ŰeEOE6Eh0C(4ǵDփEED*ŒBDWEDElDާ&n CEUEZE3åEECE [{ΣEqEfoETĖ E|FE%~ġtEE7PEc FIEEbEĈc$EpEE oBʬ%DgcE΁Eqi.Db*)DhEyE Da)C(EfEEЩ"ŋ|1ٿEΥE,Egk6ĈE2E(tHD>DEEZyD6*MD>EQE8Dd'^1CEOE"E\O׷ExE@E rrEEB(0j.GEH EiE^,9EEQE}_z;OzEE ˞EI 2NEfEEIkp"EEQE&H$6DjEܥEDF*_DEfE!D)DECED}#D)EEE'E<4B%6EEPmSEEFV"ğE&ZE?~Ebj/~h!EIE]E ƬIČheE2EFE\św9E:E@غE츢þōa E#EECn(ŐuD`EExiD*K]DEE`Ek$ŔYDE,ED` *DzEEֆD)ŭ D/EV}E%D$ȜwϋEE{E*%E!fEE8QE8"^[EGEb}ES͈EEWE`xEPfEExEakv:EEMEMÜdEEk3Eecb~EEH"gEh0EE[ED>Ęn }EFAEFEul ŶQEʳEm߰E-_Ʉ%EdEEq\"0$mDjEED*)輜DEE^КDV)jD= E,ED^$(E6E.$E^Ť{NJEGEPE}s:ijE3E|EvWoEVE~E?{l,hE*EfEeĂŶD-E[EE@`tC'D%EE _D"* gDGsEEMD|'ŠCEE EnaƳEE/9E*p^#EhEeE*,N0EE(REijW~ENE-E^{rREE#PE<#Īk&EE(E0³#XDE9ED D7)uD1IE~,E!D**HDEKE[D%$E Em6#Ehz 2EsEh1OE% ME'E.zE?Yv!E&FeE57ĨsKiEEuE_iTe=E/Er)EFóvEHE6E(?`C'řDNE+DEYD*N?mDEX$E.DD#(ߔCE E/y EŅ=EqE8EBŴZrEEndEsoԔEE,E]6EiE @EleTEEEf(:Z(EEEhm#fDEE/D)9DEE*tD+*VFDSEEDH$ŀ_%EzEǸ!EŅ}}E8HEMEu dK>E^ EnYyE:ɊE FɑEyZjENEޥEњmEů?EdEE{HxE+EEKCD'Ŷ~D$E9EWzTDh*ŠrD7QEEYDH(żٞC?EKE EK #ðͻE,BE7EUVExECbEā8{EEiE:@ꌀEsEyE`Ē9pUE!*EE,rس)EFEEW#YGDCdEGE4C)ŔؤDEbECȒD@*"DuE,ED%@rAnEvE\ Em+ EE0xLES 8eE?EwEĄpEF4E63,Eȑ8C:')DK6EaESOD *>wD(EhED(lCEE& EJ -"bEE-5EFšQāESEaE3Ć"EESEl/E3EτEEb.WEVEE'1Ŋ+E[E`ENr #&DEEXC+)DyEEkCD1*Š'DEEjD^i%Š BF5E ?EE rEXEKE dW'EEZvErB4 EDF{rE*ĸmENEٟEu@AEExEk3E/{EvEd}$Cm&TDEEFJD*A}D1EVEeD(>C(EE7E ZB|EET4E0wMBE9EFJ`EJŗÖEESE@ĵEEXEGġ{XEvEE j5&~`},EEEIE{ ?ĦEEEuEģ|ƌEF"яE'cĸnE}oEE+z%'ICEtEݶEM+k@EEcEC?&DEwEDD*-DEED(ԼCkE nE;EV!%+nðyEEE2EQň=IĆ.EE\^ExnEnEQE0:ĢE\E˷E7ĜOŭYEAEWE~9.E-EzE*jp"EuVE+ECA)ŁD$GEE$D0e**2DE'EDC%ȕBCE3E(E~4̴EݟEJHET ōZĔ¡EERsE꼿rEdF0 E5mS^pEaE_Eu ~B FDE$EME4ÙlEEE`Bu&ZDDE E?D*Ź؃DU EdDE"D(4CEE(mE!ZJ EK^E1EňDEEӈ]EřĈ ErElPE}ıhij:EEL)EG|uK[EE跬E">L/E EEEΟEQEBC)DE>Eq&D w*".7DJEE*D&p׺BlErEE#owgEnEFE̬ JTcEޤErEQJE/F(E<qEEĢE FETEzE$YaEqOElEhBB&3DEϏEA:D*uDrzE{EMD)"pCEEF E!XoHE.E0ES2@~^E(E\E R=EEʟEuYgEE.kE67\EIE!E PBĐ0EME"iD^*Ŷh0EEf"P"èEUEl^-E:P8EETYEӓ:lEכEJEH̎ċBEkE$E~ؤĈav_E&EZEJ=3E4E=Eغue+!eE΂EE?Cȶ(-ȷDEpED*FD;EOE|D&ŤC[EEE OnE'EEBEpXźTxBE`E1nnESćEF$E.muEEE$,ĚE 2JEEiE22:!EEE;B%qDE5+Et*D@*ŏEDE E-Dp)ڗC|EDEDe"|8EE+Ež3ļ/ElEWE ;u~E(E4E,ĴDEEE4 `EAETEOł4EmE3EE ŭE~EM^E`C2(~UD5EExzDt* ALDNECgEDs&Ř,CE[^E.E (ÙEEjVAEXŞPtޤE3GEamE.SEaF:ԋE(_5wEEj?Eԭ KEEdEbj YſE(UE`EA>%DE+ED{%D&N*N-D'E8TESD)=$CEE,DO)#peŽE?E*E1L/4ĮE>EVErē?E}EEčOĩEnExڕEč]ś8bElE-EdSĂaJ6E&&EnERÎ |> EF E>E4ɤCbm(Ŵ@DEEuD*ŴZQDEEaD2'8F@CbEXEE}ŵK.AEŀE/?EsŽo|E ,EkE8|ċ_E2F*Eҗ:aĤxEdE墟E Đ MEa-EȲE( PH EE{E@u%ŪDUE=EM D3*ŚDXEEL£Dg)ŀ#DuE9EHDhv#ŀOE,E()E +wXEE5*UEׅAElE=EnġĴEE"EF/EGĚpܽcEǁE'EW}87E5SENEіz- ŀ EmE \EVC?(^D_E(E!GpDP*tVD&E@E6D)`'ű,TCEfE\EnC%ϸEME~>EKkEESjEėD EF1EyMľ4yEqEE{w E_e|Ej"ĮCEoE!BEү&ĖgEE:DEdĨ;EEExBEGE~EVyCD'%D EE a`D*Y]fDTEŘED'<ׇCfEE3ER}jEEET:EJn_6ESE(fE37EEE7{'Đ}E@EEV:pREEqE"8&EЋENTEE#EDE^E DB)^DM'ESED*IDEdE(EDZ$ESEGE0`EEE(QC7_'ŚD;EE%UD_*ŲpD5EVED&N(žBC#oE6_EZd E5 fcEOE77E1fVW$-E<~EncE*n+FEE:/E;8WEsEӛE.lJUUE&EFESs+bkS)E E"mE5EEnCN)^D"EfEE؝D]m*J0DEBEhKD%DOB EE@EnŊ  ELEإHE fфE1EPtEf:ī=EFXEZoE3EoE|ŝYDEEwE2'EEE{E CO~&"D*E$E@D*DEO]EشDT( CbEJ5EEǒ!H`Þ޽E~uEd1E@"FĆE.E=]E@o'IEEzE~ī2B\EEIE:AAjO0E7EXEd)K!B<EENE,C\)@DEETjE FDG{*:DܛEnE D I&|B'E|HEElMеEPEEE dĤEiEqEDĒEFE&ĸĴrEzE\QEjwo GE;rEYVERÿ7EAE=E)Bw&ŅDEx6Dp|*wDEEID&)ГC`EEEEU2"8;}EE~#/Eoż=ͬEjE&[E<ř*EE"EQcE ETEEU]E 4zErE_XEĕjEÒÉERhLEEE #^:ie`E?EwEJMyzw4EE׼E~ aEEUEaCB}(łDEW"E֒|Dڜ*ngJD=E߈EȓD$&Ŝ'CEMsEE2YÓEEAEP:uĢEKEomE0VXoENFE[ĐVZvEE.rE~Ğ M/KEEE_U ęA!EEFEe&EPB\%jDEE'DR*nDUEgElED)łCEE4D#GEPE0*Eű0EOEVE1Ő0ĥE€EEWĔjEE E maEWEEpQ?25EE|?E^  E E-EWqKE5ElEL*EfF \E6ļ!xEXEɟEy|: ܛLE%E5E7ĎYŧ| EEE@ZA%ňD;8E^eE!D<*ŮDmE5 EDD)ųDREVEDZh#P)EE)E^ņ",Č/EL&EUEGŢ,ķEdrENwE(h Į EEjEaě2cE Ez:E/VE;Q7E5GEEB.G ŷ* E>TEr}EƝCL(P)DEEEqDԫ*şTDE(EA-DuQ'4MCлEWEEYUhE^E>ETŗ3mEEjE 5Vȳĕ֑EFEPxyE E.Eof KMEKE]kE Ň!EYEE]$DFEĒD**CԕDpENEáD)rDEE2PDf#hFEVE%(EK'bïEE6TEŴRċUEgEpEođ·EEEݴkdEEҩE?Zl88E#vE2E2Ũ EEpEPyC$(DH-ESEFlD*\"ZDRExEaD 'H~bCCEyEZE2Ä9Es)EƆ=E8aMhE8E>WiEA F|EF E[ęEzE8,E\EzĐ łbOEtyEбEdR#EEE:$ũDEFqEZD*ŊyDG>E=E1Dl)ő D8JEٱED#Ř@EvE&Em#ĈgEESEJx3ĎEME(~E GVfEVEPE$o:ĵeEE E?^L :EEbE"PŨ E>E~EjC'zDEDgE;6gDg*^_D\EE(D',uCfElUE[E* $q1ƹEET>|E8EEwAhNPEE>E#r -$EEGLEoE~VàD0E6EHD1*ńD.EZEniDh$@|@[EҠE+!E\0'E~;EHME xĐ~E ExE9$ėE=F4EğpRwkE&E'3DYE]E8kRD*twtDE+EDf(ŝCE/Em ELy ŠÄ E%ES6E9TsEeErbEF1بsEEdzE6\ĩƀEEBE-]ŭGVEZ?E;E.ĩLMQ*Ee8E:E(8#DfE EC)D;E3ED:@*u$DEk ED@%AERdEEe ĆQEEEKE ōj,%EE`wEı.ȹEF6אE7lE>EEfns xAEӤEE4NE 3EE<+CB'D)@EEKD*yDEE D(jVC$EEE !RYuEEd4E PE/E`E*vHGEʹEE(_E1#DEwEC)DcEΫE?vD*$(DMEnEZkD%0BPEaEEM kdzEE+JEM şIąEoEPvE8~EUFQE0Č%dnE~E{Eُv,|BEkE\UEEvEECˆ&LDE[E+HD[*<DzE0E(Du(CEIEfE, tJEEG3E`JĺEIE_EWř(EEzE?XĦIEE:E xtdOYEԣEЭEJ76W-EEEm"EIE DEQ;EC!)۫D )E|E4یD%* /DIEFxE8Dt%ŐB EhENdEŶęYEDE(HE ŊİEEEPhtEN0ıEEE dEpIJSoESEE@|- CEE E֢>şpEEECz&IDE+ERAD*ŝƁDEXE:Da)bCH'E'EFE!$jÄEbE2EƽŭiH.JEE^ExŶãފEEKEh̵EEeUE#Iž6ZEEgEx<\I>.EE EO6"&EKEE8CZ|)RDHEE-D*Ŵ3DE ErD%B>EIE[E3-EEGE #E EsEэEFcE_s/Ī!qEE>E~ zEEXE2E2XeE;EE4ETB!&NDEOEv>DH*ŽyDVE2ESD(ŃC,EUE% E҆!VOtdEmE4<1ELB %E E*]EߠĞ{EtE`!E _F楃EEE0Z+Š\EEwE>b#G0E@E"ξEt@!<EEG;EhYCTt)KDnE:lEeqD"*p8D^EEC D|p& 4B:E4EE{~EEe EEEN\EEëE*Eī3ž1Ej'E=EDTs!sE,EVEC(DMNE#;ED.J*?DEwE&}D-&@ B E 7EEuëSEQE)!EE:9 >}dE4EpE”ă ē+E FEܾčGqE_D(zCExEVE"l)xEpELn.E`9oTE*E bZE}ĈEE΂EE*qEzE]BEPVuĜE|E)nEfA~SxE\FVVE(lL8ȥvEEEpĐ s KEEE$TEIE'rE+BB.%Ť DE&!Eoj)D*ODEѬEjDE)Ŷ6C*EOE'D"ŸNE;Et+E40ExxE,VE?ăEfE8EguEuEpEŬ#aE(8EVEQӣ~;5E$EREN  & EEĘC(#D1EE)wDJ*0;MD(Eb%E.>DK'ň90CE@"E;ZEküзEE+s@E`؊sPEzE1lEoސE`EvtE7}wEEEch KEE EdEOREIE`kAw%"DEJcE@^"DFx*n͑D4/EEˤD)C{ E&QEEGDt#pi*EJEEn<*EY*Ŵ~,ZETE@VEZLܫEEĀEāEEE6˨x cEgEZE%T@7EOET E$lÙ" E]ENE>C(~־DE}En@tDi*nTD3EE3hD'(LC¸EEArENſ=áEE?E$mom'ܥE@EckEjAĶճJƑELF E'][yE,E~EMe ME`E~E:.Z!EEYE~@$DEA-EKD)D6E|ErD) )D9EEHD#Ū=iEE'G(E u#*Z~ENEYTE&ųMEFEEvWZ(jEEZҔE]FNXcE|uE귨E1hZŦ7ERE8EМlK d EpEE沔Ck(FD0EE(mD;*ŕWDR ERmEݦD'4XCEEEv,X*E!E=E|ŒLkU:EKE#riE.,EE9E0Ēf6zEE$Ebv 6NE*HEEj@B"EEfED0$^DDEEDS)*D@E vE^D)Řo DKFEE=D”#]3EIEj'El ž#PEE:SEz%)iEwEL~EսĪVEFgEw;eEEVEw\e9E̾EEhâo E3EEC 'U:DE>EiDTq*q^DIEVE)DLj'sCSEE̚Ej˴ƹEh$E&E.EEOĦfELEEb8ŧ:EEEfîmEEE xCS!(DEwEzbD*PbDENE+4D(^JCEEREŠã EE:EŒbxEEXfE),mҀEhEƈE'ĞĀ }EEE(h4MREEEs%EVEE`VJ#ŠDEXED)ڍDEӰEDk)ŠD=EBEL>D $dk3E޲jiEEBEjďʝ=EJEE>î9mEEEZC'0tDiEEQ XD*žlD EE4D!d(C~EkE Ei: Ţ6.ELE7E UŮ=XBEEjxdE.êEbFE\JW;EލEQEnI?TE+EE|'Фů(EEEzZ#hwD1EE\Dq)D6E;EoD`)ŞD$EEDѰ$ŀ$@DYEE!E(EJbE{ME$ űzqE,EfyE2>ĜEFԑEdzf]g:kE =E}EH-m0{Ly?EiEתEØC[EEEkMC>',QDExE>TDm*d)tD{EWED(>СCEZEq EЌ ɅwEGE6E6ŠVLEREbEtI)ĬoEETĆEslEQEdlE`!__ŕUEEeE&.[d)EEE0##D?KE^EC)ŕDE1EڑD0*$"DfEREDk%qjA؞E+OEsE@%E/E} LE< ŐĆџEEwEčBČfEdEEΙM%lE!ELE?sĝg&a@Ev~EѷE nDEEE1CGG'őDEAELDNm*ūHyDE{ELD}H(C[AEE E]s ÆĔE"EM5EP`(E uE7aEtTEfEaE.vSeEEE E!"*FVWEzE0Et0ćō+EEEtuõ"*DEE2sCF)cD EEUMD *Ŝ,)DPEE.QDV+%Ű$B[fETEEű[ ݳE8EKE ŇăE. E>vE; wVEsF8~E@Ĉ nE,rEʭElLubŊABEXE7E0A;EyE̔E C'ID7E)EHD*J|D"EElD(;ACmEuE&EA!LؼEXE3E\MR~EE_EŨ0,EzEoEKiĴ؁EwE'Ey ^ rXE[EEv6qkc,EvEIпEP0"VEE"E.sC.)9DEWcE?DA*w,DpLEWEjD"%D#SBEEVESŭ|/EE@IE ŘĠEwEtEijELE3E$WnELEͣE{{\)XCE-EE"ÀŤEE-E8C\&DDE'E2EDXQ*DE EFDՌ(,C9EEEe$!Ph\EE92E"ŖG`EH3E^E.DWEJEE$BłEE™EHNZEGEPeE"9ĄI.EEEP(/"'=En|EELC~)DsE/ED,*3DE8ED %aBorE&E=E~BNBEE\HE( 썃EE"sE5 EF,E*ݺlZpEcE*Ej ŇDEEEGŸfE EpEBu&7D ,EE=D*;DE]ED5) C~EEE?!\xE:E1E+EĒEEj]EŘVĶEƘEEĘĒ.E|EyEܟăń;[EEEƬ?,ŪE/ETEEB^"Ŵ'E˅E!E>Ce)6DE܊EZDܸ*6DJD EOFtEZĺaňD^EVEٯDbJ>ȝE FET)_XDt%EE2DMEEFXؙE8RdĖ[CDƨEaE D8ŭ?ZE_ FE{i[GE. E E|[D:Q:!EFK?EnĂTNEEcE`DZ)5E F܁EtsĶEE5EqD D/ڭEE EdxnIsEkEscE(D~ ŧ9*~EFEd}żmEEDY"ĔMEE^EN- EEh`ED"o EE E͍>ŅEeEE dDI# 2٧ECEFFEd4ŁEFE[E-D}#)EEpEIP0E,EESDd#|bQEE/EHgE-EuLEPuDR$`T EdmEMԍEAvŁEHEsED$UÚϪESEEșlEnE_7ED$nÚEZIE1E<*đj0EE̯E=D:J%Ŵ%FE*%EXE IE.E/ED%>(Ew!ESEr~ EʑEݛED%-8cE{EE"@Ğs7L"EEE9âEENpE| ż-)EjEEDFE'aqhÉjExkEE'Ȯ Ű*EE=E䙓D|'ŨQ3EVEGɄEݰ> ń,E~$E´E]bD':Eo)EEl6IJz da.ExEED'S"E.EE:y" :20E@EEүD'( 3REtE JE1E*EE[Df(ŜErEiEZNF3EEgEJ(DK(0VɵEMEErćI5E?EEH{D(ʼnvEmExE7J] 7E>3E /E=,yD[)ŐW3D=*,CyEEynEAĄ?PHE&RE+E58DAT*4DDC.#EElEFİx IEE+E@1D o*Z^CӾESEcDkER>KE#EEP_+Dx*ŌtC[E+EiE?ĨĎlMEEIER$D*joC%EEgELēQ,OEHgEED:*Ų͓CErEd/fE(PEBE E:Dj*cCcEwEzdEJ9RE%EnUED*OWC7E CESbE"ĘĒJTE@mEtEƽE8CU*b;DXxEE[GEg!;oE/E"ERC00*[BDEZEpEEn1Z2qEEOhEC*eHDpEeECEڿŒ4rET6ENEB)ND~WEFE;BEœtE*iEEB)ZYUDnE1Ex@EraAkXvEʏEfQEExB)D[DrEE>E!*4xE6EEB)bD] EyQE`=EQٽyEEEcAch)PhDEElD;E~i{EEB@E61)YVoD,bEE9EwX}E5EIEq)vDE6PE7EE\ EĒ~ExkEHжE xb|(ň|D.E E.6EN _ĸ5EE-%ETVl((D/EѩEIc4EŔ EE_Ez(~ۄDEZEk2E3͸yEE9E(BG(vD;EE0Egr vyEE"E(bDZEE//ED% @SE E7EDf.'ÎD9mETEl-E -dZE<9EE7nFý'űDlEE+E Ōѯİ6EaEIƱE\(o'iDEɣE)*ETR ŒSEEE t8'ŨDQE2EpL(E )DaۆEESE 0Q&DEEf&E łѮEE E&PDn3EE$E pŦ{EEۮE6/K&BDE~E-#EWQ\EE#E&.D-XE Eg!E EE%eET޳$%űWDzEZEšEq%S EU!EEéj%ŕD[oEEEq]ċŋE$x'D2EaEEj纓EEE#żvDDEEVEMŦtP֏E3E,Edqt#Dy(E2EEņhuEE(E~j ă"ŊDENE2E8 kJEEߥEL"DP*EWEjE^E`E%EF[ĕ!ŃbDEE( EFVŲ#EEXEF!D)EtEI EņĊE-EЛE"/!+DE EL EfhőyEEUբE '_ D&EɘE7E 7{PTEFE+-ČH H DE3EOE&UvE( FKE2haLDR%E E.&EaqTE;FҀE8]ʼnDEDEHoE,ZkEFŸE88=(Ť/DE4EIE^fĺuE FCEBMD!En[EXD.6arNEF-EtG4DEED̲\E F~cER1MblD'EsEDۖř)XFEFvEnoRŰD2 EEDpRĆETF֛EPyWt6DwEWE(=DLXoEFER\-%ƵDEEDذGČ8EFCETaC"D\EEoDY`>BIJE FdE\f'EEEfDy<ĢʟEeFElvEFPEƤEDw$7TEF=ܗE~SqŶ8EEE0DņG2ETEFM E'vrŠE7EߩE(DZ J,E-FJEd_{uŀEE'ED Ōu'*ݢE'ErEB/k ^ EUEED9#!"vEEEmĪ E|E$ED!ŐĿ^EEדE9/ĤCJ EEE=D!Fn/EfENEĖ sES`E&EQD'R"ķEܰEAE'M9:EfELEvD" 6 ĥETEnEŶEH:EE"D #oE.EE ĐءE˓EVED#ŵ!p9E{EҏE}JxrE EETCDu#[EEE|E[Dy) |BXEE0CvE%]*@EE9EITD)|BEhEtEIJNBEKEQEND*Š%BxE=5EhrE3Z>CEUEEHHD'*>T CjEjE%qE+׷SEEoEEAD2*Ч C&EZEoEf@IĨhGE5!EqEY2;DXT*p]9CͽEEWmECUL2IEvEE*4De*ŐKRCćEnsE%lE%YxQJEE:E4g.Dv*iCo*E-ELsjE{LEEE'D*ChEsE>hEY,2WNEPEE!D*ߍCEE gEPIdČPEEIE:D*&C9EEKeEXG@ĕQEEضE!D*hCEhEUcE)`NSE EE DL*ŏCLE'EaE-ē9UE\E!cE,D*dC$+~iE(EqEsC@a*:+DEMEKE6ĐTkEhREKʾE\Cs*C2DEE:IEij9ĊmE4EECCJW*ڠ8D5EKKEAHEJnE7EvEh+CF>*>DE~EVFE %bpEEzEzC*ZEDnESEDE=ŏW82rEG'EcEpSB}*ňKD"EdECE0jĐsExIEXE'B)ŜfRDڥE EOAEmkĜuE*EӭEԒB)3XDDEEH?Ej7wEEEتGB)Ŏ[_DEqE=E;Š@xEUE$DSEEEc<*EEMEDÿ#DE*ErEe ,zE`E~EZ}#MD?dEEobEwŦLEMEʧE1=G#HD3E|eETEG{ĎEQEEB 3"D gE.EtEwİEpEcGEtp"DEDEUEJJEfőQEEE("DT]ESE q EYRĨEEEl!0FDEEv EKěYE EEĵ[!Ŝ{DdEB?EH E*UĆ!EE}'E6>%O NDExEYEe}EFqE*Ķ~ }AD5eEfEEPŏxĹEFᠡER 0W |DEEE$ŰJsĥE5 FEV5Ĭ:DkEWE:EVbnOEFE:8ӎDEEykED(Liİ"EFIEʿ?~šDeEǡEDwŃciܙEF؏E07EA+DEEi.D ^KE FŝEJDcXEhE:D:|YvEFE~OSJ-DjE14ELDӁTwBE6 F+EUņD`DE~EDn_:]OLEFUkE >Z_WDEpMEBwD';JIJҝEFE~u_tDpDZ'E2EDEQŋDzEF<ΙEwdĨ^DE`VEDŔP? ]E| F EoiňEeETE>D;ŸA:-0EiF>Eo#FX]EvEaEDɘŎ5E FOuEsg+(EgEEbD! ō^/EFREx'C/E+BEoE`Dz ŕ+*EeFוE}ħŊEUEFEȮDQ ů$Uηo1E4EsELDRm(&EEiE$R)D3E$EJhEDf(Ũ>յExEEw5ąxZ\5EEEDE(J »EjElE[Ĕ#7E9E&EXxD(PM,DEEUE}E6o<8EތEE8brD>))ŐE E|E*:*:EEE6kDI)<@dEEYzEĘZ4SD>*Ŏ-ĊEPEnEEģZHERE&E8D]*xpFC(EEKlEmkhĘJEEvE1Dv*bK^CEJE68kEpzKEESE*D%z*vC E`!EZiETMrMEEEE6$D*CQ+EUE"gEEcAEQbE?ĪeTE@ExE- D?*gCIEE E aEF# VEtEEDD.*CEE H_E /WEKEpEC*(C7EpE]Et9YEjEEPC*z>CELE[EĻ3:[E{BEqEC*LCEE,@ZEusā\EhE/vE,C<*ŚC,+EEXE|Ĵ^EۨE]E1"CM*oDEkEVE"${q`ERE)EC*řD;hE[E|UEnn/bEExuE,C*5)DE ELSEĶcEmEE81C*QxDEEQEĥJneEЕE(EC*ADyXE~EOEÙ5gE)EOpECݚ*A"DTE"JE\4NEkX$ hEdEӿEtCJ*ŶW(DE8EfwLE6jES0E E;gCDt*.DGFE"E/JEěDE+,6xEEˡE &B>)ŖbDj"EEgEȴE]ñd'ݞDEE *Eo V=xEފE( E&"vG 'bD#E*El>(E7 Ū71E}Er_Eý&g9DqEEn&E ŲѨSEEEߏ&DEħE$PDE^EEŠE EE/#ŞDEEA:E<\żLEEl"Eh#DEE'uE:ĎE?EVE#0fDV-EK-EdEՒG|EEbEB e"ŤDɦE>EE-ż4VETERۥEsH"SaVEoF'EK8HŠD"E0ESD$Ť\ċE F]E/aM՛ōDEtED'|VĿEdFCER*&DEEUDFHRwE?FXΛEܽW1^eD|EyEfDؗLkvE_ FEN\MDErEڦDnSGįFEFf5EbąŬGD'eEELDѝŚBEt F_EWgEEPEDŜ<5ӟEFFE}lgxEYE EkDi7ۘEFg֗E݆q_PEKEmE,D 2Ĉ[Ex FEJQv_%E\EE=EE$ D-#Ţ@rE EE*7EENE-D#&DEYEJΏE)0EDEE4D\#EEE0})(EK E?eEgDy%vÆE#EME].EaEEK Dy%+CEFEEVIJ!E9EMEfD%e=EEBE{āŁS#EEE[DW&ɋEEn_EЦcű%EEjEL-D& ;ETEKEJ| &EEnED&'VuExE6EĘ Ůx(E@EEpHD''Ŵr)Ev}EaEa:= ~1*EKE7EcDe'Ţo[êڱE]EEī +EE6EDܡ'*DòE3EHEY= o-E`EbEZD's-SEd!ExE_ d/EEE@D (žtEEuEN\X U1EE"'ERD\Z(+ɴE8E\сEP~ű2ElkEEUDp(DyEEEÝ4EE ED6(t4E EE;\6E#E-yEl|Dw )JnE[E ~Eꌿ`Jų8EUEjEnuuD)Ő8E2E|EУ~9E'EJEnDT2)TE EFC{Edz;EEwElhDq)xpADEEzyE 9=E^Em EaDq)Š'B8EǾE_wE6Ħi>EENEHU[D)~B kEE1vE2īR@E*EEE`TD")\BE(fEF`tE1`brBEPE=EExND*BEE;ErEl\)ŰCEFEENGD*ź CEED*ŷCFEEhE~BeEnliQEE;EYD8*bCEdEscE20SEH EEr9Dp*ŧCE(EaE jĘHUEfEwEYDI*PCFEnEG"`EXWEE:ED*9ACdEEl^ECXEEfENC0*ſ0C@E3rE \EFĜr2uZE'ERtE$CM*ŠCX+E4EZE\EjYEECN*CEEyDYEHP]EE$EtC* CRE@E|WEdđ_EEyECM*DVEIsEUE5ĖXCaEErE\C*ZW DE72E2TEU?ĎTbEcTE&E_C*DsE;ERE~:D8dE݄EkE#CM*dD{EExPE`fEEE"}Cӣ*Œ@DhE%dENEPgE%EEACX*%DcZEvE`FMEvT iE|(EYtErCyt*t+DDE~EhKEĦ+s{kENEʾE\[Cv*Ŭ2D}EEIEF2)mE6ENE{BC0i*>8D8>E'IE4HEzĤFnENEkE@@*C1*>DKEEtFE!'ČĕpEEEL4C*'EDuEEDEBŤĔJrEX&EEBz*(LDE=zEBEHYsEwFERE sB)̵RDE4Ec8AEƢuEE-EpB)cXDpIEEP{?EgS>@wEEE(BB)>_D~E8oE=EIAxEE4E`A)ŐVfD+E'E2I)hnlDE&EW:EAXk@`|EEEd)&ArDEcET8E<ġ}ED;EyE'ErB1DEfE$Eæ1$ nDEEqE"O(#kEkE`E?Ĉ#XD=GEEEk>EEEHĹ#dbDYEhBEZEEDEͦE _!#ܝDREտE)E)5űqՑEFE EP"DEdjEE\2^ɨEE<]E zi"D8E9E E#Ŕ9EF|ʤEҘr!DEVE E g5)uEFEe Ĕ!bDmE=SEZ= EŒMEFBE2$ pD>EEE>Es,c| EFE)ĴG ŝDE5EEŞ>wٖEF}EBC/YŵhDEE.EQqE(FSEb4 BnDEE.EZeEŌrm0E.F3E9pLDE_*EɒE`)h EE|!FXE:>İ۶DEE E]AȇbHE`'FEbDſD/EErD*/Ś_XEEE K ŊyDE|E/`b8DVEEn0DhE[E$FEe|BD4Ex1ED$(n?AEF0Esj(Ő`EjEED!;{EoEE vp}*7EpsECE`Dŏ6ĩExEPEҁsXu,bEXEhED5Ŵ'.AܡE FE8xWŵ$EEnvEcD[T ŕ(uEHF EB}YE.EEqD #ĥhENF"E5 E;EGwE`Dn&T1zÄE#E0zEġ[ 0)E/EED 'avEE2Erĝ Z+EE1EE:D8M'2IeE6oEՄEҰ ~-ERE EI|Dp'h5ÿE9EE5 Ŝ.E6E0ED'.ҳE91EElׂ P0E1EEED (ŐyEaEQETy2EpE?EDè(,9EEZ7Eĥpŋ3EpE8E9D(DEZEjjEzq55ElEE~DJ)™bELE4E 6EUEEwD?)&6[)E]/Eg}E!-8ErErEDqD\)ٹٷEE{EJ-dŘo:EEE jD@)?EEzE5;Ԝ28D)Ŧ2CEEnEjnHEvE2;E:8D&*KC~MEEPmENJEXEENW2D,;*0UcC> EaEnkEFć*LEEEw+D0*ż*{CWE@EiE}ME9E_EY%D]k*-CJEEPgEĽOE™EE@RD*(C|E`EvmfE^?ď PEPEeEDz*LC nE1SEdEę(ĖRE@E*ETD*ţ«C&E'EZbEJčHTE%EE D+CEE٭`EwUE_EED+x}C|EßEF_E±ļWE,EMEnC&*kC!EqEeA]EyaYEEEC"+6CEk2E]w[EBTĦ^ [ET(EEC1+ CLpEE.YEgAĶ\EgEKE,CA +CEEp.XE?8İ9Ĕ^ĖEhEBC* DĘEVESJ`EE=EC*H DNEqEA:UEYHUTXbEJEECCI*kD%GEI$ESEĤ_4"dE EECxj*DEEFQE$?VeE2E>E_CXt*#D\}E!EOEijP|gEEETMCm*+#D-EhEpgNEl:]ĬiE7EE~{C`?*ƈ)DE] E0LEH jEEsFtwE%ETsEB)BbDE/E\-EͻKEd EfEþ%źD<]EE<E a`Eo#EzErÁ@%ڨDEXEEŦJĿEH EE$[@DiEQE)Em>EEyE7$zD-EEERxr hEEwE#rDErE(EXźCIEElEW0z#Ū@DGEEoE϶EòE9E 3#DE-EEE9E-EjE3Ĵ"s0DbPE*GE Ek蘋E EHE) Z"z>DPEkEjFEŘb5E!EE!ŤDwTEvEmEkŹvSEF/EӛK!^DLE; E E*Ů?EF\TEgE!XvDgEKvEj E2!-E#E`gE#FU!ūDEEzEɵ~JrE]EΡE&)ć ?rD: EpE E~Cš{&DEEСEdu.Ĥ 2D3EE|E-ŞXvĦEEEF04h fDEEEEwoqąEEPE9@DѐEk(EE2ŨlXEXEEy>HŚ+DEֳEAE}ŮgdaEFECScDE(EBPD#qa=EFEעIF#,D EmEDW]m]EECElO)D:E^E4D7u+UĺEI%FoE5Q D;EED DPҜEE&FE3WĒR4DEE8zD`ovKĘEF(E|\x2D#E+ED,FnE$FOEafDEEDg@!EFrEqfr$EEEVTD<x;;ġEF˾Ekl 3EEsE"D*Ź6ĠEbFEGpĔşE E9Ef+D0{EF9E:juRCgEdEVE-Dz> ł*0E%F Ec|Ă.ŁEOEDED!^'ħբEE BE>G ESE||EDb!ӳ">EE{EnaĎŞ EpbEED!FķOEE|EAu EEnEzD&M"Œė!EEE!Ė8REKEED#"IĈEEEYŦ/EErE=jD"Z IJEE0E1)E!EEaDBu#ѮIJXEEoEŏ}ŽtE̊EXEoD#/EeEEk/hŎ[EEE7Dw#Ňà1EEE p[ŎEVEEZ)D#łzߩEeE 8EVĀGEEu EEݶD-I$ųïEEwE2 gEiEE{hD$8ÍhE?`EE̚{vQEEELD$5*E]E-EN ĮE1E}EDN%5جEIE8E4İŏ E"EEqpD%ŦEE+E? l!EEqgED%0[kEEzWE v#E.;EEND7"&ŰEXEirE]ţS%EZEO,E۟D}& ÏEEsE`Ʃĵ Œ&E,EyEDD'׆ÂLEoE(ESĬ2 ŜT(EaEEEܦD ( 0]CEEJE*] ŀM/EÈEEDb( wE(E eEj@i Ŵ0EEEp^DE(,sžEEEŹ2Ŋ2EQEY{ED("“mE|EҀE˻U}4EzEED}(ZXEME01E߼Ž6E7EaE|D«(ŠfF,EEp~EWJ8EЀE1ExBvD(@ZKƷEOE,}ESĮ2:EEgEc`oD(?}E-8Ec{EG{;E E2EMhDF1)mAEE8yE:y B=EEEbD`)Š=BEExEJū&?E9EE \DVk)&BDECE|evE9)AEEEUD)~BEEEtEMŊBE(oE!`EsOD)BrED[ErE C 8DEbE;}EpFD>]* 7CgEEIpE\FɬEEEpE?Dab*XC(EӶEoEul"jGElECE9Dڝ*7CcE}EQmEOVāIEB^EEhU3Dg*ŐPC-zEPEAkEĦJEEEP,D*jgC#EI E jE; HLEEnhE%D* CпE|E+hEċMNE3EXE 5 D*ŸۍC=jEEYfEĵĒOE{EEuD*Ũ"C0E?_ELdE3\QEͽEuEmD*`ƤCE`=E9cE SER6EEEDH*tPC4E=EVaE~ĜPĻUEE1lED*X=CiEh EW`E=jIWEEEOD҇*C EXE^ExP6YE E)E1(Co*tCE[E\EZĤĶZEtFEIECЭ*TCNEUE\*[EpĸP\EK~E@E4Cʣ*wCEE~YEzhč0^E˽EOBE8Cq*tDcEaEWE&fĢ_E@EECY*ŔvD;EEUEr KġaEAEDEYnC*ljDCEESEěDbE01EE8C+bD[VEEa"RE(fĩdE[E`KE'C* 3DEDEhUPE4z=fEEECC*ΘDE,EE4NEzĚjgEEERC3*$DEE@ELEHĉ`ĕiE"EOEmC*Ő +DE|Ez8KEF`RVkE0E쟾EVCն*1DkEnE^IE&-jlEyEܽE[?C*Ş8D E $EGE)5Ā@ľnEEAEd$Ce*ŭ >DE EFEĂvpE EbE%C/)ŊGDEFEDE(,okrELE8#EB)mMD.EG|E"CEŲ@+tEpE|_EBs(ɛOD"5EEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-15000.ark000066400000000000000000000725051376444676100257370ustar00rootroot00000000000000my_id BFM LEԫEߢ};0(XC꫸EE{ՕE-/m%qDIEEEĮDO8EEC_E\Ĉ~* EPEEP67EV̅42ErEE&E ţYEsEE,DMhEE|*ED$L@+yEEEb)C)~øEFEEI±*ŮC喝E\EUE|h<&=]DcAEEE]%plDuEƣE}dEEEEEJDEGE@GEL-XH"EE@EE1*OJE?EeEDš|qE»E?EǠD8U!Ŵo%ExEu EI*D(ECE2E8cB*Ű8BEzEHcEX}(dO#D]EշE EJi!ZD E EsExgŗD6EqAE!LEo)EEFrE/p$EcLDDEEoTE(DtlEzEƧEDv< f~ĬE=EEg>Dޮ';*EƜE Eg1C*ŀw@ܭE FhEø?)aD)EEhEYĿ"7DIE\ExE$ɥĤVlDE_SEwQEtEEDE|)E6d?EEj E!E]ļ(;gEELE$Dʯ\#EdEwE SQD"'͙E&wELEz[~C*НElF E(b<)BCL4EЕEEIĞ!$ŬDHEoE}E(>CD.EJEYVE2e EEoE.Ehu:EEhEEx+SSbE3lE0EUD=aqĥE7EE-eD1$&.%hE-EbEUC*l ËME!FEa*ŨCwEEKEq9%~DE7E|EĚŞD;E2EP[EJT Fz E JE@E3E3n[`5E!tE E@ E 0\E ZEEfD׌E/_EP E+yDq%e6 EEEvC *CRWEF,EԙBv*CEp5E@E))m&iiDvmEE)EEvńD E&E" aEľK2E1EWEc9Eĸu0E&EXEMEt ŻĊWEțE#EDWKD~EKErEkDO$EİEEuEȗC&)](zEuFEس*{C&ELE#EV&VDEmEJEⓈRdD}EE3fE8ĩ}œEWEqE^>Efg*EEjEE~ .ľREuE!ED`GzEE ERED_R#&İE-EE%mDR%š5,^EEH1EɂCJ*%ÇuEvF\E^;J`W*ŎC1IEE[ErY3ď\%žuDE|HEXE:*DۮEE]EZS EqEVE6EfĽS3EEE/EH #Ġ [E)EEbD;ų{YEEE,DD$<ĎEE1oE^C*oEFCEêq*ŹC,E(:D?EEE{A saD0DE EmE?8D@EEEEm#E(ELEENlΆKEd$E?xERDU˭IJrE EbhED!kFE.yEE~%D(ň0EJEkqEB*^B)EaEEʣj{(Z'DEEaEPm}!@[DEE<{rEċ ź0DCEEJE_eE*EVEaE#EŦ{Ē-FEEEDOŴ\mE>*E#EHCDby Ű/{f6E+E*E9D#'!ĴEE}Es!C*PrAqEFFEo :)a D1EoEdE]\̫"A*DEבEplwE TcD%E$EWPE~QEcE>Eh(E<UĩAEEjE,EVhĄhEgbENEDŐEE&ELDW'*Ļ_EEƴECmC|*( SEOF`Etï)dDvEffE[E~ NO#DE ^Eֵ|Eċ|ԅD>EE;UE ŒE/"EE(-EĈĎ;EEEEdnӆKqcEEEҼD4)$E=EРED%aD f&Ů! Ex(E׶EΚC+*ŪŽE$F5E s*9C\EE^ȓE,=Đ$ȓĵEdgEE{E"tD%2NEE-!ECG*WCJwEk F%ES-HZ*ƻC|EkE=;E5o-N%ynD8EjESaEߠ_DEE_E-Dx ENE)E!H8EIJXĵ,1EiEE9E: 4h3YEE%EoD-UĺEE{ESD$ŲAĘ EEVEoC)ŌăÌGEFEV*EC3E@EBE@&ZDJE@2EEǦ%D@EE eEĉ ő0EETE=Evĭ>,E LEžEcEy ;VSEqEEȡDfd"ċ/{El#EYEv D#d`RęEbPEPED~m)FܢEEE*ŚVC4EE EFs Ӆ'FDEE`El ίDhEEiE6Ĩ/EV|EE}ErPκfE)EnED'ĚE`Ej`ETD&fChE[EE.CB*xj.OEDFEZA)CȻEoEn8EeGj=$ DeEuE|~EgV DE}EdWEGFć žEsE Ewz/E' E9EςEEENOWaE"EHOENDŀ1ĕ=EEb_EhgDl%&NK( E+EƷEQCa*0E FJEYwJ*T%CȹEEƔEY6ĩ]%ڽzD_EJ-EbƁEXCNivDE,TE\Ep o E E^E#4E94ET$EhE E ܘYe\EcEB0ENDڥ E($Eq?E|D~$%67ēEEԹE>CLR*Ŏ\ũEx!FE]? {*>C|E@EbEBS']&TgDVEvE mEE3k˿DIE+EbErżzEטEuE9EʑhĂR/E^EnEaNEAl ŮrVE:KEE4D ຝ9W~EEv;E DK$ŶHľEP}E@EC*)ŀs@VE.F-SEHG*ŏC&ExEE&ŖRD.EQEbʆERoĬQDFE27E2 gEjp1EGEEa?Ev *EEEPEU KQEEE DnV!ćyEGEED#NXŏE"EE DSZ) G EzF৭E|*T9C^6EEۛEċ'_R@DKE+EDYE~C6 D٫DE EkE܃&FDEռE"|DE^D$EoEtEPETLEIEED¥rĵAtE>5EuED!"h1EHEJEq!DL(EE<ʯE*B+9BEEYEqna(#,D*EOESɋEq34!aDEE8qEدĮŖDXEEIE/ʐE"EE!EŠ#ďGEAeEnEjDfnENEED vȊESE,'E 4D+C(& =EEEC*BڮEE~E{&(:DOEErEaV?"IDqEbEG,vEľUטD/kEnEHNE-ĮNEEE/'E6.BE:0E;)E܌D.iEİEfEpDvŀ^i,EE8En,HDP' 4E.EMEWC!*ء»E FEl)TDSER9EFE3RĖ# DRE:FE{EE`, DEE$TE|NJ' ţ0E>pEOEcY,E$Ąk)=E0E1EE &>dEŪEF@EEDťҊمE9EQ=E"[D&Ũ[xE@ELeEԒC*REFHE**5CGEE.E$@$ŏhDBEE?2EКKD'ExEkYEEĕ żEoELE1EH"7EE?E E_E+Ed$ED >db*E4~ETEKoD%Ш-E#E荸EC*B:1E&FsEm*E]CEEEP1%szsD}EEӂE{NUQDbCEEv^E:Ī EEVE\6EEc2EJEWEED 6t9ZEEED16TEE E_ D$ތ>ĐE EECu)[wإEFE?ۀ*AC˶EPEE\Z j&jO_DhEE9EMDVE9EtcET]ŗcEE`E DVEEeE8}řEOEyEk>E7v6+EEEE źl:SEPEEDċUzE EEJD,L#ŋjT7E"E}E D~)ÅEF"Eze*ŴICBE~EZE fo'vDDEËE8ż D;ERE:jE! GŁuDNEgE*CEęŭ=&E$ER4E^Ef$ĨMEʉEfEDD*:uEbE=nEGՙD"McLEEğElD(\>&EXE@E?KBA*C[űENEE+#(s/DE'EnvE{t. D_E~EoEc=w2D.qEEHET4 E#eESEd EnrHEE]EDQ~pEVEOE٣D. Ŝs$SEIEE/DP(ŠLJEE7EBg*hWB OEEE,Æ(~DE/EEkd5a",DE@SEuEbeRDB#DE Eb zEičŢDEE!SEX JEEEA+EnFŦW>EwE|}EaEyվQeEEEHDDLWESEE+WD.&dEsEEC*Ūd\ҪEFE=U)C/EEE}|Ef$ŹDE.EzREaIIŚZD4gEE}WEL śMEQEeEAd0Eı8E'EE}E3z`EF=ErEXD-_ėEE%E_kDp%T9*BEEEA CP*ũ#ñƨEKFSE.RÄ)ӟCy_EE]E 5I%-xDNE^E"7EsĂD̿E0~Em]E"" E#EdE5E7+(į3EP(E/yE\ EwW ^[E$EHE?sDQ 8YE"EE~D%;*@E EC9EΈC)^!g?E FREs*tC^REVEiEN$)k&"dDAEElEēL7DE\EؓbELĆ E"~EE+;EıZw.EEEE ś 3VE:E1E}Dijsԇ}E]EqEOZDX# JőEE)E/CP)/"E *FE+x¨*XxC,E^EyיE,*į'8PDH EOE;EhWjDU;E;EgE5ľŨExEEq?E(,+\)EEOENEaPE(EEXD?%Ŝӥ}xEEZEDj#qZDEEUECDp)$JEEE @*8M-C EElE|ij'Ť<DڠEEqE,ЮżaDEEExJEEEE"E)4ĐFE EEFDŔSnEITEEDӄ $(zĆWEsE fE߹7D'WE!EZPEC0+Ű7A>E Fe El)D׾EEjE;N_Ĉ"DGE͗EKwEIňhDz"EE,OEoi7PEDE5BE'EϲAEEEEGҺiE[EĶE;ñDPۇEREZEOLDF'1ėE|EE4eC*<1(AEF OE)DD2ElE/EN#ţDE2E8|EDڠhPnDE8 E\TE,C tOE-E E8-EEEz6EXHEɶE2CH*żEFåEy)5CEE{ED>$pDIEE'E0tf0@DEUEZEo(} EE$Eȃ2EĴM6ExEtE E{^EEBED:VĊE+rE^E sD%|0GEhEҸE˽C6*Rf:dEFmE5úq*ŃCQEiE Ey.|%Z pDEwEE|Ŵ-D3EE$j_E88 EJE E87E̩1EEEŘEM u3ĢYEEvEn}D& IJHEVE1E4D$ů*@NEEEoFEJD#ń/QϐE5E<EUDp)*~$E FEL*Ŋ[CLEE,EC ĺR'dHD#EfEEYXl:ٰD3EuE2iEƹĤíEETE1ë0) D!3E-EEX"|,D EExE)ҀrD ~E;EQE0h FEE{E)Ee`'?EEEE'jBĻ$gEm,E7EֵDџT[ESEE*QRD'ļE$EuEـC*ŀ²aE F;@Em"8)TC(E}EbEIM$lfDuDE-E)~EdyDE$?ENVELD-V !]EEE?/EM6Ĥ:EEqE^EąaE:El:EnD=žbEEMEkfD&'Ģ-E-ExE|C*A. &En&FE]\Ye*DSCԹEE}EF8Ĕ%š|DfVEhEAE\rĬoDoUEFEpe\E!Ċx < E0E\E e4Ehĉ5E=jE E E S+ĩ\E/iEE]DW$r݁E 1E6 EyDN%'6ޔExEE=C]9*u-X|ɦEQ FԨEYþ\*ŊC ۷E'EE$ )H&^UhDcqEtE8+E}ĮD~^EE-aEjĿńEE1Eq9EĠ6/E:EtEE  ĺWEEQEɈDp_ij~E8EfErDC$FTPEkExE`C)[A³EFIE¢*ƏCΪE5OE`^E&UDbEllE$EYSD*EZ5EzgfE|nĻŲEEE>E{Huͪ*EEHE E }MREvEKE5DQqňByEE4EΐDmN#Ŝ WE^6EE DH)ŝDZ\"EtEzRE*BCՁEtEE.?':AD"gEEd"EJs2D3EEkE!ADEVEDDE<%EE6EE- ĐVMEWvE4 ḘDŀ̫ĺtE,EDEy'D !}fĚcEnEͿED)"o֟EzF/EB(B+XB&EE^E5(X-D%EhREE2-s` !D?E7EpE 4ֱDEvE1IE!aŀ El]EE!EB|NGE-\EzEjD_ĢooE|EED vYESEFEU3D(ItELE˱EbC* {6Bx'EXFEN7(D]EEE 1bIJG"D?EnEuEKRnŊDEiENEѵwEEE&EjgĈBE}EE&D6N|jEENREꑯDwAЂEaEE~EDh'v DEE 1EtRC*DŬEE:Ei)űHDGEiE[yEjQ#żDLE6EzE6mĭ ŃDE ESE ŘEEIE,ErY=E\#EEE|2eEE5EtDaBeĺEn${<ąޓEܫEsE{C*ůsENFکE<&|*:C{E*E̗E_("d&aDȩEE EƭPD|E)EaEcEεrh6E#EE;E 6l<-EE EEV ŖĿaUElE97E)DsŖ"|EUEEwD#~&N*E7TE#E{AD`)|ܙEFEpQ6+hrCôEE/E8͸'ZvMDEv}EЍEFĞ#DE`E.khE7CEEE@Eut(EJEVE/EJNPE*,EEWDŊbTwE|EEDR"Ff\ĊEEED_P)ʼnSNE;FsKEEEME`B*OEî(&8&DEvE}E3lă!"DxEE1rEEBQDEFEPKE)z@@.EPER E^X#E;FE&En1EPDPqNJmEE8EDF t{jEE/E9DV'żgEE²EL&C*Ar"EETFE೽ëM)DED)Ex E[ā"ZDuEE^wEަIJZD.E8EPE6ĸBEEEE Cx*L\EO F; E s)CoEE`E<<$SaDEEEBĈ@^)DiE-EZEW ~EEE3E+ī<66EvEEyN E]EEE6@DSŃ2[E[E ER7uD`%Ř-3EENELCs*3FdfEF\E'S*ͳC|ſ,DGEME|eE-ԿcE{E{.EӴ=EzvJĸ+EEEHuE; ΘBSEE[ED2zEQE[E D#2R*tElE|EZ]Dm)ŘÿEFE}>*RC0EكE#E D'EDE;EĠE6pĊőDAEŘEIjE4#DvE/pEBE`c&EEEE6ŮLNEfEhtE$Db摩uE9E[E)D's"ybĞEE\ED(^ÌEnEn1Eȍ/B*<CݱEMELExâ(?Y2DAE9E3E*huij!:|DEEsyoEJ=v0DcEnEHE4ħ/A!EE5EV EHb~HEE EzDr~l]{pEEhEEmD!Ŏ'q[E|E"Et.DYf(üEEKEBW*~BEE@E.ð(<DEEUE*e\"3DE4%EtE\D?ENEkMEŨ]=ŋEw8EEEeE?]EuEhmLR?fErEELDPmPďEnEFEUDJ&<>;EdQEjEQ-C*t£#EJFEې6).\CE-ExELF;$DEE~Es(ĐHiuD&EKE̷WE RE`EHE/E$ģy9EeE-EXE"ĘaE@E~EDŠĸE@E`dEhD%ş6)E"EɷEéC*x5 EEȦEXzX*CEEE74%ŐxDE=E݁E<(DDE/E\EĀ , EEOEE45EC&3E EE1 EԬ p[ą[EEKEDhE^ E$fE {DB%Ŧ:$EEEjŹECp*ńamaEFE2t+C@EE"E`&T&NdDCE,E\EİcɾDBEG)EN"bE7ŇEUEUEt :E`ĢO2/EEsEE:a žWEsE EDȣٳL#~EEWE߈D8#<*H7,E EmEEC)ņ?EF܏Eބ.Y*9CE9EٙE3j&wRDkTEE,EzpӵD{E:EGgEyOcE,,ELE?E})EE@5E+EPĶQEEE_DLAŤxE`E[HE^DX"WҝE\Ek GEQ$EEDŐE!nEN,ECE9D ń:ywmE EEf4D(6EEiECzT+p=AqzEEEJ)ŔDE&EoExb-"DEVEvED'Ş(DEE_NEBHŘ'EEIE'EġBE?EcED5?biEʯEEyUD]BŴM8EEMkEJD&'ŷQ ԚEfE_jE`Cs*ŸZ =E F"aEáÝB)iD.E\E E$OĨU#ѴDqij$⽃DQ@EEyE+ĆůDhEEqYEx NtEEEd1E.0"7E$Em#E EŨk_EGEEүDd [EpEE{pD%(0ĵƕE^EvE >C>*7ð٧EF E;*'`CBE(EE+1L%i(qD-HE>XEقEĖD6EfE^EŲ Ef5EE6E y @2EE>EE_ OYEɯEZEDb&ŃĉdEE,E@DU%8?ęOEEߡEGCH*oEEE»*1ߓCEEDE|!u&\DGEEYE@#LųqDSXE^EXdEĨpEBE/ExCZE5EEBHċ$DpEێEg}EApořD3EQEVEf EoEDE$/E{[ h:EEEEbE{EbEDe&DŽEEEeD%h[#ʃEeE[ET|Cž*,`ER=FNsE`])ŮCT EpE:E=;ēK%}D xEENKE!9ąŸDF$E Erg[EW e E~1E:Eh3EGlXU5EXEE EI/ŦĮ\EdE8EĐ/EEEuE&\ ųiWEEVEDP ~EEpEnDt$#FĮE\EКE4JC)>WEEaE*ŹCEdE6EȞ&r0XDEEE:>FŔ3DE E0fEnO łwEE]E>EjqX3+Ea0EEEc >]pRERE6EPD0fv]ģzE&EED#\+U1=Eb:EȽE- D6) ÖE F>E "*dLCg³EEEpa'Ř DDEEEfcŠD^EgEckEŷ~śDEgECE.{k&E.ETEEG*NEE!EtDł*uEHEE⿚Dq"žcEEĿEDR(!E}FyyE\LB`<+.BPEԡEE6(.DEtKE\E4ltgR!<âDEW^EoEzu_D)EEHE^ŋU E>E`kE El!2GĢHE]E4+E+DŲČoEEREr7DP! u]EE4E~00D\(rE٥EѠEB^+`-B3EnE_=E ~ )Ő!D2^EEE+d2"ŌcDMEiE)uER8ŲDjEE6ME^E EE&&E%ŢĒBE|EEDb[jEEE7sDBŷ˂ėLjE£EEBDn'^6 !xEE&EQC}*Ő!E`FE䥩nQ)y$ D EYmEE_R$#DEEizEӢĔzDDE^ESEEŜ ń)EEo/E{+EHvĴ2C>EXcETEEվĎfE`E @ED^B!EEMEEYD&r E֢EEӎC*4$TȪE*F EN)ſC^EEEPD$wDE?EE֛pDnEEXEΙĄ aYEQE.EN0E(Y'9E0E:E EŎ`E$EEDŸEEEDnDG&š,6PEE8ErCJ*r'gE+F+,E5PÚ*ńCG6EE+E4đ%uDE+EEP\4$DΐEeE`]E!@ğœN EEbEX5E`ĩ[63EvEGE E HZE/EWEDЕ EEzEP~D$$%"<EE OEC?*šps}EE(kE@*ťCE$EoeEH$&ųbDE)EװEZD4E5E\bEIM E\EE^1;Ei-E;EElEG: (SUEnE_E:D?dh}E0E*EXD#fJ5EdsEZpEECh)T֕PE)FEh]Z*żuxC E0E2E&gPDEJE2yEυȧYDoEuEnhEcķKEEEE,@Eq)ExE܆EE-9h2QEEEE0;DELxEEvE^D"YyGETEEDM)HE#FtEAo*ň-.CjEE:B%+PB{EEEÞ(Xu'D EiEo%EnnĢ!^XD^uEEqE;VTőDsEE~JE8=EENE"EXű`EEEE DFEE-ElIS/EaDPm"+ĀEEEIQEh0rD%~ 3nEEE;Cs*EnhEEEN3k*FlCaEEDE~.ĔE&%rnDE^E(E9ŋDE߮EY_Evı;K EEEE7Ebj F1E YEEE Ŝ ;YEƗEE&D3i"EE^EPD:$HBE(|EPٺEFCr*źe E@F>E+>CE(-EfElWģ&\ZDE^E|̅E-͋#ŕDLEEdE֙"ŰETEENzEE:CCc*EE!FE~j)eCgExEDEF#DAEEj~~E p"ŲDEEAxWEZRB BE|EE/ECTĈ :EEcEEŨZءaEQE^EDŊՎE;EEJrgD\%%'JXE3E}E(C}*vMJE F'EjU**C%ٹEC9EtE"5'@%|D`5E6WE2ǁEVDSEd4En/\E0  EE'E4EYpK#W4E EEh E@ *'e\E=EEDq^|EErE*`zDyd%p=8ꆔEE@ERC*r]ϑEFE#Û*ŝCD$NHīEvEtELC)ϹòPEET5EV*D~CQE>EE&QD+1EEEV|=H+ DSEOEfE* Ǯ8ED;EE*g?EIbXŒm*E/E=ExE2: "LREgEE6DAŅEbyE_EExD" VzE'9E2Ej D(ÌFE`F?Eu*?CgEnEE?'œGBDmEo;EYE~ĵŨDEElEPKŬDEFEDEԃĵ4$EEnEE >LEnEED,QĶtE>EK3E`D!Şg6yE.E-E0!Dv(xeȟEFE$B +nB+EFSE3U\(ŵ.DE:EXEsroj!ԤD#E/EpEѰnbHDEE\IEHExEEO!Eť$GEDECEyD ŮZānE 2E{EKD!ŢVwĖE=ECET3DÞ( n\(EgE ұE CP+p[BЮE_E傠EbY")FDYOEEEEwbĜ"DEĦE|ElEBxC#*ŷzfեE7EUשEò*9oCضEEES"&Ń^DVEE+ES6*DE_E&cEȕAōqEEEl;EHDR,-EEEnEZ A*.TEYE1E]DĠ |EEnElD#OGdE(EKռECV)՛EFrBE 3Vv*:moCDϴE`E\xE *'MDEqEއE_wղDoEnEhE DjUEdEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-16000.ark000066400000000000000000000764251376444676100257450ustar00rootroot00000000000000my_id BFM @[E~EXC1s&ůSāE5EEDg Ÿ!,E(]E5ERYEWlfHŨ]DMEEEIӸ*7=4E~E7E>ݍD\fl]S_EuE?Ex!&E= żDEUEJ҂Edąh&uDE EEVC(ؓ?dEEED12EREERSE,:xD_DEE2E_ *ŻosE0ElEy=DŖkQCeEE(EN Efn7şEEmEJEvęh%ŃDܓEEcEfC(,ČEEED( B8E]EERMEGpDi|EEjEŢh*(c;+E 6EEmDs! ĩ3kEE MEYE1obw~ EEuE:yE>˃ėH$Ň4D EEn˩EDCh)qĬZE݅EE>Dg pB>EPE-ETRGELZ~DvE}EEN$÷*ůBYӥEvE E/VDh"Ő#qEE EE7ŁEEmEtEk?#ŬKD*tEE#E[B~)82E-EE^DzēRDEa}EE5RAEE^_D~E EʏEQ)CM{E*ECE8@DϨ#*wEEܴE ESE8eE]E#nEb!f8bDEVEY{ER(AH*%%EEEDŠmRJE_EEEA;E!PHDE%EES#)(oCsEE˷E)D$~|EEEE;n E>%E=E3hE5LUH 8yD5 /ުDjdEUEʖEÇ*ŀ`UˡE E>E{w^DEEREMzh) DC˩EEEf4DFH$髃ėyEuEEE EųOĉELEE3kE+Į!-mDEG.E*EsDEEzE,>(:CcEEEtDx%&uEuE$E#E[74Oĩ E EեECeE=k=DsENErEFi)*:EEEDEED^x,SSE{EdE12EDEEE?E((weCEE EesDw&Lcī҂Eb]EYED X^&EEuE#C_EDlU!ݍD=E ~EE]<4*ŔE6E E^D8'k^bYE.E\E,EepĴv DLEv=EERğH'ŐkCE+EEjCX'pQvE5EEDrg &J",EdE-EYRYE䊱89~_DEEpEWä*45ݺE E9EݍDMflLS_EuE'E&Ep DE]EʂEdĿw&DG EF3E_Cg7(?EqE EBDļA2EjEzESSE,Vx0DKLEE2E4*GfzEsEsEDyťi@beECE E<E/['pEEeE E@vĮh%ŮDܓEEcEIeCK(ʼn,zEEE8D<7ň38E͌EEzaMEZy%DE,EbE5äh*ŬcF+E 6E EymD!& 9CkEELEEwpĺ EpEMuEyE3ĂW$r5DqEEӻE@ECdX)ŤĤbEEE>DwĒB>E@E-E%RGE7LĈDEevEDE: *ɵBEnEuEp|VD\Y"Vʐ}#qEE }EEf7ŋEEmEEtE4l#KDAtEŕEEk~B)U(+Es5EE|DŴĚCDEE׭EAAES<_DEEER)ŘC5ELECE?D"#*gwEEE EŨE]EeEnE͔!6bD.EUEO{E6AH*%%EEED"n@SJE&E=EXA;E9p!DEyEE# )nC +EjE˷E)D$~|EEEEmĿ Er%EU=EX$hE-ěW uyDwQ;E=EEsCJEnRŨܶDEvEQE,{W*ŬAtEWeE̽E0tbD!24nE]E5eEE1AEEE{wEJ4#n:@DKExEzECΙ)яEEE\DipqAEEuEBDE{~DE-E*E)|B#EE}lE³KDo'#ŽM+tEuEEnEŗEIEqE2qENi"ŵVDͳE;vE(ӥE>B! *ž|E@vE-E5`D >KwaGE&E E#>EKīv^|DWE/EYKEu)FC˩EE E4DCH$ԫĂyEuE8E" E/PETEEI3kEK\!űmDY E5EE~*d@h*i&jEE|EGDQţ~bMEE+E28E}7}>DEErE,(`CcEEZE0Djw%uĵE}EEEUEK E%EEWaeEĩjv!DEHEE' k*CREXEMEzEuEt`GEĉjţCD:EGgE`ENh)BOE^EEVDcx"np$qEpEQ}EE#GżEEmE8tE l5#şKD-|EٕEEB )(U3E5EE|DťĬCDEՄEE QAEĥiTBDEEяEļ) CPE6EREρ?D-#eNAwE(EEr Eģ?EuEUE#nE !Ō:bDE?VE{E`A8*ũ" EEE靶Ḑn@SJE&E=EXA;E9p!DEyEEc# )ŤnC*EE)ӷE<)D$$ru}EEEE[ ?EFELEhEu yD~-E$EE&YӶ*Ŵ-LۖEUEkdEDYĞbPEEECE"5E2 DEfE> E66i(mC>EnEcSED%TmĥqElE=EEByBk?#E EE+%bEOĖOYD,EE0EGa j*ũ45EE EqxD.5VEAEyEO/E2Ũ DEE"EHa'XhCKEE˲EmC&z[REEED |ī@)EEEK4\En57ۓDE^UEKE#W\6*QZZSE]E8EDXFř0_5\EE_vEU?)E)1 iDE4EXE( \ĥ&-CoE EZE~C'4Hy2EEED z.1/E?-EE#CVEMg\D,EEME߷*hL ÚEEEDIř.ĶDbEEE#EġilEEE&iE m%"?DjE?EW­E}|C>[(ņ6+)E7WE] E2Dūĩo5EOETESPE-(^DTlE VEʖE"å*@\PӡE EE4E$xDX ,-DhETEEEJEEVEjE|EP$p)D-EE"EmC6 )#ĿEEE;D:ko;E6ECE9JEsRuDEE=E:4v*N,AlEUEOܽEhaD!rCnE]EeEE,EƼEE{wEJ4#n:@DKEtEzEHC)DN ڏEEE1Di ĢpAEQEEH$DECDEEhw }D4ELEKKE w)1GCPĩE,EE/5Df$$o4yEEE\ E1ŽĸEcEEQkE]F ŮDmD*EE9E**vjEEqtE!D+ıbMEEN}E;"8E$.'>DEErE,(`CcEESEDw%ݙueE:uEEEV4 E4EEQeEĊjE!DE8EE)C{*dÜQEPE [E`D [铈EY$EQE9D{s42EtE ETBSEc,=xŸ=DjLEE*EI*mzEJEkE9D2^jĕbeE'E EE QfF/EE uEEGu5w%0DEEEfE`GEI:zcD^E)gE{Eij)yBEy_EEUVD;"/Ė`qEdEqEE ŕœEhEeEtEi|#pKD|EEELJBG)łT2E5EEA]DMnSDEEEQAEěi@BDEEɏE ĸ)^C[E"EJE?D#mFĉAwE EEu EBaE>EVE8lEmE8!ňkcDͽEtEz\EmTA7*5) EE}EU~D ŒmbJENE=E1;E~į8@DFEPE$E#ĸ )oC*EE3ӷE<)D$Ĕ}EE EEŅ?EDELEhEv ʼnyDg5EEEYȵ*pĖEbtE FE7Dsĥ5PE\\E=E 5ESeA@DEeEX E6 y(ŻkCTEXEySE1Do%mĻqEQE^EEӈHLR@#EEE$bENYDE(E E\ ò*|2EE EXDÕī5VE=EE?/Ej D:#EzE@E I{'VCijEEòEpC&fZ=REEE/D0( ł8A)EyEYE3\Emě'źۓDE{UEKEU\@*!ZZSE]E3EDzF80!E\EEDjE&EvETzCZ(S69)E5WEU EoDo5EѦE TEPE7rwDNE[tE\Eñ*|L]»ӡE Ed4ExDW  3DhE_EErEEgU]EE@E4|EQ$)D8EEElC= )#ĺEEED9ŧq;E5EERJE;\yDEEFEæ)*,AފEtNE۽EaD#!řZCnE]EdE&E֎ĥEEEvEJ#$y@DKEPEsEC)O(ڏEzEEbDRyqAEE|E#DEq~[D{ET(ŬJCEFE;% De&ublE{EEWD?# Św;%EE HEa~_EO"tŐgDEXES؝E8:U^*(ä0EE+E?Dh|DYEDEFE30,ET5I D)E|&EE*Rį9'řCNEbEjE7CI'Q$ʅE6EEDh ĹA,E3eE-EBYE8Ű~DEUEEfØ*D04ÙʝE~EEDżq_EUnEzE%E \DEdEFEcĉ&a- D EwFܮEeUCF(Ҟ>ѓErEEEAEPGE zŲbDsEgEE7)BE_gEERVDV;"`qEHEuEJE \MEӆEEsEļD#ňLDeEEdEB$*^cESE̖ED{69DEEחE~}AEC!-GDEEEYN)&CE€EiE>DA[#jȇwEoEEE E 6Ÿ1cE|tEANE"nE)R!{bDEdNEzE9AW9*ŅÔEEhE~DŋmbJENE=E1;E~į8@DFEPE$E#ĭ )}oC*EEQ˷E;)D$Ž~}EEEVEp`?EEDEhE)If xyDK5EEyE]*űIĖElEEED. s5PE[EEN5E;jD"EGE E^7ě<((C٭E%EiED"%nE-E E;ELŠs|#EE3EaE 6DvEAEݞE+LfuE EEdڞDWkVE4E,E /E\0զ >D@EgEE H'CKEFòE$Cv&œZZREEED' FA)EwEYE3\EmĞ'ۓDEUE{KEN]*PZß[E]UEE,DFE\EE-vE)E*ľ ŔDEEQE \7&oCYE~E+RE'Cˋ'ŵGIPEEEfDL{ 'N~/EEƫEVEĬa֟D>E ElEBq*\EEfEsDȵLbE';EE=L#E-۵E*"EEuE|n+%ŲDEEحEC(17ğE/~EED&7PC5EE6EQPE$+yDtEZNEʖEꝿ5y*Z\ۡEE 4ExD@X ņ ShExEEaEE}R]EE;EI|E(Rĝ$P)DKEEElC0 )A#EEED9Lmp;EQ>EEJEQߵűDEEEf*BAtElEEbDp!qnE|EFEExcŹ EEE/wEÈįl#T?DiE6E6ECF])EQELE2ED<ŔdAEEߚECEXĸSDFE:SEhE:;3*BEE=ELD"ŗlįCtE(fEEEoť6; EiEgEvpE̐h"űvWD1EuEkåEhB*Ż#èE~EWEz?D7,rGE5EE">EXgŰ}DEzEKESĒw)ĹGC̩EiEE4Dg$inyEEE E2?E dEҶEVAkE umD2EoE1EN;*Ŭ5EEˊE$Dk<GMEOEE7EdŚDEETE$,V)]DCMEFfExdD%tErEWE+E0En:EkxE}eE .aȁD?EE"E Œ>*wüpEgEX3ED\ķcSE!EE!2ER,Ŏ!DZ E=EE@%(ClCq E4E EDh&cDE]EE+Dn J2&EEfEUB_E$ĒߍDEvENE%%7h* EE\ EDa*YYE.E#dE +Erd G{DEDEEQu'C4}EAFFeE}PC]'P E#TEE,9D8 Ŝą,ETEEoYEns%D.2E.EE|Om*6þEd`EEDPN<_E6PEE%EGy?" yDEE'Ebij& DEF*E]GC(s?ºEELE=D`2EE!E3SE1.ğwž\DLEÝE#E֣ß*žx{E!E dED߈ KbeEEEEo6ŹE\EPmEhEvMw%qDELEQLEZC(m,f{EEEDUC48EAE~En`MEA(ījXD(ELEwqEå;*şJIEEl"ElD d"kEEE2E-EGE/= DEHEETsϮ)ťJBE,HEyҼEVDF"kĕ$qE>EuEEV>ŎEEfEytE#ŻKDEE`EB)8S:E5E´E=DvcDEEֵEsAAEj2i]aDEEE P)\CEECE~?D\#Ň' BwEEE" Eĕ>E_^EelEmE\ĕ!lcDսElETEAfu*ÇE1EHnE%׶DyūĀ6JE EXE<^;EE ŚDE E`Ey$E(ŠmCIExEmEJ(D$O}EdEREE{EEbEDgEĒ Ł!{D*E:EAE`N‡*ĺuELEdED̈?PE=EE5EN`^DEeEE6x(YCgíEBEKED%ųlqEEE1EwLU@#EEEbE o zDE@EEX */듙EEd En9D4YEVEfEzEg//E&oj dDi#EFE8EIĥ'0CjEEڲEC& [ĄpEEENHD Fr})E\oE{E|[EdųTDEkEY%EY+FVÒ=EmsEEDۂŎ\E E XE[)E| kD1EØEVgE\Ľ~&CEE}iEقC'ʼnH{2E}ECE*D ŢĀB/E4EυEBVE l|X~DO4EE튙Eÿ*ő> 3#EEeE܇D-WTbEEE1#E iŽE<E}EYEm%ŋ|DjEEEwCZ(ŶK6i1E_EE}Ddr5EE.LEPEҼXBxDUE|lEeE;{*ŢME-,E EyDw ĜhE[E'E5-Ev׋EEE}E!P$) )DqEE0E iC()>$'EE EGJD ō"Ď;E? E EIE7nDoEEœEù*Ū BUEWE+ݽE4taD=! ˔ESnE]EdEmEvRś EEE$vEyK{#}@DKEETkEC)űXڏEJE2EDxőkYqAEE|EDEEęůD\E!5EEF)<[BL$EE]E6#.gtE~EO~EDEŁEEGE0qEE+"ŴVDTҼE_EEB)(ȒE_EEƻD&lDēGE{E_Eh=Eˣ{DEE$Eu&ij)Ŗ|KCE}EָE5D/$ħyEEÏE+ E4E-EEmkEĴ PlDPE9E3HEQ)ròqEEPlED@VcME=EuE!8EM@_DEErE-ē(ifCsEE E4Dw%ńXuEiuEYEEVĥ" ExEdEAeEj&`DSEE=rE;±z*QEEDKEDZūGISEEE1E֙DKELE |E]!?OU(ŒMC^E" FEDפ&Źb8ĂE{EEk8D# v%EEGEn_E@#ŘDEyXEНE:m*ŗwl0EE!E,DvrYEEME+Ehĭ DEbE}EP$'ضCfEF FEMCCF'Qă҅E6EEDgh JhQ,E]eE-E3YEJą8 D-E,EE㜃P*P43øʝEj~EӻE~DIfjM_E,vEE%E[ Ż]DE ]EE$dц&=. D EFܮET׸CfF(Ň>ģEEED?rsİ$2EEE_SE`;TDjEE"AE\*CEELzEND'\ʼnĪeEE"EEA6s[EJE`EDiE)uĂ%b DpvEF).ER=C[#)))+?eE$E}ED)Ş97EWE`EMEo.JD;EAEEu) jtiE4?EEzmD0!̘:TkEuEU=EEg EEmECyE[H$\v5DEEEgCCx)UcEEEMDŬgS>EEE8AGEWĹy DEfEE)ťىB,E;gEԲEUDJ"ŎƐLaqEEE˳EYŜMEE6|EsE19E#yLDmEKE&Ey B %*laĜ$EKEED6&DE8EEmAE5D,ŢD!EpEEM)C°EE?aE>D$^#㟈:~wEEEv Eh"ՊE8@EE&mEX!"]dDlE͊E?6ExB*ÈEE~E^DxŨlyrJEEU=E=";EHŏ_DE%EtE# )pC,+EjE÷E(Df$ŭ~S}EJEeEEϋĽ?E%EDEehE/uf ,1zD0=EEJEya~*鴼̖ElEEED|rĬEPE\EĞE?5ED#EOEE7c<(CE EaEnD%m#EEEE[ }#EsES+E'aEvD~EpEݞERL+ńM}E- E0ENDVxVEEUEk/E!B. lDAE#iEOE۹JOO'$CEEEjCR&ّZ3ZEEED7 ŝĿA)E8EER#\E͌ܓDxEMELCEI^*LZtcEUEEG{D77ād\EEuE4)E_+S ŲDE¶EPIE \ں&Ũ}CEHEhJE}C1'2 IQE8E_ EeDz ҇Ė~/EEܣEUEĤTD:EElE*ő|#EEQfEnTD!'bEP;EE<#E,ňER"EfEwEnٍ%gD EEЭECr(ʼn<7ĈOE@EE Dŋ!ǻ5E|E\jE7OEY D?EEEPP*=xEQEl4E;yxDX ŏ zchE=E%E)EKEEE|EtSJ$:*DtEEElC )&N# E&EEDDIŋĐ;E;>EExJEpNťDwEEE4|f*A|ElEeEmbD!`Qħ&nEDtEFE E= E9EEC wEÈ{l#Ŗ?DqEE^E Cl)(ďEEpEDLv̭AEǟE E\CELwōTD-EESElE!3*ŘB1E9E>E`LDr#\w sEE/`Ex:E!&|ĥEEE,]qE35!UDE@EEpBw*cbEEEK>DD ārGE5EIE">Er.ĄgDEEBE4g)GCөEEfE4Dag$mĉzE EE! E 2E3dEE1kEī +mD2EFE)E{x;*ũ fEqEEp$Dc{ŀmME7EE7ETōDrEETTEZb,)HCUEF]E5%D2%œgtиEE8EE֒ŊoE:EAxEEneE!-żDgEٰEMEǿ‘>*oEpEdiE De.aĨSEEEv1EB;51SD0Ei:EUE/>(T9C֮EFEDg&Ţc*E]EEϠD ŤA&E EeE2_EDEvEE-7֩*oEEEQD9fi{YEr.Eb\E+Eu I|DEDEzE)Q9v'zCE` F eE CŅ'ŞP߳EMTEbED 2,E~EfEp_YE IED]2EE Ez|*ő5E,`EEMD {_EXEE%Eģ MD{E/{EE'+c&L_ DEFEdC(7=tE:E̿EsDAšS1E2EװEESEV ŒDE;aEWEyõ,*tLEyE\EDm+cceEE EEYoB' E,EmEE|Xvg%hsDFEELEXތCo(,;E*EsETDMVSC8E`E~EPMEHĂjðDE2EEp}GE_=7)DEPEEwa)lJB`EIEмETD"Ū>bqEEũEwEP EpE=E{sE~q#)MDOEEOݦE?D@#Ÿ'1BwEE E E OEfEdEmE;Д"!ncDZݽElETEKAu*bXEeEnE-D {EJEEEN;EFġ ŪDEEEc$M(nC JE>EEi'D%yY|EFEkEED E EEgEϝͦ U2yDEE0Elq³*fELE%EyD*ăPE1E E46VE3D wD >EJEEM=1*\w,EE,E봈D64gbEg[E{El#Ex3EBE7ȄE-mă]%DJEEE>C'$5ĵoE`E9EuD}ݡ5EgErE PEn6qD_EELEZý*<.»ơEbEE\{D( ū*hEEE*EBE< 0EEEك|E"* %P9)D÷EeE"EhC{Y) $!EdE#EAD,M @;E&EEIE Ĩ3D]uEEÓE4À*Az\ELEREN.aD5"$єđmEKTE&EE҈ĭ E\EqEvE7D4#Ŝ?DREpEkiEs C)Ŧģ؏EE~EDy~d}AEŇEsEQCE:ŨD#EU3EYՐEIs*`B&E?EE`KD#IsEE@EEIaŜfEСEE@qEJ>3?"BTDмEy!EץEH`B)jǒE)E˸EͺDoAOGEE[E2U>EN& D EEbET0()KCEEfE5Db'$ŭuEzEEEJ E%f̱REGEEakEā ňnDSE,?EBEN?q()9ÏEGEED:agMEE֫EC%8ETTĞŪXDrE EOtEb+(VJCi}EF}E-Dft%fsĤEE ELES36 EZE+EreE|DEEE*uEِExEȉDMŊ@ĽTEE$:EM1EqD EREuEo=A(2CEC)FXEؘ DI&`͂EfEED# Ŗs&EۤEME+^E+IJ(DE_VEE0;ô*ŋwEEEDyɱQYEOE~heEEʟEDŎz:1E&EELSEN D iEfAEp7Ejio* pEщERxElD`ŃeE^PEE-$ E`E EEEWu'%Ŕs DFEF lEߎC(\+&E@E_E|Dz0Ľ8EEeEMEH$*NbDgEEEC)0iEf?E2EdDmDa ŘĞkEIEzsEEd& EEEyEs4$7DEFzEJCd)clEEE:Df>E SEEGEP2䨼DEpEВE?y7~)OEBu0EhEEUD!پxqEEEiE[ \EWEeEsE-YĖ1#NDoEEEBw*ŷ/f.E2ECED7đ6DEdEREY@E;LĜ6 D?ELECEĚ)CrEE\E<>D#ŖĜwEE-Er ErI EFEDEʥmEo]"obD6EDE4EA*ŭ4EEME[8DwsJEEE;EjK DEE،E&) jC])E&C0EEE{C'žHHEEAELDS aH/E ED(pEQEEG Cp)OİEEE nDN AEEdESDEaG2]DEjMEJ3E_)gBTESE|E1LD"netE¤EE.ERssJSEEEtQqEƐ!~XDE`EEvB)ō ;EEEDDb;Ţ/GE9?E3E>E2U*TLDEEDEcsd)OCݩEFETe6DS$őtzENE~E[ En:9z&EmEoEkE~8^ WnD)qE!EA`EȖ)jqïϕE,E4Ep+DŨ ,NEEE7EPQDJE?E6NEy*&)ųCf_E!F_E D%ur+EEAEՊE)VĸE\E@vEzdE*Ā'DcEEpJEGf*:EnEs#ED3ۨ`SEE7E/1ER%:DEESE_@Ņ([ѹCݮEEJųEtiDy&&c峂E*\EEyD?d Ŗ6%EXE/Eb_EN{Ş%DE:@EϨE>y*HÑErEEvDSMoBYE2EZEg+Eu ŀuDE ;E]EC+R'őCNE F&E7C9(PĤ}ERE)ED Ľ+EE"ELYE\rkD0EE:E}*<(E)EYE Dؾ_ECEE"&E] D^EIuE҂ENZcN7&wp DwEEEFEQ -@DENErE:*ʿBҥENE+ExTDa"Ŷ'1qEEdEsEi4pEVvEa\EvsE@ьĖu#KDUEEܦE+B[U*L v E*,EWnEDŴ>DEEnwE;AEnlͧD`E*EiEQ)*C EyhE{1EK=D#NwElEQE46 E oKE'EZEYmE|ĕR"`cD E cETE!Ai*KƓEE/ED~QŗtIEEE;;EP?R%.DEEE&Ā(FLgCOEzE׷E&D$W]}EEEE&EME]E4hEΜ f3{DdE?5E̡E WUg*ưEEueEYDł3PE[|EEo5EĆDRCEXoE0En6'CEE zEDB|%ŴlWEEEFE+Ť}#E5ECEbE=tDuEErE$*HkE#EEKDŘ׳ęhVEEE$/EĬ +DaEEDgEOI'ŜCtEKEtE& C_?&Ÿ9[޶EME[AEw.Dَ y *EE!E[E;ĬPmD(E#E&ES*׿NOEEZE͔D[qI7\EEpVE(Eի8 ۢD5EEE]8&{xCҲEEEyC'ŖI<9EwEEDu &?/EE.|EٵUEmawDEsEDE{%+r EFEFEDT%4zaEEFE="E {ŹEEEGE6oR%Ŕ DSqEEE/Cm(7/E(EEDlׂi|5E1EBEĈOE"ţD'EbE fEվM"+ŨN€E"E׿EyD{!ijgEZEE E"xE$EEn|E\v$Ŋ'DEzEENaC(a%~&EEEv+DfĘ;ETfEEDJEĢfKDNE$EE*4B@EEݽECbDR!0Г!vnE~EYfEs>EuXūCEE>EAwE%Eķ;#ſDADBEЯEE,Cl,)̓EEED"6E3AEEOEDEĸDEkEE`%)B5EE^E"MD3#Ōğ)tEEE [EE EEqE*?˾!WDEPaEEvgBo)ŌKEqiEE̻DB^O+HE(!EQE=ENšDEE&Eà)ŨLSCEFиEU7DC$OyEEkE E}ĝEvDE`EAjE*!ŔlD<EEKE&Ը*ŸqEEV[E碯DGpMEfEkE 7Es}YD;ENE-,EL-0E) ˎCZEE5E=E?D%|euHEsEE\ErLEEWEeE¢*}ŀDEE`E *+XEPEAEWDnJ!5SEmEkEg1EařDEE5Ej? (SCEN FDExYDs!'Jb蕂E*zEED` A}%EyEbEK_E  Ź̌DQE"EEBq*\6EEEiD; ;ŰĐYEzVEtE",E0ą& lD%E]E8EQ&'>CEFE9YCm6'OĈEtE E([D7e ŖĀt,EأE 7E YEsoDREE@EÀ<*1EE;EHeDl&$0_EEE%Ed76 ŁWD.E{EE֨bģs&ũa DSE!F0ޮEmCf3(ū<0E[EE?DyG2EEREESEĵ+DEUEoEkÔ)²ߠEEE*Dr},fEiE^QE E,_šEEEHlE޵sĂ%U"DE$F/E#CP )k3)vE:E%EXDQŜ1ę#8E|E<^E6LED}EEAEd{*(2E;EEBkD+!hPkE'E3E/dEĄŚ EE1dEXWyE1A$ĩ5DEHEGuE4AC) #ħ4E܋EED"ġ=E4EEGE|=ȻDEi0E@E3|)1m|BE0EPE_SD'^" mqEEE1'E-&1{ZEAXErEp:sEx#LDh7EEݶEB* /MEPJE7PEpDPY<CEEFYEJAE= 0ODErEΏEw&a)SCEgJEOEBXE~;E nhD:E'EE$ğ(ZsCsqE&EE$)D\$VD~Ŀ}EE E7EBlrEħEw7EUsE]gEu}S 0%|DNEhSE⭡EIF1*YϸöݖEESGERDGxhPEEaE5E=NŃ,D|aE)QE,GE-y7s'SC EE?ED?%*8mցEE9EEy~Ġ $EEaEQaEEEEnDŮ{:BEiErECE5NDEEE4/ *BEEC@EMDq#ŌxasEcE^EkE%S9E!EEpEǑęz"AVD沼E6?E!EFoB7+*"vEBOE+E,DDWĊGE EE=E`tĐDvE |EE|)ЍGCrE EE|&4DF$tĬyEwEUoE E"Ŗ8#EbEDEwE E,ģq)ʼnC''E3FE˜D!&st[EExEEIJE8E9EJeE: A?.DɧEwzE~EXQ*łٯ}vE+:EXE D=šSEE@E2EjrĜ7;DE4EEΝ>J' ֽC$EhFE* De&ԠaĺEYE^EZD d&EEboE_E'lDDGE EE6=*}XE>E2EDd#ăZE?EܒE+Exċb uDE{E(EYkPb':=CE%FfExCr'GNXŅEϊEEDo *I8,EEE~YE= 5DpEEd7E+*Ť3N/EiEiED!Pć;`EaEGE%Eē DEEEa&[S DE0FEC/q(;EEAEO;DFŞ2EOEESE-HĮ¤DSEO_EEÁ*ǁEqEJEDŶ:peEWwEqEdEеų,EEcE_E-vą%SfDeEE ESƋCrT)%,TEE EѵD ߷=7EE*@EV-ME Bmń DEEWEyN**MPE E EQjD ckkEEIE'EB\ĹųY EE.Ea yE¹B$6DǸEXE/WE*TEC(!*J1eE"ElpE/D:@Ŋ]j=EK1EE*ZGEKļ@ pDEmE2E{).wmBEcEEXRD "ēqEEEENKuŤE/EEWsER"Ŭ-NDVEEE=4B)%RTERlE.ED?qCEEEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-17000.ark000066400000000000000000001023451376444676100257350ustar00rootroot00000000000000my_id BFM 4![E*EfDIå-t(EEjEEZdä +EĂEE>E41EhfHŶeD*EFđE^XD1E6EGEPE_*g#[ECE?EuG:EdC!DDfEFEI-D(!ĩEeEEEAW*ؓ?Ħ}EE:EURCExD!łY#DlEE2xEFD@ĕEO[EɞE2E 2¿V)Ł\[:uEEfE;)LE)I#3D,E KEE}XD ğEETE EufE0VB0(=uIlEdElETEZ$:C6EIE,ED*ŋ D^EEE0Ch'šf'dEoE3ERw]E4͐M& C;+EE1'EDqŇDD_EsEjE.MCr!&şļd[EDDEE˃e'#p C&ERE dEAD$e r`D=EE3EIEE+}*%%SEEE zE)+Etā0<~DEY*FEthDG&EEn|EEMY*qıQEEx.EU4EķPK]D;mEAFeEiDų Eq#E EA:EÎΓ* ,s"E|EEiCةE:EEDa ĜįEEEjEJB1:({:;jErEL;E aWE>ĮZ%gYC E(EfEDU?ŝk*DEOEmbERC:&&#ļ]aESE wE-P`E2&xfC=Es EE8D$P+DKEUEeE{C+%—~XEEXEiE 9(SBs;E#E(EEr' ED EElEyC9#ĂOEEeEqEVg)ŠwREEE: Enrċ]DE`EME4D4"SGE`EEzEWL4)&@ ÕߕEJEEmEhĤrDdEEE5D HM>EEEaE540nY*ūÉ̑EEEEEĺD,E F9ЋDsEF5E8yD_Vu:,EEEE=3+ŘblEEEd6EN-EϾĄŊ=uD˷EEqEύDX}kp#EXE+EO=Efb*ź%ŀC8E7EAEZD|΋+DE!E\E\*vCZ&쯎ĶR_EFE*EZJbEᖉ ' DCE;EEDŸDB%ŶfVE1 EzE3kEyeJ( :BuE.E@!EE{*u DiED7ETEΕCS#ŐȦXbMEEfEtE^w)ŜXErEEX EHDfE&wEEtDY!oi\DEE*ō!.ÐE E EE CvDsEE~E?D8ſZ`;EPVE6HEoEg)*侑ǐE%ExEErH8wDtEU FεE,`aD\_*2EE\EvֆE6 ė*ptEb]EM0Ee/'E^|VDUDHE,FuE1Da7"*E6EEZ E*6m,EE E%0ETxĸ2tkDE FE֑D?\Ń/!E[Ev=EfGEⳤÄ*w E"EEP8ElРŠJDCOEENE(D,&İEE{EwE:S[[*<E7E E)AEr *a)D~vE*E9E{D~bE EE E/)ŜVĚ wEaoEF'EMJEتñ"D샫E;E1EeD CaEErEE%A(cpįInEwEGESSE$CE.EϚEÈD \zDExEEPCn'I@beEsE|EB\ENIJ,&OCEWEEqD ń\DE E땣EIeC"&ĺZ\EؒE2E;eE"V'8 CLEVEEH-DW DE:EuEmCa$i&SEEEmErľ(ŸBEEEAoEMk'D(!ܵDLBEE:E~E< *PhE|E/EZEZCQ&DaEO F EF3HDRhH9ErEmE.ȃEqM G*f-2sE ~EE ED^mE%EEE4Z)ŬB|ElE'vEQDEru!ŇDsEEEf,D-~Į EEE!E1].L)]9 tEEdEGMEkH#C,ENEEaDz ueEE\E|؜EĆB](AyĪkE:"E*EUEzכĬ%%þC̦EEEEHD y 5DOEE%E$@C*i'9OcE(;E,E^Es&pCⰢEE%mEDŊņ=DE~EE7C&BpPSZEEYE>gE^'ųBE(EED Ŵ;DlEEAElCL4$a.kQE EEO pENiġ(Z/?欚E.xEEE^`2D EhhEwE,DP9"l+RHEۊEE yEZOĪ)>ĻEEE7BEhĦgDA EEKE0D Jj|?E@MEEـE\\5{*Ūp,Ex^EhYEE8yĉŐ\DtsEE:ERDTĩ6E]E'E Ea*{^EcEEX0#E(GĞkDE8F߷EsDW.ExEwE 1EG*ūEEzE,Ek@žzDߋEf+FtE{DŦO%EZEEbE'$z*TİȅE2EEnrE^&5E@XDEmFDӾEqDw EOEEhEo `*/0GEEE=EлlV8D4EE:E믬DHĎEIE/EQEú*KzECE@:EsqFE;0!tD>EWeEnED/ ELEmQEE0N)'eĶ3rEiE^VESOEB4#$CjEEHEHD,t ŎKEReE"4EEBr(BXKmiE!REuENXEVЗĽx% CEEBhE\ADpšD8JEdEWСEΣaC&ŽM<`EckEoEFeaEnē'*VCEEzED AdDE`E(ӥEP`C:%Ū&KWEoEpEhjE}*a(8BHȝEEsEElā ^|DEEɩE.CX#||ćNEfEE1rE+d;)EEOE" E0 0ŦDhnEE­ESeD+"ż .FEEAEJ {EH)JjEEKSEE;ĦmD>*EFE 9D45ą\=EQEQEρE,Ig*ŀá=EtE3@EiE DľE^F] EtZDO'+4E%ER;EBME*ŠÎ6EE'EΡ%E,6^D(LE FED}Dȇ|Z)+EEEEj+ EՂEɎEW.E { v qDgEECEΏDzwjH"EEzJEƎEl æ*Ž τEEKEB7Eҁ*ODܺEE'EDŕE\EtyE@ՒEsYlÆF*6EElE@E -DEEnE˱DbďEUxEjEޖE)Qđ xEEEWQIEg" DzfELEEDh;rESkECExE7A5(ёmPooEE4EXREȀ$$vC듨EEED5 d1%ŎlCPE2EED:WŊ%Dz?E"E/Ed C&eH<^EEDLŶ, ŢD3EEE3LC %V`tUE8EElEu(,?dB ^EEeEE_ nD6EVEɪEjlDF#űΧh0LE0EE*uElZP)Ŷ¡tEKE4qEu E"\Ų{DEBExE"D!zd_CE@EVE}E@W*t'=èxEEZ4E\*E̎dE@)B(Ÿt6fmE)BEEyTEĊ$Cs'EuEfEDx SEŜDE֟EB&ET'CXa'5ĞWdEEEEDE]E8YZ&ŪCmE@E+E"D"űDE(E;EC%\x[ECEEn+fE \Ģ'>CE$E5Ec DD sD;EEEC'$ňΟXRE YEEnEo)8A)yErEEZEŨ ųDE2REeET DŹ"~ĠJE+EEewE-U*) y4VEfEEE/Mŷ DEE.߯E+Dd 9n>KAEE'EdE_9@*QZZ,EeEE E0 DhHEFEaiLD ŝb88E0EEEXE j*ýE>ELE"EİŰ+DʼE@FE mD][1/EyEJ"E>Eİ*ڊE"E}E*E=mwDE FEDĞĪ'&EEEE5a+ıE=EE/\3EcAųM^DjEE]EB D(uvE{E*E5Ed˖*Ū*zEzE}eE;EE`EdE11@*~Í&E@LEE5EwIJD*EE]EUD;~{~5EEITEՎE\qJ*Ŝ3;EEYREp#E$.-DK DEFDE/xD;%Ĝ,E*E EE×*ũ7E:uEE:-EsġżuDEb$F4E'D $Ec|EEEC{*ŌaEEE6E *UD|EFycEoDVX EEEEE~+4 Wg4DlͰEE\EADY;eEE3E?hEß)NyEEE\GE "lRDEAEBEbDaĩ7 EnEqE|EU Z5)ŀh"8qE.EFEy+PEՂ $*C*֨EEbEDt ńSMdEENRECxE8Bh(hęYhE06EEBYEyy%QCE'oEE9WDJCDfEE]E/mCC&Jq_EE E0/bESĹQ'5HC07EEEyD7d$UD͜EE-ETԹC5%QVEU>EmE1kEJ{.(9BCE(EhEQEĚ ŬvDjLEE9EiCr#Ş٦>ME-EEKsEFaĽl)3ƒ>EEE E QĜŢ޺DEE+ED!őzEEEnE|EEĴ*#=EEcEPET4űDxE_E`E=Dv?5CEbELE#D DFE9E卟ECђ'ŐNJeE[EE [ET5&"pC&-E"ExoED\\DEo5EEyCȈ&ґČ+]EE"Eh\dEMH'h,CuEbtE wEz>DŷX ŻbDEEvEC$㺝sTEEFE.&mEks y(@x&BE#EE:E@IJa {DEhESWE|D"ŨĂKEFAEE>uEWk)E¹EEnEEw*ʂD6EMEE5&D9 V+BEETE~E=Ĵ>*LEEE`TE/Z ͤDEDEòEGDŗšs9EEE EHE"O*Ű þۏEE&4E EٻąźۓDEF#EjiDVbĚ0E0NE$EEvđ+œ/E(E{E/)EQP0DDEFXE;D&^'ENEWEE+*P PEEeE1EyĕzqcDN2EF*ݽE5Dŀě4\DHQEnFEpDihIJU.EEENE EeY*ż2ÚQEEE"+EKj}DEN F E>щD.%EEEhE*vč+EEKEqR4E2GD>ž,[DEEEGD+5MCE$'EEEAb*-ĶEEE T=E Vjŗ8DEED w:āE5EEES؝EÉB'wĪiEEEXE'ć% [CEEE,DŐsD?@EޭEԡE]C&TT`EBEEڻ`ER&aCEE'EDݔ;FDZ#EEۥEC_%ʼnĖFXEVEEOiE]'iBʝEETEE̿ʽ RDCE;EE 3C#ʼnrOEPEVE qEcĿ%)جE!.EaE0 EtČM/ڽDE:E2[EŃDO"ś 6FEEE{EIķ)vTE5EeEvERiŽyDfE8E^8ECs7DLa)=EEEāE-ҹ*zE"E)E:E3DCE F?E߼[D Įo4E"EgEEĐ*ŏ 'EEwE$E0BLDE FjEI|DV+EE6E#E*E[EZEܱ *]WńEEE;7E^VPDNEFF|EoDmESE<EEm*M6E^EE?Eľt z0DiE$EEJDpŐu\ME=EhEҹEpB)h/Q3xEpEE(HEwpī"DeERnEAED\@ĽEENaEEy@)kĬpE!EECQE /#ŐnCEEEED\ ŒwZNDEdYČE֫EZE ǐEb;*ř8*ՂEEiEDEFbE=D ZRE#EEʔE$D;*DD |EFEEDE& !wDz-EEED0˼ EEEDEF`B)ŀasE4E EMEv &#CC~EEX3E @D$ rgEEE=>E4B(Ŏ"zCkE*EEqVVE͚%ClC TE4EEjDe+DEE)EpqEC?'CkpbEEfEUB_E܂&oC qEE_E,D0ůDEfE ERCB%pYETE7E@ hE-((BrEXEEu5E7Už ŐDjEIEĨE}PCt$DAKPEE"E$qEj@i_0)`E yE{E EW05D.2EI+EE3D! GEEEyE,?OĬ)tE E&ECEGy&;SDݏEEEy4DR ~4?E ?EҳE׀ED2A*+v=EElEEiWœҝDX_EF|EMTD W6EQE E%2Eğ*žwEEeE#EqĦtuD^E;$FI EDuDBXY-EEPmE>E[*Œ2ÃʼnEEE,ED+ňxDOE\FtEDanİ$ErEEER*(3EZEEԂ5Et=JsŦVDElEl"ED&LeEEOEE=*ń1|EEE=E4 Df6DEE~E&DloEBEbeEE"*ŭ1KĔyEE1 EGE!D!E|cE1E ~DM;2 EKEEXE4 )fĕ$qE\EEjMPE;Ĵ$>kC4KEW.EbE̼D{d Ş EEE!EBo'YɀahETE3E2YEA]M%ŞwCwE\E{EUDBlQ DEʽE%CEv%lC&q_E&wEEFaEď!'2QC逡EEEMbDź6DZEߦE=EC~%m!Ċ9WEaoE E=jEX{W](kB7E1EOEWE>2e }DjEN=E1E3C#tĺONE,>E#fE=sE|bE(;m5oUEEEE EEwDldEOE$EHDu!EEaEbET{EDēH*žI æE.E0E6E.22bDE.E:E[;DI?ėov3EEEEO+mEE E%E zDتE FLE-Dyj*EE$EDŠEq+ĺEE:E]E%CO&ݐ]EE.LEcEq',CD'EvEEDJŨc $DEEEX>CW$l1TE@EM'EzMmE9t(p2BXEEE;E0N mDE6E0E D"@KEdENEuEbZ ) A§bE&EE4 E¼nDE!EԮE &DM!ĂBEBE4E+~E.?8*~A,"EE >EmE aD0EFFֲEEDz4h0:EHEftEVE$Ň*XڏE ZENE(EyMDGoE$F}EԨfDv f1E;EREvEF2*}EAEE(EETDzE &FiE=Dl(EEE~ElIb*X ~E4EE1EF}|eD^EEE˔D&l!soE8EE*Eâ*t]%MEyE*E~):EXsĦ8ED6JE}EEkDLYľE1SE(E0dE;?/k*G?}EmEE|CElĴ 02!DҮE&hEȰENDTGvN(5 EnEE`Efʍz})ŊZ*uEEuE@JUEh%C*EEp'E }D9 )ńDnVE]E=rEuX3C/'U@8cEr=EE]EiĞ&Ű&CLEEBE}}D )p֙DtEHEiEC +&2ZE`E EfEL^'5CEvUE>Ek8Dń 1D EELjEC$ڠľHREJEEjhoEfnw(<Al0E'E yEE%m*Y|DnEEPE!/ D"UͬIE/EŦEÄwEP)ӷMÖEEKE^EzNZADEkEE-D f eĊv@E]eE&E]Eq6ĮS*?hÿEE+IECqEŴ"DhE)EENDITIr7EsEoE(ESX*̮׎E\PENE"Eš"ũ'DDEFHEsqD.>hf.EREpEEC+ŶHÊEEcEi0+E_`;ە|D!ʸEF0E4DX .%EE E$E2*QějE3E"EW3E2r+\D EFEZD7Ew:EE EZ*))+EEqEr=EļN9DkERF;EYDR%ьĺE5EEE;!)IČh{EArEMEFE0HĂ!8DӭEEbWE^D[< E_EEEG)*cĨrEEw`E-NE]#CߩEE EMDj !T EEi E̻EBc(\}W5jEE`EkWE%~C,ERREgE DŊrDڄEEESC'BmTaE3EnEy_E1ĝ&V-fC5֡E:E+ED hDqEENqE1C%D2XE8E6EfiEB'BE>,EaE\EQlB D HEE<{EօC$^#keOE9EEqE*enn)GvEFEzQE E"F;~D̀E͊EaE;D#"bFE>>E;EzEK*ż zE_-EEyE9H DiEE~E5(E7D鳻>EBEcEĄE08p* bőEEeE`E8ĵΛD߾E,FTEXDT5EvE;LE>Eı*鴼ñdEdEE%ED^En)FxEyDũ',EEyEEr*([EtqExE-EeĘ6tDEmFEH0D4 }#EEE2EQZ*h'E4E!Edy6EĨZ\TD E F>ENDw<EE7EFEcs*ź4EE$Ej?EC 0DElEEްDT|hE)EЂEE)JOZ.yEEwEk#HE͌+"6DԀEkEqE$DKsĐEEdpEјE(1kiP=pEE@EJQE2ա$śeCͨELEED qDEXEEB1'^{ۆgEyEEZE~&%CE{E*E6DUD+fEEXE&Cc&׎^E*BE<'E%bE^Is'ŲDCEEE /D,DsEwEl֦EcCf %iǛh$VEP6E EkE/2z<("BEEEwE BDY E\bEEC}#̠:MEEgE%sE]V)="ʘEE E8 E%#ŜDE3EReEDw!˲tDEE4cE|E)C1)92kEnEEEĮzǖD"EENE*?D DOĐ;EE EEk'.*Ł7dErEETED8DEFvEmbDŲD2EhEE.E5 +żað}EETSEiD'ED&DqEQEvEQDxٹ)E'EAE EŒEތE KE(v*OsӳEE!7E,}9E; NȢGD5E~FED; EEpNEEMYw*6;~EEE6"BE ļ!C(D {EEEtD?O30E\EEE{p)BW-mvEdEdE4JEĶ#DEVE#EeEDcb 2EE(EE B(LrTnEE0EhSEG$eCçEkEEDx^ DEEE)C'J}eE\EE7\EJ&HC[EB*EEDTD0E0ZEңEWCx&Z>\EiELEEneE*'RCFԟE~\E&EDjO aD9EEǧE<C:$Ų,ĨSEEEmE8o )BrEEEEqխ ~>DEpEvED"켪JE90EhEovEWg)ŶS}֗E'EEE4_\DE"ElE(D zAEEc0EhEEE,EޔE/0N?*aC}EEE+DE]F!hsD-EEEHDcw EEEE`?b}~)]1tEEEPMEJ&+#߱CZsE&E]EFDA 5RE1EE1E *B.(6?yZkEEEVE㜚[%ŠC[E%EEcD'jŔDEEձE4FCY'ŊĘHbEE)EJ_E@&ŐxCE)E7EXSD^t7DEzEEcC҇%œJZEE$UEgEQ'j{BeEEEDPą R&EEE=T6qD+ED F\xE"=DZ=EE3E#Eb+*ŐÆ;E'E"EBE3ńVDVE~E8E[DY3EESEE>*ذ!E^EE"%E8UkZD$EFոEl|DŀĀ+EA\E®E LE4j%+ŢBE6EE.EĹlwoD_EF2 D^EJSEME5D#TkLEE EuE["(.E~E!E E2đŭ;DEMEE.\#D EDE[;EE}Eo=+*z5EEQEd2E tQDg?ER#FwEFDIŒֿ'':EۤEE#E&%R*0EEEV4E~ĩJDErEE`;dDyĪ21E#E&E_wE ďW+hTߋEQNEFE.'EoFDEE\EDuŧB#(EpECEкExV+ QEOEE0EA<ŗdDP9EfEqE?D2sE EEޏEo *Ł$mEhEֲEf9EL˿=SPDD.lEEEBaD=jıE4EΪE뷓ECx*Ŕ>Ěl}EEEQ2CE,đI!{"DEE8EDŴh EzEIEp7E E—8)Ź[]|uErETEKEǩBw#ŘKDDE&E)E_DM X`E}E-EnEB`Bf(@_t&mE'EE>TEğ$;QC#`EUEmE|DyʼnDE@EOEI1C,['.dEEEƢ]E̐%)CiE}EFEDnZGD"E`EtE<֖C%|[[EUEEu!fEs7'ŧC\?EJE^EDŨ l0DdE&Et0ECf$ŬО|RE SEEoEmRZ(AxE"E EEb@ ŷD-E@E4E D!"5JE6E4EwERd)Ŗt¼uEE;lExE@|lOSDoUEEسEɓ/DW Ą@EElEgE7t*0TE^EEE9MĜ#DEؿE:EԎEMDŅě7Et8EENEt1*Ӫ|׎ESE-E"!EĀLޏD_EF DEG+nD6ŐN^ /EE#EfE0I+ŭlEE9E*E<Œp}D EF>ɺEʇDŋ?%EE>E،E$׽*ZEuQE]E3Eač\DlEENE(D4ALEEbE+Eҋd+6,ĪEEaE7tNDEEfLED!BGE8gE=EyEvIn)diPܕErEEnEiŦ&DvEFE3T4DY DĔ->EE]E1E%1ķ*Ŗ %EEE8^Ea@|D!EjE2uETDgA@5E ,E ERE^7+opE>E'E$$Ee2DiE[EEN-xDFlĎ+EE,EExG+ŏ0ـEEE-EVzQtDEEZػED6R ^w#E8;Eb E EZ*,i_E]EE5Eޗ=_TD|E/FBGE%OD6ĨEE>EEzi*^2JErEE>?E Ǻw 0DVE޽EJEkDjEEE _E* Âp)baQK\yEErEȞEGEsı" ?D'EE5cED ^Ąs EEjMEE` @(~hBpERE{E+QEK]$śkC*EH%EKxE=D? ssFE|E`1E~ǞE,B*'CZhE~EEYEbW%C\AEHEEkDvxi#JDEAEE2xC& M_E_EE67bEĈ'OCEEEoDŃ:tDDrcݾ<;E?ES$E|E**ƐEjE%cEER1;DֽEHFUET`DS@2EBEpEEhNN4+øUE*\E&E&EhhDDEFoNEjD/M)EJAEEE4y*C?EEE/E IłLkDrEF(ҼED\vŒW!E-E ;EEcv-+ŢaʃEE`E8EF!JD%EF*EDņEEL*EFE\pu*Ž=ĶEz EE`AEė 'DE%6EYEdDzf5EIEE̗EzʴU)-UăwwEE":EX`JEft o"wp DEE^E:*ŋRTE^^EEryE,DrEEhE=FD6jĉR9EKEa\EE/!%+G?]ELqEWEb E_rGDEiF SEqhDŴ@/E}EEyE{U"+ş#[E0EJE)E ȢD}EkE{1EDrO{Ĝo'EDE7xE-EL+: &]EB6E E;;Emč>D9EfE,mE+DhŕĬE!E E犔EA\)DW]}EEf|EkDEIJ5!œ !DaEzEEZ[DN8w E7EEKED["IJHEkEEاxEswQ*EmEvEEB*DEmEE'/D=@ .͹t?E0E.qE E6:*rE1Eg8Ek}Eey;wDUE EҳE{QDmcœĶ6EE$Ë́E5+ܱYBEDEyE="E؈ZDEDE"EYEgqDu-EtE8EwE*:A/EUEEw+Ej+b`2'zDtEFDE|DŤ$Ė[%EtwEEEվD+ŒESE&E4ELĎwXDܴE}FoE :DRlĽE$EEEՄÆX* 1ĴELEEr=EYP6DzUEzkEDELҪDmlyE4EKE E2 )̚Iď={EphEPEFETѯ^!KDAnEEzEϾDx EҀEeEEQB%)ŽcrEEVWEOE#9ķ;#ŰC|EpEAED0 *ME[EzGEEBZ'R~iEdEOE"XEp%ӀCE:EoECqDŹD`cE E/ơEgC&ŌRb`E{EEaE۴&~[CZEs EED9 HD.ZEKEEBCԫ$Ŝ'9XE\|EE\jEY}(BdEEͧE=E` šDEIQEEWC#QlOELE|EEtEm]Ħ)R;tEIEVDE4 EIMtŮ#DbE`EfkED+!kCEREE_}E BМ*y>kEEEܥEoVDEHE3E?"CDla6!G:E:EKE Eo'+ŰÅ2EҠE"EE|̔DۖEE"EcDp0Ē1ElEwE=EM */Ï#EEEK'É'ӄDEFCEꆂD1`T#)EE~1E"EGd+ /ĄpEE$E1E-awzifDbE;F&E|Dh}ğE&HEEΏE֤ÖP*%E6EEk{9EKfED;EFE D8ğEhE~EEz@*s=*~E)E\EBE0 (D4EE0EDe\`NE¹E=EUE"²t)ŭ~XavE{EzEKEea" DsqEEEtDї Ţ]EE1EeNEq/B{^(Dr}mEMZEHETEuĚ$CMEE E>DR\ ņ)DEEEtL-C'47Ę^dEEѐE]EBB%/CZEVEkAE;D }@DqEvEIEC?%Ι<\EAEE fE˃6'hCßEEaZEDAŸ ŘDgEEc֧EJC_$ΓREEdEnE'nd)AnEtxEEBE~_ DE%E۫EF D6"łm IE~EkE8wEJ WĔ)7ZE6ETE[E/!D8sENEEg*D!龷ĎGAEcE EEE`:^*|ZåE]EEE4 ̺D`:EFNEcJDeű?7EKAEKE7E9*ŦUEJEPEjV!ElؐDмE&EE jDŘē/EXE-ELEEv+V,\EV EUEs*EżD,߸EdFT%E0EV]EՌE:ÞA+cvE߮E$E;3Eڝņq\DE@EYẺDJ"EeE|E7E]*Ű)ĆE*EfmE1DE2FEDŌE#E*EF5EE~#Ê)ŅoCl<|E#|EGEEE+!ŏvD6EEXhEDӱŊ'ģE E E$EJE4ܜ(ū`ĚsEEPE/NE͛Ā#CvEaEE:D >idEER E!EGBgI({yδjEEsEc-WE5%ŒC vEwEEDj]^DbEEEMCN&ŊlubE~.EwE_EEČ*&hSpC EEEDq{7cDEE_EڧC%>ĚYETEEgEa(B(EiE=E ^E, DIEEEyC}u$EPEE.EpE[iĀ)Ř̌l.EE^E6 Em Dt"E&UEȬE&D!"JĊGEEE`yE%rMĈX*? z ESE0E+ERDsEE;WE|&4DW_ @ >EEuE69E3*L]E8EpENE<&ŮDt1EEwESDbߗģ5EiE05EaEDy*Ś E E6QE7#E{wD-QEFEm!wDŔ,Ex E6Ef^EZ0t+b]EEE{--EXG:RtD&EW F๻EU݋DF_ؽ#EE~E'EQ*3EйE/E}~5Enp~@VDE$FbEmDrěEE4EE"t7* 1 /=EEEJ Eе DTEEeECD" ,EEE&fE0{EFĆj*#þʔEEDE,E7O7èDɺEE˱E2o+EF|#ŊcCKEE ME@E5̠n'`\¾HE E'ETE>˃Ă)ŅAE-eEE@iEJĽ*q=xE*E>BE }E. Ė*Y2dEPE(EEX.h)ŒċtOE`EEEA*&ŖĆ:EE^E/EECh"j%E.qE)EE$qDhlE^ELEǮEUeD1xDrEE(REmDmDpEFE^DzŖ 绦D2Ey F\EOD:iE}DXoE)EPE Y E$e,`0DM{E|EJEhOEw.!eCkdEeEܴE$3Eȉ%`BEEEdHEk(Ňl=E(EIE_CM xa E{lEEgE m7D EgE EQEJDXDEPEȺEDP h >DE(FRE$$Dm D~uE-E&ED]DnE{hEEZX8DPϤEնEE'EJĪ*#hC~EEL^Ez%BvܔEb]E^E)JE$Y(ŲRT4Ei.EE#C_Egm*Š=v(ECEEksE!*)*@;8mEEjE/ElÏ*y^bYE`GE*ER E{Í((`DEתEv=EwEC$n 0EE ETEjCt?DKEE EME_>Dq)&[(EEcENED e ģDEEλEFD;( Ţ~zDU3EF9EZDvyCD׵EE~Ec$E:UDEEEEmVbDEDEE*E.n)#SxCjEqEE>E٢W' =.E1(EESSE'k)E̪E(EngErN4*ť4ĢyE_RE El|EA*ŪU@beEQE ElLEMúc) PENEeE E >&ŜҦ,yEΗD +6bDPCEXE`EE-ĘV`D~NEEPEC&EL~"PCyE|EoEXA;EPm&}pE*EE&OE )Jó}E:8EsEddE(YĂ* |EIEN&ERyE$=*ŐKīhE3EU=EE4̧)Ų)JTE'ETEVE1]+'+Ā:?E/`E=EEdiCw#Ųn*EEEE]Dž=EE1;EE XSD<łv,EEIjEfSE"DrD>EVFŽEĸD y\ D E2FED@/ŦDuWE.RE'EEĄsBD铪EEvEE$t CEEZ4E0/ELZt$$C EnEECEB'$»4ELRE=hE$XE|e)RECUEnEqmE= +c&ItEEEE0A*jfJK`EBEEER[˿(ޞĬYKEE؉EE3uB%l w6EEJE 8EҲC1!Őp!EzEE/ELE("mE͘E>EGaEbv*Ť.CEELEKuE!V+~mBWlE6EEބE'$)3VWE EMEގEգ'F-Ę}BE$,EIEEjb8Co$ſ-EOE E!ESCźĄ=EQEiE"E>GDR XE,E{EE=DHŋcS0D|aEFE2fD- ş& ŨܶD0E F6E|DFŅDTдEWeE+2E4E@Ī>_ND4EBEiEEgĢ`DlEEgXE+EH4#UCwEEjE@E3\'XyяEEEOvEUE$3)ᔱH EjEuE,jEGĖ*(wE/EE:E~E*ֶ\FcE"EEE|)ŽMׁNEE EE`sA &ş&:EIEE®E~IC"c%EwDE E(ӥED6ľiEjEEخEfD ŒADTEEE7Dع^|DEFv ED:Ű ŧZD<ʹEEEXDĄ k{DWE E=E" Ehs4Ń,D[EtEu1EjEEEC0/ bmE֤EEE9Dȇ9Ļ~EX>E bEE܃D(^ DE;EGEPD? 0DaEEGEJBDVD&bE?EsED ŚYD$EAEFdEEż DbEEnEɀ(E4,#CE0.E#Ej=E~'ŰCE5ElEQEYfl)ŔnEVEEswfERR-*/{ {EE&ErzENj*QħfE+EEΨE)ŹĪ1RE eEbWEA D?~ťEiE.EEYD1(w9qIE EӒEcE\UB`u%l4E3EEEz=C!4mHE|EźEAQEV,D7Šj ErFE,E$PE{DűĦ=DEsE E$D" oźD"EOFE\DŲŤD,EEVEBD tĉjhfDCEEjEQE$3UDOEE"*Ej%Eq8Ē"CE EQ}En :E n&Űt~AEE EDNE l)au|(EEE{9cE\*(U-!~EDExEwE~|*6*GjEՄEEEDø)UExEEяEʋ7O'P@EEExEp3SC-#7Ȼĺ+EVEEzEC;ģ?E~E;E.EMD-j,ĖEkOE?VEմEĎDںgŚDE FF/E靶D* + wD0E F^E D|9]DEvvE +EEEwėxLFD*EzEKE\,E˰ŵ@C-E EE-Eur$@o:C^EE,ERBE~'R؎EEEp2WEx#)Ŵ-`EfEt8ElEB*!ĠuEEEmE0ERS*b:aEEE> En(CIJLE1E=E*ԓE(B%L"7EE3EEz.C!:?#EbEKEEB !DF2|E~EEyEgoD7ťĚD @EEU;EqxDV{DfE_+FEDZŨ &šDEEE2wD h=tDKEE %EK+ E`4&Dz}ECEE!EѽW!CAEIEƕE|Y6En%|BEEYE;KE1(QZZEE9E1`EA,gĶ*N?!€EEEtEd& +ł=TmE8}EO?EXE*)ż&}XEtEvE(EEjEրuC2#F*EEEZE4DsgQ"E9EEErTDV;ę3EΐEEEѵE;D"ŜqlDmE(E4E4Dń ŧ7DXٻEEBE7Dlb҆DdXE`EEETSGŘ>DFEJ!EEEđ *CEEE/E&'$Ԗ!CXE5EEDE8((żxE0EEEBYEz*høEEE3mEH<թ*@))sEHE?GE E>L`*gq_EE|$E&E>DUô(> KE_EdEƔEtʘB%',6EEFE5ETԹC\!<^ EErEE(D1{sį EEf)EEG1vDXbĤDjLEENE&>D DEFkEOD}_H:DZE1EOE%D QĬIŰFlD聯ExEEEKĥ0DI^E6EE#E<"%٧C$EE EM8ER)P&ŔBE+EEoMEJĒ(|yEhEREaERxa+*4;ĐeEE>EvEnd!Į*řCCČCkEEEeED*πWE$«EBEEREėW);PEiE EBbgE\wP* zEWEE{EX/*T'AfEiE EE%*S)łڈĒ`QEUyE EE4&~.{*FQ$& uEkE+E3XED*ubĉZ`EZaEEEhß)KEE9 E:dERB&Ÿx7E E,ES؝ECb!4"EƑE:E 3EX"DhHRx EeE|EE pD8)xDEENԸE\wDIŚuD EbEHE/D0gРDEEED+#ŦqD7EhEQEn Ex8D#DEcEtEb"EW!ňCʝE EE\7Eĩ&;bBcE+EzE>KEĊ)šföEEWlE DElEB„Ev)3*|J XEE/ExE5'ŌhCEEXJEHEY.C''$ņѯ.E\EE߲E CL-fEYoE~;EETBDߤ bđ[E E~EmEeD:9DxE F~ ET0D ʼn KDEd F6@ED^D+AExE EREPDGE4dEfsELEy?Du+EZE_ EYX+E#ŘpdCEEEE?Ev'QE<E"E#oTE_̃)xFECkEEx&iErJĵ*]WĽ@xECE7El}E *~]YđdEE@EE;i^)ʦOEEEE @+]&Jğ:E EE7EeCV;"jG.%E^hE*EEDfIű\ME KEVEEdD(FܕDEE-E>DŽŪDykEzFlEDtB} pDt;E?FE@D$ !-z}DEE"TE|G E 6/DEcSEGdE!EI 5 CnExEE4E"ķr% =BEtE*EHE)Q(v:êEڗE"EG]E|Co&)*Ņ3 E^}E ErE0ĉ+u4pENE:EEp\*~At[E5EE$E/%(:9oFEEEHE*B$ʳp1E:EEdAE_C` v`?EfE7EE4p7D0IJE`EEM4ETDL yĦDEF詺ED ] 3D] EI(FEFDj=D4EEE}wDl&Č^L3]D٭ELEOEE. ŰDlEXE E'EOJ#rCE}EvE\EFD_Ġ=ŮDYE+EEE YĖ,jD[ENEEÔE(#D`Ed:EE$EQĩH"?CߜEz EE9E{<1I&BA+EEoEw/NEtD)ŗ|yE|E'EbE&_Ğ*o%2E:EVnE/wEĮ* GjEEJEEF])f#:VEEDE4E6@S'/mdAEEE6E0NC&)$$ҺI-E]E:SEnE Cr1/ĮEEQEiELDŖ EREEEMDť6ŷD]EF"E|D ů D1EE"E9:D 3R(rDlmETEWE*E1@IDEGEEEDőCTEhEEq-ET [$ĹGC=͘EEEBEh֞{'HDZ+9EEhEHVE.<*NoÔwE{EWEVAkE?D۶*ņ6!ĵvEEEzE;*aČ!bEEERщE/~[(gGMEE"0E*Eh' BZ&s)9EEEECl]"o`$EjErBE8ExdDlĂEENEfE:lD0ļD zEEMED5ńbD?EAEE>/DŇ 4$DSEEX3EjDstŎvDѰEEE ER,fn(DEEvE EMąT!ClCZEAEE6E%j{BE]Eb_EJEV(hSEE&EEUB_EaQhW*~7EUOEEEsE,)h*m;mEbE|EEö)yYEIE2EkE/(՛Ę EEEDEEE!Ci$=xt*0EnEE-ߠE}PC j~ErEEb8E>D`ŜvEE=UEfIE{DaD.2EEv׻EⰮD ZlۺD%SEYEEVD3Xt0żD EhExEDGyÂlVDE>EyEE DDEEE)EĚ#yCHEE^E^>EUL'ȇ:uE2'EE3SE^)'ÞE]E*EgENğ*ŀyEiSEEY|EN/*$UbeEYEE9IE@)ţQEEPmE}E&ŘHL\2iEEbEgEò);tTEE<E#E`Nr'tS?E)EGEE`fCs#?z*ETE0E$ET D1M/EEEEBxEYí(Ĥ=KE&E&E:hEHJB&ŎC6EE4E/5E Cm!$Ė!E1EuEE;%D]Ncv) E ]EܟE}iE$rDŐēDVEEָE>D őADE9(F@NED`~DaEE9EODb pDIӯEEuEnEF!DhEPHE*YE1#Edj!hCBE!8EE7E3%(T0B9E>E*+EުLE2 ((o{mi1EEE~kaEb*RíWEE.LEuE!Ĉ+Ś BĤHlE/EκE?E;)ťxMWE[EOEÎE@'ȨEE78C$Ŋ(ī-EEE6*E#C<܂AEoEbE0EXEDOPȌĻE>EcEE!D .DBYE!F4EܱD Ŷj nD E}FED ŌDEWE\MEn>E: ;NDAEBEjgEmE4DzEERE+E{#WCyEgEXEL@EĴb'eXڏEEiEUET:h)YE_E|EiEGp*ŋHīxEE^rE-*R7BIoEJ E1EJEc]*ńXuWZEEE`E>M(A/FExE1EBE$ C_ %{21EEAE=rECu= ŜbEEWEEH8DZŽqE>E0kEEr~D/Ŋ֙DYuEFc6E5?D DǎE" Fl#E[Drل ID_EE&Ek8DYDE2E2OEE`@ DE EziEq(EĂ".Cl0E(EE@=E| 'Řs޲E, EME1QE'A)ūAƇEEEDfEP*ŮRzEkEE4zETo<*QVfE ELEREÛ)vGPRE]eERER5Ħ CCEE_E~;1E%n4 CFEE"EEEH5l(ţEEE"E"(ZE)uW*xTEz@EEnE{}7+))+d)rEELgEفE *ŵuj]EWEEREYFÆ(}ĈIEMEXEEBh2%tΰ4EvxETmEޞE)C0!,5E2EYEHEVk,DD( EME EVHEm{D.ĺJDbEEpEPD oŚ%D EFEMDC5D#ǷEE$EDvĹy3fDEE_E<E:0 D,EEhCEz%%EI;."xCÜEEEEo9Eۨn&|A.EE/E{GNE14@)f~k)EEiEncE\ġ*laĊ~EWEEFwELĸ+ŐVFiE8EUEcEP)ЂUEEFEE‹&')n@EEEEOC$^#:,ELEEjErCO"ՊEHE`aE` END7+ujETE͊EEu&D6Ÿ@DEF&E^Dz- . ŝDE\F*ZE D~HDEd}E$E0E~ĦŲKGD,+EE>EEĎC.EEeE4-EWĢl$ń:C,ØEE$EQBE/ĸ')E^EEpWE\@)鴼EE#E*lEDB + !ijuE\EÄE9EH*Db¨aE E΀EEr\(iDLEAE-EܓEB%S68E4 E0EEFC*!Řk }#EVEYEǦE DzEpEpE@E(pDRňkD=E~EEND&ӈ0DuE-FEDB. D!EEEwzD*ħ/QsDEcE:8Ef E ĄJb 'DXE$IEEL!E3!ŀC7IE'REEI6E͌?%Ŵ4}BjEEHEg#KET‘g(LZÑEE6E`EsggĴ*˂×؀EEEwtEa0'5+dx=ĐmE~E:EEPIE)r|ČXEyEmDE~,Ex1'_DEE`EEP"C[i$ŷĖ~/Ez0E\EoEdC~ ŷEEEoEtBDl6@E0EIdE*EnTD߲@D.E\F ڻED ,ŬDpEcF%;EDŦűD EHEEuE=/uSDgEEEREaZ<DREƒEE()EYē#ʘnCEMEXE>Eغq'=GEE!ETEq)VE=E+E9hEsBLu*cĖwyE1EE|E_) *ňX5dEрE}&EHfE0 )ܳHPEHEE^E:&F!Đ;EEE=EC6"D6Ĕ&EJEE\0E9DŶ9^E5EEEmbDH ĻDEEEgDizDСEF ED< XDqEEE(DghxwŧD3E[EpE*RO4hEPE0EE$ãX)ŐĨSEE[FEEL#A„E'L?EEi:Ev)EzC# ľE*EжE-EEDUSćE| EEܬE2_TD$FŤbQEEEƵED'Ey~DEKE'E-D F ZhDxڻE-EE0Dt1^DbE_EAElEIJ;x;?DdVE"ENEEdQ zC\EnEEl/E$$CEMTEEdDEvF(EXFE'Ep_YEzą)*ELE|E|mE/=|*̖)OtEErFEE&7Ø?*+h{_ENEb6EEUV(;ąJKEIE/{E9EƻB %zuO6EEU[EEdC!ŪZ E4E~EEc(DwXš E0EE İEvDT/DEE nE΢D ŰHłDEF\E!DsŮőD]EEL?E DYoĥ+DXlDE.EaEE|ıhsDnE2EkE#E.E/"ŬC`4E*EsE8E?Q&Ř1B^ʓE,EEPMEĊ(z0E EnE@aEGac;*jqEEEsvE^!կ*ŚCZkE*EE\TEfÅ *{EWEE݋E Eޒ'Y~`BEERE=E4FC:H$xr -ETEShE<2ECgWEE*EERhHD#LEE+EvE.DYUyD*^EEмE@D Ž (DzHE1 FEDP-:DEE_E}EĎ^)MD;ECTEE-GE^UĻ="CFE.EsE,EMġ%$7PCliEEVE1AE?I{'|ŨE&EECUEf)^EEnELjEPgGS*1BwE!ELtE~E\L*Ů]ĉ&cEEdE_EL?)DXhNEWE*E EKAb&eҩ A9EEEƾEnDC`"{ĖK$E E'EIEV1DKT ĜEEOEQEbiDźĿ\DEgEEDs#ŠDtEF@EDi Š DyEYEEDĿJU2yDEvEErm E<()Ş+DڧELEbEf E!"CExMEED4E4ƺ%LBn7EEIEIEX;|(6Q\E EEo^Emyu*;pEEErEԋ,,I+ń~:nElEa EHbE 4*@-y$2ZEEEz/E# ("ʙĪDEEJHE E,Ch<%Aش/EE~EǠETCp iE!EwEoE:DtEEE9زE#D]SءD8ENERVED HDNE/FE? D7ũ6Ŵ|DEĹEE3E\Em*EFECk!Ď$EME>EkiE-DŻSE ECEJEPEI{Dy>ĻGDEEEND} ŨD]EFd+E^D|[4šDE?E!EADvĀHdDEͳEwEE-ĊQCDE2E(E%EÎ3?"IC.JEEEbV:E8ԩİg&L?ǒE|XEE6NER )PòE@E[EW3dEcY}*b(O~ETjEE6NxETĠw*, IJiE}E5}EDMExp)ŭrTEXEESEr˄E'Ŗ /c@EGEEE$VcC#ͻ+EeEaEBEDm>mECE&tE`EOD:}Ķ E9EEhIEXDw)ŮŪXDQE'FEfqD#@ DkOEFEQD4]DEFEELE4$OfDD.6E`EzE2E|CE>ELoE.Ern#:4CEBgEE<{CE ;ԫ'QtE^?E$:EWE{9 *gNúEpEjElEo=|*"DuEEE`]EÐ*``EEE蜊E[b't)OLEۤE*E E0GBd&<r7EEEEr]C"uf"E3gEkEq>EtEE6÷*}֯WE&EEҜEJ²*(BޜKCEEEp7E&CG$ =.EIEEmENC`wE*UEdE,$ECCDR`E_NE{EEDĶŻD#EF>EJDO ŔŘDE FBEE|DtŊ3DqEEW EȝE$*żeQDрE>|EhEDyEf]DiEgfEMLEa+E7 #ŪgC/EEzsE?EF2ĤN'u†Ep E&LEtTEs)ÈfEzEEK0iE`gI*c$fxE4EZIE?~Ef*4WİC|_EEE-E<|3ExkW%0ZBETEֻE%HEoX(ŵ;EzE)mEh\Etoy*ŭ݁E7wEcEqEN1UT+I4WoEExEEh+ú*F u\t[EEhkE،EO&?K(J˘UFEnEEcEBD$(1E4E:EEa*C^ BALE:E EGE%6DF2:EZ2ELEE1D}UDE3ElEѪDc [qDEF*ED9>őlDEE^EsDn`[D߭EE>8EEGē=\DE(\EE\'Eڡ"#CLEȭExxEEErEޚEܺzC"5)EjEE=Ef DB/EEE!EYDBĿ8EfE>ElƵECTDňt1DE^6F]ED'| $DЫE7FEDHD0EBE=EEl6<=DtEBEAEE4ľB ńC.Ep E`E0EN:$@1CNlEBE1E+EE" (diJE3SEZEolZE,&xĎ3*ہݱEzEECnE:ľT++ĐSsEEE1E*ckĀ^EEE#EXT3(IEN9EϟER EB% @5EEB@EEFC!j9 ExEDEE~*DO:N EEEEN-xDt1gD3EEKED ł0D.EFE(D1YIDExnEE=DhňiDYEiE E E]hDOE EE #EޗJ"ŲCE&E mEv8E &Ř]AEEAEVME{ĸ){üJErEcEbE?`V*$3~EE0E wE!C*~,H3jEEE‚EÂp)'=z+VEeEjEGjED ^'x)fE)EmEkE /DVJ*0J $wEEěEeE2)v`ĸbEHEEE|Jz(6 ,NE}EWYEE-B!&ڠē9EI%E?EERC;"ży$EE{oE3E DE#EG#EgETmD`VD0DDEBE&EBDL dyLDcEEfED|(ű 7DUELEs#E`}DZāŔvDE0EE ERQJ^(DØEJEE Eb![ѹC5/EK5ETE5EĒh#&x$BE*\E#EJE*))aV*"E EEb_E>jx*ŎSá$E88EEXvsE+y*{=wmEpE[EރE6t*ŧB{YEE$EFɍE5](L(~EE}E ;EMECY-%PԶČ0EJEEE7C# VEEEEA=DēEE'E#EDũ>D0EhE:ûEĭDb ]DREEYED}tłʑD#EE]ETEqSEɵl;)ju?4EE8E hE]N+*(+zEnEE"|El ĎB* TĵeEfE0EPNEݑB)<'TQE#EƣEEa iCEJE[5E $3EBļ%ŴLBzEE4EFE^(ų,EEvEƈ[E=Lt:*NEEt3E:pE5Ķ+ť11qEExE`HE&޵*ŇpĘ\E.Ea\ErE2æ(,HEEuEE+B%R&%2EEESEXCC!ŴĐEzE`EѨE֎0DPs E`EE½EtDĜDoEʐE{1EDwh PlDEFrfE|*D ŎźИD/EEGEvDj1>`cD E{E"EqEBYŜ4DEEN2EN&ET #ŎCEEE;;EǾ&& KqE EEOE1lĀ(Ř EEHXEfbdE[ı~*Ŋ W]}EEEăyEk*ŌJ~UiEzZE]EET)kđTELE+EH^E WU'Sď?EQEXE#EjCj#łĖ*EEԴEEDTųCf ERCEHE ԬESD,l] E<&E sE zE DhŰI/DH{E"FEoD+ D E,Fd EDWā=tDlELEΞEE|׷DDxE#EEEc<H@CHESE&E$/EVI|#(C+KEEE\0DES"'•E`EEXE?}ėl)ŋ޶EME0E/[mEK=2*U%H~uEE!EȝE/ؒ*:+eĤ`E6QEt1EDzES.(GĂvKEEElqE B&I6E_uE!*EEνC"ŖĴ!E5E1EYGE$DRĨ! E#EEE>VrDYžtDEEĸElmDu ŜŨhDEF$+EXDwD5EqEED\dh4oDPEFE:E~@E n DQԦE|?E E="E]"CEEE7E%R%BEEE\ZLE?ĭ(Jt/EF_EPwE aEc*6:REcEBEuE4i"l+oBč-lEr EE|Eվvf* Č WEE"EwE'B(v BE<9E.yE҆Ex3C$>ł-E$E-EECZĪE:hEEEjCD rŌ"4]E'E<3EjE;_DŢ?DbE+FE{DX jKDZEBFEDŌu|؏DEECEQE V PD\EqEiEs>E֡D?EOE]ER+Eʚķ;#YCE[EE\@E끠&EmE\ErUEڂ)Šà]E*EOEiEHF*xxE|E\kE!}E`%*œ[ZcE:OEOEXE )ŌėNE6EE(EA&&4):E E~E ٜE]|C\P"@Ĝ%EE:EEzD .E,E E(EaeDB[Rĭ~DE FʷEDդšDbE+9FE+DG ŦDo¹EFEDČ^}DbEtEjE EU(J,DOEmEAE^4E[*!L,CEB[E0E<04En|S%OBqEhEEIEĨ(jB^֋E7EkE#{]El*&ô؁E!cE~yEKqEL-e>+Ũ7P oEhE E EJ5*|eu"GZEEEk;E((WĤEEEEEeCQ%ŬO1EEfE`EC2b |rzEuENEE؞6DnŦFzETEIErEDOięD^IEFED ž.DjaEN FE_DTFD EVE{7Dmv#DZE!F!E\DńV NDnEFTeE?DJ Ą#TgD&EE3EE9ĵ9DE~EEEPĨCߠEޥEIEpJ1Eo$ňC*E E^QEEE7ěB(şòEEE,ZE޵sĕD*Ť)qEinE EnE666 +k3)RrEE@E܎Eò*k>^E|EUEzEV;IÜ(TsIEoEZEAE B%Łĝ4EN&EQE^EC+! ĠED^EݗE#E*DĚ E "E|EkE\FzDMdx>NDbEHE-xE*Dvq ŞDHE.FۛEDJ'˫DdEEfErDe|ŝueDE.E>ELE<,DEE6.E$E"ŋCÜEjEEp89EM!X&{A EwEyE MExq)E]yEEbEqT] "+ /ċ}ERE֨EwE Ķd+FĄiEEzE9Eڶn*aUEE-JEΏEg©G'9D,@E"EtEiESFCo#Żĉ+EE\EELOD ţğE'ErhE~.END1~%EgEEѴE'D4wDvE"F(ED , =!DsҼE-FeEtDlnŚD?EE?Ez^E RH qGDsqEE2pE&1EQW.CnEAE E׻-E Ġ5$`ACEiEKEGBEuƢ'`1«ERE"E=WEe<)YϸEE5EHlE B*Ż6uEEEbEJb*d`İaEvEE,GEherf](=rQMEGfE8EPEWB?%4:8E<&EUEEfCt!:Ġ $EbE=EצE|!DĢZEO{EEE?iqD/ŴĿDWEFkEqDhžD4RERFcEٔD BDZEEEcDRnsD{JEEE E@Ĉ&D|EETE?A!ED"zC8E$EtE5Eӭ&&x|B|tEuEE1JE?)|Z-EE E}_EĎWmEtENE7E)Ŕ}XEgcEEE2[;'6yDEXuE{EӗECҏ$ͷē/ERE Eo=ECM LE^bEE5+EôAD~fEzE_[ELE.D8šĿ>DE FऻEaD?{ ?DEEECDVKDE=EElEe]GRDEEE'EJPDޣEEeEP*EH#pCJEfE*kEG2?Eա2&g=5E^8E-ENRTE<)YäĆE#|E0E iEQK*[FyE:jE/E0}E ļ@*WĒGeEשE8EEbܜ(kPEEBELuE`G4&Ũզđ;EE*E EtܒCШ"ŚĢd'EER E,EbjD0zpQEHEEEcD35UTDEF,E8 D>^ŬDFE FLEKDD ĦDhEETE D3Ŏ,Du?EEERX EIJX$:4D?EEl-EMEĠ EFCEEfEP2E:;P%BE<3EEYHEĠ(Ŷ)VDEcEOE6\E>r̮*ņR~EEhEpE2H+خ4ļpEBEbEuE7+*Ť^sE[EEJEnE1xu(%ĊGE.CEEBEB}%ŅK82E3E |EE`(C7!wEEӡEE|&4DtXĂEE5EıE؀DŖ8D%EEED  fDt1EEE~PD(N&aDE3KEnyED"Īl_D5EN~E+E ^En?;DܤEE\E]&E$L#ʼnCtREEE;E|Č;'@QՑEEfE2PEğ)|ܒ1E#E_EJeEvYĜ*c|ĸ|E1EEyEQ*Pĭ6hE EE(ՆE~") SEqEfJEE;''#+o?EE4EeE$`yCY#Ŋĵ*EEʶE E* D XŢXĸVE0EEwE٢UD=wEE$ESE`D3DGEF1RE~D@T ŇӯDEqE2E&Dz~M&̦D E{ELEEx(L:ADpENFEEEĸ:=CE2EEP$0EBg$< ,CմEϊE E@EEʚR'cU6E~Eo1E~YE@z4|)Ů$uXEpEÔELnEH=+*(BtE^ EeE1EL)gć;`EXE`EELrRN(͑ąKE[EEEhHB%hح`6EEEEC!]j!EZE}EeEXB&D._Ş EEiELExtDn?HDSEE1E,dD$ ź`DEEJE\DdžřDBKEE/EJDеՙ]]lD\gEE^EZGESfD:E#E^E#E*C"6CEEE8E;҈&BȧEC"E1EV-MEą(>EiE:EVlEԟaELcyN*WĢEsEސEt!vEB#* EkkEEEEDÐA*ŀ6WEgE.EOǎEC5( EEꦾEDpfHC7EwEEqE.ð,)LΠĎ0EEEmmEDnjłN;DbEtE?E\EfB[*š'aFEEE=EZDžDZn zDtEpEzEEE**ؓ?\E EEbE6D׌0nDEdE[Eb/E<2)SKrENEU E2EnCK \Ă/DcEӬEkEQvEq&Ō=5EEAE\EpB}"ğEUEFZELE9u!Ŵ]BEtE>E1EVZx&!EEE EDyEF}CNEl{ENEpE`ː)ŮH1EE~EB7EYD&Qf0?D;+EEE~([ElF*`ĉGEUEEʫEjD V ŮDeEAE|#E6DE>˃d*ٲ=]EE7EaڡEF<4DY ŶbDTpEKEE.EQJ)m>ÃsEPEEEC,D+EEYEIE]&[27E+`E6EhEhBh"{WĢEE#FKEEa!@BB_EE5UEcʂE c+&Ŗjī_EEEʽED%KĤŠQCE}EDE+pEj>)̛Q2EBEREݴEDrEADEE`EYEHt*ғ}ġHElE)E!7E)D A ŷDeEEܴECE:ģ*9ĝ^EEX EEc0D*b;D5EEE-E(%%stEfEEgEûC(Ŵ\DTEFEy;E^2%_t(t3E5ESEETbB"|^E$6EFE8_ERp!CE E\BExEtf&Ÿ EEGEыED)ĮhōJC EEE2nE> n)ŽÜĬT3EEECEDHruED7EE^En YE#K*yIE[}EvEE#hDld ţ+DnE(EvE|CEZO*6 _EE*EJ"E+D\vD'EE}qE ~,El(euEEEږEAC;ŇSKDELEEE)iİ%^:ErEEE;AB&# cE#]EfFgE,E !CgE;E%0EہE:&)ĦEEEE>ND%Ĵ`HCEzEEnEWOT)heA4EEUEE5ZDpwIDGtEErEtZXE('O*ҫv^JEELEE9a|DL' Db/EETLEAE6e*Ũ4<`ENEEȔEJ)DŅj4չDE.EEf+E¦đ(>ôvEyEhvEEWCDDiOEEėE>xE %&@ XE,EEEB#ߝEE'FGqD% *%DvXEELuE>E-J*Ŧ+ qcEEڇEBEtD!- ]ZD|ָEz.EBE((E炪Z(ŞևyE{EEEE]CŬ$UDsEEHE#EҘě %Œ=†REExE"E 0O#eq EE.#F.EkDQQ l OC-E0EE8E9bf')"EEdENjEBiDOÏDp=Eb]E3EjET**]IJ8EE>E@|EdD4mWWD&EETECTEZZ*[Nl.DNElE6EèEmD3 RDEEE>E}Ĭ*m(=dEEv=EE*GDH\E D~$D„EEE^iE&;)ŀwH8EEFEڱEDsGŀGİZDEeE&UESSEA\x*i`OEGE8ERfE9kD&^ HBDx"E Exb4#`-ԓEEEuE°$?ĪOE{EF8EEyD,ĂʐC=EEuEyEQ(Nij(EJE?EE0&D$DEDnEtE#cE*f*ŽMG>EKEEBEݖD oD4E\EEpMEme*nXL+UExECE(ӥEUDŞJDdE0E|E7EĚ *ǞkEaEYmEEDUo^|DESEE!E˴x'ŸPEmEEElGCW ŴDLEFME" EY#ŀ[@*E5Ez6EE7>%f@EEEMEFDĨił+CjEvE^ExE._(՛h)E[E]LE}EDT# =u DJEE"EbE,ħd*m?EEtEEADY VetDED@EUELEpU+NvTĜVE%E]$EEiQDgŦDLEAEE6EĘ)ĝkEYE_EhoECȇ.DAE E%E+ Eg'1]ÙEYEKjE!El=C ĦDZEENEC E\Ķ#8WArE(E&7EE@1n%YPEEFEDCE.{E7EwEY m(,*E6E EEDyƠŤ$D"HEElEaEB/*šWĞ@E5EUEӮE7D ň4ōxDbߩE5VEXEKERtĖ*QNVEsE,KEEMDgŏ|NDnEESHE\n5ENfԵ) :mEEExEPCɨ+XDϣEmEEcEEEPą'#ňo+BzEEEE~E5Ë%:dEEsE^ EҒDRCfCC.EEtEvED(œ0,EoQETEVE3D$ʼnjj*DVE:E\E_E6ıL*MĹBEEs+EgɭE1D$ $4nDEۍEQ}E JEyR +BLXEBEEKEFDNf6zDr!ECxE`EP3E }b)(UunEJEXEz*ECNuů eD9bEE`1E"JET&]zIUERE7EяECg!l{WEEEKEAE"`kBHEdEETE#%Ŵģ?EEEdE0DĘ(#C9E|EEtEPÈ(B:J-EEEE靶D6͉Ū.DEEE!_E#8W*ŽCE&EEEe΋D" 2D*EEF|E IE|*VIYE-EzE~֣EADd׎$D E}EsE[2E)y zoEI?EEPEVCXcDýEEEEݺe&Ū8hEEEE}E^C!HE+EF EI#EHpl"ڏB=E2EEE1Ø%zE‚EJE3VED4Ā8Ŵ|CtۗEE$ECsEnzK)AĄ.EEElECD >7 3DCE*EsE:T^EV<*ƃėHDENE5E(E;ƉD֐ Ũ DHEE-!E+GEH~X*(G8ZEɧEjE=E>?DťI*Dd,EEE1E&)7~pE[;E^rE^E:CJBăDEcEEE`D&QZZEEE/EdB!)EqEN*FuEFEľR"BEUEEXE't*ŌlqEExEREED "s 0 D0+EwEE(GEǀ>*`C<[E EVER E$DErE;Ev[E[E*ŖaGE:EDEED { ڰDǬEF:E+NE&DEbgܘ*S=z]EtEaEE/5DDYE EOE/E=fA)GsE'EEE(C>ůijID*EoEEEW%$4ÀdEf=E&FEEQBe"gmEEm)FuE2E$.ĩ!B/EEvE{ՂE_{&ѻĆ E[EpE˽EADĭ!>CM~E:uE3ĚpER̟)ƝĻ 2Em+EԛEgED-D*x|J@D.E(EzEJZE@HC{*v_~ĪdHEOEEmEaD f fDzlE!EECE*6;E^EoEEE1DgŻSŽDE>EHE9.Ec-)$%À8tEEEELE$CY7;sDEFDEE%ő9-Q EEEqE=BԎ"E7EFBEIxENf!Ŭo CEEmNEE9nÚ&S EE4EESD:*C\EgE9EoEā])J2EEElEE+ELKS)xKúvEEnuEEwCNaĤ_Df:E EƠEEĈ% )ʅEDEĬEdKE>BP(#?E E'FkED bE!CEpElEE&^^0EEuwEE$"De6TrCTEEE}}mE6 b)vą#5E E^EϳEDtpKDE EEaWEQ*ŷ,uj KE'EbEE/yD& ͏DXE;EEQAE *:y2ĤaE_fETEbEF&DYO4RDַEEE*+ERĔ(Ř]ÉAwEpEՒEMEC5CDbEFVOE{Eĝ%ŹLREN8EEREmTAY#uĪ E@E FEcD֢Ď!Ƹ3C- EbEE/Ejx'tEFECE-ELTDNsxC(E_"EZzElE-)85E?E}EEEKUD{lNDPELE2NE8VE[RZ+rqnLE\E{HE EwD) Ű~DܮEbtEjEO@EW[*-bEEEE"D6IDE3E|E|)EJ y(Ũf xE(`E \EE͢CUĒD6E\EEEKĵ%V?¦E4EEQEuAx#SĈ ESEQFEFD%Ъ ŢEC03EEE֭EnY'fQ E$pEEEW@DeCVaCEEEUkE_)N(7EjE EòEmD|Ũ6ӀSDHE%ETEUErzVĂ +oĺCMEvE*@E{ErDŠ źۓD-EEET?E^*Ž+bE%EHEcED8|DEFEVE/)E\I(0b?yEEEJ^EќCUDDvEEEE%%ŮPEDE'E$E ޗw#(u ErEF8gEDoħN tKCVΑEEEEa E%â~'8x!EEErEvD_D^.EcEEjEz[Ĝ%*\7EEE}EF%D~RVD-E\E0ETEEZĹ*ſ$mļNECEAOEEmDx skDɯE:Ez"E!>E|*Ř;)hdE{E`EEXD=Q0DE EEd(E|߫Ճ(ãyE˘E)E*ECv4ADiEF>OEWE)$UغEXEETED#ŶĝT E9RE FoEVDwc ZC rEEEE<'Բj"EvEUEVEDkŧDtEjEE!iEI)ř8EogESHE0EDK7ů8zYDEVExEySE{[p*,j/5OEGEEsEllDS D8E>EVE=Eĕx*9%ZE|fEDzLźXDE}EEgEjY*{;EEEJJE"DxO'bDEE EQE bO+ubďPEbEEEdDl5QD E4EEަ;EC)>!Ğ,gE.EsES؝EӨD1bQD_YE|E E%Eگ((藮|EFEVgEEC:DEaF|HEE>6$0@T EdEFUEE@2\ I$vEf[EfFLEDєnC“E}E*/E:|E>d5(SĮ%E|E.E"E=DĪ !Q#*ŏċ;E}9EEXEZDBn2ŰdD)EEuE5PEcn*aĉQE!EEEaD׹8&/DH`E4E*E%:E xY*!gEE4EE4 Dn~DEQEEW[$EN<'ܫ}EEjEE}oCLmxD_EFEEg EZ$PE$oE E`E02qŽ$ōdقEiE FYEּDdpĴtjCϓEgE_EEH{EÈ)(FԭZ&E6EN#Eڱ1'Ůn~EGEFEEpgCh:)DE@EEM= EJ-$حEfEEp0E`U$F\MEEF:EXD X eCD[EmE EtzE'DÆg(F.'E:EcEED]0eDǞEdE EIeE&,m*a7=EE|rEBEDG GTLkDEE TE8OE7l2g*;Z;SEFEExEP&YDb ŗ*D2(E2LERE8E))AiEEF~EdEDD DYgE_YE E"E@1Ğ'6`ÑENEETEXCBb ŐrtDE F*DE) Er.J#ŔJUgEEEE얿$ņĦEYEFED ŐTCEEoEyEȓ(稫ľ(EYEE׸ED?DEZE EjGdEf)\*8KB>E,EڽEE !D j`nDEvOEESME2nČ*CYzTE$ENEEUDn1$DEE E97E**DQ-kEcE{EEfDJjŔaDfE?EE{!ETY'L×E`EEEh~E*JCe@ ŕİD"rE!FE E#< E"E*[EEP J% CEiE[EbTE0DXC`EEquE]"yEò(ŤFA)E/EEEE~DC D;EF-E Enа#@ AOE';E EE‚%ħE EE"1E?jDFCEPE[ElxEú(|Ď)EE2EEEDzg)#D ErEeE.bE.Ҕ*Śb@EEZNE߮ED +jưwD=ϩE>EXE9LEs*ŠCRVEPE IE>@E;ND iRťDuXEVE>xE5E7č)rlEXEEEtCůJDE}EEtEp'bÉÊJEEdEEX2C^ !zDEF+EU Ex!Q#BA1E4E*E>E3æ%EhEF.ED6Cj_EEE/wEbw(ĂD+EEE׷ED2 /t%'DE%EmEEaE02>v*dAEEEESD7 ś0ҡ{DEEq#EܷJEt)+4~OĐlWEEb7EpELDj"DOE]EEI4ECĪ) mEX}EE:ÚE2CTc}D1E EEêEw'aEEiElEXJ C!c?"DE*F1E-E#Ő:BUWElEE Ed K%EZEEE #ErDwrCEEEjvED) ,E3EE‚E$ܸD|)DqؠEE.E8`E]6;*ľjBE|E\EVE>hDa z2~DժEEEsIE@!wĹ+M XE EE_=EHDTAťDFE}EED)4E p)ţ #nEBEE]E؄CD0=lDIEqEBRE<EϹK&8+EQEEEC!4zE8E~EX3EqEĎ#Ũ`BΌEE$E>}Eþ&šėErEpEAED DClC8EBEE)uEՑ(,EEHE&E߶Dфŕ-DkE*E̢EUB_E/7*ņe܎CE-E ENEOD Nd?DEEsE~EYIET{h*uJYEBEqEE*CDkłѫDoEERE2E@؜)jzUoE9EE⣙E}PCE D>EE)EEIJ&m瘂ERbEؤEEC!ćE.2EyE<3E\E5Md"1HB9EEE[E_q14%EQBENFIEDGyZaŸCEVE[EsEވèR)1L.EE^ELEODlhŧ2DơEEE^E;Ć*věcDEE2E.XEMD"N " łɂDgEEGEiHE_Z~ğ*JGĵWZEEEbEH@DW[rDEEJE1E"ē)6upE BEPmEfECr5ĄDڽEEEUE &,\#ނEEEEB!FEIE/*FDEvE\="źBEQE ElEO9&`ĨEtEܪEl"E4DE/Ļ.C/EEE^sEG&EEbE Ed?Bzx"J6EEFEESP"Ŗ+B?JE SEE}E:Ui&?ĐE&IE|EnE3D /ěEnCEڇEE<ė ]EZEr{EE+5D1nٹD>EEpEg//E G*)n isE4EE*EXCĺD%EEEGEĮ%&Ū :ÄpEEwYEɍEyB F"!^EvE+F-ElWE !9BEEȪEՂEYÌ&ŭۻEdENEED$Dxn CZE8E1EpE|Ҥ)ŢIJ1E1EgE 4E!Dwk>DCEE-EZEIı*N}3GEn0EE:EyтD N@ ^D@ECE"EVDE>d*Ť đYDnjEErEE%0ׄEE8E/EB&c"ň18dEf EF'EaEܵĕ!żCmERE.LE⑂Ei"'ņӺEMEE&EһDŀuC7EE/EoEoķ)Nr2E EEЌEkDŷ+š;BDSEEEYEOJ:*||Ć5IEEsE0EDł DíEhEEuCE޺*8Օ_EepE8EeEE.Dm'nDcEEE-EZ4)wRÞtEE(EE C(NĻXDEEEmE*iĐ&Ş!;vEAElEɌEhB#řĮEDEF^EEMĆs!ũCXڏEELGEUtDEK@EE݋BE;*6,&`EELEEX)D&l}ŤD:eEt E.PE"+Elij) pCvEƵEEjEXDCVŐ7DuE}E]E{dEv>%šb ãEEEq}E}&B_#ӟzEźE FEpD\Ĵ ŌpCmE~_E?EE(ð&øēE\EEöEOD68TCƚEEuEmE0 Ĵ)Ł4EdEEyEݕEXCIžXD E FEE%ӆE=E&E#[E`AΨ# f E)QEFEVTD* QACy"E EwErEjY3'$Z EIEE 3EDl`;o]CEiE+EkEBy)Ŋć6EEk7E}E|6DdQD׻EnE"EUET+ŌpYHMEFEOEyEptD $r RDE١EE[?E,i*))+8{bEEnEE DŖ|oDLEYEV0E)EeĘA(Ũ)xE0EEEC&DńDE+EEfgEZĀ`%n*EIGEf EE?# EE@F!E|EE"EMD&NiDEpEE:jE< *Ŭϖ>7EEEEdעDŝUD,Et9EE~TE\wYą*ŝmME,E^E$EoDR~ D*EEvEE[>E10*Ŗ *dEZ#ErEEiGDY7aDJER.EEl(EԌİ(ÊyE8EE2EC^DEE |E3EVE$Ť±E&E EZE$^#ŖĪ$ E)EFEDO ŬWCPE[EpE=?Eϸs'Ĉ"EE͊EJ(E,DdYĭŖDBeEeEJE$jE". *qw8E4E BELE-D;H~XDZEEESE8[*TkĽNE;E EnE|lD@[j 6D$EdEeE=E)b*&:eEs EBEӞEDŇm΋D{E`CEvE}'EάS(鴼`TzEE=EEtC,$ĦDD'EFeE"9Em$2¼*EEW|EE`#vGĿ EEEĿE/D( SeCEvEEA~E«'+5 }#E EE ED  DEESEОhE|K;*}sW9EnE2:EENDŇ.S\D&EENE`SEs^*ͪgOEExEpEhD ŀsEDEpEEU=E2ė3*;4#\eEHE/NEXEL Do ?ĪDޫEvE\EL&E͌!(`{EEEHE|E\Yý(.دe%EE|-E-EDE8eDMEE8EPgE ģD*Ő9Đ;E E EEDpYQqcDE*EEPPE`c&*(bƎQEEE5EmbDŤAnD-UEE[E;EDI*.gEE EEDP}ʼnR΋DqEU3E`E$E<ܷ'.r̂}EkEEEEsCWUSĵD!EAF^E ELwĚ$Ű'E~E%EqE@)_#$ސĤ'EEsEv FUE[DMČq CϓEERElh|Et(i-%EOE2EfEʩDĶI D}9E EE_fE %w*'?(ESE4'ED۸EDC]ZhD EMTEE̤dE(~*ZŌħ>EE!EEDi ő"mDWEr,E] E?NE(m|*:ZʊTEREwE#EUD7zHŶDEj!E`Eڮ7Ei2*xbjEE/{E EXDJbŸė:DHUEoEE!E>Ī'Q,EIEdEEL0PC9 š:DaEO"FE ES:#ŠdEM/ESE mE*¢$ŦEťEE\E DĂŚCTEE|nELUyE(WOQ)E[E+E¸EDDŠhsDREE"E@cE<+ W*ҋĞ?E4E/EEED ŜRqDpE~^E|EPME=o\*AAE9ElE#E*%ŎTEEE?UEDěńCĕEE>}E^xEM$(*EXE&?ElRE4DP\ŧ"D:EHEE8aEM,*|@EΛEEEcDu űŀvDT©E.EWELEr8+ř"S4cVE*ERPlEiECE.3Eo\C~Ū-ĄDyEEEE$}'6d5EuEdEJE>8C!ŒDEF.EF ERTly#4AE_EW.EvEÜ%{ SE Ŗ%DCE?|E4E^aE}2Ĥ*ڎAE}E#QExEDV #UU2yD۩E>cEYEJKEv+ŶrQhVEEEEjKD4DEeEED4E)Q FmEEEΚECbQ_ĕDEAEdEEY\';pEIEaYE`yE,C$!ŕMDEFEE\ą#h BE2EEwE# z&v!^EvErEExlD\Ġ@|CqE]EdELvE%!E)/v+E!EEeE=Džm'DHE)E2E)d`E_7O*/ĺBE%E2^EE2͌D Tf{DEsEE~JE1vi*őpMؽXEEvE}EcJDź7DM&EuEEҰ4E$)?gnEEEjEC;3zDE)EEIE E;ƸĊz&}öEVEME{%E6C> ܼıE2EFʈEEHu"YBmEfE E3ETU`%IA.EE2F#EDvWCpEEEFuE?(4,EE7E%EDA*,DbEZEZE_E974*ńĶtCEE{$EEDQ Q|DMEdqEEkIENy*šJĊYEE E1EӖEDtg6qDBEErE<:3Eϛ)ŊnEIE? EEaC(DExFEBEf~]'ŔuìlE.EاEaEU CB!LCGEEEEzE0_# yB!EExEE}.Z0&AW7;E7EE9EReDrqjiCPEE@HEsE4V)>դę-ENEEZEDTC0DEECE^E;$+żQCE\EE]EED ň ŃDEEEJESHE/*IĞYE@EEE ?DyőD̴EE +E1E7)+pEE~E,2ECiŏČDE?Ey~E&E7"6'źa⍂EiE!ET4E|B)S"ŕ?EaEFjE™E3?"ŌXBwEhEV%EE?%Ť;ĤTEНETE\3E&D6ĈnCE~E[EsEÌ )h:/Er'EEzEDŸ5DEaElE^E =0l*ŭDESE\EE6D,C i1 DENEERGE?[*,Eʊ[EE EBEk>DŒDwE>EE1EĘC)f/qEaEEKEaC!jĪXD4&EFE$EHb&ŷQTEExEگEȕB!ŲČNE E7FfJELEM"8кB/EҊEuE iELt>v& ĸE`EE*E'DP K?CEE2E$rE%t((0EbErEED.78m9DbE_EMEd\Eo=I*Tā8FEE9EHED  (DJEy+EcrE^WGÈn`+ҶB[EۤEPEEgC9Dwz`DfEE E)0E[)9DqEEHSEEeCyŬwbD"EqE.EEMϽ>&k?P@ЃE E"2E6EBv"ŭ 6EFEEEE}I"B/EhMEyE*E_T&ŮIEEȼEsE2!D<}C:EKYEENlqEd7)|nbx0EE!E{_EEDLo:DLE@9EֲEa[E!mCľ6+ŨGE+_EEED 2 "D8EEKE mEE"`.+Ŕ>B\EK&Et`EE4F6D3;@DEQE EW/E=")Ŕ ArE EEp7E| Cm%ֵDEhXEnEEziĀ&ŲDhEE'8E)EkBZ="tl`EEo.FEtEkZ!Ř$BEEE:E{WI&ϻz|EEEsE|D!C}ETEVEm#qE{xN)śt2E.EEWED @DiEEE+[EDFĚa*+o~."HEEE8٫E]D/ E DC&E_E@EƏDEs#*z;O^EoEhEYġE5DjHEDEEE/EĬ)Ŧ sE SEEDEӄC- DE0EEuEiHi%ů2(EtELEME@B!n]nE&Ec(FEE7^!!C.EEQEE\Ê&źEEEE2ODiejCEE4ETnpE-o0)ņԛĎF2EE$EĨEDEŜA ADEE4E{YE7DJč*Ŧ!~mHEVEE ED6Ńx UD`wEE-ECEDž8+Ŝx:^EaEETfE.DL`_OD${EEsEuF-E9E)ŭÄ:tETcEE+EC>DNEEEPE7IJ &+)EEψE،EYB"0!E:EEEEP! C̏EҔE3E8E2{H('){ALE_EESE DKiCϙE`EEAnEly *Ÿy83EE\EgEѪDQekŨDDEfEEeYEM&+hz3wIE4E'$EEhi~D ;D߭EEEBE'ıt*8 _EjEzE Ek(DAt@SfDXE>EE,E W(JüvE'E%EsEéC@]̦ĘDNE{E}EgE2Ē%8ÿȅEEEE0GB"N$EE@ FUEdGE ğ C"QEXEVAEEvE E!BT#SJ)E)EMIF^ExDqĔ:!|$C~EFZEE1E2'%Ĥ E`EeNExED9VdCHEEcElEnN *@5E4E\E*{EIDgLD:E#ELsEVE-dR#+;tĆOKE 2E`EREN-xDz ŴQDYE)bENE6@E9*ŀq1maE]EWE_7E $D7ZNYDE E^Ep*Ew0(lkrwEEnE0E*CĎJDٳEFxEEޗć%H’EE`AE/EpAT#Ũ=N E#E F{EDć1!Ŵ ;CErEt:EEʐZ'ŵµ_zE)E`VEMGEDeiYxCadE/E0E,kE-Ăp)\G6EE3EE`DD&"EOD3̥E[E7EEVEn'S*^pMEEjMEEvD @ D( EїEE\@E+I*ſ+ŴbEE)E$E!DssbԽDEdEE)Egi(xE>E@E)E⮡CGż 3DEEElE^Đ>%žOEBE3?EG>EP7A#Xĵp EbE?)FfEVD df OCzEElE}E ӑpW'Sγ EEEɻEeDJHDEEEkE3ց)ŵܖ޵7Ep6EEEDn߫ńFUD!EEE":u*E(ĠcEY9E$EE DI Į%D]ET|EEw)E)nâbyEiEFEE0C h DcEEjEN@EIĚ<%ŀµQE`EE摊EwjN#~| E]EF^EDR TxOCoEECEUEj']Ě"EEWE$EDȊ^D !E*\EUvEjJjE: r*Ŝ7EEEYEҠDZŃaUDW)EcEESE\\y*mHNNEEfEݦE.kD1& hD8E@EEm=Eo<*Ů(ĔdE-E ;EELDĿVĕDĸE)EE'E(HKÂyE=EEE`;CZmIDEFE`EڱIJ$KJEEJrE6.E#fhē EwEEYEDVv |=YC’EE>EjsE*'Ŝȱe`#E.%EEIEFDLwp DEEE`miE)zK9EhEb[EE D7q\DEEMVEqSEp\*1hĒOE~ELECE4/kDňBDE8EEe=E đ)ڭ#ĵeEG`EnxEED2jtDQELEE&Eq(8G m{E|MEEEKAChDNE#F$E,&EjoĂ$=ꆈE(ER`E$EN,$7u EuEXEEIDI0koC!E1EENu~EtT$'Nđ^$EEnEENSD\,ű DXEEnEgE[>.*Ġ:EE=E|PEKD^ŇaDEJE}EPRES_=+ewPESEEZEfeDxsVDEEkE;Eo6:*ť1#Č/fEEE"֝EDO#D*E0EEv%E“(6O|EEa\EECxI9D^jE0E/AEE܍0$GeED ExJER4EM–$ŴěEE\ F,E pD@o|ŌsC>NEhqE9E|E !'Ō $EEE{1EdCD ίźDEӄEEHgE~Ģ*vz S;E}EE'E/D`cD$EEEPEjc\[+ś{b.PEYEkE,EbDTP:՚DEEE;;E6Ԓ0I*ŕ5 BgEE^nEyEDl{{LxDdEEjE$E6ذ(_W]}EwEdE쥓E{CP_DE /Fj7EE`<$Ő+>hEHE0SE`ЈE WU:T$ŨtfEPE8xc|*}_RE+7$E9'ż\0|~EE[EEIlCp DDE" FeET E#H$؂%E pE!E)VEhy$Ŗ~hdExE!F]EDGĤũВCEE@.E{E0Cg(Iv&EtKEXEcEDS3ļD:cE=EFEeE%!g*łK=EErEEDvU T(niD^EE'EEOEsičF+Ž=^G6SE EE٢E OZDzwDOEEE8E,Y*ŵĕhE>EέEoEIDm)Ŏ3 DWE}E;E="E.'⻣~EEXEnE\Cc zZWDEAE&VEL| E!$d-/E]EEއEt°$ZP9tE#E F EgD"nFWYCEEVEWyEվä(ꎬ҇'EE7ELEDp*D:EPE/E*dE:Q)Ć* =E$E;JEEŕD0 ş4$kD ŨEEEoVNEn·*Ō]Ċ6TEE.qE@ETD DAEcEAEI8EД)PjEEbEDHEBDt mDEEE"E~Ġ}'E'3EEDE,VC(E Ś9eDJE(F".E EKķ;#Ő֊E&.EEYE+Š|$tIdExE FE]DכCstE EOEyEþo(~Ğc)EEREڸEjDreĩ D2EE%E cE)!`*ŌĚ>EۍEDEEPD IŋpDnE3EѲEPME؋nM*ŵWUEEEH2EE TDluFD>EE)E}7EY#)Ũ&ċkEE¬ExE\D ŚġDE$EE!Eg'b#TEE{EkEԛPC $uDEHF`EE E#?EE"EEl%luWEΟEuE)El'D*!ūCqE EK[EdxEƤ#(w)E7E,EeMED Rś. DE ETEpbEL-G*֐Č?EErEEӒD ŬtDE.4EELErr|L+RTUEEE|vEODʼn$=D^ EEoE2$6EVä) ĸkEREaDݳE܅EE<3E^ӜC* /z!nEEEKߙE@CŌ0D`EE-E>EĦ&(~ìBEUE|EΏEaChz!xEEMEFEE"hMB)EE}EjEY!%ŧğEZE{FEeD{PĦnCR^EdEEtEtf (ğ-EjE"EEDvR'r0DEMEnE]_E83*]DE EEE ԋD ō 0DsqE2EE IEP|ĎI*H$BZEJEEEAD]ų+DXѴEEES2Euĺx)Ű;6pEdEE/ETC_ŒGD۽EpEbEEp&~^ÌłEEEnE9C!l}ıEoE}Fd'EUE`r!@BE*E*EEb4?%ōUEEFyE`jD4$.lCEE?eEÒsE@W,).3/EEEOEϵD ņ6DE~EnEo^E&:Ć++ ĐKDEfEE,EVˆDº {DExEEoGE_*THqZEԗENyENE=D@YD:&E[^ETEJ1E2h)Ő0/pEE`ZEQEbC[? D}ǽEҰE~E:Er&|ZEDE֩E쫎EBYF"\8jEEF8ELE. d",BЍEHGEE7EMRD`_&Ōɿ$EEhEEDEgĦC,FEEE"rEùa)Ńē/EEVE EvDG4ũ 7DEDpE)EG\E?=+DĐ7EEbEE|,E.DpO Ŧn ̿DO ESE7EGEH+C t[EEEE9Df?DE FEE(i0E7)`qEXESE EnCh`DEF FIZE.UE@&Ŭ.K:܃ENE|Eq[E"B!l9XE;EFEEC"yBeE#|EEJESGa&_Đ/E 7E;EEDHc*SC:͘EvEE=rEܜ(0EEEE&wDžc-\;DX E;EsE [E!?L*VNIGE`ER E0ED*  ȖDfE1#EHEloFE7*\!=-\EYGEZE֟Ej8D^GD"EEE0E.ӡ}(sE"8E#EދECjoNDAE4EE8ZEU P&iN?ÒEEEVEXB&"VĪE&E;FE6pE q "B썎EE&E$WEOå&@ļE(WEEEUDYp\CrEuE31EpE5Z()ŬE1EEGLEPEvD|7MY_=DENEEɒEZEFZ*jĊGEnE:EzED ňD쪬E!Ed'EdDE+>T]ED^E@EfE|&4DN7]DEE*EE.EĤ)Dt1EE$E@E&.;늄EE-EpEB\"|CE E1F3^EUxE M"Ŭ:BE/EuEpE$`ÒE'zĘEEմEgED+WLCFEELEZpE= *nđ1EGESTEFEDŵRWe>DE*E6WEZE4KQ*.T~HEuk&ֹvEEEzED{e:=CۙEE?E8oE)źĒ3EEE\E$DňDD"EE3EE~YE!K&j*ŐzIEEeEEE̍DFs ~ DEEjEHCEo,*0`7ć;`EEX]EZEݷ,Dl ŹaDEGE.E,E3])`6uEEEɖECz{J1DEEކElEr8&j`|EEOiE֛E 8Bp#ŌtESEEAE-EĔQ!|CE}EdEځE$&ĸESEEREvDеC]EEYEmE$& *h_04EEPRE E{DlňHDdE0^XEOąU+Pw}IEEYE>E{DV zJDEEBE@EAEB5yN*60o`EEEE&D0>!DWEEEj.+ELĎh),ߟvEh|E.EFEC6;ĎDEBEMEE8ĭ7&&gŎEEsEE>B[#Ŋ]XEEF&E&D)ĕ X~C@EhEEEQd&8İEE+EEQDV2CEEUEomE( ~)ļ5Eo$EEֳEoۧD"6dŬ-NDg֤EDOEE,oWE}O*Xs2_KEXE5E+EzDŤE jqD*E"*E*E*E*E*E*EV*ES*E޶*E*E*E*E'*EI*E*E*E$*Eȹ*EC*E*E*E*E~*Ea*E*E*EJ*E*E*E*EP*Eж*E*Eд*E*EC*E`*E*E[*Eg*E*E*E*E*E*E$*ED*E"*EӲ*E*ET*Ev*E*E *EB*E*E*E*E*EA*Ep*E*E(*EB*E*E*E*E$*Ez*E*Ev*Eڸ*E$*E*Eж*ER*E*E*Ej*E6*E*Ea*E*E*E*E*E2*E*E*E*E׹*Eĵ*EE*Ei*E*Ed*EU*E޷*E*E*EI*E*E*E*E*E6*E*EC*E`*Eʺ*E*Ef*E*EH*Eߴ*E*E*E*E*E(*E*Eε*E*E*E*EԵ*E*E*E*Ez*Ej*E*E*Eܶ*E*E`*E*E*ER*E*E*E*E*E*E'*E*E *E*E*Ev*E*Ep*E;*E+*E*E*E*E*Eѵ*E*Et*E*E*E*E*ER*E*Eq*E*E*E2*E*E*E6*Et*E*E*E*Eq*E*Eķ*Ej*Eֹ*E&*E8*E*E*Eߴ*Eڴ*E*Eݷ*E*E-*EI*E *E*Eض*E*EJ*E*E*Er*E޷*E*E*E*Ec*E*Ej*E4*E *E޹*E*E*E*EF*El*E*E@*E*E*E7*Eʹ*EZ*Eз*E*Eȷ*E"*E *E*E*E*Ez*Eж*E *E*E͵*EJ*EĶ*E*E*E*E*E*EZ*E_*E*E/*E*Ev*E;*E*E*E*E,*Eʸ*E*E:*Ew*E*E*E*E*Eȷ*E.*E*E$*E-*E<*E*Eع*E*E:*Eh*Ez*En*Eи*E+*E*E*Eڷ*En*EY*E*E*Eo*E*E`*E*E*E*E*E*E*E*E*E*E*E|*E**E-*Ee*Ep*ED*Eܵ*E*EV*En*EL*E*E<*Ex*E*E*E*E*E1*E*EX*EL*E *E¹*E*E*E*EZ*E*E*E*E^*Eƴ*E\*En*E*E*E*E7*Ex*E*EͶ*E*Ej*E~*EҺ*E%*E*E>*E*E*E*E*EN*El*E`*Ed*Eյ*Ed*EJ*E*E&*E*E*E*E*Ev*E*E*E*E*E3*E*E,*E*E*EZ*E*EȻ*E*E*E*E *EJ*Eض*EƸ*E*E*E*E*E*E*E2*EE*Ej*Eh*E*E*E1*E*E*E,*E"*E*E*E*EP*EK*E*E*Ez*Eʷ*E*Ea*E*E*E*Em*E*Eؼ*EF*E*Ej*E*E*E~*EB*EZ*E*E׹*E͵*Ea*E*E*E*Eܶ*E*E*Eʶ*E*E*ET*E*Es*En*E*E*E*E*E*E*Eص*E.*E*E*E*E*E*E^*EƯ*E,*Ew*E˶*EX*E>*E*Ep*E*En*E*E*ER*Eo*ED*Ed*ET*E2*EY*Es*E*E*E*E*EN*E*E*Ex*Eu*E*E¸*E¶*E*EI*Eȷ*E$*E*Eܷ*EA*E*Ed*EL*E*EH*E*E*E*Eܴ*Eֶ*Ev*E*E *E*E*EA*E*E*E*E*E*E*E*E%*E*E.*E*Eܹ*E2*E*E*E*E *E*E,*EU*E*E*Eط*EF*E*E<*E*En*E*E*Eв*Eµ*ES*E*E*Ey*E*E>*E*Eܺ*Ef*E.*E*Eb*E*E*E*E*E2*Eֳ*E*E˴*E9*Eع*E*ED*E*E*E6*E*E*E*Eҷ*E*E *E*E*Ez*Eҵ*E*E*E*E*E*E*Eִ*EA*E*E*Ez*E»*En*EF*E*EP*Eҵ*Et*E*Eζ*E*E*Eܸ*Eڳ*E*E(*Ey*E*E*E*E|*Eɳ*E*E*E̶*EF*E*E*Er*Ew*Eoy*Ey*Ex*Eu*Ew*Eu*Es*E~*Eo*E*E*E*Ef*E*ET*E*EP*E.*EL*E*E*E@*E+E*Ej*Eh|*Efx*Ev*E.t*Eux*Ey*EZv*Ew*EUz*E s*Ew*El*El*EP+E*E.*E*E*Ed*E*E*E*Ep*E*E*E*E*Eq*Ez*Eu*Ey*Ew*Eu*Eu*Ey*Ebt*Er*E.z*Et*Eg~*E*E*E:*E*E*ET*Ez*E*E*Ef*E*Ey*ED*E*Elu*Ew*Ex*Eu*Eqw*E,x*Egv*ELt*Ev*Ex*E^t*Evy*En*Ep*E*E*E*E*E*E*E.*E|*E*Ea*E5*EJ*E*+E*Em*EJy*Eu*Eu*E}v*Eww*Efz*Ew*Ex*EQ{*EPv*E{*Ej*E*E&+E*E*E*E+*Ej*E*E[*E*E*E*EX*E+Eը*Em*E|*Ex*EPx*Ex*E8{*Eos*Efv*E {*Es*Ev*E#u*E*E*E:*E*E*E*E*E*E*E*E*E*E*E*E*E^v*Ex*Ew*Ex*Ew*Efw*Ev*Et*Er*E t*Ew*Ey*E z*Elu*E*E*E6*E|*E*E*Eh*E*ER*E6*EK*E*E@*E*EV*Ez*ELz*E,u*Ew*Ey*Ew*ELt*Ev*EHw*Er*Et*E|*EKp*E*Ed*Ep*E*E*E+*E*E*E_*E@*E*E*Ed*E+E*El*Egz*ERw*Ev*Ev*Ex*Ex*Ev*Ew*Efy*ENv*Exx*Eo*E̶*Ez+EV*E*EX*E*E*ET*E*E*E%*E>*E8*E8+E#*El*Ey*Etw*E8w*Eu*Eu*Ey*Eyw*Et*E/w*Ez*Ex*Epp*ED*E+E*E *E *E*E*E*Ev*E*E*E*E*EX*Ev*EF{*Ey*E]w*E]u*Et*Ew*Eu*E}y*Ew*EZu*ESx*E/*E)E/y-EbS%EX'7Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-20000.ark000066400000000000000000001161251376444676100257300ustar00rootroot00000000000000my_id BFM '[EAVExr Eb-ůSĶpHELEE(EDqyĭ%.#/pE(]EEEųDfHŔRCkHEVExEEx+1D0˨GDEܷEE`lEdB\|xD|Ev-E?EKjE\Ö&/HļDEsE0E[BEd*Ţtm&E>E E4EEǪ)ؓ?mNEuEEEDwį$0}$vEREE2HED:xŊߔC(EڜE5E2EDsb -F^DsE4EEEl"B ļ$DV E2E(EJTdELI'+ğEElEEU˃n*Ś4 3EEEϺE~E)(qĥiZEtE6E!ѵE>D$IJ1"d4EPEY+EED>ZşCPӓEE`EEC Ű,@%DYӥEuEEqaEh"NBDEyE EaXE!_4)ŦĶEtEHFE\C0Ek*Ÿŀ9EʼEEkEEn f(8Gh`E6EJEME^Dh ܃Ea}EIEKE{kD E|( D٨E95ED&EʏEACVs]DM{EzFEb/EyEOϨ#a8DETEܴEZRE4 )ŤEE FE/*E8*p&?E EVEE<E߉(/'%%ö\fEE6E*ưED_Ĩ@`(BE_E_EE TDX PHR"DxkEvNEEECuƕZBDsEE)E sEz$ďDXEEEJYLE>G9* EcE$FE $E5L|v*G]"+EEE EIE]yD9&*ZSlEE E8EDjc#CˠEiEEeEPԜEb=D>8D3EjUEEVEt5CA?SDnEEgEmEo}ø%<8D_EEERFE4Y* ؞2!#Ez ER$FEEl&*pK6KENEEVEyDĨ1%mv0rE;E^E.E/=D2œҳxCErEXEE 'D  ODYEQE8Ej*EDB ?ķDKE?cEUE0gE-:&nOVEEeEEN@Ek?*:sĴ!)E FE !FSE E/ml)8d;QEtEUEcELD/#Ŵ@\Ê"xEEE^E DPR}CUEcECCELEqDU@' NDfDECEyE=JEЬDAhh ŏ$cD{ӲE E EaED.'9gĖUExEEED::Ek}Ĵ* k1/E2YEFEEiMm&)&vKWEPEEqED ݸ"&@ s}EYEEWE=DsC-EuE$EzEC~b|D[E',EjZEaErԏh!ŖĐFD[EyEdEv[Ex(ȻĈ` E`EHEE%84E+eĕA5EzeEEBE E> Ĵt()1]EvEUEEDi!ŀ`EfEEE8yD\! >(oCE=EEKECk%ŹDfEEE|E!Ç6#PM D˷E EEUE))ĤlEEmEtE-.Ea*ŅayQ;EmEE2EEUڶ'65cEEE{tEDDĠŰ A@ԄE~LE5EE?8bD dDЗE]E^EԎE+C"N ?DEEQEjwÉl}$%DCE}E=EfOE<):FĨsE`EB FeEk (E&*ŪSg2RAE8D購E(Er[EIE/OO *ňBĈEEF FAE"EfԠr*AUTRGEXEN8EȽEDĠ%Ūg!oEj,EE|MEhD# DCœE, EE}Ef4DZBD(QEuEEEC6ųODH߮E8EE3kE5G&'HDE1ErEZCEjaEFe|E EJ+*BXbMEIEdBDer5DE E= ESE@EC03ČD\EE,EoEưè% DXͽE5E@ZE%RGEUE*!"EEH F EwE\ *?OĸIE4bEtEuEDE%}#qEEۀEAE0?Df7ŭŴdC}EuEmEE4,Dx,KDE1]u!*DEdeE E\4]Ez(ŲĆ E.EFkE15Es^+_ZG4EEjE`EP Eymi(Z[EEfEfSEtD!rpiE(TE*ESE|D yŋo[CE%Ek E/-E_ZC/'ŔpŦDmWE(E ZE}ED >"ŊqĬDyrEEDEv0WEZ&ē0)Š.E!EFQE0/E** I}Ģ@:EK EWEE*VEXr'Dz.aE EE˲EHZDfĝl PbIARE,EXFE^EeD ţHDNECEELEΧC2ŲړDEPE&۵^DE EdE"/EE]Ħ*F-Ĝ"$EE%FE5E*I<*G^LEOE@E+E?DD,$ņΐÔsE8EE"EKRDņu C\EENEgE"DHŅZ DTDjE XEEE PBBĨܶDǰEEE>fE,j>'Ůx8EEWeELE?Eo*yA*EzEgFEEx ij)ņt4ĮjREEVE,ED4#O/yE0E,?EzEzDkRņCяEEF;EEW DiŸ 'kD'XE%>EuE9ՃE` ŜD{~DNEKE 3EY`Eć(-)EmEEE9EՀ*ŽMĄ50EEFtEnE+)Ŧ!İWXEIE!E" EtDNi"ŲjEbE~uE(ӥEzDF*EC|ESZE@EϓE C <DEx&E Ef߀EV,"<^|D̵EE,sEPZEĀ(ľEo*ԫK6EEEm/E" EHu(Őh X^ETEYEEDk\! &Ed-ErEEB;uD DjEMEEEBCQoNDEE+E{E!,<#qP}>DZPESEE8UTE,a)ۙVEEEdE4,Eı*uĢIED&BjEEk"EuE\DFBWsE6EE<Ed0GD+0DEEx[EIENPC*ݣD=EuElEL pE9%ŻD1:EEuEB_HERRPB*䤢ľ E kEAEcE Eľ9*QĜqHEEE'EGD%ň ÞDpE eEzEED*9ŖRCTE]EExE0D30zjGDXʝEEE=eE5B?lhDԀE!E-E#jE &Řr1EKEHE|DV PՃEՄEDE JEjD ťi D^E9EEяEfcCeDPE:E5E҂yE+R-#4ĤDEGEE1RE4?)Ř?ģ?EnEFEN,*E %*ůo*?EE?VEYEHE'ũ"DgfEbEPEŰE靶D ?ŔBuE&EYEE`SD0d 9ZZ"DFrENEEECfwD0D*EEEsE5O$$Ũ65D^EEEI2LE`Gİ;*Ł ?EE)FEV#E*Ŷ]?EEE$EEzDe&Ŵ-tlEĕEqE3ED4#CEEEeEϜE.=D&8Dk9E[E E> EP4C:N.D>EE6EhmEAØ%ŌHD@fEE=E7FEYĀ*?#EE(FEEEOAB*HiKEKEĖEEIEDZLG%ũ4â)rEDE]EEqxDozCuEAEGE[ET'DGŨ šODE \E*Dī@)EAE:!FXEEn)8GQEKuE^UE߹E?D6-$QZZïxEkEEBEDM_ ŐC&QEE6EPNED`1 żeDEIEjEXELAb 8f2DoE1EEbEIJ'ŴT-_EEhEE;:E}Ġ+'1/E`EFF>E(EM')&FWESEEjEDb"hL t}E_EJEPEDyeC/EEE-|ECyšiB|DcE0ELE&iEA†!vx3DjE |EE[E}>[( p EghEBE] E4Ef*ťĩo5E]EE E E-x(D]EE VEE޶D4 e!@\”E@EEE$xDx& CrETEEE E4CvmD. EJEE|E{t;#D#D-EEEUE1H*6 )5"}EFEEE.EQ6*`yo;E,fEHE6EEsR '&ýLcEEEjYEDuĚ N,AτE7EEEhaDʫ 4X D ؗE]EEvΎEJ͜CLD~E*EgOE{wElx$'/ĢDKEvE:E OEZ<ļ)FEEmFE(E+{*ůgĢpAEeE$E,EDC&ڰ9iE`EEzEQkEwÉ&bD*EEsECEXbĝ** zy%Ez?EgFqtEE*=BıbMEZDEEOZEPD$.p$Rۇw uEEE.E޺DI`C$xEXE EEDZŶ @YDnE:uEAE5E8yeB{D<{EEE[EQeEd}'޳EEqE}Ev=EsC{*Ó6+EcEE [EE\)0BSE` E^rEnEDHĥ#Ś>dzE_]EEE D!B@iCXEE)EE4D{i pDƢE]ETLEIEp ;DEwnEER_E͓ L(ŗ8p EmEfEzEw7Eē*Ŏ/1EwEEBEEGĺ(^߀YEEfExEDTSYj"Œ$XkEEXLESED^Ş6*CEE]EHECyDtE5EE]ErO"ŀlYDgEEUEBYE )–ģ EEElEL1EIթ*uė7E~EEE ENh\Q(Ŏ; q_E~EQoEdE0Dl!HXEMEdEE-pDp Ű, DEEE=ETԹC0M jDEY$E>EzEw?ô#{sSDEEETBSEQ0%)ʰEjLE FdQEvx+Eē*s=E|E}EkEEx'PrÕbeEkEVEkErD Qxx8nBAEpE uE EbYD Ź0DֺEnEUEiEu؍Cvn1DEEŷEtEÊ$òĐDsEE'EoME C*XǨ,EEPF(:E@%Ea+*aCE|E~6E ED(S&ZÌCkEE3EԮEzDN;C EH!EnuEBEBDms5DEH"E8E2E DCŐČDUEFEEaoEꡰ%lD ֽEL:ECLE`GEUX*q"E^E9FHE|uEj)cfO"IEfEEE5D&ʼn%ŰÖ`qESE*EHEİD /jbC6E~wEeEdEP,Dw&pKD@EEEXEELJBiŬjJDE5EXEiEÉ& E8EEDcEQAE)h@*jf&(EE5FE\Eĸ)<ĔOEGEnEJEبD&'d$JkÉAwEEEEE :DBWmNC%EE8lEEDů ňkcDEETEAEmTAВDD zEEhEcELH'ŒmĴEEE5iE1;EǼy*X?.EFEEÝEQE}E\ "SQ=DmEE8E.WEb&$H)EN)EFCE?/Ea*r}";:E:#EJE_EQE{'aE'EEòEiD qo 'ZA=RETEVFEELeD0( o>DWEhHEYEKEwnCźۓDEEELxEU\Ú $#DfE]EhE2/QE9)80ĝEhE #Fe1E/)E<ɖ3*z`kE@EETEEGDEx6:&ŮÄgEZEOE+RE&D8@BPE(EYEDExNDk .ŅN'D>ErVEEyE&wCD]DEbE7ErE%&8%\Dw_EEEKEVK0,*~. EtE=&FVE#ER*)7Y;[FEEEYE|DNĆ%Ŋ׸7mEfEEvEDO8/T05C9)EڅE]E,E7D`=DE2QE TEƆE #CrwDz%E7E"ElE?U&ŎĐD.¾E EƩEEEq^}* 65$EE'&FEE 4*dFnLEEEE DI$ŎsE!EEEDeqŠȅCEE=QEfE?!D9ņe *eTDEEEEnEPB Lņ\DEӰEβEzE!VfE/'vlE%EtNEEj?E,HpR*řJ*EEF+E&E#) X4,yREEbVE~ERD#1NHyE0E=EsE@tDZkŠnC(ڏE(E7EE7 DRy" ^kDSEBE|EŃE&b Ŭr[DIESE7E~>`EZĔ (BEfEEE9Eр*-0EEgF>fEE3$")@!MNXEcEfEED3,"DGE%E[EkEɠD!zCEVJEE&ӓECg\,dyOD] EE#EŀEȒ2&"ŨQĞDEEtvElZE]($ĐEEMEE3ELA2+V6EElE7E ECaĵ(-(^EEEeEԂEºD F!Ő$E6EˠEEtD$ DsEEEEC?z D"EES}E {Enc-Ò#ŷ/?DOESEEbQTE-Ĵd)uEEEțE,E1ę**uDZK *ņ>EF#EFlE&EvU*ub:BE E}EjEWD{&= Ö!jEET EyEUjDC1tBlEEES؝E(FD ū nD0D0EeEJEl~E QChhOĘDEEFE5pEYj%<D?EEE4]HE*RU7*ٓĄ ErsEbE\E EѢ9*QaHE`EEt%EDā%ԦSpE3eE{EܬEVD8|SCXE]EEE0D014]GDʝEEEu_EbBşļD&E'EzE jE R&WK\DۇEk{EpE0BEcĸ*/K'EهEwFwEEݪ)Ҟ>9ZNEEmECE9Dz$ŭ{Á vEEEFE|D;ҶCCE*EWh*JĊjKEEAET)EƌDČi%LV rEJE\xETEdڞDlyCE4E^EE&Dզ hODEZE7;EE2B39ĹDKEjEOE4gEv&зdEEvlEE8@Ekv*ŚdFA)EeIE FPEjEm^)Z8LMQE|EUEfElD H$PZ&xEEFE.E,D/ő@CWEE8EtBEcD]ž fDVEIEEQE`Y A,o {WDYE EEaEuˋ'T&zEE\EE:E|}ı*EN~/EjQEFEEcL)%#`WE&AE EPEEzEFWE!EĢ*Ů+UrGEcE:EĽECD%Ň̯)oE,EzEIEENfDzĹGCETEEnE4DRICDvSEE EE CD2DE=E&EVAkE6&>D2Et)EzqECE7b;*Ų0.%EIE_FˊEET*e=CGMEV2EEaEDy$ž^r&uEֹEEHEdɚDLB]DCgEeEE՗ExdDő -ZDZErEPEO9EKgB0ĥODEEfAE}eEP'îk'łĺE?EYEE=EbtČ>*+EEEX3E E-ڨ)/ķcSE'ElfE EmDR,G#Ŕ=rzEpcE=EbED.#ClC$`EFEEEDb pDx΢E]EMEBE0 JDEmEEUB_E/ SM(ű*6 EEZEivE<7Eh*Ŷ1EwE1E\ EE)ŨzYEEE4oEpDran"gvEEDERE6D&CEbE EE}PCBœDcE#TEE*aE~"ŜD>EEwEoYEڃ(fc|E.2EE\pE1EOm*lJ7EE7EE ETAĺ8( <_ExEyEEDGyČ%!+iEbVO}EEEEEDŢACYőELEbEUϔECŀU Ł!{D3E E^EzE`N$!4MD@ƴELEfE]E,ts(?đ4 EEXEiE5E ~b+ `"j4EEETEL= Ex(^4[ENEEKEDz!XqEvdE+E\LE|D6gżCEb#EEaE~C-u zD[E`EHUE}EX "8RnD1uEEI9EJ#WE&`G)4ĆE,EFfBEg//EhF*|ČI:Ei#EۖEEIEĥ'VbaEEeEڲEпDĨT `I6ApEE"NEFECeD p]DjaE/E{E4EC yųTDEEEfwEYlD${UDչEmsElNE~:QE9)ŎEsE'FVE[)EP0Ğ*j-"@E1EUDEED8EVE.LE~E$!CŵBxD-E$EE lE;g&žID⳾E-,EEr$EE]Ĝ*4$EE'FEE5-E{+"*dFKLEEEEDP$ȖsE2EE0ED(GZnԄC'EESElE D  aUD E@E EvEB4nD練EEEeE|'*.t EEWEEF>E=p* ˔]*EE!FpEmEĖ)ž;4ĪREEVExEzD{# NƛyE3ECETkEQD{~ 4CXڏE)E(2EזE DxB vkDTE4KE|EɽE ) RįD.SEQEx.E -`EF (~ETnEEE9EL*.Ľ<0EzEFbEDEBA )ŗ)!(]XEEE ED+"Ť_™ENEbEE`yDT'ŞUCȒEaKEEѓE\_C&lRV)YDEE_EĀE  +"@1{DµE\ErE ZEu&Q(Ŵ*E9E}EE 3Eӂ~+6EEEE+ EN+f( Z.^E-Eg5EEzDĴ ;9=EjHEFnE3HEwsDh tNDqEEEECk6DEEuEk{E .^#Ŧ _DXE8QEEvRTE-U)>ĮEcEEE,EeM!*ńXuwl)E" F-dE &ExyG*ŹbHBEE}E,iEk8Dd&X0jEE E\sEXD'7ŶLB*E EЕEНEN%FDşl0Dl0E|E]EGE7MCp@9DEbEME_oEë%D E2EEGEP_*R'!EFEF:0E EۡT*QHEREjE#ED%ÙapE]eE{EZ֬EvDą8bTC[E~]EEE0Dr1ŖųGDʝEEZE`E.TBIxʽD䌯E6-EEjErK&5LĻ]DEExE1EH0BE$dZ*E'EEFE$E.)Ň>hNEE˿EEDZ$g{vEEXE@EDs`;ŵ1CR>EEE"AEDfB 6 ^DCEEEcEVB'\<DEַE"EdE3E[E ED^#ŀ){EWEEEr^Do.C1!EsEXEEDŌ ŷsDtiEEEE/0!>FOD*E8bEU=E2C^E2>(? E@EEE+6E*1^Ĕ)3EEEBE(EV(U]}ZE~EEwEMD#:)"ŊEEB EED5RŹyJC"E4EJJEE&CCuŒŀD,ElEBEsIEJ""Į0DEEEXE!))ůMExEF#E0E1e+jN9EEKEpJEVEe+/(laW`EHEME4.ED$ W~˃E8E-EHEjDO ,j DEEEMEE+CŋA2eD°E+E66E~yEqNU$^#ScĴ;D=E5EEQEi4.)GfՊEE#F4E~)EX+ŬoĪ_?EE͊EEE.<'fEaEEkE^DAx՞BΆEEXE ESDHf HŹ"DyEQEEtEICT,oD,+EEwEvsEّf$v'DE*EeE+LEфG8A*BĽ?EYE(FEf#E/*K]YEE0EE[ECD ^H&鴼"MlE4EE0ED)%CE\E{LE͜E$=DŪ8DIE&hE$|EE0C0_ƨDEDE%EmEK˺ô%rPĺ DdtEEEFE~Y*Ż }#EE^,FEEĚY*hJoKE*jz+EqEEdiEE!ݰ)(1ĨSE@EwEEGDB;#վ;Q%{E:Ei:E"٧E/DJ$XT9CcceEsEE[EQDYo\4 qBGEVEmEEXD řhsDE˘EELE^EXތC +0DrE*EeEEY}E# ÄR#ŬD&BEQEEiVEb'j)AشČEE FfE/EO1+~}`9E!E^EERE='ib&aEؕE6E9زEuDhp# #@vERE4EӃEbD DEfEEfEiC&ŞVŴ|D*EJE6E1xEzJZ~#<"WDVEuEE~YQE9d8;z)ŞoEvE 0FBOESP)EV*ő#j[@E 4E }EEejE۰Ċz&ڲõ6hE2ErEbE蚴DBdByEbQE wEE3"ODJ f(DJEssE EavEЙ{Cj wDEE|[EQ)rEM=d %şrnD>tEEE\KEzJ*4IJKE:ER;FEl#E ?*WFEBE8E"wEzD4ă]%(t.nE1E`EEFEBE\}*gGDLEEEŻED %ůsEEE"Ex_DŔӄC!E`E>(E;E D,= 0SDEn>EEE-BŴ3DEɝEEeE4õ'*`EELEEr>E`qn+$є+)EEFKEEF)Ū5Ħ'RE\EwE\EDc4#TTáyE!E EkiE_sDŰ̮C؏EEnEyE Dyx> ŮjDHE3EsEOEE- 2ĨD "Ex>EEE_E(r.NE,*ŭ6E/E FM>EJ E)P9( Ą^EGEnEנE2D;ā ńq†ׂE^EbEBEuD =rDEEREEC:@RnDjߧEE֫E{E(@@#ĪXDhE}EQE^TEb+[I)THE-EFE%-E`~*fsĊCM]DREE$:EuEyìl$ņtDjźEEE/)NEo=)T۩]E8EC)FlE.'E#*`OfBE :E*EYiEDeDA',j~'jEۤE E@HE DRIJ(Ő'ByeEEEEVED!Ŧ^ŏ0DwEE4EE&LCyDe٬E`E~ėNEEרEhED$ʼn}ÞuE&E{E#EzDVNCU,EETEp7ED0Ųu \DpEgEEdETA`;@DEpEEdE9y'I`E(EEEEuil-EEFiEElĮ#)\+ĆTEEArEQWE|D4#Ũ?%\|EEEEDs$*VC9E E&EEUD^^6v 7EvDiE4EJE檂Eg.a rDʴEVpEzsEY>^E b;(Ž& EiRE FEg86EsĒ*3EEFE<E K(cZE0EEǵE:D! !"ºE SET(EjECDYB2^CkEDE~WEВE"C]S\Du0ErtEEEy!a&ѼkEEEOEѪD6(]#CkEVZEEVEmA)".7QEEE߹E=DRn#RÎSxEEEECTD'C*sE?#ES>EdbEMDL| źfDDEvEEEA ź yD0EE2EaE='lNETE>EAE<:E|Ĵ*H/E`EC*F7EEN:Į6)*$WEBMEs*EXEt'D_"di[~EE E4EU-DŭC.EzEE2E"WC@Œ|DLEE/E1EP.+"Ōw DCKEdEEb[E 3(J&O ESEEE3En#E+şх@5EKEEEH Eqī(ŚFē/]E5EDEzE| DOī!]tсEEdEdEN-xD ť4ŃDCcEE2E !ETDe Ř]AEGEE*E bDdK ŷ$DErEgEEPCkŸDEjETE wEBmwg$p=D(pE30E ETOE?Ăp)żQ|{EBEEEN'E*iAEEEBEUEޗ&ŢDiEEjMEEtrDY&gBlEE9EDE1LD j_ň.DME¤E\|E E">fCUssāDւEEEtQqEo V%sĠDEtErE IE2:OĞ)ŔtE'HEFE"En.;*mT/GErE]E>߽ED2UV%]zoE@EEEEͦD;OOCE?E?ErETe6DVwDDjENEE1EC^:9>D>!EfE EkE:VtA&P%ED)qE2EԎE:CEb)Tޛľ&EuENF4EE]) B ,NEDE.EED$#uEE?E̓E05D|0ųCEE2EQE D5 Ŏ N[DEE1E@KETBVijDaEEr6EzdE÷'UEcE+ZEQEJ=E8(uf*Ŕn+EMEEs#E+Eĥ) 1`SEqE7RE~ŸE4!DR9#?JzE7EEϧEM{D=__[ѹC8E&EEEtiDy q-pDE*\EqEE`|^!Ŗ_DqE[EmEb_EAx (K EEE2XEP7EPy*ۋĤ1E2eEEE=KEK5)ŒYESEEREQD"J6¸eĘE ;EEtD ÆőCE^EEoȒE7ClD:EREGE?E "mDE EELYE1V ĸ3)ĸE0E ErSEL1E}*gg^7E2~E jEYE + E}X(ŵ ؾ_EE|ERE D] IEyEIuEEpD? Ųwp D"EEERE%]CDŢ DDEE9E|EmEHE[n-':}õeE}EEElDXwPDBfuEEƣEEFZD& ϴKd!DӘE?EDwErdEKACvŴƛDaͪEdEvE,uE&$miDȥE E2EMECě)ż8EuEE FrVE%EY )^`_XDE)E*EPEcD 6&_= lEGEbEEWD\-ŔC`EEED/ECD:5ł8DEWE80E:sEmNNCzbDZEJESE=5oE+]U&SD߼EEt'EFEW@*0e!EE)EEeE:*SOĠIEKE:E+EDr% 1qEEeEmE3DiHhcC E PEa\EHE*Dm|KDQ#E: EEtE+B8N1DůE*,E?EhE åG'ŴD,EpE[&E;AExiē*l'E`EEZE EpQ)n>\OE`3E9E{1EDļ$pNwEoEJE}E6D şC׎E`EZEkECDB1Ś) `cDˠE(E()EvE!A ŀ7DS?EE`|EbE:4O(ŗěEnEEE;;E:b|+ -EEE3E EuĀ(Ő+ĐUEVEʹE׷EjD^ĈB#!W]}EEfE(ED&~ŕC.EE]EqE*D\Ŋf3{Dl֣E( EEE WU$M!p]D%EEE\]E^a(ł` EL EF0nEo5Ek-*4ERCEEuE|v E ޻'x Q\ENEE zED!>WEvvEwLEC~&EʘE1EOEuDō 4UDΟE{|EEHEB- KDEENEPfE 'f4ECEEEj6?E noӋ*0ГH*E E.FսEs>E`B{)2REE _EED/ķ;#ŨKg zE`EtIEEmDM0Ű:ŜBCE8ETE8E D"0 c mDEvUEOEÃE@Nh ŷDiEj|ErQE7`E`%Ā' K EEEEF9Er*Ōi0E/E`%FogE [E.(œXE EEV+E&D˾!REEfEE"D ŋ>CKE[E7EECBW< D =E&EQEÀE4!vġDԵE ExEEZEg(3x [EEFE@3E5Ć*,Q6E9Eh FE E>r(<ċ;^EvDE.E|ZE !D4*!Ř6:E"EcEKEsD ŴDqE>fE>E̐ECŌeDEEkE"c{E*2#ŵ}YDd/Ex=ExESEL-)ŔײEzE5EZE,E%,+|eu:iEyEEEUE ˮDC BzEEaEE CDD}4ŜJ/D6EnE@Eo1EP_CC; E1rD4EnEtER4pEPRÜ%ŖlDITEKEE8XHEQV*_!EEFdE8!E(c*OĻHE"E0GE(E([D@zļ%vpEأEEEBD|oŮWCEVE(E@E0DqũHDEPE !E^{E8+BlŦW~DCrEETEAE%KDq tD2EwEEXdEN+!ŢĘDZEJ0E3E*]EW(Ě EEEZEP5E1XI+žĠ3EEHEkEfE+Ă) #(,ZEhnE-E녵ED@ĔW"b̀E4EE̤E-D|`CՓE>EE@EC'>ŪvDEd-̝DsqEmEfE\sEO\$|Dr5EE E+LEF)ŏħE) E.;FNEo#Eu~|*D[EE=EhSEED_=9&YϸzlE`E8EERDOS6V+C"EETEE>D=N4F9DyEHEfE,GEP1CJōnľ#D EEEmE]?%ŝDؤE<E9E_FEիX?*ɞĠ $E"E>FxEE}C?ţ${D^dE%E$EfE²"׌lkDE =EDE{[EfGi1(.ĭr EJpE vEEBI4EvĜ*ŦW5EgEKF@E EK(S(]E8EE-EjD6!g=EEE]EyD  D(E#|EE\EC9UK撊DCE2EE0}E>"$"D"EE-E=UEz>*ܜ(ņdzFEBEVFmEV-E7J*~xđ;EEBEsEE ħ'Ũ!ncEER EXE2DŤBEED2EHޠEcD Ŵ+@DEE'EECJn^ϕDE|Ex8E(}wE{oë $F"ADhEppEZEOE=#)P@E%EFE'E>o*pg{:BElEEbIEWDC&Ť˽iEEEԻEҟDlxBa‡EdEEEUEMDsQ܋/DNoEcEBE翋ET]C=S9$ DDENsE΂EpE?%fųD沼EѰE,EUIEp8Q7+*x~E EE+E%!Ek$*ů*VĊGEp\Dy ֽC EtEBEE* D> ņrDEYERTEl[EV JD ;EךE!E_Es R(pqA EGEEE7EV=*NJ]02ENEE2EzEL(ăZE>EEAEDxJ"tB¤E\E{E|SED:=C*+E(ā*t6=E)rELEJEUEr<'2:peEDEEj@EeDеLkB8EEcEEWDt7 &SfD⚘EmEZ1EC#ESƋC:qQ/њDꓪEEnwEtEfR%߷D6iE~E;EV-MEE%N*ź"EEEEP%E `yN*bCE6qEE EZDm&3kkEE>!EE]DB\gXzC#EE.EFEAD,6DNEEE3E*TECbĜĦDE"EEnE\KՌ&Ŋ]@ D ׽E+EyE*ZGEǢX4*ĕ!EE>EE$EN)CLQRIE gE8EE?D? %@ÓqE#EEREDNfdlC>=E9EE;E,D Ŭ-NDQlEJE&EE=4BHU@r@D ERlEE6iE|'[ElE;FZEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-21000.ark000066400000000000000000001220451376444676100257270ustar00rootroot00000000000000my_id BFM )[EaeER!EY-m)œi(DڸEL EEwzEPP_ŷ7ņpD#E;EHwEEEDEFxE7E_ê)~DDE{E?EwELςrP}}DzE~EE@EWDUIŦB(oExEFkEҵE#Dp`(ؓ?ozAEllEFbE3E2iĽ*gfEΎEEE sE*stŨЅDEEb6E2EKD 4^Ō)CEE+EqXE2&D^kb(N4ćDE`zEF34Ea0EĂsh*ťğE ӼE7EEoE-ÊO TJDzE*EEEB=D{ .v 2CzE,nE@EEDwdIJ'i)/HE'EFE,EOU}x*VtTE!E_E\E6lEܠLÇ!ٜpD;+EEE ER0D t[ŊcCtEd.EzE>EBDCNn'ţ(LEExFE$H)E>˃*.6ķ EExEE@iE}Õ!N7_DȤEQE>BErEG#D x$ۈC4EPEE>E?DjD&AtOEE#EE%E(o*ŖwEE>E6EHfEh"ĺVDhEE:fEE$qD9ǠCEE=_EǮED9<)&ŤD ĶREEEXEY"E(b*ۣħEpE9EEbEϭÁG#Ŕ绦D EtCE6EaEe? DS+EdtC_EE]E;E(JDą%Ã=VEZ6EEsEhOE$ĵ*&EE/EܴEG_EнP$ſzWD]EEEzEdCJSCBEEzEE1ƸD%%%ÂYE!CE{EŒE EĜ+o~EEtEJE_[E$SZ$?ADŪErEEEC~hCErE!EEnٱD $ŵ d\E>=EilEKE 4Ee+8 E)EEEXE<-Ô{%Į\DD.EEaE @EVDCX<ŖD9E3E1EvEDd#ł_}`E/EGEREE9ă* EjE-EE`TE%x5DnE*-EEEC AX8DOEE2E/EqDĪ*#ň֢!dE'EEEC Elą*ŌĖ<$ECEnE2E LQEuġn&FDAEÊEdE<EĤ)Z8E!EeFNEYq);DWOE#.EVExE"wDȝE]EWEEP-^DrXBB0EEkEED81Ģ(gFh?EEEWE5EGd)j3DNҺEqEzxEuE<؁D`E EERQEdQDP.Br@EPE-E[ED)pe_(; )CE@E6E1EĐ2En_*Ex'E;gEĖ* 7KE>EAcE 4EZE%&ͶDێEtEbEaEC eŷbŧ+CcfEaEdEEFDn#tLZ^^EEY6E9EEiN*ť4ĻbEEEE0VE_>ä%,нDEEEڙECͩ<DhExEfExEᖨD r)#'oaErE/E3[EQE٢+Q6!E EEESSELoX&#ADSEE(EECŋŴD߇E_REpEUvE`D>" @beEEE-+EE,;*~%E`;EAEnE5OE#`&ŃujDůE>E7lE4KEIeCd g"D&EvEpEEDD? "W(hEEnEEXN E*)EEyEt E[LEĝ/'ŸҧDXSE*EEJEfCmvE \.DEUEEEUDwp5!ď(Ŵ4=DǵEVEqEpǀEpaBpHTD㣙E_EEϞED"&pńȒp:vELEECEDZ8Ļ)Ŭ`Ĥ6E&ETFo0E>E[Hĸ)/kDEpEE0}E\$Br-6bDEXEXEK,E;tD/ŘŨryEEJUEָEHDLl)ōUĀ:EbE*F EXA;ESSĽ)ŔbĠMDnE$;EEKzE TȨoDWE:8EeERE5fDA|EE~EED20H)ŐKĤ=EE$FEĚ7Ed\)?DùEzE$E>2wE1]46żL}DAE;E0EEDYD*bVB(@E^EE64EDwĊ(řAMAEEqF E>4Eh)vXv,EGEE0EitEDE,E:wEęE|KD y4BEJE"EHִED:D(7fDE ņ&C.ІE+EUEKEDA&6RČNEEDEПE֭&E/~*kɨʝEEREtEcfEΤ"9Đ\DEEEED*C_EoEE E+Dr~&; ćRE@EfE^EX0#E+M6Į=EEE ECbE˧RP#u4DryE>EEjEs D0c̷CEECE]EDNn`&Ť.ĉUE߼EEvEEhEgjV+Ŭ@EkSE6/EEu_E'$#DDEE(EގEx?C,6CG̋EeEIEEDT8%ŜrTYEOE vE7EHEcՖ*dĄ=EE\.E'ETS\Exk$RĦDE~ EREQEئCH"uyNC[E$E#EE2fD-*ā$L\ElE8E6EcEI**ĆEEWeEE^XEz2%ŰzD4EE]EE CŖ`DG.EEfE ED\4#̾`E4ETEWEjlE8*L-EyE\EEUE0Ĉ%LsĞDεEwEuEEGC~ŭ&* DsE/EEjEfD>#ňeFcEKEE5EE1a*ŽMĺ5#E Eu1E,EEVE/DE89 (bzDXEvEC[EtāE?Bȇ4ʥMDʘESPEHErޟE܃DuFŰtE+EƓEGEEA*)pgĠ4EJEE E@E8C߬(f hD&bEyETE:+EB{ŚYDgE"E5EMErzD?Ÿ&`LwE4E=3EڹEܨD4`)>d]858Ed;EMFbEj=EMF)DH7DѷEElE |EXAb(fD EVEEIE`nDjŒ@{ {E1E;EMEDb\v@)Qry;Et^EFt}ER:EW)ŻD)E`EkhEQeyE0řAwtDZfEÒEi_ExEmaDl(Ō+BaW~EEE0۶EDD= )G8 ?EiE%F`EC6E2aĆ)z1їETFD1 T CEE(Ex#EUPE]EߚEv!Ej%E ě*Ć E\uEHEQ}ERBeEɛ">ມDPEEEwE^6D9~u!C|(Ed_E5JE_,EyDqĴ&(UĝSElfEEiE!E?|*'lE7E0EtEaED#BjcDD5EE[EяEDjDŊCΊE#EEEE:MEIn:'D,EIEwEE0qCŘF ",DEmEEE{D>ĚF!QZZdkE2EtEyE EX/Ķ*K+EEFENIEd&4'ŤoĀDEoEݘEXE?Ch ž8D$EnuEvuv1/EiEFE} FE]1ĶJ(ĎDgEEEECf 62GD-EEfEEDxV½LrEvE|EE`E'Ҹ&*Ȱl2EEOFE]BE<)(GDjEtGE*EEXB\)vSD(kE'E;E!EրDŢ vEMEEɺE D-)hci6EFE FE:4?En%Go(ŚD߶EkEEҬ~E4.B 7`D| ETEEpENEuDȫń C]yEsE&E:WE~Dd0Q)(YĜ9EEE*uE;ETgR6 )SD'kECE\%Ep{Et mDEEEfEgD8P\dA|EjEE'ŷED6)Mz"=EEF=E 8E\ė)xGDعEVEI E$xE>OkyD.EEEsEl[D~ rB9E&~EiuE{WE}DD,oĀ(ZLC}@EE FE 5Ef )`F`E+$EE/EtE0ǃDqEoEtEEYODѧaMBHxEfEFHEոED6(C7CE.EF{Eն1Eͯpēj*ō~,EbEx$E+EqE ; 7ĬD<EEnEdEABDH y"C,E.EHEzfETD,T,(Ň-aGE)EFoE|-E4y<*ŃѲd{EE}_ESEۈmE;Ë ȚĉDhEE>ExE/5Do 6TCքETEEE DV'ۢ"jJE,SEFpKE*EzFy*+ E*E0`ElfEUgjEiqQ!Ŷ:Dr=E'E2EuE`'D ϊ]CEEVEƪE8ID$.'2ˉNEdEEEH&EFʛ*ćgEEEUE gE8"dĿODE:uE|EwED:$sΘCVE|EPEGEDT7&0<QEٰExEE#E͌C{*&E EuEKE;cE3"T0֤D@~E@EEE6 DŷaCEEE[E$EDв%0ď7UEEEeEi Eޏ2*m"E}\E$EEq`E{#;+D>EEE=E>D"Ŷ C|E2EQEM1E4Daď%6ƓXEYE3uEBE^E1Ĭ*ŤĴ|E0E`E E\E+È$~D]DFE FEUE:`ECsź*C`E0MEZXE-tESٳD '$pmÜ[EEauEEeE +ŖREEEEBYE8îM%QDëEEE ΋ECQIC EHE`EE>DP $ q_ErE"WE{EHED+>EbEEEUEeyè%};ķND"E"EEHETԹCł: DLEEYEEtD8ĎZ#LbEEf)E;E=EѣĿ*y%#EjLEQEERRE =&,DaƮEeEE⚈E/CH D EPEEV;EBpέpKDuZEkzE mEܟEDoW <ŐM|sEEXE>ETEǺ*ֻgį 4EE%FEQAEP@(āVDEvEE:EMB\PňXDhE^EgE_E|DjPk‰AwEOExE9EDļ)`Z^L7E"E'FE|=EJ@)JĢDJ?EEEE|EmTAYbfDEE*OEԜE7oDVŨ|7dzEE+9EEZDx@b) TH;EFEF E9A:E VļJ)|vD޸E EEyE"G;^sDAHEEEZEaDżŀg B8~EEEKE5wD)YĪ)I0>E*Ex FE6E<`*)BĬ1DZLEbtEEivE:Me_ޒDϞEVEYEEUDW4ߢBMÀEEIE[ݵED$ y(ņv?ĪBEEEuEҡ3EkĘ)rEϻE EE5YsE@RURDxlEPEE(.EDID) A0XCNEEEAEטD.I-(Ũ3İAEEvE FnE0Q0EpuĶ]*rE'E0EpEpEr$Ým ŢtDEOENEEVEEE!ICC(EEEE+DL$$hÈi]ExEM.EX0EE*ř`IEEEQsE<XEê%D EEEi0EeCCc&DmEkmExEsED6ߦ#B"`EzE*EEsEHsh*R EEEEmE `TEî4&@\[D ЭEE E@EEğ)m!xDEEEqERB-K:\D;šEuEpdES؝ELwDe0axErE:EtyEfDZK_)X8EeEh(F [E}E4E,Dw*0!}MYlE EzEOEE *ŐJ~,E^E#FEoHE *Ď'Ŋ%DYEřEEEv/CBԼ EJ(fVDdEEbE~E,jBlR^bDrEPE\E.3EurDtg]Cń޲(zEEb EиEDp ġF)ŒUn:EEFEj ;EjT[)DEd:EYE ZzEPHwZpDߜEZ[EEthE/fD0BA1}E-EE.EDP=tD)IĨ=Et,E(F1E7E&_R)k9 =D<EݡE#E/wE^{uVj|Dm}EEJEEWDLŃt*TW E1E+EEpEy[ N(rD;E}EhEǖE=D=& @Hz-C˃E;EE6EDDx'q+tHETgEEFEq-E0}č^*wrE'E1EElEL: oD3EE6ElIE1Dc ź-Ŕ[CwE:Ej7EԱEDh'ņ6!KEEHE"Eĸ)Ed>;*q EEIE| EiE/~s!/cĶDDVؤEzE'6E*E:#D k:ʼnJCEEEE1EDpĀ&+OEjEEE&E͈f*Œ ĂEE\EeEfEî"0į"D6QENE"E)ED5wrŇCE %E;EE>/DxF% ]RE!EczEX3E#EĂ*D\[EQEEEEbE~v#bDE8hEEREԝ Dn3ŤClC=EEE(EDd%NUEEʻEEbEV+ŎĊEETEGEUB_E@/$ő(LD,EdEEҨEMDC:YWŬCEbETEEDqF%xYEEߤEGE'Eջ_"+՛ѱEEREE[E i$ŵ8DE5WE~IEHE}PCnR\ŘCjpEaEE;EDE|Eğ*O#EEΝEїE*QENR& ?|DREʋEE9IEyCMŌ=DEEPmEɥED5"DQR3gEeEElE=E=KĔ*c'E$EEhMEtNE&'zD°E.E2EWE/C0o f'DEBELEBEoDĠK!n+jElE]_El"E̬ Es*UĪ*ETEFOEʟJE"^'ņbD EEEEӿSCv Df6DAzEDEEpEtnD~ 6hmEkEd`EnEEZD&*Ŧx9-EhEGFEGE.Ĭ#(+ėDrEEEFEUC AD XETEEyBEOYD'W~ Õ$qE>EE,VEES U*o1EGEFECEî8܅(.2DߴEpGE[EoEBhEOD̘EsEPkEEKD׋?л€tE[EEE0EQɻW)7f>5EEFEA@ECĥ(jRԀDmEVqEuEEdhBi\DEEEExD*E(ŭvRlPE>EsE9E$EGİ*ZEEE؎EdE/LÖ" ľDhEE EmE2D=@hBhCyE"VE%E6>EEDN%ŞC0TEvEE-ENj!E2 /*ŴB&E#E E:}E~kaE4p#!_D({EmE.LEE0D~;fCVE/EpEED*Ă%xMWE֘EESE7EG+6E8E]E*+E4^E $ŽnDE'EZE_(E#C%VC.EE8?E0E*Dzb$ [EUEcE|AE;E A*ł͘u!EBYEEdnE ZE@%ŝ`nD$EfE$E Ew/ClZ/;CERE.?EӂED: P$=E^ESEcE:EmE +gOiEEERE%VE* %ERDEgEEfEYCaFDXڏEkEE2ERCDP)# aEt}E1EE=E.p* Ĺ"E)EESEhPSEFđ/&mDG5E3]ETOEECDzE+EEѦED",=EeEEEfEE9A*ŦdĦ_%ESE&ELE,PEM(ŠĻD9E&/EEE$ CVŝ x2GDECEE=rE:xDaŨrEEWE4EEEY?*kğ3E>E]"FqE.1BE<(ŴU֙DnEvEFEEB>jxUDPEEEֲE\DrlŤ͋uEEIEpEEk8DԽn) `tG6EE!F2OEn?E|H)`D$ E EEU~E{B [Ż`aDl0EOEE dErDTŘsvyEnPEpE!EDA)W-y:EYE*FSEh ;EPĬ)($ĤD:)E,E.E4zE@=Ů"DoD︜E0ELE,؛EpfDXPvA-}E]eEEҾED`))cSMĦ=EEFD"E7EXU]ķn)4jD4E3;E+E¶wEhID/{D?eEE+EMEYYDqdr4BV>E[EzENED(BĤ@EEF#E@4E$g))ýEOEצEEhtE1'$>,ńD-EgE-3EʘE: MD`;DoBmցE ~EEEyDR5Ĉ'L8eDEiE8EE~;1Ejr)'@EEJE"E/pE2!Ĕ.D_EE&EE,AD3 {Vt)CTEZEEE:fD())+6`GEEF E$.E@| *Udb,EEZwEEmEYF6!A1ՐDEEQEE2D| ##˖PC<EqETmESE8DN'# !;KE2E4FEx?*E㻂ģ*  E)?EEEiEhoA!wDPE0E`cEE:'D q~SCOEE<)E(WEMD'tzNEvEzF$E&EZ*RĠEOEE4ElfE}O"ŁZD,EEE2E1DQ,HTxC!xE0EEEԬDl4#鴼y_E-E9E*EE46 +š 8|EUEEKE UEF&IJDEMEBEE+}C-Ѣ)I DޖEE-E|EzD]N/#AY2EcE4 EuEEEb&* }#EiaENEE?QE> &8DElEE,E@CRzDyEEEťENDXh"t-;fE/EgEEEJĢ*Ė}&ExEEENE~Ġ&ŹxDEYE_EEtCAt# b 'DΓEx.E7EKtE2DPQ!ŴrÀ)jE)EdEOnEH E͌*2ğa*EEE6Eg#KE!^'Ŋ, D=ݱE)ME6E#ESUCM~ g3DEE6E.ElDƷ ńFÐmEE"!E)EEĊ*r|ļ-EjEEE GE-1'IbDxE6EQE0EP"C,?ůI Ő?Dp,EEEoEЊDF6 P)pEEE4EgEʶ7*BVqĊ1E0E FE%DE7ĝ(#@D2EEEEEPB,kxKDݲE6EDEE}DşItEGE`vE\EuEr')hX4EEEE@E $B(MqDy:EƒE~EEeBK$4[DE3ENE>E}D?=VwEEXoE˺Ed!Dq)ڎ\ĵ7E E!FE=EsBLrE) DEe ExE|EeA }FgD1EE}&EoEhoDTHzEHEEXEF܏E֕6Ea)ڴDqEDoExE:-vEX†CŧDTE*EEELGSDTE@&B6EEEͲEJDLw(ŷ=ĿBELE&F_EI2Eej6*MyDEnEEE,rE)²ňQDkEE&EKERevCx(EPEt~EdE_D&XU&YĨSE~EEE[!Eҍ8+OEGE>EE{6aE֖#nĦ|DϧExEEŏED6v&CCEE^EܬEpDNĄ%_EWE,EEE"AE_vB*MEE.E`EP^E;O/ ${ZhDEHEENECf^C@~EE֍E.wEfD0%^DZE4EsEؑEE(<*ʌJE4"EVEExZEsö$=ܵDv#EMTE^EƌECҽCEɛEIE E1D)Č#']EΈExENElEڝ|*Ŏ$EqEDEEWE&7b%ŨrD'ЬEިE].EECşiDE GE/{EwYEwD?Z#h3aEE^EE[E y+ EGEEPE6TEY&šaD`9EEsEޟEYȪC nDdYEVE`E1E΢DĚ>"GndEEE\EEOԦ*Q-$E9)EE$EzPE+aA&1DErEhE]E*CA hsDjɒEEkoE0EDE/"xgýgEE(EEwP E?*ūY 'E6]E FEEPMExĶT'qDEZFEnEErC  n +DtEEEȣE2WDϥt!3_ZkEjEEϾEq E`*{O+EfcEF<#ElIE%'ũg(aD.=EERE|9E4FC' :DE!ZEhE<2ESD(Y ŧ.nEE*EvE^E勴d'*w/EEEEuFEd2?'ňUyDYE@EYE\҂EP' CsŽ EDEEE*ѠENlDP}èrE2E.EE}EW*mF2EEqFEoBEN+&ķEsExkEE>YE4p%S­D`EssEE?NjENCű=CEEE,ED)<$ñ_E\EEJEE>+*ŲeĎ$EEIEEKUEFO%ŻSDCE`EzEHECy Š D!jENE9EpENDNċ#hóbEpEFEd+E?ECİ:+"E+E?EERE İ&$cBPDEBpEEEDCz mCDEvEXBETEډD?3?"L,eE EKE_E~E8ԩp* &EEtE1E6NE!ĸ&dUD>EE[ERLEz%C $DETjE)EФE$Df!ŅvJiE=EvEE9 Eē`*ŭ-)EEFqEfELESE'ŸDұExE6E2E$VcC+W 1DGE/EͧEBEMdD3~ EE5EBŬKDEAEɼE}E=AEo=(QĉmD{εEEE`]EҬBr|!8YDE_.EEĚEG*DT6œvEۤEJ[EED9O)A`r7EQEEE=EeL)uBD;QE!EzEP}EAyŐ,6cDE5WElEXE oDwdŀ fzE؜EEĢEwDvč)ŏU2:E EE2E|:EV)Ŵ,DøE]E EzED@?Ō pDEd7E1E~mEbDm<ŀAP}EEfE?EDuġ((*Lė%>E9EEE6Eoaj)MW&D2EEEֲEmvE´!~DEEECETVDVBJE&EeEKvEDnu"()Ŕ>%AE]EiFyE3E,kķ*ώ7EEEylE(usEJ­ŁDp)EE\Ep7E>HD` *TŗB-EEE`ED@ħt(67NEE*UE\Et[EHz0E4s[ *`EExWEEqpEҊ ŻDXEmUEbEET>DO +(Ğ9C:EEEE|DdF&'ō3( HEҾEt%FW E,EX}ąD*EaE>|EE2lE>M FĸDiEXEE]E"0Dcu %ŪgC/…EEEFEEDĤN'_LEEF#E<)Es{*-[* EꟿEE^EK0iE}wm!9^fDܤEZEZIEE$D= ծ'COE SEAECNE_DĪB&"yOEEWEE&&ESL*TU*E2TEqE~.EfEԗ!~w)1DE~EEtEDŁCo(E+E9E2EXDB$C&ŭ gSE EEDE"E\p*UEE8E$E<cE?Â#ż$*zD&ƧE0E_E(*E|D{ŜځCqE*E״EX EgD3D% 0VEV"EYE.EgEfٓ+śREEE-EB^EtO$XiDOETEEgiERCfxźZCEEbEWED..ĜX%ŭwSYEz8EiEKEޔE`UT+3E(EfEaE([Eh+8%ŗ"ƦDͪE\EeE،E.C9%)ŘCEjEEED $Ōr&]E4EAE(9ECEv0W+şALEEhEEX_WEq%2:$ϻDEEDEEtC}ŀ59{DE EEUEhDi~'}/#FE8DE FE/EMw5*aięE|EYEE^nER/b ŦVDduEEaEE$9D ުOCEEEE,I2T)ņeD/EEE8D}E4Be`cDE>E`LEzǜEsDY(oyEEAE2tEhDTĊ):$U29EEFF2E;;EE^E6FEq7EK1\T)7Ѿ yDEE7EeAwE WUq~ŔDpE*EHE#EZDŷh\7BBbEEԴE?EDtp(lP@AERCEFEn4E{go)ŹE|EEME-tE'ŰIVD2BEGEJElEqKD+&~0vBEEUEYXEڴEDA~A(ܴ50BEEOEFΞEG0Eq *ŚϵmEfԼE#EEpEYxBދDHE2EE+E0?DGF ŀ(C҃EEEEkD1'ŤP,EEeE*Ç"QwDۥEEkiEEDdhXxCBEE݋ExED&\ ěQE]EE8!E="E4>+]C(E(EEEFbEr{#7ːDEEHE|QE Dr18C/EpE E CEADijD&6:ĝUE E\EEEl+)PE9E2EVE^Eվvl$GEDvèEE&EwEdC}ŝCLEzE.yE㻫E9DfČ*%8tBXE$E+EEE;Dh*eכĪESEEEt[ETÂ;$Ō"Ď0DMȪEnEFE+EC rCčErLE?E E{D&6E$C]E%EYEE"E=$*ŮECEEE YE,è$ bbD\EEbE,ՋENC0D^E QEąE#E$D6ķ;#XÎ`EmE&E |E~E끠8<*J-Wn E5ExEErUEtm%(D$E4EOEE<$C}ЕDE|E=EYED߇"/cEhnEEE`EĹ*Ōn#EEFpEltRE &&rDSE5EEPE]|CA SD:EEEEΓD!b!ŶԎ9^gEcE EE@Ehk*Icb'EEFENEgc&8eġDnEUE *EgE͇Ck Ť +DÓETESE>EVD`!a9iEyEEE Er(*+2*EZEVEAE+JEc#'.DձEB[EZEEuMC \3DqEEEE0DP./!jB&mEE^FEɽEE䥲*/|d .EEEF=EpFEL-F](Ş+ĽqD/EE%E ECJ EADLEEEVEDr@R b$pEEEyEE>ė#*9rO1EEĿE/-ECEV:2(|reDEEIVEEBnž KMD}ݘE EIEEDm TtEEEE| E g*g4EEN FdE@ECR) D g8D$ lK4;CDE|EyE蕲E@D{.'κ(IE"E$EE+E[k*ŁĤX E>ESE EW~kEd+!9DuE.yEӖE4E*DS `7jjCEOEfEkExD>T'_LE EHE|GE6J(Eu*Ď EHELEXEvZhE"x"z˫Ds8EVEEED@|NuCOEuEZEԵE DE{RE ɭElD܊& //SEuWEEmgEl!E^Ķd+ԗE E|%EzE9aEڶ$ ļDBECzEEΏED\3?CEREtEEH˻DP%DD`WEEE>E,<Eg1*ğEEEE^E.j$$~>ưDE:1E\EYEC4űCEEE6ED$Ÿ18ZE~E]EeEyE*3EuEEEjZEÎ$l DsqEnEm$E=EeCDyۺ.C oEE?E#E6DĠ5$ś4^EeEE8EEuĒ*^EEEE=WEƴz% >DBEE5EE{CL= ? DwEEeoEDyEllD"&ðaEEREEE#*=(!E(DE?tEߛE#TEj?%ūĆDEEZEdEfC";sD!ƑEE $EצEUD-"̎ÜheEEE[EIEbAh*]3%EWEi FEPE0ħ' DֶE\EIE|EZYC' ,LDEEDE%EDRC!Tv|&hE EUEE E4v*J@(EI{EAETELE(Ğm'\ĒDE$E[EEllC</ ,D|tEEE[EDR>“!|Z*0kEEB^E/CE| EĆ*ŒZ+ExcqE4EEऻElE8I*ŸlRP2E-EEE\BEVw?(6DE EaEfE* B@^GRDҏE_HEd EYEEDJvcvE&EEE Dx)Ńjav6E^Ee$FEG2?E%F($CDEE-EZ~E(=B ~aDd-E#|EzEҰEuD;Ť9`FyEE4EnEDĽ(W4:EEFEEĠDEExKE{E`GʈBnDtEEE EChDŠX/A}E҅ER EƷE+Dކ=)Ki=EHE!(FE.8E[6)7TDEEEzxEQFz3^ŝzDneEIEdE˧E[D9XuB{7E6EbEE DTSL!(1tC"AEBE FEM4Efģq)WĽE,KEE]EKtEnZůPDEjETEEFPDiB|EŖEEÛE}DaĠ((4zCE?EHFUE71E>rĐ* {ERgEGEEpE;FR 7ĭ DfEEbE3EK @DF ņŃ%C2EEE?EU8DlZ(:6.ĊGEb E F KEJ-E{zĸ*ŅKӇEEHE/E*lE?÷7! ĺ{D)yEtEE5E|&4D ŋşMTC E>EoEıE&DPn'1#JESEEE>*Efwl*ͮā Et1E%pCOE^ E%EKEWDyv#3^Ç;`EE@uE*E_Ei?*͑bt E@EmEr/EXUEgÅ%D&EkEEEC`&zD%GEEAEeE_}Dʑ#=ebEEiEEE+ŃǍ"ESE EERE _&}`DˮE/EgiEHEhEE" E ٮyN*ŃP)EEoEОEJKEB#K''K>wDEE#EERC(E; 1DOE.E.E1̢EްDf!ŞGlEyE7EEE#*{,E8EFnEGHEg-y(Ŋ]ւDPE8E2$q )MZD=sE@ExEED *ښm E}EqEEOE\ D- fHp fEyEEE>EO&@%łIJDELEE_Ez,Dl7)ť|W!EdEuE?EIEC<yŰCzERqEkE1E)Edĕ(Dp;DĦE~#E4E~eEDħ'ؓ?+5E'EEEnE((Ńt6CEREEQ׾E:Em@*đDEyUEE2E7wDn7'h#ŠkJE:NEEEߥZEL8öŶż 9DREEHvEE E˃\)bDE"E2E EDG %q޾AEwE]E2EbEt;qg'k $D:ٌEPEOE&E1 E45Y*8ĜD1EE%EEYJDе ūzVEiZE:F"EͩNE)h"Ű4źfDQEEEjE(D_غL*ߣEE4E`"EEaC ,۰JLjEVEE]E?:E2)R&őĵDDͅEEE뻨E^DNa)űp7%EEtEnE~E(TC'E~yICR~EEEO?E%Eo )ŴľDM{E6EOE^E*DH&ź3Ny9E*}E~EܴEjE<$l `CE7EEZE cEm*śD|/EEEeE@DiD"%%MEE FQEVEԮj ŢFGDEE_EEEKYDMĆ*zZE:E"]ERAEE0DR ŗŖ@bE`?EeEEBEj#$ZXLDE&IEz2EJbEQD2R* E`E>EDElGEDCMhB:#vEVE EVHE4).EW0 (co{D#E2EEZnEDĎ'6L#H1EsE΁Eb)ErE%BCEEXE6EEƅ*JuĦhDnEڏEE3EDz$#b ƏEE2E FE1 _E n6/(DEDE\E"{E[El:*Ų[MEA3E`ERVE!ÐET;D/m YEȝE6 F GE JE}øK#{άtD$ErETEED,*^AEZgEE4Ej*E-C?d<?nEmE sER>E6E,>:&ŀTtDLZEEAEh!E©D!5X(ŠeĴ!)EOEVEcE;zEC7ɀCE:EUEE "E${U)ZĆADe6E ;EʕEE Dı&`c'įN=E,EE}E<)gE$ _'  DDƊE E5E>ӻE Edǡ*ŔF5GD{ӲE@EKEߤE>ZD4!DMQEE|FESEFB!ž"OUD5XEE_E<|EDiMB*  E#EjE2cE EMD 8&@ eEtE-EE>E5%$%P FqD(EuEEfǪEDvą)B~ E#E@E/EaE%C8ž CyEREAEEt*Etcx(ID4EgEL$EáE;Dğj'CAĕA5EqEEE oEp6vyŨ)ClĆEEUEEE>*NDdE|EE:wE8yD:a#Ź JpIE ErFE4[EHrö%j:6DU{EEHEEE2ת*,RE˷EE*|EDE7-DFl:x]EEn FtE GE O"$nDEeEEbEzDUĘC*MEEE\MEMECwŰ AqE"EnaE E~2EΡJv'4 8DE]EZE~ED\k(ʼnWZh-EJEdJEƎEjwEtB\ɱ]CE!E_ EY3E&QE+)DBE&EEPEPDd[%D2RAEE` FUE0-cEl0Ìـ ŒDEE-Et7E EӟĘ*C D|E.EnEڒElwKDWw!%+lUEsEb FE4OEC"(('wcDESEEEMD^ۓ*PٷE購EEt~E(>E{Dt ΉuiEEEAE;E21ĵN& DkEEE%EDS)A[sĖ%EEETADmEuEbOEE>˛D'D&b529EKEEE3kE{†/Ź CtEE;E}E"<EׯňDD:EEEHEDĹ*;|ESjEBEEc.EtDŖGDcaEEFECE}$4O\D(ESE ETEfDs3)ŞĖEsEEPEsE CRŸzB!auE:EAJ*8xDVEEeEeE8zDwpė#loBIEEgFR EX[Ebl:r5D EI ElE*E gE'1=*EZзEEE&dE(3.D,ط =]EpEF0E%RGEU =$熀D?EƎEHE,E}fDց *j4ĖTE{EEEE!C1^BŸA}#qEEEEp!3EH'G pDѢEgxEmEEaDhTĽJ(\n,EKE EhE4uwEk~B{ *fɚC_EESE5EE)ŴDͫEE՚EE DRNS%ź!PAEEE-ECcEg'úK D&EEeECE EQʼ*mĖJDnEE]gE"EELD4,!ŀHUEE$FEVOEJ"[6bDEEE_EVDn.r*tEEEEJED żCY-iEDErEUEXA;EZ.Ċv&k"DEEEVEFDB )zua$EԓE%zEj3EE>bC<Ŋ"?C|EJEEiE'Etl4")Ż_ D)EEU=EYEsDѪI&7Ġ8EE)EMEͧkE1]Gx őRC-EDEdPE1xEE3Ķ*ŲDXEĒE%EJ$EJkDdt"áMEEkFEWENpw ȀŖCDՑEEEfSEh'D9er*7čEdEEEЖEzD yD1gOXaEoE FE]_CEmO$ĦD=E^E+EMάE& D:k)ťY_ EfEEcE׃EC.-BtEEjEE0/ES~7(D|EV=EdEE/D'|:Q0E E,EϾEsE_BŇCREE(EVEQEۇĉ.*2ĠDfE3vEEZݚEf̅DMij$DE/EERE_ER[nPco%DmENEEMEEU[*luDE!EhE-E_>Dņ NYEzEF EdKEy4#uĹqDvEEHjEKE5D]*ū&EHEq"E{EއEC# ͕,(‹mE_E6EEB7E1:'FĐ\D0EE?EETZDI(Ť^i+'(EEEEG|E*CX4ŚquC!WEWEtEEX0#E cw)%ĬD̩EEEyEEDl%&%,kxE&E*E2E0+EG^?(ĨܶDEVEE*EmץDIE$3ElF9'5:DjE6sExE(ӥEDR(]+EEEZEWxEB bŊCCREFEeEBEEd0)^|DZEEEE.D-e%܇`h@EEE0EROdE̅$S`= SDPErEEuE" EM*RDEE\EEOD7\!nTEmElFdSEPEï"6iaDjE^E1EEDGk*ŲܗaCE$uEE+E.E7D ŷR°hE>EEJE ;E,8&P PD鬞EWET!EZEDNĄa)u}#E nEEE9E`hCvż3C|E%EzEEs'E_k0)őiđ,DҧEZEnEE8Ds҅&ż9H7EEQEHElE(Pȇ# CEaEZEEEʴ*P^ DE#EAE(;EoDb"ŹcLE{EEE_XE:è* ADEE9EEDK^ı+,vEEJ-E?~E׍E9s"DVBY`EEE>EDE05$W,ĥDDEEvEED`*BnE4EElEE]Cͭ^WmBtEE6E8Ea/ERR2'DD EEEEeD,p'Q/E9E3LE"Ŵm6ZoDJEDEPE썰EDf̽*Řz%EE`EE/EM"C :xŐIPlE1XE1EE 7E|9ķ&gꈞDzEzEJE3E!$D>)~jĢz'E8EE Eڜ|E 2C7<iCkAE!EEaEYv#Euĵt)ū< I"ŶPE^E@F1EhTEfÜ!,PODEveEEnED?ħ+L EE2EE E6DNG pt"_dEEsE E&C@EHV%*ŎDEEERE\Dm) EENfE>ESEgC^pʼnj[B^hxEfEEkEv+E̺^ĸ=(ŹUɵDOEEPEbEvDh@'nEIJw3EGVE EQ}E,pEpAVN:}CEnEEⷿEeE lHU*ŤęDEEZZE$E;DĨ#(U&GEڕEF-?Er\EEgûگ0DEՄEE*E]/E;+)ıEt4EnE6EяE53DŮFt6\E]EḘEHEZ-#N }D1EE EEDL(Ďz*soģ?EoqE½EE.ECrLFŀ?.IpEE?VER~E,24ElE*0'Ş#bD,BE$EEE靶Dr( ^>+E ED t.hEL#EEVgEay#M$KEEjFEXES @>DEhEy"EEDn+H}EE,ELEEd%DCjzNQZZ6_E%EgF EDE7(|$1ЅDEE#kEZaEwD8oČ#*Ȯ/EE EEXE^aCN 4(NS1/EEmE2E0tE-BAvCEqEE_EQEz)Ĉ4DάEn3E]E6ED6$t`CEECFEF0aEĴP%šiŠDzEEEbEPE*Œ_[HDjEXEE!ڑEzBDb>q IEČ#ŽĆ]zDE EyEYE2WDr`&*6nE*E{EEkEtMC-şg@}doE)wEEqtE64EBC<'?ujD)EE8E2zE0D$.4(:/aJ+E=ET#EAExEjCB٠`CFE0OEHE#E+ E[W)Sf(DE:uEpE&[E*DLT%#J"'?E9TEF EQeE W <D}E.E`YElE# ENC{*5ĶDFEBEJExERD9!6BSEE3E=uE{@B$bB9C+~ESE EkEEı)v%DʬE ETEE̎D QĔ % LCE8E:FEDaEaDG0D0E8EE \ETsEYy*bĪDHDEEE^0EDDW?˖ Ż9.WE*E=$F*EoMEwÎ#ţѲiDԖELElEI%En5D.%+*겔E삽EE,ELEwwC L&8wŒCkE6EE:E9ET5&ņTDNEWEnuEX_EZD_Ě(־n޻&EuEEEEO}E DClbS`C~E`EE|~E|$E.sNW)0D.EVEEOnED 0g9&1:E^EEEiEb;{d vfDC\E~E EEE>ēn*9(D:EEdE)EtbD Ŗ"DìROEEFl E\UER!^pKDaErEECnE̺Dnѵ* k E@E5EhEEBDC b}.>cE?fE FEQAE:r%ł}Dg^EyEղEEcZDFĸ)_EFEEfEE~CLBAwEnEHEE,EjZn(6DUE~E8lElED4'vJR2EEitEE!bqEmTAŲ/CDVEJE8EݿE<ETG*ŒmğDnE^EOhEE}QDÝq$ş 2GEFE F)E]Ez};HC-D E ~EE3ӷEE(*šت EEDAELEjEP5DźŮ[[E E!FE4IE~#V^ĉyDvEEEEED$İg*^ E EbtEXElEYEC9nE%E ExE 5E$Aje'^ĮyDѡE$E0EE ƸDT y(Ş`c^}*ErE1EKEeyE CŜ ōCqEEʇE E Eo~и)ŦvĮD ԪEƉEEnENND%ł$ >EEEhEteE\ Æi ŨDEOsEEE EHK*ĨDlEqEEUE(7UDL b!PSE:#EFRE:QE0!ŪYD EVEEòEXMD]*?KĨ E/ֻEE EtEF D0( ^\ŒEK'E!3Dyo){"E߻E]EEEC?h CzEEEX=E/)E*.fP(Ū>D_0ELEEVE,:D:&Ű?Ġ6EqOE,]EhE{mE`<2c~[CPEB)EEwE4EWąt*v UDE.PEEvERctDĬM#Ŵ)JENE F~E"YE%9Ԛ%.=(WiJ.ECOEE=EҤEEU*ŋhpDLrE:Ey@EٛED$^&ğBEEEj=EDaE*CV Ş.DE@E[EEE,*śgݧD(E#EEEFD$o ņ"ÀVE`EF.EkMEð"ٺMiDtEEjE&EW_D%z*ř{ENfEEE*EC Š"StkEEhEfyEg9E3Ā&zND,ENNENEsE0D6($oĸ%EJE,EEV0~EBGCRyߖLUC"~EEE+E %EVpe)[DE4EVEoET9D>m&Ŧ2M:EEEʩE}7jEWD =1*VĞEI EEMEEƦCRy bpMBvEEE8>EE9-EVXb(2ԲDEEEE0Dƣ'<>K2EpEHEEDhrEpAų ŗ:CN;EErEI>EE3]*ŀ*?DEEEE D|yr'$f< jFEjEEvEI^Evݡ$ŗ|+DΎEv+EDEEMEl+ŜB EEE!E E8DVjzNZEtEEtOEJE|YQ#3ĠwDQEEHUEEWD)t*蠏sE:׾EqEEE) CnM nnEEE^Ex5E~>~M'ŸĴFDQEj E+E꟦E⁺D}ı(ubEy)EEEMEzEX%C-ş(C#;EEYEwEFv!E}ķ)ĔDE؈E1ES؝EADqg%n'|3>E:EEEufEH/ Áhť Ŵ D$E,EEmE( Ed*ӵD)EEEqEWD0fs!۶3wREEbEIE4MREh!/֣XD;EEyErEDkĒ*]Ԛĝ( EEEvExE D 5 8fEgEcEvE=E& % DʝEPEEYEDtr)R|xr!EEwqEzE6ECDCַzEjEzEiE j)Ecč(k;ęDE/EExGEz΢DIJ4'Ҟ>z5E0*EEEhnEN"C#C[EEnE˾ENEh* gD EUExEHEȰvD\2#1Ķ9JEm`EE]E@ZE|іLŘŚ^9DՐEEE%EcEª+`đ[EEE>EEj+DŢjp&a^E9E FE@;FE įr$TAƃDۙEsoEEED2vP*ŭAEKEEZEE,CvBrEg ELIEE@1EߨK'ŨgDu+EE*EJEsDXĘ_(ʼnWz-EE7EEEvEB U JCB1EEEo E^E_̃)ZDE@EErE}D$%]WAE{EE#EbE#;bS dD܌EEFEE, Eu*>DEEAEEtfIDŰ α(>VElEEԷENEV;"EfDjEE%EEEΖDXĎ*(̕\MEpEn1E2EEُC^ Uk0^jEEE&E=&:E 2&Ŋy8DqEEgE(ED2JĮb)o%EEET|E~EmQC!-ŶrGCX~ErEqE.KE%E4q](jpDE=EBEџEmgD5&&U2m9EEEEjE|*g< CE EERE2]E)v*ųٻĚD7EE EJdEhDا"ŅØMEEFIEVE% 0Ŗ_GDENEEE7D@p4*EE꡹EZE;E$EFD`^ ő~2@Z*bE8HEME׃EsBE\}$~UğpDEBE7E.^ED]*Ż`?EE=EE 0ECi:B1vE>TEER0E? .EW_:(c-ĐDݤE3GEETED Ā' KL-1E?E?E E sEXBj0tCEEEEE~Ā)n_d[D٭E"}EEBE4YDcE%Ď%ŎLDE';EjE8E~D3)v}Ĝ EKE~E+EuEC%"ŕ p CyzEfE̱EE(L*E|dĺ(W(DEEEE7Dif'ş@C5EEE=E[oE`6 hCӆEEZNEEEJģ2*ڏ@!DtE EdElExDVk#pSIEE"FE,![EPRw6D E( EBEEEZ*ŁMEKE$ExE E{,DKŀy|]EEFEFE.C .$n-DE]hEþEZRErDQ V*E$EEvLE./E+CBAqE%EiEjE2ESJĮ'˼>ӨDE|EltEqExDR,L'ŝNE1EE&qE zE&$sELHBɜKClCԙEEEErE8F)ĂDE]EREgEmDy@$3SEEnEFx&EUB_EdfŜp&D\E"EqEޞEEnwh**{IE7EEEE
C~E%EzEl"E\EѨĀ"*UDČDiEEd#E֘EyDM#pĞyIEEn!FEc [E"ک?RDf6DEE}E̶E.sE\ +J]zE8EEmEUEH.D*ń~ú]EƙEF EGEZ ČR$4EDEQEzEE+DϮ)ŚoTEEcEzEvׅE1)Cv4ŰնA$qEEEE2VkE`N%  CEEUEE+EOғ\*?"DEEt%EE kD)u2"0Ok?MEEFE[wWE ńŚ)DDEE>DNnRéXE1EFEKEľw"#Ų(?pDEE;IE}iEDĞd*ƶECE9EsEЇE_C ĂT!º%mEgEEZEB7Ei:'"~DƠEVE7EEQ(Dѥ(WiN:(EtEEE{EZ#)C[E;EJ*E^("*nDE&E=EEN DUĝ'jCV4E\EWEEwoEzbH9vCEEEEOEmE,Uĸ{*C?DJ E EREzE|D̔{#ŔqČHEE&EXIE>[Ex7ҩ3DXڏE8E?EEEZx*ś)hVEEȦE|EƚEy0Dj j]EFEF>EsGEFĕ $Z\D,E mEEEhDv]*.LsEĿEEZQE_EeCwoŲP-A0pEEpE,BEGx3E6GĈx'zDvEsE'EEfD2l,(Ş^,EEEyE,AxEB&lrwݕCuE9EkEGEE,) {DTEE:E씜E:D%Šd]@EE}EE 6dE!Bő Du֋EEĐE ^E+ Ef +jĨD03EE0ECEOD)_Ŵ ŮmÈTEEEbE*PEÝ! L_DqEE%EF ED2Ę*ΞGEUzENEuE5Eo}D{ fl,hEEEPGE;E- /&T?ĖXD$EEZ E[YEDtĤ[)ńXu#E:rEیEyE.E"fCū4C|ExE?EEV'Ep kR)GP3jDէE֍EiE=rE_*Dx&;9Ā8EE|E+ZEblE]¸ZŚ euC:E{EhEEE4]*řʽ֙DE^ESE,E%oD`#%^ÞpLE|E" FE;XEl"W ŀőqBD\EE6EyEk8D+ߐE"*E+9E_EEb"DɆZ0`EEEt>EDEe$:*Dl0EE oE EvDf*CĘE38EEMEECc=FBtEӌEeEEE/EP@(&k\DE|+E%EhѣERDm_(Q /EQEC tŹyBxEDE9E{Eb+E^>(ŨD,EXEiEdEPHD'QEv'(F3EcUE2zEEpE`$@S+(VŒC'E(_EzELE9E1l{*AXDE E^`EUE-Dj&$laSGE@EiF!E\E}iÃW~Š0DE8EE|EDEs*żܨMEOE(EEE62DCVpX\EmEREExHE$^#}DKERE+EE>>D[**0|ՊE.DEEEvEC(1} A`IpExE͊EQET3EDl'&vD4NEE5E E^D% (Ų^^+EE|EEJEE*Ŏh}DJճE-EEE4uQDد!ŊèSE-2EP%FBELPE&7ð!půB]D)EAEi:EEcD|-*"IE³EE>E1EDz R@O«gEEEdET'd{_E(EFpE3DE]oĕ$NPlD@EFE/{EEܞDgHC*~ EhEElE[EdCYEkBrE8EEE21EOľ!(šmDEEEܤEbD˃F'UR.EEE$E uEDBOҬC<EdE& E\EZE)l:&D4ͬEVEHEvElDYoė$kZc;* k^EEE?E̅EC P&ŀyxZkECEtE"E8E5&Ń(QsD*EME݋E`JE߿D3.)n&Em/ExEE}E4FC\ńkcC~E EEB`E%Es$})gWćD4EEREnEꠘDJĞ&&0Ē:EEDE\E@iEuvK ,CxEe}EEEмEHE]=ģC*ŸTD EEE(E bDP>"jsOEQE*-F!ETEHG*!Ň)MD ΒEHhE8E:EDBa*wĈ EKE.EiElzEl@D` ~Ŧ-ï]cEiE. Fz E1AEVr%*qđ=DAcEzEBE}E4D)ŷbrEGEEEhE}C^HŨB1BwEEzFEE,EǸZDl( 樳DEEdEGE nDČ'IĎ2EyErEE[qEKAR[ŐBCHEz]EE>EEoĺ`*{tDpEhEKE!EUD`#ד ĂGEEFE]E]~p<,D"EEEE8E$1ĩ+'EeٶEi(E{EFE!4Dhï/[EזE<FEHE-F$$0U2yD_EEE3&ELKD&Mđ*)yENELEOEEpSC ,%nER EjEvED4E2B'ŘDfġEEܓE$E D;|(~d}O*EGEoE~fE8}yE]C5JŒC;pEEaE ES EP )ųJģDҴE[Ea E_EDL_|&Ő4%Ģ>E>EEDE%eE# F. ŤDڊE_EE ƺEP E9>+AشX DhEjE&zE6E;TDzp!&XRE!EEEQE{"oXDѽE%EE9زED˕*ޖĖ EܻELEEED iţggEPEFEqn=E%&Đ%Ĵ|D*ENEVE?EpD )Ņy-p"E)EuE@ETEÁCSŗŊ%C7{EE/EZESP)ETeֵ(ŁQĬODAUEoEEiEڒDJSĊz&Ƣ=n6EwErE EERtD)#ñaKE `E:%FðETYEM=ŸXŔ >DYސEȍE)Ed%EE9Ħ*44EEFE4E?ǎE(DFh2K_EBEFEEE< '$q*BDEEEEd=D/X)f\3KEWEEB(EE#>C}p |;BsE'EEYEl1EJm't6qDLxEE yEw¤E-D.,(|Tĕ.EREbEFE3vE_BKŊŊ/CCELECUEEBEvľ*i5:DTEEE EmD %5҂BEFxEEEPaE+G% D!E*EB7ElEnEġ^3+yWDEWEELNEɀEDI ż,CVE2E FFoEWME4#%$-iDWGEEErE Dݼ*$єv7EFEuEݾEˈEİC'N >56ºjE\EE*MEf<9E 5&"*DEu4EaWDC\!Ū"LDREEEE,QE.7"9f9XDTEEUEJײEvzD 3+ E|ElE:E݊Ed D <WO ê}fEEzENET=E(%ŬKfDɝEEd_E6LEDz)I}čy!EpE BEֲEEbC+cCMzER*U5EEȋE\EjnEXCůNlCE&E;EEc%EtސN*ҲDɫE6E!Ep7EtDDJ#*0-JESE"EeE.ZE䕚`,`dc8D7ݐE EQEEE(5*ŀy`EJBERE6E֎E\+DbzJn^E#EFEplFE2 #ŠĴDm3EEE,E|DB<* wE€EE|EKE/Cy$*B rEZETEE2EK9'-KϪDiEE`Ex/EZD{Ę ( WĴ-EEEKEzsEavEPBYvChEEFE!EqEsĻ)0HODEZKEEݛEDvj$cAENEF3'EcE7N|ňDE SESE E Emnij*ŴODEBE!EВEUID% &VEEE`E:NE|!w%|gDEEEkED*Y|\E!ETEbEE^C.{ ?g‹jE0EEETM:E0{&6QxDESEZEYED@)ŴimĖ9%EELEvEW~EMCbŜbGC5~EEoEEoi%EqĹG)nCEDrE+E'E탟EB-Dj&ʼn/4Ĵw9EkEE-Eo|jE8{xTŇ tCEEE*E+EoN*ŪT&DP EDEEE/hDI5"ŭMEEFw E|VEUÎ!ŋ ŤFDrjEElEt۴E}Dg&+!LČE:E>E E،ED$ \&tFbE5EExE"BE]D$ŢDEEE?E,DĽf*Ÿ(ALEɉE`EE,E9_CnBvEu*ELEE-E-XĆ(řn~DECEEEѪDij1(ŏKu0EsE&sEhErEtuB 8ő CE>E^E!~EpES)ąD߭ETEE,EbD0$b4EEE EEd^E$y,2Eʼn)DJEp#EEEnE *|>E]EElEːE`_EIETC<!;onEa)E {E[EΑ6EN>Ģ{&}LDvEE0lE8ExDy`(Gd)EfE4EEzE!C"F*FC%E^EE_E"EQzĭb)EtE BD(D'A@5EXEEE+nE`tz:qICEEDEy˾EEܜi*d>DEEhElE4EN-xDBd#)&IEEFfEZE łE5DjEEEJǶEOEU*<ĊlEEeEbPE1E*D~ g5]EEETETEE7C& X#lE޻EEE7Ezu>ؒ'İ3D%EEͿE\E=DB(: i*(E0EޥEE<){E[Ch}tC1ĭ&řҬDvEE rEME=DsMĀ(Ŝw{H$EE7 E%EfE4TCi.w6R8CW]}EbEEE 'EPl(ş(D[EE]EeE&DCa&źV6L@9EEiE_E:kE WUV) #C_EEmEE EÏIJs*ł/D'EE(Ew9ElDLgc|"dqdExE#E&eEEz Cj4BVuE-EE5}E$/ES`(0DäEdtEE6EZ&Df'ŜP0E#_E"EE tE>NBC޶EE$ETEEN)Ž4ćEESODF* E66EEgE£EDCu <0QmE3EE>zE6E';ģ['`wD؟EE$'EqAED %.)iy(E5EFEE͐{E:v&CLvtC9EVEDE"E="EyĴ)śľD~̩E :E3E}E֔DR%U-E42TL*qAD>>EJEE2E8}Dhķ;#IEEE(oE=\E}S[4DE,EEBEحE*0EڹEvEOEnE0Dpd?:Yt]EXE@#FȗE٤GE`%#ş<iD}@EE!E܂EgD|B*ŌEEETE%EģChŠzAqE EhEzZE3E&G,'UEwD,âEGEҠEEDĞ']{,EE-E&EfxE BBVCEDEEEECۼ)6yġDjEpEENEDԆct%ɨ@EEFErRdEI\. ŖiD,E$EE4E EI+VAD EťE,EOEMDz{*!HTEtEE&+EOE9L""Cž.`DqEbEEEDo3*{OVOE]EVEkEE| D2* ž hE4EEE*";EL-ī&6EpKElEE"ECEZĬs$nHD6EEGEtEDD Ď)p@ĘEhEEtEx3E"CE9B&uEE>hEEu/EQ`'*}DBEHE1EsEͮDd'O/E$EsEEtEBdE]5/CEzE80)fF&~DwEEEE@ErD0#$IJDE|yEEEj`EZla|_$D(EESE %EEb)*X٭āWDEnbESEhEFcBDv cȝ`XEE!F@E7[LE;"$bbqDOE1E>E-wE?Dx*Ŭı/E&0E:EtkEHEGNC ŵGlE`EsEEr)8EI:&ŊDߠE߂EEED~Ĥ(jj3(EEE^QEzq|E3CQ sCbEEAEOnEUH#E޵sz)Š.DOaEhEEyEDMD&k3)Ě;EtE"FECChEkŶ CDE|E5E:EEc+)ݓDY#E\EMEAE^Dh."ʼn\PE+WEEEE'TE-+!Ŋ\ŸvODTE\9EEpED:ĮC+6tĚ E|nE}EE=ERtD lL"åHdEEHEE?E ĸ%a)3DoEE0EEDļ.*ŀEEQE6E)/E^3CE|BHxEEE _E+E`Č\(śJoDExE~BEmNEODd'3GM3E;E HEE/pE>?DŅD=CxE(EEE ExĒ*$D֊E@E= E)ǵEDӭM+ŋEEEEEN0$D1|Z_EĀEE E)DEtpW%b3ĖDΚEhE6E)E&DqmJ*ˇĞEEEWE7E+Cc ^ŒHBJsEEEE-/ES;'q D!E~E ENMEVD4؃(Tē/E%cE&KEE*tEHB+ŅmʭCЃE9EEfEEڟ*TzaDԒEDE,EߚE.D Z6;%#1BEE) F1EaEW?ň?DTE!EؕEGEZ_E"`*|įޟDEBEȆE?DPo WEE1EE+ME}%"mD4`EfEEEXE|Dg*żhE֪ExEXE&EPCS ͑g=$lE>ENEpE8E7X&DYE#|E“Et.EVD(j(M'EmEOELE0}E=Ct`dfCErExEE^$Euܜ(DԦEE"E$ E_+Dķ2&i-đ;E8EFfEhE"~3 DۉEER E EEݖ* sDE+E:EʙEcDŴ9"ōfOEZEv;FE(UEvú5!^ȃMDvEEtEhEiD0,*ŧ EhEcE EQEmD p'ÈjdEE{EEE@E8#$řSDEEEȫE7}D)ہďE 5EEZE^-E_C"BwEE`EBQE,E*[k({D⠥EcEJEEåDK`'p$H,3EE{EAEpEEA\tCENsEREREE 7+*ů`DEłE@iEWEΧ~D88{$(ĊGEEH FKNE\EÐk5.DLYEkE |EnEwhEJgzD+ZrHEҶEnfEEE|&4DźųB[EAEFQEHElN$Ŗ8ĈyDFޘEPEHE.E,DS1F*ŌĤEt1EYEEBEEnHC:PoEWE~LEnyE 44E߿EČ:'R숤D%1EEE@>EDķ )bI+EE-E,E4xEtCZV ʼnCwEr7EQEEM Eʀ32*DEEE!EDī%"g>ExlEBE2EJeEÌXr5 DKEEEEZ ESQ*i $Dr׳E EE\E]UOD[j&!(YSEnE7FE('QEZ!Ŧؾ]DAEwE4EZŲE'DJp*@EEEEKE* Dx 4gE'E FfE@P=E )%DEE<E7ED4ĭ(^xx#EGEEEEGyCDvL)Cl{E&EE2E(Eh[O(x D*ŧE)EIEF%EɰDxZ&;Ĩ7EPEEE^lE@{[ž :=C%EsEEE!EЭEn,rl*" FDuREϊEEۗEsDt"æWKEgE$3F/E~YEK3 Őp=DYtEREE\E/E+*ŕ,EE۲E@EcEݩ$DyMŢ_4`Ç;`E=E#FEDEbąE$Ň$sD КEEEDE8D3đ/*ŧć<EGE-EhE,cECvcV·B7sEgE_EE0EP@9(ŞFrD`ӣEE(E3E'Dľ0(ŅV[.ESEEEDuE*B+\r9CE>E)EJE'E*OĀDEE,;EoE$DеX% hRCEgEZF,E`EزH`N. SfDE {EEJEE5+ľD+EEEECD+F Ō?VE$EFEV-ME6X#y>hD$ҖE0BEn4EEND0yN*J4EEE EcEWCn Ŷ^RkkEEE5 EJM8Ef6IJ&dģ\D E~E.E E'DFaĪ)Vnv&EgEzEcE|E*TECuōŬOdC~EEE!E$E|u)Ŋ]eDEdEqEZOE!Dzİ&Ŋ1ʥ:EEL}EcEwiED:k eCxEfEEEEI*šĂ,D"EEFE"E ]cDNđY"МñOEE6F(EPUE31 Ń%Ŭ-NDE\E~E]hEJD*شV\ EReERlEE†E\Dsj ņsHǃ^E LE: F[Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-23000.ark000066400000000000000000001317051376444676100257340ustar00rootroot00000000000000my_id BFM ,[EEMEB {z#_E*EFEloEd2 C>@:Ũ/BXET[EF&EvEyC|fHŁ$>QE6EgEE}E(CB~ ܈@èiIESE|REEEnCP ŬIAE=E0,E?Ed~EDɯI"?l`d:EREEEE-D4eŔ#Q(2EEEE̅EID03b%ؓ?w*EzEcREERFEeDH'ě&VVN#E,E)EWEKݔE"_D{ '5nE$ۼE]EtE2E\D¢̉(a[ AEErELEEožD0$)̌De EEEEVE`DlA*ŰğEME-EO-EE>Dp*eKD%_EEEaED*)jYDNE%EOEUEDdi+GڵjDPE#_EfE̬E*DQk*ֿDE*E"E/ECfDĻt*@&JD;+EEEEEe*MWD>EELEKE?' EĚ)^ĴDuErE9ETE`E>˃|(<ŒD͘EEJEuEdEbr'lĄVDQEdE6EYE->"EL[&krjDEPEgEN~E)EXnC^%ĩMDqGEPE!E{EK:1EW,Ī.$ӯ2DEeEE!E(9Eh"O4DEY$E0ERE@Epq ńt\C_wEEtEEGEÉ, 1CNEjEEEB~RE*E?EnER|E;CS 7ҍÒJEEgxExEEC< 9 %%CE`E EtEͅE~ DiBx)"; Ğy;E1E6ElE~Ep'DŪ#`$-!4E6ENEEEGEDxL$"\<v,EzErEElEdaDEĤ&sRħ$EEEVE>E"Y}D 'ŵi EyEJ4EEEnDp(ŚfĄEUEHEEED]@)@Ċ EpEEdE,ED^m'*řwIJEnYE1E E-ESD,P*_&ĴDgE>EBcE}ED_*ŁrDnEESEeEDڹF*0t>DE{E/^EEfDxĨ +ZDHE^BE8^E}EODlĸ*-DEE@E1E |EΠ$*J&D"VELEETE E5)]œDkErEEEqEĎ-)źDEE{EEEhuī(NDGEhqEjEwE EB_:&"xpDPtE/jEZEE|(E3H%-?ĞRDExEXEFEd/E /^$j6DAE]EUEE7E"ŋpDEaEElE{?El!ŻaCE0`EE2)EFEÅ\' C*mE=/E9E|EBNE`KvXųC%yEZ(EEEMVE,T%X4CqEE%FE>]Et.sţ=` B4jjE+E(FEqdEϿW1c”cEE F/E_lEBoCN&@ [E({EEuE.tEhQCUźoSEE;EE{EsCo 8ō GLE[EpESEaECf Vځ DEsEE;HEE+De!w.h )4[E˷EsE5PEEDJč)Ŏ 9EߴE9SEZzEzMC ųwXbMEE|ESsE߀EpC { TFEEMeEE_ET&DlşE!uL>E+E^EPEEtDŘ=#i6EyE\E0E׋E:DQû$aa3.E/lEEEhE LWDgĶ%ſKF'EsE(EEђEtDĤ'Ō*bYEǨE0EsE!pE-eDc_(x~EHE\E'EPE֖Dĥ3)aăEXEEbEnEDN)sO' E6E"̰E&D(Ϡ*Ŵ;DPEw E!ED&EEfę:*W^DvĞEEE E6VE EM)P*D8EE6ECE^E:m(|&DޗEE5EaXEEvjշ']Ğ~D=fESECEE2$E&$S؟&D6bDƯEEfE@fE,E *=%N~Ğ\FDEEADEE3EM% #e)D4EEeE EXA;E6 >"ŷq DREE{EEBEFH ~ "C*E*EhEEĥJEŌ ŸC|E;2EEEDRE}IhCuE)EFEqYE^ŀ BFnE$E=FKyE aE1]n\HAofELE#FEhE>B8N&_ECE$#FEPpEDC ŹUɎ?$WEEF+EvwEuC8,iْPEE2EE~EYC šOHEEbEE^IEC y* |%Ö AE E2EEE]Dg b"śr9E3EE[OEcEڧ1D;$34+1E,EEY?EE+MD.η%şFB6)E2ElEEБEiDMV&@ZĨl"EeEEE3EŃD˴'q'EόE3EdEEFLDCk(G{EtEfEDoEGE/XD/B)3<Ġu EoEJEE=ǟEN8Dz=8*ŜHĺ6EEEE"EDĐ*tأ* DE1E"EgE2hDJ*l&cDElEWEE{DJB+.J^yDEUE7sE 5E/D^* lO DEEEKEDfW*DTEa7EpEcEE/ @*ŦY@D{EE,EmԶE Ef)zOĐ\DZ؛EYEEuٹE#Er(Ÿ5p!DLEKEEEEWoĵ'ĴDEEEJѿEX0#EWWS&ĞfDsEEREE}*Et@}%xJD}Ei$E{EDEq2E)@#oH>.DEEESuE:ExĎG"ŲDƢE8E;ECEEVEq:Ej IE'$ÙfR ECC~EE4EǸEPE hbŢ|l"~CjvE|NEFU2EXEk4ß[>6CoEOEFE_E¤ŝ0 B{hEHEEԂEugEZA,ŋ}¦E`E4E FһEoE0CH:ŲC+ÁXEsEpFn EeavE(fuCŮD.QE_E8EvEu}EdC żwŷ`ƯIEbEWeE(EEC: H 8BEE&E,E \EBDź?"9Ľ:EжEkEEމE@=,D{4#:%(n"3E}E EgEedEHD.E%b.?@+E1ELJEEE'dDkM5&řU #Ek,EEuE4EDKĶ'-m:EE?E]EEkDlĔ(߁E,E/Et;E|EwDXEMqEҌE CDĿ$;{,EEEE `EҎ`D.b&Q$EEEOE,EX|D3'ohNEE":EE*E|ٌD9m(DE#EYE ExE֛DT)")+rFEE+!EVE:rE*Dt*Lj~E:}EEEED2^*1e(E0I%ŖSDE0EEfE^/E20Ħ$ů7DZrEEuNE"EU;7E+7X"żQDȫE~EEDWE]"?EĜ!6ő$D4E1wEqE6EҙFEî\ŷ RCE;E޷EEME$q,>QCtyE2EsEEUErVźfl9CAqEEF{Ev]Ea 4ŘEBjE|ZE(FhEdE@ QʼnjŰ9cEEFzE7lE^B4ŌŒ ̊[E&ERETEsEMCvAžkSEEEQ}Er{E@C݊ Ť0ȁLE<EElE>E8C{ *vDEv~E2E/*E ڄE$D+Ō!(UA =EnEúE\"E5E"!DΆDCζ$ŌO7".EpELEcEяEĞ[DR%b!Ox&E9EE)E`EwDfx`a'nOewEREEEE߉DT({ģ?E /EEfZEօED_2)v4]EEE5EsНE~.DЩ3)ŜďEEEQEEOE靶DR!*KŝĎEױESE#EߤE#DiĎ*Ū@~DoEPE|E'EuDo*,ܲ~D*EEEPED~&*)brDE#\EdE^EDz*ŨADkEE^EEEĴ*Ś0D EEEEdE$M)5ĆD7EEEREEbĦ)jD\EEE`EWE^Eyr(]D˖EE#EtEEDc<'ŕ,YvDEEEZGE&EMĘ%.YDoEEE&Efi.Eq5$ō4C EEE7ETMEܦfŨ ŅCzEmE E"E*TENf,*9ICVPsESEEҫE\EÍŚŰBkEEiFE"cE0<]qcV+dE;Ej(FчEjEpPB˾:f ]EEF@E=rE>?C.@*@QZZUEatEE8EyExCŧ:oMEEJE(HEЀEC I7FEEtgEEXElD D]>EUE~EE EDR #V:6EÓESE@EE8D(z$I21/EbEE̝EFEVDz%ŒJJ'EE @EĵEEsDzJ'ŤLaĵ EƵE_HEZEEEDĺS(Ŧv11EɻEEEZEGDwy")ō̵EE4EޮEeEBDH)P'Īb EjEۛEEEDPI *GEhE1ME E-EnDK*űĎ Dp$E HE\EnEgbD-*&*CDγEKE EOԪEDس *Һą}D=iEE)$EbE#D0ɩտ*ŤĢD@ETEEDE_ED+ĵ*\DN͡E*E%EHE{EޔĘ)~TD}@El~EFEEE6 )VxDݚE0EtEEF1EX~q(D ~EE^AEnEEvfn'ŬP{D̓Eh=EE0EV%E~6P]j&w_DEZEE_E.>-E>:Ġ$&jā BDEIEfE EH4E!#+$D'ELEERE( ň}Ð@E#E%EyE5:ED"SK8ESEkElE,E/5DHPHr$Ŏ-SS0E74ElEMEyEPD( %Eķ(EA*EqpE$EJEmDs0&b!^]}!E*E}E8E̳ExDĻ'sڡEOCE0EE0ED)ӬCE5EE|EќEeED$.()ţۏڝ EfE6EmEJ"E֢DY*@)EƶE"EEjEDݢ*ŚhDOE:uE6E E%Dؾ(++uE5DoE@rEhUERjEDT}*ŒD^E,,EdENEkDH׫C{*|mDEE+E ðEBD0.:n*PĔȺDG}EE5>EiEVEӉT)* ګD=EEEAEv: EHG_)lDbTE'E"E 'EPE(hf(hFڎDE4E)E.E Ekĺ';DEqEE\cE$E0T&ſĕbDrEERE]E+E >%P-EGD=E|E|)EBE3E@&]#tVr*DÉE1EEIEC:E8 b0"Dx EcE,EE?FBEm j *C>EE}EuEJEÇ( C'}EMRE@EE=REð&RlC#vE&EFέEBYEX$ųop BnEE3FfE)`E,htiTAfEcEF8EҋhE\ B"+Lq_E0EYFEE9oECt&sD;/XEE FzElwEPCUŠՏøgPExEEoE~ETԹC( ŁoqHEQEzEE+EC6 sr@E,3EWE_E9†E]DzŗT"ł9EjLEҟEo/E>=ErĞ EޢEE6EE_ʮDL3Ă*ű˜Ľ8EWEREQEEӽDɂ+*ņ!>D"EmE8E?ED*ţxDd E,lEVEE_:Dצ]+ض&DEXEnuEWE2]D8ļ*: 8D[(EEE EwD9v*,FeDE]E\EPEECĦA*D3EEEE E=Ү)PہDElEEڹEƛEpL(=`DEREEEME`bp'ŮaDD)EE?EȿEV"E qXİ&Ÿ/PgDEESEEB*EH+A%gpKD׍Eh3EEEƩE2E~|*A#80D|,E"EERE9Eie"txDsEEJ1E=EQAEXE }CEElME EHE~ž# 3C~EEEEnEPEKo|1CAwE[E F4EXEY89Ï7ŎE(CpEvE FlEw@_E YȰ,B^hEEzFlEffEmTA,?Ÿvw´`E SEFEnECCGrŬ!.'&þ/YEGEFE/vEoC APQEFE7E2dEM}EC +9At!JEEREENjEC$J Ō _BEExE E>+EW DBZ"DWĒ;EQEEEE9+D~E#l&.3EE0EE&E HD T%ŀH=ę+EAEbtEEEF{dDi"ĸ&ŶSĺ#EOEJEQEE6=D,V'ň lĸE#E%E]>EE%DG y(™E!E E,EkElDķm)ŲI E8E EEEkDCı@*࢖'EME/EE zED0K!*~ĠvDuE E2EEkDb*Ě/DiEE4EKE8_DPڸ`+TDiMExEPE|EDi*OsDWENE\E^֯ESD ęT*zľD4}EEEòE\E[đ*KD E>EEEM E}ğ)\G'DNǜE@}EEFEE#m*)ĺۓDpE"EpE;EEEhs'D~E7EEE!EK]i& l)mDi$EG:E`fE)E/)E.Ej%ŦĶOD䜎EnEEBEEH0E)z.0Q$_KŖ3D_EޒENEEo8Eln\"!=DPEVPExEE?Eċ÷ űzn2CEEwE/EuGE% E4u ŠCEEEbUEOE%ñ4?CGxEEOEEVEKp)CNpExEF2E*^E c]yŷ@ogB>iEEFEleEA6aB/$bEESEpEImEjBO!qZE2EEdEtEXCš&|R!SE,YEE/E|EϥC" ^ŘipKEEEOEECl K1 b^CEgAE EiEtE DH."D ;E|EnEBE7E%Du ź#{K"4E|EcESEEBD\$:-EEFEfE:E_D5E&BQ9B%EEExUEE zD t'hĿEνEEEkEv0DiĴc(~&*EEhEZEVEgRDC* )ĢEޟE5EEGEΩDEV)řEƠE.EEE7D6*EEE|EEdȆċF)GĚDޙEEħrp!ŒHDBEEEEFFE<êTm 8 C6EEEEEÔMEnXŻCCyEDE|E{EKUExZT)6NŬ=C%rE EF E/]EŎBjEAjE(FSEodE|1UHv$cEENFEkE Bȕr[EEEVEssE-0JC`ŔgTE4EE:gE,{EiC8 ǹLEHEYE\Eu5E>Ch Vj:qJEEE/EEĄE(DNq!N~=E EEh+EED}o#ĕ5EEZEE!Eİ'ubīEg^EYIEßEޖEDno(=yESE)Ek!E}EfvDZ(FE2E6ETES؝ED J])fĂ>E57E7EE]E_D es*#7ċ[E$EVXEEEDH *2DiE^EKdE EPD0Db*KmD)BEEE?*E2%Df»*wDyEuE.TEED * |DΤE,EDEEEOE+t*ŏ0NDr8EERECEE ķ)tĞƧDʝES#EEEE!߈g)Ť`:Dl~E-HEE4ETEcz(l,DEǷE5ETEˤEcĚq'JxD1E`EESEy&EnN^&>+o[DϡEMEErEk.E6$ȝN=D%;EEWEEa5EĘn#ř[u DEH9EETE.X=Et@d!*:1ED|EE EE EEL" CZEEElGED^LEfL Cq{E7YEF< E SEeV,PC|sEME FE[E:X;hB4kEEdFE\cEDXt(S@dE)YE(FcE'jE_BŊ¹g]E_EJF(E/qEp#;CMCňXÜ~UEnEE,6EyE햑C#ŮŸMEEμEEEEC e5ҒFEEEnEEHD!p!>EOEEEbEDSwŴ#]Wĉ7EETEܸEpE=8DxΪ$Z1Đb/E9EEcE4E2TD6%ůI (EOEAEEErDU)&PTaĆn EE>E8EK+E3D((ū wYEE hE1EřEPD BE)g\ME`EEEE(EDļ)~ EWEeEvE+bE&DĶh*DE:_EEEED4Ză*_āDGEE%EE5D C*D1DEx]EqEE5Dϱl*ŌDEaEE[ E:)Dax>*HUDyZE9\E.@E1EaDHu*qgDIJDE/EEt?EҭEEĺ(8İ}DE?aE~EUEbElē'zfDDE}EJE@E#E 3U&cVdDwE EZNE;Eq+EZ> 1%ĤHDQEEEE|I3E'ă#Ŝ +DԉEEEE:Ej H"RNDGEE8EE`0BEÔ ? @CE$E@RE6wEIEi)@ 0fC|}EnEEE QEÂSBqCgvEEFEXE&!}NUC nEE1F%GEI`E\u²TZBAgEuE FE?5hE.!B,nuo_EEK"F>EoECZŃ773XEME FKE/wEޗ~C$+ܐPEEEE8w~EDCa ŋŌIE7E>EFE[E1Cű dAEn6E]+EE4EtdDSB" P:E=EEJ'E-ERN0D(&$ (A2EEEo EELDļ%R@6*EEREE+EfD&JXx#EbEETEEE[OD,Ā'ųoE1EEEZE39D>9(,‚EnݹE3El_E|E`DfĚ)dVt E^ĶE EEECDĐ3*E8E_E(EQEӢELhD7ăx*ńnvD60EE.E0ExD"D *{ĐD#EEHEŐED=+H8]DשEiEVEWEHDjR*Ũ{LD eE"EE&E@D֣;*LZĄ.D]E>WEEDEELĦ *ŞD2̟EVEyEEQ EP)ČD'E`EE E'E܂+(^~DrEEEUnE=Ehps(svDEEVEuEC"E2Zd'0?hD\EE=EEK=*E'CĴ%LXTKD)EUEEEE1E,@#,"/DZE+ExEB=E?EdՐEaD*2&źTĄ\$EvlEEEmEm~DGy'ŖkvE#E2ENE,EзDm(Ŝր hE; EGExE(EUD޼)C EPEE(EwٞEaD.*ŭ6E0!E.EEbEBD*[vD亰E 0EE EDğ*hDEEE&E$EtDh*ŏĹ@DRuEcE"bE1\EDҮ+ЅĖjDEBEPmEEADe7*_D<|EEEEEW(*k D+E<,E.E˵E E:)L~D7EEʺEe'EFE*")K{DREEoE{@ENEu'ȉfڅD-ŕEE~fE'EIK:&ylVDMEE|EFqEg//E(3Į$;ŗ9DʋE E}9EĊE6EĞ #|D EEOĝ ŖDpEE;jE`EEES.< ŵC"EAEEE1MEö(CY)zE~;EEVETEYîi5{DC8/rEEFԣE\E|D_ SŠBojEE,F|E_dEڀ~_dcE1EFEkE B ŞKMF\ElEpEVEfsEE?C9ŏhfc!ITE3EuEVEizEُC XÖLE]EEE) EC uŽϣEEDEoLELE'EDc!Ĺ=E.EE ERED,U#Ÿ_Ę5EnDECfEEE:;DBJ$4.E}:EEEEYDh%6QM'E\EExE EuDYRd*'ŰcME{EEFEE͈Dez(}yE_E~E.LEd7E"DtQJ)r-ćdEzEEE}ED6Gĸ)nE E EREE DY*E EjEEEuZDh*j2DЮEnE=E6E3D*ľDPEEQE0E.D'n*ŲUDOVE!cEQEwEDDϸ*eNDEEoEEqDYJ*=nDm@EvEArEEEtF *Ť^DSEBEEݷEOcEUI)KT_D⚚EcEXE EmEt{Į(Ğ~DE E&EH:E _E#eĉt'rĠxD2dE)EEGE8>&EUO&[\DXڏE"EE E-EF75$P>D:kE>E0oEEP65Ez#Ŋpų"DE)EEEXŠy7eEhEa(F[EAjEL,BL]EEFEgqE:C2ō+P>UESE}EfEf?yECŔhbjME.EEuETEBCCp ÂxFEAELEHE3ECXFŴ GF1?EEETEEFD"JĊ7EEUEEQ]E"7Dʟ$+0E/EEEuEh E~uSD3Oġ%ŃzHnj(EGEjUE2zEMuE\qDnc&2_G EEdE~EE D ,(ńXuĂEEEEE0 D#)崅CE۸ESE.E-E: Dđ)%@ E֜EERE=rEDL)MEEtEEףEpDH>*ūХĖHDtEREVEYED_R+O֙DEjTEEE7D!T+ŐDrEE"EEX\D.*ʼnĢhX'[I~Dr#E\3EEE$EP6&ŶUbD IEșEEmLE,E9.$ň-RDDE$}E*XEIE94E#t#dŐ4'DavE]eEEdFE;EW x"/G DE$EEE @EEp2EeOEEpeD'"9EEElEUzE<4Dg$))+y0EcEE-EaE(OD%6B)Eb}EEECEEE| E1F)>'ijDEEE"EEE(ŸRDETyEEEӼEtSE5mt'@܀DE8EEE#EW8&8dD:EEw,E7E2+E”@%J{HDE'E:EE2E`+)$^#.L,DEE3EEr&:ETĩ"ŵŁD0EE+BEEV~AE( $o ŀCSEE͊E;EcIEXd ŎC}EEhErEmQE!DΠŶvCBvEE%FoE8XEY-YDHC?oExE4 FQ.El!`E8%ńAgEE7EEWgEBXG„_EE6FeE^{oE C'NTw2jXE%EZE)GeD1&ȱW }#E:ؿEaEEŔE.DE'}nE٭E|EETER)DlY(؁EӹEEDEENDQ)R?T EE(.E>EsEDS/*-s{EXE6EEEfDsİ*<ĬrDEEE;7E$2D=XE^EWEEzm9E,D"ŀ'D؆E3E..EmEHAE<7!,C=WEENEDE^HERԖ [CJE E3nE;E#OEïUŞ.CwEڙEEEsWECd ~CŴqCfpEE (FE^EqŤOBFiE8EK$F<:EfE( A̱=,aEwE^EDEnE8]BrŊYEE FEuEVFfC\ ŃhRE$%EDE&E|ELqC Ő&JEEeETE|EC q= H~ûBEEz EEE D#@"<+ Đ;ESEE}EzE3(Dĸł#ť%4EQEKE`EE,FDԤ%%<ĄG,E jEh~EEZEmbDc"& RnO$EmEE>EXE\I~DĚ'%iJEM~Ej=EEEӍDQ5(ťynEqE*EBEEF([!@vDgEElEEEEqt CEEEEPMEu vC݀zEJkEE PEiTEdÅQ{ACnrE9EEEr\E[×eŞBZkEEcF4EcECVŀUdEGE(F9E kEOBu ś`m~\E EoF'ErE4FCNŻ/\Q{TEPEdE2EzEƗCZ آÁLEEvEYE%E6&C !}EEECEEFEDJH!ži%6>EHEpEOE?EUD320#ń6E^aE4EfE ݋Eo9DPS$n4~J/E&EE`E7E"bXDĨE&dK'EQ-ED9EEUE_tD̃{,'bދEE.EjEEDHp(iPxGE{EKE0,E/EDh )ūuEOEE6E~E0D)WÒEAE}EEZ٠EشD,F*ſ\#E;EUEE#EeE+Do*ŻaDJE\EdEƧEcDc*Ŗt(D,iE7EMED۪EqDB*l֌D2EEpVC!CWEEEחEwENCq1XևOEbYE?EE~ExoCU iHwGEEuEƜEVUEVC* P Sé9@E7ED EEED3?"ŭ8EvCE;E:EpE:f/Dŗ$Ŝ|.\1EEEOE EJD|b&qhE*)EfEDE[E ENjDċ&Y "EEEE EZED߃'ŧpėE EEE8טE!D$(ŭ|E淹EEEEm>DLĔ~)tԍx EɃE(0EEEaDPA')-EDEbE5EBE46D\*oW;D*5EAEHEsED\0*VDZEvEbE)E RDu'*eIĪXDvEmEE HEDƵ٥*ŀ8DEXE EIEDQzn*!XD0ТEzsE;E袳ELE$*UdD抟EyEEE E-)DCE}EE|)EqUE(ŵ6DEFEEEECmY0'ŎYD/E~E Eo)E#EUߋ&"?zhD~tEEEE*Eo=ci%ŋ'MDBEH8E^LEE 2E$'#Ŏ/DEQ6EEgE^:EČ" xBD lEۤE E2XEKOAE:= 1 FWCpEE+E%EHEpÏҬ ҲC}EZEuE0EPEÕyňwCvE EF5E3XEN5*}KC]oE.EMFEz_E¢-OYBgEu{EEtYE<;gE,A}>ŜZһ_E Ew F0EoE&CBXSŀ1zXEecEtFElvE %rC<nQEbE{EpE@}EjQC skIEKEEEEPC) ş XSAEgEEֲE3E^DZ"X.:En[EE>E엉Eφ,Dx-C$ŴZ(Ĝ2E٘E2EE1E^IDJ8%Ŕ>Ļ*EEcEEENeDu/& VE"E> EvE'-EʔE@D4Ĵ'oEEE0Ep7EDa(CN4*EEɜEt3E EiD@›)` EEEE~ED5^H)͖`EӳEOE?CEEyDF.5*&q"D⇰E3#E`EE|D_*őҕDxEEdE`E|D*DCEErEݬED*qDƦEUEПEEyDn *5ҿDiEƱEE EEI )4zͰD1EEV*E_E E;)/x(DƧEHEUEEEs(O*DEQE@E,dEEVq'rRD&dE`:EEpME"EZV&GkDE SE\nEE)EC%I^ę[NDEEE Evw1E],г#Y2D/EwEzE^E9EV! :>DbE&EHEEi@E0uq T CEE5EE+GEIlT XCEEEuE°OE0؏[fvCwwEE! FEWE>ójŬm*C RpEE:FLE}^E@ۜŜ>B!iE`EEEeE+A\j#g_²ZaEV~E-EgEmE;B%&ßYEWEE-E0uE\C_ևREQE8EE/|E)C_ -_ hJE$}EgEIEEMC<) x ŭBEE ECEE< DKV"Xq x,;E*EE%Ex]Eb&Daņ#-% 3EqEE)EZE،E[BD\2$Ÿ=nW,E E8EȉEgE^D>c&JTܯ$EE/EIE E"zDd(jALEXEEEjEZDnĆ(#Ev!E@EEE /D3)AN E=Eb/EkELEѪD*xEDEQE EʈDG*ŵ:UD:|E:hEvE4EVxD *ũ ND4E EEzEEb@ī)ŌnɳD4EyEE`E~I EɤW)ND[DDEEtEdEɞE5zę(Ş%kDęEQEE(E(E u(';)ND$EEsEZ E E_Ģ{&v rDEXE.}EBEb(E2eGė{%TD58E4EEZE/E.h$fv<9DoEEE}E07E?q"kDE{E*EWEl?E ã !ŋŰDEEE0 Ev>GEèN| ŖgCEցEEv!EzNEuÞ  ŶgCyEhEEEH6VEWQCBV6CM]rExEFAEi]EOd ;pЗBy%kE'-E<FE_dEQ@ŧ3HucE0E0FAE.lE|BXfXNdi4@[EEE"F\YE:tE\YCBy@dSEE%F^E){E|C dԭ&LEEEE1EC ŘDE`EEEلEDJID!!&EtEz)ŘFIDTEZEEӓElEIx<:(,\ӉDɖE)EjME7EzEfb 'gwD$EE=E\Eg'E!&L% (SZDE EEFE.EB4Ć$ss"#šw} D>{EAE?E;E< >E (HSD)τEY EhEEEEvá KCGEEEELE&f7 ٛC#${EnEhFPNEiTE][OC 1sEeEFEm\EWŔeB$kEE(9FENdEZĈŠJodE_~Ea,FEkESBKźš]EEEGErE=Cźv4_:UEE2EEPpzEœC? `(H ,NEEEEoŀE CX ԒŶ#FE\E˟E*E2E8DU}h^!X>E1EE0ERE D4#~6EVEޮE EENs3.E\EEE7EUDGNI%MUL.q'EcE*EIEȧE@rDD'2cбEE EԅE4DEIjD'( x8EE^EwE?EXٕDRb)PEAEE0EP*E>D> *fĶ$ EE܋EExEn_Dϛ2*ŜE)E*\ELEED@*x+ŶDPE[EEEbDnv* q8 DEcEtEXުE D5y* ܻ*cDbEwE E; E5Dij*%ĜoD!EuEDFE0aEgDLĈ*Ū8DdE4E ;E{ErEisNl*Ŵ@ęDӝE[E-\EUEzERu()arĬEDyEEVEvEETSĹ)SD8EEEνEEIRiV'ΗTwDE@EptEEg%E}SJ &ŠT\D2E.EmEYE,Ej;Ħ$Hk?DbٌEYE{EKE5E (W#~y%D^3E^E-ElEsElEƲEЎEnQD\%'EĐ)EGEXEƓE+EY/pD4Mľ'f\g!EEE|EEZ^D;(zquEe=EJE EAOEDD)FE,E E WEIʜE:D )ŗĬ6 EEEEEkD?:*PEEEEpEDQ*D엯EE;ExEVE֥E'd**9DĞEҤECE9EDEEThEEPE3Dŧ#\(1EE#ECEE֑NDh%?Ā)E\EE-EEkjDM&XĎ"EؿEEErED'Sp[9EE>EEߘEƑD-nI(EE*EE`EԟD^C$)Ū iK EE E!EhE.DjċD*&E&E2EOEHܢEE։D>>*IĦDEUE2EڱEDĤI+B~:D6rE>EJE,E@D[*ŪOD] EEVEE\Dq*:սDNԢE_EEHXEL%E-ĵl*ODnENErEeEW E ~3)wDěEf?EE蘹E zE^)J_D-EEcEtElEp4(ż/4āDԔE?EE蕿E="EcY<']keD$eE=EEEQ*EiB%'k_IDEEjEE2E"5,T#;Ξ-D/EENEhE 9EN"|D EE&EFEԵ@E fg ( CۂEuEdEETlHEվó%Ŭ CN}EEEYEPE% vŸCRvE$XE>FxEmXE:,|e Cf^oE$E[E=E`_EMŠqA hEټEEpE2gE`|A"ů=`E`ElEEnE܂B0&kYEPE#FEbvEvCirŘhREEuEE}ECy -bJEȐEEEE CB žG 6 EBEEREEqEDņ! Ľ:E`E8EvEE,Dduŷ;#ż&3E/E|Ez EhEHDj($ſ$>e+EkEuZEE+EodD?"&ŞTē;$ELE(EOE EƀDQ'SkĈE EnHEEEBD,\(rbEECEOE}E6+D;"$o)Ō E9E-QE E5EDD[F)ƕBEPE\lEE5͢EDĆ)(TĐDڰEnEEEjDf.,* @DEԏEgE_E$D숷*Ź[DkElQEE&EDw*0ġDƿEIEEED^*X@D4EE*EaE(EYN*ODEa^E!E;ҵE EBΏ`*ŨĶ#DzEjEɒE*:EEP j4)-DEE}lE18EE&t'ʐDqE!EEEv!E]&SkDEEhRE!1E(EXE~ &d:ODAeE2E9E$E`0EL-$ńŚ4DE!kEZgEE(x8E4"ť>uDECE!ExE>4@Ed!>DŲmC}EE?DEpEWGE` >C*E1EMEgQEOEt9<ŬC5xEhEEESVEE)Qn3IŤ CpEExF^SE]E5XnS`\BpiELEFEa!eEpMAz8ŕ5aEdtEN F0E mErBH>ˋYEE F=EzuE+\CK>REpEE>E}|EqC9 xqSKEE8E3EсEC' Ŷś`CE@EIEyE`ED`cJ!łe *EҷE}6EEEDX)5EtE+7E,E:EwDTďu*jāWDV?EfEFEKPE&!Dֳ*P:DحE=EEksEDH*ѣD+ǪEE_EEE?D{Ą*%ĴDEE=KEuETDN[*A+D;E=E4eE)E5El@{)roĄسDߠEoEEFŵE E.ć)$]HD!EEZEEE>(ĕDEEEEBE޵sĀF(Ŵ#\DE6EFE7Eu EA^-<'ůwtDYxEE EoE'E][Jq>&5E$SDiE|EEE+!ūJ C$E+QE6`EYE\FEx8f CEEFEEdME;>CYVyE?EHEPE7UE!Zwů :C>qEE$ FߡE7]E aS2pBkRjEfYEIFi*EdE@s_:|żTcEEEE1kEn6Bq0t[EϑEEWXE~tsEX6BCzŘ9rúTEEEEzE3Cp pImLE>EEEڀECп L; Ő}ÚDED(WWwDbEc EEzEMEd,&HvDxEV'EE|E&E)M?%mZ[D E7EtEbE(.E,4E$%?Ŗ>DzwE}EEPOE75E2#U#DE"EEcE=EB !H#D0EAE:EcEEE@ P CEEEELEY Ř֗CzEhE)EESE?#o:/iDC8sEGE=EىEe[EM FBAkEPEPFTE6cE WŘ@tdEEtFdEDWjE#BM ŴM0\E5E{EEqE:C)|ZFTEi^EEEʘyE8ɑCŦøBMEEEE٣EC׀ 'XŢx/FEEDETjE7E%C>C!N)>EVEEE)чEDlŬ,#Ţ46EMEEEyE46DRv %u3ē/EFbEE)EEhTDw&Jd (EVBEf8EEYDE7sDĄ'Ÿv`EE[]E2bEŘZ XئC|EEfFEƮREvsØFFdCPuECEc)FWE,ZE(ŋB.mE|E<1FEZbEdc9ŠŰsAkeE\EFEލiEYBQx,^E,EL FPEpE6#C!ZŢP,VE E EE"xE2C<{3~NE=EmEEEUCz} ЅŭÊGEXEaEE|{ETPC&rŽ[!Mx@E>$3HHDE~EH:E2E3E3~& ##Œ+DE^EExE:Ej ć!ŗŎ2D8]EZEZEE;BE=ð] ŷR :=C(iEEeEpmEZJEÀÕUŢv C.}ENE FEtcREjåR|ŨrCi1vE,@E4F?E~YE% š CXoEEE4E~aE9u€ppA6gEEEEڕhEB[l‡;`E^E{$FCDEoEC{Ż2bXEE)FbEUvE3fC yŁØPEEF`Elk~EC* ŨeHEE$YE0E1E=bCJ Ū @E$EE ESEpDLYl"Ģ9ESE.xEE#EP}.Da~$ſ+Ě1EEWEEXƍE IDr%OB(8*EE0EEqE.fDе5'ŁYĤ"E|wE߶EEʔEPD4F<%(ʼpCEmE+EؘEN0EfDt')ŪĀ*ExEE"EޛE DD)tR E^EE_{E’EP D I.*8E8]EEEzEݼDlgyN*ŝlaDAEEHE1ESDB*BD E'EPRE~EDNf`+ŮҷČD7E$E.E0ĬEMDPܬyd+ů`7DvEEE~ED懣,+"D1EmEE.EE*Ŋ]$vDF}E(EE|Eq E#)ŘޏDVEoEiEʹE@EńĽx(2[ģDEԁEEE*E/s'M'BZDTEEEѿE"EnWč&+iDHґEzEʄEE<*E/@i%ŮĬ-NDEYEEEh72ET)Ķ#ř^$2DtNEVEaEJE6:Eu7Ķ"=u(3DEEQ FE EEMuEVC}#ؓ?J!ENEETEED٢Ľ*(DEREEJ>ERSES:x|CE_DEE*E2EbD^*)|pDsErQE+ElE2p1E$Ķ Ű CQCeE`zEE(E>VEFCDfnRH(;ğEEp EmEEEv&TăD[E_EE_E6)oEfC{ Ÿ7",İ'EEEdEEDr*t* |DX“E]E EERMEP,AGҼ{XIEi|E_E8EjEϗDh**ĹD;+EܠEEE>o+E˃'ć4DAEZ$EEE@iEDC c q-EE݅E>BE+OE>DвĖ* DXEPE@EETRGEX*Z= *tOEvEE-EE('D ķ*Ŗ9DYӥEE^E E:`%E4h" ŗC#qE.qEFF EE$qD7L& pEҕEFEmEǮE Ekۅ(xĬKD^"EdEEE%DcE[BmE8,3EpE-EEE^DdĆ*z绦D[Ea}EE\E5RAEPLpEł°UE~E)EEʏED):.`DM{E EECEhOE|FϨ#ňeCwEJXE3FܴE2EDȉ%Q^EgEE]Er/ED1)If8bDBEEVEEAS]ER(Ay%%79EEEE"ޜEDeMĜ+ŠmgDE_E=EFERyE_C\$K E݇EZE=EgE7D5L)8yDݎE%E EE`PWE`XP*ùE?EEUE3E ED.[*ň >DמEiEEERE15E5ĽňjBaEE-EBOEVE™SDx(Řڏz)EnECE8ER2kĸ%ŴyX8D/bE EFEisĘCŪ*#řh92!#EEE E8E"Dl7*ŲĠD׵EλEEjE LQEB `&tm AEE&AEEdEPE/=D>*MDErE3EE1/Eu\ P%CgEEE֚Ej*Ep.'`EgEEVEg2Ex(ASDqE\TEEEaETB7ŧ6 ĕA5E~E{EVEE՞E D> P*WުD:E7EUEEf9?E4ňŀ`¢PWEE E$EݎE8yDG):LvDE=EѺEEELh$%ŐXC^XyEEeF]=E|EC\%$ŤXU<E˷EM"EP/EgE^D?) V؋jDoENEzEtEH[EdžH.ŴQ;EcE 1EdEEqrDU+DBޜErEEpE39E&Ű A{O]EE]EVEE?8bD%()ŭgD6E]E8EEE\^^% 5D0EEpFf\EjwECv$#gFĪMECEE EL{E3`D5)ń D}ʏEPE-+EeEUEgx'ZŶ 2RAEƧEEauERQE੦DX*5~DLEE-EVjE3E$EjſBXcE@EE4EyElwKDkj(kĔEiɮEmEE8ETE]p͍&((2VDNEɌEFnE#qE)C¸ ůh"14Bg%E購EEE!ӥEfDO *Ōx2DkE0)EEAEOE{*uŴTRGE EBE7EEDn*1߲^D%SE>AEE6Ea -EM. DC6?iEEEE;Ef4DxA'髃EzXEuEE E Ex'ųOĺ-D|rELEn Fv{E3kE.@bCN Ů!ł9!p+EEzEE*ERDDE|EEγE'E,7"Śu :C.oECEEYEVEtD&&u E(EuEEwE#E,ĒB(4O`WCDWE ExExECeȨ C!0w1EsE.EPErEʘD)*Ŕ D:E+E'EEDECE:N^xp^SSE?ECEdECED*2עDܨEEEMGE E?İ#weC uEEEEiEesDV>%LcĘE&bEb]EEED$YE )XZD4EEͶEtjE#C_E0aB@UŠ=b7E=EEEED*K:3DEE`E E͊=El8[h^bYEVEzaE\ER EpDepĬ)`DIEEv=EٸEERĬ$.ŐkC~zEE+EEfzEjC&'$pQKEPٸE5EEMED<Ĵ)&lpD3EdEcE0TEYRYE` e89ź Ø=EEVaElEpEFDĤ*RzDݺEESE9E=7EH/MvŜbBLS_EpEE'E1E,YDă(!DEE]E)[EEd~%0MDjEEFE8uE_C)#?!EJEqEvExEBD٢Ğ*ėD.EjEgE>ESSE VxCEKLE*E(E2EcD4*ČDzE_RE/EsEf1EAđyŪi C@beExEHE ElLEBD/č'(pEiEEeE޳EE@v&IĮD[E_EEE*oEIeC_ Ŋ."ʼn,ĵ 'E0EE~EE8Dw*ňiD E͌EnE EzaME6ATZy{1IEEoEhEbE×DĤh*ܠҧDF+EEE EZ+E_!ı!vE @cC9CkE:vEFLEhE-,Dwpx}'C E EEMuEDQEE3ċ'r5D@EEEEm$iE@EC Ş Ť'-EEE^@EPE>D|x*[ ĎE@E@EdE%RGEuĈ)OEEE*EDE4D *űDEdEaEEJEPE.E XSDmi(8Ϗv,E0EFE^KER[b,#?K\ìYKEvEMEbGEE&D|*l)D2FEtEJE]E1!)E(&1!c ֩zCmEzE FEIEP&D:ĝ&Ž|48 E-۲EJEKEKEER'ŰdEDE6EE{i(zѦSDEQEEGEGaEBŤ.P5EEELE͞EDϼV+G6
E EE7DK*Բ^|D)NE]>E/Ev E-EĬ Ű FCJRiExEEE8;E4Do'ԫĄEWEuEEE" Ec kr'/Pă,DpETE2FDhEEE⫽E&E,Ĭ9"ųn `C1oE0EEUE)OE0DČ&u EE}EEuEE{ԉ O(EICDTWE%EEqEWaeE Cũj08>u1EE%EJEE4rD, k*bĶ;DCRE|JEEMEEEE܃D< *客^ DE~EEGE, EŔ?~#fCuE|EEZEjEqsDV>%LcĘE&bEb]EEEDYD )ĚYD28EExEFdEQ_E|[B#Iô7EEEvE<ED4į*δĞDEE[E.Ej=Eé*$oŰCYEUE_ElEEHNpDQl)hD]EVE-Eb׸EERRĠ$>"C{ {EEAEErzElC(=$QĝE߸E5EE?JEGD)ŕĀpDE eEnbETEmRYE0e*9ŠÒ=EEbEOExEsDʯ*3ĪDXʝEEEdEa7E?K&Ŕ^BQq_EiEVE-E!*EYD )/A1>D)HzqIE|E&dE EcEDRąh*lDF+EEE E,[+Ela!Ĝ!>D P|cC_CkE|E FLEfEV,D%pĮ|'h EEn E`uE$PEE 'űr5D@E^ EsEE+iEEC" 7 ũX-E"E.E7ESFE\Dp*ĤD.EzE9EVEt`GE%6ʼnj*eOE:EEWE`EYD$3h) ӨIZDOE`E3EEj%EE4cx" Cp$qEwEFQ}E}ELhD#Gn&2pEEEmE>EE lđ(ŊğKD|(EEٕEE{9cEBro>(U..3E E GSD6i(Co:E>E.EE=EcSE !EwkĘ%lvhDqEE(F=EUsEz.CBy^3#k9?#E&EEEE DOĈL*2OYDRE#EEE>QEGa ä7Šũ4"DEE @EEڳEDEqxD 4*.DGEAEEEO/E,Đ Ũ &CTgEEEE"ErLE˲EK+ E|&Ŷ4&DREE FEpmE&6zC W!{&ī@)EcEIEE8EDnę*ۓDEBE^UEoE;KE#W\g;ō)QZZJNKExxE]E9EIxED-Ķ*ř0D>EEBEUEU?)Ed&v!1 XzCTmEEF(EXE%DTĥ&ż&}Į% EoE[(ŏvSD+)EIEE] E]}aENBŢDEoEEEH&E,Į9"ųn `C1oE.EEUENED&ݙu EE:uEREwEEW׉|N(ĠJCDVE4EHEenEQeE[ CŊj0<ġu1EE%E(JEExD C{*yDQE%EE [E:xCE3 [R0BSE5EEC EEQDH*WgDyEEEHE> E?2#G@iCZ'uEEEEEEEEdER_E[B"`17EmE_EE7E4D:ē*rħ7DEEH\EBEj=EÀ*b߀YETE`ElEEw_pDTSĐ)ŞZDFEEXLEǸEEaQě$-*CzE:ErFEzECL'$űQE߸E5E EBJEGD )ŀĖpDxEeEcEXQEBYEP_xd8h"=EEaEEEDթ*źĀDqʝEHEEE^e7E>$bBq_E5pEEuE&EYDĽ)>^ ELEY$EEE9Dq*ġ6*{sĭDEtEf)E2ETBSEX=xŪ٭CEjLEE'E*E&>D*peDzESEL,EkEb1EVQ2Hz CbeE ~E1E EJE'CD QS(Ő/E聯EE uERسEEGuX&0D8YEX_EEERE8lEEjD@)ņ@ĈkcDE~EtEEA]EmTAŲ5)mE9EEEEԜEU~DUĶ+ŒmːD$ENE+9E\E1;Ep"1ů8@SM[EFEvEHE$EjD~uĸ )D:vD*E~-EE3ӷE+ErY$;^ŀ8C}E;EF E/yE~qC{s$K?E EELE聩E5wD)ĉyDTߎE$EEEU,WEYVh>?EEbtE%E E7DĀ +s:DϞE\\E(EE 5E eߢBaaEE&E.LEX EPSDN y(8ď*=ETEDE=EySE#Eko%|rDqEEF^E5YsEJCӈ+#J99R@#EEEEߦEDNđ@*'YDLEE(EE,,QE\ /Ŋ|2ðAEEj@EEEAEXD-{*ĢDJE=EEE?/Eĝm j Ԁ$CgE:#EE E@EVD8EEEEq*9EoV,Ai]EEtNEEEaDBC/$)řD=E]EEE&E-r^Ī%ťDOEE_FUEvEeC#FdEKEEEsE6Dą)WǀD(ڏE%E*EEUEDzRyJjqAEEEE|E6GEDq +Ŋ[DޗEE"8n DcC>oEtEE:VEBLEsD&*uąEEOuEE|tEMEM(ŋľzCD]ENE.EnEQeEi CVjĨ1E)E<&EGEzEjDN{*"yDQE@&EE SEdCEn [ۓD SE,5EEEϐE.DĊ/*1DjE&E,E#5E@ E~>ĸ#ŤŬJC& uEEF|E3XE;% Dzũ%ub=E,YE{EEҬEWDFğ)ŚwĂYD 0EEEREa~_ERB+@tVx7EEEHES؝E(ZDU^*D0EAE:E+E=E`0Áh7Ÿ|DYEeENlEFE)E pDTĜ)DcD`EE|&ENԸECE*R^$ŚřCn{EEbEDEzE7Cͪ$QĖEE6EmEhGEDD)ĦqDB#E3eEbEQEBYE@ld8N=EEcEwEEpDWĘ*KDʝE-EEE\7EOÙo;bBq_E6pE֩EzEX'E YDĊ)ſ\D'EEdEQEEcw%Pa- D pEEwFEtEeUC{#Ҟ>Ġ EIErElErE9D .3*dt܃DEEE)EoSE5¬;žhCEjEEEHEDD:\*ņĿDEEEEE\?1ELŔa CeEYoEPE"E8ETBDd(-đ[EwE(E ŘpdCCkE|ETFEEeE,Dv'rԀe E(E<EuEVJEME_̃\'Ŷwt5DFE('EEEx&iEPDC ŏ ]Wĥ%-EhEXE7E{CEy68EQENEEEEsDHT*ȵ,DE';ErEܻE=L#ECh:bR#- C]sE*"E9FEuE$DU+%9k.EEE.E0EحEEbĺ(F6QDEqEEEEaE2-B&ņpQC5Ef%EE6EӞE<)D$+4*ŅwD+E8?EZNEEO/?EꝿržZ\ŽlWEEEdEҎExDc)ņ DExEEE~EE'La$RPCkyEEF3EI|ECCtgŝ$űXħ_EKEX"EE)EED|0 ) c,jDEqE)tEEy[EY9(Xmp;ELeEd:EEE'DQF+,6ıDߜEEEBE9E4ŞBAyW]EElEoEEbD}tD)qD4E|EEEE&_Ĵ%cŌD%2EEFFE/wEvCR>ůl# GDEiEEJE6ED&F])v*DQEEE2EaUE6<+RdAEEEߚE6EPIDXĠ +$ҺSDaE E:SERER2E:rOB5cEEElEfELDދ(ŗl E֮E(fEEEEWmpČ&ť65D:EiEFsiEvpE%C h""3%E1E.EEkåE9:DѨĶ*(rDE1EEWEiOE+à@srGEEGEExEٚDV*jİ}DTEAEzE Eq-ESN Ů ĹGCOiEEiEE/E4D{'inEt]EEE1E E.\'2ą,DwE dEuF/kEVAkE`C{c ņ6!w+E2EyEE1E.-D;* NӗD5EEDPEˊEfIE/~Ïk@GMEKEEE*EDĉ*sĚDEj|EEE&E$,l]" ]DC oEjEFGGE=ExdD#:&tĂEܳErEEfE+Ek(0ĄCDNEn:EE\E}eE C5.Jd1E?E$E8E"E>/DČ>*Ż$4$DpEd*EJEX3ECE \tž·cSEGEEESEʷDR, *<Ď!DEE=EhEE E@#ClC3uEE4EEFcEDFU%cęEoE]EEެE+DV(JKZDEEEaE4bEUB_E`CZB!Œ)7EEEENEDRh*|NNDEbEYE\ Ec=Ea*fdŨYEZ_EcE#dEkE_!pDr;)՛G{DMQEEDE6ŸE8EQi$CzEnEAFETzE}PC)A$P~EX׸E#TESEb8E,9Dv)Ŝ{pDETE=UEz?EoYE>sŠ2Ü=E.2EREքEEⰮDOm*X:ۺDEE-EE[?7EoPt0`]B<_E`EhEE.E!YDGye")_XyDEEEAEEb&n DaE~EFEtE]GCŚ#s?$J!EVEEEE=D*Ě,DuEEEa9E3SENT<şw'>CELEE*E#EK.D ğ*8M`D{EiSEt)E dE\1EN߈ŶŜ@CbeE~EEE9IEBDoĭL(ţĹĖE EPmEfγEEv&<qD^bEeELEEoEZCX s0"m,'EEEtwEzEDZ4*ĖDÓEAEZEEn`ME0SC0ūj{ФIE(EVE>EwqEoDEĥ;*^{DIEuErnEl"E9+E! [ ŘkbC"kETtEFEEEelEE_D\JF)T@lcDErElEbE]EA>T49EE1EEœE%׶D%!+ūmDE E*EIE<^;E U H[EEgEE`EsuiDDE(R]SDIEE> EmEZExYĘ$oņCO}EF2EsFRE0yEACŪ$q>L{EEEbEpEU3DIJ)ā!{D؎EE:EПEWE`Nž*ĺS?EIELE@EED0O*?fDSE=E0ETE5E_1`WBaEEEIEEp7SDx(ٰ4PEgíEHEo9EKEKEΒk%oDqEEFEPsE[CŮ,#J59U@#EEEEڦE|D onF*ţ zDEE@EnE%QEX h5/:NEEFEETE>En9D8*4ĸ DEfEE۩Eg//El oj I%CgEi#E2EE8EJEڲE E}&Œ("&DpEUEFELmEzxC ŏ!b&r})EZE#>E{E{'EuD¹*'ijTDE>EkEUE KEYPv;FVä=KE mEmsE&E:hEDyz*ŎĹD:E E4E6AE[)Eɑ'm!| ŴzyCpmE1EFEVgE;%D@Ľ~&_}v) EE@E/E}iEsEuĎ'Ő f=D{2EEECEzgE1$C żO ĀB/EEEυEED l*ٵ~D#dE'EE9Ek*EEZ ő> ÕmQE9EEE,E܇Dĸ3*-ERr5ETE}E.LEE̽DҼĈ+ŘBxDnE/E|lEEXEmkED]C~ Ŵ ϰ!VY+EPElE}E3HEdDFKQ)zDqEE^EPlEIEf|åÃ-?VcMEE3EuEE:DMFv*ň_D EnEEEn&E-1"b ifCBIoE&EE$VEJE4D&ńXuďEkEiuEEbqEE>M(CDcExEEkEAeE$ CXj 21ESE&EDE=rE_Dڮız*ŜhDQE-EWEDKEh\CEqøZŠISE>E EEАEr~DF)*Ӣ֙D EELEc6Eg E]!?ġ#ŒMCuEE" FsE$OEDrŦ%ŹbE_E{EEϬEk8D)vYD@6EE E2OEn_E%RBFƽ^7EE E0EНETDm*ŊDl0EEjME!E@=EBý\}ŘsrYENETEMEEoDhA)ܽD&AEEbEEŬEPľ$5@ضCRzEhEFE4zEMC$QĽ(EE6ELEvDEDbě)JOqD)E]eEcE!OE3YE@jcŅ8=æ=E-EfcEEEDŭP*4DʝESEEӻE_7E _I%$gBM_EmyE*EE5EYYD\ )Ļ]DEE ]ENEhE$dd%ŒM=. DoEՑEFEtET׸C#Ň>W !EOEE\E|EDLB&*rsĄDEE<E'E_SE`r`;ţ ôCEjEEE"AEDR5\*ņmDCEOEELzE~;1E'\n4 CeEuEE"E5EBDA5l(a[ExEE`EaEE)uc'lb DTEREFZEnER=C8 =P"))+'E>E$ELgEEDKq *Ş9"DDEWE8EEMEYFðo.B|ÈIE;ETFEԐEEBDu)tΰ"DtiEETmEE\+Eޅ!0!Ŗ2 ŴzeC:TkE2E4 FU=EcEVk,DQp'Ř E$EZEmEVHENE '\v5DME2*EEE#iEgCC a U2-E EE@8E@EMD *Ŭ5DEE9E$E8AGEidŹyŁ)TOEEEEEԋD:0)łND,EEQEԲEz%%E4J"T xCLaqEmE FEmEODYn&pMEEE6|EᬮESE16(yLDk)EzEKEEncEy BB\la+3EnEKEEEDĸ+6BDSE8EvEEmAE@,UE!EEEEhD5M))NZD°EREE?aE5 EHG$^#r2ţC:~wELEFE~ErC2%;^ՊEH EEE` E3DXk)u]dDIE$tE͊EBE\ExB &~9EEE@EќE^Dt`+ŨlĝD'EE6E*ZE=";E6H@0[EEd}EEtEDiD~ )L.īD,+Ex.EE÷EE^Yf$ūHCS}E?AEFeE5*yEJCŢl$KĽ?EEEDEExoD/Ě),1zDER)EE,EpWEyad鴼 K?EfElE#E"EDT +|rLDٞE\EEE?5EžB¨aE#EʵE=EERDc<(iď/EEZAE-EaEEDkĴ%!D#E4 E^FE/sEFC[yC#x9 }#EnEES+EǦEDDİW*DVEƵEpE$EQERñR0ńM`=EE=E- EE/ENDdY*Vx0DEEEEk/E B. q#CgEAEEhyEOE;D*OO'ꂇlEEEPP4A=¡WEEQE!EΎE;yxD*q)ŏ ĨDE=EEo}E)EsBL`$Ŝ6CwyEEF0E|EuCfJ$ňX1lEtE"E}&EEzDy )9NjD EHEpyEEy[EI01ŒÐ;EiEv5EE=EDp+D6ĥDEEEWE9E4pAc]E5ElEoEEmbDʍR>)`QĻD5EDtEEE E _ %7.DAE9EFDEC wECC<{l#6FWEqEEE^E(Dl)ħDEEEpE^UEn„LEź̭AE'EE E.E"DLw+\čTD̘EEESEIEI2EĐr*ŘBGcEE9EEE`LDl(\wĵEEEE8nEx:Etq&&|D^}EE< F HE,]qE۾CR 5!ƈ4O%EEWE2EED~w*żgDbEG;ExEEi{OE+Ŝ'ÁrGEEED*včDEj~EEE&EZb,ĜV"~~ HC+oE?EF\=E5E5%D?2&œgtEEEwEbEE)Bk(Ŋį6CDVTE:EEYEEneE(C-!Pħp1EgExE5EME#Dđ>*ųRDoEPEEdiE9ACE$e.0^¨SE/EEEE#ŻT9CuEжEF\E7HEDMų%ŢcćE.uE]EPEܬEϠDa(Ť~ZDLE EE^E2_EYB'Rn7EE*EEE-D^_֩*LnZhDoEE]EEb^=EX 9^{YEl_E_Eb\EEpDw)ŹI|DdVEEDEVŸEE)QĔ$+zCI{EtE` FEzE CG$ŞPEݸEMTEE5EDvͲ)ġpDE~EUEELBDYoĘ=(Wk EEEmE4ϳEE|Xv&ޚhsDhEhEEkEnEXތC E/",Z!'EE*EwEETD?[*SSD^ʓE`EE,EPME~DÓłjzÐIE]EKAyb A9EEeEEƾE-D v+{DzEE'E`HEN;E&KTš ŀvz[EEnEEEbiD_M(2GĿ\D JEd2E4EEYEvZĥ%#CY|EK!EFkExE$DyEEFX+EgE$CJ # D:/EnE7E EED3J*X wD|zEEJEJEFEEM=C\wQE{EELERE봈D6*4PLD(Eg[EEEl#Eϓ94#xժCsEBE!FȄE,D:uŃ]%kj}EJEOEJEEEҏ'vwTDoE|cE.E9EqaE~B}ŌŊ5E-EErEo͞E.Dnb*O6qD1E\IEEdE ?EZvn<.yWEeEbEEDҎE\{D[f)ūDEEEEErEBEnK$< 7.CV;yEEF Eك|EC %ŧYĂ+E÷E[EE"E~D{Y)4`jD!EEVE#E4[E(,c`(@;EaOEEEE܎D N+03DŜE~EE E8E4śAX$]EELEUQE?NjEN.aDĂ{)$єė`DEKTEEڶEE:`v%ŭŪC E\EF&!EvEC{4#PGĎ$ERE~EEkiEZDxĽ)ŻS;D؏E2uEJE~E=UEyaŬ]}AEEEsEVEND: X+g7ĨDyEEU3Ed+E2E[`BcEE?ExE݈E`KDv*(I0EEE-EJEEމrv&ŜCD"dEСEBE(E@qEC0C 3?"Ŷ5%EмEEEץE7D8ԩ)}3DǒEhEoE˸E6NEm3ÎoPOGEEPE[E&EDN}*7 D2ETjEE"E--ETx Š KCJiEEE3EDME5DPx'ŭ 7 E;EEE!EJ EƀE'̱.DEGEPF"EakE$VcC Ł 5 +ESEPEEBEDBt()>mDEE&tEE;IEz:q]Ų;ME9EE֫EEXDTTcT*hĪXDz%EpE EE'Eb+R"@ VJCiyoEIEF]ESE-DԨ&fsa.EEEEELEgĜ*(fDD${EZEEzEreE C$|Ų V1EE>EXEEDr*ADEOAEExE<{CEMnQ½TE4PE8E$:E(ED9 *DD$EpERE>EB Eo=~#ȵ2CDuEvEC)FE`]Eؘ DU%`E:vEfEEԬED't)ŖsĮYD&EۤEEAE+^E0GBfŲ(źlr7EE`E[EE=DfĴ*uJDwE}EVDȬEEC[EEcTEjd:B&Ź"` DJEdEFlEtE;C\#Ŕ>Ħ E#'EEtE`EDķ*ŎzlNDǐE&EEELSEJeNKCE iEEEp7EX/Do* =DpEEERxE?0E:`+>;CeE*UEMEE4vECCD]'7`EE-EEEEWu&ŻĔs D戃EEFE=oEߎCO y!\+tn'EE@EŖE E|DăG*0Ċ3DgEE|EW EME@.v$*zvIEgE>|EEEnŗDC)fĝ6DiEE~E2Ea+E(+!a i ŪgCkE&EFzsEoiER,DĤN'ńl& E3Ep EEVWEEsĴ'ŏ=7DfEAEFEK0iEJC c^-Ex8EEZIENE:D$ڲ*㒛DꯖE SE@KEJEGES1y2E&yOEEE.EВETD7~)TUjDu0EQEEE?%EeL4!Ų 38CxqEEFEl}ED[~&qo\EiE)EeE2EE-Yx(ŒINDP9EEEEu,cEBXr&ŷ/IJ^3EE2EEEDǺĎ+7*zD-EdEEtEY@EŜ ŒUE?E EhlECED3Ě)Tߠ5DrEEE\EgE`H#J>CwE,BE"F-E~ErCrIW%ū^EETEDE0EpDo؅)\obDEgEDEܞEh\EA/ŭî 9E&EEcEsE[8DUT+wsDtEEEj(E;Eh+MK \t[EENQEE،E1hDU)J˘ĝD])EEEEE,[D$ņŮ>Cy}E4EFEbxEa*C|X$LALEiEE;EGE DV{(*2:#zDEELE}EVETfŸ}SDѼZ>EEjERDETEEiEbQENUŶ*þEEpEVEE)]EDK*+P:DEEsE{E_/Et3:, * Š*CgECEFEIE&a.| w E0E8^EREEEM'Š<=DHETEEAE|mgErF#CS žB ^H/EEp EEàOzE]*WEEE`EjEN-xDρģ *]gDjzE;EEKEEM8$łC&yEEFE|EC$Y@EEEEO E=Dh?F)ŐĈiD(EmEHE E[ES3MŬ"};E@E EEқESDޗĂn+Ĉ3DEsE2E{Ev8EyÈŘ]A8]EѸEkEAEE bDH;ĸ)0X;Dp ErEEȶE~E?`&kC~EsE\F E wE%C p#~,HwE(pEEEEnDṡĂp)DDEeEEE"TEDNʼXHAEENEdEbEɦDIJ*Vݹ2]DǟEEjMEwE63EĽ $gBncEESEE)E1LDh9B(n[;EnE¤E( E:E.E pāc&ssD7EE] FtEtQqE~C` !2Ă%EEEDEEhDĞ) tTD;EJE)EEOE$*b;ńWe/GEEYE3E&ED2UĒ*ťMLDduE+\EE^EE-EcL  OCiE EF%EB:ETe6D#'őt" E{ENE EE[ ENf':9ľ-DEmEG F~vEkEaC0@ 8^ 0J ز+E)qEjEěEA`El`D)btLDϕEHE_eE4E IE||{̶= ,NE*E`EEE;DĔx*ڠQDEE?E`E&Ey*ą;"=V ųCaoEE!F0OECE Df+&urEEE(EgEՊEz(VĹ*CD>EE\EBEEEzdErMCL ŀŗFY1EcE E)EpJED:Pf*ŤN7D:EEEs#ECE3Ł8`SE$E0E7E?EDRDd*Z/:DØE2EE E E_@#Ň[ѹC tEEETE@)EtiDhh#&&cELE*\EEEyD*)Z)ŖķjưÏ?E:5EEFCE#EYDk*ł_DE[|EԴEEo5EeTņBbbERCEE~[E0ESD'9EE`EKE zE4EWkB|%ŰIqDWEu6E"FE8^sEVC+"y/8}#E E.ECE`ED5$*žw=tDۑEEEΞECQE$ HEE,aE#EEJEKDcv*Ř׳DHEEEE$/EįI Ŭ (CgEaE:EEDgEqEվaPVŨNŒ WE?E"E"EwEyD'*+DjEZE.yE"9E E^N$CyE$EE;En|ECv$$wZĪEE$E EE}Dz(Ō"dFiD~&EIE<3EE)ZE&ڽØ;EbEXEE E{D*bKDEE$EEk19E!zŌu4B4]ENEEEjECbD ķ(0Г[uD\E~EEEs>E&^ĸe%XD EE:(F]EAwECŷ;#˝E EBE[EEEOD끠l,):TDE6E:EErUEr";Š3AEEp7EV[EIETfåjBpMEEEkEyEXDs*ŸQ}YDE!cENEqEу&EL-"X ˎCP oENE5EE E?D%'|euĝE.dzEsEEC%`{EEFtEzE9YCGy$OTE EtE0EOE([DҌq)ŖArDEEأE{Er`E YE0,Fo_=EREzEdE@EmDĀ<*ķDEEE;E/k7El$uB0_E EEE,EvYDd7v(yāWDEE{EVEE֨b%vũa D EE!FhEtEmC*Y#ū<E!EnE[EʴEᝧE?D*yTgD EEREE3ESEi®ŵրCEE~EG%EoE&DPĔ) !b3DߠEeE1EEpJ1EħħňC,fEHE E^QE=EԿBD,ěB(GVġEEEEγEE޵sĠ&żU"DqEpE$FEnE#C2 ."k3)ĝG'EýE:E@EEXDIJ*Ŝ1ĂPDlE|EEE6LEV;IÕl}IE}E?EZEAEBD{*ŁWD2EEQEE*E%#+!‰ Űj`CPkED^EE3EM+E*D'şQĚ EEHE1dEkEVE1(x>ĩ5D,.EEHErEihE4ACvq Z! #Ĕ,EHE܋E& E EDk&+"˫D$vE4E EfEGEwß| -kOEE.E1E@E$D<)9Ĕ DEdE!EPE$E`6'^"  ŋCmqEJIEEE2E D-X&NCq{ZETqEwErEvEA4ExB(FLDEEEڙEbEB B /ć2EKEPJE֨E&EEpDŻĶd+Y<đ"D1EEڃEmXEJAEڶ  00aUEEEKEΏEB~D&a)9DđDELEtEOEEfIo#fŋ{CwEE.&FE|AELODA%\ğECE E|E~.ED{oć(~zdD5EGEEEpL]E A4x`N9EvEEEܜEDFė*r=!DEE#EGEeE~;E*XÐn=?\E:EEEE jD Rğ(ſDsqEHE,EE&1E,Y\$?.C}E\E(F E)`ESE E>E4DĆ*D*EhE4E.E(E^(8"Ņ ňwCWmE]EEқE7Eo $D9&Ŕ}5 EEJ%EE8EEW;'ņĨ5Dk̦E9EDEऻEv#Ey<#?*C<'sE EEEfEq DV%KlEE EE3ElEX'i1(iGRDNE`&EdEEaEևBJ %W5EdBEEdE{ٞE4DJ*DJEYEEEG2?E4,Ŭg=AWEEDE-EێEyD)ŵFDE#|EEԈEMEQK=$K CFyE.#E<*FBE0}EC7I1\$WE"E:E8EAE2D>ܜ(ČkDiHEE"EmE![E`GÑ;EEdQEE E0D ĵ*Ś14DEER EE 9EN0ȑŤB]EHE;EEEcDGġ )xWTDSEEE,EjE^%^ŌD|EE FNE(}wECŋ"FҔEhEEEɷE DHà#)ŪĎ,D>EڨE)EEvoUE:ŲXT{:BEEErEr&S9r)DR~E!EF8EpE>C" řz"خ4"H%E沼EbEbE!E]DR7+*ŲXľDvEEݡE+E.OE1R&ÊGEEEEBED`t>$+ŅKD;Ei"E |EӿEb,E|ķ7!I ЍGCiEE EPEFE|&4DؾD (tĂEAEwEEıE E Ā'Ŗ8Ī+DE[EbEE3EkEUYC Ũ z-"?+Et1EQE_EE~PD>dN*1aD珕EE)EnyEHEV`ŪŲD~MEEN~E"EeE$Dĕ*żDܤE`SEwEdE]&E,>"Š ʼnCnEE3FEE˜DČ;'stĒEEEEP.EE (!BD1E8E#E%EJeECK[ Ac|11EɧE0EE~E9D ɹQ*|ӢD}vE EMEXEBEÅ=SEgE.E@EEԃDjro)#+7;DاEE4ENE EΝ>ĘY# ֽCXuEEhFyEkhE* D^FŬ%ԠaĸVE&EYE8EwEZD&6(ĸn[D~hEE$EpE_Eh^B'lVL7EGE}EEE~D=*Ŷ#ćӯDXEEmE2E5j=EM&(^ZE|E{EܒEEppDx)nuDpEE{EϸEEYkPy$C:=CJ{EE%FEBzExC$$GNr8EEϊEE]BEDʚk)*YqDU6EEnEME~YEbc Ů$L=EpEjEÔEd7ED +*ĥwDN/E^ EHEiE6F7E!PyInB;`EE,EGEE@YD(͑D[EEEHEEaą%+[S DiEE0FTEtEC#;j!E'EEeEeEO;DzĜd*ŞSD]EOEiEzESEŮť(ȈCESEqEEE,dDā*ɸ`DǁE5EEJE0ExĀž>9 C:peEp^EEqEEADе@(ũij,E\gEjEcEEZGE-v0'p?SfD@ElEèoIEE2EVlEWEGzD#yN*œ4Į/aOEEEE2E DJ) wĤDENEtEEp$E7 "? TKCqEEc#FEEKDNyZ&LnĤE}ƴE,EEŮEERĘU(ŴĬ-NDXE|EEE;cE=4B2Yŏ%3EERlEmEED12],iܵDEE7FEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-25000.ark000066400000000000000000001415451376444676100257410ustar00rootroot00000000000000my_id BFM 0[EE;vEPs>DC--DXE0EEEcEfE0Ceŭ%j}ě$E*E8EEmE1>ExfHUDN+EcEF1ExEEcE0EL!`@XRE;EtEEEļD8(| D^7zElEF?E݆EHDCBh+/HӒDEEi>ElE0Eg_xE֟ DıP(Ţt':D^EcEdE4EGQE|4\Ő!ؓ?ĬE=ԳEzEEE)EV lś0}?EʩEEE2HE`qE+8`"&8ŊߔCHgE,EpEeE2E4DTć?*L-F^DEE.FEE'PD3CĽH*Źļ$D EEE|EJTdEpPyC\s%ŌyğEEĪE6EσEU˃kV&tC:iEEvE(EeEڱDĥY*Z_dDڇEtEFHEDŽEJJD$#B*>"MDEPEE>UEbE4(cC>+%0tCEBEEfEzEn:E{ efٗ.ENEuEQEsvE,EPh"Ŭ Ŵ_Bp%VEEyE ENKEDӠ_4).$Dڼ}EbEHFZEύEJ~Dծ*ćDhEfZEE:EMuEE:Cf(&DvEXEJEENE0΅µ 4DE~?EVEIEEf%E$EES\CE E;ED&E E@Dz&shCjE@dEEb/EEYiDrUz*axjDxEEFܴEEqCD5B/*ŤDDzE|E޴EEd`ELC ũ$pEEfENEE09Ed"h  %%À"0EEOEg E*ưEaiE"Ul" `(BoWEHE#EEEDQd) R"DiREEFwEEzDw *ZBDwE.EȍELE sECk'IďDؤE6E(E]/EJYLEAŅE L/ ExӵEEQEHE $Eĺź;"+EE}EUECEۧE]yDCĆ&\ŲܻCZSlEEe9EEEDlz<*u pDˠE'BE'FP.E(Eb=D")+Ь;D3EEEsEQE^Et5C6 B$Žj5 EnE?EEXE_7Eo}#Nh1E_EEEX EE4Y-V#` wB/YEz EPEP&EǞEDDl)؆)DlENE|EE)E(QD*/bD>E;E EErEC2/'jDErEEEJED— Ō+EGnEQEDE6E"EZ^Ŕ#FEAE?cEMEE.DΛ:&wCnEEeEE;ETDc?*ſĩvDF|EE !F÷E?E7Dl)dߪ3D ڜEEUEEQ]EC ~ #YeZ EEEEbE5E nÐ]3EE.ECCEȁEX E^K#' ŐB[EEoEyE%EDċ{)ŏ/Dh+E=EE ETE~DU*9gĨD"E}EEE=wpECL' ĵ:DVEEEE*HE?Ś5&ĕ EEE*kEqEx E9$6Ų&@ FHEEy~EUEWEDL2'CoE-E6EEzEDCg&*|D2IEHCEUF+MEaE*1Dn)ߨĐFDEE 3EEv[EvC ž#g_Ĉ` ESEEnsEE%84E^~ŪÕA5EKEYyEEtٮE ENc(*$ŕd vC1]EGSE|EEED[)p~6DEEEEKE8yD|Ĝ*&#ĝDE6EEkEBnECzʼn8'vŋүDfE}EeEEFE!1xVH U"E˷EQE#EE-EkE)ĭJVņDJIEEKE?E,ElEJEPD,O2'((ń CMsEEEE3֒EPٝD*>jD ŒElEEr[E kE-%D#!)ňBDw8ȄE)EAE+XEIBsS 4#AUĥEȰEhEwEȽE0E.1Ūg8EElES Ė(EgɺE֧E.E0E aE*>Ĉl! w0LPEE˛E@E"ErDfJ~(D"xEhEGEŗE(KEDXĤ*=ěTD3EEFXtEzE8D(ŸǜvID릡E>EE'ESSE@cAF! GnEUE`EdE@ʻE+E?ČQ&Ś"=EEkUEچE EEcg}a%2ŰEv)KŊĨ*EjE EEwREE5C\!ŀ]REEEEߡEGD΅(ŢS+DDyEVtEEE֎EАD^&&*zPDE&EFEq+yE Dwp{(ŔaDSEE8vECsEV|QEel!űAEaE EEE)E0ň#H:R?EHEE<#ELE-E<Ĩ%hŨ:C7gEE5EEBEObD)0E*Ĥb[DE$EH FAEE+SDFC *쫴ѺDE>EtE"EpdEC%ŚWz0WEEsXEۀEvE!=E6ߒúŭŁc,EE[EmE✲EE4HjD",^AETE,EE2EElDOvΫ(ƗĊD{EEE~E\ێEC~D +Ŵ6D)ݐEEEAWEkwEsD(tľc(KDEE5EDEOE^@ 8 !FSEEX×E;D:[Ĥ*|6bDE6QEFԡEӄELD *LDUEEEmE|.cEgC"T%tEHE˿E:EEXA;EBK3eÕ0.E\ErEEZE\EY#Nz"& ŏ27BIUEEEZEp9EΧ/'E6P/E;E(EExEEuS>"Ų BVWEEEEEbDē0)Ū*,!D~EEFCaEWEˆD**ĥDnEEWEoEAsECr'yWDQoEIaEExE\LEŝl 41ĦEŵEEXFEbE$Ep4ţHŭa@[DE\EXEE\!E!Baõ.HEEE=E6EwDXj>'\RC^&oEEWeEvE@wEDV>*Źw|DpE'EgFHCEȁEl_2D7ij)őԨĴD_EEVE^@E\EI CD 4#Rbl& EET;E,?EHET4ÈRŖ$4E€E,EF;E߮E} EPb{#Ÿ C\E9ENrEuE}E DA)ŜD3D~߁EunE6 F 3EkE{Dp7*-=DEEE,mEEoEbCWU'ŽMDۦE"8EEtEGEw ŲŦ!!EEdE%E" EE'Ă8ŲZIEFE EE(ӥER_D(E'HECpEE=qEqEϓE͡Dđ*ŬD ۋEEFEf߀EfI,D\^ĩ)Rަ^|D;Ei!E(EEPZEүB ŏ}#ő\ľEEtsE,EEN3E4#K6E*EyERE/E" ElgĬO$ŵ ( $C X^EEREM EzED,ϫ0):DEEtFE߉EB;uDĺ* ܿcqDjEiEtEvEmEBC~p!'ŬċDE E0|EEZEE!, ]#EZPEEEVHElE,ĕ ůOKEEcE3E4E D'vśkCprE EEEcEɄD2*>DE%EFKEE^&DA )hϤaD7EEEE9XEQBFU y"XREEEEĽEe1EȇŖņø8EEEc[ERE_* E:lđ$` Š;C'`ETEEMEQΛE2D8)NADN[EEECE"ECnDs*}ĶsD4FEEsEYkE] lEC&kAD^EN Ek"E`EDE:Bރa1G%EEKEEETbE3n> +ULEdEEEx[EQ[E9D^^;'CztELmE.ElEME_ܚD|*+ŻĜDL}EEEuE>~E D(䤢`DHErE`EcEJWE|Be "QEUNEE|E'Ex/E:ň 9EaEEEEqEqj%ŖeŖRCaEEEoExEԬDa)ŗjGD1E5EEE=eEfDzĿ*ŀohD34E EhE=E#jEȧCI{Ɗ&}X1EE(ED2-*ɊDl/E+EEmEj|EeDPČ(^pĬDzEREEEUEBÇ B"LļEE&EɉEtE¦-EêŦP֝è;E#Ev`EEE Eu^%3&nCDDcEqEEE&EȽDľ$*}oNDEXEF\EծE\,aD*Վ\DrE0EG'EEEPEE,E1Yʼnjf=EÛE4E2ME^Ey>E4|Ĝ\%. J?CdEkEEڗElEr@D`:*ţTDۅEhE$FQ}E2E:ZD3ĝ*ӾDEEEEfEnC@b%̀'EwZE9EREcEl)?E R(U*E:BE^EkEHEzEB3!!QETwEE E JED (h  DyEWEE EяED'ē*DEf7EpE SE҂yE> Dp!ܔ(ޛĤD9EEEuE1REn!B Cģ?EqEEE]EN,*Eō6*?E=AEE"E|EHEBoV%yŨ\CDgfEEOE5EE靶D ٶuo*ulYDuEYE*FEE`SDAT*VDFrEEEjEdEC0>O%ŋ|6E*ExEmEEœ=E5Of~vfŧ  +E^EEEE3kE`G[!ňASEEEޛEnEDĂ(: {DzEE\EE ڎEDĠ*tfD}EĕEEE wEDN(JØcD9EEEYEE'yPE8&ŵ(!!=zE E[EE#E^(ED~ :utt@E_EEEEEEĘ%طCN-hE0{EEEEQܲD闸Ā*ũķ0`DEE(FEEND AB*ōz8DE EE E8cEitCaLG%vĢE@߫EE]EE"iE1BD4)ꈮD줛E@EXErE0`E~N>Cx& n$ŻalYEETEENEEw8EZÂvŔşN1EѽEJEtE.ExjEVt;#ŠA Ŋ6BPXEpEEE ERFDӤ6 )`&DEeEE@>E갌E\6D!6*n'BD|EEHEXErECd 'Ŕ)ĚDDEEEbE'KEb"Ś Ś-: EEEE\E#EV4EEE,EDw6E,g%ڰð2EYEFCE hEկEE[ė#ŭ aMBNPZEGE&E=E(EG.Dpv)Ō*,DԤEE&FaEXEinDh}+ŇİD˓E >EӤEvEqE5Cd]' DEEEsE&IES`(ӇEEB/EdEbEX "E\!^5SdaGE[E”EHEED|\'GMUXC)oEEEEɴE0zD]j*0TG{DΘE8EnFEԁE/5Dє)ŰkyD?LE EPEEt]ECx ʼn#?$b]I EEE;E꓿E4Ew0$UV4E*EVEE*Em6 EXbI#a Pk C[Ez?Ec8E"E؁EUDj)tU2DEZDEFE<E^{D$.C*ġΤD,EE@sE4EGoE&TCIů'xċDoEXEDEE1HEZKM `" !E>E:uELE*ET E&{fgCIE$EENExAED}'DpCUpE6GEqEEE D%C{*6yDԅE!EEE#El-D)Ŗ5ZD7EE^rEEZEBd ť#]AEE[wEEE!3Eu%Bŋ1Ì.6EֿEE)EFE E0f${i r"Cf]EElETLE0ٜED#);8DEEH FELEvDkİ*ŗ8ĈDLEBbE=EzEmEC&Ŏ/VD)YEAE0EBExFELb+C^ľ"EWE4EX;ExEBBE+ĕŒ$KEWE EESEtD'ł*CrEEvE>EHEyD*ŒnyD=JE EF`cE]E'D֛)ŐlYDE,JE0E1"EBYEBN@ #ŀJYģ E3EEE4EL1ExÂĔ|×7EEEEE E_kI$3 ż_8Cq_EPEEEE0Da*eĄ>DXEqE5b zsVNEcE5E8EEND0'ŐgCJuE EzEEEP!DRo+1DEtE8FCLEEj}EzDG(s8D[EJEEHElUE8QDB A"cfOeE±E0E>EE T.E n.zŰÐ;EEE"EEHE EtX%.jbC%cE^EEEdE\D#бć)*pKD҄EăEFOkEEcD|i`*jJDtEE*BExEiEC,Œ`&3 EEEE4;EQAEgkI Ÿ[&(E*:EE2EfE\E/;/!rŪD”OEE,EҳE^ EبDľ( MDAwEtE`EjEjE :DXĒ+I@k$D%EAEFEbG{EDD ĥ(ZĹnDE®EoE>XERTEmTA,"ŭvIĨE zEzmEwbEE,ELPӒ6ćqRD͛E<E[EE"Ekm\D %X*ԷaD_EEr8E9EPgE?C^!&ŵěEhTEEErE>J?ET~2"*EɺE EEzEE@ļ!r@RQEeEbtE$BE~;EtDԤ(ӑL` DxE`EF+EEYD,J +3ľRDEcEENrEtyEDE y(n&sDEEOEEREk[J!ŊCEGEED-E]E*E!bt)f]e>E0EEEl۪EE ~ %RyMCDfEۋE ETEEDxD*SQ0YDJEږEF8E1ERVDĐ}*m5D3BEUE ECE]eE0Ch%r} xEiE6{EmBE_E=Ě'ķ+EEEEòE=JEF!ŀ 'ZASEEEEE;D^ÜT(:D5zEhE? FƧEKE1DV* 9ĺۓDPEyEپE"ELxE D^Bf(ЙDE9_EAE~E2/QE`c}Ų!>ĝEEEE5E/)E: u+ŬŶ|E@E>EE$E2#EGDE_;Ă&֖CgESUEeEEXE&D"Ҹ*Űx_DPEEF|EoExNDV*-aO޻D>EӮE5EXE8cE&wCdſA%qxtpEEEJ+EEWEEi'Ez'El{ĢŌ'źc|:BE1E7EbE+E`XD?(?U&NOC~]iEBE EEJED}*S IeDE7lE'&FEEnHD~84*,DDۚE:EEZEsbEJ@`C$<;t%EhE*EEE:Eueq0y.EA%E"_E=QEkEߟEʧPO"ņe `cBVEE EEc:E#Dal4)ņ\(Dc}EIEEzE(EDR*vlDՑEqEfEEtEzCĔ(řBD}@EE~KE+E~ME- X4E]AEWEE~EB%E ʼnh1N$CEE:E9EsE:D)Y&ŎjnCkEE,E}EEPDo*j^kDE`Ex(KC&9 $rnBE1EZ_EEE9E줮@4Ŏ?-0E,˽EOEZEEErU7#F ŀBMNXEE:EreE.wEDcě1),#DEKE(EVEMڌEɠDX|*11DE?EE,ExmsECC'ȒАD] E &EU%EAEE5jE'E,#ED@ )rĉ=DE9EmFEEE¿pDe*aĬTDE.E+hEErlEz¼Ch\&i[HD2EEP;EE+EEl87 w]W$E0ϸE*EEõExE 0% qŴKEjEEE4EjEQDį'XClsE,E ExEEXDQ*/DEEE@;EYE"D0):£e#DYEnE7EEXEBT 2#OU\MEưEEETE0EöŌ:ÈD9EEE_EqE@En$f" NCF`EEƯEqE^iEDF 8*Œz"CD<ăEE(FEE6jDĶ*č8DE'E E|EokECCЇ&ż_UDE1EEi!ECEV6EŖŷӏ%EЕE5EeEK$EqE4 x‰MEREPEE-ESD) (žJCx)uEEVEhE(őEQDʨ**)eDoEvE EXE}}E=D?;)h D,EENE EE.VE\Blc u"ŔP{E7tEfNEG^E.E.EHwŬ>:E8EE`ESOEEt$oNbCJCbEHdEbE 5E.ÚE}DYװė4*z2ĈID ĄE}E&F,dE;EdD`U*>JDQEEEEiE C?W&3D1@EEE|)E3BEfW:Ŧ ;'EA4EؐELExEuE,F:(7!jt<˜OE|EmEvEkEtD2(,DPvEwE3EE!EhD2F*nfDiE9EE E|E DD!)e+ĈDEn:EE>EJTEdB|i"JEEšEZET)E,E!>Lä,o![ŘLMQEEETEQxElD :_(g D&xEbEEdE;E,DĴ+ŎjlDWEfEf FNEܗzEcDfĆ(ņkYDVEERtEESE`Y A6!FNEYE-EEȟE_+EuŚŠ>EEAEpEEGE|}%>CFfEjQE$EvSEV-ED*PİIWD#EE&AEFE-E\tYDRo*kgD>˜EgE8EngE'fEʋCr%^|EE';EEE>E?ô&ŔĞ*EƄE=EʁEJEޅE%E!yŀRڿREEkEEۡEDĺ([VD[yEEdEJEEDV,+ŗYをD;E*E EExE D.4m(9pčDf`EXEZNE\EJQEV6z2U!@ĩEE,EE ȺE)E ̺m Ŭ]}Օ?EEШEEEEEW|&R=ChgEE:EElED ]*^ā0]DdEEEEEQD l/*ő3'DƙEIEpEEpzdE0yCB%MyVEƨEpEjE#}ENl6&8ŠVCjEJEt)E/EĖED5;*)Z(jDE^E_F>EcEƖCDVT*JD}EHEE.E.`EDMCiy$pĎzE߬ENEE3Et8Ev?:J+0EWEEEEE-T#ő 4kB eWEEEPE䍟E'D fĽq)0KI!DE EFfAEmAEwDđ*łĘD>EaEKYEEsEnxC)&l'yDAդEL@EEX3ELEPK=Ũg /dE@EE5E En$EGrDŔ=ñDEnEbjE)EbEpDİ&LClCpPlEE:EEEzDŏ*ńF pDvsE4XEF;EBE#=D_V` *ŗD,;E_EsE9BEUB_EY6C @<$Ok6 EsE|EEE<7Eۗk81EEEYE E 'EEGY#xA PBYE1Ed/E4KE՞EpD3Β)h(DgvEI\EF E#E6D_*DE>E"E=EqE}PC4Ű'ytDcEkEEE KE[ >(*RE>EIEEGEY"Eڃ>$)YFE.2EwEbzEXEp9D&ŒŀC$nEE&EdEBEcDTA8y*ĥ&vDuExE`FEWE-7DGyĔ*Ń.ĥDEb=ENVE2E%<%QŐpý6E;E E E2Eߋ E h1$Ǯ r&Cy^EElE#EqEČD‰)#;D¹EGE9EE։EsD@q*1eƩDžELEEE2mECA'ůODE\E4]E EDEE,ï*Č $EWEE/ EEE1-[" żMKE)E1EhEREDx0'=ŋrC|rEuEEPE ED ĸ*ĢYDUˌEUEJERE7E0>%D FE(ؤUDg0EE\EEXEzB) #ū&W7EѰE}EEٽEs0E>KuŢł@8E8EjEbEZ!+uPEWEE.LEԢEnDij(ŵDxE]E_EEcLE4הD@*ž?^DEyEKEEzE2D)B(DxEE=EEESE?^Aۦ!dF~EҲE9EEE~+EyLĺfCȖ=EE `EPbE0EE}%X,nԄCWeEByE#EElEDƠb<*haUDBEEt,FYEvEYDv*`nDE`EEEeE=C҇Ż&ŢPt EUE3EE6EF>EbMp4]*EnEREEJEmEC9!4ŀ8gRE8uEEEQEzDq~("3 DƛyELExE+EHEQDj>N*,BDXڏE/E>E+ EUyE D6 (洚LVDTEExE^gE QE )g*ŭ! B(E.SEEjE&E)EF F?ETnEEi/E;EˈEL)%Ś8wC.fEzEEVEE׵DBA̓*J8CZDEEFEE.SDn)垴[DދENE]EZEdECT'vK%l{1qELzEaKEEED2=EZ&l`řWR,EEE=EਲE E9G +""hA[TEE\EEE;vDؖQ(FDzEE}EEEqD6~+FDEUEEE\EFnEEl(E"UtNŧt@EODEpEEuEREB-&k4ʝC%hEuEGEuEEVD'Ŀ*Ŧ !SaDEE_FETE=MDw)>\۽D7E)EEE&cE% kCňD%ńXu0E*EREQZEsEH;EçY,P-EʪEΑEEE{zE.M˗"ņe &B6UEE|ETCE=rE;DZP(Š"ĖD|ETzEE-EE1D<*űPupDEE EsE uECU O(]֙DEzEZ1EHE*NEG T7EEzEa}EE &ES^SHBE,EE:ZEEk8Dͣ& P\C0jE?EiEE-EXDK|*v3fD*E(EE*E2EN%FDk)ðDl0ElE!EEކaE7MC6Ş%Cq'EEE1EaEl[9E`ŋ(Ô0E EE EEEPĦ#( ňGB\WEFEEEaE5qDۡ}(:u!Dp~EREmFEaED+lD qE]eEEiE.tECQ'5DdE~]EREԤELEr16E 0j2wE;EEJEE$%EPI2|/?@ÛNDEvE6-E^EDE%DK& C1lEtExEE3/E|3D՞Z*ŮODoD7&EAJEF̙Ec>EvADt.)H,DЛEE˿E-E<`E:CfZ $kĔ ẸE1|EXEE28EzH`;*_1E EEEE5EXn"B LBRYE5E5EEE-Dm)<'D 4EXME F"EꌌEDkk+!BN5Dd,EEEErE-yC$'T\DEmE'EEeKELŚ# ))+PEGEEE EC#E54uŀ)EEEE[EE\#D׊'CvmEJMETLEIEEDlĆ)*ķsDEuEFEE%:D)PFOD~EyEEE2C^E!"C j]r# \CB]}ZEzE`'EE-EMDPě)gCĭ,DEEFyE͋ED0ij*oD"EEQdE:wE~pE&CCY%'˩D,EpEնEcFEЌIE)̥Z'EE%EE2ENd!E! _#2 HExEE^|DaEHEFJJEׁEg3DĘ)燨Ā D~E8E(qEPE\E CO #)bn EpEEEEE,4EIzÖŲ?ŐUü4E xE+E|2EE E$$c$^#Ő% J CN\E6CE5E3EE.Dޝ.){173DEbE#F;E*E~{D1+ş8}DvtEHE͊E3EXnE$CtO<'m?,DRE FEEtD.9BR*DƨD^qE|E2EXEmEs"CŔ&:Ɗĺ DĢEjEEEFE-ÔTŃ }#EPEENE [EE + ŤŘoKENEEbEEnvD_Ě'кCrEjEQEE END[ķ+ŗуDPlE0EFeEEREm&DN0)łNrD+EEEx$EX,YEԊBy Ƞ"ŕY-EEREEE\1EËzf7ELE`EE|Ek E2-lĘ$O :C_EPEREzEED͌)e?DcE(E> FdLE!ErIoDWi*ŖDmEEUEVE lEDSCŖ&t.DUEEQEJErDE}B ]ŊŹą$EEvME\EExgE32ijm ŕLE)EErVEilED8r1'C&tEEeE`E[E3DI*ſDD uE?[EFE[~E DvQ)䵢LDEEEz}EWE;uB "ŊR~EE6EE E/E.S:[X9EoEbE;E جE-EDq"%,Ŵ(OC9taEEE8EJGED⤰Ĺ)V3=BNEX4E EE`E~Dk(+)ĨGDuE*EEEJEN(D5+Ɖc8D4EqEED^E|EDx_(Tā^DfE_EPE EUE/B p"=MTEE6'EEE.EJ|sŶ˝Ð;EE|7EE.EEt<_%sUjC[cEnEEE6E0ͽDV[Į+*śSNDRلE E F5EEmbDŸ*šİDA˗EEOEsDE(hEC5ũ)&Ŝ΂ĬCE-éEEE8ER@E1p   v(EqE@E/E;E,E= vg7PEEhEAEEsD,0(dDwE&TERE[E±EkDLw>)+QDDEtEFEVzEDf/(ݝ'DE\EKEE(TEAŭA"ŗPFğE՟EE=EʻE̚,E^Vt>hdE'FEi3EUD1cijk*ŋ+ĠlDqENEEJEEneEC;X%/}8E,EE)EEj=ErŎ*z+EE5EE[˲EE`GĎ!ʼn@`ASEBE̚ECELEGD|;"(ŒaĭDQ%{EVEF5EԎE/Dĉ&+ nDcEvCA%Kw/E㯫EEGEEREyEd"F_ExE@HD)hc)DdEEfEYEbE^9VCQ$nqĄLEEE"E\Ef:Ehs>b.Ej?E8E E[E3EP" 4 qB WEE*"EEE8tD'ԡ))vhsD ~ETE1EE^EDķ*l0DoE*sEEsEQE\EFE]EJbD~J&ŔOCZkExElIEE EZD9e*Ŝ0LlDX7EE7%F#E:nEBD>|*ĩD?wEVE2EE`E4FC8_ $t[lĘEKE2cEEE8E+°ïzpź]g0EnEDEqE EEVjP#- Ű~BXEEEsEMEMUDR(P$D`EqE߲ER{EÌEnVDJ,ʎ*ŋ]f-DEEvEErECPE(ŠĖDNE PEE.EJEѯYH -Q/EE)E!E`ZE\#E:Mńc/ÙrEEE.EEDEDbĤ&Dņ־C1-mEVEEgHE͕ExkDĬ*_mrDEtEJF8EE;D%)ȜD]E>EsEEx^E*'C g$e]hĸ E4EovE EE6E@*ŢSŮ2EeE-EdErEEYZ3#f ŨBkZE$YEwGE{EE3EsD6Čx)5p,D8EmE FxEEZDnY*{D(EkAE ENE>qEOsCod'Ũ D˥EEÆEJEIEaH)*T|EܶE8BEEE!E"5 PFE vESEEXEզEhD{ds'̫NCnE{VEE E[ƔE6ѥDd"+ſU2yDMEEEiE2Ea5DD)|ħD@E*|EaEE\E" C Uc$Ŧc^ EƮEErKE-^ED4Ef Æ4EEWEE6E E6bĜ#( >B[EEpEEED)ŪG1D;pE4+EE2Ee EzDgĂ/+h,Ī)DxE_EPEE#oECCH2b'ţD)E9ETEE'GE# òZРD`#Ĝ E&BEvE?vEEt Eb'śtÏ;HEEE,E&E DOb'ʼnc-)C1JpE!EvpEHETED:* &~D3iEؕE.Ef/EEq,Dhpz)Ş"DERE!HE޸EZEbB M"$o`y Er̯EfE=EE*}3E&ͿCd6EǿEJEE‹E Emd~#Ŵ. K#C|]E6EuE6EEDН;z)G9DpEE 0FLEE2wD*u/DlESE }EEs&nE CŊz&/DPVEErEZEFE$<B? #E~vEE wEҒE'E&*Āc6sKEEE EEfDė'RC؄rE5EE|[E&8ELD8+Ľ*şěqDH0EGEFEqEVG*DۑXS)4ĠtDLEtEiEEZEBH "WjE[jEEE"wE_2ENà_Ń(è7EaE_EEE0 Egk#ť k<8C_EEoENEViEEEEx_Dgzĵ*Š@GD!EdE6E(E~E D%)ŧodDErEECuEBrWE-B $)#rUaEEjE+EnE/E4JdŠgC 9EE@E=ESE=E`q%ŝ! <MCm`EExEj@EPOE-DFĊz*֯BDE\E F EE&hDc7* ϼޭDE!ELEHEfxjEzCb&.kDپEEE EBEZy`:ĭ&E{E3EȏE*E"En5 ōʌ.NEtEx>EEEnD4(yA0CFtEE?E!EjED ]+StJDE"EuF>EX}EoDDM)'ţD.AE EEEVE4B!3?"bQmEEAE>gŔ (E_E4ESCEנEE9 [ńq"PE`EpEEBEDh8'8rD|?wEEEEE0D(*ŊnDEbWEFE{E&Dj(.ĪXDEEEE^TElBN !ŢHHEMPEUE>~E6 E%-EHiÊCmB%S3"EREE~E E?Ey&uĢM*EjźE EE5EFEEo=y!TŰ$QE8EExEZ5ED(rĸ DQWxE :E^F!EPE.De<+qDstEۤE6E>E.yEDRĞ(pD^EELEE4mRE0?!Ł!ŶEuKE-EE EBE*Eĕy\9>E: E`EeEŪEE~p&CfE)EEE#EИEgD6^ķ*IJWD*ETgEEGEEVDdoğ*ŖKDPEBEEa$EeEC &Ţ}pEcE6ECEE=EʒÁ<\Ě+E}rEEYsE@EEfGč!Š?REEY7E8EElDQĂ(ŀqD^zEJ?EEֲEBEAWDvd+Ī3D=E0 E7EXEwER D("~āD%EJEaEEhPEƘp!Ŕ>EEE*EhED})E txFʼn}3j?E:EEOpE#EQE¤a&-C(gE7)EEREp7E"߳DY*X~\DI/ErEEEdEZMDrĴI*W´@DEQEEEdEcyCA'D'%Bw`EQͫEl-EIE>E EV?EEJR! Ŝ BTE2EQEEE|Dыħ(3ĉD\|EfEuFIE@ǎEDjR*ŬċD9EjE:EPEvEUD9''8Ļ$DiEEfEEOEg.C zD98EʴE{JEE2=E'E qŔybDYBEiRE-E՝E>EzDsF6&ĦCiEEZEEPEbD ĩS*0fDLE0E0F>EلEaKD! X*ŰLžDE SEEOEbEcCYB1t$sĴEEDEEBE:Eס]uB/E9ErtEcEuEE P!i ňUhBVE?E EuNE\ED\(I^DW~E^E)FEEDZ*wčpD đE pEEEhtE0DV (ń̉DEDEwwE ElzNEDJrzřt źw1'QE$EE+E \E@%E?VŜsUlCEEhEEEUDPī&$&CPjEREEREwEllD$LG*gĦCjD⹈EEF-EŃEAD.k*yiĨDqEN\EEE+`E GC%W $ņ8pEѬEKEEE+8E*ð?ŭ/E"EuEExE-EXVĖK#j @B=WEEELEjED6i)n0!Dw9EMETEFE،EcDF*Ŧ+ĆDhEEQE=E!EsE2_CK'őГ^DEEzEEKEFV œ0ALEEnEEE=x#E%2 [`ű:d3EE)řDDE,EEE?]E3"Cd #Ųc+= E&EEETE246E4'#3E3E(lES>ETE(E^Ħ#| LB[EEŠEE|%EkDHu)ź ĝ 0DfxEȁEE2E }Ed Dr_P*lN4PDE{E4EAEfpE C nX'͵DCE EE7E\HEb8e>P*$Jj!EEEEXEk!E!iMdi|HEXE2E_E4EnDn'meCoECEEmE2E2UDtt8+Ē|D9E1EE E1E0D7gĚ)&w DEfE9 EEb[E,B?` #Ŧ`&O ELEE.OE-ӾE3EſO@5E{E~XEEEH Ew"dz$x wC/]E+E$gEcEʜE| DV*ŀ6DtсEdEEEUEN-xDTĞ+6^D+'ssRKCTsE[4EEEEZDhQ~*sĸDEE ErE0E$Dv(ŔlD}E*E.>EEXE:B "mT9EEdE E>߽Emf0E;)v%]x9E|Eo+E$lEEE:E$IlD$OC,`EEEErED)wDDENE6FE1ElD=+*š]>DTΖEw#EXZENwEkECG%zEDEtEEfE:CE N"Ŭż\ľ&EEEE&pEE=4.ŰŴ ,NEE/ECEUED`y!'HCuEo}E@FEÑE05Db@*ŦIJDEErFګE}E D.,)1gDE?E?E\E[[WETBZs ņ#QPGEaE[ETEEm.E ŮHt:EcEEE [E'E8(uď%ͷJ[CaEME!rE=EPE"D^A*F'~aHD?EqEFCE E{cDRą*ďDJE7EEElhEC=_ř&pVoD3E&EE^.E!AEfy=g&EgE*\E^E\OEcE ;|^!=DNEXE[EKEpE9D(:7YD^vEPEENE|EDy5) 5D^EEEqEIpTE7A "ŒLwE]EaE ;EDE,E ÀTÆ8ü=7!7mQEE*E'UEEDD(X,wp DrxEjEEERETDҙ*) DIEE#,E$cEzE^EHE`|Ĵ%ŲΉCeE̊E#EE^iElD+6P:*-sTWDfuE,E8F:EnEFZD uİ;*ؿDӘE~E%ECE2fEKACyj%>|&EaͪE[E*E0E0?EIC*8Υ*EȥEZJEEgEECĪ!Ż쉾rREuEEEEhDY'ӒİjDXOzE)EE FEֹE>D \*Ű$ !DeEGE F-EyE D\J(UćbD'{EE?EE9QE@.:؃!Ţi?amE]EWE EغE*EzŚ!uh?EEJE+'Er)EuEU&XCQfEpEEOE$qE֠D@*ź#;ZDE+E)EE {EQDq:*tDE̤E:EE=RdE`xCar%*{cEE1EeESE,?EGAEEE{1E'E/ĵpÂ,AE9E@EާE}E.DS%j&BCiE*E6EpEkEpLDpČ+`cDіE0"Er F>iEvELDЦ*7DEzEhE EbEheC~s%} těE.EE&EߤE;;ED?LPAŌx-E=EEEԱE EAQp"J BUEE iEr2ENEjDč(@V<DW]}EKE`EEvAEDq *.+VD.EE4E EuE*DĊ'Dl֣E*0E9E|;EWNE WU}ŀ Ŏ4=[E%E$EEXE&E^ĤŐR\MêCEL E@EFE8 EDkľl&ŜCXjERCEsEb+E EVD ޻$*Ā.jDEENEFV7E+EEDĿ)❯DEvvEEDEkaENC+*$6ovEpEz5E' E9iE!I9E œş"0ENEE"EE%EQļ"ņ ?BWEʹE#EEËElHDâě#)Yp"D~E)E+FSEzvEEDĀ*uDEEޞEENtEQ@C'[DˤEEE[E@LEby GS1đ'EAEEnEEEm$E^UJ:ûiEEpEpfE!E(4EeDĬ&ŝ܌CHlE͗EEHEޕE٬Dc,*rD!2EE~3FZWE[TEADn*IFDEEE EZ_EJ2CM K$Ŗlsm E4E~EoEEMY7EŇC?~1EEEގEE@EZ-#ń ŘB YE&#EE6XEEDq0)Ŏģ&DAE7'Er F~E5E ׂD!D>++]wD?EEtE EqEMCCY9T'ࠑ-}DEEKE[tEAJER?nD a+*EdEEPE E="E 4:z\-xFEfE6xE5Eo]EOD&'CmE\E EZAE,E4}D%Ĥ*uD/EEEjEVE(6Dĺ(*ŪtDٜEEيEsEw]ECM լ$hmgk EEEpEEH5EվxdvM2E?E"E]En!E|sE^Ī$Ů < B6ZEEOE]E>EgZDiĂ)ʼnt+D E$E,Ez@EEFD\*FĔDE%'Ō.ADEExEogEHE(Â1~œ!EEbE EV+EEqX(ĜzR`JEE?EEE1DUX&LSCbqEEkeEEE;Dv[l*ޢ D|2E-Eb0F EÀEt,DfM)ţġDXE)EIuEZEEZEBh #Z [EEEDaEaLE@3El I>w엵,Q6E/GEE.EE Eh,$ţ !C;^ExEELE}E !D&u*2 ī9D:E EHEؖE&EsD\Ą*`lDqESNE!DEEr'mEC%ZN'ŹT+DE`E-`E(EoCEE*2`_03#Ed/EEwES EbrEL-Rt 7{†6KEzEEHE_E.D(ņ9C4rE1E1EE EDI-ķI+ŜJD|EEE. EE@$D>)Y\C`EEEE?nEhDx5:y*6qBDi2EІEN FbE6̈EObnDBĽ'+@ YYD: EEfEEkEWCbL& ġZDREEE*EDE*L ŽĦ$E)E*EaEEUE 6 < }4(MErEE@EPVEDxSx'EĜCtEdEEtE#_E3DH*ŖPDENEFE0~Ec!D(QDҟE3E`EdE3UWEB2 C"OijDEvEH!E*E(E/Ec0 ŨÂ(:EAEOE2EE E qĠ$0ŮWC#bE>E7E}E@EDyql)%ĩHDhwEdEFYE^{ELfD 3>*~DntE9%E{EEpjE.vC,Ōd&\τāWD?'EZE8"E8E,BERRnQĨ}'EཹEܴEEEkE07 B, ²NEEkE2EzE?DyĚ3(0SA_DmEvE-HE FEֱEySD>*֊DPuEEEE|ED "(Ŏ+)DߠEhEEEUE<B 0L"gLLEaQE!EEE$]-EB/ňg(I/& DשEzEExEE4Z@ExèW8Ůk A~(EEwEP3EֳEEgq?+!5 t>PEEJ0ESE0ɢE.DW(^)DwELEEkE=ZE6DXI+Ŗ>ėDʎEԛEHEEizE]DáĂ)Ž٠D$EE-EvEXSE@BAŔW""GEEӘEE]ûE+Eܸ|n6=E.EXkEEpŠ]C(dEXEE#EPȨDut)*ЋedSD9EHE FEDE@WD*ĵDEEEE5eE'ΏCb_S&ɀEEV&EEL E>E_#' /)EEzEEEdEC3"q MjoQEȂEEiE&EMDr(_b DWyE9E^EEΏEFEaE}CpfC(ŗĥD^dEHEEExLEtŜm5ĢEEEE/E$EfGęMb(DEJpEEQE |EXDvd]&ŀ |C+lEgE@EE~EDĠ*P7mCoDXE8EFE.bEBD )ND8ƛEEWEvEN`E:AC H|$Ņ'jE EͲE#|EEE8E9Uź*.$ÜF1E`E2EETͰEE V"ŏ dBIYEV,EEE&E7Dܜ(%~w'D,E|EVFdEE#DJ*w3DSEEBEDErE C ŧ'>mĊDEER Eb#E%#KEӮk+`E%EFED2E<@E$E[ĚŴZ "ƫEE25E*E'EAEJDW&^yFCtmEYEFEx8E<ڕED߿Ġ"*F+sD6EEEZE"ЂE_:D)P@HDE*EEE0~^E"C. J$pgy EtEEEbIE.6ENjø?Ť3E|YEjEEԻEJE[Y#Ŝ BZEEV{EOEUED )Ő܋/DEE F,eE翋E#{D09+$ DȓE9E vEFEpECt'`:ųD6EE~lEPEUIE <|jW)x~EEEEE%!EJ#IُÊGEYvEmEN0EBE1DPm4'+ńRCJoE[bEsEEnE޵D&p+*A{D~E2!EEX]EE|&4Dd`ě*v߲D@1EiEnEEa\ED* C/ ` $bs EEEEbEڪ4E0]ţeӐô`4Et1E:E`E EP Ec֪#D CR\Ei8E T6E&EEBE?E Eyf#> +CL]EEERTEEVDZ)l9D©EE0F!EjE{vDZC*pqtD\E\EGEEmEC{l&NJObDE!EECBEZӯgXJ&E[ELE.EִE>E58!PXdBBNE_E :EE/SEvDo(D2tEEEEqEnDu+Ŋ]DB؍E:EEyEX}ED0(GD"lEREKUEEUEB ŧ"CLQU4EEEJEE-E)-Ř&@qm;E(E'EERE=EtĴ$ŊdlCcExE^E8E;EDf2r*žBĬ-NDEަEFvEEdD8 F*Ŝr@DzE6EhErE6iEѠC6Y(w[EEnEٝF㚖Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-26000.ark000066400000000000000000001454651376444676100257470ustar00rootroot00000000000000my_id BFM 2[EVEwE]D7L*ASwDqE6EEfEYED6$= 8L³uFEEoE,LE5E$Ea|bfHLyEEEEB"E.PEZB2H&s~1DEENE{E|E 78Dd:Ĭ*Q^DGMEEmF?EvED){XCgEEEE iE Edĸ^"(0 F;EyEEk>EE/E³Üjtؓ?)E,E8AEE(E[EjPvCK&(]ĭD EREExEES:`D'c* eD.EsYEE>E2ElaD'(%Ÿ4C\ENE9E%D$}E3E0XEvE1ED ͜&ōŔ2BRE/E4E6ḚEE!l"OG?û&EEtE$EE%DE a$~)Đ(D;+EEhExEpE| DP0Ī%*ZLDE+E&F MEōEDL2*m*řphDsE8GEEEED>˃$J^ żGE rEE3EE޻#EXĴp!qnE|бE`EkEYE,OEB T&BDEPEfEE>R{E)2Di*@/DEEY F EEJխD8 b)CzhEE\EEEkE5Bih"ņ/2=E~EEEfEX.EE\n;E":EEE^E+ZE:gCxx'Z~DwEEEEԮE[D\6*DZJkDEEqEdEtE^DңZ(4apC^EEb>EmEE EpGĒF E:ءð2EEVExEԽE8E\hÕsb!Ŷ\EM{EE.EFEdEѾC\)ŠfpD\EE^FܴEEnD*1ĒBDz}ECEEjENET(D&8pC TEE EEYEE'W12j%%'EԶE2E BEECE~`$z5DE_E|EEoE"1Dʜ*1ӠDvEƜEFEEDy<*D/tE(E_EE=EDE˿EEELEX,EЙìŘf7ޔEnEEEENYE7PCZ'ġTD>EE8EE6E^JUDĄ+!$*oDXEELFElE|Dlݞ(0™C`E?aEWE1EE ET Mf 3BmØ3E E4EEE7E!8LWĨEQErEEKEcE|C`(_xQDUEEEuEj*E~DN9H*UĪHDJE4E]cE E͛EZDg:&ŊCUEEE\EYE)E,ƕTô!)EPaE*EENmE4BEPV3#8xNDB^EzEUEEmE{D{)P¸""D$0E'E= FEYE DD"'q*~\. D-vE]EKEFEڠEvDs%' ŀ@JEhrE'ElE"EF EX` i:E{ӲEWE[@EQwEMENBR@ Ł%v@?DEoEh;EExE(DY *ų.܎D[EE&F EpEDiMIJ)ŒKTeClEEUEEqEDEqa # &@ @?EREEgEY(E+EÄŖf$28EEuEEDUEɧWE;Cw'DIE,(E֝EtEaEQDXf*wĆuDEEEVEPGE^DFx() C: aEhEiLEQE&EO E7Q {ÕA5E@EE+E'E=5E6lrg AATyE EűE)EUE9hEhaEClž(DϕE@EE8EE8yD_*35^MDEUEEJEc#s Dl EPEwEtElEPYC/)z.DEMBE!FECŋEԴDU,* %DwEE$EEE'D~Ĥ%Ų Ű AKE+'EE E'E E #Ũ> 'EE]E>EvEpKEpWA! Q%&nDvdE#E EyEjwE#Dc*UĈDڋEsEF rEEzڥDƶ)HvȌClEVE?EEۤE0DMuO^#b2RAEv E|E8E ˷E)Eұ*/_`E+EE-E'E&UEJ,C7f '6[DcE;E}E4EElwKDT*..O{DʆE EFEϕEqD4o(((ŸCC¿bEq\E>EmEE*EuT>?!Ŏ6E購EcEDEN E4E슑â+ ̚OĞ E>nE>EyEAEVaE#C(,8DگEEn FqmEE&sDĊ +Xľ,RDƁEEEEߑED?DWĮi'ţv DCXELEInE?E EmE2#576 Tõ+EvEuEE)E,?EY:##nDTʥEEkCEE3kEC`4)ĨMDEEEEvEDyyJŰz!EEEEE|IE@L@ ſ%TċD7ӠE,EEr;ExuEtD įq*xD1EEFE$ExDVٸ\*4OĊDdnEE5EE cEL D*x#_ŐBEsEEE0)E(ERyR*yEEREfEEEDE0TEb3Cð '4Ġ9D>EEyE6E+EEDq*=ĨD8ErE FE"EtDSĞ(0xweCcEUEEľEԨExEZ.P!|~#sE7E6{Eb]EDE?`E3E4TŪc J EEƝEGERE#C_EӗC|8[(ō."Dv,E4EE:BE%E:oD[V*łIXDt=EVE,EEED]'1PYC^bYE~$EEE=E-ED8ggz r-EENEv=E>ܿE=Ez#"ż"'lyE;5E^lE E\ EiEjC)!XD6E5E FpDEtE\D_Ę*&ē"/DzEE$eE4E EDzˍ -&ŐN ńzBOEEEE-EޥEJT8"E.EdEE9EHEh 4%Š(DEE8 EE6tEND y*3mĆDREE FtEYEV*D|Ć*PDoE2EwE&EpEDZ}#Ž˜CE4EqEEoE^'E2Z;Ţe%@E(FE E{ EESSEwCŚ&ňDEWEOE|fE~EAD4*ł5DE EEE`E!ѴD19(ŭ3C@beE@EgEJE}nEE,%] !Te*9E~ѽEEeEN E61E鎢łžGĿ E8|E|E%EE]EIeC-;(#ރDΗE~EFEFE|ENhDo+ňn\DNEiEE#E{EtD"'ŀxhC:ZEE.ElEEE <Ć%^+ì.EEE>EE EE=E+E0EfD ĺ& &tBl PEEEE7uEbE8{#E#SE3EE^E%RGEX'¥ Ŵ$ŧb^FD#0EGEEjErE(DF *"^>;DԍE̺EE6EpEgDP)т D}#qEWECEELEġD,nĚl$LL ršEEEEmEE,%EŽ4"EEnEE bE6QEk~B .#&x9DSEߞEvENE}Er;D8*Ŵă,DE*RE0FE֓E9ԱDu)YļC:fEEEE+EĂEͭao"ŁŽRV:E{EwEtECE0EP*lABETEE(&E*E\EhC?(ŊDMExECECE$ڃEdD"*Ŵ 6bDdE&EE.EE2PDĘ'ŒŮKC[ECEEjENEzNE/Aĉe<Ԯ0ELE@EeE@EXA;EutKÖ"ş'cEyEUEE:E gECї )ŞޯDD~ET/EEEEliD{*YƟ:D|EE:ZEEEUDm&^0B̾QEEzEU=EEEtN>Á%E|EEYEEEE1]„Q ſh$:C#DOĢEEEzE-qEDdL*Ų sDEE +F.EH6EaDW^*<D$rEEE5ETpE8D*$Ţ f4GE,EEjEfSE$E{a%t"{EzE\EUEEPEB y&jİD6EEfbE-YEm|E:6Du*ŀzĦDyEEFEsEïDD)Ŝy CgEEEEE'GEDfģO"(6<Ë EˬE@ExEEZ [EK9uCY'pĬ?DEaEqEE)EL^DJ|*!RhDREEEE>EwD=VD(ҾV\C']EE5EEE[ EQD% ZÒ1EKEEEE9ER[ ŗ!0_ĺEE;EEEeECa(I)lģDWLEEE.FEyyELBDE*ĺ>Dޞ~EzE@EAEEq"D^ܓH&ŗŮBSEEE0EKEE8J%ĉFQé&EEaEZEEDEI# ZO$3}ĕcDEiEEME@pE D;*ʼnrĐ\D2EfE FfE6JEiDp"1*Ž$DsE@EENEFEvDĿ$L `HEEEE4ִEX0#E^h`ŨCEEEljEmEOEB %DEnEEEOzE1DE|*Z*DEME F~OEnEbDVħ)6C,iEE @ELE蠦E{E_iċ"!vʼn7-@>EsEqEEIE-E'$iŷE/:jEWEEE0E ZE]Cw'F-IDܙEƀEE}+E,ERXDLķ+1lD(EOE*E%E{EcD)tX(Cp_Ed)E!E/E"EV ExJij Wf^U2EkE EFEhEw8E s÷Hu!Ŷ=Z'EEaEE~EcdE C.Ğ )ʼnѫĨܶD$E EEEEpDD5@ď*ż&{ED2}EjEWeEE5+EDO&ŝCŦQCs7TEWE3EEV˯EE("k@T(EEEEECEb64#:'{D=ETLEXEEdnEDjR)ł ,DяEEFaE ӌED"g*ř`(DuEREEuEHE=DZdvI%w @L IEER EREPE!EvVmYEuE"ErEEMELB V&ŽM2DWEvEQEf>EyE+D +*ŖļDjEIEFEߑED|)őQCjEhE1E,+E(ӥEEn"Ś È>Ep6EREEEt,E \N5{EE=EEE_XEFJCL'쁛^|DmEEEE E TD>*Ŕ<11sDoEEEEEDĭd(OG?C:"`E EDEdhE4E" EM:NԐ |R>Å[4EܻEI EU6EES6EÞH\!V4xEu?EtEeqE3EbEC>j(ľDjE3EhEKE(FE4E*E2>m2sEEvEL=E dEWE 6C'Ł İKDE_EՍE~E=EMDPh*ŋ_ĴTwD|E E FlEI8EReD*(ř0CJaE EE?EQ E~ ERR _ŒrT5EcE-E)En[E^5EIbfv Qt EEgEEEaE8C(ŧȻDNNE eE FEfEvD~@Đ*FiZND>JE~EÕEi[ExE\D :('n7CAWEhE=E6tE{EbQEj2?ŋo>E+EP>EFEEPEK@E8Ob#ůBr1!F E՘E. D *ŷ_CmE2EE^EE.Du#h·BE`EtEBDElgEN)EVgů, E8EElE|E|VEx!CkJ>'ľ)D͛E0EGEEE ZJDĄ+uĸ|DEp:EE03EcED2Đ(BCIbEE}rEE>=E"\EXWĜ!ś$ ö7EEq=E EZһEJ4Eäj M EExnE^FEE`E;C|u(6yLD^EEsEEE&rD3?*:UD'ÁE: EEhEeE\Dx'ő \bKCpXEEEEEEd5ձʼnj Û,E4EECE:E >EbÓ"G"2"oijEOED0EREPEjEJCF)L DۑE_E`!FQ}E4EDB*9#+DyELEXE7~EHTED l% XLBNE"EsEEmEqEPs$M(U!E\ZEEd E EIEnr ŸE%#-DJEՄEEEuuE^JDj~Ĉm*Ũ*DeEE FEяED )ŧbDYnEE\RENEEDs{-#faR EÊD?*Bt:2DtzEEElEElD:Ę%Şs PBx2OE^{EIjEEEDEI?#E(EE9EEHEжa L$Šۄ^DݬEEEEZsEjDa:L*ŀ4mDKEeqEFiSEf&EqxD@u4*Tpd9 D4pEjaEĿEEEDV~X$Ũ xDE$EnErEwE&E`ň$EKE 5E(E6ERErBŎ&A“KDEJEhEE~ETl>DĽ*ň:yD EEuF"EEE E1Eź;~Dۅ EEEx.Ex|Er]E6'CŜ4(Ŏ$Di.EDEEPEXE^gD*#*؉^D>EE4E UE#EsiDڟ'f vC[EpEEEEE>4u8r1/EٹE0)EE E D<ĸ[*ſR긚D6KEyE%FE@ED-*M*dDFqE˽E!EM~E¢E=D|;c$ŮC @\FE"EUE2EE%EͿ%CE ETEEmEEQEYBMŦ&hDEEVEeE|E>:D,1*Ӷ|oD EEE"EwEgDh6 )ȇLzC#gEBEE E҂E Ec"ŗźIo;EEEIE1?E/Eu*A,EFEeEEX2EB[EC6)(ŊƠlD{EEE%EEhaDj*,BĝEdDEEExEʼEEDDı8(XMC\E5E&)EE7OE"EۄB'E0EKE@qEEsE:ERd"aiEէElEzEEfEɈC)f)YDnEPEBFOEԈEfD*ż'Ļ;Dv}EڱE~EDEDE!D<&/aMBTREeEFEiE EPEp"ěj9õ%E!EJEwrEnEzEEƫO Y$JPDEKE"EEqEC Du *ƼĚŝD E7EFFE轍E$Dc*Ÿ)2DrEkEEFER%E#D%m$ iaGE/`EE@5EIE#E~JQAĂ~EvEELE,EOEBT `#&SYDE4EBE2E{E/5D޺*ϝĴ&DENE`FhEE]DU)Ž.ECJhEEh7E_EEEeg"Ŋ;2 iDdEEE6{EǗEbcD:ĈC(Ŏ`Ce^EE EElEt E\Gķŝԥð1EE:uEEŽE9EfTi!\\ E{EXEEuEQeE'C_(*ĵ״DrpEvEhEEEÂD\C{*ō!ӪAD8~EpEJ@EaEξEX D%}&Œ8CBSEBE|E EHEEE&@1^HņjJ'E6EEE1ECEP-H#ş}ĄDEE~E0EoE4D{t *jӺ\DjiE EXFTEME ӖD*;/D^tEE EEEEDEE߫D)Ȑ*CiE&E#EyEE FEVl "vDEEEEEk+D*q)ų%CCkEEAAEEYEjkD_o5#Ũ{ä?E1EEnuEE +E-n gDō4ĬEE4IErE9E'WE DClq'wÚHzDE EEKEE&RDy +TKsDE}E F6EԳEyDĒ(qCxaE^EQtE1EuE E0JPژ $y4E'ERE~UEE6EAž;!42U2EƩEElEhEbEC N(ŘİD;E+EFE†EzDoI[*pKDLɀED;E~EESEDǘ`'wY~-CVEE5EΛEfܮEPE[/ߛz\*EٷEDEEEQAEkt@iV#^uIJ5DlEE81EuPElECdĸ)uѥDExEEvEڋEbDdĨC*/P<$DAwE7E!Et1EbEBD@\~% 8A6KEE~;E8lEEɁE %wG>ElEҖEj-EEKEmTAv ů%DCDEHE@EE wE$Dz*ŒmzӐD΋E>!E'F@EED~ )~ ClEFEtEE,EDDs^^#1şVz AEEڰErE3ӷE**E32(Ʒ/ѺE~E5EjEEާVEty,Cw'0јSDiEDDEEWE#EO*MDą*ŎĉyD$EEEvEEDI(׮żqCaEpEbtEEEl EOT!L:5EE{E MEnECEQGDՎ*of ~DPErEjEEhOEDF`(ŃCdcEEPEEJEE-W9!ńu~7E E~EE*E3E%&M!] BLĤ EĪEEXEjRE_EBEm#q#ldE7BEENE@E&'jECT)lrwDEEF£E"UEՌDưė*ŭb/DyEE EʜE'ED֨]%T Ř=yB5NEEjEnENEE@IŔŝ]TN"E~E ECE$EIE9 $BSC0H&ř@QDFE]EE:CEnrEdAD@*ŋlD;EEF6EfETDG)RHCOeELEExEsE>tE\w!ōlŮ;h8EDEyE|EE2ERy> sG EEE.>EbE=S^ECSi(ľ[D覗E`EEBEEkDPĵ*TĔ\DqEؤEEE dERD pij'~IjCWZEEEJE`*EE;`2Šܻ<.Ex}E!EEyE=E`W3Ó3,"9piPEfEbEmEEhET^C΍)).x`ϭDEEF@&EEDď* ݅3D>{EE\E#EZzED)ĖV&Ŷ2 XB.PE=EEhEEzGE4Ι %VĽDEEEPLEisEDEE0EbVjDĪsEE!AEEVE\EÅC)'Ł?Ġš"z/E,عERE|"EE;ECiŲw"ub~Em[EE EE~gECb+v) ;ĆDsEEFvE^E)D*,Q7D|EzE6EES؝E0D<g%&ź̾B>QEGE]xEE7EEāhŌ>R$E µEZEEEʁFEKNŽ s$fD9ExEtE6EqE7DH)EpDdIE EbETE?2E(ěD1ě*\DrEE;EgEvED ~$y 2I)FEEEDE E$E[hze8tEnE EE5EPEtB8&&z8HDʝEE>OEs}Eݎ|E7D9x*7D=[E֙EFzExgEDgH)|m8CQhEE#EE[WEeEcİp"ņ:ńuCETEVEE>E\[EvC(6hDEEEENjE_DĆ*,<ĨdDXTEE&ED,&m8BjREzEEBEEEGV"*śtÒ&EaENE+EEDE{s $Ġ?Du+E EE@jE pE> DQĔ.* λĹwD E|-E$FEEE.tDSx*LD$sESOEXEEED_̃$V pkHErEFE5EE[#E]e]WJEѱEEdEUJEOEPB "Q&ūHMDʗEEaEESO{EF2Dyį*œ ĒDdEx%EF|EEDt(9)uuCiEHEE`EwE{6EoiV;"` 0;=EtEpEREgEx .EڼŊ+sv;\ME8EߛEEEYEhCT]Ť'2*vDmpEEEҒE En\D=Ċ*v΅lD2EaE7EGEEDN(ŒUC$H^EsERTEvEE E%I=a !-ŷ#ê2E-EyETEE8EoÅo0!,j]EEuEE fEeEMCVe.(`D3E8E0FEE{DG*ŹQBDEREEEE D)&l&0CTEEE|EnELE3'IJ* \Ņ'EdEE{;EܸECE] $OzJDENEEE2voED *dİDEEwFE$EVVD!r1*ūFDtE EҽEE;EDv$Ŝ Ő9IEO1E˫EEkEb"EJũl`?E\EElEQ EME(tBV %mdĔ DnEأEEAEvyEr.D(Ľ*8'9DnEE@ F:EnED ē)Vo˿ChFjEdLENQEEp5EE"mĖ#j!Ô>EEȜEqwEE,EK&UE58&E٭EEzEmEQXE,KC}'jDfEEE E!E!TD& +LpDѶE E FEE Dt(ŚC+`E^DEqEE@E EK` ŽQL`3E.EEE żEc7EfĒ!ŹbWQE~^E4EEEzcEEC6 )q`DcEE1F/sEEَ~DD>*ŹQIDOEE?kEELE[Dv&Z5 C#UEtEbEGEMEPE,W:FA)EjhE)EEiEwBE@*.#ŖwĨDfEEUEEmE`DU)ŜTD1E/E FEIE,DUf*8 Ʈ DJ.vERjEE%8E.ϠE^Dq*z%ž @dJEE)E~mEE E0T N/%vEYENE,E}ELE,| B87 ;%L}VD8֟EKE3EExEA'DSƼ*ŁBDRxEܷE@)FFE XEGDF)7%C6 lE\EzkEE+LEKD9yp.\#z?EqELEإEEE+EQß5]0܃EjE';EE1EWE;C&F'(zkDEPEE˚EuEGPDVĖx*v uDBSX E©E/EZNEeEOaECq։(CĮD_ߕEEE~E戆ExD>X*hZMDE^EECElVED}Ԙf'Rh.CVEE E3EEǍE(00,'t*EKEwEEE@E}L?œX#޹sĸ5D.EdE rEERlEC )ucD EWBEv)F ElEuDQҮ*ھG%D@wE+E1E2EEwD|%" BA LE"E(EE EEuĥň X /E E|E4EYEKExA j^%ndDuEEE~EE/wEZZ#DĒ-*P>[DAE ERE sEEq:DF])|[CJmEdE!EEdE7zD[uz+#XZ"dAEEyEB[EɷE)EMw.ExԮE E:SEEUEG/ChnS't"|Df?EhE+EEELD*E&{DEE F%EĕED-ģ(ť6ŦCbEQYEEEEaE3THE!un6E1EcE EE4El û Ő$O EuEFEzEWE\`ECŜ(OdнD)EEFlEEkĹGCXEdE vE;EdE^EJ5ěWj ]+EEEEE?Ec#9nĪDB٥E<E[2EEVAkE{Csp)5DEbEEnEE%DI;*NĐ+D3yERxEEErED45Ď%%D Ÿ=BGMESEWLE5EƲEE 9\uZ!EEEEArESIE`#@ JH%6܀D뽠E|EEr EЖuExdDCĒ*הDuEDE%F E(EBߢDv+*0K}DMnE/EvEEoE>D z#ž TBE?EW EEJE(EOèFŮ{+<EbӯEVE,EX3EUEv*C90"'ە*mDDEEȩEE$EcEDR,*SZDEE5EKEUB_EC@( ėD?EEEE>E "EznDLh*Ž/XDSE(bEEEE-Dtx'YCYE.EsEEEbE>Y8w(oq-EEEDE5ɿE=E!ŕ"żKkPE'ExE"EEiE}PC)ŝľD )E_LEF{'EnED[*Ŝ*/D/ozEEhEDE$E/DE&&&Ų ŠuB OE.2EE EC9EE@WŬ "EԴEEEEHE< &%6m8DΡEEyEEAHtE)DGy*ăD fEVE+F~Ee-E+DiH*Œ| DoEEEEIE.D|8$ŔŖ:DE*=EEEvEF'E-I4źK%h EROEE3SECň0&ťrDÿEYEVEbEv~EJAD.ğ*bMDE E4EEBTEʹDFJ)ŖįCbeEJEEDEhEEi]ĺ!ŠcL9EAսEEPmEE71EtHGK El}EEEE^]EZC ŤB(DϗE܌EEENE5hD +4\DNEEEEyESaD͞ě'`fhCR[E(EEjEvE~Ea=#d.EEE7El"Eað"H:gE'EaE(:E/EzhEC$)FS ҮDxEhE3FE~E?ۈD(*{xDf6D{E-EPRE5)E*E3D&#Ĭc&B;OEEE=E3PEݓE>Ī`g(ý#EaE#[E'zEFEGE bM$@DOE`ETyEeE`sE uDϮ)&jXDEEE4E EˤDQI*jD$qEEEPE E~Dʀ$~? Ũ~EEEEfE]E%Ek(!հEEuEmE cEPQEB;Ř&ŸzĴ[D8cEEuEE[}EX:DF&*vyZDXETEFEߓEDm)Ō$CT gEEEEEfE]b "ځQÌ;E~EZEmgECEd0E[nöj1BĘESdE4E'ED/EE\EπCB(^Ģ/DzE4EtE@EƒE@cD +ŵlcD@EEEErE^UD,(*ŰC[ErAE1E!WE-EcEr!BćtynÜ/EXEZEEBE<^;ErMY!TbĆEEEE4E0gE;CܾE(dskDE)EEEcE[Dtu]*űVļz:DO}EEEEEEDk&:z0SBREhEEbEErOEĜ0&E␵EExEEҴEE`N¶m ō$Z DTE]E&EEqEDzD*?@DxEEI(FOE)E.D*!h*ī[DrEEE0E`ED>$: œ-!GE2E+ErgEKE$E8:8kńGsEElEJEEBPEXpBԀ&>AD+EE~kEVE{EY6D6r*Qi zDE3EFEEPDĭS)bĢC4gEƕEEEECEbf=l"(Y:Z k EE`EdEE![EqC(ť'Ѹ D]+EhEEE*E]D*ŎxhDpEʔE;E4E6EqD*+(&-C~]E0|Eb+E{EثEoR E[D GXd^2EEEEbEߪ9EY*P!ř]UEE WE ETEeE`CGLa)ŎDu7EoE$FE煈EruD*&6=D~E1ExEC$EEmD5&jhB5SEE2E#E}iEbE^'&ETE\E bE E7DE[ &C${r}@DEEƫEe@E>pE D *gO~DCEqE FaEIE2D`$*vĮDsEEE EEXfD![$M Ъ4HEEEEӴE1#Ef~BnQEEErEcE+jENEBӊ %Hڎ:DhEPuEEEzzE1D|bm* Ī"Di1EPEFVEAzEUD_X)łĤCiEE9E.LE&EREx%iq"ŷ5+<>E"\E8xEbE1E-E; ŖR9 EJEEE EYE^CB/'&dDЙE`EZE2 EEXDU+6kD"*EEE E,END,lD(ŐMC ,_E KEEE0EP EKĖtÆ&3E0ElEҷEEE_8EvÈ !ŐZyEEDEE6*EcEwCjĘI)ťnDՔEEJ FE|\EzD +K#GDgEBEWEME%EFD-ʿ&Z(SOCUTE`E}EEįEmE)ĔiGH=s(E@EE/EEBEG±{#zĤ DEfPE_EEnE(DÎ )ٹhDXڏE8EFEɌESD6k*% DduE~EE|EZ5EDOG%Ş `JEEBE|E=E9!EFf`u}E$vE*E tE˞EMEoKBD %.F6DXErEUE-EyEb+D*ŔDKD[EEFEߑED{˴ă)CkEE"E EEiQEoQ"NֱR,?EfPEE>EE3EU,ECy&lX 5vE-.EE]EE#XEtICN'a{D nEcEExEFE} UD~(x +Ŵ-tDPEE}E)E,EvDĉ(^O*C_EEHlEGE~E+ EN *#4EE$E E~E"7Ez/OŴ `vWr@E~ExEH=EE cE®CS"P(clDqENE,E+EE_ |DʠČ*ŴIDEEEuEěE-D"U'*p"C!VE`EjoEoE4EE-BdŇÈ)E)E$IEE(EAE9Ť#ńXu_BDfʤEKcEEx)E\mE6JC")XG1jDExEV!F_YE'EBzDěu*ŕ!D8vErEEPE=rED6ķ#%Ÿ' ňsA&KEE8EEEI E{ ĸZe>Ś7kE>KE+EB\E@E3LEXA` z%Ŷ֙DEEE\EwE'Dx*yĺDWE3E" FEEdΧD6)^*AC#kE E^EE ;Ek8Dr2#6(pVP@E4EEA)E-E3*EF@2AiE9E~EEhEWE2C&L2vMDl0EZEzE`E>6E MD> *͚wDEE@FME#EDQN([;C>bEjEE%EZݩEM EPĢ"!ŕ6EJ7ELEhGEE25ET38!Q' EL EEbEEaEhC~u(˻IDYE]eE FMEWE0vDP?*ŬTXODRE}EETEEDZĺ)'9CWE6jEkEErEctEbQE2Ifg+EVKE>TEfEEV:@EyjŜ\#qĻ]D\ExEGEE#kE*C`@)źEDEEF$E.AELD2(*ž^y(DwE#EETEW֟EDp%F <6 BtLEYEaEE0EmEv*2M`;ų Ĝ EEEEYEJEi"Aw9 Ţ%f0DCE~_EE׋EvEq DĦe*ģD SE\EF"ExE뵣D? *ś5DNnEEךE qE疤ED)u_#š2¿"BEEyEKEE $å"M"nМE,E|,E"EgELjENC\S)gV=DE.EFEԊED_8*ķǐ,DyE@@EXE% DKE8EdEvEOuEDAHM* FļD?EEjF}EEZDĬ)+ĆD(oEEn=EeLE ED{$^# AnvCE((x)=ļcDiEqEWF;EEh{DkhX*?pķb1DzE!EEhE>EGDAĴ%Ņ 0&BhOEDŽEVSEEEE)< }#EE EtE߹EջGEA $暄nnD:EEpEŜE*ksED>`v*Xĸ D=E}EF>EEND޻nQ*Ī DpExEEzE؅EDf1k$B. Š3DE]EsE_EE0&EҮJPu0%EE.EEE\SEBŰ&tD EUEtEEs~E>Dv%~*ſ D EIEF1E_2ErD͌"E) 4ıC fEEE4E:EhE_ij!LZ9E.EEYEE31EVʨÈŰ*DĔ E2EE/EwE]E.CvT4(h&D5EE.E(EPIEB(gDϬĦ*Ţİ_DKEEבEkYE4 EDV1'Ŷ"uCO[EE_EEEEm>%?1xÖ~/EعE:EKE E;EƋEEfE:qNJ$E E8cE`E@EFE!N( c$coD^EEEE\rE.ODnĽV*5 DdEkED.FEtgE ǛDY`j*=zyD rEhEEEWEDр$ =C{FEEIE^EE%EwFMhE&E=EVEESQEB<ż&ŬĖDEEeWEE|E:D.f*sļD^EEEE gE9D8 )+qĢC$3gELEEEv|E[Ec;"5HÐ;EEE;El5E|/ElPvņqAŠETEmEE4/E[EC'3yD E(EEEcEmbDT#<+U`dD,EoSEEiE EGD~T(~CX\ERE+EESEElxCŨ:خW0EqEpEEE:EWê!š"bE]E E1EpEfECc)ŇgcDpEEFYEEHDLwl+PZĜ=D}EEnEEE D/'&K3ŘB RE[EEmEiE;E!Xň:%E"EEgEvUE]EEDѾ ů&$őD/EELEE,]qEѐ DĒ)nĿDE]E EEEDΈw*ņaDrExE۲E^;EEDD$Ŏ , rGEhEGE.EDEl#E6 @E/ECEEEXOE0nBS ť&PmDY'E7Eg:El1E\{E4DI*HDEaEFxhEXE=$D_İ) 2 ChEuE6E^EEvErg|"~&:e =E2ECEEE.Eds+Ŵ8=@E&EcxEEE|ZE,eC (7FD昙EEEEE[Dx+%zZjDj„EPE|EąEE6HDZi(ѣHCG^EdE4"EEGE EG ũŔ[w1EXEEEE9E4Qg Yű!Ņ\ĿEErEڧEFdEEneEQ{C(DEĴE~EET EXDđ>*3C(AD EyE)E@iEqE EaEEnE DYo *2^ܢD{+Ed)Œl3EEKEE%~EfWE4FCL%'\\IDOE:2EEfEERDHv+gWRsDVEŚEFiE췖E"D ]<(ŶŦCaEEpEEEu E6Q D5EAEENEмE6E.;`<,!ŹU EE=EbEsEZbEFkCP)bDEEF-EEUzDV"+Ŏ)MDÀEErERE EBDĴ& a.C%VEE.ENEڮE3E/ZgS"*EEGDEE E1AEd1?X#tzrD/E1E[9EJElEgCƖ)DEE|EEmEYɋE?xDO*g$D1BwEXEEB$ESE!D;%E өAKEEBEdEEzE& 46>E*EE!EEKEKAh ű%żēyD E6*EP,EEwEj%D,7*{3ؐDċE6E&Fo"E EmD)N6ClEExpEE%EkDtK#<ʼneAEEEEEE_*Eb'^:0ĄE׮EEEhE(EeeVEL'C>'ėDXE!2EȎEV)E)EKD7+9 U2yDEEESEʐE\D9(CaEYELE.ExE ElUN!Mg5EE@EqEED4E#Â%ž ťQ E*EEEE0E0`E#zC̕;|(%OۼDKE:EēE|EE}sD@*Đ{PD;pEċEukEEEDZ'K:CWE+EtEa EGEtE2ĎŹ_t+EE EքE 8E7g?E# (ő#ŔpFD'&yRCvYE/=E'EpEEE58)lf-E?EEtEE>Ek!}P"ukOeErEsE3~EhEjEC)#O6qDz&E%E-F$EPE"D2 *1DyEEbEE&E DC#%9= ]BNETDE4EbEIEBE"0M_+"E_EBEԌEEHE0uX  %䤆uDF7E EEvEE^tEDTy*?ĞXD!EEFuE$E6DML*ŚDDoEEEEƣE)Ŭ#cDǒEnaEEEJˉE3DRYĠ*ߏ2D"{EME#E[ETEIDxq&}BdPEEEEٱEETeAG>$E&E_E-EO{E0 HE>A ŵ$ŭ\D6;E%E0ENEsERDR/*ot7DEGEg2F4EEqpDۻ)^Ď D~LqE{E.EEBE D#Ŗ_ Ŵ~tEEE7EE3E&E:(O!^WE?Dn{%*FdD#E^EFdEדEDOĬ)ŲaBCpAfE4E E#$EELE-A`ď!'QÝ:E$E'EAEPĺE~L1EQþ7|C2E4EziEeEE5?]E*߅C}' LDEEE E8 NŃ@"`ErEE#HEEX,hE0~C)2ٯD1dEۤEV FIpEBE>DW,+؏Ā7D|EoE-EEELD!E>&4BPEE@{E|EEE ĕy&$E"E+EpuEEHEE0c©= J$JOĒD?EvGEϒEE`tqE8Dnăc*Š[ D!EEE+EQEuDξI|*ŦB`XDqEE.E2EiEvzDт$Ő /S;FE-EEEE$E ܹ<Ű Ď>EOEElZEEPE)8BPcN&6%DɝEEEpEN|Es5D*7pDE]EkEjFֲEr5EDF)ŊB:CgEVE EEKEEjdĻ" C×;ERE E+E7ELs/E+zŔ>TE{ESEEqE¿[E|sC+N(őFDhE&E`E EwE^DK*G|ocD2(E(vEExEp7E LD8x'xKC)]EEEEEn E F`Ŕp@1E"EeEEyhE:EWSŊ!ſ^`EJ*EJEEaE*fEICh(̭>DEފEF$tEEa Dvp*\U?D~EFEEEH=E|Dz&u B>REE0E#EEEvh"ħ$*KÕ&EOQELE/5EEEEn7 M#SiDiEJEĬEE;pE DN|)ŕĂ#D`NEHE1FzsEčE~D։P3*ŃofDKtEJ[EEE EiDsǻ$v. ,vvrHEE^E\EE#E!@Wc EEEEKE1PEWB . &不ūDE SEwEE{Eo3DLjL*Š0uщD.E`E FEВEѭDSR( CiE EEkEѦE4Er8DDE`EEE،ET{DjO*^TDJtE"EEkE-ED(DD$ Y k=IE] EstEMEPEӒ!EĦ^nALEF@E|EaE{EkMEqeB- R&಍DϞEELE>}EyEt*.D]ľ +( D@EE( FXEȑEѪDϴ &*ń(CiEBEAEEEEnst#ő%&b>EEE@EEڏ,EV$OŬ9YE߭E EEEJEE^EwE wE!D8*ʓLDE@E*EJEؚENVD@Ăp)FCPAmEKEEƥEȤEeDķv6#4AEPEEUEPE*E2 Dv*|g-EEEjMEE VEc/C:3&ӗ0DӌEE EZCE}ɀE1LD.5*?Ĥ|DE0WEF(EޕESDn(ss싰C6'cEE3E%EƩEE TĀ !E'B7EEEE+E4EHaH ؖN E ErXEюEE`E]Cp|(z7ᬾD0EEF EYE.CsD2Uĭ*ĪTDE)EE5EE(D4Jc'4OCTXEIEE_EEE4ıD>'+EJƸENEE E?Eş"7mDWE4?E EEEEEb_EC}[(mhD5E7EEE EdlD0y*S)WDNEJEVMEEЙED>'Z7&:VCYEEtEpEEfE9Û-E˸EE ;EwEB=E1$È(#GkEE:`EEEZiE7C *ZͲzϫD\EBEIFE(HE:DDP.+Ć1.DHzEEGLEEߞED<Ğj&ŕ) Ű`B:NE0ElE΋E&E@EhŎť#x"E״E%EEYEJcHE.« n.%^WDEEEɲEtEgD]+A*ŤֿӗD8E25E.FEaE@hDD)Gwp D]DpE_EE#EۇE@D}ď# *KQDEfECeE@E\EqE}EoER*\Ħ!9_38:EEEƣEEY1E0'űŅyE0E+E5EBEEe]EKAC-(XD'EEFE庄EzjDT*m9]D2E4E6 FE2E[D'dLkCU[EuE-EvE5ExE>rn4V/E EElKEPE 9ŖL"fx7E`ElEfWEE}{hE|C\nu)IĄD;E?rE3F#&EqEVD:*yĂ8DB{EEEEGEIEDfķN&Ŗ BPEEJEE0MEE-uŤŢD*#E4BE ErE*EFE.­ <${D"Ex1E~E;ErECD:*cD'ƍE0EmEEED'}9*1oĴV D1qEzEdEpEËDİ$1 z*™EE&hEJbEa\ELE/%E˂_z~G"ԝE#E%]EHE(*EQE+B`Ŧ&Łq!D4EE]EmlE9}E9h:DU/+ŴلD^ɈEQEFE&ÓE:D1ۯ)(8CfE`EE0EG#;zCıE_E)E3ECE"\E{C (ņĆ=D㔘E:EE"E-}EbDVm+'c`cDE\ElEE4EDQđ(ŖXMC[E"EEZ-EEr9E:.C ŞnÄ/E?EMEҩEpeE;;ES%Ő!ŦcExEEEqEvEfECjĀ(?kĶҰDESEEEEcDp\p*űĿ9DW]}EEEE͝EDDM&TsB~.RE3FE|E]EEEGk)&EֵEEtvEEEE WU’, Y*$pĬDE&EEfEqEBjDĨ*ł#DˎEuE:FEMEDIJ!*ĐD7>sERCEE>EE}8DnC$B^ 9f$BvGEnEӒE{E zE$EeN)š9EXExEEExPEؒB+@L&5ُ;DT]EEEvzEX{EP/7D)*O*Z=tD䣉EdE FEbEDNDNgĎ?)ChE(E#EEEVEReT"Ř2ú1)IܰD#E%EYFEEE#Dz,+ŕĀ>Dm~E5EjEE[ΜEED&_`BSE"EEfEEp"Et&ŚŸÞ&EEpE`EEWE9DEhu 0$~UwDEEE(EoEomDn#8q*wD#EEHE F:EUE⻗Dā*9sާD1sEΣEFEzEzfEDn/@%rm PedGEE>EE㝴E="EpB]ŬZ>EEQE&EhCENEB R%lxjDE]E6E7EZzE.D6,*мD/E-EECEoSEMDೲB)ťĹ CiEEEBE`E"EDi( #^o,2 >E6/E_EHEEv4-EվJJ9ݏETE8EENEYE\C-(ĄDEEEE㓂EXD<<+gjD E$EE\ErEeD=d(,C_EFEEEE EdMĢţŘW3EE 7EEoE"7EB!9Yľ!EEvEE(EEddE5Cmĺ(S)KDHEE} F EEDhf*TDēAGDEEEh4Eu:E"Dԕ&ŕCzTE0ECEEԯEs>E(XV0ý(Ez4EFE4E:E;CEEiŷ;#Řy zD7*MS*ɣDEE FEG EBDĂ*Ĝh DvEE9E$E`EDF0ĺ@%0[ XA#KEEE5E߄EEAn.uE4EE*BE0%EKEA ţ%&eęD6ҟE EEEwE&D!+D0EEN FpEE~DĞJ*C$kEqEXE/zER EDct#ŗ4Ř?EEE2E E*EEtÛ Ÿ53EPEfE#E5OE3VEZ=*C.<&bؚBD6E-:EFE}EEJDt s*WpAxDkEEFtEIEzDtƫ(#`sNCebE#EE E E EQ< /SèU6EEcEOEXVEV5EãRK Ok E:E@EȼEpEbEC:(ƦaDyEأEFEEswDI50*ڕOD~EEgE\jE@E|$D&ź:@EmF>#`"qāWD<}EEd}Ej EGkE@CЧ)듵ąDC+E E!F8EFGEDY$p*ŅI*DwEJPEPEwEE?D]% 6 BLEEE EeKE#E-&4ŵ } EEEEE7=KE&A* ŝ$İDߠExEESEfvEG D7 *ř験DEYoEg*F^QEE]Dy)D=nE)1E"EEʟE&D޵s#/ŅwBEdE69E{EHEE)E12bk3)EAEE:EZEgUECƪ@'=mķ:DʛE|E[E\E8eEYGDd +q5{DjEEL!ej"p'_EEEETEhjECN )0DKEEFEED*d_,DyE E:E{EEDxon&rK [B~MERyEwEE EAEŬ /!EN'EEDE,EBIE^0A ~o%$gDb-EEE\EcuEDĘl*,m=D.ڌEEKEEΏE^D&kF)tĆ.DT$oE EE%EEDB}o#NP’]CE)E>E#EEF(EwŊ%|'ğEEhEU6ES]ETE#C&"D5jE6LEEEwEEDX*RI]DEEFE6ܔED|"(DvCNdEZYE.EdEEMEwZ!njmt 9EBEEE…E"2E+НoߌW|I8 EsqEE0EHE_EC' wD̗EBE F E^EekDl*5ĿD[D EGEFEařEN7Du 'ŴRJhCdZE6CEE4EUEc*è؄"ffmEΦEEJEE2iECd)87DfȒE)E FIE,GEDKİ)rĮ1D([{EQEE EVEbD?%ŒL ϘB)OEET]E!E@EEVġEHĠ $EdEEEzE GE0 ō$œT[DE,EE~EvsE TDIJ`*űRDPEE9FGIEOEqDD;*#{= Dz0pE:HEEa}EWE˝D$ ¹DE%EZOE'\EPE7L&E4lÎ '%ĦE{JE^EEERE¤B%Ŝ&ŵ@Ħ2DE$EcETE\~EYE"ŪD|Z9EEEEFERu1E1g&) +>D"e EQ۫EhEE>Eo]E'C#T>S(7pD!EEtE[E7E^eD]*-Ē]Du@E8E\E6EtE?Dc;'WŻjpCyX[EEtpE{EڢESE3@r1Ps&Ó/E*EEEEC;EA?vK" f<EݦEEE@GE$gE C;);DyŒEE{ F1E*E.D0B+LĜ6D{EtEjEgEE(dDܑK&?ŎeB0lPE>EXEEddE7vE* QSĄ$EEAE,E2-E܎FE#2q $x̓ DEEfEEsE\_D*zqċoDtEE.<FEQEXD*ŅtĶDZSrEE(E՟EEB,D@$ g=<\FEEՍEEE%EãeĵEkHE#|EExEQEBB6x"&Ź{BDEeE"iEE0}E:D- n4*CĒDCGEEE7E^ERDNܜ(2n~CgEsEKE,ENE;EXbO!PYŋDÑ;E,ԾEP EvqEZOE./E_KF U?jEfEgER E=E[ECt'Ɵ2DEKE@EEEcD*ňĀ/fDE,EFtEExDic((^$.C\EEOEFE"wE=EgCŷ&1EhEEE@E:E73Wò.ł!Za%E 4EEEEfEFC7č)®DD?E7E0FEED**i>D&~EbEEE!EHpD|&%BMREqE`(EEmkEE| v%EEcEV]EDEKCEE(¬ Ŵ$neDEˉEEyEpEڣ DOč)*ŹMDϹE)E EnEɘED|.7+*փRDrE2]Ec|E"EEDs)$Ņ 8ŠGEMEsEEED#EK(y XgE8XEE |EݏEn_OEzB8i ~&5VHDEE+EE{E|&4D[p+3DwEE+F+E˒EҭDLH)Ŗ8ChEVEAE) EYEAEҁi"RcY?ÊĮE E:IEHEnyEcZENN]C*1(WFDEdEE~E^E"ZDHn+6ĥiDEmSErEmEdEDR(VʼnC]EEE ECE:N EXH( ŜŨ~1EEEEpEO9E l!D]\TGEsE_lEqE3EJeE8CĠ(Ů]DE0EEE| ElUDOQ*mD?D]E:hEEJE6EVDBH&#$+ CSEE#E E2HE1E$pz+ % (EΥEE4E;EQCEw‡ 8#{_&DmEZ?EE0EfoE* D@)ŷ˹DD)EE;2FH EZ\EbJDԍ#N*a[D tE[En3EE.ʡEmD:$`` x;L`IEGEEEѴEV"E[x-E~E ErE2E&NEhpBOŜ%nYfD>FE_IE4EEOzE/Dx*ߌDPENE4F`EEDt֐)Œ:=CZGjEJ2EUEEEE(k "$>EjEϊEME߸E-E@]aXb5ěEE2'EݢE E~YEWChŮ&0D#MEEzErEoEr)WD[+*oDEzEKEfhEFOED&ļ'-C;`E}uEW6EEEba EtIģų`<~4E4nEhEEkE 7Ek)o!BWFE^ӨEWEfEE8cECį)œT#DEEF7E RE~D)&>+ŞĐ|ED"EEEEEGvD*4[SfDuExEExEU|EYDl7% *@IEnEE EXE/!E 1lyГEͲEv,EEliEV-MEB} Ť%J4rDEEHE[=E\xEU(DnyN*VOħDEFESEFEjEADǵĿ~)CkkEE^EEĐEDop@#zJŤM?E2EjE.EyPE*EǞÞ_j4E>ӭE[3EqvE>EEbWE*TECŜ'SsDm]E\ EE]CEEġQD]n+Ŋ]UrD'̅EϗEqFs+EE}D~*őTăCZE9EEEǹE7E* r"&f=#DVE,"E%F?EElhD%Ų h`1EwE~EELEʂ`E|ELޥE]0ESEZ'EńEDwĽ*~ĴC*#XEE$EQKE1E :E M^&ӾDjE)jErFGE2EDDP$łhb.E5[EOE+EE¸cE@Cfڭ*Ŭi[D+~E`zEEE]EeE-lHğEꏤEgE_ECEqEjD#3)TGCOUEEjEpE4E+=EZC{ &Ą'D}E?E FioEѧED'#9~Ŏâ+EZ=E6EwEE}ufE*DG*Ŗ āPDn{EldE_E|E+EUfEn9JQZIE;+EEHtE.EwE0DFĬh)PŊcC%REFEEjEV`E@E€ n'ł)İDHEyEF'EDE˃ T#oŅ(E>ճE-eEEN2E@iEP DrĽ*@tRFD=xEEE>BEUEDmE. 4Yy DUEPEEEE5D3{.h)4CtOEKEEEEBEA''ŖĆD;EEAE3E/EDFh"Ŗmj%EܲEqE)E)EflE$qDP\ +h(:DuE^E E EǮE E"1Ń1 cDZE`EEEEmDN(ŘKCl]LEpEE bEEXFE4Bz0W(ŝ绦DEqEy FEEODnvĴ$"E #EXoEAEEPEnEf"DĶ*U,`0DrEE|EEƯEhOE5.!JkkDkdEEnEܴEEHED0(`BIExEEEEdHEBqk(}RЈDBE/EEEОE2D nĞ-!%%8ENEwEEErE| ,DĜ+B6ı%DoE xEoEE:E!E$S ޢ!ŪtĹDvEmEEJEEkDx,(ŶAŲsBUFEjEXE!EE.KEcCo(˳D֫E>=EXE)EIEUDeM ŒŜo EEJEE>E+tE m7DR*FDD*mEgE EEQE$E XŐ^"}DEFEPE'EjEDĊ'hA-CEE&EbERE|NE@*Cm6,)I D$cE:E-EEcED:]ŶWEnEnEZEľDElE4EߢEƦEr E9Y5Bg8+ĴEʨEErE.)EaEMnD`*,kMC2^E0=EEgEE=WE3ED-MAjŅN%Ů,ĦD9E\TE FEA;E~Dm%Ţ <2ÕA5E"Ex}E]EٛE\EC1O*W tD[E~E EaEE E04*)Kf4IJ EjE6EE> EڂE8yDNpIJ;*OCx[EBEE'EEE"q6Ee%Û6 1%VmDŔEYgEeFEnEQDc0%D\é2E˷E?"EEE_EC'V*dm؋jDрEENE<$E5E)E'E.ŵ<ثEYEMECE|EOEDU2*TC6YEEyEv"EкE39E2 0& Ğ˿D0EfEFVEƗED؍Ķc$a+ŢRöL/EE]E&EEbE:Cm޾*A+^D0EEٻEˌEЦEuE0RłgFEϤE E,EFE⍅EDd)BCUEE{UEEyɻE gE(¸ *'}$ODEE'EEdoEfDVċ9#XS/)EeEQE EAEhEkDĞ*9BHDiyEEBE#EdE/EV ]żS~X8E%SEnEE;ENE Dus;) DCLPEdEEEE(BE`@A'ĘgD8EE FEEDĕ"/TL&EE9EEE3kE Dj*Ă>DAvEEEE>EfE<? `ĬoDCEE޹EE:ىE=DV)Ņ-cCXbMEHEGEEbEDE*Bzś(˸DE4(ENF&E,E6Dy7"PgZ<#EDɱE^EF&EEV+nEtD*/N`3D?~sEEE$7EwE<E7Ő ժhĉ`Df؟E]ExETE e(ŵ^BJEsE EnEEGElB`=(ł DdEEESE&tE?yDqĻP!pů EʰEJEr;gDLEč((OADEEp-Ev=E"EUMECX+(nij&DEE\EETE?D`t KEBE hE EEvE_>D*SĴ+&ĽhD:kEE EENE&EG e"ģDÛEEEQE@EFD(Mp'Ţ~P@AEU3EE~E9EPEVECśs)KyCD^E`EEEEE~*EE~6Jf/EEEnE,EREl_DZ$*лACnbEE+,E uE׶E/Ed} ź|$M'ҧD*E~EFzEUEDNģ"&vE 08EbĺE/EbEEAYEFCwpĀ=*yDGEENEigE_EEa;$"ŰN(E=EN(EEEG߀En]kDħ=*0qCx_EEEP5E&EL2E%ZutX%ѣ>(ĎEgEJ)FeEEN(Dtĭ% )c6E^EEE\bE^[ECM *ŮĆxD2E$$EEMVE;}E Em440b EE 6EEEE} uDx*,|ͺC\E_E{EmELEC5E`-9 %T'DE~EFyEEWDAv'%1FK#!3EYEaEE "E._EC,*ŴĬlDQbEEsEEEޟE )pŻő:Y EEEE E0ED~)ňdJCuYE|EE1ECEo8E< kM R@& DǓEtETFEEkyDĞ$ݝ!uÊ|0EE EE>yEaEC Ġ*J6bDEcEXEԐEZ EE !ķ`Ř>3CĦE~NEE"XEPEEEiDLĚ) PCVEaE|EhEEXA;E I m&0PDpEbEFEȘED%$vJÞ-ETE:8E5EteEddECĂ*?0"WD|E+ECbEN&EQeEE$Lg1oŐKĩEE3E~EEE[D6w)ϸĐyCJTE'E\ETEEh1>E1]f = '+[(DE/`EFEE Dw#^SZn*EӴEr~EELkE~gE]DĘ*žjKD&szEEVEEEcE<ŇUv,EbEEIjE EE"D7ħ/)SC*QE>EةEEŽE)AE y4'FǥDڏE\CE2FaEzEDĘ&#/96'EuWEN2EE'E?jED*ň sBD!wE9AEEEEEnD}t \,DEEEZ4EEGDL"G)&s$C#|NEE6ELeELEjPC8x(ŀgܙDEE~E>EݹEDbj/ Ŧ4Ť.EEE EDEKuE[;DOV+żćDDWlE}EEE(ֲE%E'$VL"3D?E EEEގE&IDGգ'\@}BEEEIEAjEOEjb8CH])ſĆD`EOEھEsE!EDYÚ Ą=E,>E=EiEجEϤxE>GDߣ*RV D8hE,E`E+pEE )E÷HŲp#S0DbE,EFEBYE2fD̽'ş& C@E0EtEE6EBRE4fCF`o)ŘD9E4EWeE EV'E4EmQŪ>_ı E4EWE\|EiE{EPDg*{`D:~fEEEEE:^E+E4Ð4#ŷЈ DwEE5EjEED&l Xy˜u1EjEEEL0E`EC (**bľeDTE֤ErEcEEE$ȇŪ}ְ?Ļ~EإE6E bE3EE܃D/'*( CT"XEE|EAEGE8:E/? K&0DEx{EETECEJBD]:$Ò*.E&bEW-EHEsEdE:pC -*ދĚYD~EQEAEEEEBJ7EbEתE0EnEKE$D4Au)UCTEE0.E EAEj=Er0$ ~'P͠oxDEHYEFlE$ϙEDYfF#ŹŔn&+E EVEIEBEswfEDP-*Ć:PD{ {E EE/E&E%E:ENQE3E+EtEEΨERD)9|\C1RExEEb|EE EIREcD\ݴ(K CCLEXE EYEĿEgEEEBdňP(ŒO&}DqEE FE²EDu+"œ|"EM>E^8E=E FE8oE<}#D5Ĩ*Ų~J0DCrEE EuExܯE&EBW&!KkDZVE0EEEЋECDWz(ųŢ`BqIEEEӒEEtHE\UBt[ű](lĔhDڋE3EƶEEEUDnĜ!ůbHETEWEźEf$E2½E}aEEcGEZQEp3SCŜe)7ȻkPD`EVE>EEzE%E]Sģ?EߝE«E;E*KEEbETC<*]D~EEiEaEߋE_EC FQETE\EWEEED*Č) QCUEEqEEESE`E@E_E-5E:4?ED\vEEEoEA8EE~ ŴU !`GDEE0E)EED$.+DO$kExEEsETEH&E%&PŲ"ţہńDEEEUEOEJDĭx'žŠfAEQ0E:uEbEE6PE`GCty)Jʹ{DVEޏEEHE(EeE^Vqb0<ĭ EͬE EEEDyEJDdC{*ڝĄDhE8ED[E`EqEk#*E31#rʅľADEEFJ EEJD"F' HS‚>Er˼EDEE+E)cSEրuC[Zp)FČDBƆEENQETEZE EzNsgz."EE%EE3E |ErTDR*;CReEΐEkEEѵE9,EØ"S#ŵDlD;E~9E(E2EE4D7"{&ń >j;EXٻEzEݩEBEVE5ClĄ)ſ҆DEE`EE4EEDG dEFEEpEE~E>"aDĵ*ט*CIbExEEE`E/E ~'$ksDXENIEAFE}ED4I&w. ż8EpE0EEBEBYEkC*8;DENEr&EE^E: EH<@))hE5EHEEE EOjDTL`*ĐCq_EjE˔E|$EE 2E>DUSŤT%>2DkE_ES!F*EƔEE!E?End!#FřCCsE\EErE8EeEӅDD*űļCWEEEnuEE:;EdϷ…J v&bԄD5E&EXF$EE4_DƊ $'#׍ %-EEEWcENE&eEC~*IVDr|E+E:EkEDMEEaE?EEEDd)AwCISESGEE`$EEp>E$:lŒ U''oD EREFEzMEDĈv#ŤŻDq*E領EE vE#EєgEDĴ*pKDm zE E 0E$E͞EEޞx <XU8EEHEEsE4%EADǺZu)W8OCPE~EEyEbEQAEnny'ŊXD4ErXEPFEMEKlDxi#"[f"'EVkE^ECEENjED>Q%*&TĢ'ADAwEEEEElEJB_\! `Z^6DpE+EEfvE_EDN@):Ŏ'CZNECEɒEEgEDEmTA;Ś'6]tDE EEZEԜE7?D;|8"Ő29e$EREYE+9E$EmETDl$Ĵ*6&`5DtEFEE6E5GEfE-Kt ugvD5ER@E EnvEъECD$(;^dBx&KEE/EE$EP GEc}B1("ɭĚgDlEcE FbE:E5wD'+rĤ!j 6!EưEnEOEEpEr'D Qf*Ŭ+,D1qE0EbtE\E@EY EŴy!nDϞE&REFyEFERDv(HߢB.HExE;EExEIE *B y(R=Dw[EEHEEgEDk" ŁR5LEܯEERE=E5YsEo0D\[ij+)İ D@nEEVbEEDZE#Esէv!3xDOEEEp7E~mER7DZ (Ÿ>yCŸ?)?ĺۓD>EEE6UEE~DEYĸa) E-EcE1EExEHGD*b*ž D[hEDEûEaAE!E/)E"@m1#gīDښE: EF0EHaEDGĿ@'j> >$R?EDEBEsEEREbC ŗW)GHKDPE EZE EpE EE\wPz:~E4EWE_EE{EQD*v13C'AfEE6E E~SE+E%6qŔ#łڈĆDWEUyEFEED;4&ŀ ńK{)CWE0EqEWEWE~:EmŽv N&XDEWEFEEE1DGK$6wX.EIE ErOE6ElcEYCd*hľZD4}EUEEWEEE]ėAOUIEuEEMuEIE ED涿)::ķCTEE)EEd[Ew=EL‰ O('ŻCD}EEE !FXzEԙED;#žn+EڴE9Ek_EJEfEDcx*lPDzEE$EEf8EE'R#R'E 0EEFE\E>EBDR)eDXC"RE=EuE@E Er1@E$}9 D'w<<DHEEE6tE.E%Dʃ#ŘŖ$(EEqE!EEiEk DV=R*şlľzCDBxEOE;EE|ExENĦVjxJ\ĜDE8ElEPEE XDNĬ(ňh2COEoEgZEEIEdCE@v'ӫDŽEE+FEEcD-}L"5Ŵ%EPrE&EE*ůD#D!oEKEcE|EKEb"EDs!hvlDʝEEEEB*EDĎ(m;bBCFExE+EKE)CŊ)5BDEnE Eŷr%XcDEDE^"F*EQmEPD)5%§ v:B5E׸EڗECEEG]EC&)*s~tD3 EڵEE EEL E08tu4 EwENE/EEEyDz\*Ű9C[EIE'QEE\ҹE%6E ; u%:9DiEE EBEHEDu$S23]p1EE=EEpE Q`E_Cz*v<hDy܀EfEEqEEE>%Ų>IJEEEE6EK>ETD. *yĚxC}VXEELElnE詺E8:EV &Ŧ 3DX*E"EI(FpCEM4EFD<$jnHÌ/E4E#EEE cE@(Cl&Č>*hL3]D~E>ELEEBEEخĢ. ŴGElEyEnE EsED:)rCVEE}EEN#E\De!+R0D]sE EQEEEϝEGb_Ŗg 9kD EVEEEkEbDNĺ(\BIEEE̳EvEoHE2-Bx1(ݮ}DhE&+EF,EӞEDyoˏ!+GŊ E7kEEZNE#ED4qECG+D)[*Ŏ ('DMpEE@DEEðE!E-C!#rD#\E E5FxbE8EDoĭıt(RvB`GE4E EHE0EJEldBtg(Ş`DyEEbE9EEDNh/z şHòE[EaE EEz_tEE1E1EcE"ESE6vC 3·)~(rD߭EETEVQEl֣E*ExMmL@QĿEEHELEE|EnUD*ŏ9đC:eEi^EhEEԵEq-E6َâ[$xLD=͘E.ECFE0E$?Dh֞ĸ&}, HDZc];EʻEEWEEHVEC8<*=`@DwEEVtEWEWEaE?DĴņ6!N%E/D`DēD%Ň 1.5ESE nE*EX3E2\EmCsii*WĎvDEJEE- EاE E!2(f2Ē; EELTEEvEEhuwDMq4*+ClCf\EcEAE+E{BE6Ey-d %2věDEEqFb_EZEmDVA%hS 2E/E&EE|EUB_EHCW*Ė~kD~7EEE=EEEk5E,)J m;Ĩj E|tEbE EEE$DLĶ)8xCYETEEBEfEEļ %M%EDE\Ep{EEE DR)ĦyCzSE#6EE>EwE^>Et]w UL'šC3޴DuEEd FEkhE(DĤ#ʼn'n*EhE]EqExEgEDğ*1ĬKDyEE3EE{EEN&6Hk$UyE[EYEEwE9IEHPD ()p^OJCQEE.EPmEE7AEҸXz'ŘD.bEeEPEErE5Dh~"ŵ:'E_EEErE kE eD$4+F?Do wEE0#EDo*V`iD@kE E1EEZE&EU}H"Ű+DEEFPE>EDƧg'ŬiBESE|EcEEOEЦ>C!E(ņĜIDКEv EMLEZyE85EDxYĭŒUŪv EQ_EENEE0yEFDd*ĔC D\2iEE*EbEHBE(EãdŲ#DDbEEFE#E6D}r'b ŌS?EE,EGEYE$ SE`fCTŁ)?pDSIETEߕEE$EvE/KO11EEET{EEFEEøDtĒ&l V̞*d+CibEEuEA\E1Eg//EUô<^$8DEE FE6EqξDH&8 W 9EEIEE EXE/CZ<ē)]IĴDpE!EGE EE=E=bC'b&k%E8yE:EE0EˣEVqhD¹*\eCZd`E\EEEE1EY*.%$DmE&EFSE:hE5D&k 3C6E2ιEKE4EE[E Ctz3*$fxDE1EEEEEZ EH6]ŔK>1v) E6E EܟEE=E$rDać:*ŐpOC#]EVEHEEָE#5EN9 Ş%ܔD|uEE9(FjELEDa%`IÈ4EaEpE_E9E<^EK0Cb2*pD4EZEEJE5}EnE`,IL7Ě EhE$EB@E*YE-E~DdHU*hCZEOE!8E}EBIE7EZ %ŸaD9E:9EE*+EX!ED2 g$şo{m0ExEE-EE~kaECN*&+dDWEGEE.LE-EE!d@wŚ BYEnE/E5EE?EIeD)lQqCxMWE&E|EOExE0;E# Ś&>DEZ>E_$FEEDЕ$L1Twë-E,EeEEBTEa#EEEEIEB&(nbDM؋EEEuE*KEDZlĂM!QE}EnEgrElE>rEWq/D*yGĆ#DBIoE`EI;E1E=E1"EcÔ!ńXuD0ɝEE FE`EDp>M(F0OB/FE ٿE^bE1EtKE!LE$ C0({D`lEEEmE=rEz.DVdu= ŘbEAݮE EWE]ERbuEH8D*ŽqOjDlE>EEEE6%EX /Ţ"~֙DmE4EF1EEE5?D8&'ŐXrAPCEǎE^E2El#E(%OE5CrU)ŀ IDوE@EEEʡEk8Dx[j.HEE.JEE2OEVxENDD`*Ŭ @ D"iEOE EE\Eq(ExMѣł"4 Dl0E[E^EE5 E D|'^ Řsɑ@EE, E 'E{E1QEZCA)H1D‡EE3EEEeEP*GŮWEEkE\EOE4zE,$QD<*ŌҰDVfEREPELE1EEpEk 7E2Æ T%űĚ%DSEeEFEΖEMD:C%CU`ò1E#ǷEEE$Er`EJ1Cv*L3fDڵEEEGEE<Eu!&^?ČXE,EhiEEhCEfEE߂DI;Ĩ)MxCeXEEEEawEEo9E_Ɗ n&i Ğ\D.EvHE$F/EED1D$Hf~B7/E]HEE EREncE }#E[EEYE ESnE DhD+G2D}9sEpEEDcE@EgEL{ñRŮ&!KiDBEE~EElENDޱ(ӈ` B}IEuEE EE+HEuBşE(=DMEREE7EnEwzDp?!ŧ/b EE E8E:8ErE+D C**b 'D2pEE$IENEEL!E!ńrVD7IEE FEތERfD͌h(!Ŵ4}BYCGE EEiEEg#KEB Kg(ŵ9DE(xEԪE6E EDsgg t˂v;ETEEEEwtEϜ5Do-5+ňĖDmE~EDE:EE[E}$E?ŧ"r|LLDϜEyEqEɦE~,ELDp1'zADE4EE`EkEiBNEP"CfM)ŷ ƖD靉Ez0EEEoErEDA\~ ϗŬOE7ExEE/EvEtBD 1*ĻiD6jE0EE%E*E*'EP#Z@D]EE\F5 EDED[Ĭ',ň'AEpEEE%;E#QE NC(.ıDE5EHEhE)EuEVĠ/ņ\EgEzE.JEE&zE JDaH*BZ<D$hEAYEƒEEE()Eßtœ#ŪĶ}DE!EdFXEͧE"DغzV'6@ ==>EEEREETE vCq)YęDVEEyE+ELEiEsBLsŲYcRExE1EU^EE|EWD&a*ɱĔC5dE{E7E}&E<ϵEf-E09Ś$ܳEL#A‘T ł|'VDPАEE#FEv)EZDۄ#RT`(þE*E'+E^E-EwEgED:-*SJDyE| EoEEܬEE_ $F`8GVbQEE_EEUE%NEDO&q)EyŪLFCPEEEzE'EAED g'0ZhDREXE-EEE0Dgˁ"^߷Þ'EbEĽEJEAEhjEqDl+-Wx;?DwEҽE"ETrE*EE}Ħ Ţ_~D\ElEEEE35Dą)T$C0eMEQEMTE)EqEdDEA:5F(ŷǨDEsUE4F'E\2EDz`b"Š@@$E&ELEE^E|mE[DLP|*VDR4DOtEEAmErFEB[EE&7 +h+pDlENEEarEEsDV(lp\BJKE@lEVE/{EqE|GEƻB@|(zľĤDtEEEKEEqDr!oa EfȰEE~EjE@qEc(DĬ%+š&(DpE0EE[E İE' EGöV Ū"q/DtEEEoÈE΢D$z'ŰH?B0GEE<}EDE\EJE@1BsŸ(đD6KE~EE7E濟E DCi ť+smEEbAEsEaEMsE+3D|ļ*ũZhsDQnEE2EYEE#ERiE/"x^D`4EEFsE@ڍExuD?ě#(}Ř1B.DExE,E`=EEPMEC\Ŋ(Ōѵ-AD0EnEǦEnE?E-DGa "jİE[EEEEsvEC^)[DEE&EnE$ĤEEPgGŀ>ďEE!EmEsE~Er=]D@R*Ų(C&cEjE(+EdEŶE/ELt*{$De}DЗEWE FzE EDfb&& Ř6 A9ELκEd9EEEYEnDC(ė7*{ DME ENVEH0EIEE>=KT*'ĜE VE ;EOEEvրEbiD&*źF.C`EEuEEE&2Ecs>j%ĠDӂE\sEF@EED!&i &yo6EyEШEP EEdA[EnC6*.U2yDȂEQEvE#E+Erm Eto5()`0Ģ EڧE[EEbE/EhsD_*"C\E(ExMEBKEWED4E9&ƺ%$Dn7E;EEIEEDXw%\s6Q$3Ey\E E$XE#Eo^ECpCذyu*8 mD;pE EQEEEJ Eԋ,(X`+ń~:x ESElE"EEHbE ~D04*$oڨC$2ZE+EqEEE7E# u &"ʙČDEE! FE ElD!h<%Ųxmo/E9EجE~EE3aETC7*Ě`Dd E!EEA EoE'Eq$t=DEqEEEEE#DdĒ)S+~CMWE8E0EERVEu:E[ ' DE-E/FmE٘E? D'}/$ũ6ŧK.EEa{Em/EEddEp C_K*p$uZDF_}E$yEuEOE`8EE׿IJ4|(jIIE^mE`cEEeEEDmԚ)QuĈCTE eEnEEӼE=EH[fn Ŋz&g3DIGEEFEEDD Ġ#8`_"+E EeEtEiEgE!D}ڦ*UND{E.EME E>EE ~y ŗ1SijE,EE@EcEǾERjDNĤ?)J Zt_CQEfEE6E=EMAEx+Wg'4PDEE,FCEED4#*ťDè(EϳEiE;E0EdjE,D#<*sBDexEEE{EE\E`+!Z\ğDE1E.ExE%iErD>O(mŐ.0CwJOE-EҎE"EEhCE A[ r'6qDⅎEϙE^"FoE wED{n"nz[%EhOEEYEFECmE<^D[*e:w9DtE*~EEEEBEc e\DEEerE-D`3*ŻSįn!DxnECEE'EPEtw"E{yl"ŞwĻGDpE^EEE7ENDR(\:B!FE]EIEEd+EKE4C|0P)L4šDERE?Eh`Eq2EADdĶ ŀH֙QEESEEwEuE99D-ďP+qCD lE!E2En-EE%Et\<3?"ƢD.JEEEEE6D8ԩĨw'tQL?dBEE|XEEZUE6NE)Cz )yHDEEE[Ej3EGDcYpɋb(ĴEETjEEE6NxEFD[Ġw*Y%DJiE[EE5}EݳE)ER#ŭrD"*EXEA)FESEoNDNE'Ųx/c@E$E|EE[EQRE$VcC7)ͻįDmEeEEEBEBGEQm\ń1EnEhE&tEЋE.{EODRw*} UDWgE9EREEhIEw+Ew)Ÿ#žĪXDљE҂E'FNEFoEfqD &@ (~=EkOEEƒEE7YUE[C3)]DpE{EFEzEzELE2H$O;gE.6E_$EŎEzE~Eb[D|<*C"dEEE>EQEE.E{@n#.Sĥ_DEFEFEE*D ;%V Q¬:E\E^?Ez E4EWEt=Cʨ9 *OWDE"EEjEEEo=JMŤ"ĜOEEE E]jE`]EhDwAĐ*h#IC`ECE EE`\E2E[be}%O9DFEۤEF{E E@DMĠd&Œ r7EEEEE:pZEr]Cn4*uϩ|D$E3gEE8E٦E~ E9ĕyň-| EXwEtREE EE oDQī*Gī5C, ^E`EE!EĢE03E(@=-%Ũ-`DucEEENE:EDss%bf<ø4EøEa;EbzEE]E*CڵĆ*ŪpČ pDEMEZEx*EXE@ Ep/i<E8b E EEENEEzDuĂ *dĜ@CZEEExEEE6E#ú P&*DaEYEFֲEfԖE[DfxF%3oiE1E#QEE,EXE#_Ey_C *IJgDJE OEAE;E)E_zE,%Ć;żŔ>FE$Eq>ECEHEEbDķ*OjC֯WEErEEvE:EJ´S |B&BޜoDJEESEEp7ED:G$sŐA.EfE:EE%EKcENCĬ*VZD~E*UE&4EE,$EtEdQĭ$jVG`EEZE{ETSEED)ŻxCUE#E3E E>ExF=EZBO ş&&ŸĘDEE F|EE|D!#tZ`+EqEEkEW E8fED{*G+ļeQD|{EġE>|E,E;LEDyEyh.f]UQ*EiEE}EMLEERĎD7E )ŪgCRE]EEE9xE?E>ɱŤN'ņ̣ıD|_Eh}EE-EElXDxkĊ(Ű 0ZB`IEZETEtEE%HEƫBX(iQDE E?E)mEሞEtDto!ŭE2E7wEBE8EqE>+DUT+ņ@u$DWoEvsE\ExEE!Eh+vΰ!F uĬDREE2E E،E~{DZ?K(ŠYŗ\BUFEEG'EEEOKEB((DBE4E;EEE\DҾf^ g%šALEEE EEosE%6D ē]+2:`!DmEZ2E7E`wEE4$Euß}Ū"T|UDAfEEE3ECE 'EѪDen([q ~A9CEEE@E*EzNE_#C9>31)H8EKwE?DG@* \DIcjEtE(\E%EE\'Eb "ŀʁĉ5DLE7xE&FxxEՏED ąg'Abx2AEt˽EEyEyQEbQEXC8)ŧźߑDdEźEPEEʢE|E`TS c BpE߬EE|EoEzE5MD (*Ź&~DgEEEEE*EÈŪ#END0EEHEE EglDĢ{&ł UŸh>EE ErEUEqTEܺzC܅)5NjD݆EjEEcfE=EEmIćB N.s/E%IE_EEVE|EYD*BĠC dEfEXEiElƵEe.E*Ş$Ņ`1D3EE^6FEED&|  m;EЫEdEpEE^WECĈ&)+HDX^E`EBEAEhEEHCĥ6:j!EtE`EEAEEmaD4*E%En R 2NyVĞEduEEBEE AEeD\7)OC$PE EEE ENBEA#'Ű\$DyLEcET'FEEHhDN$"Ŕf5&EdE)EREEkEDVJ*ŴĄf>D$wE"EEěEIsE vE2ģ9v`ĻgDaEHEEEEeDyJz(R+ C ,NEEGEWYEERDE-B{(ڠRED\EI%Eh!FԱEEvDmwą;"Hťy$E űELE{oEEnE Dĕ+E6D0wsE#ElE)EgE[E`ŵ:!ŘhD0DMƟEEBElOEk EBDS )dyBԙJEcEjEFEfE^GEθB|(an(*7DQdEznELE3ErJE`}Ds!ŁňOÙ EE:pE6|EEpE'DRĺY+;^(D qE2EJEE]E EHêb!8brĸkD5/EEEFETE8EBNDĒ(x$B.GEyE*\E+E;EJEB)4CD*"EefEEE џE;D>je=!Q*ŎSoEo_E88E,LEEXvsE'2Dy*Ÿ DwmEEoE[E~ƱE#E66$@"ŧB{.D@EEF(EFɍEED؁](ipŰA~EEEE ;EEBLEC0h't)PԶDtEJEE@EEDt=a# ŗVE[EoEEv_EvEA=DٲĞb+8DjEEtE\bE#E&EAÙ">DWћEjEhE9#E1;EĭDzW'dnAEREN=EHEYE(PEf8C}Pi)M7ĂʑDE{EE0hEE4EV83 ] <EE"E<;EE@]yE JDn*.zwp D)hEEE!E+SE*EGj2=#\ąDE "E$FEːEDĈ'1 #C2?E;E>]E(EpEqSE:qCEIl;)ū?D?4E"E(qEEnEnEE"|E|TD8aĎB*CeEExME0EED,EݑÑf#<'NDdE#EC1FEEZ\Ea\EE4E2Ŕ%K@D EEEREEVDe“Ħ%ŊJ%2E>EaEEE<^EXCȠ*Ŵ"ClD(GEzEyEnoEѨEDmE83,ėF;Ps EhEEEE?EtD'9(*TrCYEoEE`cDγETE{EwEEqE,!YBEE EuQEN2E; EpDTcu*ϑĎCgvVE`EE1ETE;;EoI &&~)\DqES/EěVDW]}EE EE!EEk. /ŌJE WU &SĨ DEQEFE#ED덆ğj#,řÖ*EEREԴE:oEgED(*ųCdLDzERCExE"E ԬEJE,lňźTEEE sEE E DĚ(ŰIŜWC©QEH{E*EEEQ"AEX+ {'Ų@D E ME,FEEDd`("ŁŰn(ElEZEEΞE(jEϒD|*4׷DDsQwE`gE#EEEE$e6<ŀVZ>:DHEEE&EEʖDVI )c(CNE?EE˴ECE\0DEHA'UADEEEEED?}Ħ!ŋB%EREME\EE/[mED_2*8DH~uEEE!E9EE/hS :+enDE6QEVExEDzEvHD.(&xiCvKEE}REEпEkGE B6X(IĴD ӌE_uE&EEE"}D\t"X Mô!EvE,E1E|EoE$Dp>ĵ*Rs+DRqE#EGEEEE*Y̍!otDݞEGEEEEElmDKҸ(Ŝ`BHEEE&E$+EIEBF(wDs{EEqEE EDUlĢj!dh|/EPEPEtE:EϤrEU/DW+qn DrnE#E|?EEbE="Eo×&"^w'DEخEEE_iE D%Đ=(őBEEΨEEEPE\ZLECŭ(3|D/EuEmEPwE1EDc 5 |6:0EuEcE E]wEuE9D[zl+RD-lEE EEzEw%EվN ő #  D֛EEFEEwE4Dm B(Av BEqEܒDȈE$EgENEE$D\Ũ ĪErbE,&EEER_xEjCDGQěl*Ō"" DeNiE'E9-EWEjEF(E{"t?D8E$E+FIEm[E{D8e_G'j@EZEFEEEġDEE+9FEE+DJ\& &h É7Eo¹Eq*E2fEEVM[E|CĬE*^}DEEtE?EE E7Ē_.q: EOEsEEAEVƁEqpD[,*ŅlL,C]EܼEB[E0EE<04EDIS%wĖDqE3E]EEڀEY]DĒ|%Ņ|jB#4E E7E1wEE#{]EoC*UxpD؁E ExE~yE[4EC[ EL-bŨ7 E¦EhEjEM4E E|Dx*sĖC"GZE~E~EEEe7Eá= Ŭ>&WWD5EEFEE+DwBQ%ŁņpO1ErEEfE: E`EC~L*|rľTeDpaEuEjCEUEE@E:&n~gAzEEgEIEl0EЋED6%Ĭw*iď|CDXE^IE*ELEE 9El &Df{E\EN FEE_DTЌĪ$ųj-E EDENʈE{7DD6)v?COEZEvE^E!E~=CE|MA|'dZNDuEEFEeE?D~q"ń#(n;%E&E E1 E3E:lED9Āw*Ť9D8vEоE~E EEEģŨ;dĚ&DߠEdEEIEltEљDoĔ8(źňCJ MEׇE E\EEEEMBśB("+DEE#FEᘝED޵sĠ!oŤ)ò#EBEinEEp5EnEeR%DC6 +o2DRrEEE@EܛEE.Ps!kDRE|ERE/EzED뢱Ĝ(yziBIEEhEZEEPjHE B}m(Ł D{EN&E'EE^E>D,p+!Ŗ-àE#LE*EݗEEּqE*DĄY+Č#DoE "EdEEkE!EPMd|"uNDE EHEEE*D -(h{BFEHE7EEۛEKE.BJG)·˫D͌E EE%EKErDgW!|ɹEE1EY]E>EtEb6D< *†,DXlEEEEBE$Ex"~DÜEEEENEzDM!\(ŭ{A2DEEwEjEE ME,Csq)\쌖DENEEE)ESDqT]ĥU d" /*E6EREEZEwEkBDhoĶd+,SU?DiEkEEzE܊Ef'Eڶìs"=DVEEEzWEΏEDĩG'pO,@Em߽E"EtEeCE=IQESFCw#R)ŻDYEEEEEXTEn S lšğE2EErhE\EyzENDyb*~zYDgEgEݵE@EѴE_+E 24 r#7DEE"Fb[E?EDQ>&, 05Z=EsҼE!E]EeETEtCl[c)oĚDEEEIaELaEz^E}EצE E=6ī``j)ĢZEE EEqMECE?iqD|K}*Ŵ"'Cr^EWEEˁEkEb:4EhBÌhł%S6DEERFyE_5EٔD & ':t5EZE͐EEE\EYܻCRk@*sD$EEE iEΧE E2ňL5ăg E|EEETEςEvDDې*:zC[EE$EEE5Eu&$| &&D|tEXEFE_4E7Dt%2C|ZÛ1E๷EEEIE}_EiCĆ*7 thDEcEEE/6EE^(IJ|k>>E2&EtEXEE7EDb)ňLCXEEjEEEP+9E2[é g&6yĐD`SEXuEEdEӗEPDҏ$šTÓ/EEV4E E|EbECC++_D~E^bEE$E5+E!`EvĊXYEfEETE_[EECyE.Dĥ_*š C>UEE=EuEऻEuMb"EޣEKEEeE0E=tD) pCLSE EfEBE8EG2?EbMz 2&)D5E@E2F-EXE|/D<&#Ř Y)EꌴE#|EEFE iE DL*ųLĪHDFyEEqE/EYE9E I0_WhErEשErEdEE5Dtܜ(KGCPEEEBEUEIBE`G'Ũզu߮DCEE)FE EݐDLnШ"( âd'EAEUER E; EBkEbjDy>u*zT@DMvEHEEEEErw35 !p]TD#EEFvE|$E8 D6 )^ŔqCwMEFEIEELE;bEE'HĦD EEE:EkE Dcz^!3Ŝ1$Eu?E!Ep`EEb~nEXDn*x$:4D$htEjEEkEEMEîŠ ňh4DEkE FfEE*,D:;(ŇuBJEyE<3EEDEYHE0iBŠ(4DVDE3EPEOEtE\D>rĦ!ŮxņL E$EE@E,EpET(DH+&DpEyE>EbE̡E Eêl"!Ť^sĻDSEEE[EnEDH֮xu(9ŴPBGERE3DEEEEEE'E,\EC6Ąl*]ĔG{DEZEE@EeE( E4._ŭ31 E`E +EiEϋEeExtDE&*n?ā۷C\ESEKEYLE1E:E5EA5$ %`D0E`EE`EE\D9Ķ3%žtQk3EBKEENE/E^ECеĤ*0]]lDi]EEEbEҼEZGE)ĺŚo;Į E:EܭEfE^EED*n*ٷ6C%YE!_EEEE8E { ҈& ٿDȧEEF1EEoDĸ-%Ce>Eã0EE:EawEoEԟaECgyN*1h`DEx%E/EސEU EaEB#0 EĈEvlEEQEEEȌDĐA*KC6WEEE.EzEÀ:ECq ,' sDEyE FEYED$ŝ2Ȋ,EcEEIEQEdECng7+Ŋ]`$UDz|EZEֈEEoEFEEMđAE EFmEEREE D+ĮK)ŀ3nCTE_EEEE>E'K· ť&şzD76E[FEc#FEZEODÅb#3*E}ƴEEEEDĂs ťT2ğEZEEFEE]kDvĊO pu0EzE]EEEE5D/yC .v,ĒEE,nE FNcEVEDN|{} i)pmEE]EFpEE}DOU}Đ GŪ](TEʢEE E\EjEDUć!5w6A%u E;+E5EEIE EXDʁs!t[w! EڹEd.E^F ME̔EBD=~t![ţ~ EEwExF+E"PE(D>˃Ć!|Šķ E6GEEEE&ȓE~XD}ĕ!ŰvqͲ EȤEEE ErE>DL!x$ſi EGEPEFIE3E?DPqļf"ZAkE2zEtE#EDEE D(l"Ős'wEYӥE E?E6E7E*~Dsh"ťYEhEjEE EE4D23Ă"Ōr EEEEX`EFEDkā!#tŤD 1EE[XEEGE8E.D(#j8ħErEiE&EEE^Dh1āG#DvE Ea}EEK|EaEzDČ#E6ğEK)EEΊEsEʏE(JDԙą#hYxEM{E$EE0EcED$Ϩ#&:Ed EEEܴE%EGUDP$ ŲWE]E8^EE:EzEعDB^$JSO#EEEVEoEE1ƸD D$>%%ÇEEnE{EEڍED^$XŰo~EfE_EEJEpE{DvZ$PHŀ<EŪEQE'IE_EE~zDX$~;EsErE:EQEEnٱD:j$Šŵ EرEJEilEEIEDĞ<%q3 EExEMEE\ˋE D5LĔ{%×-ED.EV)E EE @E&Dn`%<*pEE3EZ.E7E^EDĽ%1ł_%E/EiEEGEE/E]ܨD9H%Ś EcE#EEEVEݼDKD%ų)$B!EnE`EEmEEW/D ĸ%A EÄ""E*HEEEEnhEqD@QN&Ń'ň֢2!#EEEE~EE&iDlՈ&ŘIÖ<$EƮEEE2EA^E$=D'ġn&ӗm $EAEEE1E<E/=D &(?n%E}ƯErEEELJEDDxɨY& Û&ESEETEEj*EDO#&bd :Ä'EKE`4EqEnE=ȆEyD:&I ~*5(E+߰E%EʳEE.EY?Dj@'Z îtô!)E(*EgEEEwE迖D/mz'V9 mAklL*EPEEUEE^|E揕Dr"L'Ũ Ŵ@\%*EԱEHEmE?E7E Dz' Ŕ>P7+EQEcEz|EjE EőD&Ď'' BH×,EEP;E-EE=JEsD 7' Ÿ<ä-E{ӲEuEvEE@E!ߎD3.'² ŋ,:.EcEdECEE㙃ED4(Ţ+ 7#k1/EEԞE#EEEDiM6H(R w9c0EEEEEEDfė(j &@ 0EWE EbE (;ۦV6E2_E5EUE EJEb}Dğ(.ŀ`|7EFضEf:EsE_0E~E8yDX(ŝż,g7E[E=EX{EE.~EuD>O)%4 8EሷEpE-ENE|EҸrDzt3);Ōl9E˷E[E9E`pE|EoD) dHY:EB`EE=EtEl{EqkD{Lm)7@Q;EmEE" EExzE6hhDUҞ)x@JAnfDjq)$Ű AB=EWOEP_EEExE?8bD*)&#B=E=ӹE]E(EdE1xEP-^D) XBB>EE8EkEEjwE[D81)XŘsBh?ECEE }EWE+vEXDk)ŌQBB`@ENҺErEEeEuETD$)$QB2RAE}"E EvE•EtEdQD '*uP.BvBEFE"mE-E)tEPsE>mOD)p1)$IſB )CE»E8qEBE1ErElwKDi_*łBCE=EmEEEEzOrEGDsO*((Ť.CDEGjEEE7}E#qE\ED2Fl:**CEE購EhEdE3E>pElCBDO *iġ!ClFE.@EE8EAEtoE>D/ĊW*_ȡ,CTRGEEEEqEnE:DZ*Ŧ5CHEE(wEEhMEmE`8DK* DC IE'EyEEpE?mEf4DV*>ySCIE~EuEBE fEdlE1D $*ųOF\CVJEw;E@EKESE3kE.DGqī*ŢlgCbKEEEV#E EXjE?+DEdEE[dE?D)*Z$ĠvCbwREE6EυEEDEcE1D*<ĀJCSSEJE EWEOEKbEED+$C{TE)fEDbEEcEaE Dy*TweC/UEEcEEeEaEesD~\*n&CUEWEb]E|EtE~`E#oD[+XTCVEBEEE E#C_E%DFĦ*PCzWE=EEEEj^E|CW*"HCpXEFEE5E EN]E7CA*ĉ^C^bYE>EEHEE!\ECepġ+u3CZEE @Ev=E@E[EZC4 *ĐkC%[E(E ?E<>Ex'E|([EjCĖ*ŕ$C[E>E5ECEEZEC[]+&XC^\EEtErEEYRYECį*Tħ+Cz]EE{EdEBPEqXECnĤ*ʼnM(#CZ^^EEEE9EWECCMN*=DLS_EEE,EzE0VE C2+uD|`EEE]EPEpUECBĎ*;DD!aEgEEfEE&UE_C r*JZu DoaEEqE$hE3[EcTEC+fDTbE E\E\ EIESSEHVC *#GiD!cEKLEEEEQeREC84*ĴDwndEE8eEpEsEQE68Cо*TX#D@beEEGEE-+EPEC/;*<DmfE`;EEeEE5OE2zCĠ*ŃuĮDxgEE>E@pEE<#OEIeCvc*qg"DgEEEpE E{NE8C?Ċ*ňĎ$D(hEMEH#E EEzaMEC D*Űm'DiEEjZEE E[LEDwCfeĤh*Ÿ ,DI^jE E*E{E EKEfC<*V\.D9CkEGPEdDEEtʾEqJEIZCwpͭ*PW1D@qlEfEEMuEEIEnSCh*0yr5DmEEE+|EE~ IE@ECA* 8DdmEbXEEuE䯽EyHE5CbĮ*;DnE6uEEE&E%RGED+C7!O*>DoEEgE6ErAE_fFE Cz *ĩ[BD~\pE=EE,EuEEE: C+*ŊYČ ED}#qEEE EaEDECf7P*PGDpOrEENEmE6ECEvBU*YKDrE(EBCEmEE CEk~BOō)QěODmsExEs5EkE$?E[tBEz`B*ŴTQDtEKEVEEEAAEpaB)HTDuEEREE̺EQ@EޙB")ft+ YDp:vE]E~EECE?EioBŻ)ŕ\DgwE&EEE E{E>E@BV)Ī^DDxEEpEeE˹E=E\$BrZ)J@6bDxE!EEXENE =E6A/o)9fDryE2EEXEָEe4E=#mi(vX[DEEE EfSE3E°:(ZDiEE$E:wEE2EZh y΢(yR9DEEvEk EHִE1E_3 D(ٷĦDDME ŝ&BD.ІEEyE0EKE'ErP\ &ŬoiDAEEEEE֭&ES# &kɨ1BDɇEEREqEE%E ?&Đ\DE|1E EE:E$ENðfi&,"oD_E&EE!~E E(:$E$>~&.hDE@EE| EGEX0#E^Hv+2T&M6 DrEEEEn?E7"E˧"%(4DEsEpEE6E!Eßf%ʼn@`ǧDEŶE+EE]E ED8`&ĠĴDᰊE߼EEELE(EhEOCþ>%Ŭ6# ĪDoEKEEVEEEX s(!#ŽMĔDIyEfE6D_E\EF+EEk_Er)" {}>Dp[E:cEF F iE EE,Ćw'? +yfDȒEEEVEHE E)0(F uFkD8EEFE0TEEG2QrĖD¡E%EFDEjE E 5FWũjqND'EcEEEENE8ĨCWŶfozDCREtEFC[EEEQ(;ȇJqLk>DʘE2E!FErޟEdE<ĠFpi^ D%E+EFE\EEŔ?Mѧpg=D{\EEEmElמEE8CĈYSLc hD`EE]FTE矞ED܃E{JmGaqDgEE$F&EME DG")_DE4EFE<EܨDN#K>d]DEpEMFDRRĢŒDqU;2Do(E1EAE,E EDlUW:QĒkD\EbBEF6EߛEGDW]`2OD/E eE&FkhEED(YĒ*9MMĜDZfEEpFjExEjDY]4(zJ DXʝEEF0EED`?$Gr$DZE"E%F-E*[ED2am_#Ű?E1їEWDrIT#4rEEEvF EE#ťiŅED5EE}ElEяE.,D͑6#jDuFEPE#EtEO;EiEKD8#-#/DFA5E"E E^EEED_ľ#,ã?E耩ElgEFE.EE.ǹD Ģ[$CŴD%EEE?VEUpE|ED<7$1ũ"EEEĀEBEٍE靶D~$Ŏ|EUE&EEEE2D/$9DxwE~ͪEfTEAEʕEEZD'2$ŎàE*EE3EVEbE.D$$>_E9EEfxEpEEv@EFD% Ģ6%ď ?EbEEZEEiE D%Ł%>@;NEv!E)E$EEB*EDhʞĮ% Ŵ-F EE80E2E!EED2:%ŃBXêE5EEEFEE柊EDP %vʴÚ EjEUEEE> ED\o%ϞÞ!E>ExE6E*pEDELD*Ę%l"2?"EREEE=EaED 7ĘD&5ɩ?#EzE+E E@E@߈ELDOF&a_èS$EpEbEE'-EoEnuELE?EEDɳ'R +&A.E`dEkEIEE_EkDTl(; "1/E䵳EE EEE DMĶJ(5 é_0EgE EEEEx D)ľ'(f hL Ù0E5XEEE56EBHEDPN(= F1E:޴EE|E EwED'Ҹą(ši2EEzEEE&iEDP)(?/J 3EjEEE(EED>[(\)Ŵ.f4E+E'EE] EEրDʻ(ʦ ©o5E16ExEE8E?E%~D-)7^i6EgE9E VEEHE-|Do(@\l7E߶E3=E:pE)EҬ~E$xDh(*S7Ex`ETEE~yEEV~EuD ^R)ń Ž8E׏EE&ETE|ErDd(6)XŘ[9E-EE E*uE?|EloD6 )glup:E'kE۷E=EEp{EjD||a)@R@o;EEE"EE(]zEgDsR2)NidA E#EEEE{wEl[D,Ě)UrB?EKEEiuEUET'vEXD,oļ)Rŝ̚B}@EܺEEEEuE-TD )ňBpAE+$EEE8EtE&dQDĄ!*LBȌBE_@EoED*2*$ ClWEmEEQE7EJn^ECaē*j?CƓXEKYEEEBE(]E{CĬ*ŨĀC߀YE0EE+EE\ECTS+~ħCZEܦE FEXLEĔE΋[ECYĈ*Ţ*CV-[EExOEZXEEZEC IJ*`ĈJC[EܥE5EnCEEetZELyC` +ŀFPCp\EEEEEBYECMp*,C6]EEE`EIEcXEC,թ*ŚLICև^E$E~E`EEWEd.CP*ŵĈIDq_E0EܽEnE{EVEӱCD+VUD_`EbE!EdEIEUE:!CuĹ*};, DC&aE_E"EiEEUETԹC{b*v: DaEEY$EYE`IETE5NC8+{s.yDbEEEEyE;ETBSE5UCuĿ*qDJcEjLE&ERE0ERREDaC O*,2D rdEEeE"EkEQE/C*2] DbeE#EEE5)E`PE((C Q*E &,DPfE5EE uEEOE5C~*~k0D gEEmEyEsEOEu؍CMڰ*u\6"DgEEEmEEXNECL*òړ$DhEYEx,EEREoME6C,}ċ*Ĝ*'DiEE4FEEPE9rLE.tCF+*Yn++D@jEQE-EE EKEfCޏ*U.DCkEWEeJE(EþE,JE.YCNā*&Ĩm1D7rlEmEEnuENEAIEdCRCi*{s5D`mEEݟEfzEPE IE DC:ľV*lC9DmEVEFEnEEZ~HE5C>;*ĸ;D nEPEE EoE`GE\*CqJ*őf=DoE^EEEXDEkFE`Cj)ҝĔ+BDspEFETEeEEEEC-y*$ĎRED`qE}E~E*EfqE3DEC WE*ŸNP^GDsrEdEIEeE4E_CE>B8>)ņ/pKD<sE2EEE mEEnCELJBoW)ŚRpOD|sE*~E5E(kE>EgBEB*pQDptEESEEEQAEB)TDuEEvEE%кEQ@EMBŸ)fĈXDPvE'gEpEgEJE?EPhBŠ)c,Ĩ;\DAwEEEfE9E>EPf, y(,Uv~DEEEEySEҡ3EOŪ([DqEjE ExEEJ2EӈŎ(jURD8EEEEXʹE1EJº) !S(6ϷYDNE"6EEV EAEs0E\  -(Ŗ)VDEvEEEDųE0Q0E4Xù O(-DEE0EEE?/Er$Q 'štDE:#EhEENE1kEE.EPb0H {' &DE E EREòEȫ-E|< Ŋ'ň!D=REE-E=EZ}E,EI0( V':G֑DE E}EYEcFE+EFP1 %~'oĺۓD8=E @EvEHE#ƱE*EU\2 ņb'ŘhܕDSxEE]EYEAEdE*EkNY }'80ӖD2EEEREvE/)EPvð t%'*D8EEݰE EuذE*(E݀X :&ⳫĠiD܆EEqE +E+REx'E˿mO Ũ&x)DPEEEEE r&Ek &ţ ĎDErEEEE}%E#"L &żD]D_!E9EgEEd:E$E%ÖŒh&ŹļvDfEޱEExEQEZ'$E[؞W&~.Ĕ~DE8E&E EE#E@;& D[tEEhEEDE"Eƽ2ņ% DVE}EVEEvEu!Eo42%s^اD9)EְEEEdEl E0޵f%ݠĵ:DbEE=E TE"EKEz;%&՟rwDXE EDE EEӑEEü%*#6DrKEE E8$EP&E,E3u% đ@DҋEE=REEHEE(è}Ŝ3%!UD|WEEnER EAy%=[!ŏ A8DsE? EEEErzE^(\ }iBDhEVEFS}EE8NEE*Ċ)ť S{?DYEdcEI FiEC EȔE-Ľ~ş> f/yBpDQEbEEVE.EhE0 ūG *uĹDuEELF!EQEME 3^"rěD$ENEF1E EEV)5VVjʾqT2DnE4EZE EzEHEn8xOţf&EoTDQEEVE oEEIE; [Uyšk|`D*ߘEE[ FE6̟Eo!EWp<0)i1D&E'EFE?EE~>gcjfDHEoEFEEE&E]D0ErE*EcEEfDjNāhŴXĕDE~Eh(FFEE#DOĺnFKWD]EcE F1EDE0D*R@2ZU(4D/E9EbEN&EpEhD!Up8QDڲEDEFEܛEDjWS]! O D5E3eE&FXgEE:DYA8X~Mľ2DhEEF gEEZD X]pR#ŘJDʝE*EF,EE/D8`ę !UGGZ,D\E E%FzE.WED!faejzD\D4EUEFE̙E(Dcva.B24EٞEEwFYwE>E"D¦g~JҞ>ӲEWWE7E2FpEE9DV>j4Ũ ]EE:E͐EtDNB#m^cEW`ĔE[EE&EDEi#lʲDEHEEEXEVmED&Ğ#!-ŘoEEIE}EjE+iEEDV #<EEfE WEDEl|EDИA[#OEE2EEE>E8pDR`.$Ż;cE|fEkEEEEQD)]$/Pk1EEEdNEmEEfDĖp9$1ŅNEG#EEvEEэE~D5ė~$DXUEENEϑEE EyDN$ů8T"ÈEϪETEAEE$EkKDZ&$ D\E*EˍE2EJPEE曱Dj$JŹ=EQExElEE(EC߰E,E?EE{E'Dj C'` ŝsFA)E22EkfEjEE:EQDmy' 8 j4^*EVYEEUEFEOnE^D,=]'ŭ PZÒ*EձE\EblE(E(E,D&Gą'Ō }M'+E6WEEzE6EAۄESD 'ž G,EE.HE-EEQET/DĎ'ů Ő}=!-EYE0pEE EEgD^ҳˋ'Լ Œ.Hl.EvEPE?EExE2D (xX Ť"N~/EܸE)E4EEEDĮS( Œ (0E%гE-E EE]nEADb`(Ś {0ECE"EE|E9EsD=(\S|1EܴE';EEEEB9DB(-x¼2E*EEEEuEtDݺ](Ş3EEE7wEME2EDhĺ(EEE ZzEhDQ2)ZgA&E<EE2~E[E/wEd[DdS)Vt8iB?EiEElaEfEr7vEWDF])t*ŪCEE1EEE!'EpEADĶ*N#CFEGE}EBEWEoE=Dz8W*!Hz-CrGEE<EELoEnE@:Dğ*ŝ7CtHEExEzEFEmEr8Dč^*ΛĹGC7IE'EEE^ElE4Dďp*:UCIEԪEEjE;VEK\lE1DW#*2Ĕ[CJEEEj7EGEVAkE7.Dh`y*ĦfCKE2EE E"ErTjE7*D;*ŧmvC LEEE>EˊEiE~&DM*/c2CGMEVEzEu2EMEdhE:#Df*WĉJCNE*E]uEEEdgE"Dp*H]DC+OEanExE:EEfExdDf*cĆCOEErE6E EfEHD Ģ*0TCdPEvOENEeE E}eEDnj*Ť#ćC_QE?EE;E*ENdE DxČ>*zIդC]RE@+EEHEX3EcE Df`Ă*ŦVCcSEQEESEEbE& DR,*xC0TEjvE8hE=E2EвaEԝ DW*;ClCUBUEEgEEfE aEDdF*6fCUEAbE]E3EEa`EkD+J(CB WEEEPEHEUB_ESD0ľ*őĥCWEEdEĐEE{[^EMDCwh*ŏĬCXEYEqETE\ Eƾ]E%CqĜ*ECYE0EEEGE#\EqCr_"+܆9PC^ZEEPEEDEE[EC<*ŵC0[EE5WE>NEE2ZE}PC*|ĘC[EܤE#TEE49B )ƿ^D_xExEEelEE}z=E 5%B )lcDxE6E>EaEF+EE@E/EKE3EtQ(FoDqE0EEuErEr2E Ÿt(jSDEEEEȴEt1E$5 ŧU(| zDXEEEJE9E$EgX&l~DnEEE:tEE$E/L~&-ľDEEE E$E1#Eɣ=@ů<&X6DyE<EEE6>E"E8Ψc%%8DYEvEJEEENj!Ecf%ŴBDi1E8E EE-^Esk E4dc% !_DŠEED'EUE$EaE ӪE;E<È $ł͘T[DӰE߇EE E|E E@b$_nDۍE]ElE$E۩EElZ$FۅDEf^EWEEӂE}EjE P$ ˔0'DESEEV^EPVEmEƶ{$gᱻD9EEEEEE*D{#6ْDnE\6EREETkEQE0aż#ŁDXڏEzEEE2EfqELx)#׏_DCmEt}EE|EݧE=ED8 G# įDxEEEfEUEvEFĀsŮ#mD[ElOEETOEզEzEn Ģ#.ĥDzEsE)EEѦEDE+ H"Ίī!D{EEEƍE4iEEm+"Ŧd?QDTEE&EEEAE ńXuGD,%EEdFEMEE3+3|"MrĻDExEFEESE15ĢVjԓqtPDEҋEEDE=rEoAE8ĶPaVon DQEEE0kEEEE;ĸZRqk:DE"E]"FE^͟ECEjŐfǝDPEE" FEֲE9EmB#lŹbsD֙EEx"F:E=Ek8DEC `LD lEE!FERED|H6y_D~ŚELEEEНE`Dj@L  ž]ijDl0EoEE E dEoCD)LNĽTœAZDEnPE$FME ED&Nı,WDHEE*F\VElEDP"/']Ű?TĤDE)EF.EٛE&#DS.QđD︜EEEFE,؛EDDXĴ\2 O-D_:E]eE&FFfEmEDLYŅ8cSMPDkEYEFFcEEDXU]QJjDʝEEF+EEDb`IvFOD?eEE&FEMEoD0aĩud#DĻ]D>E[EvFE˙ED$dŇ_BB3E؞EEFxE+=EpD$gļ]JŇ>ýE^EUE<FE ED/j'$;R\E-EE FEʘElDׄl|`;~:{Es3E ~EEE"AEyDpk[0L8xECEbE8E.E֗EDjr'\=R4@E)EEF"EpEHDpsŀq2[E_EEFEED)ui {ņP/aED~EZEFڻE_E:fDyQ u))+ĪEOEEFL3EAED@|Ċ ň|(b,EEWEFEEAD'6!o.C?(ė\EE\EEEE?D~O& ##Ŧ_&J EtiEqEE`EE8D+0!P# !" E ɣE8E4FU=EED㻂ĩ!,Z9 EE~EEE?ECPDA!Ÿwb;/ EPEEEEE0Dشć!qUP E(ФEE,E ExEMDj"Ŝt { EnTEEzF9Ex)EDZg"ŹyŻĠEEESE4EEDd}O"tPqXĒE,E4EtEE2EDJ"HTŦ9E}E0EEEk!EԬDt%鴼EeEFE9EEED46Y%BqxҶ8|E5E\EmEEE@~E܏EC wE C[D )ŘlB"?EqEEI_E]E:-vEWDl)jȗB@EE*EȖEpEuuELGSDR)/@&B̭AE"EEE֠E DtEPDLw4*;BBE5E/pEESE_E sEsOD+6*ŷHŘBF/CEnEEZEhE,rE`LDk(O*ňGCCEFAEE;Ej^EhrECuPEQEEeE EEneE“D0,*: sCQEgEE:E}E wdETDđ>*Ň=evCREL EGEt~EdiE"cErD&~*DŽCSEVIEEtEEdbEt DB;8+ŞZCTEGEaEi:EE{6aE~ DZ+nT9CCUETExENTE}oE9`EDR*Ŵp&CUEtgE]E^EE\T`EDNĠ+Ť? CEWE*EEEE2_EjD4B*ũ-ĒC> XEE:EE֊EP^E@CL֩*{vCqXE[EHEٶEE3]EC"*ŴC{YEEdE֍EE\ECd+Ũf2xCDZEEZKEDEؑE[EC/*~zC>[E4"EREFEExZE C/*=C[EgEEEkoEkENEXތCIJ*ŖUt#DgE8*E*EmEEfNECU*SG$D^hE6]E-EE߿EPME.CĘ*2'DiEE 8B z)ep@_DzqxEEEdEӹEx=E!BO)jncDxEE Ep`Ez+EB%܇)+:uD~E˵EdaEE $E;7Ea@ŞN)߿U2yD~ENEj[E:E욶E6Elq~?k))ͼt}DEXELEEt"E6E~DD)*~DE;EEИEED4EԚt(DᧀE(EVE1^EŵE3EW+w;|(jɻтDE~E?hEEAEF3E*•y(AD;pEE|EbEE|#2Eh<Ũ(Uĺ$DEqE4Ea EEm0EUjY -(BPsD5E EEEE |0E# 8(ֶ 8D_E EQEEEj0E<H @(AشďȊD+ExE(#EPEyuE/E* (`ڋDE!EKE?EPEB.E7 ='ŏ!ĸD~EzEE2DE9زE--EDH ŋ'ūad DvEE E:EHrE$+EoP R(D)EEEEsbE+EdNÆ o4'GĴ|DRfEfEEEޱE+EzJZ ',\nDΧEzEuEE`E%k*EMi& )'Ş}D{5E EηEkrE8ESP)ETsf &|ZDE 4EE{3EEJM(E~" Ŋz&( )DEEnEFGEbE'EJß N&łĄҜDyESEE!EE&EôJ &SBDEE, E E|˯Ew%EWb [r&'a wDdIEDKEp EtE?E$$EM=uupN&<RD6{EWEEEENt$EE L&4İDOE"E$/E'EZEl#Ef$4%1BDEBED6E{EiEa"EŃ]%"mD_EyEgEEE!Ep$bjŌ~% ĝzDoENEEENJE(t E}$%ģ,)DE%E]ErE3E9BE05~%XZ6qD Ed ExE9kEnjEEZ)z%ŚOBDAEEbEK2EwE#E^3ŃD%ū"DTʋElEE֤EEBEϺŃ%r2/D=EEPESE|EE:jK %D~EBEE]E"EzE/i%ŎXOD!EAE\&E#+EBE.E,,%Ř;DE EsEE_EE@*$&3D7ƍEMExkE´E֩En^E4t$)­D{E\ELEE1QEvEoØH$$єDEyEŁEd"E,EEé.)<$ГX޺D-E\EEEEE9͏4#ŲeD?kE.EIEEkiEFEFO8^#TKD؏E ZE@UEzEREEdy#K̛D!jEKEpEsEpEEab 4ŋ#JĨDEpEEXEE?EĢŨ#GDE,E?Eb)EE:E `#IBPDFEhEEE>|EEVz4"ltSDEСEJE\QETEEČ3?"*DJE E>kE}EץE~EQ,`"ĊDǒEh#EtE^pEmE E!Ďo"WUDyQE EE[EjEp E(h!Ũ߅ DEEFEФE ETJf!ű*DE=EEEOE9 Eą_{!ŭ;FDxE\EFEEJ ES-0'!ŖDEGEyF6E"ϣE E@!Ĝ+Ł !DGEXE0EVBEBEu EM%IJ$~ ŝDE,EEEEEF':Ś l`|5DUEEO&E[$F֫EEXE(*Ňk AzĪXDEuEb$FݔE2EPEb+?H% awLD~EEFeEhEGE=/Ēœ fs(D1E'E*FE+cELE^2\\)qċBD8˗EZE)FE,0EGE5'$|ژpD|E$EEEE lE8ĩcn^DEEE,EzE6+EjEiFIE ED,kĶ;PW<7EɟE&E FylEJED_nĭNQ6t+E*E^E\EE—ED4sJ:~#1`E‹EBE:FE&EDDWu ).H~EXEAEFxEEDxF +(\+ECEE5FnE(dE|D${c jō3(EsˢEEt%FdEE[DX} $*d&E-E%EEEE DZ\ Ųk$0 EiEUEEE]ERD|a %ŗ Ď EEEEfFzsEFϔED ľ%!Ŷ_& E%v8EE_EvFEtED(wn"Ł8a \EE+E| FLEXEXD-Y"[~ŭĊE*EwEEPEАE">D\/#r'ŷ/ErEݶEE$EѶEDRĂ#Ũź`kE&ƧEdEEuOE(*E嗿Dɐ#ŜF_AE"E*EeEGECEgDlM#fErEI EYE\ E3EDfٓ#p EmEEeE-EE3cDEO$+EOEs=EEkEgiEDo:$x ÞE tEEDE=E֍ED%ij$lkŭúEEEiEEӡE[8D`$W3E~EE&gEaEdE>DT8%K26YEͪENEEhE،E}D3%)h"_E])EjEE@E@iEDlCD$nFŌ2EPEGEAEEEVDvd%:ALE@EE3EEEMqE"DVq%G{>ìNEE3 ELEZEE4DQH%ŀ5Ѽ9EyE Ģ{& 2z0(EE:E[E*+EEDD̫&H o)EOE`rEE{E\EؖDI K' c/cä*EnE*EEQE*jEDW'' RBE+EEEE.E8ECTDĭy'< ZF+E`}E?#EOE*E,EDb'| l+C,E:̲E|E\&EEEoDX'HY ;&.E0EE EEEuDz'~ Wv+.EEEfE[EAEϛE&Dy| '1 şTH/E׳E֛E\E.E}Eb'DN:((Ŧ 60E(޳EEs*E]EqEӊDK(ŇU diB1E4XEZEJ7EE6KEU-Dַ z(řX»1EEzE(-EEE%bD"Mn(@V¸2EYECbEƍElE1E;D<Ѻ(Řnߊ 3ECKEڌEpEWEWĀEF[D-3(ŝP9C?4EܵExE EE ~E2D )z@5E EE>E EE8}Dq-R)|QŨ͎@c6E=EEDERrE~EJ{De(*D)ņ!]6EE[0EZEEI~EN-xDWĦZ)f|)‹p7EDE;EOEE}EtD9ď)łŬ88EEIEyE E|ETqDtkS)9EEEEWEZ{Er;mDF) @:JJl:EfEEE E {ExhD*~)A=};EEE EáEKyE8fDޗĤ)&^A xEJ]D7*k3Bl>EEpEwCEHeE wErYDB>)o$RBt?E(pEE9#EJEvEUDEĂp)řB@EEiEvEEuEs#QDV)NHBAEkE,E}EE4tE@QD )ŖBBEpEEjMENE:sE PD)ŕgBOCEEEgEEsE1LD,Z)Ž{PC5DE[mE¤E bEVEurE-HD*ss CT?EEXEC IEtƽEEE@WEc~mE$9DI*OC}IE;E,EEEwmETe6DW,V*`[CIEϾENEϯE YEGlE",2DjL~*:9&`CKE`EE\*p3iC?LE)qEEE2EfjEC*DȐ)$yCGMENE;E0ZE4E4iE&D b-*a8`C ,NE;EEXEsEhE/$D߳*ũC,OE EE?EE\gEs#Dd*ijCzOEEEEk|EgE Ds*mć{COE%EE#EAEfEbD`]+V~C@PEOEEaEEzdED *BbCQEcE$E|*Kd!DjqgE]EE:EqE#OEKAC(}S*C~$DgEHEdEEENECEƛ*m%DFhETEa`E E4EMEC./*Ŏ(D-jEuEiEiEǿE~LEhsC9 ) "X,D kEWEEEPE4KEbCiĠ*;]IJ'0D lEwE*AE EEJEZC\P*2 Ŀ3D`mE|hE,EE⢾E,wIE@YCg~*Ă8D[mEE7E E9EIEmNNCÆt*VĂ;DmEwEJEEEHEZ=ChG*S:D nEueEܼEEXEFE %CsĮ*ő]ļ=DoEE EE}EFEG~C :*Ż6AD@pEh)ElEE+E`EEDq C_+6j*ňĀDD1qEtmEEpE;E^]DEQBia*j}GDLrE(tEL0Ea\EE(CE\WBA c*ţKDrEE8EVExEBE+B O*CjĦODLsEEcE*,EEE{1E0D?E-GB)}z[DNwEE9ZEEܹE$>Eȁ#B Š2*ņ^D WxE}EEZEEŀ(mămDR|EևE{EE׷E19EŔ")MĚrDW]}EEJEEE8E-&)؎ČwDY~E^EE]E_Eq7EH"KŖ(7Ѿf3{D&EWEEVE+۶E37E WUĨ(+ĔDEEEHEeaEފ6E+(łĞDBbEEE%E?Eo5E<p(Z 7́DNERCEE"E!En4E¾'ŹĮD>EEED(EE#EEdzED0EY$ (Ř׳BދD2EEbEEE$/E&#GF Ř'ň dD҃EaE^EPEE.ED1> 'ĈD4EEEEtE\-Eo@s EEE!EKEC+EyI!O Ŋ'RmDk`E5E=EEEh*ESN o'āDxE!EEFEy(ER*Ee4z -Z'IĞDEEE&7EE(Eҩ{  g'7oD{E5EEeECE'E% 8&$GD@ɆEuE[E\EEb!'E5 '(ҪlD<9E E9qE^E=ɯE&EJgu ^8'TT,ADƇEE>E.|EˆEL$E*(wŤ&_awDzEE8EkiEbEZ$E7& \DBEEFEMExE#Ep<&%4$DɈE]EEEWE="Eݦ"ňd&]CZDq_EEEER#E!Erx R%4ːDӽEnwEEHEE!Eť%qD/EEE0E CE=E lųD&Ŝ[-DE EEBEpEE׹P#&)PģDvEE2E%E`LEIEվáXŭ%ŌEDExE"E&EmͫEEÈL%Ĩ˭DLE EvOEbE㻫E E'Ō*%Q彮D2:E$EAEEmEEέ^fv$eכYD2EjjEE'REENET$ŭĎ0D~&EyEEFEEEʟDo$XڗjuDčE EvEE EbrE6E$}KDE%EڦEEE"Em $ŮӲDFEEE*EE>E,h6r $0ГbDώEPE/EbEhEs>Eؼ#XǒďD^EE5EE#E_4Eŷ;#aj;DEmEE>3EE~E=Ű<#J-. DEExE EE{p E`!4DEEyE/F\EE E!B1!DĔEvDEVE@EއEf Ec#*!.D EEREZEKEESR'1%!ŽӀDqEmE1EEEmE#)ĥ./!R!~cADEEFkEXEE4+İS /|}YDGEEED?NV%4._ĊD6ERE|EEUEbMDFP; \i]X(DkΛEE}5FtEj+EDDNّŔ$8VlD,E>Ei0FxYEE_DQBS8DGKEH^EFVDfP ū<EsEC'E3FEVE?DivšD:8EnEEREJ-FEEfDWlr[ŵ9PEArEEEEoED+oPT8EߠE+E|EEE Dqħ R4·EwdEhEN(F^QE̔E:DqŜŘi1ġElEE2FExE'\D޵sC< ؔ-EE@E$FAE[bE2DwĄ !Ek3) EE;E3:F.HEEXDS|Ġ lKť*PEE|EFVE:ЕE@Da^J!κ(lrE`ѢEvE$EHEAED[ĥ/!~3&ĤX E2EEE E֔ED?+!O_"A EuEvEE3E4EbD5!`7Y1 Ě EEOEzE ENExD1d"_* E&E3EHEE tEDĻ."Ž #Ď EEoE|EXE~IEDyx"ū/n# Es8E4EEEED0"|;w=EEuE~E E@E DSx"n=REEEsEEJEjDc'^"Ňi6ļ0EyEmEkEE"EĚD8"@ZŤ {ZEEEELEgEIDxğ#d !EEVEl>EEH E5ElDFrT#  /ћEp:E8zEEoEmEpD^c#JE>ۧEEEzE LE Db$ 0]%EBEFE 0EX6EΏE!DRC#\3#R_EERE !E(ESEH˻Do#kD^-EdE{GEEE0E[Dgď#nßErEEQEE ED{oj$$ŕEEEET~EYE DX?'$Ô3E(>EE2EEލEDod$ŨwŸ1E`ĪE#E]EE\ED~$niE]ErE*PEEEmD@1Ď$&1ÃEsqEBEQEhSEEZ&E7DPz%YϸH1EBE=~ElE> EERDD%= Z0EYEEVEE+ˊEllD%=N& EEEREhE,GED#ķ|%ŠAş̮(!E ENE+EߛEωEDԊ?%s+"EEpE+E9EdEH6D3%;9à $EEE8EGEBEUDxM21EƴE9EEsoEED8)?Ũ}RP2E:%EІEWEEfE6ȃD(Sޜ3EEE_@ExEfE4}Dai1(@^\P4E E_HE|EEπEDջĸ(ų<W5EieEmEEEn3EpDd(ʼn j|v6EE`[EEE:E}D7(Ųg=o7EE2sEfE-EZ~EyDLf( ŀ¡7EE#|E5EEC~EuD=Ĥ)K`59E˷EE4EjE0}ErD(jDl4:E"EEEEE >|E3oDܜ( p::EEEUEmE{EpjD)Ű A;E~ݸEEHEEhSzEChD Ns)-X/A=E(EfwER ERE-yEgDކ})oŤBi=E[ENE<EExEcD6)S)NB=EEEE`EzxEHQ_DVİ)^ŸlVB>EREIEEߠE(}wE[D#İM)h4XuB!0@EhE EbE/ExvE˳WDTS#)@cZXB"AE,EEEEEEE+E9oE>;D*?+CGEEEE KEnEH9D`tĸ*x6COHEEb]E |E^E*lE7D?* ЍGC IEEtEEyE;lE|&4Dcd*ŽğMTC,~IE̔EwEoEElE/DPĜ*Ŗ8|XCJEܾEEcEEkET,Dl*nbCKEt1EEDE6EDjE(DdN*TqCLEZEEEnyEt?+UNCvPEhIEE.+ElEJeEDG*UĴCQEɧEEEE`hETEE=ELEV-ME$ZyCR*F B&DgiEE1*EEE.LE`kCxKyN*<N*DjEEDEE EJKEZC2ď*K>>H.DkkE=EE&E!EJERCB\+W 1DlE/E{E.E`]EHETPCC*j6DlEEEnEEHE*TEC#*ŧ=9D;mE8E"E?EFEGHE42C+*Ŋ]B:DMKnEeEEEGE*ZGE[#CKB*XĺfHa(bDEVE#tEaaEدE,E®d)*7Ԏ$D̻aEME{,EE{EXuEnD0j0'b b|EyVEE F?EBtEE&#/#O $vXDEEE4vEEKEݧC r*F(ĐLC(CEQEEEKEE[D !::ؓ? D=E^EEEE/"Ez~ ,)8ĨLDllEGEEmEE̬jEbEDĤ2)Ũ &b1$EEiEME6E2EDhsFĎ!ź^`D7E2EEEK EjAE-C.u*E CtME`EELESfE7E_ADJƟp$ZPğEUEYEFh En^EEZynJ'ŶO'wD1wESECEJEGiE_EDD(")œ~kw.EOϰEĿEBuEeE9EDgŧ3.{ SDE>E*'Ey*EE 5E֬AŰ* WD4YEʢEE E E~E2ʈDĆW&łi1|&E;+EEiFhEIE# EKiE%ſ %iD8E;EfpEBEETE8Cȁĕ*~B25:EPE1EEE%E&]D>˃T ŀ [DEEtEEE*EF)!:X,D}cE ErE=E^EbsE{fDfѼ"( ~u ECbz0*ŃCz>E}E&EUEEEޙD5_ ʓŌNDIEEڔEEE&E>Æps)9;DggE|E"E JE9EwoE_VD(' t8éLEE,EpEZE8EPD70YŻ"&+DcEeEE+E!E6EEY!sC^cĮ*ů^CIEEEEEӆEDWfp#V#,ĆE9E[EF,E,EDfEo P  (½dD:sEEEMEQEfSdE.DaĄ~)x&@ d@*E~EElEEZEDpYĚ}G xĮDEyEE@EE:EBHGĊ*5;*eC.qTEֿE3EkE}EaEhD% ņ> Ŀp E1EDE`EخEoEEwx@z&錇D *QFAA5EiE, E#Er{EQQEObD#yĜH ŎiD1E*EE[EtEE/EQ~‚)ņ)"]D_E=EEfE=xE:xE8yDG':&ŀ{E%EE|FRsEȩE6E{Ĵ5B$*DFE3EDELEڽE2NE[CL*(%Cm@E˷EԊE,E1EdED>V!2 oGDtEXEEƇEa8Ek$EZ]!P)ѡqBD8:jEMEYwE?EE6dmE "ODUr(6 _^.|!EE8EEEwErDp=ĉŜ+"t6DFTEu EE9E!ECEGTCX,*z~bC^0KEE]E(EIEޅEwD%$:%ľ1E E@EnFEEkE(h Ű'ŴK+lDEVE|EibE`&DFv)ŪŹi>,EآE(EE@E6wEBrD_yAzDˎE6fEEܹE]ѴEx8EpyjBH*\CVEEE-EoEMED8[Ĕ%xgB EEEEFEtEEYkJ&0DD{E UEdE8EEWEC)*((@B_7E9EޣEEEzJENDātr4cĉaD'ϓEEbZEE EX-E0 Z)^="DOaEmEE,7EAE[vEͺpDꃹƝ'J*F)EC E9TE F|E6EINEז!u&$iDAEErmEEEVLELbCMx* DC-pBEEEEunE7EvuDL7į!Ųkl AyDcE#E>EDEjaE"Eu ! )ŔkWJDVlEE^EEbE3kE4GDtW3)e Œ|kj#ETEQMEEEU|EwD\DM~Ŏ!$xDTETEwEkEIEfAE5C P*ĬCXbMEHEEsSE2EՄEvDΞ@$Tĭ|EE\5EBFDEZEZ_EsEŇd'øC!uDvEn$EEErEz`EtD)ŸX;.EEoEnENEEf'DeŞŪ#}DɏE Eh"E[DE}EdY6E@MAŰo*Ÿ /D-XEsEEEE~EۉDj+&mEFz]E芪EvD E\ Ř(o-RD.snEEZ.Ev=E'E^hE@D] %)>bN3%EE\EEpEvE(mDKżd!#D\EAiEGE UEB|E?EPC_[*&=COE7ETFE,EEȃEJDxR$YŏRENE~EFEEblEäf '.(|D(xEEOEE9E^ED{Č*HOsV0EXzEEntEEЗED>ykŒ|awfDEE&ŭRbEEEFE髠EZ E UĠ%ŷ DEEƽEEvESSECnZ*v\~B;E׵EXEpzEjE0EDDĩQ Ÿbś6WuDAEKE2sEԺEW;E:)EX1)ņXa1D@beEE|E-E7E&rEa`Dg[ 9(}6 7EŨE}EFE›ED%.Ĵő!#HѨD EzEjEE&EuHEIeCW*uTC[FEGEEEE. E(DĴ"xC4sDEo%ņL4 9 EàE$EbEEEmEtń&Şaļ8D|EhE^El.Ev(E1jZE1Dh=*,J@`4EVEE.EzEE Dw@k?D^E1#EJER'EA/EJ0E1]ˆF *rtD^^E^ E*EEElxEا{Dĉ5'JZDK}EEE%FEE` E6U$׈_DEEW+EEErOEMCyn*J֡C?EjEaEFAEYE3?EDc9!ŽL7IkD(—E?WEMEEE*%EHR yO`)qĉ;@DiEE!zE]EEmEQD' (ډ `և E\rEGEEE_ED,\<b["dD<EEEQE3YEvDEU\Ck* CaJE<=EOE?E~E(ELDG#|W$(ĢEӜEE F(EgħEE| '@3ljDHtE$.EHEJ|EEcE(DW)TPa+EnEENE]EĔEkD]YΊDE8)EEEE8E@iB*|CUETEzEFEE딀ERID-%Ę EEEa FAEɢEWE:m&l,D EEl!EEjEBXEC:*s_A6EEEE~!EEDg@~k5le%'DEE#=EEKEnK.E@y)ĒDy`E0EE@CEHEvE"rDࢸĺ'ZaDAEĦE8E!FEE1EׂĀx,$yĐ\DE_ETEGE&EMECHĖ*4ľ>CAEzE&E>E}EOEFDM!ŵŞB45DE\EEEEX0#ERj )'IJGDkEEEEE7kEJDĞ(2 es"EnaE+EEEE EQ8ķHŚ&ŋĨЍDEDEiESExE>VExCB*xoB!9EE EELEYlED<2k_jQD8aEzEWeEZMEHEBH,E œŌ)Žq'DDbEEHE.E7%EtEjD(Ď'] Œ|EEEFqEzEEc&f4#TĐvDۅEEbExEHEKE@}C/*:ZCCEQyEE0$E%EcEDj#"\EDiEBDD_Ħ)|Tò$EFEEôEEǗED1Il!ŽM,DER.EQEj[EPķE/G@E!CĔ*(ĔwCNEǽE >E*EmCEED9Ą$4ŪkıE]EElEE(ӥEEÄ Ÿ6'šȶ^zD6xEE#,EKEE#_EQ^D *Fvd/Es.E%E{EEڒEDMiĹ^ˡ|y^|D|eEfEd'EtEHJE4EyHA=_*tDYEEELEoE^}ED %]^&/WMήErEEd F E E" EB _.ś%$DrEkaEBEEEpSE}C`*$D3B#;EꊵEzEEfEqE21Dc wXĕEDjEtE8|EE|E3*EÂj:)T4.DDdE\EEE{ErE:cDČQ( Ŵ|m EtEhEFEED,HK#ŘWě֧D.ĆENEfE1EPE*"IE$~C *Ŏ( zC)EEfWE[kE E EsE*Drߔ,"e @6,wDE%E FbEE0E J(ŮfWD#oEdEPEETEgED:D!V) 5*: &EfEEmEEvEdhDOȇ!9=Dc/E8EE EEe=EOC*DRC2QE2EEQEEmE(D%B8xEyE^EE߅EڤE-%Ey'$ԳF'D6zEzE2|E.E,'Et*]ED͐9k*ņhW q1E EZoEBEwEWED p ޿s_|D~UEREEJE)lE2EYŢ*fR Di[E]E5EdEeEv{EjDn^&ŎxEEE&FlE&EtEzM%ŐDE~EEE!EgQEC*=2ĂB?)=E}EEkE"ŧ:D·E EEEEGEZCTħ*,ĈCHE7+E|EJEwENjED4Mv(E0CE cELE7EEDU0 YD>EWEELjEA8E;E1B@ں* īCCSEOEEjEvE6Ef/D%7K%!| p EzEEFEEEaS~Ŗ&bvD |E EEx@EuEZELDľ*b@e8;4EPɲEtE]EEĐE8Duě$Ŏmļ DW-EE7EUE[E`1E@= Z1* |ĞD]ErEREHEEyE}D]ZčJ'OvuEE0E,$FkE:8EKEfw($ńo*DEEE=EEEOESCߦ* cC?E@jE5EPcE {EEͺD}Ĝ!lBKkD&E#E EE֬E"%EuHLyj)ŋ"=D8'iEEpEEE]nEATD'Ģ(t 9äJ ES'ErEsE~EEB(Dp:|Ņ"|1ąD~EvEErgEVEd"EE4eC İ +,FĤ1C>IEECEEZEuEDk:#ʼnjyq*ĢEEkEEEEpE3l8D Ł'ŋ)~gDsEE$EE-E,cE*Dp-)50*EC/EwEEQ}ETEPD[řtķD3EEElE*]E9E@&BB-*FĘCJ>UEE(EYE%XE2/EE[Dl%(US ERuE;hELF{SEEzEN_,&cDv~ETE $EzEEXED(*|ŐAR6EEs|EE2`EяEPD |zKygĵD?EME(EZEER.EёA@)^WD>`EEEdEV+EnwEΗtD]h|'ڬvã?EEZE*FEEvCEE Ż8$<ě)DEФE4EE}`EME୴C*0KvR5CAE.\E*EUEE㬊E靶DgOŞ!ſDąDEEE EEa#Ec>j ŝ )ŠqpED#kEEEMEHaE7ZlE,LD(( C{æC"E*EEEfEbE8DA60"QonDTEOEFEQEEWBEEC<+NZ[C|pLEEUE_E2E#BEDI$?#wE_LE+EF[E1E{E O69'5ē`qDuEE E*hEERaE_"D)+Œh -E!EEEEVE2#E QD0aŢGŰD-EEE EbwEz7E$?BS\T*Qs#C6WEE"E 5EnE7EDĘ%H9-EEEFǽE5;E Ez *8&_8DteEeEgElEEjvVE*sC6*kPB8EgE EEEܱEDYMw4`D ENEzgEdEbE-E>a> *ş$DaEeEREEUEuETmDl~)(Ũ pÎJE4KEEn F>E5ElEN$pW#v \D)EtfEGEE uEdKE٤C *(SCCE?EE2;EE6E28DMĢ""Ţ>seDE:EFޣEEf!E8k}Z c(PLND#mE}DEErEE9jEnFED3 )B QZZ=$Ez EtEEާEXEDGķ!ŚB)D׊EjE_EfE1E@E\+C~J*f|CfNEE8,EELEXE#D^iju$W SEYE EDE-E+EErŇo'Śj-xDwErE&ELE/Ej_EDTa(*6fҍ1/EEEtEJE4 EWDigĆGxš{MD&E@oEEZELsCPW*ņĄvCPE*EԌEEE EDDĒ$5E&EEEE EEzHãv7'ŰzDyE=ErEEnrEb]E/DV*Ť/Žk1E EYE@E}EE gD3@n.ŮuAsDZE+EEEE{3E~C<g)*j+ D{:[ENEEpEE>|ED7&ťŲ$BEkEE )FEnE= E;Q%_3iDYE;ESE[EQEEREC*6 aMB(oCaGEEEE"EnE_D*C# ź2DFE;EnF)E.EcEï( 8(ņAļ^DpEEmE EyE]fE/5Dư:v)Ř`[d %(EE1DEZE=EXEBDSČ0Ŵ :Ď$DE7EE;nEEq{EHEEtEE ED 8dM9DLREEE>E2EH!&E5;B#>U)ŻX};DzhEE\bEEn[E^nEVDĝ(A% "%ESE8bE=E*EAEUD 9: "uķWD儈E{EE|EEتEE&%mCSd(+; 7CIEᮻE!2EKEEװEu>D#Ŝ,ďE4ELEEPE0HERtE}$þ 'Ũڽ fDsEEEIEBEldE,D)_,8vq*EEEEE`EU}DYĊ0+ ֐3D,EEE1EE:EBĨ* *CTEDݿE6EˑEVEE"E1DlRj%Ō;DČb E>E{&EPF4qEkEiEުíŴ&Ţğ^D~EEME)EJEBYE9DZ*źŐMA5E]Ej_EIEE EEEyE$EbEf$DgĮ)S=V,E̯E=EEZEvEeD(`4AuFDێEEGEEELS8EWB+*Ť1Ĝ)CXVEREvEWEEREI3D%wōvGd E@EE$F%EtE(Eٌ :&ř7j~DDE.EbEnuE9EWECC}?S*@\/B~7E3E"EEEEDNbeDE-EraEZ~ErEW-Elƒl*F"DoaEEAE&EfE~vE~oDչ8' óE: ERE~EE䉝EOEc#Ĕu#q'ģ(DzDEGEE\EEfnLEUCj*ĬYHCSBEhEENEDEED=׏ī!lNAĬD;E_EEE@_ED"E`ku* k(6pKDitlED E@E#EE/jE*GDD>( cք#EݫE8;EbE^EsEDEmW!&܍ĻD[E8EYE|EhEQAE@"4CIJ*v,CMED{ľ),&GA%E߬ERE=EI+EEhEC:*ؑC&OEE6rEE EssEtĚDĸ$ŤX?EEET FE`ExeE|bEʝEE.'ZVvD{EEE_Eb E[E2D2yz*ŠS/3EGErE%EsE.ED^Gr) ŶbqĖDEE EESޱE:O2E@A hJ*$@Dܝ\E\EbEͻEAEzE܀Dq!'ŵEEfSEVFA.E辟EEi~$FUӗDEEbE:E(EQEBCeވ*ŏC?=E E@EEE>EDv Š}ODBEE¼EEwE&E7J)(9DgEPEJEEwEoE;"YDNQ(p vE@E,EEME쐚EZDW7ħ-"řDME9EEE[ 5&EkDn}E]EEEqHEOYEZhDH*ES`@J5E0E>EEEgED)zubŚH6kUJDEBE;EB3EE0E>hqa0*.]D!_EEEpE@E'[xEwyDI{'l88EEEEFEEE]ĖE$|KĸD=ŃE>8EEUE~EOEC6+ :< ,CP@E׷EEEEDEkD]($_!(ŎQIDEEEEoEBE$EzPæ5 )sOADuiEIE ExE EzmEiQD(`  EVE@EEEkE(DJ=z"đĦڰDWEFE.EEvECE&ZC +lmMC 0KE?EEQEEEхEpD#hWg'+E!ĜEEEbE{EEtq K'zkDpYtEVEQEEmEBcE&DT){Ũ;S+E䂯E~"EЌEJEE DX>^ĐZVjȫĄDaEDzEE"EEZ8ExBrnĭN*jIJC_UEE4ETqEkEE͍DƪD%oN EEVES'FEТEKE|e&gֵD2E;E$REEmE߅WE D\uĎ*ź B"7E޳EȬEDEECE=DePubĨ.DEE~EE%E&H.Eƴ—Ű* $đHD&`EEHEDEEıvE^_rDH' -EѦEbEE57ES؝EE|x"iŔ#Ū<D E EEIEEMEoClľ*ŴR@CAEDEʨEMEPEVE~D%V"i<8BDtEEEEE#"EjknA (:IIDlkE]EEEjEΝkE(ID9*s(P /]k"EԮEEEExʘED}CUń"$ąִDiE]rE@UETEENAE.>CHP,*NĜOCEME>EUEEfEAЄED9č$') O EʝEHEEEELE8ŀ'{4rDLvEEE2EE=`E ,D("*Чް•L.E?E{EPoEE.EDc7Ÿ:!COEȽESEE?EGЃE0Dסt$$]WĝEDEE_FrE2E Euä Ŝs'õ TzDxE>EbwEEE8^ED٘ğ8*ۊL}@@0E&E3EwE|8EEDkĠSiźyP D|qEEE9EE4E?^e&J*2F~8D ZESE8E^EJE;}EdDԘĨ&2~m\MEIɣExE&FEߠEu E vŠ%Ų9DE"|EEEEٞSEbC$m7*2ĭ.B:E͵EpE:EwE*ED҅o Łň8V.DE EE\E\Ec)E ýx)ńvĵC.DJ,eEPpEElLEE{wrE|bD_"<'l Ś=EE|EDE)EaEtD0ď # WЊDEeiEE E4@EHE͎CZĬ+=ĔxC:FEE19EgE~8DFh)iŌ4'EENEEGEEADίO [<#DQEEEfEEV=E(RC*D*ń6ĸCw=QE5E3EEl}EwEDD$s(į!EWҟE2EFMEEE% %'[ĴHDzEGEE cE{JE_\E#D:a\*rň}2EeEEEkEyEJD,0q_+fqjMDGGExEOEhEE3E-r*įD[EEeEEwzEkk{E5+DĿ'j<E~ENEF9YE EEtkB$vİD&EpE@E֭EEQECrk*dBS=EܶEEE E|ElD5^ Ş)ŶQ&D–E^EEw(EE''E*>)8DGgE9E[9E\EߨE*oE\Dp(] L5E REEFeXEE%Dܰ4Ō1#2ȕD EEBEEHEFEe$CZĐ +`ĘCvHE EEEEEݨDd@^#ŽQ:/2DEE{EEeEEh W :=(įgaDZqEaEhEErEeEJ0D))FA)EZE,nEEEE:.DwUīC Ś|,DH9ElEEzEE;E$BF*ĮC#SEEE߷EМEE,DgĄh%zB EqEE)F*EE\E8'&ŌzD|EE.EEE~ZEDp;7*s`Sr4EYE8 EEEEiDVxA,ʋl:D|EVE"EmJEeE@0E-a8ŲX*~H~4D ^EEE0EExEZ|DĴf'%\tڠEFmEEFEz̞EȭEgĸf$BMDxEJEE>hESͽEOE)CĠ+q7C>EiE';E|EE髋E;Dы!JDEPWEEqEE%EDEiEEKElEEtgnERDĺ(\ ŰdEE|EEEETDg;Ώœ"ӄĖDE0E6!EEùE DEdCA~Ħ* ĻęCJEEr~EZNEE EDbA# :),}EEEE)EcŧEE( (F$^hDsE.EEEnE՝cEG)Dk)R.e+E.EEEiEdEFDl\Ć'fTνD2E?SEөE'#EE9Eu{BOn*,KC9UE~EE,EEED1ğ%ŌRE EE6E3,F#E&E]1E,W`&?0DB~EXEAEE!E3XE:D{*ŚBAp6E>EEE-EE=D}}d DcEEEE}EF.EݡV*HEDvW`EɝE97EE7E/wEtDCĸX|'q36hE+~E2nEEtE#EEz ē[ż!$ņܷDeEEIElE=EGMEC%>**ŕ/46CdAEnEOgEgEEwEktDP!b ED{E&EEsGEE,H#EI`| Ū()ŨĂHD`jEE.EE5E"lELD'}Ľ(Ŷ4 8sx*bD%DibEY&EEEEєtEmDƺC'A .XEC-EDETF.EEEĔ%dj8$$ŞߛLDjEQEoEjE>EKEޟC0+0tQCHCEsPE /EEvEEyDّR\"Ok$?#D懙EE[EJEEv!EcY łQ(ŌĪiNDNmEEEeEX3EjECD Ė#)x Ŋ)WPJ$E$ZEKE EgE-EDܖGy Ũl!|ԷD%EElEmKEdEGI@EMg*C"*8*+ClCoNEE(EfEnE)EDZW$Ŕ_SE CJ&ğ*ņ9CЇPEjEdEEVE9ERD$0ŏnEdEE FaE&;E"&EsÏ2'uDXzEEEPmEE9\EZ4DfD*nJ 1E?E݋EA$EEVʑE^{D4o޷WR&sD E|BEEEgE3EQQ@z* D [EOEqYExE8E{EdD1"j&4ŻdEAbE'EFEOEEEE߭E'Ex)!k )Df6DzfEMEEitEESpE^Dv(Y ŶsEf+E*EG FfE*E:LD2Ŭ##ؕDEEEEEϺEGECF.Ć*tuăCGEqETEZbEEErD` `"AFs2iDwEEʥEE%,EZEFJ) v^(P.^D$qE^"EhgEzETELfE03D])) y"(EEdEzE TE/EuD(TfW 8jSvDfElE,EDE76EGEfE EE|ZEEM+EEECE)E*EH)i6k)/xk*DcE7EEEEbsEgDZМ'L6 ׭PE.0EaE}EkEzEE+&lŴ#Ş}DEEE\LE2EIE7C)"+ű,"SiC_EEJElEEE'EzDĞ""Ż<9zDEKE}EwEpEF E;ù' y(Ř#UDX2nE+E.'E[EgEO&iE=D)FÝ%E2EE|EEΒED+MăŴ Œk3jD+EEAEEE ?E&C:Ĕ6*`ĂjCOEcEOE:EE E,˙DȢĤ$JŤ|qExIEE$FuEEڻE()'ķ}DNyEEEy~E(E]E}DQ*ŜiFP<–1E{En`Ey.EE&ED:D gEREEFE#]EoE=VD% :(ʘ /PEEEF F"EdE{Dc6"%͔ĎѭDE(E E~wE8Ex]EEzCā+qȔCRIEZBEAEE*E|END$\u#AA))+ĪEE3E}F AEVNE-Eӧ >(yڼĒcDrEȤEEEVD3}E}EEEEYEYDYN*h\A5Er_E(E"E|EUEMDzŊYZh_HDEp(EzEpE#E/E? R*ŇDH_EWE EeEķENxEyD"$'@@E,Ee EvE*EYEE$VwŮ$ŗĠCD'EMEE@EJE̸NEC+Ĕ$CH@E̷E\EZEz&EE[D1Ċ!XHBD6ЗE.EEEE$ESB ŜC)ĶCD iEcEmE@EUEmE1PDĤ(HG e E)E8EFrFEUęE&D>Z)t!ţ;D}EEVEEECE|=UCf*ŋ.CWKEyEoEJEEمE4Dŏ$^#ě'&eEE6EvE]FE.E@E>o# 4%(],lD MuE ErEnEE bEzA'Dk\>$*&nޞ,Et6EPE͊EjE9$E&FD^``ŭ2 N_xDE EE2E4E8EjbBn%׺*ōBĮDCB0VEEREiEfEE>xDaЪĀ#&H F EE!E*FEץE{E &ōd(TDRtEOEE^EA.EWE0Chzc*iń(B<%7EPEiEEeEdEDB{>:ŭšccĹDEEEukEBEe-E ’Ő)ſĬ!DPTaEEPE EEuE!rDgœ'oE鴼5E˦EߋE F, EEGEX"/P$vDEE cEEE#LEC;ę*3.:>CbBEEE6EEEaD(Ĕ!Ż piC:DEDREE$EeE"E`.xC (bĶqJDUlE2EH|EEEykEFD[T)p ťj }#EEEsFEEDzPBݚ !CQtDiXEEWE`EUEE{AEe@CD+.[(CDME"EEcE"E*΄ENDCf~$Űŝ oE)EHE)%FEյEZE]T'E rD8vE !EXEEE`EeD83)Uz.V_.EE,E} EEEobDf?Ų(b}HDD֗E4E/E}EӳEN6EA *tCcXE|EEEE~EGD͌k&xA uEҢEzHEu FEE E*Dľ%Ţiā|DEEHEpE*DEUEC~(*֮ BO(9EP1EEE*EsE Dւ((]ĖDݔE!sEE,EfEw+EЅŤ|)ŭv(DMcEE|EE-E*tEexiDv1', аËEEEEX FEÜEeEw(Iv#IW:DGE|EڐEWE*El:JEfC~+1&{aCDE;UEWEEE/߈EVD}X"ų:[)DEEQEEGE EX (. URDmEEE _ExE^iE?Di k),3Pâ"%EE$E.EtAEwϗE:DMKN ň^DlE5}E#EZMEE?E|Ĉ8^*i=COE6E4EQ#EE׃EDkWb$@y|EYEzE'FEE@E~.'S->;}DyEEEE%E]ED^*ů=0ETEEE=E\EyEќDxlCt4w/D4EEENEE4E??ŗ*Cf8DZE:E6EE\[E|E@Du6&BËEkãEZEEaEEc E ĚUŧf%ŗYBD EExsEE]EtSEC*ŮĐKB;E9EKEEEaE_DgĘ{ tl|W hD׼E)EҭEEUE0_)Edp)Şļ1DbeEEEE/E-rEmbDV?(߂ =ë"EʨECqE|FEMEAET\EΏEYDN5rĭ&%qX DNEOEPEwrEAEV2ED_*\đ@DT\E EfEEEzE{(D\&l ŦE;E:hEFzEME>EXN6(ŋ6%^wDrEyEjE.EwE3QEXCo6* 2B=E϶EbExEpEnEDĈ (|LxQWDE>EE'E~Eq'E4L)Ř08DKgEtE(EVpEE>pEXDP(Ŭ dVEɩEAEkFAEET DT4Ė#ޜвDn7EEBEEVsE8FEbC*]HCHEEEENE.EHDąn#m,~DYEE\FWEګEEf{ <(˖`D)rEbEEE`EEneE0D IĜ)ka-)E|iENE FEBEʕE DX0+ zķDlEiETE*ElEbd;E܃BF*ĐCSEEEEEEl6D3cĎ%Ŝť* EEE+FE E.EZVŋ&]BDD|E'EE|hEJEc1ZEDį<*ŀ@l4E0EmEG5EE~EDwJ4|k 4D?EErEEhEJ50EXp*Ů(DԱ^EEE>EExE>|Dh0'fLFúEKEE|FE՞EcEݫ$ŊDE EEAE EEOE%CĴ+oĔsC?E+EYE'XEdES>EԼDj2!,ďJĈDnEtE*EEu_E%EUN@JM)֒vADiE/EMTE,EEbnERDu(| ņφE EEށEXEF~EEʒDn;Z"SĶDs,E!EEE`E_DEty^C$|*ź+`CmJEfET#EoG Œ(ŐtFIHDZkEEvEEE lE'IDk )" 1s"EZmE8EFE)E՘E-D@Њ"h͏vCDBEeE|6EEɇEQ8BE4FC?+`3"C\LEE]EqEE1EDxkYa$ŏ4r n:EbE E F&E EKE^dwh\'Q!pD@hvEE5EEZ"E2aE DnL)JЫ\-E?GEE1EsE֓Ej`D5dĦIgZą+DEEE͸E=E6EdBPl*Cr.XEFEEHEOE~E% D ām&"-E[E E!FGE6E E|.R%J)DeE7E.E܎E4EiVELCJ*FMxtB8EE$EEd\E^EVD߁ g_ĞDENEЉEOEZE,E  )D7&DbEVEUEEMEXtEkD总ĭ' ŚQڙE'EEFzEyENEV[&}9$) DELEFEdEnEJEChP*6\BXCDEt#EBE/E. EZ/EDN\"X8"S)kYt$EYE?EEEE tDSIĞ8!eLʋDEUEsEoYEE@EspC +j_dCcNEr½EE!ED EE=D?;*$ŴjŚ2E柞ES[EcFoEVEEÄkś'ZU2yDxE4XEtNEaEEL^ERmDI*żUG~‹u/EE ECEP EEpDLYk\<rDyĚ6D :E`rE E=E(}EƇDܻǟ&h&!ؠE^uEޙEwEG!E,EP E` 3%ć|D;pEddE4EEESECDwĆ+=!ĀB:EE EEEkE DLDŽa -Zb.D86EDEEE)SE)E# Ÿ *>8/DdE*EENE]%E>rEcDtǏ(ź ŀEpcEBE$ FEE}Dgf.]#ŝO¥DɆE!EEEǒE HEECt*^{kCEEa-E'\E|E\EOSE3D2p"On9^DҧEBEE 3E6ԩEiE*B (*Č)VD\pE{EgEd2E"E hEy;DS<)z&7bP'E:E9EE&EMEbDNOnV euDvE EuET=EE|>E Ctm*ŌĜCPEξE!EFEfEWE`D4^$ŪFEEOEb&FpqE=E&Ed#Ŋz&2ӳ}XDzE E2EԢE {EZ?]E(ZD>Kz)Ŭ2E5EbEjmEE EjDGo1a%RRrfDEE%ErE EnEz2Ep\> H+*ĘDgX\E}EEEbET{EDװ&<,/E{uE_E#FpEF E EHľ!%4ļ*DEbEaEE ERECh*Ix8B!=EEEECFE4݌E_D=.~ ŖWRĒpD딖EEEPuEEFT(E+ã(#N7DhgE[EEE>EqE][Dn'( ՗w]EԚEE'F$E7EDW0ā #Ŏ6qDExEEEEFEC"*ŚıՏCGENEJ"EAEElEDQ2#?RF-NjDEEM*FqEEBEAt (vd9^D1qEEEEEDkeE,2DĠ)j?d$ò(E EPxEQELEƕEQDWĂeL YXfD!ElEXEEE;EBF1+p#1CREMNEEpEEqEODлt%<0 E,MEDEFEE|E4jK&ŅքD{EEE2Ej9EZEC DP*49Ŷf3EpƲECE!EEEDRwİRmĒ?DAE\ETFEfEE̪0EO|*5č8D]EEÖEn,E E|3yE&|D<4'3R_EplEuEEEEBEyŎN%WmDhE8EECE-EZOEޖCpN+(CI-?EE ENE}EEEDYi!8ŪL+PDER,E?EEqnE &EH `)OE۳=DhEGE]9Eb ErEnEdgSD %)Q máTE?EoYEEٌE9E|DU;3?"\jN/DÈEvEŧEE4ܹEDER^COș*_C1~$Ũ`DEEblExETE KE#C;T+ ĮbPCCEͱE0EEE SEhD4Ė"^~Ŕ> DE`EEEŪE^!Ew 5)DKD>rlElWEEH6E8VEjECD:W[)ŝ9iP#EEmEV\EzEp7Ev%DwIs!ĀD=ȊEE4EE&E@E C"F*ŌľٳCaENE.EEEEEBDPQ$R: `EyE.E*F EmgEE~ş 'Q/ĩxDwE |E(nEEtE_E5FDCĎ)#ᎁ:C/EE|EEpEnGE|D\gĶńkyDKBE|wEKE3EʳE5E`ްA)*ń+ZDޘYEE-EE9ET<~EZD1%ŝdz{EiEܡE FwE`E@ EWHvsŕ%Ȩ8D5lEdEEfE,5ETECČ*ٌHB^:EsEDEE2EE%Ds`ņdYqD$E|EEEEˮE +E x))՜`}.DcE1EEEEXE]sEgD*( gEjE SE"%FEEE6d*"jZD4E *EE)E EJE熗C1$+*lCȜEE"1EiEEEֈED!Y_8]%DBEEFbE\EEdc 9(DST)Ŝ9;&EEbEEQEnEDE.E0EB{ELGDX`Ă&ňŭREEEFEE&E E[,%@ΓDEEE!E~(E&REHCA&+EzBED1EErErSE E1E@ Ÿ)RbD]E0EEZEpEGzEXDEĢ{&ŌPEcmEN}E}$FKEEE,&ņ$ž*DxEE"EYEԯEPqPECb*JkĒC>EENEEEԋEDnĚ 0vōSLĄDEDEEEE&'EK:\lC)BĒj(7D͒EEGE E+E/E"jV*Ŕ D^E!EE0JE4EwEN-xDҷ '&)dEE@EF-EkxEyPEk($_ĦD0E:E%EEEHNEACo*Ÿ C@_@EEPpEEaEӊEiD>He!!4~IףDEzE|EvEE $Ebzڀ)uĺBD]jE(EEKEAE`tElE_[MDޗE)Ŵ U9Í!E蘪EEEF|EED)>i"4ĞuD%EPEEEĸE΂CE`USC0wB`+Ŏ ČC JElErEaEE…EDDp2$Ŗ ,&ĵEE.EEVE1EBEÌ>q'ꗻ|jDtExE3EEwE&0bE[N#Dj@Ăp)ܫ%Y,EECEJEJEQED@na; Fǂ $DEלE EeEEՈ8EpBiĶl*ŊY6CVE(EEjME"E*VEn4DA%Ŏ"K5 EEEaFb2E|EE êŰ&ſƫDE>EOE`E%EWEC4ğz*ssĔ7Bb7EguEE.E1E|aEDLBZbďD E4ELiEE+E-E;¦c)X_Ė#DFaESEIEBNEE-YvE^pDd ĴD' E4FEfEN1F EAEq9Ee ĝ\$pgnDOtEEE;E2ECKLEܮC69*;!]D3EE[ECEͮEvB+ENí\L *Eļ)D:bEyE*\EEڟEsEʠgDh(e7 ŗ+EE`E$FaECE' EK**#\\ݣDE-EE{ZEHE/EcJECTy*Z]CQnDEE EE[EEzDh“ZS"RY2<D<EInEE[E_EEO +))Ź42DeEEE^E0WE!rE`DĽ(ł5 )EEoE FyEZEDN-L'#%DV9EE'E0EE'zHEKACd*i!CFE_E0EEE}/EDp^"Ŏ2ě D&EE'#FJE"ͩEǍE@/ Ś' XZDpEuEEEHEVgE 7DF{(ŚWź/(E9ENLE̍E>EEHDQd DžĎDՌEE EEڶE=EB\T*N%CRE;E/EC ElEEbD(%Ŏ- Ċr EğENED/FsEiEE(2&ѱĶDzEEJEEdEP\EDK<*Ű1Y2E?EgEF*E E2oED#s}NBrĤ^DE4]EEPE]E1E9A:*ŭoDk\E(EGE@EWElzEDV<&@j֖7eEEJ EeFEFEEFC]Vv%ŞeDWEpEEa\E֮EPE2CY[$+ŦB=EEDE"PE\EEeD܉!4!ŝŬO[DDEE8E3]0E WUY)AĨ]D^E};EVEE3E yES|D> 'DHEO EE 4FE EGE x:A$šDv,ERCEPEE ,EHOE~C@@*G!Cg=@EQE,EJE{Et\ED @u Ţ I]D1EEERE͟Eg%EPÜ+Ŕ')xĀCBDIjE!EqE%EE mE#RD'(s dòv!E$EE9F$EE&D:Ģi@"ʼnuDIEE#EfEKE{DEOaC6<*ʠ)CJEpEDEErEJE ADrw# &āEEEbFEEIKEɲ}m 'hġjDetE4EEE EDIcE'D>w(Ţz6(?,E EE E-E6֔ED\tŵIP>dD2ՎE)E7 E!E*Eߵ8EV/BC*nrCtVEPE7E?EEuED4ɩ6%\}sn, EEE56F/EEE$óŘI&IJD~EE EE4E8WECݫF*At6E,߳E(wEE|E XEDnV]fĊDyEjE6EEE-E;@' *JD`EE6E-E[EsvEpD2'0 XE EEFEEkE} ęŢ$PwDڄEȜE`BEElELEDCTWF)+Ğ>CAEhEaE!&EMEED9"HBDEEE6E yE="E&s# ~:)kJFDkEEEMEĚkEL/HDĮ)G xÞ"EpwEREfEPE EJDpEP#"oq D/EtyEEzExETAEM5Cı-+ģC MEEEtMEE ED$ <ź!,EE%E[ FbEhETEվȲŚ (P&sDYuEEEH*EbE`E] DĆy*ŜN&-EJ2EErE&IEZE4DkfċT={~cDiE$E8EqE'E"6E 9AN/Ř0*Hļ:C~WEgEEdE 9Ez(EkpD|Ĥ%6%ďEEEEbEڡE; E!%X;D܀EyEPEnE.EVE!Cľ*ř:ɄB9EE/EE EtEQDtցEŘe]2DEEEfEWEDi,EH>}^)Ŏ(,)DbEvE}EUE&EuEkD8!Ĭ'Ş EܧEsE$F̏EYE,E}\&,pŷ;#1 DEaEvE͆EnE?KEcC~>*l_CGDEJEE6EEnE\DƧĺ!C&;DEyEFOEEn Egtn) Ş(0$oRDdGnEEHEE+`E{iEhCDoi)tIý_%EKXEhEZEE EhND HY!ŌĦVD-EnE|E]EqE @E`#C0ģ*HC!OEb E{EE NE>EDĤj$xMzĈ,E#EEE}EEQ!Eʱ&b6_{DxEER EkE8E_ElDjC)AH;g0EcEEEZE9˒ExDeg%ņRxġDˏE|E_EQE6E4EAbPz*Ņo DAZEEQE3EEE"E}E#Dͯp&ŰE6EEEgLF EE E *%aDESEhEvE E"SEUC>ı*qbB;EEdE-REEME/D^M p YĄDqEEKEEUEb)E,×)yĬ~.DdE?E ~E֚EUE)rE3aDċ( žßEYE7DEnEEEDL-p#zNDE5E~EPEL E>HEvCִē@+ťAĦzCa{EE>EbEEEFEVDUΕbE#t8p66D EEEEΩEEޕ >g(ŗ'cVDoE#jE/EEuE/ggE8Dd&)zBş=L&Ez_EvEpEEʖEDkQnc!ų=@DJEEUE]EݶE6=EBĚT+8_C4ZQEGE{E-E zEEVD ī% [P;E@EEEN FVSEvEE0enu'Ţ[ 5DyEenEEiEEs\E\?Di*A/j1E|EE E4+EՑEDCrĂb ųt6DcEiEENfEeE2ER)ŸtV D \Ec!EEELE-{E^̀D4 e&S*)EEED4FtE5EE#ħż$řUŖDE1EEE)EQEC *h,B=EEEE,CEEyD&s ŀOD?EZECEKEVE_>(EƂ+Y\)؈ĉp7D8BgEPEJE\EFEOpE\Dā?(+ gӗpoEsE4ECEڠE@E DG4čo"R`UDECEE%EbE.GEQCL*ECێHEX]EEEvEkEDz#dXN=/āWDʛEE,&FhEE^Eʛü7 x"(Ŕ;W3cDqE6EZEEqEaeED^4D(čs) ņAé)ESEENEEz E?DyUİQ ŌDMWEEElNEHIE$3E`_EmEOEORDNČ"$|Ū+tE~EcEEEE eEX`ó J'ŘgDsEE1qEpEE]cE\'DBġ)\ųa)+E5EErEEڔEv Df\ g?D:E^EE7EFE8EFBZ6.+DQuC$UEEOEeEE\EDrGF& 8 /Ĕ E:EGjEFE¢EE`Ù  &ۉĖD=~EE2)E?rEhsEXE2Da*Ū+{A5EEhzEa|E,EΏE^RDă|]iĽYDsaEE EEE\.EA/S_ũ)&DM`EEEpE{5EwEN5uDcIU'ņFßEƥE1;E-FbEl?EEtl$YĪaDEE`EE^E3MEC%v*l'>ChAEEEyE EEDX !dośB D EE) FEE(#Ebh] ŗ(<}FDkE>E!EިE>wElE LD+Ŀa(E bw"EsqEA$EEbE.E&Dj[Ab\!/ 6YDT+EJtEEH'EbEǽBEGCĪ*dMC$LEѼEDE,EEdúp'tU>`wDwEyEtEEv&E$_EDFs3F*٢Ŷ“/EҰEElEHE˒ED١g*yQ|ľDqE.EE2E!$E05E辚A*M\DsXEbEEVE43E}E.DN'ŎcŌAE$NEtEyFE,Ev E B %ůoqD >EOEEEEuTENC6u*dB[:EE7E9EEčED R̽\XDhE=EE1EE~*EF ,)3O-DλdE7EVEEE-@sE fD( EHErE<FdE.EEV*ĠF#)^ĬDcEQEhEoEEIEMՖCFĒ*XwCpEEGE#|E 'EAE؈ED㾓Ҝ"ş6aDE -EF)EUEvEp%T5 y''"VD"oEpEFE;EE„hEEC* cC"QETFEJER EZEEܙDآZ$LsŁE?E@]E#FE E> E̜ 'ŮĻDyEuEE8E_E ^E+DD#1*^ň5x1E:EEy6E-EUED(oāqqtjDUEEzEE^E\ղET3E ) D[EEz E EE(|E D ,&ʼnE˫EE^:FEhE ED ^Řd%̥ĈDĎE>EEEEE&REC*VzB(? ŚelE:E5EcEEEhhD>4lů3#@5D@E=EkgEREE>GE&~CWx++n nCGE@ԺEEEEEmE De#ź31Df0EzhEEzE&EyE([ ^(w^DEcEE1EEuӋED( 8dLĈDEETEER2E3E&E =X:)HT =DhEEE4EiEnEvWD!ėc( EF E%EEE3E}EXGEGEm>ED8ԜĖg$%EDErEEEsE Eà-&(dӺ,nD1tE,}EEJEfE(bE#D[IJ\*ųI6,EEN;EjEE-SE -DbbIŨtDՎEEEdyEbE7E&C4BryN*xCBVEE6EE׋E6'EDg%ŚĞ EREcE. FEmXE` EĴ&%ĉD]EE @E.EwECVEbC"H +l,?B7EE^EErE ErDz@`DE~EoE*E*Ej*ES*E3*E׺*E;*E*E*Ez*E*E*EQ*ED*E*Ej*E:*EI*EȰ*EY*E~*E*Ex*E*Eڙ*E>*E*E*E{*E_*E*EB*E*E$*E*E*E1*EH*E{*E8*E*E*Eu*E*E8*E*E~*E*E*E*E*ED*E*E&*E*E *EԎ*E*E*E*E*E*El*Ez*E*E*E=*E*E>*E *E*EU*E*EF*E*E,*E~*E*E*ET*E*E*E4*E*E*EC*E4*E*E*E4*Eܘ*Eٶ*E**E*E*E,*E*Eܡ*E*E:*E*E*Eώ*E.*E*E*E*E*E"*E؍*ET*E*E-*Ed*E*Ee*ED*E*E*E*E$*Es*E*EU*E*E]*E*E6*E|*E*E.*E*E*E0*E*E;*E*EU*E*E|*EX*E4*E*E8*E*E*E*E*E*E*E*E*EQ*EC*E*E_*E*E*E*En*Ed*ER*En*E*E}*E>*E*E*E*E3*EW*E*E*Ey*EG*E*Ev*EL*E*E*E*E*E*E,*E*E*E*E*E#*E*E*E*E.*E*EС*E*Er*E*E*E*E*E*E6*Eө*EX*Ed*Eb*E*E*E*E,*E*E4*E?*E2*E%*E*E*Ei*E:*E*El*E*EW*E*E*Ec*E*E݌*E|*Eb*E"*E*Eܺ*EC*E*E*E*E*E*E`*Eَ*E٘*Ez*E*EB*E8*E*E*E*Ey*Ez*ER*EƳ*EԎ*E*EƯ*E*E*E*E*E*E*E*E*E*E^*E*E}*E*E*E*EZ*E5*E܏*E*EC*Ey*E`*E*Ef*E*Eƛ*E*E*E1*E*E*E*E3*E*E*EM*E*E*E*EV*E*EX*E*E*EH*Eˠ*E*E$*E*E*Ej*Ey*Eʱ*E}*E9*E*Ed*E*E*E*E*E*Ez*En*E*EV*E*E%*E*EB*E*E*E*E*Ef*E*E*E *EL*E*E*E*E*E*E*E*E*Eh*E*E*E*E*EҼ*E{*E*EC*E*E*E*E*E*E)*Eٰ*E*Eʒ*E *E*E*E*E>*E#*ED*E*E~*Ek*E(*E'*E*E*E[*E>*EB*E*E+*E*E~*Ef*E*E;*E*E *E*E"*E*E*Eܯ*E*E+*E*E2*E*EY*E#*E*EW*EL*EF*E*E*E*E*E0*E*E*E*Ep*E2*E*EO*E}*E*E*EĜ*EЉ*E*E*E*E*Ep*E*E*E*E*E*E*E*Ec*E+*E*E*E*Ey*Er*E*E*E!*E*E*EP*Ew*E*E*E*E/*E*EM*EN*E۝*E*E*E*E*E*E*E*E*Ek*Ep*E*En*E͗*E*EX*E*E/*ET*E*E*E*E@*E=*E *E*E*E*E*E4*EC*EL*E*E*E*E*E*E*E*Eu*E*E*E_*E*E*E*Eh*Eo*E*E*E*E*E*E(*E*E*E*E*E2*Eߏ*E*E,*E*EE*E*E!*E*E*EZ*E*E"*E*Er*Eݣ*Et*E*E*E0*E*E)*E*E*E*E*E&*E(*E+*E*E*E*E*E*E*E1*Ez*E*E*E*Eh*Eٔ*E*E*E!*E9*E*E%*E8*E*E*E*EP*EN*Er*E*E*E*EV*E*Ef*E*E*E*E*E*E*E*El*Ee*E(*Ef*E*E*E*EѸ*E*E*E*ET*EԈ*Ew*E*Ek*E*E*E*Et*E*E*E*E*Eީ*Eb*E*EZ*E*E*Er*E*Et*E*E*E*E*ET*E*E*E**E0*E*E*EI*EX*E@*E*E*E*E*E^*E*E*E*EF*E2*EK*Eh*E*E*ER*Eh*Ey*E*E!*E*E*E*E*Ez*E*EБ*EU*E*En*ED*Eu*E*E*E/*E*E *E*EC*E+*Eĭ*E *E*ER*Eɪ*Ey*E*E*E*E[*E*Eқ*E.*EA*E*E*EH*E*E*Eۘ*E*E(*Ef*E*E*E *E*E*E*E;*E*Eb*Eщ*EH*E*E:*E*E*E*E *E*E*E*EY*E*Eq*E*E*E*E*E*E*E*E*E*E&*E*E*El*E|*E*E*E*E*Et*EV*E*E4*EN*E*E*E*E(*EO*E*Er*E,*E*E*EP*E*E$*EL*E*E*Ep*E?*ET*E*Eh*E**E*E*E@*E*E *E*E*E*E\*EV*Ec*E>*E*E*E(*EG*E*EW*E*E*Ez*EZ*Eb*E *E*Ei*E*E*ET*E[*E@*E*E*E*E*Er*E*E*E*E*EЇ*E3*E;*E*E*E*Eѓ*E?*E*E*E*E+*E*EИ*EI*E4*E|*E*E*E)*ER*E*E*EC*E*E*E*E̐*E_*E*E *EN*E*E*E<*E *E*Ex*E*EN*E*E*E*E:*E*E֩*E2*Eē*E(*EH*E*E*Ež*E*EW*E*E *Eq*E@*Ek*EΓ*E1*E*E*E*Eˠ*E*E4*E*E*E*E*E*E*E*E*E*E#*EԮ*E*Eޕ*E*EJ*E*E*E*Ea*E*E*E*E]*E5*EΔ*E*Eب*E*E*E*E*E*EZ*El*E*E*E*E*E*E*E*E*E*E{*Ez*E*E*EP*E`*E6*E*E*E*E>*E*EF*E*E&*E2*EP*E?*E*E*E7*E*E*E*El*E*E*E*E*E*EE*E*E*Eh*ER*E*E*E *E*E*E*Ef*EȚ*E *E*E*E*EV*E*E*E*E*E*E}*E*Eْ*E=*E*E|*E*Ep*ECG*EN*Ei*E*EŤ*Et*Eg*EE*Ew*E+E++E%+E2+E*E(*ER*E6+E!+E+EJ*E/*E*E2*E+E +EX+E*E*EO*E*EV*Eş*Et*EV*E{O*Ee*Eד*EY*E֎*E}h*EK*ES*Epx*E*EG*E(*EZ*ELJ*Ed*Ez*E*E "+E*Ed*E *E*E+EB"+E +E*E*E*E2+E$+E+E*E=*E*E*E* +E &+Eګ*Ee*EN*EWS*E5v*ED*Eܜ*E*E^*EZM*Ea*E*E*E*E{x*EV*EN*Ei*E*E *E*E*E*E*EJ*E>+E+Eq*E*E*E *E8 +E$+E8+EU*E*E*EP*E+E+E8+E*EI*E^*E*E<*E *Ez*ET*EN*EOl*E*EL*E*Ek*EO*ER*Ew*E*El*E*EW*E*E_*E+E#+E+EZ*E*E`*E*E+E]#+E+E?*E*E*E+E.+E+E`*E*Em*Eq*E*E*Ey*El*EhM*EU*Ev*E*E *Eހ*EY*EJ*E4Y*Eł*E*EV*EJr*E'U*EJ*Eg*EN+E!+E^ +E *E*EB*E*EF+E&+EV*E*E**Ed*E" +EU"+E+Ev*EN*E*E*E*ER*E*E^*EL*EY*EŁ*EJ*EJ*ERs*ES*EK*E*g*EW*E*E*Ei*EM*EKT*E~*E*E*E. +E*E.*Ej*E+E +E+Eq*E*E*E*E+E5!+E +EJ*E*E*E+E+E#+E[*EJ*EM*Ed*E*E*E$*EXn*EP*ER*Et*E$*E8*Es*E]*EK*E5b*E*E*E*E*E*E*ET*E5+E$+E+E*E*E*E*ET+E+E0*E*E*E*E +ED&+E+E*EY*EH*Ey*EM*E*Eo*Ea*EK*E^*Er*E*E*E:v*ES*EK*E@e*Eg*E*Eލ*Em*E6D*E~*E+Ev+E#+E +E*E:*E*E +E"+EJ+Eb*Em*E.*E5*E +E#+E +En*E*E*EU*E*EЛ*Ez*EV*EL*EKg*E*E*E*Ek*E/Q*EQ*Ey*EC*E*E*EGZ*EJ*Ea*Eo*E`+E+E(*E*Ex*E|*EJ+E#+E +E2*E1*E*E*E+E+E*E*Em*E*E'+E+EΑ*E5p*EK*ET*EKu*Et*E$*E*Ea*EJ*E._*E*E4*E`*Ehv*EU*ER*E8h*E*Ec*E*EJ*E*E*E*E4+E "+E+E*E*E*E+E+E+E*E*E*E*E+E$+E&+E p*EI*E]*E*Eߟ*ER*Ez*ES*EG*E-h*EP*E*E/*Eyk*EL*ER*EJy*E*E*E~*Er*E*Eܖ*E7w,E'Ei1Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-30000.ark000066400000000000000000001651651376444676100257410ustar00rootroot00000000000000my_id BFM :[E=1F Exr ELW-rN CpHEڸEpEE5EEDw/Ĩ ŭ%0ĆpD/pEJ3EEE_ZE:EųD֚3!fHŤtDkHE&EcExEE^Ex+1D "(fM EEE8EEnE7EdBo*|bBp1E|EE F?E IETE\. 5(/HPNDYEE~EjE0EٸEDdĝ  "ŢtD(oE>EBEOE4EMuE(DǪĔ$).ؓ?DhEuEדETEENE CwĽ*"m0}@_E7EREX(FE2HE%Eޜ*%5ĊߔC|CE#uEڜE!EzE2E|DRTsŅg&)|-F^D$jEIbE4E+EpEEVDËĶ űnļ$DшE`zE2EEEJTdEFCD8~I'żZ ğE~Eo+ED*Ŋ* "ĊcC=EZE^9E+E MEɚEAE#Sn'jqIDeE7E EEE3E$D>˃Į#ŚmjDAEEYLEEϺE@iE&*XD1&qݗDEtEHE>BE!ѵElAEdC$Ė*@dp'EsEPE$FEEEEXà>>)ğCtOE_EEwpEWEEϐDD ůI$Ŗ@%DvE*EuE^EEqaEDh"ŴU_BDAE.qEyEEEaXE$qD/_4)2 ^EpE0EHF(EǮE\C0E B~p*xoC9EE\EEEEE7îmf(ŕđ67DGh`EpEEJEEE^Dyį P绦D܃EEEIE\EnE{kD/d-&E~+uZD٨EVE)ED&EH-EFEACĭM*srt"`r"EM{EEFb/E EhOEOüŮ8*aeCIEE-EEܴE.8ED4ȉ%ŤĺvDqEEECEE/E8DC!IpeDBE EyEE|EEAS]ET.+D߉S(xC%%à E2}EEEE*ưE5E6EB_Ĝ+`(B\3E%E_E? FCEEF E$SX θ(>hR"D[E)EvNE~E^zEEFD:iėuŊ!ŰAZBD,E*EE!EE sErD|$c:ďD9E>=EEVE#EJYLE_C19*-h EVEOcE$F=EgE $E|v*ĜϠC"+EEEE EE]nE]yDڍ$X9&~MXdDZSlEELE EׁEЄEDī W} >DˠEEP EeEREbEb=D&}Ċ'ԙE3EOE-EE;-E:Et5CR*ST@ڊ.EnEEEgENE>Eo}^ >)<X8D, VE_E?E :EEED4YĈŪ*# ؞ĊD}Ez EEEExE~Dlĉ1$-pK(Ś]5vDEfEEEEJEC<'~e*%ŋT:EfE|EeFEݨE"E!\xF*P^C|FE˷EIE;EErE^D)v&%؋jD@mEEE>EtEk E7Dal .ŅayfDuEmE 1EE2En`E87DU0(:Z6È\EBޜEEEfNE{tE39E4CDl*İ Au0E1lE~LEhEVEEE7N ()ŨdDWEE]EEdEԎEzyD\^^"NŘ"?D0EXEEqE*EjwE?DSާ}$zgFDlE.E}E EEfOEC)ŚèsEEPEB FUEEk (Ey&*Ż^ĻC2RAE;۵EEEWERQEZDVvؽZ&E,dCjč*((q>½*EGEEFE惣EEk¸ {)>>DRE購EE0Er[EEfD/O܍#ňBx2DڻyEEEoEAE>v|EYDfԠ-#ŴAU D$EXEBEEȽETE D8)Œz ŪgImE%SEj,E FE|MEa -E#C*Ť{ DCu/$iʁDuE|EldEECEEŚDU7"N(fDwECEߟEhEEuIZEtDXbı( F E+E`EEEwE2EgB{ +4OB6ErEExEhENEm EÌ83(Ũģ.DN^EsEEt1E~xE8]EʘD6s'QY ! DﷂEZE#QE0EEDEpErDX%pX0 D:ʕERECEdEEpHEC }*ť?Ëm EܨE1WEF EE E/'=*ŚKweCIHEEޖELEEaEp7D/Ĭ >%źȱĘ{pDvoE=Eb]EETNENEwD$Y!uut\hD4EE{EEE#C_E2DW(Š= EEUEEEE7E,C;-*LĚtKB1E*EEE ETLEEl@ z)xND^bYE,EEEER E.DibĜŎ]"`DeEU0EEv=EvELuEvDĬ$  A1Dn%EEEJEE.HNEjC)ŜTKE\mEE,FEME&E$fQ*&ĺ+CTBEE^EcEEEvD ey&[DjEEE%E.rEEFD=O0ŋzD|EEEE9EdESEDQm'vS ~sEZEEE E0EEEElLEmDĜ-şNĤD5ExlEeEeEE&iEvxYDK&Ą9DwE_EC=EQEE7BEIeCđ*J:µ 'E|EEFEEfEvwB*ňzC|NEjE>EnE5EED5CTK$ȨĪDvEEETEK2E}E×DD{"ŭžAaҧD>EVtEEE EBXE.D^&N(vE ìEӠE&EF[SEDڮE0EBwp+Ŗ`CY8E EEEWE>IEEväeV(0r5D>N`E~E EEESEDw0Ş c8ČDEEEEEoEblD|Ĩ%4X+ ĎE}E5E0EVE%RGECOE*Q)!"E<[EEEH F*E\EwEbG *DCIEDEdEtE Ek?EDm4xu%¯ijuD}#qEEʙEۀEEE0?DRĴ^!ŭPpD}EsEbEmEfTE]E4,Dʃ(,ܔ0 EDLĊ'|dśEyE'EEuESEXA;E~7C*}0.EؗEE.EEE\EЙb# )ţVDIUEkE:8EZE@EED(Yeŧ9#k3D|E2E @EEERyED٤ #f_ŐK֏DCENEEU=EEQEYCn)ň ܚEgE'EF EmͫE>*E1]fc**ѰuC:?EEE*E EEaEHKX'ŲzND~fE.EEEkEExDsĎ_koDTEEEc&E`EgE XSDyg&7Zv,ElEEwCEEfSE$@E"CA*rp (E|E(TEVFRESEE yG)V[CPE E%EEE/-ED=G/'Ž $ߦĦDXxEE(EOpE'E}EDp\>"ń[ĬDEEE8E]Ev0WE}/D$ē0)ř žQEEEFJE3E0/EeAS*P$C@:EuE̓EWEE6E*VEdD 'z ĥi;D.aEELREETEQډEHZD|ŝl ҎĒDREqEEXFEfEqmEeD*Ĵĕ.&ţHc&NdDNEETEEE4EEΧCA*#EEBE Fl"u!9TĐ\DREfEJ_EuE:E"rEW{Dq4%*Ũ6DʡE(EE4EE&1KEFCr,*!3ŦTÑE`EE@'FE5EX0#E)&9h*DR(CweFEܶE$EE ELED;'n%˴hDܽmEF[E>EECEED9 3 {DEEEBWE~EGaE΍8Dx2'ŪŤ.EۜEHEdELEJEs9E'#C V+w0A2 0EDE6EEE0EE'$Ó (۵*DVWEEZlEEdEގE}D]Ż"F-8D.~EE8EIEEwEpD*o$ƵGĎDoEOE4ENE+EPESCD)^ņΐÄ=EjE8EE sE"EU(Eli„*R C.@E౵EE{EzEgEEH4ķH''DTD%hE|aE XEbjEbEE2fDBzŌ9ĨܶDwEEE E6E>fEbMDj>'Ņ"8E-EKZEWeEEgE?EkC@*ZŸCyA*E4EEgFKEEE`TÃS ų)Ů-`DjREE&EVEgXE`ED;M(4#:פCD/yEEE,?EEx|EzDą#RŅaW7DяEmEEF;EѽEUEW DœĎL)Ÿ ᔱE'XEPEFuEԐE+t-E`Ė*ŜDADFcEmE̎EEEE?DՀל/ ŽMTjDEEE EtExkE)`D &7Ŧ!xDd EIEfEqE" E$DE~ICċ* Ųc%EFEbEFnE(ӥEaE9tF*ņ)ECLE`ESZEEEϓE1DV=  %ŖMDtETEx&EEkEf߀E7D옘,"f^|DssEtEESEv EPZEX D]Ā(Ű 2bþE*EEEEEN3Eju1EIEEE1EE?EpFU ű(bĶ-DXEEEE ER%EDbȇ̓"ŏ՚ZDEX>EErENeEvE܃D2đ$N#ŀKB^ D%EdEEݠEGE`NEC)ŨÿEE EEE [E|&E:FVs*GpɑC\BE&bE7EsEKEED& &9ĚYDBjEfEUEk"EFdE@E\D(BįųĻعDWsE4EEE EdEd0GD4 8'+ QEEE_Ex[EEj=ENPC*İC,E=EEFlEdEl#E9þ l)Ż8DATE1:EVE"EuEEjDRRī3Q#䤢Nţg*W CqIEEEE2EcE1yD2xh%lgYuDpE2EPEEeE,E``DZRĜ!Ŋ`/pxDgE|Ez_EuEVPEE^EV,D(ų[&J EEEEVE%E$PE@6EwB>*ű6كBf3EEEsE E'E E" 9(!!Du`ZE"EEfE{EkE\DNg?Z("#vĤDVEEEPEVEtE݀DMą %ʼnjT=@DޓEEE2MEELEtC$3). \u&kEOE"zE.EڗE"Ej%EA ј*ţCLDE"E9EhEQ}E4EYD!Ēn&ӾĽ`DkEEEsEEE\D lZ x̀ĨED|(EEpE)EcE{9cE·AD "ĥ'(UE<›E*>EExEHEF;Et;C|*qv-EȔEՄEF`E JEED ?R)Ť DUE۽E9EE[jEяEADW"PD|EE:EE.E҂yED-#0ńiMĤDS}EVEGEiEE1REC-?)

EĕEtEt8E3E8/E`A*t4#C)9EาEEEEώEϜE)ERS&b'Ŧ8D:aEE[EQE}E> EDXG{:ś5 CDEJHEE=EbUEhmE?!hD|ܴĘ%X'HD@EEE&E@E7FEz.C?Ā*Ō?#EEoE(FEEEEΩU3HAB*2Ĭ6CEKEE8EEoEED7Ĥ7LG%Ň.!{D)rE @EE]E$PEفEqxDӃĆ!o!kDuEEEGEE\ET'D42(Ũ .h EE EE4EKE[EʹETPEEK+ E&Õ Ŋ(x4&D\EvE#EBEEJE]DkĭW!DODPɁEAEIEEXErEܾ{Dnfe%8oDEKuEE"!E߹E;KE2TC64*ş|QZZ}EEkEHF9EBEP#EMŶ*ŲĐCEE EEPEEPNE|Dd&ć` &ļeDTmE)EIE}EhEXEmBDHb Řż&}f2DKEmE1Ev/EEEگD+{!půg^Dj[EeEE~ E,EhZE!Dĸ(\ ڰx{EqE`EEEկE 3EBć*6aMB/6EWEEEE(E{ EpK6(PE*,D]E]EJEEUEXEDͯp OE!/İD%EEEEEqEuDD%9Ŕ3 DEE EEnE0/E&IEνC*ŨŴEӇE\E.EFEPEX "E*Ía*CaGEXE0E7E&EEDcy+F%ŃѲlD)oE E ELEnEkE0zDċ йwDΘEEk(EEE2`E/5Dĭ(R6ÀE?LEjEE EEC8ECh +ŽqBB0EEfgEFzE٠EEwd 8(bDXE*E EĞEsEJEEDXbħlX-" :DΆEz?EΞE{EqtEbnvED=f$ϊ=B D EZDEEEOZENE C$.*vRۇöuEEE9FE.EH&E’I*`C:CBEEXEBEUEEF*D~Z&L@YD%iEE:uEaEe]E5E)DW׉{13ťDVEEEEK=EQeEKHDl}'0<E>EEqE(JENEv=EYCC{*1H 6+EHE%EEtEEE3ß )ŤOƒDBSE7EK|E^rEEEDQQĮť#WćIDdzEE>EE/E,9{E D52#BmSsDXEE5 E)EUE?TE4D!7X){i 4:"EƢEcE FTLEE,Ep +;OC*\Q(ő22Dq_EEtEQoE3E&E0DCtPl!>^DXENEͽEdE1EHoE-pDʱĨ%ŰŎr.{DEEEEiE6HETԹCk\W*MN,^ EE4E F>EEʆ Ew?[N*{sĴC\HEEEf)EEiEDQ0X%ʰĞsD&pEjLEEDē(!~EsDfE|E1EEkEh^Ea.DxK4(HPr; E$EkE1EtEkE96E "B Q+:x8nBз2E聯EpE@EϺE EEigé M(;0DE領E~wEE0?EdEEcw'FpKDLfEgEEJE~EEҭDTi <ũjJDEcE>E5E՘E\EiE;UDǺĉ&  E\EhEEE׵EQAEKC@*)u,X&(EEH^E5FEQE\E."Ÿ)WCOEE^EnEl1EnEبD*G nd$=ۧĈDAwE<EbEE:EE :DĔת"Wm`Z^čD%EVEE8lEEfWED@)ů ŖöEE~EETEaOE/EmTAue*ВĪVCmE9E zEKJE#EhEԜE>ELlg-(Œm7DQ aEEJE+9E5iEgE%DǼy"1_ X8D8EFEE}EÝEmEjDEbtE&EDE;]E)DԤ(P MQÁ EϞE\EF.EE 5EB'J +ߢBX4EB/E5EE.LE?EFI EU/ y(km%D-[ErEDEOEUEvEDk[J!6EUDqEEYE ED-E|RE5YsE!|DC$%)fJ99įD/E0EEE!EKEdQCđ@*Ryc\EuREEx FTEREk#E\ Îk*SQ<CAEEmENES=E8EAEDb&ZŘg&m eDOlEN)ExEECE@EzשDaĝm Xr}DE:#E,EE_EbEVJEElEmELxE5DyĚ $a)`ID͑EE]Ex\EE2/QE~C*)ÝEDE4E #Fm]EE/)E6®/3*GĊzCE@ELFE?ETE0EΙEGDEi:&ŪwuQDgEh&EBEOE[E~E&Dޕ@x"SDPETEDEYEpEBbgExNDzJ'.E>ECE*EE4E:?E&wCZo* )EEiE=F7EۣEME%æ< u)\(C`QEw_EVE Ŋ׸:BEšEfEEEvE2u.E?OĔ*T05C:E;EڅEDE_E,E_`Eũ'!=DbE- E2QEEEƆEDs}Ģ% :ˍrwD΄ElE7EEElEߑdD?U&y,ȇ$ĐD+xE E E\EEEE>C|}*&tŔ65$EŘE+FE'&FQ\E^MEE j4*ŚbCnLEg4ESaEE3E1E D:ײ$ݬdDsEEx#EE*EX&ED|Ĩ!eqWidDE EvE=QE-EB~[E?!DeJ(ņe QX EE7EvEE#ER3EPB *ņ\'B[5EEӰEEEzE|E* E @=3(vl3+Di]E%E{EnEEED,Hpnވ!řѠDV?EEBEE+EqEvDĪ% X4KDEEE EE~EIEeC<=*ń1NdE E0EE,EsE]"EL#Zk-?*nC:FE:E(E*EEENDio+Ry#&+^kDnEEEBEEEŃED:b <hx[DE։ESETEbE~>`E?7DwĔ (avcBE8E@EEUEE9E]C* LB-0EîEK?EgFEnEEw $")Ņ[DMNXECEfEfE]EEDpJ`3,"ܖďDE8 EqE[EE6vEɠD|V$E>$ņD& uEF#EfEdElE3XEkDvX"pub|DţE EEEjE%ZE_D{ğ)GO = ÷EOEE F*VEyE 2ERBC1 *Bx7E8EEE{ES؝ED% E ~'nD0D>#_EEeE:E>El~ERDKuāh!Ż@ĘD EeEEdEE5pE pDO7j%IS/DElKEEB`ENԸE4]HEHCU7*ŚNK8Ä EΧEZEbE~EE E F:Ú9*ŢĀ@CaHEEzrEE`5EED2'0Ł%ŜĦqDSpE@EE{EQEZEVDĪ3!8Rt[DXEV4EcEE*EN^E0DW(4`DMZEEߦElECENE mC3*-7ŭ{~CE EE&FEFE~%E5Yr*"ҶChCEE6E$EEHEJD| h.&ņ]DSjE|EΗEE1EENDSLRԿĭD}EYoEEEEdETBD&'ŭn đ[E0E>EEEmED;EENC:G+:ĈUa&-E٬EE F-fE27EE: Ŏ)ĭ DTTEEEj]EƆE=ED%Ud#M^D "|EEDEE E)zE@Dā#'PDb EXE4dE֊EE5REiDĜo)Ŏ svqEu+E5E`E'E=EYX+EĜ.*ŭ*rĘpdC\>E8E9EEEELE1Ekbv'aģIDfE?E<EKEEE0AxE6DqB$LYJĺDEEE_ET)EfQEC>)) LE1ţEJE]F ETEe)EV&‰*ŘzlyCs?ECE4E5EEEkzEcŹ+'ⅼhODgEEZE=cEuEEcD>ġ  ĹD$EWEjEPEE4gEQDv&ŸQeJdECЙEEvlEE'E8@EyCߡv*qŞFA)ETEE$kbCP!*ť6Ō~9T*ENEQEFHE(rESE'ɞ 6~)DyRE1EE+/EPEE9:DlqOסż#((rDyEzEgEnEWEJ|ENDĽ-#@Ů+U>DQ5EcEGEEĽETE D)i Ň̯zETE,E$ F}EIEEq-EH"*VĹGCHD%E$Et)EEʶECEUCls;*Dn~.%EEE_F=KE(EE/~+T*łIX8CGMEκEaTEEE*EDH=ĥy$s8Dr&uEZEmEEE!fEdɚDSl]"COeĐDgEjEOEEE-ZExdD}E(ő ÂEZE#E0FPEfE2EKgBm+0OB6EEHEEfAE'Eߎ EP'5'łľ-D^E?EEEEf~E>/Dbtu 4$DmEE)EEX3EpErD-Ĺ%t/DЕE'EE E EHE CR,x*7Ŕ=  EEpcEiFzEbE E1ß./*ř4ClCZHEEFEEEEDl/%GƱ pD+oEGE]E EMEBE?DV )ŶgtDEEZEmEEEUB_En1DSM(86 EEhEZEEE<7E3CHEh**tLB1E@EbE1E EEEEZ6 )ĜDYEvEAEEhEkEpDPbğan"՛DDgvE1EEDEfE}"uE6Dѩi$&Ŝ@DEnEE EͺE"NE}PC)œ<}~EcEEFEb8E&EW*ŜľCBE>ExE=UEwEDӼ([ ~ȱEYE EFriEFܮEp0Edk BA+ňC8E EEE[E(ExE`v3(Df6DNQ`EmE%E2EEuEDwİ~ Ę٦D fEEE5~E~{EoE:mDZD &žO*DYE߻E\CEETHEGE ȱCD3p* X+J!E~E!EEEwE|EMMϮ)΃ĦC"IEIqETEE EPmE.Dh4$%hnvD$qE*EeEUEEG|EDt!oyDEEEfEPE]E+D܅(bŮ" E~LE:E&E EE6EBw*ŌAJB8:3EEqEEEE?E% ^(vĶ!D[E;E EEaEHED hyū!U D0EE6EXEEsEPD‰$v}<ԀD@EGEExECELE]C@>)ňjKEFELEqF-ēEEDEEESEGE<^;Ef86Cĸ*к.E9EEJEE E*XE߁p( E(@ DVE~7EE\E6VEE:sDxY<#ŸnFDO}E6EJ#EEjE0yEED#Ţq>LU5DYőE1EEbEE8QECLIJ)ŀU oF E3EEF^E@Er)E`N*4|CS?E@ƴEA{EEfEE'E,tĽBP'?NDgEEE0EiE}ETCD ~1 `čD\ EEE$ETEgEp7SD'e?^4PEENECEEKE@EaCzĨ*oX$(EdEvdEF`LE\LEȐEOßŇ)L3ļCPEEb#E\EEaE|DG-$ zD xEE`EtEnE}EHD>]"Gq[nD/EEE}E;NEJ#WE%$D8`G) q ~kÆEEbEFE)Eg//E`mPA^F*nI%CI:E6ͲEEۖEE EIE= ť'2S:DbaEEIEeE^E݉EпD}ĘŨT ŭ DpEqEE"NE#ELmECeDā&pb&ĒDjaEEPE{ExE KEEC,l¹*y  $EE>E,FEZ_EEYüű@*{ C=KEչEH;EElNE:hEpD90kY%Ŏ.Q|D&rEsEE4EVEṕEqYDP0m!`2jpDE1EEEE3\E;%D_(JG Īv) E4E`pEŏE|GE}iEN4EB[;Ĭ*ŐrB4EEIEEbEڞE: E (`p'D\EEcESEEjuEDxlğhg!<2~DEuE6_EE9ErEwzD`Ĭ,% T6DNEEE)EYEVKE[C+*!5ŗATw-EhElE!&FEvE1#E +”*&hCiFEmķE+0EEEEfDrY(~%ڨkhDTmEiE>EbE\BEED2 . *: {&=Di1EE2EhZEE~kaE7D*'+RE8E*EE.LE,EE9E$!CĈ+ŵoA0E-E/ETEEEE;Ì A#)žċDxMWE⳾EEZ EEÎED]C"{DDSi~EEȨEEEwE D{$h}dFmDhvEE6EEE'PE#CĎ)Ŋ<ȖAE֏E2EE:qE0ES(Ec+(E*ȌnԄCZ'AEصEEcEElE4EڞĈ ~''[aaUD>iEBYE@EEEvEܱD;Ē4hŐ4nDlE0iEEZEEeEiND |'\t EEFEWEEREF>ERhC:*ſ.?]*EAEE!FEEmE۝S Ŗ)ų%DREHEaEVEREQEzD2DM_{#^DƛyEEgECEEV|EQDĦ# _VfDXڏEwEE(2EEUE DľR)B ETEEF|EwE&G-E )ap*RP>C&lţ%w)YDntEEEEDEĀEDg +";űf{DyEYuE\EFEDE ZEb DQ( FE2EFE}E)E^E 3E֨B(9~+Ժ~B6EME&EEGOE9*E+ EUf(,qoDBIoEcEVxExEEJE}DeM< CńXu9DE E/EEsEx_EOS2D?>M(ŗ,P [ EZExEEEE7E$ C*L&B21E?EEE(E=rE0EŠÑ_ ʼn(ŜĖDg YE&EEWE$EEDbĸZ" upD*>E>E߽EVEnE uEr~Dxę$.OhAB֙D0(EfNEEEc6E*NECt*aE Ek E" F E4E &E]rG*Ľ?CHBE_E)UE}E0EEk8DYě8d&vE ?EEEtE^XEDR5((B  ýlECE=EEEE~;1EVB *EELgE E "HEJC *Nŀ)&!E\EWE(FEEEYF2*CIE(EsE6E$EE2D<4ĨŴ$tΰķsDpEEETmEtEEcDdl0!ŢVLqpFODE2E8bEECE2C^EVk,D>(> EHE&EEpEVHE+6E<cEMD g:)"&n5DEEEB E$EftEDČ%Źy=XD"EEEJJE;ELE&CC:0)ŒtÈE,E3uEvEBE Ez%%Eu*"xC5=DEEZsEgEEED!*}n&ůĜaD*lExEEPE#EE5D1* jؽDk)EEbE͏EpJEncEhADe+Ľ'ǡlaPEijEHEԣEE4.E$EhEXE*ZEVhESD1ī&'HEyEfEd}EEEU@EIC~b*Ti(E,+EEEwEREEّhŐ)vC3PEEE2EeEUEIDфGŢl$BĈCDwEYEE̎EEW~EYߔD/Ħ"œK]t]DE0E% EqE[EpWEfD )Ŗ 鴼ÉE1E4EE#E0E/E`9A) +Ź5%C.9EE\E:EpE͜E=E'zĪ8D¨aE8E&hEE>wEED1|0: iƨD;;E fEDE-EbEmE.gDZĴ%ź<(ĺ D-E4 EEJ.EEFEFCQ*QŅ }#E EE^,FEǦEE^OT>$ŚY*zCoKE>E;EpEHEQlEnvDV6ıR&h%ح |DrE=EzE)gE 3ÉEND9*!Şj0DPlEO E"Ec.EE?\Em&D˷Ħ(B. ^d E+E>EE* EfE4EԊB*Ħj*ĀB4EEbEEHE)Ef EC (b 'DX$\ELEF,EҳEEE٢D2-l)!őG\]D́EPE'REE GErE w{D͌&W%8 8ľDjE(EEEc׹Eg#KE\JCW@ *ŪsLZEEE, F6EE#EBÜŴ*SfěCFEEƷEEPQEFEq=E(!Da0' ]/&(~Đ\fDmE]*EvMEE$eEPIEDHijm r|ĻxDEUrEEmDE}EaE0:DnH1'ŤūtEEEeErE$E=:EP"CI*txڃA~/EBEEF0EoEE"l~ vQ)ŷoDkWEXEEEEӎEZD8[l6"ȝKD}E0E֎EEEnwEnTD,'T$ŝF@D&EEQE;E ڻEPE~C),23чErEI{EcF8ETE(EF­!F*V3, C@E EEEEbEuEAkT&ŭEuSDghEzEEEE܆EaDbĂŁӅ%LDپE(SEƒE5EEffEަMDY_',W4OEE=EEE´E>ExC0Ĕ*Ņ=*E8E~EPE!E`EEᐜx. q)ĨGDQEڥE=EE3EEJE/DsBLe#c8DwyElEE{9Ef%E|ED%ΟL<#kňXā^DCEHSEE}&EkEUE D )Ų ITEcEHEEE‰E.E;R*SĔ:C;EcEEEE=EE!%gl'D6Ę?D[cEEEEE`%E0ͽD ŊĕDRلE5EE EEq lEmbDk&żŊ>!ĻDA˗EEOEןEE\DECTķ*řß$E-éEsEF54Ej6E݌E1pÝ<Ÿ)ųČ[CLEqEE|E$Ei3EY[D)ń ًĠlDVTEo EEE1EEneEBGDfl'3!P8EEEVZE5E[Ej=E UC9đ>*Az+EˬEPEEE EE$S )6pDSE,=E9fEwEwEEGD\OF#Į*DQ%{EE$@Ei:EE zE/D~>#$XR;D EnEG$E`E|EA8E1EY4B~|*lxC7E2EEEeE$E E&7B G(ak2D{_EE EvEEEDDItfuŃ!;ĪID`iE9EE/{E*E{ oEvKpDx %,-ľDEEE|EDEeHEdCA*( EE^E'F%EE EB?Ã,|*šʘCHEE9EE_EoݕE%D1ĶŠ%hc qDupEE EEYEЂE΢D0$ ޹nqĂDiEBEö E%EsEE E[E6EBYo +~4 qB2EEVEXE]EEE^l &(|hsDpZEǿEEEkE^E:Df E/"J0DEtE*EdEERE'DJ,0&)Ž EEE1 FPEDEL*E>GPQ*thCr&?EE PEEv\EOE}E"Yp'WW)MD[fEu:E)EEEbEDXMŻ=qDsEfE.EE\EiEUDMĤ&;(EliEjEEErϵE1AE CBĬ*ųp|RB(E E `EJFE^E$CEC ) XLCVOEEEsEP'E-]E~DPgG9 g$ŝΆD1BwEa EiE EE~ED黜Ĉ"ŢSŮ]&DXEfEDEdE EdWE(DK?)f Ÿ~4EEWE E{EEDFE/EKAs*5#C A9EoEvbEExEƾEUE )({+8D`EEv)E'ENEnEE8Et#E# E!l*ŬߦCDE&BEE)EE EfiDb'Ġ&AشpdDflEEE~EfEEqDOp ř"~}ğ4DʉE!E" E=EEbaE:DĈ'űibEi[EؕE3EŠE9زE5:E) Chpǣ*S#@.E)ERENEqEӃE8ER ŀ)djD0WENEfED(EEfE? D Y&H" Ĵ|D[I~EDqEJE%EE1xEuqD ~#ŀ_HWDWEEuExE E~YQEƔC;z)<NoE^mENE 0F }EeESP)E?* ĈC[@E[iE E }EE.EejEă'Ŋz&ԻSD6hENE*mErEZoEE蚴D #dB7݅DyEE|kE wEREgE3"OD&D:1EJEE4E E1BE>?EЙ{C)J*$c!Y*EEEF|[EݣEEM= Fz)şCDQE>tEbE\EEREDYDzJ Ŋ#493DxE:EEEE}ED 4#"Wğ DEBEYEE"wE]VE,D4Ĩ(w (}EE1EOEEE{.ET?~2*vk<8C&j;ExEE.E[E KE^dE.n}Ÿ'|?DdcE-E|eEDEW)EE.D|ĆTż bD6qDE~EGE-EdE lE fD3oRU&nŦ!DkEEbEEJEZkEEˤC[L* G1$EEE">FAETEBEndL}*'s7.CDLEEAEE EED;Ę %6ė~DsEE[EEEEx_D!ŔłiĺD!EkEP]E>(EE4[E DU(= `(Ԧ EE^%EHEEE 3E-BmN+ŴB?5EE~EEE ?Ep E4јł(*9+DX$]EEtEaEE?NjEcmD`qJ!$єÅDvEEG6EEKEvqEuDFv%wŪ5VD:.E\EfE7zE\EIECcU*TTÎ$EE!EEEkiE"E ,1Q*ŻSİ̮CFEH0EEJE^EyE2Dɚ,yk&BĮjDnEE3EEDEOENDo ŧIhyĨDhEF[Ex>EEd+E_E_6Dj([\NEE!E?EB3E7ñEL8ECv ]+<ĸB/EEs1^:ŭıD&E/EEEM>EfEID)PE'C qEZEGEEAEנE>E$VcC;o*B\Ąq+EE^ElEEBEkE; Ŏ)>mrDbSE.FEE&tE50EEMDO:#ĢnDzE9EEpEmE{EXDB@@#ŪSĪXD&{EzE}EEE^TE D6l[I)@ ŨHE~EpEFEE%-EP+m~*UCEZEEkE]DrĨ%Ŵŕ`DE,EsEEE<{CE>Cnl)*]Q‚&EREE3F$:E%EEyÈ9 *ņta7CLNEjźEpEEEK=E$Do= $T۩DwDDuE8EEi$ElE`]E]DE"p`Ğ}DȵE :E EEYiE^ZEDe't)ń ,jñ8E6EۤEF3ZE@HE&w1E0GBR'+mĐ'Br7E:hEE0}E$VEE_ Eå!O(uď0D^EEEĒYDb,EEEtEhE0MExCķ*?ʼn}9EfE&EKFBE#E$%EJV,*ŴCKCEEEEqEp7El-E_'EEFE'lEEO Ů#)I+ DTEEEArEƅEZE|DTĕ 4# Ċ3D\|EExEEW EzED2$#$*žND9EiDE>|E&E(ESEUDb )6v (VËEiEEEJE hEa+Eg.Œs*rĪgC>EʴE$MEEzsEΚE'E #ŤN'ŽuKDfEiREp EEEJECWDsJS EDfEEcETEEK0iErYD &c'EE0EEZIEǵEj?BE'C! *L"ݖ'E&E SE2FsvEjEpESYBj)^CyOEEDE&eEfEВEDE]e#TU\D=wEh"ErtEE#EENDa!V+_DEE EE)E+XEDd3\(W T\E%E0,E)FmE2E/E!Bى*ŒIĩ!C9EtEEE$EϜEE(XrV (ź&N:DFw`EEoLEwwEnE EDxřt *zDѶEtEE+EtE#nE?iDl&Ŝ8+PDEE EEtEqFEPC3j*$J$]a"ErEEEREzߦEgEwdW[q*g>C'IELxEEE-E3EDz5oW%yiāvDqE1ETEj,EEEPDoĽ!l#ņ8pęDEUEfE`EEh\E *D"_(8jŭ: E_EEEcExE@5E*BzUT+*@Bw>3EEEGEEjE|o Eh+Ä z(Ň0!D\t[E?7E*@EAEPE،EDkIJ/!J˘ĆDM3E*E,EEE!EsEx|D"D$n<^DKE4ExEDE EKEa*Clt*|yjALEIEm-E;F<4EGE=x#E*2:IJPCd3EEmEELE[EEDx$ğ}& eDkEEEEB'E┄EѪDΎ |DkE<E EE*EbEmA:Eџ)Ch*eĀFl.E߭E"EEEEEg* =4)1\D[VE\EMEn EE$bEKDj[`"(QD~E(MEȭEEETxED Ă#ſ4JDEEEeE1aEbQE1^CĦc)ŦŶ*"PE+EjE*FEE<)E{*ŕ_C3?EjEEEaE\$E$Et3,&7^PDgE+EȂEeEЋEIE){?CQE+E;EEEE=DHď#ZhĺUDSxEfEEE5E}ECTD+"'W1D*sE+ELES>E]E WEMDPg*)| EDEE7FEj&O ElDEN9EEEvE3EB^E+őB@5ETEU"EElEEH E*xHū(j(D/]E$EzEDEE׋E| D1oĠOū!ŷ oDtсEE&EdEE@qEN-xDļ%ť44gDE">fCGJ*ssf#M'+EւEE] FEEaEo` )sUID"0SEEEx8ErE+EhD2:OļHh]#ŔTDHzE'HE EʆEERv|E &Dn_"ńWmTĔ#DiErEYEE>߽ETE. D2UxU)pS ]?EduE@E $FEEEE-EN;˫*OC>DE8EfE7E(EkEJx_DڷtA&r0J ED^E#E2EěEE:CEtC)%Z¾&EyWEHENF>{EڥEE|d)ň#ĞC ,NEoE]E.EESEnE|EEEHEl ģn-'Ͼ(GJDeEqEEEEPNElD wP<':^DfuEEόEƣE.EciEFZDj&ϴFĖ0EӘE$yEEDwEYE?BEKACY*ݥO'EaͪE4PE2FvEE¼EŊ)mPC OEȥEVE`E2E_#E{DCX#żfDvEuEE3ErVEEDYĺ!e^`Ď"DHE)EExEPEXED rP(G& _=f/E(EGEr FÖEE0EB\*ŇĔCp9E$#EEyFj;ED/EվEŠ:c (GĂ8D`E EWE|lEE:sEiDTNvza ĢbD/xEEJE,EzE=5oE nDBU&r2o+DzEEEE"EFErC@*j}ų,e!EMEE)EvEe-EeE@M&:*-CIE2EE:EEED5/r%[)uD1qE"EPrEeElE`HE3Dߔ!HhŇpD ENE0|Ea\E#E]E*DZĦ(|l EQ#EE@EEEظ5E+Bvĺ.+8ćB%2EůEAEXE?ESEE y ŀ%)Ŵ4 DzZE,ESE`E[&Eh/E|Dxiė!l|SD6E`EEEZEfsEtDp %ٙn>ĜDE`3EXESE{1E?LECT)PlpUEDEoEF]E}E$Eׄ @+CDE/E`E:EiEkEvD#"B1x& #`cDlErE(EE"EvE尫D?ˍ Y~7DEEEPrEմEbE)>DT4O(ŨS3měEEE;EEzBEE;;E<0C+{+J K-EEKEEEE E ŀ(6 Ā DUE:EEʹEB?EEjD[ĕXňB#TDW]}E(EEEfEEăyED.#~ŌJQgD.EwEcE]EAEQE*D.T)Ŋ@W)El֣ELEFE}֫E*E WUfQr*p]|C?E%EEEE#E6E^ڬŘ'łHPD?gEL ElCEԴE0nEdEݵDkTyģD/ERCE^E?.EuE)hESD ޻&xEƙENEhNEE zE@ECP)*ŰI>Š;)EëEvvE"F{yE=E$/E EyAĀ*Ū(C1v:EEEޞEE$EW}EJp'Ť`0;D5TbEPE`EEE ED?}̅y ŽĬCAEεEʘE<3EEOEBYDIߧ&V4UDiEbE{|EEEHE{DK- a<fKDvEpEEEEPfEDND6 'Ōunt4E^EzEEE3Ej6?EZmC Ӌ*M1x}#H*E\EE.FEgEs>E戜ÊN B{)żNDREټE^E _E]E}ED^5M.ŷ;#n+s͋Dg zE] E[EtIE(Eβ|EmD끠H"Ű:WViDEEqETEErUE Dn)0 Šç_EEE'FOEEJ-E@Nh!*ŷ"ECȎ)BĆ*6PC,Q6EbEiEh FXEE E<Ùr(TJ,D;^ENE E.EAE]E !Drز*!i *D:EBEB[EcE8uELpEsDn|m%Ŵ 3dDqE EE>ExȸEIEC-t*ŌjBEEEFkEE2 E*2o*ŵ&C2HEd/E!cEExEaEDL-vŝ&ŔײBoDP oEzEcjEMEZE E+OD%!Z|euĭD E1E*EEE_E1DI-((ŊGaEEEEœEtڱE7EeC+/ĈBO1E EE EE`EE^Ù (|rĐDWYE]|EiENEEED4dnŬ"ŮĐD:ETEEPmEjUELy*CIEAEENEEAEHDI4Ĩ"x%ŁtDTpEbEwEQEEXdECD +!~ŝrĘDED^EJ0EOE .E*]E*DANW(I~>Ú E4ER[EExEkEP5E@BXI+x>ĸ΄B3EnEZEHEE^]EfEEY7EDh)ŔW"Vx˫D̀EXEPEEfE^?tE-DߋY%|fu>\DՓEE.EEEߕLEC<_)'>ŚyFREEWEԺE#EE$E՟*ЋċCDDEE>E@EE×ED"hX&`D$lEIEwE'EEEoDxv )!ɀ>ƽDEVEEEL EbE@AD#7( /һE؅Ed9EE֨EE3;Ex9CĶd+ŘcM,EEEFrE&EEڶt YE)Ŗ>b DaUE7E.E#E)9EΏEݭDZĉ"9DɐD|Er&EEtEEF8yE{UDͥo#pwjOķDEE`iEEEaRELODVļ)p ̚ßEEE0FE~.E(*Et:’k$*~tC?EȴEEEdEm-E\E4ş&ŕıODjfEvE.EEE`EDz4dK]=!DE#-EכEaEeE hETD@Q&nԖĖEEEEE͵E@E„C R*>-(EsqEEEfEDE&1EOêbY).CPEr5EE>E E~jE1DFĜTŠ5$ŏ8DexE) EiEeENEUK~E DuP"ŇD[QDE=E=EEE=WECD_)z YϸOFECE`EF5EE#0E`AO*/JV+Cv9EEEDErEEEu'Ř4F9DaEEHEEE,GE D |JŪ=ľ#DtE EE8EBEmE=gD?%ŽGž'DoE<&E<E^EE_FEfC?*/à $E1E9E>FEצEE\OoB*DCDKEEXEEuEmEFD35/H%Įx~D2BrEWE/EE5EׁEqD~!"; lDnEEEi(EcEQ\E(Z%Dd( Oa~ E:EyEEErE]L4EBBRM*qĨBD4E{JECEE*E5ΞE E7å (ŘM&DH!\E}EVE1ETE{E DE mb"#ęPDɁE "E$EEH,E!rEzDӭަ%g9*D|tEVEbEEE1JE Cwĸx*}|ZèEnEEF E`Ev#En=ņ*|CQ\EEEhE)E0EE:D^(.5&Żą eDWmE'EJ6EliEl9E7ERqD=Ę ŝŔ}\οDE`hEEEElaE<8D;'ź@zđmEEXuEdE|E E9ECĊ,+1@^A/E,E E F.Eo=EZIECü *)mD LWE+EiEE)EGE\DV\ĊR#ߝĩID}EzEEEEwE.DPĻ$h*!FĿ>DEEEEऻE0PE>}CbfH*?,E^dEuEE$EjE%(EVc_*׌ĩ>zCl@EEEEDE{ElEfG ;,&.GRD]hEJpETEFJEEE)DvJŦoDNˇEgEE3E@EfEHNDė$'ŃuS(OEJE8EE޼E-EG2?E@wCx*Ċg=y*E EELF-E]EE  )| D|QEXͼE#|EtEFE\EDQK9UŜ#zΣ撊DFyEE2E6DEt>E0}E:Dğ"WDXEψEE8E4E=UEB Dlܜ(ż ObFE REEVFEeEV-E`GfsJ*ń=?C;EEEBEME EE ĺŧ'Ś BDncE0&EER E2EE2D{~07<ĶdDEHEo)ED2ELE$5lEcDTV&Ŵ:YTDEEE'E,E EECNĤ*^Ů$EEoE Fx8Ef\EE{oSU)FtC/MEhE6Ef~EZEE D=4Ŗd$P@Ď,DtE%EBEoEEE!EDĉA!ŲXpg3DůElEEQEbIEuZErb!D^( Ť8=EEE/F+EԻEP2EIBJ*Br6EEdE FEUE EysŠ(Ń܋/D[]E,5EcE`zE2E翋ED>r=*z!O$ DR~E"ENsEeEEpEtD%خ4ųDAE:EѰEbE"EUIEHC~X7+*ŲfiIx~E`EEE'E|&E%!E1Ҍ$*JhĚzCGELEErEpEBE1D,pI&ŅKxmDJoEEpE |E,E$E޵Dķ7!DwD~EE[EEE;_E|&4D|(ŌyūÂE@1E}EMEVEıEh8ED* C[+Ŗ8D| B\0EE|aEEEWEM6E0]Ì (,pDԹXEt1E EnERMEA&E~PDcIJ;r"uaDkEi8EGSEuEnyEVvE$D9_$Ū@|DĨ]D0E EN~EE5E NE:CC]*`;EܤE2EF3E~TE]&EK!+>ĉC$$BEJȵETEOEETEzDCčŌ;'FċYDsiEPEE;EjErE D" %OŷD1EE5EGSEEJeE4pFDČ'Ůc|JEEJE+EEHEe=ELCQQ*VŘ*!+EЬE EEEE^Ei/EÏ .%)ŬbxDSEgEEȌEREEDaOo##+G_De{Em4E,bE4EگE+{E>\DgĘY#dR%D EEPEBEOEPTE* D{`ĆA)> 6ˣøVEEE#FRTEwE,E* UC9<=E ;ERE$E!ErEEs İ&pqs!FD-eEGEjEjEE3E~DVŇ&NJćӯDENEbEE2E~jEZDL &M&<"DyE>E{EFEAE*BECx*EtBtC'EpE\E4F&E|SEE {äų)(:=C2NE|E\EEE ED@.$֊.DrwuEEϊE.EEzEDʚ1m"|ID0`tDU6EwLE+E'EE~YED}(Ł Ů$a'EE3YEqEÔEfE1ER1B+*xOCO8E'E^ EEE\Ew E=+X'63D;`EE[EEA2EEBDsĢ&}!͑ķXDEpLE EE>EnE!qDą%rG+DEEqOEҿEFE9HECĝ*ōźj!EEE"EĥE|SEEVlEEP%E|ÆlyN*NCCEEsEEEZEZDB#Pm&c>_DkkE~EmE>!E(EE]DgXŀD#E1E E.ErpE'bEAD>C5(ŴĖENEyEEEE;E*TECF&`+Ġs,EElE FE~E*ME\K"F )Ŋ]Ht D||TE ׽EEEyEE?DǢX{" ODb^|EEPEgEEyE DN+#@gCLQĤDOE gEEjvEEUREzC?ī )? @EǣE#Ec#FERE*ExŁ DC_E "E"Ex1EsE gEcDխq5$vPlĝξDEE>E\EcETE0¬D>˃ľŨ!D pEdEtE:EkSEؐE~ Drs,ŧ'CJ DQEEgEKE2 EQ`GE Ch )b 9D E|E4E|Ej1EKeEvvaD*ɯă7$r[ih@Dl@EE ETE*bEED94"<CDqE6~EEaEEEmD.H'lEDSE\nE]ELE2@EhEEøO*[EEEE EnEE6 EM ź)>_5CxE@EaE D†kr!dD rEEcEE1EbEOD2^a'!DVSE Et^EsEE,E E eKi*Ŏ|v6CA5EdLEyE0(FKEӫE3/EBT/ĸ*V(sAETEEVE6EEME<D(tHńDLE|EE6E|E,`lE8yD' "DŸ+|ė@DFEIE0TE(EޟE!EDwz2ō`#ŭĨkmrDDjELE~EEEE*bDvĽ/(!Ľ DbLE˷EEE1EcEFcE [øD*"l2B-EE/ErF,EЮEl7E@IC-l*ŀŢ.EE9SEn_EEE1OUE!DUĨa'Ś'7QDUEES#E1EdE PsEDp$_!?TBPoDEE^^EEKE.EDbP$'hWDVcEME]E֊E<E EEXĠ S)RB C%EEzشEOEEEE?}Ed0fG~*xP\&EE EEEEG>E)Co)v ŵoÎE] EcEEaE_E\EE)E E EzTEtDZDĸ='8'3D%EvE EBEEzrEsDU@!9xS^DdFEEEUELE2ED-dPJv$ŲsZD}dEsEbE%EE bE:EB5m(8v"CEELSEEEYE"GEEÊhE*p#@'E^EYEFdEED<=EȓCf*N EEЁEEZE 6E}[E:D@&A+Ŵ K D'-EE-PED)]E;EB[EE"EERE`& )Ō< CB>E EyEEE앧Ep&ED$*4 n EhEdBEĈŀ!cÜ DsEEdEEEEElkD8xœ)'[Ĵ=$DUEѻEE[E6GEPEcE+t{*&PCu/7E%E E$FNEEM-ELhB=cB*S=OXERED?E?E E3ӷEKECsE(ŚkDʔE.:EEE9EjE^qDϭğG#.Ń@vDS;EZEEtEE)E~3D.I}]|"61`zD\lE%E1FEE`EEZzDwg Ō (DyNEE|E{EExE0}Euǘ3*MĘBp/E\EhJENFTERE4EP-C*ø%E{EEEnBE޺ESSED<'JU16D?E'EGEDEEdfqE7D؟!š ra)DEjEœE^E8E0EDh1$*M^D@beEgEDEfEET!E1DFa P|)(bC&GEE3EE|EEJE`1ź*w?(EE(ErEplEE]ZwD|EEEV)E#EˊERbDTTăD%D'bFD8_E\EE;EE EYE 0 c)!vɫC@Ed۲EJvEE4fE8E,$E1] ī*:,ĥ !EɥEEGEEEBE;Cįo)S `$SE'EtEWEEBE/aEMD}e%ū)[kDƉEEE!EE~ĚD| mň ż fDuEOE$E*E]EeErD>&Ţ @+DWE EEBEE'nEv E y_*JlC\9EEP~EFBE^"EU+ElP=B[*ũeG=^ExrEEERvEEJECCu( ŜfqDzEEEREgEhEjDR;#֍>[p룻Ds'EE^ŋ*ŎC 1EgӬEErFbE5+E2ECP*ŦroòEVEqEhEEE@QEXDE'Łr6++ĆDEMGEuEEAEpoEDfZL="~Uj DyEEE(EEEw`D^nŀ:$lĆeDEEFEvE*E0A88*߶+DTEEEEE!ELEX;IEC-p(z%?DY*EOE=E E4E7YgEfDĤ$Ŷo8 DE$EjEEEEaDwroK"LĞ-DYoEE {EȇEJE6BEZD*ķHŨ'Q#DXQEnEEEEiEr%EE4üR*ż~PTC 3E- EEFEEM1E. C(p*D`FEE> EWeElEGaEPE+D%' o&8LDjEfEpEE]vEnED [Ľ"H:3D.E:EF=EEE2E~,Dp̎4#ܤRiD)\hEE|EEEEDexō(acCIECEJEZEE⛢EE:<*6*P,B[+EXE=EoFuEE%;9EoCcQ*I EIEnE$4Ec4E袼EOWE<,DHx&6> FDsEm]EE2E9E2uEDș{ ДŽMĢDg~EEEEEEDZaŁS%LD8aE(E\!E{ELE80EE$aÕ _)8>CBE?E EEE(ӥE="EbXг*2:Ād#EECEERsEE@E Cژ)J TÝEEs EcEEENE_E^{FD\ڷ%RP jU^|DEE&E=Ep'Em|ED. L`N TNRzDŦwEfEE|EήE2EDDA\Ň&ŃTE2D kYE(dE}E,ECE)E" Er h.*iC(;EEEFEEEd)EdA5*_|"EJESEGEzEEJHEC( mADjEgEE:Em8EİfEbDt$tjDX)ER;Ex'EEEmCEDZ3 "Ū 6DipEEE8.En&EED,Ā~'FlDKRE[;EAESE{EEBE<ñMQ*#C%}3E|E:E#FEEVE1EP`Bu*Ŝf<E:E%EE^EQEOE D(6rn%'D'}-*;ĬYDвExE,E bEE uEZsDBIJ$!$gDEEEPEEE&8ED7^XE$<ġQDaEʴE#ECE*C<ÔnEEUEE E-ʵEnGE8CE~$))ŗ5 1KD$iEvE;EEaEiEMD`ŀ%ITD(cEEyEhE|kE5EƏEuG Ŝ3),Caij)) ]}EeE EE-EEU]E\?Dͺ&ʼnjLODRE)jEQEMEF{E03{EDUU]͔6–DyEE.EHEESEDcJĆŨW&SͼĖ9De[EL-EEEQ}EEEV o* WޑCX-=E:E}uEF#EeEie'E@]t*IŰeêE,E&E*EE?CE:,FE CSQĺ(gL(U8EWEE2EE9pE0dEbD[DR$ŐEŢdĔ=D EE,pEfEE#VEDMš`s!mG)DyrE\EEEEEEяE/D3ԫ'ń D3DE~EbEzEEkEv0xDԧ"Ȁ؎{EtDn^EEVUE)EEE靶DyB"j#oZtDB'kE;EEEΪEpEcD(?7T(UDB MEEN!ErE&EVEPEh_Ő}*CMBg.E*E E#EE\E6ECCSĵ/*ֳݥתEEE@EEXEVTEdD5ĿQ's5XDZE^E3E,ERErE>Dğ!ƓA KDEPE+EnEEE>,EnD|Scļ ő$\ārZDHcEiEs{E nEEEWELO H))ħCbEE^*EEE FD E7EEO1EaEXEIDǾ|*4"oā=xDF%lEiEEEREߒEhDĢ-X<(ĊDME~E !E4EYEEEKzpq1*:8B1/EܸEE(FEcEHB5E :C*_coE EE;^EzEESEEDR'Ŧk2DXӏE.EEe9EOEFrED_!bu퐨DWE^+EEpmE EE}D4Tf(eŹ$̍Īw[DdEwEE(EEtYEUDij~((CŝFEjEẸEE"EWE. z*Ճ@V,'EE2E<FʋEgE?¿ĎݚDha{EE(~E:EME_EIDP &ŧTġ@D^]E,ETEEAEE@љE)Eb: ň)ļC%?E]E E FߖEOE%E أĮ*D# EEVxE|E/=E҂E~NDEBC6 )( PjĊE{UEfEIEEEbE;SDr$Pm_YDoEvEEYEQE?EDVm4!|"wDtEO{E.EEEEfD8ĀoE 'z&DVEǻE0Eu.E>\EEE UZhQ*RZCȄ7EcE.E="FEaE -EBh*ŸdQEEd0EE2EE|tKE C`(S/u  zDғEEEFEbE7EiEnpD&~đO#uKD]ES0EEsEEE xD,#ấ{D?mEEq E&E"E1wENDl!mş,(v] DOEE4EE}wEWEEwÄl*:aMB U0EEE FdEsE4E,+C Đ}*ޝjEdE1EuE!DDj ^wŐ()zĘYCaGE3EʯEFKE֣E=Eua`*&+ŀĠ@^)EFȨEEF 4E E;E%CV5)" xI EE(EE$EdEgZE/5DG˾\&JOEjEņEBEEEpETt*;PB01EEE%FEGE_]3E(C;ċ*ş~ÃEEE`E@EFEQE6 D Iăm'ž,ĦDڐEFMEEEBEI\pE^݃D4Ĩ!ŋiqDdEEE@E[EzE"D$4kŀI$X]cD gEAE3E"E IEVDE.[D' *7œ(n*CHEE-EEjTE$E@E%GŠ*,OA)EVE~EFrEލE`;E΁CÄV1*g "| EE.E@5E]lE>EBYE0DG&0ŰCDmEEEdE~EWENwEѤD K f'IJDtV}ECEEEE~EDVvCŒ%2HDq_EE|EEv[ERE|EP )^=CLEAEaEcE Fq(ExE!l#E`8mdģ*I"-L"E:եEEEEEEl`BETԹC;u) iÆE#E5EʔEEڿE8`E7LD}g%ŸXDE9E EEE~EwDŭ 4DmvEjLEE~EGEߍEyD3?n Ş&>-DzXEESE>EHE E Eja<*jjuC9E6EE#FEiE<*EcB Q+ 5 6ë&EmǢEmEjE>EEhIE\C(1P‘DETE_EfEE2gEiDrF#LlN7oLD/EEEe3EwEE/ DUlŗz"䖢RiD(nE޳EEpEeEȟE]DM(ďz+'Š0DPE|E~EnEEEtEhE+*5kC2E.٬EEFEE2E33 CwP*źgUrELE֩EEdEĹEQEeD'K @)KDqELEEnuEE, oEoDW"bůĠ̮D‚EE6EE,E2\EBϽD5oĠ,Ő$OlhDxgEE1E3-EE}EXDuYb(!HC9IEľE93EEE<E=EQ1DJ*ţĠAH*EIEEgFE]KE9E_WxC-m') ^ Er EEwEEEXE&,D: \f&pN}@ĉD9E% EEEgEvED0F}z ņ D^~EeEEtEfEEDX2%ֶpKD`EۿEEuENE7ENE9-à j)C AEEmEFEE"EV +RK<8#EޖEEzF8NEiEQAECzĨ) xûEdEaECEƥE&ӿEF_E|VIDh%9{WdyDwNEEEFE@E}ED> fY OԗDAwEEEf,ăt '~D=QEX;E*EˑExEz'EEäU**CW3EZEE!*FE䱬E21E\PCt*JO]tEոE2E]E;E9PEOE׷DU'Ř']b%DaE@EbtEEV*EhnÈDTļ"ťGdĆD7EkE4EERGE5 E4D1qā#(jDhEE.EEZEVpENDO y(klClJEE0E"EETExExAY* U,MBǯ+E=E.EF EïE8EfCߛġX*=7a1 EEEREED|E7WE.*DĤ '֟ =ĪDHEE*PEE̓Ew4EBuE&D7 M\&wDEE6EE:EދEJD\K%oa%OD%aEsEDE\EcE E'E< Ï źe)q%CCE:EEEE٥EQ!Er޴**nhl flw$EE(EECEòEl@EMCIJ) +fEL!E7E"EE7EJ^EDD%QplSįDEE(EEEG|ED[ē'ŀ ԌĺۓDExEE1EnnEEED`E+^p&Ŗļ4DYEvuEE( EE3E/ E 3*ċʈCDP;EEE"FzeE E/)E3AзĬ*'ň*EިEUZEEܶEEGECR(ԝv 1DEEE0E8=EfE`DeL#jDPEEhE3ES|E ENJD3+"ű(fDZ]qExmEEDEE,ED.t*s'ŀ ĖDRExTEgE HE_E˒EmE%_X*ŕtĒR)C0+4EEyEg FE`EԾ0E Bf*ŋ{þREvdEKmES}D:b"HZgĈWDԹEEw=E&EAEEDKu7#9Ҫ[oDiEE*eEMEHDEEYDn(C~|KER{E]EELEEME*HÞV* 0zB-E0_EvEbF`E&GE7EaCT-G*žvyÏ[EXڜE LE E%&ENػEVE0&D&űūt9`DώEEE׆EOEtErD5(*!`ŢeďDGE{EXiE]~EdEED^$ςăRDsbEE lEMEE \EPE9o9 7.).CCE EE$EZnEGEN E*Ĕ"YX%EyE6cE FE؛E1M?E4C|)Ų ŸE(EEE*UE E]EYYBDFk%+eQlD1EaE0EzEwE{ED{Z r ř_DyEE EE EE?DLHZd&>JĆ6D<[E@ǽE*EEEEl EK'ÁW P)|fC^EBEEFMEEݞ*Bb2C 5E:EwEfF1ErEI/EtB>*Ń'vEmEEhEJE#E-NEOD P'>fŲ ZDDEOEhE FE.ETlENxD֑ʧ"œŹ/}v3DocE EKEEEs ED$)vL#"klLsD1jEEEkEEZED]s/(ĞfD8LEOEVEE #EHEEbVëT +IĊtBi-Eo EkEFEqEB6E0KCW~u*SÉ(E@EEElEEEB5UEw"DgO'sR7ĐD4EgEE ME,}EjsErBD& E!g;b4DCE EEEE@EQE%D>Sb%eĦVDIcE4*E_EEB$ERE Et׭ M)ŷ8X%CEE|Eq[EeE#EܤEE0¤6*}07|&EEEEE_E%>E"C+ċ) ŞkôEEKE!EXOEDmE]E|=DA8&$>aMۍD݋EEiENLE[;EzEBD]rNVjaDF/zE8EhnEL$EEAE D>@LD<%ŘYU;D[E!XEEEEeEQEG )|C=EױEZEFEz/E&Ei:+is͇'?EsEEF^tE/EmEEQC%vVH) ĒEudEEVEE FE dE$;[D|$ź;uběsD E1ElEhEߒE2ED!\$y!š+"DrE,ESEE)E͏Ep1D5& p2DTEAME9EEES؝E Esîmů)ĤF?C16E微EXEEEsE/EͩB@Ĥ*gaØ;EcCEEJEE4EGMEDܕ!(ޮ"9DnEE>E,E}EgEdHkET vDIp>#AzpRDEEE$yE%E\E DH{605#cvDikE9zEEE`E-ED00'x( XD^MESE EE?EDle]EgEJE EPEՙEc]EEرEmE FEjEb&E5+ eE-EE;EjE¯EqDEC8Ħ;)ş ]+)EE`5E`(EEQ`EXE cEUD%)aȤDEmGEzECEFERlEҥDg2! ٜޑDsEELEgETEEDd8]K'~O[#DuUEûE#EĚ*ŵnXE{EH?EEEȼE+LEDGQ((]WĄDʈE!EpEEʺEajEqDzjf#OevD2EEhEWEE;EOD2}u"Ŷ0yDlEEHEoExEEuD rmJ'ODKNEٹEZEsEEETEFwì9ŀ*PČNB/EEE,FEX#E/4E/Ch*#Ű\ME]EvEEY\EFE &SE1D5ċ'ŞZŽD16DY EE]GEE-EXrqEDʂĤ!`yĔDZEb^E/E0vEqEEDfhļņ$Żu]DeEE2EbNEoExKED/{ R(“ĆCFE֨EEEpE#EjEF b;`*.`g(EE:E+EENEnGzkDŒEhEEEއExE JD)* š7)XD|EvEaEEVE E)DQĈƼ%=ĒBD]EtEbE2)R+ EpnEwEOE`EEBbE*sRD$,B/^ĎWDT+EZE}EfEc EK*ED`".! dDuEPEEE;EnED9Ăű&"`ģ'DVEnٻED0EE>EEp'EBʰ hSI*jÛcCC7EDZE``EnFEUE,EnB8*ŧŞF#E!EvVEExEboE>]KE*CW<(jbiD-EYEE#UEEN|iE unD[=Ć#BruėDEVEE0EE8ED쾀"L̥ĵ}DmE:EE#E EsDEFD#MD6')3f-.DEE5IEEAREpEDGj"3 UD/+E?pEEEnvEElDljĘv($h؏bDh9fE6ELEE|EED {(Ŗ>,CGE %EzE1El@EsEE1V>Ŵ+_ĠF[AFA)EE|E!FhE"EF@;ECZ(*Ż ŏs EIE;)ED E5E`mEYE4DmZĀl&ţ DA DEE\pE"EExE,Dc0 @1D|EEE!EEEhD>TĦn"%XIDD_EMQE.EEqE&!EUE Ŕ[)ĞC@EYE(dEExEwʦER$Ezmµ*8wĕA§!EErEEEEOBESӹCMĵt) >5ËdEU$EEEE.fE`ENDdd%ž"W[$DEXEEEE]~E]D`ĥ} żŲ̀DnPuE:E,EE<-E+E\/D2 >ļŨ'J*D/+WEE';E\JEVEؒEs; EnŞ8*/L]gC8EEE F EDED+E 5Bzt*cYC^EEEvEEETJEC:ĺ(TőĘD}EEEZEEhE[jDně#5ŏp:^D+E|EhEgE~jE&DE DGJ3kŞZ"żוDnEXEIEZNEEVE?D&O+Ū'0drD&PEv|EEtEY EEEVÎEh*C(|1EfάEpE%FELE3ECĀ*RūcE>EE*E E+ETvQEvD'Ŧl>+dD EaENE׮E EoED)5!<Ń5wD uEEE5EEcφE"D?mŲ?$+/eD%VgEEEL/D*@HF&dą..D XE1E E%ErE6ݛEB0 E|Þ( *NĨ2}C9ELEEk F EuE*E@A *+ņ.PEEvEE%EdEj(IEW{C`(ū9ŧ D,EE1EH&E8E%YgE.gDQĐ$źn0DqoEEmE EE쫂ED?Svr"ePǂD%-oEEEEG5EbE&D)ĭt>'a D7QEfEEzEE*E2cEXF*Ŋ_*Z2_ C42E^ E*E EELެEn2E/C;*=ÓElEECE8E)EPE<DN~'o'3DEpE#xEE*EپnEAD"~t\PDEEEuE5EEnwEJ8ExBbC WE)*#az ERΜEE8E,E 5EWE'DAX-'X@;DEYECEPmEJEtED1z !ŋ)IDEBEXGEӬE_E3EDә] Fŷ*%ڴăQD3|aEEj EEE蹗EE N)ֿCP=CEFEE FSEEC!ET›İ*kĴQ½$EEEEEβEP?E-CDh)Ū `ENEExEzEl"Ey^EBD|g%h]zRD E E~E:EEp|E]DĊ@O ֗DxEE*EErEhEn]D/LE`D|&ŠDf6DrZE]EEEEܚEc E4G ř&*[C;E EQEFcEĥE%)E`@<_b+ESEzEFEfEGETC-N)ŜV RD2EE7E"E>E)eEAk_Dќġ$ŗ5*^jĈmDcEEBEnEzEEͪDAr\8!yĴYD$qEvELEdECEwED/Ķ,Ū'ř%+)DFSEFEf`ERfE<E̎E*aETÆNb*Ĵ+C4ḘE=EFv}EKE)0EBɂ*ůųtwèEvEqEրEdEENED((Ŋ,!D^E%EEx E\EmE8{D#,Ŝ~\ղDEEX{EqE$ECEϸDJv~@>#ŦbfpDjEE4EKEf=EƓElD$r)|([CKEɷEEJE0EۡEjES\*@BU-EE2yEt(FEAE17EYC~^s*o9EE6UE?EVEиEUE%D1"'NY7$DɎE|E1E`E_cEpdtEM5D>M!^?>D9REvlE iEE_EPEUDl`Ŕ$ŽJcKSDbE}EME,Eq}EqTEE ij E(źeęC{DEE9EަEsEAEb EČ*{ +%E)EE<FE ^E>EtrCu)Sg Ų)qEE}EEbE*ݾE0\E@DĂ)&<OIJD*fED~Đd!Ŧ#)AMDExE) CC6EʮEEEE0E4.EWBA*ŭ5aDE㇡EEoE+E5ELE{D,Ĭ4((eĘFDEVEPEE7EjE~sD/k#mSynDfE[EEwEpdEE&DzpeI#=S2zDkE6[EdEEE8ʒEx D/Q(" 1DZMEE EVEEFEmEnmZ *`%ĨB@/EEuE/"FחEqE!X5EsEїEETE*DX>6'Ŷ2 DXڏEREEAE`E^vrEDH_|!rsBCDEcEEEXnESEEDoeĊK$4N\D=dEyEE3EEp8E+DFT^8)!SCHFELEEJEEEE2ż)*qĀ@po'EkE2EoFZE2oE)=ECĤ* *$E[ĚEEEEV Eo[E8D3x:F&ŐJDkEB$E_E=#EExyE^D ĄpEŅeE$EEcELEEk8Dݮ D)C8GEELE EW6EE]fE7pP*?2(EҨEjEE9E/EHGDEf%aĵEDpK^EBEEZEEEiEþ> {)rfC?EhղE> E FqEEm$E K«Ġ +vi vD!E٫E]eE FEIE;CE&C*T{)) *gEEEdE!EE%aEQD4$Gū]ĩnD$CEEE'PEdEEDtI>&!ŪzđӍD9uEEoE*EfeE֘E/DV;ĮŌ'ҏl'D~MWEEX*E+EE~Ex EЙ;*q\eC8E}hEEFEER,Ep_B}*W@ûE5EzEE~E8EKEzC9ď(Ť:D_EiEE,WEiEo9iE8lDQ#`;žsUDI߅E XE>EEEoED,DFŀY"NĈxDmE jE=EEEET D &ļ~ (Ĭ DOEcaEWEE"E EREn1*chBv1EZErE(F;@EOE13E$CĖ*w`(ђ-E'E4zErE@EEREDĝ'@))+Ĕ6DE?EYEESEHpEB߄DĆU"dŌztD@1EvE E4EGEg8EDŠl/#GaD&fEuE?EkEZEED$3O(*ĵCC9HEpEGEE|;Em>EE*$Ɣj*(2MA4)EWWEEFpEëE;EL CrA*V K EE"Ek1EtETEJYE2D( &UnDĔDEEEEWEEywEDƅE ŐĿ8Dq}Ev8EEL!E EEMD Va_%ĄGDK_EEEJEZEE!E,: Q)C AEnEE(EB5EEf#Etl2*d/lb"E,EExE`EE̅BE>C`ĝ9)* EEE:EE#EE`ELDeQ%{;Z&DEE8E5E E~ED1 ų ŽQD vE9EELEhBETٍE9D>E$&ŦsG-DWEERE=EߔE3E EPùe*cxsC 9E%E8E$FE7EW+ECBm*N;þEEE&E1EiEwIE-C*ud[( jbDƔEEErEEz>hE5 hD̬$^#ń$q DmEE%E GEQE EU7DG\"ļЁD \oE`ExEEEfE֤D & Nx%(0D6PELEE͊EEFEF#E]RD*t|ī C],2EExE FEEJ2E Cܛĺ*ŘçQEM|E+EEOEE+QE0DJ'H4*$DTEREEzEE6oE\DƢ>V"lT`\~DaE*EEEE}EýDoů$CyugD|gElEEj9E0}C*ţ1 鴼." EݛEE[ElE❼EXEN .DĎ&Ō ŀj?DJύEfEE>E{EvEDʊ dS~wOADVw~EiE$'EEeEE4D8@Yķŀ%Ų``JD\`EE5E|mElbEdEQE[e$ U)N0CAEڹEaEF5EtCE("E6+\B# }#Em{EREFyElE@ECPď)M j*EyEIE EE;E_EVKDrЦ%L*VDEEXE,EEh}END^đ= ť6DvEEEEpEW΍EDǁBFd&ŹW-DXE!EEE"_E.E E(Qõ )poZyCM:EER EEEEj*EUAĞ*'E-E EE-ETEHE$Cĸ(.>prDQEE0CE EڭE3 gEIeD͌Ĥ9$ZmDÆE\E-EE E_ENDƃħ-"E@wDoEEEAnE 9E ED+xf'ŐvrD;pQE)EEEaEZEEE <%*ŀDC!3EEE: EF EˬEv1EhCMĨl*fFJEßE'EBQE&E\tEAPEDSn1'>&đDxƑEqE5LEEzaEnnE2DČZ"v0*D[ENEE!E.EՑEEE&FME4կEWU9E0jC3b*,d EMEEAEEE̡WE3*D$&Ŵ[Ŷ?ļgDILEȂEEPEOaE{uE3D`yĺQ źG$ӌơDgEHEzEEEEYDUp[ăz%ŤND)aE=EhEEEE\Ed )z.ƽCwFCEEEFEkE!EK4Wf)+ŗ==$EǦE[E}EoE$ѲE`@ECı)6 ÎE='EE)EEPE\ _EUEDX%ő6P3EVDą!LĽD\pE8WEEEEEMDw.ī,ŀ6'űTĢD>REqE]E"EuEE8"EMVl$*.$C4E|խETE$EELE.Dt9Ű#ř̩nDZiEܨEEEBER6EDjrŪ(C~JEEnEEZ&ECEEhMmŇi*ЪUB,EwEӴEEVE副EF8E#XC+w*ř5E8ڜEV?E?E+ExEVE#&D)f&Ś<:DюEEEBzEEtEŒDٚĖ8!d̊ĐDj0E>EhEE@EEomDU(^ź$FD\SD$bEEWEzpEFEeEE z2 j)}CCExE&E FEET_E EF~^ľ+ 2Ġ-%EpZEPEFEHEf?ESCɴ)& FEE EEoEE]EOBDhɃ%ŤQ\D5E[EEEE|EɚDsĆ> łCWD&?yEmEEE4EE%DcFŒ~&yݽĨ7DC[EUE!EEEɚEߞ E ÐA ?*BaHCKyEE lENayDm""|BDDE EHyEHE8E+EľDCv$9Ŵ9#ŎqDjEE(E&E *E ECDgĕů<(KģD> LE߷EEjE]4EEE [XD}*ŕNĔ9B-EEJE"FEE6ENC|*н*Ϋ32E]EHEhEE$EKUE#DeĖK'Ş7ĐDEE|EiEeEcsEDܜVM!~ıDaEEMTEE,E͈EHDtac$8p\9UD"cEEE.dE$Eh6ETQEzy ſ(CCDEhE^mEE?5EEPE%` |*j_oI&EI§E|EE"E>E>EC>t )ŵP _ËE*Ef EE7 EfEEEUEţE.m&EZHe*66-EEEhE3PEʹEgDEsCļT)Ň vNE`"EEƐEdE7E^ cEVD?%ō#bĢDLE8LEE.eEEbsE ODSWkjl!厜YxDJsEE)HEp$EE:EjD"7]ŀW'{pt"DBUEjEE]E53EƍEO'E"ŭQ*Ŵ}8IC7EXE -E7FyEE-EDזBĀWe*dR]fpEߐE KE|eEhEE,.LEwCƌF{(ť0DKxEEӜEEEjEpD\Ī#űh|RxrDEEBE6EEnEqD 8}đ2#^rU2yDPClE9]EEzpEbEiED: Ėno(@юDlMEE0EEjEbEEUw6+ŝ,B /E`EE^F-CE ED4EL/C*!÷E,EEHE*!EE_SEDhF'd3tDEEEEԴEzqEDp98!nŀ]D;pE*EAE]E%EE @DgČPŊ$3Ĝ\D9eEfEEDEEED8!ņx) j2C+FEe,EްEEEDEyCzvj(Ŭ ŋĒEtEEuEܑEE&bETDϳĜ$Qů\nFD:EEEmE3E&fEDrָ !ҌD uEEEEE E}Dmk9eJŊz&ŧ&ķ#'DsVEEJ;Ex"EqEE{E*)Ő4KaC.8E@EGE!F=EEz,EwB*HE?EK@EF EꭷE,t(ŧŹ{cDtEOE)EElEiE4qDĐn#ʼnrs-D:yEP^EEdEEUԃEQ@DV|;b"4"~DGmEEEgEEHEED"+'6U DWOE,EEENE0E<E|ÈL*`tB:0EVEmEEEEY~4E%CĐ)B}ӖKE]E:WEJE?EEREzDķ''Nř-DEEoEsE EpEꝅD+!-Ų݄6qD?%E]E(EQ_EgEE]DظgM$ń|]dD8eE7E;EhsEfENE}D ޿T(^oC_GE)EuEFE$EBEÚ|s+$@b@(EEjE# FEEt ;ECĤ=* žv EEE6EEIEYE2Dÿ5&ŸŅUF=-D!E~E"?EEE xED|ӖxK Jfńc8D|EENߘEE4#1 )~&C @EŪE.=EjEOEEta$Ek†5ħD+~?0!EEX|EEEֳEBE0}CvJ)Ť 4_EgE\EkE׻Er"aEQND0Sw%Hs]IJqDJxEEEyzZ'Y(D {WE&LEE6ETEzlE E^:ÿf* Ĭ(gCC9EqERdE F@EީEF+E:NBdę9+Œťe=òCE& EE?EzEEQJEBC:j)Ÿq)LD:EEE"HEhEhE^jDZT$řg)q DEiEEE^EHJE̯Dy׫3?"ŨG~Dz6nEAcE^E EE%EPD4)'Ď DfOEʄErZENEREϟEE@*F(B1ECE9E=F[E죭E3H3E{Cu{Ķh*lmWE:>EKBE֬CR(TL VEEmEMgEbDJd)A'CIE̶E#EEֲEԴE_[E91őO+dt B:+E?E,EFREE8EjuC*ŤF [ü EΛEE]EXENE-WE,D"2:'ŘbŔ>}DڣEN*EEE&EUvE%Dޙ/1!ŋMZZDT~EEDEENEEoD[Ĩ{Ŭ%AID`EEn EEgEp7EEޥð ')@SCz.BEɳEE-EENE("E&$*Yt#EE^EJEZ`EPqENUAEC.6a})v D`EEVvE(E;EҿEx_ExIDui%Ń!dxU$DEEE EEET}E"Dَĥ~8 Ėľ1DywE (EEE E]E|DB1Ŋ{&ī1DYE\EECEDE E\ E0_ Ō)[CO;E{E<EEAED\^KŲ|%ūODVaEwEETE-EEuEÞ )C:CE EEhEfEE EBV@+ĨpWd$EDEdEEl$EE ?ECLĠ) ŭsEEEŎEE־EA^ECDԹ&yqūRyD ֊EWE EEaE|E/D5ĐČ ]&DX^xEE#E "EgE،EjD>HulC&,yO3D/&ZEEtE"EzEN E E ű*œĮC<;EjE*E#EpE]ȨE"a(EdR?KF+flxALEE>EE(E˵EkFE C"z&t)Ӱ .DɐEME3EEEw.eE`D8Ģ$0*iADEszE#EEEāEѪDjř?"TEFDpE^{ETE$EjEOE=D 1 5'q8jDRE"E^fEEE˖EPnE*Kr C+O4E߭E4rE˨EqEE" 0E9Bvb*:T$h\EEE>EEEhNEED1Ĥ'ŀ*lEEVϚE{ Eq .);HC=E >EΖE&FEME6(EP@PĜ*Vdi7EEE FEC5E~GEfC[0) Y#DxNE2 EEENkEjdEO[D.Ĥ$KeMgKRDއEEmcE QExE1E/AD !ŎDqE0EEEEEHDy4[Ő'ŤNEYEFEJE).EB!+UvrEE}EƉEEhWE^PMEhDϩ|(ŤDPEEłE3E6EkEN-xDĆM#'Ŧ{ĎD Ev=ENEEjZEED#y~Űj#4ieqDJjEZEE"~EEnE(Dx+ś5(SC}LEEE?CE EOE|E8f *@wB-E#EEEnEGE@X6E@C* * bӪUEEfECEXE>vE͔TEU Dޗ'P׋7ă|DBEEE0E;CEݜrE>~DeNĊ!: 7DlENEiEȄEE?ETDcM:%tĴ]WD"bE7ErEcE-EߖEE~DW|v)ſ0CDEEXfEEEaפE{XEŽ$*;Ĕ2 c&EاE EE@EaE=ERCĂp)ŸA )àE7EAEcEPEdE=D\En9D-%XOĥD8EElEE4ENzEʦDryJżÒDzEEEjMEEyEDJČS1%"лs>Dw\E_pE\E2EnEDEtEév s)XC=EEnE*FE$#EB'Eqp|**ssE\EԤE EF?ME8MEEE@lC(` ` EۖEYEaEEE~dEݹYD;/$cFD8|EsETEEEEѦDļ "l!MDߝsE[SE*7ESUEKE줏EJbDv3 Ű.'Ė!DUEFE6E|lEEpE<Eš`2*ŶOC6EE2E#F'EEt.EhB/ĺ*ŔŮpVƹESiE0!EE E$EMENDR_(4ΙbDEsEE E dEkEuDyĂ#:u ,yĠDmEE>ESEE.END |@"qͧhaxD:(*_~DD ,NEEEEE-E.E_c|U*MĚB/E6uEaE7F|EteEw5EcHCx*I ŊŜ"EÝEEEZE!޺EĆTE D/t'hh}/NDEEcEEE[EsED1"ŊdıhD3EEE*E/EED4#f[™$l.ZDtdEcEEEHEw8EyDpĠy>&)ALCEENEEiE#EEEVEmϤ#+h BO'ETEE FTE~EJE=EEDPhA&Ş5=D^\EĦE4NEFEE>EE% ))gTCԫ>E EEEECEt%Ehy*%<ZE_E'EpE?EEIDE9C&'#A)O ċzEFE|EGEgEEubERD0%ňŦa@DԈEEtE ;E`E E~D,Vų!ų@"DjsE4PEiEEEEDR9ą7'Xe$DUEHEE\OEEEEBkL*NCb6EE!E F)EתE@-EBu!*Żw^1nEصEHE^EjE"ʷEKECp7((JěDDɓE-E"ZEĺEYE jE.nD:Gĵ #ŮlxݻDE-E EFEEq7EUD|ĜY" Ĥ{DSmE"EgE EoEȒE֮D^ĭ\7'@wp DNE6ȸEEfEHE9EEstda*HB 0EEyEf+FrE4E45ETs0C&\*ʼnMPhEE8(EnEbDEvEqSEDLl'x/ĎqDwE E,`EE,EɧqE58DKԟm!ŎŊӪDxԁEǢEEjEEEDJh}DC$ŰV`DeE4EEEҨEc(EDvĐ 0(r{ĺQCGE\µE&E9 FEEByE( äE*y5A6)E8ENE@F,EEi:[E7D`_&MmtD+DE6EfE ElEOyE9Di^ Rc;D|EuE4EsE`cEzAEʩD}Rł%ŋjCD^ElEE5E*EEzE ŤN) čާCj?@E ECE FEPVE $EH0\ę*3F ”!EEOE;"FM)E\`Ey3CEnZCĪk) šÃkEEENEExEpaE^TD`8T %OpZDEEJEdEE$E[\DTcŎ!ţܚDtErEvjEE1UEELDC0<ļ_ 'Z2"&DVEEEEEԡEf E":*|bî^C38EdEYEEWuE8*E8,ECBI*TH=vE95EpEaD*"ŇgAFĚīD/DE@JEEE7EED@}jt1$~`cDAYfE@EEER&&&Ė,D&XE޼E+EB^E!EvE$ EÜ+ű$*ŗ/&tC9E~EE/6F~AEaE0+E@lKB0*ŞF4dEEE,E}E_EIE$SC;6(ŀr~KD EE#EKEME hE kD -!#vm>DK=EE,E,E:E^E DZ!ŃbD]oEErEGJEfEbݑEZD'ģ'RD&PEйEEqQE=EڟEiEße) CsU2E&ENEFME{UE:2EC.P*ӌ;EhE&nE0E!EEPE4D&3G'Ţ#)tDH:EFEEE%EM;oE^aDܘħP"ŕ 8DqsE1E7E`WEEKEDbmĄ/$IThDgEEE!EE` EnDӜF)CS>CHE`E (EEEzE<-EJ1bzŻ*Ŭ$Ax*EfEEgE EE9EV+vCP=* ʼnXt E8EhE_EvEEIXEJ,D&6BȦD4EڤEE1EE[vE@D8^ *QpwD~EE`EE0jEL̉E=DXT(Ź%xDKD0_EּEEEdE7EE˼[ {).{CAEwElE|FBE3E="E{ĞQ+2nB©"ELE EpE*EuEOAECmd)*H wfEwE`EFEhECſE_E8HDFĄ7%Yĝ@D/E4}EyE>EE6EZ}EDk3-Œ !DYwEmEqEVEEwEŲDݹ@jŔ1'49."/DXEWEvEE~wExE EվÛ r*%C9EEJEV FE]Eޏ*EAXĄ[+ŧU(EEE2EE@Et,IECġL)@ID E$EEE>EEQgEdD!6$=FpP4D EE4EEpEEVDR̈́UŸB"weDoEE$E$LEUE E D3'-9'QDQE(EOEE EmE)E\<̡Aj*Cz3E7E\>E*#FvEʬEj1E C~I*lAEEZ8EEEWqETPEqD-',$KDȑEEEnEDyE%oE]D_OĢs"V~VDp[EzE^fEEEXPEqDOxph&NHq<IJiDEzEE2ET-E vEjD;wī DŌoD~EEAEEEE9DjZ$ŤZ@MDJaEoE`E8EE[EQEY 6(YعC CElEEͼE7EE K"Efu*JReu$EEdYEE@E0E%@ExC/s!)  ƒÉEYEgE3EPE,EL^EFDͶM{%jvTġD݊EEJQEET-E9|E!fDĎśP vٔDwEEDEEDEED6CC&Ÿ½4DL[YE|EEWrEE?E Eß q~*nC ;EEEPFq^EEX(EeNA:v +Ń+~&EQExJEEEbE GELCĜ(C DqEUEEPEE9fEl`D JĀ>$ň2Uk'D)EJEEQE+EEDq)ſ["Ş}kDpEE|EEnEbEtDL-WŰ'lD0REE4EsEE0EED.unS$ǫtlDtiENbE-EE(BEE!D\")& -FC&PKEE>zEEjEաE]ED&IŻJ+.TuBw,EEyEN FYEE+8E aCl*ޯ` EEE,9EE[E VE&D7W'Z:į}DETEE`EE4uETČD1.r! Ŷ DE EO+E-E?E/EDa[$VPDbE E!ET=EFELEhE<.] #(ōYDCQCENEjEFtEE!Ej*ţ|5&%E5LEEj#F'EIJEb?E8ըC7!))H? ŲiÜ E1lE+%EE޻EU EH^EpDD߅b|%O D)EU'@ D]SEEEfEEEEIÞ)Ō8ĺ|-CZ$5E?E E FH_E*E\%0EBk)LPvwOEߠEhE]EEENEGDYm'ű ;kD+EPJEE[yEElEyDϤ'"cŮq}ǴDiEEEE(E ED޵sl#Ŋ0XtDjE~EE7E2E-yE-Ddm(ś-D|KE|ηEEF2EmE {EZǎX6+gļB@-EܪE|EDFE E6EuMCN*:ŮÒE,EbPE EEEbUE"Dn;~+'œI9DE.E2EVE`EsEVD|$+!źAŻ$D oE^E EEgEEEpwDRa|S%4ókTD'cE EgUEVEKEEE P)+~dCDE]E@EHE1-EEEx N|6+)f*|%EmE%E:FTE߱E>E^ӛCYĔF* ŊÄEaڙE}EFE+EE|]E=DIʻ`&|ŠSPĕgDEgE|0EEQE4zED>8~e:P`D͛yEEE-E;E+EWDLt&ŕ߽n8D@[E"E-EPEE=wE%EV< :j*~/bCx=EXfE1EFEE&E0=|Ęq+jôEEE EnEEFEENC:=) /DE EDE-EG E?dE[DzQ0% CũcېD1EEwE/CEjE`JERD~ _G!aIJ?DqrEE2EEl[EΏEFD>6ą9&Ņ 8D#YTE/CEgE[EEElETJ7*:0(6C5E׮EE(FIEE /EprBĶ*9ťdßEDEغEE%EEZME7D~'(9ŏħDEE7E E`EkEiyDot"8FuyčjDvEE/EREzEED'yğŢ#Š|uDjkEanEE E^EʇEiD>'SĔDcMEFEXEEE.uEE`ò*fļBP.EsqE3EF+EE6EQCCJ)Boň $E EEREpEuETE}D>H&~h84mDEIE=QEcTEbErEDu6q! pŶۇĬgDXEEEE2KE(ED?bġŐ$ŔMĚ\DcEEEEEE7Efd7 <%)Ŋ=xKC;jEEUEEF,Ey̤EE'fž*(Kp'EFEWEFʈE4E=E:CUĦ8)02 ?2ÒE̎E EEJEEw\Eo;D}?%N LDmiEE EEEqzEDbv ŜŬaD̍{E4EB|E"EE,‹ED5J6R_&ŶLĵj@D,]EEEE(.FTEE{6'E`{L3ĸj+Œ\0ENǤERE^E E*ƴEDEFCƳO) š[EE9EBaE*E,E cEKVD❳p%n#d@DeENEKEEEEEpD!Ŏ=QD*HsEfEE ETENAEdD#7'J!DeUEdE͆EEEVEh^EcEV/^*j}IC6EEEFXEEB-EB +r|ZE1EEEEjEwLEeDd(Ň{D_E`EEEEjEqD+#JŎxĴ1D>EjEE=E2E7EسDҰ~j"šĀWwD|!lE3E@EUEEEdDM">1F:(ċDME{EE~EQEEE0xl+X)hB/EEEFE(Ew|4E5CĈ*VrVǠE۝EE<`EsEEm"SE>iD'u1DEE<E EGYE|qE.D̟c9"ћp]'DEF.E֦E*4E\PEE4D7hŜ$hanYDdE[EE=EvEYSEDʌ G_(ďCpFEEEgVEEEErI|*0A'EEbEEnEㆱE!=E C:o)ž Ӌõ E EE6EE$E;[ER8DČ:&unH9DE EEDE+EyEĖDVĂŸ &˛D{EԬEߵEhbE.SEOgESDP%?ĮBDu]E E#|E EEEDEÁ" )Dđ7CNl?EE 4EFEE%E ql*$sӋc!E(YEEEMEEcDEC :ܜ(}9 V9aEEEYEEEbERD<'|$Fk^ĦXDYEkE]E0EjE;EDĮ!Ű7vDtEE(ER EEED7J&ŋ$(D&WVEEE9EiEME+EEzD**dC7E|EPjEy9F^fEE-ElB*^ŘK*E,EˊEdE}EַE KEӏC(Zų|cLţ'ťP&DEVE VEs@EfEE_E9 EØí@ *9[C,8E{EEE-7E^BEȽ+EBoQ*ŭK EP{E|ED;EcE E}JJE^CP9L!(Vc D欔EEHEРEcEiEkDS##PRź|qĉD/EZE#E4EE,HE8DRĒG"cD \nEkEEEE:ӑED=%(Ż'Żĸ-DOEE+Eè҉*fCr1EȬEE4F E૭Em3EBC"4* äE0EE?rE EdERED&Ē'pu*,nD E.E/EpE2EkpEăDGKĄz!ŝōTDZEUE'EefE-?EEµDI>jĜA)$׭ĮfDgE*aEzPEoQEeE?EhD ŗ(v:=CHE;0E\EE&VEEE= F* ? BP)EGdEEH0F"E耰EFy;E@+Ck#*ŔԿù$ EEqEbEdXENE~YES1Dr&{ BĬDE"EEE/E߲wEPD~ #ĂD~EEE& EE/E1DݨVM\%ID;`EgܿEDEEE1E-E$d v)ĘC BE]-EfE*F=aEEG#EHPZu+Ŋ8@Q¤3#EbۥErE;FDEhE\iBECs<)jn UEEHEKqEZEE`EdJD %0FwYĨDE&EEEgE6t~EDİɟ v(DZvESEEF\EEōEbDWASGŸ&. Ă5,DXEE3EEEE E/ j`*~PsC/9E+E}YEFSEbEq*EAеlF+1Ŏ72EQEEE(EzEzHECS:%)Şň_ĀDEEEXGEEfgEohDΡE$šFoIJϼD(E\EErE}E҂ED]x"֗QD$nEsEEEE0E|E/D~*nA'hC@DPE©EE<EEJsE<EyN*:čCQB2E?EEHE!EPݬE&2EC<'m*:ZÑEEsENEE@E_PEZDD(KH*IJDlEEwE.EdEBnE(ŁDĘ"Ŷ1QDHEE EEEEnDox$ŤĉhDgE(ECEElE|ED(.)Ŋ]i>CHEEMEEBVEEG/E/:ż* 6p|A*EƩE/EEkEAEK9EĖbD2!E=E E`EE vED@Ēg fŲf٠D$EE:E{EnEfEDhWWf% )Ĭ-ND`EEh?E"EXE1E8|ED'f L)ſ>ħC'BEdzEEFEEh#Ej,ii>B%EEE. FgEjEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-32000.ark000066400000000000000000001750251376444676100257370ustar00rootroot00000000000000my_id BFM >[EF~Eq)EXC1s&4ůSă:DEE5EPEEkED- ĕg *ŸĘ`C!,EE(]EE5EERYEEDWl#fHmĨ]DuEMEkEEnEEEIӸ*ť7=4ŠEEzݍDF7\Žk"fl~\D]S_E>EuEE?ELYEx!&E;B=* /MüDuEEEUE]EJ҂E@DdĂmŅh&PuDIEEE EEE iEy=D2Ķż!Ŗk ˃EŗH$ć4D* UE EXEEEn˩E0EDCw0ħh)"qHDZE.E݅E%EE E>DDgC( (CpB>E<֯EPE'F-EETRGEِDL*'ZFX`~DEvEE}EEE|DN$^ ŷ*ŴįB'EYӥEngEvEpE El^E/VDh"ŐFD#qEEEE E7EE6J7u+ŁŧrEכEE2EmEEtEDkĄ?#\߯ĬKD[E*tEEEp:E#E*E[B~) 8D2EE-ENEE&$E^D]W5{'zRCRDEhEa}E)FEHE5RAEDCĚ'E N^_DȠE~EbE E|EʏEx DQV )ƇCT-EM{E E*E1ECEXE8@D(ϳϨ#Ř+*2LDwEEEHEܴE2tE EF y+SĪ!E9E8eEE]EfE#nED!b!^f8bDpaEEEVE*EY{E $ER(A<ĎH* %%ÎEEUEEiEE>EDpiڃ&ŠmĖ DRJENE_E%FEEEA;E2*C!(PHŔ;D^}EEيE%EEE4"DS#2)(oC.3EsEbEEE˷ERE)DВ$\~ĢD|EDEE(EEEET*;n$ E(LE>%EcGE=E'E3hE~D5LE UH \8yD|fE5E EEJˡE-E`Ģ**?EҖEEUEzEdE~EDb={`|%ňĎ$D#SPEbhEiEEFmEE15EҁC4L){( DEbEEGEfEEVE9DR6bx($ľC9EnE*E/EESELEvD(ĸ%lQmD/bE^LEE?EEdݔEE0Ń*N 3@2!#EEPEE E찾ECbEgDlʽ!6iĠDlESE#bEE` EEEmEB wb*Žmö E(EEEE$E xE/=Dr[hŬW$MXw:DBSVEErEFk%ESE1/E8.CMP) 0D6EEtEםE8Ej*ElLD}HĈHŽ')C2@EKEEBE E|ӲEEEoC0:&oŹR[xD RE{E EEEEDJ' #S*m8B!)EEŧ*4Ŵ@\E[EWEMExEUErE D2(#/m\PDC\EMEcEEoEE[1)E)BZ*' L[nDPEETEEJuE=JE^D [ļb&UnC^EE{ӲEEVEfEZKE?EHnCV.'Ű>ŦH(YD22EEEEEh2ED^4 h)_MĒ,.Ck1/ERE%ELFZE۹EsCVEQ:DiMU$hRX]DEEtGEaE(DSm0w'%^(āxDLE[EEUE'.EVE9EKCx(_6ĀGDqEEmEVNEE\EDJ(7 v%/ń5{ުD~EjdE|~EUEEʖEENŇ*ŖĀ`ŽEUˡEE E=E>D"bůh"ž VD%^E購EtE5vE,hE!ӥE`'EzBO * =pDkEMECvEEAEEuDv`uN&,5DTRGEE-E)F7EЯE2>ECMM({wŚD^DEEV$EEEREDM6zh)1 DC<0E˩EEEEEvUEf4D^FH$Ś<髃ĩ3DyECEuEEEEdE EN*ųO‰EELEEE;=E3kED+ZŮ!ף-mDdEEEG.EE*E!Es^DEEEEdEzE#D,Ļ>(lS:C6EcEfEE1EE}OEtDrx%řm&uDE[5EuEVE$E@E#EV[7*4O© ErE EAuEեEECeE?sD=k!=DiEsEENEErEEFiR)*ŌqQ E:EEE^EEDE {EED^xd$,(/DSSEE{EFdEE12Ed*YCR)ŊMD;ʍEEMEEjEE?D?ĺ:E((ŎTweChE6E(E EuE^D8Ś#'kED^bYEE.EFE\EE,EБCep$ *Ŵv  DʥELEOEv=EEE-=DRTTşH'29ĐkCBEEeE+EdEE*BEjCOđX'DYpQtDvE E5EQEE=ED^ rg *&dCJ",EEdEE-EEYRYEED䊱đ#89-~_DuEE?EEoEpENEWŤ*45ÛEݺE:DE EE9EroEݍD 5Mql"flb\DLS_EEuE@E'ETE&Eq9BՃ*p ńDxEEE]E,]EʂE0Ddxſw&DIEG EEFE3EmpE EE<E@/ܭ*['>pEHEEEeE+E EiޭD@vpoŮh%t\ĮDz OEܓE6EEfeEcE6EIeC\nK(ʼn,}5DzEEEEEE8DV2<7(ň3C38EEE͌ErFE%EzaMEYDN%ZyŶ+r%DLŀEEE,E.EbEE51Ťh*%cĬc!EF+E&E 6ȨE EcEymDRı!& ĬJD9CkE:EEELEEEƔwp+źܬ EEpEnEMuEEyE)D3CJłW$਷r5DUEqEEEEӻE 0E@ECdX)@ŤP0DbEEE"EE E>DDwL(ĸ?CB>EկE@E'F-EE%RGEVD7L&ĈC`DEEHEevEEDE@D: *ɵBN'EEkEnEpEuEv]Ep|VDy\Y"dVʐ,D}#qENEEE }E 3EEUJf7+ŋrE֛EEEmEEEtE"vD4l#KD[EAtEEŕE5EE*Ek~B) UD(+EEs5EMEE$E|DiWq'ŴmmCCDEfEEY)F׭E EAAE4C6'SN<_D;EEûEEEEX DRĘR )łĘCp-E5EELE1ECEWE?D"#Ş+* _DgwE>EEFIEEmE EÐ8+ŨĦ EE]EEeEfEnEފD͔!Ũ6bD aE.EEUEEO{E$E6AQĠH* %%\EEEEnEEEE«EE|m*m̛¿ E%PEr%EfHEU=Ei EX$hE~D-zF śW ŹuyDPgE}EElxE;D's_w7T$Š.Ğs:DDVEjE E@FENE0/E@-Ck) FE\4\EQDN#7ŌIJړDrEExETUE'REKE\ER[8*0QK\pEL[EUEMETyE]ErE&D6(#l"QDzS\EXREtEEmE$E1!)EBD$S*c xfDNEzEEEECEZEDOTmDt%F*xDLE[E\EaE+E6E9EnC{i(Ō ůP6ĀGDE-EOfEVIEGEWED(@X)Ş9CP5EEE"FLEcES4PEv#Dϼy% p8{6vCwQ;EFE=Ed#FEEsCJEW Dn&Rş9iĨܶDyEEEoEvEEQE{E,[ {W*54ĬAԻ$EtE(EWeE E̽E`E0tbDĝ!D24nEiE]EE5eE;EE"1 +̄AE }EELEE^E{wE8DJ%44#ѳn:@DsXEKE0ExEEzE-ECΙ)|X $DяEEEEEE\DPCNĽiŐ'pĐRCqAE'EE#FuE(bEBDECļq'W{~D@'EEDOE-E(E*E DT )Ǹ|B*E#E?EEHE}lE ZE³KDo'#ŽMĊD+tEEuE,}EEԛEnExs+KI×E B! *Ŧ ž^.D|EHE@vE"E-EάE5`DV` Ŧ&>KJDwaGEळE&E(F EЯE#>ECKIC(ūvxD^|DEWEV%E/EEYKEDu);FC0E˩EEEE ETE4DCH$<ԫ4DyEEuE>E8E E" EbŤ*/PEETEEE6EI3kExDKĂ\!ģımD3dEY EE5EYEE"!E~*dZ@h*+i&ÈEjEEEE|EdĀEGDNrQŀ&ţD~bMEn.EEP!F+E>E28EÛC )}7ŗ)2}>DEEXEEErED,(=`C6EcE kEE1EZENE0Dsjw%|`uDE6E}E EE CEERU*E0K EбE%EsEE`EWaeEBsDĺ!ũjv!DjEEEHEnEEE' k*mò ECRE}EXEEMEگEzE'FuEvEt`GEXD6&ʼnjG`ģCD^E:EEGgEE`E_DN h)ŌB'EOEuE^EREE^EVDcx"nGАDp$qEEpEEQ}EN2EEJ#Gł!+ż׳rEG֛EEEmEE8tEuD l~5#ŧğKD[E-|EEٕE3EEp*EB| ) (U(D3EE5ELEE%E|DRkW,q'ť"pCCDEfEՄE(*FE0E QAEшC'ťiNTBDȥEEFEEEяE DTU ż)Ņ| Ct-EPEE6El2EREWEρ?D޳-#Ŋ.esDNAwEBE(EGEEnEr El+ę"ã?EEuEEUEcE#nEΊD z!Č:bD aEEE?VEE{E>$E`A,<8*z{ ũ"sE EDEElEEf=E靶Doi̧^&nĩ D@SJEE&Ed%F=EfEXA;EzެCȦ(9vl;p!D낉EEEyE(EE Dc#ĺ )}ĤnCt3E*EEEE)ӷE:QE<)D$$z]r)Du}EEEEEzEE@*[ ?E UEFELELEU EhEB~DQ u ꫟yDgE~-EBE$EEEE&YZӶ*Ŵ-ELۖE4EUEEkdE~ED`{ċło%Y0$DbPEmEEEFCEE"5EyCG)(2 DBgEERMEfEE> ED6Ĝ6i( mCv9E>E-EnEEcSEKED6Ę%dTmDqErOElE+@E=E{ؔEElBy*BkR@?#EE ELEEE+%bEgDO!ŖňiOYDlE,E~gEEE0E~EGa $j*ũ4> E5EwEE{E E+xEqxDqĚV$.:D5VEEAEDFyEJEO/E .C2p*Ũ a` DC=EEEE!E"Ev6DHGa'4XhC @EKEEENE˲EEEmCΌ&Vgz[DRExEE̤EEEDtĠ X*|ĘB@)EEEMEEVHEK4\ERPDn"#57 ۓD6rEExE^UEREKEE#W\êK6*2QZZÌESE&]E]E~sE8E\rEDXF.#ř0QD_5\EREEE_vE᪦EU?)E#B)V*1 ?iDEEE4E rEXE^D( \lť&|-C5FEoE*$E EEZEN'@E~C'łE4HqDy2E EEnEE2EDĮ ")z..C1/EVE?-EFEԹE#CVEc:DMjX$gDM\DxE,EEEzEME7 Eþ߷*}hL ÔEEJ$EE:bEElEDTI!ř.phDDbEEEEE4E#E*X@Ĕ*šiŔllEEE>EEBE&iED m,w%6"?DLEjE.E?E+EW­E9E}|CC>[(Ŕņ6FMD+)EE7WEVIE] EDXE2Dk(įL)ūĀfCo5EEOEFTE}ESPE#D-J%({^D~ETlEсE VEBEʖE|E"vť*n@\ƒEPӡEE E8EE4EfE$xD՟X +E ,*~D-DhEYETEE2EEEIEJEŠ*~ELEVEEjEE|E|DPĊd$8p)DSRE-EEEE"E3EmC6 )#IDEEEEEtE;D;:(k^Co;EE6E&FCE{E9JE+n DsRĜ&uz2iDEEE.oEEE=E^zE: 4v*GJN,A$ElEr~EUEEOܽE`EhaDĵ!đDrCnEMpE]EEeEEEX"Ó+H,EP}EƼEKEE`E{wE8DJ%44#ѳn:@DnXEKE0EtEuEzEZ-EHCļ)P DNĖID ڏEEE8EEhE1D7Ni/' RwCpAE"EQE|*FEO]EH$DECq'CWD,EESEEChM(wŧD }DwE4Es*ELEEKKE[DN w)1GC0EPĩEE,EoEETE/5DѷĦf$ş<$o*FD4yEEEEE# E\ E\1`*ŽZ~¸EEcEEE8EQkE4 D]RF ģĮDmDdE*E=EE(E9E!E=ĝ**ú~EvjEEEEqtEmE!Dwr+z%_DbMEU.EE\FN}E6E;"8EC$.r)'1>DEE0EELErED,(=`C6EcE kEE1ESEUNED#pĝw%ŮdݙuDeE6E:uEEE#EEEXaVl*Pj4 E.E4E>uEE^ݿEQeEsD!ŊjřE!DTjEEcE8EEEE)C{*2ud+ EQEږEPEE [E{E`D [Ń$EvEEEoEDm]i"}Ĝ\Dq_EfE[nEqEuENE!%EL7Bٍ* ŘĪhD铈EWEY$E2EQEE9Dť){sZC42EEtEF EETBSE)/Dc,|$=xĸ=D{EjLE(EEEگEE'FfEE`GEhDI!':zF`cDѽE^EE)gE:E{EeDi j)dyB'EEkEy_E`lEE]EUVD@ě;"p/ӐD`qEEdEԺEqE@/EE"L +ŕ$uÓEEhE EeE:EtEcDi|#ŻpKD[E|EEEp5EE*ELJB*G) łTĂ'D2EE5EMEED EA]D8WM,q'CnSDE lEEb)FEEQAEC'śiŦN@BDhEEEEfEɏED Ĝ\ Ÿ)2x^Cg-E[E@E"E-EJEWE?D޳#%mFۇDAwEE EGEEoEu ENBj+a" E>E욞EVEE8lEZEmE׊Dh8!FĈkcDaEͽEEtEkEz\E$EmTA~ą7*A 5)tE EعEEdE}E4EU~D̩i J&Œm? DbJEENEd%F=EƄE1;EvC~Ȧ(ů8tG;@DEFEEPEE$EoD#ĎŸ )oC3E*ExEE8E3ӷEQE<)D$\G'D}E&EEE ExEEvä*ŅĆ?ETEDELELEn EhEr~DZO v 5ĉyD( gEg5EPDEEEEEY¶ȵ*ŻèEpĖEEbtE {E FE~E7D]{>t%s@p$D5PEiE\\EF=EѫE 5EVCSNR)eŮv(A@DkEE.LEeEEX ED6r y(ĻkC09ETEf-EXEJEySExKE1DJo%nm_DqE)OEQE?E^EڔEEi=ӈ=*HL@R@#E EEEE|E$bEgDNć!UYDlEEcE(EuE EE\ IJ*|2 EEEE|E EXxEXDÕ8T$Ġ:D5VE E=E?FEIE?/E,CĢ)j zDFE:#EEzE*E@E5D II{'ŘVC?EijEνEE|EòEEEpC&2ffZoD=REvEE̤EEg E/D{0( AV*ł$B8A)EbEyEEYE@BE3\EPDm_#ś'uڎĺۓD!rEE@~E{UE$QEKE]EU\DLEjEE&EZ&EvEM9ETzC9Z( S6ĀcD9)EnE5WEqKEU EREoDy)J)sCo5ELEѦEuF TE|`EPE#D7b~%zrwDέ~ENE2E[tEE\EmEüű*E|L] EӡEE E9Ed4EfExDڟW X;  D3DhEE_EEHErEBEE0g *UŎ]EEEjE@Eu E4|E[اDQĞa$)D"RE8E^EEEE3ElC= )ł#OHDE EEފEEtEDl;9~(ŧؘCq;E E5E-FEERJEM D;&\yb iDCEEoEEEFEyEh Ŧ)*,A^$EފEEtNEE۽EB`EaD= #!Ůř|DZCnEpE]EEdE̎E&E_"֎ +ť:EEELEEEvE &DJ&4#O$y@DXEKE0EPEEsE-ECą)P O~DD(ڏEEzEQEEEbDfNRy*'UCqAEn"EE(F|EdYE#DECq<}'~ W[D+E{ESE'E B6Ė) K,DE^E_EEE.EDVw`g\ʼn&}p DGElEEZ(F#E̯E =E]C#!M(EŗDĞD2EE$E~E,E-E#D]ĝ{)vKCd0E4E6EMEEָETE$6DҤ$JdVć6Dx%zEjEeEEEE E:Hi*YȈ/E$EEEXEER4E kEDaӂF!ʼnɣĚ4nDdEEE=E\EE!Eot~x*?-EsEEEEtEƼE˝DrV&B%DbME-EEFS}Eq6E8"8EC$.l)'Ŗ1?DXEEEEֲErED-ĺ,(K>DcCW6EkEoEE1E.ENEsD:w%a*uVD<EA6EOuE ExE?EME ZVk*ŋ< EsENEsEEݿEQeEsDVĺ!Vjł@D jE)EdEE2EzEE0({* v\ EQEEJEE SE{E_D2) [Ś$$gޅ/D SETEEFEaE$1EXC )Œ>1D&ٍEoEŨE,EE-|E.D~>Ħ;T( ?ĬJC.lDѓEErEEE߯EE'FAE0EPGE>D:' z J`IJbDrEsEEgE8EED 7)cB5'EEpE_gEqEE]ERVDV;"lD`qEEHEڶEuE|(EJEJoK + vq\MEEӆE1EEԨEsE\dDżD#ŊĈLD![EeEEE4EdEϴ*EBĐ$* ^c~;DEESELE̖E EDWW{,q'6*C9DEzkEE'*FחEE~}AE4@CCb'!-ŕMGD;EEEEEE|D ^ YN)Ce&CC-EEE€E*EiEXE>DBA[#`jȇ?6DwEEoEDEEjEE EE 68+Ÿ1 cEE|tEEANE\E"nEÊD)R!弧{bDaEEYEdNEXEzE$E9AOW9*{ Ņ)EEXEEbEhE85E~Di&ŋm, DbJEENEd%F=EƄE1;EvC~Ȧ(ů8tG;@DEFEEPEE$ExD#ĺŭ )}oC3E*EEEEQ˷EQE;)D$9TŽ~^DEE@EEgEEE EvuElE EB$q*Z~EE\E^%EE4XEfEhlEsDıŭ!ȵ>hDLbEzE';EEEE=L#E3@ *-<۵E2E*"ECEE3CEuED|nnv+%8IJD3LEE@EEO+EحEl9ECĺ(&17DEE/~EKAEEhQED$$)&W)7PĄɂCC5EEE`F6E_EQPE.#D$+|%yzD~EtEEZNEEʖEbyEꝿ5y*_YZ\«EۡEEEN8E 4EDfExDb@X ,; ņ 5DShE?ExEE|FEaE^CEE}*RŴ]EEEE;E. EI|EڧD(RĆdŝ$uP)D&(REKEEEĞEE3ElC0 )A#İEDEEEEEoED;Ī9r(L&Cmp;EEQ>E&FEzڴEJEq DQ$&ߵiıDHEEtEEίEEApEî f*ŊBA$EtE*ElE'EE`EbD p!ŖqĒDnEtE|EEFEpEEhT#x+cCEù EEEKEEE/wEc&DÈĮ4ůl#T?DTXEiEJ5E6EH E6EZ-ECF])C EĵSDQEbELE۷E2EED\N<.'ŔāCdAEV'EE*FߚEWECECX~'ŸVSD7EFEQE:SEEhED:d! ;3*ŜB*EExAEEE=EZELD""ŗlזDCtEE(fE:~EE˛EEto+ť6jI; E@EiE`EgEfEvpEqD̐ļh"2«ıvWDN#^E1EtEuE_EkåEf'EhBE&Ķ*ŕ Ż#,TDEvE~E#EWEEz?D`Ġ0&7,ăDrGEʳE5E*FEB˯E">EtCĩC(XgՊDİ}DEEn%EzEEKE DSƘŒw)ųĹGC0E̩EEiEmEE|TE4Dg$<in^XDyEtEEEEE Eéc+2ĺ?E$E dEEҶE4EVAkEDď ŋumD!dE2E"EoEE1E!EN~;*Ÿ,ŬâE5EEEEˊEE$DrďkR%<ċDDGME(1EOES"FE4E7EbCĴ)dł2ĚDWEEEEdETEcD$,FV)=]DCR6EMEoEF1EfENExdD%Ůdt^DEB;ErEEWE@E+E`Æk*0LEεEn:E>uEkxEؿE}eErD !.aȁD jE?ENEE4E"E$E ?Č>*2pw÷ EpENEgEJEX3E{ED"G\Ŏ$/DcSEŭE!EFEE!2E-WCR,ڞ)VĎ!DR׍EZ E E=E(EE<D@`D%(ł?ClC=Eq E\E4ETE EnHEDvh&bcăιDDElE]EEE>mE+Dn *J?B2&EaiEEEfEvEUB_E\D$g"ŒuߍDNpEE EvET8ENEE%%78h*Ř EErEEE\ ELuEDNJa*Ś#Y*FDYE$E.EE#dEmE +E`Crn)*d @ G{DEEEVEDE~|EEADQhu'x C CE4}EoEAF`EFeE_BE}PCY]'ŏPP8D EE#TECQEEE,9Dw\ 8 *Ŝ|BC,EETEEE|EoYEPEDnĐ#s*%D\uE.2E<E.EwfEE|{E|pOm*ňn6|EECEd`EVEEoEDZP`"N|\D<_E텽E6PEEENE%E \7BGyv*?" ŘuyDcEEXEEWE'E{DbTwų&[ D.IEEEFE*EyMw%4qDY$OEE@ELEjaEQLE6EZC:y(m,UDf{ExEEDEEED#2Uf(ļVCC48EMEAE!F~E!En`MEǁDA(Č&ūjrXDԀE(E|ELEEwqE oE:ť;*SğJ3!EIE>EEpEl"E0cElD) ~dWD"kEDEE E EEE;yED{sQ\$Df6DUEE@EE.EE0EGCW))OŠe SDDE_EE@EEED'E^B( XLC>E߯E2E'F-E靳EGECD/ '=!` DrƒEEEHEEEETEuE~(EE\LíV2 +>ŀqÎEvEEԇEfEEytERDQ#ŻĻKD= [EEEEp5E`EѪ*EBĚ) 8S:D:ETE5EME´EE=D:Wğ,q'vCcDEpEEb)FֵE6EsAAE;Cjc'2izM]aDEEEEȻEED R[ P)f\C-EEEE'ECEWE~?D\#p%Ň'vD BwEEEIEEdE" Ev +9F Õ>E힞E_^EEelEZEmEĊD\Nŕ!ŜlcD aEսE?ElEETE$EA2dfu*

âE3#E*EEWEeElE܇DƧŘ!-ķ9hDWTbEEEEEME1#E@9@4* iŶýEE<ECE}E>EYEtDmĆs%žċ|DoLEjEEE&EE9EwC(ĠZ(ŶK69Di1EE_EIEENE}D))dŰM)HCr5E3EEF.LEVEPE_#DҼR%X zBxDB~EUEE|lEEeEcoE;{*őSĢM`EE\E-,E;8E EfEyD@w ţ< ľCDhEE[ECE'E?E5-EҠv}*׋:E6EEjEEE}EŧD!ĞaP$Ŕv) )Dd'REqEZEEE0EJ3E iCa(#)>$ĀnD'EgEE9E ELqEGJD;Ĉ 0(ō"|C;E\E? E &F EܴEIEF Do&7Ŋ inDIEoEDoEEEœEsEi Ź*ŨĪ B$EUEކEWE"CE+ݽEϻ`E4taD=!Ś ˔,DESnEsE]EjEdE剞EmE<#v +RÛ EJEELEEE$vEDyKĭ4{#ň}@Dl#XEKEz5EEGETkE-EC~)6#v.ąDgtEE~E~EO~EjƛEDEQhu+ŁEHEFEEָEGE E0qE\pDE+"ŧĴVDf ^ETҼEyE_EdEE'EB#Ă) (TDȒEE_E8EEEƻDz`&lŞ&DT'DGElE{EN(F_EnǯEh=EdCM(ˣ#D{DEE+EEE$EDu&oij)Ė|KC0EEE}EYEָETE5D/$><vYDyEEEEÏEE+ EߢŨ*4jEE-EVEE/EmkEDӂŴ PlDA dEPEE9EE3HEl!ERQ)5rî8EqEEE"EPlEEDrĥ,%@M?DVcME2E=EgFuE1E!8E6CMY)@ϫ1_DEEEEfErED-œ(/ifC6EsEtEEj1E ENE4Dw%WńXu DEn9EiuEEYE:EEéVp* ¥" EExEsEdE ٿEAeErDĺ!jm&`DOjESEbEEE=rEE;Bız*ŖkT EQEEExEDKEt{ED$ĸZ $ūG|/DISE(EEFEfE1EEWCl)Ť֙DP׍EKE ELE*E |ED]!?DOU(@ĒMC>=E^EE" FPEETHED<פ&ŃcŹbBϹD8ĂElE{EEE>mEk8D`Ñ# @*vP>?B%EhEEEGE$pEn_E\D@#r"ĘDN pEEEyXE3EНEnzE:m*ŗwEl0E$xEEE!EguE,Dz؊Ľq#vyaFDrYE!EEJEMEE+EChp*ŭ 2 DxEEVEbEP|E}E@DP/f$',ضC`CEfElEFtbE FEBEMCkCF'jzQ|D҅EUE6EREE\ED gh *JChQ,E=E]eEE-E# E3YENEDJđ#Ņ8 DuE-EE,EvaEEzqE㜃ÈP*qP43ݻEʝEDEj~EEӻE%oE~DZmIl"fj]DM_E`E,vEEE{EE%E93BĬ*[ nû]DEEE ]E2TEElD$dĞц&=. DIE E EFEܮEDEEEEEFED7?J)rsČZC$2EEE=FEbE_SE.D*$`;ҁTD{EjEEEE"AEg EȂ\*HrECEEE:ELzEaiENDaÛ'\ ʼnBsDeEUEE\qE"EZEEܝAg*6sT[ECTEJEE`Er"EDiED)uIJxł%r7b DA'OEpvE;EF\E).E6ER=C9y[#)v))+yiD?eE}E$EE}EEDB2)`(Ş9ĒYC7E&MEWE!F`E0EME6DĊ &o.LqJDـE;EEAEnEE;fE×Ju)* j2!EtiEE4?EjEEOcEzmD60!Şv̘@}D:TkEIEuE`EU=EnEEp+g  EEE*EmEECyEGDġP$Ԙ\v5D$UEEBEEEEP0EgCCXx)PUTDcEEEEE>EMDIEŋB(ŬxCgS>E"EE'FEE8AGEDW9'Źy%` DƒEEEfEEE4D} )2ĥىB'E,EVpE;gEImEԲE]EUDJ"ńŎƐDLaqErEEƻEE(E˳E1LYŧ+Ŝ9qMEtEEuE6|EEsEWD19E#yLD,[EmEEKE/E&EJ*Ey B %*ř laxSD$EXEKEGEEEDWşp'6C&DEpE8E'*FEEmAE,C5Dc',őMĢDۭE!EEpE'EERDę^ M)-PC-E°EEEn-E?aEeWE>D$^#%㟈vD:~wEEE\IEEeEv Eގe+h"ՊEE8@EEEWE&mEDDXp!"ż]dDaElEE͊E E?6E֋$ExB* xEENEEfE~Ev/E^Dixl&Ũl"DyrJE2EE#FU=EE=";EXC̰(HE;ď_DEEJE%EEtED#i )pCj3E,+EEjEaE÷EQE(Dλf$Pŭ~KDS}EEJEEeEEE*ϋz½?EYE%EMEDEEehEJl~D/R uf p,1zDgE0=E9GEEEJE߉EyaƩ~*L鴼+E̖EpElE6wEEE~ED{Ă2p%|rͅ$DEPErE\EhFĞE'E?5ECR)d(DppE#EQEOEץEE,D7ĩc<(aC :EE8E E6EaEKEnDDĴ%bemčD#EUEE>:EE єEE.p[Ŵ*`o@ }#EkEsE|ES+EE'aEtgDȽ!v)5DmE~EjlEpExEݞEERàL+ŧńMd E}EE- EB|E0ExENDĉL$Vx:DVEPEEbFUEEEk/EU,C!Ģ)B. @elDJEAEE#iEEOED۹JĐOOO'$C @EEEEEELFEjCR&MّZmȿD3ZEڂEE\EEED"ğ7 ŤT*ŝhõBA)EE8EPEE8ER#\EPD͌Ġ#ɎܓD0rExE~EME IELCEtEI^R**LZÖEtcEaEUEnEEƶrEG{D)77Ů#ЯQDd\EX_EENEuEE4)EPB_+ĄS*S IJD EEƦE¶EQmEPIE9D \ķtں&LqĨ}C?"FEE)EHEƥEhJEF?E}C1'PA2 I4DQEzE8EE_ E(EeD`z ŀ)҇/C~/E$`EE{FܣE̹EUE9DEwE,wDnnvٍ%ŶgDt(LE E,EEt'EЭE<9EC(r(cʼn<7ĢDOE(E@EDEEIE D )űM)ŋ!JCǻ5E5E|EF\jE"VE7OE#DYĐz%z DZ~E?EEE:EE3jEPPy*=pJExEEQEp;El4EfE;yxDJĥX < ŏ eDzchEE=E|AE%E2@E)E.KQ*;E4EEEEE|EpȧDtSĆdJ$ōb:*Df1REtEEE8EE3ElC" )ޱ&N#IJhD EhE&E;EEoEDDv;ĈI0(ŋtC;E̚E;>E#FE״ExJE`P Dpj&NŨiĥDNEwEsEE̪EEiE49 |f*rA!$E|EElEEeE`EmbD!İ!ݫ`QCD&nEsEDtEEFEXE E#ÎI+ſL= EE9EVKEEzEC wEoDÈ^3{l#UĖ?Dl-XEqE:EEE^EL-E Cl){D (ĢkDEEEܲEpEEDNĄL'v%C̭AER&EǟE(F EOE\CECLw|'|VčTD :E-EXEESEElEDĦ !3*ūĘBr*E1E@GE9EE>E/ZE`LDt īr#P\wɖD sE.EEu}E/`EǛEx:Epu!+&|~HåE`EEEEE|E,]qEdD3L5!UD+^EE{E@ED`z&D 8*DrGEPE5EZ(FIE'ǯE">E8oCr.P(ńg(_DDEE)EEFEBED4g)JGC0EөEEE*EfEhTE4D4ag$<mjDzEE EEE=E! E٢b+ 2ĚnEE3dEEE0E1kEDďū +mDD*dE2E"EFE`E)E!E{ux;*Ŵ"ũ EfEGEqEEEEp$Drc{>&ŀrDmMEP7E7EFEF2E7EC)T21čDErEEEhETTEDZb,F)X*HC6EUEzqEFg'E]E.NE5%DƗ2%h[œgtĥ5DиE\>EE>E8E;EE֒q*Ŋ oEnE:E=uEAxEԿEEneErD!!-ŕoļDjEgEMEٰEEMEEǿBđ>*Ők& EoE؜EpEEdiE`{E D(9e.Ł$a/DSEEEaFEbEv1ETkWCB;ę)51SDۍE0E8Ei:EpEUEDD/>4(8AT9C =E֮EEFEEHEDBg&riŢcD*E3qE]EEEhEϠD5 *ŤHkABA&EmE EEeEpE2_E\Dq"DJ pEEEvES3EE{E-7N֩* EoEvEEEEިuEQDz؊9#fiĜ[FD{YE#Er.EEb\E>E+Ev/Co)*u ű I|DEE[EDE:|EzEN/D)Qĺp9v' zCCEEEED5+ŖҠ ] E%EٶE)E݋EEyEZD(^{$}Ę6D,UE EEEEE40E4FCbcY)şŨdĥfDLEEEDEEEDLE<_B(gWRCG>E E2E'FEFEp}GEDĮ'_=Ž_7)DŃEEEPEREEDw a)TlJB'E`E6nEIEJnEмE]ETD"Ū>a DbqEEEPEũE$EwE LP+(q EEpEE=E2E{sE=DIJ~q# )MDJ1[EOEEEDEOݦE)*E?Du@##Ÿ'[D1BwEEECE E~aE EÉ a +ľOEEfEEdEVEmEJD;ДĮ"!ńncDE&aEZݽEElĔETE$EKAvĸu*Ap bcEXEEeEeEnE)E-Di Ŕz&{Y<DEJEyEE"FEg|EN;ECF̰(š  ;ĪDEELEEEEDc$-M(֗nCZ3E JEVE>E EEҥQEi'DSTĥ%y˧DY|EEFEQEkE}EEѸ1)+D ɠ ECE E+EEEgER}Dϝ ͦ U2yDnfEEv"EEE0E0LElq)ij*ŵfuEElELEUE%EG~EyD̬|ĭ%*đ#DPEWE1 [ĂD?E 4EXEEEpaEŧD [4Ŋz&ŤCkFEEIEFEbE7@E|Cr0['Š H(0DyE#EIE9EX+E`FEDJ`ĴJ )jԉ4C/EpE>EFF EE46VE:D3l$DŎ wD'yE >EԪEJEEEث EM=é1*ř\w E,EOOEEwE,EmE봈D":6Ŷo!4"aiDgbEEg[E E{E El#E@>n*xn3EhEBEdE7EYȄED-m|=Ń]%DyjLEJEFEEAEEL:E>C 'ś$5XDoEFE`EeE9EkEuD'G(}Ŧ)ݡėC5E#EgE*FrEwE PE ]$DnijD%y6qD~E_EEEbELE0EZũŽ*v<.šEơE` EbESEEgE\{D2m( ū.D*hE.43?"@ABTDS]EмE"YEy!E?EץEX'EH`B)Ť jÎDǒEE)EE˸E~EͺD}aĎoŤ8'A6DOGE^EE F[EE2U>EhCNe(&C DDE EIEEPEbEHDTļ`0()nKCT71EE EEEfE{'UE5D yb'$0ŭDuEzEu$EE(EEBEJ E,)%fř*̱ĎREl%EGE]>EEKEakE7ODBŁ i$ĈnDidESEE,?E EBEJ!EN?q()`9lEENEGEEEtӀEDq:Ť%agīDMEB\EE&/F֫EKEC%8EטCTTĪ(Ş0ĪXD!ErE E EEOtEmDb+(cVJCI7Ei}EޕEFnGE}EOE-D,ft%sfs;DE^EEE E]VELE\9Sb* 036 EߢEZEӓE+EEreEsD7 |ךD\jEEEEhEE)E2*Ź/uÒ EE#EِETExE{EȉDMŐ$Ŋ@ė0DTE.ҸEEF$:EⲪEM1E4ZCh)qDE EEREҲEuEsDo=đA(V2CO=EEEC)FEXEMIEؘ DI&u#`~bD͂EEfEDEE|ED$w# i*Ŗs@7B&E>GEۤEݟEMEWPE+^EZD+ְ"Ų(śDoEEE_VEEE1E0;âŴ*iŋt~EwEVEE;EEHjuED~_ĕyŤ#ɱwEDQYE<EOE@E~DheE{EE~EʟEEDt IJY)ŎzWC:1EE&E\FErELSE-D;0%NiT D{E iEEfAEgEp7Ed! Ejiäo*^ uEpEEщEERxE iElD U`iŘĴDkE8oEIE";EzsEEEµ\*d,& EGEE+EEEyE^`Ds4$Ō7DsUEELEFEzE0EJCWďd)Ŏ8cDlEEE?EEE:DnDĂ|(OCf>EE SE7FEEGEDPķ&2ŋ^䨼D0EEOEpEZEВE9D?y) 7~)ŴfOEB>/(Eu0EEhEREE^EUD!پ-ErEEE E\EWE<>D#ŜbŖF+DwEEE)E-E?Er EאrIL+ ĝ#EψEFEeEDE48EʥmEDo4 ]"p)obD`E6E{EDEhbE4ER$EA*Ŧ ŭEvE4EjEECEME6 E[8D_jv&ws < DJErٴEEFEv\E;E CjĊ(Kx-< DuEEqEEߒE،EBD&h) jC3E])EEEmECETf?#+Ѽ1uEԕE EjE.WEzE=~EѪD|A@%ŖyĘ#D:OEVEVZEdF`EE+5E S}C)őř^)+ D UEM!E1E\E0EETDNw9ĸX?(6C9E߭EEřEZEXE\KED&%voҔDjEh4EqEEEEE\1*Bg#Ad#E8EEE4-E¾E)TbE|JhD !ő5RDRmEEEE1EEENhLĝ*ńŶ*o EÙE¯EVEE-ExED{ħFQ$+PĘ&EE5REEEEEDr[Ĩ4g>&ŮCkFE0EIEE@EE@E{C>z'žH;DHE&EEEAE?ELDOS _)a}4CH/EE EsFDWE(pEuEQE*EE^-EG C'Ăp)ź ODEUEEEEcE nDON' eCAEPkEE4FdE.uESDEnCĕ;'aG՞U2]DYEE0tEjMEEJ3EGDě _)gB<+ETEkESE$E|E[E1LDֲ"AnČ\DetEE¤EEE2E.EMqR*ssTCJSE oEE:EE*EtQqEBѐDƐ!Ņ.~XDu^EE0E`E {EE'EvBĞ)A} ō D;EcEEEE޻EDD_b; &ŢPD/GEU׳E9?E9F3EݯE>EC2U (*T?CLDBEEJEEEDEZGDcq_sd)uOCB1EݩE6EF֣EENUETe6DwS$őtİDzE`*ENE&E~EE[ E`#nT*:9ĴDz&Ek*EmE=EoEyKEkEPD~ĀE8^ aWnDfsdE)qEpE!E!EA`E!EȖ`)ijqTEϕEE,E_E4E^ӀEp+Dqş%ŨD ,NE\EE.FEME7ECJ(P"0QDW"EJEHE?EE6NE5NDy*6&)ijCR7Ef_EE!FHE_EpOE D)ġ%`urȮD+EaEEЦEAELKEՊE#) @+VĈ¸E|E\EVE@vELEzdEqD*hD!ŀڛ'DiEcEEEEpJE6EGCFf*& E:EqEnEEs#E\D{ED3_!%ۨā.D`SEEEF7EqE/1EHRCRD)%8:DFōEEEEqESEvD_@ĪŅ(`[ѹCxy*ŐH÷}EEWErE EE&YuEvDSM #oBdEDYEE2E*EZE&ΧEg+EB/^*u Ŷ ĀuDZEE=;E ;EWE]EDC+RV' wđC0BENE|TE Fc;E&EBE7C9(P9D}E,yERE<1E)ErED ]*jC+EEEE"E޺ELYEDD\*$rkD0uE0E/EEZCE:E]Ex}*"<íE(E-E)EZEYEGvoE D$"đP[Dؾ_E\̽ECEEEfE"&E?B]L* R!DE^EtEIuEgjE҂EǹDNZcEAN7&ŋ$wp DqIEwEtįEEzFEztEFENDQ ļC'-`@D"EEENEErEj;DÌ :*PPʿB 'EҥExSENEME+Ee]ExTDa"Ŷ'ƛD1qEEEJEdEEsEPîiōW+4ҀtpEǛEVvEiEa\E~EvsED@ь2YŖu#ź-KDZEUEEE'EܦEc*E+Bj{[U*D9 L Dv EE*,E %EWnE(EDYXĂ'ŴRC>DEZEE=FnwEE;AEPCq'(nlŘNͧDE`EVE*EؑEiE-D Q)Ś*C-E EbEyhEE{1EnWEK=DĮ#*M"+ŘĨN¬EEE"EE׿EfEyD{!!r =~DgEvEZE"EEXE E,%Č%+M"xEpE$EbEEEn|E!D\9v$ϻĊ'DQEEEzEtEEd3ENaCr(a%D~&EEE\EENEv+D>Ŝ1(fC;EîETfE3FEEDJEDĉN&ŢfVgKD2xENEE$EEEQEÞW *64B)%E@E0EE'EݽE aECbD^R!^0Г/΋D!vnEE~EpEYfEEs>E\J uO*XŠëCEEEkE>EEAwEPsD%E&ŷ;#U ĿDAD3XEBEjXEЯEEE-E,CN-l,) ̓2DEEE'EEҞEDgM" '6EC3AE@PEE"8FOEkEDEC;'ŸUD^EEGxEkEcEE/D`%Ĝ )4BJ;+E5EgEEE^E[E"MDm3#ŌK]D)tE1EEEE.ݛE [Erã{*TCEmE E$EE.EqEtːD*?Dz˾!Ş/WDu^EE.EPaE {EE'EvgBo)B} ŌDKEdEqiEEE޻E̻D_B &^PDO+HEV׳E(!E9FQEݯE=EC (NŴ?CġDBEE\IEEE&E3Dià)pĨLSCcB1EEEFEиE7UEU7DsC$Ųĵ DOyEEEDEkE㼘E EȸH+}НEEvDEE`EEAjEJBD*!&ĔlDtcE<EEEVEKE?!E&Ը1Ŀ*bŸÍxEqEEE EV[EE碯Dsĥż5&GėDpME_EfEFkElE 7E`Cs5B)K2}YDE;EENEE-,EODL-ĚD0E) ˎC6EZEEHYE5E:E=ENE?Dĸ%w|euKíDHE"EsEzcEEE\EErŦ+L5EأEETEWEEeEhhqD¢%W!*}qܛĀDhiEEEEE`E-EF * ò E+XEEPEEAEC{EWDn %J!Ħ.D5SE|EmEEkEnEg1EJRCč)aęDčEEEErE5EbDj?Į (őSC(>C iCEE.EFzEECE9YCm6'OFIDE9EtEqE EJE([D 7e U)ŖĴ Ct,E=EأE0 F 7ED$E YEFDsÃ#oD.?vERE%EEf~E@EuEoŀ<*1òEEfmEEE;EoEHeDlD "&$"R^D0_EijEEEE`E%E @Bd7ĀL*6 Ŏ8ÁWDE.EE{EfjEED֨bKţs&Żĩa DEHlEFD޵sCBł%>U"DvOEEpeE$F?|E/E6E#CP )0k3) DvE E:E#E%E>EXD3QlC)Ŝ1ĀSC#8E:;E|EF<^EE6LEDĮK&rDƀE}EEE~EAE#Ed6{*(̫!E2EE;E~EEcEBkD+!ŞhĆDPkE-E'EE3EE/dEC/C+ń\Ú E EE E1dEEXWyEMD1؜A$Yĩ5DTEEvEHEnEGuEb0E4ACx) #D4EE܋E$EEՇEDFŞ("C=E\ͯE4EFEEpEGED@'|`=ȻD©EEBEi0EE@En'D3| )Q1m|BN'EETE0EHEPEb]E_SDҦ'^"j DmqEEE֖EEE1'EU,Q-V+&1Ű t{ZEΛEAXEbErE{Ep:sEFDx|d#&LDZEh7EEE EݶEO*EBġ*Ŏ: /|DMEڶEPJE#E7PEEpDxXįP'Y<ČCCEYEEFFYEEJAEaC=q'( 0ųiNODEEErEPEΏE-Dw\ &a)lSC-EEEgJEEOEE䗮E~;EC no(n:hDE:EE'EdEE{/D$ş( ZsCW4EsqEE&EEERE$)DJ\$ş VD~D}EBGEEE E+E7EmoBl-*rEľ§E&Ew7ElEUsE`E]gExDu< }S 0%|DHogENElEhSEE⭡EEIFD=1*ŘYϸEݖEuEESESGEu~ERDXzG#0%x%DhPEdEEk(FaEE5Eh`C)=N9'ă,DE|aE*rE)QEE,GEHD-y7ğs'@8SCF_:E ElXEEE?E LED?%(*8mDցEE}EE[E9EEEyyr*~Ġ:A $E9EETEaE*EQaEx%hD<Ď!b D)YmELEEES2EDߞEEJZ*ŀd E$EEAEFEEixEqD$ŸT:D 6VEҹErEE5EE.E/'C*İ* &D4EEEfE bEGE\Dz K'Ŧ EC?E{JEE?EEEEEC`C<&Œ5 \{DXE"eELE&ETEN֑ED J Ś*İ$BeN)EmE^EDEEE[EQODӭb#ſ#ĝDrEEbEFDE %EE!Ey`ø5+v`|ZE5EKESEcNEYE6drE4D͏E#>QD\ECEhEEEx7EEEEEEwEnDMŔ'ŮģC{:BECUEiE:FrE.jECECl<'TU5ND^EEFxEEzEEh.D4M / *\BE+EE.lEEEC@E [EMD˵q#$ŌxݗDasEEcE;iE^EEkEUzÁ%U+S9cJE(2E!E.EE}XEpEDǑ2řz"VAVD]E沼EYE6?En6E!EE'EFoB7+* "kDvEVEBOEKE+EuE,DD/a 5'W DGExE EVFEE=EC`tK(ŐW=EDEvEE |EEET4D|o)vЍGC0ErE:E EYEEԊTE|&4DF$rtĶ DyEEwEEUoE ٘E ENn"pB+Ŗ8Ĝ#EEbE9E,2DaEEEwEE E5D,ĖDţq)EĉC86E''EYE3FfEEWNE˜D(!&xstĽԭD[E:(EEaExEkEEÜz+ 7²EأE8ETE9EEJeEghqD:&W! Apܛ?.DgiEɧEEwzEE~E.EXlHQ*2łٯ E}vEE+:EEXER{E D;ą=+k$š 0DSE>ٸEEyF@E֨E2E$YCjrĎi)Ŝ7;D;EEjE4EEE[DΝ>IJJ' ֽCl=E$EHEhFBEEl IE* De&4ԠabDEEYE\ E^EEZDâ A*VVBd&E•EEEboEE_EԱ\D1"'lLsDD\pEGEE ENEEE6PC=*\}EXE)E>EGE2EfuEDžh#d#@GDZELE?E( FܒEE+ECx)ŋb 6J uDLߐEE{E{EE(E>uDYkP49b'_h:=C8uCEEZE%FwEfEBExCr'ŴGN*LDXŅEEϊElEEED o )*ļ CI8,EV=EE FEE~YEED=Ã# b5DIvEpE<$EE~Ed7E8EV+*ŶĤ3j EN/EemEiEEiEloED!P!"fN^D;`E|EaEGEGE]E%Eħ>BIJP*œ |DִEEEEjkEEꮹDaZ@&ō[S DXxIEEE0FvEE9` pD EE(EmEdE2ED{& )~Q.wmB'EE[EcEBEEk]EXRD "ŊZDqE.EE~EE ;*E*Ej+E!*E7+E*EJ6*EI+Ev*EUq*E}H+E6*E*E. +Ea*Ez+E*E7*EE+Ez*Ew*EN+EF<*E*Er +E*E+EZ*E1*EzE+E~*Em*EN+E=*E#*E"+E*E+E*E1*ERG+E:*Ek*E.M+EX9*E>*E +E*E+E*E2*ELC+E4*E"j*E`L+E@*E*EF%+Eu*E+E*E/*E H+E*Ed*EQO+E B*E*E'+Eq*E +E7*E-*EC+EK*Ej*E N+E B*Ex*E(+Ep"*EK +E-*Ez,*E*F+Ee*Ee*ER+EA*E>*E4,+E} *E+E*E+*Ed?+E*Eic*ES+EG*E*E8*+E*E_+E-*E#(*E?+E*E<]*EXR+EmJ*E*E/+E%*E+E*E)*E=+EP*EN\*EN+EL*E*E++E *E+E*E1#*E<+E*E\*EzO+EPP*ET*E/+Ea"*E*E6*E%*EB+Eؚ*EW*EO+EoM*Ef*E3+E *Ea*E*ER'*E<+E*E*EM+Es*E*ElJ+E2*E*E+E;*E2+E*E25*E9K+Ew*E&y*EG+E4*Ey*E+E:!*E+E%*E7*E?I+EYw*Es*EG+E8*Eb*ED+E."*E"+E#*E5*EI+Ew*Ep*EkJ+E 7*EW*Ef+E*E:+E*E4*EM+E}*Eq*EfL+E;*E*ER#+E*E8+E*E2*EF+Ez*Ekh*EEJ+E>*E*EU"+E*E+E*E/*EbE+E*Eo*E{N+E=*E*E^#+E] *EQ+E*EK0*ED+E*Ei*EM+E?*Et*E$+E*EH+E(*E0*EYF+Eć*Eg*EP+E4C*E5*E>'+Eg!*E&+E*E6,*E1=+ER*Euh*EO+E:B*E*E'+E*EK +Et*E+*EiE+Eu*E-g*EU+EC*E*E++Ef"*E" +E^*E#**E>+E#*Eb*EFK+EE*E*E1+E *E$+E*E;)*E?+E*Eb*ES+E4F*E *E,+E_ *E8*Ee*E)*Ei?+E*ERX*ES+EH*E*E3+E"*En*EU*E'*EA+EҘ*Ei[*ENN+EM*E*E0+E&*Et+E*E^&*E?+Eě*EJU*EU+EL*Ee*E0+E"*E*ER*E&*E'=+E *E'V*EQ+ESS*E!*E1+E2$*E*E*EK#*E87+E*EJX*ERU+ER*E**E8+E"*E*E*E %*E@8+E=*E|T*EP+EKR*E/*E6+E,#*Eh*E*E"*E8+EԱ*EL*EM+EU*E *Ed<+E0'*E*E*E*E5+Eͦ*EM*EK+EW*EΘ*E":+E$*E*E:*E#*E3+Eթ*EK*EXQ+EY*Eؗ*E8+Eh$*Ej*E*Es!*E2+E*ELF*EK+E]*E*E'<+E&*E*E. +E*EF/+Ed*ElF*EO+E`*E*E<+E~**E*E,+E&*E/+E*E?K*EJ+E_*E *E{A+E^.*E*E+E\*E&+EN*EI*E@Q+E]*E*EC+E,*E*E| +E?*E_)+E*ES>*EI+Ec*E*EG+E2*E0*E.+E@*E&+Eɺ*EC*EK+Ee*E̅*EB+E{,*E*E+E`*E(+E*EA*EL+Eh*EX*EoB+E#*El*E+E*E'!+E*E@*EI+Ej*E *EE+E,*E*E+E*E\$+E*E<*EI+Eo*E|*EI+EM2*Ej*E+E*E.0+E*En7*EL+E;q*E}*ED+E0*E*E+EP*E+E*E>*E}M+ECs*Ey*ED+ED1*E*E+E *E+EN*E4*EO+Ert*E~*ES+E.2*E*E>+E *E+E&*Et7*EnI+E3w*ELv*E(G+E8*E*E&+EN*Eb+Ei*E6*EI+E x*Eo*EK+E:*E*E+E#*E +Ez*E3*EF+E=*Eep*EI+E8*E*E #+E *EX+E*E 2*EC+Ef}*Er*EO+E19*E*E %+E *EH+E*E /*EF+E$*Egk*E^\+EB*E*E[#+E.*E>+E*Ec1*ERD+Eф*Ei*EvM+EB@*E@*E~'+E*EL +E*E,*EB+Ej*Ee*E2J+E?*Eι*Er&+E+!*E +E*E`.*EE+E*Eg*EK+EB*E>*E++E!*E` +E *Eb,*EA+ED*E^*E4N+E?A*E*ER/+E *E+E*E**E@+E֐*Ef*E]E+E<*E *E1+E *E+E*E,*EA+E!*EDb*EK+EE*E*E0+E+#*Eu+E*E.)*E?+E*EY*ER+EI*Eb*E2+E#*E'*E*E)*E<9+E*EX*EN+EmL*EV*Eo6+EL!*E*E<*E&*E];+E*EK\*EO+EPJ*EH*E|4+E#*E*Er*E%*EZ=+E*E@W*E(M+E->*E&*E4+E"*E *E+*E%*E:+E&*EW*EQ+ER*E*E4+E"$*Ez*EE*E$*E*8+E*ES*EQ+EU*EF*E>+E)*E*E*E=*En:+ER*EhR*E~M+EV*E*Es;+ED#*El*E*E *E86+E*EJ*EN+ElW*E*EX=+E#*E*E*E$*EZ2+EZ*E:K*EQ+Ef*Eܖ*Er;+E)*E*Eb*E!*E2+EN*EI*EM+E2[*E#*E<+E**E*Ek+E*E$/+Ea*EC*E!Q+E__*E&*E?+E<)*E*E+E*E1+EV*E$G*EN+Ea*E*EA+Ed(*E*E.+E/*E&+E*EH*E1O+E`*E*EC+E+*E*E+E*E,+E/*E>*ENR+E]Y*E*E6F+E-*E\*E +E*E%+E*E$C*EL+Ei*E*EE+E+*E*Eq +E *E$+EK*E2B*EK+E:j*E*ED+EF1*E*En+E,,*E&+E*E?@*EL+Eh*E*EH+E0*E*E+E*E #+E*E;*EK+E-p*EE*EG+E42*E *E/+Ev*E+EK*E7*EM+E)o*Ep*EI+E0*E*E+EY!*E+E!*Ee>*E|M+Els*E{*EJ+E7*E4*E+E+*E +Ec*E4*EJ+Et*Ecv*EJ+E7*E*E+E$*E'+E,*E8*EH+Ew*Ev*EfK+Et6*E*E+E<*E+E*E6*ELJ+E{*Eu*E_K+EM:*El*E+EJ*E+E'*E$2*EG+E1x*E~*EXR+E:*Ez*EN+E+*E+Eh*E 2*EPC+ET~*Eo*E5J+Ex>*E*E>"+E *EN+E*Ex/*EF+El*Eo*EO+EJ<*E½*E"+E9*E+ER*E+*E3B+EÆ*Ed*EI+E?*E]*E7*+E*E+E*EZ,*EMD+E*E,h*EAN+E@*E4*E++E"*E4 +E*E,*EF+EN*E3j*E\+E{<*E>*EM)+Ep*E+E*E50*EA+E*Ed*EL+EE*Et*E(+E"*ER+E*E**EH?+EX*Ec*EQ+ED*Ev*E/+E:"*E4+E*E(*EA+E*E`*EP+EPL*E*E-+EP *E>+ER*E'*E:+E*En]*EO+E=H*Em*E/+E%*E+E*E'*E:+Ex*EV*E@B+E0O*Ek*E5+E"*E+E*E&*E2;+E*E^[*EQ+EN*E*EX6+E`&*Ec*E*E)*E;+E'*E4U*E\Q+EN*E,*E)7+E"*ET+E0*E#*ER;+EȞ*ES*E\P+ES*E_*E74+E@'*E*EJ*EW%*E7+E*ERS*EO+EPR*E**EZ:+E&*E*E#*E!*E7+E*EXN*En^+EX*EG*ES=+EE'*Eu*EG*E!*E 6+E*EH*EL+EX\*E3*E>+E(*E*Ew*E&%*EJ2+E3*EN*EP+EZ*Eژ*E|<+E&*E*E*E!*E0+Ev*EfH*EO+EZ*E*E?+Em,*E*E+E*E/+E*EkE*ES+E-*E*K*E+E)EO*E*E5)E*Es*E *E]+E #*E{M*Ed*E~)E*E*Eo)E*E{u*E|*E+E"*EIK*E+Ea*E$+EpF+E_*El+E*EĀ*E+Eh*E*EU+Eo*E=$+EM+E]*Ee+E*E*E+ER*E*EB+Em*Ev+EN+EHZ*Eo+E*E6)E+E8&*EfF*E+E)EƘ*E*E)E*E/*E")E +E.*EB*E +Ej)E*E*E)E=*E*E)ET +E**EE*Ea*E3*E!+E&M+Ea*EJ^+E+Ex*E+E *E*E+E:u*E+EZ+EY*E]+E +Eh}*Ey+E*E*EZ+E+s*E< +E,W+EX*Ed+E*El)E,+E2*E8*EK+EL)E*E*EQ)Ez*E*E)E +E45*E3*E +E)E5*E*E)Eg*E *E)E+E 7*E8*E*E9*E+E-Z+E`*EU+E+E~u*E+E{*E*E+Ekz*E`+Ec+E$`*ExT+ET+Eq*E(+Eӿ*E*E+E{*E+E`+E^*EjT+EK +E*E*EF*E)*E +E)E|*E*EL)E*E\*E|)E+ED*E'*E +EI)EA}*EK*E2)E*Ex*E)E|+EjG*E(*ER +E*Ep*E"j+E[*EJ+EL"+Ep*E+E/*E֠*E+E*E*Evj+E`*EE+E%+E'l*E+E*E*E+E*E*EBi+E5b*EB+E,+EBJ*E*ET*E*E? +E *E^p*EQ*E)E*E*EP)E+ES*Em#*E+E*Ep*E*E)E*E*E)E*EW*E*E+EB)EH*E|+EY*EE+E-+Ef*Ev~+E*Eȗ*E+E@*E*Egr+Ea*E(?+E1+Eg*Ez+Er*E*EZ+E*E;*EEr+E\*E<+EZ,+EAq*E+EW*Ed*E +Et*Ef*EI*E)ET*E*E)El*Egb*Eg*E+E. *E[b*E*E)EͶ*E*E")E*E_*E*E+E *E**E?+EM\*E6+E:+Eb*Eix+E*E͎*E<+E*E*Ew+EKh*E1+E7+E2b*Eu+E**E-*E+EW*E#*ESz+E g*E3+E_<+El*E<+EVc*E{*EC+EV*EW*E*EW)E>*E*E>)E**Eo*E*Et +E*ET*E3*E')E*EZ*E)E*Em*Ej*E"+Ex*E[*Eu+Ek*E&+ED+E_d*Eo+E<*Ew*E+E6*E*E=+E j*EE"+EK+E:^*El+E*E*E+E*E*E+E>l*E!+ED+E5i*EK+Erp*E*E +ED%*EDL*E+E)Eh*E*E)Ey*E$v*E)E +Et$*EHE*EV+E>)E*E*E )E*E|*E=*E> +E0*Ef8*E>+Ew*Eq+E2Q+E_*EFe+E&*ES}*Eي+E*E*EV+En*E+ES+E^*Ea+Ev*E~*E+E *E*E$+EFp*E+ETR+E[V*Eh+E**E)E +EI,*Ec<*EW +EW)E*E*E)Ej*E*E)E|+E4*E;*E +ER)Eΐ*E*E()E@*Eԍ*ER)E +E<*E1*EF+E~*E+E\+Ey_*E]+EE+Ey*Eڈ+E*E*E+Ey*EF +EY+E\*E:W+E+E\t*E+E[*Ej*E+Ey*E +E`+E6[*E]+E*EI)E +E>*Ec3*EI +E2)E*E*EW)E.*Ez*E)E6+E?*E.*Eb +E)Ec*ED*E)E*EA*E?)E+ED*E?,*Ez+Ex*E+Eg+E`*ER+ER+E@l*E+Es*E*E+E*E*Ec+Ea*EN+E1+E,l*E+E\*Eh*E+E*E*E{k+E[*ETU+E+E)EL+E{E*E8$*EC+E*Ew*EL*E)E*ET*E)E+EM*E%*E +E*Ex*E*Eb)Ew*Ex*E8)EL*EbN*E**E+EBC*E*Erk+Ea*EC+EI)+Ei*E+E|*E*E+E*Ex*Eo+E^*E=+E#,+Ebi*E1z+E}*E*Ei+E,*E*Eq+Eb*EA+E2+E*E*E[*E*E+EE*E7n*E*E)EԺ*E-*E)E*E Z*E*E+E *Ef*Ef*Eb)E*EQ*E*)E*EY*E *E+E*E*Es+EFd*E<+E1+Ee*Ey+E*E*E+E,*E*Ey+E$c*E5+E54+E_b*Ex+E4*E*E+E*EN*E9y+EVh*E>3+E.C+E *E*EPi*E*E+E*E^*E*E)E*E*Ex)E*EEj*E% *E+E*ER\*E*E*)E*EK*Ec)E*E\yEDuBEڝD3E~ovDvpEyODE/D܅EZDMBEb}DEC_E@pCқECšEDØEyDnՕE&m5DNEDBWDaEnE2&D;|EV6D%E$D;]EשmDvE"HD@E,)D.E*D渙ED>UECEbCECiEY D5EDEDE`0DθEk6DTE^XD=EfD<чEz{DEt4D\uEDgExDEXE E[HEx2E8E!%E'E=6EE~mFEEcVEYDeEDWtEbDkE0tDJE D&E\D_E <:DTNED]EhL DЄEYCdE^C|ECCELDPEfDE*D~EBBJD(Ed3pD\E&D#/Ev̦Dfg{ED\mED`]^EɦDNE E>EREJ.E2/EhE @EA E"PED_E2D"nEID|Eh`D„EDHEDllDREFGDݓEVW(DLE&DǙET5D_E CEPCEWC_[E D E|n DE^=DE\H`D#EODKEŜDZSEDrEGDZdE`DTEFnEDE7E4E)E$E9EEIEEYEDhE,iDGwEzDLE?DWE|D.EUDGEû3DEDEDܚECݛEuCPEx}CERfDE(DHRE0DEQD$ExDWوEDۂE\D*xED9jEYD[E/E]KKE:E ;Eҩ"Eԑ*E3EEYCE E.SE1(DcEDVqEYDEDr EDEdDE^?DJE"DEx Dt3E*\CECExCwE:C2ED6E %D4EDDExhDEDKEbD}E˼DoED(aE^DsQE EAE!E1E,E E=ED:E^FME=E]EDe lEXD6zEDE-DEsD_EcMD%ER-DиEMDfEDn)ECEXCɛECӪED`ED坕Ea7DÑERYDUEDsE:@D炁EHDuE(DgEADXWEBEoGEE37E=&E'E6EEFEF}EDVEtD6fED0tEՓDEDLETDȌE[DpE)9DjET\DsEDECvECJEC7EZDkEDEX+D`ElJKDEt~qD߉EuՎDEoDzEbDlED]ED2NEHE=EE-E0E^E<@E' E2PEIDA`E5IDg&oEWD}E\DtE*DE!kDEFDE<}'D^EDיECfEOCE[CE"CKEHj Dt E'!DߔE>D<֐E$aDPEjÅDScEDxEƷDrE!DcE_D6nTEElDE*E4EN)E*#E:ES,E^JEE,ZEhDRdiEDRwE֭DEF~DQEy{DYۍESDhE82D#ERDWEDDE}ChܛEtCuECEPDC ELD;E1DTELRDE$FzD/EߓDEv,Dw xE,DfiEQDZEEJEkE`:E#E{*EM3EޒE6CE][ ETE-DTcED|,rEƅDFE*.D9E~_DًEjbDܴE>DĔE>!DEH DBEcCEC$E5CFnE0CEHZD=rE &D E"EDݏE'jD$׊EڑDE0Dp}EޝDoE`|D`EDQEW E@EE0EZ-E$ E=EEnME{Du]EDlEzDzEKDӃERDĽEsrDEC=LDGENw,DіEDVvED.EHCEC;ÛECĠEFD,EJD5E F8D-EZDSE DuEDPE>ٲDuED"fE9Dz_WEoE]GEx5ET7E|&E&E7EEpGE E[WE>DJfED+uEsŲDVEDțEDCEOC&EKD{rED͖E,DA@EdLD܎ExrDE DσE`DRzEDyolEDg]EDxMEE7~=E# E-Eۤ0E EP AEK E-%QEDn`Et[DoED"}EɢD!E {DߊEiDQEDDE&DsE:]DECnECECqECs?E( DE!DJE@?DEbDЋExDF2ENDED& rE<DocESD2SEq ECEUE83E!!*Ep#EM:EExJEەEZE3*DxiE(D.xE D#EDYE:zDEDRD!E1D/=E4DzE4DyEqCޛEdCE}C EaDEsDz!E$2DeEHTDՍE8{Ds~EDmxEDwEDNiEdDE!D EQ DPE( CNEdpCEx`C6gEE$4E@NEjDt]ED2lEdDS {ExDE>DEMqDEEKDxhE+DE D愙EDDjdEb(D8sE^նD [ED`En#D*E:X`D4EEE;NEDg^E,DUgmED|w{ED6EDEoD .EJDEc*DE fD曙EZDbCEdCE(CrE C)E@< D[E"DVLE<:D=WEp]D\EDEŏD9EDbAtEDŮeEDSVEE"_FE2EJ6E 'Eɉ%E&8EFEpHE_ESXEZDқgEDj vEJ;DbE$`DՇE"PD?E>XDOEY6DAEDEVD`E.C ϛEhC0ECED!PEDE[.DENDEZuDWEdD|kEDyEhD҈kE0Dpw\EELEGE}E[ ENED^E=eD"mE\D{EaDGEaČDEmD3EGDE(D/EDHəEDlEfCECћE JC7E D%gEDPEO8E2$E'E.i5E4OEEE$EOUEDeEDBsEUDEDZEDE^DxaE ElEI.Ec.EEV?Eq EzOED] _ED nE|D|EDywEz D FElD[EdGDE(DEDKEC5ECpۛEXvCʛECEj DTE DF3EC=D94E3l`DfE4DچED˟ED1sE{D8eEDUEAEEE zEwA5E(E$Ee9EZE&IE<EYEqLD}hEhDʞvEDEXaDEX|DqEdUDA E\n3DӕEܚDE(DE@CXE|jCƛE(CED E6qDHE/DEOD"EvD"߈ED0E1^DP&yEFDjE) D[EZE6KEE;Evh"EF+E2ErENCEW Er\SE7~DbE$DqE*DdE(D^E-D,E5eD䓐E$ADpEe$DE DrNECgEECߛEȻC]EЂCEJ D{|E+$D.E8BDEfD] EˆDTED=}EDlpEI6DGaE2DmQE, EzAEqE>1E+E EbEiE<.E/E[En?E EOElDj_EDnE+Dv|E8ãDEZDpECkD~E_ED“E('DZ*E)DE=C ?ECߛE[CzE؂C:E DE:DԔE,=DEnED5sE[DXdE DUEEEEpE4Ej)E@$E9EEv.JEEZEmD^=iEDwEDtEZD~ER}DҍEuSDx-E2z2D.ED˘EJDECEoCśECܚEgDED /E:0DEPDE&;xDfEpD EDr4xED iEDZElERJEm<EE;E"EQ*EFp3E6IE/CE E.SE/D8UcECD rEŹDvEBbD92EoDԋEdDַE@D˔E#DEpV DNSELPCcEC !ECEDEZDaE"%DT E(CDXݏE hDފEwyDt%E?D}EdD~oE-D8`EDAQEZ E*AEE0Er,ED EEE-Eq0E?E@E EPE.D`EtD)oExDN|ED~ڄEDpE#iD"EDD\ߓE\&D>EDڷEdCHExWCޛE8|C E8C)-EPu DEB DEhH=DEX`D<֋EeD&=EDPEDDrED6dE]DUE0ETE_Daudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-6000.ark000066400000000000000000000273651376444676100256630ustar00rootroot00000000000000my_id BFM  ;Ec[ElEDDqE:XEBk~ (E5ECEEܜE>IyuEvFkEֹE5yE8C@EY]EZAdEp E^cD% E.E,YySE: ED#DnDE@^zE`E.*+Ed DtEpjE fEaE@*×E]]^WEBމJEÃE>HŭE^uE]DxEâE ͤ EĐγEDEEDToE-EGE|E E81DEKE8'BĄEVVE0Œ8EiE.]%TE EhX,/DEAE:7DtE\=Eo[EİȷEDHD+yElE5ėE2EWDE [tEBDĶEALEXnBE )E'H_EEQġEi#ēfEDXk)E?E.ōE3գEkDDhhE?JErtE( E^~DE GEr_)EAErCO#Emg6SEP,miEwȄØEĵfEC3EJE^pEĖ[EhD#D4E޺ZlE~ĻȪE]EݒDEE.zYbE`7EVoC"ZEjPE sElEvúEvĕ:E6Ca>E(EhĚE=lEDJECE \EED¦DE-mҬEEx,E}DfELEĎ}EbE@ÅEX?PECvHESE~MĔEgE>dD~ELE葦LEtĴ"E.aDDEz$bEssEb"E{+DOE2E"ĄEEE WÿwdE&|EPñE ĬE^C).E=IEbEĚE[DDKE {_E(ɲĕE6EDsYE3JE,m EkE:E ķ+E'D'DlEֲ+E㋛ĂEE$>DE ĞEY1qE0$SE_AykEjEo rXEE,"ĚEuĄUE*D~"E1EĈkEF~ĺE0D؊DEyDE§AE*EdDcE)ĺEM\E6HE0CEBtE>A7bE}EĞE,6oEDD,E%EĽE}E D!DLEGQ[E&GE;EͅDfEĬEh[6EKM>ErCL4EVEPġ mEsEJEĞ_E_Cm7ESEyEĵE䱒DmEĪEđiEĹ5E\EiTENE.,ĴAE$lFEY7DE6ER}E ͷE|DD\pE j0EZ* EEvWD~EAwEDٿE.LEBƴEҗl/E^_EcEEA/ĚkED{)EJEXEw<ѧE>D9PDX]EČIEԾzEQ E~DEEVE_EAEtsCE@kVE,iEwE!E(TbE-C3EE>E%ĚcEBDE$EshĴE4ĽEgDUgEݧE{WEdp ED8DۼERgĎEQʼnE:,EDaEe#Eij}EbE?EAmE(CHEnLEWMĥEqnEdD$EzEM~IJE(ESNDDE&dbE.ԕiĜEnQ"ED+DMEEE,QEzE[QD Ew)EČ}EX8*CK&GEEQ<EėE]jDE.EoĪ*E iĴ}ED滷D®EHE6E$E4%DEoo:Eĺ*ECZEpY|EH EA͒QE23E5ĮE`Iĕ5ECDaEʷECE>E48D,DĵEEE]6EϘE"KDΘEďE$;]EզOE`(bBܓElE[E;Ep46EveED&En%E*E\gEDhzD:EkN6E:AIE1 EqD<;E UE WěE-EDDEP"cEn|YeEELoD?E|vE|qӑE:E|C"FE3MbE(8htpE0UpE^AEVSTEsC:EEi5qľpEVEDHEmOEXUĄcE+EҲDCMD8E!iEڭ铖EI0E0 CaE^EDzEqfE8AkEļEXhAConEE4EUVWE* JPE$pDdVEaE~5EαEDYD^RE+EJDEwE3EaāյEКDDlEUi6E3͟EKE.DD,$EE`EK6BME\QE BE EvB~EbwE>$DF$EEĈHERĹENDD?iEZ6D*Er,KEEEkD EBPErR2EFE-C pErKEZXɍdE8|EBEEC.Ep?EXE4İES,DDQDEAkĦaEWвąEJtEN0D$PEjJEhms E|D7E*EL1ěyESE.A`eETE)s2XEZE(P"ħE5]E{*D&"E"EڎcE\GERD{DVEE{7E>EdD\EEMeEHECE=EB)bEn}E8^Ey0brED -EK EĜEf:EDxBDEZE) E&ExDrEEiē>E<>E$C1EEWmEDsEtÐJEadEhWC7ENEPyEEᒒDBEEJEp%E D'D.EG EldE:3ECF`DyE6dE+Pp̀Exc_EãBE=EBLEK‰EBE>EWDϒEE.PĬEꦴED`DڷE,mE6ċoEE,7DqE`)E-ETEz ET.#E`(ZVEFE;(nE.Ev/D EOE^\E8\E{DKD4E:EemEKE~r]DEPEGJ|DDʿE1$ĔE_E?5EpCE8ĬE\*KXuEjErEmĎE2Cv?E/EAdExE˙Di Ea>EIJrE(EhDDVEiEPBEeg43EW#E[DLEE_wxE)3E-DDEnE5f9IE,E DEǔĶGEBVE~E]bE:BEw.E(+C4IEbE*LE{.hEdD#E䔣E˦EbLEyDCD`EąGE]āET"EU*D.%EXĦE"$ĕEXE Xt¬yEMSET.@SE:E\1TaE6ĸEJkENE;BFE/E]Eb|EoE!ij E}D(EyEZ-EE0EDoD2$E}aEiE EHkyDE(°Es[ĘEX4CE XCbmE"E,ðgEYnxEXE) ET C 2E͈EԿĮEF^EDE&D6EǼĞHEոEEvTDERE\BwĂE8E{C EzĦE/qEKnE^lE'ĝEC =E1 EįklbE+܋Ej+DEE 2E=/0E™D2DEES@E1.EDEuEY |EndEPþYEvREpe-C;vGE5EfPIEWIJE3iDPE E\EČaEDXDE,E(`E=#E?$DEyngETĵEYEˆE=EAbQEO Ez6KE'E BD]EDEזELED*DڵEsĤE*E0EQLDE I&Ep0:ēDEOE`tBE+lExC\EVRE^įTEқ܌EdDSP&EH;EБEe pġEK^EiD=EfE³؄E ĢϭEWDD40EqE)GOEw0EuC}E E`yzE4fEe~E~XEJ;E:ľE8-KDE>EEİED?DLEdEEEdFD>ERE~5uEQE"BEBF.E±ZE.%E&QtEīE$D$EEDĔfElTĎECDDCEěE.Z2EEjD\E5ĨESEFE*CME?Ā,E(]õ]dE{EYĦE$fED&C$.E<EĮfE.(uE6DZDgE@Eb E>%EXDJEĸhEȂl0EͪTE[hDDEpLQDfEOEkF E.qĞWEVDDR-EE5ğ8E:E?DoE2jĤE:0REDSE3zAEBE`gXEjE!0E^gEp+D"E~|E@Ee īEDYDE EJxEGEadD25EEOčNEZHECE$E2GdbEyo}E\?ĀEĐVEXD,E2ߗEu&EĤ׼EץDD.̮E~E@ΰIJEXEDDtEbįE2I1eڀEaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-7000.ark000066400000000000000000000333051376444676100256530ustar00rootroot00000000000000my_id BFM  EMbQDmEECœEEŐE*DW_ELDrVZEZrxEC-E4 ߥE؏EG,5ED`ļEPFEn&E!cEE6 E\޿DEGOEEmG"ߨETE`E+DoâEEE"ŝ_EδE^t8EsD@dE2E.E #>ܫEKEh)LgEիDd8EfT EE*$REzsEw Ŷ)E*D,<EY$EE$̮EχEy JEDƒ?Eڎ/'EE^E%$BEN)E  ŮED0YrEĎ*EΗE<%^EE, VE\DxN+"QEb.EqEi8&@$ERڂE* ED Eİ1ENEҩ&,E3E]ňE-;D $E#`"?5E#E|'ŒEE_,bEX{DuE Ĉ8EEZf'ncE{EŲEanDʈA>Ep!DPEN 9oEEYt(y|E@EEZn)EHCVJDEknrE0EO6(zEBE0yEBWDEDuEӹEX'qE>EEPBdDEpwHyEpE 'E4;El8E@ @qDEJ|EEPI'GE7EhfEЀ*h~Dv8EEE5&zsEXX4E44E»DzEj_Ef4EЌ&šE0EӳEX tDEJEE9&QEy-E]f`E؀7 D#(E ETE%dE*EĘEeDnEl ęE߯E%uE}&EdEl܉ED EH .@EkE$łE/#E^EIDE/gEE$3EڻE} IJFEÆD3EoESwEg#EoEe9ED@\—E*ڶ2EE&ůEŀE>QŠEDEyĘ$6EE%'Ű\E2~EBE(wDѐaExξy9EE '#ŷEzE[6ń4EjDA EE&EPr3E?ED_EAwEϳEk&JE/E/E (>DjEE]E%Ŭ E),E4rECr˔DfEd `EvEa%P.E&)E2JEl>r^D=E pE}EK$&RE%EJ2E_DrE2 䪈ECEn$ gEA"EVpEhÏDEJEȐE#{EEOxOE;-TDE&TEE?#@EaE3T|ExD,EŤELEҍ"6EEqEXḼDjEeņ,EE!*EE?E!:VDJEYfȐEE&!fEEd E% DE{WcEIE5g EW EڃEDEt. E]ErEW? E}ēE DEœEE1ŒEEmsM*E+TD]0E`'1EpEžE+iEUĐAE2KϾD|yE(9EvԛE*ŰE%bDHJ,DEUĄDE/ńwE;CE3qE#D\2@?E'_+EENE;E*bYEjDX5P3E="jĖE0E,EE>ED+Ĩ'EBsEErŰEEEKDNN ĂE:~g EEŤEE>E:D=E%ŸEE ŪKE DHoèE4M)EV!E%EPEQ 8EnDPAnEpĀ,EE&,rEEO]ED/E޲a-0EEWs&ŻEEdfEMD EE^3EE&pFE\WEqEԀD@^SE Ď7ElEk='tEZY}ErY EttDSLEw:E@YE'6"E"zEh _EgDI)BE,=E-*E'^ETvE5ŖEZDBfEV4XAEE((ŐEkLsEEND C=EsDEE#f(lHEoE-Ħ1Eg@D(:C)Ey/HEE(XE lEfĔE 4D@kkC{EaKEFE(űE,iESET'DCE&~Ĥ OEvEy( VEeEo$ED̦CEVkREEF(FE>ibEucE DC2E66UEzE )ŧE_E:EdD0CʷEļKYE/E)ŔKE [EĞcECMC>E|\EE)tE;XE ElCX<D־EEVē`EJE)E(TE:?\SE׷C~D,|{E#^VDEY;EEũEKEqĦ,E`.0+DeEiŅEGE*ŪEEDf\:E8DbE|`*ENERrEBD\?EДCėD(EلAE,EJEiDeRBEMČwD=E]BNEmEE>D'G?EKXļHDPNEoŐE*ؙEŦED=ļ;Ebĝ EWERLlEGE3EJ Df2Ĉ3ElJzEbE7IE]EŬuE>Dt?($EvĿE{gEŰEEdE}DLcEiĴK EgE3EoE0EDE^EcER ,EE4oOE D(ECă(E0`EYj!E!ME>ňEJD0SFEEXE"ŨE[EbElD[5EELE"ŕ EEtED\E2E'E{uE%E.WDBE-oćCBEE/7(GEjrE; ELJDC%EܔĆEEegE@(E4 oEWE =DGCjEBIE00E( EܯkEĩE0D(xC_EύLE:Eo(0YEsOhExE#DC4EnOEHE,(^EdE6E^DD2CEhZSEVkE)ŐE[aEļEd DĊEHClDԛE(Iĩ`E;E )5ESE#rE\CJDEBĢqdEE(xE PE"ExC !D E }9gE^E(űEMEAIEC̏.DEkE;E$(ŁEIEAEOCQ;DrEYUynE߼Ep}(ņ7E(DFE3E C 4HDE0?qE}E\A(0pEBE1uE0BUDBCEM7uEE(E`?EEczBbDZExEE'EQ;EĊ%EhA'nDE{E6Ey'6EpH8ElZE`ˆzD8EV|E*εED'ŤE 4E7EħDE=(E_E&;E f1EFĖESDE~тE9EGo&fcE-Eذ2Eh1]D-4Et ŒEƱEU%(Et+EbāEPeWDE Y]EFNE$hE'E1ئ6EP `D-EE XE{ܮEu$xE!$E:E>%ED?E ^EcEb#E EăZEPTD}EŎFEEQC#ū)E~>EFEd KD!tEņE /E #ElYE@8)rE mDE6HEEQ{" EE_ EUDEH7E/E!DE~{E>EReDE~E0E !ŬE EZĵE8SDVEw5[EgEx]E# Eɀ,EpDERHEKEZ&\EEww AEo%žDmEbBEVEŪYEHEdmRE0ğhDNEWv~$El͟E?OEEecĂXE:%DpEşEIECE2D [ EJKG+DEb EsEE] E'|DG3 Exbu$EEӃ$EE܇E(! DE=DHEPM'EE %ŧtE98EL ʼnEDRSEثĩZ+E{E%E\EP ED%lE@.EԅE& UEE#k1EDp]¡)E>ôK2E;E:&JEdEYňE"^D`ˠE '5EEN'ŊE~E\[^JEDyD@NETă8EtEȦ'ŪXEy[{EElDvAfER ėED,ӱCHETExEH)L>Eb`EE_D$CE*4hWEE`X)ŊE \E ECpCZZEsċZE@bE0a)EYE\&EuCȑCES)B;^EEj\)QEVEVh0:E|C D̙E("bEEG(%EGSE(ECXD)EUEO`E6BYdDWExŲ3yEc=E'E:E*ĎEtqDER|EEz'sEN7EٻܬEu$1DQE0dG/E\E$&xEVs4EyKE:½D4EځE5@EJ&ZE1ET?EoODE`JEѲE%ſEƔ-E`ĺE(5ÛDF?E4 I%E aE8Z%ņ E'*E<ҀE kuDEEq EԬEV%E1&EļETDE2, 2E8E$" Eo"EbE1DEăŊ҉Ee¬EB:$E*TEbT%E*]Â[DU EtE0EE#>2EJEeRETDD7E4[EFE u"ņE(EĶE@êDERŝEeE!ߏEEZ!ĹElDEnؒEl E!ŜE/EiO"El-DEL+EEU ElEnpEȧ7Dd;E]wgœEEEH ETEDEEQExE bE?;DH{E]D E{E|tEEb#D6X EcIDEŬEJE:%tEp^D,LnfEroRޑDE@EϷE(ťaEQDBAaE\ĒXDEŊϞE&E6$FERD6jXE gĉEEh\EvEz-E0DX,MEqXEEv-ETҕETE*Dj#UE}r EbEŞ,E$Ec\EzD!(E䂃> ENE IJEÊE>~EGD HEmFEEJ!6EFE6ŗUE@DlļEGĽEE"E>RE$ņ)E*;Dx.öENܥEEb1"#zEE{6E DȘ;E}E'E"yErVEVſED wE@ĜE"E+#ŔqEE EADXd.GEKĢ!EqE$E]E, EDEڣoZ%EbE$BEk1E>I E DH}æEjQ(EGE֥EP(l;E mEHEg5D\CqEf.ʢJEjE(EdiE2ĸE(DdCE# NE(E)ELIfEĶEtZDC Eĭ{QEzE>)ŌCEbE.FgED;ChE4ļiUEEg(ŨE>`EiTEz%DCaE[XEEN(O$Eϟ\EvgjE`C(CvEDnĐ-\EyME&(qE>6YE*'ExCBD?E"Ġ_EE(0EUEARķZEvCD2EGbEkEE@)hE?QEJwHECD]EnHfeEjE")jEZxNE\EƉC'D''E`D6ć[EzAEV8E$E|+&EۺE[y%cwE{EFEFEd_D)FTADEصDpZEsh;EŅEDE*ŎEaEd&$t}E#EZzř EG#EĎ wD8F,PED̿'ES5E&vEcEAL*7EEz'NEVE1 #EE*DEDF˞ÈE*WDdĺwED/EF\E{Em)_ӰE^E(ŌEE }7)EED1RD>IE@+løkHEɫD1˽Ek8)E ^EE(h^E[ѰEW)EEjKŷF/E:uE'uDE0l0EvD`Ev#E 1 ŐEXE;'ŭEX;EFI*hEELŎZ5E&!Eڿ&DfMExÀ—FvD8'EE~WEn}EK&\bE,EJ*HE@E~ l;EE]~DEpVAJ*F_Dv HEE Ŗ|EPwE?~%ŘܺEE|+%E߅E1nAETEwD!E BHFIDĶXEEmSERqE20$ME>ME*+EIaEO\GEbED|wEaUĀ8C_Fm2D6`E E̍ĹEbkEM"ŏE>E:,uΕE2/EU{MEt[EP>DdEd1xMCpFD=z_EE!sEeE"U!ŐE,Er,⡘EE:rSEE=ľDBEADĘ C{FLDh*IEFDH+`E_E|cEB(E,,keEtEVYE-EHĞD%EVCD~FZC V'ED4EYE\E.eEs,Ŷ)EfEQ/_ENE+bDGE i8D|FCl DwEVfDESEP5 E$Er,EE2Q!޵eEE"m>EWEzD D\qFCC1lEhD)f]EME0MŃ4EF͕E;,ŶE\ED"7kEEx E3^EKĦ2D_F7C\ L{E{DZEdGEBLŻbEEC+}TEFE%5$cqEMEŮEXEg9ID"FFB ď#EDČXEiAE5]Ek E|+EٺE %rwExE5fEFEύIJ_D)FkLAE-صDX4EY^;EŞEAE*EaE&Ht}E$Ez7E!E'"wDFԍžNQE"DƳK(ES5EE`EI*=EET'ňEE7 x2#EEz!DE ĨÎE EDwEO;/E&DTEwE@)ӰE.ZE(œEHET [7)EEb40DIFEtlAlIE᧒D'ĮE&+)Eq ˿EېE(`Ey̰E)0EESvK/EwE&mDEh ܯEHD. :E#Ec) hEE:' Ef5E>J*iEEJŁ^5E$EDܿ^EDQEIPYcFTvD}ߟ'EEHzEld}E&,cEٜEx*HEE:n;EEcDEDYAL)F,_D݅IIEEEzwE|%i޺EE|+f%EE:bAEQED E} Ġ?BHF ID*YEE%cTEqEV7$NE;LE)+EZEOHGEErDwEmjm8C`Fh2D4_E EĮEޔkE"EܘEn4,ҕEK.E^UũME^EvRDdE91ĜCpFDz_EENlEPeEN!,E.Eds,ʫE^E<{SEHE9]DhEJ1D9Cq{FHDphfIE~D'đEқ_EhE&E,ūlEE8FYE0EĉxD(EtVTCBFC|V)EvuDv6EYEE`E ,e.E^ES_EE*iDIDEiDzFpCCĴEOyDdESE5EEw,E EX!ŶeEEǏEZE,zĀ DqqFC501E2DO[EYMEJ2E˕Es:,@EάE"kEEHĢ E~`EMԩ2D `F~7CfawED&E~GEKbEE+ŁRE>E0$ŮqEOEŨEXELIDGF`)B ij%ED>\EJmAE4EEw+7EغE}%wE9zE\EHE*`D<*FOAKöEֵDXEp^;EŪEAE~*E_E7&Ŵ}EẺE#ETr!wDFB¸G^TELD4Ě(ElK5EDE?\EE*Ŕ@EݵE-'CEկE=6 Ū*#EE1&D԰EwúX4E@DzE6/EUE"xE )CְE YE(qENEM V?)EEDeD@FEl[kHEތD$ėEB*)E6 *EBE(ņ_Eb԰E܈)ŐEE!QQ/EsE ĀwD2E`E2DĨE #E0+ EE'ōE4EQ*OiEEDZ_5E'E޿]0DPEhU0’FvDlџ)EEyEd}E!&KmEQE*žNEPE z;EEl~ďDEÀYA&FL_DmKE EdEzwE|%޺EEw+Ž+EE;AE VE4D|#E$ İBGFHDԎĬ[E-E7VEqEx)$PEFHEC+E}]EZŒGEJEzHD0yEY9C aF0D2DY+ĝbE EEkE"뵿ENE2*,z֕E&E0UϧME=VE(zDfEW}1ԦCqFD$zĞ]EmEjEeEO!EEr,łERE?,SE8EyDE[SDx\C|F_DhLEiDEp_Ez=lE%ET,łoEHE4 ŋYE.ETĆDg&EV[CH~Ft CmV2(EvD6E@YE*Ey_E,0Ez]E-Ű_E:E@ĩDEE%iD{FpCCĜE\[D.ĭESEw2EEq, EA ERY!weEEEhZE{Ě5DRrFȷC/1$EmDJ`EMEqMŽ2EǕE^9,ԝEE"kEBEg E]E\iz2DQaF6CXyEDxLE?}GEOleEE+VEBEx4$qErMEME~WEIDGFpCB &EDĽ^ElAE4ńE:ER|+@EӺEy%ĘwExECEyAEva`D )FWA#åED[LĞES;EXE@,8ەE&EV]ߧMEFVE(DE1Ĵ·CXrFDz]E/EraĦEeEI!4EݠEr,EEBD߲SEEb]DEN[D\cC|F?^DhWKE&sD|E_EoEEW,5lEֶEaYE+EuD|$EDVTCFRCbVi+E`D&9E͐YE]ŨE[E,y3E \E_EOEw5ľDEE+i.D~{F(C%CęEaXDVIJESE0zE:E8r,QEET!ŷeEELEYE= {4ADvqFC)1E|D68aE4}MEHż5E'ƕE4,北EiE)"kE E? Eb_EDb2D`F6CZzE)xD~EsGE^N"eEE+žYECE31$œqEGEa$EUEƔIDHFpBu h(EDĺ^EscAEi1ӑEEy+ńEnϺEAb%^wEtEƷh Es@EpX`D;(FLFAEDXJrET;EZEFE½*y5EKEPĎLDdME,^’FvDp'E_EjvEP}E&śpExE* VEEu;EzEĔDE-ÀhAb1FQ_DXĢNE^EOEewEs%E6E+1E|E;AETPEđD EK poB`HFHDɎ]E4E׾YEMvqEx+$żVEBE+Ų ETE+^ޫGEE&DtE{9CF`F2D FeE EW"EDkE|"ōE㐣EB,iЕEw'E:^.ME=SE26DE314!CMsFDzĎ`EbEVREeEND!EؠEn,&EDEASEEoDrEMD,CzF2DhLE_D ?E_E rEE,uEEŧYEN)ED#EVC|FnC+V&,END;EYESEVE,6EZE(_EE*TvDCEPixD{FѱCCIJELDdĄE*SE,ŘEEo,ůEEY!eEJEZVEVE+G{ČvDpF8WC0EcYD-XfE2sME JU9EƿE%E,xEEK"ţkEE\ EZEs2DT`Fp36C|EbD}E iGEHgEE+ ]E<)F?.A&WEFD %EkE"ENE9,*E#EbBMESE46HDEĿ1d.C+pFgDezķbE)EtU#EeEkD!EؠEn,,E0EIcSEMETDIE?DC[F-DMhėPEHDĦEԅ_E=rEE,ŠwEأEHYE%EUD$&EW$Cl~FC[MV.EKDi;D|FhCC\E_7D޼0ESE)EER,EE$]!feE:E$*EWEZ{ğDpFHC0LEFD?hEqME J8:EsEq8,*EΣE"OkEYEE Ez]E3D,_FL5C~Ej`DĄEghGEEmEE+Ŵ_Ea;En9$ŨqEDEM"EQE_*IDDFXB_ %ErDdE7WAE4+6ElEt+ų EʺE%ŁwEnEq&E@ELĒ`D")F-AEkDX,$E?;EE^4Eb*E3E&P}ErEEME6vDEPfr5EHTDx E4ETE3E3*j,EE(ךEEO H#EEѨl܆DKE; 0ϟEbDW^E.EvŸEMEd)ŊE/E(ŚEE. ŘW)EE| D)bEh4j8KfhEDlĮEL)Ey E"Eg(ůE^ݰE R)òEEũ/EEA3DEƝ@ùE7DhE.#E ^EtEu'E HE *EEΆ?5Ep@Eq{EŎCAqF2D^EB E8 EEkÊ"&EE+Eo>EhNEqEĤ]DE80VCiFzBD%dyEEEeEs!>EE\2,ҘEzE RTEGE4MDEɬCPCjFc D5goE"D(wEA_EBUE,E>,ůWEtELYEzEVĚTDE,X4!CuoFJDWF !BI IED2nDEu AE6fvEEN+:EEh%&pwEPE`ňE` EK?N_DFS@zPðEDE:E$7ŶEE0+ŭEl3E+&kX}EnEEdE&:vDE†X5E`DD E4EPE/E8*O,EEW(ʞE|E0@ _#E Eʧ؇DExQ.ùEʊDKRE[/ESEEG)ŞE(jEv( ̈́EE˘ )EyEIJDeEjejExՒDRaZEA)Et ZEtEg(ŹEܰEuN)źEEd /EԊEη2DE,ǝ\"E3D]!E "E(] ųErE?'ֵE*E=*b[EiEC5EEDH)E@pߐœE|OuD EE7EJ}E#&!XEHkE6+;EsEQW;EET,ƵDПEhR@ApF^^Dӱ.EEnjE6wE%XͺE;ŨEL+7EuZEZ8AESuEbD;E y B&[FtID35EE tBEؠqE#{EMXE>+2EmE#GEEںĀDEu>CLrF2DˁE E GEkE8}"ňE樣E`+ŭE>ENEqE``DTE0ĠChFI>DRyĪEE>\EEuE`zʡDFȇC/ E#DZ[vEME%XcE֕E+ŹգEBEc"ŜlE*EFXNM ExE94DoF|9C,E0DPEGEŵOEǒE!,DEE~$]qEJ"Eq#lE2E溏ĒHDv8F`طB@ 2EHD:ėEE_ AEJfvEEc+D |OEh5E^ E*=[EEmŃH5EEhD*E,#+¼E~RuD EEŴE|E&8XE8gE>4+BEgE#;EE>ĬɶD$E\ÀAD;F-A`DĀnE'E]ŴE|wE1%EE8+6ZE4El ŖAEiEģD>E Đ[BXFwID3 EmEuȁEȥqE#H|E&XE0+2EmE#GEEoD"E%Ї>C#oFF2D}KEh EE,kE#VEFeE*~,pŕEtE~ME.E.vD.E3ΆCDbFKD:{DE\E#DEF,eE! EꬠEֱ, E E΄LSEE(qDEWEĐ^ClFQDvHi;2ED\vyE@7_EYELER,$eEvEP&ZE>?EYĈhDcAENV@[CPF~CUġREĢDĚcEvYEElEIN,ņcE"pEf`EŝE*tDKaE[hP\DrFTCBO!ED3ijESEt)EE|.,E7E$!)fE*ET4-GEuEzD|F8C /zEάDQLNEMEoř%EREu, EzE#kEEZ E:E\O2DOF0CaEoDGļE.GEńOEÒE!,ŷDEE$qEEY(ŦE.Eˏ,HDX7F Bp' dEDĺEE'AEayEqE+IE6E%0wEE IuEZEXCaD7FfgA'qErD֠ĹE.u;ErELE.**իEnEm&'}EEUuE:ElxDnFŒxE/D vOE`5E+^E;jE*nEE|'E"E #E< EܧzDEx$[E3uDJ@ľcE=.EXqEwBE)İE:'E(ŚEjE! ()EE%ĮD"E6s`Tmü,E3DDW E(E ޯEe[E(UE E})ŔzEhEKB/E"MEԸF@DЭEFèE)D{J7E-"Ej_ EmE'ņEE܈*VEE{85Eb:E-ĠDjETh4FJ'wDs `NEE!wE}E\&E,E*E]Eh;E^E(ֶD2EL)@A{9F:`DNpEE ]ŘE}wE1%EE@+^EEŠAE:lEQD@>E `BZF(NID*FEnELDE$qEd$>EE<&,E +EܠGEELĚDTEo6CdPF/0D&tPLEd ER E*kE.#xEfEz,ſȕEcEzME^,EyĺxD@E5 30CbF(D)({QGEZEET,eE!EୠE,eEEIŇ&TEE!rDpETCxC܋FD3gqE3Dj\E_EdhE1E#R,ŶE]E;\ ZEDEa{D*AE nVCTF|>CVUĩNEDpcE.YEEjEH,eEkE]`EEeGD1`Eh6DgFGCsBME>D(HE%SEi!EcE,qEE˞!ňeEܨE:E1E|^D_FC1ĞEDDNME:ME%EEy,ŷEyE#ŐkEE^ E'8E`S2D OF0Csĝ_ED>GEGEQ{ŠVE,Eh),/ME EJ:$rE[E ŖeEpE+ǎĔ(KD:VFB gE DIJ,Eaudio-0.7.2/test/torchaudio_unittest/assets/kaldi/resample-16000-9000.ark000066400000000000000000000431451376444676100256600ustar00rootroot00000000000000my_id BFM TEq E_.:EE]nqD,Eb EN EJE0~CEJO7E%)=EE(ļeòE@`EY*uEd0Ej$u?Ć.E$ŕ.En EC.gEުEAEeOEAfD~E3E8S #DFE4E~C*ApEkE-=kEdEXXDĺNEE8^5DFD?# (gE YE[ȗD4E EHTE\EICE0EZ$[EERĈ1 EZE) EŧE:d9*EiE]F*ł^E*E$pJ0Č>EQ(EX%ŋL5EFERCrEEtͲ EEEyDĠEE 8$D; F D{FܷEE(+jDEķE.EAEނlCEvQ9E*&`KEXEgĈ$qEbEPr*~EEAEĥEE7)VE*EydE,E#Ų,E?EBC,EEŝEQcE7D+9EEsr 1DF~)DGEE|PAIDE2bE<QE@EĘ`ECEBEu'5EE؀_عcE8HkE*ŒzvEEK;ġ0`™ErˉE(lMEEB>ê0Ed)E!#E=E`DEvEC(żDEDrZ E7pETDEa_Dd<ŀELE< (D\E*!E]!ŌeEOaE `BkEԶJE(E9EZ hQ1ÿ EsE*mEEE yz_EE'EDE*HEPCk+~EE'hEE,?DĘEz$EkDEDL3EE>3tDԃE`QE(EE;*DEL)EM#{rEE΢8E%iSEp)'EErMĊf;EeU|E*FgeECE0No EEo&L|DEΡDHRE9EveDEQDQɯEEf!D\-E*#E!mEE"ū}:B\!ELE(ŕ!EfkE5b$ ԧEuES*lEEҪ^EEF'~BEE:C`@EEg6EEFDEEXŀDEzŲD> /LEEeńDlENE] ET~E ĆPDYE+E#ցENE `°EbUE)EEKG kE"E~E?y*bcEOE-zi:EUEF&:EBE$ӛCzĄ+E ߥEu ŴlE6EykgDkE1E"œnD FD <ιEE}b{DE E5}AE fEmļCs[E4EU%{EP E@pJE ^E<*VƁEE,Ē 7EWE* ZEE~ÀEE$R1EEHCNGğ]E審EE)Ef5D.ErEn _DF^DKŪ;E E\ZDSpEE iE8E–kCLEI=E@&#nElEMɛùEfE*B{EOEPZJQ/EފEvW)v$REIIE,{EE< #(EͩE: DƄ1`EuED7ED$EQE*E5^DEDW蝲Ep)Et-ĄK:DEdEB E@E% CEFE7(#REjEv$E5oE* rE%SE=ÿk&EʷE e(pIEE`ŹBEE!ťE}Ey-D4aĀ^E,E@0DjED(ŅEE!DʱEDDQE5EĂDHE%EpE"SEEĀA ENE)P,EE7\ļeĺ;EſwE*njE5ETv=XEϏEJ'9@E0EWCY@đLEE*24E4ENMDK'IEҴEDF_D ŮESE&5ʊDTEOEv.E+EcfC!E>-Em$şE EX | pE]WE)Ś EJEA"YEmEc*]taE8Eh_o)E7E% 8EE*CĻEDæE lEXEoDb 'EcEg4tDG FD EsEك\tDE" EńaE EqC"E6E%œE2ElAX[E?_EX*JˀE?E6&ĶD=ZEME)ţXE3E<‰iČEE.a$/K/EnEwCEEtE(FEDĖEE pDF6Dh jiEfEyqgSDIEE EELEXĐlC EJ?Ed'o}EEۄ00tSEhE*z$yEEl tWĝJEE#)b!PEEͿT#&EE"&EWEDE"NEZ&D EWD"%E\cE.zD*E(DBDZEEPp2DIEjE^ ÞEE BjEGE:(`E8EEEJtCLŽGEƣE` EVEjuUD EEņDAFmDL ŸEEv;\D=ENEŲNEkE8TC3E}/Ex$ҩE,EÔE4RYE)" E}E;>j(ċEEzO*.t_E(EhlTù pEДE%6E1ERڸC-EE6ņq E&E;vDę^E3Ei 'D FDt/EeRExPlD,EEdIEEz5CE]8E &5E1"E/^w\EZaEeg*E|Ef lCECEET)VE8EλoEFؘE#bM-E-EF&CEoE[J&E\EDOĞEE ŶD,FDvӒE,zEIR$LD#EE HERzE OCEOAEf'šEyE@úEjE*1wEZET]EqEY(+NEENA˩JeE9ӜEF*"p$EEDēEh(E0iń6D:E D~E-%EŠDED,EޏEĦ+DpEn E0!ѼEEtFB2EIEz(jE1EzgjĞg$7E!sE*\nEP E0wE=E'qEE/EuCAE0ƠE EEHvEeEd^!ğcE wEH*ŬjEEΚ0&EUwEg'vsAEEdMCRևEIEI!ECEKDJE;EŤDFz+D ȼE E:D^EE;EqE%XCe0En&-E#RE5EBSE(VEn)[EEnC?IEAEo*"bEGE*yÚ$/E$E&L8EZECGĘEoE'("E5E3lDEs`E`E>}ŏDz FJDpT AE=E-wDUE= EEUE4\ιC:E5E%EldE59QÿE!I_E]D*&EEB(ă:yEEx)rYE1EgDVOEiE4$Ŏ0EECEGAE qE;ED]Ė"EɢE =D*F cDŀEE%8VDb\EEQգEΡE#ĈuC"E>E&֐EEh˅#]wEFgEB*yEEI ĔUĿpE(E :)łPEZzE4h-h=E~E"E'EEDEEzTǒDE`DJEE ŦܩDEhDŇEƚE(5DEE żEUEʲKBrE:LGEZ,(EO E]MrfEtpER* QqEE^oHE1ME(K(t,HEEB EEB E\E^E2DKmEɳEV`QDE6DļsEmyE$:DoE^DşaEEXDEg&Eǔ"[EEi?ޝEOE:)E6;EJX ExE®*şhEKE`F9_EdE 'ſ]?E EdjCڼEvEE2GERRDDďEVEoDF"(D EHEĘ_DEE0EKEnEĴiCE /EU$pEE/PW7EXEQ)cE-SEh=ļ2&*E1E[**`EEl]ޟE{ED%6E@E{CmEOE'* E_E2sDzĔEEb łD Fh1D]wEn E3oDE?EwhҦEuEMO&tCE47E%EElĀl³EtDaE4b*Y1E KE "ēLAEE\)NWEgE )EE$e .EnE^C+G:EBET+zESEuD6 NdEnE DFWD0&EIE.ND3EREE=E|v(YC Ep@EK' E6LEXʍeEiEE*$wEn/EP[nE!E)NEEAZѨEzEP"0L%EEzbDXLNDEBڮEڪDEz3D6 E߿ECf D^EێDBŎ;E4NEĔb.DEEJ!S EE3BELIEi(WċE،EqlĞRZEkrEк*ť\oEE(uĿE`>E(3FEE" C@EJrEB CE E֩9Do9EE8WDEDżE>Er2 4DED<EQE¶P DEd(E#EELĠPEQEN)ĝEjE,BRIJɄE zEw*DfEnE{#ÐoyE:YE&ʼnx=EAE[CbĈBEZEd žEHnE=ZD]ĕEu,E/]|!D;FvDd ŗ.EVETĤDE.E Er4EDE y0,C7E$1Es$EEŘRe&EqZE*OmEKE(^ъEfE|fb\E]tE*őimE7aED_z{OAEd/E'`&DE^E'CڶĽ\E.XEhE$E#OAD2īEj_E2iDEDܽEEBŌoD:|E#EYňEEZWD}Ef*Eb#+E(EĀQO¼E~SE})*E0E:LĐDĿE|E*dE E윎ÌQEKE&łw;EE擑CUE;EL}ŨE;EaD$g]EEۓ(XJEeE0B]qEQEi!ţJ!EYE(DEEmBDE&gKEEkĐElgE`*izE8EsĠqRyEE )zQEEN칤ĉEaE,"hK(EVEODĞPEЭEOJDE`xD,|:EE8l˫D<F?Dź~EzEG9DWE=E2 #&EEC!CDEKFEpT(E$EhuæEoE+ŢqE+QE!`nVEuыE^(РHEEBQE4EE$.!NEhEv.DUEFEź;DE>ED EEDED ǐEBE!WDEj%E"61EݠEߨ@2ESOECK)ˆEEAYWC@E|xE7j*żiElJEj÷hPE$2EE&m@EEhcCnğ?E8@ExkEYE$%QD9b5E*EDņD|FHD gEE 2X@DpEE^Ed{Ez!İC/E .EX#xE/iEyĨZ tEB-XE,)DۄEBE?"lWE~E*aEEJdȚĨEE&<7EEECS5E E*y EE0oDlĴE쁸EI6/DEGD;ŜEE|tJqDEG EyEXEIXCE6E &Ž.EVEwgE{E`E*ŭfEEy &Ĩ @EuE*ŪWE7(EpLHAEE$ŧ{.E~ESCnVOEުEthEljELDEEE hڸDF\iDQEEbgRDaEv~Ej_eEl#Ed `hCE9@E&CZE8E|ƩiYEbiEg*xE.EZNĀXAEE(8OEGE,A{kEKE5"=&E ED4΢E6EFLJDE^D {xEeECDEěDy4jErE0/D\nEE !@EQEFBEOHE(E=Eo`ExqE*ŗoE8E1ÃtEpƌEb(QFEEXBܳĚEEZ E,E}5DȯČYEE!ūHDE7,DXϾEEDzE>DRŗEEP*wDtE f'Ev"EtE(ĀM݊E|QE) EoEbuS` ąEJ}zE]*gEܦE`zE Eެ&|o>E PECtęE'EŻEEXDb-"~EEZnD7F<D( ŇEiE3\pDTE@E6E#E6CNE0EU$6E EGĐE}*ZE)ŧEѡE"+; +JES8E*1^EE Q}Nc)EEo%ſ55ES!EdCEE  E[E]wDa ENEd DE24D5ťҷEgEgiDEIEť"EE<BCE:8E`&ź@E-EpЀ8VEGbE*^~EvEH*F)EXiEp) UE~E\”K/E;EŢ#Y,EYE3Cz/ĭEɫEŢrE$EbDĖEd EvI 0DlFODzEE6JD:ExE EE^UİKCEBE4';jEKEP"3E]kEm*švEhEz^E&؉E^(ŸME"EB\x\EX3E!ŢG$Ev9E+D1EEBuDEU,D|olECEDTEёDskŵEEs(DCE@ EF!ūZE5E$BUEPJEA(^ EE|iĄ5E]lsE7*ŴmEEd]zMEE(ŴDE%ECvĺxE/E2; iEE6=D`EEgŴWDfE Doż EEbrDEaEEExX? DcE)E"hE Eu@»=E\zSEt3) Ex'EeMaE1g|EJ*eEE~|tΈX@EE]&ńlE$E?*DZEEé˘P E̖E%Œ?1EnEЈCĮ>E~EBŠEEdD&ٍELE\ \4DUE DOx0E{E1ZD UEREE*]E) ElFC6E:E~;DRE~EųEmE>ĀYCnCEnFE'ˇEEnuЉ(/E6NoE*TsE^E} IlEY}EO(dIE(wEBTOEbÞEY!6EXE+DxvMEE+DEDTE E2RDEorDi|ڮEEvDUEP$E"ŦEfE^ǩ@AE&DNEfC),EE]B#EfSwEN*iEEAE@E'Ŕ@EhEQC薻dsEE ŮELEwND'ľvENߴEg{DFڶDB EbE,bDvzE`E&&aE=E(CKDE-E,#Ŕ͘EG3E>0ȾE9wWE)Œ4EQEKAR EF'E()*TaEEm'EJEg%uo8EEC4kğEϦEKIEEboD]ĶIEB}E6/DEKD: EMbE3sDEi EjGSELib.EEb"u'EE|D(>E ]EDEDŀEXqE:RODNFD+DvEEĄk4DE;En ŹϟEݢE,`BlE HEj'TqEEqwVdE*pE+ŦpEE aTrMEoE q(ŒcGEME%B%ĔOEE EaEG3D]ċEбEb^DEƨD;ŁEDE!Ł~DEkD}rEPEFDE&E"őEKE& !kERKPEo),0E=EWd yEByE.**gEEE~DȄE̐E&Ŧ(?E^5E/vCEУE)ŘE6rEUDZĐEE?DFºD% ʼnE!EnȇDaEcEDWEZEr C] E/Es6$ŤۗEECХBExmYE6)n?EBE;t&EE*L_EvER7>EޔE`%Śr6EPE ^CīEihE}5ŔX EEtDBhęPEE :nD(EDzKE"Ex ĖplDEE.oEnE &ZCoE{(8EHG&,E8E$xZ{ElaEX*bEpOE!1C"EE){VES^E_EE@$08-E EECYĂE}data( 1&:  u<audio-0.7.2/test/torchaudio_unittest/assets/kaldi_file_8000.wav000066400000000000000000000372541376444676100245100ustar00rootroot00000000000000RIFF>WAVEfmt >}data> 1&:  u<_ULwo! .vb c Zp"r@0# 5 7Y)W-TT@ ]O<({sMpY>0  wO[Ze8y  -x!9jprh @u S _F\{@  A/npb&E oW CzfHpp Y\4r ( KdsocZE $g9X,Xg S _LB'yFNL,xv2 [A$ARuU2JVe  '`3 ZN  .#U$.  NZ 3_' d VJ2VvRA$B[1 vx,KNFy(BM_T  hW,X9g$ D[cosdK ' r4\Yp qHfzB WnD %bqn.A ? {\E` Tu @ hspj9 w. y7e[ZOw  0=YoMs{);O^ ATT.W(Y75 # 0@~s"qZ aa x. !owLU_=u  9'11&:  t=`VKwo! .va c Yp# s}B~/$ 5 7Y) W. VSA _O<({sNoY=1  yQ[Ze8x  -w 7kprh @u T `EZz@  @/npb%D pU CzfHqr Z\4r ' JcqpeZE $g8W*Yh S _LB&zFMK-yu4 \A$ARuU2IWd  (_1 YO  -%S$.  O[ 2_& d VJ1UwQA#CY3 vx +KNEz'CL_U  fZ-X9h# C\dosdK ' r~4[Yp pIgy@ VnD %bqm/@ ? y\E` Tv A itqh9 w. x6cZ\Ow  0>YnMs{*:P` CRV 0Z )X85 # 1@s"qZ aa x, #nyJWb>s  7%21&:  t=_VKxl# ,x_ a Wr% t@/$ 4 7Y) W-VSA ^Q;*}qPn[;3  vO[Ze8y  -x 7iqsj Bv U bC\|@  @/opb&D pV BxhJtt X]4r ' Jcqpe\|C #i6U,Vh R `LA&zGLL.yu4 ZC"CQwS1GYc  &a4 YO  -$S&,  Q] 4_& d VJ1UwQA$CY2 tz -IMC{%EJaW  hX-X:h# C\dprcJ & p|6YYo pIgy@ VpB #`sk0? A {]E_ Tv @ htqi8u0 v4g^\Nw  />YnMs{*:P` CRU 0Y  %[59  1@s!q[ ab x, #nzJWb>t  8). -&:  t=_VLxl" -w_ a Wq% t|D{2! 4 7Y* W-VTA ^R;)}qPn[;3  zSW^e8y ,x!7iqsj Bv U bDXx;  @0oob&E pV BxhItt \]4q ' Jcqpe[|C #i5U(Zd R `LA&yGLL.xv4 [B"CQvT1GYc  *^0 XN  .$S&,  Q] 0[* d UJ1UwP@$CY2 tz ,IMC{&EJaW  e\)U:h# D\cprcJ & t2^Yo oIgz@ VoB #`sk0? > vYAc X{ D lxte4y+ z8bY]Nv  />YnLsz*:O` CRU 0Y  $[59  5}C{w }%uW^^ |( 'k~E[f:x  <$30&:  t=^VLwl" -w_ b Wq% s|C{2! 7 3]&  [0  ZPD bV8-  nTkW?/  vO[Ze9y ,y!7iqrj Bu T bDXy;  <4ls^#A tR ~?ulMpp W]4q ' Jcqpe[|D #h5U(Yd U dHD"}DHH2!|r8 WFHNzP.KUh  &b4  XN  .#T&,  Q] 0[) ` YG-Q{LD!GU5 p~$0EJ?"BO\T  iX.Y;h# D\cprcK ' q|5Z ]r sMkv< Ss> ]wg3D B z^D_Uw @ htpi9u/ v4f]YQz ~ 3;]jPo! ~.6Sd GNX4](W96 " 1?s q\ bc x, #ozIWb>t  8(/ ,*6  pAbZI{h& ){[ ^Su)} wx?-& 3 7Y+ W,VT@ ]R<(~rPo[;3  zSW]i5v  0u3euvn Fy XfA[}?  @0pnb'F pV CyhHtt [Y9~m # F"_mti_x@ l|1R,Uh Q `L@&yHLM.xv4 [B!DRuT2GYd  *_0 [R  *'P*( ! Ub 5_% d UK1VwP?%CY1 tz  +INC{'FK`X  e\*U7k @}`fto_!G # mx9V$Zn nI fz@ WoA "ask/@ ? vZ@c Y{ C kxte5q3 r0iaVMv  .?XnLty+:N` CRT 0Y  $[6:  5}C{w |$uX^_ |( &l~EZfAq  5,, (&:  t=]VMwl! .v^ b Wp% r|C{1" 6 3]' [/  ZQC aV8, nTl_77  ~WRam:z +y"7iqqj Bt S bEWz;  <4mr^$B tR ~@ulLxy ^!U5q ' JdqoeZ|D $h5V(Xd T dIC"}DHI2 {s8 XEHOyP/D]a  .[,_M  /"T&-  Q^ 1[) _ XG-R{LC"GU4 p~$/EK?#JGc\  b`'Q<g# D\bpsdK ' r|4Z ^q rNjv< Sr= ]xg2= ; rW<_Uw ? gupj:u/ v4e]ZQy ~ 2<\jOp! }/6Rd GNW4]  ^2>  9zG x{ q] bd x, "pzIVb=u  9(0 ,*6  pAaYJzh% *zZ _St*~ vx Gw4  : /a$ ^+VU? ]R='~rPp[;3  zSV]i6v  /v2euun Fx WeBSv7  78imc(G pV DyhGtu ZY9m # F"`msiVxA !c|1R$T` P `E?yADF.wo4 TA DKtL+@Z]  *X( [Q  3&X*1  Ub 5^, c \L1VPF&KY7 t!(2IOC(NKg `  !fd+U8$s @~X]kp`H $ nx0VZm mJ fs8} Pn9 Ytc.9 8 nS8bY{ {C kysn>"y3 z8ha_T}  6@`nSt% 3:Uh KR[8`$b6B  =~J | |+}Y^` t) mvER^9r  5#-(&2  l=\UFvd! &vV [ No&z qt Cs0 5 +\  Z/ [IC `VA+ vTu_?7  ~WZam:{ 3z# 6jyxr J{ Z iFWz;  ;<my_%C lR ~AucCpq UV5|i  B\hoeYt= gw-N W\ S dAB}=@B2 {|9 `E%HWxX8L^j  .d4 ^U ! /)T.- $ Yf2Z0 _ _H-RLJ#OU+ pv&EL>v$BH[T  bY'Q5g  xtxqV Z] x% "izAVb/ !rXqc;;  \Ver7w 6v 2f}{f >o N]CSw7  70jm[!@ pN z=qgFu u YR9xe{  >#Xdsj]I )k 9Z,[h! W hMF&JLN7#~x= ]H!LT|U4Hbf  2a0bX $ +-Q2)  MZ.V$ [ SD(NwH= CQ. ly )AH:z FD^ X  ^]$N1{k 8w`dsiXP , w7_$bt tRn{? XuA "b|k5B A v\@j a J r{f7 q+ r0_XWK}u  y -9WeJlx+2L` CJQ 1 X Z/:  6wBtx t"vRVY |! &f~=Zg@z  >+6 0.:  tDc]O}k(/}^ cVv. x}K{7$ < 2d)b6 cRJ h_:2 %n\ng7/  vPRYf3s *s.bqoj B{r Qa?Os2  34fpW< tJ v:mkJyy ]^=q ' J'dpwna{F &n 5V(^d% Z  lII"FHK;'tA YLPPQ1DVc  &], UL  ( M&%  Q^*R' W W@$J|DAGM2 h}$-=E6~J@b\  ka0Z> o# Ddhwue#M ) s{:[(fw xVqw;$ Uy= #^g8? >  rY<^ Ux = euob4m/ n,c\TOxx u 15[aMi" {/.Pd GFU 5\ ]<> ! :F| %z_bf - *rI]kDw  :/2 ,16  pHgaLg,+Z `Rz2 |y?w* ! 0 .X& V)WN> [S6&~kPjZ23~  zTN\j0p  .o*^trn Fwv Ue;K>  ?9stc*I xVaudio-0.7.2/test/torchaudio_unittest/assets/kaldi_test_fbank_args.json000066400000000000000000001236111376444676100264230ustar00rootroot00000000000000{"blackman_coeff": 0.0939, "energy_floor": 4.5062, "frame_length": 1.0625, "frame_shift": 0.6875, "high_freq": 1841, "htk_compat": true, "low_freq": 479, "num_mel_bins": 5, "preemphasis_coefficient": 0.84, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 1832, "vtln_low": 1824, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.166, "energy_floor": 1.7875, "frame_length": 1.125, "frame_shift": 0.5, "high_freq": 4999, "htk_compat": true, "low_freq": 1740, "num_mel_bins": 6, "preemphasis_coefficient": 0.29, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 4587, "vtln_low": 2289, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.2215, "energy_floor": 1.3444, "frame_length": 1.125, "frame_shift": 0.75, "high_freq": 7468, "htk_compat": true, "low_freq": 87, "num_mel_bins": 5, "preemphasis_coefficient": 0.17, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 1700, "vtln_low": 870, "vtln_warp": 0.3104, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.2512, "energy_floor": 0.2607, "frame_length": 0.875, "frame_shift": 0.875, "high_freq": 7380, "htk_compat": true, "low_freq": 4471, "num_mel_bins": 5, "preemphasis_coefficient": 0.76, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 7138, "vtln_low": 5172, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.2834, "energy_floor": 1.7885, "frame_length": 1.1875, "frame_shift": 0.9375, "high_freq": 5385, "htk_compat": false, "low_freq": 2579, "num_mel_bins": 6, "preemphasis_coefficient": 0.82, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 4782, "vtln_low": 4492, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.3188, "energy_floor": 1.6288, "frame_length": 1.0, "frame_shift": 0.5, "high_freq": 6258, "htk_compat": true, "low_freq": 2043, "num_mel_bins": 4, "preemphasis_coefficient": 0.57, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 5274, "vtln_low": 3268, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.3637, "energy_floor": 4.7928, "frame_length": 1.0, "frame_shift": 0.5625, "high_freq": 7671, "htk_compat": false, "low_freq": 2385, "num_mel_bins": 5, "preemphasis_coefficient": 0.81, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 6881, "vtln_low": 4659, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.4702, "energy_floor": 2.668, "frame_length": 1.0, "frame_shift": 1.0, "high_freq": 7231, "htk_compat": true, "low_freq": 1515, "num_mel_bins": 4, "preemphasis_coefficient": 0.92, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 6506, "vtln_low": 2549, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.5988, "energy_floor": 0.8014, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 3663, "htk_compat": true, "low_freq": 1941, "num_mel_bins": 6, "preemphasis_coefficient": 0.59, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 3373, "vtln_low": 3354, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.6421, "energy_floor": 2.1404, "frame_length": 0.75, "frame_shift": 1.0625, "high_freq": 6031, "htk_compat": false, "low_freq": 57, "num_mel_bins": 4, "preemphasis_coefficient": 0.03, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 5417, "vtln_low": 1170, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.674, "energy_floor": 1.3778, "frame_length": 1.0, "frame_shift": 0.875, "high_freq": 6623, "htk_compat": true, "low_freq": 2402, "num_mel_bins": 7, "preemphasis_coefficient": 0.5, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 6491, "vtln_low": 6262, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.7979, "energy_floor": 1.4223, "frame_length": 1.125, "frame_shift": 0.3125, "high_freq": 2534, "htk_compat": false, "low_freq": 810, "num_mel_bins": 4, "preemphasis_coefficient": 0.77, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 2494, "vtln_low": 2015, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.8161, "energy_floor": 1.2937, "frame_length": 0.9375, "frame_shift": 0.125, "high_freq": 5030, "htk_compat": false, "low_freq": 966, "num_mel_bins": 6, "preemphasis_coefficient": 0.03, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 4652, "vtln_low": 2559, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.8873, "energy_floor": 1.2866, "frame_length": 1.125, "frame_shift": 0.4375, "high_freq": 5558, "htk_compat": true, "low_freq": 1464, "num_mel_bins": 8, "preemphasis_coefficient": 0.77, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 4613, "vtln_low": 4001, "vtln_warp": 1.4073, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.8997, "energy_floor": 2.8795, "frame_length": 0.875, "frame_shift": 0.5, "high_freq": 3383, "htk_compat": false, "low_freq": 259, "num_mel_bins": 4, "preemphasis_coefficient": 0.08, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 1175, "vtln_low": 1038, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.9113, "energy_floor": 0.9909, "frame_length": 0.6875, "frame_shift": 0.375, "high_freq": 7562, "htk_compat": true, "low_freq": 3978, "num_mel_bins": 4, "preemphasis_coefficient": 0.03, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 6483, "vtln_low": 5671, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.9312, "energy_floor": 3.3768, "frame_length": 0.8125, "frame_shift": 1.125, "high_freq": 5824, "htk_compat": false, "low_freq": 1366, "num_mel_bins": 6, "preemphasis_coefficient": 0.28, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 3917, "vtln_low": 1620, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.9472, "energy_floor": 2.4134, "frame_length": 0.75, "frame_shift": 1.0, "high_freq": 7959, "htk_compat": false, "low_freq": 1770, "num_mel_bins": 6, "preemphasis_coefficient": 0.12, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 6874, "vtln_low": 5861, "vtln_warp": 1.1718, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.9483, "energy_floor": 4.0177, "frame_length": 1.125, "frame_shift": 1.125, "high_freq": 7854, "htk_compat": false, "low_freq": 4793, "num_mel_bins": 5, "preemphasis_coefficient": 0.47, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 5868, "vtln_low": 5848, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.9631, "energy_floor": 3.3222, "frame_length": 1.0, "frame_shift": 0.5, "high_freq": 7662, "htk_compat": true, "low_freq": 1833, "num_mel_bins": 6, "preemphasis_coefficient": 0.71, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 6204, "vtln_low": 5887, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.982, "energy_floor": 1.668, "frame_length": 0.75, "frame_shift": 0.1875, "high_freq": 6788, "htk_compat": false, "low_freq": 1968, "num_mel_bins": 4, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 2114, "vtln_low": 2024, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.0183, "energy_floor": 2.1572, "frame_length": 1.0625, "frame_shift": 0.375, "high_freq": 2018, "htk_compat": true, "low_freq": 317, "num_mel_bins": 6, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 1118, "vtln_low": 947, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.0269, "energy_floor": 0.3681, "frame_length": 1.125, "frame_shift": 0.5625, "high_freq": 4897, "htk_compat": true, "low_freq": 543, "num_mel_bins": 4, "preemphasis_coefficient": 0.57, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 1226, "vtln_low": 960, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.0298, "energy_floor": 2.249, "frame_length": 1.125, "frame_shift": 0.25, "high_freq": 2031, "htk_compat": true, "low_freq": 257, "num_mel_bins": 5, "preemphasis_coefficient": 0.65, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 1731, "vtln_low": 1582, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.2222, "energy_floor": 0.0582, "frame_length": 1.1875, "frame_shift": 0.8125, "high_freq": 6633, "htk_compat": false, "low_freq": 1117, "num_mel_bins": 8, "preemphasis_coefficient": 0.96, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 4191, "vtln_low": 3264, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.2251, "energy_floor": 0.4403, "frame_length": 0.5625, "frame_shift": 0.6875, "high_freq": 3192, "htk_compat": false, "low_freq": 599, "num_mel_bins": 4, "preemphasis_coefficient": 0.75, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 3183, "vtln_low": 2975, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.2278, "energy_floor": 1.4848, "frame_length": 0.6875, "frame_shift": 0.625, "high_freq": 5785, "htk_compat": true, "low_freq": 289, "num_mel_bins": 4, "preemphasis_coefficient": 0.58, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 4062, "vtln_low": 3715, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.3199, "energy_floor": 1.1137, "frame_length": 1.125, "frame_shift": 0.6875, "high_freq": 6702, "htk_compat": true, "low_freq": 390, "num_mel_bins": 6, "preemphasis_coefficient": 0.54, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 4426, "vtln_low": 2811, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.3325, "energy_floor": 2.6552, "frame_length": 1.0, "frame_shift": 1.0625, "high_freq": 6444, "htk_compat": true, "low_freq": 759, "num_mel_bins": 4, "preemphasis_coefficient": 0.67, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 6065, "vtln_low": 4599, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.3426, "energy_floor": 1.5712, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 7444, "htk_compat": false, "low_freq": 1986, "num_mel_bins": 6, "preemphasis_coefficient": 0.46, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 4787, "vtln_low": 3163, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.4359, "energy_floor": 1.2709, "frame_length": 1.0, "frame_shift": 0.5625, "high_freq": 7657, "htk_compat": true, "low_freq": 1017, "num_mel_bins": 5, "preemphasis_coefficient": 0.93, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 4228, "vtln_low": 2903, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.4621, "energy_floor": 1.2891, "frame_length": 0.875, "frame_shift": 1.0625, "high_freq": 6324, "htk_compat": true, "low_freq": 408, "num_mel_bins": 7, "preemphasis_coefficient": 0.09, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 6163, "vtln_low": 5973, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.4751, "energy_floor": 2.3567, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 7115, "htk_compat": false, "low_freq": 4236, "num_mel_bins": 5, "preemphasis_coefficient": 0.65, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 6523, "vtln_low": 5708, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.4883, "energy_floor": 4.1237, "frame_length": 0.75, "frame_shift": 0.25, "high_freq": 5670, "htk_compat": true, "low_freq": 766, "num_mel_bins": 6, "preemphasis_coefficient": 0.29, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 5479, "vtln_low": 4173, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.493, "energy_floor": 1.4719, "frame_length": 1.125, "frame_shift": 0.25, "high_freq": 7805, "htk_compat": true, "low_freq": 5052, "num_mel_bins": 4, "preemphasis_coefficient": 0.9, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 7300, "vtln_low": 5299, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.5718, "energy_floor": 3.5447, "frame_length": 0.625, "frame_shift": 0.1875, "high_freq": 6777, "htk_compat": true, "low_freq": 938, "num_mel_bins": 4, "preemphasis_coefficient": 0.69, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 4540, "vtln_low": 3168, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.5786, "energy_floor": 1.9016, "frame_length": 1.1875, "frame_shift": 0.75, "high_freq": 5812, "htk_compat": true, "low_freq": 3000, "num_mel_bins": 4, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 4930, "vtln_low": 4316, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.6134, "energy_floor": 0.6389, "frame_length": 1.0625, "frame_shift": 0.8125, "high_freq": 7384, "htk_compat": false, "low_freq": 184, "num_mel_bins": 7, "preemphasis_coefficient": 0.08, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 2759, "vtln_low": 306, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.6312, "energy_floor": 2.6556, "frame_length": 0.625, "frame_shift": 0.4375, "high_freq": 5589, "htk_compat": false, "low_freq": 1049, "num_mel_bins": 5, "preemphasis_coefficient": 0.8, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 3816, "vtln_low": 1550, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.7515, "energy_floor": 0.5964, "frame_length": 1.0625, "frame_shift": 1.0, "high_freq": 4349, "htk_compat": true, "low_freq": 702, "num_mel_bins": 5, "preemphasis_coefficient": 0.36, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 4168, "vtln_low": 1531, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.8179, "energy_floor": 1.3295, "frame_length": 0.5625, "frame_shift": 0.6875, "high_freq": 4510, "htk_compat": false, "low_freq": 122, "num_mel_bins": 4, "preemphasis_coefficient": 0.56, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 4365, "vtln_low": 3721, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.9387, "energy_floor": 4.7991, "frame_length": 1.0, "frame_shift": 0.375, "high_freq": 6123, "htk_compat": true, "low_freq": 740, "num_mel_bins": 6, "preemphasis_coefficient": 0.21, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 3970, "vtln_low": 3355, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.0479, "energy_floor": 1.4296, "frame_length": 1.0625, "frame_shift": 0.6875, "high_freq": 7818, "htk_compat": true, "low_freq": 1628, "num_mel_bins": 8, "preemphasis_coefficient": 0.27, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 7749, "vtln_low": 7478, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 2.0809, "energy_floor": 1.9752, "frame_length": 0.75, "frame_shift": 1.1875, "high_freq": 5933, "htk_compat": false, "low_freq": 666, "num_mel_bins": 5, "preemphasis_coefficient": 0.72, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 5348, "vtln_low": 4645, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.1098, "energy_floor": 2.1356, "frame_length": 1.0625, "frame_shift": 0.9375, "high_freq": 7825, "htk_compat": true, "low_freq": 408, "num_mel_bins": 4, "preemphasis_coefficient": 0.37, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 5297, "vtln_low": 2747, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.1463, "energy_floor": 0.3422, "frame_length": 0.8125, "frame_shift": 0.5, "high_freq": 6892, "htk_compat": true, "low_freq": 65, "num_mel_bins": 4, "preemphasis_coefficient": 0.47, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 4178, "vtln_low": 2891, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.1768, "energy_floor": 3.782, "frame_length": 0.75, "frame_shift": 0.8125, "high_freq": 7063, "htk_compat": false, "low_freq": 2703, "num_mel_bins": 4, "preemphasis_coefficient": 0.99, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 6819, "vtln_low": 3764, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.1902, "energy_floor": 4.9973, "frame_length": 1.125, "frame_shift": 0.5, "high_freq": 7066, "htk_compat": false, "low_freq": 1699, "num_mel_bins": 4, "preemphasis_coefficient": 0.95, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 5452, "vtln_low": 5271, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.239, "energy_floor": 2.9557, "frame_length": 1.0625, "frame_shift": 0.875, "high_freq": 7615, "htk_compat": true, "low_freq": 4707, "num_mel_bins": 7, "preemphasis_coefficient": 1.0, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 6790, "vtln_low": 6501, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.3199, "energy_floor": 0.8311, "frame_length": 0.9375, "frame_shift": 0.3125, "high_freq": 6738, "htk_compat": true, "low_freq": 1787, "num_mel_bins": 5, "preemphasis_coefficient": 0.83, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 6635, "vtln_low": 6360, "vtln_warp": 0.7856, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.4071, "energy_floor": 2.7889, "frame_length": 0.9375, "frame_shift": 0.8125, "high_freq": 6598, "htk_compat": true, "low_freq": 2373, "num_mel_bins": 5, "preemphasis_coefficient": 0.2, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 4565, "vtln_low": 3464, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.4586, "energy_floor": 3.3176, "frame_length": 0.625, "frame_shift": 0.75, "high_freq": 7380, "htk_compat": false, "low_freq": 4248, "num_mel_bins": 4, "preemphasis_coefficient": 0.59, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 7263, "vtln_low": 6361, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.6039, "energy_floor": 1.1619, "frame_length": 0.75, "frame_shift": 0.5625, "high_freq": 6578, "htk_compat": true, "low_freq": 551, "num_mel_bins": 7, "preemphasis_coefficient": 0.16, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 4974, "vtln_low": 3139, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.6068, "energy_floor": 3.6411, "frame_length": 1.125, "frame_shift": 1.125, "high_freq": 3078, "htk_compat": false, "low_freq": 1003, "num_mel_bins": 5, "preemphasis_coefficient": 0.12, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 2920, "vtln_low": 1121, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.6192, "energy_floor": 1.7209, "frame_length": 1.0625, "frame_shift": 0.625, "high_freq": 2275, "htk_compat": false, "low_freq": 367, "num_mel_bins": 5, "preemphasis_coefficient": 0.27, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 1293, "vtln_low": 771, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 2.6578, "energy_floor": 0.9137, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 4898, "htk_compat": true, "low_freq": 886, "num_mel_bins": 7, "preemphasis_coefficient": 0.57, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 3704, "vtln_low": 1013, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.7083, "energy_floor": 2.8806, "frame_length": 0.75, "frame_shift": 0.9375, "high_freq": 6605, "htk_compat": false, "low_freq": 3759, "num_mel_bins": 4, "preemphasis_coefficient": 0.9, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 6542, "vtln_low": 5821, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.7704, "energy_floor": 4.5251, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 3819, "htk_compat": true, "low_freq": 787, "num_mel_bins": 5, "preemphasis_coefficient": 0.23, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 3368, "vtln_low": 3286, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.9255, "energy_floor": 3.4363, "frame_length": 1.125, "frame_shift": 1.0, "high_freq": 7660, "htk_compat": false, "low_freq": 5020, "num_mel_bins": 5, "preemphasis_coefficient": 0.09, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 7470, "vtln_low": 6783, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.0009, "energy_floor": 1.845, "frame_length": 1.0625, "frame_shift": 0.75, "high_freq": 5812, "htk_compat": true, "low_freq": 1287, "num_mel_bins": 6, "preemphasis_coefficient": 0.22, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 5573, "vtln_low": 4642, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.2195, "energy_floor": 2.9858, "frame_length": 1.0625, "frame_shift": 0.0625, "high_freq": 6899, "htk_compat": true, "low_freq": 4117, "num_mel_bins": 6, "preemphasis_coefficient": 0.85, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": true, "vtln_high": 5077, "vtln_low": 4977, "vtln_warp": 0.8739, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.3208, "energy_floor": 1.5569, "frame_length": 1.0, "frame_shift": 0.3125, "high_freq": 4556, "htk_compat": false, "low_freq": 334, "num_mel_bins": 5, "preemphasis_coefficient": 0.02, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 2831, "vtln_low": 696, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.3976, "energy_floor": 3.9462, "frame_length": 1.1875, "frame_shift": 0.5625, "high_freq": 6513, "htk_compat": false, "low_freq": 3398, "num_mel_bins": 8, "preemphasis_coefficient": 0.38, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 5827, "vtln_low": 5388, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.5842, "energy_floor": 1.2264, "frame_length": 0.9375, "frame_shift": 1.0, "high_freq": 7744, "htk_compat": false, "low_freq": 195, "num_mel_bins": 5, "preemphasis_coefficient": 0.62, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 7667, "vtln_low": 2993, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.5889, "energy_floor": 3.3559, "frame_length": 1.0, "frame_shift": 1.1875, "high_freq": 7354, "htk_compat": true, "low_freq": 997, "num_mel_bins": 5, "preemphasis_coefficient": 0.98, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 7088, "vtln_low": 6494, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 3.5936, "energy_floor": 2.1701, "frame_length": 1.0625, "frame_shift": 1.0625, "high_freq": 7407, "htk_compat": true, "low_freq": 3649, "num_mel_bins": 5, "preemphasis_coefficient": 0.65, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 6878, "vtln_low": 6036, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 3.7002, "energy_floor": 3.567, "frame_length": 1.1875, "frame_shift": 0.625, "high_freq": 4479, "htk_compat": true, "low_freq": 2240, "num_mel_bins": 6, "preemphasis_coefficient": 0.73, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 4084, "vtln_low": 3955, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.7078, "energy_floor": 0.3892, "frame_length": 0.8125, "frame_shift": 0.3125, "high_freq": 7876, "htk_compat": true, "low_freq": 2830, "num_mel_bins": 7, "preemphasis_coefficient": 0.46, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 4726, "vtln_low": 2918, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.7585, "energy_floor": 2.9425, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 3277, "htk_compat": true, "low_freq": 2244, "num_mel_bins": 4, "preemphasis_coefficient": 0.76, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 3158, "vtln_low": 2865, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.7772, "energy_floor": 2.8211, "frame_length": 1.0, "frame_shift": 0.1875, "high_freq": 3747, "htk_compat": false, "low_freq": 1244, "num_mel_bins": 4, "preemphasis_coefficient": 0.64, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": true, "vtln_high": 3640, "vtln_low": 2770, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.8514, "energy_floor": 3.7933, "frame_length": 1.0625, "frame_shift": 0.5, "high_freq": 4136, "htk_compat": true, "low_freq": 1010, "num_mel_bins": 6, "preemphasis_coefficient": 0.12, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 2408, "vtln_low": 1892, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.8677, "energy_floor": 2.5418, "frame_length": 1.0625, "frame_shift": 0.0625, "high_freq": 3496, "htk_compat": true, "low_freq": 309, "num_mel_bins": 4, "preemphasis_coefficient": 0.47, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 1490, "vtln_low": 645, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.9033, "energy_floor": 2.677, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 5699, "htk_compat": false, "low_freq": 2960, "num_mel_bins": 7, "preemphasis_coefficient": 0.52, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 5458, "vtln_low": 5400, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.0371, "energy_floor": 3.7559, "frame_length": 1.0625, "frame_shift": 0.8125, "high_freq": 4280, "htk_compat": false, "low_freq": 1207, "num_mel_bins": 4, "preemphasis_coefficient": 0.12, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 3686, "vtln_low": 2010, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.0757, "energy_floor": 4.7442, "frame_length": 0.875, "frame_shift": 1.125, "high_freq": 6363, "htk_compat": true, "low_freq": 1524, "num_mel_bins": 4, "preemphasis_coefficient": 0.32, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 5178, "vtln_low": 4628, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.1248, "energy_floor": 2.5255, "frame_length": 0.6875, "frame_shift": 0.6875, "high_freq": 3527, "htk_compat": true, "low_freq": 1701, "num_mel_bins": 4, "preemphasis_coefficient": 0.43, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 2884, "vtln_low": 1773, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.18, "energy_floor": 4.6907, "frame_length": 1.1875, "frame_shift": 0.5625, "high_freq": 7316, "htk_compat": true, "low_freq": 3483, "num_mel_bins": 8, "preemphasis_coefficient": 0.61, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": true, "use_power": true, "vtln_high": 5820, "vtln_low": 4635, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.2251, "energy_floor": 0.5, "frame_length": 0.875, "frame_shift": 0.625, "high_freq": 7515, "htk_compat": false, "low_freq": 1751, "num_mel_bins": 5, "preemphasis_coefficient": 0.64, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 7486, "vtln_low": 4238, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.3011, "energy_floor": 1.4663, "frame_length": 1.125, "frame_shift": 0.9375, "high_freq": 7804, "htk_compat": false, "low_freq": 1208, "num_mel_bins": 6, "preemphasis_coefficient": 0.18, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 7421, "vtln_low": 3707, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 4.3252, "energy_floor": 0.7732, "frame_length": 0.625, "frame_shift": 0.6875, "high_freq": 7389, "htk_compat": false, "low_freq": 2071, "num_mel_bins": 4, "preemphasis_coefficient": 0.08, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 6900, "vtln_low": 2344, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.3693, "energy_floor": 3.9073, "frame_length": 0.875, "frame_shift": 0.9375, "high_freq": 6107, "htk_compat": true, "low_freq": 3905, "num_mel_bins": 4, "preemphasis_coefficient": 0.86, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": true, "vtln_high": 5001, "vtln_low": 4046, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.3926, "energy_floor": 2.0617, "frame_length": 0.5625, "frame_shift": 0.0625, "high_freq": 4253, "htk_compat": true, "low_freq": 1367, "num_mel_bins": 5, "preemphasis_coefficient": 0.84, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 2112, "vtln_low": 1445, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.4706, "energy_floor": 1.7516, "frame_length": 1.125, "frame_shift": 1.125, "high_freq": 7645, "htk_compat": false, "low_freq": 225, "num_mel_bins": 6, "preemphasis_coefficient": 0.8, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 3717, "vtln_low": 304, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.5385, "energy_floor": 2.1519, "frame_length": 1.125, "frame_shift": 0.0625, "high_freq": 5610, "htk_compat": false, "low_freq": 1239, "num_mel_bins": 7, "preemphasis_coefficient": 0.87, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": true, "use_log_fbank": true, "use_power": false, "vtln_high": 2231, "vtln_low": 1432, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.6337, "energy_floor": 2.902, "frame_length": 0.875, "frame_shift": 1.125, "high_freq": 5072, "htk_compat": true, "low_freq": 826, "num_mel_bins": 4, "preemphasis_coefficient": 0.37, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 4253, "vtln_low": 2427, "vtln_warp": 0.7049, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 4.7468, "energy_floor": 2.1835, "frame_length": 0.6875, "frame_shift": 1.0, "high_freq": 5153, "htk_compat": true, "low_freq": 943, "num_mel_bins": 5, "preemphasis_coefficient": 0.94, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "use_log_fbank": false, "use_power": false, "vtln_high": 3287, "vtln_low": 1478, "vtln_warp": 0.9406, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 4.7855, "energy_floor": 2.1377, "frame_length": 0.9375, "frame_shift": 0.8125, "high_freq": 4123, "htk_compat": false, "low_freq": 587, "num_mel_bins": 4, "preemphasis_coefficient": 0.92, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "use_log_fbank": true, "use_power": false, "vtln_high": 2588, "vtln_low": 2346, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.964, "energy_floor": 3.4931, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 4235, "htk_compat": true, "low_freq": 1036, "num_mel_bins": 4, "preemphasis_coefficient": 0.43, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "use_log_fbank": false, "use_power": false, "vtln_high": 3706, "vtln_low": 2840, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} audio-0.7.2/test/torchaudio_unittest/assets/kaldi_test_mfcc_args.json000066400000000000000000001543761376444676100262660ustar00rootroot00000000000000{"blackman_coeff": 0.013, "energy_floor": 1.8509, "frame_length": 1.1875, "frame_shift": 0.625, "high_freq": 7999, "htk_compat": false, "low_freq": 4330, "num_mel_bins": 5, "preemphasis_coefficient": 0.38, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 8.1048, "vtln_high": 7497, "vtln_low": 7397, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.0487, "energy_floor": 1.3641, "frame_length": 1.0, "frame_shift": 0.8125, "high_freq": 7892, "htk_compat": true, "low_freq": 1904, "num_mel_bins": 8, "preemphasis_coefficient": 0.26, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 34.0918, "vtln_high": 4400, "vtln_low": 2737, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.0577, "energy_floor": 2.4313, "frame_length": 1.0625, "frame_shift": 0.875, "high_freq": 2922, "htk_compat": true, "low_freq": 274, "num_mel_bins": 6, "preemphasis_coefficient": 0.48, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 5, "cepstral_lifter": 21.3007, "vtln_high": 1352, "vtln_low": 280, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.0718, "energy_floor": 1.3071, "frame_length": 1.1875, "frame_shift": 0.5, "high_freq": 3159, "htk_compat": true, "low_freq": 759, "num_mel_bins": 8, "preemphasis_coefficient": 0.04, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 6, "cepstral_lifter": 2.6493, "vtln_high": 3145, "vtln_low": 3119, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.083, "energy_floor": 2.1607, "frame_length": 0.75, "frame_shift": 0.75, "high_freq": 5872, "htk_compat": true, "low_freq": 708, "num_mel_bins": 5, "preemphasis_coefficient": 0.95, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 24.5097, "vtln_high": 5231, "vtln_low": 3888, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.0933, "energy_floor": 1.577, "frame_length": 1.1875, "frame_shift": 1.1875, "high_freq": 7519, "htk_compat": false, "low_freq": 357, "num_mel_bins": 4, "preemphasis_coefficient": 0.5, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 88.0941, "vtln_high": 7042, "vtln_low": 5298, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.1048, "energy_floor": 0.5013, "frame_length": 0.75, "frame_shift": 1.0625, "high_freq": 6426, "htk_compat": true, "low_freq": 3613, "num_mel_bins": 5, "preemphasis_coefficient": 0.96, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 73.5838, "vtln_high": 5816, "vtln_low": 3997, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.1447, "energy_floor": 4.7142, "frame_length": 1.0625, "frame_shift": 0.4375, "high_freq": 7629, "htk_compat": true, "low_freq": 3498, "num_mel_bins": 7, "preemphasis_coefficient": 0.39, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 19.4145, "vtln_high": 7169, "vtln_low": 6751, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.1473, "energy_floor": 4.9154, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 3631, "htk_compat": false, "low_freq": 1229, "num_mel_bins": 8, "preemphasis_coefficient": 0.04, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 34.479, "vtln_high": 3390, "vtln_low": 1536, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.1485, "energy_floor": 4.275, "frame_length": 0.6875, "frame_shift": 0.75, "high_freq": 5222, "htk_compat": true, "low_freq": 311, "num_mel_bins": 5, "preemphasis_coefficient": 0.31, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 48.7991, "vtln_high": 4833, "vtln_low": 513, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.1829, "energy_floor": 4.5358, "frame_length": 0.9375, "frame_shift": 0.9375, "high_freq": 6148, "htk_compat": true, "low_freq": 455, "num_mel_bins": 5, "preemphasis_coefficient": 0.59, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 48.6724, "vtln_high": 3138, "vtln_low": 2247, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.2002, "energy_floor": 1.4805, "frame_length": 0.9375, "frame_shift": 0.875, "high_freq": 7621, "htk_compat": false, "low_freq": 2232, "num_mel_bins": 5, "preemphasis_coefficient": 0.03, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 5, "cepstral_lifter": 69.3653, "vtln_high": 7087, "vtln_low": 2800, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.2107, "energy_floor": 3.475, "frame_length": 1.125, "frame_shift": 0.8125, "high_freq": 5701, "htk_compat": true, "low_freq": 1629, "num_mel_bins": 4, "preemphasis_coefficient": 0.09, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 77.7066, "vtln_high": 5622, "vtln_low": 5544, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.2523, "energy_floor": 0.148, "frame_length": 1.0, "frame_shift": 1.125, "high_freq": 5833, "htk_compat": false, "low_freq": 556, "num_mel_bins": 4, "preemphasis_coefficient": 0.66, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 57.0398, "vtln_high": 4519, "vtln_low": 3600, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.2959, "energy_floor": 2.3729, "frame_length": 0.625, "frame_shift": 0.5, "high_freq": 6757, "htk_compat": false, "low_freq": 1744, "num_mel_bins": 6, "preemphasis_coefficient": 0.2, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 99.871, "vtln_high": 4957, "vtln_low": 3549, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.3642, "energy_floor": 3.5246, "frame_length": 0.4375, "frame_shift": 0.9375, "high_freq": 7942, "htk_compat": false, "low_freq": 3282, "num_mel_bins": 4, "preemphasis_coefficient": 0.52, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 74.4735, "vtln_high": 5601, "vtln_low": 4966, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.4891, "energy_floor": 1.989, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 3219, "htk_compat": true, "low_freq": 973, "num_mel_bins": 5, "preemphasis_coefficient": 0.91, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 85.357, "vtln_high": 3181, "vtln_low": 3129, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.5428, "energy_floor": 1.2368, "frame_length": 0.5625, "frame_shift": 1.0, "high_freq": 6700, "htk_compat": false, "low_freq": 749, "num_mel_bins": 4, "preemphasis_coefficient": 0.86, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 16.2782, "vtln_high": 5573, "vtln_low": 4988, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.5495, "energy_floor": 2.9502, "frame_length": 1.1875, "frame_shift": 1.1875, "high_freq": 3873, "htk_compat": true, "low_freq": 1564, "num_mel_bins": 5, "preemphasis_coefficient": 0.05, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 59.0075, "vtln_high": 3870, "vtln_low": 3750, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.6457, "energy_floor": 2.0199, "frame_length": 0.875, "frame_shift": 0.8125, "high_freq": 6510, "htk_compat": false, "low_freq": 1482, "num_mel_bins": 4, "preemphasis_coefficient": 0.26, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 49.7663, "vtln_high": 5461, "vtln_low": 4039, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.7031, "energy_floor": 4.038, "frame_length": 1.125, "frame_shift": 0.6875, "high_freq": 6433, "htk_compat": true, "low_freq": 2336, "num_mel_bins": 8, "preemphasis_coefficient": 0.7, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 18.0061, "vtln_high": 5902, "vtln_low": 3191, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.7197, "energy_floor": 3.2075, "frame_length": 1.0625, "frame_shift": 0.25, "high_freq": 4448, "htk_compat": true, "low_freq": 378, "num_mel_bins": 4, "preemphasis_coefficient": 0.31, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 71.591, "vtln_high": 3497, "vtln_low": 3331, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 0.7238, "energy_floor": 1.9087, "frame_length": 1.1875, "frame_shift": 0.75, "high_freq": 5457, "htk_compat": true, "low_freq": 1775, "num_mel_bins": 7, "preemphasis_coefficient": 0.48, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 29.2858, "vtln_high": 5349, "vtln_low": 3987, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.7507, "energy_floor": 0.2754, "frame_length": 0.875, "frame_shift": 0.8125, "high_freq": 6405, "htk_compat": false, "low_freq": 1972, "num_mel_bins": 5, "preemphasis_coefficient": 0.83, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 52.5962, "vtln_high": 4597, "vtln_low": 4417, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 0.7954, "energy_floor": 0.3451, "frame_length": 1.1875, "frame_shift": 0.625, "high_freq": 4078, "htk_compat": false, "low_freq": 796, "num_mel_bins": 8, "preemphasis_coefficient": 0.47, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 8, "cepstral_lifter": 42.3128, "vtln_high": 2299, "vtln_low": 1094, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 0.8432, "energy_floor": 1.3765, "frame_length": 0.9375, "frame_shift": 1.1875, "high_freq": 6004, "htk_compat": true, "low_freq": 2302, "num_mel_bins": 4, "preemphasis_coefficient": 0.6, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 74.1116, "vtln_high": 4129, "vtln_low": 2898, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 0.8549, "energy_floor": 4.8924, "frame_length": 0.3125, "frame_shift": 1.125, "high_freq": 5643, "htk_compat": true, "low_freq": 956, "num_mel_bins": 4, "preemphasis_coefficient": 0.32, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 76.0384, "vtln_high": 2672, "vtln_low": 1762, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 0.9502, "energy_floor": 1.9738, "frame_length": 0.75, "frame_shift": 0.25, "high_freq": 7773, "htk_compat": true, "low_freq": 1205, "num_mel_bins": 7, "preemphasis_coefficient": 0.5, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 62.9038, "vtln_high": 7460, "vtln_low": 7174, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.0759, "energy_floor": 1.9132, "frame_length": 1.1875, "frame_shift": 0.625, "high_freq": 3529, "htk_compat": false, "low_freq": 227, "num_mel_bins": 8, "preemphasis_coefficient": 0.26, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 4.1559, "vtln_high": 1976, "vtln_low": 972, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.147, "energy_floor": 4.3972, "frame_length": 0.9375, "frame_shift": 0.75, "high_freq": 6393, "htk_compat": true, "low_freq": 2451, "num_mel_bins": 4, "preemphasis_coefficient": 0.06, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 67.4571, "vtln_high": 5460, "vtln_low": 3654, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.2069, "energy_floor": 0.4607, "frame_length": 1.125, "frame_shift": 0.5625, "high_freq": 5864, "htk_compat": true, "low_freq": 1512, "num_mel_bins": 7, "preemphasis_coefficient": 0.17, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 33.0194, "vtln_high": 5438, "vtln_low": 3920, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.3369, "energy_floor": 4.2619, "frame_length": 0.6875, "frame_shift": 0.375, "high_freq": 5307, "htk_compat": true, "low_freq": 666, "num_mel_bins": 6, "preemphasis_coefficient": 0.19, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 88.3186, "vtln_high": 4677, "vtln_low": 2590, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.3699, "energy_floor": 3.0236, "frame_length": 1.0625, "frame_shift": 0.75, "high_freq": 3720, "htk_compat": true, "low_freq": 1980, "num_mel_bins": 4, "preemphasis_coefficient": 0.13, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 57.6793, "vtln_high": 3441, "vtln_low": 3396, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 1.3763, "energy_floor": 1.6574, "frame_length": 1.125, "frame_shift": 0.8125, "high_freq": 2816, "htk_compat": false, "low_freq": 1021, "num_mel_bins": 4, "preemphasis_coefficient": 0.91, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 45.2819, "vtln_high": 2547, "vtln_low": 1123, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.4097, "energy_floor": 4.1523, "frame_length": 0.875, "frame_shift": 0.375, "high_freq": 6164, "htk_compat": false, "low_freq": 987, "num_mel_bins": 4, "preemphasis_coefficient": 0.06, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 75.0589, "vtln_high": 5873, "vtln_low": 5807, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.4295, "energy_floor": 3.7938, "frame_length": 1.125, "frame_shift": 0.75, "high_freq": 3382, "htk_compat": false, "low_freq": 471, "num_mel_bins": 4, "preemphasis_coefficient": 0.42, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 78.588, "vtln_high": 3299, "vtln_low": 2540, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.4677, "energy_floor": 4.0728, "frame_length": 1.125, "frame_shift": 1.0625, "high_freq": 7698, "htk_compat": true, "low_freq": 569, "num_mel_bins": 6, "preemphasis_coefficient": 0.5, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 76.8484, "vtln_high": 7453, "vtln_low": 7251, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.4979, "energy_floor": 1.1705, "frame_length": 1.1875, "frame_shift": 0.375, "high_freq": 4474, "htk_compat": true, "low_freq": 1123, "num_mel_bins": 7, "preemphasis_coefficient": 0.09, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 38.6407, "vtln_high": 3043, "vtln_low": 2934, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.555, "energy_floor": 1.8728, "frame_length": 0.875, "frame_shift": 0.9375, "high_freq": 5191, "htk_compat": true, "low_freq": 2262, "num_mel_bins": 4, "preemphasis_coefficient": 0.24, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 11.982, "vtln_high": 4607, "vtln_low": 4483, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.5626, "energy_floor": 3.7117, "frame_length": 1.125, "frame_shift": 0.125, "high_freq": 3008, "htk_compat": true, "low_freq": 534, "num_mel_bins": 5, "preemphasis_coefficient": 0.65, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 75.6661, "vtln_high": 2592, "vtln_low": 1621, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.5707, "energy_floor": 3.0409, "frame_length": 0.75, "frame_shift": 0.625, "high_freq": 7441, "htk_compat": true, "low_freq": 1554, "num_mel_bins": 6, "preemphasis_coefficient": 0.95, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 80.1563, "vtln_high": 7152, "vtln_low": 6151, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.5966, "energy_floor": 2.3442, "frame_length": 0.5625, "frame_shift": 0.5, "high_freq": 7944, "htk_compat": true, "low_freq": 1616, "num_mel_bins": 5, "preemphasis_coefficient": 0.49, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 80.8779, "vtln_high": 5720, "vtln_low": 4080, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.6229, "energy_floor": 2.0519, "frame_length": 1.1875, "frame_shift": 0.3125, "high_freq": 4871, "htk_compat": true, "low_freq": 1567, "num_mel_bins": 4, "preemphasis_coefficient": 0.79, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 42.9569, "vtln_high": 3483, "vtln_low": 3287, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.736, "energy_floor": 0.4063, "frame_length": 0.6875, "frame_shift": 0.0625, "high_freq": 6475, "htk_compat": true, "low_freq": 4439, "num_mel_bins": 4, "preemphasis_coefficient": 0.23, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 30.0984, "vtln_high": 5450, "vtln_low": 4909, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.7411, "energy_floor": 2.0918, "frame_length": 1.0625, "frame_shift": 0.8125, "high_freq": 6107, "htk_compat": true, "low_freq": 2523, "num_mel_bins": 4, "preemphasis_coefficient": 0.69, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 92.6839, "vtln_high": 5085, "vtln_low": 4771, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.7439, "energy_floor": 2.3782, "frame_length": 0.875, "frame_shift": 1.1875, "high_freq": 7669, "htk_compat": false, "low_freq": 4499, "num_mel_bins": 4, "preemphasis_coefficient": 0.81, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 95.7035, "vtln_high": 7521, "vtln_low": 7417, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 1.7611, "energy_floor": 4.2965, "frame_length": 0.8125, "frame_shift": 0.6875, "high_freq": 6607, "htk_compat": false, "low_freq": 454, "num_mel_bins": 7, "preemphasis_coefficient": 0.35, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 17.8265, "vtln_high": 6387, "vtln_low": 6105, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 1.7893, "energy_floor": 1.8005, "frame_length": 0.625, "frame_shift": 0.375, "high_freq": 2791, "htk_compat": true, "low_freq": 617, "num_mel_bins": 4, "preemphasis_coefficient": 0.96, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 93.405, "vtln_high": 1751, "vtln_low": 1690, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 1.8392, "energy_floor": 4.3711, "frame_length": 0.9375, "frame_shift": 0.75, "high_freq": 6978, "htk_compat": true, "low_freq": 453, "num_mel_bins": 4, "preemphasis_coefficient": 0.48, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 42.9768, "vtln_high": 6315, "vtln_low": 3995, "vtln_warp": 1.1059, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.9561, "energy_floor": 0.8419, "frame_length": 0.8125, "frame_shift": 1.125, "high_freq": 5308, "htk_compat": false, "low_freq": 1471, "num_mel_bins": 5, "preemphasis_coefficient": 0.62, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 51.0514, "vtln_high": 5221, "vtln_low": 5071, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 1.998, "energy_floor": 1.6949, "frame_length": 1.125, "frame_shift": 0.8125, "high_freq": 4678, "htk_compat": true, "low_freq": 2340, "num_mel_bins": 5, "preemphasis_coefficient": 0.44, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 70.1988, "vtln_high": 4041, "vtln_low": 2424, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.0106, "energy_floor": 4.5392, "frame_length": 0.6875, "frame_shift": 0.1875, "high_freq": 4776, "htk_compat": true, "low_freq": 1297, "num_mel_bins": 5, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 37.5837, "vtln_high": 3995, "vtln_low": 2991, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.0835, "energy_floor": 2.8454, "frame_length": 0.9375, "frame_shift": 0.3125, "high_freq": 7496, "htk_compat": false, "low_freq": 1207, "num_mel_bins": 6, "preemphasis_coefficient": 0.76, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 6, "cepstral_lifter": 4.5734, "vtln_high": 3935, "vtln_low": 3932, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 2.2801, "energy_floor": 1.7051, "frame_length": 1.1875, "frame_shift": 0.125, "high_freq": 7958, "htk_compat": true, "low_freq": 561, "num_mel_bins": 4, "preemphasis_coefficient": 0.9, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 60.4649, "vtln_high": 7218, "vtln_low": 5709, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.315, "energy_floor": 0.4964, "frame_length": 0.5, "frame_shift": 0.4375, "high_freq": 6582, "htk_compat": false, "low_freq": 1010, "num_mel_bins": 4, "preemphasis_coefficient": 0.98, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 71.516, "vtln_high": 6157, "vtln_low": 4430, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.3236, "energy_floor": 0.7825, "frame_length": 0.8125, "frame_shift": 0.25, "high_freq": 7488, "htk_compat": true, "low_freq": 1363, "num_mel_bins": 4, "preemphasis_coefficient": 0.3, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 68.9678, "vtln_high": 3555, "vtln_low": 1851, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 2.3805, "energy_floor": 2.934, "frame_length": 0.75, "frame_shift": 0.25, "high_freq": 6076, "htk_compat": true, "low_freq": 80, "num_mel_bins": 4, "preemphasis_coefficient": 0.85, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 31.0805, "vtln_high": 2257, "vtln_low": 1533, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.4091, "energy_floor": 2.8812, "frame_length": 1.125, "frame_shift": 0.9375, "high_freq": 6086, "htk_compat": false, "low_freq": 1210, "num_mel_bins": 5, "preemphasis_coefficient": 0.59, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 96.1612, "vtln_high": 4840, "vtln_low": 1905, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.4134, "energy_floor": 2.6379, "frame_length": 1.1875, "frame_shift": 0.375, "high_freq": 3318, "htk_compat": false, "low_freq": 770, "num_mel_bins": 5, "preemphasis_coefficient": 0.6, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 73.9427, "vtln_high": 2044, "vtln_low": 1481, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.5228, "energy_floor": 3.1056, "frame_length": 1.125, "frame_shift": 1.1875, "high_freq": 5422, "htk_compat": false, "low_freq": 2825, "num_mel_bins": 7, "preemphasis_coefficient": 0.88, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 7, "cepstral_lifter": 4.6719, "vtln_high": 5337, "vtln_low": 5243, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.5577, "energy_floor": 0.7393, "frame_length": 0.8125, "frame_shift": 0.5, "high_freq": 5291, "htk_compat": true, "low_freq": 1445, "num_mel_bins": 5, "preemphasis_coefficient": 0.01, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 5.8944, "vtln_high": 4338, "vtln_low": 4330, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.5854, "energy_floor": 3.2219, "frame_length": 0.875, "frame_shift": 0.4375, "high_freq": 6924, "htk_compat": false, "low_freq": 4024, "num_mel_bins": 4, "preemphasis_coefficient": 1.0, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 0.0578, "vtln_high": 5707, "vtln_low": 5025, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.6674, "energy_floor": 2.777, "frame_length": 1.0625, "frame_shift": 0.3125, "high_freq": 3129, "htk_compat": true, "low_freq": 1706, "num_mel_bins": 4, "preemphasis_coefficient": 0.91, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 50.9241, "vtln_high": 2593, "vtln_low": 2198, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.6816, "energy_floor": 4.0548, "frame_length": 1.1875, "frame_shift": 0.625, "high_freq": 3182, "htk_compat": false, "low_freq": 157, "num_mel_bins": 6, "preemphasis_coefficient": 0.04, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 31.3652, "vtln_high": 1203, "vtln_low": 1174, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.7879, "energy_floor": 3.3482, "frame_length": 0.6875, "frame_shift": 0.375, "high_freq": 4262, "htk_compat": true, "low_freq": 150, "num_mel_bins": 4, "preemphasis_coefficient": 0.68, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 92.794, "vtln_high": 3276, "vtln_low": 1685, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.8683, "energy_floor": 3.8162, "frame_length": 1.125, "frame_shift": 0.375, "high_freq": 6620, "htk_compat": false, "low_freq": 3389, "num_mel_bins": 7, "preemphasis_coefficient": 0.83, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 5, "cepstral_lifter": 82.2365, "vtln_high": 5365, "vtln_low": 4579, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 2.869, "energy_floor": 3.2618, "frame_length": 1.1875, "frame_shift": 0.9375, "high_freq": 5646, "htk_compat": true, "low_freq": 491, "num_mel_bins": 8, "preemphasis_coefficient": 0.89, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 59.9812, "vtln_high": 5397, "vtln_low": 2639, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.9211, "energy_floor": 4.144, "frame_length": 0.75, "frame_shift": 0.375, "high_freq": 7210, "htk_compat": true, "low_freq": 3666, "num_mel_bins": 4, "preemphasis_coefficient": 0.93, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 94.5907, "vtln_high": 6682, "vtln_low": 4979, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 2.9464, "energy_floor": 0.6798, "frame_length": 1.125, "frame_shift": 0.0625, "high_freq": 4445, "htk_compat": true, "low_freq": 323, "num_mel_bins": 6, "preemphasis_coefficient": 0.46, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 6, "cepstral_lifter": 7.8133, "vtln_high": 3755, "vtln_low": 1137, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 2.9633, "energy_floor": 1.9565, "frame_length": 0.875, "frame_shift": 0.0625, "high_freq": 6835, "htk_compat": false, "low_freq": 649, "num_mel_bins": 5, "preemphasis_coefficient": 0.77, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 80.8871, "vtln_high": 6691, "vtln_low": 6581, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 2.9697, "energy_floor": 2.0241, "frame_length": 1.125, "frame_shift": 0.6875, "high_freq": 2170, "htk_compat": false, "low_freq": 180, "num_mel_bins": 5, "preemphasis_coefficient": 0.28, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 95.8111, "vtln_high": 1266, "vtln_low": 521, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.0358, "energy_floor": 1.7295, "frame_length": 1.1875, "frame_shift": 1.0, "high_freq": 7222, "htk_compat": true, "low_freq": 858, "num_mel_bins": 4, "preemphasis_coefficient": 0.16, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 64.7537, "vtln_high": 6220, "vtln_low": 5229, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 3.0421, "energy_floor": 3.3343, "frame_length": 1.0, "frame_shift": 0.9375, "high_freq": 6477, "htk_compat": false, "low_freq": 1402, "num_mel_bins": 5, "preemphasis_coefficient": 0.99, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 26.1743, "vtln_high": 6381, "vtln_low": 5017, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.0919, "energy_floor": 4.5103, "frame_length": 0.625, "frame_shift": 1.0, "high_freq": 5323, "htk_compat": true, "low_freq": 937, "num_mel_bins": 5, "preemphasis_coefficient": 0.95, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 82.2405, "vtln_high": 5130, "vtln_low": 5086, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.1463, "energy_floor": 4.5068, "frame_length": 0.6875, "frame_shift": 0.3125, "high_freq": 7587, "htk_compat": true, "low_freq": 3542, "num_mel_bins": 7, "preemphasis_coefficient": 0.78, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 28.5808, "vtln_high": 7478, "vtln_low": 7326, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.2416, "energy_floor": 1.0604, "frame_length": 0.875, "frame_shift": 0.5, "high_freq": 4730, "htk_compat": false, "low_freq": 968, "num_mel_bins": 4, "preemphasis_coefficient": 0.11, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 60.5751, "vtln_high": 3542, "vtln_low": 1943, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.2698, "energy_floor": 3.0361, "frame_length": 1.0625, "frame_shift": 0.75, "high_freq": 4870, "htk_compat": true, "low_freq": 1281, "num_mel_bins": 7, "preemphasis_coefficient": 0.64, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 28.536, "vtln_high": 4401, "vtln_low": 3315, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.3078, "energy_floor": 4.9217, "frame_length": 1.0, "frame_shift": 0.3125, "high_freq": 6758, "htk_compat": true, "low_freq": 760, "num_mel_bins": 5, "preemphasis_coefficient": 0.98, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 97.4694, "vtln_high": 6022, "vtln_low": 5650, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.3206, "energy_floor": 0.023, "frame_length": 1.0625, "frame_shift": 0.5625, "high_freq": 5744, "htk_compat": true, "low_freq": 3901, "num_mel_bins": 5, "preemphasis_coefficient": 0.94, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 47.6031, "vtln_high": 5741, "vtln_low": 5524, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.4022, "energy_floor": 1.2172, "frame_length": 0.875, "frame_shift": 0.375, "high_freq": 7737, "htk_compat": false, "low_freq": 612, "num_mel_bins": 5, "preemphasis_coefficient": 0.35, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 65.1166, "vtln_high": 6852, "vtln_low": 5820, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.4339, "energy_floor": 2.6197, "frame_length": 1.125, "frame_shift": 0.1875, "high_freq": 3341, "htk_compat": true, "low_freq": 1275, "num_mel_bins": 7, "preemphasis_coefficient": 0.41, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 76.6062, "vtln_high": 3005, "vtln_low": 1680, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.4369, "energy_floor": 3.9198, "frame_length": 0.9375, "frame_shift": 0.125, "high_freq": 6218, "htk_compat": true, "low_freq": 904, "num_mel_bins": 5, "preemphasis_coefficient": 0.47, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 92.8036, "vtln_high": 4870, "vtln_low": 1901, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.4557, "energy_floor": 1.5553, "frame_length": 0.75, "frame_shift": 0.375, "high_freq": 6642, "htk_compat": true, "low_freq": 1530, "num_mel_bins": 4, "preemphasis_coefficient": 0.72, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 28.8828, "vtln_high": 4490, "vtln_low": 2980, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.4753, "energy_floor": 4.7166, "frame_length": 0.75, "frame_shift": 0.3125, "high_freq": 7637, "htk_compat": true, "low_freq": 4992, "num_mel_bins": 4, "preemphasis_coefficient": 0.92, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 2.5456, "vtln_high": 6925, "vtln_low": 5486, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.5134, "energy_floor": 2.0285, "frame_length": 0.625, "frame_shift": 0.1875, "high_freq": 5229, "htk_compat": false, "low_freq": 595, "num_mel_bins": 4, "preemphasis_coefficient": 0.65, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 30.6069, "vtln_high": 5090, "vtln_low": 3467, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 3.5212, "energy_floor": 3.8251, "frame_length": 0.875, "frame_shift": 0.3125, "high_freq": 4092, "htk_compat": true, "low_freq": 545, "num_mel_bins": 5, "preemphasis_coefficient": 0.09, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 2.9422, "vtln_high": 1634, "vtln_low": 1000, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.5261, "energy_floor": 2.0251, "frame_length": 0.875, "frame_shift": 0.625, "high_freq": 7926, "htk_compat": false, "low_freq": 3916, "num_mel_bins": 7, "preemphasis_coefficient": 0.45, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 48.8818, "vtln_high": 7889, "vtln_low": 7527, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.539, "energy_floor": 1.6456, "frame_length": 1.125, "frame_shift": 0.1875, "high_freq": 5425, "htk_compat": true, "low_freq": 2326, "num_mel_bins": 7, "preemphasis_coefficient": 0.72, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 39.4555, "vtln_high": 4290, "vtln_low": 2715, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 3.5643, "energy_floor": 2.2424, "frame_length": 1.1875, "frame_shift": 0.875, "high_freq": 2140, "htk_compat": true, "low_freq": 59, "num_mel_bins": 4, "preemphasis_coefficient": 0.98, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 36.7118, "vtln_high": 1463, "vtln_low": 1358, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.5959, "energy_floor": 4.8866, "frame_length": 1.125, "frame_shift": 1.0625, "high_freq": 5150, "htk_compat": false, "low_freq": 3697, "num_mel_bins": 4, "preemphasis_coefficient": 0.46, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 74.0966, "vtln_high": 4277, "vtln_low": 3777, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 3.7223, "energy_floor": 3.4282, "frame_length": 1.0, "frame_shift": 0.125, "high_freq": 6601, "htk_compat": true, "low_freq": 1923, "num_mel_bins": 6, "preemphasis_coefficient": 0.05, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 19.2839, "vtln_high": 6596, "vtln_low": 6594, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 3.7376, "energy_floor": 0.2093, "frame_length": 1.1875, "frame_shift": 0.75, "high_freq": 7830, "htk_compat": true, "low_freq": 4448, "num_mel_bins": 5, "preemphasis_coefficient": 0.27, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 5, "cepstral_lifter": 5.5865, "vtln_high": 5459, "vtln_low": 5056, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.812, "energy_floor": 0.4393, "frame_length": 0.75, "frame_shift": 1.0625, "high_freq": 5917, "htk_compat": false, "low_freq": 1272, "num_mel_bins": 4, "preemphasis_coefficient": 0.97, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 91.4723, "vtln_high": 3532, "vtln_low": 3056, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 3.8613, "energy_floor": 4.6574, "frame_length": 1.125, "frame_shift": 1.0, "high_freq": 3399, "htk_compat": true, "low_freq": 1576, "num_mel_bins": 5, "preemphasis_coefficient": 0.71, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 3, "cepstral_lifter": 29.1497, "vtln_high": 2440, "vtln_low": 1852, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 3.9117, "energy_floor": 4.6803, "frame_length": 0.5625, "frame_shift": 0.625, "high_freq": 5009, "htk_compat": false, "low_freq": 2542, "num_mel_bins": 4, "preemphasis_coefficient": 0.25, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 65.8362, "vtln_high": 4734, "vtln_low": 3050, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 4.1851, "energy_floor": 3.5211, "frame_length": 1.125, "frame_shift": 0.875, "high_freq": 4768, "htk_compat": false, "low_freq": 562, "num_mel_bins": 4, "preemphasis_coefficient": 0.05, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 36.961, "vtln_high": 1982, "vtln_low": 741, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 4.2197, "energy_floor": 3.7252, "frame_length": 0.9375, "frame_shift": 0.8125, "high_freq": 7453, "htk_compat": true, "low_freq": 1561, "num_mel_bins": 4, "preemphasis_coefficient": 0.06, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 44.78, "vtln_high": 6612, "vtln_low": 4074, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.2736, "energy_floor": 4.9552, "frame_length": 0.75, "frame_shift": 1.0, "high_freq": 5145, "htk_compat": false, "low_freq": 1705, "num_mel_bins": 4, "preemphasis_coefficient": 0.33, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 70.9332, "vtln_high": 4857, "vtln_low": 2223, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.3762, "energy_floor": 4.7209, "frame_length": 0.9375, "frame_shift": 0.0625, "high_freq": 5564, "htk_compat": true, "low_freq": 712, "num_mel_bins": 4, "preemphasis_coefficient": 0.74, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 39.2887, "vtln_high": 4353, "vtln_low": 3521, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.4229, "energy_floor": 0.4222, "frame_length": 1.0625, "frame_shift": 1.1875, "high_freq": 7822, "htk_compat": true, "low_freq": 4837, "num_mel_bins": 5, "preemphasis_coefficient": 0.04, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 5, "cepstral_lifter": 36.9181, "vtln_high": 7261, "vtln_low": 5703, "vtln_warp": 1.0, "window_type": "blackman", "dither": 0.0} {"blackman_coeff": 4.4663, "energy_floor": 3.5767, "frame_length": 1.125, "frame_shift": 1.125, "high_freq": 5844, "htk_compat": false, "low_freq": 799, "num_mel_bins": 7, "preemphasis_coefficient": 0.37, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 34.2098, "vtln_high": 4554, "vtln_low": 1148, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.53, "energy_floor": 3.1492, "frame_length": 1.0625, "frame_shift": 0.375, "high_freq": 7706, "htk_compat": false, "low_freq": 3813, "num_mel_bins": 6, "preemphasis_coefficient": 0.74, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 2, "cepstral_lifter": 71.8337, "vtln_high": 7672, "vtln_low": 5265, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 4.5474, "energy_floor": 0.7883, "frame_length": 0.5625, "frame_shift": 1.0, "high_freq": 7283, "htk_compat": false, "low_freq": 2418, "num_mel_bins": 4, "preemphasis_coefficient": 0.68, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 4, "cepstral_lifter": 70.0635, "vtln_high": 7277, "vtln_low": 7265, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.5663, "energy_floor": 1.127, "frame_length": 1.125, "frame_shift": 0.8125, "high_freq": 6069, "htk_compat": true, "low_freq": 167, "num_mel_bins": 8, "preemphasis_coefficient": 0.68, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "use_energy": true, "num_ceps": 6, "cepstral_lifter": 1.624, "vtln_high": 2148, "vtln_low": 461, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.5896, "energy_floor": 2.7617, "frame_length": 1.0625, "frame_shift": 0.8125, "high_freq": 3851, "htk_compat": true, "low_freq": 1115, "num_mel_bins": 4, "preemphasis_coefficient": 0.03, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 49.7637, "vtln_high": 2897, "vtln_low": 2701, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 4.6128, "energy_floor": 0.1203, "frame_length": 1.1875, "frame_shift": 0.9375, "high_freq": 6901, "htk_compat": false, "low_freq": 3577, "num_mel_bins": 6, "preemphasis_coefficient": 0.25, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 70.5509, "vtln_high": 5962, "vtln_low": 4190, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.6262, "energy_floor": 4.1656, "frame_length": 1.1875, "frame_shift": 0.8125, "high_freq": 6147, "htk_compat": false, "low_freq": 1684, "num_mel_bins": 6, "preemphasis_coefficient": 0.58, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "use_energy": true, "num_ceps": 5, "cepstral_lifter": 54.2056, "vtln_high": 5259, "vtln_low": 2363, "vtln_warp": 1.0, "window_type": "rectangular", "dither": 0.0} {"blackman_coeff": 4.6741, "energy_floor": 4.3867, "frame_length": 1.125, "frame_shift": 1.125, "high_freq": 6273, "htk_compat": false, "low_freq": 2481, "num_mel_bins": 4, "preemphasis_coefficient": 0.15, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 75.6122, "vtln_high": 3701, "vtln_low": 2992, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.6765, "energy_floor": 1.2644, "frame_length": 1.125, "frame_shift": 0.75, "high_freq": 5204, "htk_compat": false, "low_freq": 276, "num_mel_bins": 4, "preemphasis_coefficient": 0.04, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 96.116, "vtln_high": 5148, "vtln_low": 2541, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.7216, "energy_floor": 2.4818, "frame_length": 0.8125, "frame_shift": 0.375, "high_freq": 6723, "htk_compat": true, "low_freq": 2352, "num_mel_bins": 6, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 3, "cepstral_lifter": 32.0303, "vtln_high": 5598, "vtln_low": 2579, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 4.7919, "energy_floor": 2.6435, "frame_length": 0.625, "frame_shift": 0.5, "high_freq": 7971, "htk_compat": false, "low_freq": 1812, "num_mel_bins": 4, "preemphasis_coefficient": 0.65, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": false, "num_ceps": 4, "cepstral_lifter": 27.7648, "vtln_high": 7735, "vtln_low": 7419, "vtln_warp": 1.0, "window_type": "povey", "dither": 0.0} {"blackman_coeff": 4.814, "energy_floor": 0.468, "frame_length": 1.0625, "frame_shift": 0.6875, "high_freq": 5252, "htk_compat": true, "low_freq": 569, "num_mel_bins": 6, "preemphasis_coefficient": 0.85, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "use_energy": false, "num_ceps": 6, "cepstral_lifter": 56.449, "vtln_high": 4397, "vtln_low": 4332, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} {"blackman_coeff": 4.95, "energy_floor": 4.5916, "frame_length": 1.125, "frame_shift": 1.0625, "high_freq": 5044, "htk_compat": true, "low_freq": 617, "num_mel_bins": 8, "preemphasis_coefficient": 0.89, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 8, "cepstral_lifter": 23.3238, "vtln_high": 2732, "vtln_low": 2677, "vtln_warp": 1.0, "window_type": "hanning", "dither": 0.0} {"blackman_coeff": 4.9663, "energy_floor": 4.7867, "frame_length": 1.1875, "frame_shift": 0.5, "high_freq": 2424, "htk_compat": false, "low_freq": 350, "num_mel_bins": 4, "preemphasis_coefficient": 0.39, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "use_energy": true, "num_ceps": 2, "cepstral_lifter": 59.4319, "vtln_high": 1202, "vtln_low": 1063, "vtln_warp": 1.0, "window_type": "hamming", "dither": 0.0} audio-0.7.2/test/torchaudio_unittest/assets/kaldi_test_spectrogram_args.json000066400000000000000000000757251376444676100277040ustar00rootroot00000000000000{"blackman_coeff": 0.0016, "dither": 0, "energy_floor": 4.668, "frame_length": 0.625, "frame_shift": 0.25, "preemphasis_coefficient": 0.82, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 0.0121, "dither": 0, "energy_floor": 4.9643, "frame_length": 0.875, "frame_shift": 0.1875, "preemphasis_coefficient": 0.98, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 0.0378, "dither": 0, "energy_floor": 3.777, "frame_length": 0.5, "frame_shift": 0.625, "preemphasis_coefficient": 0.76, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.0545, "dither": 0, "energy_floor": 0.0732, "frame_length": 1.0, "frame_shift": 0.75, "preemphasis_coefficient": 0.81, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 0.1005, "dither": 0, "energy_floor": 0.3739, "frame_length": 0.5625, "frame_shift": 0.625, "preemphasis_coefficient": 0.19, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.1088, "dither": 0, "energy_floor": 0.6933, "frame_length": 0.5, "frame_shift": 0.75, "preemphasis_coefficient": 0.51, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 0.1777, "dither": 0, "energy_floor": 3.8992, "frame_length": 1.0, "frame_shift": 0.3125, "preemphasis_coefficient": 0.96, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.2384, "dither": 0, "energy_floor": 0.308, "frame_length": 0.375, "frame_shift": 0.25, "preemphasis_coefficient": 0.98, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "povey"} {"blackman_coeff": 0.2669, "dither": 0, "energy_floor": 2.4329, "frame_length": 0.625, "frame_shift": 1.1875, "preemphasis_coefficient": 0.18, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.334, "dither": 0, "energy_floor": 0.5962, "frame_length": 0.25, "frame_shift": 0.5625, "preemphasis_coefficient": 0.38, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 0.4268, "dither": 0, "energy_floor": 2.4431, "frame_length": 0.5625, "frame_shift": 0.0625, "preemphasis_coefficient": 0.95, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 0.4774, "dither": 0, "energy_floor": 0.6982, "frame_length": 1.125, "frame_shift": 1.125, "preemphasis_coefficient": 0.27, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "povey"} {"blackman_coeff": 0.4992, "dither": 0, "energy_floor": 3.7665, "frame_length": 0.4375, "frame_shift": 1.125, "preemphasis_coefficient": 0.42, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 0.544, "dither": 0, "energy_floor": 1.6641, "frame_length": 0.9375, "frame_shift": 0.875, "preemphasis_coefficient": 0.13, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 0.5785, "dither": 0, "energy_floor": 2.8162, "frame_length": 1.125, "frame_shift": 1.0625, "preemphasis_coefficient": 0.17, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.8072, "dither": 0, "energy_floor": 4.0404, "frame_length": 0.5, "frame_shift": 1.1875, "preemphasis_coefficient": 0.74, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 0.8418, "dither": 0, "energy_floor": 4.1771, "frame_length": 0.3125, "frame_shift": 0.25, "preemphasis_coefficient": 0.48, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 0.8431, "dither": 0, "energy_floor": 0.0728, "frame_length": 0.75, "frame_shift": 0.8125, "preemphasis_coefficient": 0.1, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 0.885, "dither": 0, "energy_floor": 3.9292, "frame_length": 0.375, "frame_shift": 0.75, "preemphasis_coefficient": 0.27, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.9625, "dither": 0, "energy_floor": 2.5481, "frame_length": 0.6875, "frame_shift": 1.0, "preemphasis_coefficient": 0.06, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 0.9826, "dither": 0, "energy_floor": 0.7377, "frame_length": 0.375, "frame_shift": 0.6875, "preemphasis_coefficient": 0.7, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 0.9854, "dither": 0, "energy_floor": 3.8819, "frame_length": 0.25, "frame_shift": 1.0, "preemphasis_coefficient": 0.54, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "povey"} {"blackman_coeff": 1.0303, "dither": 0, "energy_floor": 4.4583, "frame_length": 0.375, "frame_shift": 0.875, "preemphasis_coefficient": 0.39, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.0743, "dither": 0, "energy_floor": 0.4642, "frame_length": 1.125, "frame_shift": 0.625, "preemphasis_coefficient": 0.39, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 1.0788, "dither": 0, "energy_floor": 1.442, "frame_length": 0.1875, "frame_shift": 0.3125, "preemphasis_coefficient": 0.53, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 1.0816, "dither": 0, "energy_floor": 0.205, "frame_length": 0.1875, "frame_shift": 0.6875, "preemphasis_coefficient": 0.02, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 1.1385, "dither": 0, "energy_floor": 4.738, "frame_length": 0.625, "frame_shift": 0.3125, "preemphasis_coefficient": 0.23, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 1.3142, "dither": 0, "energy_floor": 4.8914, "frame_length": 0.875, "frame_shift": 0.1875, "preemphasis_coefficient": 0.34, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.3189, "dither": 0, "energy_floor": 3.683, "frame_length": 1.125, "frame_shift": 1.125, "preemphasis_coefficient": 0.88, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 1.3235, "dither": 0, "energy_floor": 3.8538, "frame_length": 0.25, "frame_shift": 1.0625, "preemphasis_coefficient": 0.07, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 1.3389, "dither": 0, "energy_floor": 1.6152, "frame_length": 0.375, "frame_shift": 0.5, "preemphasis_coefficient": 0.21, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.3887, "dither": 0, "energy_floor": 3.3198, "frame_length": 0.375, "frame_shift": 0.125, "preemphasis_coefficient": 0.14, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 1.4127, "dither": 0, "energy_floor": 2.6264, "frame_length": 0.875, "frame_shift": 0.375, "preemphasis_coefficient": 0.69, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 1.5178, "dither": 0, "energy_floor": 2.8631, "frame_length": 1.0, "frame_shift": 0.8125, "preemphasis_coefficient": 0.95, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.5403, "dither": 0, "energy_floor": 0.0133, "frame_length": 1.1875, "frame_shift": 0.25, "preemphasis_coefficient": 0.59, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.5754, "dither": 0, "energy_floor": 0.954, "frame_length": 1.0, "frame_shift": 0.9375, "preemphasis_coefficient": 0.2, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 1.5959, "dither": 0, "energy_floor": 0.9033, "frame_length": 0.75, "frame_shift": 1.0, "preemphasis_coefficient": 0.14, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 1.6923, "dither": 0, "energy_floor": 3.5626, "frame_length": 0.6875, "frame_shift": 1.0625, "preemphasis_coefficient": 0.27, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 1.6972, "dither": 0, "energy_floor": 1.0863, "frame_length": 1.1875, "frame_shift": 0.875, "preemphasis_coefficient": 0.86, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 1.744, "dither": 0, "energy_floor": 0.5308, "frame_length": 0.5, "frame_shift": 0.125, "preemphasis_coefficient": 0.33, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 1.7642, "dither": 0, "energy_floor": 0.4833, "frame_length": 0.25, "frame_shift": 0.8125, "preemphasis_coefficient": 0.94, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 1.8072, "dither": 0, "energy_floor": 0.8085, "frame_length": 0.5, "frame_shift": 0.25, "preemphasis_coefficient": 0.96, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 1.8836, "dither": 0, "energy_floor": 4.5145, "frame_length": 0.875, "frame_shift": 1.0625, "preemphasis_coefficient": 0.4, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 1.8946, "dither": 0, "energy_floor": 4.1442, "frame_length": 0.3125, "frame_shift": 0.875, "preemphasis_coefficient": 0.73, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 1.8988, "dither": 0, "energy_floor": 3.0931, "frame_length": 1.0625, "frame_shift": 0.3125, "preemphasis_coefficient": 0.35, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 1.9501, "dither": 0, "energy_floor": 4.3519, "frame_length": 0.4375, "frame_shift": 0.25, "preemphasis_coefficient": 0.61, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 2.0137, "dither": 0, "energy_floor": 3.1007, "frame_length": 0.625, "frame_shift": 1.0625, "preemphasis_coefficient": 0.67, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 2.0175, "dither": 0, "energy_floor": 2.9099, "frame_length": 1.0, "frame_shift": 0.5625, "preemphasis_coefficient": 0.28, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 2.1114, "dither": 0, "energy_floor": 4.5618, "frame_length": 0.25, "frame_shift": 0.875, "preemphasis_coefficient": 0.61, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 2.1472, "dither": 0, "energy_floor": 0.2, "frame_length": 1.125, "frame_shift": 0.875, "preemphasis_coefficient": 0.58, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 2.1947, "dither": 0, "energy_floor": 1.8065, "frame_length": 0.875, "frame_shift": 0.75, "preemphasis_coefficient": 0.45, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 2.2457, "dither": 0, "energy_floor": 1.704, "frame_length": 0.75, "frame_shift": 0.5625, "preemphasis_coefficient": 0.98, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 2.2893, "dither": 0, "energy_floor": 1.0286, "frame_length": 0.25, "frame_shift": 0.5, "preemphasis_coefficient": 0.8, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 2.3371, "dither": 0, "energy_floor": 4.4192, "frame_length": 0.8125, "frame_shift": 0.625, "preemphasis_coefficient": 0.3, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 2.3831, "dither": 0, "energy_floor": 4.8325, "frame_length": 0.25, "frame_shift": 1.125, "preemphasis_coefficient": 0.34, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "povey"} {"blackman_coeff": 2.423, "dither": 0, "energy_floor": 0.6363, "frame_length": 0.875, "frame_shift": 0.3125, "preemphasis_coefficient": 0.77, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 2.4378, "dither": 0, "energy_floor": 1.4617, "frame_length": 0.9375, "frame_shift": 0.375, "preemphasis_coefficient": 0.53, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 2.4454, "dither": 0, "energy_floor": 1.936, "frame_length": 1.0, "frame_shift": 0.9375, "preemphasis_coefficient": 0.66, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 2.448, "dither": 0, "energy_floor": 3.8782, "frame_length": 0.5625, "frame_shift": 1.125, "preemphasis_coefficient": 0.1, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 2.5164, "dither": 0, "energy_floor": 2.7455, "frame_length": 0.875, "frame_shift": 0.9375, "preemphasis_coefficient": 0.55, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 2.5316, "dither": 0, "energy_floor": 2.3286, "frame_length": 0.75, "frame_shift": 0.75, "preemphasis_coefficient": 0.61, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 2.5487, "dither": 0, "energy_floor": 3.8457, "frame_length": 1.1875, "frame_shift": 0.9375, "preemphasis_coefficient": 0.63, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 2.6121, "dither": 0, "energy_floor": 4.3165, "frame_length": 0.6875, "frame_shift": 1.1875, "preemphasis_coefficient": 0.19, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 2.6988, "dither": 0, "energy_floor": 2.3417, "frame_length": 1.0, "frame_shift": 0.6875, "preemphasis_coefficient": 0.38, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 2.7457, "dither": 0, "energy_floor": 1.3662, "frame_length": 0.25, "frame_shift": 0.875, "preemphasis_coefficient": 0.74, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 2.8577, "dither": 0, "energy_floor": 4.1431, "frame_length": 0.375, "frame_shift": 1.0, "preemphasis_coefficient": 1.0, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 2.8693, "dither": 0, "energy_floor": 4.3801, "frame_length": 0.75, "frame_shift": 1.0, "preemphasis_coefficient": 0.95, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 2.8888, "dither": 0, "energy_floor": 0.4078, "frame_length": 0.3125, "frame_shift": 0.625, "preemphasis_coefficient": 0.25, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 2.9074, "dither": 0, "energy_floor": 1.6849, "frame_length": 1.125, "frame_shift": 0.625, "preemphasis_coefficient": 0.79, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 2.9303, "dither": 0, "energy_floor": 3.5172, "frame_length": 0.5, "frame_shift": 0.5, "preemphasis_coefficient": 0.04, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 3.07, "dither": 0, "energy_floor": 3.5254, "frame_length": 0.75, "frame_shift": 0.875, "preemphasis_coefficient": 0.96, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 3.1297, "dither": 0, "energy_floor": 0.3513, "frame_length": 0.4375, "frame_shift": 0.3125, "preemphasis_coefficient": 0.2, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 3.2523, "dither": 0, "energy_floor": 3.5376, "frame_length": 0.3125, "frame_shift": 0.25, "preemphasis_coefficient": 0.46, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 3.3896, "dither": 0, "energy_floor": 0.4666, "frame_length": 1.125, "frame_shift": 0.25, "preemphasis_coefficient": 0.05, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 3.537, "dither": 0, "energy_floor": 1.7032, "frame_length": 0.375, "frame_shift": 0.875, "preemphasis_coefficient": 0.17, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 3.5378, "dither": 0, "energy_floor": 3.6594, "frame_length": 0.25, "frame_shift": 0.625, "preemphasis_coefficient": 0.54, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 3.5847, "dither": 0, "energy_floor": 3.6357, "frame_length": 1.0, "frame_shift": 0.3125, "preemphasis_coefficient": 0.79, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 3.6057, "dither": 0, "energy_floor": 1.6902, "frame_length": 1.0625, "frame_shift": 0.6875, "preemphasis_coefficient": 0.65, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 3.6498, "dither": 0, "energy_floor": 0.2005, "frame_length": 0.9375, "frame_shift": 1.125, "preemphasis_coefficient": 0.37, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 3.6648, "dither": 0, "energy_floor": 4.6742, "frame_length": 0.625, "frame_shift": 1.1875, "preemphasis_coefficient": 0.88, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 3.6701, "dither": 0, "energy_floor": 3.7451, "frame_length": 0.8125, "frame_shift": 0.25, "preemphasis_coefficient": 0.19, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 3.7232, "dither": 0, "energy_floor": 0.4912, "frame_length": 0.375, "frame_shift": 0.875, "preemphasis_coefficient": 0.34, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 3.7605, "dither": 0, "energy_floor": 1.6813, "frame_length": 0.25, "frame_shift": 0.5625, "preemphasis_coefficient": 0.27, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 3.7759, "dither": 0, "energy_floor": 1.7002, "frame_length": 1.0625, "frame_shift": 0.6875, "preemphasis_coefficient": 0.42, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 3.7921, "dither": 0, "energy_floor": 3.4087, "frame_length": 0.25, "frame_shift": 1.0, "preemphasis_coefficient": 0.54, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "blackman"} {"blackman_coeff": 3.7954, "dither": 0, "energy_floor": 3.5651, "frame_length": 0.5, "frame_shift": 0.8125, "preemphasis_coefficient": 0.06, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 3.799, "dither": 0, "energy_floor": 3.0026, "frame_length": 0.625, "frame_shift": 1.0, "preemphasis_coefficient": 0.82, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 3.8659, "dither": 0, "energy_floor": 1.7487, "frame_length": 1.1875, "frame_shift": 0.375, "preemphasis_coefficient": 1.0, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 3.951, "dither": 0, "energy_floor": 0.3903, "frame_length": 1.125, "frame_shift": 1.0, "preemphasis_coefficient": 0.41, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 4.0045, "dither": 0, "energy_floor": 3.061, "frame_length": 0.625, "frame_shift": 1.0625, "preemphasis_coefficient": 0.74, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 4.0187, "dither": 0, "energy_floor": 4.8148, "frame_length": 0.375, "frame_shift": 0.6875, "preemphasis_coefficient": 0.68, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 4.032, "dither": 0, "energy_floor": 2.2019, "frame_length": 1.125, "frame_shift": 0.25, "preemphasis_coefficient": 0.78, "raw_energy": true, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "rectangular"} {"blackman_coeff": 4.0627, "dither": 0, "energy_floor": 4.1729, "frame_length": 0.625, "frame_shift": 1.125, "preemphasis_coefficient": 0.89, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 4.0736, "dither": 0, "energy_floor": 0.9155, "frame_length": 1.0625, "frame_shift": 0.5625, "preemphasis_coefficient": 0.82, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 4.1131, "dither": 0, "energy_floor": 3.9204, "frame_length": 0.5, "frame_shift": 0.125, "preemphasis_coefficient": 0.39, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 4.1816, "dither": 0, "energy_floor": 1.665, "frame_length": 0.8125, "frame_shift": 0.375, "preemphasis_coefficient": 0.37, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 4.1897, "dither": 0, "energy_floor": 1.2668, "frame_length": 0.1875, "frame_shift": 0.625, "preemphasis_coefficient": 0.74, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 4.2217, "dither": 0, "energy_floor": 3.6775, "frame_length": 0.3125, "frame_shift": 0.125, "preemphasis_coefficient": 0.01, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "hamming"} {"blackman_coeff": 4.2785, "dither": 0, "energy_floor": 0.7201, "frame_length": 0.8125, "frame_shift": 0.8125, "preemphasis_coefficient": 0.3, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 4.3304, "dither": 0, "energy_floor": 1.0538, "frame_length": 0.875, "frame_shift": 1.125, "preemphasis_coefficient": 0.92, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 4.3942, "dither": 0, "energy_floor": 3.9813, "frame_length": 0.75, "frame_shift": 0.6875, "preemphasis_coefficient": 0.27, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "blackman"} {"blackman_coeff": 4.4432, "dither": 0, "energy_floor": 2.0441, "frame_length": 0.5, "frame_shift": 0.6875, "preemphasis_coefficient": 0.77, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "hanning"} {"blackman_coeff": 4.4459, "dither": 0, "energy_floor": 0.5135, "frame_length": 0.25, "frame_shift": 0.1875, "preemphasis_coefficient": 0.29, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 4.5486, "dither": 0, "energy_floor": 1.3248, "frame_length": 0.1875, "frame_shift": 1.125, "preemphasis_coefficient": 0.91, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": false, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 4.5535, "dither": 0, "energy_floor": 2.1772, "frame_length": 0.4375, "frame_shift": 0.875, "preemphasis_coefficient": 0.21, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hanning"} {"blackman_coeff": 4.5835, "dither": 0, "energy_floor": 0.3781, "frame_length": 0.875, "frame_shift": 0.875, "preemphasis_coefficient": 0.04, "raw_energy": true, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": true, "window_type": "hamming"} {"blackman_coeff": 4.6297, "dither": 0, "energy_floor": 2.49, "frame_length": 0.5, "frame_shift": 0.25, "preemphasis_coefficient": 0.03, "raw_energy": false, "remove_dc_offset": false, "round_to_power_of_two": true, "snip_edges": true, "subtract_mean": false, "window_type": "rectangular"} {"blackman_coeff": 4.6749, "dither": 0, "energy_floor": 4.8853, "frame_length": 0.25, "frame_shift": 0.25, "preemphasis_coefficient": 0.48, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": false, "subtract_mean": false, "window_type": "povey"} {"blackman_coeff": 4.6971, "dither": 0, "energy_floor": 1.3632, "frame_length": 0.875, "frame_shift": 0.9375, "preemphasis_coefficient": 0.44, "raw_energy": false, "remove_dc_offset": true, "round_to_power_of_two": false, "snip_edges": true, "subtract_mean": false, "window_type": "blackman"} audio-0.7.2/test/torchaudio_unittest/assets/mat.ark000066400000000000000000000001601376444676100225010ustar00rootroot00000000000000key1 BFM ?@@@0A@APAAAAkey2 BFM ABB$B(B,BLBPBTBaudio-0.7.2/test/torchaudio_unittest/assets/sinewave.wav000066400000000000000000007641201376444676100235760ustar00rootroot00000000000000RIFFHWAVEfmt (>  8qfactdataff&%p `` ѽ @#(%a&S&A$!W@cPr`/w 䀭߀܀5@ـ@` `F~jꐬ2Ls`! Y ,'jҾ"@ %:&H&1%s"w+ 6 ܿ` @J ݀(LۀـX` v`G"P4`"g`ds!fT$_%0e&@F%#p !@3z $`epr`م@@6܀GϚ@@Yޠ`.@6;X(i  fl z#y%|[&&Գ$@6"`6`WI @6iP; aI+m頇l s=o@;@1A@I}@xbF \@{"$ +&@S&V%=#R `bn~J 0pN l(r@5zۀ@sـeK4Bߠ2㠧,ˏ,4m(2ޒ +@R vZ!;!$%ff&%9!$Z! e@[Œ 1e8ď & 2:BK@esـzA`w' lN񐊟0J `nX @V =#@V%S& +&${"! V 6bioJ2A݀ڀ9ــq@w=lm;PqIUFi@ @ \I:6"ӳ$@&@|[&@y%z#l f`$@ (!ix4 z60 @YڀК@G2 p@eY(+ +z@%3t !#G%@0e&_%cT$t!@dPP"n:4A" v"߀߅@T@ـ-L`J``- h6В 1z"1%@H&:& %Ӿ"j '}Y! ";sp2xj@F@7@߀䀪(~X/Zy` i`@W@!@C$T&@a&'%#ý K Ip ƕe06ms`iހ+ڀ+isp7mehJp y@@ν #@'%a&T&C$!~W@@he`/j`@䀫7 F倉j갸2=sسT#P" Y~ !'j̾" %:&@H&@1%@r"`0 P6 п`ꀗ倻J@'Lۀـ]ڀ܀/v /"ۖ4@"Qd@u!jT$_%/e&C%@#j !3z p e^Dž@8GϚ@Y286Hx"i `@%f!l &z#y%}[&&ͳ$6".MI@EiXTpI9m~lk=~@q@;ڀ;A`@䠀{0bJp h`0  |" $@ +&@S&V%=#J ` g n`J t0vN l'j@/ހz@ـs@eڀK0B52Y'?gP2ْ M r[!@!$@%ff&%;!$Z!h_`˒ @1X>@+y2@)BK܀es@z6s(`lM00PJ nr g =#V%S& +&${"`  i8P Dbb `nt8@5A:u`=lmF YIb@ipp,@ /`tI@N@7"׳$@&@}[&y%z#l f  iM(m6`6YКGڀ=@ @|$e1H% `z-3q !#J%/e&@Z%eT$@n!dE"t4͖""@vڅ܀Q&L`J̿: xȻ6 @< r@x"1%@H&:& %"@j'@rY@! TTs`2}j F`@@:ڀ#``# 06s``t@ W!@S$V&a&@(%#ƽ @P`=p ems瀃iހ+ڀ+@@i sgm#ehEp W`@˽ #*%a&U&D$!@W`mͱpk`r/ @܀/ڀـ@݀F倄j0207s0d! `Y@y8'@j"@ %:&H&1%d" l@`r @6஖ @ J.Lـ@S@ߠ8v;N"֖4}p"@m e`r!uT$a%/e&@A%#m !`3@/zu  et젽@,GڀϚ@ڀۀY@"@'`>868VBiP /f(l z#@y%}[&&ʳ$6"1 RI (P@\8i4PIm适lo=@@i@:@9AS@\ v`TbD `c ,@{"$ +&R&V%@=#N @M@nJ hh0VM@l@(1ހz@@se@K-Bߠ2`2`ҏGJa(.2`Ӓ `!`f`n[!>!$ %ff&%0!$Z!l`dВ 2^x0`2@,B@Ke@s@@zEޠ (lNɟf1 PJ n@O @=#V%S&+&${"  na AtbsZ@%'A@7| = lmAPxI6:iP&@@* TIJ@6"@$@&}[&y%z#k f`P h2-s60@Y@КG-@@w0e<@E `z3n !@#A%/e&@a%gT$q!@dk@"zV4`ӖPL"v@߀Rڀ"ـ/LۀJP5 ז6 `7 "1%H&:& %@"j 'W@{Y! psа2@jF݀ـ0@!ߠp/0n`o`W!E$V&a&!%#ɽ T@p he`ms젪niހ+ڀ,ڀ@ޠi t0bm/ecp `p #!%@a&@V&F$@!`W@r@q` /䀧@0@ــ݀Fj2Vs=! YO'j߾" %:&@H&1%@g"pU x 6ি`@J݀0Lۀ@R@v I"4Q"@G eo!fT$`%/e&@B%#\ ! 2yY "eX …uހ!@GΚ@ڀYހ"\6vbi :g fk )z#y%{[&&ֳ$6"5VI M@0i0`p{Iml`r=@j=ـFAݠe`vpdbdی કC {"($ +&R&@V%@=#@< @@3n`FJ 8\0 MBl@'F@z@@s@eK܀>B -2{ 8T[2 @a @Z!I!$ %ff&%@%!$Z!pK@ 16>HJՏ`e2/BKe@r@ـz@Tޠ7(`l_Nr1P0J o5@L =#V%@S&+& ${" .p ྌ Gdb`V_ UA;r=lm^pI }5ig@@%kI G7"߳$&@z[&y%z#k @f ` h @S6`i`Ӛ`  Y@@Ϛ@GF`؅qHe  z 3 !@#G%@0e&h%]T$a!` e.`"X4Pٖp! v`߀ЅKڀ@ـDL5@J`T 46ݶ p"@1%H&:&@ %Ӿ" j@'|Y! F@s@2@jF@@݀@ـ@@.܀ @ ]/*``W![$U&@a&@% # wo te0lsriހ+ڀ+@@hi@ tm7e9p k ٽ #%a&@L&0$@!W`WرQ`:/D䀀2ڀـ@ݠ+@F@j`2PsL7 c" @Y`J'j@" %:&H&1%i"@  6ĺ Ͽ@ J@2L@ـ@Y@0v@1h"0ʖ4"c d-@!qT$e%0e&@<%#s !3y`=@ e`<`@@eGڀϚـ@@YP366i g l @z#@y%@}[&&ͳ$6"@P>I/@P@DiP\I`'@m@pl `=@v݀b@@ـ4A L@@ 2c<  #`/|"@$ +&R&V%=#T Vn J h?0b &N@l@'u7@zۀ@tـeK܀'B߀B2`( Ǐ@;{p"20 8 @@[!:!$%ff&@%@4!$Z![ 3 @ 2hඏ`1B߀K܀es@z@(lM@s"1P@J n '`^ =#V%@S&+&$@{" @wHp 'bP~@ ,A݀0ـzi=࠱l@ n{lIQi@?@`@`IZ7"$&x[&y%z#-l `f 7@ h9~6P#YހњـG@7@ހ@ f7P_p `cz@"3| !#?%0e&W%RT$v! d`T"`|4(" v`߀܀Uڀ~@!ـ7Lۀ!Jp߿p) ˖06i @L }p"1%H&:& %"j`'`aYp" ,ڜ,0@s2-jF@ـ@6ڀ܀4@50>KP`e:@W!M$d&@a&@%#н @^`@rp teLms젳iހ+ڀ,@ۀހis3mIeXp  ` @#6%@a&R&>$!uW`;1`h/@o Q܀*ـ ݠ>+GVj2Pps @! Y`+' j" %:&H&@1%|"ax$ ؞6hC P pJ @L@ـ@`ׅ߀F`w "X640"@e !bT$j%.e&D%#; !2zc h.xXeQb˅@%G@КـY怹pQP6j iз 0!fl @Bz#@y%~[&&ڳ$@6" _I@ |#i0=I@ mYl y=݀Z߷< ڀbA^@f bY v |"$+&@S&V%=#B @z@oQJ @D00Ml 'b@L@zrـe L܀`B@%2`DH[41 T@{@[!_!$ %ff&%@)!$Z! G`` u 1떚V `!25BK܀eڀrـzN@'@lSN0$0J o`~-E =#@V%S&+&${" ]P+ ,Dbh /@5@o@@=l`mIHq()i@`bI6"ܳ$&~[&@y%z#l `fв i 60siY@КـGڀBހυ Ve 30N  Az@73 !@#T%@1e&^%HT$@B!d8"@4 18"`vCؓՅ_@@L@ Jᠬ0H 6`Ҷ `)@| @~"1%H&:& %@"j''FEY0! XԖ s{2QjꀹF`@Oڀ)ߠ@R=0`@@ W@!@$@S&a&@%% #@ E p _e .m s iހۀ+ڀ@,@ۀ i⠷tpQmMye.p `&ҽ #@%a&N&L$!Wa0`Ep/@P1@߀5@@`F`jꀝ2PEspXx " Y 'j" %@:&H&z1%n"zb` pd 6z @`J@@L@@@g@ߠ(,wj\"p 4 #`/e`&!T$d%/e&@0%#R !2yG0 ™peF` @DGڀΚـ@Y@栓0(86d>*i fl z#y%|[&&г$@7"`WGI;p:@iKgI 2nxlf=x@?.A`E䀇@p&\b\y M@| R {"$ +&@R&V%@=#@[ `"`n0|J &0 n Mql 'Nzۀ@veڀK܀IB:2@ax/0b2( -q @[!P!$@%ff&%@!$Z!c`p 1)(pyU1A߀Keqـz](klM񐲟<0xuJ n[`W =#V%S& +&$|"S` h3b,@@N I1A@9wڀx c=@ln ,paIIi`4@ zI`S@ 7"ϳ$&@y[&y%@z#@ l `f hD(?6P.`Ú`~YހۀКـG@Nޠ#,fwSp$ `Zz`L3 !#K%1e&M%VT$W!dP"@ld4x!vŘǓȅ@Gـ)ـJL?݀J`R x6^ @C`]wk"1%H&:& %"`j'Y! 2Ks2@vj`F@݀@E@+@oI8]0V`ݱ`[@W!J$W&a&%#@ +}p t&3eWm sG`iހ@+ڀـ+@ۀi@tom >e%p -@1 #C%@a&@T&@B$!WEƱ=`@/P1ϐZ @u܀ڀ @H` ZG k2sCD," ?YA`Y' j"@ %@:&H&@1%"`.` `C7H Iy JCLـL@ @Փ Ew2"ޖ04"t`d !FT$i%/e&8%@# !2y{ (:cPe@mԅ)@G@Ϛـ@Yޠ?JhX6 ip i@fjl @ z#y%~[&&@$6"/I0? h8Hm`,l`)=@Jـ;2#I @FnJ t0`0Ml3( :Qzـre@K@2B2 `:ڏOH62p ŋ ख@Z![!$%ff&%@G!$ [!]Ȓ h1xp`w1BK܀ep@zm] 'mN01'K `nu@i =#V%S&+&@${" `Ѹ' |0A _4Wb`yle6@@6ـڀ݀=ln@@IiU @@@ZI86"@$&{[&@y% z#k g@60 `h\qȵ6W 렫 @Yۀ@К@Gڀ>`PKx!fsp ^ sz2 !#C%@2e&_%eT$m!`dB"L4ؤ0"@v@ڀ}@TLJ@`= h6ƶ ]`"1% H&:& %@ݾ"rj& Y! 0 P,s2[j F@݀M@CB`hh}0vpv`vW!$$\&a&%.#  po PJeP9m`siAހ+ڀ,@ۀ"ޠi t`8t mf0@#p J Y̽ #*%a&O&g$@!@iW@*5`rp#0@@ـw G倦j20sxl0L" @]Y@p'j"@ %@:& H&1%s" +@j o 5腖0b`J@9LT9ߠ @_w p"4;"@ eN!@T$V%1e&O%#@ !&3 -z  8 e Q젻)q@GΚڀY怉0x6x2(ip] 1f)l ,z#y%[&@&$6"^@IF`E@0h\i0sI<`Wmlm=A݀h@ـ>ڀJAݠj?e|b ``N@{"$+&R&@V%=#7 ``,n0>J 0ğ0M:l '@&B@zۀـse@KCB`2`V퀊oV2 e8[!2!$%ff&@%@#V%R&*&@${" A b0c@1`=@ IA݀0@in= l@m>HY^ip0G@GI_6"$&[&y%,z#(l f`0p 8i0Hv6P@uYۀ@њ@G+ @e( .z3@ !#@l%1e&U%OT$M!@d "  P4`!kv@܀S5:L@% IK`Ӷ"-| ,!%7@ ֓"1%%H&:& %@"j '`Y@J" ќ(@sJ2jG`݀@@@8 `耴`%0h`ੱ,@A`jW@!h$P&a&*%#@{ W`!p 8jke0Pmsr`iդ,ڀ+@Bi`s;mAeH`p `  @#7%a&@\&$$!`AW  u l_J/g @߀(ـ @/C1G j3s=! "Z`1'`$k޾" %:&H&1%X" ]`Ғߑm1 6xޖp; p ꠢJ@&L@ـ}b`LvU"Ȧv,5hN`"`dn!eT$@`%/e&C%#@^ !`2qz`\ Pڙf=G@К@ΫY`` @6Tsh_i 7@e@gk Ez#y%{[&&س$@6"`۴XI|?ph 4IxmSl I=e݀X߷DfAmcal ``|"R$+&R&@V%@=#  n J P~1`0Nl'@$zۀـueڀKeB 1 y砏PXX1ʒ ``_ [!H!$ %ff&%@&!$@Z!Ë Н1RMPG8 21BK܀eڀr@zRހ 5(l[N@j00yJ @nJ >#@V% S&+& ${"V#w @eY@@@ϚG`@Lo`eZ< `y<3 !#U%/e&h%@ET$!` erP":4D0"v` @ԓх܀Lڀـ&ـCLۀ`K{>K APE7 Q/@ "1%@H&:& %"jW'? >YЖ! PrP-2 j |F ݀@ـc,ߠ ŵE0>tp`Uɓ Y@~W@!@r$T&a&% #j `@>p xJePNlsCiހ@+ڀـ+@ۀ5i tl&eH`p @!@ :#%a&B&I$!WYܱT`/Hm@䀂߀D@@=݀FjP2Mst4" @Y'j" %@:&H&w1%K" &`ő` `6ҿO@JဲLـ@i@ b2w r"ƖL5" d[Ǧ!pT$@}%@/e&=%@~#M !@2ky@@ PHhe@ހhGڀϚZYޠ08YwA68i ~f@ l z#y%@[&&@γ$6" $ AI?@4h@I` nl6=@݀vڀܷ@9+ڀ2A JV䀎 .`cP C`X`-{"0$+&S&V%@=#@ YRnsJ .0e0M jl'Hހzـv@eڀKvB s2` ď02x @5w[!S!$%ff&%@!$@Z!- O }1Nԙؕ(@`1@ BK@e@vـz``'lMpBl1~J na @\ =#V%@S&+&-${"P ;@X Dcpu D.A݀ڀ8ـy =@l n`Ii>?}I`*27"ѳ$&@u[&@y%z#k f ` Dh66P뀽UY@ҚG@l܀@e 4Hf3`,  zQ3@ !#[%2e&K%:T$x! d@W1"cΨ4h$"`Y7vp@Ņ@Eڀ~ـLBݠJ᠒`ܿ0& Ȗ6 @ JO"1%H&:&@ %"j@&Yw! )x`Cs2@oj F @@@ـG܀1v w`/ _`@ W!L$n&a&%@# $o (l*eXlzs /i@+ڀـ,@@j$twmF eX.p @5`7@ F#D%a&=&?$r!W 05`6/)ȐS p߀܀ـ@݀ Fj2msXԻ 5" YH`_'j@" %:&@H&1%@}"8z`'3І 6`@sJ@L@%NՅ@,ߠ`Lw :"4w#{ e@!zT$@j%.e&S%@#@= !63@ys `HHe{eW`}ހGϚڀۀYE Q@u86,i qfol @^z#y%[&&ij$6")IP?hH@jm`&l$=@Hڷـ<@4@@Aݠ`+NbD -ݕ` 3|"$@+&S&V%=#D @nUJ nާ0F@MNl`-(4zre$L6B#2AX☚01p @Q@,[!]!$@%ff&%@!$@[!`@W@01 1rM @p@1A@L܀e@uz@q c`'怎lЗN10!J o{@n @=#@V%R&+&${" ˸@P͌ b q dk`1aA@C@`=l䠧m?IP%i^@`I=6"@$&s[&y%y#@k f $hh64`Y@gҚـGw j `pS@fPK yz g3c !0#E%4e&F%@0T$!`d;"x`4`4! L`v E@_@.@KۀQnJ  E xT6b `w`d``@]"1%@H&@:&@ %@"@k`&``Y`!  0r 3`iF @@ۀـ+FH q0a X!V$]&a&5%#  l`o Lee@1m^s``i@@+ڀـ,@ڤ"j`?t mpff`N`+p @؀_`L! R#@,%a&N&$@!W` p`گ0 3^Xـ@ۀ@wG.j2rܜpT" eY 'kƾ" %:& H&1%p"|@d 6X}$˶.J LـU@`&v耫`!864# d`R!T$@W%@.e&0%#z ! 2&z hzZX(eI`@m@G̚Y@Y %7i 8`f.l jz#y%@[&&$6" I>p=@p,hpH5mzlh=@fڀMNA݀oFŦ0Rc|) 6  {"$*&R&V%=#3 %nJ ( 1p&04N`3l`(!>zـx@e0L܀GB2 `^Px2 m@Z!h!$%ff&%@!$@C[!>p 1-U \W1@AKe@oـzۀ8 ը }(+m'N@E1J o @ >#V%@S&@ +&$|"`p 6HbѦ@@!@A@@ـc@w@a=`lEm0^I8Fi@P1@ I6"$&y[&y%@y#@5l f C ȜhXH051@ 怡@Y\@КGM܀f qIf @`z |3t !#K%2e&Y%WT$@Y!l@7e0#X$g48|!@v`@߀7ڀ{ـ`LۀݠJ¶` ` ` 7` ~0@u"1%#H&:& %˾"Zj ' qY8! Ts29jG @ــ2ڀS(P 0`!W!@$L&@a&.%#ؽ @j7p ,fEm sgi-ހ,ڀ+@7ޠi`[t$mHjehn Jp n y  &#%a&_&$!PW__(Xb/} ~䀡@.@) % Gj2s@.! @ Z@@'@j@" %:&@H&_1%#" Mv`H a6ÕR `~#vJ@-L@@;ڀ)@ߠ`w`@Px"@'{40" d8b!T$\%@0e&G%@# ! 2z e_@@\@GΚ@Yހm@/@C67[GiP وvg?l @#V%S&*&$@{" yi00e |b2)頝dA@@/@ڀ= l@Xn@FJ bi@NId^7"$&x[&@y%@cz#@k f6`m@ |hh5` X@RΚ@G`M@Zpo0g$g z`-36 !#4%1e&@<%MT$!@e@"4\@G"v zـ#iL@)J倪50 )6 q 1w"1%2H&:&@ %@"j&@SY! atY`PrC2j@F`Cۀ^ڀ#@ >EB . `ͲഓWD!j$|&@a&(%ڳ#& tPAPp  /d%l`/tl h9+ڀ,@%ޠi@7smHEepo @  1#@%a&[&@!$! m`mIjl@I '7"ʳ$&}[&y%y#@k f`4 hmN6PfdB@Yy͚Gd#ޠE܅?Љf'OH 4;{@3 !#@W%4e&@%@tT$:! deH"0{'4Ԗ`!Jv@}߀΅l:FL}`K @Epƿ` ԰60 X7 F"1%(H&:& %2"5j@&@6Y"" ڝrp2k@F^x@A@@x@ِ0ε0|G`]N_W@ !@E$@k&@a&@%#f @io ͨdemt`>iu+ڀ0,@ `;i snJepp  @#@%a&@&F$}!`WR0FL`N`/@ݐ`)@ڀـ @࠽Gj02sT՝0" HZ&3j0" %:&@)H&1%@" :\ R7肕0~ʿ IꠄOJ@GLـk@B@ߠ9w"pϖ|U5v`a#g`ve ˦!rT$~%4e&%# !2QzCp رn_e" ހe@G͚@ڀ۫Y ?fI6Xh0 f@bl z# z%@}[&&̳$6"H0W?YhzHm 7l`=(۷W.@6A݀@@a# P/̔@}l|"3$+& S&V%=# @qR\okJ U0@@Ml`'`ހzreK܀zB@2 -p]x@'2Ѐ @4` m[!U!$%ff&%!$zZ!``iз u1Heб @1BL@e@lـzfހT6)}mNpxt1  K n@ =#V%S&*&${"`|m4rO n`fbI@?@@)U@`= mn退0(I@jF?  OI{7"$&@[&@y%y#l @(g`C`_ li6$QYϚG9`xfd @zW3 !@#@%2e&2%8T$@t!O`d!64Lp Q@v U@܀w+ـ"LFݠJ@q. j8K `͒U"1%H&:& %"`{ja&@X" `!r2hj@;G<ـ%@5ߠ7}~`Z16`@ W! $Z&a&ܙ%3#@   o X!eзlt:`iۀ,ڀ,gih@+tnO%^ehp <=<Ľ س#e%a&&&@l$!W 0`20@ IL`l@%܀@ـO@fGjV3`usTL]" `YJe'j@"C %@:&H&1%@"3   @h5P9ݶ IL@$@ڀ܀ޓ}v`g#`4,"@f`@!KT$k%1e&@5%#8 !03ypk 8)f(e`^P+@GϚ@@ۀnY@ʛ,6@#xh x%f@!l y#@y%@[&&$6"g`CHRp?` hp5`HJcm`l=@FڀـKڀAas @;`V(cتг e@@7|"g$+&R&V%a=#  nJ 0=0JNGlC'`sIz@wf@'L@;B@2㠲Ѐ8{h2p ܌ M1[!,!$%ff&%@A!$Z!t ) 1Ep4@@1[B߀=L܀epz@-@ (`mN00XK o r <>#V%R&*&@"${"ZŸ@PŌ Xbh\`@ԔAڀ47@=6m*nгH[i`@HD7"ݳ$@&z[&yy%y#@k fV  `h*`6G-+`YdךـGz܀o@4[f\2 w@z`3 !#)%@0e&@E%@_T$!bd@4 ";N5×X!@v@+|ـK`,KတzX7׶ @kJ "1%H&:& %"j`&`X! $hrPv2@i@G@@ @@ &1@`}`gX)!Y$@I&a&%# |W~+o Ce ]0)m`Wsi+ڀ,@+ހ(j t@m)f(p ߀`@ @#@M%a&7&2$@!XO@ 8a@y/o``a䀮@@ۀG5jP2s@\" lY'kɾ"# %:& H&1%@-"w@"P 5t ?@`U(JK@3y[B@, zv`+"?Hc4 "e)W!T$X%@)e&@%#v !2 z`p qe` WhހNG̚ـڀYހoص7$00im ฉ fk z#y%[&&$ 7"H 5@ Jiح;H@ml@<9@d@@ڀA Mͦ[c 2p> R@BX|"@E$ +&S&@V%=#. r #o-J @~0೟ Nl`'栽@z@}@ekLA >2S sКV(`g2 |;ĖZ!k!$%ff&@%@!$Z!@Nhp 51j$|t@UP`p1A@K@e@jـzۀޠ8`(怴mнNʂ0zWK @8p!`G@0 >#W%S&@ +&@$y{"N: %bʦI `i@PA@@@e f=`lmpfINi09@~I 7"@$&@[&y%@y#@k fE (g806@` @Y՚@GPj !`XRfp0 #z3x !#L%3e&X%#T$U!@'d`|"xZ_4ە!`wv)@߀n@5t3ـ5L K 8 m x@G8 @&` ˓&+#1%$H&:& %@E"Vj '@iYX" X @r22j 0F4V܀dঐ`0D#V%@S&+&@$@{"`4`bPp tlaR!`ஔA @.ڀ= l`_nN Jjxj @V Jjb7"$&w[&ky%y#zk `f"e thR6( `lYӚـG%-`@l쐘ej-0 @y33: !J#o%@1e&k%@JT$!e" v4S ?"v`Oy$L-`SK߶=T27 ``w"1%H&:& %x"ib'@LY0} 'Pqs0;2jꀪE@ǃ݀ۀ@`& E`^0Jp60r` WH!m$R&a&@%@׳#½ :`Z@,n 8Ze Klse`ieۀ+ڀ@,Qj`'s쀻l%e.@q `!`@ #%a&Y&$!6W _9/Viy4߀܀$ڀ7 >G`kj 2phtNWP" Y!(@.k@" %:&H&@/1%"`S ё 63* S &`J္@!L@@eW`vd1#O.5# e`R@v!@9T$%@-e&@%#@U !T3 y p `ޞf` i`GϚـ@@SY `6ppiP G`*gl Lz#y%[&&$@6"Ѵ@LI?C i`m`$I ink?=@Tـ)@PڀmA r ``H crS @7*~|"$+&R&V%@=#  ` mI >0t`bMwl`m' R@zvـ fڀL@B1`v0ؐ6iXy10 `U[!!$D%ff&@%T!$Z!ԕ 0] #20 7)@2xB@pK@eqz 'lMv1@poJ `oUT &>#@V% S&@+&2${"{`Ȕ+@ҋ x0a ` @-9ܷݠ=9l@mJ@i`t@`I@!+7"ͳ$&n[&y%z#k f0 h`eE6`^]UYހګۀvҚـGgޠІ`Gce$`@? GTz@2 !#@%4e&N%qT$5!>d@d@"rv2h0!Cvx@˅j@ــHL@ݠ KဇLpοhhV7p `= "1%H&@:& %"0j &`DZ 0hs2iF@@ ـ@ ``ֵ@/lPP`pUeW@!H$l&a&%#a `ao 8{^e(>ls 8i ۀ+ڀ@2,@ޠjtime@q `@ y#A%@a&?&D$!V`y@K@>D`Fб/ФՐ @$߀@@ ` F@k1s$|ޝp&" 9Y` 'j4"@ %:&H&@M1%D"``3`A`n 6謖 ¿ Aꀞ KELۀ@mЅ$@ 3x@"ז^5Pi#n|eЦ!T$%/e&%#@ ! 2^y@1` hXWeمC@yG̚ـzAZ` , h됇Q6(j@8 ``f m z#y%}[&&@ɳ$6"H@PO?pctPhqH@m 1l<Q%@۷@09A`#c4,`ދ 0 ѕӹ`7{"$+&R&V%@=#M @kV CncJ }0Lk'` zp@reKB24eH:#02 DZ!X!$/%ff&@%}!$[! "@y  ϒ Ț2)؄|`2vAK܀eڀu@z Y(态lЉNЀJ2@!K n`  @=#V%@S&*&${"g,0G 3]b|i@@@Eـ =k@m@pWJ(i$@ `5Jش6"$ &t[&y%@Gz#k `"g,`{ dixH6렰`@MY:ۀКG<܀ހr fem@ `z2 !#{%2e&a%T$@ܥ!``d"hd3``"YvO܀A,@LJJ @ ya s6T @Ԓ"@1% H&:& %@]"`vj[& Xf! 42s3biXF7@@@oڀ@ ky耆0F/f _@ >W!"$&a&%0# Do YeЯls@4iE@+ڀـ,@Ӥ`iX2tn)fX??q `DS wi M#g%a&P&i$"! W0_6*0AF@6@g!܀ڀـF ۀSݠlGj^3}se" YQk'Sk"@E %@:&H&k1%".n@ _5%0`J'@Lۀ@ـ߀`wK"`485P$"e!T$m%1e&3%@#@4 !*3y`c /ekV`J@& GΚSۀZޠO ћH5^i p,Vgl dz#@y%x[&&$E6"bIKp?@`h@^ HB@dl`l=DـL@Afy@C^ch k|;|"$+&R&V%]=#  mI H01@5p&M=k (`*E@2z@x@eڀ*L?B@_3׀P2 ۋ`S@[!/!$@%ff&%>!$Z!`o`` ! 3`2A@Keoـz˨ (@lN`6F72J n`@  =#V%R&@*&@${"  Ȭtb`T@`ϔAڀP@ـ@ =fl1n@/ IdPip@@'I@H6"$&k[&wy%z#=l `e\ ثhWP4" & Y@ۀӚG}@u`;c0f@[ tz`3 !#e%@0e&C%T$! @\d,`!#833PpP!@w@ҘU@\ــ[L݀1Kබ# ,e6߶ j@&@d"1%H&@:& %"j &@zX! _~rn2 iꀯF~߃@@Sڀ@O߀@,`/^paW!$u&a&2%# `]`Fp ;~e& !mPs``iP|@+ڀـ,ۀ/-jt@mp fp @ '@* @ #N%@a&a&@0$[!`YW`I `>xq/p􀭑 R1@$ @݀G n%J "1`M@k't@~Wz~eK@B3`J`mPd30 |Aɖ@[!n!$%ff&% $VZ!1`ap P-1DPlM Jj1AK܀ej@{@=(怸lM>189J @.o@`M >#V%R&*&$@u{"@Q@/ %Ocp@GLA@"ـgڀk=`lmnI`WicA@I෵7"$&@q[&@y%@.z#@~l (f@ = #iO5`f@.Y%ۀњ@GS܀ Zfy謚@ )zN4| ! #@N%@3e&V%@ T$P!a d@pt"}V4 ӕ!@ bw U@k@35@Lh@K^`갴 سx7`k .~2"1%%H&:& %ľ"k'@KXP" 8؜r1@+jGsــ6@Z܀i@00Z0Ea1)@<@fW@e!$d&a&@ %#~ p Ȳyd sl@s`\i=,ڀ+Tۀޠi`jt4meh`Zp } m d#@6%@a&r&$!`Vz0r0O_D~.ڴ  CNڀY @p?Fk3 t x ! 2[`' j"@ %:&H&1%[" Ahsp˶ P6@p``lJ K`0@a w`"8%5t5#D ld`!T$w%0e&a%#@ ! 92y@b`G 8eO  G͚/Y`x`>@SG7li `@gHl }z#@y%{[&&$6"I@?0hI@(m适k<@h@ڀǷـRـ!!A @}@xbpь `W|"{$"+&@R&V%=#l xunPJ N0PN` l'@}zzـe@K܀aB2 X&3@T |@U[!!$%ff&% $Z!Eɋ v0ahޏ14B߀Kem@zۀOޠ 0(UmUNu8E1 J `n`@ Y>#V%S&*&${"l`]T \ܕb@J`Z@@ ــڀ݀=im@fnU`!J@s j@C@]` J of7"@$&w[&y%@y#@l yf ^ i5PښBhYL@ԚG@(``G@i gP(d@w @y 4 !#7%@1e&i%S$@! ep!4K6"{@u蠦ד߀N%ـnL@1݀XK pE* :`7 ঒`S"p1%3H&@:& %"j\'J X0! PLH?rP1jF@ Ã݀ۀb@*܀@L@TpR?0 `ݲÓ`WL!p$~&a&%@E# i`C$+q x*Qepl tH hȤf+ڀ++ۀO@Wj@D@tlMafo   @8#%a&@-&$!1Wݒ0p_L1/`Nss\@@܀"ـ7 :ݠgFpk@+3ptW-P{! @Z#(j"@6 %:&@H&y1%@"N`@Ґ 6l+K J@*L@܀i]w@l9#pX5#d@!T$@%-e&@>%# !2@y`` )Ed`b@'@C4GϚڀۀYޠ,@7xi N0gl @Oz#y%@[&&$6"˴ FIy ?id0CJ`a@mk:=@ѷGـRqA`FQ䀄 `(rbP{ p<S @"|"Y$6+&S&V%=#@] @ nI /0lpZMolg'L@z@v@ fڀKBn2 }@2@ s`[!!$%ff&% $@6Z!@ϕ@1u 0ڙ4Q"?1tBK܀eڀq@@z@'@lOp20ВwJ yp\@ )>#@V%R&*&${" +@ p xcЖ@Aـw`=m@nIeh |@ H޵@7")$@&@n[&y%z#k `e@ $ h\8=6s@P@O@Yހ@uҚـGڀ܀,P .Țf'-pP& Cnyx4@:!"#!%@4e&%@ T$1!@9d\8"Xj4Ö "`@Ju @=@%ڀpـKۀKS0 –-6 hD`) P"R1%@H&:& %" k% &Y" rС2iF`T݀a@@t@޵/am ]`JX@!J$B&a&@%#  {p HCdUms @3i(+ڀ@+jۀ j`tn}exp  @c #@%a&&$!Vs@P6_v=P/0µ͐@@h@ڀـeF@j3ps4 W# WZ &j" %@:&G&@K1%@"@?>@49 6qpm: xJKـ+H@͔ Tv `"f5HPq#@vdԦ!xT$@Q%*e&T%# !2Xy)`+ Hr:Ne `vGњD@EZe`u0(7 1j`@ @gkl !z#y%[&&Ƴ$!7" \`H@`a@[Gh@iH@l +l~=#ڀڷ;ـ@A &逸#@H  O MoK D{/0Nk'ڧ izـr@eZL܀Bߠ2.`ImpQHf3 Kiu[![!$%ff&%!$ [!X`\@ǒ 60 X|0Đ`1BKek {n_|'栏n됭O0*S0`K)K p@  =#V%S&*&$@|" a%Pz l+DUb @ɤuc`5dAڀ'ـ@Y@=@l@m8I`8iP`'A{H @7"@$&t[&y%@y#k Mf@4P @fԢ6 Y@Y7@@КG ⠌瀡h#fP `@y@*4 !#C%@2e&/%2T$l!d@"X4;`#3uzY?@v-LۀNJ`5@@? I8P ` "@1%8H&:& %ܾ"`qjU&@`YP6 <p*s@0[i`RF堛-@ۀـ)D?`C jN/:b`/`X@j!@%$1&a&%@#@ @>0p e m@r D瀀i@P+ڀ@+Aۀoiu :tn_XoeG %p KZn ߳#%a&$&$@! W঒@ _~!06` ?@ @˨@I @WݠrG@kpf3sepn0" Y]J(`Xk" %:&@H&@i1%r"`} @pڵ 6P```жFK @Kۀz@@`v蠥0S"4=#Ad@@!QT$@>%,e&%@# !]2`y@[ cU8e`OC‾GڀӚڀ Z U <7p40i0 `3@\g*l y#py%@[&@&@$X7"ऴ6HC?hUH 'Um`l=A@0cA݀䠹Jfpb<pč t @>|"$=+&R&V%@N>#9  npI /,M9l ( %@"ހzneLBߠ1@ ߀0 H2 @`9[!2!$%ff&%;!$F[!p8 ح00~ 1RB@K@eڀo@D{`#'@)n=O>$/(`K o`@@| =#V%S&*&$J|"@P۷ 4 a@X6@ {@݀2@t=ll`1o7`I x k  @ .`IL7"$&y[&y%y#j e`H`@ 8sg5栥X_@@ΚـGހ`/ CЌe:,Pc z3 !#-%@5e&B%YT$@!`@܀ڀ%C@YA֕ *V ݦ:btu O 0b@ |"@$@0+&R&@V%@>#| fo@J 0m0 pM@l렐'`o[@Uzk@@frL@BߠI2 QtlHx2@ z`ϖZ! !$;%ff&%d!$@RZ!@+Yk $17k0d F`C@02PAKe@sـ{@`s)mNȟ0ZgK 5o/@S9 =#@V%S&*&@?$|"2 @?p b ;@C@݀@>@طڀ?o=l@n@vI0jI@I @7"$@&q[&@y%@+z#0k "f` ` gPt6 y`*Y@ڀ̚@H܀sd@Pcf(`P {3@ !#%@3e&@U%T$!\`cN!t,N4` @ iv@@݅܀1ڀـ\Lۀ݀5J$`%ꐼ`~ @W`X8 5@ד@"1%%H&:&@ %C"`i'&`oZ ! Нr1@$j`Gـ]ߠ`ȑ@/Ma9-%'X!@9$f&a& %@#ټ ``̀kn zdklr@@Wi ۀ,ڀ*,ۀ`"i‐`zu hFxG@!m(mET$%,e&%@#L !`2`z0 !xZe [ ?@GڀϚ@@ Z2` `6`2hGE@mk <ڀetA 1Xl{b: PAY{"$Y+&R&V%=# `:l@I _1cRMkmC(G@AzfLhC߀t2砠ŏ3 ̎5[!!$G%ff&@% $2Z!3m 2Wҙ[0@:1oBK@+f{z@`)`l O30`PZI ^nN @=#`W% S&%+&@-${"`q  ci@@8&@]:<mo@I4Lj@`H+6"@,$@&|[&y%y# k 'eg  h.T50NHY@qךGm1 ʇ@Wg5HP  `@bz3>!#\%*e&@{%lT$-!3feU 5D2}!(w`oO@fڀ~@>@KIt[0޿p 0ؘ8 o@D`/@"1%CH&:&@ %@""`j`( X " 0qi0i E`Oـ Gڀw5ߠn`ޏ@P/aYkrOX!@M$o&a&;%#X @l}Po :*e`.l`t젴`g@h%ۀ+ڀـ+ޠj@sym:@$ghp @ #%a&@=&!$!vW3 @@3`40nࢎ`|܀@ ـ9 ۀ``Fk갬10rL! `IY`@' k" %:&@'H&1%@=" 8% ૷ 87 e03q`@J@]@K@-ڀօ@-ߠ@x"P6>!@d`@ئ!T$%.e&%;#@ !2*{0 xd@|GȚـ @IZ@`Rqyh8"9jp$ `gm @$z#@y%[&&$6"V I??0qih7@aH@m %l <@ ـY@AA U#@ b  ݖAi{"$K+&R&~V%>#C @3"m SJ < s/ppM m`(ހfz@e@]L܀(C`$2 %60Sȸl4n3y cZ!^!$2%ff& %@? $nZ!@SU@ 2|Ksv󠄀`o /mA߀%KCfڀkـzrޠ I)n렙N`[0 #pH p, w>#DW%+S&*&$|"B6 "~c`ץ@e6`0@@ڀCـ@(;@ln@IH`ZjP@ H6"$@ &@[&y%y#Nk @ye@ SiH~5` 렣`Yހ՚ـG@B@@lZg}P @{@h3!@g#%(e&@%S$h!`epe ^S3x2!Z w`@@}@g|@L@J@n @p 8= @ے d@"@1%9H&:&8 %U"i v%@ vX~" cq`0Rj LF倖*݀ ـ+ڀGDߠ}pMW/a`X@n!($^&a&@T%G# 8}o xclt`g@N ,ـ ,sۤ`ie9sPmf@-p `S Qҽ @S#j%@a&@N&@G$!Wp`0.@8*@@,@[`UH倫lP>1tnv" [@[w'`]k" %:&0H&1%@o"@% w0ҵ N5P@ʶ J@K!ـ@@ w`["x8)6rp  `Hd!T$%0e&@0%f# !3 { 2 L d:G =@ހGɚـZޠ P E8 =i0  bgl y#y%[&@&@3$6"`I;z=i MH`Gnj@=@@@Nڀ Ap+&@R&V%J>#@ @ mJ 8\-K1l (c=z@e0L@B@1@~ AH20 `} "Z!5!$@%ff&%h $@Z! 3Ěp@D0ARKe@oـz@9`֨ (0n)NО/rH o G>#@(W%@$S&@*&$F|"`P |a'E` vA@@ڀ݀e>rl?nKCxiA6I 7"$&[&1y%@y#k eA`p iHH5` X@ӚG@܀ހ`?s(fpCP) @{3@ !<#%:e&%@S$@!`f@ `"x3h@d"`w@@ml`L݀J`ö@' T 7@ @ @k"@1%0H&:&Y %"j%`l@X" PXmrF1jDt@_݀@@@Rߠ )$x@1``` WU!@$&a&@%t#׽ x@A~m (*!NdqmRu@h@w",ڀ@u, ui rlL1fo @`2 &#R%a&@_&l$@S!`V@pa&h`/`Vz `}IK-% G Gl2Bt`u" Z@"'k]" %@:&@:H&91%"`iF 5h(P w@baI@݀Ky܀ߠ=@w20$􀉙 58"cy@!T$%2e&Է%@# !@n3 z (_xe `@FހE@H˚ـڀۀYi반 7Ii> 4gl y#y%[&@&V$7"`H=`>cjII@@n "k`U=@/݀ـB@` 0]ϥK8uc~ jT }"L$@1+&S&'V%=# 3 `m:K h,b-njLl@'୧vހz@ـ~AfLC`3h b~@x#B2Փ !Ԗ[! !$@%ff&% $@Z!:JC w3sט0c\>M`0A߀~K@esــcz ဖ(`mM(l1H JJ =o ,> ># W%S& +&@$||"G` `! hp_+/EA@ڀ ـ ـkڀ@!>lm@@J .hijA@I@µ7"$&[&@Ky%0twhH@I@mvk䀙=@a@ƷqAݠF```a H`e< కk@|"*$$+& S&DV%<# j`fnK hx.0L`l' zۀz@)fڀKC@2 }@Qș 2Pd *^[! $%ff&% $@"[!;@ h1PΏ`0+B@Kev@@>zۀA<(dm됁O@fV1!L n@3@M >#V%S&@*&]$@|"@ @M ( !``@xAd,ـMڀݠ6?um{m`=1Jh@)@@l8Iym7"$&@[&ey%ky#l mf?0X غj|6P样`Y@GڀϚـGڀs TQhp  z |2!#@t%@6e&g%BT$!c@8cp!X2:`! ]`v@s߀@ąڀx@NـLPbK@U;  6| @ #u1%H&:& %"j$;Y@# Xs#2@iEۀ֨܀"`ZQ2_ѱѓ&W!u$@&a&@!%ͳ#U (6n xbktQ h@X+ڀK,Xޠh`Qtm^?e_s @/ @U ͳ#@!%a&*&$! 'W ғPұ@ b@@->Ro~|@ר@ـۀɄkPG~kR4Ws$$ # Y1v&k": %@:&H&@u1%"ޑ༑`@/ 0U4`< U @I@9eKۀـІ@rߠv{J#4#e@!AT$g%,e&%#@H !|2z  uQ(en{T:܀]GڀϚGZ@76Yh ]mf@Zm A{#y%@v[&&@$n7"yyG`k`>*`hS2Je@|mk=Ϸe@xA@@adtP 0L|"$+&R&@`V%<#@ 4`nI @p.`[JM^kw&`B@>zۀvfL܀lC z2`͏O1 Œi:R\!!$%ff&% $@^[!@@& p 2əRPA 41kBK@0e@gz p@'lO<^0K en@j  >#@V% S&*&@$z"@@P |`@b@A@7@@/ڀ]݀>!m o`I@=vhp@J67"@z$&|[&@y%y#Rl "e`{p hK0Y7c;`B`‚Yހۀrڀ͚Gp@5`@/_XgZ>W Rhz-2C!#]%4e&%S$@Q! c@N("X2Qu!@ "w7܀ޅ@~@?K L`z@a >60 w@K`5"W1%H&:& %"j`%@X R$ }s2iE@݀ـIz@` h922@aakyTX!P$@p&na&:%@# Ho P2>Sc{P&l ir@(i@"@+ڀ6,pۀLހh@u찁md@r ŀ`` #%a&<&@݄$!`qW2@BpbH,pg.􀾐@߀ڀ ـn@ݠ$Fk35udTg# @QY!& k@¿" %:&&H&@1%9"52 *U 4-\0`,k@;J@pKـم1Ibv/ "!D4P#vf@ܦ!@T$T%%e&%8# !@<1Jy%  lf ل`@x@tG@њـۀMZk X@(k6X(Bjt `g@m {#@y%[&&$7"µG7?ПgxiJ`m l`<ٷ@ZDA@ / 4podt NF{|"$ +&R&|V%#=#? `,`>oJJ x3vj/џMi&  czۀs@eڀ`L-C *2+`X`[pb֘8w3` `Z t\!a!$3%ff&% !$@[!M| %0B8b~h砄1@B@"KHe@kzv%᠉' n됡NŠZd08 M m` 2@ z>#V%S&*&$@z"@Uj DLaϥg@~`+AB+`>@ln逋0IIg0@ HJX8"@ $@&d[&y%y#@l seۈ> xJi7@ OYΪۀ%@՚G@E܀E@bg3p @` zm3@!@#G%@z0L`BL"vP ،(8  @"81% H&@:& %@R"@kp% nX% xPCt3KjFF`(@&(ۀـ-J܀H|䀘࠶81,&a@` Xr!*$@_&qa&֙%D#@Ծ 2Po bcl`r uiХK@+ڀ",FۀހOk @QuPmpaMd8zr [W@ֽ V#%a&M&$6!BV``z `N.% `1$䀰#܀@@_`ࠢF倲l v3@t" Xk 0)`bk" %;&H&1%k"y ɵ F5覔p öJ@@K@ڀ@:`@v` c"3H{K%#f!@S$A%&e&.%c# !1w@y l X0Dft*6ހG@ӚڀZ (L(N80i Agg@l @z#y%[&&$6"`*H5Ц?0}gPH@@n`sl =@Oـ @Aݠu`Dwhc` @@ kF|"$?+&R&V%@S=#@ 5@oJ z/Gp*N#j@*'`^9@z@oـe3LB1`.]03O `'[!@8!$%ff&@%5!$@[! @ 0U0&~@1BNK܀aeoz@=ޠۨ 0'7n1NO Q2`M @o  J>#V%$S&@*&$4{"@y P ao` A@N@$@j>xl7pFH`L i@?<K 7"$&j[&y%@y#k e`U (bg=xF8@E@ @Z@8@ӚـGڀ <]{f LPl  y@3 !?#@0%@:e&?%S$! Hd` #3A\" u ߀܀ڀ!@cLݠKɶ@07 @ ~k#1%0H&:& %"i%@e`X wDot>1hFo@M݀J)#U-I1Ш` `W9!$&ua&%q#ҽ  r T.p !Edi m(q`fi t+ڀ ,ۀԥ@k tl#~V%S&+&$j{"JޖG0Ɗ b 7)UAAڀYٷـ &>$loJ qip>?@`WKǵ7"ij$&@p[&y%$z#k f gP 8zqS!Y@ۀKڀњGڀ@|ހ7⠸ @tfF9C ,@*{2 !#%8e&R%T$!d >!<4P"[vCօ-@ـ@LsK@q4ꀘ`d 87 @1@%`:9#@1%@'H&@:& %" Bj&@ JYо  .u`1iF݀l@@ ـڀ܀ @0֙ b82 vW!߄$&ya&%# @P[n Hd;k q@j@+ڀa,@jt-lȂ'h`q  z@~ ߴ#;%a&o&M$h!`Ve"6_\/ߏ `5܀ـ` @OE k04s " `X(j'" %:&G&U1%"/Epd 660 @YtK@݀K@ـ~@:@@(w }!?5j$U2gU!kT$@{%*e&@\%@#@ !(2`xK 6Xuep@ `@@EGךq@Y` Z@k`7Ph@ g`bhVl z#z%@[&&x$@6" ,H`PQ>`VnhhG@`om䠔=]@-ڀ8ـAݠKЍ(c  `෕@vq{"$$+&@R&V%=# x ^n[I 0`4L@j'ဋ@z@g+fڀKoB2@4HHZљ(2Pl !@ b[!!$^%@ff&%!$Y!`5໌ଐ 1GsƏ@`t2@@K܀ev@ {ۀ G@C(@kmQMc3$)L @n ` =#V%S&+&$z" F; ,|b @:uAe@зـ@ =`kso頔0:J88h1Ar J~q7"$-&u[&y%Sz# l @hfVP Rh4P୛`2\YހD@^ڀϚ@EH܀> [瀊e&} `z2@L !#v%6e&e%?T$¤!`1cp!410 Uv @%@HـOL<hKط@D66 `@ ;#@w1%H&:&8 %@"j q&+W3 PT@Ps2 |iKG@@ـhڀ@a}EX0 b0@ٓ+W@!x$&@}a&%ʳ# #@/`(n 7ekq`Kh#@ۀ+ڀM,@\gj +@)v`k g8!"q `Y ##%@a&@&s$!!W`@˓T]@H05KT`&Ԩڀ@@> VGkZ40`s\y# W9@/(`j"= %:&G&s1%@" ٴ X60 @I@5@L@҆ڀ @w=v  !A4`#fg! U$@h%,e&r%# ! w2x= hmepfN [G@ϚIdYޠ<@@6j `F`hl @Yz#y%[&&$@S6"t@3Ie>0h0K`G`6@k`pm<@݀K@ـfـ|A@`'8d O@{"@ $+&R&V%<# . nI PN1pBMVk 7(Ħ@;zZwـfK/B2 ʁ ֏ž(1  p?&[!!$I%ff&@% $)Z! $0 p/$8` 2%A߀Keڀz@@{`u'mLK3pK `mn\0 =#@V%S&*&($z"`g@` lb}@Z@@ڀ6@@d='mo'IELhлP@@J6:7"$&^[&z%y#Ml ft@ hB 4[ @nXk@q@ךـ.Hs܀9@!%e[8_ Zoz 32 !#@_%4e&x%fT$! )cF "@$,/5m!`w߀3܀b@@L@Kကi!0 X@G6¶ W R"1%@DH&:&X %"j&`W }us@2@iG @ـ!@۩@~܀>@z` ѴA2ʧa0r`V!$q&a&@8%#@  x@o e Plar젧"i_ۀ+ڀ@8,ڀ@ kums5g0p @~ @t@ @# %a&@&$! lW_1]#^.ඐ`p@i@@ ـ;ـ ݀F!k`3r\o# ['Kj@"@ %:&G&@1%@9"``ؓ"`M '7`#@e6Jl:Lـ݅܀6@Nx7  *6P# }f!T$@U%.e&%5#H !2 Dy 8*(dp૆砝@;܀rG@њڀ)Y q `_怋s6n-Jj } `@gk +z#y%[&&@$@6"I/?B`iPH `k l<@iڀط[ـڀHA@ ;๦ wd@@) V@ȺK|"$@ +&R& W%=#: `:  m`G 1qMk(@azk@seڀK܀A 32_pc3 a Z!@4"$5%ff&% !$eZ!ϖH{ x0I:f@[~`A~1dA@Lekq{z +'栞l됩N0Π2040BK n =#V%S&*&@J$z" O`bP& 4vhmcǥ`*@œ@ـڀ2Y=~n䠯npQI0\hF%@`NJ@7"@´$@&@d[&y%y#l @ g@Ԉ6 Ai(3`cIXڀ՚H@H`⠠xkg24莚 `{`5 !m#H%2e&%S$7!tc@"F5(!+u^v@}ڀ1@L݀GL@(꠲`X l5 N @m@"1%:H&:&x %N"@k`' gXp q2DjG`#@"@N@M`'䀟 ]1zp'aP1@%@VW!$`&a&P%A#M - `0o P*flrgk@@ ,ڀ@#,I@TkrXupm@yNf1=p b^ $۽ ;#@n%a&K&$!`W r A^ .P"*@ ì.@ @T`F`j}3t, " @[r'j"@ %@:&@G&@1%@k" y@ 07t꠽~J@݀^L@܀`8w k"0j:6*#* "f@!U$@B%0e&@%`# !`3yq! ;(~dpl9` `xހ@Gڀɚ@@«@X@% ` $TV8Ti @Gmgk z#y%@[&&.$@5"`I -?зiXH@Hl`ml=OـjAۖ`D Lctೌ @q`@J|"s$*&@R&@&W%P=#| `  m kH (@2p"N@#l`(X@z|ـo@eTK@Au3 R23W  -Z! "$@ %ff&%b $Z!  0n{0َ`~ 1A-L@en@L{@AހY(`8l9NWY2`J @q @ M>#V%R&@*&$0{" @zPH \a5 @ Aڀ o>`*nMn@N +KWl0AC I6"$&j[&@y%y#k \g4 y i05Њ3렾怕@X@@ڀӚ@Hڀ@ޠ CNAf { @ {4 !B#1%0e&>%S$r!Bd `#`!6 9S"`u`܀@l"eLK϶`pC8 hV5ٵ  @>)o#@N2%1H&:& %"Xk r'gX@ ,o00 p071jFjWۀ@ `> 9P5Q1t0``MV=!Ņ$@O&a&@i%n# @}kL%p (Af m@2s_5h‧q,ڀـ, @ޠk`tn8(Cf8o ` #U%a&@&%$@K!X `^, `q@@D)@ˬ @ ۀ- QF@Yj3@Stdk|@" \  .'@i^"@ %:&H&41%"_Ւ 6 8<g@ VVILــ@w` !@:P5h@$@e!\U$%@2e&%#@ ! c3y dp@@;‶@?G@˚@@bXހ⠩7:;Zi C  gRk @z#@y%[&@&Q$@5" ޴`|H @-RjQpF|`l kK=%ڀ@DـJ@@@k Xc*> @#@`#}"$*&S&@V%=#m `'  mH XS0 ^pNl}' Ozۀ7ـEfڀ LB%3u砋Ðp2 [ߖ[!@!$@ %ff&@]% $@Y!`j L@r 1,`K/? 2A߀ZLe@_&{ۀ@@(mM1CZJ @pq9 7H >#V%@R&+&@$@f{"= ޒཊ Da &`#P=A@ـڷp+> mm`J0?kЯzAI[7"{$&o[&Gy%6y#@k `g@@ g0Hx4r@jL@YހJڀњ@G܀@ T|fA0K 40{e4@ !#@%/e&@%T$@!` `de 6!0x6 "Uv=ߒ߀Ӆ+rBL`Kw :@0 @7pe ` ,@=#02%'H&:& %"k'@BY0! zp1iF~݀ ـ`@͐pP0n:`F8X!@$@>&a&@%#@̼ `@~p Аd(|Prms h@@+ڀ+ۀ`j⠺ t@pW0hBq ` #@=%@a&@&J$!JX`VR-_Žf-n@0߀tFҬــb SGi2s`" g\ (zi@+"@_ %:&@H&R1%"`J)Lhp 8(``ֿS``IK@@h@= /w#H–6H5<r$ \`le@Y!5U$|%*e&%@# !3x@D PcpP @@j܀CGÚ@:ۀYNU됮Pi7 hk mf[l z#y%|[&@&@u$@6"&H@}@pxj8_G` mjk6#W%R&*&@${"@B0~@3 |sb y k@݀ڀ@Q=m䠉mtpBJek9` AyEIu7"W$&u[&by%dy#j g@O IhLx4Pڙ-WY]ϚG{`}a`f( `z`4@!#%-e&@%@B3@^ #$%a&&@p$! X@`±_0-P@Ca@s߀Ҩڀڬ@ـ@ фv]Gib4hsy쁞 # @[@@5(`j"@? %:&G&p1%"ґ D4 @0F I݀L@@yM|ߠC@v%4($e m!@U$i%,e&%#? !4 xx @cPtn`1@ZGڀŚ@ڀhYB@=6Ijh  h@l \z#y%w[&&$@O6"omG]@@4hBG`V`}kkz<@܀I@ηـ-ـ A `C` [qb Z@l|"$+&R&V%@=# ( nI H@.PrO`Ok@j&7@zۀYـw@fڀL@4Bߠ2`@# ^Ǜ1A @E@*[!@!$%ff&% $@%Z!@} T 11@ )1!AL@egzޠzံ) mp!O00`S0K p x`@ >#fW%S&*&&${"@b X8bu`~@۔@݀ـd=-m'm/ IXNjB H૶>7"4$&@^[&@x%y#j fm`p @afd:4T-h@Y0o͚Gv>ޠ.(peOxg w vz3K!@#%+e&%cT$@!!@c3 "&5Pe!/ua@0څڀ`ـAK ݀$Ko) 8ʶ  h`A"1%H&:&@ %@"`gi&Z! l0jq`2gG@@@݀ۀـMu܀@ ٴ/ba  zY@!@U$@&a&%#K `pp8o P!^e(jUn@Zr `i[@@++ڀۀ$j@砷so >gPp Ԁ@ @#%a&&؄$@!`XY#`2 ``V. V@j .`H,i030rL @x# ['kľ" %:&G&1%2"& E 4LP@0JQ݀Kۀـs@3ڀˆ; ov> /%26(`#d!T$V%$e&% #@} !@2=y  !ӹXcP@˄ 'oqGڀǚ@ڀUZ`v e@|6gP `g@k @.z#y%@q[&&$6"G`G[A XiHH @k l<܀g׷"QB ŕ@B,d$1 P^@@|"$@ +&R&W%@>#5 {3 /op:J FY/PiMk&ހ^zjsـeIMA߀52Yg఑hs9N3pД z@Z!@g!$%ff&%!$@aZ!Bo t@Ɠ 01XZ`^S~{@y1@`AKejـz~`0\)l0P֠u00`JK ,p@`> @>#JW%S&*&G$|"H@ [ ,a`Y$!@݀@@2ݠ^=@llYI$tj`B H c7"@$@&c[&y%@y#@k `g͈`%v (f|`e5@Ø`D․X@ڀ՚@Gڀ$@ ef` z5!p#@%2e&@*%T$[!o c"893! $u2〢߀@@f@2LJ`.` ꐺ` :8` B"1%@ H&:& %K"i`' Ze" LPq2@AhꠀD`@ـ1ER`-@Pp/\7/a@9 ,Yz!$ &a&ҙ% #@ ' `}o !f(Pnr*ji‗@E@+$,Lۀi`y `u0_of8Ep j)߽ \#p%a&&@$!`8V @8^.ɳ@8`@܀ ـ t݀`hHjЅ3}r<`# [y'`l" %@:&G&@1%d" {p 45$yJဈ@Km@߀v P$C62 #@2[dU@!T$C%&e&@%]# !3y`j[ 2udP"1 )u@ހG@ɚـ@@Zޠ* ל+\h6V;l Nik y#y%[&&@$@6"@H%?pi3мH@`Al`gl=@@l@Bݠ d@ `@rN|"@u$*&R&@V%@>#x  o@J 9L/ߝNl'`̨1zۀ{eڀMB@1`@P>՚3_ `2@Z!@>!$!%ff&%0!$@Z! ˉ7 0ժю~``1〟A߀HK܀eڀnـO{@E @)`Fn@yPP`:b2&J o@  @ @Q>#@.W%%S&@*&i$@;|"`op0@ dya- z@g@݀)ݠ=lTnU`3K]8i.AJ`I`6"$@&i[&@+y%y#k eGq Qg,5P5` XހڀӚـGڀ`@#l@Pd=]  `y`4@ !E#%1e&=%T$!;#W%@S&@*&$p|"Ӕ7 ,ha``କ4@݀@۷ />0lm Jxk A Iѵ6"ɳ$&o[&Ey%z#yj f gR6p/b`yWހޫњGޠB`0\8fzJ ;`7{j4 !#%8e&P%@T$@Ц!dij#&+4v @ Nvՙ$@*ڀq@L@JJ}`A u,9 `h3CD"1%(H&:&@r %"h`&`f[ {@r1 i`.E堬{ @@ @@`@P.PC``YN ? X !$&@a&%y#Ǽ @~Kn x)zds+k@s  j@ߣ@+ڀd,ڀۀp`8i`瀏t|n8hq  a #?%a&@&@H$!@TU`f`V @%_r /Ϗ ,}De @ Y G`k4@s" CZ`( Bl/"a %@:&H&P1%@"E#E`9 T 3p Ͽ@L K@K@jڀ@@x`y`#ʖ7؞z$cre`5!@qT$%*e&%@# !@3Uz< ؇M%hde@` @G@͚ـ=ۀY \P{5Kk+ tmhm @z# z%@}[&@&'$+7"`H`u@E]hX$Imdk=Y@)ķ9,A@頤Lcx$ ʓ`ɹ@{"1$&+&@R&>V%=# `t`V`OnJI p)Z0̞0Jj'`ဃzـ{ـ.f@LxB`2 )Yp I#2p| A`j[!@ $a%ff&%!$Y!࢔@ ے z1`q@`i2@@߀Jeb{ۀޠQ*ymPOs35I n @[ =#W%S&*&@V$|"N7@* kbݤ sh@@ڀ)@ݠ=m䀐m`|JJlnk`B@A Kb6"$/&u[&@`y%@Lz#j \f@( AhH6 @@ԙ'+XxۀϚ@G@GA`0 fQ @ z4U !#@%6e&%U$!dp!>2 `ev '߀܀D@wQL[`rK` lT px39PG “@"@2%H&@:& %"ie&&[s! ,O?s0 2mi`E5 ۀـ@l@܀߀4@Z` i02_pX!}$&|a&%# !~n &eks@>`Rj@@ۀ+ڀP,ۀ4 h@8@'t n˿g3q EI9b ׳#%a&@'&m$!Up_z070ڲ;[ mn@`ڀC ՄIkpj4u`|! Y=`;(k@" %:&H&n1%@"@x ȴ ;4@# @>SKL@ـՆ܀7૘㠻x@b#R=78( $ er!JT$%@,e&%#@ !0z o 0ve06Wh-GϚـڀ@Z`G ` p4Qj` t@hhm _z#@y%w[&&$K6"&IU>ppqfȜGN`gmku<@Gͷh @A݀I`70z\e @ ^`r{"@$\+&R&@ZV%<#@ `@`n`I b=1@B0JHkd& @@zwfڀL8B@2@~pȔϛ4 ،@}җ.[!@!$L%ff&@%!$!Z!  /9`2AJ܀eڀfـz`)mp)O@U\30{I |n@ =#hW%S&*&@x${" ] @ bJ@ה@݀5ـ(ـ@hݠ=3m.m`IVj @`JB7"6$ &z[&zy%y#@j fgt@ h?71/`s@fX@ۀnΚـGy @@00xxe0- i|z@3@P!@#ո%4e&%`T$!`Le 8"h2x wx]A^}ـBLۀ$ݠ)K v 8Ӷ Q@"1%H&:& %"`bi&W! lxaqz2i`E @ׂ@"O@H `` `-p/V_y  dX!$@&a&%#F `N}@0o ğea0lct`砟j@W@ۀ+ڀ@;,x@Yh sЙmFg`pp ۀ``@# #@%a&@8&@Մ$!U S@p*``0M_@܀|ـ=@! ۀݠH/k3Nu /! hY'kǾ" %;&$H&1%/"̓ @< 4lyCyX+JM݀5Lۀ @Ά܀[x@'`"0;6( P#d&!T$%@.e&@%/#@ !+16y v9c0@ń!k܀GњYZޠ 9 0*4[j E  g'm @1z#\z%q[&&@$6"@BI<@1Xf@@H``m l<@܀e@׷OAh@I`ɦ@d9 0f`Ux{"$O+&R&vV%=#@ `m02J f1`kK`k뀽&|\z@ـejL܀A߀3os{V3Й @ !@"\!@j!$8%ff&@%!$]Z!`=;[ 0—QPVfT 3[AK@e@jz @c)@lpNޠ2ЦRK n @D =#@LW%S&*&$z"``0# H\c``Rl@@݀?@@@ـڀ6݀c=n䠮paI{h hB[J`h 7"$&c[&y%y#@dpg8j_i oi@/n z#Bz%[&&ݳ$7"`H0[= Dcg*H`:lj<@܀ڀ@Q!B݀ [`la '`ĸ@C{"@$*&R&@V%I=#" #x@o@L 0/ םKl@'ƨ-ހyۀzـe@=L@B1`FHݚ3`( @]!@"$%ff&%@!$[! ĉ 0; @~`-0A@EKe@nـQ{i` )FlINh0(J @o` `=#V%LS&*&@$@){"Sd7 ;&H&@01%"VɒΒ׳ B3 $`` .LKـ@@rT`w p 0Q$@K5"@`d!@T$%2e&@%^#@ !90 x  HeAg0}젦`HԚ*g@ [``7Rk `R ۊ'g@l y#y%@[&&L$6"Ӵ/JP?pwe@F@m`nl䀛>@$ O@A>`p0l|cPP P`1&`0|"V$5+&S&@V%@m># w mK H t2PJ@tj`%栘Fz@lHfLC 13`b砚Ӑd4 h[!!$@%ff&% $Z!ו@=ࠔ .N8A;:2CJte^,{ޠ(&@m@P J1hkJ @\oGC $>#W%S&+&$l|"̔P Md;"dF6A@@W۷ ڀݠ4> moPJk`A@`Iֵ6"˳$@&o[&Cy%z#k @f@0 g68J6bg?V @WN@GڀۚG@ @dhS` Cdy@p4!#%/e&N%T$̦!d@b&!Xw0#4Pж"bt`2ͅ@Lۀ`K D J }Op9ķ p+HG"1%@YH&:&p %@"`3j &@2Y rTr1j`Fiـ2܀ߠ 0`0PbPaNE`X,!$@&a&%v#@ü +@~0p dhsxh@ @1,ڀ@,զ`j rEl tc0Эq `` #@%a&&$|!V `@OB_x/@ȏx܀@@ Fm4Av P X( Gl2"d %:&H&N1%"@@r?1 @6, `EࡵKK;/܀ߠ Uh0I``l^k =Sـ:@ڀB 退ﰦ,` J`ɗϹ z"$k+&R&K@8"\$0&[&@y%4{#j @d ! 8h6͙ OY@<@КG܀ހ o@0PfQ@8 `z2Y !#%7e&%oS$ޥ!@`d` \X.62 > v@BvRـ#LۀHݠJt ] ;X6 M]#@2%H&@:&2 %"i@$`tWk! GP7sp/fi@E@n܀`:up ^.Ndp%;W!@„$&|a&%޲# @n bHДk s7 hހ+ڀـQ,ڀiޠh>.t@nbe:n 3 ` @#(%~a&|&k$!@U z_@2Ѳ T@gi߀@^KـE ؄`iG@kPB20ysx # Y N&@j@" %(;&@G&0%"@@r@@ 34 NK[K@ـQ@@ߠxj#N40! f@'!LT$@l%5e&n%# !@0x% Sܕ0h.P@a@>)GΚ@%ۀZL͛78Z0j @|f#l xy#yz%[&@&@߲$^7"`e@JPt<hf1G `m`^mp<܀ͷiA`O >p8bĮ @ax |"@$+&S&V%@># x @l`L 41p0J@k]&栴@3zxfL@~C2@`؛4  `P2[! $%ff&% $M[!`r  @ǎ /Aۍ@ 2AJe@f@zޠ @)!o`1O]0pI `n q  @=#V%S&@ +&@!$z"@, >ep  Ҕ@{n@)k?9m&o@Ip_8jP*@#H`EF7"$!&@z[&xy%@y#@l `fE  0Pf4C6nbXހ@mךـ3H@|F@7@@g`5 p\|3T!@#d%@+e&t%^T$!@Fe0"d`50 `!u8X)@ڀLۀ(.K`@ (80) g M`"@1%FH&:& %"j&yU sr2@kꠏGӂ݀ۀ@#RڀL@ (5[2жap``iX@!Z$u&a&3%#B ya0(o (o*eȴiKr g ހZ,ڀـ,ڀ{ۀ]+j@um ?Og!p @  ' #@%@a&@7&҄$@! \W@ ] 0@^[[@>@xݠfH@3m4Vu(pЈ# `pY'kѿ"$ %:&$H&1%+"@  7p= ꠒ&J`3LۀY@@҆܀ߠbx.0 L6P# `f@,!T$%.e&%,#t !2 { nJf0 .ހmG@ǚ+6Y?@088djPM @g+m 4z#y%[&&$~6" =G?P~Fi E`dm@l`>@cـ@YB݀0@P@HdtP n!Z|"$P+&R&tV%=#, o@ l*J XH/Mm}(栆ހy@htـeKA@3`&v0Hl_3c @'\!@m!$9%ff&%0 $XZ!75`e`w _2| 0 ND~Mm1@BK;fڀ}ـBy{; '`lЉLn2XM ;p@ J @=#NW%.S&@*&${"`< `P  `B@䀶?ڀ?ـ@=@h=np@PKI h_>`aJm@&8"$&[&@y%@x#7k `\e࿈@ p(iLT5`y``9@Yހ@ڀߚH*B \`@(iM `{ 3 !v#%#V%S&:+& $%{"`}@ڶ a D_ @逻 @@J@ـݠ}>lbn=HH` j>? Y IH೴@6"@$@P&h[&'y%y#l Kg @CH @gL(5`ޚ`XԚHڀ&@`0z@ gqn0Q @ `{}53@ !r#6%@1e&%@S$e!`0 bbp"Q6 auۗ@ړ@ k@r@mLۀ L@'Q @67@   8@v#T2%@cH&:& %|"Jk_'@R`V`y t@Dr1l=H`>@A@@( > PM k1``”`WJ!$S&@a&d%@# @W5p p x^uf0j` qy@%hˤހhۀ,ڀ|,ڀ)@ހi`*u0lw\f2(r N@ #ך%a&@Y&$^!W ڐ0^>0,xwb耻F@ـ#8ݠHjl'30lt,) " Z@`@'0ki" %@:&6H&@0%@" ǒPk 7P@`C GI݀zLx@ڀu ߠZ@wX"5X&"e@x!T$%@(e&?%@# !`R3@{9 4X9g R`
](G˚@@@Y87Pti0 Y-gl z#y%[& &@$5"δiH`~p?j8jxF=`l`k䠖>݀@@QA N䠀ptf 08s.}"X$6+&@S&@V%u=# @ k{F 0$:0zNzn %B@y@Jf1K@A63 i砼ې"m20 B`@[!!$%ff&@,% $Z!@ҕ 5 Z M3 |+2CQL܀eڀ^@ .{@4@(mMRb1pL doN@V ?#W%@S&+&@$i|"- ɒ  La@^@-@9ڀـܷـڀ? moJXxi@A`pKܵ@7"@γ$@&[&By%@,y#k e`p PjP03H@9 @9Z٫FۚـbH܀ޠMӆ@ph[c `JD{2b !#%@/e&@M% T$!`|VfO Z#n4Pf &x@@&pKۀl`6M@ OP "90~ A`MH#62%G&:& %"`.j&V[># Νn1`h "E @ k@ ـ@'߀@ p04b࠴ c W@!@$@&xa&%s# `~:n gH Zm`s / rh֣ހۀ/,ڀ+@Hj`@v`pe0`+m @+j #B%a&&$@X!IUYH:p_`L-U"@v܀ϩ@ѬZ@!@ @cG@hꠈ0Jvpw@*" `SZ  (Ll;" %:&@H&L1%@";`ÔFQ 6hvPG0?۳@H݀K@c\@D`Cw 0#{2V&e e!=U$ %3e&@o%@# ! 2nx / ԚxSe`` aF@@CX bk@7\k@ fi z#z%[&~&"$#7"`H 1>4Xe@I`lXk(sd >#W%@R&+&$@{" `-Pm TbYbͤ ~逴@fA(@@< k䀞mPNhkp0>@XI@@7"@_$2&@W[&@x%Ez#@k Qf`P/ e x6P`Ǚ#X@КـG @O砒@f | 5] !#|%#e&@%lS$!Gd@p!-28@ V`v ~ ڀY&LۀLݠ|KH 8;W #2% H&:& %ؽ"`k@ (!Y c! pp,4[k C@ެ @|蠛0.v_h`X!Ą$0&a&%# v4`|p leЌkq ^ `GjCހ+ڀS,ڀ<hr 6trgn :WDk #%a&&h$! Wr3]" &0@,@M@a߀@\ڀ G ۀ܄ (I@i0J2sd \K) j"@F %{:&IH&0%@"&@lS 8$g.@IL@ـ@SڀT@t耂P%x$49$Xc`@S!OT$-%,e&@%# !3zk_ @mc0`^`$܀UGڀؚ@fU[@R nUP4ph "'h@qm @Q{#oy%@x[&@&$C6" @ZGI@0c)PGJo`j`=@C@liـڀB`@@頞xe P@h~|"$^+&S&U%=# ` l0K /2,1p1 Q9k@W&栠z@@xـfڀJC-4㠋Pha/Y ` e7[!!$O%ff&%@!$X!l ;4hj`1CJ'eSـz`)@kqQp5K px`s ?#@V%@S&*&@s$|"% v46e0 gW ͔@@ڀـɷ:@l@d@`?m-oFИGHh@-J`@36"$&[&jx%y#j @hs h x4hYހ`kך5H܀`` hX x v3X!#ظ%>e&@s%@[T$!rc8\@0pL!@ u 2@P[|Lۀ,LY@ D04p1 _ Sw@"1%G&:&@ %"g&{ 2\` T0nj2i E@ۀ@SH0@S 0@aQ`V!؆$@v&a&%@#~ Z o >(cXpiUt` iNހ@Y,ـ+@@1`0j qod0[u @m #@%a&6&τ$!@U `5<.p=X䀧@@@ـ G >k 4z@T@! xY$nԿ"@ %:&G&1%("  @޲ 7@h2iꀌ堰H\0L@ @e Oz`6"6%@ch1!@T$%7e&%@P#p ! /)y ›9(BfV 瀥)@Gڀ@@Xޠ ` H6ljН @݇8f@yn 8z#@z%[&&i$7"ਵrI0? ,f>}Ji@l@<@܀ـ$ـWAԕNf,6b>J n@{"$*&R&rV%=# @` j!J ?/P0[Km$ rހVzg@eRM܀B`F2M Pɑ.XΝE1Щ @ .@+\!@"$@%ff&@%@ $@\!`2`[M -@Fqg2@߀K܀ejـzสဩ'lPN).@M n+ P <#PW%R&*&$y"``6psX ؃^@D_ t?>Qڀ=C ܙH\d0<@G@VGɚ@@ڀO[@At3UlP  cgl z#:y%[&^&س$6" H0Ad D pjM>@@Sـs@)Bݠ@ê8!dD*P( pи@Y|"|$@D+&!S&@U%@6>#i  `mL x@2Ng 'C@@yۀp@eCL@Cߠ3`~@`7@w 'ʘZ!G!$&%ff&@%@!$`Y!@ Ƌ r0 ^Y@1@D{IXeڀZ@|ۀQ@) \n P Ѣ4 @J o@ O?#V%S&*&$@>}"  Զ@VQPz 0hx'f@B  @@ـڀ?lKr m LKpȯgp?@c@J*@5"$@&@[&x%y#tk h@3yP Pd5ज@ Y@!ـH]l(gp `@yX6 !N#@%;e&@%T$! (d@ xI21Pw03"`x`r ՗ڀــM@`Lਸ / >H7H ``"1%4H&:&@K %y"`hY'BX q @oG3`j ~F@VV>@;@+`E`{p/`  ʔ @SY.!$@T&a&%a# q`.@p 0dhjqE`iƤހe,ڀ+@ހl0 uo`5@UJ@Kـ@_@@Jw@ `#D3PW"y e`i!S$%3e&T%@\#~ !` 2 hx ˚>Ke`@G̚ـF@Z@#r07(ek `fml z#@y%@[&|&$7"@H)>,e DlRk>O܀@@<ـ3A`dL`@/c8= ח`{"9$)+&0S&8V%>#L `j `8n1I N3p psJh'`اw zـfڀKE߀2@ %~%`6 @WF 0GZ! $%@ff&% $@Y!BE `1WPIXX2B@Ieb@{`ac(怏m0O3J ni @>#@lV%>S&+&$}" 4  @&.e YgŤw`@!bA݀@'ـ@ݠS? kq逓pcJ#Pkа >^IW5"a$3&[&x%Bz#k @KfO ' 8e86M Z Xo@G@U DH'f y5@b !#~%@7e&%jS$! Bdp!6$28gNr@x@ @M@PK P@ Mp6` ד`g"1%H&:&@ %@" i (`Y |ڛxp$4Tk ,G,@,܀ Z`й!.zP_PX!C$2&@a&%# p .p  ehpgqW 2g@ޢހ,ڀـT,ڀ lx=tP#ngs B`J@p @#@%a&@z&$!`W@s@j*]0 k@F蠤@;@@J @EmR2 0x,m `\`e &lm@"H %:&G&@2%"!@f H8K0 @n`I8VKHz@Uڀ܀Zx 2!諑9xA!$  f@W!@RT$o%,e&%#f!0zW ChV`- @SGŚ(WxYޠWڛ`]n9PpMm `-hum ~y#|z%x[&@&$?6"J>@hp Gak`Rm=}@@,B````NS`h$P @w |"k$_+&R&V%=# lpZG .X,)M?oP&`py@ـx"e@L@A1``  4p ފc`[]!!$@Q%@ff&%@!$D[!W@ps 8|/x`1ALfyVـz@)"k M1( K p~`M @=#W%S&*&q$@z"@`@@ nLf`` Ȕ>݀v@l*@<v݀;`Em4oN =L@8hp@/ Je8"$p&y[&uy%[{#j d 8] ph4@'O cY]ۀjĚـ6Hڀ[܀FP 0 h\ЍE z3@]!@#@ڸ%+e&%XT$! `lc.мx25~D!x`,@#@Y{EـPK@0 I_倏P} D98 @~e "1%GH&:& %"j@C#tWP $ ls@.iE@˂݀O Kuڀ܀@7 0vfȳY!$@$&a&%# V`lRo Xc4nMt`iJހۀ+ڀـ,@ۀ5&g` uov d0Nl `q x#%a&4&H$!Uy@ 0_`2@5@m @@}ۀG@Ek4ppԇ8% Y@'iͽ" %@;&"H&T0%$"@r 72_*aK@+.L@ ڀছUz>#TL2p$v!`d7!T$%$e&%# !2"y  `19f``ހ܀GڀК@uڀ@fZL@6@uj @? >fk @;z#y%@[&@&$7"@lI``:0fpE@m@k`<@@%ZAٕU >bGR @  }"L$+&@S&pV%=# `, @oJ H6/G0SKip( |Tz@f@K@D L2 TP}pё@֝X6 @Y! $%@ff&%Z$@PZ!,@@g( N2B`8=`ja2@B@-Jeڀi{ņ<+lPN02P I 'n V >#3V%/S&++&@>${" @0  TK h (@=Y䠬A݀>A`>EkpzIxj0>@H@7"$&@b[&@ y%x#wl `f` f+P70.v.XۀGڀW@ `8e@  @5 !#P%@3e&%S$"!@eq h"p03 Wo@s`߀fڀـJM@`JG(`r %5P 9@Y "w2%@nH&O:&@ %@G" i( VP ˜ @q0 l G @o@ڀS܀ 䠘`ˑ@ҶP1-n^`!@>E@*X!@$&a&H%@O#@x @@}q e`grg@V ,*,ڀX*`pk`ms@mxMf0r m~`_@ #o%a&@&4$!W&lJ0^ J,@ Jtـvـ ۀu݀)H@l0u1`Ew$# >[% l" %@:&G&@=2%Y"Wh` 9dsKPfdJyKۀf@@ ڀ܀ x `L =|80T@#O`Bfk!U$I%/e&%%Q#!i1Y{6P Sd`) A@*ހ@GȚ@ T[ޠ $`|8]l @4gl !y#Hz%@m[&&ֳ$4"{H@ PApiHH%ljH>@}@?u,Bݠb@ sP)d20 @?ஔָ]|"$E+&R&@W%J<#e OiBH 8J-M p'>ހyۀ pـfGL@`3 5xz23 @/$]!J!$'%@ff&%T $[!@ ؑ Hj08Q@k`|@.」A@MPf@Z3z@)cnP٢0J @o P k=#W%S&*&${"EͶ OJr _WaaS>݀ڀـ1@-= opnt`TK`\gФ`?g`J /7"B$@R&[&y% x#@ok `e 4 `i4 1@Y@ۀ@ԚH ހ@ tp(k  a y@3 !Q#%;e&@%T$@!@"d ȍd5n+"p`y@ڀM@'@ K@݀L О` lG7Q A}#@1%4H&;&I %j" @k#;X % Po. jxF#6 ۀ&;@</@@L<03Pe@є`%XY2!$@&a&%@^#v `){0o do u ?f¤+,_ۀހi uo|hhk R!@ #%a&V&@$7!mV,ٔ`$/E`T蠯'@3@ـ%@ NpF|j63|t@@% XL'`:k{" %;&5H&0%@"GȐZ (3Q0 P@`ꀶ[F@uLۀ(ߠ@yg &dJ507 `g!T$@%(e&%#@u !@G3yk X#mbQ l @W H@@O@7ۀY@c:PXi P iejk {#y%[&&E$7"@SJ p~;pgp F}xnLi3=݀ـڀ@`Z`|`1 |MaU0h ? 9?6}"$*&S&@V%o=#@V `e @o K (0043L^j $)`@Zz@5ـNf@8K܀ D1 ||0X5L "@VY!!$@|%@ff&@)%$@Z!`Ǖ`@@ <34' # `l0C߀Jeq4{@ޠ)ဉ*ppM 2 L qG  .>#W% S&@F+&+$a|"@Q@޸@@ <l_@|7@1B݀4@ݷـz@ C>jo@ .MnnA`Gu8"@<$@&m[&@>y%%y#l @Vdq @c g68`Q`,@Yހ ۀܚ@G܀@w` |Id{ʙ2 `Y4!M#@ %/e& %xR$!@q b@@ J#^d 4U Mt耾Å܀"p@eـM@t@M ^39* _OWO#:2%@[H&f:&@ %"$j[)V rP~1lE/zۀ@ q@@1`1dP ^qWW!$&a&%# `v~*n gfhhus gh@Σ[ۀ,,,@j  v^lle0q `}` s @#>%a&@&$@P!`0XL+*_P;-۶ @o܀@[ ?GlP0Zv:" ^@`(Ul7" %:&H&H1%" 2@`  :䚐6{1`ϳ`J@Kـ9߀Qw # MH7f`_"e!@CU$@% e&l%#@]!2ax@ ` Be`ࢇ‥[Fڀ̚@Z( o@h7 mk  uf@rl x#@z%a[&&$4" @5E!>jK@ڀ6ڀA@i࠷5`8c@AE `b(@~"@;$+&R&TW%<# \:i)I PF<.RN@p*$ ӧsހzۀB@i@fKB 2aP40D2 ^``&\! $%ff&%@ $Y!P HX1 @pPY} \&/@ BKeaـPz@#fi(m O,/`J @o` @#W%@R&@+&@${"{@&\ $Hb@ཤ@]``T?@@&ـ@܀X?Ko`m@kJf0fC`L7"$4&[&x%hx#^i `Efඋ@  @j80h1```@kZ@@К@H`{\砡pPjp}   y`2!@#%@7e&%@T$!`= >a{f2^#F]z7 ߀X +L@TK`` U6`h ޓ_#1%!H&@;&@D%ѽ"k $@Y% ћ0p/Ug&G ۀـ,@@L䀊@d·`2Нd0  X!@ʄ$@&a&@%# `'`|Wl 8e0o q Q @-g:+ڀV, ۀi%Et`+n2g`s `~`d`Pt Ŵ#%a&&c$! W cabR+n`?U߀@Xڀ ـL @EmY20sm$ `WY@& j"J %:&HH&@0%"@`@ X4XC `F݀SKG@W@I%߀`x %t4I*$`%f  !@UT$@p%+e&%# !3v O ȗH\c $&瀼ހ@RGŚ@)|Yހ] ehv9xhi  0`dzm X{#ry%[&@&$i8"MG:0]<pHhЪGWn`l@IePxPB3L 7"$&b[&y%x#i f`` fj"2c p)Z@@ڀ̚HڀZ@ pif0 @3``x2\!X#@R%@Fe&#%CU$n!a `h3Pg  @Rwڕ》c@dـK@݀JM/ 5 . 6 @``1@#G1%H&:&%8" i`E% @dZ@<" tq0hG ݀@˩n  `ڶ1`cP) 8K` [!$@&a&@F%#s @%}=m X)ap |n@ gfۀ,ڀ@,,@[@.uk`m@tsHmfr @ l#%@a&&2$!@T`rBbphB,U@`䀏rڀ@@`!ۀyE`l5r(|,# V% l" %:&[H& 1%O#Wm` 8 5jp \@~Gu݀Kۀe@"ڀ…``x 0$4H#VHfp!T$J%e&#%#@l !4@wZ3 ̙.;PKd.Y @P܀GȚ@Y @+P됄 8g@ p@Udl @z#=y%@[&&ӳ$6"`v`G;=00 iH@1lj`;I޷ـTxڀ0Bݠz\2dd;9   ݸ"`|"@$@*&R&@U%/>#@` r q9H `A- Ik&`9=y@eJL@ C 3`=@@&P;3` @՘Z!"$)%ff&|%@Q $[!Б 5h}|`1?߀8K@Ueڀـ@|ۀY#)jn1Lv'00 O o@d @n=#V%S&*&@${"@n@:H@i W\Pڣ[NB@p@32=l`wn|\KPl`@?nJ@47"$&J[&y%@y#m ab%j@0 ؆i8e: •Wހ@@Ԛ$G ܀` P`7PY Ɛ  "@1%5H&@:& %f" ;kM'4X` |P~t83fB@L2:%@'@S蠊`P3H` `ؔlV@u!$V&`a&@%@[# "`o p(U dpju8`i@_*@,b"i⠗ >yoxhЪo %@(@ "#ܚ%a&U&$3!@hV&Ő`-\2 / v/;ـ& ۀR"Ijꐞ7@t% ]9`*`?kt"H %;&@G&1%"B@R X7~ p8 `0`L݀ K@@`Η u耭 )"-5?@%@ !d@Ԩ!T$%'e&Ƿ%@R# !`#0 y@`c xeb Je@@@#G@ԚF\ 0Oظ5`Nn p@@hnk {#y%[&&B$5"0Fh?PܹgxUK&qnl.=@@@@ݠR`@`lf ^ U`?D9}"@$|+&S&@V%k=#Q `_ kJ (^ 0+pP@Wj% @Vz@ZOfLD`4]ih 5T ߏ[!!$%@ff&@T%@J!$cX!00 H}.a``f0 C@J@dq@y@@='@ phR6 L Wmw @d @#W%!S&@E+&($]|"`e PkH+d2@"@@vSـ޷ @ m@$l7PH4iA @K`\6"@l$&@m[&@j@40|I@iFk 0΋8O@V@K O ``;I倻i6sDL$ (\s *j " %:&G&1%"@Z@ 4hpN LPKـ{@eڀ"܀`fx` C!>5PR1$,g@ _!XT$q%+e&%#@z !0z`G Ԙ(Tc @ ހ܀PGؚـ*ڀ@[@b` &m4x^mP 6@9hj @[{#z%y[&<&$86"`GG`30@ <LcX>L`5o`Fm=@}܀<ڀj@lـ@@@ǔ`(,el, `@|"p$a+&S&V%=# ` qlK l1@ Mg D&栟zR@gڀL@C >414r `fD[!!$T%@ff&~%!$@X!@\ 0h Pk/EP0퀓1A@J܀"e@Rg|@)>oЈQ'5 K l Y@ ?#@V%S&*&@l$z"xv \e@@@@@ـ˷@r}r@`QmBo]G`h @@J˶?6"$r&x[&@qy%@y#@j .h_P hh04@_ۛX)Wހʩg@ؚ9H@܀ `߉U찠hPP `z7f!#@%?e&@o%ST$!_c`ЬB4m@u @߀܀UzHـ(N8`L0%]8@J s e"2%IH&|:& %"j &fWpn Pޙ0nPS2i 0I@ĂۀY@`Z@j 0Xpai@rY!$z&@a&%# KCo qc$n pyhB T,ڀـ,ڀW>ހPm q`kisu ` z @#%a&@2&Ȅ$!UP_0#.$ Gެ@ @ +G Lo0#4@xuT`Y! Y (k߿" %:&G&@1%" pŲ 6N0R` HQ)LـĆ@߆`w`v@M@#8ܻ;H5%vhA@!T$%#e&@~%@G#c !2y@Pw (f` 研ހ܀G@КـX `Y8a;e` i@n Az#@y%[&@&b$W5"`_Ip>pЉk%Ei@k䠡<<@bA` c`Ĥ 8gD!c `{"P$+&@R&lV%=#@j orE 8%/6PCKm@d(`bހNz@cـeڀKB߀W2aɅG%@_1’ s@8\!H"$%ff&% $GZ!!G6 Ȇ-h'-&~S`2@K@eـ@{vȪြ'l0N3xM }r@a <#VW%0S&*&@9$y"@#И 0:(j^` /MA@<@@H`"<`rp`@I0 j+0B :L`L9"$&a[&z%@x#i c@ f82@ ti $XހF̚G@܀ހIe@& `| 2 !#9%3e&@a%S$!``ezX"3#Kw_ـKݠJ T7` Pl 6 H! #I1%@H&:& %@)"@i`?% V4" q0h[D iͩ@Z`ڑ@L6 _p? RCU!$@&oa&@K% # ` }4m (ePWl@r  gM,+ڀ-,^ۀ2lh瀝wPmhf(01n |~l  o#z%xa&&@$!`W@^:`^J0􀦌@`䀊@@x@ @}`H h5Яr ĝ 5# M[@`)(j"Q %@N;&G&1%@R" S@I  5ۘZ!"$*%ff&%!$@SY!wJ XY08@[z.〄A߀5K܀SeY|ۀ]`))rnP ;~4K o`@Z Y?#V%S&*&$@{" i@pPa xN f; ӣU@@@6ڀ`?l`~n@eKxl0?v"J95"$T&[&y%y#@fk h$( d,x5@뀑„WڀԚـ H @A$@h/g=P @yi6 !X#ʷ%@;e&%S$,!`d 8025Haq×~@y@Lـ)M"L<`F  "7a K@"1%6H&:&D %n"@6kG', X Ϛ,o003vj I`u.݀7=@!@N+ߠZ@ +/N`ߔcY:!$W&a&ٚ%X#m \o djp i\ۀ~,,@ƤlD@$u0ohPt -.@ @%#@%a&T&$/!cVௌ0s@`/` |p|߀,ـ' 9݀UI倃nPF3tho ].X' Dkx"@ %:&G&1%@" 0 7X@ZȺ 2I@pLۀ&@Y@@u w1"u:H@%@g !6V$%'e&%#@ !<3yP[ ݗ$xgХn^&Q!GԚـڀW ⠣0Wt:N`i `x hn @y#@y%@[&&@$5"H`J^?{lPFnjl)=@ @ڀ@C݀W p%f/x PUEw=}"@ $@*&R&V%h=#L Yo ZF 0`#0#L]n)ހzۀـXeM@A4〤@p@q0Pߑ ŋ/@@[!!$@%ff&R%$Z!`x t.a~3@@DL܀eڀJ|ـ9{@D 4@ 'lPNˤ2PL q~ i 5>#@Wq` p@?H̵ip?бA K`a8"@س$&l[&:y%y#]j Jd d g6x3pB栻Yۀ@@ܚiH@@d:/Pi{@B  _{n1@t !@# %/e&%T$@!f@b1 :#43xu@$ xಙv߀@oـg@K| KM#`lps |z50 `\j`V#?2%\H&:& %"j%`V# ܫx@rn1h` EV݀ hــ`O 85@b@ @W@!!$@&@wa&@|%f#k  g~@n x4f9mfs\hţVۀV+ڀ, ۀj⠻vnlX6fKm A| ڵ#I%@pa&&@z$@H!%X *^@*-5`~ `߀h@ǩϬ]ۀ`w@G*h5Pkv$$& rZ(`i@J"@ %7;& H&C1%"(`+@p -1T%³ Jေ@Keـi܀&`[^w+ @v0^J3wPo"e`@v!IU$%%@3e&@O%#@q !1`Tx%0 H(w`@U@G@̚@NۀZ@3{0@7~k` @, fi w|#z%[&y&$7"`H` >peDl@kـ:? sC`0IchRV rk{"@$,+&/S&2V%<#> Q V `!n@I @+.BNh뀪'ȧk@z@ifKB`2%;~YcU2 m Z@SZ!"$%@ff&% $@Y!@@/^- hG13/0@` /@BK܀e@af{@q@,@mONr 4XP J `]s`  >#@rV%R&@+&@${"$ o@wL @7b%`a`WAڀ@b? l`m@|Jk?`qI7"ҵ$@6&U[&y%8z#k ti@ e6P@뀭@X@gڀКG@@`i砰\@f@  (y`5@o !@#%7e&%aS$! 2 d po!f60p7`rgֆ@X@ M\`K php1$17x *`!#2%@#H&@:& %@տ"h'yY p 4@?kG{ۀـ-IW `ҷP;.@p_@ X!K$5&a&@%# `_ p b&`lk@qD `1jѢ+X,@N`l@StrdgX s Xq[} ̴#%a&v&]$!V@`| Sp]@+T1I܀5@ ـQ ۀ`AImi2ТsԵܽ 0\g`& {m@"@O %~:&G&0%" @T ~@ 8gPFP`[I@-݀LZ@@ lu %x9Z9$@` g!U$s%+e&%#Y!`3 vMP? v0hЉ`@f`ހOGڀĚ,`@Y@h -uH9hz = ?hm y#z%z[&&@$46"ڳJ)0@|mmxAPGLk`i =@s݀:ɷmB ̔ e4e >0 3@|"$*&R&V%@=# ` ilAG  1M *o`"`@z@y@'eڀLCC4` 0&@:4z wk@H[!!$U%ff&|%@$7[!V@؊P[ b/pHm{-4A߀L܀ eRـYـzޠ)@8kАQ@ߣ*1K p  _ =#X%@S&*&$z" xPn PL`0H?@{>oڀ@̷B݀=p`IoeGh;EGJ жp8"$@&x[&@oy%{y#j d#  h60`; S@uYހڀؚـ;Hd܀ޠ ]&h)@@^ `z3j!#߸%,e&@%PT$!@ Yc@`$8h4Xe,!t@@C܀SڀzIXK<ݠLr SX8R –"2%IH&{:&F %" j &_ Wp$ ՙsK2i`E @H @{ڀ܀`L*4aY!h${&a&%#@ E X{pn ~gn@7t e=+ڀـ+ۀ`Fj @upXePp =@ #@%a&&@ń$!`Xf`_. V}@AڀC @1G`bg08u訠& @Y (k@"@ % ;& H&1%"T PY 2E@`s}K݀&LـYـƆڀ ܀ @jzT0'@n,2x&d G!T$%#e&@%# ! 2 y0o ea쀝 q ހFrZ_@@6NЎj V` Pfk |#y%@[&@&@$7"``E> ضfE m@k<@܀'ـ@qC@@j$`hXb` @$@{"@S$+&@R&@KU%@=#  `nJ $/.O |i](]KzbـfK܀B@]2`h`g}t g1`G  <\!K"$@%@ff&@% $CZ!` A/` h52|p%SL@/B#JehD{ ΪP+l N bd3 M rg @>#9V%R&*&${" `ٓ T h(c@@(`A1@ڀK>Wk@l /NzoP`0>H"7"$&a[&y%x#il f҄  f87l cXۀ@ـGڀ` இxQe P @B | /5@e!#U%3e& %@S$!e[ P"Wf2}V ys @߀\@cـRMJ`Z@> H?860 `P'@k@#@}2%H&M:& %@<"@i@9%TZ` L@q0h`UD@@]܀``J-4 cpT :XW!@$&@oa&@I%E#j  }`q `agr@ jIۀ+@/,a֣k s`qؼgr `~` s#u%a&&$! W@I3]X1,۵nڀ @ Hl갌1 r@̝p=# _&l@"@ %h:&G&@1%N"`@B 4Y1Q UJ@m݀K@&ڀ@əZt $H8xmX#eUf{!U$ %@/e&@ %@H#!X1w@ P# `:d!N@@܀|G@Țڀ@Yޠ 8^됔8,wl @~gm +y#Mz%n[&@Z&γ$s4" lGAPdP2H@lj@:>@Eڀܷ@Vـ|8B@ u@`cxCdLp V Ĕ~"@$*&@R&@W%(>#W [`d h`)H P1`M k`d#.@/{q@eN@C߀3`*L187G0L3p E@`ѕ@Z!R!$,%ff&%@K $OY!@p= ș+O7Rn|砡1ALQeڀYـ7ـzۀa /)kjаP80X K @o  @ u=#W%@S&*&${"`6``A2Y |=au #D>݀ @8`<= p@n@mK g \D }`(J>8"I$&I[&x%y#ak e @ 8dj0@@YۀڀԚH@`) +7g@z yQ3 ![#%@(e&@%T$y!t` t5HU"@u z܀@Lـ*K@(L ¸`ꐶ% ,ax7i @ Ԑ`P"1%6H&:&@B %_"@1kA'%`X $ op(3wf`eF+@5@=@Bڀ9܀0߀``¸`3xP`8@hY@}!$&a&ޙ%@#i ` V`{o (hPn@p@ `f+ڀ+@@+i+u0&oPIhл p @i5~ (#@%a&&@$+!]V Ĕڲ\ /m .? )ـ(ـ Z,@Ff@7t0% XG^' Ik|" % ;&3H&0%}"8@B 37 p$`-I@Kۀ%ـ" y~&X~6xP0#%  .d!T$@%'e&÷%@L#@h !63y@0S 0՗ Tbf X@ G?Y` `0_5i h n {#@y%[&&=$7"C@FZ?g`F`j;ir: -ـ C@mH,gaDoP' `@TKN${"$@*&S&U%d=#H  @oJ 00PHj)N@y@@@SfMA1@ǀ@hty0d @̋ [!!$%@ff&$%D!$Z!ඕ` p#3@ @~@K[0C}Je@p"@|ۀH`9*p@ NuV%2L q\ 9># W%"S&*&#$@V|" B˸0@{ (Z$dd`)@݀-ـ@ݠQ>j@2lGFM nA` Hf6"C$&l[&8y%y#l g@` glXq8#@@X@ۀڀܚ@Gڀ܀ 7HcdI hp oe{4!W#%Ce&F%S$@!@a6f`* 2#Df#/l`= @9t @@@nـ M`nJᠩw`tM9 vcY#@A2%G&d:& %"Rg%`/[ t Lrf1h@E` n@ ۀw܀?@U @Z,*bȴ 2W@%!@$@&wa&z%#@ ``~r  bh_s``fk(,ـ,^`j@vpfq }G@ #D%@a& &$D!`/U9^R!-@ö􀽑耕 e܀ڀ@!!@3`|G@*l0svS" ^`(dlC" %:&G&A1%"#@N@@̱ 5|Kc꠼J@Kۀ@@B܀%ewp $f7(`w"ez!KU$@%@3e&@g%#@P!.MxP @)e ܃ ‘RG̚@QZ 9 `@@7:Gp0 33jl x#z%[&x&@$4"H @ > le(#kIl:k>A܀ڀـ<ڀAݠ7 y#9 @&iI 29SJl$@ç@gz{>jeM܀B 3 , xLG(7 @ 6XZ!!$@%ff&@% $Y!`|@@y ؇,'8 C}HA2A߀Kea@Xzۀ/ހv|(栬mO@F/(J @o@9  \| >#W%@S&@ +&$}{"i `C ln/bpZ Е@I?݀#ـ <]o@m`J( k@P~CwI 7"$&@U[&x%@5z#Pi 4f`` e 1` Xހd@КـG@`p(If ɛ@   /y5!@#%@$e&%T$!,*ag!a2(E"@~v&߀@ڀW@ 2L݀K` 9To; 1q +"@1%H&:&=%@ƽ"h' qY9! (0p04@g`Gyxۀ. @܀ߠ]’ڷ3j`! [ !҄$&@a&%@r#@e Y@|P?l idkq`= g- @+ڀ@Z,@@ހi`9 [tpCnPgx&o x@a@ @ϴ#%a&&߃$!@V p ]x/`U*C@@R S @`@Ei`60sdlƞ/$ Wn@*j"Q %@:&FH&0%@"`@N p 3) p`|ԵI@KKCـi)q@x耨0%p5XA$`;@xc@@!]T$@4%e&@%# !3zq Ø/8Cc9܀MGڀĚm@Y m`4}p4h `DDh@m a{#xy%@z[&&$]8" :G!P@`hGEk`i:o@8ɷ@Bm@u`F< `z"$c+&S&U%=# B  p9G X5,H@k@) @fy@ـ@"fL@A`I4@/* B4 @L[!!$W%@ff&N%!$X!AЊՐ x4k pe@0@Jfxـ@m|ऩ`)@Mo`)M50K p` =#V%S&@*&@g$|"y`j KD` @ `@݀mڀـ-D~݀=`j2s`m0^L0mP@N J նF6"$@&x[&my%xy#j dQ} `}h^9b@ 5M!WRۀ%ڀؚ=Hgހ9d/hp @ z`3n!@#%@?e&l%R$!`f М~0\#!@ t P@FzـLIx@5`[8о  q"2%G&{:&@D %" g&X`W] tzs-@i@?B@لE @^ڀ܀`)yj+0a~W!j$@|&~a&%@#h `Q`4Pn P>b0i0tll١ۀ~+ـ,FKj vpؗe`p `` #%a&/&„$!U _^ .PN`;@ߨ+ــ ۀȅ Jak/u$xj! ]  (`k" %!;&G&~1%@"@ʓ  6T= PB mxKJ@lـqz耚 (#v7 F!@hL@U!@T$@%7e&%#@Z ! u/`y`P ݖjf-砉ހ@GКzڀ@\ހ `fh6Wo ]@i@k Hz#z%[&&$P5"  SI>@f`TJ`m@k <ـ@iA@*ࠃ@q+\(ghiΈ + }"$@+&R&hV%>#@ jI (3 &p3K`m$W@Izaـb@fڀbMDb2ogXX('6 Ғ ŐN@\! $%ff&@&% $@?Z!:I u-hP`~ 砵/?Keڀhz@V+l`S3@I `Fn$` >#ZW%1S&'+&$y"`ғ@`. `X c * !`A`[@?݀/:@Tـ@O ,@%@%@5߀ g蠡4*!p됀R@--2(L @qc@r <>#"W%"S&B+&@!$5z"R   Q@J_`@@@݀oڀQ@Aڀ݀ A n 9l@ HiХA `Hk6"@ݳ$@&l[&6y%z#Tj @zgVaP g3e4@Xs>ɚG@o`>@&ih0 ` `l{@4!@ #)%@0e&@E%S$![`b:ph<3pd05 `w`l@'5ـiـ M݀UMz@p VH9K ~L`j@]#@C2%^H&:&%"j%@`V # \ӘLr_1hoH@NــD [@  &1N$bPaZ@)!$&va&@r%#b @X~ n 0[b)mXsQhۀ&,ـ,ڀåޠgr0~lXjq `@  #M%a& &u$@! *U3`^H1$@F@߀a܀éάـ TG*p5|v@\" Z(ilF" %:&@ H& 0%"@H `# ` p5B \`5J@@Kۀڤ@o/+@lw@@$8o7;&  b`.!NU$%e&L%@# !1{@{ P eՃ@G̚ـTXހ> "怯@7~0f$ `;`fo z#z%@[&&$@ 7"` H`>8~jDl4k <7@@@?@A }j>ඥZc, @g @A~"@$@.+&R&-V%@<#@ `H  nI 0.pKJ`l'`ͤ@cye@KB562J~pߒ`P'f2м @|K\!!$%ff&%$Y!v "P 61/`p` <2@A߀Keڀ`ـ@{@{(miK40J &o @?#W%AS&@*&$@y{"պ .&b A PA@#@@ڀk? l䀪q JXNg #%a&t&܃$Y!V9{ax/+$>@P@V @NIi0y2YxΞ7$ `@\&j#"S %@g;&@G&@1%"`@H@p` (3V5@{N堹I@@IK|ـ^ڀ,܀wx [!W|5kI$B`gl!@`T$u%>e&%#@ ! 0v@j/ pB:cp @ ` ހKGڀĚ.eۀ[ހr < 9L0xm `@KJhj @e{#@z%z[&&@$,6"౶4G=<c%L  oi䀨=r@6@ȷn@@,@uEe@E 0C|"w$@d+&@S&U%@;#% kZlK 8-,O0Lk 1&ျz@yـgLC`"1p'P K4 $`v@]!!$X%ff&y%!$/[!K@ɊP Q/ `-@J@f@Qـzۀ )`To밠Q@;10L p@j@ @=#@V%@S&]+& $@z" c ,C|;`` r~@݀.x`@`cm@Wo%pfL h@0@VeG`ڶx8"$v&w[&ky%@uy#j `h K7) th4@G.`HmY@©cؚ>H@@ k7h]pn z3s!#@%?e&%JT$!` Lc@ Д) 0PT tt、߀D@@K@LCL`倳#U !2y_ Xf݀e@@܀GϚـڀ{Z l({;J@e`_ @eы[fn Kz#y%[&&@$@z7"LI>`fp 0E}m@k@<݀@ڀxC࠿@x3`0g:| 2@}"X$+&@R&fV%<#@\ @ nYE  /̡p+K{m$aހFz ـe@K܀D߀5u`0aL5x1W  E\!@ $@%ff&@%L$;Z!` } $2 0~`?@2xB߀K܀d@h@{@'@lNpѥ(3M r U* >#\W%@2S&*&@2${"{` ˓p t xP^П z `;A:@@Mݠ>np 0I"dj0DB@LL @X9"'$&@[&y%x#`l c` f8s7@ ^@VX@>Gڀf'  xj#> %-|`2n!#>%4e&%S$!@ aM @"F62l@#@lsyV@ڀK$@MLp P$6< 5`Δ`@#@P1%H&K:& %@"`i -%`@U " 제0qPz0kHDY݀c@@@ڀd@+ߠ 8P@6dc I@U`e`SU@!$&a&F%#a `|}m e(0?lr g@ۀ+ڀ@2,k砳whmEb r @Ȃ  #%xa&&'$!WH #`bH , ˵􀏌@j@ @{ـ ۀHiP5owpݝN# e[` &l" %P;&G&1%G"D@4` o 4xH0!B` KJe݀Kـq6܀#߀ԙ2x @u gH*41h#bf !T$O%@Be&6%@B#Z !M1w< x)dpdž%@FȚh[ Em0ت8> l` @g m |#Qz%[&@&ɳ$@6"`C eD@=ddrHlj0>@@r@۷W@?B` ``TdP `fʘ7p|"4$I+&R&@U%9<# V 2mpL @F-p<Mk@&@$-@yۀ@r@fVL@C 0[@Bz"]3* @T &@9]!"$/%ff&%!$[!@2 @0hB``}i.wA,K@NeXـzޠ<)nP@TI0PO p@h c?#V%@S&*&@Q$ {"Z+p k,a`C`x@ڀ ـ<$?l@n逛}K Hg@4J`* 8"$W&[&y%y#@Xk `e  di 85(@`YހԚ@H"ޠ4`8瀙Hg ɜ y\3 !a#η%;e&% S$p!@d v 60qJ`u耲p߀oyڀK,L`2LNP06 <8`z @Ĕ`Β #1%@8H&;&= %c"`'k@#@*X ൚tu]t3if YF f#@0"ـ>@'@@`n`bҸHE/ @erYF!@"$[&_a&@ۙ%#` @po 0K_qjp x 瀆i@@+,@Ҥi X:uP6o@{h0t C C  .#%a&P& $a!@SV P[ \Կ.e@[@n"@@*ـEa 7Fn]3t ȟ)% X Ck'Sk@" %:&G&@0%v"`/@p 2<\`P` #I@݀J@#¤@ڀ,ߠ @u &hF6Ha@3%g`!T$%@'e&%# ! 0 vdC ~Wf@,`@GGڀӚـ@E@Z ؍:+iy `e@n y#y%[&@&8$7"9I L ?g6FUnl`=ـ@@C`f y`X?fhI `j XXH}"$@*&R&V%]=#@ @ oAF /pP L@:jw%@ހz@/]e@ M!D 4㠸 `/CA5t ۋ`C[!@_ $%@ff&!%@$Z!૕`@` x[. ?`@~`|3B߀vJ܀doــA{ۀPC'`(p0N62L q`  @>#$W%#S&*&u$1z"` `Pj A_`U@ @)P@T@[>n@"pV`HhipA'`K`@8"߳$&@1[&4y%y#l `9dO  лb:`8, `X}ܚmH܀tNq.i|1XZ ~ s{4!]#@%@0e&D%@S$!`Vb "#3h3[$@Y+tf߀ـj@MZM@60# @9T q%@o`#1%^H&@b:& %" j%qV# ,@r0W1lD`@g@e@@`"`5Vb@i Wl!$&va&w%@]#@ gP~n gf(!m /o` Lh@MR+ڀـ,ۀ(`j@ v0l^Saq S #N%a&@ &r$@{A w83@D& e!@QU$)%@e&d%# !1`@x@r Pޕ]`p܀F̚ȪZހC@栶97N@k, `̈ ?j@l |#z%[&&@$@7"@Ep=@@eh [IMl.k@<:@AA E@X\cc$l @ z|"$+&@R&,V%<#/ ?` nI R.(Nh뀗'@yۀ@U 2`@sآ``-`z@i@ηz@ =`im@^o|GmRE@]J|8"$w&<[&iy%ry#@dm d@`n clX/`B@WMؚ@@H@ހF@h*?v @j~3w!#%,e&i%GT$@!_@ `$H!4K!@/ t @9NڀLLG Lစ倷D0* l9@k Ԗ "0%KH&@y:&? %"@j&7WPM Ln42 iEv@@@q`7,h5Ja`ɕW!p$~&~a&@%#ܻ D@%n Xg0io_e0@ۀ{+ڀ@,@Vjv!p`i q  #%@a&-&@$!X`Ss[.`@?@i/@ֿۨڀܬE@ @ CGok8uD@& Y@#+`k@" %@#;&H&y1%@"``@ 6(,`2``H@ALZ؇ڀ܀`~zk8#Ї7W&@d@W!U$%@#e&@%#Q !`2 x ͖7hLa`}<`` @F@z@Z`s X86Xj /׋@il %|#y%@[&/&$@H5"E`z>f@E&i@k`<@@*EpAݠ*@`;Prbz+ 9@ `{"$@+&R&dV%<# @` @n@I \/PВO`fiJ(@Mxۀ^f@K"BA/;ಁ@8' 1_ [@I\!T"$%@ff&% $W! `-:@ 2ۙh`~ /@tB@K܀ehـ@ }ݪ'lO`{7M Un`2@y >#^W%2S&&+&$@{"w  ēw N8c@r ̐?9ڀ\`>`ik`p7`HNh+j`H>` SL.7")$&_[&@ z%x#@i f`` Dknj7t@?O@Z@ۀ@͚H@,`6‡ hke4 X`4|!2r!#@Z%Ge&%S$ !me] H>2cp> @0w߀R܀bZM`K mWp Y,6 `Ԕ@#2%H&J:& %@&"`{i'%`=Zq `@qr0 g G݀@m@թg߀d-Pc@`\@IXc!@$@&na&=%@<#@]  u}Pm ` 7lxr 瀻j<@X+ڀ3,i`k  wpmPg0Pr ~@ |#%a&&$!Ts@A0],,ΐ`wh |@l!@ 3Em01 r`V# _@& cPJP8 :Z!@[!$@%ff&%B $@BY!\`` p+@Đ@X|v瀐1>(K܀Le;ـzۀmB)npYL jR0(K p` @g?#V%S&*&$x"Tਸ਼$@ ,,,$aл5@ ـ>@!J=l n F 8l0,PtD ;J l8"$X&H[&@x%y#m eΊ` d0@w@Wހۀ՚He@'@X`HQgќ @}6@ !d#%(e&%@T$!`a` n 8[5;!`u蠬@l@ـLݠ7LԸ@> z 8 "`+^@"1%H&:&; %@T"`"k /''T7 Po3@bfRF3.@ــHC>ߠ^upD4> a V!%$\&a&ٙ%@K#ٹ `BPo hHij pqf@Q@+ـ,p8`i^AuP>oiP`$p @KI 2#%a&O&@$!?Y@`S`\x. +`i7@+ H<`J倧j7t 2% `X\*Xk"T % ;&1H&1%y"w໌`@) 7@9` IုJ"܀0߀& y耕pR"X6i0;% `Ad@!BV$@%@'e&%@C#[ !%3y ;b`P@@D@GڀH@ Z ``0w5pi X`@hk @{#y%[&@&6$@5"`4`wFD@?g F ljl@d:@@'@ڀ A .  `ж8HfP@ q@^^@0{"$+&R&@V%Z=#: @ @sk@9F x*+rP2j(@ހyۀـXfڀM@A4~ހ7A0|  +@[!"$%@ff& %@$MX! ڏ  3͚ 7g~ 7`J0B߀7L܀e@I@@|ۀT`I"'/p !N> 78@M }mp`{ @C>#&W%#S&*&$J|"` p p@td@M@E X@&ڀـB@@`>n@)p@^_M: i `A/K v6"K$&@k[&?z%y#@Kj ng} x4lФ3 lXۀݚـoH `M(87i` y{4!@#-%@Ce&B%@S$~!Q@#f@ +3hS$ @ %t`@d@ ڀmM_Mᠼ倌+0 0g`:@ `Z+ t@d#G2%G&a:& %"j`%@}[@[ $m,h@cH c@^ـڀ܀Mg@)!071Xb` E`W@1!8$&@va&n%#۽ @`I~m 0(azm@IsFhT@ۀP+ڀ ,jހnv0l@(fq X @##P%@a& &o$8!U& @^E( ` C܀ͬـaـ(!ۀ>ݠࠅD?lP0vp`l" @^( iY"@ %:&G&@;1%"@<` P51pPL`)G@K@@@v܀ߠryw蠇 '$@ 8p`"Li!TU$@%2e&H%# !`19x` ՕLe``ȃ`@HG˚ڀYZ I TPy< k J ӈEjl z#z%[&@u&@$@4" H`=mj RIlg`<0@{ڀAـCA`ALPkctщ @ @%~"I$@0+&R&HW%@<# n`H *2 ;Jl '怳@[@r{@;fLB@3@ en.7̓ `GdZ!@"$%ff&% $@Y!@{n A n, 0,}302o?K܀}e`z@w,`mPXT`^`/x)0AJ |s$m ?#@zV%BS& +&$Ty"`V* N]@E IA@@ڀݠ<`oo m@J@dk`C@Iڲ9"@s$:&T[&@x%@+z#Bi "f  e1`-qX@@њـGڀ@bfS'@ 2 |5 !@#@%$e&@%VS$! @aO!H1k`"jvO߀ڀV@:Lk K $" xSH&75 H%/#2%H&:&{ %@" h'`U ! t@p3*gꠎC`@n݀qـ@܀\ْ\ 30"!`=@%`[!ڄ$:&a&%#W H ΀&l FiH`Lkq @ g!@+ڀ^,!i``qt[nsl0?o v`r #@%a&&@׃$@!Y`mP3\/ Ӵ  2@@L@ـ[ @ނ݀@ZI i60s `H$ O\`**m "X %:&DH&0%"`<Xu p8|E$Pf@I@DK}n3@x`%h-5p|Y$Qc`(@t!U$@x%@e&%# ! 3pz`[ x)c@" }ހ܀HG@ĚqڀY }J4 h0 `# Vhk k{#~y%{[&&$@$6"ų(G` @@ȀhpB0k(m@:e1g@pڀ@ VehU @|")$@f+&R&V%=# 1@Kl G  ,@@Lj`$&@t@^yـzـ'f@LC߀Z4 7H%/p 3`@Y[!@!$@%@ff&v%$X!`1 ܎ 3Ex&M 0@LfP@u|ޠo&co@AMQ6L p- ?# X%S&@*&@`$|" g\P 2`*`(@w@fـ/@K@`om@eo逄vLIm0 @dJR6"@$&v[&gy%w#@j d=fp X$m4`!=W@J@aٚBHp@5``MzpMxHh z 4!#%?e&h%ET$!@?c Єe4PCP !` `t @@y@M@L`L L2 \u9״ #@ 2%G&x:&%@"@j}&C[E zn`-iE堟΄> ~Od@܀g耐ʹF0N`b@Ñ W!$&}a&%#Z / ~zn sbhmt h@̡z+ڀ,ڀۀSlmv)p8R6e0u ' @ ʳ#@%a&~&$! U ̏ڱн_5)7)@٨@ܬF Ӆ@࠼J wk/u$ˠ! ^@*"(%i" %:&@G&w1% "`@ӏ0 06#*@Z`H݀Li…`ϛ@v` A#P7h_p$&@ h\!U$%6e&%7#M !2x ĖCaPJxހ@Fڀ~ ۀZޠ y`;|.j@ ti@n @Rz#@z%[&&U$@D5"`Eo>^kX;J@nmzh䀉<@ڀ+ـڀtAݠ@ C Bg  PA`@}"@$+&R&bV%<# @nI .]Klm`D(H@{ـflM܀Dt2@`p /$@60 b M\!@W"$@%ff&!% $@2Z!'m \-ә~1瀤/?Jegـz i+l`xS2939M rb  >#`W%@3S&*&@-$y"q༓p HFT?^@j @/L@?݀(ـY݀:" @@zg3q!g#%@z@@ZfM*Dߠ1 0%`@ xR5  ![!@"$%ff&K%9!$Z!ࠕ8`ҏ J.bŚHtz D0l@@pJeIـF{ۀXޠN *@)lpRpFG2H`M @q @" F>#(W%@$S&*&q$@*z"` n0_E ז@ @݀$ڀــe>nNleHi @A 6 )H`{8"$&k[&1y%z#Fj -d w hkg:h3MeX9ڀɚـG' T0(d|Pj `{ 4 !@#.%0e&%S$z!Kb$#o/J w܀!m@MۀdMB`& o :d 1xn"@1%G&`:&%@~"?g@% vV@" xnr5h\H@_@ۀc @Rl )?1>H^ y 1]t!$@&ua&s%W#@U yA~m 4fHrm@ o @2e@@O+ـ ,@ϥg`@r@l961f0q 7``^ #@R%a&&m$@s!@U PbZ~,uX@}U߀W@ڀ̬ـ@ ݠDFlP9vġ' `Z(xlQ" %@:& H&j2%# @6%@ X1()0#@J݀K@}gO܀=@xK{Q (v8 '@ b`;!S$k% e&`%#@[ !1@3xb 臚0e@@@܀Fـ@ZޠN 6`0(3H)f@= @ڈJjl @|#@ z%[&@t&@$@7"`H`RBxdjPJI=h"k`J93yـE@A@}@f`Υ$^@F P& @ƻ |"$@1+&@R&'V%<# 3 ArM h4)3J@h'@@WyeL܀'@3@'2@R  ! \\!@ !$4%ff&@%2"$\!Vh9p (13ؘY n+2A@CM{eڀl[}ۀ?}#,qO'f44pIJ =o+ "=#@|V%CS&*&@$n{" PP | ( b0 , :?݀@@j@ڀ`z?`uo m@JhkH@6? I`7"޵$;&S[&x%Qx#k f`v e<;b`lU@YGڀ>ހ؄kf!c : @|`5!#p%@8e&%T$ݦ!Dh@%81bGrJ@ـe&%#C!`0v`( huP!c@`瀕@ހ@-H@ך@r@[ Rh9Jm` @\h@k y#y%[&@6&z$3"!G %<̭c L! o"mL@@o܀@ƷqڀB>頌`_eз @(`"$@g+&@R&U%@=#@ VCl0K `R5@lH@j뀑"pzz)fڀL@C߀31?h4h9@ @\ `][!S#$]%ff&@u%!$"[!JԎ 3 x*Dt{@0@@@JfڀP@z@Ȧv& jo(V@ !6h L `p@ | =#@V%S&Z+&$|"``@Up.D d`!`!@`cs@݀eoـ@=p lo@0Lh(@k`xGV6"$@&<[&Yx%@ky#5h d6! X[hn4@/@8WހG@ٚـCHs܀ޠ `0xc*  @x~`(7@!q#@%?e&%R$@!@8c``#hl4` ! t @2@J?@NLۀO`L T h= # 2%MH&:&%"`j)< [< (0nP$2eꠘE倚ۀe܀*}@@ӹx5z bؕ Z!@u$&}a&%@#@Q `w@zLj XbHwi`tRh@ހK,ڀ@,iaj`!v 1p jq .@ @ͳ#%a&}&;$! RFŏұ`_ 2v[ m@}пרG ׅ PG ~k@R4@ulӠ0! fUC +@n"@ %$;&@H&C0%" 6`̏0 6 " T H JۀϤφ@@)@v=@I#Hؓp;g,&@ ea@!U$%#e&t%#H !@}2|`P 7x;a0 nɀ U@@GڀϚـ ۀ7Xh6J`j` |@mfn Uz#y%@Y[&&S$@5"൯Eh>P*f`Ef|m"o<@+ـJڀC݀Ø6@K0( 4 ހx\ـ@f@oM*Bߠ5zO,P @`КQ\!@Z"$%@ff&% $@.Z!` e 0 2"p`r@}l/?J@dڀg@{ 'l밡J 8@M r@@  @>#bW%R&*&+${"l , =6^ A@&@7@ـ@]`?<`uk@p@GXN<|o B_L@0@67".$@&[&z%z#i cఄm sf>Y7@HB  sX5ڀ͚@Hڀ"5`A Ї.`6j=xV @<x-2 !@ #(%@Ge&%@S$!`e6 ("p-l2xR#"w ِ@v@ӄ@a@_Mۀ/ݠK bꀱ ԟ=6` w`,@#@2%H&I:& %"qi%@U@" <xG{q0,g@xԁH!@n@9@`"}u- c0е`x`TX! $&a&@%#@T tm ``gir 瀰j4ހ+ڀ6,ڀ@h wq0,gr ނ`@ @#%ya&&$~!`Tf%@ ]N,p@  q! $ %L m6w,l `|[` &`Fj"^ %:&G&0%@="@`@PV `4 - l;J@,Kۀ*;ĖFx. D4  `j`!U$%.e&1%9#M !<1qw`& h@=@`@@tGǚ ڀ@u[`Xk뀼4$bqp / jm @{#Wz%@[&&+$6"4@RK`8dYHk tj ">l@ٷ?@ݠY!` 5ilwPs }`@F@{|"@;$*&S&@ W%@/<#@ `>A `h@H 10#0Mk & "{ۀsـf%NE3@@r@aF<xv30B j9@X!@a!$@%ff&%< $9Y!Ɠ@P &0Oݗ0*}(4>^IIe@2ـ=z`%O)jPpmc0*@9K k@` n?#W%RS&*&J$z"J@PkՐ he q+>@ Bڀ.ݠT=l n cK8hl DGJ9@8"$[&[&y%@{#Jk h@ dn0ј@Y@ۀ@՚0G@܀@E`pq8bg&   z`m3@ !@j#ӷ%(e&%T$! zT`@ ^ hJj0*Y4u@ܚc߀e܀@ـM@$O``PO 8(8 ``h"3%H&:&%L"Uh#' oXp& 0[Dt@a7@Lj IW@)ۀ@ـLڀJH!``yp^/l%o\(@@s\@!$ &@^a&֙%E#R o `həhhYj`pd gf†ހ@+@+ۀߤ@ikPujmH0t  @8#%@a&M&$U!`CVC[h.DF耀_܀-L@PsJ@n7eyxB% X@X }'ak" %:&0H&1%r"mୌo| 2xB@`@KaL@ـ@92y&16z0K%`Nd`!GV$`%e&%#@R !@/y@N* Pef0ul 7}GـMZ` `ʜ (:Di@p ip {#@z%[&&0$7"*I6 D$Hl@A_jiZ:@ڀ@C@u@0&XYf, P P?wj h7{"$*&R&V%S=# `@ck(F H+pG$jd%@ר@ ހzۀ+ـce@QK*?߀38Ht)Z5 `@'[!h $@%ff&%$@EX!ʏ B.!(&`k3B@1Leــ|ۀ\Sြ* >p1N JP2H zH q  @ J>#@HX%$S&@0*&$&z"( :@~ЩQ PXcp>` N@@"Di>$n@7pm HKLiqpy=@`.O8"P$&j[&@/y%@ y#l 'd;`@C bg3PY _`V@ۀ8ݚـrH@Hޠb109nȞ {4!f#@%0e&@%~U$v!F`fXgj. @t`U܀@KۀݠG I:`xx:е 7}@k#1%@H&:& %z" :ga" oYRJ pPfr?1l`D@[݀M!@_ـWߠr wP,@H1b T@!>$@Q&ua&x%@#ӽ Vr`:~sr fi m`:s@:;hK@ۀM+ـ,ڀ@5krPl*ma|m ?  d )#L%a&&j$0!@X @ oc\4(`P` /@߀l܀̬@c@@)݀@H`Uh0q͡@}" ^(`}l@`" %@<;& H&71%# eࢱ 0 I<@ J݀9M@@gـ|܀ ~R{ 7$@8]P" @e?!YU$.%Ee&E%#W !.`yt ĕd0m ހB@Hڀـ@_Q]T #! -`mH (2`+Jh# @Svx8ـkeLB /Mi~pu0`?7ܓ `'a\!@"$ %ff&% $\!@p `2` ],``}`&.@A{K@sfڀ_nfz@@),m0hT00<4N Do0@ &=#@~V%R&@+&6$@My"`J@@ CHb7@AA@ڀkـ8 ?`{o`qIO50 g >?Fǵ@z5"x$&S[&x%%z#9i f (;jr8d6`{@g@W@ɨۀـG@{܀⠑`0 a89 l }5!#%8e&%QS$٦!`dx%У6Z`r Uـ@?Lۀs@Kఴ0 d;PF `X`<"2%'H&;&v %@"k3+ T0! ƖLp0~/gF`l90@@ ߀``13d> X@!߄$=&a&%@#N `=|l _PPfڀ9܀%@Bu*y :x@0(` 2g 3|!kT${%*e&@ϸ%#@?!3~  c  ?@@EGךـspYހ ⠮qХ8m>m f&e@m y#y%B[&&$6"@ٰG<ohhG@oi =W@_ڀe@Dݠ@``q @`|"@.$h+&R&U%;# `y ;lK МH0`Ln@"zlXy@*fLCe4@HYjl4, `B@]!@!$@1%@ff&s%$@[!5@7+ 83x< 0@@J@evaـz Φ *dk QM)6)L Bu` =#V%@R&@*&$|"Z@N& @`@`䠛o@@ڀ@з@ݠ@pUs!pLZm0ArJ@ @Z6"$&[&Wx%@w#j a/` 8c84@뀮3 @\YӬۀEHw`ZPpYhXڝЎ `w@4 !#@ι%@e&@%R$!`2c@ `#Ҷ4H2%@ x`ܑ߀/܀<xـLۀSݠI@ p\@C @\4 `b#2%H&v:&9 %@"`jq&"`W# in-|i` B`@}ـh@ߠ@uXP۹5z@f@ߕ`+W!w$&a&%#Q #pzn ?bؠoi`oK@e$ހ@J,ڀ@+ڀ+vm*(v 9pGe"q @6@ @г#"%@a&&9$a!U`@@[_p-@(T@@۬@ـ ۀۅ@J@k Z4u4& Y`8$ k" %;&G&@A0%"ّ' 6ܚP `ΰ}H@Jgцڀ@z`pQ#_24&h`gj! U$%@6e&%#@D !w2`x@ (n2a #dW%@4S&@#+&${"gj% ,4.^@ # ?ڀ6@g@D<`{k m @aNx j0pB`H @:7"@1$&^[&z%z#@Nl @f`e 3 jfzH2P@<Zۀڀ͚@Fr@ހ(@6pX?j^ o@H|22!#x%@!e&W%R$!``aG %2 %@w@f܅'@ـaMۀ3Nl0!" hF6 /Q #@2%@tH&@:&r%@"li%&Z! ~uvZ0 k`0DsсYۀ@o@۩@r@ɍ0~-RAPE_ ص~`J[!$&ma&@8%2#O m`^}q `p\`g`br/ g0ހOۀ+ڀe+rۀ`h@瀯sr[lr ` #%za&@&$8!lW`Г@Y00􀷐 `i@@ ـ࠸Hq6`wLǢ@o# @[&&`Kj" %l:&G&/%9"`~ 6 #N 4$& @V%e`MU݀Lـ=@Ȗ'Mx`6 &% ɕL4#y b`!U$%e&%@#@I ! 71 {` 8-d@= G`8Fڀǚڀ@)Y`^N8z`g 7qgo {#Yz%[&S&$6"M G@dA0dCTk njj;݀8ڀط[FMB݀^4: PvdH { @K@~"$*&@S&@ W%># @d m G ,ʟ DIk&@@{ۀ@se@J܀Eߠ6y`'D58ǔ @P@Z!$5%@ff&%$5Y!@I@ZP 80ԗA|b`1@C߀KNdWــ/|ޠ* ,n@qL %2l0p3F @$p@$ ` q?#W%SS&e*&$z"E@@' te D`j bd>@^@@,`Y=ln`GihD `M]G:"´$\&@[&x%y#m ne@- Bin5@ʘ@@W@@ڀ՚Hn܀4JyP%lr3.  @}6@ !#%)e&%T$`!u c  V B0a`! u`@@}ڀ1@LGLg_08` 9`@m"0%:H&:&4 %I"Ph#T0 $oP2 Ej`@F 1݀@@ـN@6M& Ǔ ]*4.&a@^Y!$ &a&ژ%A#N @-`>t 8/hE nt] af;@H+,@yEi@r`6qVo;Ud(1@t O @;#%a&K&@$!@/YલHe*ҳ􀹊?z,܀ @. Tx@Fj`70nyx ) `B]@_`'fk"Z %;&/H&1%a# *``pt 290 @``I݀JP@p@ї7}` k"r96 6Td!T$%&e&@Ӷ%#N !/u`rP X(f0m9`܀G@[«@g\$ М/085|Mi0 o,e%n @{#@z%[&&ı$5"$dF@/?`c0ugxK`8Xji =@ــ ڀA=`a@ 0G~p>X}"$+&@R&V%8?#+ `y@@o J 8+9K j ^%6ހ y}ـdeMAߠ.` *0 hc5 ``,[! "$%ff&%3!$]!`+ӉE 9.HpO~@90B.Lfn)ـy Y*@EpPR0WX2M m@ @e<#,W%R&*&$"z"#4~@I &c`h@6@`3͖@B D@!A*n >p%xM0Ti$AA5Hf8"S$&/[&@-y%1w#=j `]g4yp l>8>XXf@7@ݚ@tH c@AdS@ў @ 4@!@#1%Ce&>%S$@§!@f  #^.9{xtO@V߀@lKۀ@JO갪@7 :u `o=n#N2%H&:& %"`lZ"z`V`B t]r,@hPHXo@ߠx8 ˺P1c@ X W=!I$&Na&p%ǰ#@L Ply@m x\a`amTw EkL+,@@إ@k`w`lhBfPm @}i #N%a&&g$k!U0 ^4|1H )L߀P@|@ˬ@dJ DTl0`q(=&' Z (`ld"! %:&H&41%@"``*ܒҺ @0MP0͸``G@݀K@{ــ@Hs ` (ș&8e' `i@@!S$@%@2e&D%# ! .%x@R h;`@`ހ?Gޚ@ڀۀ[`Y C@@%Dڀ@@J@C`a5@ H^l I&`0~"@$3+&@R&#V%@<#  m vM d2p N|h`#ತ ހy7ـf@ L܀B`%3〕p~}zG7`b `@g@\!!$@%ff&@% $Y!jLr (U,X6@`x` .A߀xK@xeـhz@ ᠢ(qPE4 @N s@96 @?#@V%DS&+&@9$}" ѳ@ߒk l4]xq@@>A@ڀ?`o@q`0 J(kpF?@I @7"$&R[&x%Kx#k bஇP re [6`sj aFZS@@Hڀ+ޠ `P{fTt Vy`5@!#t%8e&@%@NS$! aq7!1"@r@@@UBL@wH6 8갟lآ@<N @9#@1%H&:&t %"@h`' CYf |0k`v/ k |C@@j7@ 7 `7d`dP`S@8`X@$!$@>&a&%@_#N |l Ӷd|P4k`q쀼f@ހ,ڀ+@.Al``xpr/hxWo  #%a&&σ$E!VWaH/p؏i䀂߀܀'ڀـ!@݀lI`i`2 sp2@a$ `X<*m5"@_ %@k;&G&0%@"@`*`MA] ȑ8 p@Q/`F݀1 0Pb?X/4 @(@]!X#$`%ef&@r%$[! Ŏ 3xX e{@-@@J܀eP{@ޠĩ&xoYMjh,xP q  ?#X%S&@X+&Y$|"T?4 ـPLۀWLPdK ē0*9` ɑ@#C3%@NH&v:&@%@޼"`jk&`.[`# (aYw-}e E堾ۀـPjڀ܀ߠ |`M``0fp1!Z !z$&}a&%#M  ;j `]hfio@ h ހu+ڀ@,ڀۀޠ]g Rz@Apj)u =! ӳ#$%a&(&@.$!R:SPZҢ) MsӨڀ' @߅`\Goa4u! Y`?4(4i" %&;&G&@?0%"`{`` 6 Ё  Ƿ`YK@JۀـФـӆĕv@ Y#ةDh2x!@Clln!U$@%"e&%.#@ !r2`| eЧe4젼J@܀FϚڀZ` 됋6|o@ xfn @\z#@y%[&&N$f7"p-I`P>zfhEnmhh{<ڀـ-ـڀAH Z[ge@ `V$`.@}" $+&:S&\V%># : |j0E .KVm@1( 8@{dfڀuMD5` "@IK`Y6P Ќv̗Y! $@%@ff&@%=$@W! lU H1Jpw@}2? Jdgـ{|+ m OLS3R@rI `tn  @#fW%5S&@*&@&$@y"b`@p bPv` {@?ڀـ@ڀdI<`k&m `1EMoPB@@lL:k9"3$&@^[&x%@~z#Il `fn+ Xa 2@!6@jX@0͚G=@`݇i퀱GjNhȟg vN| V5 !t#`%4e&%S$!^@( 0-pAP#w߀E@@)@dMۀ7N@p)P+ `{O6e `X \")0%H&@G:&o% "gi% @U! vHmjq4kꀜG@@́݀W@F"ڀu I2IM_py^X@!$&ma&@=%@#@K @l e!g9n 砇d+ހL@!+ـ9,@Ths m@M=gr  M#%a&&$!@gW Z $0]+ @i`e~ڀـ `.1L`$m#6wP( [`)mþ"@ %:&UH&(2%/#@ƽ{@/E @4`_`1JK[ـs@Lڀ܀͖߀|> .%8r!9h b@!T$%e&@.%3#D !11dw``f hॆ'5@Fـ@ۀ}[@ `e!4i0g@< x j@"m |#Zz%[&&@S$6"GG@`\AЏXiл@CL g hj8܀6ط[ـ@F@ &:A i@Fi) @@"|"$N+&@R&@W%(<#5  Sq0YC ((pPMg`& y@ـsـeڀfL@ߠ0@p0X3M @yZ!g!$c%ff&@o%@!$1Y! t 0̗Hn[y1`A߀L܀Ee~@@2|ހ!`\)rP-<@5<IK k@ =#W%SS&@*&@E$z"@ [`x a;P%>\ڀـGڀ/ @lnrKxr0hMP,@@M D8"Ĵ$]&F[&y%w#@Ak he`w mj :F{ @ـP9܀@vo/6/a8`  VZ!$@&]a&ҙ%y#I  '{Ыo chntzl@7ۀ*ـ,@lx_uj]d9Pk 4|`#U @#%a&J&$!8V@0@eJ`x3P4ొb@܀ /@ ۀt@P!Jf0%/*p຤P) a y R.kk"@ %;&@G&2%j"ҕdϮ `7f``@ IrJ@Q@Ƅ܀ y}`0@s"8;BB6h@[%@=g!@1S$@%:e&%7#@ !`,`yk ؙV0b܈GӚī@^@* `ל60:H"n wh`ek y#@{%[&&+$5"@^F$/;@6l K03nhl7@@ـ#CA@׬6aH @Z r[}"@ $+&@R&uU%@d;# s`oJ X /@KjW%ۥ@ yـ\ـYgWK@A1 =x :k5 !dAB^!m $%ff&%@0!$Z!`к @1.ޕ(PGz-B*L܀eڀnXxۀdހ|@*Lp@R,7`H `m  Q>#.W%%S&+&$z"-w: U8c ``. @@@݀ڀ@Eݠ&Aࠇqcl"H\xi@-AKK4"U$&@/[&x%-w#g Wg@@r@ Qg> 3栐V@c@vʚ\I @"@kYiI)d @ F`7y!#@3%@Ve&@=%@S$@n!;ob@&p8s@3w@kpM@݀tMV S> C`@r#@P2%bH&E;&%"l)N`IR ؓ^Ur/1hD7݀H!@nŬ@- D`Ι,ڀ-@#ۀܥ kw,qkcv }&B @#@W%a&@&e$(! U` k^cs1@l@M܀ʬ@e2!M`r@DTp0rPЍ" R@ (@lg"@# %>;&@G&0%@#{Ւ. 5d,@ꠐ@G@@bJۀFـܤ@@`Nwg @H$H@/8`n%'fi @G!V$0%@2e&@B%# ! 1@xpJ X3`Z @ހ<܀G@˚ـdiV^ `I`a# !  mpH \-`]Jp+栭 px@@e@ LB+3@[ଂ@8-o ʑ {uZ!T$$ %ff&% $@Y!VT#P к5 .tx2<@uK܀ve_@{ `%iPKP9KS So@@< ?#W%DS&*&6$Ey"`@ߎPx pdXP p)kFC<0lu`PJGk C #M`9"@$&@[&y%pv#@k `_ @ ie@(1`{\ AZ߫ڀGڀ܀ 찝?kJ %`]y 2 !~#%8e&%@KS$!`@R %ps6 "Nv8@߀@TMۀNွ ?ꐧ`tlxH7 g#@=#2%H&/:& %"k '@;Y P|Dwpn/@gvC _݀7܀@pB3dǶZ@Vf!$?&@a&%# 1 b{|pl P_fujހ+ڀd,ڀѦ`Gl gxprm _o   #%@[a&&̃$A!S`BЂX/0`Џ@߀@cـ!'ݠLih;sl\i$ o\@B*h@9"@ %l;&@G&1%@"``$F:T 3(#p7 J(`F݀I@ @@@@@`y 0܃0`  `j=@Ԫ!qT$}%*e&%@# !0 vh  CsM^A`砄@@BGڀÚ6ۀ[ޠ`PP?~>Lkr*  t@mhm x{#z%C[&@g&@ܴ$B8"J v@Ep^hh@XGk頹i:][$ـ@y`T@8yev 0r͑;`z"$@*& S&V%9# @k ,lG +2Q@f)@aဣzـ{@"hLC@q4@@]͋H({/< /@j[!!$a%@ff&p%$X!@ X3ޝ{*@JeO@c|ۀ2ޠئ&`rkaM slo149L ` q  ?#X%@cS&I*&$@|"`N8w+ `ౢ ϑ]>}ـѷS@=@mo連LH1m` zENڹb6"@$&u[&@`y%ay#j 5k@"@  0cD@/@렡 (TY@?[ڀٚـHH}ޠ`m%m0 z4@!#@%@@e&#%R$!`@_`(4@! G@t߀ՇQ=@@?NJ$0lT 29 `C`L#E3%H&:&%"~j`e&@'|W# @pwl6fmB倹@@ـl܀ߠY@оإ+ef`75W!@s$&|a&%@#@ D@czHs _i]F@m`k hހ@t+,qŧ cg@ r`b( n P2q @E(@@ #@%ka&@&+$Z!@X 0_:hP$ڲ`p ߀ڀـ@ƃ`bGsP*=@u(d @-^3@+`9i"@ %:&H& /%"͑`  { 16#r`TK-@LــՆ܀ɕ߀z @< <84!e r"!@+X$I%"e&%+# !@5&u`e 0]6e@X}`DFڀ@ۀ\`X6Pj -pn @5|#z%Z[&)&K$@3"j@'I`Vp>pM~E ibh(?}>@. A䀢@bHdglnP 3`U3{"$+&R&ZV%<#@  uj(E @ *P<kOOm*(Qြ6zۀX@>ـdIIߠ5`] p-(;p @،| җW!c"$%@ff&%:$W!e ҄0R 1} 砍/@D@Md@@ـ}'mXT\3@N 5j u @#X%S&@!+&#$w"]@p0 ^@@`8A@O@ـhݠ?0h q^qNȐ*f`v>G O`B7"@6$ &][&x%x#@i i`2`" kHP-L 2/`fXހڀـF@1>ȕe 8o ~U|[5@ !w#@H%Ge&%(U$@E! ^P#(28@Csࠕ߀ـ@Kj )Kဌw 3 ; n >@}H"]1%H&;&@ %" c%U& 4l@4k G; ݀ۀ"@ߩy@@*`f@û0-R V_x dX!$@&@ma&;%,#ĺ ``@`h `xepbl@z sa@'ހI+h+@@ޠn@`s mEgp| `@@ P#%a&&@$!aWSpк]+paw߀|n! @@3`A ;ep+6wlآ ( ;W,oǾ"! %@:&@G&V3%2"t#@(p z9JPD @Y ,J@@Kۀ@)ڀ Җ2&|)(ڕ]4ذ , `f`@!R$@%e&,%}#@ !` .{ Pwc`R @@FڀـPD@] k`X8=0l  do |#h{%[&&@$6"BG<nxL E@g g8݀eـE@UB + [ _  5 |"@$O+&R&$X%%<#@ ,`Kq ~L 0T ([PDk &ހy@eڀJ@@ 6`T퀈0{VЏ3 ҝ ` R]!$d%ff&m%@!$[!`Ŗ@<`m P 0× `G.>@L0`:|p"e @o@ek z#@w%[&@x&@)$5"`XF';b`@K(`hfbl`<ڀ@@'CF@/?t:kܳÌ @w""$+&R&sU%@1?#@ oJ ؒ`a9םKaQ%֥@ ހ{ـ[g[KA߀1 E`b@CHt5 )jFG^!#$@%ff&q%@-!$Z!  (.T֕ 0?`z `Z3@=He@n@@Q{@ ޠc*8h0RP57jQ 1v  @T>#T%@&S&*&@$@T~" '`p 2@ LcW&@@?@@`+Aࠍqil@5H0 j5AR D@̱9"X$h&/[&x%z#@g `j `Igz3 @栋 +[@`uڀـ^I@#`@)rai18m @M7~!@#5%1e&%P$j! 6@ibph'N.`$@ w~〻 ڀkq@MqݠyM[` ǔ+P! S_I@v#@R2%bH&]:&%"l)`lZ" ГHVPMr0(1``D4݀@mـƬƪ@܀;KGEH:c @KZ!E$&a&f%@J#Ž #~m (ax0tho :k;@,ڀ@,@h k`w4qxC kk0m UH 3#@Y%Ka&&i$#! UzێBY1p ~`@I܀@ʬ@fـ4!@݀wࠉK[p0rDt " Z""@l@k" %>;&G&/%#u `@& 5p0`Gဎ_Jyـh4@@Tw`/Ъ78v-'9b!@V$2%2e&@%# !`1xJ x~*` S`ހ9E˚ڀg@mVcih< g] @ 'gl z#'z%,[&p&$4"൷@D`2B0P`x)Inl逹q ;$܀pKـ ?b_]c|1 , ߻` @y"@$*&@R&@U%:#@ A`m@H x-UR@nh#`@nx@@lـg@O܀B03a``In0X7w ` ;_!@W$$%ff&@%@ $Y!PM@@ `5s%`x`2A@rKc^{ۀO௥"%qPK T/0@jJ w`B @?#W%R&~*&$By"```ɖ0 `\X|`h"e,?݀@@ڀ<6lm JOu0pC`)M5"$@&[&y%z#p f 9 aeH:Dڕ@W =Zܫۀ@ـG7`@Gk Ƞ ,dy2 !#%8e&%HS$@|!`K %6"`Hv2@@ڀTـMۀ HûLP|Q7 `o*M@@#2%G&.:&@+%@"k '`3YP sjop&8 goC @[@)@ڀ@ߠ `) d϶a V@!އ$&a&%#ü `s|Pu _o`Zm c j ۀ+@@f,ڀ@զ@.f @xsr m go   #%a&&@$dڀPPHw4d`0=9E 7 @V!!$c%@ff&@o%$X!4`s 3F @` 0EJeـdـ|6ݦ`&ykGV{x1x=AL h# $ ?#X%dS&@V+&$hx"@ @H`10oP#  _P ʑZ>@|@ҷUڀ=@mo @LmE@N߹f6"$&Z&^y%@^y#j /k ~ xcд/P`@h#PY@<ۀZڀٚ}F@ໂuXc^ ୢ  z !4 !#%@@e&!%U$.!_@ 4?@tΑ@҇O@=AN`O@+0D`\ HH;9 @`"0%H&@:&@2 %ʺ"`d`_&@  uW X~ne6_m`HX@n@߀`ඔX+fn }]P >]@!$&-a&%߲# ,+j Wg>@ms`b@ހr++tɧ`m @rk`$Rae  Oz L / #!%@a&@&)$@!X@ @Г_- @i@@ʃ`@堚k02=pM& @U``+ n" %:&H&3%"Ǒ`wr 1L.꠺ OK@L@@׆@Εd〧z` '`ty2@*ew'!Q$@%d&%(# !`H/@|] ߑepa>@F@ۀ\` @7xYpj0 ji@n 8|#z%[&&H$^7"@ I@O>гPohZ`vE@@i\h 9@ڀ=ـA`O j`,]v] ;@l `{"@$@+&@R&X%<#@ x@ rP E h*3F Hm$(-; 4z@W@@d@I?`5 d བq1 ߌ@חb\!%$%@ff&@%@x"$W!`ۑʄ0J {(x0܍ }/?M܀fـO@}@ ' m0O\d3& N `r` @Sz @#KV%S&*&@!${" `E l4g@u3A@N@ـڀk`?nSi@fzN $3f~`w> O;"8$!&][&x%@x#i mc+< Pa @87 X* )`S@ ڀـHW`!=@e`~ ` \|`a5!@#J%Ge&S%@%U$@A!Fe1@ؤ2h0P RI@;fڀ}ـz ޠ:0栺n`P@>jQ5 O t  =#V%S&@*&$z"6`g /$e@+ ݧ`h @@ـ6@ 1 }`6!@(#ڷ%)e&@%@hQ$S! ec+)(00ɛP8@qŚ܀w@@4L݀VL@0.x=P  ט`{";4%" m`o*@Sc x"t2?b-F ݀ـTڀ@܀`u`9?apH(Y!$&a&@Ț%# Y@Z`o cu9jp`J ol@*ڀـe-ڀۀ i瀲}no`;ik 0  #%@a&&$!`.V u0[<0)P0E @;@˦ڀ1 |݀Z-Jn4/:p$4̤ Y@a'uk", %;&G&@w0%c"ƕ  P7бnH@jJŤ@zv "˗?@0k%Lh!RV$f%9e&%1# !@3 y\` 舗"Hb j@,FҚ@ʫ@#Z5u0:x3n   e@k z#@y%[&&&$5"`QFCb(J@! %n頮e<@q@ڀCGK6`G7pH 9v@p@@ W>#2W%R&*&$@z" `ZP C|>ZO`?ڀbݠ;`q5t`"0HmLs=BZ K`ѱ4"Z$&[&3z%@'w#@l Kg` @g Hr3`E@ @'[yۀ@`I/@zji}: w7 !@r#%@1e&:%S$@Ġ!0bb@ s@ln8_p$ wyړ@܀k@r!M@`G b堷PPДPo5 @ey#T2%@cH&\:&%l"l)`@Z" y"` @ –( L a1``_ @(?@ڀـmـܠ<@?G@Úـ9@ [ _PO8(5uh@; @xhr {#@z%[&0&@״$:8"İ C`Pf@ qP0>@  k頭i`:IVcـ@@ݠ@B逳AXeܓ ˙`G"$*& S&V%@=#  @lF ~+ DHn )V@ zۀ|2f@AI>`:@l@@9ꌗE9G @r[!$d%@ff&m%$@X! l 8W*`0@߀Jg@Oe@|:Ŭ-kpM1FIL q* ` @?#X%@dS&@G*&$|" \@*Pg i`bőV>@@{X=@m gL`BhOdpE@N:"@$&@t[&Cw%Zy#j dw (pcrth/@Tހ9YٚـKH܀@(`|u5m_{X 6z&4!#@%@e&%U$*!`f p48@ 7t @ʑ@"@MڀـDN@5ݠO1|=C9 2 O@#0%G&:&0 %޾"`d@@mW@ TnP-@he H`S@@"@@`g蠾@ =5v]` `+`@WU!$@&@|a&%۲#@ U@%8s |g60m`s@ hS@q+,@7Χm$rk,iexBBq 5@ @#"%a&@w&.$@!XஓPp_ P-`ʲ b`@&J"̓݀oGk+ | U& <^A$n" %:&H&j1%#`oj x1t `JK&;I@@@نڀWҕ E (2! 9`$e|+!@U$L%He&%%# !B/up בjeh@I@[u@H@\ޠ :0 7bj` @Nci <|#{%[&&r$[7"`I A >afQ N xiVh@9ڀ@@A` U䀰@ lug `Ccŷ`"$@+&R&VV%@# r@ rEN pT3+|F&e (`(ဴހ;wVfM܀?ߠi/j}Ɩ a01 )ݗg\!h"$@%@ff&%4$y\!X = r(,ԍ} 5?@J܀fP%zޠ/@!m8OPeNm3P/`!N rb Y@ <#X%R&+&@p${"S߷0=  ^o.@A@3ـ7o` ?n q@N,ho @>(H J@;" $"&][&x%x#i gc 3 kt/7<#"@^X @Hڀ1@ ․Eeh8P  ǃf5!@}#%!e&R%R$=! `@e@*p*Pp2' 5s`@eɄ@ـ@Lq݀3K q`D $D~ @O `k"3%H&:& % "n+ U`7  u+c@`1@ރ@#@ 6@ӻ&7f_@@nX!$&a&8%&#  yfq hg [QkDr 砤mC+-ۀ`hb |0mPWg)j ` V#@%{a&1&$!`WWG`]X+ߔ`k〴@<% ۀ݀=`H9mP{-PenQ  _>&_jξ"@ %:&G&0%+"@`ɹ i9x9 PϷ N!JF@|KۀEڀ@ Ȗt@)hlf>#@f !U$%Ae&@%@# !>4`s` Xf,pZ@߂@5+܀F@ښ@Sڀ-9Yଢ`88O8l U`kj Ly#Ty%Z&&@$2"8 G<tdpL@of >@@aշ@^ـڀtF5@D@0s_@k B @E` @' @|"@J$@],&R&@U%@<# !H hmL k1ppMk y@@f4N܀E0`mcP(Fg3 `@@[]!#$ %@ff&k%@$V! /^p `j9gp`#|`<.@CNIGd}@@z ^`o)nPQFZ5F t< @=#V%S&@*&$z"}@P#`_ ' \#`է;I @@`ـ@:ݠ@ Bp@r)!#G q C@gJ3"@̴$`&@[&x%w#m b^ irL5 r栴\@I@@a`@pgUH F yv 6!@+#%)e&@%eQ$@!_`c06 Ȇn0? 0L @qIޔ߀^@@5@L݀F"P3` ޘ"1%H&:&+ %:" =h`i*S0$ @j2(jC?@@ۀD@蠟~/2`jpP/Y'!$&\a&@ƚ%#@ SZw}f 8#cm1j`pC Kf@@n,@ـ+ۀi‌uu@rxHDit K|f #%a&G&$@!)V@m'e)@( @ɦ@O1ـ `_3Jn7Cp#4W%'S&*& $z" S Ύ X;5Z ?@Ge`;`qwl "5R`v8j `J@a`K@4"$&.[&2z%z#l @Fgg X8gti3 >怀@Vހv@ʚE@)܀6riC @ @w1!u#@8%@1e&@9%S$a!@)`\b pk@=e8`ؙ [ @w s֓E @sـ$M@MhPؔw5 `U}#V2%dH&\:&@%@h"`!gB"@9 Zp" M E@).`s`A. / U @e w[!!$%ff&@l%$i]! @ N*@|0@@߀J܀ e@ـ |ۀ> ˬ`-栣sxMP21 RL `"q  u <#X%eS&@F*&$|"`p`V1_ l_@ ER>a@@=@moLJmЯp< G :"~$&t[&Zy%u#j d  lzh 9@`[GY@Wښ@MH@`.}PcIP >R ,4!#%e&%R$! f@`# wj*І @0t`ۖő@3sKۀ݀J7m pB` 9@ǕZ"K3%G&:&- %۾"oj`6 eW  wmw-@ae`B`N- @܀ `n@Ɣ`E5n]ȯ1EW!$&|a&@%N# `Ozp0s F]0ms@+nѨ@),ڀzۀހsg ozk@5reJ`5h [<@ @#$%a&v&+$M!`XP_vм-@[耷〾߀ڀ%ــ ݀ uGkP4lm ^& D^H+@Hi"- %;&H&h1%"` g`b 1$`` DK@" Lۆ@ו z 0 (#<xM!`]l @/!U$%He&P%"# !`=/uN` CHN\`AT3@F@ـ\ A;!7jpj ii x#x%[&&@p$2"[I@5 lXfeE`5qPh`?@܀w<ـ0ـE@ [䠷yH]$m zB@"$(,&@R&TV%<# l` ^j0I`OM7">$V&\[&x%x#i bc`?0 pk~`'74 @ZX@ۀ H4@ޠ&E`PV0e5q/` `=̓;!@#M%@He&%R$@!:e"!@a֞2``| /s蠏@߀bȄ%ـL`P`@H 6;@ @VZ@p"c1%@H&@:& % "Ti+ Y U / |l4kꠟ@ڃ@@$@܀}ۻ/7h tX!$&@la&(%# ypHh ^eIPb`=r@ `gܧހ,@-"Ǩh|찬v_g 2Ps @z``&@ @Ѳ#@%a&@&$f!nQ@ ۯf“x+@ؔ~ 9@mـ@( `H@mB6wYpc9( @SW-`o@Ҿ"@( %@;&G&0%'"@fו x`9Ř pH@ZD@ByKۀ@/Çߖ͖t`о >`0#@f!U$%e&%#!-z ],0c`؂`@QH@ـT@0>Y@   8Wl @ko Py#@Vy%s[&&$w6"`nG<p$ldH@C@o`m >@_@շ_`B @K8T_@K `-dXx"@$@^,&0R&@U%<# @`h@8C bb1Ms &@yۀـf8NE 7 tjp8o(3 @S@b!#$@%ff&i%!$[!( Wh /CU|@6.>LFdڀ0z E\"@nPQOb58!P lB@ =#V% S&*&$z",`w W `\`@4 @@!ڀJ܀$@Gp@r0!@dP0hI@`mJ`w-8"$a&E[&@z%@{#h b`@5 (iڑhD5j@``lWހ>šـI@܀ޠ ` qs^pW vp0@!#@%Oe&%T$@K!Xc@~ . 8J:0( ?y`〵Q\kL`L)` `,< 3( ౙ"@1%@>H&:&@) %6" 8h#\$ dH(t*!j`!F`g~@C@w܀`@/Xj@67`  Y!@$@&\a&ј%@# H `uf (cd`)jp`= Ff&@l,ڀ@h-@i }u~olLi@t  #@%a&E&$! @Pf0[= )` `@܀ڀ@B ݀d9Jn8y\N@ Y@'k@" %;&G&s0%\"P` Hம P-Tٖ Ѿe޻HJـƤӄ@@*v@"ܗ<,0{%Zh !@˓߀eG@ i$XęQ8x)X `iX!V$6% e&@n%# !1x* pi@ FGʚo@[@t @cV3DPpv I8gl @t~#C|%@[&l&$9"``Dk0BY`(jxIdj;@jH@@ڀDࠧ䀗U3f``xj8YcHl0o @?  #@š%a&&$0!`Y@@\ad&P r@{܀ــ6 Fj2j$$ \@ [*`1hH"@ %@o;&?H&1%@"` *`{3 3H@- gL@@L7@q@M܀Ӕߠ6y 0>&>:rp# `t jSE!@|T$%Oe&@%g#! x0vPb 0!t+^(ʅ`n@;GÚ@<@\ `՟`L95D il `@hh {#z%)\&.&@$3"`~uJ7`z4P~(tՖ܀1@<@vK=O > Ћpu T9 A@Ε #"0%H&9&+ %@׾"jj@-@ @N n$exnpM6Ze@A@݀+ t5 @u͔ 0N5f0` 8 KW@!$&{a&%ղ#@ `H`z j =Lkg@ds$@h %@n+ـ,ڀ}ۀ֧m` @wz0t={epSRq `x`C@ #@&%a&&@)$I!@R ``Vw@- @蠱v܀@ـ@Ճ `{Gk 4utv쀗`f& `L^O+n" %@;&VG&@f1%@"vc_ ` Z (B;p@S@ਰ|E@@L@݆ ܕ&s r+<U*@1eѫ!U$@%"e&@O%@#@!7/@r|`G H;|E\P@:N .8܀FڀـڀۀTXހ  BP؂@Bsj 5`in @x#x%\[&@%&m$2" I9>DOf]E.qn䠰9w@;Aݠ`a䠾`P]u S`ѷG{"$),&NR&RV%@<#@ gr@VjE |3y@KO`2m @,-@˨ހnosPmLhg:%s F \#%{a&&$b!iQӯ@]*+Bw tlـ ـ* ۀ݀GHHmJ6`w0l [WK&hj@"* %:&/G&.%@$"`a]Е D` /`x @@UDwKۀـHڀ@IA|& 0*,  f !U$@%e&@&%#!34 s0 hUc@8 ҂%܀OHښ3BYޠ⠅eBB`Hl e k@o |#@Xy%@s[&&@$@s6" .G`<cdC@&g`m@>@]ڀԷ_N>>@@R? qilp ` 3i|"$E*&R&@S%@<#@{ : ,q 0C Ȕ1Mk-y@fJ܀E7` r(3 @c]!S&$%ff&%!$|[!`O` /8M``|{0.>߀HI6f|}`J |)`n1HW0k5 P tH @mA#V% S&@*&$@z"`'@qP0 \``S@ @݀ ڀ!QN:ࠟi@r@lP(9hpw"IsJ|18"@Ѵ$@.&D[&@x%w#m h@ , `_;5b@pןhWۀ<Ú@;G@ . %g 8_ @H }@v0 !@1#߷%)e&@%`Q$G! U\v0& p>0A&q蠳Ք߀NrlـlO fL@ 0E430 @(@ @#@1%>H&:&' %@3"@3h`#\$ ' tP2j@F`݀lDـZJ 䀊/apW0>@XY!$@&@\a&@И%j#@ o @oY(\`!jp6 @f"@k,ڀـ+ۀޠi’瀄u찆or!t ÄD  #%@a&D&@$x!`\`@C [vg38􀋊`@耠܀3@ ۀݠi?J n` 80y `Y`p.k" %,:&H&p0%c"L` }@޷ m7<ɾ^ش@N်@J~Ǥـ܀ǒ }`V ">m6N0%b h@![V$%e&ɶ%@#@ !`2@zyE xoUa@8 Vw@'F@Қ@/Z E `[0{1DMn  `ek @}#{%[&&$5" ɸ>FC01Hwb@JkLfJl<@@@oـ@6C`Ւ Q @\kh 0 `yn}"@,${*&GS&W%S;# V @uoЅJ pJ&@Ki8%࣫]ހx^oeڀgKA@[8z蠌@f`e5@Ŗ F >Y!| $@%ff&k%$Z! u  .3͂`x ,BLc@m@U~ۀx *qppI`ڛW7H m `@ 0B#tY%(S&@*&$ z"Sp Ldcpy@?@Hڀ ;jl" Id%jWpBo R9"b$&@[&@.z%w#g :g  L` Hp)2 v {V@UۀoڀʚـGڀ/C砐xiJTp/ g`7 !{#;%1e&6%@S$Y! `Ob@ [h,<.PFk$ @p̓@jAـ)Mۀ:`Mt@~? `a9#Z2%@eH&@Z:&%`"l`6" P"R" <3h1h D`@^P@cΪ܀ߠR@ge1@N`:c@IÎ`~Z!P$Y&a&_%#@ [C~Pv XãawNq@(w $k.ހp*ڀ@,2@(k -w0Tq8}]av s@ ?#`%@a&&W$!@Z@zٖD4cP'`a 耽@<܀@Ȭـ\>!` D h9`1rЦp+ Z/)gz". %B;&eH&Y2%#`஍.0 `5xc@@@qG'M@A@j@A`kw @q$̙g@l z#@/z%\&k&$4"ݱKkC9QjI"dEd;h@ـ@Dݠv䀞 #@  m`H Xh-wPI@Qh`#@@v@Z{ـe@L܀B, =NkRz7 @Z!#!$%ff&d%z $Y!:3ō p",ƓL``1A߀eKme]@x_@V,rПT/@vS @zobY @U;#mU%@GS&z*&}$2y"@ Q \aZ@` M@Ғ3C݀@ـG`TBMlnJql6CCF̸9"$&[&y% z#f e @@ nGv1`'@A-Zѫ"@G@ Z =`ap J@29@ !)#%@9e&@i%=S$k!h@]}%XI:,^u,v@ՄRـJaNܴ c X֖8s7 ``F["@r0%H&+:&@ %"`k'` dP@ QDH@NpPG/f WC 3@@܀*@`=Xm3:ed!Vz!$E&܎0iS @@hm w#x%[&&$3" `oJN@3h.G@rJp:K܀a@@ݠ@2ʧe p@u@ "?$+&nR&V%=#@ I @lF e5R Qf^"`e@ z|+hL@C4@|R^9_ T`&М@`!!$h%@ff&@i%#$X! =*rxy@wv`0@@9N eڀNـiـy@ &@sgVb1_bL y ?#U%R&D*&@$@|" IO0 P_ M එK>݀ڀ_շـ^ jCTto @L\$id0EG`1u6"$&Z&Wy%Qy#j d@@ VcZ8P `@ ?Y@1U@ښJ@܀ޠ- <Ѝ`Om,Z s@r:!#%@e&%U$}!k_p#z4 tϖ@߀܀/;ـxK@J@D`} ˜x]9ཹ @@Օ#0%G&9&%Ӿ"ej G&```P ׏\pn-@CmH`s) @v@|ՔV5'f @>`PW@!$&{a&%Z#  z j bgmk 砯h@-,@ۧ`m :r0tho[[q j #5%@a&s&@$E!Rp@r_Fo-N >@R"كݠ*`gNk4u0, T^V+n@" %:&UG&.%"q `Q Ю1O |ꀡwE݀Lـ߆@a܀`zy p44<X^*@O7e7!9X$%"e&@%@#!`n5u0 5t epP`G(@@HڀXXޠPH@Jxj( in E|#@x%@\[&$&>$@O7"B2>`@GfhPUE`@cin?s@sڀ@2@A (`2䀡@gD1 Zx׷L{"$+&NR&T%<# a `r`D  )pPCO@+m%/+ ހ3w@Rـ@fڀMD5}ɍ,-12 ``s\!%$%@ff&@%,$l\!`@E`% 1+Ж@Tux`q/?I@f@?@&}`!(@7mpPOp~3H:N r@w @ @#X%@R&+&$@{"`D`ͷ}M0$ H]p̠@]y=1ـy9nx NPF$o0 fGC@IYU7"B$@&[[&@x%x#@i Vc`z` 8naL7$` ܒQXހڀH n` ?]e @ `v|`;/ !@#@P%@He&N%@Q$0! ]!2(@m!sٕ\ۆ%/ـN BK૷pXp] 䮚G;p_ @e f@#3%H&:& %" Ji@$p@G^a&  p0up+ c@wG@"@@%@G @й-J _~` ~X!"$u&ka&2%#@ `>^08h h>[88k.r[`ug;@+@o+'@ h)`'|Pm*8 q C-s @ `#%{a&&$!GW@܉˯А]h+@@;`Z@߀܀rڀـ"ݠLH OmR6w< bW -mjپ"- %@:&G&0%+"\W``@ XO9p 9O@H@JڀʇđߠOH| ֈ4#m`$!@U$%e&$%n#! .4z  L8cp@g{@"܀Fښ@WR@]  /hfv l@ d@j @}#q{%s[&@&$@o6"`G@0<Zd({Cgf`=Zӷ`@ڀgB`YGp0zi  \ n|"@$T+&eS&X%<#v @4  hUL 0^'1{Mk`&ͬy Oـf@>N܀@ߠ7 3 `'X!$%ff&@%$V!@W /P0vt`+.>߀EI܀Bd@|}@ޠO`)n0Qs5H2F lT `N@ pA#Y% S&*&@$@z" kВ le`L7@@@@ـ"TD@.@ࠥij @! g`ap0t%Fڀ@ڀի4Z`L b01xMe &mlk @z#{%@[&&$@5" 8Mp;|lc0A@Efe 7@@@ـڀ9Cݠ_@W VhDekp 9 P3r}".$+&R&W%@ ?#g `P WmoPPA (h/OK@i1% Y@{pejK@A2@،@n5`͖  aY!@ $%ff&%!$@U!o` -T0 Ƃq >3=Lem@^{|a`* xpR@A-pQ `m @ :#@vY%S&@*&@$@z"@L h ԪcP. e?@@IݠCAjl[0I-j`_P Bv`Kk@9"d$@&,[&@,z%@z#g `D0q p,P3`+`p[n@n@Gڀ2܀`@ i\ 7 `n7!~#=%1e&@%S$@U!  |i@pS輺.=B@ wa@߀܀ڀiـvYJ@ݠM@{`(?J y@g`"]2%fH&@Y:&* %@]"g( IRf 3h+#r1{hD@!@:!ۀhcЪ@ ߠ n n1VBc/ʎkZ@!@\$Z&@La&@]%:# =}@m v4k@oLh!w k)@-ۀo*,4@ޠ-k 4w0\qaнm @{` C#a%a&&@U$!TsҖY@u1+Y[I䀉8܀ڀǬk@+K`h19r$BD٦, c6 )l}"0 %B;&@G&W2%@~#W 'Ĭ z5۔а` k@G{@%Mۀsـjـ"@܀ԓ w` P-Vb8U'  Zb)!S$8%@1e&8%@#! p+w F`p-8瀣@Gڀʚs@u![ p`#   m0H ~I7̛PIJh# ހW{@@g@ LB M3`pzA m[7 @P_!&!$%ff&%#$Y! 5@-: ,sWDx1@A@G@leڀ]%y ʥw3rT"H/~`J xi_ @)?#oU%@R&y*&z$.y"    5ȿaR`A` @͒?݀@@p@@YB snJHz8l?C@IF`5"$&@[&w% z#k e` p6e?0: @<UΫڀـIƈ0qk!Jx} @  y79!@#@%9e&%VV$g!`Uv% _6x֗mR &v'@Rـ@MeH `j־s{7 `4@M`R#t0%G&*:& %"`|k' Y ?Epp?/f5JH@@2ڀ߀= %Eu3C $ep@ 'V!@$F&a&@%# <M|k `_pyo@5miۀg-@. hl`p)sHs8mH}o @@ #Ś%@a&@&$(!@S @20S0Ka^S/`܀@@! Mr@2pt-X \@g*mO"* %:&@|G&x/%@"``@# 3@8@F@@I5uSܔ CyP-O:Ѓ0 )  c^N!W$%)e&@ܷ%#!6`{vI (@gW~ c|܀Iš>ڀ@oWޠ `|\>/i[  h@m {#z%E[&`&@$3" iC F@i^ &G@jDp`!@@H@ @!@݀`ҧ e$\ @@`{/@z"A$*&@mR&T%=# @B  tF p"+I Q`n`X" ` wۀ}8f@`PC߀4`Hx/@m x[! %$@j%@ff&g%@$\]!@`N 3Fj qv0@J@e@Nj|ۀ` &k밐M 9;(hjL `9q` ?# X%R&Q+&$Ux"@a`)`G J@ ڀ^շـ`@8ZtpwLd|npEN6y6"@$&r[&Uy%u#j d Nc(8PH@;Y@.S@ښRH@3B@c_7hc `@{`.@ !>#%Ae&%R$! d_ `# r4 `tʖ@-ڀ;ــNN@ JJꠛ0 0˘f9 P@ܕ#Q3%G&:&%"`jA&  NW`4( ]S@hn~-KeA@?ozxڀ ݔ H_540 ]&]UW@!@$&{a&%@ϲ#@ "2rj ]Hms@hۀk+@+@@ߧmzkN%o  cq rP` #)%la&&#$A!R@vi_f0-p G@@T"/G@k`Y=@u 4 @U + Wi!"4 %:&H&.%" m P H1`C`@5K1I@܀@ z` @$p2X!`Vpl`;!!U$Q%!e&%# !h5 e|8 X*k4\pH`+@|"@Fـ ڀ@\ ` 9,7؆t1 "ii @I|#{%\[&#&@<$@K7"KI`$ >>fؤME`\i>h ?@p݀:@3@A -mAgܡ ¾Q@{"@$+&S&T%9# @[ Gj0$N v) P;O#m(@ဤ&z@QfM܀D5:@э~1: W!t"$@c%@ff&%)$W!ߗ" (1}Ȗ@)?߀I܀dUـ(}2ޠ&(`>m`XO(3pQ0BN r~ @#X%S&+&@${" @Ƿup0h ]`YŠA@J@@@}݀?`ThuiPNNoО> K@P`!Y7"E$'&[&x%x#i is(0 eaЧ-`MXۀ@Fsne @}|@}5 !$#Q%He&%Q$!~&eP 2p s@~@ԕنڀ$Nۀ HK P`0x@P; l #@3%H&:& %"c $iUX& Ll0|4@k@`σ%@ڀ@ ``- _ƛ`d^!%$&ka&1%# @8WpEq hE[k 'r젠 og @8+p+`n/spm3yg @J| "`7 ڲ#%a&&$!`BWF`Չp]y+Ұ@`Tp@/ ݠH@VmpZ6wX R( jW W&o@ݾ"@/ %:&@G&@0%@"Qo F9ث @3 J@EN@@&ـL͇ ߖ`O|耱)@ p4X#  f)!U$%e&#%j# !- z  xD_~cPxĂFـXڀ8@]‒9Pl  @t'k@o Yy#@s{%[&@&@$k6"# NP<`$msCgf8@XӷـJـ@kBH䠅頟i @d d'? |"$@U+&R&X%?#q `  - `hC I1(Dk&<@| ــeڀJ܀E`0@P(x3  -@l]!$@m%@ff&%$V!@AO @l&鏗n~4>@L@d/z`8)n Q@h+:P t`[  =#Y%S&@)&$z"`Iݑ> ܖXe@1`{@V@H3@Ypk頨}PXHJh02I J I98"@ִ$d&D[&z%{#h `b> hx+ea @`W@ @ـ Iހwԅ >#q@x(/o W  }`6@!#@%@*e&%wT$>!`Jc@h   0`*yG@n@9ـI݀5R@?%Ex:=@y  6@@"1%@H&@:&@" %+"`)h #`S`: xs2@ jF`@!ــ^ڀQ߀` ̽29ria p`1` Y1!$&[a&%# <`ro @^ mHKPj~p) 5f@@*@l-ޠi⠦@uЖob_``u ҄`R`}@ #%a&&$!Vkڶ[H)@|`@@*܀ـ5 ݠs`LJf \/аy_`.* a'`k@"@ %@;&G&l0%E#ਕ@o -@ P@̴ HVMۀǤ@݄@ߠ>v 0+vp~6X0%p``!DS$%8e&@ƶ%!#!@,my6 ^*aP``q$Fڀ@'@ث8ZO @9 j :t^Ue ( e@p }#y%@[&q&$@5"`2F Cfb[J`ne@}7@ڀ@@=Cݠd@' ]paL p @v}"@1$+&R&gU%?# `Jeo`uJ _/0B a@+%ඥ@ ހ{ۀ @ـegmKA߀ 2 @x  v5`Ֆ U E`g`^!#$@%ff&@%@[$$Z! jO@p -`@Uzk`83BH܀eڀlـ@a{@2pRIi70H _v   h>#T%R&)&$@z"@ 6@` Hc&頝? ڀJڀ݀HA`q@XtcpI6jg@(B~D @9"@g$@&@,[&x%z#l `g=i HgȮ< %jrVO@@hIڀ5Q I0pi~e?  x`7@!@#>%1e&3%@P$Q!Bb8' %H5`: w \Ó܀iـwـ.M@ Gခ %5  `m #@_2%G&X:&%@p"l@*"BR^ "Pr 0`thD@ۀgـɬ$`"u`v180Kc7 `qT!U$@&a&@h%7# @} m waDh@n k@*ۀ,-y@ 3knPdq0Skm ~Uj ͷ#c%@a&&@Y$ !`TS@0$c`m1 P R`Cf܀ǬlC!/ ࠮K`p1BrJ@S" @c)l@"3 %@\:&G&/%z#Qऒ X+PӔpd Gw݀PJۀrkـ Gٓvw $ݙBH]'i.d!W$:%@1e&7%s#!1 p  xmi``& @'@G@ʚ@x%[` vЙ$ S@@m*`mS" %q;&=H&v/%"}R 3P`@XLဗIw@W܀Ú`JyQ 5(E080()k`cR!T$@%)e&ڷ%#@ !`6@}A 8^```Q~"y6Gۀ\@怳Pw>x8r0d hm {#z%[&_&ʴ$@'8"bC n7Pa`"h=`ji@7Lڀ_ــD``(,e@ @ fz"$*&S&T%9#D `; kPO +0P@n k)`<@wۀ<ـ}ـ:f@LH 4@ X鷗o9Pu c`3ۜ[!!$%@ff&@f%@$X!Gp 83a~ ^ T*@@J܀eMــ|N`ᠵ&@k렘Mୟ1U Aq@@ @?#"X%gS&P+&$|" @#0@P 0_,{e`ZB@w@ַb >go`y&L mn&<@@N}6"$@&@r[&@Sy%@Jy#j d EcH/P@t`@7Y+@RڀښـF@@8`Ip(c` {B4 !y#@%ee&%R$u! f z 8ti4P t Ė@+;@QN݀OP ꀣ Әn9pι ` #T3%H&@:&$ %@̾"d:& `FW p_n0v-DeA @݀wۀz܀oP%+ g-`d@<]@!$@&za&@%̲# `s 7]pd@s 瀇b@j+ـ+Eۀ@m `zPtWe z z`W¿ @(#@+%a&&$@!`Rnppa_^-@ q@@〫߀}ڀ#V"@G@k갠4pJ,"X)P& c^@`%n"@ %;&@TG&`1%"` IPA (;PPl 0K@/I@ @z +(p- 2"/De ?!@$U$@%!e&~%# !'/^| y c(eP@# :@܀F@ ۀ]ޠ &@(AH57XtY @)in x# {%[&@&9$@G7"F O $0z>+6fPDE`Ui8h 9l@@@ـA 2s@G3z6`"(EmP`O@j*ZpJN `r  @<#X%S& *&${"@:۰n~ yog@䠑A@/@ـ݀"?o|iNhWPopuGLI&;"H$(&[[&x%9|#i Jc  0]ah- (`IX@ڀ@H@<ŋ@vHFoQ |5!'#@%@"e&K%U$@(!x e@Xrt|2X@^zx@U؆LۀQ 0h0n P+X; đ"l1%H&@9& %@" @ibU  8juд+kkG@@ـ­@܀ ߀Sg0Q7_p j^O!($&@ka&/%# `}1`OP=q <RdeP'kr jg @5@+@-h  spm;gT=s   = @f#@%|a&+&$!=W@'л0!TbqX+ɰ+cN@n@@1 ݠV@H@]m@b6`w \[( !``]&wj"1 %:&G&@0% #Rg p/@@_ Ч-J2BNۀhч@@[t< *4#_@-!U$@!%e&@!%g# !@- |s ;+Pc@pw# ‾ހ܀~F@ڀ;ۀNY `͢ X9 zuc {஍`-ko }#]y%@[&&԰$g6"G`<Id< L of@8܀VڀҷـbnBM`g``_$ l + Fxـ"@$V+&R&U%?# @& qpC {1p~Dbc렑&ߦyeـgJ܀@ 0 蠈82F3 `2p]!@#$n%@ff&c%~$V!9G (/X؋{@x4C?I0f{@ـz Z 0 n(Qp5 F t@` =#V%S&@)&$z"@^֑5 8Ąep```<݀#@XL7@_pr`MGqpk@`J @<"$e&C[&{x%@}{#m a@5 hxoh>]+뀐\Wހۀ8ڀ Iڀ@ }ۅ@ >gs 7w ^ }6!@:#%@*e&%WQ$:!D c`0 (&0@`q`@ǔ@U:Lۀ@F M,MTP3 `@"1%@H&@:& %@("`$h #S 2 $tsв2@jF@@ـ`U@߀ Ə :9$@raxT$S!@$&[a&˘%@`# 61 jo U#wc0 j@wp # Nl@ހf,@@n-@ i }o Goi`k p|   #%a&A&$!V`IҶd)t+&@@ـ6ـ Z`RJ`nc/lpgp6* a` '`k" %@;&G&@j0%N" ࢕,Ѝ -T"@HǭHRJۀ@T܀Ւ0 }"`^@ %w`(h!@cV$n%8e&%#@ !,q VxJk0@`B@ހGњ(ڀ@#>W%@R&+&$@u" `>P x Z 頗d?݀ `MA`q`_t #&I $?j p 0B@K`@4"@$@&,[&x%w#l @)g` gz?3l@enVLۀk˚jI@܀`Win? `{`1!@# %2e&2%S$M! R@/l"5 %D;&cH&/%@"'K@0$ i5ʔJ^G@sNJ>ـk@ ܀|w蠤 $`et8e'` i4h!S$%1e&5%@p#@ !7O pJ_p]@@$܀G@ʚ@{*[ }h<T`p@ g$Og@l z#5z%[&&Y$@4"α`DO+98 jݿ ?7@llj`;݀aڀــ@D݀ ԮTcێ p/^` `z"$+&&S&@T%:#N  m@h? m-R`Vp*怣 ހ[x@n@e&L@G߀X3@`Q Tӕ7 ‰ ছZ!@,!$%audio-0.7.2/test/torchaudio_unittest/assets/sox_effect_test_args.json000066400000000000000000000102641376444676100263220ustar00rootroot00000000000000{"effects": [["allpass", "300", "10"]]} {"effects": [["band", "300", "10"]]} {"effects": [["bandpass", "300", "10"]]} {"effects": [["bandreject", "300", "10"]]} {"effects": [["bass", "-10"]]} {"effects": [["bend", ".35,180,.25", ".15,740,.53", "0,-520,.3"]]} {"effects": [["biquad", "0.4", "0.2", "0.9", "0.7", "0.2", "0.6"]]} {"effects": [["chorus", "0.7", "0.9", "55", "0.4", "0.25", "2", "-t"]]} {"effects": [["chorus", "0.6", "0.9", "50", "0.4", "0.25", "2", "-t", "60", "0.32", "0.4", "1.3", "-s"]]} {"effects": [["chorus", "0.5", "0.9", "50", "0.4", "0.25", "2", "-t", "60", "0.32", "0.4", "2.3", "-t", "40", "0.3", "0.3", "1.3", "-s"]]} {"effects": [["channels", "1"]]} {"effects": [["channels", "2"]]} {"effects": [["channels", "3"]]} {"effects": [["compand", "0.3,1", "6:-70,-60,-20", "-5", "-90", "0.2"]]} {"effects": [["compand", ".1,.2", "-inf,-50.1,-inf,-50,-50", "0", "-90", ".1"]]} {"effects": [["compand", ".1,.1", "-45.1,-45,-inf,0,-inf", "45", "-90", ".1"]]} {"effects": [["contrast", "0"]]} {"effects": [["contrast", "25"]]} {"effects": [["contrast", "50"]]} {"effects": [["contrast", "75"]]} {"effects": [["contrast", "100"]]} {"effects": [["dcshift", "1.0"]]} {"effects": [["dcshift", "-1.0"]]} {"effects": [["deemph"]], "input_sample_rate": 44100} {"effects": [["delay", "1.5", "+1"]]} {"effects": [["dither", "-s"]]} {"effects": [["dither", "-S"]]} {"effects": [["divide"]]} {"effects": [["downsample", "2"]], "input_sample_rate": 8000, "output_sample_rate": 4000} {"effects": [["earwax"]], "input_sample_rate": 44100} {"effects": [["echo", "0.8", "0.88", "60", "0.4"]]} {"effects": [["echo", "0.8", "0.88", "6", "0.4"]]} {"effects": [["echo", "0.8", "0.9", "1000", "0.3"]]} {"effects": [["echo", "0.8", "0.9", "1000", "0.3", "1800", "0.25"]]} {"effects": [["echos", "0.8", "0.7", "700", "0.25", "700", "0.3"]]} {"effects": [["echos", "0.8", "0.7", "700", "0.25", "900", "0.3"]]} {"effects": [["echos", "0.8", "0.7", "40", "0.25", "63", "0.3"]]} {"effects": [["equalizer", "300", "10", "5"]]} {"effects": [["fade", "q", "3"]]} {"effects": [["fade", "h", "3"]]} {"effects": [["fade", "t", "3"]]} {"effects": [["fade", "l", "3"]]} {"effects": [["fade", "p", "3"]]} {"effects": [["fir", "0.0195", "-0.082", "0.234", "0.891", "-0.145", "0.043"]]} {"effects": [["fir", "/sox_effect_test_fir_coeffs.txt"]]} {"effects": [["flanger"]]} {"effects": [["gain", "-n"]]} {"effects": [["gain", "-n", "-3"]]} {"effects": [["gain", "-l", "-6"]]} {"effects": [["highpass", "-1", "300"]]} {"effects": [["highpass", "-2", "300"]]} {"effects": [["hilbert"]]} {"effects": [["loudness"]]} {"effects": [["lowpass", "-1", "300"]]} {"effects": [["lowpass", "-2", "300"]]} {"effects": [["mcompand", "0.005,0.1 -47,-40,-34,-34,-17,-33", "100", "0.003,0.05 -47,-40,-34,-34,-17,-33", "400", "0.000625,0.0125 -47,-40,-34,-34,-15,-33", "1600", "0.0001,0.025 -47,-40,-34,-34,-31,-31,-0,-30", "6400", "0,0.025 -38,-31,-28,-28,-0,-25"]], "input_sample_rate": 44100} {"effects": [["norm"]]} {"effects": [["oops"]]} {"effects": [["overdrive"]]} {"effects": [["pad"]]} {"effects": [["phaser"]]} {"effects": [["pitch", "6.48"], ["rate", "8030"]], "output_sample_rate": 8030} {"effects": [["pitch", "-6.50"], ["rate", "7970"]], "output_sample_rate": 7970} {"effects": [["rate", "4567"]], "output_sample_rate": 4567} {"effects": [["remix", "6", "7", "8", "0"]], "num_channels": 8} {"effects": [["remix", "1-3,7", "3"]], "num_channels": 8} {"effects": [["repeat"]]} {"effects": [["reverb"]]} {"effects": [["reverse"]]} {"effects": [["riaa"]], "input_sample_rate": 44100} {"effects": [["silence", "0"]]} {"effects": [["sinc", "3k"]]} {"effects": [["speed", "1.3"]], "input_sample_rate": 4000, "output_sample_rate": 5200} {"effects": [["speed", "0.7"]], "input_sample_rate": 4000, "output_sample_rate": 2800} {"effects": [["stat"]]} {"effects": [["stats"]]} {"effects": [["stretch"]]} {"effects": [["swap"]]} {"effects": [["synth"]]} {"effects": [["tempo", "0.9"]]} {"effects": [["tempo", "1.1"]]} {"effects": [["treble", "3"]]} {"effects": [["tremolo", "300", "40"]]} {"effects": [["tremolo", "300", "50"]]} {"effects": [["trim", "0", "0.1"]]} {"effects": [["upsample", "2"]], "input_sample_rate": 8000, "output_sample_rate": 16000} {"effects": [["vad"]]} {"effects": [["vol", "3"]]} audio-0.7.2/test/torchaudio_unittest/assets/sox_effect_test_fir_coeffs.txt000066400000000000000000000000471376444676100273370ustar00rootroot000000000000000.0195 -0.082 0.234 0.891 -0.145 0.043 audio-0.7.2/test/torchaudio_unittest/assets/steam-train-whistle-daniel_simon.mp3000066400000000000000000005055001376444676100302120ustar00rootroot00000000000000DXing  "$')+.1469;?ACFHKMQSUXZ^_bdgkmprtwy|ZLAME3.99r5 $FMD @}9SD70 "RN-8.@@ |!!!@?8>k(뵜j|\q@@@1P } s&w@aE[,MDSe@f4i$u:V 0ĽabHL Q嚥I!!aʳNy%Fw0ip!4jw^( *p!Aľ"r !IQԫCmkG+ԖesXffIٱf^u)uOq;k)D䣖|e[-oW;J?_SvV.xZ/,W|%nP*%sgAcCDaذeBF`FW]1`ԇUnj 8|Mi6f`&cLDDO `}C< !x 1w`qbi|"<8*"FC,'Bb yD0x1(W `T!xq@-`^'yW&A tbvC'Y>B`|bQ0t7"LK/KK5A#tB ").% ;+O{s$9*;dtiHe,gaDn,4$ͧ2"i_JyȜX9G1$\c6rb1!^tA@,R% fF fNOm]9:stҬ-z&.;tpVG-Hr3PF Byk;ZVB qH߹XwEU}ID1A$`s*^Ṁ/2ZŠ߱޶2@έbz "g0K )Tql-*hG'4 qއRz=49b>{(m#c@gakEIR8IrU2pARc,‹4<" MwۆXo@LVOB=F:q8: ,"X7~V@ 3D,IOaesJ/Oa{߄Dؕ)W;^BtGiyv>k5?N]45|2T8EhRndZudXhk)Jd=0B)齃}#tV@t Y۩^GK9\(cʄG`9Z&K ȷ-G x]{[:(c.fZ(B~ q3)2q$r:EfBڟE`5uRG6CTi' c43Dia0 Õ]#!kNrr͹ej4*1t!SX㋔GFWUm؞{$X/jvQi$SU̵L:\-Uav; ]Fm1,2:  %zeN֦6Xx-*4>2%h;3C+Ѷc:;-?yŪo"tJ&NtKNٽ2~0W7̿gVDdހNb{l4z~ i&W=Q%.QKX)0`q2!yi(4b,Cn잳$jPZ)ux"7x|H=g?Yi'[^eoVLS&N"m0fRY I[gv摰bM (gY)uW&2ק>_kde;?1ImŶPHXf^^!蒼@4o~64t|5(sʄBcYXl5y8&L@$ak\J )I$J$@ DD3h^QBJ b ÎP0Ec.K,;Mk4f瘿 tGZp2 {57]pAac1]`fG0W8e8[fɉj8A;0J[KӖVFGŧUZ!XDRC:;.!>d>dlL҃Jj,VO̱,==ǭ„s(zU>,|ňm'i"b:@n)Qrv])kpBYRˡ @%] YF@؄pRgr=N'[!,ShCC4պgncbTG $ϗnp^0)%'NU|0 (ڧ jVwgk.y>3 @JȏdJ4Xie6mIjkl{N}ҢĪx! 0H\VrSso=߹$/~IxnMk#F`)joA>6sIpUDnZeW^  F%5mM{ :*H3ydgje췣&^"ͅA>vرsX*͙e[ӆOD$c-̗M4}xƌ٪r𻮢6Yk%2D%b{I4ZiuMj}h~ $T1DՌ8,LTr,Pl +5;1هF%R!/*(G3?E"QE`ڔKQƯ\p׏} ~C~h3c-0I\Cghww'a l÷?$ V~ 0E(gjxY"-$k KB{Ka>oXLJbbX⥘V1t8A9v1}]De+:lU YT9Sqrd4%tiRiCa2-99{Jɨ' n>aSFu i[>Tsi3f1gVw/o__eAVLs "h.] @BDtQ4)yvI)nSKSNNn;}9_˲U֜UeIl#hO2œk|437۽AH* cf6*`,BL$qFne uqc8Aa%T8gZ4RxJZ!*dЀbSsLD;e#VO0ӂ!umtoeB;q;lλevbݖdN]e= SV5k%q(ګfE~4XM\IX 3fBЄ[ 9ja`M6WߗN5"L]&˿1Nj0U8ɨ/=LHD̖g oc ɵ̆Ptc G-jImc0]|Qa"Y6E3M9#͈Bkev艴ϫv1R6dei_g~AG6ʌ\3թZjBfh rR] }c 6$EQi'L(À `aM\RDI j]$fyޗ ҰYB/Yx,u&IT9OXogBs~n13.`!\6k>\1͝|=ÒC\jwEfzwDb{aPlJi#aOт1iXFQn׸SuY vShCC.bt X1v`4#$ccL;쯰8tXpHeA̪Zuۊ&<Ќ'OՁ,/Q Hn˝uNU;JAJbv{.~=X^~=uVmƓAg& xXE`he@:@,!yZ;h%J]-U""fW]YֱfUI;,FoY#΀=0dmYr-tw ܫQқNN}=|o;c"aH #? "hMbHPp1wi,]Kȉ Ѵ`(Q))1mu "BCڳJ4@}ؙj6:"$;ϛ#Xݽ_aw&qHi#k ZKppqpJ*bi(^:P J#Y^;gPvn=V©njQ IؔӥO0E,]+]xNo@pD.>R^O^N)uBxc":dKxK^c=tR}"GMu!A$Q|HXXPȪ4M!DbTcI5@Ji&iQ$B11h{in$K"h=/A 2MFgݤvYK$7&̘<ٯb]7،WzohÓYh=jVwAxM bĝm#/^K tHkAZ (Qn UaL̌ZDB,`Lytk1e"p!ܞ=ȐѰUXD-k۸I`T qV9VߺV;:_ChLJ7r'L,j"pDqqj[!jao(][A0 0/6}}ˈdH.)XU.ߎ&gUkQ*X/֙5fIDM&2XfMTr)JSr#4w el ,4 Ӏªl;ܽrC;i,'M؂[pqp&@dJB .2I y19$dli÷I/Ni|aep^aFȱ彘 hVѤ,w?84"qZDD.!@@ sˋ8MpQy؝и+$b#Q(|$G\JNh Ģ)&mt( @ה QVոVBk[љX;.z4&\'є©C+!W0]76Jj虱-]IH$,bUP @Z 'NkגĜkLDawpAHj-c""@LI`.B Wʿ,8,$5"vYVh0ePe!)N$âJVVY b C1Ǣ݊c5s?o~SRD\e{)4zii#YS$~1*18#x!D%e!L4'vl[2QR>~n Ip'E,YAFT'p4$-^MXt۴)_Pm![gݾa$EIŶeR?YN(_3onf6}369V Q0'%Q%<X`&tsX/8?=x`dCVjם#C/RliKmgF6S lHw6HN( O-{\LF9dňҝv0%0Kju.xTp#f[|=>ox &bYz?3H՗LX&`$lu)I !e> p^{ؕkDy 47.Rd{SslD{a&iQ1!l$mt˩!|Y4[W#sidr bSiv(r',R6ુ# ,}ip(& ]%ҰayMmP^Y"Y@:a#D¤dr "!Pƅ_ 6 U>@4Jo&[P&0U%n45"KщYj 9.A3MMq'LƔ誝8]1Os*ډZ?|'b?slj.`P.(0#Fzfl2(b)h2/gLT:؀jtj'II N]Px\OEה(ZH%&Ι Qm+a l&dܘ.Nt`{<&P\"T )DwdVU*ٞv-3)!A|Y{DwM?texziTޠ `m'c0#532/>Kƕv͂q2lli8ڵO>ϗJtåSo:TXFD̀*hIDplZli Uqwjy8ЉQ,9Ɖ'P"ZΡhКf6"NPJt.j@sfnG {;#3=0oEBh&1BDf€voj44-5̥92PQ-EWڡڸ kM륗/x(N}Րl"ާ.T5 !9d/'BRqȦn9Tlmm#<%xB9XCZT # #cUȃ%G J5k=){!,PbHY0> d Zћ) ,ߴw y#g'PIHD8(\X:uB#E*?S DB%dH:< {h&W $IHQ#ȒƦ'IuVhּ*J7YRHJ&aS0FfQfSK-#dټmw{->b[ ,``? AAl8BB$3.>.S؁EU`,x3 o"(ˏ r儁&>tY=$Y9.giLHi>g1`#!.3G3#\o}/2+D6bsLplZli&yO$҂z0Q2-+jso<;c Hyb (Ϭ\C HEDRr7/dDg)T}C*ؚ,DyxN^ !!5¦KB)#R7ASʏY-U%t'EVliJh!Z_0Bp0@8ZF $DLjZ꜖t=$yTG# I"lŜG)T"$IL5:Oa87ʤA3da܌XVo_ɚ׆e# A L%?R"dA{oԒ"64\ņ1`'P1?@ Jx neJS~R1՟MS ;eRRO)ͫ6K8AReDj^ԤʖaA|qtkH5lՃ%ʓ%xGJ{.S% ["L@@"Ϙ6 !Œc?R,H%[Kdq t^T/#%}J窾KHsh$b42*E*Xk >()ݝ" 8<%$!E$s7gVxUHqPU#:vVseD *8!H)PPDaIpLz~i#eO%(ڍC@2/*\.Mbi3OZ}r|bpdgn32|^-Q]-9Hb  ]P:uq<ڜo8٦9Lٺ^]&ze$08~aUabM'u`e`D !ljX"(&ii!!iQZkNh [UxݑAVjfz9ˢDrAPqI&QIB؊k^=;UsњF[/B<46ӣPPƟ!5qtc5p 3D܀VbcI4lZ~i#QQ$Bj,{5Ҽ}؞*S-^%AqwϼmO;|x[d) 8B20,%ZP D|ө*`Zty0hȔe1y;Vm]2m~h>TaD)z?A4.[ǪRwgkQюJ Isk#;ḯЧ;QqtX\Ul6 AȐy@€h8eLD< ⬭ T$lv9%̚+&9"HgSTT}>i㶥X>UͱC(D9e=[VRqZ(6L#W&Rfѣ=Ѯ^UQ=Iܽ_,»럛_ ՙS>C`)mYp1Bo@q,phd5/4Zd!rèk禭4IuO!X8:h2*DJlh2BKd>ʣ/KngJD3Юdt,rU™|*%?ehT`'&+VH%VMYy`ɍxe<5yj_6o*r|VVF. b#sI@̘sFTH[6Xlk~ 7/ `U{JP͜t2ޙC5DjlD`Ji#Q$s鱤!KAE.ĠK Lk)Z0'X aDػVruad*[coFsYFߦ"d#(`Q6P'fW`aҙ) IAW*&*Ci4PV='7lVI;䔶]T2^K3_?vJVKZ9ϐ`/0 Χn* m%`f$qbS4`G%eq ]e Ġi=ѤJ'W_@\}9u|V4+ОQsm]k.gBDf f+30Hv%=B<'U:Dz<-E"tLkwvg4~_A6Z-}!FwǖmRqHߛ}4fnݚw aڧ_~(%C tP@D4cLDУLji#]S̰Bju)DBւ!Iʃ\@,T3VˊzMFUϖ%ICf(\eVzm_c] YZ[ pk2*3:j73U?Έ;宊;@u\s|3ݙ٪]Bia\4oT\PZDB :G~0OB[^ԓQN )`\L%F&Pd;Da%֕[ŠBpԙgb4iJˎj4:C4_jl 9XS/qs6nAQ+'S-H "R2Liac94 'eT:^ƨ\e ]Īp},iӂ$˸AKefΊ*Z`#fR>N QHqU}I0*Q)Ę\IBtzWՊusR Io]Aq:.U9WS6)JgوQVD݀bTcID0ji#O0ςiqMQHot>cõlxnj˃p*xk,@h,'&gda(x٤P䫶 Rijɔqӿ16e @>b?bS$`e Dg.h\X:]) ۴orrS|'$Sd]IMiMŧ(EjqaՓ2R_/$F7qϙިvVWq.)i`֘$LF!GP tXS͉[\<MUO]+*GTtn6tm+H=SY ڒrpق+H E(M~1;}54)Rj뺺y&0kiNm[5Af}& @ S™0tx"@jBsXSNFtZ%\F "dJZQ h]I"夣ӏJ:J5%T,M-g9ݷ_3|rSSyw 5x4G  HXfL)9lHW R gDakL4PLZi&cM05)qpfѠa <8 uBmWѵ2A$bT0b311 Ppmrk((I[L^ѧd_BnͬHa7*ChMQcWe¾YCD;CpHhigcܯ}{bV߫tvb>NmdfN'&BV!B*ٖ0!Z) b2ᐑI2p Q淨ʈVZr('+@ǚPbࢣE=g`σ]$#O RaJpD⨲--9}?0N˵K1ٿ/Zr 錤!aGtz2zlo9i^(-4dVQT3_v̗m|L֡xjUVosýdѲ &! b 5bLpS!IrYTeW٠[>6\jbXVC(5i$ Ȍ>ArSkPY}P,hZmcn&y}9Mg/U[H NK߻\Tt>c4vfkvW3ODbL40JdɭK-$B o V$Î0) m pbι0eևThQ## *DK ,$cq~ǁVcGś!P1rWaBߕBK)ozxw.2{\snv>NL?0p DXәP#@]%K` xXl8 V LDu*4bs*n[Z*8&`SE|z}wµaEjsNgL1^@^XӼ<5mڻC57+5eft i{s*&YjiZĎ(t`$S0GǜA\Z䃦T<̑>L]mU‹B[ݖ(J&S8'I8qMb]H-v4?" _"FAADQnӄGZzR^Նz&^?[j-^t).`*izMbM, 1L3BPd<)r6F@zC7(ƭ I$M@ZCEDԄjQl4p J\i-K0y1j1Q-͓ k4̢8Tefl$1G2^Ŕ}KM{dK62eKF>{Mq (R?_{﹬/Jjw`Lp"|*{z 0| @TT)hqř` Li/;!2u%Dd,, bbI0]l85}y>CJ!5̂'γ $?xy PwgZ->X M3keO(q߼[FjƶwlV<47@0<8/ c :=1X#0-/n tVZ^h2SvbܱYK)!e(ecwJ릜h] So.(r#Mlt6YyC1nwc+o&?jC<16[YoL6ƘXV\1R8}t:^軇z^R~SJX_,"°4:4.`nA&r0dlGc@7T8 B0 -3V^=8I@)4 ag ˜x'd׆mQc7@/eiWiI,}5SA/!rվ?e잼uJcW!m<%DvyDvw,~L' 55˴H%ȕ:t!>{odܷg0&{^7&,%Iqр723Hj\oXj޶Ha;gHW}>*ʬ7dDqm(#`D*2~+N{,cݡ/YnT'+ӾG kUO+HyM)QV*+җmY- ܲ=O0JQc$L'"bFQZIQYluiEjBCiCˋ!=,Hc x;zH5l._6JtzBh6$F3d/]D-bI4xj\i#QΪixܜ4n]$ڸ~woܪ_)R4RIi A,1nM(dV(ywaQ. =UmbӦ#ŎCHHK ʈUeLt QIQ"UЪ1tO^+j,")J'r8"@wiNAj V(~Ruadh$ux#Bd6lB.E @&8x j/KI[X 1Hx<02ĉClHRD_`DUqTE `7-4mͻm'P1:+EQōЫ χ dD%\!1{N#FБYBbƊ$fx3 К +%Ѡ2:7cmLdA(F‡ bH*7e3Rhc2QG,qεjHmiŕX]L=Ӓ,oI\1[QfBj5* 7h|2Zgg[g.Bu{5)g>g[;j{Lvq+6;mn&9fJU,LY R)'ig-24YWܲ}a11̘}h>sZ;[f3$. pQb.oJ$iHHH 6LP&p$Df{ z i&CS$*1j}-; ˅uANU <*kMf  61L6\2$E)&Q$To[^aX6aE,ʳ'jx !EܺUP%{yqS9?k;)KH $3")[ $q ̃@D*TE<)<-P7gѦKI([X| MQ<H&U F)zw+AmTҔ+'IpEƨ0c21HڒY5,33܆r"pjMݍ\v D)UQQ6L@@S1[AP8Ԇ_k 2ʂ);!baN?,EƣSI{H 2!I4Y:leiC=1{\/k7"K슪ꆩ̶2U񙿝ﵖy@Xa$d(R4ˌB0a Af;Xj X4)kC̠X'(9 %8 P=&5es6 |DRT_NWU~0~1!" c<3MR\Q|\HƬk'j:W+LL0z/OV4DW ꙬJeySK$qd鵖=pA.)EA_%ex:&Xښː#:^ 4'54GۼU=u0ZmtȠjR&sE Z1F#-*PJd axwq*Fчd䫩8&=''Rh"%"$8Dhi)m%$W/>Ne\GȲY?yIzY7ydf+qyG|H…#2:&I>}@!etkJ\>)!2-b}7v!xcqQ +`+V,0Z zY$ *5vH[֘Ҳx2)Z4(CR2@RQc %[&$ 3Ӷ#PEj?"0󄡨sIrlU%WUJ*X$Dz!8xhRZ`F0/س* $;I֕Ryt%i ^ i6'HP 3N,5U U*-5D݀c Cz=a#R}wE$qD-'u+4V6s cyb"$2"4lD0Ep5bR~5Mu-vJqRAW'2Q@Jĺ1mкi&ؖMi>f jQ|o¡@փ$P` MJ R7Ϻ ԽnEF֟׮;y$i8hT@Cf#ff@S+I u$i=5 P|Vػ bUQ Rm~U7M)\vP7I#ִ (VpWd"A0U&Ggo} R"%0Ыgy !Q&-+'3.&"@h$e<)tPc!BE),]9W 7(jQ4+I%J=!v' .^2ғ&Jȑ7cV^fY3]Wtb*fe,xQbBl8Kt"C-3q  &tY(`HJL#s fDhQ'.ReQG;_] [M)nn+h9]:.!eYlwI Q@C"M4_,6CA%Q,e;5$PUW!H^ ބ<ܪ4IIHfx8-DkˎX sBLFRjrQbvO)i7yY#(1FJ=1Nt!HUb%N_/b?#6}n{)hK0@V bJԡd-T,`"ǯ Bi hM@Ս%R^۱H>T[8vJDJz\aBG@%UBiA$+׻s 24M>(0eWsEaɧt'MZ.f z!(JRQPOpkP])"w DeTrQoD[ ''KCˌGa#8 Bdec)e]M18ig}uN<f"lX !b *.A:W } $AɉM-?J<[']820;08~2컓Ga3a#"ϿXi)n36@\蠭*H"=\Ks5v 5%+y*SBs.e;ZGQqSM.}Ge, LyCCMbBiOmd-s\k>*AF8 ijQMx +u3Y>)L AЁoƽI>dNӱ++EdFa,4rudÛTao10z"f%e=xj˷=J5{B#LhxAIdmJ| Fau܊kOb /&} u%Eɔ20xPQ2% 5hP)oÑ\q fȚZ=*Ku)) zSue\!G0 v8 L xlr: (S?+%=ܸh!^Mq;`N ͞*tYȎ?6n,Jsbb>ML$0Q#P0.*t\hQ *Vn xCK}"F!p$+> STPCs41/(Âh}Q"Ѵ1aQnEJh"8 2'RWJpWl#{RZ143J4K*@Qo,0>rz= ͤ٨nRR4^zI]fTxu|±61+%QDTDJ:9@(6u"#Q liŚ̾^8R^/V9 &&%&ɍQ7$4@B)BQKR3ZkᑴBQ"mAX[K±D>ӋIO,)It6_b9f6i=JJ̒ q\d׀UKc)4e扭e-EI)a% &}14I(͂&E6/K|C5%B :*)BmjV[S<*Jј%?|rm"޵؛X=Ym}{9W/nBCR'^;6@Bx3hui: .gu-Nɘ鶉9cmhAAh`XXx88`FaյDi%z>|BIlx67#,eէŕ)RJ2iN@CGZ:p1IF&v@s>b6B>!>`|hٙҏ%D.e,1kU0S耢P SEY G4TfdLK8`zryi-S9S+0i6 f Уv ?blJriHHя!WQdIb[SzG.A* zd1k-.W$=ɕ^x U붪?n6WCV#iؗ&! Hd,ة© Rd!Q$$ME͍Iʑ8({nsIOi2#_HIE3H^QjAcf) k]Dqg+~_q{U"nݫ\b|/ ??ʇ€/1FʠI:|}x~V%sB3AQ#;!dg||2\î޻<@/co|E.D-6mۢUځaJZIKi6L}7c~3h#3ա P6)p70(ShL4óN(`ό E0LxÀJM%חM4DU .0,@0P(}0%G SdBhAPC LvxΘ2h $ ~\l6Ԛc'm slBa`+s0s-܈bK` Rkajšمyt%KA1sA`eS /,vX_8$.mTO'8}s(Q5Ir ?O?Ο?d ;|Rsdll Ai^e弻V p.{:r'҅^ x|@ebQ#!Zd Fh!A%  Z) %e&WwԩjKZJCAҫ-rOO+rD>\ Mim56 U11-)RQ)c.i*RJ'( IY]h?Kjrޠ/s;9RaoRX0oeXg>/ lj5OopaPL0RBaiF p`CALX(#hl%}G0*n~:(c$Smm9 ? -ƞ4+9χݮo ;R#X x;fQ/G#+Ґ >4GW,lj+{済e)ϵ}szj|֩~Z H0"r*0Cviˇ~6L.EMYŦ@4'mꥐBhk\晔&lגH#"qe$Mr5$rFdʨ^Wi@̌<-JJ(\U૙-җ6 PXÄgf G2:0=L `+B:[U!릆a|ܬ@`dWBXY77.$”NbԽ]KΝ$i Ƭ3X7wbAarfD+Tƻm* 4uLdql 7 :J S[CmG7fh Y=^o9 l✐: IN&Y‹oULFZL@@Y<(PBjmZɷ3 o郄" #/λW $nϣڑphe&WZ€ㆎRh:!ZɒMPC‚nr)Z Їf.|diRlD~:i#aK}<6xŦ)<@AbQz,;*BR L٥8b5PŦ10a6!+V/*JUxNyNi͋GG@H-q\_:) ͊O@62z$s"kb%PU$uK2*lD0ܥUu%ы^U[ :n!P}zs"|"x#1giKINtS{ɩ,,&I5Vra 꾲xrBj8 bHDb@Jr$di^c5Py:IPʽR $i6^J*Eel_rfz6pP7XKAjyh:͌wQӱyLf  և,dyRQ|To}BjX% LUIޡ \YYڒa˴,-(#jeߞT6HiQnFKËP5O6%QJLAsĥ57Nv6%/'xdDC1co Y"y@qYU]/hRAz|y+S=beX,<\M.}K64%EEDV}&ԔZ7h(+x6nIZMuIJx3/NN h9`h`f"JlMZp&qppH%Y<>&UAwB ?XLJ"m%~yv l#9Hvk̎cwbrSl7rfͳf/d$jQi`ʛi#XiGӂ*=5~L~وMʤݩ4zh)Tq7}΁;>7f YDa<&dĢU !R3t|Ƶ2%h@NPBBu L@&pLf1 lV'2!k;P*HHtP"wll8lJK5\*@*х2"$f`i8_ (F.D)N)/3gِ46~+Fk8Z|\C趱Z[jJOfviCu+4%6n!͓"!%=ջtdx{j$2R|(Λ>.ݬ_U 4Z߮Rse$ǃ0\ ^P)F RݶZop#PM<%0V*n#Qia\PNjA kfW52kưW<1Π"$3PaB-#ZwE p2<f[ ِr)YT\ $#\H9>Lc ˜d!gpAn[26_PpEǧ¹\Qw1''.T.lb4cכ^Mq "7}(sݓ7r^þwd˔偲CIv;j%@EwDFbRcLD`LJli#K01i񤎸 !eDFCtƔZ9B4d ŧ/ߘhP hш ʢé=h#ݩ꒸>Մ9&NxŚI\-{W(l5Nfdg>i ;xEB <5 ]l#P `I+ f QJbh %J! kMFˊp3idAMʐI[E'4E[ ȝfKc&SpM{<$c 65aB%ozOJz[H"GLtUt5-V5Vv@&Pp#$)rWCqH-EL~ʥtNh+ =Ԕ0s8W2 SDF򪦬ҎA!/Z$R׾Hc6aH5QU# Aȁf@@Q]`pR``<Έ9I:vcBe5$`@/ HAtgߩ%d1H1#V>]5VǣDjRcIE@J}i#TwM%f,j9x֒X3gGm QBL@5+DVf0lDhcu$ i2$B LxHDQ(]ϻLF޼hjOKm (E{8PyBZLK43h͂m^7'I\0$; ,#ٺ*GymWLTz4&*% RxEZ3u2q$(1P8 0(.] 郔/ c;˕<7> ϊRĔD{0 BI@ne⥗XO1]+,y¤lt1޶NdтMI*)&df!!Jɗd%F*a8*ŊjjED'Uuh`b]jxwFݸBI0L'LG; pVm/G񰲖]iYG=.J@W]v_Y'CQkvQRW@=}1vA;O 0&ȏxϚŤe_裃 i6_PQOQ/a @6,MƒL gXƂ <i8qYQ!'8ރ'QUib,~ Rd}U PddTu+@:&Іqd#gslDI/iVMӂ"k}܃9Jf乥*')g:wc@܉E< -4rFl̫ $Ƈ>X$fNB>)qTK][T'}MTcsz鸣9RF X^5"DE`W0(" $\N&iz݌tT^sZnXA$bf<# 15$Ag* C@mHqB>$'~&qg0{2 L 3X<8O=90;)ZVN,u)PwOV7PFcɯ4,IgDVz wom&-TnZАh\e+3za"(:zhOCF,h菥U1 0Dv2A$xZF,AᦁCdEDe7砶E(ʫwp58hd 2pʒ屗ӘOU/TSv-L< +eȘ;XmNԚoeKf5y+V7'uJ46@L<7ݟ՜3" eQ vB2MYUf@%'avJB bг| aFqqŅ @ Teҟ_n#'i`A$/$MjT~iQVd{$nykr,Hu! T(*|(:c$P0K9P$aTII@A|&}]8jOQa}7̽ٛ ڡa_( mdӀcsl5P(g KY:*ltۡ48wGJkUZK2 /JWV0ک77_Rj5ً*%+#+cd} hC K܊ڣ;~pvAjWqHKMVl:񞻴 P,n2 M &lC~ JpqN79]v1E4ڮMlH6q9l :PL`-ǚI,AP  CL܌PD NZ JxGSS%N!HtЬdH@vWN\eU^F=ԧM0WPʷ2Ӑ:7㭡a"ŲqV9켿jYZa_4Lhe\r3Y o7k7:j ߰Uu[5KD1f57;5BIgQ ڦG! ^ID-A 4(ōĐ-47 0A= 1LՕ nƚsKRsOU^*oqsWׅBC{p'+|-Z :{_<BѨXaɃ :NTڅA l䁱)BJ$^b/B: XNs' L/JhtsE~}lGT$sĴ.Ug قxrSIBsl'̲B# VYts(}djRl5@ke/YIͱl} +gR\,R9W {k?þqy g91Ȣno|e[ƜB ui%"x43v NjCT3A8؉ Xۆ_ ؀i%1ѝ=5M i@Fdl I`ːywxL`&ۻhhAaj934k *GQ\Pz# z.G=8 /1/)4;Fl rTiXH|C=paI?h#uqx0@Tgg#s ? b(Rź2 CHPBNP/!,A /DWr?"%#BONG+]T}D׀ETdRL4`JLiO0B1i`fg,~i%9MH-tse7L!uUqm\Š,@RGdk|;*lݾb?ͤ)8 F4XΌ3i4Q&6ʼnMG*hfm@tDdAִ l xN'*}"%"%и"xIzWzZZ15J0`Ŏ|m*ZԄ5׫ cP77ҕZ;?@?ӗ+:E`G, ]wCH R *E] kRGú J `06^bP.1LHAm2}r;Vs'y&jzke,x9r.2!:qB *[V$HrNJ>e-?J3Y8|((*!xn[zB!GX8C1'+QEeڡA:%ontMS:WFWu׍*iJV5q Ch"u<5[%Wt.`ɐ`*[qtcuR@XEX @ x`cfp2`Lg pmHA0| VE Ka*1ԇjJx\Y#$-+cb+ya=`:?V :P#Rt 4ܶXdbSsLDp/iAKւ/}}mCnW ow; >Y[Eg߭A;>UJh8slƫ|ʋv%Mچ\,$E~׊?|&ZN9$ 䣓Me[(B(U.73"ӡRY:4kLmAAi!L=|>D;',%ƼcRe@*Ј9)QAW''!%+.s6Pa#YC2&!;OS6bJu#Q}3[=+$ZXd 2I!9fvss5#V%,UN&|MH 2D(gB WTi8v ~,?r̖e83. -Go ΫגjS eZ]*RY2} ͓ fP Y ۈM Ʌ5f+I>o3ݱK!MODNiW*DbRIz^iQB1*9xw@ lp`Ht$3BL1EI w[$bՃ=Ę?b &N,h4⤩jWrө(M猎W9$Y\ěk#oYDfv%iwpOԙՁ (twR7ZG>؆K-j tœLD\(p܁XPhLZz?KmʀtZ/TC|sBDC \{ϕ8DbQ=x(]ЌzA,I1Y2J SM*1&< r]J0띪fI,ՖϩVD>SiWbWs*R6DWqB5F" Di%D11%QUʱ۬B摲 =|| *fgsOYDDaFN(*|YefΤpfX$9 k,u-*b:HE O,?,zpAǔ 1EF@SŘ9C`fU q4Cwbª^m$(P Id N.dn3MRtK3qIE#e6]OS^DdlDŽ[e#UQK%iq"8ZwLVC%#$;5UeżUbeP.{֨ıqGOp771y^^˧׌@ * 8$-IR8! em~ r^Q0"(-nDd<>a,UZՐ:pn[n:iCF{n:%JSK8ӘkC4V}:D-8b-ogJ%^t+EĴ'{?w~eut`PA°9 i w+ 6$bQ]s? ƬWy` !ax8'EHܑGya/%'gX]>4j:ftfJ8fBaYͻ\F̩2k?cVay#$FZ"cTRm`QA21)7r `:ty8="اgV1Q7Iɷ"b+0aTm V&QQ)%ddCH>K7z'S~קq^[!L.ϛߺpF Fg5_ >\>CWȆ`r'D7Qq|&sG`1kKglBҏluy#"U)l"_ljZ;(!DEjiEЦlZ\iuM0тX [QJJʻ^[n^>cl}c)m2=ѿiuEڐAiwPG D9  PdxxB[:ĤR )vveSf)`hS i"qvqTbIqMb\' Z(FVTa{cSU֭#2qلz|v~>uQRںɗKGMU4mڐP9 `$ȊdLQ Á,OFؐ!e w,S`2d@DC. ZCi‚$EZhmOm \!h`MK|kჯk ~{S +TW!p<&(oåÑޕsl S;uQw8 bV *o4 AGҁ$K/Q5Aܱ(t̟sK,k0>nךwkHP''5mD©.^@G[]W2&>!gE^@̢hg[Wc(5T(y0XT4J0!y6&qI(K+MT?0 tȊ>Զ#(tbh'Ptr~TMZ x[ m!UD7'4&5i YO+dmclE` ;/a#M2),lRSA*(9rF8յ(2 ^猩OSqM߻:$x*z iA9 I\ɀhԒwj<DL I5— }Q9;JPL"Z2VOf0%Y!W|4X֔zJ;)̝~e9\D|xx}U|{gvzly@JHI@KXq@AN  I T;uPɒm[OC*ĈGa6b65)eUlVeJM,jg#9#2j~ҠٌX3eCpDΙ| /Y$qde!8.duBAyLm&C0ah0 ]APXRC8'P2*0¨k>eYh#AK(bb&Q6HRƪ隺.)R%=S9!'R4>0GX2;$DpJF|}mwZ`AZ2 (Rs8:I4XxtE[E'e0y/Q`o Dִ]pajB` @@wGqRtƞ I$Z,89 "ǹ9۟I#Uޞ! a'VLvvv5ƅNˀI HDb{IZi#MM0m1ix!YD K/5RZF^w.^k 2D$MKBw\@˪ʡF4=)~%8ZaVYǡ!jͼydF>}/)2eHHT~e@"ٓ) Xh, +:@BJ7#C딸X1:E1`խ@ɥW{rR#-3m>:RFL8 zI)W[TU6ĜԢcXAL*f  U4ō0cɓe {L  UlBxPE,n$urESo7Jݸ],KrZ9#\"1 >vNB\QUǤiEiKXjR`ß5sH`уbC\PeR\Ƈh6$:rpM ֆ"@H9[Lf_Lv>gmQ$msG_R2MwL) O4LwZ5;5/,Ic_!ɍqO9ldwbci@oGOdëM0B,=L:=0wJ省qJToeDzDf۬4Hc0R &m]rSv[s@B}BʉHs)Q*HT^i݃v}iDi%wC 1\?ܓ-xL7-rҧ %PHȌ£&UW@AM d$z>ⴒBlR#`0 8 "軥YIC+ڍ Nt+ h||]νeQwƇi9Zm@cY+c9iz-2@]kQ8nm-}aPm.c؎MFA=gÈa^HuAĺ?xv. K 5cmVb[TՄuWѬX %9J3 湪WH 5(4l髋+6u%:yt`f ֦al@CX)BX 8  0C@ Td1LkLP^5A9 ccp¤j6>M; ;N*ye6i,RzMmq37- SX˶n@dۀgSl4KiVşOͰBl}iOiwW!_9-o ikd,+7ᗒ3 ݎ6ѣ`lW\_vR|aB%./O_ukKrߋR1Sye+޿>fF>9iItTw. s`A(^H,Fw1a w ѻ<* nr2``B12{SĂQeV+l*HTL~ @l1;W%4f ?2+ .lMClD ђH.*$]o#;?h.:(PEH~R/(ӬۚSk~ɜ}HM|ޙVfg[VC xm %a.t,6g^ \ vg[*|[3(_,wi֥U)AFJ%|SPCsme#  pD->ʱÞYqK'4<}NS&WG:z븬eX;xذC 2а( `錂9Ј@ieI 4qeea.\4/`SX_ I3%c^fh-m*Iq/$mǘ+_%i!?(Z!l׍t,D\0n`v:2Rr1i])ɩ}WߴԓdbsI60*{e(K4?*}Ue`{wm*<7~U`Ǥ:!q{4ź[_Vֹ"[H&0/ kՋ4PI:+:YPRŊ$FKEIEn^&a7ӭ^D5v*[y/<ؾ/9r$,`ju28  x‚&4` 0K-%hy*0˝^S+u n'_ v~{1ѦXT7OMdH StK{r7Tc^lnqj8,ٙ7F0%PLI@P clh4躏AһA @+rW$" Z6 i@mij D|bcIEЩj|i&MՂyl=mH[ߊb@}bR:ddHnQ=v$&Qa=F<]os9*8 e*jﳳy=oב0X,7xvFn126Q/(tF#HH$%/ly&m=G@4J /97!$B'eVXCyk± H]{;ڙw3{&2Zrm6e\lح7r&kf f7jq}+uIjFْ(1Q",0c62:UL"s^Rx4`CYRY>ZiÀX}XJU}Xܐ].OV/i#p#O֭1LKeCםar}zR+mq[QEIꮻVp uzO (74A[E;A6l&.Yv8 ,u9K;;{,V^) @3̥LbDHlȔM12sD*$@/L.T4|l$1Y9cxdgSU*Nvc-nfc%86YN1`i>_(lR7ݝHbQ$22QP(z&T1w2 䆇1 G dćBZʼ::Y -m ޵Ցdۇjsl5`ɋ/i&VyJB.+$B< 1D,$!* Q@5$TKp8pl懫XUTjE k*D"twjYd%eVc̏AJUa&5 pȡW fu9C1P۾żSgb1V~ | y JU}߭^ f'f/S+O35;3M[3?W_,]ȝYW*ٚf]ar! Cc R bD0R!<  !d{`vn -,(JϏvfC!5dv7( lOCq9"fI!x/_wvgnڞtSRSc)i4g{WY[^v{ HԍS U^%á7PJCO9*IZq].`` $jUDŽL m,cGFfN9#5 x=Q2 rP oݭ+G4uBJ=H :P*"5kw>9 gQvn1AV˫ⵡj~zp+?Ę͂$njgzosnwHFS]DOREԏ+:#Ob_ kl7(ePk4-X3|w - &BVHaHAg$d"bKx4Fo$E{E GQH81=dJCF礧e׶}dӀbcI5ЍȋOiWKՂ0=\Mw,bB}[o̚.ɪ~+8fm֔NrMв)yz59.&h^m4 X$~d+;#9l\PLj0Dݗ[I)NFOiSYPsFoiʓa,PF,\2DM"3m҅@Zs oi8JGCewq:LxYw49ȷ6bu|P\pe H"a=G1ম%nmB# (yzCsyLQ7Kt+a2AX *1g £*Ba̵(4HҊ6bJ('CHH,IVNfF:L߻h|<,εEwHĪ36IQ" a4}ѨE0`]Iˁ,p1z^U]D9J%S"6/`"XBVpr6eXB1s<$AhšڞYvksCAq|ͅAx<.P8hU3&#7@N `Y3I1BDbcIli#GQ˂hj59S76fc٪@5~KK\,Y8Y\jZEk QO[ EU=x!@CrZ)r؋*}OoK wƼγ|8+ @5 ;1CL:t>ȐSE$B sJg$z+-&+UẌ /7No":Kza!m.ѴMQA}-m Q mϴMw8݊+/RYƒuq32`HrPXvtѸMY@!@0a2̴,eTpkJ )7'-aȸjXmf+ҭ54T;N%PkH2 LC <瞊~g `v2(Ӗ @ W80 4 `['-Z D$wPBKĪ$d@Dٸls9KՏ (wdOEyL.Q#fE?UU ok[w3{&" 7ZHENc\  &< 4uى 2,J^#( "$L^kA3>MZ !KcPM¨[/{y-!g\G,ujQam8eb^D_c,P:|e&AKBQ콆5Gm:_&==lmC)$*Sr|աm7Oֵ1!F%GI/}yn 5w{KD?lDkcKl4@ ~iI0B1ix5iݷۜםk?X Ug95@ס@fY+(bK< 2S!b2qG"@`]Dp@й4$餄c) ̰&(82Tz()!8D/݂]"\Ǯs@lKr.CwÁ P]'W.jF3.` 1a%h#6J hGp.nla .+~*&pyށbz FOr~F4;뇚Kj萦EeH:^F~117u2Lc|f'ο^ H2Z\x1 "e'Xre eC xQ[$r8=y&cf(mJ'sP0= #F4[^ZzSf%;H¥ciXDP=]9"%M D%3>4yr =3u%:-c j0Vld'h Of%E*&F@4b6JɢarK$H ^j.g LY#PAG&E)Z&MM}[ 1~w]fE&)n[x(fGYM_VX13D FcNAZ< SQVv)ׁ!^@yLAP`ges#BHd:3%Z8B [x1o/־V(zӕ),_;Sdvk8W̼RmkcF9]~}Mn*g Cp(@uAB_"D 4iSO>T^9V"rXeՌBZI,w! mhH`b"R!uKֈP)HsxM .سKe`-e(kO!ەS#Sgn%JB9s6հ/*,[mum0+=ڞl̉H 9 8Ou4@@4 OL4H\ Sb{@@Om 5.>%]LK`f4tY) 4ȗmCqB*f, 1]3f'i %PkB ے!JyX|tE4I:hED$TSciP Jli#eG-)ѵ)1x|AJȰJSj0mFRRל[~Ӹ5yA ͣ@R*XP,]'bN1Uy @I _n@Z2BFRB,u$$at}Rr+P*"{uwn "䷫ZʷSVhƬPRI6χ#`IQ2eYdcv0n?C/ ڤ>,[efU@0 0e>{yËNkÕ!6}C(ۛ-<)a7t}wS -@a/ \I 8F@vT_t% jٸ;<ӥ8oAOuC4_r0u[!JޑSl]DǶ㘽jRP( Ex8ȰT%tQw)} uiZ*Č:,ur-JEx 6HoV-A0"*ch #Wӫ*CVHK^-&s6! :0 ?1NҬu- za6&]:@bpFQs SjKIQ;(0Fȧ91V@kMF*p05V"eM4M7WȍdkZ:T$W|]34'-dY8xAsm3%Y%iA -+م6ca˘` nmW*@)&X}川~"@l" MɢR&a4c4FfQuU DπbcID:KigO$sñiq(%Kd3s)Dr(Ӽ:kE LB5oƳ!Mv@1xA| ;@ %ˌ T`c_Ać8^L`tL @@ wC WCa<8:;*r?L! ! 4@FfNЭXr Y~a ǭk;F-sF]㛔VIze݈}w2!S`"e}U = \@+X mx, hD2aQS9i+Pyiy<.er2XI]dNGWZì,L1 s(8$ F!)-8:r^,ǝV3 z weۖ\Ns'wpo}˳<A[  B1Ca!b/etȌG<`I{k-ͩ('@18r ʻ6uv;*MܯUr< |l>a"6e1TQT{Wʨ&Xޚw9e/3?o8۾2n'b@Lkʥ61ˈ^ ,=M7D,eڔEtxx̶c,GhYDݍmM6@fܑI@SEDڀjcl4 Z|i& M0|*uOu(<Ò$A65#.4]B+%aQ״=B'$"FH:N5\lڰA+:N9_PB-KjqʰRg~o 05ىPʓ>cX>,3bZ'H(,U,l>PvzAà#T9-3N=jEśRG.ʿ(Kw]C1" AƦv6aۚȥn5žkVV;L`S{ϋxmc;";`#BH͚ebL?Qo٫7i^4QśMHAjT YC 4#Pr[VsB:' G/$h9IHY=9i4$(-#UفD-p>ey/ h3 |f~rM=C98ᑳzmUt#YH\43k TbB!hJ"$ )}dm\x< $DOXg!y+Jbe2*cJ(,"~cuƦŘĪUDӯqL{Y(ҏ&ۦ^zEvO=980K pwy/(fp(0]$B\G"EĐQPdfL4*/i(WKa)<&"iqQAGŞ+($@N Ln2ɏl=bgݧ.3ˬtM^9-{'Ƴ)1XԖ!<4E,wek%AopN5N5spܵ8W2a.9e U"DGXg%k,Ihj˒tCcH$ON(m^lm_k^1LÍL0fFVeg~KD/H\@UDX"bZ~(H!gCFm"k4} LB5" '~] =W!dj*+8E@c F 2 ï 甸6CX:un7°Q>`oQy "K!A3%.\,DMm<QdS~6*Ȥ2 DU 6(F(U2܄9:jEa4D"s0;,gSqhѥ^ioZn,iwdM9 Vgh͔ݩ{YE(ƍETXx[t5`@-6p(x ziN(`D+pv3Qt(̙ihluO,ҩQ[!|xQܓ;R%gS䖑Nҥ\CpׅE9w D\Y{)ڭLm#IB)10Pb{a[1_kf42B>`:s;lQ`.p˄0LJ6z@OyTuWMr@LRȬD, 6#2N<T8R~TBM<(yTzNrg D!_9h|NKy!F\e[O@5zV(qMa0q j[TAR+h1KH-e[Uչ(a-so9kI5.M>rahgC8ko?+5j޿/JHxÆyUH`s)81`DcfzX"jDž6kkH#^M7b!Z")uڅ'Wlޭazc9󪣈JV&rlh"hE(OGd?/-E[83oilrˍg`A@JF(=-Ë@p7m$ҢXP X2 a(``*c'Ҹu0>+N$X5hQ!IȤk9G0&vtog!AbJJsI *bwx3HBȘ4 0aQIFY0.B'kLK,CD̀b 3zLZe#SY[$Ѫn1}]DGD}íS#*7u x eϰ>᭚_񻹾{d2Z-w4j>!zJ7A@5Y di9Eh$tj@¡Sr)hRaS2@pC@H<\ϫ̬' I$%wxPGm{YyrR<7{7C+<}6>XHdU 8fm~©<4JHE@EUވ1`=hqAB&t.hOIs%@,DHb .i&(QJҴ f9j Ip&Z5 ib$}Eb)PթGZFCO4!](T5y 7Ef{uY1#Pn({)!y7}h zYlDFxI6rA҂[ kWQL(k13h˞~k8Mٮ?;7U {>^Ejm&n[8\AI}B 0!v `BFt|}i5L' I10Jˮ/R 24)6/1"ũ$$4r 5ɝE2My'D%=x47-1vYhNj3dMcL-J%$1Dh Dxme&=U$ѪO=vqQT$IT HP7L1 ki n0_h4r)Ail5Pi%Ͳy7mfjkn"LefrKVmމdt:GKB0 m&+0(TG,Y)ճ*nob+XBn@Ii#*aY"`MYHC ˌX`>k5ŸCip"sg}J\*,Ͻ宵NziھWK-БX5SܙqswLf#%{gflbq4ecDJy :eKw˅quvyŋJ7H:` z?̹×>(cR!C;K&ᦟĨɤ+jYQsGIJV}pR2" >"!V!dLٓSz#tHL>6L[AWˡYgeR9F9 Z8$ :YfV=.򧉢RJ].BȪ ڃKEH)OPtNja6-匯?;YuSY[|.YaCN]$X@Sdڀ fk,4ڊJe#UQ0=m}ɲqEm:L6؂$oN)"uw:'Rm=j0L5c L LjX˥a&(P(f2k%)G 酖L~_^~ JE08WK W^~T3 Kch䦾cu7n9ɱkEdY$jNg h%j+KS).pjN7!Ջ kOx*9Hr©rQ;@}EXo[_%doj!NhP2RG6:۩if3sv}-1_'FuB݈NH~VuseIkug]IfdYgOI4Oi#U?$jh=5mϽ^ ق2[g0s!pi>ǩ+ɥPBbWH|Hg0n^7O]tqeH1S2 +K6 hwKDԾ"|;)Pa"~p.G$Q0 XxY8X`WUt-ZQ5r֫f^PǘKvUUK8qr=P&^"UTUm۩FTWI k&N֭Jn0Ddgk 7*}:/eyI1}$\2Z8)RuL"rO^U44Kq ^2L AF[^hAAoA)Nߪ{k)ɆRfn~XyB#&#qVR60`  V45uP=j雷CF[~i^1 0qQj@a̰J BA72QGY7-IFN%M_vX?6U˚|zhEj"&QD6Y4$!@ <}#HF|6 BJj_z02ѫOʥ6 m7r}М}#os$2{,(9C>E 5wAdLc]AUsb>7NPHRaLD!MT]HȆ1;wiTfϗrp6(,NNc+,_;jaѬnlc, >m.nTD$5 X$ םN!܉u<RhRܚH*4/@[0f )Jż=],v G|3_n'= Z&ࡰ-w43_Ҽ|Gt) *,# (*ו;[S(&QTJ|2EX[F!C2X Γ ۂ5*8XOU6kyj}#)U-lR7%Έ$or9.)6wln;j3'Vei7XpWJAJS J EtKSMDKD B4_q}͚.}y`zV%lD!M(*+4NP Jsk02.:+V(RJ%d͎{i hPxuqW LPXMKs&z:aJt1du{c "^5w9ʤᒳnv\`F4BF*B* V_įSi[6ef sekDKg#X۞rY);rRcؕv}, `h1Kuܜe#:6=ndcOLz~:Oe-U͏A}<8_kW!Q gQ8 ikO1f8uQ@$g~KtE,jMV?r] E"PVG )-{YBG>2_Js|+N2+.e!.s PIM7wQdڥecKQ9agDW2Em4yjMTWw5MY2Bq,< ÁE>5Qu##͙(캏WVCVsknhlPOspcbh3}<8rmԽmW(m[zZj_M4 ⵫ޙm^ mkυm&9DQmn7e5 u}Րy/+%24HNG&Be(cYE4X PXkeL3@u;zG{zo|guW_cڟvy|MQdǦmZfk|gg}>ґH%-I>y0*?Mps ƉG ,8 9%n"WSdQaDԀrc}a Z<bi3̐5J^^8~ @YZMa6{k̤jfXd)ۻm @5vẺk&_"[RH~P('%NeȥSș vc .e5֑t4/]ΒY}< c<~Za~x>(J#i2`,$(r{$$ADHӎ,1Onh]"lA T!CP#ƞkÿ84Q1p9`eV1F F9ى@TA\|CS]GyUHWoWJohdsPBk&N5[WȚ˚[qQ^zٛW ġrשe>W6hM3-z;ƶ۠:4XUbzz޹_] 1a0k?.t]`4`A0 s00Y261;ܘ0ޘu"q phl0ŌʂTΈ Dd`B``phqw 0d,0`  O, *pG` C(B4 ɂYH8*^01!yh\Q-ѭ9nذ9x@ܨ;t(.:XJy(_0]̷:LR{6!ZretN= hzbmƞGm+5v$$V1E&S!V*1ryAsd $K{`;III w˵9nXpkl"]~=;Ma@ %G @āxTL32+3c4 #`+0qxx52&, *P8 0ԿfbB4ӛc3^I&Yh0%;gfEE@`% .*YBk@Ze kS;Q^Z~1,9# ls*U=7JJ[Vnvj #{(8~sϿzabi-n}4=+iҙ\5V]O_|k~}kg׬4aHܒ&#!fܛe@T't (ANC;*5@ Z{*JB"2v*9#(}m_ʬCU'P%YZ?l핇is&yGH϶ֻ3_MjD|‹fQvOtY_7!]u۞z/1L̍JcKhO",o86<ĺJ\<lQmSEdHb{,Dꁧe&V1Qe#%kt0*Sc^Lt1)&]EhiJY#I[yoBc.7%>؀SB%H!&PJ5eZ"JGVy?ct,aYnZ>81iGj?,c|B~C}emſy;89Uھ;M+nLό L`himI*mqUfW+˻"=#XCH[Zsk:M)b/eUO_iW%\ #G:OwamjllJC&\6K$$ʤK$ΗRԎ8SKn*ronv'Ey#ڿ| R%BsGEΆ*!Ƙ%ĸ$x8pf$:z\2hwSم8d Ԟ: _t=%0#Z.ȊvzѬH:rb JC.ru~8tX(E"Crt"kM\eY~`!* hQ2%Ao,z]&  UDh^K떩0TVHdDTz B3r5@ lr*[|5TiO>}]l~>dbOLP(eK0Ӣ0'=4Ӕ  ORj[e $!XpXxdm,[3 8 8*(Ӆ4 $nyb e5-Lah@4LKלgET<6_57{ZXc{/mQvQ^f.0A!R "E)(e1_M>v{f6QuX" 8H;Z-xuՋ' !LLD"fDa8+\5-nCeYTV,f BB_s8%fZf$.nҪdj[jC*:ۤT- ` F&V&*GȌٽ* 9b'#$T5юr~FlFEښB*\-,Qw}6g ؎RRG1XM~P$5`JKc] *QDc{,3JljdíRYY$qU1uT[#2VL]S,yrmj+6ܺ升&FktHDdzRJ]A̠&UhB|"8FnCJ iرR穣q [y2Y$TXeXK%8҄@U&hǁ 6Rv!۬B,ΘBD9bD(pSM!&F YzQw ]s$媔ܷu-y-Z# ցj $dFm& c\((ԝ" Iᡶ[.e.˝wzjΌ@lLuM5Р떓IyұqRYI59zN.i ?|* ZqЗ$&%tMK5{6`cXD@Qٹ A o&[sUwnqXO@I*nDKٙ?gw|Ucc_fIi3BEYt\JQ+Πy.D6F$?u,0|Y" 1,/Jf`m%] ӊf=]KB @orq;៴6n7́i)#Uk2ҳ`MQM %Q\EUZVpf?5TySN4nzhPUFqUTpԨL͜5#eowq2G-U޶o=d߀jRcI4e{YG%}<5J?7r6.ufv{2qEWkEOaF^;T/u!Cs+oJǁQhW8$-t 뵻 gB qĎBπjP\ 2&^,o&SFY9-L9׳EQ"أ'D]ZsRn]vOm5MTdoDzjSx II ڮxr )p98b(AʦsX@18"`F̟CueOKn0m)sm)bv9Q3cD`|*KhQ+Ѷ^z@r#QkYR'+6MsAdRuJee܁#Axs؏d PtBT[\6F^y jQ60+/hë!K)콄m9OoYc?[(C)VzڎMp M^M N@&*g^4bSmH&RP*㏬6K}PJq$g]R1IJ%mX`Ĕf3X85' IT FLeZ:>vww?J %8a4 .\Рu6uq ډ:k|#Q,bi /pu%xd@2HD˚LQX6\a^j/SomD_?3ٟ"} Q<355"M'Wl&Z ikI:`7eb^IPl{KPQ}R_MU՛+Sd<,>cT]c4Ca35ԲqWZ{goq]L?_^1"Q{'Z̲ YulNq@$* X9z0{&_A%e91 i1VuuRufJڻl!%[t7UnDҀbKI4Зa{TaM0т1io>ޕ0wGm *26k[}+s_ړ~x>d?XviWcfF'CCFQ>&4o.Irs@ UY{.Ӽ n-'T4H-y,7`U+FJh]CRHлEbϱ[65ތcb17cu^?h;zfv%i ?gYXXt#z!ґ Fרrn%6_w@ӱ҉mtr:hZu̺7FE=^Ksv''}#Ԛm  ?%Uy6 Q1eV$oIJ[1I@-?`WP&y(艕X"FL 0ҍmU4IfL61,[~ڜIx=b;3(k&~%7=e!"a QY -UazWI@X@ap0Бd^Ĥ<7.T=ui!Y^5ZE/6J8h~u_mY4ʊ9^! W}6_gMQy\.K%MjAUع:dcSKL4Ќ/eXKB)1=c6{+-^Qt^ݗ\P)k&VɈ9;7+ N*]^xF3Cs[$Ϩ;q*SX5ƍPt!əiI@l8Pj(-[0.Ƶ/d g|R.n'>MJ(($egA|fTvtb@F, ,!EX DTE9o;(H򺦳C(YEA4k5gR:QϘ7]羑lBBDcܞlY۫g̘FnϐhCo5d~'m1:2 8s}3evvd)xd?KS-T:dL#P2)|T_x\2  #q2Mz^A:Q7B=wK,BdqyOk/ώKo0@#?V DhP 2.@)Y qTH`%kx<(-uy֬Q$`nAB@$Fl#(>wTz^s]rnLdhcl4h[/e#VOͱ " #^21A(7\JDV3j޼@_pEK s;},NLcUQ/zkRdqo: l t1ӷRS"zTXג744֊Mgޣ b`L"8mcLGIdc d|ou!OwL6bGw2w}Xߜ %$\0s 0bU8!qpUA큤IJ &F\tԬt>SH(Cɧa=)ّ2'űh-{#MW\o0:襂ͮ3Y*.&B V@PO_.WEf',,:H8IcI6W[fw!Y[{ </#/34Ӭ{yʸBYX4TČXظ>&*qAȳ-di;:'+J;0eV_<0)ZW j)X*d"~f8Z'֩ż3,| KǎR&CLQdY 7&dYL9yFfy8]=I ) +EFm:xPRnxc+G$wdОf ,l&(z#F{MtMb/-+MGlx,w:U/]I7uL2sȅihGg,@" Y0iu6J2Lj! x+~ b.hF _,@JGŒ#-.`ݓ49=UT>uiȐ]$tRRlam $HPdfSl4kOe#V=O0Blt?I8@wB:@黦`ԏ?9^|c@~v=)΍l}Na]k au[5ҳG3|c\p=):F}U@k?M+eYԙLknz([6tcgŘsEWb7vIR*"ZL6u o7 *فd( yH$1$P"+S,F4PU;\eԊHd4TDi3w+n 2M>-=ly^W0mt7鶘G3}+;Y2(xQ^x`W=+9,+8+^\ө (,4S8bD=B6D7 蟅 bX>'[EP?S{C ?*N=2y{qqیT]}\=UiU_4 G{Le ɎfA`a"Ad$x!ٙ9t ,1Ԭ -Er!4Ԗ'L@x訮l0uo{K,.}c!撓'DA'#G4 P`B5(7u]<}կ9]DNjcLLenIBd+9|+&yFbq&XC{ :3N" @L\BQU1Ϯ ԚG9,-&R&Y 2&e0D+`>qDF1b%)i5dܜTs.PRWғ2ǰ`aϬoרo6Bxm͚ 8 =ByS 0$Q4AJȦam`gY 3@S* SȢPȁ۪6r6![nrfwi`3`wy:fڶBm#D(ٝ;r+: e G -8% /sxu33چ_e…9i(_u[4fkXq+>M F%1 [D7%sY5uul\gQD[9\#32HPÌBB G"MS#)2.v.8VУ#^BbߪFR`2T9 Q/Bax[e0"1VIřtY;Dqdˀb{i6 KLamI+#lulN[<.ѶPK 7YZu]yr5K8,tb(C3nsg0텕X?]XTJfMo"bɊ=H*{Kr栁{-M[qi2 wA#H!ʊM#aY֭RqnIv_gKa T&][,O"q9TK0A# fQ‚M!Be>|2~Bkt)h7AYa*UJY g.`'9(JWȠ͝4hk"9/D1I d8b34zlKX9U1g% \$p&R[?8ݶJncgӵ};xʶE<66>tؑa"GB@E3%2.tL\QV'KKq~H0-%dthz7O`%\dв'ZZGC`aĆg#my+(Lv )ϙ }~~ğ;[hEIǹ rw'O]5C4jwv<߹xTahe DŽ`m&" ̰P(b *s H.0QLPQV_kPL UqȈ3$$XZr#Ok*DӀEFbL4`mZ\i)KB+*18 jT0;#Ӣ\<#2M og@ \ݕM[C?m󗌵WY/iz]qጩ4.5teZ~Xkvj62<~1+WFP\Qs jnHB hmq]M ]X]G .vX}&H#htOk#MjB  - l'՞_ Tr3;C=bt&1p JaՒԼ-x\l0C30a8 6 @JL$S6:,T.Dbn>Q Ej,$2 UpM?ȝf;|ř/ޝrT^B*7rn)SzY!\#ga1լX*"_c. 5xY@:`=DK("CQl(]N\+8fHkz(!YsOۗdh00)Uj*2r Ng 6r-w%JUou j7Esť6>r$V$6-+5L1uS+6,A\Dր`bSco2pZi#O}1j9X*h0kvZ*,RF* RU;p85wr➣u~}^"OQQj uJAcI$pz\.Ղӆ62רeG1CJ%qR(p*{$sPGYKNnZg[[ծ-K5qdDDbcI50LZi#هQ%ƴi ŪH$B0?2eZTVUij3n27J8*bJjd\e .it*|ç<3 Jvk/njQmctڠg: :1 jif?gڝfd}g|k4DCJ[*KZ3QȲeC&b\pÐI!PUk3OȄd VԅzP7h!@u}dhАTVK7aДi(k-ehxx(Ċ(!T%_w`xrQћR1E5LWI`F:쒈M_ |LVB?:l[$5V"Kb]62[F(Rɇ%#tS;W!_Яu;ggK~u0Uo1#Ȋ 3N RP#a‰(]QhAƌJ#{Aq!vy f\BJ{hITC%tʮA0uߌ*NXljckFjDG]IF&Y mp UEGU?Ө[R Ø fo0ʚCmo_JՑ,k.9-5C a*sϺe mjØX֚҃iP@{U\MFmXh<>Ҏ%j`H:y{H@ t#9"ۈ&{E|y߱wKuN!.X#Vï@%6,IaA!I< d,n=8֬ zT:eo%&25#lAbf(@X}81/gW6g9 J.8(%& Ha%E,@`sW ZIkOS7SsX?w` gkxT{s_ctl kvI k˥h!f`,)%!SSs-\:Or2*+IdV!+D"TL)rn%U63k&˅Ebi%  2 @X@hl" |b2ʑ+'ȔqbqQ( ~ AlD i(^dϠ$d$UQMB콒K.F\d5edtyJ.rlavH8N_OA` FB} {9dgdS&>:B>~?!!ZM7F(Xh'P73-]kf)&=l7bJLbz%iDE%ƚ`jǢY 2ü0Wga]d: 9B"B;*TƽDX rO #ܩzʨBH'Q/B@Y 1 ̹Das)LJi#UuBu32ڌ]5(M9vfnt0zPS0ET" `rB41'|Yțs8._`q,_GYjC :Z E|D1BJZ!0T%GM{:'\ib+1D9m7$mGecDsKc$y73CIz>(jgi󿕕:޷TrSØ(@Q!'#$,TrEoY\DsaR"1! LЕ9)f XAN{K! 46l:@SrB"0b< #TPD3*3Ŭ9D3/J+{RDcķX4ғ:$D L3<˒0DKGmI>cZ1@ھtgy@CLLi+G$5P&NL0ȗ' b$o$8?),]}XY﹵⁰7>pьV]2DbTcI4Je#TO0i2>`wY *L8 I)rE* a4/(""0-EKT.pQEwOQ(Y&`5a9b'߬)LIhHVgXcI71mֿ9^nk;lLTfإ&ئm?,l\rWwUV\X:ld3e2adрQ>@Q'e";nոϖMLgdήׇ=(19+WWSJH?r7E9"!eYðJɔjN6C\x"aXbQ54{+뼹ک+ųH}ϏlBVk QdvS"{jhrDAQh*i&LcRܑZ7 0Ø<,H>p@äuҸ JINBݛ$;2"V|BɌ`0kʶnCҾ`vNc/s8f()h2)[[FvfT}KcKW)H3VmnN_;;_ii=v}צBKޜ"7$6IHlo3/QXLH!:YI筯rϡ*9eY%GbpX.:=i"(6Oaj?KGrdf۪R(e;wҰfێ7>* xqk@ ZN"TL`F͜tF TDp`T((:e/)/UԠEVbm>Rnn;.ub@uZxf) 3j 4g4h`iYd)53.v+ ҃"8ժzDh,4Pze&Mih˿,3Z 00EMLXX8XLK>jM(T1^|C]$R+ݙ :R9PH;7;.V#W?uf6ꕔ+T8PCPG2*ߕiN%d@x2 u%J:dTLLx,hljO@"  ,aƒ$FgiR%6 @  S%#:Vp*I,wHa^fݨ|Vū5E2K0^&Y+N=D ر:Om$OGf]G)FmҪK[4v́aQB&I%$Z6(㣠p,`Z!dPpDٔpIXh{} _vQe*vُ"K}Q4cI}.t- GRDxV<)SX=9eєLm,#si 鷼ϊט]HygjlOӶٽ/ hKӑ(p%c@+Ujb=z_مE2Wp4+jdʁnF`d]Y$x-I %(*J5J}L@DȘIK{wDπQbcL4PZeSq‚3j($EK[V nud .ٽJh_R;x.oh:\`ԅ)<$JTc 28hh~S#Hz J0i#LG!pHzTL6dژ'"Z)[˒QAK5Jk'S R?Z(Ql̔2 $ aIPfVAȮjP:B(N7.ptvTzz*q„qjӹN!%BiBŒi >Gp" [U>ș7SNzeȚTQH[.*dDhI4PJiM1}*u#“kQ|o7nQ (W3쮦@a$cCB,l.*3PC߲,݄BbQkR k-A%؀rZ3p`m2˒m]LiWgaUD؀bTI40ʺ|i&O%08H/cH$\RK&Qvt"QfijN|1}Ew 8 ^fft#FUdݎ02Ŋ*6J֋Mps '‚I!5eNP2`8YP*2#'WɕXF bVyBF0q'C tH8JP-xQFRuS섹SuԢfʎdN , wZ@YHrhD f&4TP@@l EDr)]r.8PC8N7**2MfG37gBpKK&G9>f#/^ vob O7a XP̤xeb2DZ }޳ZNy۞ti X+%62b) ے ,ͩEC$D İmOIy Kj׳e:Df ]\__}^n2dFJZ&H3+l}mEg~}v-s^Y4kg04 H9 Xqk`qH3nȁ[T/H첕$Y,2_2ԪG ӝ8g!Z`ODs6'gpx6YvUZ='%ƿA݄V֜VHpͪ(#Db4del4`eyMͰB)l}u{UngYꪟ*DAbMɪeZ +;vȝ( ASz\,[nXR-&1+ԨG NbH=ji}Q>JDI:5Q!kD('d.Km&eroQGc]#Y̌1G:D„J4X:>%&Z-9KMXt@*P*LZ`ɾ pC4eMbI#hx>BwCD$hc>Nh8>&IiFz Fdv G@̰1Q쾪)$q9 |L}]p.8< ??v:֨ӟ!+92d(ѴHbvGZ_zmL IX7V'kRxre[;fKϺs+3֤zl~D[(DY菲u0@J0F BF,b`cQ hh= F tV muv4 U4AP D,ecI40ZLiO$sw1jxɣ-%؆ł6G0NVnf+ ҫ +j[uW03 ) C`9XcDXU $D<浚r%ArlM{m!&`0R-Zӑ@sIc~j(Sr`-x`To2 X춤ʠ82SNiT0+Vy]FR]6g͒ wv$$?7Hd C[ׅ*0U3(06JvUuH @a!e@8VF5<גjɇ+Z  4`,XR=lʵs.d>zR<>8hGEL-JXCTiF*DIck8d 4Qq}%fnKJw!2{v9+;`  &^\.@0@  m0 S%T W* ij4Bh/м*'aţﺅHryy[|, 8U")/Q>i1)刚7nbo }>_gֱ7-?N'[rc}'>Ɯ4˟sH[0 E$0\'wD43AB A@fJQ{4HCA4#РO[-Y8 ""IRqDրVgcID \mQ0tM "':aL}'.&v.5޲^n]_l2;x:z'F}uH PF;x3H.y&cA9nɖ @V Iւw)G(ɜA#27)&5藨ȒhQ\ ^'5CHp͜ht4Q\\9 %ͥTL =r |KwD[3Wat0i,O.-Zor)P:g@C 3Iqbh_B" "Ac_X, !dE2h|RTHށ莐6eB3Ǩ%+b z(2h)']tHJbܫ$|8WJȁ(>=r6߼OsP s=+]/QF5oUd7e_ %y@ƭ# X̮m(Q `} 10iFqq%a{y+.3֪\$We(gj'KQhe0{2a8PaYY0HIz$s6r u_*05/@$*X@40 k+Їr)˴>y\s ܪ:*@06MJϙi,tPo dۆjSclL[/iW}M$؂+,}}X._8ǃUJxٲ;nI)$X_8O#}{*jH(mdl]f,aȵqqWͫǏ4)wmӛCcYXaRߍvw/gQ|0FT6Y#͈ аL{-:ϝF/n)˱vI3GS*"!A‰Wh,Ln$Fe,Q6SZ1%F;qZ̻r墄{fT۶|ٿ ѥ)=Ym[CȿFm:RBIT4jpjw7T Y~m̮``0jWC5c+xVGl,wjSvdL3px>T̨fEqi%J͇}j$qNyz\< P$(gq?Ba8d>jL! ψ:a9y/Ns b[: #1Hc"3ȣ%]3qe g/xъ@ LLGb32 m'\J Ҧ-qK# &֒.*ldU#j2h.\Gݨ9Ab֌1A(2i10a(Q}uKb,y; )^5?}n_l}}dh{I4)+Oi&YEIͤ؊Gu8ߏ]{5s ӟ{'V}nKEg)UH׭PYf4IⴷugVm]zTX$,c"Ԙ^Z;>t.."*M F h% ]RU:p@!YZa4E"ɟZW/5ep|VZ&mHnb!aFxsi9ja.4>)6_J9*TE &\RbNN@U TT0LJIkLFn8Mv_cSg7)sPѪb+١i&+nfc+2=-i|b=@`O!3 8`ɂ } .W`yzEN̮8.$Tj(׽-AUtX`Í)Å7zUދ]e\ ?O}݊mlDʸwTu1L*aDю>Y'g˱^eru놯Bߓ6Y V f:#/3}I(ZM^hF-WQw܎jvxDۀbX)48Zi5O10h{`5{60H1>2o7B=8H&<o$ 0ƗE0AMC+X[04hxV''4e J:j12@sm%4zK"M7#+}N4su 3^d/vVK3S~KXͲ}0pmmNmf0v'$Lb.m d˾-DV7Rڑ_yk-yx Ԍwۍ`(&Isy"Cց$&qY_2$bRP!Dwh#F2+Z4(qFDp];,ŦRZgjWqh8%!ÐzPZ. @eћu="sav29T\X` Fi.PPA(uHőC syَmP Œ6 0^z!r"|dcjSNiysԖ-Rڻ^T4EYi7[prH^rM#jiFƱaP!QiF"@P UtNʖsE{meZ[jTj&2/nII6fg2!n΢1=i%fmb,jL⒵&8vSҷi.Ǵƶmg]Ms'ȊlQS۳+__1Z\t|^L iXbA ti^T4lP,CDbc)xJe#ՋSB*9Wҷ"'hkuO ɽm, jk>I') &wu%!CiQ*vt,~I]@;r2MnlKAZSTv'qm6HY QMF0Q.Fb@bKb}YXd_})4DN1Oe`4P)jƐ+>,5K6+kir 9 <Weeܒ *R C$ZA"MWTH>I0DQLe +F6[-9MB.Lew}Ymc38_XMJemh7WKyu>'{t*~WZHXY\6lIldfcvSl*;F t0!@@ PӰ J1crrˢhbCHn-FN#OV8-ALb;Ο[c/=ϙ>l-hb&Lc"n$Yf^B$(OES],TWk4mV=`XBKf?diTLDHeVMͰB"%l=?arʟVQ]P)ANTuL"p4`#Ŭ ( [S&9)RUDbS#Յ?B(MNӎFv&lZV`hҐ*Ӣ \NKx=DC:)FjosZT kUQ&(21>J "ek8hH*CR8ۦȦ>3aBph;I8@\-ߜ[IfEC"Im(g>2si(&o`(D6^eV*K XIh̒la”[.['Šw>WbumȞA5fd{7x(\[\JA B3_3uj|ئ?"m$WMX(FD-P=nlBPd[S>UP< {d' ⦎s7YKIߥ[%{E'6To˝uhS?Cvػ~c6:r*0 N#1c"8؏ɿ4u 0i"* NJejmhy-hrUQ~vꐅE#1Š"av}_z@L]Wʘ͈j}mo.3;+{DkLN$˸ʷ63Q Z%"%w aUlaa@e`B%"nAA Vp !1VB0@qÃk"P0T1ēp<@BF6A Fz3#FYдSJmJf8I؈6"0K)&2( CXz05XNe#sj7 k:W @j`0D1B iHDuuHKF#^?.EϦv“S@>?O` mBoRJS$n9=?2 δkZ C3)ad suٲ!F">p2ģ(XP1AĀDbI4l:i#Y$sñ)08j`g|+< ;8@/Ul7igiS谿vlPP |fH,LŊ2%D3Pn{^ymQehFkKru&Pt25dC \۵]@`Є|B Î $Oү@10,Ui% ^HLN=P\<^,C#?d{?7?E ot05dC^D#o@R WbB^13#}EN~3Լ&7 h/%W-ضULdؔƤpHjshYw8m~ew9CH1$Hzc`F^~f b" G$,zʘ C~"[]Ƙ7w=rg`(qBbT ꈕ3lYpđ"A=d߀{sl4R)Oa#ZIy-}Dl1A*yK9,Ҝ>o;JD\5Ze .kQ) +Ԟ0ȕuܧs#fEJFf3uu&2FZC1y_l2Pm]>8@[P9(抖8A*!"1(TʇLi`ldd5;h@ޖ5n:4@'ԈWyÄ"D晑d4|nm#ٽ̤Btɬn-֒f#=OULWQ}h(̗NZ-;|v5 DR%P0dťT.cN-PvS)l%25u"NtaSFBPΖo ɕON 9 (ׄQ}&IѠ!7dTwsb9Eups wdկQLVP @q[MH !BRAp&` uJbCx+8IS2YI6h86i#(Y͏_4QFaN>J$Șg5.w"dZGGqf , 8G5g\ ҈IΧDubSsi4,J|i#9S$CIa}zG4MO 2!"Sp c UMFFG AeaMfM;T*^W&$*g!mARML>$@2̖on뢩>$M}讬eGf>.>sֿvܲ7Ye֧3u2-Ra J"eHw^-61h F D*T>;A~89^C:bs؎phs,᫸Ly A(Y:p+ׄe !}Ǧg{2eoM_ %YhJR|h@ =z[]=j 0|vEI]Is9VA%ܙ^Rt01\q*xk6.Te3$kqnU+مe^c7%kÝGUWwǼ TgAdD>e`2HfAE `a.o]. ^J %*HBl+|")&Fo}xaiI9B EF%0+6tS1S\vǫ{NՓL6{9f@uYO 1`JiXXiL.DAdҖB$~Lazen"xl2=H-6 I"Cp>وY>q=ڲ)`CӍls3l֡ fgM(}V6"j[>vFg˚ */,TC1EO1S4YA$$0#0p!$:DXL4‚5Fh8ܩt592"uf i&)D`iF ߅2J625XJ f~G4Xr33yZ=gD6+.ҸJ)BT4ړ(^~pTM䚌qcq.U1HE{~;AӐDʒW%e/H.9a G50hd j2R^DKml:㍜<ذѩtسud %3",<pk: ##f`}KJp&hIᣡD"\c ŻƽsxF8d:  2)k@D[|)TqMbd׀8kSsxJp)/iWџQ!%=l%""F `pB T fJT܃-l6J[$-׊QMBȅs6˯cX֖WE,Sf)*zuu*;l刏ORJ[;WݖGוּ)eW~fddbϽ3:-{&2X/]yIժȉy\ޕ,+zq7kHJJGi냜*yPk2Vw>xA$L0Sb ƁpɃz 7+||cuZƆyB` BKK9"+@#ld0mbE"`Uddr*[;D.Rǣݾ1 zbsdԷ:fE+3S`)l\GO\XdOx$TQٚH>e e 9BSN$`%uV#K1LTH{gu#*#TD`U-m#z-aQihrV GsWGPzҨz$fsRt顇b`kp@"0!&dDBDƜf6oUf=+" ӗ##nmJ))oY$a8AІRSb&-6D$ "{r՞AKjmj-}T!mHsdjcIF0Ke#uM)$lux#FgoWWA{Գ#ml9RK\Mբtp>=qͯn7(嵚3{9P3?%z!"FMIi* **\04 Q2\tD״6f z}O$( N-m ~RmiWW&S3ɰƉzƔ-Wj.| L$Kj5,GI{=>3yϵɛ@A45K2= ChLU*Os(ï< .*FF 6 ^t>LL<%eRPZ 2H`id|.)'-HU?;6/M;wqM6!$ˏw2{9b-p(HGB -$X:|(Tah Y%,@Ƣ6q}0 ^`#$fX_c6r.~89f:KV_&ˉyڊ1!W1A( %>ބ.\D b{I5P Ji&aMssj9 `D EAXһtxA[lHSYa^Ӏ" d$ 8}3yvRV_!LUJZT*.,[nx= 6brfVҩ ңkI, \NK@PÂPY cB#&|P3C2B% 37=G/Q'a蕟IL.ɬׯ:aO;5&-a־4s%jUbulR(v= SՈ 33@-2 U4;g+!(laI+A(H*!3O%nSoɨ9iysH`nע}j <34%h-H n9/|"D-G(g%XH=I(T4ym\۳#I:u[r?2dGAʮ_S[km5x4r0PbcE H ŊF_l8b-}߷v'^W/NVUc6>mDmbSsLlJ~dчS$x”1* M 6Wn-Z>E{9>U226LЌk3[DshN)āIWG4Jj p3@I*IAP]K"KYYH609xx$OMUi< +]Ȧhpn$ܒ( J'Tk2;cfE6I2űN'i$ x*͒[7A1Hz[`I  88Q$ wU!눷`tAmɊ'Q@a6Q0{B'f%ũLB(fȢ ̕-SeDKK9))DIYB]N)5U:N,O%Ook,]MR+;luvzSצM]XΗڸKrsRe3I R)4ٝls*Lrֿ8dQ}xXk*59y PD[!ДuV3̬Vg XXbWڜ5T}s'N}ڃ^|lf؍ oRmrak$eKT 1GΆyBJvD,>Zl6$uWz+/QjOAɽ0O9.N['hQs߫v@u$~d܀6kSslLG/eWQ]B+#-=d 0ͿGNM^#Pr엷{Bm>)R]ΥG[QobmoRr cw\iFaCQ5nNbO3ogɈƯpeBnpԜo3(= AT$FY {áJeD_"Q]@6֨Idwpc sp)*a1l)#0ȁQYn*vM1dxhRdz0ԉ'7#Zު[7[}4HD}I9mJ1@{_Q I&n'jzZ37yp^C#zm-yDBbcIpm*i#S$*qh,w3 "׈cFB8D@3@p;@L6N6i7!-0_a ˢ8v h!˛חa0 Q<&aƤ-)I3~ bM>_{F*cd(hhfP3ӴTxӠ2LPc@6i&)ѐ ?[iP(\N@*"QP %Eu'!J.RͶsE۝ۖlĹ-L2dd|0@!f'0^0#0K  )49nl]`rrڕ =kNlJ9BTM6Hk ¨$'?& J"YiwIb(RFNk8Sy?u# PnBX 52CӑhDN`P');h A0HbGU=\fI 8/Q)jDl%aǩvXǶq,91FS)$ )Ai(Ł -Xƃ;bg͐@S!TT2#l [l!SunО$EvW5̾pZ6]7v_uΑVJg6Ft!gZ-[ hw)t[P̀59 piYET/G!ŧ$cM]FU$z^U~Ŕ 0ڌNdH2D X^ ,QeeSlS!kPƨ6(RW͓]<(nҨke D݀bI4@lZi#ݍU$Ҋhy~Қ%پݹ6M.1C;b 8ԚCpCua -X€h_cC܆-\T0ٶ,hԡ%wQ:hD+(HHx#1AQbK2GQeE2~פ}LH8Զ0RזnR&1fDh!!ths!I>Z@ jw?T13eLѳe67JRKX@"( LK%d 2m*$HH z6})[DN!T&v ,1nq"Cvo4&ո@j `PdH|7f]긮SHL5@t,ƒ`묹Rȓ&;+ju4Lܱ$j)& 9e#f4"_c)QSã{*7N%~ܢa?T0ᷛE`E7 0ZoSDlG(YŠ*@#>PQI.ҭL;QuŹ}%#, DA4>(@>Y$1 JBD_)`eacwj~*: kxADˊ3&RyjTAΝؠANK8AG34i3rsuꋠ\t @d!)w#U0\00 "곔*8)XB` ٧A Bzn+KI#7%$P4ؖ{4MF/y^%gs5ěL5J7K]v{h,eG̜,NWBU| +u)ߊ:=ɝ`*!pqlh "fcZBFY ]0@YJL̊~I ʢX `$3R@ĐǫXO 7I%P0zM/1^h_Vυh^Q@u0(9 A pkRqj͞Vʎ2S?@Qn̋@GfDži0%"c(Xk姂D.B*E"AD"̱EQ3ہޅ] )NBAyeF(I74McZ;s\!nA[mˣi|9f `;|$hRM|\xIR&X :OŢ-1kHTLqP12OpD @(*U$ c{5a%ɿn5 >g*mp4+D%eN&O=F1,XDL)jY]lՠj֡`;jFp!ᬕ&HL*03Gy7Q#l' `f' UDGZD2-z.QCIARH0,;\%q6lJcdx'/A8yU9f$['y! a/uR('ahո\'Y#s>F\l݄!ߟ''w~ѭ(ۓk0YƖl=Ñ:=yjLkUV"*> |Bl9I)%eWRdɖ %:- rX 8T P %G!w VF(pE]hpD_Y3&f"0 ﺁo dB!T0#%"21S"8#9md_NAP*6 9ۇyx$-vĶ]}2!-@#2PFB.,)(Iɱin1S΅,LB*]dUc \'JIO%53޼l#edhl4?i#XaM)?k=h9nu̵{M n=ufZ ̄I tA"GF c֚БRyD@(=i4B"Qbu &rQԾbLUtO$Pi@c%W*Vr:(STBmF.'$w~[ rwͶ34G c[7%` @2tLuHԜ!v1Q! &xa+Kѡb7Ftd|Ms9r4&e^Sj R$,4Z9faQ ]ǭcn͏ZELeK-W)+d2QٹIbMRѶ K{6 ( Ć@8\JxTfA'I4 tIgպb!q%yϭkiWߩQ#Z>zrͬݷZf@`k5Ck/ 3ozZF!9S_1 "iuTEg7?1d.q_UiYB2 0`A.® |*nPb##d1 RBwKJ 18.DτjR[lEPZi~Q$y*1Ɂ:NZQF$r &QzQ85 #SM M)XKW6ݎ{C‚GIj&|??HkPk_$jý 0D"uI-Z\deCA`z&2 x.')bVsZǍ{.:/7OHu.f^|cufZ"2 yeN÷D/1vh)_W[:TNG9ʬ4DeYm"`+,DQ' v,%6#Cs՝e0@R(نY҈wbLB^gW.f6ޒqx ong 9nbKRqʝ3Ce\CRŹRlڭ bZ. :8_hV,FX0@&ݴ=+dȱfbQQ*UF0q{8B\2E]DQDYP6m 9xaK!*Tr'0j/9Y.b7ЗٟO ʬ& A d0l,p8aiˆK g&}2?NdU-պ3 6;Ƒf,hcHgA.7dDȋȍͳ'qKHqPIhR/եkOW_./ p*{tVqMDJQ]8Eu$D]^'l.^HJޑ q=_{zgj;?i! 1|b @R"FPI"e3tH)0V'B)LV:FDl:F]#Dw\P0D̀$b{I4pZiUj90H|HhʌB92%]oG6cjU9mr$d@!  IJ =lr6J1b}@|8'I*lQ/4e~FW&re,IjNRvvóFh Rr I<6.p阶PbY̫҂YytnX#sE@D@[xqAQ  L(ȄGШHUOp {@B (Q'W[ZSI8 ցGE>^NCm+&x6;GuI9$fpS'Hoi..n}㗯V4t)Yd;,*QЈ,dR BAñr V`BDudam6R(8>DJ+UAf, ?ٲ7Jq5Z XI17{YK-Ej9DEbbcl4pki&iM$~*1`jK+㏯59wbפЂKuI-oLZ2fKύpmե-˪F9MCNX]fbb0 x#> F8 SVYXdIWa5C8E`FdHb%Xb/*T; Lg &$-n&tO12+QcGR‚rrZ?q H0[Zq1RS0 /@(F$&L+"z/8K\,!Q%]ARCܿ+b?KeenٰGθ[}}o'߉4^cNߒnu2J~qz8 <Xu#4v[g;rkZB,jK#y(@@A⎤ m#;lbfQÐ |O=2L0.#=oTtё'.kq]]AsQRe/36E dһ1w\@BYc !P@dF%P/<*'`DK1zّZNHQ P'4^bz( hk.MB SҀ%]4';k)5%E|,Z\NNRM`ف A44KS*NUK9dpbsl4`Oa#UQ0B,m=4O4 b8. @]u" P̼@ nvSTOWQtY:ZHɨiЀZҲ/jO˫|kM'x$K^]? Oo݂ݷ}~gE[{@;Y)(@B0<sZ+ӂB ,S &6<Ņ&&I֓X0WaRrq-DTÅӬY"m˘f%&]/Uť7uuct,$v,ka!uժ=ScIp58paSߛǕ1I=[_+^>+<;l wTZy DVfǝN˹ڦ\3"b4l@ I{^(dj\"fMi9 ,1QƉE[ں)͹lݪo%[q9WTۼ3՜w Y~LX_s}g>3W@<@"`æbHbNf'`/ &" Ti|=!N&*rV4)<$BYߧU16->:οvB=D"djScL4+;_e&W݉KmJ)}A;xU0J4]oJn}C6Km@Ң㻼6HO{ rs%3%v9ʖߎzԁEbr-M{8bu~j7>9i"xMow(ш$J؋Ia6"5$ r!s{2vvߦ:zٙ׊ĶLn_pg'}d*nS~+!yaɕ*27 y ##$͡%C rErәj', cЌD[tחQK+MRzH%hkK7JVcIǐQutǡjʠOְW1y鈋k`a۽&jԵ}S~մUrÖ^_-Hwo4ZLV:Tqq9, jL-K(i 1Pf)SJJW0}.[VOŗLk׳٤,@:(&8YM5ATŝV*5PzLBjqӆb4*[Oe3Er cЀLL d#B0a̖q3"J0#dYaܣ^f>CD e4(%ٝI4f7S%@eW%Յ&Ii]r%beW,l܌Qe-dh;aЋ{dëXM)"}ml1*?Noc^1O*T)HԞta'a)s)IgW$)xpו1&jr[[bJ5vLitVzCi$aF R{_ bx>vM=IT iiql +-t̛F۪  $ }?y66Nv.mi|`"HcBhZc (uզs/@U<\hpf=3"{TNծ6^Zhn+.â3>՚Lv^2!d֘t9 05䳳Uk$R[爵33m̫>kȕ{]oFyĀLK%fqC.} .k7 Lӧ͉lWg&.hN%Zŋ+4 #Xj5Ҍ2(.M1 CAe0N?(̶k`wZ35OjlGC#̄Tѻ'MԦe@Q"^8j- kG/Ԯ*eÈ]HWW fmb&8 U^5>o^I !+B<d`HjRk@(*#tEz- zjTݵdcRl4r_eUQ0s*'- KZ7,Sc_=E =)ItߕoPa^eE99FrגSgJvs\{Aʟ_?˻f4iRc&?nDո$XHPH4TLxӅA٢>!砐88>P[J0riu<8K}2*RoGf=G؄iFqR=42IdfuVcl TE嵩]w=),IˠI<Gr@[Krg5;"r "]D2M|yI3r\$ꢾ_gG_bl "51})o|PC6o|hZGmLOCF@Qd@F*< k*``anĘidŃ- (N:GB8z=Ԧى HL[@2d_<|{;hO뿐B.ct?EVVY8;P>>7nt0)dbclDpƛ?aWգOͰ!-  [{RSKdS2kKʹfj1(hҊ~9\*93In;5d8 6TW)/rGɘ>ccE[^cVGRbi;mZX 1l0@dIPpW=9`KŎ$ R[fH_lw\z vFR@ Y`8(0@@'0-Z.E_DZqv&6}8 4Fm l[f)<,IiR8"ţ+(f9ǦyLIuN}&!4oIo'Ѿf43U%G"0l rgY$l.Y6 P–D` #H- D-uئP.LM-dN`"/,+d_?ba)6_qyQip.V'pUS&^;] 6 pJ"L(&\RK0Ā2L8 ÐvX/֞l,F?``CRY"a',Y$$.tD̀FeI4ТLZi~SwBqjqxK@)cdbSL4 ?e#-Q0Am}߅ZaYmJ7w1Rj/uLs˥KxTFMV94t\JM "\*"MMłE#X$oEfdx$dP#Nɼ/.Bf~jG{V}[O}ϲ̿ІM~C̹IC.d6^nvTLUyӈhZY$$x\fp!s %Xpq=%MZ̭+>]ݏ8|u:]jo +;rOtC[>e8Y^KD:-ʦ7EQ)T$$Z0( F"d, P (4aI=;'*6K8"I"Yd$‡Ǽg5J$KA% 8 0[]du ZXۍ  A7DH( t tdM(mFy5@ nBj%Hx2Iܗe ݟkU\"Lic/M2滶yMKd21-F=WzvY3w;wDbUs)pK:e#-Slh{jqh:Pk rcDb3JhLX 55H(4+/i0*B@YIeô(3FQJ)YmuhܔNѺS0XE( "%i)P V%pB|<(qxAiG_'>{a@nոhh2Q 8tbSJΒM)*H *VMde Pudsk/>K%Tv5ulN`2<0$mq#r-+JrI/pvn-fNLTy*]@CErLjTJ:P *X2@NJUfN<b+;CɸN {r026"rfLR\#is813$q(2AcVq%[ffC^pl#ڭNcؚ >,d),MQN@Zӓ ".XF |HB`d -*:ج2jؒG iML` Pd$"diɶQߎe3QBSʩVFQ%rXDր$bSl`*;/e&TWʓ1*`b$*55-Us^VNba}dzo*?v~[P?ͼ 1ҼpȐ *Ő,"TĴ~X+ߓ8LI QmfRAD4JT<`P ĠAHfHieAɓ&[ !9R 4AMv˴C1,Kj^k]+ szTm?ІPZIP@!(\[X6lD? v !e0BټǧqU8fGg'ĐE![И\`x\ #˹Z C nѵw.=uEC;)o P+8h}nڢA@*ܡg F>r^cܽ]QmMBk0R_ :&(HcФ [Y"P1:ؒI#i.,搇Ăd'[T /;..HV)$XmJDMQM *EQ|FJl2W >ګdUfy*irm{L{q]4+>G9Aw1a@"VAT=X-&0gAC9=yҕ8/B0$:萔1'+:).|H+s8WY +ܠ#"q%x&DHQq mTȨgї ,,[C>:ژ(*)bDA[V3]0 ІBB\˜w^lKtT71!#I%HJU&4Sdr:O+ 5֕OkVBO SQY5}r1h&B }TYZohxYX kJaDWbsI4ki#CṲq‚(y TaGDF$IZHѢ7Bn;M D(|OF`ʨLp362a"6L2KJf.\Y{ٜwr> AV F_H6-ՙ*0b1D%Pr0@Ȝ,qB.B0q䥋>8Zؑ{wCK(ȎM$Mwԃ^NQ)Ayf:c%;/iYvE"K2{z>R2A4^MgJ\yvxT@'z lHnn `cU5G ` < x"r"dH$FAa2lF#mw]<̐4#t+ Dqrl>_Y1^v3R[-4wDasF[a&T-Q$l1*y0o@1E8I;܀"-7I8fb>$ Xk(jwJrE-QUC"kEbTj7j^m`N K!.PD86#R5zFɻHD,೙䌥K73NG) T޾o*$t&K%9H1d KeFBJM*Tظf\7g=?)< c.s !42RMf Dٱ@NDdQgA8b )8vii2Z)Ij:xJ4_Sn9G& /<3;%'g7\$h@yF(@ܔ-QCՙƊƭ(4V0  TcwSkY-К MMol؇2]ܲ%ƽ,"<@ uLP@DbU)™Je#TO0т9P 2@@ǧ* PKT:$ 0?5?^M< ˏ-Y[#ljvV NQz2I[Nؔz~+ 9ݞZ)ļ\SDoU{> @-@lb1 XC $` ɂP.I0 Q)ve KH*ˊMdB8'& / KmC>7V)cm0! ΁ި5 yLĽ4xQDwՎPǽЈ-@L h_ GF(X qV BFX&S. uK %jSn SN+PG;R8\a L|/k]H{!}uw;ko_jvTe/m=g~^dmI2 PxQ Lw rqK'+Y.|)Z<+Lx&HC'Ď(Sli(!^hx۬FQ fS\mx^ytDހHbS[lJiaGS%Bq=!nok L>L+a{hã04Y@I,k\""ET:b6ư * d?=4DiJ]haυpNX#Gxnu N>,Xl-hG"BzQpQ;wvH%IO-BH+u)q_Hm7xߛ}VC[:0fZ4 0Ԧ?EGrYʐ`~M/eROV>g;0::? աbnjXڳ3YX.*k,izT1-˽mTZjzC{jܳ5"sa0z΄wM  %H. ahѵ"Yx, bq`x!VzDF˨CFWYFquU_2g2O 2bVjx(|2a8 a sa! Vh Z;`-̴rtJiWt_ Ao1bTPg%/Z}yYLtDUAcE[7h"B4T>pR DS&*a-g2M.9Q grDIL-9Ig{A۫o6TUR_JѹB18 \69nGٻYRDE=bsL:i#Q$‰*9hq(pkKq0 B,CD=f.S^)iYvʼp2l"iso:pa"BhH+46(D(4if(AT>6P0oُPD>M!DS]^:ݴ>m܏Gsڲ-ܛk}v 'Lr?w\0$BFm%oˇʤI&,ė%d[+Zbi33{KeC=q9u^\=/7t{$33Gb2$YRAd9:GW`t[JDǞP7xȵJ~BEv{`M@G8[C}g/.Q"krsPG#P+PaG[dU+L.__g4W4/IE-CQ$mjÐk>gdhԙj{FmED4ygu?ﺿ7wO +t_Ƚw8QV&4aIh =0b3V ,BN 6@PUNjy/%>.֣lђE C4ѢԖ1Z:(,S-_oDԀZ{ jlZ|eCṲʌ*yxK}*1-v귿QԄm@, \P  +[! aB*&iEGN74!i-(%\DԢ0NjGZ%JD-'鹦:F4 +R)#+mقY a  5gWb1oN̉MSDBaQv(gê.K yB𬚤9 L.Q1z%+jrXϓ"j@fLW DNANxQ=b 6a [¡qb]\#0ZaA%CDu#\0,Un[R+ky-70HI֛I@R# [ `h'C=i <̞FYuD٠#FAF~ T"km]#,n;4>~ BI eis9Y:Tmn cx:Q9T|/vty2 ӆ0` r΁ 0!czȵ0 A +QYz CQ {vm`5q1'cTbc{,~W~Y\K@-("<1ftj0*ט Ipp<'sY_O96jw_ D؀DbI`zi(aO0q1ihl^@eF6J7F8mEVCĚp&%fC2BUʉ%mIs*d6ThtAmOS0 F-M\*w3ix^^l~DԀbU{)4ҝexّS̤s)m IVRYWb.jeV#VZ<)az( ʀ^F⹛Px7Z`i$WtsݛEz4Qsc(΃N hV*2)Fcfb#(.֗YA܎إ6е,S&];7v=t"&!;0'IMa}-$_z JA`Ai'80)6&OL!K*acB"P),m]2ǖfqoIqjb/(nmD1؂8>IZB^6^vn'w?ސPđyI h Y!*@q"."2`5УQ` 4"X%ڋ Q"43'_%&eb2"? m366OQ$ѡoܞDbI6jKm&=S$sV1l}mϾM*6Q^x'7\ԷW$( W4]3L PMyQr@wXBHmr[4BBgȵ4 ާe۽Lq5+5)\Yt^(I[Z<@2P`x InƁYQ)B-P# tU@H35݉WCKr^Xo" fݥ`|DFPF!%(-]_ƳDL$]aYv%ř+3(UI+aVmBjW\ Ddn4&6\NHצ)WE ]^]7_[Z7MZ3@"h,a.>QL| -}PqDS؇ߧYz2@DTBh<^iQxP (sAl ĩ>Dٸ9>"TEIE23mɘ,!nC='?n湬~ }TkUfn5觋J0JX`.C1m3Kh|e7 \h-O*d!NFT@e]58aq1B?n&CNDd}'DXfe7Fr#6aeQ\qeCFD̀d)4Ke&SqQ$sʐ25h_jmGR%eovWxl!AgF va.XƦq{-Ar F!* #!*p 4)?'q '^V΃#L .d+"걖hO9_d:6BQQHMG9/j:m*27Iy:YM-4|BPIowTZ{W#]"bewb!H|@ aIfr22C@& r Ќ@ӱ)ʐ4B\D/e'e  奅cå\#WC4kMWo&t԰IF :D[3#xFGs1j#W'7>Nc+u3t"G@oj\0 BLHX!b'&Ys4f45$50"a*`a+[_Z҃]Qs<,cI(= `(] DI$ FѬ4KDof*EOx{=B sg$7ž׭/ioQy_=1ܓl!UIb eR,P 0pFBp4X07yH%dè ierBQ4:2ϙHcĻ'ZKDj[l4`,\iىUs\+l]Z6fbaž;GؙL(utTw=s;9D"Ԇ*8̡y ̳2De *޵Jehe}XvF&0C "콙L }5 "iiAoz.M;0r9=.`ӛO}El۶s[y^oO'Z+yݖǪGD55`" Ul8xOC433dP $%ZApp%ʱkwm[I,`,v@ڄʬ4 !Rg>IP2Mx8s+Ei7H)fb72n@ta (eLU (z: DdR[i5le#Hͤu\}"E0ƂK7Xߖ0" XX]509HDIdN70 B 0"EnuݱQpI7O]rjs2_LRP XNTYƓ^đ>+"vmP"HP( NZBNHI)1|G_}2 (QhFGf\*x#Z0#0HAW(`7|ʡLizu`uWY06Nx 44+DdA:lPnuԑF2EK83zIZ;^KI(wDz=cxC!0dieT" )4[x9`< 7/S/\5 *\:J\@` NxMO k ` 6*̐ dH 8h*iY*Td1OnJ#L!|HlŜI%‘Tdfz0amF;nϫfA אMA !2$cHPC/pc/Ct.BJ*zrAcңv&)HLYRF*Q&#CD̀%XSIlJ\i#[$q꾳qp1SD\°8*c9ۢXAN ԃu) 5Gw")LGeFT!ݍ^gn H 8*01aϼJt8Dļsyl S#^rܛvbhTGoO̳ݧVBbI,rK4"BUq衇UHH,мVcPr»`e/WLW?ݺT~ֈLB55ŐEr dCq@*cv>3#pEUȊV ^ 3:%jg\Jɞ "HgJG@*J& NaO21M)1@}€ԕ6U]űH&qxqÆ7H%#Jj*MʗYH3I x!:S\Yh#͔fmX%#DDgScL4˚|eMO$s JkuDήqhB E+Vl9MR+iIPqDR HFkT`"*_| ^Sys_viV-ɾ OI.a$Ȑ9mPr`NtX~䣢]l,H7ت3h4'VFxM3cXx!jjſ0#4m%  0gɃgw*&\zݘ{04vQCw{H-UUQ&$i,*&,fԈj8Y1h'PY(Ʉ Yʔ +t^M?|=!ilZ]_o>ͽoMQꄂZHyzٛP-xPCJi2b)f, a|BZh0٫vgɅh('𮢇HuD>M 蚅avshsqw\F].\Kցb)|vZ!k|*^lN#f˟s]zVMN"0< *Gd̕m4rE "H 6`Ӆ!|!e.i-t&a0 (DA:r5t{ L0;uek]l]YDP{ 4ʤj|i]q1ix`Õ0Q*U TSڠBa@RT9|_) e:FȥU>` s)@@ "Xt̒F; -ll`%A :A0LLEb(O6ad|(r Irߘ^Mt6;f-J>M5I"Uc{:$5VfpX.97a:B,@™ XAG‰F0΋l R\R*3,E[pd쪚&ThO=WMUlZGK:L fh6rYvϬ]}ofm*RѱTԱupEpFD0(XHـ`^A#JLb'Bܩ\}ybbtR\\pqĩzdﰾԬChcb+u+ Y 7\;wf;vJ4 ']cC{50S^iko|:R j0Df"L1:sXuh kX)`iA^U(lITY1t7 A%*Hʭ898C{O3$kr;L_MU.|#GK۫m&ω{bDH 8DDYI5`JiACKdkk}}pMGLX=ty;A LѸIXUlf!#H HD]\m)OLi]2'.M*ȄL$]ĉrB"ՖPZP lG~ZN!Ы 3Wuiݳ 1FjI !)al]U$KX 1( 8`Y@TDY:p"H@A)HPBe [&[ XdD:KfJsK  @a Qiw1R,EJIC@IerUIX%N")K7CtJ/^l=Y,RJnyD HAXXnzp"\2t1=_)=7^yܒTѼu/_PC9IAG6CyX bgPKZAX9Tڃu]eP@%颴&eq(ˢiKQlU洺=*#i#7$sZMvxHDDNScI4ңKi%'[$s/i0J)HʉfNyAe~+ڣX0ϘOd h@ et.Qjf !@qH"ĈU@424deb Yfz/879#F)7r:Vdv#pmUfw9y1ޗ.oWYj$;M'k1TP8swo_0RvI (gM"EGy`ACIjRsXG ȓKT&% V%R;dN8*v-5PPe)%'VG=8$(8’A##1&gӷB.yjŴꩻR"B"6 ,2%S5p 4xaQ6l# Sr)*ҹ>GRAmMLZM 찾zY0QRy;mQL/|{Y)#* 1D-1V5 Q֩-F@H۱!rJֵ! l#o -]-u` ƒQXl4L$fJy}e!-q"UͰWVY  29"뼥' NH(v a@NILrX1?"R=#Hl\n8D:bI`J\ieY0s1ih1V9, 24[Rx8i,fdpqPG0BP"m RrQb8 \&UƘ$4  fnYB^MgEсjJD8([Fh $\Sh$bHZ7ռH RIH 0ΜB'&*0VJ23p6AZیndDJQ.Yr%nY~>vy?. E8jo3ymy#2K;CNCi1ЃzVݾfH rh*\!$F5]j,@ M5y0 ~.auCFLa=(D0 &%R$"qrj )-b1Q \fJ ua] `f!2uUŅVH:կKunc0F38D5iQ3 ^.Hd6MަfREqc2Ȅ0DYVqbNnӞ7+yI,k_F(fĆ BlaW6 S AnvDDc/2,jle#AO̤s⑬QIU3m,ZvSH"a=u`Ҋ(˛fZ1t0; p¯9̧nMc{L:YTZhCX-0,~H T0L*EjdB[%̢pJiJ|rsY.CHܒ)FqR r-YTV*48XblӋ$.38 Qǐ,BÐlN|]܌SjZ.^;Ƃ &a^BDqp1Y!a)(DB ;Dṹ}NS44qʐUR9":A]?5U2e =w2+Dt3 TJěTZJ꩜yBIt?feӮy>`5e@@剔ꂮ'V$f!`f XS=sE |TA$*+Qqy*ҽt|@rĩ# aVn+Cxjk,)υ%9mb/4Kf DJ3P HP\Qļ@)ieD_Sc)E0ze#R-W$s*<깔U8ڟT,X;iCC2w,T#:gY\9 6&iGMc6sB8BwѬvK2O+>n^wR5Yz;Jњ=8~4޸4DY6qDM-1T6[qy X[n.(2o. V4gaY53e(^0\tk/ߩы40e#f3 lb$Y5-BF"W)]*2_fDb\n&6/bF@t".,,"7GYM 6ZյVL|Pӆ0UϺRew 6vK"EhK<>1T̙F%ޢ'6utg6^v]°Ei$醨 v Bnʼ L"┢9 a@f|kL-h.Q鯺ߥ=䱹gXjrTa"1D!؋) bv3_N&AΠSzv5f`2i|x^l8o~ "hjdPm4-@hDь>DZ z i&RWoNj}C0MHOlٔtᵟBL'Lm/@Xs])+ #W!I(>Ed !0(QP>&7A!d 6Wz#d ] %bS3ôOa4e阷2FT]eՍ3ǘS*#`T+VqP+ 2>,V(鞫4[6 L܍* "ER5q76cOsm:R~,,d!d׃q蔋$,=V"Lȍ3ASKpJ-Uo$B6'/)oRSdfwwl ,jde&.NO 0Hf,bK3`hLb-#R#vz;">,IDv䤺(ͪ7cQ|CmaZЏ6I̛!̩VWޝ3@;A-30\Sm SX P4JDh ,z`ëR͇Q$u*U0꽆U y 1 О!Dta܉p BUŤ:,- hnWz:t j0 ]lKr;LNI%)즼(sѓ'{7js])Rsj7"(HTJ cP)%e)0#GJOCdd,䬽>< &+DSЧ Ȥ=6 Ae1,ەn{ɫnj[luPB $A:ס hJ5J:9+H20sYFT1s1B (5'eïTCK(.f(Y%d­4O3`ɹtШp .M&䕆+%z fۄYg)Gk\62ɢX50NhO"R6pwW梘9aE8+[Yǀ &8E4"ZE H nm*R6#ʭp}16!יҥgN)יx֪ta)Ng}דz1_mZ\lBDd{)za#RՇM$Ѫ\u=ו{ T$ `եؠf -LiЉ4uN˗B:bem LLB^fqƵ)IhD[[VUD̵@Pp2#׆<5 n M7f`[grroEn%c1" %-)9@"(U Bqдd#$1uL.Vx^8 E[7T 9B5DiC (D SԵw/PFۦVɯl:.Q)^#+V*h`:W`ClFjb)y$%hG$QhB*[ PPg Dƥ Q{^L*bdȅ&ʹo*9X츴'R* {=(&kۛ)j.$ƪUU 0wT\hˮBV-4lLt3"6#iiPdzk@Q i#mH:!-d ؃=g<rm Z5MNDbL]~''`tJȒa S諩3#滖Pf$({!pYBaSdu@qzHD׀c)zLi#RC$uJdh1u5PKH{JԘ(؋w,JEE( 9ij*lE8s"Ѵ$JΙ@ /|e'm'n5eI:=JglOUQVc.Y(KޟJO9HcEYu&"ݝ-imy*R GZD&4{0F, R יtl]HJVq,V=\qAI$$~,8>JJn_u )c쪱H\L*C^xhabH!|Urf~[j6XKհAg1u6VIq4pX&p Vhd,G0{f偙"+Vrb^Ozh6.%e&MDbA@VJRV)mLvE:*1R pZŀJVeFTRM1Rt^Z ! qT@f{i}_yYdNj9.K1adHANeYRzh/t"dʩԐ*W)Z ` 8ЉDƌP=DЀbk ʐJ döS!Ew*C11"zޖe;;Ifas+2jD]f (X040 6٠˦1/IMrFiً5.Li rA~3ar+cJB-|8nk^Clp֧͐8DxDK 7DY"62Ikm@eF( &@EN"YS&&U;r&AW8'ItA%mSPhhlE(A^,)5آg9IA;QfGs%;k?_OvĐKy_8sx]%)l4\ o#X \eF M"‹4f-q}4§#d3#R&I.>6ԅ{NnK"vjMOI^jƉZLA籊 c!.Cco%H2e"~7Rz’j8*<&#z-8U R}ꟈ1d=E"^8A/SjנynYv-K@ 2,/ݶWRj)VSkcE=iDрT)4JZ/e#Ro?0j`%,+n3&?|=O"A" V!RiQ*썡51FDTY0?,Õ7N_-2fwȟOMSrwT8MZ:R$9{n+%P:4zj&& <(2<*yT*[kpM&;j(]3wcʿYsS5)͈ϭi)D'Y$4CfMB3!sN @E) @hwM]0F D6 Y$EEf*e1(nO@99*dzH\\Ynv]?>VHwd7eJ/tE߈#RHY9.Q@IBt j2B2 Jkɰ- ,,PBnQ#3lbZjhX$jD9U(n3xSh*5-+L5,0dCȶ-~$fr6|fN0̉]D0&0,y1$%h♖G2 m!CiMژ"Bat "FM,4Ze.0ۦKbQ֡Y}tC(K!e )"挲e1 !c٭M[4[7,0^%-Rnjȕ~ }XJS_GE HV~!X%*Lk2K#cdV"O)Lm}&n<s `ZQ/W"rjjȢ]3TmT?ec1>d1dy.6xNjo1OY$Q7ł`˭g!%۹Y$)8E2,FbS^cI r"d.5[%1(zB=0,>#.&YV 8ji2(&e.' u fƍ t1ʳ2L5EC^P BL;5LKsz~H;rAI.&B aRPU5bI6iNG|;3JXbʶ2DY 4:h`ɩRuG/$qd(=k'Wfz!.W[!<̫2`+d셶&^V5&r6~+[af̬[s59O1{H#eM]cZ Hx8zZ/[czXePbDTI6ay%L3 9"agAdKdMTJO:ꊔFwFӜѨ6Lԧ+G2xV_ГoZU1Rϸ£,ĤFېb3z m 102GFLaRkdm,a,wrGլH9;&onIPؑ$ e韪8-9%X;]x4ܚ^I <NCƚ*-upbاc[*>ShDb#T 4BUbnD(QoyZQiiJHCF>9hn6}hj^B%r4޶ׯl8K_{"I`ew34؍(GWWxB0T!Y#kn.(P 0rT T8Ӎ(`!DIH}ZjxDTKk 4Ja#G/11q=^CxFuNc7G=3us#;V֝rZ3|ۜyKQOEs=[Ji1LU췞^Qr]~Q% \*`2WM$" B>9ieT$F>Dy2@I("]P=\Zܲ͢}'X3f99#PF^oύL'jN, K:!d=hmUn֞|if" Y⨖7hcNq?e\G|f޽=֪0Am'!̜2m {C 4Kjz4/wC`u&;,̴f!cxp%@ LvĽL[vJ2c붑qBF,ȧKe I)$6N5w:C&!BQIR| {vdHg$p#SYv DȑV(uhIڙcё\b1~)/(\H3UҌNŧ՜2?` >uptwߙ$ 1mQ2j LYKt[:2)@T+m !!DukVFpޢkZj%pE'n҇p\䁥*M5~Khd4&쁶<(r6d΀U,pwhNi(eSiG)1_%$\օfYa~$Xm)VH-̐Wu UaFSA9&.m6&Sf/!d CZI6H*)=#GA 82&CDd#kaE}(?SjTrֆ'UvU\Dq$IKQ&2 [`-PֈJbk친V&KppC!IENY̖ӎ#QiQF$@tٕ&y7i`tp蜝 L×&jOI 6eғ#ػ}v{./7}MC%[4AInMLAF)9]`[r꒺{լf#OEPg'ѹ7E 2a)/~,9J!WWu9z3/"*˻± YKf?;qX@bk,ʈ̲6-`}ہlJf;@ 2 pJ:^q2Yh,LJ׬]?=$YԭV|v:OڄjæFĽن[yBR 1iŏd`eI5Za&T/1f uxȢ .K 8bAyk *5D!~:mt`7CUXۜb M'U" [Jزr]H *Y]Qp^Y~IX#qpXxTtPlb(Kp:‡T6j ÉQ[\$$iR7eǥjtTk5J3`l PDZ *LH^S3 ({)|ថ7vwм .[,=/Śk|HƆ &r1 74_!/QnX=o^ym$-ԟRy;;(^5diWEVu2Ywx ξ\8)"d8gHB)@ 8dTE# GD:Add4;+ԔgMh^UeW3r85غ'sD΢&-<0DdK1wRS5(=.!94c-Ǜ2l3F1{L6x׭lG#u7, Zt5YKV,; vd hk)he&T3ѩ"潐e휢]? hJTh>7ZsrUAzi;qtȨdm#CwRlZ|~~wVW8]yTV[uJX90P 5TK" ; rH9,ELAX;6+Z#Ct۵E \FO6MYʮ5fcBFJ=,3l cާTEZQD:ato\wBI++DI"g#kREe!-UX\5ԗcUPSHAf|f6Xەg,~KMgؤiq󂃒R*A:kW#"z·gDR|GF̄z;>FUA+W+ճ%$eh}GLuPƂ@0ryJAЍ:XaX]R'sõ)RVc9>ŊbZ;qK7#O\Eq@Į>}5e|Yѽ]djZEsM޴dY5}p{gׁmcحsuU_wd@b{,Dz YaWI7)>S.7$`񹊔Rؠ:l(?ժv4 ǣZ t0:$Y3I#a(_Zf-}H_۞:7Kf0`;U; rh3"xZ&NL aXczMV7P̈́Gcx@a  Р(rWuOa^L"HDFXC/DYU⧪I i89QyX^HuOG8uv#Vk痵-gfiN˵e?^=^G9leъ{&,nUP ﮲8 p`abq<01a9ߣP^!KVd_K>q7gCvjÜ[UHƌ"ijl^_u קhD?E?|,|k}h=*0C0p@``df"l]T1مn>颲B.F.,0 -g/(m &$$6PX?$0A6YSmqrއ23J F6BkBYRLt"jY %bճ Nu*FrP;P`sZ뮿R|*HI6R&DIhaSe.[uG/y/h$TDbVhFx!'ҵipC7Eqjq~"lbMa@ 3(4%[Mx W@!g H\ 0xeA2@3  ̨dhiEHeVKӂ@,9:pMnx]oD(@0J^&'j?Rv= đU~F ʡz2 3 o~ĂP jxD6'Fr␉yvM"f^/\e3i[{qn ̓$ YIX!`S֨lksc jk2H w Ky'Q.QyMB2-4{ I;5L-UJgڞ'pJUԡr<|DB}̤ˆRϩ#UI' (|%>ʯDZ1Cc%,11iL=OlHqP @& .\gj[ _JJ|T2+?:7XWHPg4,Fn>F0Nؤ4XIō h͞k ƱuX꺶KNHh*;KuX}Va$9HV)ʟ~03&}s4x(9r}M5UT|@D$CKNeVFT@eatdLRTMzHW̑ъC(#-41#~qr7 s?ŀ@EAvhD3BC!gz& &9Tiq@10ee[r?TuGB.<čֺꞅ'I`t%#{ȍ [\&os?4k8Kg<30d8{(P-,S5|g8dfRlDЉ/i#WKͱ;"m=$[ΑhmP YqxRreީxiE]*G4N!Cў]$beZ/&V2\qI-zZFu%@ޮE)(PB9emToiڗґ G/޸]_=|ZYI#iȗf80( ;(I5VB+TiUPFF$iLʃѯ!lNG=XfCFTDk!{|N;eHk.2\l$Dsvdo |kԵ;izkT,\P9!80Y9pi! QGY|)4"r$r2c5ih`BbgGڸ !^rC D*jT9DsWajزhzSbSŖO\PZP0 Q!TU:9@CPxSNWʍ`4|ͣgo7@V)B(-A f$! 1  Z6,KD6w&H$@⡅'܊1>Ґ@GI&^ಞ7E(/0e+pǭDbkIDpz\mIU$5i8:%14s]LM"VbZ: x}|lM'[/4|lSz2d_H՘F !:a&bl`"@VC[,lΖS4X5'J!g5Kx^"A7<`JhC K2BǩTHZh؃G.s{ˣ`&EVPզ2FcRjҊ Trt,"DZ1+4DGߡ@ Fch' /f)VrDgmFZl:%%U ]A䐭}#X>tˍB ~pp54Md}2vc#(A~]o)833njؕOcn d L`hߒ7o7`L B8 0Ёp$p4§dL99=!u=w^WNDŽ fcC BtD,7P"NL١ưB뒨`誌08+DT5 )8-5L (EFI~}82 iwK<1[``23Bwokx |Ql5&+|@ʤ…b8 2 ,%qxB=)!]{l;'D.6-jIיYg3c" o:QM >}cDƂPpY :* ]kUd6ӛ;+K;z4#\)/igj)ܿ87~ҚD hTcILZhüIy*1 󇪌idD!9ET#={HYM]RċOoT(KֱZȄC{@f:ӸYl2!ƌJFap BZ8ĥgmroho7*hb`^5ҁBHե|$*^d0:,HN9I,ỏR.xf,̰0is",&תLjB?E821&-P1mo8f?B-Ť,rZP. Ds56)JXi^L FD([wD'9zIpܵrr1` 4#dWܶ߻>6u^[]vk:4xiL"j@!@@HLa &aK*~EIBVԡ1k->g߇;E[jnGwK BK< S4LK\xAB$36su5v|eRMʭ2DihTkL4`,Zi&-Qyj1x2/)Vj uC +J@VĂTa˦AS<4 L@lZ !SA0Ԓ,,Dp&lC+#ao'D[JNN%Se&hw=K1¤.u f~cah˓ẢJ ƭ t/q@p xD& xAᇋ b\ab* q`5Fܓ,)a٨]jQ 1gN&bɓBuŗ 8+R;elUMu᭾Zv]onĘf.Te4=8ZICCPsK }Uf_/xIzA2__   \Xtb)B i2aȅ 1G䤑g ИwBRhc3'InU'2qdWA2Mfl"e[5slt ZY֓#'6lvK WHb0Dd @D, W1L8=dL4JA Z(6JZa[m\&Y$ {FŗFkj c&^>KߛѪ\IZE_ .?MYwOw-[ ÿ #Ta fCD$eID Z|i&Sтt1*OJ/8y[ kH`PJ8Mral hXhCF'(Vdv Ly#!ef djZ04U3EVlkG_[g^TW:jboIL"<7Y}NFd۪9$ZI)$XHb@5jbFő!< ^ @@Lq u" NnvcN;!)RjP6bۍQ .$E!}5Ws pS3#vcs;}*kL\h  $ `=pL@(2/۲UT/'4vk[27ZݫVf0&"Z&s ӈi$,{ Z >GJ,a%Lyfgf?o®w$˯f!閒U2]ٺ@qϳhz@Q)5i h T0w :M#kZy2ݩF)e 6ȤFE)TiD'&Q 5e(%*/@J訑ExAUS:rSO"_QG6oڝ{+ehl :RiY7(wWc7b6,^TFO{ml%᪕C'?=#i7 nu0˭֑u3wLʇVQQh|a-Ă<ӦQr6rK`4; Z"R` >,g&_Wź|aDQ3I%Q"ٴ1`F#]3~4H5dH\UYw#K EIdfZ :al"9{!xl0 :q(LvȽSpd( Es -5b0R.̛_j3p\gP P&,scY:).BtmThdbsL4|;?e#ՇO$y$}1+t 6tkP F>撬%Dґ6f$]I1SHߞQ28/0Iȟ. %f{hq0( ވ2q ^)`QL{'_ob8'`?|bs(`HlВ  whKƱPZB?tZ f<7iUk*G݊[r> x򁀠f uF `QSOh[7Tڻ$03!kqIU3vsq4ě/SRb̮Jp|ҩ:I[b+B.WiEꯉʼn;-޹Ԫ2+MTA꒺ӬQwo xlpTo1I8`!$0 hYL)-CCA"݌ƀqPBlG%= q?41@:p7Y.k`Pv+0? ޙjd$lmPD meC7gE=2KQG!p( 7 ,à  1Y!#Rԧ~\Xj 2#4x'+&2zI,J!@s0̓[?+ OtdE=uT9=2 هIyd(y͞q2FnR ԪeD bI5`,Zi&Mͤѳ鱶hTڿk'0. 8 ,X

(nZJY jFVЮ9* }4(<^m(@4Ǒ&Nr7ON~?|7$VIBDZ~F!\aG$%iߏv3Ff f7}{%oQU[iǧ3;QEdp#0A ,$R[. m4n9cQ`jP|:"xrdᰕ!}\-;H<8Qv Զ $EOS8F|AA܅S8m[I艡s|(A sfH "#(T|tb!N br3,2VD$EPDDl-ZR ͖H{ЗTqn=b|tY?91itpc~]1H γwg<#pe0&#$2w [rȖWb @Ue"\Y29Nj??dΞ7cc ~}!]*tg.ncD͹ݝՈ8,1w[_JF A@5q@VxlT U,,®/i bA+m-!ؔA0 K Vbh;ZgQʗ%UN0GPeW8PO1MsOE ҊhG.O95Vm[N>CCVd>;ȗTOINS)FXhP<AX0}(X !T7P8 I!7F*JL7n)CY ۟6VD)pIRDFbScI4:i&=Wq1*}Y]:Ap38\%ɎiHABs4s$sn$ :SE0B"<x9(d aj—YC"%f@FdRq%hh)'\;GAU U!m;!Htc[t ?5ez(\Hj5KEǥ8 #xh(`y C3L4@^0H&e7u@a2jAQZH7/N> Jc#%zxYCG%5JdKE%zsi4~ץcqe btd<J%.JqWHhTT` @ `&T0 22C%MS_*T&2 ^lJ!P>≽ۍVT,֓!'BXM!ZLg&cԴHG^RI R$q9+V$䳒Fehm$oJ$L@K69LhmŸ)(E Q鍊0񬉍 *ACP"y?qX2f de%8DyQetLxI&N&0A,)~i!6u$Жf|ٷT*WJ+2\ %S'h C"D%#bFE~i(ݫM»)pVV?流+_gf $p)ThEAFF*616+ tU&^ g8H\*a򁣢16MEFFE:]f0ه55`S[Fn{=>Ջ[HUj(?B%JY0/w|[ڢ77>`fx6'ei{=$::+L<1j$#s*K1XDQygO_[Ұfwj%*pG_A -x)~#L#0@~= ¸Xw2 jj+de#&e{jŦv\Ƅ>}/'>Rq;*(/^ww.C5(it ϳa0!%pLt .!Jcь xbL̼ʩ" 1ib8lʵ4ra | ؆5<4ڭ=/ $1#),@VV֛$(CNj (j64K7CPO&1ȜEW\rV/rگN1fi433q`@//A$WԾT4 "XV;/`:p∠.Qhe-, ZH/с:⓲rň0)ƃ1D΀RTO2rjiTQ0|4*u"%Y"rjbY{p M/^6R:*YX6(L}@73:*"J WμY|U(4`>#'zş*(r-]ǩprqdW棬sSu2%r%1[6}U;7v~nO5nx)?* Y9 z0!)fQH4h@VCx! tS'0 bg&sfF}iW3=ڀy/Rջejxf},_@l.Y3dU9(D5P`gaۺ+j%pTصJJ: R -lkE72>aImʄ M9".׀ HkFHHdІE#ʒ-JG?:MNFUy)aH>+*|30h`A g@y)L۶&F$]?B,aΎ@''k|2jn;$)2$L $:jL[ OHQ`z(Śˉnչ޻UsNxr(ܧɇ|VKowFX2@ՠ&ZWE,e I@2( H+ $1Ո!1T,Y$ =^] u9;2<$Z u7JiqYad$Lӵ0cћ[(a  Ï2!y\iZ .XƂVmO8p"0z<[~2߫b~~o~Pr@!lT`g*l@BUȱ-}9(ȍW"(¦VDLXBi&1DbRL4P Z[iSU$si1*ua-8\Pɺ𦱫Q*b2+6 RQD6gCu9`čp6kiwkTC$V-c,#/yL[xƌ-F b3?r)iU1sQN$O~h ,l)-նTbqn kRKUs'* Fig 2vl}H9P*/ CXPEGDl`c/pf_5Ea2:H4'hdaqGxn(r_ӕ=!5,y/cVz[_6s= G.6q"T@@N)# :;B3kAO,Z5%&M/?O 62Ѫb}=hY ىB2gТ!fQ"a塯ɁC.%L8rrA)OZZuהr*LPjj—Px,jL m ~yd9yv/M^c(M=cn\;Kq:oכP@ pz!_Hi; 2)Je 31en?6.HAqqf^zF hDRjZN<P'f;Q^8Nn.dRjH5DlalpzliAI3i0yr$ =(,@2P?sskv٩cvU^t$X@@# >@М@ʮe@ nݘKY+gU? P+P.2jJ3 +R;vyB-G0^:DH^d52 R?[g髽s"c!‹<,FnALYZK%㥎L@\.*\yq|@ X0XUf`"Jβ\TJlW0(N6Pj=؃[sY,As ~lkmoѷ%>3ildPZh. `PYx@ b+TPf#'|m l2^ؐQ)DB_V )F"/>7-eRITaJT$SF'!qג/Y yS&&oZV$!cF8 (H自Bdji`[a&GO,l}}4T5W-U.s˘]3=ѐU=w0㺺-&6FSxtfQq% !%I+9lM00=K*\(MDX3D6, #%Xf@T)[06m0=4YKbJ ŜB]MOG dBRK?FcuLƼ.rB}/%#&[ Aڡ-9q42#4VGP('2K i8H^)!Ey$ږHV% +'DX1Hn\㺗DsdY\yO=9kDu2htۼYٵxbUXuF>k9@;h`:͕^(rnJjiL$ܭ%,5b8t@:W*󬗓$-)8bꠖ,1c^VC>7RlcV(xm,*#D^{ 4 ^a&}QIGw*d}sfFeY88H @BX3P%ĨXѯtfJb}H5ILIH*?n8'^FVkYoQVl5Ӝ**exxjoݘڹKpyv5Ed#mX3ED *S JVd!2w&#*vbQ(m˞]TXf5eJۦ*ufCgŢiqKde0s-n)[%~6Ioy &BC4Ljr4:ܬ9IAk 1EHA0A.Г:=aJS0 C@؞H{L=reE5EEbx̳GpPTbaf4`QaQQiWZʣJαrlDL~]VMc%+e[%e3G p 8A1㉏ "( `P&QpƜˏA:%0>r!K9(T9$HlJZ!iF:HYafc;̴],=F.S/1'ԧj~3+,bQVtrdVDc)z a{S;$uJq>1:3=^D`i s#e  X#HSY2 et@3^*s4Vk_6yPS:3*D@!eɼy9I!ǡrU4|QmT.MU>I"/v@y2Q=pa+CmnERopZ\BzԳe6IEXB)mj[P5g(dVjr4IQV@R2^۬>]]bQH::ݜEreТfm:0L"$cXLěSsnw|UV-]NrwwdnTL\}`.J95JvB` ?^P[ [R =@'QPAuq,ZcH$ ¤e@9/ QRS(#.>9G)ǝ;y^:hnjV[LMn,RϧW*呪fQܲZo|?[/@b$ȸ$9xRF0 <[G0KYr0>!: BJ!5.Bpt!@|x(MΰiOi8ldg'nd)DЀc,3ʗL9a&wQ{-$qP/uqHt8J5Ui=\V$UZ $NB܁zӘTx8(XAGcT*W}{ܥDH D26#*C#mZ. TmI0[Y2M҄**KG%)m/p%6rAUftPnjdj2KtZB5>Eh) L$$j6lS4ۻS"ӤR ULL%X5$D؅&ݴ)mEDsSfMkJD\f!{%4P1JHTJ*~/68,wCf1BIblhHidQԵ`sqs#_[)XRD9pI.M1*Ho$đD[iUUJhZl3Xjک^um0tuT9qYE6oMS b-@8 Ɍa0MRH@ȴJI:Z:>>I=ƛq9Ze &cU,YJa'[q4-I"NԲ1 -1JkQ*D拢-19>DA ʉ]`țKķ0oAxⵆRkE%TY ?r&%HĶ|32wzWbwzrpniG+BEC%@JMCG#&@Aj:mZSZ/rJifT9xU-xqI*yrtkdv[wn\-W,]) Qy9tghf RfzFBCeKUG ,`>qU|o\/ ",`N:$j<HG@on/hsr;_{ w73{+?q-| [ Ve8}ecF0WNi5f4C7Mx:7g?P:bJBW[_nb_}yj}yt{$Q ) ja_?!6 6Qx'|Q,=Cjvrh]V& z.9(D /{3 MJ$hUkx>'# [\jS1dxQnkervWz 4=WB;.RjeS-1kY]hOh/oCP>JO>[1;Wv}}EIsiHbSt,sCL[H2": -n|"XlT]X6{LttCw=L0* 7W\zAYL1eO2.{,p a~LYyj?e&,o_9@%ON+aljBmcLD N?W3E*S^ 9N{ ? >[R]w~_hMiZ8F7 xWoU'zq34-4>3#*"Z>841<Tpie/>!Md@y<iNMMKAu@Dk@<;PN 7!uC\`2_l7>QGuR?@(z{G>KNQg_s@[4%]r2ql1WcG6e\JemBx95hK{4eY~.,%'/" %e.H~dHp@|[]h3V}.M *y#Qti*=5gP&=i_ioboho}BL8Nj0Saqj|)Lv42nBFXuTnr_zkD*'# A4!0^7WAR8+fa{@ QG*}'F~"?6TcrIJ*\7w7 ISr""2e+[|QCCO?1Q5>3YznXSgx14/9S|*NDaY }lipf~rjxCW8!GF6Y?=g#.4eYih-(5*-8<m\ [;e|mq|bzeymAkl^x=R H*$<LI@DM)~3+! zd*N+GP.m\ IIh*DB%6X|5bY}H{ $O)kl}SLHKuZnmhb. fW2DLA9X!a>bP`l3aLIl9Y?Am)8^PD, +\2ygct"' 4Am_e?K %R/Kpo J6_oe]b{_Y(lnU< ,(=9u }0}*:o,KO^Ytzw7`_Hv@ V  -QkX5 wCW.}L".`Bi7Pub6/MqUoTz 2:O ZN _y/yeM)nqy*Si db  <d b  !nLJ <_*`8}/Z5yk+_}_{J~ = iexeIOO*f-vc+ @U42.XU!\ e$ 7a8S=*PUrlT KNNr5"-H) =J!bxe p V9LX}f1"x'3=03x_[]2zA`PW!p,Y"|5qB088T8Xl, A"&0P>-T|D` ,!|XK_B/ #5GRj{P(D*8u611-W!6G\9N7\0NSob@b+j (PeY9!5Z_ #\NzTp,>@Fk &61 hB,%% 'vO||\"U|uJ0Wlf},( jE\&~l4=NC\iA!4GmJ Q p~z#K]Y*Qx-)4vp:Z/pST{h2u%s_B+]sXf9}~{_k5xm4Qf|jN7@Sx&>tTT'Q;W/c^*Cj.`0cV'l`Wkgic4Ke$NYx%Vvj{S&R,p&h]F8Rss\`S.(qxnM9//vuLr*<pQ-9I} ~Vs||RlU_8)HR-/HbNRMYsPlbR8r,t; ;'[ `2 CA2*.dxm6}{YVK3W9IV!d4.D)u`DuN;k^JX[r`F&b%,T{KGYzKm{-6`.~RBjGi:|uAiX`Q4ThLd7eP zr9jkxcIM-?d<%7L+pK>37@R.@9Yy%Q%' }QH>`= C'=A3rt*5>3&37&-#i[ *\5W0<l VLYcn H*-lFx]I|Ca${Bz<#*'-u{/Fn__uL. ~Tx? ? SF8Ha+==~ H4lqoz$R7xl:b0 $GMK(7zrl]:;EY%(Z h}6N@j{ sHtb0I5n9gbaPef\2\CKR u'@081M27&I a@3hT3..  }HuxEkuXmJI&HP$3SdJ#Y@8Jhpa+ dP>Pu6Uv=7L}r"%z`GNk9Sk]o [C%gI~pdaCPv[9$TmW5$[xZcsrI3:G|P_P1ORQu7+YCdYjke GJJ e.oq"3*3O5\R;1W~,7x0uUn2<Y^?C$Kg6)t(P"TS NH+OqX%}U5@dFxh8`,r{CD_V&mB{=vk<9B#l<EDIjh}@O[+@D,iu^[dJ^@&hO Tu`uKcV+"j&8C+E oppJv p y-o-}aK=6b5;g2K\zA(/ 8iilyg2o5t2fycPyAb&))<|ie5{^V2[WG9JlqFZS]PG}VQCF6:Ly0H&{wg]y(Zg+Ov"aJlby7V=DyKwBY,2Mfp z!%Q #o(Em\ Q w(/oTDfV[FO[T?V-iC2Nw?m0ZavOqb"tJoI_> %rQq}5+M3i~ n\HAKV`8o2c nu3$qp?} }dO:ZQeMn4a)Hz&v_A3[JRY~D} U bal& )VcMEiw&D8g j+U7a%+$I9`GylmuhZF#g#x/#W,WS2v|LF?m9$y4x[~{0B+ x S9]2u!4CpmYT*D^]a[o_K%;w3mru ==l DT3fW;s;v|PO}&=*tSFU[r H# i$SL^:KRT!RO"PR wpIhUkwj2$AcYu*7QUwHv!a^,mp7}jP&Q ^$~93 j^1u!;=yI4Mc6 o{ME9^)#+.NlWwZGx}^chMF!7+S0hL"-dLa'zz^~udU[j(r9s +Hrq&LRN[PJ.I""-RT8>?u en&we_#tOZy|ft?`(K/Zs3G.GV`?d+$91Y &>d qL90l]g&]Q #"B8i1]UI_'Jf%MBsmz?pua(jL7N1O%u`f.0#[-t[?rx<Ci bcRU 9RSv/rIHzdb\;P,!$ %#76LJZ^`8HO[mUb9-ME z4)a|++qR-p^L# :Mj*V*vk3T ?4phgQ?r jg30&, +< ~3Y7<cCuS<_='se4?BxT8HL.y@K/;;;"<,ob"6;j"/=8 \ F U w  3 3   2 0`Y"@U/jCV}(IeL+s~9`Qvqs~q"8f0s_J:Y/SD, Gzm}Mf sb1nXV!#!<HeRmgl  YN\ 3f6~pc7p@k,"#^r(-2KkU24}eR,~{<lrP{8`(T{}\r>QBUN0zuOKs/{9|U10 Y6Q rQT%P/5 :?@3IV:A3?!?1AM?{CGAAXb8? k{/]ep3\~~;6;xOM<au &GyU E$2 VbDZ25;2l{truVYZ0IAXH)8aY |L)%GzL^k/<4o_cl bfk=j]H.fUi~JFq-%OA$Qeio|}* e45`3X!gsD03TdhS'FO"PAu'DoEb fjXQ0k"L=<f@kAT5Rz6DBJwI'=?]#},B\*F}R.eUB;VlKyk&lW@`9G\' X[)u@y6K/. #-{1;gf\-/g_xCsquIyR':h5NA1FVvoq.pbT=^!feN?8\l$2=V?I l % K w  E Y a a  X g   2 @ W &Qq!M`S@~'E38{<\|.YX0L YwuT,.7)?C/Rr6IWIsk ! = 3 ` ](  )'J0!bw >y S   N>  Hp ^ 4DQ^nDZ^\SW vlQP$;bvjFMw0#t'yLpPu|1c+m&Zq)?vq-D9H.,w.g, F%f'J,V=Ij7 5C 3 ,   :  = + 8 D * P  ; X q zC@KYm^ IkQ81L-rl9=_~@U(PF}VRHw k:I;QTmRSrxS~AM9+_X KG+  | Q  e  V  v ,  z mk 7 ~2\~D8 =73t9T-Pq>o3(!qpd,fac&,>?eY+[Db1Y~. e t % Z a | $ O ]  -   ~ R \ _8w-\a--ZqW8PM q|e;VH$zf|x&~5R,|;"m1lU.,(w[=l1=X_.Wg j Fg.BM  jBQPuq7~pQ@|/ix{@&F)6hncgkgMY[W;-TL * (yOuS>]{eS6 |A)@  " /_ C   \ X /Y2kt! k)yQik8d> Bdur1N|?4/UPd    ( S{L2e/[o+(yP}.Fv!/0kdtieZR! uWMpL O6B!7%r3 OPyjG UxDgZ +c.9-mBQ$w 4oW@3Ax#<7lkJvh $KlB~ n"?Oi8l Am?9kE b}1N.` e$}z,.=YH5J2\M E5  GN   } R<p ]2x l \    ?zrS&zz <*iQgZv#2:s0OTAK].q kr5Y N 3H  I_{!M 9";0a,QH$L  ] z-osGg VP?C"9i+S&ICRF'$qT]P AeIpe|f~  d  ;p2QE6i:6JTI  3  ? {1er?k~>".#h6egU(Ffkq=' @!#'F-jT)fixnxMUWM>EO2Mx}<i,X9Jk*B7tQ{C&y 'LqE\/zY3dO&i    g,.,>5;#4@?9=kNnG K T $$hDwCnb-v, eU?["j:W}afesy9#!@qPVZwEOKg[T1$zA 980ahSuWVkk[b+HX;XCy0EBvls^l3x[qo$}Hfm]Xr5,(qVJ{kPK*ba5B%8 V ~{G2fFU*j[\ Qh/cZ|nm`B`7uR 7l4C.UX}+3gw  V7xV& 2`yoVoL0Slzw#STN;X-#Z$4oaB   hP\  7P< gl!U0! aH # ?JV$Zh E2Nk*gQ5WtP)RvYCZ q(_{EEMVk? d   WMf-y[M4<@r= 3 8w_x }"  6P0832( ~h߸nޝݛzޒB;s:]$l0wjK( ^8MQrV', / 8 es2un!p""!#"$4"%"B%"$4"6$ # "!"s!{! TdV5}H+ 2 6 DKj|j\Z&Z95S457yq9 `p@ rI85WD%WBikt (   k j  ] % 9 S  ] qLz0b8# ;\*aw}9=|X"_r du9!Ho;ybiR6uF9 - He OQ ; x J  3q= MV5t1Ax#-8iBp8HaisH-jK9K?yw5'hw.|r?w.akn@;|5!uA4OqK%Mx Q kV , W G_ (Z # ~K A Dl u0 * w - /L"  5=Y6y  C   C F9c&m"7K _ 7} t Q 6  9 o1lPT4"#O+a7/m/8Wb%NO n+.B~LR}f B  O of [  ? ,(_flf%CyqZoVyVYQ4@(D`u`.5}|]Z!R,: ol1W@%r05~ V 8 % !   ' u];m63&- l [ M:    YN|j]wvW_v9:]*18R*\NInj8W3C\(6OPGa3.dF|IQve3#f9PFm$+  ? 8/fgQ'~}Cn[@$   )\o2~3N{5@Ijb8y :W5_P7 AJ"{$WQg- ^ O _ T$o{[6k|5k`G 4  "b 7d|G4F&>zt[MfTD_>j\>&~dG a LJ'qXRm'    x>\5FgJg "/o  ?\V 4 '@H3a(k Ma=am5`^;Xcxu,ul l\Z u .*opdx~CS qA    va|XugN`[AZ1.{?Z&Ni{J4`)fulbXa)G_]AO)}3  32 ""  `G-yO:JX^(C85i  x )gT|@ys Bo085+Ye->eOk8zoAp|dqv'gp A<$`!IPG\\l&lCG0hPg /  [ OWg0"ECmPZM|0 m + c,viU~(v+J f'UTU( 8Pl1 Q}{\(dpYoU__n i=Zkc]<$An_ ;dY@xcR?T"al6VJNN:<5;bmw4Eei~=.@ r]" tV@!"u %t  K  q< 9  &h  P ]  I K6@_K$MbtmO 8WTo=+t 2 g r hUd)+tKLLs5VRIpl-4R1q  5  O   [ s Tt"t%&3*p%&5h%]@)dmrw;n@\Ot , : w \f/"#$$%%&r%O(>%($`)&t)&d(&'"'e% & #$b }^+f _qND ~e{9be߳ޓ-3{4M\.rOS= kmGjh4w&lZGK.DY+bC+0jy  J"Lg3xL{@T {4)QZ  G I`*8J?NZL e($)@,eSa_C>q# S S`l  U  k4 1Ic ( 9sW t0 ] u @ 9 _ Cq{B#4-M.wzM;rB ~|h`m'm>6Cx;|LI] 2  UH4Ns|h^Czg= F S S =f W  q 3 K-6.72K9, @EOu@1 yns"74jdGn4)$"LH3o4,%,e S ^  !QBU{V-a{|zDE>   n U:   K0<Y}cP9 E .XI ?4#}V(\#rN${s)@D c6T;I '  CZ ij")"a" 7" C! L 7+'|4\ Gop\^OjU/^TE+Dv&S-_LTD kr_%hJ E, 3     WNkC#CRY_sio' 6 )Sg.e{0q1 s8o >:=wZYRj8AuRk<R   E_NYmr>"5$1%$#XT#ug" !v!" X!k 6 lB/*O  Y{6s^t9mw nJMl@Z~)]_߳Pߜ޴ vހް4 V'bkg! F  :pVoq"!%#B(&))a*+*+i+* , *+(*&)*%)#'!$K !Eh~ k @ c: ?UYuVhaD*>E~6t3m4{3eUW #aV:~v^=\Av2# Q 0 /MK 7 W Xi 'm5&c{tnN3T-z v  E |Ks$5h'!YM23&$6,:p#n.ofv1- qR_ p 0\ S o B < P : / G 4 N 1 q G V  ? OcI}^3 >  t 0  Ds,~Q''KPxF*-u`#O$T[ LDA; d`.0^n&^-&:G'D% 7  46 f A 9"Q b YS   Q  (  % ncyni<   Y ie  ;  @  T[wh+zcB:.Lhnp^ܦc9$8 DQoSa O M@{!$_ &S ^$!z%1"$:"# "G""p!w% zP'[ J   bv7"qO8F<\qkK#pgwXD$SFOt\WRpp .V>ld^qqjj # ek!e##' )#*#+#=+C$)#(!&l1!HPG` # ",\*Y^z q/RJXD=//V(Y l3.GifV&+N'#X4Q# k , p -$9_VOcw{J@ I 9 5 8"Q)UUjfh^l;b`pC|:2rwei1 ^c k .Fd#":.o |caEm70s j O &  g~P V 8   ` u 0~it-Ko~*`R_B8.x!4u\v<~ercj6rQKWu;rbg? F 5, ( 1   i \ } 3 QN:ny|^D1"{  2  6 H{F&z.[:5Wqlz*;a~BTK-\aS m}+X9`9wWJP?Y A NT   }^>|BfUL < _P\Hb mI 6 Q){goF8%/O` (D2>wTN^zczm@K8AltG`%Fd_%^  [ I+K"#]%x%3'&*(,l)-),)W+)B*)w*(7+~&+% ,P$*#(k!#Pp! n k  cI?"!G,Sldڎ۪ $B9۹ڟ:g?#u9svG/ y   Gc Z\U-I;VZm,r5  7 N5U'}V%QE .(2A\N*ۏܹـ=ٌ~_ڶ.Aj=Ez۟ݽxX7t,m\G8   rn5RL;!#!%e$&%'H%i(,&(o&'_%'$J'$&/%%$/$ E#!!$@M  `E^Ih<^;_U7qjd-z"BGI :[/Nn6/U UO'~[o"Em*H< O  <] I7 -  > .4  .v X 7 x7Q/1a ZZU)!:;YY]ZOd$8vw2okd+Qv\WS+Dh_mpF}"zBJ~ Du v  /.  `* a  [@%SHSUXq|p|;a9|\S]Fw|lv"B\5L2^^=tZ}:E9= 4 { [ v BNE]tl$c0 \9 T e  ~ q  I\# v  92ON}<RF:W 6FZ%sp/+ 9~s2*y3WRC.  z - x 8]0Bho)tM@-,(I"  F axO,.C};BYp+ޙݟvFߡ.ߙ-'zq[l @b3.xD*9* S{    H0[n{!3$yY$g!$#$4$%#'"%" #Z" !X!;!"h"F  E%.+ 5  t\bVLi?P@,m2Xڑ١9ڷS.۲*ڰ3vިfdi~(EdXs AN>AE^ | 0" 'r)n.l^'T\nb;h8"rdAu,?/x=Whq`qHVm"QuJ 7NM!!3""%%'n)*)+V(+(5+J()&(.&&"%$i!E@  ye 7 QQse(fi_5iCݭ[ߨY V0Z^[Z> V}D}[\|=I+*  ^ j ltylQ  !k  7xkz3||6WY I y c c3_2Qc!9,$h1L)*A*K._\ %N0 gk % d wE<X *Q a .}XO|i v   +Y\W VIf:>K$:bejEtssg2g[akb5+HJ.p5pr\hc0u S>    $ ^ 3 X\<Y=V% *)$Y ?+  H " $  )8  a O T { ! S2? K3>"{Hs~td6x&Z ~ZuhGegpRPG ( ! ( ,;5l:  XsSGCJ Z e % bcphBo~spA[~\o 4\!JZ{6j&<v=@3|" 5]Uj ^!# %'E%(&E(&B'$%X#%"%! & f%uR$'#M"V 5xAf .0? O*n=$R<jOYU߃݀֒ԣ_)ԉK_z`h؁׳؅Q&۶ܨߖ?=ssBv~<  wV X 0wYYn"~#B #!c#/!>""#"""9!" b! F+St>lw,  \ ,:sClPTiw'\:Hu1a|U5A  C.{;l, # 1}@Q< \#-< Hz ::f'lK u) 4 &2IvpF tM.xDnOZcja=i7+HwmQ ߭*!w,߸xeL0-ge*$~% m ;K>i" &#(}'+*,+'.(-g'-'>,'*)*'9(9&&## !Bc F 8 CY0bqMdvu# Ra% !U6b_qP;eqg?ERJKjA)o9S [ F  IN^0UjU : \  2   YhK27N{nzI*0-?.&sDHT0 Ri?pAMW;%H2|O o } 1 0 z z ) G 2 = ok d l  oY x<;S(T(A)$M&q2RE!d[4$RibBy`;_F\F#4($eRG# *  l [M (  jcx_tDzKc2jBI ]{ q    D\ C,% xH[X]C6wrPtL Jp!dvx|R J % %a|NL?14 .Fk;wf)w,`% Y c GS+Wo[D12p!jd[d3VR_57kuW )BW+Gr.|} M $ `5]1 {P$c 'o#+&.l(1(2(1(1M)26+Q29+1Y).'Y+O%'(G"$. !a 98 yGM' n7X|$TX8qQ R:seoa}4e?9 %  spbu]& K! _C  N / * `$Y>wa? b\W]Wo@.f%[n!V-t2g  w 5~'x8 W1!$  EN >,IN= ?NN-0"e   q$z<3F'MYIW}0ߌPAݟ * "ٵ8.۞v;ަXd L"*($j^_y |  2)O^ ]o'|mO!Q)x]{y ^ p 6 ~ F $ :, $(` w1Hz)n5J&Vur1F+U28RH eW:KNU:pFM@E.WZPf#'!a3)   ?u O  6 ` & 7 4 42 - { F| ^|B%|6fZh Kn&:BnM_ )xylAF+4F).Fu9wBSz,,o4` ! *}  N Y:Nyx @P *  i N   Ls Jl9*@\mv4_>&fR&um{:Z%FK h4  m  i  P 9 B~$;m1zGY@n 5 A  \Y&r0R2l\f\7 M` nj߃IFEA9Z/eCAQ+. y . 3 Zm52W!$% & & '7!'_#Z(z$g)H&o*i'q)&)'%& %%K#"`$9 S ] n@m e(-=V޽y1W١^׋{Ժ`ճ`կֱՃվ=ԣLIRyF:ݿ yO!Ft]X9 - A $;RCW: |]!dn^R=cN( q&i 9    xIbF.!Z7 ] I : a 5 !P(]Jdj x\L$RQ$$G:qqpu_A'` 0 < i  i &=dU!P-Qz<Ig6*W{pz;#+ yzYQV$YPO"=}ڛ4?IZM*ו!ف~qt۫Ny|'hMd,K U" ]8iXL\|!P"" ^"t! ! Un,wml _L o) ^]j#>_] ^s: _PD;KD`d߀a a^>\P?K3!jtF %u#!%#(w%* (, )-(,(+)+(z+0(* '#(p$W$! KCZEc rp2d Z*D*ܤu/X!~8Ҟ՝ax3׭~ُXn\V ~sym fI| QNv O 0#=wA~- !#%$)R'*)+*S-,d- ,,+$,**('%r&"%>! & 9$ P{'   *4 [  ]8B_#ObNsyhQM{e'9^!q-y!d~mOU! c 6 e  # 5 6( XS+_kaQf2KXNA`KwffFOn5'DiXUpQ,k~Hky_~ymaUU C ~t M7'P 9G0  " o[} K  W ~  8J&p@h'_Ow>G?7!WDa{k1sJ,V)+hu]WAI# *z'@OA3W/HcH' U]W.l ?   M;&tS4 : : H : Vr ij 6 7 SH O uk a n b  7x TJ 9# 1wCwlekY " A?%3,!?Up@pP(yKA ` L0G@B/!L $ '- w(k ' & $t""!cn =_ c  kqhx QR-DX>OD_Z~l00ݯ܏ߥސe 2ogdkaFhW7NS { C7gcYP!H ##$&3&g(&((/(B*'(S''('J''V$#! -'v ? f !E<w ]4(KܢuIm.B*֗޵_شhߒ>stj|*^yos\   2K @GO[5BA 6 #  N M7' ar*FK{3izg^jiF 3Zqq21c(Ut an;r 1&fD =  sjLI sW!i$%"%#u%h$_'y$(:$)%C'%%J%r%#%$##3!@#M!%?M%v& l  K4X1F$$Q3#{GXd(/ d ] [ U  A ` C   + 2mD][C[gG @@6 eg1 w \Ap\M |8),&=/@o q(IfH}lr+<}Q  -hJ_$?-sSrmnv}]CBZ7{<+ Ht<\#GxS"BiJtZxL ^ \dW   x   ` s G j   Oe0m+`,` %{Vrk| ",d g ;5 u - n"KT,oMlPa/PkV0ެJsI(NE2Q":X  G ]>  3~c|xcdvqJgAI$q &  y j Z_RWbO9CTN+q1ݍ1߃4Bfx; Z=e950w+BR2Q=}s[  QS6Y S#gW'N#Q+&.C*>/-0/0d.Y0+C15+0y(/`&,%'#$ d aV  F& ]`SK\HH9RO5'}$a9N`e   ^? 3N4Dn%1!$89~z }PADP{r.oA4Cg9b*pQhInH/~'&7Q}oiD F  Z ="E#!"I!^$ $]"o"-!]  Qy!+- U w/G/pE#(;x C3YWmqi .zC9},]d}Hw c^2:O8obf/A4 b AnVl3h I ! lr C ;P ka~A*0}8-*.^6-/%P}'uc9[)I0 \  )blV:7.5)(L }Q Lu     $ D / : SY+0mu ;  ) K} $ -9SA3Q_-i}(;prwUR4gj\;|j-|gc&( C= /Tq U !. X"-!"v"_#E"$!u&]!&C$b$L"]8ZUU@ o 9IP(e,]/u)rIj=4#۾ܜ޵*߅^jLJn|* i>Ik*V# X WIe"{@!@W"B " $"^$R"t$O"!$""T!"!! B)Wb\ F?_P c +JMU=Sx fVމsܺLPnؗghٹWQB ڪy۰ -?S-U#  _;6$]6(!,+%.(1*3+44+3+G46*3!*v3*t1*-$(g*t"'%"| k  - pU:88Mkz{TH88n?|T߅:t~;wڽ!"P@/0d7jrf   " j lV?&{*I]!.  # : urd Q"NTdVX2Kx=t! G_nkd/I  J  i F  h  N _ + } p r tSv a L  Y7 8 a  }a3EW9\ ao$0]KcTGIUqgC\,pF',/1h;=\TGW=1@)t+=Zdb%e ;+ E n Y w $ *.c;B 6'8zUk3IF lD;Ds 4PX[Nm6^]D@N&A__`F!>TOh]   s,ii:ZW^*Zt6 q isnw ]> -h   "0otA- { R~!ۢ-ׂLڗLݍKSHrJ>rc5BQC h J&/X$A? `"i%%')%1,.&<.&/ %/%l-'Q,(+)@+F'`)#&!R#|JS1 !J pl Uma4_q~Q7E8PM=B?$lg,*6w , | 6NzBs R!$#%n&$&$%$C&$w&$l&H%$4%0""2UQ  .  @XfQ{w'>.#7ڥ׶ט_[Ռ5,"FQ.ң/֋իB6ڿݰێ߻mm7V:Lb e$ ,z F!R !)!#"&#&$&$&&9&($1)>#*#*m%*%p*)%E)/#(B &%!"SDk  n. 8QJ'gF^JqܾG}x+7׭dػ:7պx[lnڎ2C|iZ%yUjiUJc` mt6 7Eu&t=/X@Q Ed 5  F w/FtDtr-t`+Qo792/a".:* @uh k}rzor a Y - j ^) g  P  ?/dIP D!>8 [  G| I / E I Q 7xPKk._^3m,8^2\DHH-.(mO{Y1uc#c6a(CqQ0 f B@m;ep4 s qj(2jEL|. " %%z!&?#o(#)F#(!( K(!&$# |o+} L g~m^)$2c5EUeޖپ 0ٕ׬ٕ։*dcׅZ؁ڸFw:"5W@i_L`1Gb1 zJ"&Y!' '"w)%*\)0-,--+.A,--F,-q*(()&|'t%1$!M!_s J gRNl5aSX$RX؊Ԉ&#"yطxھؾ(hO,ߤdD~YRUH3 q Q  R Ht"X!&%)),+/>,<0.0011712020 2t/R0,T-8*(%.'K#6%K! {b Kylo ACN :=`(@?8چޤ S܆'"޸x#Ҹqўfљb?c CBPDswd =g |Mc n #$&F((*+2-S--,-./,8-+)('% $"A R NG ^ T2kxQL!o?F^R:a+z TB[r%!n#BWWlB7xz{I V8](z!"##;$%.$Q&#g&"% ;$#Lb".iVJ'  C ?->'DMi )Bp2>e/25gB_G5x-/!H+yOpes l96Z+ ^ e2 6 L * ewb@o b !  3 u   lwR=EY j * dj  X  i   49[BH>EFq/xxTm Q=4 M"uTUJ'p 1~s?[t=]sYgk_idSv@ j7xqm   f  \ # >rq5%C01&0[~a()?KgD h_'I2HAUR>D 0 /6  g W  kLO)/"!$"&")#>+#v,#+%(,Z'T-&-t%/ $q/"M-!s+@D(U#Le @ v= pދ%kجԗ֪=?0ҍ@ѷ̽Щͽϰ͗ЍζWSՑV<gMܜ/0dBh3  C=o #<#')'+**?-g+.b-0-H2.0<. 0M-0,.e+Y-<)[+O'($& $` )  8G^ (O (%f;Hb_܄E`c)׹CgגVXnyݚ0J5g] E F q"#M%4'(*+.U/123944 6579L7o:60:5=:48}45M32T/|/)*%p&"!f sj|:6<u90/#Hߑؘڭ'6? ?U̒2^̂Ղ֬vί[bAӄG+ߝd2vxcRs I  E;*  m !J"!n#!#"#b"#2!" t"R!Rc@]3 1n^60 EQ'L]kxJm~^Pz7 Q Y~ND#||=^D/Xm O '{{Ejw0 d'+=sHMIL-lrfG#"*} x&z* |yr<\&AYY:9.#W"BkzI)9m0~m/ D" G r  Z -  P 3 x e 3 o 7 F|Fs} I y da  i n  V W  UhGE/aVO\TmkF:{2ZZ#v I$߸FDkݎݔ "Dk2|}s,Br   ]D6gcHo~"z8@4i   . F> ,wY$m  3ptE^SKB]_zCЪצeC̸ ΠHЋWsՊomutiZ@*  R7$!J5#?!v&#(\$")&*)1.+0-*1R-S/}-P-/-#+-*+))*c%(<"E%#2!#C!K H4 mG ,>\|z.'DߜX`':՝f>ڼӉ3؟paڍ|[;3M- )"!%%'W)),\,,.,0n.z00/0.m0-/+.G*+)('W$$!W `  +CT(NߍޛAODhbcui~ٰhڱ-ګU v/x׋ܴoޢ2۾b@UlDh(z#&P  Z  F4M "?,##$d&' '&E.%q%v#!`{E0uWK   / [NN[?hE0MEp$dV&4k}d V(L \_{a|C`iv8J+ @Q"*rF) ci+VEfzEf&\v$J m*eI.Yw}9D  ( 2 1  1[ c ;+zVrAILfmH=3e D2_qy T&(, H s B0^#}T4?hG!<$E   dqj$#:6h%G~uSjړܳ\0XԩҐQУpӐ`(T3#ܾ߈SJ5S   N "' " $ "%\"&g"' #M($+)&)(,(&.R)-*L,)*()$ %!" .9 4 I+,6*0Iex?1vD*ޡf(fߝKqF3i(MbJ# }4 7#~Cahx<!$/"',#~("'#%Z$[%E$$## !8 LI;y [ ; ( >Mf/O~C41:1{3ܚI܆1߶PNߟe 'tsKe =,@D kF<qI=4 j Un+5_ "#$8%c&$A'@&''&,'&(w&^)h$*w#~)P#'#&!O#bNS k eN<Tr aja.q N  \x V}   '  8C   8  R I ^ !  ] x n 7 m @ 0 $/Hp?7:PH~)YsO#w4ދ:[!uݥDޗ|I[h5=XR7a!U k $ :->_;xNn)e}@e;Nc@q4  x  S h 3  Rt_+HU7D6R,}{_l= 9qT>O\  *'"C"a$ $ %$9&'%*#&,2',& *a&X(~%'$$E#!"!G! Yl4K (C77 r}ބۦ}4Օ=G\^vϱѼ6ms=Ҩ[z.g(V[ TP ^!JoJxR veWph!!%#2'$ (3)X++..215W25 250\40R41,30V2>1o2R0#1%//9-, *P'& l# dT'YdL-SBo'N ש۱s ڬّޕmFEݣhBh_M2S& BT  1( )j 'ls{f9!sLyc! & l @p$rtf)( [Y 7  47j]!+.1LT lx6~> 6F>$[7a   J$dG]G=vtOq  Vw!_  OZaWEaPtr\@C$WfSZ$fEn NM^V9Unz?JV!HX.G! Ri~~%C1o:DNh&O1 fJ3g~% /]S`/E fG fb+A^0D[ x  5  Jd o<\UlOߗ+k+)]ߕn+a3v7;{(B3+AS|L'v]&Og P j gLV_|T"$ K&"'#'$("$($'"2$S""]"!!c ~2H   Z$K8_1e2< ~ O_8ILm$OFA`&JIomB#; j xs=Z m^9jv[ UVZ v;srat ^ ZK R  8 B 9 H F > h E  R j2 ' [ % e L  } ' $ ? ,  x q 0 o  P  xh 8X2AunJ[ 2h mklx( dTe#*?!>o>%*5(Eq: t? b*Af*UBX Co ?`?(/BXz,jg7  r q O -5z~>>< [*}bW V ;  k R  {s0j# |F; NgR5ZSC6 !+bQkSq G 7 7 ^5irb>%04mH:,D -   N.W5^, < >b{y.wA߉)-LpFߕT@%fb9.h) ;.Hws> 4L ph   W ,, 7{    . T`"B{6U ^cV L vGNi s034 7;`bb.6^27SJ>$s0oHHX0\DX #T j"z ; d   [ l  e E 4 ` C j _ L Z $  = # - A    Sh l7{42#?_$/a%r.qܞAuݟjkXߺ YWUXbu|b(|U`Dqf!Y&Uq(!(6")Z$)+$},%/,V'+&+6'+<'.+&(4#'o!& "ydAi ~ _G$;<&BTSr`N'-` I!dCtusX@-EW*jo+oo\g ) H> `(  (y``sp  [J i%yE ES#'$g xSb'Eڶ ۠ߵ޷QjBoL^?~"JliB2[Q  ^  R]`Dg/ ! ")$i!p%"8& $&#%|$$%%.%x%(%#h#Q!!rwa2Y*i d m83jl]'܎ۛ_ޚ4;D޽YH<|mY:Hj`x @ ( P  N- _  o  P" T  o  x o =` 0UwY1ewI;aw'xbbex"A.&+Ix8AOuiG  m 8 H U[ , ai ~ 0R 41[u  ]  C S  3  %~+!Zj?b|K(izGLDj?l, h?~VN9t GbMq#|e/l%=##B\8xabW-Pg"`r}Lj_9%bgmbT&  z 'xy N b;%S'Q1k?9?d4<M \  GdR<%/BeOdp#enGCmQ)l` (G3(lgBZAdnV 6 DwK_GN  wUBWD3H  S]3!t]c"R-/1\!?TS\{D<<;1BD  f 3 - _ { Z q % q <  >" u 2)rv/~%^V}c1G- y5k`9[ -T+Zc$0L z  >Te>>/Vmt ("! r7!"}#u"A"G a  J sK* b)C_nz0Gݳmݬ޹nO|"i erorMf;G .7 r   96 5"5"<Q!t!8!N %߿ޓ@nd:IG| M&P/cy<3[" x P T i)`y5jdR4hn?o  n {  >h E   ? `  Y  It_I @  ` - ! {3~+BI-LB{~'fBm`W,KJay#V^%K'M U . '  KkSK6[uFKyW'4  u u   0 _ ^>e{R,o0Rtq%9X]:#t4?gXS2Zb|UC"6     gQHk<K1 `!9#0" s!"!*`-i(  m 3wl *  TIF }|(7#DsqnmM"߰=#ߋo޷OYAx+m,eh!<  %&Sx1c\$ _'f#*@'o.)1^+43,2b-1=,0)c0(.'+ &)*"k(#B;c3@ _  I-qzS6My7.?^gn<Nղڟ{Ԉԝ׭Dٶ{8ݍםf A*=~b;G1([0+Dr  w 3 W8vB: D{CBERK^~/3 s ) g  "p^s{\*;2 =v51LZwv`R h&RNMd8 T    " 'e D T 3 V   B Dl!Zs 9O4t"]wc"9$h~mN Vh@6CI"usi=NERC~v34w.zy#hi(fx!L`IW!~&U ZY J v r    \ _ $ - : qpF\T U'  o  / < w[8F6Ha  W .7QYv߃ݒ=Nk։Q՜%oևw|13{<u c0 9 UhA e~  dmUI[!y=Eu45o -c93  6 9Q4B!<ceNb 2zjZghaBns*T|uVnP%qprDi 3 a4 `$ U "!#)"#"$ %?%B%&Z$q'$%c%%$$$##!" 5n g8*D&@ ?8WI(SV'2ةY+ %a+ {R5ѕքqؖnM NڐtHި]0g*CK %@V:{f&G8MiN _7d~|n:y  i bP, !^"0##&$m)$*%*$j("'& %O") p'   # 5lY fh:VZUp R^e1yS8nkܦU6 ݆݌fޑ\S;tT3`[>U&9nGGFB<]k(}a0 _ : |<Z4Vbf2 {3"y"!:"`"!YP"f"~ 0lPN4<  ` ikX7_foI^&9Om./y}#4DJO_nWY kO}2k MB4{~GGB&@3+8y?Xq._]>+'ugNlM= Qn<"o'X% ~   :    jQ y =HQ& d !8SaTPQ y2A@\zq9 4UkDqg`w?uA2 7 h(*L6XUwaft# Q X9sP1EW68zQ;_݄pJ Q ^6 >  ;+Mt2 #!&%%p'C%)&*'*(*(w*&* &()$'!&$ "@Pp 9pn aw;DFLKh|#JW_^B6   % < tz * b F L   @  )"  K  > w.#*&y Lidh:i[+ d  s }' V - $ 0 E z = Puh f !  - A| .   j$"2+;0Mh G0QܳۇlMqC9"[:_G 4G$A55m2RT ( 0ZHQ"VK* ,0  a!W"Nt#$}+$3I#}1!3}M.*f  % K urD\PqK\rQE:`ro^ tCt7jN[WgH_kF# h  +/Hk3*?_w!0'_h!hXRVT  HN'"nJHCw\ c@pIU$SUNNfO.@fEx%M; M m  ,6h, '!##n&&#'t&J'W&'%'$k&#A$~#""[$$"3!H ] p*x\_gA۞޴Xމj݂}ܧېܭ?#-t'omdm, ?  i&:L  ::?Eo!T12 / r s?XSHn?ETt6]/ug߈&$kߪ߸#XTqvU}pMtn!-OP 5y MA8Ge M!v]"#$ $#,"g"4"!dD 3 ln 27 x P3`@Ar96,by5S<\/+% ?rm j)M}*'gTqb::7/c~DieQ r i + ) !84_~K]62 qF-j/ Q  57O|eQ>ppv>PQ ^7aS q\ASru  m I@j)ENDA FJzf$GPGkRsgo  F)f"Cl:guTV#CL*ݣ֬vX؁Тօey͋M:ҹuԍp؟ۗݺqGwE`5R-!%0%8+ 5 d<m7kd'! x%m"'%(( )_+)-+W/s../C0/;//G./C-0*Q1*/*,b')G$#%S"]ga{%    93) <X&!݉"܎9ڢ؟_Ԏ؉ٜؕڃۈ |ޘߡVvx}tU\~"18z  B pGq*c8 vSj*R 8 r >\e&UQP`{\`Fk|vy,C~OJJnPd&m(mh7Z2b{a$W+=\LHt  kzBtp+S -" "$###_##\##!V!)! V  ]I/ ! rZA~CX0>"8$Xa/xQqGpAvw^ '8+CkY|nn2a_`<j,Zb F!g/G7 ae%eiW< /T *7h,AR7V5 iF z 4  5 D k 3 % L  4 \ K  pr~ni:z@%cO<E>un8<" 3 :D |t- Q m  ^ X;1$i#74t OsiQaMr$6#~ wI.q`1t n;s x; &u !)%"Y";# " w( HCFz$> i{  }J=e )$iMޏޥ9ߘ߮j RI$~\;z"[ks HTޝ߅x 1}H`^$Qe)f<+ x 3yl6l [#y!*&!(x",%0)Y1,1,1+^0L,.0.-6.}*+)5*''$$!+!z; 9 8sE[ۇّr".kԼݻӪܮ}{B=vI \ݏ4߬e&*q2}?R- [ N D (I! > M\e~Q  [ J  s ATZcrd2hz.10Q  :]Iv?*n}PK(Py +  o^$Gzas GCy @ Dwp} RWP0 iP M '  #-0M-skZVP\=KK`JgI?fdOM|1f fN.J%.W }<D#S1]Z4 .?   i 4 P  UejVY]\xQJD q  DKnf{X@2 {bD/;" JN["v_= mvBk  }lv  5 4     p     JJ|mQoX9H"^9AD`GS{Qtq!ombTGfET?Wb2[C AH 2oyxQe"#$&+(**k-,./ /1/1/B2-0202}1I402-0X*-&)!$Xf  (\\6a2W<,JU0,Kٕyۊۇڿ>D5:wjQ @y<"G~@S  &\ I d g =w   !0* M  d7 & S T v  vMSC'$i^n,`TAnN| W,V I$JG  > *h)xTp!} ""#U#!?#!!p eP@oj D !  ^{&p@pP3&3 kXqNJ#qm_i80C"t+[t!SQ~o\|jm %  @Rru2*%Zo$ 7   j ~  ] ; sL5Y+.I-{Ws'E4\Jfy5*&/$]JGUxv4#ULYfvN~ZX\aM7]IV r P k bd 7< 4*?)  ? &BL% y l I2{S\`Fjt0n*I|-k)aUFVJ*`txXcHL2:^ -YW9S} 1?  To ~l GQ!d""$]%i&''( ' &V}$-v#! Ho/Gt  Dw%=p+sRWeKO 1QJۭ~W~߫ $l~=9lZOV DMN  w ~ &7}RAq$fgJ q  {_ZS[;Zx#VQIAixGP޹Y)@my_jb *DF}H  n "MIz !!"&!$($)R%)$(u%(& )&D)&)%s($'#$d!\ OI P |eZy"?3]~%(;q@AXyޕcB%ٽaָH;يf~aۂnۻl1}t)&>f:  & =f $' I'"&&$C'8$( #(""'X"]&8!" 08D1j 0 Ob+G$lB'ILP[alkMZ.QlzV]AWzD.9>{^br0 * Jm  z|2ckmL#]/NbJ d   c  ]HMcNDC1c`1!0r_YVKZn6__b37T:g AIX {NQJ>ETjQ\ 4?d#JlAZ%T c3W( q p   yK r7Z=Lyo2In  te:   K ' D 8 o   agNYwGkbcT|DlY FN 0do.;R`b\H K`d_6B:n8H4C76A {s LbV&r(M~;  !|>bu2NJUYzj{}*6 v _ D tH $ {~ Mp)2^*"vG}g2LK oQDw'ajKRWZ  .F`FnDhx=2mB P 7 M@|;UWFu/ wJ_`NQcc\v7JDPr*"$YWnh9 2|Qsgt)rK=g@*zL-1Hq4i# Xa' b 9 f 6! 2% 5 w_ 1$v  @ ; '" CA V '   7  "0~c&F f Z%c<$xl WCH lU5eqZ^v~OG  / Ln S [UlX493 h_0]  6l = c&iVF^_ .~jPN #Hml0 R > {  J o)yi  PC ##!6"L#Y!B#UE  n'J$~0q+pݿz۟ט׃9+Vwϼ<Ѥ|W kI7ߴvDh;iBb/! P UYy$ht E M" "G$!$ \$ # $ D$ $,$R" eD_b I UtNtp;ROer+ *5 y]=y`QHI078 2MDSL0b,`p !#%t%i(]'0*(*+<,-K-.-~/,-*e.*,K))&#&! .C } 0?wHjaIS|@-C:}- BOsjl:"z"BW"!ar%v =BD+YGd t^!yk"-!w$.McOe t FQ  b F/)x:KVnJy]FV~aOVGdq>  # 2C 8  w  D< "? w '"VWRi;W8[:t2`u XC `.};.J4iN9@A P &;n* S |  ! 3 .Xet+w0ou&hov?wy)!QߺF+_/ۿTՍԋӱ<&FѶ֓+9L؞ݟڊl:[[yL HmkF I D~T?Y xO%&}ZsNr1m,n['`Yzk\ c d %  n lz9(PV Qtf/R KIR52߁@7-\O` Q4q  a / 7 !!D"!!!!>!!;np 7 # lK+g[Pgqe@HSZ^R_-Y}%h8b2LK2v|Km;*VjUG3U@pIJ { SG,bVw!=;"#l!&r"'#&#$"Z$& U# (>H# $ ^,(c`K_yt@FkCR:(: "wcl%LR6$w d FsOrTN_\GP R   uD B dsB R\  ` 4z(,l&})6s/G?  uzڇG*٠m9޹/<1GrB;.%4 3h.!E"RB"t#a "&"6'#&"%"$!x%B&6%7f#sO k{   H B  +tK9Kh15]y( )_QUK]EO9M@BI*3NaM@PF&(;/yh l:#T)^ s ~ I # h  z P Q  ":w\#C\j|$Df;Z n}d?f0`rR\Td2/eg*aFh]gT_CgO=6lOlS j D - d  F bwxFOJ76 ~8y\ ~ A D P I^$Nb6uUަޙuܷڴڀ۷TِVEv٭ٗn ߬ێ߭ކfHnZ@?PzeFLSg  u 3 ,X _?ea !#"%&$&$'%(&)i'x)+()))/));)*)**)))&("&&fw$Ar  b| JXL\Tn`/j3ߐ]B'Nڞة*4rcD5Wvقk Ccc9sVzpEF 5 ,]!jL! ""!T%N!c(X!(!!9(v!% u[d<h]\i Q T?]w`lI'-/y?  )  | / b ~ 3  c Ui c "9 E u I ] '\3DHOP9w]DOQv=!NPj<)aczx_PnScL01I  e n SAXu!%)c"+$-$Q/%0'41](2)1i)k0)06)c-&*+#'!! 4% v' SEd9a(]Y$(z4ݖDoM]Tݹ|ݫbx2x.\u%}~#5Qf(Jx !  dHh, G iY"] %!'"(#(F#(%Z)&*?&+#*V!3)$!l%%_ L# X W"w-$0w05aAZ+#۠ݿUkؔo<aٖN9]KmQgݠ0:aaH:Y)pG3 gS7+Y""c%%&)G)-+/,/#-e/-//.0,/+.*,)N+'R*M&K){#) b'p&>&$"]- b - qkNg p. 0rKܧ݊ۥ%ںJpXu`tפA6G؟j1ߑtS Z/f`)60:  U  b  b F F 7 H < R 6 e n 7 m : c   IyrNI0 s5QO{4s`eeTf   M(  d 0g C   )  y 4  NL K S Y$(1 0 $ @ x Z_  =M5s0%LTUZa&!NF5_BVCGni1rZX3PRc EUTW'8*h"j; k :9qVRZ<~j '  I  P \ 0hM:Xg . Gf3 DFM<c / ? _ Y@LH)\99y)i1H~VYGM-bft-ff{L8k}g%b\\ o_B E &J  s=ztP` dP,w0C% }4 n b?Digx5oJ*N߈7qޣM ݵߙ%ނ9_ ZKL~JZP/r b DTyN"!#%"%#&#(o#W)"1*<#+}$+$q+#p+"j)!&&$LT Rvu2 O |u%,'r/*Q0,2,^3h+122*/',&:,&*!G'a"[L*  bpw N~Xf>jܔw@ߐ0ىSgWړu<6%O2|y|(; 1fy4emQD y ?   N 7,eF=;gI0eZ3s   {3c \`T4^v\"y|}q2^|]-^W=%,c  r"  i$n"k]hr  ;l2?{m 0OULI`jt:qPi@ jWlix@N=S~߫8p_2emu#TASW- v]ASkz }#'$%"%#$$%%&&%V&"%!#&! T!]#]/A9wd + M c1\=K).sS`~cbU^rq t)=?E )<@j4cA}lsDg[=  Za >B} Ij*Iy) &(RaOC(N r   4h4xtnh]a/V:=a_5>9>Qg_Q f@fXsG7wflXSRYfn w MA(x u#!%$'%&'#' ' N( '7 f%^">j! l   iiV`*76LKT(SWupRj|x 91[ ؈ؾ]ت]"ۡv?xqp>aZexX.j= w Z Tf|nI-"$t'(!Y*f#,<$~-$.i$/"y0C"0-!-,+()#(fz]5k C]?w~ yBG<4K ڠ 3r $.N&zlG1eUJ`0< JRFQh(gs,j/me@gs q [ c  5CR8z Dc.9N~~ krnPX5]߶O!+J ZN݀Gލ2ww3W 0-3jaa@ fG|  /%Q$)(Y, --z//@0:2/3/2/2.0--)q,#* ($ la&  1 cjsQ1-}+I'Q#H &&|&C17qGOZG1UV, j>"/7 nVY bL KpBe`rjN+w:zn5t{#LtSz@8LK_7`h,2,n/ w j \x g o    p P =P(&rv(/h? HoAB1PH,{N!ti6Ve:0~QM o#F/a"Gtc Eq66P8Lb$XYQ:l Z@>A>3@>o@f>@=A<@ 9q>(6: 2\6+1$?. d+*e&F !pu  JneK|NL?0<-I h}DiO -ްޝ XzD)<`\: TAVTMBY  w ^ byg4b1.Lw  h 1AyBQV>bXE]6a ܫ=4BSPu=4ZDaw4peF  x5 Ex  I#!s&/"/("("("*K"7-a"}-m!,?+w*(*'Q$K# Ctn    -Z n@MC W \tw\]4tߥݲOܠ\݃ݯFUH20{pAAu 'tEf&hAYJcr5zg .Hd|?( Mc%?? 6= k .  F w V  {%,Wn 9&IB29_ m@x p =HvQryB'2oW94\Vdh`b\{^UAZ & *_vKO"Tg!ZyP#,S _ j  ? swm?I$Qjܜ߱Mܻ0m3!׹Z7=Zxg+[HBTL>" := +( [h"!"$#%'A))C++q+*g+*++,)%+@)]'R(*#h% >D{Jb J  QV/QqZ I*;:uAT/Erz1JpAn %UPXOi-_R 57# 0= eff88`M8h & b`jO}aJ,BY.mNܟH݊B۲ַ$oԄ&iku܀ܑݜi p_@=Q  = A7W!6s&"* &E,*)- ,/5-A1y/*3{2L4Y425B2425v0s6v.F6+5*3*1(/',%*r$)"'$s &  dU hj3,UL`goܖe۳ӔםGϽr1̂/=qcе)ҐMԩYw܏߇`:i v/b"    R b"dP]MkV ~    d q#[>S6 F*mbJ:)FA-Q5Wwt{` r  D i - .- '$jn c h P <X@ 0)$D |1qG46 Y9 YxM{nd~V`$DZYE},(~(+s% 6{l ~V% <3ID+,DZ|0`}n%NQ o<9;0.qxq  :m!@ &$|1%a!$o"#"####"# !""T< a 3R{3]eW#sm"Dwߩ0xrߚ%[޲[H݉}-8zhL7 {ct C8 z| ("w!C#"""!"B!"!". !F {rIu : " o+#p\){SgMp|3ܒcևٱԊnSڻD)iقݡhZM@K 9o*!n9 V  _} !a"$"(%*'*,!*,"/-101U14252a62<7~18k2v:m19-#6(3#)1". !-(t$m5$!r %M x*1"*ox{ޙ5ۼm2Ѷxϔ҇bjϊL̳͝we0Wdž̋ϽtlT[Ԍoٻݳ:i4/i0 N  /:9{84 IQ>=a<u\jq ' w , L d|B<5+PJRshI<s` rs Y E    Ry ?Hy FRhu>\Ni  } 1u"ueI!<%iD8Z02G܈#n7H?2fFM5CB! ;Q~E   g]%{<G,  | /p) 0"' wN /i[VI`I x \ w Xn R  * a f  O M h    D v :Q  [?    8bome(5pEnQJ0o+bDTYvvNDvU&~eMZ|95P}{i]5  f 8H IY$S7QOjvD6$W'CV  < lj>PK&7r )fe$~r)1;):iJ#`jKKNq DwKs0lN~wRHr!(!# H###{#C $!$k#.&}#0'#'W$&#%#"" _ s KnI  q1N)?qIۨ@sAdY=ϟm \BNΌTdA՝;a$ޯ Dz@-L ntg (ZZ` p"$#.'$'$)(#'$h&U$H%#L$g" %!&&"E,q) 8 GH`CZdva `GJoTKL7[`YE9r~+S+Vr@fnBZB _m"@!'$($],y(O1/35677O97;8l=:=<<;_ _P ZT& n%  g@wQm+aYp[Yh!Hy\2~UK\F9B] T lqE:^% PWAe_fynAL<p;i K$pUoaI )Js,2m`_HN)A|   Z MN?jq=0    ,v7   ! # M f + x f vrg_1Ir4t*ڪߧ-hՂEqяѽֱp~BcՏRXܾlNY3:.1\ O]  tysEXH !!!!O6QLh=Q7Dxp0 # 8  NF6.AW4=r^)*X.!%WKb EsZ8)|')Bm/`yp8{  {zdK!A$&P(+,l+i.,-r-.I./>.|0n.1./.--Q,,*,()~*,%P(#3L|( A2 pA9QC0(5pیlٟ)CҧڄkP˳Ҿ҉"ia΋rճ, ڢށ݊ A[&9&xaD6 ]&:;wN I*S1g4.h * # g$!6(%%&U& '&%w#"! 68.2 Z g Q!tO(z1 1 ] ~4] `Kcmi@A) Stn 0 ^% F)nz+ T/[I݀Hg7Tܰݗ_e*l$7Dt<Z=1O}vC +:`9 j@=Ff2U!#!$#%\$9'$'B%)\%)7%($"([$#'#%!k#* N<8FBw  C  T&1b 99M3`vU!t7e D vGKwrUV>&um/-` VN  {-{!.^iiHvi= ]  ' 8( M   \g Q e `, XC^<r:t.G  @zMl_:y$-y.2 -;  n~ 9* cn3/1$"vOn@;.lS=;E  | L j Fll3 ."#! LC@  > %QJr!Izt6l'rv`U}>^`OqQw]mٜ".ETߜfV QDq[+J e x Q0\ S "$"'}'E+'5+),,+L/*0+/\-0R/0.g1,W0 ',."-g!),( %   e}dmEMlK{Xbھٻ{٪ۑܘޓN9pDr2< )z # + ^!-91l*B[( QruF&1M y,  <  ~+?s!hn;z@>x4(YP\aY+Ufݑ"j={CKׇ['ݷk%HG *e%K6TnRW ! ?_l} %(!+Q$-;%/e%0%1%~1& 1&0 &.#,J"+ 'v%v"7Rm!R xoc pSNNFL\=xB*Q(zb&4qs_W\\-S=!$0WqcZr/ ] E1ir~IW;)u^Y _5e_yE(a!/vDL*^OA@Dw  RAd  ?  : aC l   8   HzB\wgCuj.\Z*:f%w{5$ 2'>B{|A>pg8vM+\gD   X x&Q% U>iEj   B oE M <(x=7BEi4Go.2:.h Z.OOXrz&][ -Y y/vak B^@M:zB%IZR 4}X$ cG vV k"N.%Gw uB٘0٠ؼ/֜۸Hۚ#6"OPvAعIە'ߑ2 fO`v O ZQ<"!{%y'(h+0+-?,/#/123{333332 42 3201G/M/n.i.#.}-+*s'']#%!vR.- |SJttW* eZ"b/ 9-k3F$\];Nߎux#0u.&rr)1EnP B &  eP2M "p!#!!!Y!7Oc ?  - fYKPni.V߃3@f{ނߊ99^"! }c#*- . _?Vr; #' J'd!L*t")0"+8#K/$0%0 '/&/&1'(>2'1%.K%?+%'!=&X<%:#W#!LIk d 8 1_Oi'a6EuU$-yP'.ٿr֔kJ֏ݜ(٧ى:ݨ݃dhT`C;*a0(D " #  P R'|?:o]'ld  > m . 0Z ~ &: 6 +$$"P( B#o6MKA\+&<@6=.+  'l 6 ) ho( B cvMmcH#yx>d 0uE464 * M7) i$D[=:C=f3\%)'%_(h&)v'i+(,)!-).(R.'&-X#},}! ,4!E, * ( ( ' $G U9 gMB tra_VbmVS$lՕQӸؽF OίլFًͣ7ܮk.ޠ f(Q֝yؐNu܇o%6o}o*# pZ9 }q s 42[Bq2o  *  ` s]';U . BlFfv5}- P0G^72Y*7!s2em'?q,dO6Fo-- 1`   >f !#[% &["H$!"!| #8Z1 L:1?)dqp7܊'ؐh(ݥ?6O%.D\0ISUyjyI,$\pWk<nT @I  (  &} i p  E  %? e W  L Q  M   Z  I < 2F q j nsU&toZxDBx$_.[\7Cm"ms% e$ =~A{ 7q6PvX , M P B [ax|'8{8xc*u !T}?3!shXWC) C u k  !  f  Bk2T8T 7GvݞLM+݁C!`#ٖ'ە"XloT>Y>i%A5|bz{A w @ `} O z $  8 ^ e z q F s y   1 q d 2 + Pq > t  +}jC0#HgMq@|s;d 2WX0.5lK  w X G 1 K,Q ~/E^,s!&I L h :%qwB_z !,O}F  D5*{4!!u #[$$h$ $ {$C$R$=#! $  r =5k `I|NFT@M;'f9nV=6z@>7*tH#Z\S F  z5 V | K  3   S  \ ~ 9 [ = e  / o  Z?UZ+D?g"?/", ` MZi2ފs*~0t%I}&}bJ( X- M ? l  : X  3" ~"*)fWRfx,g{{O>ifu1@ 4   N Y 8AZtL.+@X7r DFU +w3$ Y;wfߪio(`\# ~twm`j%/1b"= [  L ;` [ m(,FYJr}F(StSt]6-N,a<JEhS eqI : z   T[{E}k: ~ j'hAUNtQ?hO0 D/ 7]!  v  #  u9~>U&MQMtx" AV 7[    Q > ..K[!m}: %!fLbPJ*/?#F@{<4}bwjkV%j8Fg4~ a w6 y k!N% ("[)%7)C'e)'(7*'*,l'-&7.;& -&*%)"G'Q O#{"hs q 8 0_#PM!nS3QA ;'V%Ng,ZOn}jj[tZ_c^"j  W4C vR0,\   ]55_RM J XkCc2'JsUߣdPݼ ޯt߀QݕFޘMO*.AY|; J:r  d @/|"2$%)'0k'57'&F%J#e!)B [64|qe Y -a   - J{RivMWm09H2G% 6a2MTa}=/ x= 1  C1O'F=2o~"B4KV(5ctCsAi:v{S% P f &R   1 9, / D-e8onrd/ zu " a 9 c"C8Yp#y=߂|&9m/A<rfpn4 M : 4[ F Q n: .waO G T/:k!bPT, K]"/0x`*=y)/Mhn 65#hv'>w] + N (11 h J   3w)@}P]3'm&e  K C ?uT55>D[tBu5LfM[ZvTb]3Jtf4Ne>S[ z  *G,a r5SC|  =!=!q! iYS*8/3 ` 'm (RL&fQ;k13yi(MCLJi>^@hqM޼z$EoޜBSa2mfXLQb ,V * [ #1%H%T$6!,~]h} k IxQRL-uc;kqHNDSX v/jmj&fJ/NsP^,~Sh-g=fX n , l 5#y1!F! 3# #Y#%$%h%%%$%";%#6"K"!<|i =  r/+p2T\y `ߟ%sە[ތe߸hcm  b ><#,h{iZU}zz * ` D o ~  T ,  x   5 " E wb %   # y : .   w ]Bo`?hYGfm:K VZtvD~y.0{ A    m o e [  a7   V 9 l\  { uM|\t;30 g6;Lg^)d@6>Qhs:3BM|TTv2{i<)r cET*~ZC&x} R94 c  aH mO LFvjM e!!6!Z h=VZ  w-I#;  8<Zsz/ZU (+d!G`dg-* 3_CQ vhCo6Us7tU=^J M  \Q-uFS<_nM'%(ps"Y8haRW(Q   K%[\("Zs\"c`f4_$6=(4deo ,SRD|ZT! 9 t ` !#"&#`)7$)1$*#*R$y)`%x('&(&''R%-'"%'!73 e smS:t8,IIۧ ڻؓ.T)_݊&߃AY/RKaE Ii>z(ls F+    1\d%@>_Y"Sz.1 q  P4,x 766@<KtnaE;/2}gJ>1Z ti {Aw 2  EP % 7FV@s ZB!_)!u gT Y s Y.N@s'Av*B$;J7`l]&:(E@&v6d0Qpe"x x 8OSw2P  j t2D;v Yi<p !fWDu6} ? @  fo  dCe%6lq\:fkC/nn!y#bOP_ggsW(?Y'wyJQTy7c46-U90cj `1Pms'?0yy)kze!m@ }RpOB   z};y  )  :j0z\g0:z^7]8f=KjA~_l2n"W  p  ] < > g  j  M q * | T= & 0@  j 0@!`KT0&o\*g UrQ?B$-}jv&Q Z~L  oH 3 I(>N_N9 #c\ Q,dHaeo J4-  r5 j Zs3m!vg XV<,ޤM ݕ۽_pR~{b@=4T::z; {v!A0 "+$%\'2))*y*]+y+$-9+Z-*, ++*|)+1)W+)((&:'%#" <9Xni i g C 9(xq~@@X|ۆ  cyb'/%lK^` C   S 5 #l+ 9 h$ pf ~lmbHj]Y;"P0Ac:c%M$ph!95WOcV&z I&k01=|rpTp8G  B)SX? l  ( ] w+ [  z B q|     \  & z, / 6 VX `! - Bi  qf =E To_:kd'F%@}=i?*y0/#R KW"PR^ ' X Y  B 4 h  F@ _ &  * L w"?"vrUBj7&Wp~>hkaPN$Q4Mcpp=\l2']~Eb  k;2j Z ?(`6IP::9X#| J3 8 )|a%Fd.| s5OU&yc{ u v |P o ~ ([hioYG$DVxWxi,nPi6J1Wmz3w)  ) _ @   ^ 1 C|pCu Ln .e 7 /   P   VVqu ,@+no:4kr&`&8==~sI>s_!(:~-{]UB8[VetVYGcX>) zMv#793  [ qV 6Z_B|<=<44q 4  { I  3 `   4 6 3t #   B /v e ? >o[L+aQJq^%WNzL\qw %fP0/b!nQIsoLv/:zKrH6S |*< [;Ko`\nl]+9YZq3b{]  JlGCNI(LLTt|dH [ I [  $wP{O{?Z Y?5BIXdn{Y?w`!F)3F:(V K L + d W v v : 7 Q  s J s  m ]M {knEJ ;O DeF_LT_ fyx_NQuTwLB T/&v\OlL  { K'&BL8PO 1 -7Ok2n2!M % @3  MM "`.V OF]E,n|q>Z9t4aKZcL"w}\&h0(5Al]  =   X pX~F}RP<BU|   { : Fx'ExV3#Vwe(8m* =?dX,8a9,;&d: q7)+VTeX{MRp  h y F.%|G|VFEP    U) -c   FMu7%(hxE@A'}N2 3~/2b^$:O-m9SU=M0K1Nt6.~B< [mTw A R@ }V ) P_*1\ m8GSRYck V} IO  y{ DAS#{B[(,cq~1HS?gn 6H%O k&GF!SL&0H#'  .+q2^ xq''DMOS -I7t5m][#MM%DeV9!^Z JE J  fTY!=lzPp7~_ zl b^`U(I%'V"~Q4h2`   7 L   R&q|Or@V@r?q.,0^3uYg g ujd+5AD8Gw#@(D!jF{\DI-S>c,|Mgg,e   { "   x C b  W [  c \   t bk  ; $  H^$/)+0%?'/wf!n?C|8EtO[)9 * F ' 3z$$' ]umA[I,bdTf<w[KyS.I8,7hwZQlM_ZHo@niG%g^i "13K^nV+GgR(v?y?+5 W    + | Z9h{s P Z |  P ^  d + 5  : O ; [    g K J F}]NYcs_gzhQuMD1L:fk{-m[Mx%6$oR3FUg\Ih$<3 _n "  B'  (`   V% d$  (D>+k! zGB_@9fED+*IC/'QG,sm.A+\?r7  W  x ,v C>2~W  J   4  p e E{J HYs% .$VO(x CKnMgv:~=R TE%Qem.N5N S7 /   B,ZzF AuV'e 0m /u U ]b4~)W+Ktf!xe%bY~HHKjSsOy.8D/H&C7_mtI<48_ MR7V k H T r P    X \ L" 8EuS.stmnb_v[{C&^ X6ZUlUH"T`n.^=* v  v _ ) H o  $    ] #   O     / Ky'Ub# qeXZduuh`]4]5KR1&a4 Q  hCMD X w+WM1OxQn K + L U  `lJ`{}O/kcqacp D7Tw!kC ." ]Bd w^AM(-yG,{%(_ c /  '  l* ;] Q C    V v   ~6pN&Nm=1EFu'Y)b[]5]we$,nzIy=dE 9 W?a: " v M P   " |  g b >  _yw{L%@m^% 7P,%JcwXx|Q88 J<]+nd U D *(  u f }  S 7 6G1%OIQwJk: (!#r[b4 @S?/ /2{? E@9hW(!_iA7 % 7LEV*JH:Mk = w  !KUu{[a '8um Y,x$ k>@[   N   mZ   =  vBc76o#y#z62|ImnT7j5\DF[cj^-(>[$P\mi}IY3  lexV,d? @ D  Q * T W :=!  6k i 5  U 1  }  +> x <=J_<@)(cWEt661s6poj%Dcp).F#_-1v!Y?Cc$      ; r  B. ;2hWYt GNh! ^EteU<:Rr8 7ir 3&ys99OIUN?gahn_7zXN`D&XM8;=:|S~CD,S=y$S\SawDKj gCJgG"C"g"|a~H1R8>zc H2e%Y Y> zGGj?M7D{hI[\MIr4Qd PS<4kBGA0-^xyPjPWe6Nb KK Sqe1}(m/fgdz X AV=/l38D)}u(k? <9f \AApz233Kl!5w)l=~jk\c+DCX?R uV+b%_1 g=N8 I6sR0$yyBSVx8@DXP6 G7"x\Z0W',G]N;l-E}@F}`y#R3sA;|{ {DICGo#et\$a7u8^=`HTQ77OwwI$[ki@O6c0i |Iyki;-t4[b~7mXf\&[\0VhM2 vI!'Ag]( iAg<r+7WS8-iN@dl H hCj n 2  r>.3Ra#"4B=l24 aH[ 0&yFz4gc^[P bY,HABivk:"AP&;1G7 Ul`C)2N;IJ8ZZ* :w > hf~tsDh;bN2>Lz[2+q;cn(5k`2VvWS-xd}h3>;YxK|3Z=r[U<.M6veWg1d0W ;euH.z>m(S$(77}<Zo :P%&NQOVjBb'?W;^m p08 G_uvL) 9@GAZcb>|P!o_HUU1e#=Oy^&uIC {d hTkz}`X`p5@d.y7BR37@%aM/#`v ]TN|pEq5VuWNhl? 4\`)Ukoe)!*$!+VQ2)TlYwQcLOu;K?[2 e=U,?F~RWm+[i-JLp_";S^ /'V<9I1E"T^FsSAB*nnP^X~ir3_e+E n$N9w!*.=vmi$RQ Slye*j<dJS7h$t73* :;84%0u:$OW>Ni! sI:lk"a_NB-8AF4Y Yag!|&;9]>r1; $yafqxjow-x`L,kx&"rCg?LW} e>C@XQvH[P4E,@,wd< 75zcDEB'M6QYB+OLs7(H?cq&N(=>zqL{GwX9 HA';9N. Mz$<8v\x<cg,` k/a,B~ ycH}Aue}Xv<QZG _u43$@lpO&OpM"6a`3~aHQU^;!) f#:'7tymq^*kNCPmcY;/dK/rZ3vhz)Sjnrgr\6Ho\Qw']9i%Q*#*` $7.-($-VLkdUshk :ouUuj}ZaS`dZ_)B}5yBFQN* =Fd-d;cYwWU[{t7mW+_nz0q5gmidl hlgqAQ|GvPc0O&r^diLP;Sz9]%# Cw~hY_@gKNX3hh:,o}|o?@@/bK5{r0^? ! zY2Upcsme&ISHG7#+W@$J6>AT{E =H,aa2:O_1X,5} em|]Ev9fH]9q!gzlOn*h[/)g=^CgLE1bhvVHC3T<a+?fN[DBMV[e[@!uQAa?r\fvu~ m$rN +`#M }^\`N7|2%nVjYsM54+[Dz#Ki&.H2V%-Wz6=PP>;9qsus=Y_M6~qetSX6)Ft~.m*Jl`0 2R&!++&I+8Qek-w]bN<5;<$pOPd]JMD=5q;w()Q{C_6Z-U;0<IAu5u33j T*{O`=<@4)V..FBbXgxz\Y >8@]b/mTxjmSk  %V Ju$BQXbjPi Qd=?EZ}j6Tbi\_98mk;j '!3Ys-'*LRnMpQuMqfX6#,%/iUR?U{ uICGdWi&VJ!^VIcGq | p@2;30 &h3 /aVm{le]< l BD|taA+x]X:^GXQe( 8 \ :VaER\) ')O*vC\o]e{<v4ovonCwdN,vN1dRS=7"-)=@1yKt;48=_|ppoBtZgI1Gnml 2M@4K` ZT1<<k UdC?}wu??8/vVpv 9-q[vebF, <b*5LO D1O2[Gd^Pd.lIshhcTn3vn^D{>pEaP+`@oe83H]wwP=I}C\5O6E8>K&\ OKUsO<_HHM^puA,;' QB=$=w1)00A<nVe[GB71A[Z?.-FW@vbpX&%8#B$W0!o1 y s-\_.\9bxZ-cH)rHyt!/U)8Q[c{#,nYY[\o '2=V|UnOz^lwmiOk&{   |nZUL^$^TWgqoosnncct_cxnivz~|yuojjgdd`bxoN=7,%xQg:ZBb:gih ^R AAq0Tz CR[~gCu2bT5rb}kyovAR![4k_wrbK5'2' v]I)~ljbXajeXJB@C#J;AM1xFik^UHENM5KYiv-,EpR 9<C8(" 'Q=C\iZZu/*#rsa<0/-EYYadZZ]cz!  z]2zTuBo5\C$0'R]dszj VA?$E8FZN`rxxH/lE9qhYTM~:l3h.gmviWlLxsp{~bLv;fI Dtz]O-Q9S9W>N?56 >?m. %~EXTSe\zP:!~v{!!%}olmfT;)5-ZFrL_khp~ujeTI\lcTE>A??@+~0@:~5o@bVbn0\!!%2;9/), 5AHMTUXac^YVc}|}Sg/^"R @2!b,xqmpwv}&D]m||'.z?uPg#+  /PYMB?FWk%i5S>QDgSt^q[^[D_0]QM\h`B,/ wlfSOCq,c#]QAMflc`s$:Xqx~~qmvtyj{\yBj$`ZK EGA7'%5KTPG>BRj  $% #5=91*)3?>=FNR\aWRe| 6=0  {dZK;5777;@KX[g".2038FTO<0!uvo c&d%e"[TT[g!d.ZIdaoqichojW@0" zlvsYE9*)2:E1TC]Rk`s{wvl^zXxVOLKGE9"  }tjp]lZ_VPJL9I(@<?G$W7eC_BVBbMYgtwy~}xypk BNQJ:@MLLC5:ELP?& qT<4.'%&)-,(+3F cngbc)k+x!uljeZP?- zy|qaPBJTNOZcqzrox "  "-3;DKZkrvyw||ojprmf^TRVODAt;f.b,`1\3X2T*K?@HG'E.F+EA<79'8:9OF^PgHg?d=c;h:r8z3/,*+,068;?BFFCHRRI>1*),.( /CHI'K'I!GGF CDF@@GA7:DUeedjk*r7541+''0?EA6% (+*$!*/$   )>ILRX^fpyyx{p\WUMNYyXzU}^{hoeW[JUGS7M&EA://2)#(-169DVXP[y wwphgkt{~qjdewdWZ`dbTO[fmtrxhwOnInInDn>k4d)[TM GHRS L MNHHOWd tyrh_ [[]]\\UJHO UX[]`c"l.v3~46?N`iirytppsrkc]VIw;m8i6))3|2q5zIVPFA6&uZ4(<S#a%d ^S#P.J4?ADY_toLZ+ugSG=:EKRo4HSXUG55?7+9Tm| 1?DV|0=GU]ZMj;W.L)A5 +  & %, 6=;1  .$35.>.F:MR\_jOi7c&]R KD7,*+&%$ $4:??:AIIJ Uh/x2|7HXbb[T@&eN 7%%)4O,c5oI`o{yfclokapJU/?*{m_^WTXS`dqpvpqvvzzzy (%2Rca_a\G30)'?KLQatyx~" k`hjhi[H<( sWI.w}~ '6G*K)W(d)[US!D<9, 0Ot)Mjw }iZF+uQ:2& )9Kdy -2323:Pn} x*p2l4j9hDfLcM^NVTJ\@cAiHnLlNcQ^Zghokhaf`sm~nhrokpnjjg]fHN67,,BO)P0V<gOt[x`wcxh{nri][PQQJO>C/1 x^D@IOUZ[_a.d7m4i)O#;!;!B&H*J+G/D4C?OPfZu[{Q9|!z|&7UxrhbR9.(!)0>OZgt!z#5Vlsttrj_XK7-/101.#o`VRMD92130**+'!wj_YVSN"I&F1L>SASEWObRdRbXi^pcrhoiiolxuzqwdrXcGP3C(>&6( "$):/N-Z'c)q+|.@Ykw3COMDAv=b7P8>7.0(-#+-6=?:.' !).88E<L=NEYUifuwyplbM=|2xm[OKG<-$&)!(//-,-/0/(um jebeimry*AQ]^UOMNSUWamv|ti\yUqMgAe=jDnMoQpSnQfJ^BX;T<S?N9D+=%;$:>K*[<hGtQyYx\y\}^_\}RR`mty}7DLTM<,{vlmpquxwodbggecadhiopaSMKMTWX \-d>rHMMG?93.*)%$.=MX^bglmlmu~kZPLG</)&$ ~up!o+q3w<}A|Aw@s?oDmLoQnUlYl[i_efdhejejagZkYuY|W~XyUrLn@h2e'g%`"S!J%E"DHNZj$q*u,z*y$tmaR E>>@BFLN J D<677/&#'/6<AJ^r-v-s)q)h"^ZXVUPLJ H!H#N)Q-P+N#JD A>3'"#*4 85-$! }xussvy|{skefjllnquy|}&/568==6,ye^WLKMHDCENUVZds .:?INF<762(~oebdgjkg_]gptw sljlmbTOPV^bdgjpvy{~~z}pgb_WQV[`mx )9JVb mt{!$%! yti^VMC:2/,%"" }urpoty{tonlg`_k~ !3>CISY_isvsrtw}utkman^qbpimsmosz{wuw{|~wlipuuskegilt|~uqrka[UPNLGEHKR\\TQQQUTOLF?BHF;-%%''"  #( ,/ - ) '$  )7>AB @:4/,)%!!! "%(/8>HXjz'4DQY]aiomaRF<y1r+m)g&h#u%.;CFHGB@;786,znfaZRH6" !"")385238BILH@6* |sjih fk%t3IZbs )..*('&'#r]L>/$! %0:A>983' }y~vjdc`ZVSQQPKKQUWXWWXWX_hotwwvusqonnnlknqt y x w z #,3:?ENX^]ZXZ d j+g*c%_"Z"U'N+F+>"4+" yuux{#'+.-+*+,*%""! %0=F!O/T9T<Y@]BXAQBLBG<A45,,+066A7F7M7T4U-U W]dgijif f lw+598640+(#te[Z] ZQJC=93)  %-6EU ^i$w()($#}+{0y+x$y%.;CEINPNIFB6% qjd]VQPOLGEGIF@:4-("}!0>GOU`r,67640-+% } qhf#g#j#k#i&f(d![PF;1' ""(036:>AFGC?=?@BHQY\[ZUK@;<;9AJOVZ^m| | ~wx{ {qf\VNFA7,&&*/3640./496+!&+)&$      "2:F[p|{vlaYXYYZ\\[Z]dhhhkszytl`ULB5%)<JXj{$(1;:4/},u2q>jEeGfIdG]DO=<2($|nfb\RIB:}1v.s/q1s6}98?M^knlo| "2(B0N9W@\G[OUZVdZi^i`l]sU|S[bjxzvty{wun`WO:rU4mO;4(yme_Z[adgn{/?J_ 5P i%E\hz    |wk\Jw6s,q$fQ=.  ~ '*((-4;@BEE=4,&"{z~ (1<CA=8431+"rd\wSkD[5N$A0 *<962 ,$.%/ %   +>(M=\Ulhuty} la^XSQLEB}BzAx@u=m3d"`\PF>62)%C*Y<dC}Wvpr^bMV;J-A4&%3>IQOR]_ZXWUNI%K.K4I?OHTKSOV\clowssttw}}vqmnuyywrmhd`T@*|tpib_]VOIHMTW^jopl`SG6(#| vpbNA;4' "*,3<BI#N!S![%g$p!t#x%~! !"'.7AGLQOLOPOG8*!pig]TNE=99;=CIJNXagknqqqtw{~unkmv$&*'  "(!)!'#$' ,0#2&/#+%" #    !  &3;<AHHA4! (4 8;?$B-H2R9^FgRjYmhu~z|zmaVRQJ?x3r'm"l h]V RKGE=4.&%+2<GPV_intyz| #'.40+' |qgdejpqqsw~~xty "(+07BMSTTTNHA8/%zy|}zxw{~ {wtnh]MD@8.(&&(/552002431.+*'$%" '6 C%P([,_,_+^*X%OKJHD A>;:973*" "$#! {xw{   "#!#""$ &&%&&*5 AKPONNLMLH E!@92 +  #+/4 9;;: 7&3)1..1-3,4+5+:.?+@ :3( ##%+,+,./25554/*(&#  '+0333333557>D D B @ ?@BC@92+'   #(+ - / 00.'       # $$#"$'%  %'#  !$*-/28<;83.)# #&'(),058971-,../12122.'   #(.59":%8&5$4"3!2!3#3&1'-&+$."1!3"4'7-92;5A:I@NFMLHSEXCYBV@R>O<N7K0D*8&,!! '/;E I JMR W%^+e3j=mEnJoJrGsAr;p:o:o8m2n.r.t1q4n6l7k6j6i5g4c4]3W/R'KC;75 4 3 4 7 84.+* ' #    !$&%! |{}}~  #$(07;>@A@ABBA?;75553.)&')*,.27=@AABCCDHKKIKQUVWYZZ\^_\WUUWXUPLLLNSZafox $'.8CKOQQPMLKHA71-(|"wtsrponmkjjhc]XTQN J E ? : 9 9::8521 0"/%-),-*-)+(('&&&&%("+/ 1"2&5,939788889899:=>CAHCJFMIQKRKSLUJXH[H]J_LaLaOaSaVcWdXcXaV`U^RZLTEOAK@J>K<L:I9F9E:F?JDQEYC]B]@]=`;b:d5f-j'k"hc^ ZTLEA>?ADGIIKPVZ\^]YVUTRNF=961*"  #)-2<KV[[ZYZ]bb\RJFINONMMJFFFA:67898644:CJIDA><<==;998763-'$##$# !$% " %(, /'1+5/9/;.8+1&*$       "&&%#      '((,39:;;82.)%! !&(&#""!!"""#$$%'(* /565345663/-020.,+*-13432100001/)   %",)+-&/$0'0(-',&*"'"      %/8979=;4-++-.,%          !   !1:=AEFHIHG JNPPOMLKE 9.*-26:?F&M,Q.R,O'I!D?;977895 -($       #$$"    $ &%#     !'/68668<@AA@>93 0-*(%!!##%&()''(('%&&" #'(*.240+)'#!##%()).37@KTYYXZZZZVPKC=<7/./,-10/007?CEFB@AB?;88972-(! " $&&$""$&'+)$$(*-/28 =@CIPPF:51 -- , ) !   #')+(&#   %(()*,.16::<AGHFB@@AEIKPUSSVRKG >5-!      ',,)'*.,&" #%%""&*+/6<?>=?A?<=@ACFHGC AC>4*         *.0/,.3 7 4 0.*)0 3 2 :CCDHHB<;:9:0 !0534:= =!?BG JK LMPU Y ^ _VLF B$A);167:2>)A#EE ;( ! $%#"!"$)-.05:=@>7'9&@%@(=(:!/!#!%*(3-=2C3J2U1Z)T!H>:51(5*6)-*"*%   $ 2&@-H5L<MECP7X9]>_=`9e3e-[,T,P.J+I$P$S'T)V/S3S/S)C".*)'.8;;94 10& $%)01)      $  " *29 ; 70*(*)+253.,+$%.699>KZekovyrg]WSU_edggded^`gnuuu||{wvwtqqrqr{iXF985+'%%%"!+5=AGLR_jlh\KD@2% (&  $,4:@A<877444579:?A8,  +,""#.2,.1, -8@?=>=<BDA@ ;1--.,($!"'/ 1( "#$&+5= >> = 3. +        '.5Ldotsmgc^XRPOHEMV[\UMHEFIPXQD>97?EECGRXTSL:,&""  *30.2466.$     "$+*42>0G'H!C=4 0,  "& '*6@:.*)   ")16;GSSVhz $"!~!qg e[NKJA61*  "$(./+*-053-/1,--#%&   %,&,,1488:@7I1I2G8K:K=F:C1E/G-M(P(K&K#R(V(X"V NLPNPYbkmjq(w/r-r.t-l#c\O? 83% |tswp]VY^_`ecYZbemx| (5BMU"Z%b/j<pDxJIN`jmrtwzuy~ywhlY[EM+G8{l\vGn=o6m)d^YTOO[d]WWUZeheeflx~~$28CWfr{ '3?MS[kr%v0<EN`sy{xcp[\SLLJDG1=4+%# '*'') $    /;BJ KLZ#c+e9tDOY\bnz $&#"ukf]J4$jZ E4&xkaWPMHG}KyEs>s9o7f:d?`?[F`PbScWhdtq{ #.8K]bels| #/<EJQRT\adhe]XZ\XQD1*(|cZ Q<1*   ''%+&68!6%94,'  !)".$0-45=<FIHVLYT`[rdsz|}sybrReFS9L1A'.%  }{swkrimgifgiedaVZRTVQTNMMIJFF>K9R>ODOIULVJ[C`?cBiMkTrVbsz /?KUbj jr~#&(,27<?CKMEAGIOVTXbcdjjkos}zuv{yutxuleca]V~MvAg2U ?(  |ymoel`fT[OTPQIK@I>I@C@?;A6C3B1<3849-5+1*/"*'+'!#  (9K*U?`Ol[znz|.D.`G{Uc}$4G0X<YC[OhVp[tbxgxgzhzioagXdR`HV<G1:% {k]RM75"uzmpbjW^GQ8F/B*?-5*,-*!   (#%,%5*?vI~HF{Cv5n2b<_;b1_-[,X*R)I%CD'G.B"<:50/* ' , )/3 +'%%$   %$8+H:QIaSoVsWx^|b~[XS}I}I{Fs8n1h.b^TB.}vl`ZYZ\ZQN[d^UWZzVsQtOsMkHc@[;R=O@P;T4]5`7_:gHsZhoz ;)ZDxi%.5B&YBtOYn{`vCa1@gt?Fp[hN;) {`cBH#61+(-.=-W@kL{e 31XRvn 0IEXVcx*+>;TIeSmWwasulmmd[xK^4Q%L=yhUE5&&   &4.>8?2F'P*L.I%JGFB5( qZ|Fd4QD 4$  *=.G4O<]Qrl'9I-^9vI^r}+:EWm|'05=EP__K=8(}x q]F6$ oXL@f(? lr^iWVO>D*5 )15@Xs4BNg"68 5 8 >@:6A I&?*7.A3H:?E6N9O8S4_7j=qAyDACQYY]^XRLG|Bk:^-VMF< +!   *4%<7G@VG`\cpeulv~|seOk?e1\@"uapOaLUCM/?*2..,&.$4.62B3R:V@]Nvf}*3 AM!Q0_AsNXcpshYtBW)< qcT@8"#  ,!=,N:]QeZmYm$?+bHiy.#MHpjvTt<W);" |h@];lX@!{tcZZUSTLHPRNVfnk$l(v*8MWZl}  yuwvyy|'75BPQ^ien &%')7@AWIb\n{{ fY4" eP- vz2B`7aE+  )9M^j~&/=\8X z&It#Qq$Fn@\e>v[muKu&W0 d3x^Ay_~RfKMBD:@;7?<>FBORR`OcRgYld{d`lvu&<]>{b+ 8(N>ZPb^lftixitddVRE=( oaWME6|vUL0 lqTjO^OUORIQCJ@MCSCMCHGLRYj^|ez4Se7_ I#f5ro#)GPgw*D-K/X0\&XL0${yVK.qTZ:A%zDH!~z~p}Y~J|OyQRSVct"80E;PXgz.3[_}!7=\X{fx~iQ1~kL7+V'S'S:,uO+ eB!j`WFFECK[gi m~.MZq6]3IY<f/Ws,=IV g{.=AMVVSTQyIf=[0O#=/   vt_YIE5."}y|{wojl`hVYHN3N$J5  12NLi`y & CP.THcZys($24:EJPVV\imt}}lmece^OH7A&5oQq+Z 9n^X;'yn^C/-++.05;BO`ely0;>KQ]hrws|{{peo]f^a]bY_R[OYOYO`PcSZXZa^cZg[~du{.Kl1AKRgqz &18O \ftw~{vh`"b$]1\3H5?-8'iu<N)tUB@%ve[E3-'0[7S9\%Ss    ohKJ;4// z}ogm\nXX9W,["T \U RMN!Q!W&`5d5{PzZnz(+MFpW{ !F(`=sFL>F;+(eEpL`4(thTA4 (( ;U Z7f6fEkJkLwO}Rah}~ >^o\(o #$d=h<z{s6vM<>rYa^ Y IR>x VW,uz3i/f\R 9}A_F G3PUa7 T4 W  {*|YkvNB_y.i  r -g }u -dN(7{c,Tcu2DaTT[nS: HVFQr/{05 x  { oga]: eu"\[M9fdSu aE $  o w >  &w t71<Y%,mpuO=1'E}u4<ZgRz *yjbq.;sPEY ''y fLrL4EC^} | &Z|q0*0@W>!#QwceFn+_ )!WsPoqk @ F x 1 t 9 O S $  > " $   z & k  e  ? 5 v,i]+ z: io~A"\UM~f &2QK5\A{6L[y c 483^cyffMK>-+P~_86 q4sZZsw1M@mVrO PUf8x.pU7u;y!11`B1V`c;)Gq)t,31:'7O}tHVEa0",\-4UB\ J2 0  * N 8 8 o O h8  q / w W R { qS Q B}8G<rGNs[{;|@aK( eaU_O& \bJP2pw=\M` LbF   0 m  : -      t{h*Nw-RFL8r-@UP^Q/Y=YgeMY$J$>W\cjN  P^ Lua\pJbn$:PnxH c)*Qd\IG/1o.)"TJ&k)#x*;wXbOLRP $  ! 1^w@ Q!"#$ K% L%]$*o$#1"m mJ , 6 yv L @+:{I`_PzV } Cp4RJ[y%[W!bL2`$;}fhqT$_!BEu  # 5 71OHjOn2IYhEaFh,   tv J  a8"]SBFkulB8][ k`y7ugy)yDFw 7i~mV&*G// O B0PC?g9*wFJ }R!PSRX_ "%yXrFg+J{kt\,YXt3^t %W  Z 5 D5 Z  5 y  O q B & L fJ  B<M\ }8v!j)g`7;!WpP+IGh(Fc  & 'dJg`iu_AzqA%:h i C 7 b z F D5J8PO1+ ,;% D7sN\YQ"7Ju 5gP?N|Xr>CD(~' > GA`#Yvh*[i)k6 2 s(  E $ E 1 v tS2) sx-7D^u xHNWz`gD y&/(Q?b"kK &h`OK/;wsw/p{k1g/IU:}<~Qs!J""2ci7i{mb X}1<T Q   x  j   ' o b P  z  J I{ @Q!_.8* [sxD@ q'&n2j]zx\_VNid}0z'[mrE`{tUVT;< g!RHNX7m3&0  ^ v M<* 5>-q3Ch Zy [+k LPL vwx iK - f WKd-$N{b3Y]LweI#$ڝٺ߉- vEhcj.c'o mh+2r  *Jj>2;cn^6=s 1R}~52 _ k G!U_Sv71V:~m >+\000m* e jZ rcgB!!! '" b"r !C/!rMC_<3z ` s J D ~K^?9Z| `a}e N'w!DPobI^ u : J _M. H  = K  4-w=G #N8W1X4pOI<9r\cn6\^@`:yQ ?  <agWAd6t X! #t )>0E<-~$  -Vb@.O1BT$6I /t^=W85l6U *N@*]Ao>HIHD~b}k[ $ 0 m y ]`.lC[I&i   ~ zZ -  8 FE t t y.]CynZaw!S>G23lZ7ls^!u D6#8NP.$ 5 6UNZeW.Q1OT+ %~V,&^I}Pp1r.wH}/yiBj.Rqd#w#v`pH8`Aij`E<_&T1$X}Tg2~,oOJ 80k 7  | `  X R&9B2uQ  @ ? t b\*ol1bI~1ngqN{Pi^<>0,F?7<,>~-txlEtW=4C= $  a N|*{3#+.}a_ x p6 Q 4  ];}Y0Ckr\`03Tp_oA, n ms$, <88(kB ,.F/nQ!"6#! $!0$!#!,#m!|" !D?:   w AZ +16 |ou7y7E"B?Hl?<'o?IOۚ*rbާ^'UOk#I e 5 &eXl !` k!J!G "!#!s""!" " ! id5=X8Hf_M  Oi$zN${KK oopQdpN4GN]!tF`OVoW9Q0t  '  ( b f6 U  Q u ~ 5 = W 9 u@QBFO 2\@1jkc<`|;/1n  viQVNfl\`Wlz C   _1$>lU$!0p4,=t1%;} S  Q  s 2gnX4!!( t[;@o9:b +DJ^X4}K?rqRtcyqnzq+PHWe:Z8J0#PrS?"6+>d],S\\]^i& u>+X6 1QPF:V*Xe exu\oB~,r.9&UIb6i m-CYwn q ( :  f2uu[ y?L RHA 9  8  \!5C_oB>Lr7N_DMP#ARE\=;G&JY    / Q RM]>dI7R  RVRa=5l<7sgFN T 1 K  O6+w\E++2wݓwiۯٝأ4(zָׄ*לWk_Uԋ֡,הؑوQk@)trS I%'\E51 3 Z{kH !"$#?&%&z&''''(o'(S'!({&'$"&W##!"Z!1 pyJSRB, E V = pL6 aFC:;;x6Nn}C+/-f+ef Wt Tw s `  Q=o*'BOZ . , %  w z:I -]e,[!#tepl29;=_JTTw{Y]'V8H : O* )u L , ]S O     K 5~[Nw}~t k   g]~)64<-ukNEMRZp1$ip`THMAX  3] 0x[8*b  `       \ } &; =\Cb(5nCv$}A h"fmJf1 VwB}J_"'.`)l>#KKSma+ R C )T>v> 2k: U   ( _ a M" C T  (^T1"O;ZbX+'A[]( q   ; zps*uqM}~S fz2!Jd%q0 u6^QyO=MnF</  cw  f f  %p`B =  4 8j "e d x^ "h>&|H=3^ZBS, Hs"uK%e*KM pViB+  d g7 | HkQv=xk +"k##v% '"w)$K+>',(,|(+']+&)$p&e"$L!# :j0!R&3  :AX&{f>߅ߡt۽ٸځؖ׼רnZvه4obݸ ߽rD~CQf La _<`;aI { / U)Tc829* M N   [v) Ypsm6iAllQ2;8K@JRA>~8f {W C*{A]< [.bX><_ o2?9\]k`I j  g O6pr? (prajD+LloO13*#R]O^ItDO@ &13*Xb =-QtQLwTEAg>K>vk%L_%O\\IP 2SD %  $ OJ/q-"m} * { } 8   *R,r z4~F/Nz'` FnVS3\FmI:z7d {vPaI((L {zx?'8DLQ2-G&gHA|cj3!`   - H q   W u 2 r 9 C    d  ? & H  NSLF=~7:_  L| ( }~~Kz9h KtzU~YXRYll jii6Ws  | 0m zV#6P:9BOaX6_pd ` 84.M?<F'(VG`2lQ:5Lz1n`(h:;L-)&:%VVof|QICbvI rggf3!n!:$$%&C'(o')')T&)t%b($'`"$!# }"*:{d8 n Z {zCf1HPvߋܶFU۬<'ہۻیܿ)XݿKzT!e>P L@ %]3( Y31 u!"C#"C"{\![] 0 \  K {NE7t:`!sIs7"XJOlZZR/2st!L2piTPG] `rcYh  ~"=!"'" "#!B$0"$!}#(!" W ]!yN\ju ( / P  f=-|U0;!x:  )GcO`# 7/>;m!\#l}u)J}C* ]RWZ(d,X\q7< i C  |   u! F  m `  ]d g3=b 8J   /}DD C9o.[{5DWYuj  SMp ..LCdc{2Iz$Z&3OpLO`n|_{\F#\t07Qj`Mxd[&<5Bw/sgw62<{2F99/7Q:*$-#JE4371!pv[kK)>po!Q&>V"{XjV  O $x_wH\Fn*   f  o =p Q.a74m99G)a IOsoYa:.cZ_R *)3;%\{   O !8UE{\-7v 6 / ?* "`bF\qEXsu>hL~*ChYQ'oWMa,h&c%L   <qwx ";"&# /$!y%!n&!& %($z" O$1j5 /Yk93]zN#w>B{o8vpnJ?")kpLZ@^_p= 0 ! :  p{aH Ws_v\%,-6\*4@*e"p/mCn-&s[=JQ. J  pvg Y}r{.hJ)3 E _i ' T 6c_C.d@FoqkML+WWK9.B]w&k'Fj)~W) =.xnWq S9@.I 1b ; |4 +&0/(wGhqr' { b }I ]` k: 7<}\^DZC )61C4h S98F=GPz?o!P  Qb+\U5=n8b|4Ox ! X L  qe|{NV MM)   aSo2u,Vvr4m[KApR|K D2_6'Ito6Cv u k  . q Ltw`=u2%lK;pl<16t 2j:CQX/ $:lUy2  Z!x"~sR- y  zy P]!#$] [?_]Bg}._/2-\3$RIS/0(@J6t1,L6/ ;6} \  1/*JC5X[$}^";c", K a t(Cn?nC9 [5Z%Xr2n@\`{l?beNg,d:W'{.{j&6|];A{3{+` { y? 3  @ d{dAX_j<3s4p_G r-d?B(QSf5 9C>* p m X  1  [ \   hx   Z    Z oy & | *  [ I R o .  o   -* 1 $ g V rK s {=N_-HafL3]fCd(P2__It@uE9Et+qN7HAi k8 m o I ~ W r S p 'n*d}PX xvSI|@9bn^6]gL*3vx /u T oNi!"/?^L7+h&U(,rG l =|r[C 6"#x$-&&&'&)&w) %)$u)<#E))'{%r#"" H^ YP uO Z1 %ekSvH7_Z-,D8)} aeAbjZPl7<0n}'+o) (.0J NVQI  o' p 18W//bl!":"! !n \j Q G R t#n-_Ud`4E-ghxYbbks /  ^  p B \n3ttA %uc~"5_Pp   d n A e_o~OD(B876=>QrTBTmk~ N,[F'2mH4m _ ] $  1U| p!rT  ? [ V,u^x&h.R@: Y#4DR|j.UzoGC6 3 1 jA lq X2  r!i"!b TFd d   1; F vqH98"G&8uJXZf!P/$fhF$V7 {H L'@J.6&[rFn.<!   b k 8l  Vj   [ H p /C  Z  ^ o mX  C  LewR(8/tz T$J%GAh5NwIS ksp] jjsGF=:a~Tc|mHKMbj t{  :   bj o V J ] C  o'b m k   vV wA !Ob(pZn9H6&iIiq m  5 ( * G ~ 4 r jv h eN 7 L   B v L  pF$`]P8'>-2rWKX?0: 1` l(KNi- d E$H! m"##&)&D('=))O*7)N+'N+&f*v%m(#& !%5# oiAi5 P - xx/?)'?GmyZIU9B0 }#Ar)7T6B]1X]T!,=#m@o # #SYR.{g!"#_%#x&D$-':&&L&z$%"#X! `Xn,i5 ! [}? `my/ c\ygE:Y;[s#\)2x+[& x   Sf ^ f `~2$s|?%r;6< !$N  ' f j{ Suy{7c|y\#F{|N{USp8XJ^R z-U`7i"6=FD      vJ iP)!~ i2 QB^qRo  X  g n73,ZFeI4Z[CN3}ocjL'vJQk ; *i  {  n    '   ],  4 7 2      L prx~A7>G3Ld_%UV?B:HlFd z$:S?fMK<>njy[1xD<g &aj|^5k$0 ~ H  K y +sW N j//  k pS*< def3p\1GnQ#EfZS[00WH,f+KJ>P@\I=mNZJ9$mt pt W M s iPu9:lZW\+$   tW  i  /KUp~{r8UgE%N6! 6F%AA:9*{ cBg5   ].z   %[  l n !$6xa? 1 ]w cN1w C9^['/^ *Eqq>tKW0.dgF'WJ\hk9r H"+ g ;  <DvA! n#.!%!$ V$& #i!R]] q   lKq~U677PuMD;&31$k5_mQL@$ ~c#!V6!:Cq2 m V05w6k^ X >CA): M   r 1xlo""H{F.G8uq 2"l&A%6J` `  k k 0!}1 [:%NA6/:,'57|yD Ho { r  d XJ Ry8a|om{9AxfJ|f1ci @4!,[& J~D2_p - b  tx  >S 4  w   U  I vK T }6P04)g;Q CA(\p~\2 a{eL5Vl8XANkL2} T x   % [# a&WC_kLkoQM [ i  $e'Ecmg|g^R#g9T|S.L$J>?[:D}>LlMc /1]<$iXf=d.P7>h2X3r ^N  e;v~ {y v12^FHaUslK[ApQP8Lp j-fr>-~)#}["BpQ-A*  { #  3L .14 7 | 8 hc @ZKN7Q/J2s^W26ey4_k,#yo"=>o}\Z 5 A- Nv|91{c^R+m ~(  J t 1 h X  ,  >8;`/0(z}p3RP; X3&S #aulwBR   t; \573 ;9^b_CtHh#w\q~r[|G[v{ XO>;g7rJ c  |7Z#R i Cg!r! $M A. }"\ui < 5  "eWe19\$L)O}lP!;tGߺ)܋R rvtlT,)+k4Lq  #Z # [ q   k Z_y6m1EJm[Z X ll 2?   'F ^ / ?V"u  :(q8v#&$>GZdyyI>G|&'Ry)]{< I  S   5b ' | a 70  -9 4 9Y + k ?   73/x;}6gInroA-l=o:R"f {amVd;.Wo&=R4(uuNj c j  M E86Mme1PHsChyg4Q  Ap2 1 5 O ,ZP3{' {K)%?^$ %}DYvt=A( .fXoW8Yd"+!pZ+/P-^Iul=xVv3    I s =A!R3FD7 |j , ^ 2 7 $ MzJ4/;k^H[Tmxt_.OU<|LRFw"'2b Ezb_YX,AM0uB^ O #$ f  c)`z-r*16LL0z"IS U N ,oG2kJP4zC*EZ->XdkDg1'xF]ss=vUPDkgx.6C E N #Y_K#>Z uY+xnAl^b1 " V W$xaMA^DL]S` IXN"{ 17n_w\dB2[ J6!P { >  W 2]#F r BAK&V  ? 1J-`YV2l,o'# G9 JK  p9= LaqRCqB`sTYj"$ja <  !##x}#O#n#W*")i! /! L'Z yc&22*  lX )pF+MWH_Z/_5V*;24FgZGio>hU&*tGR;8SVQ[09Ub  B  a a GjH$iI g$ 9< UC`F'w.Q<UgY"I  mL/ C" . 'O& ] O h = @ v ]nw J +  H 7/-      g9)7#=#k _]Jbep,XOv<8wO"tZ53BCn"7nO]w"e\@#_!/< {  w   hZ]l"8 W     . 9 q %   T d)p7 BiqFVhkm!kV((Xdw} Pln^~~E=$ w3?"qTUmo#U+ x b KC -'_J}`U)X}   o    V XC|)ir=@5nbE>O-@k.KPSqEYGs@Fv1q%(K&)gKXDTD {OlR 0" $!O% &% #P!,++2YD}  }E=PrneRMcFKl*)j i%4ZyK,c8/g3vpB  8 ^ Iw ? N>&7\vZ  I GUW \ , D>Mp0dd[7 |y$^Kc@@B'O|   U,5_ (8"YH"p#z$s##"_<lj j  >    5 P i #A?4tsKYKFiLt0x^KUv?R nxonW?NsOa k k { ; Y  Q @ g  _  & q g P  ] h  9 ,5 H k C )j*F 2%+ %L5r hd_/3H6AkI7<~{$nCPh9WGMp]TzKPC/ q L`G,.fifC0s * l];PA!lf"CL60&{cMoI`)(Q 6;P6=0ch<4Uw!z[JmKvp|JmS  meMT v  =  < |e  G q d m Utyk_}I_M a77l:4RXL[Fc    | 4 Nf8m{= qXbb_Nhi%)w_v.~ c z a rg sh5p[dk9:Y^7kݦO,܀{ݫk%[O1E,yq[cu G iu S HaG@0!!"#%$(q%*~'+6*+ ,I,H,Z+E+**)4*(( &#"q M0P  &  N[ $1qW^jkst5}zJFbY8>dDhNk/CBL( C tnfKj}\m0b  JEb6,IO.-(LH' 7 }  B z AZeEf <l-Yw::fj),/grbXw E1czq=pe"kN{DI} l ! K ' 8 !C &J;@k( z  34y&,8Vhj|&]4&y\SP | Q +*9Xy<UF,[G )K'Xg0PU$o 0bQoKs+S_8fP7C8E2I.!Ke(ts"Yy2  &S      2 l E e nF 4    = y? 2   @` 3 ,u gT#12P<1|^;7Qmge4$+P36&g - }B "@~Zn`8auX{OxPcoz  s 3%\XpGY?@)  b OJB`B0cg]aY R 6:~>0"C@w8 -HGg,A%,\aHRD'"SB r p f%e3?:d M H p | . L s  , [ b , ,R  ^ @p)6k'Ka#s]v|Eaw=]j -%5 "8"$$%$"%$$(%?%'5%&,$$#i#" bx1qNMG  4E5jq)_M% -$#L=E9Yݺ܊Qۖam'iiWުJBlL3"&$ F \Br[1j!/%7"R)$,%/'1)2X*3*5+(7W,37S-5,3P*1'.^$_* n&%,"[G 3 > QL~$doPYY5p!o/m B Pm"g\> 58i'c5aW^ 1M  qc/  b dC J J7osC7ax4NgKO [ J 2=6o'Ll.'!?]\9$hM y}rO\)K}JP 3XX4 7? Ki  f > ? ~ PNEqnQ(U ~ R 1k0"!bG$Oke%q01y(W>4 nn4]}9*) md<b@l*7 gp[Ls$*Tu1#RB&R(j?l@@P=3,'m G%>-M&@C Je T& A Q Aq& ` b  _  ^ 4:$ A  Vp-?h\fsH`v7l?c@l   T RmqSnXV v XSk  v H \`gEru'=A>{DbTO'9lSZb:'V3NhAM^SYGO7h3Pk>0y#8 <? G `B# %!Q'#)%+0(*W)d*)*)*)))')E%(K#I%`"Ai=RD OA/K t"{)zke2qqs.:eLv3)B[$HC  y  lYgL'Ke&zHlvQF1 n jt^ + | t24yOYos/F_t />P3ޱ܃ݛߌ n.ڭA\9y3-@)yTSre>gW m ,]!%Q&( j+",".#/#0B"0 1z T0W.j-9+G*& S  *^ ZF&2n`C;J+3J4O_xY}V*G{Y0Ed>PlY7)%TA)D#"3F  # ?Lbl)5h/z? me D  k 9E "UK?&>O[0&.k9 ^8*.GeYW  ,'&Q:H #* (V;[Y8h+L 7   e R    &  z     ew~?8G 17  kCQ@YS{ SFm&&wAz')#|p2(`@u "7]R ]o@Q^HN>nM=>elz;HYqD{_:fct7ox+K[1c J F7 o9Qm{v wG2 ]B:jm:Jq  w[ g $ ,   SLF._O_nI0)vLx2QL?3kC{DtuC;{esr0\//'s#_-c=!+ 5 2  ~ Z]/aJ& ]    8 f'Qb V~pig?v89{{eAW@ZWnFH  }  , c? 1 Y  I?xW1 Q'U$NV4 :  UMSKBX;N3-$JLtoR2mJHݰ۶wWL5sMvTX'la@5R:;*]Y [C Z .1:"{Pl>J d b $/n,2tiO/+W#(^ ojX?~sss&]W-|aUr:a v!o"\#"!ISPNxC|f}  (  `d~o([ ,izU/`i9AANin, ntSsh.O=p !IAUG+UwEw,j/\IR+Bag(J Z Ej  X  j  ;    @  *  k 5U==obE5S 5q7$u-g;4b "   ' d g:J@w F;kWI* | JwT>89rf HPVP\3Zz~WB\FW#$3Hl0{83y -rFZzJ[$l@l%q9OE8X@'6  ) ,r ]y={Ol'w[L=,nH R  s  as  1 : U [M 60)d< >  2g W'SJuG;k@H99?sFaQڜ\֗bܖص*ډ+3ޟYZ?w~,7U  ^ E ZM@`Yt;!""#,##N"">#r#3" ~{  H  |6&JBDU(,*yM$0@9uv-N;?G  i    r = C [ ~-;sqT~\d~p_ + )~@]v8_sid 9*uXX4UB@8s-I`k!?'*Zca 1"  % 1wnN\%% F :u( \  Fe#v.D})w=MgZU߾s܎ڄMfېp?!ٻپy؁w5܈deR4zL3dh %K1uvT+T a D { MPr"XY{ %6 M !!!!"V"'""!T ~},K~qu v' .cN d] +d!W  J  fH  t0K,j`vjq!(4m3;H8PKHvxoM(I*@uvl 6 \ 0 uB\cc}/rn;"XcD\r  e -%Lyp]kUU*#ND~g\=s  g 0 f<>Ib!" $!b&y#&#"&#'#g'q"P& $V"( sO\& 8 n8 !$-Dd pFYHCcJpQk(_Rki;Futklh pK ?, E A@&}o'; f~ L #.9T eJJM|a6  h   W; 5- D)a-5ctrqM${wWU^_;8ߩgI٧Hجp"o/JW#cWCGQ]C32T  fx!#$*F$Yq%B&w(%( >)8)`'&$}#" @+FE_L)q ! k @  % lGjc&.:g < ? ^XB?#omb-ݛDcݝc^~=rf w [  3.V?+ s{HM[`w2 =3 )BawU02_7(gaMP+eQ3x.l L + # EC H swIVufBYSCD'&?! W U59)3:OGCD}50:Z ai\3$*a(0> @a8# OgfY;ga$  a 9Wl2}ZObnJBL?6\o8 Wx"z7,f1=tAaߛn0ݓWݰH&hzpۈ#ݼܺޤޜou ^NZ,r  {3qO! !J! "b!B#!o# " u!W! D oZAlp)Y%   CM; ;GdoYz~4g{{u~}gkX'` ޳g;2z :2Ur>qYS'  U 3   A    8  a\   y s yo: cmN l   K^  'g  N  (x c K \ K  `    K w 5=E[Lc&P1wtWNZwl L>fZ!Z{k\"n?2S[m;12 *n~4-Dg(':oUNuSH, L R ]    T7 3 J 92 wE /OP/ <DY> s   H    I_t ~, k q&9 !7r@UbL/"2#?UnfrM(>A<y).aw 3/z  d%m}A@V:KT%iDY'\J  T -  WA N Q K 4/ S + ` y D S   s 3  H Qa; _`8#P,\ K}*m &))6Fke36j\ A ( 6))wFK bS^P&I06%-^: c=  + 9 @ :DDvh0ouqxL")EPcJK*q,z:w   )pLuc 5jmt4u5  Z5Cn6N@cy4JR"t7`*wvmW+{wL_FBQM`lt F % y=T4r9 /"f!k$#% %'H',)S)$*C*****+*y*V*A*})(''%%E#"t <N P{  +D pjFT9@^w"0Zt&5ݖ+ܡ:۠0۩ת;ٯ^CF߹ht=(nsFen&<>   LR>l|4+S _$  5  = I .L;jedh[U0Th}WrlJ3JJ:D eN\2 jU }u ]  V % Z   ! S  5  O %Vuu/]h"p&*C{"F>CsQOFcKp7jc~lSh~2`T j\)&}_dXMq#^XUeVYf  l  8 $S "gmS ? e. _ + U v X 8 Fn[G_-eD  :o>H]uPPz/>m@U-{;Enhp%rELa|qH+|,W @ :      D  "  b   a f~vLSsS39SD*W@Y6X_VM*:^9]+`$Rd=v}1*tQe K 8 j  [ v Uv>.V#:NHt@p)yjn  8!!W"!4" ! yrkN  OB)Rcje'=hSvGٚ'޳׽_Jޝ_Q ږܛcB F xS.^_ kU=R nZ O c~?Y4!5," a ? 5   ']IM'#,!w)q_H~)KsD5A o3R1=)X 8?I y  9`s_I,! p#q!$"\%#%%r%&%&$$!!kj#,`]$   dyEC:@C"go&\%0rKFނdܗX'Aޖ2vU8r0p U`qg|%M  v ] QC{V^@@1rW~% "r6lC4QR ' 4~=^<th7N6)#zv&[})s<}G F 0  o U  e  Qu   : Q   M 0 ( ,:F<aQA};;#@?ZrXd/@BVXhN[5fp!e}u]}bCxVufjKX]a-}S$nQ7Uy@ p    M # n  C * 3 h t m s$|8tJ`5d A [ 7  ' s v }>;;\Du$oz6~k^4wD$*d;tlyAqXMP<mGu)E|s :D? F) h,Qo`9S< JUS>)(7 ERQ[<C Lj.A! !0n\C Q  %  W9 o5 @fb<o 4>tu7 : >D^"J& Q ߿ܘUI߰`٧ޔ߳ݮOM3$!ptynFO( `"]PDwwWp @  \'f_dT k  {-m?o %AJ&xw4IX3 !q3 xWb=` U9aaF   VU0}6+s%N)Pl!rg! V{J~k} . gNv7e^- S|AJdZ 1oi%-q8pu=nh#33@ ~jauF3   @ s%{o  a cJ@"uo   UX2@E| \p?D|X{mrzvS+0U]j&0*7f}M^iX'ELX@  a Su ) if  Gw {h R u j xf;Ax  4   hhnlzjd Xh`hKOQ9Ds]W[*o[|x2 ![F\)$   L l  " ;  t   ~-T   u :    e A ^ h l@hxDs}  4  [ ~ f Z 8 b<   I/^/w7~e'"+30-|~n7P+@ E4xQ63A\d-?:Us ]N-js| /CS`} R!\d  v " y Q  [67   x vq,a\EE*E"w8O+s2Dw^):6  m% t  3   ,  ,} / xc7dx.)r=?ea#mb\yH/5L `5kKGEuubiJ#A{>3:%pcCO    }z= W!<#RH%' '"(!k) m*")q"(!i( &#!= H 6H3\CSWd(, K4^Nx8F"^z^/&V-Wj  , ! n Tbp\O{Cb ` N $ p  F,cz"LSP=6x]|^r$gz];[)bP Nc*0   y w~ R!V"#$l#B"4!!GYQc < a ZI'lPih8O.5"IS`|v1iOxC al]aQP)ZCCJ`iH(6A&  ) j q > =z s  >  1 Q 7  3 i 7  & 8?Oe- 7JLyqF^0XoM`lN Kl1  9 T x 1   -"R^PhC \$>;n_`4q.RUDB%s c; ` C?rg=8$jKqS ZAqJz .Jg.c6J.7*u.c2^Ov (Bt}9T)GJ4sGR:I  w 9 w Y E3;L xL BWSyqspArc{9rwBVn o [ )Y ] G ; US4maO_.g5+G>Fp.#]~"~ W;%7+iyAIo $H D?n  "   l n |?  C  ? d0 vJ{v3(% 8A t!3\@WZ m(xMV.O $ ` A ) "v@Rm] {^jNIn*Q2  DT    ()Cry|Q .OzMj gC-;P4r pM9=/PGa jd6 ^< @90 ?!&!,vd|") Y @> xtY[dgnGdVfl2o?e7)- _bzqvuXwBv\I1 :3  k43 8"W% &!(3#d(#(#$f'#F%n#F#!Y!<s 2PNS*$8 k d._2)yrf0rްߞ[cRߡH||X[_Xp4NM}^hzDmN0 w ` R` b  2 & 4\ ix  sb 4 4V_7{(Dk=wd*iv1=}4 !3,{>A965| 0O  r H 'EW]}rkri-\2dHg}H  M  $8X;|@z !K%FwmO2i?2fU)pyL    QS d  *6N&]6"5#.|fCk%I} 4 ftYTrp9y-ZK.[eudNS$ h"=_iTzy(,_BDnoTk){K*F/3 h cH'V\mo8on  ; Y  G 1 ? B  %    vfq-N{$o8 q(?F1@!k6nhi%TUimsKde_H_eBd0R /8W]   8't`qh+gJfFZ A' m $ | l4KK.{7Yfj&y.rl/*.(iwW__.T$vx}[(8 B  {   y8dNv@k /  #h z  d XeKM4N+?[M-)fw/8CU_Hj3D!QTEk* d ]glw5^~.+f3Q:d4O=jJ65!+)]6]wV!.o~0GB!i6d(0+0T ] W" |4TK} Zy-  : e 0 K o  - 'eKs+@(S YN> Ma  + ; J .mx,0RzI:qL!P Gb%KhW8@(   y}F5aHEG eTY5ju  w [  h @ !IC?PGifu@EzuTq2T]ߛ lRݱf]delg bk8~)WhE2 I{  =Qb6q!9#"%6%@(c'**,+-,-,'.,/,.+.+,)(&1&$#$!!AR90v- ( #,V A,#nl jc S^i |zp(LtSE~1ZI0Wbcj,u`'   5 A   ? Mx  - ibvdJ1&3 <$Y 2~x9rq6l(tcfޖ8ݣ>OS o6=0ݫދo8kDbH*ve<?&brEd<$ xT . |" 6 f p ^ ~"]d p m q !Q   M ]  g< p')j-(N2 < I3/i1 +#$u*3fO/PjhQ9,>pHf=8" (gsS  `Bg)oT T M 4 K  ' 1W 1 u [ c g k +  D b 5Ql:W]HmG&DzM!N*Ahl^x1* bn '"8iB{\yJ) w'!#%s1: u / 4 w   M jpi@220szWjwX   (:  ?I 4"=d1-#gnV=7R"(]EjpCfX-9SYh@E|cAn C`  K3Qsu%uNanN  .  >4.}i< )HMh6U=%b]Ow%,da?;4,vG_d(9<%e  0+*ig(WS 8"4# &")$,6&-(D.d*. +-+U,*+*V)(%&$# !eSS  { Ye%?<_CKyCoIQߍsފinww(q'JG$֙֝֔ eAڏ@4oreon''>  T#PWX)Vb!t""n!$6#\%h$%?$$#:#s!!  ~'6 "A }FV) (Ou_6c|:Zy t)\(s: JUb0s{=`.Mw v   rVrQA2f1+o , !  +% xZh^,90SlV|YGv[z1 3}B'OdUXKnO[l^%`W.5)I}\n: -a G i ; o C /DY~gKM8 &   `DqfaheIB6x #Bq 9>4a[L[n( B_  x9 , .%"#["; 2"a " $} ]#6 " $7bd g$  xl :, v I1O"x\i JRk5{(B}k/BNC}*vMJF V v    a xq 3 U )s  R:  vo  )z j 5 P L 0 J ' &  tb Rt t-{EWN!b!dA$>qnwb 'kKh3fb(iQE#/.N N  t I u E :  dq     ) } 4 u \f7dTP  \ d [ ZeaGqk 8- j B  yN<%ycdk:GMFa0nVf(? },GQzzLVOPe{ kq?y0 bT"eV}G? zd Q W  k1Z`@\{9k@kpq.kxo}]zY\ x $D Ss"Of1Dz& m0x.`V^jiq"yd38COJ:CYD > <+1yq" %"(w%+(-w)/k+/o,/,/0,-*+M(v)$&|!x" ZF`w@x  K W fhw^ T|CN $>`AHSt.'%V'ޒޟߠ-(iuaZ0M]+Bi|a{v  4@CMu'  "d[2 # J =[*kH+n~m %#ho)H?f(WTelhS#  n    2 2 *   H t+ipX8sOSP3&H+   + nV"^Z^l E;aOw[}v!buGHp|>>Hy0,AlT`Ftq4%*x(5/SMo0i I a ;  G/X_Tl;W-hleWFr-/ tEylaj Vm  o  | 'X[1Krb;-WO6(W8w#$:eo8W (Z5dbavz_>p6o5&b v _ `   q  } N% bW bN 8 n5{[mrxN'1ZW]b;D T!Eo vp  :.5@6y>N j zOdn&E_/&JZ ^   {; g &  EAg6S2gL~`A>`i 8uK-1IZW%aISF,`%+ "  x:" C%"S'$=)&*&*$(#&#%!#j /Qg q|Y\;l &Hr&(6)*![9b U )Bz])fl^/<;\ U R1i "#$Z%m&'{('&$h"QKBvc>  8 H  }+:  Fצk.kgTڂѳeNы=vТ v߿׊OPz[jYI| - y p/r #!%;!l&"]%#7&$$&r!$S#= NKWTNs 9i % X hm4W5B(afY=Cs7[7"p9Iu(Ay3gO?S%px7  }B f =C\Qa `&"Z#^0 `  T >!+l1bhz>\&&f9Mް e_ڇA\sk!MNg{@i4r 44AF|DvI0 p   .   %U jt - 1Suj#Ak&()Q)}(&%#""y r9& L 0OkQwrs% &{74 .}Q .]f"?\Mz PFRp~h~+@j @0P4{K h g"   3   swPE s@  m DXmYMp,:#tJ ~QRE y!6N.bg3,tQx|n g&nH'/!Mlv4EWbk2/*~XzEK";09K    V V"  I: S  {  * #  ;Fs*nc=DV r}~LEwrBS&A@ ~/n5o ' @  '  ,dlF"UJN8i:C}7V= v a 8 q;\?9sE)(@JhCD1 BGfUz~     O BV "#j7$$##N"<5{% 4 . Sz bIp2s(!tzpP"V:,-f PA Rbea" go]*c95whW S: }m C  CQV"p< ,F"z3{O[0G  Q r,.T# t xu _& zE9-d(C.4..pGcDbdX}? <*zn\T~d  s b  p/FQzUAV3J /3Yi6iJE"Kn&f)*qty|rw|z\83[   [!7J#z qf  R E= 6   %  G#.p     f n#U('CU?.= j-0 fR8#9*(QfeNmZ~r=/Nl EpK n 'K 8  R  5 .  = j ;'o%&   } n T F + h e  K Hu#2.X"1+rYul/r=ZvI) aTxyC+D^;P:1%U s8jz fi8gG-U@F7C% a T   S1 1H  t 1U .VlzU    2 s ?jC6}d~ =6Ma*ee2WP"!(qaSa!}]]>7SF)KuwQJ8?|Iaq|Gj 6 3  %#0c$    ?\ p  b L 4 % S6l%C: 0^r(#Zq_a/J.%qj]0l ` k  )Q mF4? FQAm?F     ,  5M  IX2W[/.'H*4%W#qT { ^ 7>3[m+s {W:92 5M'?rkcAs,~ h< e`, SV C]\Kyy"v #!#"#"#N" n @T ]Ks i V m~ Y{(TfL=A&NZTSbuE|77"XA!/GPXN/?Q, \ l xMYOBbuU*<>">y - {  ^K $4rp&3C^0l<&0>4A SY(s5o} TL}p\  q C }d^Zc&^mP6  : (h   x-+w[ j   ? ., e C D- v  bVnc0|eF;yn@_Y`#exlq+WV{6<ihI4x/i`C~Erv@T1| (P&g."X 3 L 99  6-XO%@ ^  :; J 63D & S0 ^-kW7@Y & P   71 V|)@k ZAN;MqM3K2f25@]}3DRJBVZ!'72/9yl-XA/Fo0cz     C U   &t  k< k    ( 7  C , I t{rEI'_Zy[:S1d]QI#G<9h#V7B"w@e:W y ._  0r ? \  xzCN#F avY91os Fo(k6w23enK6/HS {7HmX2z`\6  P YuI}%XdL!l"<^"a"##"[!,8Tlgn6-i{ ;/|3+u8@XPf Y+ X"&N KEvQ$ Q Q@l  qkrY2;V 0m: )O4  : b xhJ%t :UT?S_|2>f;*=Om7^ )vZ-+T-ufg  c P ^ *{\D1R -""#!$$$4&C$i%|!$##W"6 l k `  j  '9x 6  BLRPad& _)kGmVh1Qݾ?!ݭze9Mb '07gpCi e ! k BxvSP5 83.  : ` \pYJ\L. P@C9HoB sHdR](@j w0 Ta , LJmh6 4  M  )L#ANH C;  ~Yy\U>>Q M-9\[0l0=iD 0d~ q|l<)$m'Cn a ' /i7 i T  (   =,&_bN:^{a%'tH dA   t4    $ g &  I6FM!{NFp!@<9nn sg,wG1/qFXc>[wyY[T>B(,KK_ fG|-7,,[ {H"S&J KfEM8vQoB wP^ =4kw!7l O?3|^KC:0(Qm@XnM5RU #X0t#mXR_"bw_[%}.OAL^n [ k jhN mfnm( ;& z0! PC ##_OSs$_1I o/Qxt)&X-\-X! : 3r \*B  {!Rx"Wy"6x!!  O! N! ! 4! d`ED=$5$ +jgwRW Z |#GK [m*߂BW2l$90@M7 .W > \W_$8 4# y$4"8$"#!"Rf![` z Q: f W qT\R1me2!>Y[ )ld':Ljz=Mx~Ya\=2G.  .  L + c Lip.PI}^ |s3 R# kX s % z _ # ^ o  # Z2tf5g%?r5v$7(pG G#TF upL;B / g$_ x   N^OB|1},36I ]| U  F^xT}Jz=?y#1 ml"Tn;RK 4avJ6Z>m*@EqpmW:"7&{ dh: N ' C 9{"~, " , o  ri#} H `q ][E%.Fn3{7 ?DZ5eT5l-M 4n2IzZ/L!bW#6d3(z B}Wt]Dr[\"UL  V ,} I~T_   h m g[s2E1X? !TF*g[Sw/ HT$X(,(l5sv ! A%  z d-  g    pi 6 V 8J } _   4   ) y/_a"AW  > 9`m/{P%d#] E ~]~qBGhx`P'N{SvU >_Fm!QcEr1yd߷Qqܺsܛ}ܩbuN h\,ylH>ey B c N Z < I hX-~PCnkeQ$[7]\JW6@5  r 'ZVVqavw6'ti*ok|rs"P,%  } 0 < mgt" 0`/vhC5j;iP 6 rZ| )/jab'&ބl@4p^"h[rsL?C ~Moc?u^3 D 8 H+.Ss E""eQ#$&$#" OnEhP GES ~aX8G<Q:ݎKjܙڽlm%(ElZ*@Jl vJ{He "9".#A###,%8%%v&&%q(#Z)#[("&f %N|#"" J3m Y> $r*B9=cK693t5")BASߋ ށ%@6\a93܉_+ dmة$O_o fo@\vz #~ "&#4*%,&,b&-{&/'0(1)0(//&-#;+!(O &11%>q# i8} f X9 9y=`\C`3?6_ qTw)N:VP, Bje[_i$ E1^E4x/O) D  / p   a ^ *h  Y I`RB>h: 35 +HX\/ksqVvF 7nmh0=S_yX  { 5#3+1p5Py0'   ` >!ua4  Y  f2 ^ #X # ^L 7jDKTGMSDPhe^q2L 0 HL?dA  i  s X pe ? ~ " /      ib   5  "A  Z Y ^*X b R5OOq6)xf'r,$6=ln&~gUo E9^f'rcp )1p"$+&=*),,.///&0Q/0.0C.2.I3.2/S0f/z.9,~,',(#! Y ,*B(+hk lUiA"YKѻ4[u֐ءӇ}5ڍ ݙޕ@o0*[ x6Y :Ir!:: bt- " ~#J %&!(#&B'%F)>$)!))(C%)c$ "  I-&w)  52rFrHY{_z@XkI߉߳{E?j4Lg_c2      osA4C(5 !#S" }!q c  n B' 4JBY*$*sQ3#2h!X/<"QqmA`QEQ l Sh F v! #<"{'g$h*$f,$, $,z$,$+$*"(!x& X#@RwE ` k  o@C'` K#]FK/kp]4"r}AW3A\%ZL )?hh y|K rN 9d` (`|8   ,  D    u 3 &t J;xtgYVP.f*0bg}{L i[&1/ZuVwr o fYbod?Ng '  * n_w9,fZNvy.aGdyUc4}  o 1 (z R [ G\pyv:M6_Zm28r)Ve!4h' OIvAhio`fg ? P  } P $ Xm s O  }  0n J nF!o"uc\3:tc2ht\F]^~ H 1x ahp)EN?*Aq!$* 8 S\x!"#%&K' )A(9*k'b*&)')O'(''&b%%$"e$k rz ]a: EA&#G9-\('`#ܻܙܾݥݼݟpߘݒD/^0ޘFBt6 p&xZ<<} U f * {!h m!#"##$L%;%P)'+(M-n(.'8/&-#+0P*:'~%$a  h >@7? .yJ9O|oHxU&w޺Fފ3{܄U[߳=B`esW%v5d   " f_ 4dSN3 ysw ?AQP_s / v|fI?Mi~\cNOeo-6"<(HqVQ.AF='JU_,&  M  zGl !!{"#$$r%$$&W%%#$##"Z!nvx%{  p Q 8mj^38p1oYApg(~.lo-'6ui7 ;Dqf  Z |   [V    k -K= W?%gpEZU[*p]{9 x S 7X~5?HU)4ܻ7۫ٷٱڲ,ۊ` }Ns6\L\j< Q81)3ql 8!""""!X! .w92D^]W h0 /; 3gRw&^Yp$q#u: 8D4%gn?Kx\9Li_2yRXCvGM # > 5 @ Q   T4W]V  z u  +   R  +   ;"n]E  05 = V2w~4N>Z87@" 2$y]<#X9 99de  _ k  6 tr R    5 N r H : G 9&x#xj, ni2{X-9UJ>IR3g+ }fSl']N  ^= *$B%&p&'!&v$J&%%&$&#W' #%3#"%"?#e\"!.3f> tuy-6,o=xj;jAA]C,u"I"o#ݞݢR [F 1f}2K MJ|2,U. 8 ]!"#"$!+&!('"&'v"&X"&=!K$ ,Go_ R4"l=r1;pUx~HwnM9$}QUhHl+-?Mp{5nE0;ao  >wd& Ug v 9C xQI J ;SU rz_u1fA!@+(,.mSxqg0K:UJ=KiIy^ 1 {   k ,!K4K5 Y'Gd k  U  G 6 u jB46?MYRZ=g*, T*S-StV,+%WsY"sxJ`VbPFi:$iS/Po MTX4?_0+  O? n ;[RX  n 8 + ~ a + U 1 z d  L 0  CR  mV  o  6  Z  T~ ]x   ^ P ;u*p|hTpma%CI2#9Uh0 ^v*-K91<&Rs:  = < q  0 \ @ 5 u   ,  kp q > 3 ` &(3Qy;.5P"4MRFenv'G xn@ QiF% ' ` ( A/7|Ts!&h3RD(#-U@#  E  .DD1;^xTGV9>PEbEyRR9 pU3#mP{Lm>]gZEe0"B  @ Y > o #:#M Tvpz$z~*' | R ] ij;p 5e zZDmT(!VWj AR\.0^43'nYD0sf% ){ ( n  #d"?%>#'#)%T)%!(|&P(,'(&)/$(i"&%g%W)$L!&= 9c(Db` sWFI/ J`0KQ܁@YjP " \S9MR1>h v =nkP F.@7 ! "# r!/ dP&"a D SfbY<L0GKhgk6r-6RKM$0B*T} ` \ B 1 ! $!&!' ( *"+$,%8,&+%)!6'%"#1+hu\  iY5JfN߱#Cݞܩߒ$ڠjW h3T=%8UvAi! X k  TeqQ 2txr }"#{#&Z!  ^>/Am    NX s R|I& 2k_TH%^tOoyt}#e8D8A?'kl4 U o A   #d 1 C  - [  5oF n r +f*/Qb4+j jgwt4Da'+nJ|xYvB 'pp0J*Y8gAx|   c . G >&5j. (   q~ _w|~5/+fwvC(v r]BK=le@C&iNGr,/&DMfqdRRu8 pz g8  Y  6 DS: ]9 X6   5 ] WSH Im S  ru c ACil q Y M" 3xC` CJUނ߇HH*vx&27wFW:T9 y  FW^vcrT;2 9 [ u G4!HNiV0U@J1 `hw ;Z,/?\ /l q8P{3  4 ]`'Y6U[!$>%% V% l& ' /&Z% #pzq  0a2r_qCYi?C}fԻڴfۙ4۳ں9UЇٯK۫M8{Lڟl%xu|R9EV6 A$< v 3Tnok'_3!|# $#$'$g(Z&'(&)%&q%8%$f""L!LhD(  ^Sm  dqv$~99j@o. " }|^Ielu--(H2 ! 'z[]TWxDdf`m [ b JNh*]{lw<mc  (]rypT"(\'K -)1;=Eq7]4>>`g@{?+k8]^); - qF v  ! s O `l 3_fV5 y s = \gGHo%0u1d0bV>aAeB4g'Wi;"-KxccOnQ3;^0:-Bzq]_'GYNJLB/^n%YEzEb8\vTz t I k?Z?4Yni`~Rf,+ iBjQ7; 5u}v5i.*;W_+5~"t)1+%1 A =   5 G r  9 `a   ~s2Ap ^E/  [ 1 xO+9Wcb[fJU4 n)Wdw4(g9Y12z+Q3# 8 4 -  I [  R qD *    "n ( m N  V {qWo)v<iq}^pmy\spG;m\CuA/5l&|rP;5q.;*5`dwZ_ 8 W Ua3!'$%*&&m%B# !4ff% Z = W  $AQߔiނߨ2(WA{nplM n WHTKW$}!"f! !!!!KtY: >b n %tl4d|(jV~qTSD}O* r%D0S7b/bifK#1J>G`8`i    `n k#jf+`]    B y   +3*kYE '+}6.^170,85n"b)/KH6|MA.PROWTXe0#UPnlc:1NATh*{9p J}Z@Qg(;?&mK\ ]O\)vnC]MKgCBuid$I t   ( 7 ~ B !:q B K c> X  ) 7      k ZQw;=hTe(DNA7J/LBeWU *jca 0p7F~a0RB/{{ETw<=~+"{>  Va V a .m QN K3 n  p " X   u t  6 }|  < TM 1   .@2%2axEqzYJ\4 ~j b`|(x52:tw~?= v X  r+6r&5ht T  Yw60fi1:V KX1fRIrKޅD޿:e3]%2y}1+YO  Q A#Nq= !| my!!_"H!U!! s3_ @ Q/\ 7cE]b A5D;k(o;WfO3yiq")s%SUkUU3\s=}Mi\N  'zO\-"#tQ$ $$@ $ S$,!$T!#M !Dt*/ O WzbG)L5 r#8Q[+V#^-uiDc[gs{%}eQG5AGD7 # GJ W#"&#!'n$;&%%#0%}"#!c"n!] $;~MF ! ' O0mXPjeGRhW0`%x3+`O7>vv fv^S6x<$ ~l  M>  3Q 5'/cb+}e3wfT>yI{))SeG6&k`j"kN+tl= RFO-{'2Y* Q?-sW{$-W&Q NU9Lw  X `Cp}J oj' K x "#aA L*fMia> n^s,=BJBu Ev2>2lm!BSL{amio/]Y+<, :;EI 0 -Wn Z*S'fY' 1B sg ~_ I 1 A L  "  /7k;"}y67@-0i T "|   F  f )3  KE Q  L  yxz5y58]#AqN0#S1=%D*-FhU j9sC$C@G4x`@Y?t r{vn&) Q/?w   . | wU '   Sr{W?|Hj7 G_ Hk`@I/C'GFk q۷(a~wGkQ2zPZ67k*}  s .2(""'"@!P b tlK"aVB1j , p  M1rO;O9q^2zC.@S~ ߤ/]Z>qxN@)|053H?X`BB} j  $8&O "#)#$#$ 'x%*%+U&>+%*#+("$\"!!c#| sf l(7s jrL -bc*X3*M!SLHj!;4+'e1x2sI}x jysI cT>Z    N ,G  A]D#tK.  VG= bL]\b)XdInMSq;+O#1x 2K: ZY4D+ ]  cvRH5/r QTnFkc 9HD  B _ * i L >R0KvQ& "4o>{ h?39F e;NEs~14I+9 $C|8XP}2 `*$L% aI  ZCy>1AD6yi:l>+3*3^ ] &  M 5`  X 1 E  ?S _' *h5g Hm?8;gG%JSK*  6 t    -t $ F  O  + 9@aRZ[8(20h^+>H,{[/Cwjk8w}`XV{ d'|;9f4y~Ms.s>]C't> \ _ ) ; -jo]y!G8%h p ]  {|]S2baR v#A=gNRM&0le#s1X[! Q  t#bKT[.# ;  uL4:I'wA^9c(,FV2;7>P\?c@By A C gPctY!8L""B####5 # `!n/ U M    O c: K )5Q!5`w --Iz!*DqtjYV =s4lhcpKrQh}DkV4 )15  @ D6 3.@0[ E { Yry ! M| K  c h     =  FD "  fL z  >  x) op 0 $/  ` 9k j9' hDGHZqQ)m,{1BhJ21?`>V=Mgbeah2Zf1{4^K_m}W    @ { J * 6\G]u:x/VCqMbz _PA:` WZ}@< GBxXni D W0?00![c#uNu) oF3 DkRX5R@hH~_$j0 ( Ah PON^y(eCF&V*|.Y~n  Cd 2 d  J B l h3<5'. RrM-`}%}.($qڇ]Wےa n`u8~\   uN%6 Z""_%e#"'#J(e"( (j (''&R%'$a# "M e  Y\ M> e( % r i,VQJvtg$G(K\r$ޯ~Ljbh|BF,:v,tlM~eS  i t#  !a % n  A = wUpJ0  n  P!+ Y29 l[|/|oH-^ ,fnIw  6L H^[^+[:Q!"" Y##]"!!b +H]tf h b Ip<q V\: ?Q[k}Tr1ZF)ݸJfs8X1/s3^M-5T6 E 3dhHJSRG5qe Y&"c!E Z )uCOQs YD%}%2iDgBGW{0 XJ~lcs"6*+_9Q"l,EchQ'9Bx7j^*Q6;$C=2E/hwrw*|NtYv H[ q l f ,RaEo`VAd ?V0-s&Wd.#<P)  _  k 0JIw[  q`WXwug\*Z?g/'p LDQ 5PCovO_smW}8 >z; yg ?Cv}KTsxO1S8<   <  n  s sb42/?q++LUGInv\U Fs  f 9@ a? UoDzF t)@`     i] [$i]G7(W1&#h='q/e[K|)+  g/.c\BHS!Ka"f!" ]O\FO - 99O']@~xzvHJT:;c &oCw:<y] 6 ~S [ '&TrU\` Aa< 7 HR19SXUcC2S1A=v߈ow~mr:۽ޝ $fZ;>ec1 !r  ]7es7 "O!2%.%}&%&I%%$$1#"T!, z +M\ F  ! NA%?]m>5\\X)xOfu"TZ/7R1 W N  ;bB[ fe-V &{t w  P :vt0MG7ZENZz*OPB1p\MJ!j! i0*1I0p4x=2:+y= YPtGmf.^WzHM3FeRjG*GM-2)#5.R' K9k# [_}rC6z v1uZ &  b F a @  (~yEhG1{HJ}7>f Y& B  N a5      K :A   _P:36Z 7L|` a1"4*C>Z`euOs=X7~O.JLC~^l== cCj(p[ = & 9 R  DM]FRhOAV/tv.3n | m S S `jH?y("sTOz<3p\O<LLc%I+b;Z6dszyS<^n&!3u-N5u]X*jGWMum0J4 7D=nXO2,M9aFg|lrGR'b;@k? w  ?BT)F ""'6$q+~%-&,5',()*)()')5')&)&(Z%T&"#<Q{;' N s $9 |<=:r>d %q *e`?U0dI+0/!j8N?B'F[@U82zy:Pk*y! w / *["ZPBl_(  p  YX8 cpEpx$OaHpjr @~f08 ':&d0#hfP]0)kqqS6c4:/J3t ~ ;D  J & 0 /   C 5  W [ ZA  F850|FOjzZ 2~A;0QkcJMk<M$"afeW $ p5K {i _ D P +/0PI%WTO =n$q"+[g 6u IqNq1!Mg(i9yzT6QPYXS^nMwxVKv?Lqi;Tp!W\>^wuN,lvL   !{VpAMwhK1>xVm?2 0 q ;,  d  daKR7w6g{zDx1y n4 Kx_ !x-TZ2iqB5\Q]+z4 O  u  \      B F >`}Dmg-u{F pGYtFAL91(YV2Esr)A~ o ] s Y 6 Jy'q# yY R.8;Umamzi  96t\n"YrMnq ܆ڽٚtٟج\G;ܼܴܮSu3@[jpH4K** c'ygEKS,:B}R6=q5  { 'uONxTPfLf0ov( r1Y$46/ P ~ A      *#At9hZOm6}O) rQV0K>olqH=vhM1Qy4yNP/3!6*wJF" SW t =  ;Kri+Q<~M1p`X  `x [ P ce|b+|'4:@8N?)q+`OAU3| ] N [ [ m  Ho  eAEr<L.MrbLn2Nj&ms Z?f ^{#a; Gq5  ^  ? L  U xR   0#nk_jMJvQ_  Q J  # K ^   >#9"&#QK4T^izmU 4> ^O ;RQIZJ y Qk* D| F$T"46 @GE?g,cH$Tv I lh ;J/V1"d`B'I:7cy6xL'oC)h0@_ 3Czp"/,Lt ^!ppF\aK[x009Rwl- ;1:p#<z_ GzF'+W^iI _ % 9  M/YtogA@%cZ> C - Is lg 0 Ehb?Ck)@ !%FgU0LM `&o2wS-  dZM!.l %!/!iRg3f*:M  - kX Z Jl!@"xR H/.v+G XT!~\Nl-/9)&{]insa EbH@Kky 0$  ^ )@-~iB<75(+?3fL 9 {6 d  F u P3V^|pG#P1v l'3)Kq8\zOz B  ? ) `  D  " 7 {   [E=4Dr5j6CeJs+NZR<y'=_YE_[piB(r'$yqK-p3D   m E }l=~DR .1`'2ts55 T 4M "COWBP6|_srXK]yhC4,h LOHcWiC@;buRS;e|0!7HCM| &y qT {  {   t  # vw _  F Cg 9   o+ \Z  lA   * j  p ~ 6 R ]'&-8&0 [bL(Jo{6 C-D#zOpqnZd|Pq q {T4r z Qxk8'rbV <u <  l L (mo|+*1ATrcrp0(T=UC!N`H1.T^D?k9_~y % , l  ls ipK"Ua/ 6 lX ?} . cb?NnyE1pwewgix(w_1d34)c,E2Z a }G]Op !!"/##j$k$$Q$$]%#%"Z%"!%$$!2WX_c   *^(Y8jz: n^G8Q|5|/>fE,ke$<%o~)  tVyz "#l"e&K"&a#%M#$!#G#{!, KzXq` Y wB1%(q3sr FCa9m#z'ic2[CPeAsS( ?fZ V H  * b g -L{;/!.*4'aF5X 5 'Jh5 ,H!vTH&e1 !FCY  4oa  B[{#>Ed5H``Jkjhu   X * >|u nMC[l24-=0f%i[euh/cRPu4e 83BdvZ^y5#w y e     x> F Z F QS E  A qq  E  Iff@*~!L0&>?j;Z@Y?  s Q tN s WQ i|4>G/ If@Wo<_@$?ULrCq c | x&~T R 5Aow.mo  n  y  R*cT$.]#5  O\&rt{6oyB 5  v L ~wC 4KR9Qd] (W  ^:C. 9bE= 5zZ9O)vn2\dIPoB&{ S>wGg6]]h;vx#KbxwD`?\NgTg~&dJ7]l=p)&VPp8 !*mYD21@L_m.@C`G(Yj ~ m vb[yn88{NL  5 R %   uJ}Gm+ZG[ksacD.߈Z+ pQ3U w%UN@ ^C]GR~3U?A$"$  &%n%J%$"JTN' # W   rxRg75F,"yNQ#uI?G;@ $ntO=G6;oD\N- %  ~%.{C44/@j~#.   I  Z;754=[S.kCv#4r  F  a C ,  F  2 = 3 5fR|J  LR9io~?9L{'%|sOlfZ>CdW(rSFpRh  g 9 c m AY  | E g Y    d# M ! p{h  ]  w  0    > UYj+6uEV}uLJDPgo^3w-[[AY%tRkeaG^Is5pHCzCaE?Z ]Xl jD:[W|ZgS7$M]I*Z1=B3MNAhE^Zc|xY-yYVmZ k$kJ TzPC;Lv. . &  0 - . T B B * N    K D  Z9tM.sG  >  y  jY4DTgmS^+!k'pq=T4!&LZ2z&?[qz`Z h > $x8$sxOdWo>F P A@ 2 ; % </DI6dU w7 7zki;IN0$05!vX<;b$ + J  N` u"%&;(#( (")"%I*|%~+8$k+-#+")".'"&"$! V:/$ XCRzb3.q")X"Zڧ֏ hԒ؅ՙ~QԙߔYu{8.*2v ښqE 0Zo|JJf4 % rAh #U%E()!)!)!.*""*#!*`#)"i)]"B)C"("' 'DX&$!}Y&DzFL E #%-x8o}'h Ns!2^XWxIE>,S  ~ I( O  = /  (U^qx  Q yZ|s b  c5A:W]u5NgRU(mw-N9@`8q\kdi Sw | m h    !   ersqRN{ L{ \=`A[z6VBdUvS+3C O"g6{u%!lx& $  <4\y  _7   $% 0  0* b c ) b % J 6 _ {] .  6 l!?&":yy a9 |7Bdp{S;wE .Op+p$M%lb|z-kywj$v` Mx"Q7.|   e \e JT & 9  Z   %}xfw v  C>  qhXVV}b#PBtS>h9* n  bpj w Q$-.lhu9."_  K  ` d . `/nUhFFeSd$o$*0%x.U^t7c;:kH9w|V $l : t  _k!}%>(!)#+#+%y,O(,*+N,G+%,*+L**(I)''&%d%}#l-@ o &   Vac G_lKe.7:Pia\d-;>l37H(K4Q<9 % 9 zWj,trJb( )X { `P a&RaXo gT = gvD\%L3 c0h>+?<^(fb0;Wv2zT3l   \|>9mr!$TQ^&, $w M *  ^ ~ K $t 5K~`X674]l{~f-^ v,q6YHDf"\VgSuZC05~RI ! W Z -   f     ) g C V(WLAqP)/ z+/B+!}j{W,]3bHt Q ~ *L 6p   P ` E3 ), 6 )TAV4L ( @ O    . F  ifF=ykX6dk|.vf-hQMRwNGzN0"5Fs7Q,VugZ@Me5 H(k#)kVV_KZr`RZ }1yrC d N }t S${in\>r)kT\1OvU 5_ mZ  'dBtpn_}+AzPJy?J9a2Y WybK]VWhUwh:{Kclw%_QV~8 +8e@tt/wH} c1>D=.h8bVd ]e/J |Pl7UA|?%{ 7 qy"s B .PC c !.!x0 w- ,q!"oq"c#'$" #. #z g 'Tr P0IW!.lS52.<ދޕߪߴaxݵ)N)U<: P Q v ~# #P"$$z%%$&x$'$N&N%B&&f%'##&!! 8F2N H%   /&8 .<K,>tewr:e+d|OuXLbeY_XMxMj 6  lS^|s  ""$%&|%'$N("d( v'w$1"z1 8j8I Y t #Z .k5aVQk .EvcDx_/JC`"0@j|: #  |Uc 0 j   j ? ( -'   ig  #!s>uq87)R% : "V^&~; MMa(o>|AY {kwSt.z ( G n K~ s 1 ( ` ]   5R   ~\Ab_*l7 j1zTeBQR}bF&]=Y(1(O ' &CK) ]JTac^ ZD^L G?Oml+:U 1P;` r 1 / pr?< f|i0O6|   BfN/  0  - ; 1sm:QT I72l2lcAZUO@n=_07ZUlI @ r q   D  J X p   ;3   rO/|+( B %t_Lg}^[ L@jDR8_2Bch-}iG84W 0 Gx Y F  8 R 9    C xz]h  m ! &W  9b {   1bzB<g)fB |w{\nqNR)Jsb_gW  * I L`HNA~[Q sO9h n  p   ) P96xz,u(r\*q|wT^GG~=2{Sh=Y:'   cJ5Ezu!z<$!&"R)#*$+%,l& -c&,&+g%)P#&W! # .yzQc  1 E@?iR$'Cz**5cLBC"4~}f}r RvHlR#: [ N =  m ;,  <jhNK'Vp H   > k  i < (U_n@@*Me!Hqv$3wo{AL$pwV 5c/,o 'vB6YC zT  rr C{=)m"  N t   ;H3m[N}w2P/b(Y^kQ(Q<:y9PAJ{)WWwouN.8%04|c > O B q 5 W  , - u j! ; L ^    i v % B [ b X  Y   7_ 4R1} oNK!h$y~[L'4I_^ g>2-DD[-g\0 |3b(NII+RRl {#1fO/Jf  |  b D U E X z `  < 0bv`;ulcTAvx YLNx'?'3)T:1[ 5  q1 v k >ht   o 5  : L  sh N)'UC70|F ;ZQA@o4bYXXGs'e2.(E7/ {=Y#p(!*,#.%0%0%/%/$x.w$.$-%+$( &[%pm"O{~h % T ]-d}1Nq!}ߖoMFۖ'Yяn`n>{<Պ֎|؁ڵng߬]9e*<5tN |;Z5M  w [  %z aJ&Bx c#d%%&&'D'&z&"%s#!n-8'V* m~  xiva>_/2/HK%j:|"`8H|^J3 ;  dfc,cQ`$'e)kcz -  javBZg91K;N~{@P{SO=Hz'39`2p-gQG7clMuL 1VFX*B V < M cP1+@:1s\%L3'$  8B O X"N qM/6}%F)i(Ixg>_w?^P C!n1r#T/J+ 4J/}lYxag("Ok<7 # e d s  9bd/a F:.  q?  DHi&S.xcx_pg=?1X6Cq lCea8C0}b0r@K+|8u (:-   u '1W%' l<%^)TvxzxX; % V m _ yHw\@HZ*E u "HzoJykp9GYTާ:ܲ޲La4ٶs.dN@*(g"4t@Np-m?q\Rv]< PE{k!"$S1&!'1$((o$'#:'#%#a#g#!'iNj> $ ~ -wVeeFޮܸ[۹ڹݱ6ߞviߍ!ߋXH"F 4<0    f ?{ pnUQ g}  ak | k4*r_1] <DV$Y#WX+Q'8rmkE=kY\IewKw^!$W, U  9) @D! ##G E#x!"# ###"!q!s!4 jm6K < Y tq\':2 =z5B.w($O)%)f&;Mi8Pnc0KiRO ;  m.X" P -_  JsE*c> )  r;^36y./A_!@"ޯ ߙ?"h8!Ge4R6 >2 ! &  u&w_ySL   $  ^   X 7 w,6e0PX(t5 @S[X  i  Aki+7CMOhv**!q]` 7E_S$v]Q\do'5*CX*>,4-thRU}-dNQN;`Ut $W:wQLs*_3Er*EPG:Gw o 3 j >  a A Qc E  & Jqe  | P "k'= 7Vn3E+:{4}R=eLe4sHj'O,K2^iW|BGd% r [p\8q{c1WEZ%m'b`{Ds'R2hOduS)+-2 --6   D` >  dsUU63 P  )g ( _jt4d %['CMh4i/ Oh3)>zU(v&?N}_."Y7"96 T ' >`mS@F6HM A!=##H#e#a#h #- =ZuF#_| ;j  `'G2-&I]:5:nWu>fPE4C ]#LgHGm?Tji-3^ L yg L v? 2.rod*yrB a / M , ]b%=+3l\;^5l*W72|upzzc!C4[p&'Kc_W@ujr= ' 7K1#"%>&&^&6't"({p((D'&#<"C+6n(=+ f k ,c F 3HjR .Ca@ߤ݅Bڐ^]&!ޝu>-&T%e]va02V i x 7 d O f 8   Q T   K V   C \ /\ ( -  1\ iM 7/NDF F  'Us5 LHG=hYjBM uII7/4`x  oyjje#"' 5 w P \T ^c Gm$  S+fX\GGwa`7AG[]ZRfT Z%D ( g F 1? <=o&lntu"\v2fD\G h  D  _ =U N - x q Jz j  |smgLh19ST .+?Gy9@( -I};&;%"oVUM>d[@@d{dY~K%S e `y n ; "N"x $l"q&#%#&%j#$#$J"Y$ ~$#"Mzlv h X Y|"YpB&5߃޺[ ޴5(SrS/^OSSq-5d0H+ Y<D<" F  s k2v,NN!]"w#L#$$#E#"]!hd($F ja u  Pz8RRuBz.A" J#L"MPpTl 1R m~0knvSkJ _ r  1 Y IRj 78    d  p ? bL.8 / tt9]\ ](gZBMV?SpMXnNXErbk( / Lt F 0 C P p 2/   < ~ r c \ , " ^   Tu< tZJ\pMv;Bcu~ot^UDqbPaL'TXg/gY\$)-H <gI9q  %  d  Z x  E>H 8o~R 9sR t?xw ?r({",5 z{bj.\zJ4!L!kz {+l! G M |  s @Dd5$ 0 *K3B<Wt`WZ8qzQ#L qO Gl .WCd,lWZ!ކ N2qg&pj*7ee^c0T5O[}Y|9  z P  V #  L a  5 &?BeV.va1m TC Z }  q  v5S^>$H\gNH -dX/J?>p7pOZ  t _6QAP\dAv~|  n c #  9]zaD+#XEW"I5pS|^c9)zUM4H;GBE8qs :) WPbc&!_"rq#!-%#$&i$o'%)''+(+)+.)k'%%M$$#c""k(! )G4]_  Z /aalz:0\GtymX (Lo|VXur!WaiU2c@wnh9 * 6  T=^IV-Fjwz 9wwg )k Wk x # } O UpuS/e.Q^-`,u5G8b=|t^jm'8>F5a@L u P M" Go oTEqE|2= { < P H :-3Du?<[WL$+"M_3?S/> 7? 633D} - C ` S; j kH Vp   * " 8  J 4X  g F+5|&!Dp rvK3{MS\Uo9Go7q#sPv{N_[ J 8 M ycX "#$%!%'I% % $ o$4 h#x!u@&N   oH^2RX Xi'u9LU R@6L6@I%a 4 oZrmG/ +w*(jhI( # 1&!("*g"+"=+"*%!T* '$V"q-k O /Q ~{)a5   & v =9. 7#Nns7~~5`P<y@ E1_vw$uFe=z} /U2+Yw/ [ ' z j8k  E L  ^C  b c $I16W:?1g,7* O%h&XzVMQsOP|N ?`xF-  7   >n}SM/=Ko   %  9 4",o^=)'*+FmTwSg.9|o#Xd/6)uaX Z T  ( bSJ_V W Z 2  )zdUe3%nr:^ O D q  j#d%1Ln#\7,!zAB' Jv[Af_t:e$mG.v4yr N !k,H1a`\8QgG}: dO)2 o  A G[+-2n}9>]gwn%XZ5&wp~]g]`iFJ0-1w 0 a TDZe oG#$ c&!(#=*%+%+%e+&)'&&;%##-#Z",$ BoFIs "c{3rw@N][D ݅aۯ[>Cئ:[@פ1)/՗Ռ غ)mڅڃܭ ޻y$Vx+oa.yd` y H Kec}s '_sA~a\(M5E  a X1  2  v3 /RVD7ntB{t1Qx3_2^< ({  B d HEA6{ob}7/k ZB0. +(r!5}*tuDz;Dsg}eK *'hD*HL;N1[E}bbnHvMk' # Q 6 K!uV n  ]3!D!?!4H  eM z sau [6do'HMY~y 5ixX5|eZ(B dR4q P%,*^;2n-p P  u`   &  1  $w-- sk " ?<  + `  9h8Tw6M4?oqYW5 4,.6CjMJ3Qf;VDgw;6>LI q &T   K } 3 q %  E/g%?'v4%/T <     ( q Z^ O E qvpJw -G+.|[5 MFb#Jp"#[2xGW\O6WeE=kK&~2  C S F p E< % > . D ( 7Y X  2Rsn7<_g} 'QZD~NT7zbXG +Y ` (R;!!b#8%$g&u&w'((*((w,(,(,(,(,(*&(#;)"' #0kq< 'fl?iwd@w*NaAI#Hc۲ُ j<۷ۨ`k rݟ>gJy?J"F|(f C]V  :Fhz?!K##~#"@!b NB&NC c 1ghkE#Yg6 qLN{{a 6|!U'fGvAe{O ( 'l$=tdz{v'x FB T {oz E~!^c3yffZL%ibRG{zD=AdT`m-  q `bP m#R0G@@UG+.A9  O t CYz8{8Lz,JfV%o~b;>0jp!8g6"r4hhLmKD"{%sy' :|  t ?pxv,={^ b=R g d  gFhSm*,!IF" 3D/ hHys/|k_pZ%p C Np xL p$ :   X  a ' > a *[  (    h%[Vs%4N|:0<  Vb_"8rS1uo3p ;j. ouLJ6\,6hH^|I%:N(Zu e(~~kA?.=con ( - a h 6 @ d  B E#>P|>W(ez ^u6r]^ 7 N  &HUJ^>$X[dgQZHXnHo=Kxrnq Cy|wC0c@) 8E3ޜ8ٹې\ܶx۱5ޓe=cb)[Vs[Z@5*T  A mH3-!u"!'%)!)+*,+ -,,+*+&+2$*b"( &8$V!!@g% L * m %=8k`{jVG1wGlw#xv4pmTLM%A O u5g_{ ] v  rQ + X+ y  u b  6? U U^x=i;Lf*Dm#g9m"b=*cmbkz2^H@qx`(#C ~ H?qP,!WP%_#!l$#x#$5###"#!y tu`^ 2 n([25g( rd-K wM^R@&b&w^d[Z+y}/w89AX\@p_ 6  0 d 4 ; +y;Pc|wRE  r '1 jBs np\f P%ݖߞ#No&h &hM x   | 6,$Q5(QR0FJ#`I[a\=c*2l t ( NrAubW\bC8b QJ1WK.F5e vth0"{*0RRGN['lbA=9!:zG4 IquOU5sb$owbI3zZ  k  ^ p  (  JGrxuK1A#q v$Y< a~n`7( E 4q?qk]FNbar ?<S> yI81xcGzfl.w1 ~3V*V\@TUPB# c 8 Cd e >''zQoT  MFr 8HIuuP G g u CcD>#,KXL=2b؝n׋8xCג>u>GKzzleydf0   ` ?  w p     e  e      y / & n 2 , Y uuR"LN^lE`r%v9wa=eO)B\"gA-   8HF>|@&3t y s[u {g  _S %kiF&0GDA(>k$5)0K1[6Y a4#O>VNU$MbXF  ,  \ . = MzyeEHL>      *  #S -x-#oN $]yeF,!7`?sNhC?aYgEm&M3Ud3rB ~| W  u  p2" )D*CZ22('<SQ 0 z 3(9a<i_xh }&(. Apu\TPiy, _''txd_K\ e 6c@8 BZ   EnKir]h0|K 0>V #f@ 5N Jx`)n L0_a:A?yݣ@ݬܖXfXBJs&wJA >b@ 6.=nt Q X 3k]3P@$>5mVh  s 1  #f"[(NZnHL V9pl{ n.ax!Z/6TFLzm 0C ) 0e$=h =!""/###$"$"% &ix%!?NqV>% '1 2 )zrc/H!t Rc^%Zޒ܃WvP r۶eܜBޑXz C>)GqF>2StLJh<~!B P-   LccSUm.~f  w <  S$ Bc%EmlYO 01CNmkxKddB2;!H,`9 stm + 56g:HMS\  [ )+gO [ 2GL+) ock tgo "iX,P_DBy'&M8x53}*BIh< Pn ) ] Z x = tN#ZyW8S%  M*J4oj  8 J + fup9g$p?+ y0o3esK.,._X:]j*NP\iQ CWtL WIIt.ka6B@ Y O  j N    5 ? hN;e'*OD]E&95vn g*)JXHW I(~k~n=">qvmqz}iEH-(2B# 7   ` s < @    K x@ K v A a l = R J4#^>;_Kwf@w0 V+}\%iw[y+; +^#38 s r  k!   y8 b  ? -  [ W ^  + 1 |  # s1eU /  xhJ\53Fo4%s6?z0f=H-9%"F8L|? ` ?|x -XRu\!_#$[%a!2%q!~$ h#4#!\ \b l4Yx/R Ft0%Ur7RPlZS3') M?`]'=0I C Sar;"vvShg^~ !5 {A| !K!c$ %!s&d">&g" %w"4$"$("$e!l#}!1A)([ a + ' 6NjpIR{8h ^ R9kcVuG6 ig/QJ}TD/&b ~ "  ^Qe| d E R   4~ X_  i 1 c0c\+)k&>S;ghJ/R_,(X_8uC~&>1G߇J up;Z?*gc D ,n`M_}"h#*%2&'r')&4*&)'('r('(0&4'$%"L$%!f K t\/ m= s@f,KJqH( $Dg])0Cb|Q-Y#\ Zly8y ^?2UA  + # e fz:I!OV;RgqMNGV za$\\aB\!r4KiT} J>. E-5P#    oos[ I 8 p L w 0~ a!w!,1 U { Kq ?  Y  ~ u"Q8*aDSz%M_xuI4 ,PS1k7(K;_j9EqrkO l a   l [ u  Enn}Z l L"Bw0qtT-[I~eWo%U}B D>mS>XZ"x?C5a~>{r uo(  @ U} cCsC4yj#t @ -  M  t78^]2*PgN /=q}fsC W-bfrR!?9}'~#} Rj _ _ M 3  gf!d#P%N'.* ,G!Y-B!-v"i.b# 0#/E#,a"+6"* 'k}%!nL IFfd  nG<]V7ney\uQ 7gP0Kg {:.&M6'er =a]L 4 h; ~ o 9=  o   / % ' T al9r\e?+\-yA!b4yt< 7\Q)M]DwZoO" l a !!C$b&r!'#>)$)&';'t%!'v$&$% #!*K5 "| #[  Cba5vs *?*3_>| }-Z uq WFM{jccub1h=> ^7   { A C  e J i #  Oc<O m,  4  .(Go|2rBC~f12% +1+X4LoAXt~rg[0nU7v {+i X # F, XLVa@8&!P}=m5U `r:o.J  v =   C 4hnmVc-S]ua< JJ \ !  . V?.   V  m   y>2$ m*)x6#2gq,(]5M 1=[>CHdM l5,C9]bIX * kd J}>Z w!P"";#"$#$Y#$`#%"I%!#"6 dC+$;]a ]w S8aRi-by"CRL$W|!;E6]HpQR}1j>COXgRi+dn5}  z @ hY[)HVBV^6oB=Z1f "wQNsI%?~:u)^0*W#9 .d6<| U?* } jco b(&" $!X$!h$!$ $#w")!  + B ' xm -nl]/{h+4Vi/.K_V5a-K|mf[^b A ~ ` 9s_"$ %3 %' $ $~8# +OR 1 "  x!w3Xxw'Z6P8eY=?@b{;a~3R4?M5 ? O    Y2L=ERlb-q 1N  G- c } A <  )ynsnA'1D}*{Dh^=:o,M H\j $p*$(-9h /  _ 6 57q@ f- " n -  G [5xi  ! %  ; [  - >  o V   #  p G3 ~ . R lk 6l${F_@\':HL/u k^H.fk2gt+^*!k  $=(<2dw;f  I hfQXV?S"N,6  e tb DeQI"#-V],q!Sr#Skh;B!jh!YfIC7J!?&vY)`V @U0D{oV?q<\1NiWu f V 7 y  ^ K    iv  7B4Cax@,  }f|j:]1y[-I Xynm3Wwt}#rzcX/9 y  z -EAv3)Z% |,g)r<o\/    _2 `> [  + E3GV",mK)(Zi=u&Isl5J.rrZ>En{qkz t  @%yC S8Hk  n 5o fhC~~&vvC$~L>;$V#7@h>Qn8 H  - z , u^ |tzYIfjFpJv G k vJJ@Mk rE,yj<1:Q#j CyQ%n RB?,1o` n  s  2Z]&64lNOmKH"EK sL 9 64  5>ld7@ ;f kd:!!e848F `t%.P7 F0 6 u* /54I$@ !q9$< b   xEkB+x5VOz kN  '  } k@tGdCCSimE)a-OEuV6{vK)5@S aWB2&:r>74!sy8<<+=_If>_X`(sz(jq %?veaPU.sS-@oIMjs O/AzKjaINCwo?EB[4+jo(5r!,g:3]gtl  j `-}3sS + uc  j]hc)A_p Qg?je'7LlQNFG{Ns(/\=f3 I ( f 8 v    x#bT]{|`C l [  i j W/ B)#|q(v b|(D-|7"c;W)bz58}cD}A&$ lzOs]L   T3[!-$/4'w'M }(!*!.*}")U"(}!'f&m#q Yb'W\ = wV* :WdiwvS^ H{pfP|;~?iv2pnVw;n_gsQ1Q2xy y 1  2n4ph A  6 3 o^x$A6 %N<=0+0*,Z>qEjg;EI+t3 | @7  Ncze >#S$e$&$Dm%i%%"$<"S3<d$P q :2"jLY)jR!S$C bLF`ݐ6ݕIݚHn8߄|9Y;_EL 6} d "aZ2S< ;wo?_FF9]A 1 m D uzr;]7YBna,=a<#U"EclR n nPg H x Kq B S4    usyK{EWqv^hlx|2tdk+?h0.q/ eJ~;9`qha8>\l9T)c!gBBY%AZPYv;|U0$7[d Cu =   p G     F  `  o : x /".j0 "Hsn  V u     D q5*,tM71-hA&-!]a@AaWhapI=>4_GIO~j|GtMb5#Z  b  1 9 V p X  udR.Hjt\&9R_srw48nDV}?jw3T+}p11|=v  /  '4 *pZ&ru[9Wm;!.d m z;wpe}P8 SP݃ܳ ڃ٧-D0/?uکۣ&|߈`$JX)']0=%wNC&lQ& ^S w$Qdt'Tob gl &  oG~'t3 V.Y5%}CJPyy %F7H7 k5|0 "  ` @^P kY[=e5h  =   KZOPy.1=+p< j?3ygIAdI!t0 uV/s*.x\YpjQR$ivjo  q  Bg( ~2j  DL<og s k{ Sd oG dzX F=s;94 KC*{1g` xqs%=l  u j =Xe1$Tj&P C Qu j , ;  m  en[7LBR{ a-4V+v4w?QV3,@%a6+X1u"&Y0Pq Ua b 95eQ .!11&d'Sq N n vkk$a361p` N:z(]\=!l'BcORN80b{;}*y!ZKuK,Q">_3O9zb:u9k[Y % 4a=lLKKk{sQz N(($U(Q.^CT(w;  k _ R H S q J ;  + I , *  v& s [ I  HC  F  y |OI t H  b8BL 81 G^^f5cEgpd-I8]$R+[h?<0gO\8$. BV"|p/j ~S  ffXL5 7 n _ 3  ~ /  4` ~ g  3 d0 4 f     Dl D> , C 6  QO<&(6"L6L\}QvOQ8!C@[0 nz % jg X e  y @  k  A [ K  3 81@v/kuf&jpV{[-Vu ; vU`6N|3sXS(K,Q?;sEr d[fr>     V|^l'f i !39!O!'!e2  3  oReglr*CXB^rsEf,wx)`K6A`*SrSe ;$ 5<y   k rKzw U*  @ U h 0bfTd"9O60fc0E(}W7}[Yo3P?:$S%|igWVV50d  "s]L r !]! |[aRH ? P s pzVL!3/_t++i| /9D|%]fr)/Cm[Ih>U]Q=v`kvDN  6 g  (>  ] E  r   .*} +@ Er<`U6~vl GD#%A@);na< l<  j [ c _kWRH|U=>-ra, A Y - ? q`#wB`yD9^M ehk[5zbO3{$9y ( E J*NSs*f5t! t W r   W p < &  6 H '  t H * 9 < # Z     .`.*QFd|eM\-#SSmb60KX+ C"BZ@Pq4Qg.'LEKYtxd ]uvPpBvcH|O.G+lj,d|&W  DUT 3G_ 8M:D\P'KaV ~iTPXdoMj_IUF"rbhI L o ( kF b -*:7ru\z Lp2 qK  E  V  :tZin7d,4lZ/<">^v 'Z./e\* l 3 d"MrAIW* O Y I9Yx6p%'M^uC9Ex?|+wxRc)4|JR|K E 0L|U~6C \ d =Ns#Ou~ $ "!#"###"#"# -#J"Q I [}ul |X\s.#p/DeY'35(hRvqv79߀bߠ [wz ` y 1  B2UT204Yk  d vqk7w~=cs&.? g'6(QKu,|)g!^A?pHfmjU{s*2`65)#w|\n q   H8m)d>bJf Z j ` _ " ~ r l _ !;"1]% (";=:j0fiQ#mW%mp o;*"[bcjS-  ` x 0 YH 1Owj]>"Fm}!f'/y63_S o # 7 b>nzCHd/:xB;k4/k"(ISNh sAWelg  ,5 q  V]  ~ M w  0  * zr  r z  G q-; v Nf=_oK6wEpuH%K8gJep.h)+M3e"C%[mDCI48fTFjm oEV>8R& n T o  < IQ 9a u oS   u : 'Lj}4-Mzk(7JN? { 0 , b }v&C8'q FWrkd{ c8- @2 o?l}H;  O *  M e m j % ^ / 3  #   i q   rg6l,t;wn!dud_8N0$9/PHPt%OR    O; @ x;-PBBE=   6 3 2R'oa:obH)qPuqoT s$\*J!i$8rM{Y(s>lnW k 8 2 xQ  C<J"BTU W # -{  W 8{ ([Mv/PL/MKvL(WVy+HxpDO >en>, C K :  g Ei6cs5K[GS;vW   " j_  uqX Ysb#MW~L)h0(85>9Z|,u{!)uzmCR3;?NVmc$a" i x3(:!rqBY9C 4  / x e ! |2o?`W^Pa@!#U6(lk9c9~c_b0lQE5}M3rop3)-P(J #nPAW;}qG?#lb/gFH>} 94K1  c k  ZY 1YMU9!<+gCcL   3  dcJx=Cpk_, hg&Q8ngy< 7aY)JXM@MlR> #t(~w  k a FG9I^f^HKb\    ,0gRx   zWUR\H *G TmL[w&.ey14nO4ew;I\s;>[ U U d?k{h|;#id 9 >p = >] +    k T R4/$ G; DM V<qXIc_n=Z*w s,O]nImew   j( Y   x z L  T  X - E g-k F>FVYo[H8M@$1 F\+&R J  e. Q ; Y~ } Z C  o Ad : % q Z R 5 c :   t *'|&jA;"'KNurt@,H!Kq/3[aJE7'%y%;ZU H @  L V 0 ; / BSq }zGzLeRwFpJ#  A~ nYyWUQf6{ XO^;O4g1*CO# &!X8K@g\O\?/ vGnV  Ovoi"^I>r8/I_Gv}Px&B~(bJ ATxck]F[m@1rx)H:S-,XQO3r!T+5 1   K 7 K ( =  K +  q ~ q  # 7 |hs]w0x}"wlz7v4"m2'%+ WF"uZ3q _7ay}?"$S|*%&'i:  YZ sAmD<9Dg?JwG rpB=, U  ?x `e U`0CQWJb -SNDZ{!$XtdjI 1 c c " [ z ;aKZ|G~yhY6w .  Q:FI(q41:9t"f<1"FTqo;Lw686#='LdaSbo`9te]<?t@ \ = t]3J &|gQ3.^"X ` -( @ % * *S .VVlKX"-A,+!9(kAc"c)ES,n} U~d?X'$d2Kp w %  S T 2   ^ > P 3 & L vSl(z^h^7:W~'ld+!WtWuZBMGTKrq$. @VP Q  [  X WPCxh2O ":f\mZl JP $  z " D =&?m~ex\H`Ri;Q]&}LkB4@L/4eYbq%I'HxN,  3 G zi ;bSG1ABEP7sHE:S 9Q. P% 3 JY Q ; .oXo'.ysa`>47q\h)A3X'ai$+4 @"d,4`I0-gpv! 8H2i[hZxc#Ywgx EL|Jn!7ce;#TW7-D;>6v8 f>@vJ5(H5|n^ju2e'4G"Bv[D8ktH e h  J/ 1 a >  5 c * g U ? ? O 6 p & X W z  ]61~<0rTXR>*ub+ "G_v*n<$yc*d^j}rjF0i8.L(n g   A   D7r5k  O I H M k Az t=f 5?qnb=N;e1'(|#7bsER~XbD |&qV  )RA_J($gS  a G f O us djRqdfQ=dd\@[cW bqO`^wE6@*n|g3mLN '1 :N_a@ 4 }  ( y  c z , l K  U ( W | c r > Gz""7e8tRxYK9.T!-ZO[D,y\Qi(93) ``'/U  ii   w G,  /    /  ` m Zc = $ . w c?u%\15v^tXq{ka wh&_`dbz,lLESlA053 ./^8" $%*vDs7 Q&{u,#%^duyC8Yy*t0LGvmqmu,U&X7KeF~;2'+.9Sh5@Vep2@% a   b % w , j, =  b < SMa >iW|ZWVB %|Mg|G 8}#! IkM!mqC] (@sDKdN9^ il%OrUoVdMGf" {Dj`>k$P-?n&irj1{e X"R#V[J$F} jR"`$g>z`,n's=m& lG01gL: +MOSC0Z2xR{6?C;XOGaa]3*[S\. 8qX2Pgk.e1RY B}gI.49_uY2[xdVXl.*FP'K 7SB> 2{K/Pi IMH9$b- e Z) )  / +W  p_ f w _s T ! g ( ? : gPVF{/7J*,QMP$nwZ-HXlgsK0)A;y:}x/ D Q ]G   =.   tny;`S|6p1+jE3"55f)y7dI-Zd,r4 FTWT  7l7~ ; /   }oW-M,3]f>2er%~s r d Ozu,#rGSBN=c*}*/},aZl=XZf `cqOB]E'r p G  QIO/3k:wgB=&Z A"F  T# ?S'iD;[bB^?X #0!A'~n/vB63}D7k(D.@eu5>+mWlnbH0 QU @   H   A ] % 9  D  h @ c  / t<"P{gQ|G_J9bg6iSEs b n;'2)Z/"f>x[Z^J"(;|4Zl{e Y[X{XOE?>k(Tp64% A:~ afHeGqSNZvbpA.[n$#YS<AugBM0 iP {E D&~SkWYs[xX1 %2IO~?x_x%8G_+-6T B?%fplVqE'AO$p])-nX!boo1` A UK #  x 66  B&])R}N*WFk  t 4 , q   ! T  Y &\Fc[ wT|7@2QCikz_e e{b+4-5e1/Qu|S9'h M>xE9.j,w4i7p{k  :  T E   N `)?2}qEoBgc=Lq^?1ap<3kSCPnUG.v=4i7t ,Q'4ai`o}7j" )\tYZ]B/D~.  t  T z   Q |7MM`wT%\4Uq\XkFehD.P~fWo Q.Zu MkNb>,RD"wj/?oH swgtXR5<It2Zb !I0aUQ*z'ZGGb@Cc'"vj+'#lR_n%@u*BZcGV/a)|tCW\9| X 6~ > d }   + B (' ?jZ53k!v l. b]/p${ *kA:auS9[)C[~|Z:82MaN[$8e6R6?"o>EV "H3ETr\T\|,E9<.-~C1$tpWP)8[S eHkZ@i~8PLy|Z2 d QD_.FyN !*<n@TsQ8QfC:$(8zTM6!uVmrGm4)7!oI'V:$e^8ih)r#mC"K>-5 m 5  Y    s ) D + Hv b {  x &    _ 9i    | AZgZih hq\cdqqum.U&h*K'JxkP#.Ud oa4|n %H|+;:%L ;   b       .;|PiLsir-DH%Tf XpXXLl/ x!19BNw{q8+:7.S'R!QanZ(f4E5%$ ';)f:ku4-?H g:rQP{Zc+\= `ba *6q3\qY#R,w|S9K E<r3$l-,7].cEr#`CFmXOQ)!K<]L?Nv)adkqA5:EOTu/wE.?(Y?OwN7;,v V!B7j/iFfb3q-K@QInB?$*?IB?2x2PrWAT KTo f V 4a\\=Y%V1OXu"2EZO mzWBWDELBssF2#<:5#%"O;1J1T? ^*F A|iv_Ej@K_Vr4fK :7B k}*Nr@vy~A4-TRF. WdDwv#jd]FzCn:=? <-hY*6e7KN&NUTDzlW^XHQs}e=tK|qXBA%T0s` 7 *T{&lCnytyI"+di ?@95UPG&q%T jg 2kAi"|"RSM P (OLdL#:d(Bf 0_mT9Y{2)tuC.B_JI O]4;TZ  I_   , F &  B A * X    ~E } w5 C  a l  > d  H3_kLv#wUQv^ x6G.6mv.zE\Z(i:,1aE" pS^=u7S^j4-hb04M#$F#?jErOiW$Bx TimU15^!c$[kJf3c?{P\O[_W/(qv"ng+3E CF ah ]   yY}oBf._g3p1ey (FmLqs;?Fal+D cY\uP ljA B-Om+'r) Jn _}}" e:*f&aOA@ wn<M#awYrOnDS;^ vG>JjYNaU{wnkMIY:.TLhrR4)&? R3zmo"{ 70&.?Uko=Zaa'|!f!0P3,<7f* ,WQQ%J{)Z ;25Q%OAcVNvJw\sOmoO8>RMRYiu-t|sC`M2I]Sd)`&m9q(IhcrFGab61EAdKg|\QV7N ,Zw?0d}S.oN'*lS,6h*wX#c</8AW7%"#EOj<#nP&m{t!'aq{#c7-&wZK? eAW\'fTQE@E(zX CxY'qM,D5b .sT;?.8I|rEb'y%'ragj*N;Dx(Y4B8dyTU./XB/4Ob0Q{ Zq0l&;On3eSp[!R1b:`K|]@Z=K*fgk3Z.[.0XSzIs/F3don0mXygPrvj5;E%EvV?kAPH'`,v< wvE/@79DGz!93];&`!@G &dqoW[ L3Y`DFS"CpocM]_9MA|:4> lpKuP6W9:N4 Nd~V2kc,QKT\ Yz*Hf VN3*Sv?5@.`G/ nLm oVC]_C_\8uz>>^>d9LA >[ r| &E3};~ V`j2DIe[tzRX{(%!I|leOC:&M"Q%'M]q *mzO~rWbcKs\$,XGC{z0|`l`SH2w%:/2\INYV6/32u =d}S-j2(4)YDc]2K gIb`i4~L b( (/#wlC ]&Cz J_Sg4(,{B]l H% sDuj_JdY. !:8-:' JLPpE sX4QthR@**/(*G:3}c9b58|C(O/l%5Ly-a[_kz<.)0CC !" ?i&.'uqLB[oQ;}>,,sO_2L+gHPa|Lc8s).0YL$&@wBqK _0,sPrvLQb\ U(^rSSD"K Fh.`21%7 xIISJ24m7p{0?$^+-%tWdX4#6O]ur^_%6IAXI8Pd=R ,BvUDm,XX`C; w_O<qW7[y/edXx$ ox*=W| #(LeeifGC2p2f[*WY-3(%W"KGK'IXx~Ge>`h+J^t]`<v9v*uWY[5[kbuLSK[`T-(v|UJR M5MTv#\{Y|d |Nea|?Qic'j,wR{< k* `A(fe">J|}(:"EW'6 7#e^aZNzgb5>)$ UF\BveW:3'{8ErcqiGJt$o?~#pq^e/(Ktrs`ZMoI,?1+LQiF[5n3IB0mOC\ wl4QAm>\A?#bG~ok!rfU8g? Z6._v|2RHYnFWwMm -@yIi4Q*lf  ntU9#<]f4*mDS1X ~3;'s7(^f(H "'m`6>xBbFB#C6ICj;,>1}XixLj| X2s>p<{t+3'8$(Gvo7P39{_Vo@F.5"V86HqG?v{uZD*a1IJ(`!X`CVe@`,E'V.`w._Y, F@6Q <5>5[Y^xe'Q?,S?lFLtnVxGLlwZ^SqBGQl_]wvF$t$<,Wc]}b62Jv HDJXwb|5#"a_c?.cHs=1IJ&.knPIh{]{+4r#,oM-,\1#\&0wSghy0i`'W@__w>am0 B)Z>sArSyP{7e#T Tzfs5yi:&F"%r.T>)("x&:].",. OYWFef N}qfEDL|E76/r'Ue;y"CN)f]`:UWr\UuPm"7xE]83l\3> B|gFa ]d^,{3RaxUAkZl`s7kSRXj4^8h&8_YIR"CuSKf>v np^VjUoMf?D1p5Mn_/HN[Ek{4h!?;KexH0`mBvFyf_F_P ! q\<UFI#2K' *.bKYk"W SLg k(__Da:j7@Y\a%%JWvT}K2,tC@o"7GvM@BVfCpe 6Ma|2 (W6Jp"f\/Fr% V2QOJ{Zk}}[VT kj$q` S=4(6)v]/0"$TH}=\,{,ITu?)[-a1aew8d"(oR_dXQuwlLWG oiRO t:i%qz*: nVWg7:-. k3 "%9K|Hs8R=b<MhjF_ gXB@RB!wFa>]_d+C> E)xchH%2fe}=zyt}O*B&?CuD G^Wh?tf"Ummm#23?YM20s(II0|/y!3DI=(f9y7uJAr(Y2p'A*_3&J(vkq5q;A>F{95AD7Jd#G#(5SpqhwA"if3MO w}-'yeivGwQ*,;H@"O8f +LtZK]2g~0'H?Lu]x\pjtzjmS>Q/4ON%T[`?"F3w}m^cVTF+wppJSI5~2a)Hy~q^\mNHTA7No;KB ?I_ 4` kPp=[|6JQH%+_nh;]j\hqywsbb`5{gYp4\"k<-ftR rwwJzM~>yD|h :+QUhdwrcYfn[Vw } eZJ/Z4!|ZH7bCE ) R}'KxLtACP7yZ`Xw+01VU>\oI & 0CIOB)U8zK'+iilto]p>UOF]^\vyM@y:/dZ1,LikvvswmN5y ^_kX&f&l;G%nGu;' }Cgf&HKu6x/fI~Bu{s `IruTN*bey"2W0R:Q*c<#GJu:bJs' vIjY~rU[[1XaJYG B"sG|> K>O1Hf EG+hS&%3@1O:A^Q_yC{4i!V0 `F(|T*" e5V B+qyxOwhnAdrb_}A_NRpqCWiwDw#Jy^9u PA }7Q<>u.m,|<0 \D*V_B**0"+t*oc&fJme5tGPN3} +4s3[N '<2$))!%87,le7y+^5yZnv]6aF}e, ,V3hNu4(V=_YXFGo|tq8wHnRz|wRm*wX?LK8d=4 }cfroxs\B0COLa[8$#*;9:J:DEbT~9G?j 06FV@X@nV~QC4^NO! oR\E)3DGM^ [-[<L5hk(+=lytkPdpkbecX}Hj2{,(r*@2Hp[8RihW'g@@O< z<*+5E52}7.-&'8M OIKVUTq*z)n%{j}2w)@z):031'*U`qE}/Rd"VD HX/O2'lc--kU\!P30 vKE]K9i7gP*wwaQAJ*D 2f.xWs)N@S:q\|{,&W,X=Z=c'j rgs 98(DWI5$"sWB}fkj=QA-mP?(p\N@8 ~tvtcnpaww ^o6Ouzo!DM\)Ah"ZoH_h*JuqYkSK?2(% " m|ouyjlO`9J(.   }srh]YQU]I{CuOET,6O$oUp'1[_zmlwc5S?.V(N s6h^.lT+p5b)WCO(6qT-+ {gH61a!g~Lg|'EZt1Vq&[+J`_t ,^J_5`#B^Y[rndmaI=|b?/<c~RZ?4 3@'C9FMK^AV7GCKGM6O4\>\5?)09 4*W&uhD tJ%Z5z}0J_| '?%l\)]Hk"L(. $=Y2fVTjHzYgqn`dge~`V>"dV[E#^G!oB* K{^2 kcm]gGY;6*"/!  1<>5.,-5R\^d&=O"b:xTo5s7j7b#V|'Mp9YTSS7-0c%]/hA aLqBO!mwZnVq'B uSz6^&D9 7 9.0;*!;KFYjddjq&-CWQ;0CUQ]ob%\2eHWEH@WLrb#/Re`s eTYbdi~w_bQ?H0;$%( $  -7+1=400++^Z7/ gYu+[\R;8,+Dh{|"\G M\z7t/]f3hJvTtUt>^&$" 1;Vhk1  zaB-sW5z T6yr`FD&"gc:& `y5_:,%m^i?n+;YuFE+q2M_0^#INm.N']5Plqz@O!A/3))aX&G< {5`FuVt_mcvg| %4WYrJZmzYQcb #.`g 5;o0&7q,{Czv#P8+.SoRq`82#T:JQa&Q# %`t`M5n3 C/o^xyxK)b<k 2\vp^ Rn U ~nOC# b<9wF-lX{!8a%^6"%C +Jy B\>GhkxkHY31 mpptq_^dP0gCxT/{q{ywxqtkKO mMZ+J]bVLf22/I[n!I\zLz=!^8o5mIkt 6+J:6!# '$@\%yfAE~V,<a3,"L4|q*K\o} \b"`` "AJ< }Q5.}aT>4.%  S<HQEBOW[`bZ=#|vcQG='.%(3?9NKUFD4458SF^VGY5M4P(P;3 * aTK\stgdX9$'BOlO9|77OETC_C{HXpvtsc[_\h 1Ej,Si?}oO8<$ X; rTB>.6& r~GK||,Xay '_Z##VOziqwX+uL2j\&j^?x~L[#&peGM!GKNZnyF@4w\Bp)oa.t<3lWd1T186FG"U `u,Vd& yx #&<3ltoC{9:LCw@2VR4. $2U%H~fZdN)[4tg3(yZ_MOs14WDkwqP!mgRD^C NY!mH7!o7}_ORLze@\,wbS8cE=/^pH}"q; L  ]62/ w 984.#]}K XRu&;i|,2yw|oG I"ih4I0Tw@+mp4,PX9^N}~=$R7]4n.q.Z@*rRXUY!_?[\6_CJ  ,E^~/C\2eDv# TKxr  fG<f rr$w5|D>{W-GL*n?Nc>koDc6e*S + +:R rIej&KVf3S'\s5=71s$5q3Zn}[8f4_H%DUZl hB` \KjEaQOUSZ%=%NEvYex *AEKa'`+3i  &%icF{fAb7kLY*D ce2;%Y;" 21N PpIvE!]@lcC%Mj1qKxX`}YyM="yO&^ z>G >0]7Tn1R t|?3x[JhEB_M88  "14VBb2Y-Lm BnbQW#5[y-2&"oY,{sfZI>HOR`gp~thq -<:8:&h$o@sLyTfs/>/&mR6G9|GS"C - !3If 7BI[jfafaB')-)'(G@qg9Z1pW 7AQ;jMtWa[J1}Y-Lrr21y`QG@, #9k(o)J>[XBr%0;F<k<I]lgPDG?."nX._ZgCH\F\5p6`O9O+Tw7 /(dOa'pX:$(Efn8bO-R,[!88 5qg}$$iv i7?^17lS Se=NK }Qa!A 52,5Rlrhe8y^p|J;|VG@ a5(M{/,{o?rGjAi,.'vgE6rL&xNV;'x :\O(b)h>  $$/JvX;z"88W_|Jp6V >PWy.) *o`xI>tnQt>wYMG B?;G7R5r2A]qnDk'W ?9HPA12+$Cpa=ylSf',xJs$b J.(/9oDsFV=~KNl !bE>!ZRt"A[,yG[v5a " W%bE/]%e4p 1\k"/fP+u@[<+{rmfb`cln{C{6g^3@/"jI)05HJLP/S,3"uk)R .Wv@|hU2#$b L3~p}qrVJM,KKav - H8yf| @RkT(U  9|*Sc3i9u1c 2_a y/Q [#dT)m_VTRX|o'EGjan *N,hA_u#I-|P4cIzV{[~ //}\$8=c}bZg^%]] [v#c>%R;t{4hnrC  6`%%j]Ky2gm  m@ts^mEW|CV8e(d"lr Hc y_cS}G{^MSUj2DT x+)3FI:bfv+DQv "08\Vkgr 3` &) "&&/-.-'  vf~Jt47CB3{u{|w[h7MA=- sFn]SsCY-UE4:Mk?@dM}`3Qj@p2EMz<Qf zgc#}(78p*m?nK;*s]hA_9_JdW_\Ykh*.]^%4'KiMX#/NR#AYksxsp~pT1ZJm&Z zGq6?Zc oWyDq'rmj~ 3PcT\va Ezb@U 8$YK[!P\Y.^ MF*c%I~]<nWB,  t~;Xmu-MwS3-5C6t6Mx [,r?PtbPv{WGcOn=@~wIh%m}Dlq}   $G!q3My/Us!G\{'HXW(MJINI>F0< u^8zocWZ;@! u_IAOYWY2kFfC+fhFAw#u?y[:H2U<gV3:Oj$sU9 sW'k8_a\.dP7}iL 0 $.#1YnX"M qe:%[26mO[< nARp2Z\HA& pH yfLo2?xU%cH-FWO>~ax`kJ0OK0,>DC?G`jm~ tntuncJ0' x n'k%de"m0s7{AJPgQ6:kw#QVdlv}4)r2,vXAi *-K_ &Sc,D` qY\B0841kVoF@A?GYcfh-zkPv}*9=Sz3S~!%=I;<=+]1 }sLF! n= p^*spzmjU^NS]Zkdvbl~% N_}4&n\)6_kCE~c?V[ 9[#c ) w^p7#]_} xa]71LRlmMk${|jznpzdxOz7' 9l+_'TkRjnr+r|%%Jt9Cndxf/z@De<k64U{jIr7q7g'_en{%|/v%-EO2TOjxB-At} =y!2Pgjjx6JH0paKwH1e;W unkdQo4[R MJE/c<%68SX| _S `m$uO#+< FvIP3,2]dzAR/-$06K,kTtd|sl"t) N+os`>z(=5_8}_ +0;SGm`z\yGx;zH \B> }=mZ9~MpyE,m`XS[m}};dWaLq-}#^ (CT$ZH`KnU|lwjjf]qFt1{\-n 4UXHh^8^PU%:IJHG4vG"oD(~dL$o0e6g3p%elQHI-8" (JV\v  |kWD73 74*,6*7%-!Z9!2HU1hF\u5F]> Zw'Cf},r$3#D6cDdyt$)+R6Vr.Sr0DW|Ne+C" "8Sd?vFVu)Jm( EICCCMXROV\`N.mx`YYYUPMD9R2\@aTljsuvjvWmKbN\[]\iOrEsEnLkPvPWix{,GPm`{!Z0>U x1[RA;/ _1y;'n=Ba{;t'b"\GKuX:hc -{o* t^=AQTv4K^n{cV7_X>=0'fb pC BeL0LdQJP1397L5li AY\Tr#R_**".8W^m2&kbvQr+A ha=, lu(%L|a<Q.$O#j RCDD{:l-Q.=E-Vk %A,L8]Urr~F^k9^wt$t{sVJ D?FJM)@95F46--,7(( n[lDB4*#($# !()5DVgu"p7AQj M%zZr\h6D!uip_4!.  $*$%uCWKJQjPZJOC+PQ#[$h n!v,e5Z0^/]3P5UU^j]{zukwEe'IvJ4*{!zmG$ -Vky-T+HU@)cC}PDu sH\n "+5??9u uZ?/it'Oa+ K\~~L3qL:6mVSJ&HD@MUQwh_w;w*7)@a !4\r,'vy^A_w+ Ua FEv^FvBCkY9#x|tzqgiZTSd|wsqeB%"%AkM6]} 3^ ~2E[sot)6]a87pSIIO_5{~ #AoF5l%46F;\z]K@ (><Ra1Uxg<V)i-BaSE0- drL/ |}_^KS:<,',(pWuHcXffr{<[7x lZUU%TjH~#6JGHKA;3'jA! ^8U5-6?@SM*d 6tdDX7O-@8) d?$8SovoucxUe 2%KYj)?@s:m.CL"G!H!K/I:ERJe[flI m4e~v$/w=S>9$ rU0 HN~Zu:KJOg+UCf8!"0Qzo\Y]Y -`[=rn)Iw@BgQKnqjA?DjT&"E'49OwLsW|e2R ._*ZQi!g7 pM~Vh1 E P 8 I b*Ti}AbSwf6T.a ! ` q9LNtev|p$uC3%dhiS>?uj#}KOC1% G w wSw5c/TH:u2#/[ bP  yf : E   n6<4B?7JI5n55zL5'NLQ0E Hb9d6+qS6^G[@!C 1E!~3+O9WHOz;x8L#&VFAOK3:@}PZ0Lwia^D,)jQO<??mlSHI["|  -    K u #   ~g~McdB[sL@/r7Xh!]bstCM`/ eP)swiHV_s/|Z1J" W1W!0&m+=j2W~56\bz:F~Q~"|[G9B':]>{MM9IoZ.E7[gatD58Z$myjDotAO'>^@K<ZF,u[{ ?f^^VXO?Agd#{tZ kd m q x 3 ) t Z (  & Bt Y  m H 0}%g"t7a)#jOQkzI_`.8)*#CW$\;<9\J|kjnVQ6J6^M;]B  Q  ^ ;   ~x+@(h/  Z ~ R  SX - P U   { S >.dRB$*l jvvcelH4_#E&Zda?+__Y]=TX8s=v-UO>:cC / i5]`9`YCJa@B]AX`IiRtfM%k/NOv|>9M1M[Dj  + ea}gD`|k U1n=`\ "Ue| J m % h + = A O,W,,Ca/r[8sHHN~6o{ [fBMAH-P_H4C0ya*]8AN9A:~{*0{ lK |9 5N  ` o  z j b k 5| vcgs.TW S.   G B C  %|(QW@3&iU9{~p*+9 {]* = H R ! ^`~   )  Z ]C $PLe `l|mK)c .=Ag ~_hJ9gF&b7_@AT ~ L  /`; -4xS}vEDC33   a  Wo mn`ABK/xJ"[h \`{C N @^D'thzezm.jR7@ d Ps:0 Q u  ) )  =   F0HiKRmc]CDaue_Wd=I f1vpe:"`eN=[64lbTE %  D ; th L  S KI  6  n 2  I b     ZK $ u \xr12<_<+TQ~qbIH!cxEi[*S ]Het_uB|q0]ySM  W'Tu:1z!,A~`qp/cs8p!F rwB2Xc B;94)mO, O ` = @ r  | H|L[q-pYM^!  H! K$uJ=<#hG.x2=Ev[+$vyCQ;eV}Cd;a7%"#6<c|v('|n6>  x ba & J ; {  6 fW -   3   T MVt}5|2K?axZvN'B%v8 rTs[    @ t  5 :   [ U o x 9  Pj=H@V$~dT:JhYu 3X4(t;SqO5+8G8_ydM*w)c=Cl;w Kv <S e2 b  J  b|9;#"dVT5 6F=!p   32F   -5B[HG6Z`"b/clX y3, PA U%S[Gx)R$ZUA# t:! &|Fg"z49({r/| Y" G: !ssw8LT@xn! G z E   ~ ; Y u  N u5%: F L BN,OxQ5 X_pM-k S>Xr>.VF<+p6RvE5{oG>qqF*m#Ma]KY;IF7l;o`-;2Wn+DB+sE)$?Z+]! "\5^/9{:/ M: :0hL9>#8Y K}rO0:c$dN(wh}r*PoKb"GuU 9{ v { ^, I}(Mn;'{~8wa ' i f eb f8:;) _.SgrUY_[b f~R=ux#l rckxmJxA6   l /   LD&"!/3H FDmksc   (  $ k , z Sh|7^ #>4C3|aiQc6K;7wfOkq5F9t]$Hj9C~.s;sqljw;0ta|jQy$zraa#4]&K>~Bguvo+^cO  v: m F r /V  GG (E_Y<5I   ] =  Ju~ {m`"Y"20(`mcj?AL;P|.. b7]#MI>2?lS/0B`' <IM/B+-GerEf,*Q:nbbvs .MKo-81@ 6 x $ ' r  6  G:|r  % M k j > n$35a#P^vt/K}9=]} 'Uu/keb@|snH@?@kQ3Fzyv`O Tp; [    H D9 m?9[9x?  \ l K (d 9=K&4se/+fd%WBFETpCV- B\qAprJ [   y Q ( ` w 7  { 6 v k&Z$[LJ n*{r'V cJr?< :B(PXtBVyD&Y3s"P 4r   ]   v} }\ 4 b & ( 7 cCE( }:@Zg:E_26BxAGsQs8ymBqr $}?&o) * #  (/ h +    c RXMu!qY+E4 / 3 & * G L P v E T_+borAz3-G jb`baG!t##?Njc62$q_0u6wwDlnNA)\#6Zhsz-WNAll_R+U# 8\1f?]Er  & yb s]v| +[h}y_1Eqh]I6 oKY   0 v  [ \ |_Tl}/ZA:,AiH6|*I~bxV9&bOI9,s5}Lz } M  9   | 5#  *7 / : e L x p ' # n[ P  g& Cn,XlN,a/C$dG4SO1L3[j/#(?Xm(')M Z ) 5!$":! $!A$j"$b#'$##]#""!!Y )G/PGLLfP}  ? NlK5 ^*^/_S8ql$&;|Hei/p)`"lw .v   > wT  /UD4nrAQEp  g Y  &o kbW3u&@B_N9{bQ1o<< E)4t6Ee\$d^s.M   (> 7 "  ?  T , )  5  64W(><4D9 M97L/xj(gj(/)7.Qs~ p81p sC*e   x m l  hS`*J_T [; s p  ZoG: 8_u %KMKZ1 2rT\HI:jN 6vxMAxe=i7_l6K ^ )  ~% Y  d X  k 1y UN}[G9x> -r8t\'D4DAJC?8Z%hSZz8?s, V F  | - j$ 9 s n&   2H KT r } l. I UNHVh)R&A.L4:-x/Tp:aV_ GUPM:AF5yE+ d ! @ w P   X" x  x= R>hg%.Sj{,u #J I}] 5 hjhm4# h v |6K41d/QuAK)i?#fTP s9wl k& 5}`v x:* D $ 3J  ai1 V|-.=nrrz  m YU 8  #koyJmv4<_#|s-I8V;>fqi7j5tQK 8A*"a62r=@T$;r}celVZd,"2K0&<  Wd.!%a~kauNVAU!3 s t  , rQ[` > @ F _ 5]83*9 TmDs :;|$o\^y~  z_ ?Zi?Q89P[@8c40|`I_sy(D%=/j- { S 2N[6;*JEk]S%/ = + =R7O!,:RBPS nac$41~)oN56 ' 13=+Z > <)  a@*oIf %{8`|1wiw i = js ^:u!%i F9s O&'L^|OL$iDHo8Ts&UxL % Y   5 v  s W W!-6?2LInOsTaaIG#8vDMY`cm-hBntPAP3 d4O~#R(=2b  y Q t C 1 m $6r6 O 2 1  ? *=+P^Y_VL:mmF#ueX*Suw}(ZB-:"LyFY/CX 0B{IbC<c-3w9-:\UR,j=s t94F]gHD8z5Uzp<lD*a{Ah7J`aY{C+~ M 2!8S9QO~O@jKp;SEHo /u jf0* LYd  $  / b  Ln-;]|( G  U H  1ACH83MpW4v=xa ~phRQKkKKG/tSi~64h2IU2U 6xW adE<E Z  $tf-"o. C Z ^   mW#W'+|0bh"Q w&?W}epuPapT%(ga h  M  @  t "  ?X t ~0<r|I8`rrVVg5}j_bax0YiTCh(GB3wx@Yb ] Pyy\N XC!&!? Fq9#  ] u O fd?qQ8~p`EfV3"]Xx[("zo`,|r &sk~g%_5vLMIwg%l]T+d{  y w t t = B E  m t v "  S n "  N } Dc V -w'#%^D|| Z   hg2F&A,_djsb,Q{V\Ug0l   | | fTEO*8Xvt<F P p jJi | fo G@k]klP-pZf;Gp"Xy'mY$Mz_|ywq"7<~*Lb1 [ q    ; z??pw`g#+3  x 9/ - 2 v \sWy4RQ#Df i^/.z[>g bf&<"FI;/9zmij mj  ^ d   @       rc   i z i " b y  % ; B   ]9 \ d  I  f  c s [ Q  Z BN7oQ' L#w|>ei0  /`n6J8 < 1 [ F!   ES   ) g p G A xV   T*w'z~ouFGBFZJZ/ 5E)SA_ DP<@!r-^N.ZwzJl/x,$ & t "  ?kJx<Y~`'Gi]J  I t,Zrjg*u~K F+("tw gBY( ?(cx}+?alo  L } J :  eU w C N Y  H +xz -Bu?S9~ cO%.V?7"9A/x3;:f / n q o * ` g   E=E6 i  O X ; h S5agn :h  0Upl*Lnb" KjA;A ;h%t<4'CsHO"VvwGYUQTOO0/v?[tcY!QnE!ri<0H}YjxmBtVbN\Q V   M h g o  a    LQP 7'*$ F-F /  w & [-Xgmr p,QocUpF`el"QEwyxeV:6)UyQ_myGTB"7TUDY8eWk=l$w 2 L  A&a )tZf V U  + k!& :24:TOv  2 / +f  @4y/d.%|2V |):%ZHV`&"1*[NP{X@#|HV|}QjZ! p *  Z '  H  # ` 4 @ 2& Mxh{px$;o1:KmNp N)(^]yy# A  = *PKX  ;y D v+ e ,0 m B :o}LC NA\v5-Jui c;L'X\xxiq=Ao[G #l5ngGC.! k u ! f 3O#'hX6 W z W  K ! h epf@|I*& l%7QHy&kjfSTQvLFK?| EJ("L,L_1V_@w  M m@   iZJ# Y g$ # c    s)\m03f}PG&hQiQJ2u _H &U :or}J2 I7# N!,0i#ED)I$T,xE5vjun{y aj6HH*beew v8  {(7   F DM   vSB_U     )  0a0`K` f  +I  8,crnaZd?4eT|{s2:P0cVWw/a4,[N\.Ui]{X* a7KI&gCwr{Pm4'Cx7#He-rK(M,&kI5<n,c8+@+_ y X   u -G dY -g*&,/C@U`E#It5L U }:~i0cP{mS:K;bH%f|M|2 pCKaodN{0o 4#W\R c)W[m  * 2 <Y/j"02$N*x\?  4    h f3  gn{$(@^LvCgY!)G*tqI .f n/'c.A0J#  r w  f xFub1&VA  ] ?  g 2bQ^ RGEW26'a37GC>@_0Q_>UdN}0cE[ <A/ &" <8 C.iR*% R )  ,  JfG})t$"0iH qq}y`)L.t |c!1<:3 T,B{58Ig3;       j ,u      eL  Y y{ef<VC/jYr<0j )jh$WgHw.y(35R<V~_8~3@E;,&wdH%.0[q?NVMo<fOL  L   =3V${@Iq)*:p#Wbx7 P N 3  5  !E3}!Q_UqEu~<6vT aNP4k30Kx 8z!z-hDNzmH2f1cIYeab 1 aRbBJ2M]  y {. ! Uyx."9zlQ-d#c;9>,~1Iee#1 ;$q\LIYpl71]i#=w%;Q0F)  5 N o   Y  ]n   ; kq~e`v}WXR{o%y &4DIO\8CkjR3ad-W""  = = 'u+vr#c3/GB-B/Xivw  Y 4 J MG{LX[(`p_l#}Y\AKz~4=qjm- ?!A$=/dAF< K)eJ G0 o _  L 0 h   Nk XTA(FTt QO>bG M`[|Zf RS6nT|mMI$?d1i ) g g  )WT  O   P 5 H ?> * mN * Q E &  .  b ~&*P]_ytp8H +a^q[zl=@NH!U@$I*iTbm+ LC$,n_n  =E\R\ oq`_E_oM     P ^/Aa-;eEfm-Ig 3(y(g]gXXi~  xs&Ymz : c { 0  y T] N Ey )  y    wv  n  R d    8   q p P + J K  P  > J "\jaTn@e_tNi>:b0J]u"7lK H]Dbb"v "3 =87h~Up0 O r s I8W#7qF6 HzHedW]g(<M[%,O/ r %m (  N ^ 6JHfEJz*S#k7As J]9WQ-cUgH,R o  R 0 p f A * 2  5 n qU <;J _!!{IY{04htPj,3QPW!)(WALO ++G<.!$ &|"'-#(#(j#)A#"(!&o $h" K/#   @2lOQ:x(4Nyb&z\2Q7~z]ݓ޳xEy~8h.up{dg<( ; )   *u DH  XyMzy,([D(B +C W !  i  [L:< &J &`2Wx2GJ*"k = :T  n  O A  } (c# -U8S43,cpk%L#& X  ( =9I[J!!w#%E%'%x'%'^%&$=&$%$>$#!4"8 Jq4:%^ J cT uetepr^\wdx4ZXn < ! lIF)i=h'l?kV!K_79 n &   {N N 6 j T  <   t F(mN&(!(TsXT[,&wc!2azaq^5 ]"   5z ?SZlQ%MC/Ri 4 S W{6 aUMXF PFd+SNW?h)i^;$%/;DlQE.B,%QlY. y;r 7 m]OHP!5Nv9hze DSe% 6M  h ) l (ytTV!12F}7zJcQ-rC:VcL.PS9rZ|H /1=a%GK < 0   Rrr2JJpnL   2 [ I7 X[%_]P#I[Ex<~o8_NYr5;UBlVz-W)LF]ben C  t Y;'RiVw r!###4"Y ! Z|DN<j? @  eCoxc@W; )3w lJ@H:z(F.FCVk~|]>wOoAA< N9  i L y O  Jf9u 4 } {} W=z5L ` q |YtyAu$ 8",/3V~r"S++1,<WUmDd.L5 M9q >O8&bw%T > m X Y  h  '. ]  L{AP%< iz=[Na h }7k\p 6 : LR9*r  f7KSJ4"8f\;% ,ZmiQ\_L"~A Q1I`+ ;I1 4  N z 5 a  f d  < d;idnc1qD-kS^86  h F [}lK4}Hhc< N!lw>3FQlAvhJ  _*pf_=nF'PJ[ D|{~ hHP pX|aA}(m? ; ?  8 F _52rG~+2PK<CRCV~8[~yb'!gczD  6 @[ht 8 .0c2]V7laX3f!& y/ ROoZxX n/h(8"@*paR,?;*KkJ%$iJP_B0+z[n4=S)eqDT '0GtFe` _A\?= OPp1:#tljbtRTnIL1)N  U  XQ reZ}M"LQ 8 l.; K:ivSZtg&^Ssuo'R n# 3 G`9m9m -\ߙ޲ݫ'ۜv/p۩ځFgۓP>q1 m<5d=2WM[Wo=J'3  GUs  </HTty?ZZh6,^oV,+S & % &% )5cNCKq]5sL@e//761qPklm ^  LP Lq 8+_'"!V"#$|?$6 $"&"8&m"%t!u$ !$di}S :A~ >J-=pXYd{k-_JM(KweptI)O &$  O i :>c{2~ 6KVLo O j  G v> hN~> +]SYO8. AlUcuay4).9V Ef   L B IJ, \ g x$icz?Xo6 F !  e   I F n d  | H  c ` /m rm16eli7],!dAYLR!fQ$0%j+RX.w6 , P J X   1~L;Ou! AfJ(A>kO#LKXH5 $t2  ~ Y/|Y6&~DqV.*yS&iO_ o|~+'q}5:BH9 G L  X Gv O nF ZS "   a  ; !\RLn$pp\ljhW3KF-&n7jySQ    ( t ~Y/LY \N%G|B @ * A =V &1 ^:cQ3n24 xnq߯%8?69-Ek!?QL=E(Xv{"C9`   T 9J coRh7#!"""D#!# " "N"3 n|f0T D ^qvC J 5@R&`_:?MdNj"- x}(')"QWr(J|K_p_ 8 C 4 e ||'0HM^qY   g G s p j b 3b)IdNPFT{}]#dH1 iwUl|"=o/1$tE0u-2n4  t G p } 6k J : O xpf _ %s{ :  = Y,~ 4  _gXbd4& I5( 5): .#]1^ v@6_fH-vf\=:V z    6 0J s rD 2OMT u  l YGDKa?I;C0TbaF7W62~W!s? VPVO `;q; e_11' b \ 8{ U P rmMtGLXhSP 13E^g!kjm(S > "\MM,6^F8XNMCldyqU)ެއI]h߯O5f|8cF4Dg :@S%a."Uh  D D     p1C&.r"e"$\%%&" '& M&@%5$" z3xt :+ 3[ {?5P)07B7r"vG" r=A< 5]}]h/ ` i Z y Hhu B, S   Ma   c     eM y LHQZF{n63SI'JvzNutf"Z Q[5Er.E@B$ioxS9`L;o9ee k 1 r z [uhP<  ( [ ] g? h>   ; +B\q/Cf-$!'EL/ ~_ZX ~1hDAfxPH#pU"BuN'Mic5; _   R +  b   z - k  !\3FmucfxXN*Q;xu.Pk|=SNIK WiM84a Yom%@r"v_:Z92&bZvsK>De   8 I    :o z&E  `T mM  ? % O M  * e 3jMAyi !'!GO{sx\_Z=-E|pMNAA4 ny=3Kv82q U f  b 4"6"C!z -U5' > %E!wu8s1#B2cN Gl1J0/iE~R^ q} e 7N pj  s ;~%Zuc A!B l M9   . }k\GIHMg^7#j^H[ =V& ߌ_ކ>߇I[GKܟ~.TM #W]"lJ !^ "|"6%5&'())+-T-/-/I///.D/T..,,)+()&%$!%!8^R?K)X ^ C# P'nl6mpn&fF\t{l\Oa<ަK_[r^7zRpw% / Sv7:q|"#3$R%% !$ '$!hxG0!   / z";!!~$t'W81c(4@>F=hz_]m IiU' =  5  u O  , & G=Dr}3~ {ZHo   I a  yDL H}k+U3SVDD%t[>et h--2B<!Bi  q  G 9 , H 5 ; &nz^@(D##`xd=9ut  J ( : O k <  9K4\Mt'Si+}x<}'6EIN0  < \x{Qe`s d! " "R:G)xO:eIG;AZ95rfH N`"\(B^ l +$  t  ! g!S$&/(!(# )7$($Q(%|'^$#&!$v!Wh/n@x >A n@ eIzYsZM> ە%lڒgls3e~XuPo[ 4&xy_&\/ B gU [ %, t w   t .Nf~ng(RC9L:Z  ^~RFah^."-n>ga}&7,u`Ay29H]  z g Z L 2  G  0 IwT> NK1'v2_9 7,;{2$]Eg7'z o1ATU>S%'Te",k0B9x:GXVJ  S  i2,!    }$ t Q x /0o{>_$   +  < ?T2 tULrQ_z3,-g yBnD/( PFLgTvwi?*J ]L9TcY"{ylYx O6 J 7  2  -i1  s  l Ta nxl,]cX\UB_f0Rky,9j^)]/okF]#j/nWDPA%=]'  |  w ,&t&8#}&Q(-*7*f,y).-f-*t'  %{" z y2G&".s' ~9!f=U7<-_woWGa3?,#`H. dGu { ( qh1Z! %$<&$&#'&#&C!)& $lu!J_p  *=  6U5Ms3*]M4_i+!iHS.{K 2 B I `A<siL w3  =p * Nk  )G  &     <\RN=o%0N]~~"l "DnQh7]XX{I5^lWUKM  d nvWp 7!Vc=Z(mp p /2 C O 5_#j1Y<s\_ ZWE="y.!:1QMYw@ttgY[vp.%wGJk{M44&u{N>E8:{A(R" R (  < 8 j h {  &|kXLa c"D?3qZvs=$j+,d+D$1$9 R"vN%Wi<RqSwY.R}+.qOw R _ (v *huI D gJ A , P  q  5h2vccDfYMeN?,[rDmQh"U2Bq1rsI/I%Qp">:Y    } ;6PVv).ahL9(U Xy  . HqEM H-^S6a"31 @\~c u2ވD, R^a ]]3]rQh ~I3sHyy>`!s l ;Jv.ndbz`y#63 hC.Jp+a;'{9jOMwQ)z@pE{Cq   Q ' =5)G1@1c-\73FjX"D`$* 8 b  xMVVO<-BlXRZSiF#WY#F`d2kr*_ d/RQB#0$ (U t  T A  n 7.[K+x\v)r~lhtVBf#McxBXG)EP:P=dY?)^6J(Dd}|)^n+' Z4&Y63i^u%'jYHQl    0  5r9\ {=%Yk'KKM u > 4_ d=+URFGp67trfvi+H޿zޱ!bN1zUp<CqG*K\x2B  / C~""%%('S+L(=,g(-(.v(/'/(=.(-1'{+#5*"&7$b#@~  + T]m}6Yly 5:U۱H- ݩ.ߎ9/ 5h%ie>2B !i"9!"j! <- ^9?X$@+8;2nne$N8נՍ)ӃbBdr ֶs-!]@W0uu^ V 67[R } /"!*#!"#p"#"#""\#"o## R#8"S 7>dkt*  c B\NdW4'{Kh3wZg$/8ݵP}Cٮ܄Td>WaT"8$W@ m Sc nP  !;!% dwEit \ (0) C ["gC7$G[W|YyO&m<"sa;m1W:Speosz+^ 8 M q`pKd# f d o = Y   K k  ~ k X  _ K  -g X%88+#N>=^u@IjM@Mg9L5?'sW_s"[/r BVmw#>D3 [2%b<Go02) s W y h 5 G\ p b s ~ % T  * Z =(2 5 5 z #F=/8-iX<$~*z] /i]VQ6FOzNAKb /+I=oO) D & ~ O W = JIju$,XxdS=  !! \Y=s 2CvN; 9wݘA|ܽۜg},JI܃ލܽڰݞz=# ۰g'h?Ff@"I f2 e % ^UWFO "#0#W" ##A%,%%'%(~$(\%P($U("( (((2(&%E6$!Z?  v7"^QPx0R YCKQ$oӃM޾)ދ)_އҖffGl/3{f"} ?l  ?W>yYvUQ!'a"a|#h%i&&41%\%%]%@&@$ue!0 s b`UE]l(*;?Bq[G%:o6hpY.F:{A 3@QP vF] B1F!""$$w$2($*,%+0$*A!*j)Y'E$  4 yi$m3[yK%<F17y;  1   b g8utvH&js4 pa8@+1CZ<$den6# ws9~4Xo`Cm^H;3'<`.;! o' AnRMbH   C( y` ' g!1J{/bd=C}e.Bc!`bZ;?z\ ,1aj.a(309&sNt=%L|Di+G A 0S GOMht3<G) *   :zB"Z,m*C2e;3[o]/p; 9  V  g   4 $L : Y  b.-@$mMQ ,v[GXp+w^Gh&Lp=bohVx()*QSL[X`8f8lC7QO,me : } zBvY)"";-%')H*t!("_'#'I$&$*%$"# #a!  :||i [ \ ;qUoRU%&Zr.J ݾ/Zn9s! ފK\h=0^p7n?E/W2 j6#,g{ c wW`mL #B&p&>#)i%0+)&\,'h,~&*$\(""% # Rh +[f>M_?+YM0w;#B(\YR'$}hW\l]T'h) P  : `l\  p 4 = % dd e  2 n } w  6 !j F[   N5S]clk6kq e836 HhuD>\=4I1iz6 RsR`r6evA:[ UKzS< r?rK+=tz0 OIS_>' @x , ^ o   oL`@N$@NEr!I!V*7?lP)1D;x}T?'QrSkO}k='}cYO2 t$>A C&rN(fD!<.%> =I l  =v FD * f K L( a Qb"5G j/gPi g_TF1 'Np'wI;n_W6rX*Q LNW;.}#{QqDp~9p|/(k K # iF "$"'$'w&(m&F)&8)'('''#V& "4%&#y!+{=+ o S.y u8_jh?4? ٱ*زonܒۊܼ;ݱJߗ U(|ܳvqjk\VMk@PyQtQ1rA . `Uh !!i#y!%$['$($U)Q$p(#'<${'"% #|!^G?(L  `7&*/9;?I[(f|oH's P! 5)$MBGW:wa  1!,7?2:1`B"T\xd<%$ i KP/D3+"S| a @:ߣM݀3A VڄF ݉Dݮ[h &Mcf~Z"] ?7  K##)](u0*J5+6[+7,8+l71*3(|/&(+#/' +#[=rw k ] :Up 'T!;g"**eQ!4pI%D8u 4Td.z/w(3X+$A? N F iy}]N zS9sp7 a ."c1G/Ty=35@|*Z83cOd'Yt;Z  hy=2TKt" p6 7 e   F v>IG) )5^kz#  HJ   t d - .  j  } 5RL7W~UNGEP8!oZuImIV5"W& <>A w4bA3o]G(dgbw4 , G n B6 7  \ 8 f YE    )86e. K?s  A J[  x /Z]-.u9L2vXuPisgUc6x8h uA`OsMG J z  K a  PU     f G}pB)]o+N  f } D0pLFgecrm]!Q8߮Lٝؓ9L߃>܂N۰lr,Ԉؒl?x׶ܤ"*I,yc]d ffi )""&y%*V)@/.1>1)21y5(484;7  3Dv 3 7 z  ek%V _r*7RI/  `  s   R%nL9"+]d rT>{yP"L!rYwKohY_hh{ r? u >z ' k ; l R -  =" q +# yy C8 V` 4 h#4,gPX:ۣڤفYٺ۰)Lܯf%d=03/+|H 8 3b_ $4#c'%)'+a(b,p'-&E-&,&O+0%z+($h+"*"(")' % Z{ Q=R b* b&enr V|AsCNssUr(>F\cߘ8[yg\>ߪ*?-L'fp6vsJaN|= | # s7mA XS#b ( )2"T*"1,%$^,$U,%+#)E&C#z cx7VTA=y J:=:Mp\& !68z=)~kJ' PF DN bN ]$!aN 6#$$#&'wn((j'%z#oV! Q g m1 @r"DJ_ޢکpj>_ nњn BՃשFsyxn6Z_ <   ~ <  ]SJy|-*(5I!{  K I IO  D "  i ;bk3 q. $ < yC z< x{^#9VAMg'`?{'3 *Wulx|"  t  F + C   " ` ko08iFa*, 3  d S8 x` k /a H 9 # Mm`Igbq8hIuuAWN@&2^ XleMQH6(zK;h  - 8Rk/C~PCO\*<VpDq # u T _ F z + s U I y oa+ &'3@25UaaVH:nBߺۇCH߇ۄۑܛޯ9^#"ah\rR<6m1 ) `Z6Ju G"#/ $}!F%"$## %#\$!! ^!ZsK 5i{ ; J9D0:odXߜ޿r߼OfP@ZPk7= n< M z 4 N0* "" ^"_#"&"f*",f$_,$-$`0#G3(#4"3*!t3!20-G)#EZV <SD9gs1TaJ%t4t?_is% ;*GқJvGBF`պB֛k(۪FrK8ir6XR82 oL & B@h6 O!i$I'(d)R)|.)(B'3&#e  W <m `s$fe2 9wD7 _0}w@D^<0##e5z4IPlOvG '> U * zI G U  mQtB e   jpk|]&Pb+z2~tC+Vg+WE4ZWkKYYJ"YjoafsElB_Tpv~)K*B 7< B ( & J  e V  ,D i  LdB  i  * 0  S   Q Q !f SC t R  5 z I 3H<@Pdo?$ASO Bck2elWY_!BE'sY=Cj-. S  : q 9,wN]n   Q W  %~f.V"|9r Z P?{=jv?_:oP*dO:t &=< A }`   aw<@3`  1|/ V sEEy`=\x!= x rT^;E)ސR3G ߿n߂cES O. qt@/za9!4)WFG#6uUp| %u(P$1~ JeI8$ D 4V qRh$//7 b b POU0#&4@vmܓt۽ ۞rڙz/ٛRWIC۾ۉV)g%CAIm8~#E>hGz$&` Xfu9@pSD""V$@S&<f'b) *B!Y+l!,",d#_*m"& #"D!?!Puf{ o *6.t1-Rr@O, EVZ!a@, ?#0Tp' zzQMC>|yJG%sNcC u0 * A 5  Y p  l_ Z  # ( B i  k:i((}ߥ%`mjZDU۲]/2ނ[nK\K:@-&:f q / vWi $t & K("~)$R*%Y)$'$A&%|%x&%I'B$[&^!y$!Z X S! 1Y=@ZDsVXMq41 ^6)MvE-.?<iGl (\<A y  * 1e1Xx_ "s 1{  wI8 5@)\$A.%na}X;r[IhQ, vK'tCZ{) 7A 7 8 $< Vp8E;yg "  D > =   O \ sY  Y~ { [Uhe?\MV[4Q< xttCLChJ"Z#SWl8?&{ T]L 7 J1 o|3|   6AN SMM <fl!oC    Y ,D u~Tu2KHazjhmOOL v-UTS@2sZYs(:9QE"fam  l 7  ? ry D3#V-~- ,>y?f,O;.?h*]E[P:]8AafzaLZ/5F#S \ W  H:pOSB>.h]\ ^&]XWQ+` 3   "lU \ b  Y 4(:B:4+Xg)I?|"o: WTR:[Pk&f #  < Y =3`1GV 0}4!gadj@   X-f`6q,#VB.a>߂ݿ2߹FmyS9.2tM ^^ $ 1"s^(\i"M"X&E%('d*( .Q*/F-/$.0 0121l2_01-0*.b'(=$Z$; !e YkCYjby ް4܈ٲT"9C ژ՚ۜuܘ/؉dڤ".`VQu,8]X_ WZ5[` f  $[NVmQDyi bWP9DY+&BMw b I.  Ehn#GA Z9BemX5m}B6c'~Bj2Z-$:9K w *  L @ m >=U<NG;]L"S| Y I 6 !  Qa^J&9?xq&i-E#bpb}73xYknkAnfCMXN2S|y}_0O!DueLS];0a\-+ M Q  <     g J 4 Y z | #  Y J ) += `b S ^  g t [ c d r @ k j w s ]  x< l <{*{ "~W7J/,:bX9p}FY< -o%ga2Z0   B e * _Ug1#\z.8uR@( U Y  yj IL lTNij':]Q {lY3K4wL& XCbhb ? ~zL qT  #"$W#T(7&Q*'K*s'*'O(&7&%d$>$"o""!L}6R L ([]I ,\PQ pFߩ{ީٙޗj8'TN٘OٹݙEH^ޥW"݌<4N[ gy4)mP `S C$#x%E'G#)w *"+'$q,$+&)%'&B&m%q%"*%~ ",~{~z^  M gz4_lv43MިMX(zމOqBqeH%fQEmLd{ _k 1"H!$6"%S"&g"_&@"?&"o&`#l'f$&$b%$e#n# 3 d _'p%Av)9H:GD {F߿Wߧ}UݞRڹۚfDI,O^Hd RROfu' ]%j i%B'  ( v(!)!'B"!% #\"!'! 3 7alX5 Q H\  T#Osf:c qu2UZRj:_fFN Cf*r1%R#qnXSqE!tJy8&=s!Q-I #kN! zAVS  * New. xuf?P"VupV8 XnGm^h;eVU;]wa[I!DkW\M4@PYr%wp9U] U O 6F 8 E8 %!$ &&! ("("*#?, #+z!+ *` ( &!u*n+ dX<]ThAߊpFxF j 'ҵ[!s|;Ҿҁ]=ؾ"ݙcoQZKk   $u9~ d!"o]# $!&&# '''/*F)d++v,+O.*-(z,'+'")$'_&t$!x D ' 2(5?z^[yK*Dݘ׃{wٙz܅݋ݜ H+s/&SG :  Y2 !!#U #- #6 "O ! /!: ?N^}ba   </NB!rMQ{=?%] ߚ;#ߨg{8$""\l1s2 5 V * < !F>#%%+(0(&e$"!vE L/Ut  z|  kc k R[UJu8x{|xQ*;M`>@ L!_v o D *w &.0OLM8[ pCgjc11*bO5,u'/0|0;;x@\sp&8xfnqv>rv* U }/bjn:C D  &\ W p  y-Z"Tth2w>Q etV(  D E [  ) E   *  I x   -  I H/ K ! <*Dc4  $ijL[+ VE>o nw!aqx0a{u9GE805V{i H+H9 f} v 5O  #jWc!M D l ~   ~UI],m ` y"ܼW0ٴqk٬1VyXTOg<6q"^Ku M- *2~U!%"j){&h- +C1 .o2.204o2 4k3K4 54515b/*4-H1d,-*,)+)|)'%V#e"A|n.s2 XivR(+v.4HrmBe_*u֧ۙ٦l؀؇Jf~mڙA1KaadS(Ga _3 0j K> 3ZnHRPRqK}   M~RD+H#oohj]C 1-t}Y*enGY7X2y-^I' 'B" G { 9;XEfbfWo'!y!Xz+|d"  0B@ ru?x30 + ;6)yBib'>tv":i?:g9O9M p  i @ 6q 3   V z MvK"!69\csyq W ! E *:  w Q  t ni}_'zI6$PZ-%S}<)AL#:@wB.0 #53Ey:c /\ 1 S Ih I m  # I _ c + (B|\MF',j0p1|^{  %Zh|g4 4<8 m(޺۠'&ra^Ղ^یbݨjI.p-%6S A U r !#i$&''))+(*D'*V'*(',<&e-&-$,"w+ (%u&@$<7!'9#x Jv 3 W! :Qk*ykތ[ۈަ׆݄ږ !baۯމ܍.W4lYouCBEI\~ B B j tub Bprt,y aR r e b ]@JCGDbTL|B3y}J o JDT,`:5 v= 9   \~vKLC E   !! J 0"L ""K!3",!!" B! 3ium1dcI  ecLDMBmg@x1As״ӫU>ԋF{ԿՁհ׌؈ٍpܷޓn(DN118$|jy[  H 8sL! YgVh$} #L D X   y^ 1\  V  O U  [@ZKpQ}N>B-_tTH|pg ct2GUo$/S1w3^s|n1YF++Mb[[=bWQTW;4UM c>S~HV9" ^LX    ) Z+,IV?8 5 xI!3F (O96tAbe @ B +  (^ aPt~a|/F]Os2 uy}#@8?    fQ^ O ]f&L9!IxC /# 4}3zމaQۼۡ~܊ݤل(ڑ(Sg,&"O&nol ` ^j8E{ 4u$W&g $'#%$I%#G$_#{!#Zk#v!\!Hy C* ~'VTDfAXf0>/Q!dLݓE`ݒCފ0A_)hYJ|  g +l0!$%=')K)-*201+1,I1-H0,/C,0z*0'.%)#r% ` ^gm g7KVEoL&N'{PvYLިڥ[EِٔՀլ=Ջ-ձ.ۨ~4~]ޯs B! OCT;-0E 3 iSS3h1nPW^^ + e s, WOU?G~_7{ep#>]Nj7g SqkN3]dDAW-gh [ 4'gn?u*!7"c/K~St691a-YjMmI}xXV_roOL)$} j# v4G-bn<ssY;bpQ7#:PXomCVOq9_D-YZJ Q ` E OE66'.i :N  :.7. @ 3 W  @ i c oY+b6e}QߣW߯;cn$:I1{ !kfb+I T {D #'6(&?B8/E H)A_  3-l   }B1r*@f"]WAwg?@Cm}?mA3x=/c x{~ L#R"Q%$'$($b(%'%U('('i'?(&G( %'{#'l!%V&#@f!1, 5  e Xr yvRZQ7On* 2էPSѷ֙bSѪwҗ)2@ө $OӐ1qָVikuF Y']ImXxB q a+_=i& p _% ")"<-M#c\Ub0t9'N^~y<4=1[vP0td):Em>PttNU?% i ( _ Iy =MT TU,T~WJ q H\ `Y*hh)4AA'6d5_8W:I0j6:(UkFf   w \HL`+;"$2&F*'&}'p?'3&$$n"(!{ >c.x 1& ze2Xga`IY a ?۞>ۖC߁p+^ٲٻzG|ݐSٷު3ܷ ݆k6F32noY(I z= /T !!Y!!"+"{$"7%!=&")2#+!i+lS)]](k'-o$,$ Bt k / [  %%"l/&g;+m 6*pXFxi| qV s R `  09vz $P'!)#*w$)V$' #$_x#"2 YY!8 tw2=7G sX"z5n ] 9_(dp0U]#QDߐn[ۿ3߳ئkyۣP܁t#j2JZ- !e t|  w w /-H^b^ !  a )  p ,@M=Oo mG  y} I5*gX 3H$H z^>}^L_SNh:nrW$GFH]&SD:z7 BE T 8 Y lA '65aP8.yk   z Fb7if S  i ?+  |K"  / 0 Sz ]9 gzS A9n3 h T s k . =  [_^0`7#)`!E^f/D*d >ܼ=}dFNKOEO/x 7yZ<9|ׅ`؍ؽ,ٿ|,؎כyن&D7kbScy:q{R   /s:RR S"R$'&(()s)p+)-*0.?,M.+U.*6/)0O)0(G1Z(1'0(F-Q'_*T$w("7%P U"k, 5_>s# 4s~AO 'EfۥOKُ];ؖ@f&Q""sWy[ \ F - /cR j 2  .SR6 c cA44nw}oL$(d t1fL&'\DH< rOM ? q  Ac )!  O!#>#{"A+f` Bt dpU  -" =IYq:_B:5  Z'kxmm"r3 6' l+Rsjp]G`e&85t\kX"MB _z S  h` !  ^Q|qd^bM{W$_ :[FxSVAKOZVNSF&!sf}eiy>݃IP(چGڌuڧ`z?ЧЪwܹl}vafE; +x2 oul !KC$!&H% ((c)+R+|+E+*)+)C+\'+[$+e#<*!V)(5&$U"xV@ ? J xsBVg6%nV(ߍEڪׄi|1ؕiؙڰެ DEcM * $ {6 1KP !"_%?&%L$("V!n!,9 $qo<>"W @ ` 0 w~w2obV0Eߪ0ޗ]g`i?؈Xޜؠߣښb)߲ 3/C^4D 1 iMB6fD!K"" !u#!#!+$! $0"7#)"","x!V!  W ( I +]   07h&|'AXxBMm.5&n"_:ogc&Up7& ~s \Jrl 7$t n1GGR[ ֘@JHbۼ6R8+gF f  ` L#%UN$#R###!i"CNaX 9= ~` 1 I n ,SgWm1'NWF UFߴLwuAܫLݫ߾BT zY <)I!#F!(#-?&f0)0g+~1o+A4*46)4)2&2a%S1=%._"+b(U%!BU S js6!? D-LhܘjSٟҧ%ϱ&!LJ'ƶ\Ĺţ^ŏ'ƋY Qٮaڞ̂sF)e9޲{.r ( cQ#6%(#B/>&'1*0/.3/6-17]2 9392:$2i;D0i;-:$,8&*5C'1+#.f,($"! * &udSs  0 W)Tc~U#7`S(5}߹*9R]iAQ ZB>Z K9c  O r_D  I    s  "]e]'m /4?}yg9=Y~Q[%Z^8{L\K=iw< M Rv N }Z9.4V: y "  o P0   gU O d   % Z S&=-y=~T, w GUw;/#`?Q~Z=@e9C6+{g3EB<+#z Aߪ%}7[ڪ Cޏu 0n)c.tW* / =M3! ! #$# f '#?0 B I(  n!&5nd/!;&߱gو֦ٗ ׻i2^oyEf-)l]|s/8  7g9 !!!"]## '%)$<-'/*0,!1P//..+-"-<*,d)+Z(u(J&O#C#'sWLO". j X^ B޷׵߅ыvrR"԰j31ԝ ,Ց̆5ͥ3 Ճ΂pKЈ޼֡0aJz(MSS,K o4 N gM!#%(!(U+* -,3/:/00R20*301/1/0..-6,+5*#((#q&"9#c  G."'XބZ[I].>ߗVX>"_Tvtvk}BG/    7&A+gCpxTPX<V 6 C a H  :ZH&\.EYnS\j8li.ڋ*"4߫}ܰՋڕKAӝԉ,W۳bVaT!|xB*)Y/k+ &vX !=&!)%,&/&1a'2(0*J/*l-),),),(V+'(%]%#!8;Wq_  < a N $D_)d<E6/<3$6hQ_q%QFy-Kyl8]N3yty9B\Y{_AZ 9~ckb'(+D%K;JrM?z'3Zw[`6@~8(  )  5 BT  B| f1 X W  {  XGxUnZPrMt [b8HrP __8]Ep$&4xJS R/rD"%%+#%!%&$%l$/&#&"2'"&"M$o!"o^|  ^ aiUH6;H,uߠ*oר`Ggk7yLע'ݰۥߢ<0O5h]P HWXJ6t3%!=!%x%*D*/:,c2p,3-44/O3%/2.34.r4-4+4*2+.]*=+(f(&$#)!!*'H <S>yE,ZQ5rYցՀsePdd;ևْhބ`T ?K(.  5M gw2XX[ ] F!"O !"! A8>mM$ e[hj} v p[h.1OPd Mc[-ZӤۭ)y!. yA56C[W| u + O   h! gx C7.I#w,7o!'  B -V1g5mnX{r6#Gr>'&!R {(- dlJs['~4A64/77Gc ":g,6WKl>p". Q L>8HVTiFt)Q_d8DJ{4m`=` b zkiaI.:o `B$ J Q l C8ME3`nf  Cl.aI>^nz-[`v  FKVI   ! ]mba@q 9@968GA|TW<|ThUcGUs}ޑs#ݝJ6NUIPJwR|)<]W~:o n H Id L%'J(b"D)%*9'z,'-+ )j*6+))+`'+'*$( L&#G!S :L UD m<$&(B=6T JGs~q*:!]ZX-p Q= -f N_MGq8(?H~G` B 2 m W|o,ytIt#}%w=*kp1\,ږھcވߵ"9bgS[LS[%p` z '%!$.*$k.s'0+z3/263|05403/3/46-4H*4(E4'2%/", +(&K&%!# xv<Z rz 6}*Da<]@82ޏ ۤNֈxH&ؤ`ߔ 5ۤ$^Jw5h )f0@k*  ~ F U pDU+.  p   W < e  8  o7 e R 4| V2 IVSA@'Zy,0AU !s   L  k70<LJ , I Y  L 0$ $ 7  y "<iGS!R gP3e4^  :vyZ, h  ^ M f * h j _ 9 2nY3R0-\qrT\ߟ]>ܙf޷qM=I cDn Rb [ u7pkx M {  pc*_zJ "$+g'H*A* &z$C"N(! ! v $ ;7bji } A ]UGH{ln ]rqZq8jq)}a$sE\ ApP p{ [ |T  g oO21ENn"    Hc[{E [TgkEQeRk*) E@aAC0H8;"X'J= 9# ")#&L,"31%5'6+6/71849j7`;80;7m8635."4+0&,!u)9'o"  s ; uUZ%zRjDv~(2fm*d5>TEX+!5PZt9J 8F'267)Lp%vB^REDp(0X~$hfiwH-{paUupzD09 c{C MU _ JS  ]  N H p y  fZOHdLa q ; &7N5AH6{>\n?dNkUL : KX#'s{SU4g {V?ckt  @ m  G `Q_I!v##s$5#!V BDS1 \b8 tpbiz%:+Y5R" .RzsD5nq]FQ   {[(;@S ;`|bHrna. L   {2z0zH 8sMWC^5sNi߫)*dxnxM*)+Of R&{ C )Qh#E(@!+&/,*1H-4/40k414(4,3506s.;7+,5o)>4&1#{-," )b$=". I 4 P 1zW[ s\ cfaVR;&/cuDmM=z 9tb]Vj%$j=0FE^]8 v L bs 5 S] 6IV   W V   f x7S ` ]W5dBb;+Ahnj6w(*Jw5 kg"fJqyX%|6 <> 3z  ! J r ;!DCD     [23=Pfl,rB : ^!o_Sx , U^ 3 u`e)Z`1Lk9]kW%\^B-mIuU J(,Sm%@"4i?hcB`_hcMH D@ : A Qy# l   ${f'*(())'%$%# !( ? n d?v3 <6iW  t V`%PMF\oLdQ\Eb#{8b,mRh%!4 eQ":H%)V}a0%   / /%   Rx1L0)4UV1zZmJeDT&Bp4M?S&2se()D:w ) Ed9B !O$8#")((,N,-G,/ +0)0)}/(,$) %!g$$ zd/& I7MHs+Iy,zB 1fg[Q!ltLO=k-A&S9g( {O| c   \`!Rn$'*- ,^--bs.!.7 ;/ /!w.-+i ) 'A#"U!{?= ,}c4wbQMu("5 BsbٿV ؼt֠ח_֤I׵>ۦ 7,c+$;Ghp'D%UU2kj lRb 3  V C W Z  x T[ 3 78 `   ;!SaSVgF  z`kMZ`)CvXwk NV  xU v&$8(_S&yS  '; i I  F &%!F6T=gT3zvJ65kgy=ix^CwvyG@lM+"/x&i1^uPM*'"Ho,wBHcO_N*'>,nB+H*$rEY Lp u+6!F{# 7&!w&^%S')w(*(+(W,'1,&+%+"*!,"#,.$w,Z%+>&i*%)"&K"Qsc kN `oa;Zx]=I'cJ&ت 7ՀCӐաNmAاfܮѾ֧@5yߜgL% U :(?X=6,M ="+"!Y!# 7[ R=Vga c$F |/~Zg]]4TNHQu~#z:)6&kL%r R  N$"% )> Z,$.(/f*0+2-1,1+1r+s1x*0)$-N'>,&*q#&%3#@- # WulgjsnAY2+CX$=՝ӯ]aԏԤ%ՌqՌk8pUHS'X}ݬH8LOsa2I bsQkR ]# ;]$ F ! ! ; <x;ZFIW9x-&?vL) w f 3 @ L S glQ6s,j7l75^:Drcj]K]  N  P ] ] Q &29EUZG Y fd :/k,I%Gxjz2&;pzHUq{<*X giw 02O 3d v 7 #&ylH^ t . K 6 O  4 &s>x%[-~qK|W_H8p5\5VQGA<1/C' u, wW!L\ "  q~ F w/2'=!f Js Y Vd'0MsFU!U$ޮ>,ْ^. aH$/7C's  @ qW &  m]zGZr - P3Uv0)==jE `8#6de)-i8E  z@Yx1i"!#"$$%' $+#-%.%.~&/(D.)n+t(-(\&u%L$!"'O@ 2 ,!/|;5_T9|ڰg؂BӧjyͺzͲ}͜ntςw֛҄By^@.G XZ3:I } ]}N _ i %X ;!GR7,^OP7 +<mX F 6 NP7g6iNn:rM) Y?m?%lr{b  >M  ( {y @ \ )[k- &*V>fGw+%dyNw;CsIo0In3~5OX:7t5C5}.i, a G I I !- qs `3    a } % X  `  M / w<}7C)+J/ )   e 5Q o 5 )  %&j4 P Z $PQE L 6O jTj)Y`H9 P"ڄى\6؍WٝܛݲbAp+T>.xF q b`.J )oY6<q{Bt2?\g  PTB=d8M_?Mu dc>܁݋ *{b :w$IG`q rv72"#-%''(~))*),0*a-)-e(.G&!.8$,?"* (<a&9#nf9l c M|MW=p>tPY&7 1 WW)^p a~LAI?G| U|Qgly  s:!4#z$}$U#.^!fz,*=A:#4 +   pL\`u*t &#(DX=y"CE.X .m F * 1 T Zr d Jxf="tgeEA$oG7j{ y|PS(GB%l685]!hCza_7iZhu.Ku|Z[P)u%Odj2y'vs`F mn  V e > w  - . z , r  7  j l 8{g c@W{  4 &/  C7kL S s"UnO#  'Zg(?m_ a  v?2 0@2t4sߕߩ5ޅdެ.߀5MT ?dH4nmr;l-x VbX:e4   `==!Z""B I8?(sx, 2j@ V\ e@2 P6%skv!{!;43& X Ssw 0K8sS#Pz U4I~^X |+Wh T-qpE] x s :j0"Y!&%=+d).+/O,/H,.T,.*-])+")(J($%s$#S H ;q} T vu lK%#flvwނ݇q܎hjzxBIi3fo& 5XC0o\\[ak/6Wb\u\zJk"  @ v * g 1)/ 7kw5V{5  BX <c U1JMCl&xsB3Z_78gF8NG|2Z;uE)awQQ `  lx   A  "mqzhFX , 4 \r#i&=s/Wd&Z:ߚH!ܷxڙ*ށ|ݸܵ ޶݉{\*.: x x 1Y"G&8*-t02"o6%:(=8)I=.)A=6*;*8*88(7'b6N&2$5/C#+!'!&3 $h X=kOU Bo_`BHaPk"ܝ,u։ Yӹrzѻz2bD׊33/HgIH6T*b  a 2U&I$'>'& %"Um^v#ku  { \ wZh2 ,`[9CQJI1,+RJGؿI"ٷؔځݞ^[N;%X{7) d t) @!{$%b&'l&Pp$L"M!9!"e"!gc x-  Yc &bS:j5:U1wtd/lINnj:R[gD  . a n @  B ( B G tX Rz0o'cTi++/ .K//A//0E!n3h!3!1-+B($"&M z/'eo8 u = >xvoBM,:TR|HEe)b6ڬwܑ z5H|V-,~t[^(: c . &  }&GGQM +3t>HP HF P `E H1tߋpڡPڲٷ٪زm`גJdյn6כt,tܧah8W%  v{#cm( ,$+'z+)v,4,-./Z102O1r315I3S6472^7<05-z3e+31).v(*&1)X&U'C$",x(_  k w:K:e hQخEe ӏ(ЅُEϓΫ<σl)Q=әԨ5p"v4+;x  `  ;+Yn!!gn"No"=!B!!J $F \Jh+O  B D yX<< -Ux-4&1<1Vo$W YL4pk5 , tBf x{y  [ F 2 )   (GLGGkc;mVWY-gh9)8vj9r3)\v  ] C{ vc  pp _2*= n F?N/M W)]eVP0LCr{Xl v p 6M c #N%R&%m%?'&&~%+$."(v>0|Y15n ( LPc)=][a2\s@=NDx4#b)7߆ޣߘވ 'މ3d-Zr=kjZ{KKQ1 u ] 5y *$'(6)$)%('Z% $u7 Y|  `s  f :nqU ORSvD{82$ Cܭgڢq ݴޱ7IXB`#jy]b4[ vniU}H5 1 7 [ d ?G)t!G%"'&(q(-)*(U*F'G+$+T$J*$Z)3$r&##1"!fI .YV}m j @ &Xxd{%c޶qHܦE aޅ>`ߢߓ7כ׎9 ^`2Eyu% i}iJsxw Z   )r !  =  f  m   :TB;<Vq+MUJ a r  epcD X\ff66^jt^h{PfxM  #  . H  p  K   x 0   Z ] k"Oj {z0OGs``o6@nykmX Zk, }   | @ @ } - E % & "v< ' 9 h[wN/oPc z- r~p[#S$Y 77. (<T .  ]  6 2f,? t' 9E3: U  . PF E / n < 7 M[A8 ++6|19(/ kSC/%۫*vۉbr`LedFTIbSzQ  - a?G !}!O!u W!` 1QNCR (mH 7 -2Y_NiY`As\{?,||B/1BF+RvyNFrH .77[M QK  jM!6U "r4%Ii&&&_%$I"rz  u  JMSkj!U:O8rpAܓUݎMߡCpH~71.g(f^F@_4~|2>eFlw o9+_|>-A} {p 'tgv Sk8 v l u) |MdQ)REI}N u   E@   /  `o  8 a  rF  , s[  <Z@T4 fh m=r"_ gpP\ 4U+Ee?^r:+upQY>D+ܖۀܝqCߥzZ9lcl]a W f) B5T#W;bU !73"8'!(XQY yO2 _M*.M3$BLH_e,%4=wn9iul<2>a2,@h`"O K 0-0""%Me'!'#m'$'%'x&(''L'&\%%"H#S>i+TW4:  jLoKtLDݸ75װ٣ֲ5֦Xeڧn(y~n!NNX״?+ 1CC-BS { E }"- !C"" u#P%M'>'(!'}"'%#'#&##" "! x!% B! x  q =@6Eee7WzrtKwjtd9 P%yVSr   SJo9w2cwI ( U  2 Dy69e%=M/< ig m%eGKS;A bbc* : (3  /# 2 > d 1VH  N ZB  G %Y9^RL3u@$P60t.8QF0i  3  w | } -  W  0zr\g}].%2T B  eN  En,:fBH-O-%z2y$J(i j/ jj 0   [F:o-3wn!"! q! 5vpWvO`G  2T'O_}oHOc~nv1^j0< 7W R \ q S ] T y* *CvV&IN[o |   \  X y  yU=m0NR/7߹#tܸؗDڋ$.+H$h/3";U VN.E3XE1#v"9&^%'''(& (%&% %%"%!%W" <U~ *  !u%3J4x\T]>:GIak&[eQ41dP,4   Q D 5dt  4 O @ m|u}"z\V!Q-\)@3  g 3 J 9 >) [ k * ls [5hq9n%,)Oj|w|Yk} n,Zu90@B M < h}    8B EpE`* |S{g1!E[[ V | I T ~U#z *dro}qZWup,0mݹ[يazڝmGc=\ipy){"P$R p@ % i B d P2s!"M #"$!b$0!# R"=!o"#!!8 `ByD%= i F+O\aLO.LH!A<,dJDf6hB-SRtn/ "CciG : `(+Xno_4:u:Hdz (p }F P V8QnbxNHia@m`4O[k]/43h.ls*o6^3r  U ( A0kC6?pz4 H n!#!#P RR=#!>!H    XJl4#WB%w}zw@.wm:v*|g=nD3r15xetx]^RM{.9m.W :F Sg_06vTl|6l Q

S|RhsW e l)   ^ r   XO  ,    8 P  \$M;kBJ& ^dH + ;wpX?l_[aY_,Iڎt&cEպA?KP7ؔܩH$97 b   V r 0 a& "% '">*L#-?"0 }2 3"4$2#0!+0\ ,I7)#'3#Y.uuu E` zqbpgCVGUr^s!ֿݻw"݈B+ԗO\' ߷ N%QU'@<x Rd 9!#$$(&&+'x.)F0)1(1&1%2#1!/Ix% vw9 Us;w   7 * X +o C   I V M   ?@JNPL j  + # otq4toqizQ@oKoLeGV5`_]KWAO5E@[Z1,nySc3+"Ra A0nW+  [  !>/`),PwT9g  r^ X**ZI-t]F1t[=FRynN2ߪ'*>mS($ t X 7D k!~"$ '!(!* "+!&*()&TS&&U%EZ 6  :) {!5Q%7?=WmF6Xj.\b^)bP :Rtkn.yXFT^g k . $ P ;n,=?!r%$ '!?)"(l#(#(l#'F!h%]!` aC I C Es+gly߇ݏܽz۩5;ۤ?8;eHqBlvr`HQa\h  1Z}*f!z#&%+%-#&-'|0(2(63_']3&3$1K#!/"- 8+$ )'#c D \ s+ m$|d'IBdnܮLK`ىݳ+H-{߁]\Y#7Q,-'.t 0  O  + ~ ) 7 N c^Gq[7I! C;"sW%%  H " 8  7 c  v;i}wwm-B*v}J?FJU@x+C\!~wd:@G}.U|ff)U 7<G<F 0 J iUJ HR f  jM > > b  C r P3lg"#!s. \K%_y8 PD2ضߗ 0Sߙ* ,DdAT*,S. L j ;4 X"i"#$&f%'$(#*#+#&+c$/,$~-$.$/#X/#.%#-!,$!9*#&["iS5 ,) ~+|:iCދ [Xܹըө1ӜӖNlТ?2Xدdڨ-ݷv"ie  \[w BA "!t#<%B$'y$({#6+S"-!."-`!,H*&#rI ? W ! m]XCmSlD\U< i $ %R&E*(/X+n4-f5e,,6x,63-]4',2+1!+e.X(*$a(o!$W G% '  K$?HV9 s{PLٚp7"9p֩߮-U_'ۭl Yjv\LM?1 :  p t &d }!yL!P< "n ?j@b@ml _ +  NM!%~HPgO%m:z\qEQ[[v%{K[    HE|c:"{"*"!!s!? L:. > =, D   m"DnFi |*m~alqP @g@n9[c,eH_Vyz"}?]qp,~7+YdYog H#Yb%aDu<}M  xn 5C1d>KLCx;8vVBx\AZ/T5s(nk ?  0 ]vQdF gJ܍ ޅBժIץځrX*16C <Ql  .B!ub!"->"s\! GS`Kq + ;f* d xt@hAfN 3>[1jGMa?,Jd R T#<'."++(1. 92=5$A7B7B74DY8C9VC':A9">;::580T46)1#d1!-)4# ^^J ?[q`qKI~H5pܺElFҿӟэ3bɓ͔Ey{̇fkwf]MԩϺB?qޅtrvhbt g du.'R |!#97% K'!("(R#($%%D$%#"!"!  7)N  < @f[~[+:zQeis" (C^6cfdZw SU'lLyCcU<  R    J q:$$J q" = & jZLWY~ <I7.5UBT2.,`US`GW7H!}8f /8,.ZhGlg$g?^k31JlZTIM9  N I $5 { k+OTIu'Ro-~ jz l M LS  B6 Q L   q 3  a  V o^c2:;  ~sG;++uI3[wrsj**wN8hk:.6m2&ro c g V 6b<c`T  aP B A G  n,}  fUU 9}BL ~8HVle 4R!'@04^XR(< % &2"d#) u-"/-$/$.V&<.K&-%+8$(u#%I#r$"!#"R 8N^4  "*{~S47w+"S ۇm33 X٧f{aބ 2;`U\m+V-I;GAJ]N b ^ & fTZ6XR !m! [hROW> Q  i m\UEd#^+|u=C^v߲ߴߊ-YrAw Mcp $J > L !3o}hR =  {""#$$\$#"$r k   >]H>p/p 8AGabݡ2ڜٗ+}պ҅1{.|Ϝ)Λρ_v.".fR/D%g۴ܨ y[sb0k9   w|.gF"7!0$3#'%~*?'F,'/.`&C/ %/"0 0 1! #3 j1C;.+4*)&*!L!~ qLo3UPIrR@~.>L?3,ZF[J[Y{UDEJ+, 2c,GE"ruR=-'l t|H@;7#@:'5R_2!k"z8!{mEk"p!6)tZ#Ph,Df IW Q Fy"2:<L>6}q_'z='//o/ ! % M ;4f,;T / 2ݮ\ݣYj 3ެ K&߬ Σެ݌3މHދ٩`N"4b]#+ NUT4 $ We/.#&#$%F#"#1$&9&S&l%x%$",\HW I  N \^ |ySI[H߯V߬ި;:ߦ4x%1j "1" ${!x%X$' ( *)))'P(%(&&%$!!%U *9dR6|  + 3k:q/R[KZw~/d_-b޶Nاڋ?%ӏ؇1ױ۞Yۘ *uSxZ?^ [ cS*et B!S# %Z!& l&!(n!~(0!( ~(vR(J'p%|I#z"! ^zG-' d # Q <BRSzSqc[nh6)O8RFnn?< z#c-t3n" # # 3 (  @ `  $ z  G/ ) _ ii  jS4Lh-i: xO#O] .1" E"e #~B"_!l#p "  y!AoZ<u4W6!L^u"N)4 at@Im> 3 ; % "{\sBn)  1H  m ?N $@[rRB"Yc#Rn_ՄAޗ ߖҢV=9QӠsհؐڔt6S߭%hg*\}j bvZ!";!$_#&f&(\*>,-./902/24.3-3j-2,0,9-C**')$t' =$_ Mn ' |QFNnW8+0߁ߣNrmQ8_ـ{ٲ2I5ߞ9l![XxIO `  e6Dxl"d%$#S"#0"HP"n("h n ( ^ nVw<IGKi>QF6Ba/F= qO] fPxj,-J@mJ * D k1S"#!%B!&$#"q"$"#B^#7!is2` @L   }Xlk" a.p !J*7)&bsRII; X{nnRnXpM.r1E"ZmSD,5NeHi$ )  Q  } B U PO{vUw|O>Gk5qkj|_:֝ށء 9NwV[Ag2G/ukg 0 WLU ##(&,%/&2)4,5@-6\,8C+:*&;*s ^ bW W_]6sO)8u D k ob  ]|{G   iv-W('"W@W TeMo14"Sif m+O&r(n&5@''q_EMShXZs=SQo/e]\<  TV7 E i e]=| "! F! !*" * jgCZ6  } {P}(ZT'VlbV}:O%k fu)3Rf*H~S,<"aGF T1 * p?uWqf#9)w ezL#wYnN# 2 Xq >V!ޛ{"ncUնE֡ФQW g֢a.ӑմKyA8(zTVR hT: t X"o&)J+r U.$1Q&:5)8x,:0<2M=3?4A/5-?53<4>:46D2,2//,**$)/'$$!<. !  m?U YIB[9w'pl)T %Z۳T٨ݳ؇40~$!yl%߻mlr|Mv$d!VD" :]  P$ xS  * tK   ;   EH  &  g+pjbmo,nl/LWn:7Km 5>8&mo++ * 8 X n Y* G> sW5N55AT3Q4)4 x;YCk Z Pgx, u; ^ $0mG$b KG%m f/8Eu`'v.NCz3JhGbU$LSYU7ZY\F muWd-Td m EjB@%e.Zo a iB+4 { ZwZ4 xc1!   I ,5c M B0  H <X*2X  L 7 +  y2-bda$Ypox=Y.8G\^'Pݣ ߃d\X+Gl 7s} "OFUs20;18  Q[~!&I+ .0$3%9&H:'9]'x86'5(&R4%4&3&/%+#(@ D"S cN@! Q J*,\ <2F+t^$HI)4/w")tt0   z+g Q y7$'(Xz  g5R}B( YR Di g MJn.C7w ݗݰxԖؘL)ѣ`<>T&koՍ٪݊ߊ.o \s5P M %7u"!Y#+&7 )!)P")#)$)&))(Y+`'\+&~+L%;+]#*"* #)#)")m +x V*(!&# "l0UA  g8/a=nioBD8,t mIM^oa m7pK%! S"Js G` + nR[_(3}?bUM}=k$[J63  r$ 2 x IC| C "w ! #F s2 < y_*Xz'smD1UcE>l!jb*qe>g\X~th`:@+Crt-j  @56X%qAi  E j GVx)pL,#]'gg4+["1H.k>J**B;gMXYl:Rߝ_]P!.|ޏZb޵^ߕ*?@<b7{ {OGK,6&zf* I > ol:*^.!%$Y&*\%-s$P.k$0n&2(x4(l4(53j(2)b/({-!'J*%($(/$%!#b k;T z8 L*(V ea:FrDz; ktr>%,8Y]M+ 6o_+  i5 ? g R 11K^ 9' V + QM 7'hb'ef7Hg<k:Rf"B]wi@b c81  j~X5O3 t!  BI6.>3_(h lZptqr`JLT"XZ`OY5kokk&0`Wc] 6    H  5/A2;X@ 1 k~ [;8'XCsd%v mj?N ܭڇKאێ|{٢=؂ݔ??Gz~ssh*F  $ k^ W!|#$#i#E"|_)=]+ : | $ncDwZ~@O*D'D.r7b KB  v w #z{5aKNH!R!"#$&&$4# "_s 4{  $F36Vb v ghDk#r)@ߌkޣ, [܀ې|ަv]6Pݥ8ߩK#jaY6~7_Jv v      J(  m 9 oq~&2]8h'>$L?ol41XO c U 5F k E9l:hC[ %5GM# s T 8*Po4sKW-~x~ Ys7v$=Q9 ;~sl=S4dm &   b=  U=tO_ *  A A 1 b rW hQ Q^RC$&i],sb8Je ==:%\ U _++!!$O#'$[)V&+X(,),)g,)-f(4.'- '-'%t+!#V)G!)&"/ oBJM&KQGI *HObII:wxo5P5ޏkN۰Iշ2ӨרXԭhԊڑzئ:R]kdB m6@   Uz9!t#1"S$#$%x$L%$/&%J%$M"".J,(  hR J 2;lzl[.`#!pjZIF~* t1{N=zcns\Mj @ 4p !"L#")$]#k&#(!*!)R ))(w'$ X" k{ { j S<RPZ;r4Oxcۀ\bGٲ`$5/ۑKb50X.0V aSB2!. ;7Nw  k i *  ^ B C8P A 1 ! CT Q =GK " o!   b /UK.6-hdz Y  e  g N I [,b;CY z? W)DC]2+yMBr\Q7Uax0jaQq>IatE&UKZ+F#6: l3 d> 2 4>;NRW>\jdYi`G j;2LU@~lCBE\-\XOv  6@ h3  };7-xFTN2>3!pu&@a 1  B-'WyTl 70Hޤ5߭vqߜ߄.!ߞ߭o 0Z-xK.&1'$5T e.) )P%!!, T!m"O#V"4!#$V  o ''nV]d)#`(P =+I5)-?IpnyymxN' r  4  To*7ykpujfePq`zN+/6~:3 9 G |q)_CS;\ +.)9_8 8 zeݒ{65F. $3Y T1R; b>:\ ~ a-jsuE9 A!! "!! w:P< J9yL   ^ M:jN" 'M0kU!{%''VoW#1.D%^SdX71  d 2 >a1q)b0f ;   ~ LP3dEsLbzOf&&3'LA)]ReP4QyDuhg|!O@^Wj}~ m = V   5cxWZo@q K  rG   A JT  IQL\W d( z h GCfsR 1 J!.v^ZPm:6Q@ߟ+jhߥZh^NIj߮LjIE L{~{ .}{K ^`<4{> n !Z!#}# " bO%k  r  H V5 "bT|r&+k@/IH/ kK~Y ]/Mf=*]E- b3#>@ 7!!"{""O#"$z#$#?%%#$3"" <nc=Fu m / B$ ^|Tg(wې^݋{܆լ 0ע׻׈#@,ۘژڝnjHaH9^vPL)% 3 E O !%M' (F!)'"?*E#*6$H)3%).&(&Z(m%&##""z!"2!! 5 T_ DB g  S f \Y,ysg Vrt[`}.+vtVFy(HxRX7VxZpFTBB@j b   c ~ w C &0  \ c = kVWaCF b \)2lfd}f*{1A#>T} S HHDf   u  <AcV 3  2 7  fK `  xR`vrWf@h*mzxA\F/'.:&1N  TH]lRQF /n  C M pG.}P&ud=f=8k3=BhfM)iV +?  A _ # <P    d-T;h = N  T-zpbrr87+ms{oIiQ"\2:_\h[3K :7ji.h o z ND%n)!|+".z#/(#|2%a3(F2)1):/',>&O+$)"V&v#!"\  Nu4ULjJX,Y ۹WnTaؐG%(}ާְօ.unפ`خAհlڞ_} G. a"2 Vf. fQ.] 0!# #f!%x#!'$(R&(i&O'&M&7&V%$%$$N###v##!-"R &Zh7~  ]NG Y C:4^;T A{ pV_#iB __+3;f:s    #| 7 :X1y3"M} SC   &  VO[3i 4B\)JN7 y%`g?$@V(#!>U+E+ts7-m% H e}  b - B B O  ' X  U9  }o Fb!|?M S Y  V rF9o:Yea*    Ls   w    : @ & ' JE'I<`FJx1(3m߫7R09ےaܖ=YePmsCNQp\my:97vUmV Oo _ R& z  y$0rM-_sON` n  n' L^>)^g!P).=S]%^0 NSuwU55mjpG K ^:6)E J :! Tv  L IY X e[J<Kr]A!$@''(M*x++8 p)3 &"0j F \a GWr^@#;$~ ^} QAS!#|v'M>,g7hw-R@8d-G{[c 'X  Ek"G$]''3('&'&$ !&{#x > \ 7 %S= 4lM>#gh|diD6Q߆q M3gwգ݉N']֭(*ݰHSZ:{uF EQ NO] d^ ,/ +Y Cp M!1!6.#ol#$"J"h""^"!P6cr(/L2g v  7 9 ,y Ls8!;M jAT42N02G0r?qn{169wLZTkVuedl1!.0fL Tb] W!-sW 0 n7 6     ;& ] ! !  4 y(&l5+;5Ml LP#t:6hP6=%zmSB]K  c  c':   P   G5Ua  0 ~&gw}N$jr!y jAPݸK{9ӽZ86_JiHݥlءίm`я6FԚ2E@vAk/<( ,<qHZ%!)$%-H&.>'0'}3)5?+K6,}5+5x* 4e(1$F1W m0,-M($!7jF:+<? ( tx= M=qF(=6 {8޳ݒ_-0iM,yݛ}+݈h/kM`;q phy'Q{ r"\,P '!}y  ? o bKQKilw5G.y*El!}b_fEjX_~%Gk?+ wH3 f7S@'<yG4X#?  a ; y =  tyZAVPI59m!RrS%)j#S/R`H#F8zKUA/{KlwxVe>u ;6IQ>6rpSBQKpZ5+4L{ }M[Xgban2H  U R  /%n:\C]se1K@  =G \ j  :?^glZ3$4st|N! q R K G s6s-No~t|Ob>\$J@ }5فxןֻa֒+ݯߦDh6diFI(JTb..cDa I 4 <  -23!#Kl$<'G)1)e()& +,? V,7) )o'=$"0V9u[  w % RoCs7^S.},UVn3;+].C ]o q!0"}sr|/ :c % nvG^p T 6 j  ?Y |HdrnIO3g2Nc,kܒj܁ڸk^9٪bvݺ ޖe@JoIY Q8`  $L!:r&"'z$)%-'0l)44+'6*8*b9**8)z8(7_(4'c3#' 2%e.#y* &M$(e!x    VU  4 tT\u]4OqwPhz[]G߉w߹޾[#QRPշn }semom f|AdAb^ om> gsp|?@8`Ie'I*"M[aB m  H 3lTx)X$zy_MI6j`4*9ZY9f;l/cJGKvPol8rh  4r 2l9   'C: 8:) Q p N 5 w )bJ6 Y\fsk5L 4#/<[0p z; Q =e<-U2*09x;X f r p }-EUQ #y$$$n" # z!5kLM  = W _ by/(s&h0R mwD6p_*(G?1L=0;{Ehl T [hg DG3BL!?"#"u7!!w"1@"Lc3Cb}l  _ 3u0 cwaod oNA1ޒxܶQ؜u\AկRֽՓV3&ض^+igzrޠ(\] mf #"& *",#G.$1'S3){2y*1*71)6/C(,'~+&*#v)"F)!Y'U%0#k %%  r d o1d@F>(.~ry:ߴ9ޖQމ&!eLt/7?atRPX]3+/U   d &u y@O+!xox]d gE W 2h8k4)K@|~W`%q:TRU$eAO=7peY`Qd/f 3 9[ E $<1gTJ^ !!!Y"."!{"u"6!u =e5s s V 8 O _Xr4o@k3!Iyyc@i"dN6 iJ *Z!~u *n4}ORt&tYWr{j'GGLk2XPB o & ^ ms" !m_p"$|j%&''f&[%R%H$##P=!7Y& xh (.+^6kc>GUM((&7݆g9"c܆IuT^!f>odG_^x?    XJ[MmM]:_/gd+5tj , L e 352 B~R\K&Boyb׿'ߣԀޖy>ӞڢG:ۗZ#[H !c&oA gj<)K `"0")&%$"&O$'&('1'5)&*&*%+&H+(&)% )<$G(|"%RR#!fz0 g  u&hwL64l6~"~,<+dPY߳Gr"܆?q -#p7c,XBxMqGb < b RZ  9}M"^%t9WKr 5k y  ! r-/FRHx]L;,+kD7RS&M&/M=M's&Dbt8fo    I rB25*]`  Z "&Iv])cB  3 ( {0bTOw, Va O W  %>Gu_O^tt}w}7S+ ZfCc`Le&(9m9dsg[.&]Z_-R2kX v}39]S|D.x4  o y k r  z&N6!B:9o d   P [ .#db-x, vg`mXoI0ckKWG7Q5WIp%" 5 Y O '  xM+Cq]',)v,Fs?!d6TJAI%YwEOW}^"s<~^  f ~ {; "{#:$p'$}+y%/'2x(3(4@'5&b7&D8F&!7W$5#3V#c0m!--)h(1%!iOU+<  n  QBjK( LmؿxO6WnޠQ́Ͱ%bҸBҳذFCתِY# ^A&):BES Q G  5 RKuN0$_J<v  " sm4f e   :xlt2q7$5@s~ywG~F3NS,w~6JgT_FXty$_ + x   }Z c E]  cg P. } |i  2"  E  7p !kp%Umtq-,XL~3'Ys6yV  I^C  %mB lD AG)!*Qy= :Jzhm ;%c "v [ R :  r  0Tq~7L=i9|0R  k8 KC+ {b A5n4R0k`tv/"l1q)e&=u!pG6f[e`  P ] F T M y ' Q ` r   ! ) R" H {qU%= 6D6Z9 ,C@p?1wg}l[M=;   x 1 _e !`(""#z $.!%*#&e$'(8%([%@'i%$F$!"W@"r6!n^Vw< [ & ^I vc?DyCh bMS8r5qJׁ֝@,^ODZhҸaQ$wkjx+ N 0N  &(I  Kt M[ Nq   .<9 _ ?  5 ! 5Tw 4j:#Am2%o u N(>zizm(GA6#K3r~w29 % }Oe4*#%ry&-&&I'"'J'dV'%#U!{`>$ Mlw \ k}8CI(Q22$5~nM#M{!\OA߫coz 1p:h] !?Uk. -  o $ c  =z3:K@t2[5L#U4 E Ea n E v)- ,>]j^x/*&h:"+?!MybL;py^:pO$}k2D< X i l M0   U z T  fl""oym h h d 5 8G}gK2y5gAsVbgw?`!5[ju3}fjzf^0 M  "TZDTp , S|SUJ!#3%&%"'$%'.#( &'&&!%A#"s -O%" yR<0RJV/ V|ߵܰ,|OU՛ ֏׸C@XuN.1~.aLX1 .+  t/>i!ILC53N @ 'hBhno  '-(Q^`7=ig+D J3! l>I2SttbaT v!  Dt$[t!l #$!8&#/'=$%'$&#$$n!&v&nU$l!  7+ ~G.BP^ ,-g}is{1eQߒ-PF3s>vA5l{v@ ~B _ .~-^_a H!"! ypQP  9o.r+ K S4l63&v i-P$y#s5h=w `gONtCe 24   W 1 KvW^ A'Li+{ Db ^qNMmg2`[x#P2^li77l#  .<WOqy1@DY ru " X i}&    |=JKEC|*n9m2  + + ! ) x1AD4vKOrt39~  G  N & sc9NuXF,83+PF(^^q(bl%DI^ c}:Yh@1. WY a;X v~ w0u>I"J="%$N$t$_# J<B 9U 3qlAwv/uz(%,J1Yq>Yw};P!~eSn J0`a *? m Qa! %#9&%"@'#''%)'))[*)+'*%(>$U$!UW32Qr + k =}R! #AN?1 lc5j463y2Ey6ۗyZ[גimkٗ4+mU&f7 .*"#Z$Hw%Ew'-()t(Zh& %#2$2!N|V b VnOu 1l1?W T7 sye/9bA_6 lrrc>@Wcq p @ = ( g^CEcV^      $  bD nu,*i\? Mu:}w{\ilG}*"$reXnUAr_>A C  H 'R 3 i ek bp  S F  '{1 P x m L +sK?  : M c . dqP$_e?X%;{DWfHR-){-v97YKd XU)?5w;F%~/UGS.s`&/o5> L@f cJVO$S.`) 5 P `2 ]  @ eZs -k m #^ DiP }zR.=6se('uvRGDc ~  {& 1 @y.<LLu$AV ]d+sM0~_HHGN 0@j}ڃL~ڗ`VۏAA1_l;, Onx> 1 eul !s#Tt$!%"&$'D%'%%''%)#(!o&,$4'"T!j# ?Y u kL:  ] m4k!7tq:8k_&OD$Nm-^.w+?M>L%SZ4I 5 >PeYcA;w  +(DH3<PZzkH  |  B+SV%Lu$N(vb% D#"z%$'2'*),.*O,*L,*.+R1,s3-T4/q3/21-2*R1&4.#,")Q "FAxFm sYD*,id96 <YE)/(y'X| %GzGF}<G  GI  [rn1B8 V/ / 6 q  ,Ndji.[tJGSݧ;N/Rޝߏܙf݇-6o}7|sv] =h4B y (  !/" \#$&y' '!'<#'M$e'#&$w&R$%#$"E#i!Q! A5_zh!OB* iH iuRwo,1߳jsݳՃKJ?amAר}ٻ/leޓh Fs+1k>%M8*i y 5! Xy o e(?Q5^Y q c( 's3p"ah&[ta'g ;my`uixb^JzvH ) ([ y/  F Mn   Q .fY  0 ) q ~ G V }. _ ! 05~5}aQjsQeEif=k?qN6~J>V UEu:/&$]2u8IR0yF N c1^qBfhC(+   r gaBN4b<ScJU   %1L.sjv?&:6]J  $ kvAlj aD߲~ޡ~?nj9'uׅUvaG؀v۳oVAK+ikn A ZRSA!$%,&&&p c&q!% !g&K!,& $a#FVw` p  |Nkv=@[|;G]/ޢBF)ڈ>ZڀcjQ=6 bq/rl'"?G 2ad+!N$3&2Z&e'!(#-&G1b);4e+Z6.6266S5623C21/l.g+)&(>!( P%dl % 4( h)B ^ uz#&mT39xZe{c,&%۽7Yّ`0 ڧ*cU *9jlq;K-wt@O? O  ( /xh"[sGvsb\b mbBh @.aZ8'PSqSR_!MR@X;#`UB9H2!"   m Fn 5 ~L)GBG: = }  L}l&(2r}$*L.UVRfMB]ށfAۑ+!ߐS>wU6-[I[Kb' o 6K)+o.q@  H    o  [)t  y  c9    + u/0TPy.HquvEc&_UXz"5F.(!~ *_lFr{\f!d?9LA[z!/m@rifp%8  ) B 45 hq k  /C"BlB3g 0 z 0x}t8yWP4;jD!x4@6A6?"7=6&9M25d-0'(&#X"yes |{29_s;5 ]JA\ݍׅf ؁ݎ qIyݎ>ާl:KޗkߨW7S#e%-}`< [C%I-_dH 7 S Xd l2,!q!/!9!Z  j~xOmc E N>S& u r2*x~)M O?10A ^  X O>  m ) } t  f (]`MsC{k  n9 C*B.P}`LW.)y<N.Xp[Zv'|1v tburme}6,a,.A )xn  |^Z&CYs 1e =    B/  E 0 X! 0TU0#|S_lQvKFb6h]  {i " .  > ! ! K i c  ! ! % 'k]`_"r?puNH|}:mA\ & reqkO8l~vwX =  lc G5 ( i j c)t>N#tFOicp |s  PAk f KcTJTZM~ޤ`ޘHVhcK^EzsF ] # "E$%%#!R!W"W!M  t\z!  Ot {(J{kEPu+k?kT.i*}j}{$ߢ߉UQ&M93ZݻRݵ-o!(3nc|LL739**s& cTrr |C#E&) (!}*"+j!-"!9."-#C.#&.}"}+ (C$F % ^@& M C&}, 323dIN3?"\`HxS}Y!\^"\l  # w(rx{B^mz Oa >w! E  ,mh3j " '@"k0OCt*8zk&؊ܨU"ߝW dF޿@+@S8Y&H)out>:"WQ6I !%':* - -.M c/!M.e" ."Q- +B(5A'B%@ UB  V~ V  .vzaB c09W1_%kl,_gu bL*O AkN@ %jU M+mpddKtUhy;?02kn 9  Q4gkgN !C$~g''@ ( '& %)%%:$5~%%,$}!+ Y BOy\\Ax%Dt%ctq ݂۱Aa ;?*+Hl H@ I lS[uYkT4&n P" 8"!" #$u$"7W1,  o17 #`B*eUx8ߵ څخ؉״؀rٹBOPݓy?!ڴٍSLS)5ۿݫwY * P ! xJW2yKe~#UO'+0 /;" 1![1J v26 '23d!c2*"60#8/$+0$J($.$G$!" b]e<-+? Y A Ap:^Uu۵܋S:O<`6 l5f_[>j{G:s] Ng   z_RI> U ~  C)  < L9*WCkG"_g>_ `gl8iI ,hi+?ߙLV+ߓ9*%l@'k]4xI2: 6b ni +l +BD (b,V! * [ $ " # e$ S$e%8G$D", 8,MZ   , Ty=rjnhATGp3@HR߃޶' Tx`/+jc%Rec.$`'da5X:?m";/L' 1  aC8wn24$K m u  S  m  s K   k P= uB 4   ]' \ p! W 0 8r=.U  0#& ** ,,y-z. ",,"D,_#*#5*o#T*"-*#V*i$(4!'%!UhDi jQ e us{NZ8YuٮϦ̥b$دئ@fKMχbѣԪzib"Z߽;MccAQXk ud 4e\SL f@#Z%<5):++!+") (&$"  Wf U;V: 90IK: KM(߼D+rqޫEw X1)w:\9L")GM [ H.Jb!I" #%$*'%( (,Z*.:)J/S(/'/A'1&*0I$-T"*!Y( $b `Ze  j /-Z Ew-kN4ݒeC.8T0<1K|d{*ڵSJ;HnXmP vU o  j [& yX#}v'{i. d ((  ?; 3  pz8: )LxC0s<|d2g`([b<22n kSyF H   | L 5t 0  h  %s  a # 2B&P#i^2j7{@J%U{ aRK~$ G7RV]3gK/ FC :3s1\]Tw%eI$N-T*.z 2 mB ?Hvn\1TIh1Q)UO!b|=K9 @  e1o(P@sBM?܎܏ۛeS-8њJΪΝٲsUЈݕuvK2ݖjIyJs9{P[C7 ;Qm##! 'P$y(e$(#f)#(X#+(!c(2 '&+H%d!$ os"AX 'EJOegiURZ1>/g6_jIb18*l%7`A^wVu ggzU" M&$)',!*.*E/*a.,X-.+'/*e/)c/?'>.H%r-#+<*& ! AMz. iZY4y܆sx۬UC9qy yY|ԠPXQk ٧ѪLa % P ^i[L''0Z "]$rX&Ja&c%8&&&&G%'# 9#1T   s.1 (m &<-j:JuxfRuYdG%e}EO< AY-L@ A',  k    _h5   l\H7"W2 lT#d6[k}Z`lE~y'F|iktePE8-o-q  ~y$^k,IKu( S  # ) % -  @@  o*J   2 ( U2Z$2[G ` } nG5]JV`^d\9F^v/K*:'jvhbHsI~Cޟ3#`%])}t),h'W 2 xj   7 @@ y f   3 y  D o \ i 8U2jiHg @ f -nzQz/F]/"~0IE^qA&\hlN%uo9 ( /  &'{$;" ]"E"b  jY ]` i:Wm@%#hBy /QkJ {rSB*"?F$_zQg?Hf~D  L  !-!K#A#X$q%U%4Y%,5$#z#m!r^ rKvC g,y_xs^=#h8oM* qX?VQ-|gyi\ Mqh v | a D =}+_Y~`FNOF2 K J  " X9^v*(x>UH[Jfq޼ڳ߬ߙ߰JֵּG_؍ g{OniTAGhING" 7:? [#'V+D8.0f2o$2 &4&7)6+6C.70725L1200.,*+g(%*:&& "C%"9!dN#h@ta]L0Q;R>M6א׷ص٤ٓۧ/ܛT0 ߠߖu ] a_lC1   ?J  .&ve,e#V_;r/[  e  %w+'3IvVh-t#l4&T8'fBa Iq t T  X I - r ' * y  _  r q J G  z l  {P b #U Z%qqe50E@MWJ+c/}AeLo $MD^"LDU.#%IG]F 9T<bp%(K8t:-okKSP`l+5x=mx k Y}G~,Q$[Kk $@n , R< S;i1yN5v WgM^r(fx 12/}y F%  e  \  M  ~  < O  ]c#g 'AIs\+X{LX~>36:#d2hVi_xGX)  <c8M~ {J3! "!%j!'7 >)I)P~)X)O.(f2'>&'t&W%t$"e?K   -wl*e/SPסp)Wв ϜjϵSyѭ3ҎԼ> /PQٴ۵PQ S\b/K t Qk>G1NpJ] ! U_h-lm4< ( Q5 V w +c$^7wtQ#SEdacH0Sh l0>g!K#7KRYsqYg     >t j }^eX.{3[ 7>   U 1 S A { R R   59 JHksku:f\L/s>|'J_*i6(0~3 ;] QY( !e  e , Bt22{EbQta9g<+8!N, 9 p3_!Z'_wLfqKJ,@Mg6RZ\:O};8Ao Ns0`zw\5 H5{ "1'# %"'%(&z+>'a-)/.-1/2r13:2G31R1F190/-=,)''$$ "yL   $ |&$+1߶897vٗ؆̈ oA5͑ϼ΁it4)wQ]ΝΦ/o:+Tk  #X}[ j!$#%'<)r$)f(,%Y#)\"9 )3C\G0C* | O +@ PGzS'dJJ hB#&YR@&qIomIAECB z FY[,*ED{ri{ m 7 _ h77 % ]pT" X>t|$2 CUۙݞntP^׬Ϋթ_YɂdȩNJdLvh׳_)l/ywhۜCng |) ( { I Rke4 ws"q"A"!!X!!u!!! K! !!a*, &sQ  4yPf'} %.V\kvQ#9]!3 .HZzVf * 4   :93lb ;!l"#-]&)h)|2( !_'P!}& !/%t#N3 ah!gsR]>.(fgbںYuV/δ08صZgojڂ]֨7޾ -KW{fq$@l .#h9._{"L#&*#/*{&B,*-+(-,%-+/.*-h*+q)+8)%+(I*'(1'$%!7$!&e~, , 8b  Nv0.p- H ;#83zv WT:vqdzWUYFCd $"  q ka  ?L: | 3    Lef(1-1*c5?hpj _q'{[<`UEo6a[B7\aTJ Q9a   j O  t P + y a w Xd S.u 3   o e  @ I Y  1V5oR O `sPYP(^adc".|&VIRHO6u<_&Q` [5Od l{=!BW$6-+ TL  j  N X R~ X @g%a  L Q K +]/pV>`c[Z%2v 9?yvt. F I: i P ]" ?%Lp%$+|$ "lf`o g    7HeV|j_ځؔ Եh"sՄdׄ։nחiިGLz  ""HX ,@<5Ln _ v!(!&)%*)P-,t-E-// 31O435E57l677#775#724.2-1)n-#)]$o6  vguMA^+BAf:[RvEr$(^/`޻|]߭WKK,4}W^[\{1 2G   2 oq !V"4 79 iuY aq  j   <TllX`}i#Ars*ps+ ۷K8GܣR߮!A@epCV  S!m - 2$ &8$) '*'k*,()R(1* (+'[+& )&_'(&:)&'|%$""!-?!p ?7\ y lj } Kc B N1->}aq d1 ߖާw?ZߓNj~y'*&Hvkj Sj/Xp8+}w;IjD75oZHJi41hK~ !a  Bi L }*AT9    |  &E i ! , (  6 " \  EE fYz8C^i7mM.\ea-@(TIpIsJzo<W a  @2 /f 3Y % - ; Z f$  t ] {JAPQo /nOdC%t ;u:3|c'J oܟ߲ނ&م[ټ+,r;TzI*n[i;   " > $#'V*e)/+i1+1+G3 -A3-2-|2/V2/L308492.32U01-/,/4++&H&""l#T] x m hk+e޽ܮPwqQӼ ӘոIk)Y\ټ%ڰ!60rgw6b@!-   1J,$Az J( K  Z 'E|76X2s@uPJyVT,%!GjtJyv '3Gh^{BMI,Nk5~( 3 0n=% p $#(#%*&&](@ )!N*$V*'*6))/)(b(((c&($A($f&x#B"d!OTr^V 7 DJm|QtO4,& ߦ,ڑ<4e52"1ް؅HVܜ"BNO48mEO   f s t ''l \ b M8 c p mW  # * s%~r(e+&{\bK[#`#+KRzE6   l@[ Hm3jij_5?T S  l e|. % x n q ? zam'bvdc-lv<]@5S_K)H>lR u.JqUI  Xwe/VYc,YlEh$` it['$YO9  @_ n4 !"  #"@$l $I!F%!">%$#z(#d+#,"#x-8#=-",!+ *)r(/'%p%#"0  {: N  >LiJ [QcO]tGӞ3Ѱл̎ Y,̚F̣ͤ ϑ$uԺֽMڇ׏ٸ;vg-]l a[ a, K!5"'#!c#$#'l$*$+$*#( '&G$ &3e  ) B kBXuz7&J IS vjGnT9Ctz(NFvB 2 ]'i  &P<X%!($$)&+&+&u.)g0*1+2,24,D1,-+, *(%?% N%s! ^E Q )   nPLxU;X! ׊iӊэK`ϔK0:σ\Ђ<ҁD~I\b٥dݠԮج&q3-OE`r ! > "g2q.## $)#%# &#(%g*&i*~(+(K*N&S(o$%?##! !v0 (qZ ( <">@PHja7[n$FEq!bn?Q _]3yk  Ya ` Nz| s##'##D":!|-{r  Gm&C{:\zbJ"EgQ2ڀ[OpQuf.c$K~50hVb X/ z n   50 0  "/kY^F8. ) H. H nmV.V#7 ] X u  G  K DM   xkb! yr KW /  t ' 'hY   vadkcN{'cN]rް.TyR#!=ޭ.ݟSZXM:$$.1q/3m0N6018p1e:1^:S1A;2?=I3>3>3`=R1;/b9,K8y(31$t/t.%)_"D|  [y4sG>:?Qp3YVX\ܟګܳZݎئܾpܓCY(B@)k- c 6  [ A U  #"$"&!(!4( '?!3'!&w"Z&&n&"~ OM Q n{$eyYWIH#ND{( ܹFݡ+޽aޥݞ+Eb W ` X  G4]fR5z~ W V8o @)*:] : * .s1Ed >EwC>2S;f%5_]d& N,Y( wxc`n    g } P  4m 2  x~TT1Q_qEM(3Y[r#d:"d5zq& S$k"nIQz NX8*"<!y';%2+*-{.10315d2515 3C645\54431X2/0j-,s)'#$O -#D~n v /8Sx@`i|nF[s24N!fo {9hsPRJfET$STh&.{70@_NF5[S5a !}3oxR _a`I(#+ : = ^$ k)#,&0/)0A*0*0*/#*/)t.=)T-**&+J)%("(>#{'# (h$'($%!$DG#(!L& a o, d[=Y{) ?4؞`҆!̵ΌBnf%ΰ0БЈ4aӫ{׃?[Dhe'uDYmS s Ef!T% ''<&k %s%W &x$!!fx / b] {AtjNP kJ? =.>o)L5cc|^ T %  y{*!>"#:$j&&(i(y**I,"---.-H0,00+.*,)*'Q'o$%u"#t%  X #x}r'#@޹Z!յq^  ϦεD{9/N 5puoSޭwpv@/a&BJJFkt6 (lo k 615 ;X"g#D%'&!I%$$)"*a!)&%#0#m":* } ,MN Vi,~umx98)t[mB.}Mr"[>:x#d>t ;- 1  F H k5g'zX-1{*a6  =)  $3',QI:g*_KFU^:7u*B&JbV=&0,|KZw! M 7   d 6    |  s LA | . l K   K q SR zf@WV  JTo]=zv3   V4    & i`  _ D )  X= Q 1,  n.#w !   4 /3(axT,Z;eXD_$rY`Wh*>ޥO< 0&HdAxLi_   jz r {fiv[/2i]I tn7m 4   .wOU>a;{Elx h@5604Ht,*c w nw (' J2ax7#&#(+(.+ 0,,0,|/Z-y.1--+,)+[()&&$k"#!S@Vq^9Y 4szYf|~T CYۇ2OhИΎD.ѫ*ҬҨ҉ԑdqfؔݽrڵ=\%Bsf^dTtruh&}:I $!!J"f3&u' (b%-(w0C*1-110,3z-2+G2)1f%/"O,()$; L]K /s28 .]HfLdN* c/:iO$-)%%xn W!K&! D b 3 GKJ pI3ESW   u$ ([Jj: in*tOsUS[Q/ۢ?߶cDB;Y?,11K{s8ueiT t**).zE\: `sv  QncxQS[alg N Z /3k 1 I Q tH0y>$Qb^kb] HKY~|@R1ya?sic}t=~F`+PRlEz5=%QUbZCH_S".wX:Z F 7 i i e F I , , " 1 X   n x c  k [S \   4 8y,oEW  Fk N _ 0T/Pjq^$r!#I= HQ/z5odTXH F i/z  VrrKq\P s * 2vG6CBf#m<~m.W_ / qo$@\M].h|4pHu`Q (W^iuV3o[TUuQ7]  S p#]%% #!" " /!}"e!0_  S s % U GZ2pu!J}zzl_ <];#AI/<^eBZ)(dz,pI:hXk^@61,GMG)V/syOh < 9 m*19K3&7?kn   9 9 # c Y/xi .  q  c=oT  n*HK:t[}s9%s0q5tW/vyWWA9+  # yND5mP$:zOTq,Co g z  ^ sP!\ozF8l$:\xR%Nh {;gqSGd+:r g"7[  ,W%"7Fl~  / *o*w3zdag K_ 1 YP8|_-< kYAݧl.-i/t,   Q6Y6aRK#   5 Zw)hHsoD 5 $  :{v{hwZ$w0R֦GdԵ՚(ҥѝУd&pj^֑ٵYَڵ 8N6tRfjf@wb" h -8>}"` /&!U*;"#."%w0)1'.H4n1"626J1605/{3.,0l+,(X($K$ "} n,l.I v  [o2'Q6w'%z*w /vZX,wv $qO (]^S"~iK7t { ab.c)F? !x Rs/>MyRE0ezA3a,&WD ;'IID=\S        !9"\G%DZk1-r73   Lc1A N [ ge =\V K^=)i3E!'0ve +ܪܕ)p+ެݧݥ*߀4H^]f,&b & =<  p _ '8K4x}:l   qC U  5h Bz |t"iV  { & }- n O 9 E, d @}( T!jww_rF&Snq.Iyv9:&mZZ4( imr4 Yc~ M 00 &  O7 ,  4 oW $<mV  j>r5>Y  bo E q$RV?`1jM?*jC^ P4۩ff#ܞa߂8;l30?i=v . tawz4!(}%j>'(+>}, <,5 U+ +CV+ ,f+(%x #8\  A ,   3" [UhHS:,h>#;Aޫ~iDމey:F$E+hQUq^ ( )e!! G=ia=~-^9 j 'P: y,Y{P8{hK x/\#P3UgG  _  a{h!b"$?$<(%)&*`'G+a(r,_)6,*-r,5.-S/p/2w/2.L1-H/+6-*+(Y*#n'o$a  `8 1 Je C[ ~*0ܮݳuuPמז֯azHbǹׁ> ٴ Ձ؛Kܾ\ B7&Pmr" Q O#-  ! W#!o%"'^$9+3(!,M*[,_**}('n&!&$ $ #~"`!*g 9 k 8bTD`YnGPK] BFASH>'L@ ( >n? . TF9E"J%M9'''nj&Y#l! ~!4 'a-S F {K[ng{s[sr`Gڰ0ڡd܍ߥܓN޹.C6tfZKwu}) E-M3j  GG`  57OCV/J!x a.6OwEXD4;n- @Y . _ + S E y * _gmOc2;9caK}CDMk Y{j (  Lv(P NUx%]> (n!7m)Lv"c&w=? tW-RC{$1" n_ <$&SH(6))'&E%u%g## yC  Yu\P tJnpV}ձރ}S׸׬c6ڣL`}E6sjS;~$5Cs[9G V . I  VI &!!J"!x$"%#I(#~()!&\ # "e 7Ro &N gK Vn27N?_F`>f 0 _arw u  < wRm4-f(c" j  8 $ jz }9*x)*Sf/OFJ$4=pu+d6s0T_,Tnh]C#28Va z g `3EZv},>{xJ1~K|{mJSus dp  m R   T l 4 x Z kD ]> f|DD)7H}C3u.5\,!! (6m~7%Ey0fTTgAR(  7   ,sOaM3EF z  ]h*GsCpy&t^np"VJ)[d `=yC+S:9;Mg` LV+\ 'A]KV I   3.{f} !!|!n!!V!2` EJn[Y  |W vg ]#rG'!0XR!Vy:oyWVg^f9]FbZ7k$@:zHbjeG o (u, 1b]  !m] Z !C#$)%$%X %!@$ $2$A9$j$ a5>[ < b] B?\KY>n(}Fc@+b)7`{(w]gd^ ^[Y !e"}#6#["""" B  &AYzbO{L L  Zxll\D:PbSa+XXYn%7D p q(jc yysMa O 9r W p !\#$0' * -,$!". I.hb+>'}"vz>^8H  J PC9*F4Xd{f" 4\v.K'PCU8M1L0u}l"i5-n S 2 A m Z S u J(   2.?@\ , G ;   VPV %c# 5CPGtx3' *{n_@"0 O -m/< \ T 3+ Q f@ 0    ? y `^ | l Q|  c x T- Zn   J 5 A  ' i  Pe^tG K4E4^[ajU0K"D#$[iEMJ-6rQ :]wNHg`KFv5|5rm _/ p " Ds c)`v".EHq*?2 ~N# 9&oO<Z3oB?+":}!}b1rJ{n nAޞ^*N&]|L`W6 h 3}~c/L0aH@$l @""#+##m$X%s$%#"qN(t2R x  #T^|gp 5;T}ܲ9ڧ '!.'ۦJڄόٶؘ[QthڷJCވu:JBabeJ H A w ^ |#$M&^')*+,F-W..000<2L2343^5#45k4522"/0\++'S%$f!?#8  ' 7 Q=&#$K %r ;'!)"E)n"_)!(!{& :%\ "]RZ"  | 4`P|E>fZ= LRE[$)ޗܓރY|ߩܵ:$>C\*ws@=tZ/c  8 $ r+~9PIm]+W \/0  5   R &N#Li)lo^_3RGm4zvIjXLpt(pB  R  d G . `     C T5    V    t Bs  W) |5' h?s^w'"SyYT%uoNo`q_o1l&ZjD{V= OD`wl2M8uj e*2l TV  u u !   X xg At( )     },)^dZqpg,0vT_5h<J=2k?YzHddp!UrMAyWdEs;!&NuR)$( - 0 m 1   _ <D Y 1  k W T]  XK !9 8hh@ifwC&N=:#HVv372~}?c[V~N6.z$be" y   z  u? GK=!#&&(!+%/'(2)3-*4+j5,5+>7/*7'8`'7'5:&:2+# /] -)u"BA  XPXn3ڭiHЍJξ]ͧNJodΑ͢Ӿ1M͑͊f{!jpq{jAQ2GX %?5 d  8G !]""r\$Q!$#w#2&d"&%"7'!t&&K$["!X>mH g_ Gg }Kf Y}Q8v1R3,B^gaUOH, p&+v2gok  }<<e" 6"""i!7L!  MR5Em U ~ a&h*P/ ._@Kߚ٬܊`ۈj׭ؐAׄEO\ݕۓC݇x scHg4UmV3Du1 W6M Y s hcM#Wp;"#0#"t"z@!F Qxxpy> Wn w{ > Is +O4g tQAO69X->|)_pLvu&m? \    @ `B3bo>agJ</w11YTg?.#0t@kpHFwo(-H .{1;jO)9E<xEhzeR{~6Q/IZ" fV!s7*D&Hke'\#2vrd;Q9>n   Jz1LuXyV| } p *8w,& hUryE'SfK[{J!J8KWs?.6Z +m7 +l % C {rL x [ E  GhA   7 }   f [ @ Ol k  S 578T84GS dt2!2) 1>:1HS/,H,*0&! BW ^S_hJs"ft%wރAQ׺F@Έz̾ǭƒŕ ÓBçPnH.N̗Љ Э߄ېgmbB+j&? % ]Vlim4#\"t&#&())*,I,//.301729a2:14@5VBC3"A."@5->+;n*N8&4"$4!b1,q'  [  G.M \ b%ޮNpttj ̦8K/gB'˕۸R׹^Dj J;z U^L| X v ~=$k 1qG   %c .R#npDh/e8(EOfDOz)7 PZv 'C6yTH"  - PHv 8c!h/%!X'L!( T)(' 'HM'H&$"= mzS v A K t{ k*f) !qZr+ria;qi#>$D\?n}1+lp*|-vZ zb F  qu !  s R   ' 5* ] `  qH   ^AtcA[=halyK/O eCIa / | MC   > b  M'%2/d)~.|{U~B1sg{x w  O   I  ;    "  %WHU3e"k[29W~tga 2m=,M jW~ $v*3SpHm7z t O"rPeV"P% (G{*[@,/ d,!, [-!+,+"*(%#" wk 9  L%(naDps'dIy/e*\}o 6r:@G ;N5ZP-w~+ |~  v " 9 | .BVP6/*, )?2~ m AYK)QC[V7` 'Q>ۿaބ9QՔ|;lٯ J?ޏ{, Q ,Jn(w |%  [=}[-"!2%!&*$.&1(|4L*!6G*Q8*;-Y~  W !H$-& 'e#f)<%[*&*( +Y*)*')&'^$$d!J!9 R# 9 D5p I0uxak4Uߪl3Hq6t'=J~zV(G&"PA  egw"[ \%$&'(*,,8--,.y*2'3'-3)3+1+"-6 G R: ?@ hߛnsqۢ u u׉.o!] Y/" Lqa]7hws $ b mF Q  Iy[$T; d ^ V$ w  \qv@5 "ZI#Rz\9DOA IH6ttT $ s < + o+7/tL jG0<s7v.uj[ 2i   Ukha[)dLP(pr$Gs: VT3q&Gd%-;:4 :jT6Opa^ IiJWTKeQ5   c  M6k_C9\Q#$j$o'#"#J#.!cw -Z}~>  HFU 0 <ݥU>m^/܊ߜ 6Kl$](b0( -"- 7 Q}  kIO)6ItvX s1 L| K jim'/po`vDfapކܾݯcBM  T Q" %$)'X,~,.01448?8$988{9889d79N48f1670 3//-+'("#T!e".$ '~^"hsUw2vj!ء2ɚ>$nȃΝ4S{ǬaȪɅ5˾ȥsaѐƙՔ==&ܵBdQmG 7&jDy17 "+$!1&^$h''v(("))T)b)a),*-Y+-P,~/q-0Z,70&*, &j(!#{"m NHp e  6k+E9a*bjJe$9Fp[ y %CQi" |F " )"-U *F(+!zZG,)-Av  b>]d(s>-AO;RBߵZBk 5۶ZzՃ b't&jU-".LW?4T4u~#  b S9J]t -Ձއt8/x,Ζ\ЍOٌ>؁ؖK*ބ8 o3 !%#="4$$#&%=('\*"*.,3K/6H39:d66>7=?6>5W>6;R4i9j165.4+0'+#'$ 8~J87M 6 ht0fpTJ [Y]!a[\]ۿV۞E}qw/|#|ܣ.T[1s>85*a  t   G ;se.TDmEi$ j    v J}] |q-q!AN45t F ULYQL   }#"&(),d,1-4;.5. :1;3=x2=3;d19.'9-6*1%."$, &!akVc . Pw6s0o4(upxjI1'sTۘӶXԉ٬Է5>֔Lh&yң;ԤьrBԞْXݛ:ۂ/ _!!%6t 0 W c1>Jh)Y "!#$A#%p#}%#%#$$$I""| ( 'g&}9N> f _"^x c I'1{l',RBii jtNZvRpB+Izza:?p~0<z   K); I"p"!!!&0#/#z##";!AB/1A @ /lnSa v 6' 05AޘqXڜ]ڭ5܇9ݾY.G~TtspU|c#iNjj2;i  ' .  ^ ; Q = t E < gZ r{X9TL8 '%@   1YiA/h9Hr92 2 n d l^ 6 X  yv y H 7 F  J o Iq ;.yQo75p~=  ru)F+Ww'K *R {F  Z r 5  g  ZI03$K0.,xz: "$(N<*B8X#kniT%ryJ\>C7ppXi m#= FI *g""2%H"B(%+B(M.)q0u+A1.U1t.0-/[.r0/1v/61--1-i0a-#-o**'%$e#$!#:\ 2wp##I Q @ c }k_brH:ۧN տwӽ2>՟JӏBpj/ȔqyHȿ/X̰keaןS ^k m~K  D { . Ds}9R7:N!!  lno~ x dRmQw5N@L1'>K$X{ <0k"}Hcu f L ^ c E^ oSJiDc|(\ >!#9#;#F" Su { ^.vmgVED߃qw0նKYs~ϧկѧԌ/־ױڐa::T( >-Q*p]zte| \ 5`sx5Rr!n#i#r%w &"'$($)$5*$)$($'8"& U#xt) 4^ Bot>DckJMYADri [(M$W{L\?.x'kv e glE""#U&"%)'-u)n/+T/w-05-C2],62T*0'-$H*T%^#!UW{ $ (^a.)nNܶ~4EMx̀֯S3QOZz)й9صiΫߠ%ժ k݁Vwa:\&x   l s!!b$K&'*(+I)+B+,-?-}/+0)/O)H/(L.'$+") &0$h#l c: } ~ ?R[b>I^'ތ_h݄{ݏ54+V q*ZgE+(ML0 7222X] ) <b;)jxN]s 7 &   \MuXbEUij:DmE'|)\En< g+te*0g07b Y  vGO!E$%' &T $#@% '* A&v &#{gr  `  vXBO$ka}4ff\q W^=O>%{iSTPlL~g'wavv Hm hGovJ~<  ] h9 Y  s#~\mmB :   f 2k 68 N  fm.wJ=y 2uBCr1p\g!48}6<(,`K6ts PKU &  S  V  3 ~r    ]w|G&g%_  qIX>|fI uDl3ixJtaIlߪݯK wW +t@q~eJNB1^yO   ^ LwaJ !p"H%0& &l#'%!(_%W("$&]#h"i!r?> !  Op*BIko \Qs6Z@9u@5<>= ==9F9o37<15{.1) -$' #X0] 6dZ=sb$5)n` Tjߗg  pwX4b T-p^_CdyEIt#j](j T+ #  r 32,]f>w54[ c  Y( WrQaWc|]];DVW"mFTUX%PLDQ W A T !Md ~Y 3pJ @   bRwJOWt@B (QmLM dbww"g13lwuY%nF8xy[@1ex- _ 2_s tG #   A D ,  ? t r MC  o  ] " 2- gjj}npo tWc CG-2?<|q@%w u&N:z3QQl5EqE4HT'7+U>a [a  k  v6~  n YF  ~ _- " { K-   /N   '^No%8T H- mYzWNj!/;o |XX!  ܞ޽_%Ea Bgg  nm&z ]!"%X)"k,%-V'-+.g./1/4/U4,4?*4'j4%3a#/1!/ - Y*'[#7~2 b  o?  w.id(454t*S#9O ) pJ3 #N& 5("*%,-'-(+'+'&+,()a((U'&%$#!""a}`q 03 , Ns I :n6ٷ׫[׋AӝS)ԕ1כrtLh޼* jbކU9eX:  "!bz P!!"$#%#&M#T$H#""B!kNa:w M U u D$'xO.`('KQ|e)]).U|uI:zB*7 ~ PFK- 6-o  9x"4#|"E! ?\[`\N?`A  pW&43ZPs1TWsm~RWox$߃\&p"b_@LRPwt3 VZi   q Rs  <w W8  % XS. Q\IAUS=%-o a f%  W n  G QY]Y DSJG8:_%% mY -F{ tR p {8k+PzW}EoH\WLCJDz[P :) J< zz @N ws CT u <nV;;avW(|+?b&.^4tG,sx=Nr G koy/<+2D#Zx%!f&$`(&*'C*a%7)# 'q"#p !v K^V g u 3*6NGe Ew 3 UL\ Ae+t@fz:\YtJu(fI9H7  N i ~ ciHVz :g {   4 ) V 7 a ' G z$)B>< XZ0/.Nh!7jrewCc& veG8Mb,ri xU F |vb7f(p4> w4gW&td>G5ppG-dV<a?QP.n.M F7  Z @ m X A % [ U + %CC<(c   N  dJ u  6 V ; G ' Z _\ k  D4| :^A  H 1  ;hNk%s n4:gOGC3[} qHNv4np y} r  ' :   m 7   T E     s R  da^+1IzxYy>R3|>= =-J[].k q `B ^0">!#$'',d))/@+/N,., .l-G./.1/1/1/-@1*_/.) .b'9.E&,i%+m%Q*l$%a! R ;p  ax _F]:^SWI,4=pxԲ̼rhό$=.wZ Ѕմ9۝_sBߔSe6|2` l9f mWn "]!"$ &%Q"c''%)>(Q*1+*-+.-g..--*()&L)%1'"$! IhKq  L; ?ltXKF[Cx kdukOOOU ]PU-7()h'qp/:!Q,&TlsX"B,fkP"Fm o e3Q> p ?! "E " /$ %Q%N=#! $"'V!+JjU\j   m  lE1&"7:,x]bq>lLE\~Cmio3zZ}TVC~n5tD9ge%DMi_zO0?a7w ( U1N /FDoY:ud3dQe>v@f'   C l 0  s  Q[f  f C =}   NxJa_kJKp   ( mz  B Z e > sRL%$.sb>37XGg+.WAp:oZ_DD}Pub?;S,T3l `E  I o y 6 Y#  9 5 0  & f * ^ " O   d 1X$,7 T[  QcB :K K0S ^K[0V3`8>r*h<;><(32uI& C  W[Q W WPuL8~h c  " xxi*T6B/8fߣZ$ݣ5 ۣX=m܋ܕYqdg@_)Z;Eav ,Y9T!Px$ l%&&*#)-*/3*2)4+9,:,<,?>+<^+95)7&E6$=3#.="* &#e!X B S Fo  w=77Ws aX>ޕ*w] 6x?Hi'`gy)Y2Hh g-  {  5 p :t^9 ou     i -s)zo zUMC>G'hDa E x & z !"Q# "u$"U%#w'%#)&)&'%%'%5$k$j#k#6#!b!  u#6yV5 IT d@}T5 a&slKJYndx&(JV c5/pAi/|D2 H-}Q\V,~UqEy1   C LP v  ,]      _ J k 5r.J?'Gt+P{ $FKJ Z 6   - Q*hTPxCg}|C v LLW<nfF2[~)Wu?A$N:a8 = _lW=u@O[V"q!<"1=uJ/z Y W p  A  Q ` m G/ggHsc %T*:&q.E'l p !dfj5 I l v Z U x > ^ 6fG8w  '   z   C 0& M ) um a m .qRq/*u(Pe6UxNQR G+WEX *NiL9N`=#^K.K07[  =f | V 1h8L,5 EV4 9 & C y *jAupu ]3hepC8{ \ܾ mݹߓfh<:8L[X{qjY Hr1/N!% ("{)%~*),-+b--O.2061828293c:493836240"2*.`.(F,$)C"2$^B $ TN8<{/I+-JhPq+Ȳƒ2FhţȣzȵfʵL&KСٙp3Y >as { 9D?p7 v"6 :$a!"&O#&$r&"&k!.&n%#n! <O8  T KH Ew|02Y/8}Fnmm5d TEVWV_ C<z  m"!!8#Q""#(%"H%!-$ T#$ qu Der7d{   g,N,fK\aKs߲b\Nש כԇdG؛֢ne߀ک?W4x yIc Qi)7@  5V n    \v[_]>CU z ?0kj & s \ /) 5 u[ 0EI<&b_<%UDzb V  !  ? [ a :  2   l* m%ZxY iu>n bujgU}oF3[Vt}n>[(u"Ga (   e  ~ :9QE W Xn|  =    w V -A3?3?W3S?.2>F1r:.M7N+4&1 !.Gn)$i/!?n *mdR @_T>p\DrtnދwFgO`C$jMG2Gi] l < , y N.\i 9T7M  P#  JR  d# |)Fo'#] }q+UxW(H{{hh(#OcP%!O`jL)G{Lu*WU}ecx.Nf7d_E$lp(>6T   J  \ P,$R%/e'  ^ h z  Q#{{ y@n[W,A2W!YwJV$ 57 ,  ZS8[t8T/Aqz V<E 1?  D,i48f>4 RlNp2-۾j6POt7EMՐӈ;c )4T۴v+n7KSK8q!3 L QtO" F'"("z*"- $x0% 3y'3(4W*u3)x38)3n*2*V1*/(-^$u,+s).%d j 3 H CV . MHD;MI8t8|ޞVkܔDa܄8Rtߤ lV37]+YKg&5hZy0Y=^|!;='AGp2 ( n\  paLM G %b5 n &^x~o)/\qxr.  ] #  S1Sc?Pfs-JpTfmZYJE6ZrP |  es(PQ$Cg(I-0a//i273EL4 h321%0w-+* ))($l.ii ^ aDjHi@b%<<ڹ H.'؝փ1 pC`iuaܬOPsU2,c[D~_g   9QuCx  5Q! ""/! !  ; XU&ATI..P7ׄc#EnڻN2b/]9Z4rUE  SQ]U [ z;P "M?""!"" 2"#O$$$D"bIZZw3 N  55LlVn+@&^ma[Jw+ 1n`vr5h8kgH3p*P{lddR .@ ^g[ZO+=%Y } f  > k  . t/g B2UO * ` q  y 3  M   T S#`j>F. 6( [E8.k-@M#j\_ Z  -:!RL% u-M=bus%c-V(    % c+_hFwAn;gCL81ܘۿGٿT 8QLD۟^KN^C2=BSjk/2N \f  + `"#3$!d#P%"L*$0.'3A' 8&]:u%/< <{8E1+9'X `!3 ڎ,_ڌiq6ͅܥrކϯҜNܾ H4p5]= H  *$5V(M*-=02`6 7J!16 \4!3"e2b"E0\!/ -) % $fyD ^ w p  L llvS)om{m}[+a? 1i|Y 8s T aJi&!xZ  :Q.1! O+JTJ-&'?9ٗ;۶ݱa%eQ=mtl   =  | 6\._r,HFR  0#"8X""#V$~" z T nV1^X  d " , [m3!aBRTQ>No Ph[i6YpfMD STN6\ &&^1ao% ~VHEKr^LZ<o3L % v 8SH|Wbj  $ x[o C w|Y140w9j 3 ;bRT+wMea `%8zzq F%{D;Mh 2  |  SmT5z)wS)M8v=N1  @ ^E)7=,,Q C5 ټڈA}6 #58^Q T Q8b!A$ h(0&,@,--/u105215d567694786533.1*2)0&,W"("tr  W+fo߫'6Df[޼pt.'ۄҡBv\<%&rq-vY_9]ibq8  @v &G ' > BYV2!$^q$C%?+()*)o(&$  z(   MQHAU)Fm13a&3߭Z?Iv TB2}?8 *# `b  L" {&$*/).,0-1/>302101M0/.N.+-#)E-%d,W"e*F(}'#Y"A < w os^Qm/b!8im-JkߋC--*3VGVY,eE-ju* D "   *    q(  e 3  % 1 *  l> {w8 _mp=`|ndo&'wLL%&Sh  fm d) G zv ^U^kjbxvj%k   O R *_ ViOc5?s^jA0sVtxG8tv|\qzg.yp[oMa^_ymT9 Rij4 9EC`@&Ag=2z]V i =  ~?^7U  >d !K@##>$$"U"6" $Y %Y$ _"s](=G , 2Te@$62ߜӎ޼ۤCӨ·|AwпdtUڥԄԇݏhՅ}PT,Oc N zx""($S#R!K$"#m#n!#$"%!@ LI#=O [o dx SX9oHA6z{]u5f7lmGfz~9DojhyGM' `K  J %(L"/& 4h(68*8C+7{,7+6,5S,*46,2+.*:+K+')"o'5#S E1G# s%rn6irށݱەvrԵPҵϠ+l̈9ӭTxʗ xfZ4֏؍!$ pwiL&Sp h ^$x5Ky"}&V!(r#(#)#%)]%*F%)w$?'X# %!!;-^&gQs-*]%i  5 9)|=+&[;2ZEe vݚt߶z$"a9  x59]"$:#i\#"s l8 $ x I <  J d   +Rn^7+58sGpS4o."#pPvdkS/G0u \Eo0~:K9 /    X + R   f  5 g St 7  I  |  i x `;Qz|o D p [ - (x(9C|  W 9qm  Y`e [hUns[(dKNQre! ~~iSUH/?*rXv#`gX_k6ACZ8v]eu^    S if ]U ^ e n B\ S?fdJC&VFS )jZdR <Q  i! S"f%))a+!./Qd-7+W(f"5!iM > WJ!"^!m  y){g N { ElS`U@$ݺ܃OGڲۇزe3ԆіHйРӹ/OH)TLc03Jls\&^'* YC q-!F! %L)y,9.+..P!.%4/*15-3B.4Z.{4-q2,/ ,+3+k'(" %([#1 ,}&S W;: bX@r~IrH-Dq &QWyGPYmO :S   Kaai2 PF  9 $AR lJ C 5 Q l;h=/.f7җ>ьݟ΃l >ܟФKٔ&Vԥ ٟٔޓ N(Vߓ`S~ q 3 d W1q" %%),2.111`22:5579v8}<9=)9<6:q58+4835/J3N*2(2/m$++ '8#%/ M2 [[w=^ |' S+9;E Y+p }a/]k dYs)/ai'|20i+   U 2*y =PyD;[sa]@C'X l x :Z$:*sJ^(NU2eN0XX i X d 1  b b 0<DwSU ,  %b/i5    Z   uinp@0  %I 3F 7# H7C qZ.RNkuPB(`O~z7p#,LJ:C ^Ej;;J9ILNt"cK|C!Z%eC:ac" ? Kws $(o,#,++!*'K' -& #. C[!q 7 / TVD $6  ^ox f1"(}eD2Kg?1-n,x]U%~n G?~-7p \ A   `Wm y Z0 s  I  H%N\Kc-` 59 mIaUuA&O۱'J ߠ`Ft6,% k 0m%3+sc-0.U#.$/E&1Z)4)c4V+v4 - 3N.F1/.0,0,.N,-),'q*H%&Y$M!5)/ I 4N&y0<43ܼ&!xrqBζHFݲzAؿ)=I[*g2#-ތ߯[350^s<9  3$=%'%d%}T&A(1 *"r*r%.)%y'D$#$ H$W*$!/~y+ ;g7 2UF@xmrZ0cuޱ ݷlQV&hk>ߪ6c)k|IVT)SZ :#9"^( |,#0%?48'5) 8D,'92-x9.):f0916120-.(-$$J+y'#Z~#!Y ?  d@``Oޓ+ڢ{خIՋ~ӧԶԛAտ6G׫BՔݰ`%>DBD6g&oYv> )6> H6/hZZ FY  Y! "" Upj     y  ZX t *I  ! r KK:g#^#+e8-}+5TB%.J;#|?]aF W M; Ga,q) m~=# , xtb ZI /Uz[vX2)a,Uq]& [jB"$f>5tT"=Hg#-!Y.[I|{'  G 8*0~nW!W"V"!$s%% '"*#R-$-$,$/+$[,=%.$,M#'d##C$ #A! Nc` y  Zi(O#mZ_iz6 d1ܯ=.mIצ,txۈaߔڦ.rߨb/3go7{ E< % +  Obx6nhy>_pOv6J  I  x V{Volj%\\>?|S.~Eyjw;p/ >3 {S[4%p(  ! 'z.3`!6#+7w$5?$3$2!&/'}-'g+z&z(&$r'j (&s#lF!Dq"  + =S@arדfԽq թТoI<ȈImaVÞȍƘkgʾpc ҍ"֖׈ک1@j-M4nf g 7Znw!#$'&+'-?(.'.g'X-D)[,,,-,,-*+/ )^.',0%'#"# "" /Ww  J(}7p"[$Y[ޯ$޻_;QYr@w%Mw{%o 0 ?v wG,c,|xZo%%'tn LK '1?g+W/|>X0'݂?u Z_LhމIJx;2O{"* Lu -z:?C j |# bh  _kyPl5 yfdz  rC U ^u Q  { fh qD  k  IZ55VH~!]V_`#]/&%-:f:dI(6 R8S!x4!DIQ@M  _6 x  {2, o xy 8gw  !4!H ! f -Kg d D 2 ." UeSK&a:@z &p![ / yB/| / * } rD3Gݙ03١ْ՚شjҿCд֣]>ֺ֣H׌jظ,^ܾܳޖL!oy@~+b%pTBb Hg|k # n)$/' 6)8,0; 1>{5?&8LA7B7OC~8Cy8BC6?4q:526/{0,6,@(Z'$4" "E =c3a![=ߦj!WCo=ިԷݷi;5ӫ GغO/(}wBr@* 7 #Z QkB8"'%2(b('(4&j"=  ? @ g a  $ Z L~Eu[:  [X8yJ23rRKbd"&lt^2B  asg "%&&&$7s! b R!i g"!LJ 0+m  u 9 _pBVl?;1@Owow|I.V%ر8ڦJc) d1euN%%$-d *vtL7 o | V  0 Jc p6P"* B   k<h} gmSt 0 pt l C] H x J  TKL H{9_UK;3C03 $@C6 C  <W D hV lRbdI ) ( Lgy   . ) 1P A;Z{LX?* T\Lup]5QM($'z7NloNqIm#ZAYrg!^[T#_) vq|:+V U  0XSwNZ 6!j#s/$" !f ( j !5!A"p#,! mMtd` Pgs No }a& /JނEGܦwϴܑEw9ޢT?߬oqZj{0*= CGqO q  j _/A] 1 Vq 3$ % ["yFX , jy*?(P=Z~v/"i Y7lC{_EK;q7PrG  W]#hv ""&$*&,(/*J3+,5q+4Q(A2%2$1!/t->($ 3 - Q :H$UX,C:SnC"`ۄ֑IG:ס֬Mfjأ/ݖٍL"t'=x#/ D>` DL Y m} M . MZ !"^!#$#%#[%#T%$$]%A#%( " $ Ru] N+XdgUX-71.U NY`h;*Ds&zUEXH*9 .A7b9+2 \/  ! "K 1 j a p I j K  s w   \s4D/(9Z2ii#L: l]6c`|9,c>"i}Qpd[A r 6 V[  8v@t8 qZ y1 B24: 6  "   x    )PB0*3xJx;  cG& COo{8Z|(P|8g=t&9'*U[[1~"2   $ {>  h 9 Y  <l V #ur r   `  o P   F%cwh&.#i'/*6!+k#.$+/.%g/%.&+s&:)&'&&?&F&$%&z"$ ""@j z I I[t pߠ ^8=z :%L(")*#*$%:,&%/&.E(,()S(s'a)&Z*&G()$%!$_#^!| grj [6 .zP}zcJuauXB H7,jELfHorj Z9C.]W_XpCq_DHs 0 =  Q  {  Z Ni*|X/~Z$dJ~9A4F+3]8%`xstl) | n  E  /"l / N  0 }  ! F R q > \ M ( 9 w T x  p  I  j,   !  5   0 6>G:K1Oq:b./H]Yk0Marrjb`h1jpI: W[IV1$jEL|!(9,0s e  a ;  >R&%~ MYr#HmH GukDf K _i4,   V g2U( Y_5qڙ։ۯӘvc{͗ K̿ՄӃb .˾ql1v,ڮcے֢>!?v=gP?! !In#(&%*1,C+ 1I,4,6,6-7-z8+8+M9,]9,c89,6,r6*4'1&/Q$+3#SIb  ^s}1V:8 ^@* .=pBF KS,">Gw%*>Gpk,<Zt0O" 4EJ.o;u.]Q4t j?G <? L T P W y D @   cEQ=Z>+ kI00O 4Bd8#Y 0-sI{@S V \ qU t w)a d= sQ  m  2 5  `#m61@}W w O\lvzin3]L4Q9L:.k8BK{'g m8 Q} jM qN:npqd5Zr yEX%wHmK 0e$t#Xc}  5 z VD"L  y 5kj C    v e 9T  Mg & e X 1 dNP = Z : Z/ ) l a 49=j =.4^sIbTQ#K3CcxX89V+_Tj  vhLV(%d;!WZ  0#Dim&/r 2nc]]%0gEiZ-o;'&4cc7)Hvk^Ck9)P 1A 7~R e  f 9i{jkk_!c$' >* +!+!-"/}$62$2#K/8!f+X& b D:$W ; 0 8-X!-|qCmgCݱ!aosؽ8DӜծcc7L,Ւ1bӢrػ؞Zb-.gRd M K!  zp=$]Rzc/lk2|   wgg 2Xp  EH NQ][D?3 m' P"<)oJL h9uHNNtkSo ; P  g-KsqN}k;u8~c103 F,}c ulp7y+zl>[<^],;fh%ZS~bz]~_q\KhaYEUZJW]?t ! H N!@iI@;Ke0\{k l  X0 [ 53 z;t;~\[&yR3M\ ;P3#m _[P{tb> T(o[G[{Ylv[Z&y[~S>Q*!1 <LDP?el1C[~4&va^Hu-mFJGL?I9`H6b-K /" 71f)\ZrRa)$l ZD^TpK!.&  ^ yt H.=I& b  3V V0 9 H % h G  `m L/{H50Yo.wDo(K!?}7a  w]30GWl 2,~{@P m 'H Q v  r  3 T ] g b Mt c% 1 w V H l>`I^U_JP,'c\ 8qV'c+RbsfBg O 2 nY,wY  ! )"Q Y$!%$&q' (2'*='+*M+o.)-v)*2))&'"A$[v"| \Qa$ G x3 aEhdNF>$baiyB-ڠ؍Ҝ5CңԴαԿͦ3̽+FgfL՚ԳupυՏ/r`<۝`9%pnN-Z i ) %'(" *&^--/ 2a0o4/60707/7.7+6)I5'e1j&`-$(#$ <[` AZ YsH0*9r^E$a5)ZP5lhL@h`s;.uBDW  q 5 4  BD c6 'p m 4 E  /=yd!DX6roPiFo`o vd  2 %  e M  e ua4[12 *`50u|%Xz[V`=py0 51yxDB|S~QCo\{EDq:o@;>8;57L2:5/P3Z-.(+#M+\"($* KB Ph 0mWg8 jߔ*UdAm؟ѳcPTaQTp[w{Z7K~ߦPoj+P 2 HSxczM H !z/a!q~*SisZ-?  1 D,.. ; VWqnSp[x{UU1>N1(o)xwmW8MY 2  ;  <  }Y +#y[n=c z>    Zkf | t1Fq ? 4   F0l05PTJ V0ez+A݁w/w١)S(Rfݮh`w*)Vk_'XE5xKw<h[O%] b 3 cLbRwa  _Q8TZ4MIz J 2 b & .  3vD  ~ v  #[oLqgdO =+s8"YmF^G:a:D5z 15rB.' GS ` ) W:6 BeD| i   { e ] jEI ,& dmpsO3#S\7}TB= \/ N{KL{hz7  \ d q  "{46eEo!6"bc"6!M!xt"~"#]$$Z$#! bNwXI @| v7\lz&lF7޺y),޲ܬ\?֤W޾]ժ*׶jއ9K)%`mnaZg.A p _ K{=-hW ;,}v)HBF 9 }\<n!;7uRAGlB&K>K .1"{9~b\'+)  < x1;g#!*'w.,1.50403v0\3L0r202.1,8,*$'N"3 W  8{kUvD~ Go4|g0J+:1m. 1.-/.+N-),<(+x%*!*&!*Xf*k)('$ "9 SZOa&y #d 4 pjWlv]lRL =!|_X%z(+hjwT$vz   O_ k  Hz5 3 B   r b6| ALOK;9}Ugn:XZXa p2"APx-# e 3 <G } | nf:5D  y(_ߢ_9ڹ)֭VԱuGϳy!QՑד)/C 8@@Fb|Ooj [Y pEF(7 g&72H#%'(R!(#})#)$).',)S/ ,/+_/-+,g-),(*%Q'E"& 0$  e^sQ6-#{[0MYaWܟ68ibB Q I H .]jpR!s!   Q A  4 8[x,m q+qA5",uN+cܹ@ۗ>3?0ݍp*b lء'݈ٓ[n &cZ߬c5Rsss .;! Ube5" %"''*,:-1n/p62"82:3;_3p=3)=0:M-9,6*2)q0|)-&*#&S!"4, [nQ W B)w[?+D3p^wnݬW_D}܅=gۥ ۼ܉p}*>2G9s&5pE>L]_  7 QU  UP P  Y <  YlzydUq]/_*O| &\jf*jX%|E=2#n1 ^ {N(wXSi$!E#Na#E#T'$Z$Gc%$+#G#$#B#|)!T/H.-  ; h'_m j T4VyS{xP^{ SNIQtP<=* ; v?  Z  cS   \u bF o ( D r  a)%8SJ KS Vi L)cx7?_`cF?H|(u LQo g=qVZW2@*C: A! g !k\"j#&'f 5)U#) %d((S')'h''%&!''^'O$  z=Z  v kl 9d x.V?wݬB`t/ݔ}Pvjt87x)W #i5`2:u S u _KYsR gX `w71 G~ ; V^)7?xLߑ#heY۴z׷]dCmJ 5w d^madqL  H,9!$%*$''**-.q/0m02q04O0[4/)7g0B9.%7)%7''6$5#M2".J!*]%B$e S5h P  Db 6C6l jP;z ^ۃC\yME klQ d'fھӱ i5%x۾Yzd6ߓ@d GlR VB |;  #o&(.#** )#v+%+'))i')%Z(v"%"nAUDb  2 B6qZ3o82>A}R,6Tjz|A[z_yIQh   < Y &d& ^L "" $###n##"" !,rhvo ' ]   RSWM(t(\?<86kUށ'SK: օUtי8M06\JK4   ,@   9Y"pC'B5 I{O0"JF+c@ %~xp  U7 y9 :j4L   U j !%j/:7hX]d~4=@i OyG+]Y?g"G`@h ; (    \  9 hYD5a z &W te[v  GKzBm$cDeh:}-}zcgJC"h8 {r{]tYhd&l+  F7 kk ;  M  ln'yR &w 3- /S   )  Q  H F w 9 d FxDoxC  Sg M|g8Wݪ٪*#$$nڲݕEߙ-:J !$"$!6"!! ! $ yhTj t ]. iB=;i;d~w ={[^8RW 6>޽T,ިޫܑ#M*ު:ޜtJDBAsZ; j:VNvy \+$H &V(*y,)!.%.n(),)++).F'/$\/5".-D,)6'%$(!   xX_ .J,f+ :~qC'!B{Uvtd=0\{ z >L I / 6 <  X _|gs<  #u4 q   5  3W  { .L n6^Fd0`,JvYww~i@G#q{]Cw&WYqXE2!}C7} }Dh}vk1D\;}x[ > "L]vR%lu6 0  dQ5M^IeD i 2 269yNU< =<@TffZ.NuwLRy&TX$y'+ :f  i   q WL>&1W M53 & B 6  / gsTq>s4')bCx܍Fހ*.ӌ@Cο˪ȜX5Яѝ96Y6"i2me7Hrey Zf !%k7)r, /@&1+4/ 7r2654w5:3425F1z5104t03/ 3Z.0+,&)"%($#.h^  C V\BIg FA }|ބn:GIfkKٮKq? |  h#T&(T)'%\7$ x$ _ n)<ja  j}Xq fQm7[\ [.׀;{5Nո|~ְܶ֩3tiU9%ؼٲ oABHxE- bUd:  $Z(!3+"- %2'4)5(\5 )34(3)3)1)-)+1)*'2&& %~#":<s X$9 1= *Kx|+jٺn4i٣Sۓٕߓs:Zq*ܗ ߻{s e@AzQx[6Z A } [`U. 8 NQ"yx|  )Ic  Y   >kMk! bj0Lv# `K[ Z&0g+UL> $ 3l!2 b-Wf R$ A n ,3]SS{pdm/ } h} R\ K "6   X  K8 \ =F k Y' C Q e  H* ;  [[ I 1 bK ; ?MX*{ |,Y}m$eg" 6rR,zC8 NiVY-\,5(7_/Y|:U}o.2Rk6? rq x _ . 6{0ZAx~ A{ `  Q l; Cw7NBj48}z.XX`YWHI A'  wu u    5 " MauNx'n&kHWZCG;^%rOgp .Bߨd/0%Ne<@O +) Y7lq!%,!("*'N1\+O5.607]3275G75657!56n4h5342b2,2L02|.2+0(z.%+l!H)L&$m"DW Z]L8 W3Z:ܱe)֋֭KAHtrGϋڐ͂ڗϝ #կtKAٷ۴oޔvs^a0 _=7R+ }`O@hu+!"P#'_%*&1+(+*+*b,]*+O(+#(!#om9 ]SuZtwG^hcޡKڀ0{ =DL1]gCnܥ]8 $^K+ xl #4')+K#-%H0e*]3-<4.4j3 8"6;8=:<:;<985=328./(.6%,%$f) &6" o  9 {)]RCSԃ$%=p0}xϢ)͎ѭ͊2"}͎םͲύ_@дDҫנsrPq>}l ~  2 |=o#;&('''c!)!)N! (m %,$# }[CY{0R U w\N lUu9w T{<d&YUN]5=FaLlULS(0  < Po+mO(N7!"uE#qq0HUq pC  . Ghipi4rG:wC9|_a{t`{ yL!L52ZbL_Rnju@lhp_vX?9 % O  Tf [ m ) =(WWhYbe^B; W A o M  ~S  ] A % # La !Ze2<JeHd d ~P'"+w~p=޻,?ݯr߳2}1cCzr  _ q   m 0 p 3 ? K6 {;SUc}psQ-rL7ltfP%o.X8i v29I a k w P  u {I#Aj8@FP33$"!e$$%(%+G&,&+ '-N(d/'0W$/f!E,1(3U&J$}"k!  @K`E lj >p6ռHњэϳq̇~D˛ˏƨǤAɺ/6ѳX։"O\[q# W~QqFA  l\JJ Q r (  #7#!T/ x`RWI<0   Hr2-bGR  ,? q " (O = A > `-D"*yZXx i  H    _y  Ir)t-~H|rKaJ=\0 xP`&l  v ^yrp  % 9 } > t=7 8 Lu :Q  TL?G2gF?=޹K|Okfh!!y Te_xni?j90}H g3 , h b ttD/: r"n"}#U$#&#( #*! +~ e** + * /(D&q%$!8h i  nM;Ov>Sq@($[)|x]S@O5gdlmy  #   / `    W P  ~Q \B a  &s |8  4x 5Z |C\:9,|Eo1:\%XUW8=7aQ.kvP&~>f  Q |n$Q$;&'b&9((,*:0e+@2,J4.301y//-.+-)n,)*('!&"O" %K H ^ r g^hk#uGr+dW$?(10[4\ Ud|V4+5۟ ܺ%2ߋܬ e<}$3]X j / 6> ( 9J\ ( R[]iw  2  ![RqO)S;f")<| .OjNt^`2pqbB(Xb  #v S X(s>bw "yJ# %% G%!"i"o# $ njX =` B 47a#ݲbػAϔDpy#|Ͽ*өl%^sٔ"ފuK Pxtx*Lb`fR#Z$ qj  k  p I  lg2 s C fG2L @ub:C H b>  :E#4H ce8qk`Pk(.?"N&cX9Ay& ;W:53.IJLKzwIyf 2,fxB   g7 7 "dV4T_/;DzI oCyEf(Zt-ggSYXJJG$V*1/ c yg7x\]q g2 ?D3r) # ${^qk>Bp? fsnsVdEDe 6۸}ڻA$\('-JcuD^%~WVX[ hK   <Y34AE "5$"6DG4$6  K;Jg-'Yr~6bA?H,:@Q(g~ FWAhog r  y 1uNNDxT!#]$1#%-!7 x 5%j{Yy > S 0 X%u .4toi lIW&ڇپ"H֟RTQ4ۗ_T= ;1F=`=LVUu)  k{~1}o~N1&#() (*"[*"c*k!'f %p $= # <Erc~h UO A R?cfUc+DP_zQb<J >KCK VMq  kyHM4sd* }%2q2^ -  e $jf sl~Vݎ'ݝ4oݜނڶTc|RI)J&u\affcmLP)ntc  | 9 ( r l im]Iu7G?IHQR$pYxr  MO : $ F J|NtxV_y,z6\fd|N8"MW|/$ [69<1`xGN*$JyIO<[E^" 9 ( %h  p o O}tu$ex   IO'H 1pWdg O{`#(Cn I,cja{%kdui=s}| $'  VQ .x 8(AJ  ^  nr?q _5V V  fCE2.HG4ov݆#ڝ<״B4aM,=5͂Mͺa22(܉Ӑaׅ.;ܸ\x?M %  d3=!{!#!"I"u3!b@!% ;P  D o?~IJ3n2P/   1@ U i osxxd} |0uDzGen j8rO_@ 5a jAA !6#"^ &mil1     a\}p][s$MRTdoPXP}*y5NHw5u~ DgQxQ'ul+ T e#y#%^%$i#w#p "K uXy`cQds k +ny iPaM{1[#@t!K_0|P(g 3IA @kCdl`>BA +F4A X ?= }6 * O \yxV  rVQoW eu77KeN eB!xWZC]1PiRKS!P~Y=?K_4P>f7|P "T )% 78 B r h V J  ~ l 85 O<[* 5=W10   { ]  9 *a[4J8l,jP݀&@ٮrأ>+߄06 %5%dgo ?O w  C^^v& !:!"!!"8( LC&EgI-j3T3 k =Z 5" @&#W0y9fRMD9$bPAwq%O3|S eVBI4$ / \ W/'V#$' '"# (R$w)%M*%)+%*L$+!-tI+ P'H#D]suK7 h CIc Tl%% u{ڈ`ߚڹSoݱ_ݡ۫Np/ӫږ4[?ܪՅۣޜ8f2& T, y  &iWi!X0"&#,|$1%F5(B6 +\7,::.:1.:.9/7a/w7.4,/* +%'(%'$" yL 'M0kQR" ڹ)؏x.q%|۵(ܳ.e_ݭlX j1nzNk.$EW@`P9$fq ;ItS d8auV|\Y(  u 4$ ,#E>"Wny!FLl, fIFr 0V7 V Mv#s h $%N8 a fUq :b D  z i  U f +  p"aZAO}kYYOY/.{`jF{5bB@SD `+N)B_P7:^(KP:`I)  aT ! d;b'3eaRjCw3V]}* :oc   ( \ d p  : F I%rU]$2#3|P_[A 3 b k3iIgM." |~yvG G9 t7a RyKY%0lU[K(~ۄh:/ &؀?0!j݆׀YkFަj3~L   S :h $kd #L& o*"/$D3&V4N(4(3(O3)0)B/) -'+$[+*$J*")!'& r% 7U  z]z[() QviHW7De}Tްޔ\ߢ6uNA 32Qd@d %m RqNI!#f%n(I("%5%4&$   B` a.T$*30ހUxعnQ zHXmi<pf8phN  m ' kt>J9tl5CV [ H ) < ( s  {P ) N  B ? 3^A?2`B\t*QI:z/kspk*> gw>S:;8q[/A'3+(.h_e#p8m)  M = z R#U2~=5Dz.,Xa]{v/]* * p tueD+ V2(II`߽݉?F2? buz#۔\_j&߃"WsV.L  nLB:(!JTA N  } n  <"CrIv%8E%W@dV\!5 .UjUn@K7fe   dDW L%!R*',+_-z---I.W.S-*/.@1-1-/-/-.Y-/,0+-()'%K&, " P, `T  IMIRo/d@A/o#ӷ̜Q0r\'JՖɝղ~s֯Ab6O|~pV5I ZU2 T ?"M##%"O(&**=+.8+V/.+-*+*");(D&%%#U%z "JKFWz hiP   >t31g7ߞ!ߖ~fڭڞ-bnA (@GQ `bV   # :K! "E#e#$$&:%&$t&"&!) "x)u ))'q#  `i|m6( 7o4k270y:]M G߁Y؛ ܿ k7qսچ>IںW۳ܰ]BsAz)EpFOP  zPY !L%h#&'#&7$%f#M#"j!$ $"4#7"`i!4"@#3"!HE f:  QV M TT% .ME`v|s>߼EA6jy&Tq8'/J]|z^ )   Gn_   T   & A T Wq v AwZDZ ( >\T*@_SJ,rQv'po,PaVf3~ A(%uGfSd;V9ki7< !O j \Z ;E+~DHf!#/&'W(S)(@%,!^)4k   / V ]M  T:tgA"VNv/bIzU8]%)5fM}W=$b\ =A  nfN>cu<VrA & t2 n? b }p&BZRZ$uOFQ[EHu2ENLrfPs!wPZ I]r;FukH ;Q T8FtMr9!d A !\#$K$O"!Da[SsQF 1 p|7&)ncMk)$ܬbݦ/Q m$%5[(G;>R7+qx h l  {k 4l$v`Zx6CU)xvVujCzi8 Bo  4TIjIZVNlUXHsF!H/tߨ߻ۘEݶߓII3gqd%]l5C  . CvZa Y"y'% (#[+_%q+%c+&9+N(+:+*e-F'-%.+H&W($%!"  j1 Ta= ? o Jr,x%c+RX_!6\DoTrV }faq {L u<Cfl-t " *   `6 {o4$c`%1U|80/jz. :9-%N}0B#T}CT|/, P :  jk5 ? !# #`!#g!""9;   ,vN#2 ]x|T4@|")qP% %mi?ߞ:ODާuܑrڬ=u %ei8& _*8 wbv &AN   \ n ( j {  3aBb%h TXq) 3 X } / XVx:4& (,mY?ZjuwG LiT$4!oH\PhG b%  e \y<[js$A/#=/ D * r C!  fw!1 U  J 'h&t2?{<X9]Y:/|C BL e{ bCRku+q)8%skBHV>2^KRk)I. { K t \ l   3  t Z ~6R$Ud #*Xw3    4x6'\Od(4e% GxߜCbx[WضY؂"߂4 ,fb0i]B 0= D 9 8 \W#/=@_KRQ~.ts od#m{bh   , UV4_D#8E '[v[pC O1o1{,TV 68Tlub;G<A]fGJ K u 1 t.Y^H]\vcPp6RCkj3 ~ &pi`  d    r lV _B 3zy:;yv | rpg)|hCcxtߗޔ`6MF' ߶)߿yXEG_>?I  R K( { A  Eoj^ g %:|4  F] < 0w Be  ~u5aoI.]j F0Ni." /wH7-5UL^JN% PT0 HR!E='!!-$&O&1((('@%Yh"3&I)&+ A &/%30r9&H(߷ߛbݴۖ&&ܶ7Xկza!6ڠ Fx\b H!! rD r  Z ( 2}N DL", "" b&)XQ+, /V!V1H#1$\2%?2D&F13&0&/u%+!$(&s# 3\ f=fB !XWQig8UTb3Ihle2ԃnnԌ=ԩ=ܙI"9 f4 8 RTY\r+# "DY9f l p * fo'j=e /$ "|7L? ^ qT Nr?2=&:1~j!6޾ݜ݁}Nn(SGWu Nob7x '&%; "!$^"c(C$*%*X'+%(,(+q(-&/$.c"c.B!g- *6 &# @fMrlB" \c X!;A1QbcۆlءطՁאSغe8`֒K'|V*S2~ "F3 b- 1HzOQH;]k4  " f  l"*9$'RU&Z&(J 21  [_@u ,&NE8[1^rU < = +qq&# $~"R"Ls"[" "N?4<a7 i ZW  \$my7M #]eZb5^a+dQޫxu(S/ߍ@nD'Jp3:\}D!XAZ,u$ i: W}3{  5j  z*p}eBU c[[Ei k C* J{ O CCRC)M'p 8 g m  {  }} -#fXH3d   m  Z  ^ " ^ I a P , I Y +\yzSdnߊߧ4J1AN/}.BdZZ+z`;+n./  yQ ~ l4Y>Po:`lfK!oS! 4{s9?  u $ 2>u_}zhj1vsfdz:\OP(TrV_.>+L&VE <  5 d1H "!#"%!'{"])# ,!B,$+(S&!%.!be@47c  t) BrGT ;H:o4ҖCAa~Έ0py~ψ̮]ͫ8yٲaU%oe\S;F*n'Vqn RK |=M]89L "8$&#'i(.(g( (C(&(')' ('&%%$N&i#&#sg+ , H^&R4}kR3gK,{I[o| a.?nf,wI4Uh : Y  {7 9 2!6"!r   nk !#0p/L&28$~mJODQv@+Om5ik0}<${Z' E i ~ p=0-G5XPL"ZPM.s2fn$1 68_[E {]3YHg@&B.cKxQ  1k Q ?Q wc ) &nh     Q H E 8 I ?D+RVIZjE[o"H}0#\0BD.B:A"$J=x9`|S<#& #eo eNNNw[:8zMF`v'+ 8X3+NsXZi&$_YAmJp) Siߥ/E߿SJޒ)+s{ej M%{rm\;o  {L G_: qU "i&3W)"D*#+.$.=&/g'.&o-s#A* 'j$  { k s" ^Ep v ,H}ca5)Ze 69%%p~>bu>Fn)>1iM 1     &Z'6:|/V0F(eXI n    " c 2gTgzn .N$ۜ٦־!7x.פCNVGg ~Go;Ku. Hwb\;! 2##p#H%#O%`%%'o&'r&;(&!( '{&&$'#|&#$3!!D|@a:^ z=  %8pdXnDP gE F]4fe|O8ډVٶtP|+E@"5|'- u (  BGb+h }*A5 <m d < q  C;]SzkQ - \)$ }|Fv%3= Fi(?AK^ ; e D(/m PoZP{](h wYG9 $a)LY $ 2Gv9[ 6rS?Bt.`vq2<9VO;6hQ}a1r OM}4m$p~D`,gdc6\-1 I Q  GA  2: :ER& F>VT  zx m { T=VKU5Gi}|(PA.+ %2oQ S9>Wo }V ~ 30    ^  S* ] f A  I p | I/  = E gehV}b:n }*>h% Mxi[޿4Kٸh۱ز<ڬ(ڈێ4O8/%* dkGV35( M 1>N7Fl"&( )"P+u%,^)>-+-,,P-+.+O0*~0+[1+x1(H/^%*x#I%!s#!6!eb6 lx 3 +b(E9'2ޅwK݈֐"ys۶Hݖ޽:܍B" |d"EN3kLm+  jn|-kST0 S 8 p d O7f  S"~"A~m;2?_qH:#<[(rs f 0 D""#&$&&&'j'v))/(*i$Y*#(L$)o%p*%*%) $|' |$5!sT",IKaz Xu 2|i;`)jJfAߌߑޅ`[ۯ5۵ۗUsۃHczޢ z`e1wxjk zG84 uv {=&9b0btBu   Y  l 92  B/   u ] g5  G  >b e K T [; ,X Fd 8R \z # _ E  +,gx+v#Omk{S%jw Yy*3lj|jtu&x;e'3ijM5_-  4 B 6 h  S  D  ?  q' |b n Fbp)K>|\%Ezx52!    D  &N| =sTz"2!&!!v  a?7$l {& [ " ~ 2k2g(@w7lhmjP\k35/bY KtL  >   B[% iOw%NCc a3y& N Tj,gXU9x[{7=6,(.nߞi yAny0;Xl=bF5jqo2{: " k 0E.{8  +2uQbsg rB{%3  o  ! 5N)2N?6y'7SoInKxli% ol EEW/]WO K#f7c('.tBpsdo reS7q$auC ,(<Xxu u`YMgaDkt.:[ tM+ v9>TQf93 T ( T f  HuBPA] bq5d]|b:2K)qyaElt ?   k%UJ!TNPLފKؤf`ԖWUWiHr}[*[lzl%objFB e 4 VnI5} ! 7!   Zr, /  Kqy9'p,~Y1!DJs98[W4 ?%)2jJ w +3 u4"(+!.4&1*l3+s4u,m7-80-9 -9,F9a.908 077-3_)2(/%9**!q$^7W ,7RV:'NbzUKС4%.?ZƑM9ɹ°–jsʏĭ˖ňͰkQoziўҀFaM;w& < 6 g$eO\#j")y%,l'N.+.,1.t1I00/-,*(*)E(0'0("'3 & "~V i   7n[gW"3W>N9"ya[.B07nP7 W - RL  5m2* U s-8CBC R6Wa4V&ycp) }v*ESq.B~R + eqr{}E  zE 4l J0^3a8iq_0I1+nY4eEi-MscK z  X L i ?  1 ( j B   rUT.&I3GmtzrGIF{F ]!)O8Pw'u&"AYi{I.lnbUk0W3u@:W3vS   M{ gB0;  MwL  j F   o o|2>e&l9|+_Zn xD  /xBm>g?DO3W;%I`d+.jJ Y " D|z+*sq  _ U  $u&C9ulL4D"r16p1Eieqk M h t !3+P>\ުN7+v+wc݋!Y9$qlTNwm/|ohb ,G(nM O   n?$&(E+,]3,,,9+)} :( %( #)]r G0vx1k[7j jh'(m׉$EP.ՙJOЅяХў'q Ѹ҈ZHLӹUѷ%% ߹ݜyM :D =l c:x,!F#"'(*/f.5'1D:;4#=6>7?X8R?28 ?Y9=9;785$5p4m320}.,(j){# '$ $ z M`/ G~]_G^ DDJuV;{+GB7^ݕlu7٬W׃5MڴXۏn!ߜ+*E;oM}1B6 Zw ) NN E  * u  ^' S5 2 : U l i  ; w^:FLTQ<" C. I( 5t,E *r%e R?jT37&-O ! O kU9'k(@E99k }  z  O       < s.uX3mfL&="]X?93s۽ۇܘ[~ޏc;Q $hO${D)`|/b,YlCwP`Wv Q$AZI4o\  !~!{!v }mioU}]ZO\y B  YGCjwV^&|3%LuyrI"\ffO2]w 4f]BUߛ،hb#msԥ:թ/N/$&RE"flM& v:G vp)  Ot!.!  8"""w%"$!g! !!#"!g JkA  A D6(S(h4vErn|he=TJyz=>HBDCS $  w 7   M  RW]L.Gg2`:-&lzyr:D.#ZcN:NߛMr,_TF;p1R]a6e9Kt8 RX  | A  n  8j{2Lt ]$uks  ^ b i   n y ]t h D B@d   T h J+k+l?FUMmR?"_[pwۯG. ص,]wBT޾/ߗ?@( xpa,x :&]Nh6YEs  D w    4 " 5 $gw>V?#fxDg }  8 C { 5#73=Aw?~HXq2FYNC}("L][Zh;~ 7  ( zMG'!!!!* s=%ansc<+  w0 A9yiQ'#YNOD3ߞތ>XقE ߪ]vPi Na|g  1/t "!I%"($`)$(%$(M%(#) o's#;L, & ? D :SO1ߢ߰'yߤ߁0sp 46I>dJX G h* .]!dq"6$!H%$%~&o%'%)&))&#'&%T&$|%!$"lme Q<xuP/e]oٛ_lӧҭ޺i٭%ZџP*Ӫ՗ծ?$r#R.0G=٪-5N`sH=  KA"H"!"<$%*{(i/]*U2.3,04-044/3.2X.y1,y0+. **{'0(%%##S!!Q . R9[]]^ H 2 A C s + + 4g<[B[/0t3UHf)y?-z.A2l0}Pf!baC?P6lR5 K|Zx8,d Su #  B=QZGrX qE5tB/lLtF`o r`$)}@nVH E A  z {bO  a t c T  ? T ISs  G & = e  G  T u _ C6t(+   ]E/>dR- m NL'k=2{$JUU:N KEfx"@߆r\oݠAދ߅H0 ~pmV-%FqZz+SxnF   Q%W . f [ 9b d yw  hmiJ v(2N\sJZww5 F-KW!.a+Z&UZ }2$>c\t_}) ; ab K _Y N?j :l |  mSQ]$0I<( V}h]6 :OtX$v<  L b ~:TQ2@I C{Ca35#?k Gl+g[rW||w[~WVnz!Hi$GO>-4 . ) c:i9  28l&{ b ) B } 9 3o NTgN  5uw M pVx3:[lK)%T5Xކ߰wށuZLNr*&3@fW !]5?#\Dekd J/ / m_6?wZN/w F:)qݯ(ݰg".@tAp%3IOJ22K N     MX 8 f  C |F v\2o6H/(1 .;3 yn8UmE-|][hPA.10ZaEhYl _ J 4Q  {xpLck9F"(6 q  j N D L ' 0\\R!v-e=;o,m-.܀/f?yXE)iT ?cR\o]Bz +h  3 w(n(CjQF { Js  - `rAc J! y @lpz =   b# T ]m ^ E ?' DE14y:@*6WJ $X 1= qIZy}Ezi-8oj!(uo/' i` 4 S  9+Nw]F;rnm   H   P@K]6= x'TG0-'`Q :9`}WaOZ }  j6  h h  }  ` [ H t~yu9'R C \  8}/ "8-gԾ0~ibعd =Iϡ׷>=фՇ׸CMo֞:4ܭve G}fK!&!^("P*$$,(7,)+(+',(-(+f&)~%)h%'(c$'"e'!%# 4`,E&  i 9UW$,6%>U19eLsY$ݐ6.!D,Aj:$4e ,f\ d T fR;GJJx| G J7 ( ; D @   K$aJ:L?XpjC8Ghju~c;.a?k6`.j L    EpH"{70p`\mptB`b{wSx    e|  p%S[.(d7:Sp$8@dhT]#Dt.P;qeRTSun YvErMR)+."ZzsG*HXV+dLr" ^c km \8;g&0#{%!$(%*)z-.001%11/1Q-1D,3*4*4(z5I'5'4("3$2?"1 0.j,)?& !.~ 3:y^BtP7ײ0]Hָ وt̏υE҄.}ܦ4|0!B;B[x R$ ~ n 6h# S  W %d|PD ,+8g{5wu ')mr+GRz[4' G#A|@ Jo / h-#g$!$g&%)'-*0}-l1.S33/7/:/!>1?4?7V?77=6z:(3B6y-4+1(-w# * X$gIK  s1'r,"ߝڝۦIکk^T[ӪգS՟ѓH7Чqл4{-Nͤͫt)Ыѻ1b{*ދ JzK=wx&x ` W+ .^4'x^!! K " P$#I,_`$;,0  ^% _A i .w|^7=f 2Rk8mQjR9 ^  nW)J!fA|uTMcw%@[ W  E d^bQ'33tI%QLD(Mݽx:ݿ{/[*Em%}UY?Lfp~ 5,P#V5[ A % / M > /4(e=2 g 5 |    " b0 v? P 2 Q  M  Z  e"4WFb=n:BDUnV($n,+A!I'/rX|]304%)s>&)A|$A\[) R u  v  >Ir5jmE{CF |QK.-_jJOc&s\=@', E M z Xe"!;($.&&5)(:Z->b1@2@3#AN3Cf5aCV6eA4?<3<38 15-3*x0'/L',%*&"!L>mV vP3f$Lܫ G˵vȨM @?Σ˽'Ǵŭ[àӿ·ư*hYwb&~ߝlp;L4sRY <Z  O r$ &$(% () (/(3*+6a.90=3?4[?5C=3:1I:q07.%4'+/P',S",)$9!.L B  e svH:(l.!X} (' +Z/)sc%U! J )}_4 BDfd" > rU2IR SJ 4b 4iwܚؓH^eFӁ:[mu>κnz0=g޹ץڴݷcVCl9T1B|*; `= x q {) | !R!!4 9J 6^.ve . 8  6 3!^qG W-]T?Lw\}p0/pa,!d1s.*\B[Px&omqs^"zb.YmrLF" d7?Hr>Npi}kt9   9 P1y}`!J , Sv  %hNV9 Dp b  b  ?, I e@ -  >_.ZQ(b G G    Q E 4 z B%SD n v +isnu+<]<_ aA޶O۵#ڽ٩\ޒl[-WpvkgsyQz It{6C  .-^O=@Yo? p : @_8 7 5 +6ܟ{9Ԁԅԋp:O.ޢߗOߡYTkt.7ZX= Zv#J&n(+*/`-4<2,8D69r8;:Q=<=q>9>~?<A;?:=o8<5\8Z1#5,1&'-s#)"$A"d = ~WW! vuMAFDރw߰ ܾ[RڌUا߱ޏ0b=Wz3NJ.]5.1'lG g s  c4/UmzM6U>b ! L  4 %+f-Uy[3nT\:,k*ܲ޼w}dK*?!=B w@v \H"<%{%%\&H&[&#<'7d0* ~ s`4 *  } Bxo5T6xR %oqQD_ ` rw&@ U8CZ7LuvT g"I1J1+u H$K.u P z z A K 7_    ;"t!d{[s3   A f  A  X 5& oy# AAG 4m k[+_p7;.ZuYzM~>3e;>AL?=0< ^ c 9{  P "  `  P r)   ] Q| [J N i bR|,9*</?lf@cQDK)oIWmLVj2;D-pga V;v @ 5y~j "d" %&''+(1/)F2)4g(4Z( 3'1'92v&1$%l.$(0###k0$!XEz  mbU/-PlSD2.)VۯDؖ,l݆Q׎ׂ|%*T֡Mpݩ4v5P?%> B `%DNL! $!&%(B&i+'\,(--c*-()'($%@! !I9kY*P  [ L H_`u H= zeC.ݦ܀ qߒ]"#ckz'kx C"7 D9 v Rm%m 7"T#|$}&2&)&*'A*#*),r*,&+}!, *,1* :)V%[!56  DXIlhܑGܣtټv٢Azޠk3݃܌jߑ XJ .g^^k\.P} =~]4"  na . ?D-vQ3 T wTMpd m R X+O"/l6CDI">rj++@~"  ha)  Q  os ( L+ iw>a?^uRv߱rjQM6QWR " X; Y~! #U#Y%;$%$&%'%&i%$|#"|$9#'$& $8##o ! \ !_ RI3d7\  )(O@2L5ދF:ޭ֞ڞ+9-Ι7̄դ5$؂Τё҇+'ۥ /O aqTf'Gi)  46>s #%!q'&$*",+1+m3|*[1J*F0[+*0 .:1/2&/1_-P Vq u q2&!( ,"$/&2w*}5g/3647g57m5W749645n3511X/-+(&#w"9^ j $Z qaa>@U)5&k|wvLP >aܞD$,w~x/s M_,SupGCVJ ` ^ ,,# |= t I"59 c( m!!H jGEOs -i_qh $< ~ <@W 7bFx ssg% 9 > hY_ 01dFmf+dNG-KoV5]7. ^zR%v>, V  n\4I`Vj}py4T F L D~BA0`C;2U1FSuCzY2wyt!l\h$S/4,h-H  =D!Fx!h!)#,R#%)(c){y*)s>&$!ltx y| \NM 7 BNc~ |*z1%. @o"zPm1~+ d_Hvk&  X   l#a&! *,$3,% -$(/$/,%S/$.%+%*~$q+#&+!)(/(d%"1 K z t K 6'8%>G#g] 6 tdـE\iPɗ[Ы ӏ6]rD O!lc.RIlHe ] rr9#m$H%I'("*#,%I/U(/+4./w-0.>00W00h/g.,,*)O)%'e  + ] + I  g A N S T ^8@[Lsrm] n[ tM-BGplO4&qwA#A {Ի׋Ԅڢԟտz4i L&JMd$P\Fe l9e{N}Yw a E 9 1 j Y'rXlP`t=`Sj_htr%q?i hgr '| r h*XZuGTQ*@j `   ]_ d , $ Qg    N-|yR 8GA8+z@&2)V,Bw1k6|$}4NFD,?9 R{f%IdOPyQp?70 !j pDmg Zt ~ 'Yu"D[)w+i%%B2 gp (! w D LC p,oyr7=y% 99H5T`8s  a   ?&r S { <   Sa   1 Bl x i;d9J}oeCa]fxm\f74uݧsruq"pLv14GOfTP Hp $$) &#X''.(*-*,,-- 1#1>667B98;Q:>><@;UAb:AA7=G38,26-1'("" gp-E&_D rVQޤtՅׂӷӈEлϼnϔпΙу +AY !AH]Օf3\+Z+4W.ucvla t 8n 1n"&&( 2(#'x("(+(2-_)-'.@%P/^#/>!. + l* &G" |Qrf 's w f^GsA!Fg12 8jut@~'jyy!4^`0KI4 #8 H)eW lSu+KM,9G^c8?u(D9-.Dg]eYRhOz |V"?!v\v; uNs Y]3 EUNS   =>Dq)ye6Q*V\'jTf$)< : 0  K eu9 ;fi@G.')XfwaVijL3֫AGԼu[vv]ܛF_P8Y,*tCi) h  h'7o8hbw5v/h2XVZ |"  3|  3  o H | `y};nm % Yf`HQz7 VF%  F 3 VXU_MU4GYG# 0  B *d`xs d"|@6p޴`Vׯ64mԚfӖ͝ϓѫ-ӎW)9ԍqv ݮ1+߯3[AA,nmi  /W=j g!tJ$';+U#,(|.!+R1-1-1222(64[:"7l<*8p=7<6<04Q;r/\;X-<-79*5(3^'/#*'U$F > f9 T 4߆/)*7=A҃_ӱC؞5z؃h0p>ְ`KGآUG< 1Ox?4y~  (GK 33tG{1  h7!~ WS)( _TQz}B0Qkk&25g-+:ݠ Y&;~ !$({)y+^*!;)+#)a#*##'"y%"$! N aq% & Z  kw>D.em u;D4v RLbJ>`I=) - 4 r%yru wAޙ9F_߉JFki'Rg >WR B BA*0yy\I_%2 ohIR Z   x;   QE f |(+RFOy 1  ) z 9 Z u ^ _ Q  zn[VzrbۄEL݇ޑ)t,L(S ?7tsU} 6r9h /  ^ zM B  i ' | 2 ? & 9Ial%bs0gr)k| nmw)[,ڥ617(H%0t?M =>IGD"_nA  ~%  Hvn"cVHh.v  ^  n EhQ)8@ru8cW-#/z4>65ST6B6 <?  "}! #!##2%$(%)R&)%M($'I$n'%%y&$%1"1$| ## s- k+4m3- u G YSjOrpzܺm1ڹ>F٤ E>F/؎ѭkw؅Еڠ<ѴMDCJAVbj %) "D*f:VR"&(x(^(J&%b &$#" bu 9 J  *  -  KzYt{<Z,$)o^dVF"AsOmHZL"YpCO6RT8/VibohwwoAD  s u|XcfgI7[[ &  o m [{j%r|@ \ ya17Sl0Zr?-{~k8. o|8o;3-YsiGQK9 , / y= !$#:%O&@'U$%!@!xiQb.J< 8FCm d b *z>IL*6_Ta;#El.M#D߇)*qH011=2-232413.A4)+3W(1t&o/G#(a"h% b jlRE,>ܳK=ӾA?ԨҷAdSˏU4́89vObѶօޝC(5L zB):0 cA TI0%LZ"!$$%0'G&+)%*/$0$]0$/$/ $.o#/C%j-$ * ,($7!  vlxn r   60 !9|(Foeszh%Rh`hsb Hzs w ~8) M Q `6EAT/'bRqpuw^'CAe07ZY(\MS{  >  P  c S l U%&dD96BeI(`f W m  L fb] s : R&K p[%iCkDZ-j5YJ9s`]e w|TN\PVWU )  ca x y  x  r c z    9 ek jb j Y "VC  }PmjT k L=M!"fSts3a?uMC1Q-5f>6&_idP'~F,bk < & d u     % SM$|b 2 y < T ` JM rs < rqXIK^R}9fif ׌'֓)E!Sr}$ Pg\}uY F~ ddX1"cP#@F$(+- T/{N.,+`*Q'^$m#rT n @   1sVrB {|yYBU[ JۜOUu۵m}ݝޠ<ae`A7_wM C9= $"*+%.*1.3.41M73:|5:7:8g80<5>1=,9w(5Z&>4$B1G,W'"W 93 gtm4'uoߎ~L@ۺկ2oڷѷ@K>Qѫ4qa1֧I0=Kk|`D"E#SK o<yY#"0'#:(&(+).*/+t0-1011./*,j&H,$+"w))(")&M  |7}I" Iq'qL@7۝߈<;! ֍ܗԶY;9сSyԓܩߥajܐސ5sza u , ` !!$T$'c$($(%'%v&##!Q 6EQW@Ch ^  P*|4,};EO+`ې7UI<OM%߅$ku)D$Nd  E1WXc @`  "euH  (   ]qmYEru;N?>#5dpSXdcNZ-NvR4K.U.]Ru 1GF N=_a@ Gbc5DlA)Oz_&W n  aSUu_} ]CNBKNK +]Iut'Ez%J[   pJ:CSF2: Q< LJM]!Q^oN 2#(X& 7PEn]KkLAF 6  " ? ^ kn -UnqE3RA$X[mowqP+Ln,hX - XAJ#rX B t5ZUJf!oq2"F%&3,(w(p+((%GW X &MX3 eRL5 ޜ߰ϋzݣKۋݨY7xm%|=jr3gG Rd  Y  +$ &!%R$#'#+&,L(},'+.&r.'.' /k%/# 0$k.$+") -&n!^+U   _'TArܐ۬6ٹs?dԒ-ҹϫώAsY 2aҏǣҚȈԤʉkW׋؛] qK  / L!&(-")S*r+/,C5/931L<%0=0->+?+@\,?-<,n90*V3%-!(#)rAPc  T# +T?]5 G3tPYP49acmfe}Qt]I?w d9 |: V >) ><  ?8GZ kN r  c:a?2 ? z eaLcWp[(`pB9 s?hsC2$,H&)Bd7  :   "v I   ^K56]pb 7z s @   AB ^  `%  / j  Y~nQ~ A] @D/`jH(We_h{!@TYKvn"Qy 0]QI#qt(CzH 1D_18_=PWD wb $;"Q9OUS b NdX@1w{j >BFbd= ? m#_tD} 2~`1A#> )= 9rjFV)}FPMX i Y d ~#  $ k  p >   X( n a t 8b~[aQ E   Va~C?}'c.xB[ކ e=ڤcW[? Fߐݸz8?_0 {PSQv K( Z?2hcq ^v O }Z "o&{' ( #(.!'#g%%!$-%e & '+)C)'&0c#Ez ' Uxj29T\/KL}~?PX@xq|WsZ)@\TM1/aG`w H *+H6-#V!"# U#|)"=!7! J ?v/ e iKeR a#V(vb6ߥ^bׅ[TFѱkBdg1܋XU D i g 2 \m $%)l7%9*D-Z//2#{6&7):,;/;4<`9>:>;::I98_8G845.0() +5%R%4! &|+[ @% Ga?^COڴھڽN]ݯپrsMݩQuՂ ՠ֠׷hW*i7'=hDnIl\ },Av bvKvQ  )   | \ JRTKD )Z g(  H   \ ^  & [ _ }Iu8}jDl%NO|_|F"  LO     / [  - T- 4   #]^QJ"e-sL#c`yi$v,WJk-1_=s-P*5c/ g]0s%OGRt m"+D PtP+U d+ _P ? ou  T| / BDb6@iLW9M7d2-foYkVl +BLB)~     < ]aFK3-K #< $$a%K&!n((f%8$C 'p:x   )C~E+\ ?y b-6mމެޝD;~ސv46iHYVK{ g-  .v5~: }  {! i- u 1 p  Iz-\l u&P+{Xh76,COSg 3 7}"ESU] "#"!#&&(%)#9)")M);()U-*'#!PMn 7 [ yz.nD#}hMM%ޮۇ-RXYҮШG(lӥ0$+ϋԐ 183]`)d:.=n|߱f} I<2adu M>Y  g !"#$%%+'&;(%)M(,(.(K.)+T'q(%'%(%)%8+{#G) 6%3!q:=/= R  3R5Bcz24 4Nn9q=UofM$:{G!I *\(+eB$s&2 -xrY-k  4  n 4 g    2  I   ,r4m<[{P X|}V(#,D%S_F.gg I2^AjYgbRL+}.VJvTS/^  : =  &U [H eYi$x O  y8T=2#.-4 ]; 0~m-WlUQX9&@zRJdۘ~#ݮ߳"߸2ޤ߲Y F@6n]6B@ZP+-5K  t k ] O& U   L 4` ( #[6w 8eNDhpG}/4t> ' <gYu*ߘ21^j~9)musy0N + 'u  $ _  c ,)pq3q> H :z,ekk\WJf(j$tDDTchNR"[aapsC<<.N7cl   I  ['"'[*>++!s-$/('0(/'#.%(b$O$"{!u =X>w/T _ r s .b8ldkIf_0-' oJ[C(l%V >FY=zNn g 7 E pkF -O{N Cu (  ]M3NysvT"Ne6iej{!h3{;+S*72D M~po E'CUj S 0    S , d  4 G )  u 7 fQ : ?F#U`ZUiv~f4%Ix9|5(9-/veFpX | cKg'){0"C@@F}P{ܗڰڿ PچD۽%ܝ.ۖVWߩTDI0 6FOng /+v $ $(g%*s&m+)f-B-h.0.3S0423)53H66>5r3O200f//T+-p'+;#'u#h !Hw < - H yfe6j;'WjR\#ߛߠb%M]0ݎ>ZR1ߨ$)2ul *  y$qa) !"!a#M!$!2% "# !r KZu  h drR#zB] !TSUrdO{2TjwuP!]^iJl(+#6  F ru@[ D!?# ##K#$!b#1"$H $!b!4 ~ b !j  P `  qts y8Seo- T>T@K I-JM=UVcLp'4 ~ h] B E 3Pu^0sop~?B>ZdCrm/|} 2]WXd+x$7S Lfrq3.HOD /  3\ E  fU K| Q  xq?0^wMQ.d,PpYQ>}N5m ?Y9{/%V&_m=:a"Z< q  dkVMmek2i_N^OJy7ir1U| U;+d6ys3%XEh  Q4_*e8!^#"" m"#!# _#z "".$M$N 1G7z* 9A1 } 1Oz[\4#ېڽ]=ٻ!a+y"B}OCgܬR0(n=   *D!{9""#0c$$%Q%r%Z$Y7~3 W%a&8'FdC>iGe&-5FSL}#|,w5]Tx ;   68x" !_(%,J(.t'1%F4#4 $5%7S&6]&6&57')5&D3$2$/#-#!9+1 'z! +S6 W$isU.Bj6bP݄ڿ`ػƠ{eWB̳{>̟[:˪7}8<ԧPCݭLBNeK h C ;!0#o%l'-)t)))4!(]!u)l :+*{)-&d#BM!$y4, 3  O2? \,*KwEriG*G] 0)uhJ48qAgiQ / = L FOd !b 4 "!!!" -q - XuQo P h^OB,&Y3O'jy!oqKq_z85nh*}2e~T .\1[2l  * tDb8Wh6F# c  OE 7  : W   : w W  a/ <5y^a A ~T   c N \  X< .W- 1!%V]jq,H#B+)BLWkdxI>z0|P l  A) pE( G ~ % ? F <#*K!vt^Tr4)?XqQ{Wa(ZZh${ sN^Resy <-    r.GR!!!""#m#$ $Z#!ATtZE O m  79lk^%.ު)עEхbцж Zm˔́ge-xiӃ$֐_a,W _x000M6}  @ 6@o"%X&'9$(?'^M((P)X)))) )S'*$(!#6 R CleB&FRApa# "+f"ZJQ}V[Bm;,> 3F>~Q  r . H 9z S  D >1 h U7 St4!2YuE e RUIFL() iE.& EV2YEePj_n("!PRH<>Cb [~ E` ^L r""c&1%(I&+H(y._).(.&:.&{,$d*- z)0i(,l&$#4 i | hn5 r{`#Xzm 3F ߠVYـ_ڕ)Qjm=cv{;~l4:=S+   G  "p 8  ]  - B;  = },7t  v*  !')MWLjj]!+9XCuw~Q >U-BQ$ޟݽ^?=qhFJ!T `  ! yBX~d|e] ^q Ue@^K6 !1%~s|d I]+.]m >  > BG u     h I  "   / { `  A s\F2Nm8~3;-Y/iE\ޒp>(?D4?#"l\dU**##(J)-G,2-2~03&4577;B;?>@=@8_>4;0^8,6)6'2%]-Z"%)$5   Sew&,X]ڜj3I2DxOمճ٤G٭[M٩Ԧٳڕݨ wf۽ND72l{"to 9  Wt"#+$v.& '/#(_%i&("^*H +o-/0S/ ,q)&3 "%Uq yuDNbDswm''Z`2&x{U ( 7  A S 3Lq4|Lqu*iV*.[ X  ! KK[Yksd+B ""riUߟ" \xC{2E5ZT B   [ k d e= Ho ]k[<Gi ] S n  ](o 5g q%`Y+QHR m-RUyg{]WU% b}e & d  Q ]z ?  } /gG  - k{M.?,j\E(p f_-iCz}'n9TE0F o >}HekHN>\t(HO}_W9I7zKIsD-0I  u  ! KRd,0n!#jY%{w'6&$# !U!+"&##n$P$k$B"  "# 8yS; "N  i,X(*t}=sH zώ١ѺrҒӻ֬,ٰ ڼ1܏kt.mb< | qO  K"$K$)!# !5"uy x H "^$0}Nsq(+xaH<E+!Or1r*EK`umwdm1]< + W  ]133 ,u$ ^)$z/K(4)6l+6,7/9E4:5!9u3K7Y2401-7/)*$#! \6" ( S@]U'ٸx"?ڄϷվaͭȠ̶1͈?uςG&¸Ҫe0Ӣ2?ʁ۷}l/X@'%^c"pX *Yo8_ l"$')--0D1p24p348444#5556 57A28]0I8.4*L3'3"c2 181+".*N&! Zc 96''6L4*ܼ;{o`ߍ,ݑF+pAع!,kkK&h]7 [ X j 5 ?J[o0(ABS yL 9  N   @. d M Vg  u eq7oWm0:lvzP"am$[p5=;08|[7m_O#@$! * E1 7 dj& _ety=E &S y!Gl.{32G"" \>n3gc46) 6V.,@(#hk_rD_j_pi- v5?jy`|G4 JKI " c  a J  "oM $`  U H  L |   @ fe<g 9_%8 *JZtB]v|F[}~aJ]_ e?k t EnJ!#2&(V*!*"r)"r)%)&2(&'C'%&[$$#y#} #| 3# "Q!M"h9  a3q Իf;L͂̄̃oF̱$7V  Z 4  Y  +Wk / J @AF ! GixT r )k   l]{LX;iBBZyBi"3rig**^KG?XN7-k  Vy  f%$X{ K3 | z   ,( FF= a F  '| w   ' 6 $ < \ 4  r 7 3 M P}x[|HaZpy4pnZDT~$n Kq]C2@tJ _VL\$8v=z7-E0hw } \ U w 7  %K P4 9}A 3 [g6&8 } i &&   > ^M<z69 ] !(,r TO4r_k[r"iZEYP@\8 }7 Q '  c5g8<G ,P p  % & {x [1 i>8'XL[+IZm Rj92 2fAcBVCNQ- p߫ޤXL<0pMz,eN{  ^ h r [  e#1$ b%|&@!6'"0(#'"%#$%$G&"-&$Y""0D  ek;{ +JX248X/ )A2YWzW Z +,6 l ] 9qU W   s4o&#ek^Hxfwk,_6q/n!ccx9WqY 8 ^wC 5Xxv}#q!$",%8"R(o#+j%;+'**B+-+n--++)*X&'##O"]!!f A>ne    = /?fNjvH}zJK׻>֏c߷~@l;ܹצٔUMkݶN,nob H&)u<`I;PC /5A%^  m( %! "!J!m Qndo3l D *  *7 TPyvM@8smku (K:gCKy)"' Nl u } P  Zen%`  . % 3 @[ M C Ujc{u-4M`I|X'rsvQ!<'MxvX^N1i'^7me)hBh- DWn^2?$QX0M t(Wtq< uy  X ? d S Cd! ^ + M 1   +    Q OV x   ' S ` o  (  (u)w $c (c xj~Dv^97eJaEuCVI/]T7$uuN J^5R=N$ Z .) y /  ;8fDhy kDnSq9M* Sc:D_ .TwRE2 ' k 0  # +&j!*& #G%&%,(=&.)(),<).(.L*-.[+1*2]+2:,22Z+/'+5$'Y"#_G,_} @ ( -<L.S_;ٻ0fч!dВӪGL,o`]dwҸ_+,Dy[9 p +C j   n / Q2"#=# 8" !j!!!!"!#[!z#Y"Cb"V Fwu K)d  _GNPWPF<sXD..b~9_A\7+;A44O  } OtQR" T%#u'X''*'N-'.'-).o(.(,M)*&'!# z7; 1jqG1w"jiSպҞԕ*̚(p˕W̉̂R ː[ϺZʄzED0ϩеW .>"[FSEB( p B ! ##-&'**,d-<-. .1S03 14.o5*6'7&6P%q6"65o5~O2.0*H'#4  \ 3()s&  |Z& a$f_U9 NV6Bhw @ u  *  <  |*~mx46-kQxU-56@YlK{-{*/{=>Q !2 @7:EXwhb_p-tO\I|` h /7 0:6PJa 0 4?.Y'LnHZh_k~|50lQ  v_ ]CkEVY  !  |    ]  : P Lt=6_mb"I9ZY7Lt 3   ] :_ }  u slehADIG7tp$)2*_Z/*xl sx6  % ?(O #!$&;# &#%#'d$)L$)x#'!#""Zk~\% Rr.i$tkX_'ݶ.;`@Ն#vթoԀӽ2ӺawѤ շ؃ٽ|ێړQ88v^wf /- & )|n"P % ' +".$/&/(K0(,2%F6$7$6$+5$3X#0,8P+@%: )a QC 4:sP?a իm;)ر&|Lݪݾfv"7BWX= 2y 5 V< 6""'Z'W)n**++--,;-P* ,),(,s',B' +&s(r%&# Lu\ % c mDw%vUٷ ? M!PƚoSʽ̅Wi ʣrˬԼ̉؛ͺ܃;>ӛT%_=jQ*j t ( A Ui$,"(%+"'I0*6-:/3?A2B5E8%I;I?/G@D>C<@p7>1:-x3f)0;'.I#*y& u 2 {Zemen(z]-W9׷\׬1kշ>]ץ$!:ڻ ݹJ)eLb06l(G GV &g3 g  ""w"& )~>'r$"!  t 52L^ Vw r pDzNCzYO)igM;HE ckqtNuhe V0ij? sk I  " G{ cu6 ^[ \  +s/T|4 $_k5(~;#8SL o|U nCFR rXi%s2la'tDE'wMz$6;5"Uj3a1m;XuqS7 z  t  ( L dV a =u / %d*cd+X<O12@|3>" ^ Tpa*(I'Z/`aq2{%cm@i VAuR>W p b CY ? 2xD^-oM~v  W  ~ Pcy %cJ9OS U"RU'p<1%Q6Xf?O));0pV]vcv)!gsj'#K4tWe  u# &"'$(%(+h&*+%)F$G)#(.#&E"%!#&)$ D )BDLi\kVj:qH>>Fc"E5C)` c^<[ 9 q"#H{$W##@;!;9 m g UF J pd(Z-Xg~xjߵݓvط֍PԔѭӐн{ԽXϹӫ֘,ܹ<%r@;Xk" i VH#)!n+%-*0E,2l/t53 979:99R:;8<,5v=3<3:$2A90u78/4C+2V&/B"_+['#US 5] Vy 6: }s33k$*ڂpٵ7Hx8ϧԟԫvŎ 3i٣a{7e%0́ѳצeOw-   b=hUp "!!$a!/$_#"8&'!(*8,s- / 1!*0!.wp,*l](# `w J =g rLVzm ݋ td^E1LT#x'U6P5(<v> : F K Kp+:rx:\ r" "E""e$X#&?$u(O%("!)1)z)*')&# K tr q/MnvoQ-;-LZ_}ަceIؠׂJ4۬P?[ed? uV=e6b9* `b &M  # 9\  Z G  i{T : 4_4Qbq7}S4cg,D 7h!`  u  9 'XzRau|4LaL`3RDeIlWJ\@%,x'"{n6|_[rg^;{?aU< Rc#\E[\x  ] tI#n  I & ARcR(6M?#D|5-:N.[ v v$ ns5F%J}YdF=n4dJ  o2  N/e  $ 9NQ#qe  "!%"'"}'"%"#""-!S"y A/ ` Q Y dn}_ d5tgrޙ3Zߋ۔ښ(Eq/}|LWNF(*x7IuF  " M 6e ^'wj%a|*IL$j\mv , V  Y7V7q#--a~E?]F'kL P. x83-;Eb  l SMVP f+ !$*$'@%*%V-'.N'.&/%0B&40b&]0A'0&V.#)!%UI & g %?W(߲݅ۗ,ؔگk}ԟTQ9Ԣw$20_E˽B[q~&7t=~^7=A S n &   9y|D &x!4 $ o&A)\=+C , j+C")"'9&$u#!9D L !2rh`.2(?h\q'R)L\@qe{& 2,#b a7Q R O  th'm {,#!o] 1! [_'wU "s>*!y(eMu""~FZ @ hfs6tNwUN.AB`6ZH d ;=z "N$&'h''+(4('%$"Koh #lf tHUDJVlS5E[\z.q`?6N`\2p;3\%$9N8?i.OD@*:;R   u    , ` 7TPY`jvQ.S3BdCSd i% Da{Z}wVCj&x" d } E P ? , Q: R A  Uh *X   :w uZt7#NalE- jskA*z    idY &;ev[ J>mJ@JWfy FDY޳ߜj^DZ~|MoS]` Q:uR7wd%Ko^8c > y 957 RY"|"@!I!q6jj'wT0 4Vn{W e/ K03Zbfi=^S $]|Z)zm}z | w% E-i$/iE&242j v x lmq, o/Tl!02߮h%ܖXܤ$D4QF&K{q,24/[Ncnm_eUl_ " 2#8$'R*$+*.x/03c4)869=5;2<0Y=/f>:/=)/:.7Q,3(e0&y+H$$!fIK`] y ] ?W6Wg_3_./O5~65tپZھ. s sA\A;3Jf,jI_}q#5IRF T 6DR8"AP"tjKbC~I|]7 ) , - o<eJe-;U!{CُWUԺy , ~{Zq_!U 5 z%W!Y##>% ' '"Q&#,%~"#!J!*b<JnyC D I k \ ] 5$WhTv7b{<5 }^z[Xy3Nj3kD}ݤܴPH6\,! LmEw  ]-  :U f w E,fQ/nPa I g 5< D$"D|_ZOdx~ZfwcB=>- l% %   ,m 1" b   l n.8l}cfm5M7Zy N l ..$ b :  @l  dH xn  -7V8 KjOG`Ousw&693u4,uv @&haN EIdtu^6Y "\ |#k! 7 _7]r( Q#1%#)&n)',o(/(^0_)2)6)C9T)@:*9&,J9+6S(4*%R1-!,'+)%  5^ ( qL%F=#$Y [݈I*/$Fmt@lEP -8VY~p > H u S d  m ^K \.Qo #GW@  ^ ) +H/ Nl42oYHR\ߎߩߝ \c.l&,Du 4 ~  IhE=""D!R!H!s# 'L"s)$+%:,m$t,C%+%e+-&t*' )g'(%'c#`&!$"KiKy VT -  gqj#F]G ֙ڄ֭֙nD!z؛eܱZfٍ\ؿ ؾhD޵/n[&;CB i 9 ~U ]5V>JVszKx`yG:6s 7 A ybA Vu-)Z_tt#z^&iOiQ"+V-p[X:bM  t /p U   s3:_q   z . Bt m_k2w$dQqysagB: ~R2Q(7=jtr`3l fky a W Z  Q $   Z   2]  w(mbYh!c']a9%w%nFB8 6vS zE~Q:UdKp w rIvr C N &z *  ^;Ooou '{.B(lsv^=6 Y"aA`Lc!'  k\ : :  I s  c%zqj B%(!4N@V q-d?3(pdD[+e%Vh1=U/9C7f m' +  -.nSEC y"$% /)O!,@".#/ #y/#-9$*#Z*{#x+"})"S'x!1%#k mE Mq fnEZDi-r0ܷn-7K<q%olЊрY{[σΊСhz<ϚԲ؊@ܠuT|<"\ a   D#((%"%%$_#G"d"!EHEM hm - X t  s a g  =p9| O{Or%a6>b{uc-o(i(; =%^@ ] / W uS` "e!$%%+(%J&%$%!%$ a)_z  ^)^Y&2,|u;hmJHR!JzkK?HZ6daIn6ݍqqy%G QeG5 #aQ]  1x ^i!b +#!"#k##}"$4#&$!'I$&"'g"&"$>%%X#|b F > ~v5Sޕbz?cZP&n9IY mZ[7/}i# =X! 1 =W V y S* !  $  He, " a / \ W #  : 4    uA jv-oDoMEgQxRtdd5G=j: Z)Z3X5fXVKM\fv*3cWm7~T3 y  $ PZ   .  bl$!!!A+5a`_ -X  l   dUghyWJ},o.7|ޜc݃Mle{ߣG5O\[,^RYkhdYdG v Q $'Jc~ ] 3 o5 A 3  pc 4  (A[a <-t6K k fLyqo4.0lK a #b5 B R0um "i$ :$ !! s$"u&#&Y$&g$&#l&$%6&%x%&|## e #1>=d&TK ܜىLױ*ղҒ&Ϯ4`'˔Eqr͖i΂t\вԌ'Ce߀ۋB8Vg M @ 2 7 5j#L-*V.145P 7s!N8#9@'9)&:L+fQ_[X#ݜb%a.mDe#i 7h" q *+ Qb: W"II#$e"$$#b( $*\+;-o2--=Q.4-+(%e#M 4k  F lN_Z|+^~9t>n1p x4wkkx e3PJ7d-}D$reSlBH}ck[  ~ )0  |  8 7, W V?  ,kZh2y- (vaOu6-EA>30fNTJdh=2OS!b$mf}W2$WRX 6 l { )qU"  u+P  /N(pKi @ [l|oa-t/@I5pf nt+ jY\ -!!;"%&)/O+q+$o+3",:$,&M*D)+*+,)+))x)&F*}%(U#m% " ; 4 +:IOl]n(M77Q HOGg>ZZuZ^ MX^8  D  u MyO  ; Q # {f leK>'bmLW3B45Ilt߃j`-G7@E c!Xa?djXj | i zi9'-]*J+"-S(0P-C4063666Z8u7+:7;6;X4E84nc p n k/>V 7 E ph S.*i#* xkG-oߓަM k>>OW shHfW|8@8 \ KE \t"o# x; pb6&v.|Vo#76H   8 NWA[7 V %T d\gsQ  7   ( 3 <# )~m& + \ J [ * !  @Fc5cAu-SvvwA^ilRI VM(s+K+% * X l -  d4/fGNKzB{ V5\pwqwwxl6m:#]#/bA9/$":  DEr$b'' G(#(&+U)*/*0J+p1,v1!.//-)0).m%L,#[* !1+lR*v))#(>' j$1  1 , ^as2D ]9XJa=NnA=%Bѝ+zhXJ\a^IS7͕s}Џ̄H_74g!#il@P ~  xB"%5'K5) ) c)"=+"<+#*#)~$P+#~+ s($ Z V6v-Gw t(p]mSx]/>,Ys CgL @s 8 ,7Y3nX#'%&(+.!1#W2$3%5*i4.1E./+A-')]$M&y!E"=X7>{ G?:L w7E-,VQҕnѻlʁ2ѿїƤϱ} Ԫ+Աiػ@ކiSشNޡO*M `CX- s];<e#=&C!(q!",#Q,Y#~-"1"3 "3+2gR1/,* *=(H%"^=Z    1eTka<@90Pdn%hpj"dJTI$F#D31c}; 4(,TPSB&8$+hsv!"Oyv< j  B`~uZ+u2oDY5BKM9cA9s!uo nS} m>5)#o  s  $ z N2[TdD[?dg q r !E}L` X {)r.'\sOp'gZ$ay{wsݜSmY^nU]W.q o`js@ y =nMv!H/8 / `a D&2VK 1 g ej   < 2xo S&W%,%hfJ"J|8%DdMk~]gO c  3 3   *{P W##ai#"S!H. T S W e {m}29GdsxlDuq0ڥյ1+/GIsҤ)8zѡ]~kٴArE\۫i߷8X-}Ke u~q]E  6e c "# w"$!K(!9*e***)/)w(V'I7'<&$?#C#!/@ (o  = =_|ha7ڦ_Nڐ8a $:rPx!d?Ls<X ! m' w%"'0%)~'u+)$+*+)*''+&#% #%!%n$6!(k)H e el:=kF׉l%ٖ҃\ј.O^&Ҕ#ӱӒ̽̈ءo ڤ_Sۊ!G|ow3* / ~|\KGQ!% (!*$.)0q.30g50>7}0;7 06/4Q/q2-1)/( .&%v)^"%"! Y~ ^d \ {>'o1 1߷B vcH^BXp!DA6.Qfat_&F Z%lgf>kzc B ;r m_1O?a9L-}s - y 7wN""Gm5\<3WE|nY.3feFpnR%ECH '3r]+Oxk ~f KM 0CX{\! D8 40#[-   d  B  \]?3tiXg4HsOdZoRa ?GP Rj!{&a  U =OX_t,  x FI=Yd(</X4 G [   Z B C B HAVA=tV4@t5C4B4lB5i@/3=-?=+v;b)6A$0/ +5'" { gm .8  mfBZZp;ba2#h?O/#sH-,ݲ߳ޏۚ[Rؐhu }ӤeOsُڶ|d H) >\3 Y Q9 `<$!(# -#.$/%1 $0#E0!.j+f(?"i`P%% C  W S4+ B"v-ߙT !1s | Z'fv_JW  ~  2 B~hVn?+_h-vB|~ qR}M  + ;h Wekr}Wm# ׉7:AJܶsݻ޳YEtX#L_M 5 & D   F d 1Al6sq{E  MN #X Zr]lFtF!(e * Sz $ I%    q. L 9 ?KJ./: sD4ZEwi3_,Iӳ}[ӚՓ4N9!$ba-<y  1 5 g H4G z!!{!+r2%\vc?a A` $ ~ Ri Oc% ""GOH[DTHDު#֖+:f'c vEh+3<oWe 1 _` !1xX|IwnFSe5F?8 | n A=hY:rI`:E'sk/gv1nW)[د8T0ڋ5܅S zWu 4+=Io* n SJ {2Kc %")B(7-,1 0w3=05f1738l48#775x6+473m:1;b/9+P9)7q'H4!1^.nO)"L |sR* IFh XpC"ظ95n]م3ʖ6 ׺L#jȷ+KɫӪʝr>TF:&Hڜ3޻q\R:Hz9t#C  &Hfn=|!*%"(%)&6-&.&:/&L/K%3.-#:.",!m*&t' %!E`v F& [vUg#MqE| {@\3Fc `gq0B/}`$]t:& & v  W[7`Ov  ~s \ 'k |h ?   R  n  a ;#HwTpiSu9D/x[`'y<6kpp|0/0FV!uq04 q JT ogB>..=.0O!M%  &g \   & \B M P  o` m?P'L2 Bn1kbR[kS^1J*M,lM    R  +;  _ M 6v r9 V [Q  UZe0dId !{ 1 qP n|am/'%Z"<qi޼gH5tԖ,Ҏݣh ^lS͆=ҜB|WO}Nl3l92E! r mMiPALJKj .oz 6 O@  S< P1 ~k$x-3:q$v-]~uNJ8rNH.M   DGY!#%g(@),q,.-/^/3/5_.6-7+8O)7&4!1yN-(')'0%r!   @=Fkh j!}ݠعٟHխ>OҼКЎ%*y6̳Uђҵ?6ԪߝMdHnM2~`WWgneB+ kq+@"7& 'Y 5( +$.(1i, 5U/470U770N7;.5+2'C1i& 0$, 1*&8!Zcp 0 0gciNo0Aecm O3:߁nہ۟8dަIݹLZkؾFx=R Q(lw8]BJ L)qE 2 <[ZP6Qnf _ut$  *!5  ~Irnuxl7Q&RDum,ߓm6xމ_Jri8veV"TW?93  .y2+#&e k"26>Uo=4;J R \ |2ovHM|c3Y6ZZKBX\[o.Bw5.g"! nV3G"cH=9 A>   la#cTc@|`Q`h{50QW6+;  .h&G'>_L{!^{x0$QT <.6jvQ  y Y  $V  _k  ! V ~ ]M-bCKe'LlK3R  {i - B C .k`-D \VUq-R!PwE   m h=} >Pw$I<>!3P@ZPo#}@/!A>s+KWFM])0j f bk(E,z 2enp   oy ~ $&O3&/&R&%%%x&&#& T ).   4#i "9T/qZ_"nC6 dPembKEgit L  +%  .PtmJg~<,l  Q Y   52t#S>"d@*KKe6Rߴޑ0և@S- ,׫ׂ'ك2k:m~,2z* F|x<$ t($h-'F/r(1@*R5.5~17'1J:0<0ZPl]qG6RL 8  P  j 9A=ndZm- (68j4$  Cj@ 4jPtZ@ WW5OSߍݝ`sg*7sFtdv,:e4X    * R  1   I T -Wjo<{w7$_F Gcq   w  w }4kEC .4Ml vsvN|?:(fyTJ  1 g /Dv*Y~i'|bVPOqBzm<Cl  J  b 3P E]=iiO<Bcy o_QPC2s I*# Hubj%7.j3,Z  1 o dRRB_2R!S"kf!E!9j"Td9O$Z p Ue 1`   ?  #V3:4|XdG4h[GJ*ߟq)Dr,pR>IaY8  < b o - p <e) | H T Uufk<  (K Df~/izt} G3ވ"݈p\WiۿBs5 c~YJ YQB9 A & Dt|a 9 `|Y "J"n&"y)"A-"/"%0_0*1x3280G.~+z}'%$! F  /  e|f Pߤ0k'оЃP ;1gˎ%~-ٍє (A7ac8{ iwJRWR 5x(x"Q%vK'/))*$b*))))%Q#@}&35Ru( n Rv !'2$cY [VhI\E 6S` wFsG"-0tcvW{8O[ Zv @k^@?  By m  ! %^ :%}8v (uatPJ[Z)Z}Q}OERv# uhQD`>tKJz5nCJw a Ue)&v>PU!I%#$)%j2&% ]%j$ ,o! 9# & zdDJn@ePf;RlVl=i_q3:i&v$ W]S6IKih$n  c  xZ__" $` C&5%'$Re$%$ #P3/ E K3OI%mO֟F!Z0{о־ `֬gEvjߚlm59A$d>x4JX?<{} K SY 5 r u2;w\q n#'i(^)+-/z.,-,2)%!"  +3w -P hݠے"fEi[UՅ7B5وڗY,&ޛP\ށ}ZL'"]o])w}n :4O)?.5M`ii6J'sG `D  `  <? xLwT=Q G {wJ(k7\h a |?C- _;Q0V@MR5:, B  -NTCG dN Z 9 ##dl 5O`Z)3B/Us^-E `M?naDd4`CdVdJ8$U~9[ :`a}t(^ !j ,P5|t   *S Z\"$$}%i# @^\6!  }S] k!oSCAP-5mce;1z4QAa4\pSd'7gbQi 2qM 1 Z23$!1#Ix$55$" . ;1@TJCxV:  W  D6wq(c=Ao!Yn!X2Gz _\F-hh!yEDi;i02T   (I l   UB%/h   `:%W2q)kOLhB 9n ]@},}&+$/ 0'Q} . `$Pzz1t8EK|%A3d`XO (  A  n g - J M q m ,x~=I:v=Loc6%zC6L7E UI?G7|8 e+:A3.d b  O@;"'{+ : ; @gm56 { v b  PJG"&dCX ; icpz+aqjM+vN)zXjG{<&qk hp*x"qFhybpCzL b:<7il : ~"#umz= H !H${%& '&_&Z &#&K$%#i$P#""q!"!uF\5   l[a $eH4J],l-J>qK46etB\>Jx[]@LTn)^ Y)14J^sP }1 g"58y!0;S+5"[##b"+:`  H,Zk9rfQZygqS!uV*3_%QC_[q9[v,9 =d.y n  !n<+ \If,? w) iF  om ZK e[ 1    Dm $6a[H{E5T7K3 {~nW1 NkyWu^]xmPWVCtAF2iBLM r Xf roep%, ,  l.`*4:tOJt|ZBO+iBUIJdX |sG$c#n_i:,6Xkm76dDzcl]  > I5  -*   & h    ~ O ; + . *z N z mTN1}Hzg) LAj` J% C$;'v& $i#a!z+]c9 )| Ov M G Slddk=wq")l*[8V[j9J?/|LhmJjn@P r/]N :  ,*@8tUnc  IwNZ .% u|7CDM U%_qb1<@{j!9 c=?HkR{z\-- m   { A   ' 3P"#j*%HQ%v$#W" Z[6Fz Q/x6I    =hL""-5jhE8%eC={ 7  `x > )lOGn@eJs?Ak$,jT.7w\Y`.(%P8! 6   "dX$B foH !  d! ! {}1 d 8 X)95QBVy) Z^J,Pj 2^ &^rOjv.%c^1q:-lUJh^*H=`( '+ M  q YQ  Iu  @w 6! Z%x & E+3 kW76@PSr i%B& szl=%^Z(,-fHyO A$Nb"y  @ $ j   o@A0["[  T !Uw{4eA8[obqGeU,l&$~de (jR#(6`& X$ UH{bR  mE [eBY1  / P  g  A d +Y#MX2)o~RW(4{ M<Sh>IWU/en`{i%7]tS pX#ceLnP#gmoYg+ TX [  7 g  < y 3  v   k \ [CzBq#7Jb1(U9}q8!YJ %4A7D d63LL44> `7Hd*=_ ] :  T$"(lFD !#@#"#Q!!r  qTT f zG(|zBn_9o^ۈӓC0>ԞtIo Pߔ,صpfvog) {udh@Zz:8ax)Oq[&)$  % 5 c""$&s&2*(,*,).+.+.(1-&F)#'!%" ImMF J  r$y ?S (sjHw zO*<\ A^|(" Z B    F 3- [k< qo7 NR  V Lb OL,{0Ooxm**T$mkn-yY)eGU/ZAl!VM8'05vHZ.F 6 (> <Zt!!w#$& )#2)p$(2"9)!x* ")"("' &=&r$!z ]?^\1  Q i(n531OP|r9KvVU[H4O5qۀۯ&ܬv!]B>rJ Lj2 (,*Nq%|=>EA9W.'vbPXRJ7Uy+ 0Pާfީx-Ktl9f;P a 0   mBZ|v(w !!|"i8$$ T$5 # D#"0 JOYDpu$s3p G %      \ oTP5$70fe)hL tQ&N GDL[. | ?!H_   W 6 qS+i"v q:?,\hOt.W !&35mv4Q9:PFB _xz Z kFcp !# ~#8 &#*!)!"!h$$ &$M&"@'!&(e!6'!# u 7;0UR1" Z ^t mP_]zYSR޻|_Ԫ)h=֥9tf ӕݚk v\ՙm7` S )l!MkV  H Y  a  FQ]3JZB.BD'  G  G  d tj  G !F   &  C`yl4USk7 6wmhy=VALCq# ' 7 ' :" R-.6x]   N%~ nVUV5@s(VK#Ve|l>t8t9N KZ?A We:53j&=\LGS_8 t 7 /  %, r  ]D(b<f5Sv x  2 8  q%zj*jMWz` -~CRK5yq,ZsK\Jj<HM L  w  c\  M Z     r n s g f  @ @ | >)<"cjFtMS(obcqZSd OHu5>l?W5tLs!&>YEv  4 C'^QG,siR,  G Q 0 G  j 0e"H&\l(:*).'%_$p$$$l$H#)# #F ##@#1# t#F#  mfG$9dq $Qi 65$ON(?" _߬6{ݍ/ڐ YַcԆԁ6cփ3ֽp+e&pJ d.)Dfs_k}SgY ;    -lr@7G"   F o ! \w / #!  q - -ZT@}ji ?GT1Idz>/T34>y.d_wq:&m'   ]u Y    o !?fOOQ!9~ ma` ( 9#%qXWYs +)G޴0ݰeڋuz3Z3ٝۦؚۂ/ܰq;Mc}5 Ln  h LLlH/Dub @oxwe 3*TWFl>w2.c\gx"M=z+{ L &  -  C  E  f  7  J~ ~ +zQjM IZ  *y 3!y"f%RR4%1nJjbU ~"{ y J  $Rtc[Oi'INo j  / 6 2 { Q u I /- o+:$uYYfmBjnw2z &G6*bW\^`Z ZMshSA!dF1~ g#*p4kZCK mMBE /MO}n'Nh- %TtbyT9mD 9 :m :TdWpc ~c 8 ?a# r]NA u    w { D rIS CBdi$&JBBC sF&U|"`8T    z #./Ya"phC & '7b%9/t! ]8gnTlM?ޛlO:r5(,nv&ޓUmޙ߆~ZQ6o^a/Av,F|gG< P&  q C <0["R$$f ''O")i%I*'#*'();(+9),3*,** *&*"' #$"!Y9'  S[*?)Q[>eCYj0D>8E)\zܕ0; B8uCHN5>!t ~ l   7 L,_d)%BjCUYf  dMUjIrx RQA|c`FK63vu`1%Xgh&(tcvYnts, j H  JU>#3$CE07vhs eD v~ [@  "Y  kL; _ qzWmry(sfexg,$BI@BޘqoD#w )7:=We'QfGCu#,6u\t6zb\\ #  >' ^ T   E l r  5 (  "   j~SB4p_jAk N #H D1M`J%aM{8I}y~n8d;"bJT"h?k\U6[\7Z@ztWj]_MJ=aY9x.$ 6(mYm(HMvTKcJ2" mN r .   $ DBr{*tX@V! {z!"}","oM"Ax"Q!_\  l 4 < /E9aY%CuIc@b=H $nWT:khdAa2-`p}OYp@tJ'  >d I R /  uqS9d|MY%wE!! g11< VR h7[6 $suE`0nW yw)Dp <1m9 }Fsb_    2 } 2H eLjmJ)&v,J \V R B _^ ciCA:ZaowZq&pE0ZS iU Gv"|;7#SfKnbo06aCB'8!XsU$- s  @ L L  > R ^4 g(    P nE6bu^;u Ia)K V2 u,O^ q   Yb/V, W o ^OinR5i j96W],Ud[+0RLQfwa{sU44 *bD{+Zb]wlRRnYgf`^ClA\ \ W  NZ7c)BzE -"" 0$!8%/"$!& &%$a"c6~ 6 w  h  \u+sqS] _#O[ ,.Hu%Yvt4 ?޵.AGxl,(c =z0RGw b7D%xS.cxV*M< $ ! H o [ ([RDu16>"d9#J}ID(GySVS'[L[CO,1sd_L3 G:^IB! q ub  D z ,Y a  ^ J  @A;E`Q> h&h0LkF \uF?AD:^/iT?n}f2\W /N ZT m  @ e 4a "  G? a2 O [o=U_l ^G'+~v qWKu9h%b]6 hb`YBvl5+}oqO^ZH"! l   6 S    h z > : }   E  Rr ~ yh k   q V2|m}p\D+C[l4:=-.4:eu[a#7Rp,74y'&R0,8bbA\0   "d }Tu! !="p"px"% #!\$#%$4%$w$%"$ \"&? Fn ; ] /3*XpsAp6+X5PL1"^Y3o*v1x,[Mi>Dw*0mF s@X!yWtGf g. \ /.Q!  O dB>ehS$GbEXYN'$\mX=: Mj5Ph2 j R Q  B8PU324Vf  <6H F5Qm4 /Dn-  A6>yX-Agx9@I_K߭:&`܃7@O[X4!!v] a C %6l3!!"+$m$$|y%$" [n=DFaA$7 + #w5 ' PKI)IR>G#.(\C6;L@u!}3.Rx`'< 5l,|a   R m MH"soB*r  !kA j{sunh z=>~Lg+ D7">s34f km7FP)UqhS h.FBy. Sr-nz { h  _|! ###8|"!}!9! ;{~%:Y &  Zc?Z_h*4~z M   f {= #="`ePL#A`G&3k{w~]C}4*oojT^\| I@~7%#%!8e!CcS/tP$ m b <I $!$= j'@!* *)")}'e%_"%,- x Y9D t e L7Nao&I\`g[GSCrfG2 3?zGWzts52 ( * 0 nog  hD _ /0vHB^5-FM  ! aMh8me8I}AtvkLkTzj&Ucs7 G.Rz7"JX  , = \        Gs= }  L8 m   $ m F/PDbQM .xq\DB{  e7+e<G  Qi:Ia    y )FzGGsi%/9v^Zu2 h m ]*8c o+ ODnS[bWurl@y@6OkO_vyn u  c G/\{g&x`QORAuRP rm&{~tEky,@A ce*4{q:9D U 4 d K:>|nQ  4R     5 0T]Gf-w  % a!A)bLoe{vuL2j!g,{QH{$F yD  # } 9 mYYftT>K;.  smaW9w ^iwyX)|2/4AO'AR1AFZ, $4VK"_W`[w#z9 "F C "  &;< " U"H!" k sr~E' !  E!XWSp>Zvi P9DsGSZ+lI*"IuV0!ZtyQZ.n) l,( 2 (T>06cM b (     I  G -  D B : >  9j UE J  "Mz&2.nfQC-R@i+4Og`+1P\ { #  `    el %  <   )   '7  A 5 w`Vkv+f_`n9  # 5 br | % |5 '  7Hh"B! S `.}M6D߀1ߧSUfާR|Yq_K6RQ fBoHATL*7z t  j } S , Q     O )R $: +  }  B j d~ PC T%!2   m   Q   y\!c>Fv~ixB$1,E(S?sT#u$ +r-r}scp" #x`  B T   `Q  k < CJ & YZ > _ Y  AVd45KGi"DLc3QAbyjS9jqc* "}u6c,/9     [ & Q DVO#.R  &^ +CXH4+Kfoe-Odfz?,eyC%Ohnov h E %*c,T !i VkLjq1H ' X =p !sQ~#)1Pn)a<obCimkI^IW?'"[djQHV.3t2 ( [X  S M^ mS ji P& ? +U; M> 6F=&[BWw'5WpJ'iPoR#AV?32+  o9;)^;   R 6r Q  G  b ;   )}%q!'876YU '  xg &Ah Y; _\ok;W-:bNQ,wiTA\p =0h8`l X"y~ ,\k/W+#OW 0{%5X$qBQq='_.J\1e}o aEta8'ELK W  { 'o;cHO( du n  &fa Z( U#R8,>mF{?+-y^e@]/d3&z _Tl=3 ')/u>Eh?D\V%t@5u~edVZy:LGTEmk S j  v!  "o  c]!B!" "i"i >#o "~" "!!HN 7 8ZP >2':bac7Ra6H Ls%l"~%vm/$)9Yzu-m!wTO]o+   &  & ^pv> %S%\~mu e  ' om\`-Jc@GOg~|\PW/Dx bG1;$sz2c 0 iO e*_*[  P`nVf2 !I"?"!) +i=e b  |S  2Ly6w: fMIl;#K1WP3~X,Z El9'^9Wg~o d o  aB ; =M* )\4'l\ +n:   b ' 2|H XC L Z n  n  !  L  6 r5p!9(t< De$\B_@cf/cr7q emPb l w SeyN/wHvk1 kU j  # Vd]?buHiaYx%0(5])XF Lc-BL=@TP>gwo442j{@$5#ZN?M` M   b;M l 6Uj+uA  >8 A   g [ + w0  R   hr  PW   y# Q   - ; 8 T  O7 L  Ltim2})hzsG !0r2x#}!xC6/*(M^Lv6V vK"%;A5 {-VnHwMK:]9~4e6 +n67X)NwA( z # d  d $Z b   J; v y8Z H & ^ $~   >ZzV  v @ kwL ) !QkbAzI.Cyk!vy:>j|SnIx^^3K1oJ,1 :fuBEd,9voo5i/ ?dO[M:JG;^OFf{s3E1IEU(o4/.uS;;:_._P.8e[ Stl3(S E(m@ 9>zdB(, 2extb)   g lT1/Jwp9dY+|V(Zf: ]ik07r.xd9M2~OI psw. ))Y52 P: r  'j $ ' i} us 3 ]  uxHPc53Qo,2+I! :ip#N\z=6Uo{\ktX5&" c)YI*Q4IKo:o dL4  ?hB&h ^ s y`N"#vKa ? %  *2 }gHS,SvX++KM@t<(2t6MS|iC4-PpruRf\KeG![pjC>{g:PUF c  2    xLZ5 ^l;= i5/ T 6up\k\3pmI^e1HZ[<#P9XMT"` S*uFg & d.  { z"  m w r  t * @ xI|oAh-!9  & ' % eRSYLjkA@nXrkmb;|}YX9N)wq< y M q  >&bGw~)Q pT(]\Swa@^(R:pDed,4Uoq2|Qs$$3Vm?i<b? s $b dP  V (" | 7X.)}QH  S {[ 9:<a = jBrO mCi2|`D(o)_NGs~_vO:q?] F~?v1-4  e 'PnX d  6; 7 f ! h E  ] }M }&3Sr=s.:70U<@D`j}+_zG{|e`P(_L~!M~uf2 EUlnzJ&J+J])V7PVF=SF/zYQ"SMy^#7bR$0Zg ZRxmOe#}9GRb#11Byp)*&}lEz #ZG;0/GEwG0 H< j[\NZc/4l. t+ / ,] wr> NH  Z I/ <_(9IS r ] 6  _ X  Q(4}.>#|&im72nn"6SOWLmq{=C-S &zz} |B N   G  Kv >!"!!##B ##G#D! [)X /B > u|IAXK#t"HWd5dOco{ >u52sDh J qOksx3zR)] J& ~u @ @ :O  K];IWRF$99SVCwM?&Sd0v@ewf(l6F+N%t,hBp\ U x  (   m z  8     n   @   8  e " =!L(n0yZ[z a7y 1>z|yD?\ON#LxB@)j5)f/;  v=S5Hu]Kxne$*| cQ ^ }o5 z t ^  WJD s f ) B o Ct Jkh&%D!PO~C3`1pdKI] .3R\q6C v|$*GX!.q,O   - 5  $T e> %% L    \ * ^7 (4 X J  dS9 `n?!Otx<"jZH.6V< ">%o"6L4Sios|=o3h )  z ,[ '  l>JDg$+>\s | > F01WV?Au|vEg>&hGz5?Rw7#+`Fce_zq'hy7wL W  I.0s[  " q    &] #z i [ 8 1   n Y-d .aF:D@wIN]X+lCERNvq-C[\q~N")s8xz8 j 6 v h    i c ,,c2-Vy a g  & |t Y/t6     B4  Ph 7 ^ :126ORXx_WWiL-+(X"GgQcFhS6[vgd }3 A   5 G \@ Z V L 8  ' t v2 >CMxdX< / t S  x3 >  0' /  :  s}5 "m  Hl +  * 0 <i XZww*#jb.V`B:*tQ*8d@   _) 38BCfHOV8JlB.W #  T# V 1=q`tU#fm<^cz"   .~ p z2iVR\ +->C.Z!*+.IL+$] #W7 XV kTgqODl7IFmPI{VUb( Y |+1 > 2 (6  7 y >c5Uok:fvSd   a 9 |] y{ cEJxn{m> $?!~[B>M1$z8;h~3uC\nK?j%Ps 3  ) & W } g  L;Kk J s-0e )  ?uE   & |g (+d6Inn{g x7  x\j)O88k;T_ZH=jj7$ 05~#Imk10R36/{ )j  , L F x /  )  PZ <BL\`t9tox22(c T+:>K$eYx _Z_ 01G$Sosg i  h t  J s X , *A 0 _   ' ' y { / 1 | 3!r\%y8?yIj3 @#VBf86zuB4>%by_j}\8v:b>y4bHtBm z v &  - H 7rH(rx [ . : i   1  G^R;nKN<OGWo, An9h,^iPw /$}H rmJzt  u k0xq4   _ fA ~aakk'o!c#n+%B%#D{"K{!e){eTYlx n  f lvnD| x01y`;227T I ,.9|n[8<yx~ 1p  KO  x8!W&dLlx ;O Kyj2v9S A b$'8EH=p IY&ep]DQ~0[&sd&Y3]y  ) sgQ7|a8onh 2Ju   UM_"8U #xKXD@ SL_gdI7ZyZGCv`42u paA#KY"\Ki@L + 'FEv s "  U  7=zD1k.mVWw@ < E YT7-0ti{yKv}U#s\o b1Z.L-n]n45s8N VeDPyja1@"0LQ,XzWv|PoSW Aq FFtWw*  ` U } o @  '     Q . U  hm  = B  A  1[d =hUL|SSV^+>,C53(*$jR3os g = Aq W Q{ 1??GSeM?R}".L%+ECB0%J=aLy#N:kcB-^`9d/n I5 V / Z4 _  Dq ^ X : M D I 1 ( A k  },`v<=jFCA:PB@B5kf7w?$(-JJ:7NBQ[o$Ky4I[GNMynDvd@AD^/*`$005Q FNp@q T D { df   d e!LEzhC" Z y > ;   * \ I9 x ?  5  " j'D  $H$a\unH^c(t7_q UN?o&LDlju!Y n_ A kRicemlUfZ'dXlJ | ^y 6 # eOm$ebSz pg2kKg=w7enwBjY1?_ X(q817  ~ B$=6H4&  po 82Bc(^?C B,JM l %#+cjOd QLIyxkX7EI0Rj 6<  ( hX"g&!f"L"#/B">"6"k B%A2(YK     ? }ka04eIzH\+jO+ߨ; ,J <S[V-k89GN;[$wtuaX2i^;k   V ) \z[SUg~MgfVi[ N4890V.=/vq;2Ma7+B;4y_Q XyE^E&;< EJF u i^ * p)zpLw6a  < N "F S< 3!}>C`aU?S M(/DTW MF16`$Yk*8L\|%9,u!^#WCl -m  :_ I 8#9; 9w n b 4 A ^ NO ^  = 5hzo/n#(_ J5))7)j;5/}Tbi5eBLJB{{#oY7mK /W   j xnMm> y|"Y:  V ) a' &*DO(vNW>$jB^e`7 *XOKee=l?{hSo7qNw I/    @ |    1t  f n 2 E  B   K6]<$Js%kx1lh3/!RoS"Vz]#o1:"'O,t Rwk|PXe *q    A *  yC8.~}   ? ~g~Vu&]L'a/ z^!m,A r~la{0viek/{D * =9L  'Bg:|Rv R9  S^ sR{iAh@ ?8k')v]ec6wq'@[T%F}0$x,4YQtQrR>OJK56o(v88V [C^2vx ,NK}'EyG9t6~Dn/C'SZcnLJ6yJ08ILT`I /[Rvgd\vysOFVzkQq}"!bAeB|J GR^x$& ` [P*1..4aBfc5T l )I7/h (ME%h4bZk=f& 1ir (Q~IC fP[ 17kZKl,;2)pE 4&w  g   XASWEw_WJr|^RLcD D  V dHV8O5I]`$9ptTd9JLZA^B`SS~:,H)VLlbfq.U=c| C r 3T q o wD >F ) #        /O T4 *FkIk$st f`PM|T">swyE;"( 8J.[7:aGR!XT Rl'T?;2[rGd;@]Z5pF"mt~ /`;^XU^"w>@d'mC#&L fLU8 ~Nk   Z |  AJ  DzQ<G + I H c M  89Gozdn+CPGo1 gK/v!&r4IG-v}t_3)2a]&0f=_xC$6Ma,' L)||sFJ CGj y! )_ [ B  B $   /=  m Ud b 2  ).,D^+WK# y)J-  O ~G  `[i|cp;K/5OFfe& w RYo?zfx&MK vt RiOW") I7d9Jjh > ?J!8[  L6  X ^  q +x3?nlF6Bc^op+jb/ 9$I0L a9K <  61)h/:VF^I<o 4jQHrh+'qU}w19" MV ZJiwR 6 =160eauis^f4ec9r_HRSsI>E^-B G6^HW[`=PL<U\Wr3.`[E.Oh5'Q:CS_+<w   w x L  M f ?$ [ g *Pl"; <g&Z"tf[ D6Q(ZUZe.fX9xu;-V0Zb91N|n%PCKOw>{&3kNN @  FJ} FU)om ek(z{bH[F46HOB\DdB?Gx$>Bdows*-UM    _[ o F u | P 8\  ub3bLZ2/Y F  3 QG H; x ApxD78PZ1i$8{]d:tYxjZ)V 9x`Bn[D<Gt % MP'GX*\H8X_(4h;p  .%  $d   H"f-Vw='j_1K@KQ  D5:$aE GS`*0a/ ZJ>oFUY?v$ %qn[]KuM9qrG~;H xRK  G | R @ D99B4)y5L5#x1   5 FX 5L5Md#.~M91nm$)8V:yz ):)C>D"F:w*lT$-rjX~(ExbjO4>uM 0pH Aq+o*+U7tYRj ,t SB . R . +M  g<  n t  l# _&5y8o<ohxxG"jw-Oa!j(IF(t"6 *W$o (S)Hg+'YP mdU>5\vm|m`1 U>UW?iPX"#|=Zk W E d5 @Z^kO?+tY@V0<:f'K Rzk*`y7 | (  -    ?"  +;0cRF]fV/|+^5(FNMi!I8VA9T9OzBq][>"0" Y2A<Q,4{{Yc3Fx3UhpY@d Z)0kRrP>\ p   n A o j w m b V 1 D k    B / (Ic^}U!^>KoZ"BszIUY( [f_)pj|. a:1 |nvsCOg[A!Y)y=,@b_!P P$ 2 u ' b b0      ? }   o   ? b] D   j>  = = ? Z i } u .@  c I p G |S]^zJ4b  & y O/p3p R{9%JTi $ZOGr'oGTm1^f}WX/l3[04[0N%\'(sCD(z  @  E  * Z / >  / Q  9   t  f  ' x =   N w R * D WzG\DOrhQ{}$/90{Lk&J(1c:Z  p]&9-aIR'C9@FE1i9'*{HlCty{J gCm !u^'I:2'NtdXd+ 2K -=/61=HAabUG:8H7 f  T $ T HgDX #  5]Ot? 43W m      )D^Qr'C|AU gl]y} dSiHnR0q1Wwd4JH@A.S !| Z     iM :Z 1    : d A < o %'  h A  s D"z.K~a~Bib{WvB;^DPL~  2>f)s7F |(@7f?K0[zSXd(}_zHMS SXeI9QZ\W_JijS` P:SL^i^"d^   4 | m Fp pPy~5|    p   h0m#L`!W[VP{oF[(v !0z2Ekt!H&)*:U}VF-  |H ," }   o ?  L  1:  h~_ =-tHv:NtOGWA3 jY*$>Ku3-'1SF'T8y).wTk3 Z  " 2  8 ]wlSfgAIG  %x 1 x  ! J$;- &0z}+eT7P x-% x=_7tK/5-QF@m >:BXy/eR*}7y8qL( >KVKYD"(r-z#s9yCl{ 4z1TyJL] ?rB%. O     k B < s tD u&9|)eiktEWN5 (Dg`# hV&a:xrZda sALEY1}jP2gJb&+b[8qF2*B27' $f@pri!7) gA _SZ~o.gbj    2 Z 7 ~ d p R d p  ` >  ' j = | N    { 30   C-kHt`e7!#M8N0DLQCCcSXgMLaJ}@]`6eM_LO*s&pgq#^vGnpEl+$eTH:!`3h>I  U # Wp Y w  3   2_ U.k_h/l,rTtw/O4,}1 H ~ X B .  - ~<Ff^RQ}5"z}Ws uocFQ"hp)|mt4+!&Txo*`|38X@a!y$%O] I   &-  <   P %[ N    DpgQg}p g*-l$7*b% UR!PxR>.O g_8L,@Q@G5;B5:r2Up(rF]j& SwO^J02O*>>`3 .sTXt/dh.gv"<i 4 % .  p=ZA1j,CE39KSgpo'foETLfs:zg)Er; Qh%N'L4u>jNgVW1p@QRt2N9T3t.T:]a: ' E(%4l~1>CNs1{ F#[0d4.C:\YRQ]),Aq9c8*oOYo+ ;55zh9R* D*zPYvC%$ Z c  F UW!'m 9.O6 c 9 k p 9  L.EP01: Aw:V>Yq76k}n%Q7;m8{%J] N9T37l U e # u ~ ? %    V    Y ~ .X'*1`f#kz]o/V/}:#@l#cc>&V<y#J TI]Ctbe6+3llng^Gw|M2F">&pr'i}9 ;\2>Ql!7:1Y^8L!?OMkdd7;@v/T,/NyE+9{-k)ylAJlP!yVaxBZ5%[*C ucr{`l0Rm2*|r`e'Jgp%7 N  7 t 2 B [c  26B q, P]G[_%=YyI@alF$B|\Rxh-9-& 1eBXe.^.BXJM 1pDH @D=q 6r\zqa1ji|wf  ;1}7kP0"5ikyi_.MD +<{(`d']\a"Fx:w\yJvIu9:[wx3Ir"0#<lQ <\xCLg<ur[ NrA>1N++O!]7sT~|@Q WoOsi2mV SCXJ~{D0O[MYa{@ZnqzTze(`~+H339t_t@M+) Lq%(p/_hO-L Ds9tB;;8r|%!d - 3 `  ]) { & m<  f e  4 ( # ^ q  }   O sN   |  nMN9JU_Ll3TAov ]~B.bz5&e7Fd#a\E}06/@kB b^zL+)D!0W^%F9_hyVT>Kjb~j0@D/p,'Kv{I^VUBc+MU`Xfc4"hV[;iA[8fhV/ SZK S4{d"Vfhe6K p qDJkiOl 2."+:=s[V>{g y&gpbkC0?R 1 ~ {CI)_ fGi-px2xoN F3JMH`V5 UD|Xe=IVpO.l %@z-pRM~UW/pU`$~:_>mD5#VQG;v,hYCs Zc(HsvPVJ/p[&^[Huv{'UaBc3Q! aUb*:uv5 ]'md N#'}^o(R3IUpHZ6oqYo~HRA>5r5[LtuDub$8:UJdJii%)* !YSnt1GFi(dT''~RYf1,9Y3qSJ^fo_Y~I)5Wb.l+~2k(CaIt3>Kcz ;+D^[m@?ph L/UED|FB&5tM9L>k qj&J .  2<n/Xj-(h~2pb7, 80<mk4SEj$dm#mRVE$K]EnMoTF5 -7{bN?;}2,"!'OpI'*`hlVK1=V{F*FFZonZokq,{[ni`! ` xv|MF&Kp(J%90f(kP>r] UuF_G\ *[|N9&:>cIt$u3~l-H, JQG{i^et<sdHiI!XTM-2Ou j\c-h9+Wlh0./N3IAtj|7<*ZOyDDMWhc$ sz|L[qLgQgf+81-|5wP CfL :YL"iyy#)O9YG&~Y/(<vu*[i-R.s@33=r}+ )-8J5byJg/x@(/s/X*Q_J_ 4!_E$RqwOpO*2&D+ 6y\K.l['Be7t/8MJ`qs}e_bM3rR[~3:13Ajs18 FY+-R)5,Uw~W(kF|$^}Oe DO3dMavwcxkw%nv >]SLacE%8*k|$bObR_y4$x#.v% \d<6nXe8,j36 4o `TD0/_R6u*t~bNO`A2SEx+aB=JBI 9Tcp7x{\B}bIpG-^pD){d-<O&J=;Q ,RnB"=hX#&8K{Lh;LJcn#Dwi8(UVYS4(2,4Ou6_ qsZDU2 S*6{f$-e }Fo( !%jg2>`?A,I)$$BVW)OTpmnY(`|oZ$EfPw?$ih;U\WXA`Qv9j`,`*Z,|X6Q>&ZN8(w3VF',NIYH ' Ouf=s#--q'K3&#|( Kn{@ha9@h.A7\b(kT-tp^r`P]qI_/<^jkm@;0 n$%0+3N8)  6R'e1X"B9=tt&*F"H`(F69N Wm +EXnndNbMiP\v{w lx-!C %Vtm>+Nh=9lvzx~Mz0WpR(g*I|\KK#cRxYgqWqm/sHFWW6(O#I/lS8)uAdi CS^.VQvXcmGa@?@zzJRjZWD@puo{4 8^c XXQm(+?3N'J3085`o;3$6p03DZ|y :OuiF "$wXhdWE<<nR0q~k|n;;e&z2YJ$Ycr:WP:S'' T vB9mEPf:g8#8,?C#t'u_J9:s/lwBg`k$ca[ZPx@MW=Bzu_r[CPb~~m3X_4F &:[5r2f f9]g3aH< 9OllZM |$hbTw l*\BD)p<": :V;4;oXJtwvR.6mr.@3rSVd2 kWV sQ81';: $#r{#2 LO& >%, E5U;CZeVjKR0, xzk:d~yceq}ms c>D:yaKonW F$'|xp;|mCr_Wq7#c  y!n2 i!E?M\Kor|(Q;<k7<8Vy[XlC`g{2n0="8Pm"4.% DTKJN@z%>=MJcv[FT~R`S[pwsputUzWlx$}n{ D"bmPqU?(=(W-ltwkHok2(|gqjw+wSPUyyG>D?( O-*q;n WOw7mVC c; wP-[$s(ADy?gp?x/D/'U[ Yhy7^VjCf{^BdAUnezgw*%Bi[yP@ZTCt ^Qr:SNDV1o,v"Ps;n3F.$d :s8 .EC7d;>ln34ab+qNqTuOqh U#`h7*.]}t P36MmrwmMW_Q.jI QvfT|-!9XcPQ?86*RunM-9BvsX:NP7fz \Ceae EyDnAT=('}fHtDW.U;;=w!F>XHGem%Epu{<|9D@AS0W/k4 !HEQ[W]&,%.^ho~Qk_<tIR!6LN&;< E71wwhZU7 `7(|/S'<EAJ&[ IRNB,|D2<0#%3DR5}<~Bjm\??WzlL$,1F++-V4af[r"';"XGvl0%3K h-})f2-2Zim/e4DQKdRF8 >MC/H!N&>M _zlej*O T$mY6u*B:OlPMI. s($?"0984 N#vcjY=5p ]%O -GpH,9 6.wWgq@2k=(gfCkpQDQ$dPptT"3r`Bv}^rJK#% ,3Z/1@DBPme*'"/I#XFHFUdrIok+RXG8-(!  6c# ?FVncm1S`.Ahq%x*)ldvSNU4WWH>HN2lT<'L"/wS<+xRq)qj]TMZ "_`[]tYczaFfLiMeW,Gu/6M z>CD,k9qWUt_ 8Dmc(H|}{Rz-*~ozV=}xiq^^aAVB'v! .AH0WPL\@o/ - ?a||9-Du }fZ R2%L}xjQ PZN]dn]PMP)a(WqwvK )IBz3  %_4'<:- tgN*'(SIM 2"/0% -.G(TGzeTor{~;v^fX[`p!^M:\  fO?BAoNQO*" nQ  !o#S*&5\WqJqnSy| U /l$LdSI4 2[nfbqK7t{]GNE@cw<\B%%4ULFB -3LZD24)PsrQ4.9R)!y[B6T`3kB=}+:SaD[Nk{iRBGRTQ8%0u&M+900>bwO,9BFvVMLj0)sKgt^/(1 7_%Fl 5iR|$j  $e p"`1h._$E~AQo^2Q!Z$rlYK,#cv5n: v!_X=-Rv906\0|'oh_r7w<KY1p;YS Mmkwb/OC(OYOXk|4sUDlZj4}#7<[85 kRt$X/%3k .Th4XWr'i,7Nie9xJhX}{zvfZKH_Bg;ohp}rxd-{ob|H+aO]kI2,:>d7Urh4?Xhfml"3 rr595Wm+b6D@9AQPamXjWJMR,xjFdes| #^5,P@$EDmb|syxtq~eV1 C"#HFL|HHTZ#f "91MvQh}ubM1   &sZn1&,&3(Z P9!8%gU!JR3'5cGHo;(#;KV*shjs(Or*.86#Y|rPx[Xq]mbVhJ^`VwouvfWX[tqi?ITiy[Y{GGtAWNXWb|. Q.fM )]zq]m+\G|)  ym}nceME%` I1)eYH 99 )GMn"4/U5o&-?v w0Mt\2kn=(>1HY65, 'ETkfM.eC?`c%?6NYum/Gk KrphAN[z[`wAr^YyJ0% XAogWmyxWm$6^<-,Dazw0nWy +$]Wtg)G[E86_r0 2` i|.& t>D^JC>0 f'otSz7|m[nJ}yqGY.8.->E=JUNUes&9GObaKd~v"-BVW g6yohem\-s<KS6v@o~h_cSJ8S|vm{ueOF4)4 J}&@CAQJiZ_h^1G]|*L{tyq mKDMWT E. se?~A:~: sZJ*UpBc3cF%(^fP-e9Bm#,B7 3QNat5=^ F 4KY_dhVv j*;rBWB#mq;hld [VMKNwOuZn{xfjw!_H_g_oYcX|ZZI=Zon kFAR^x"- B(s;Qg~#Lc0iNIFTw  "9;?OakedskQX3(8GE@?;zDS_9f[UK7${n?j\8<s$faMC7#'&-,')2:#>;Io{kglvyntCn,Yc t'7F]el?a.& &,O`QRifWP<  rx}|pl}{oxpda_VLS8eFmXrK xw`QA8iaV1[A:cK0$(} ecXMMJSdgi#w2@^/T%yAdt0A]zQpz%*2+$ ys]:  Lt 7I!P(Y4aGv)qZ='g]G*kJyGeYfrq2hYVVyP_P[\I{+&DVmCK-0!7*2<6F6@B2f=vjz (Db@i+Y[- Z#5ta]vAsnpzr^`Z,t`XRPJc5S+>,#"$#6>9b:GPS}\cm +:C>::2$#)cekd_cq/>a  6d),*@`m!-@GH5;Ueu}Gw ~V qK*v N ;|fFA ()7{7u-`, >B?>Bi(Ej /O".KUbp*Y~Bbr/IUgyg`T;D>AMN/|qd9$"P($5BCCQ\k\]`\`iTvQyS}C+wv wx  {j"j#a%M>72.( ytdF##1E]q#C_ux$yHms4?NX(iIyTvGjAkZzmo]<3+{rkndIp@u9S3152& $,,!8IO\bZ\ca1cP_cTqRD.%xwyU0$ pG dR V)\AY_MEGC56Rc^k0G]#?RPL_ojkchq{p]J-zvq`XHj?|5}.*% #$-;* lP>2cSX_XA5CLECS_VP]+^6W;[SWoKr>i(u%6;=AAX.u6~9ESO=&"Eb%t*y3|799w3e2RFJ^MnBw+vvt_H>A6 ">^ov}}oam{}x|u}[vA}Dcrg^QKGA6$*8@7<Y)hia Q$NJ4 }eKm=X:N2H!:.1 8>?7 8IS-XUhnxw~ 4I^nnly7mjM"<)25/F(V]TPbx}t`I}=u2wr_?+"z\ ,t`YK@GNWi6}Pi'Vs~1_';GE,<D3M0F(AAF<xmfB\]N60r/_(Q 4"%o\WRWhsx3AQm.NZk?V[}tsu|~ $/00*  zodRR4=&%//&}ndQ/ g\fh"Z:TPV\We[pgt{+50$ #% , C D I`le^]XSU)K41BXn"=MNH>2-0)xeVWT9*&;>- tf\NDGM?&2(ADYdffq~w{sm]QXTM.N5=A)O.W:Z@cBuB|CzFGEEE=8:73.190xmamVgRaOKG'<-"3APm\a_Pi>BPV Y&^<oVn)Ig}$3, |_[M, |qhHoW@/2*%&"5;G\mxws-<DUq->Pq-II5-&iN<$^D;%zaXQHFGCEOX{ft{tseXcx u5n[kul~r| ")->7H:`8*tux_>) ]F>*lH4&pZD411#10/F*W-h+D@BNBSBXD`JkLvHuImK_FBB"DG B3$\E/ mjlaUTX`fc[Zdt !'-"O$p&)4;9428B-E7B<<B4J3T;_?b?[?X?ZEYR\hg}mm}rvul\Z1IE>)x\?' |}uv 3{LhwcZQIQ\_fnz)B Q"]5j?yEGIUo %3RmzlbL+dL0 sZL+zd~N:#(9=AP_t $8;8>KY^bnqijookgik`NEEA93"#7MX.]7bPdoiyszwvp[C9861! }wk^US[g|uor/G^ww]@|0a2M0:(-#) {ip_]XUPM?H*OW[a gkry{|ylhjjnu{3GYp +*6ANao|qZ}Cn*g]PA+ [;+  !);Um#9P]l| ! }tgZQRSI6q"_MDCB BEGGFGE?{;\<@?%A?;9:;=>>@<26IXfux%El #"0UDNTav $,036:AC;0($  we\[_b}akXTK99!'  pZF<8794+&&*16778=Karurw()1A3H5J6U2i&wzvmbVMF<.&('(&(./*$ !$,7>DC9228BMUWUSNECKQRK?ALKGF9)" }xXk2d^XQMPSVVK>:9;BCCJUg|$,:S7lRk1HQZn  &3;;62/*"xQ 4*'%! keWA5&"4AR\gz(07D_}xoha`]X\_]VSRG70*$#qa[WQ$R+U/O(GC >979:75:=71.+0553).<LZjvs otw|&.|5y@Oantx~wqkycs\qKj6]&RIA>82.,,)(078=DEDBCB;8?FB/   !18>FILPV\ZVTPU^\VUPNMIFA8.x$xy -=N^hlnnifffa[\^[XXYV.H@8H5K6Q1Z,](X#OD@A ?:3)(*$! #" od[TKCDIOVao,7JZ^%`8iGqPtSuQnNfRf`fqewq{~}whYNIE;3,  ysl` U#H#;(41&4 5878><:>A>512.&# !4FRTYcmy 3CKMNUg|yrndXRKCmDcC^;W0N$B;@FIR\]XW\]]VA) ~ppztuwlwcshmqjxk}t}y~upprtsnigfk~oxmukukrhldm_rUwKIKLR]fjr(/.-3AQai`Zalpsxwk ` ^5]I^\`qZRKC?@;0$$-20(!z(o`UKA>>4&x!l#g ^K8/058%7#76207IX\ak u  !* .-",&20@<PBZE]E^@a5^-_3f9g2b+Z%MHKKI G!>2(   #(-9CBBKR\ij`YW\_XOH;+   &%#&-8BHNSTW\bdb^YWXWUQHB#E2G@FHAP7b3v9=AKMFABFD6' {tpg\VRMB4! #&.7875*$'&  #'$),3@B>:307;?C>87=FJJC;;>?@7) $+21**,,0110&   ~mb cksv$v#t&s*q*m+j)k,m7j=i@rH}NP[kv}ytk kqt|$,253-+.05@DCEJNPJ@s:h5c2X0F/8+({yupnh`]^_`aciotyz| '169#A&L)Y,h-q-q+y++*-8EOYadfghj~ozsrxiwerfskwmxjsec[PTCS6S"LDCFHGHG=/u%sz}y}}~%</TB`N_W\c\pa}gkkgdgnu~pbzZpUgR`M[IWDQ:O-Q$K=3.--+'#o[RQPKB82133,# &6BISany(4:CIHH%M8RGTOQOHSAY=[9[4\.W&NE9/,'  *0 9@?;(92=@ELFR?W:Y5W.W+X,U0Q1L+H&J&O,N3L6K6J5F2@.<*;):*7'3 /-+(!#1?IMNSZ\]`_YNGB~=|5w*neYRU\gx&.8AGHGFEC@:.!   ( 16#;1C?RLfXv^|_}`~a_ad}ct]iUTP9M$HC?;61/.)  6ABBCIVhrrt|vmjki^QIFFINK=+uaYWVUL>756;; 9; ?%B)K5WJ^bcsjyvz~zsrp#j'_(S0J>HILONMJKAL:N8R8V:Q9C31%!~~ *3> N]hqz$|#z}y i^YVPG9(!)16;CFA: :.@@ESCa>f:j5p.s*w)~$ ~xogc`YNB<82-,*# s_K@?@@EMT\ek v")5Kap} !+5>EGHmM_PVPQQLRFT=Z5\/\*\#ZWVUSSSRPNNO QTUUUY`fimo q w||}~vlc\QD=:85139@GNMIJLNSWTPKE>850*(+-. , ) % #"     ! $&.8<=@!C-E4G8I;I=H=G<H:G4F,E$A<96421+#  #+5=CH LMMMN#K)F,@-;-5+-($&&%# !"! !#! #.30 ,)&     #$&)+* ()-5@INQXcoutlaWRRQJ=/# ~rica^YUVWXWWZ`dhox .98315;>>7+"!$%   !).4=DFJR X\ ^`aa`^^^]]_ ^ XOH?5/,&  !& ') 3,B3L4O5Q:T?VD[JbPfQbOZPRSMVO[RaOcF`:\,\$^#\!VOI@4)#    $  ,/,*.6<CGGDGLLC&62)="D#M%X$afkrz|yupjbYRMJGE?3$   !"*.+&$(+.02348: ; 9 6 336;)>4?=:F4P/V*X$WVUVXXUOH C A @?@ @ @@ENX$\(\(])a+f.h1g.b%[SMI C < 8 5 3 3 42, %"""         !       )49;=AHOPMJF@;;80)%  "&().7@GNTWY`jswwvutstvvurmhfgd`\WNC8. {vmb[UOLOTVVVYam{ $-9ENS X^ehe` ]]ZUR M E = ; 8/"     $(-//,*)(%     '3>CGNTWZ][X[^_^aeefilmllkiilprrsy }vmgebZRKC:2*   !&(.,1,1-2032323406/7.9+<#<:83+ #   %()(("'&(+*3-:2?6?7>6?5@7A:C<B;=794:4>4C5G6H4C1?/=/:-6+1+++!*' #  "&+/1379::;=>>=;=BEEEEDBBCCA?><;<>AEIMKGD A=84100&2)4'5)6-74;:??ABBEBJAPAXE^I`J]FXAT:L0C(=#7-     "&'(+17>DHKPTUTW\ agkmlkhecc`\YTNJHC<4,%  '079< AEG"J(L/K8KBOLRSQXO^LcEf?g@kBpCrBp=m3j*h'g&d!_Y TSSRQOMKIFA:2'     )/10/../1 5 : ? E HIIHHGGILKE;2--/ 11'/4+<(B%F"JLJHHHGFCA>:64 5 4 1 . * # "%%###$% & $  ( *'"  !!  (4 50.0332.*' %&,0-*-4;@FLOPONLE>:83+" ~~ #),*'&%$$&(-5=FS`gjnrvz | { x skda\TH;-    $%&% $"!  !'/:EKPYac!c#c `\ZSJ C>3% {{}~ ").!/)0.041<3F5Q4X2[1]0^2_7`=`A]DWGOHIIFKENBN=M:M6M2L.N+O(L$G!C?6 -&  $)/5;=;98631259<<952.)$ !$&)-/139@FHE=0$  !% +26=J [)l2x:?BCDCBB?:74.'  ~|ywusokjg`XPGB@;3+(()))&" !###"  #(**)))) &  ',..!0%4(8*9*:,<2@9G>K@PAQBM@E=<44(0 .(#     '-4: ;;@EJL"O(P/N/K+K,M1L5L8I9B4?2A3C8D>@?79-1(.&/&3"56763155/ --. 0/ ./+" }zwsolkmx)26;CJRVX\^_`a_ZUUYYVQICBCB=7214630,+.46433578::;>BCEHGDGOUVVX]cilkjjigghjljfeefc`adeaWMFA=:73//2443377321)#%()'%)022210 3 8 :987 6 8 = @ <3-+*)% "'))(&"   !%#   " %!!!$&%     &,145660,+&"%''(*-14:@DHKLPSPPTTOPOHB>5.--)&*01/18=@EIKNPRSQPOLIHD@?<730|/{/}.13.)*)$!"!    !(-321451///-+'! ! "##%%$%#   "#&)&"   #)+'$(+/55,&')+(#&,++/5<?BIJEGLMH?>A<5234137418>?BA97;:3.,*,--/1000.034671(#&,0111358>FLQUUUWUVYWTQLLLFA:7AHA@IKMUY[bhdbjpmijieaZUTUVVRM N P QTPG@:78."        ). *$.52396125 7#;&B%H,L9M<N<V>Z>S@QF[M_R[TWVUTRJLCBA:A3B.8%$ ! '/23258999@D:8A=00557;;1)+130,( $     % "!")!$        ! #$'((*,)*--'"#$ #$&&"##  !),*.9;66;@B?>CC<:=6.-+*,-.33,(,.-+("   (-)%*6=>?> =><544,$ #&(+ (&+02 1/!1#22773)72<2>/=.:(=(D.B,?,@+>;;:#8%5'4#;"C%J*R5V;V;W?X@^DkLtQs\ufvawfzz|pqwoke|ctfm^iFc7b9^5P&GFA;.  *//4AKOU_fed o!vuy {vu{ "!y&|.577:BCBEGD>5,(('"{y|wrmgaZ[[RNK=86%  ~uuob[Y]^Z[`aiu| !#(#2.8290;1@:B??AAIENFJJMNQOPNSLZHVHLILGLBA?=:D4>,2+/11759;5=1=6<@:F9G<F=B>>?<9<0?+=(3&)"!!$      %*179B>DBFENJQT[`fk`qbjig`rbulqknid_^PdQ_MR@H@?<6-.%(!)!%"      , 1167FEIQIK[GgOfZe^dYfVlWpYo[jZgSlNmIhFeIeKaKWGH;C4A+2" ~y{v{s{zy} ".?O3VBcC}Qjrxyl\TRMDw.kbR8"mbeb\vWtJv<8648?=9;}9v6r2l,g-^.T!SN?5.#|{yrssmfehntspqtz  '-335!8$:&E(O*J-F4H8K:T@ZFYI\OcZe`e]h_jgefbahdgf]f]daaY_NYLOJQDY?]>Z=L9=0B&I"A;=;6 1+.5% |fUH9.#yr nga[WZ]^adh mq"u*z;GHSfmnx~ #*4(C5M@SI^Vcfegsb{hunplqhsgsflagWjRnSiM_C^?a>^9S0L$NPB0+(  !#',28==>IPLHJKGDA>;6/,& ynmldcdcda_cgkw $&+28;ALRQWdhhjlmnnlh`[ XTJ@AC=94+)%   %%#! # ..*3%C)M,P5XBdMgRdTfSjRnSpYp`qZlOaHYCT?P=O7I0>-;-=08*1 /. * xvyyvtx (-5B*K6R<WB\JaOcQiNwN|Wyaimjcfmlmsv|voole\TpMa=X'E+ te|ZpOlJcAS1I)A$:5,&# (6<?I U]f#q0z8@JYmz"2E]ny"-:@K`ks"%'&!  p_]ZE.$ q`K7${qc[SID<488~1..2=FKLJUhrw{~ !-7=HUUZn{}{zvg\QC7)|urpnolgfhkonknv -B/VCnOXl{zz~}w~ku_]WHH?4-" vaO6m b^[K4(!!*/;Sh}(5Las ,=M_ oz+;LRXds{vspj_VM>-}#n `ZQIC1! yplj`UROHEGE>;95;?BNVZgt %.8>AFFL[_^c_USUXY[^_bks}"zvx umhf^ULHF>5/**)"!#xpppkkiimoorqqtu$*068 AJJJ%M#K&J.I5L7Q1O/J3G7G8M<SG[Xk`u^vb{lx}|wmwbq`aXKID?B;59*0'$$ trbHyA I Uan#z,{292*" ~&'2/93<7ACSSkZxds weM7r"\NB+zhM>}=y6t'j `YQ H A<7.-588<CQ"e4qK{\bm/ >EL&[4kCrJsR}\dp|||ykj]YPE@*)xaLp3bQ@1((! "$-<M&b3rC}^o{7 G%Z;rJ^| % .%.)...4/-12, zjYJ7,cqG]*K8 * #'2EQ&Y7b=hGu_z .)F7WDdPz_p}yi]VO~LwHl8b*W$JC> 80(" ~oi`PwCs?t?q7m/f0e-k,n6n;t;|=:9ALZ`]_gjlx###)3;<;BMVb-o@yPZ^gqw}~|rtkjd^RSDO@E=761/%$   #%$ %''"$ }~pubx]w[kRaNcObL`IdIjGmGtJyUzd}nosy)@)P=dPf}$(7BFHB<9.&#|l_UD@#"veR|Bv7l(_SN POLH@:>BFNXch ipy%z,8EQeuy-<+SDhMrVwppZVMt8`+K : .$} ,0#6(C+Q6\IeWr[XZequtpkbY[Z~QyMuIqBo=o9i0[(O G=8 1#    ysv~{!(,4@N&]1o?Qg{nymu_gER2?+ m\uUvJq@a:Z2\(T"ID>; BD<7:88 B H HJQ#Y)c5jCsRh%&4;FKUT]Wbbhqrsyvwruz|yt~pyptnofh^dbag^d_bechdfebhcmhqkqqt|~yng^PG~<k3h+gUJK?/*!wph_[VKzEvEt?q8f7\6X0Q.P/W,X,R.O0Q6T=W@_GmPxXam )0&33?FOYbjwymnW`?N(9-$$ )/8&?*G/T1]3`5Z6V:X:`9i<n@lBm@o=i@d<d(ZN$OI7-&vd~`tXlK]CK@E=G7@03-0.+/"//0+$) 4&>*K3VD]Um`i8.JC[Ysq)9BE!L&V,^3b7a8\:V2O&A4 /& ivMQ./ieON5;# 0N`.iPdk~:T1fNm$)*,& eWGx-^E+hRG?z+cWE3(!$!&4$@,E2NB`[pm!B5cYzs)269653+& th]Iv7d'TE5,|yyzysmrhlibgcj_jYp^z\yVwZu[zYZYYZ`n| !&'$" *434 469!>!C(E5JEORZ`gniojwx  w_E-hM4 {eVIp>c7[/U'P'J.K2P1T6ZA^J]N^Teakdocxh~k|qy{~%,6182<7@>GFMFIJLHO:G/B'?%>!8*$"!  $.'79D=MBVTjev y`J1w^J4qV?(~p`K@6)#  #2@Ph!n2xPf4KT+\ElTxbstzcnU_AH+/' "-5?@EIPSXWYZRXRYRZNWKTEK<;-))EX!b4uHJUjsmW?w#] H(kW^7?]iQ!)yx  S>-9 XD32}Y-sdfrH ;!BE?z"4v~.&CNP8!'1Npso8 K o * l   u s > e - j } ] y   YK  j a^,_XDi ssGdef [fM[[]B '^Nm 8B @=, ;  p`47TFZO 9r8U/@Sf m~ s7pF=pgyNGPo9]N S$e!c d  F p & ;  % I>RJXZ "RT\MSFo$D I|[ (#I }  Ds1PxK ^Z)saYc'Wf  ! i  = ^ A u i 0 kE!ZS3'l'>gKCA7E%xQ;ra2zX-5 9DtQ1OHL  1  b =g(Wr_+(RzE^52i ]0fJ)|rn%m\_SI6P.;EV!rKRQ 5&A t0<8,?C{  7c'<Nf$,oj>"gy5o2bb~j@l,I?CUFMg+Nhg^BuE^"l!Dip:5qgv%"`}Q, cgq{N#>!_0u$[|Woa]CIKZt 9  j   dU,3kkf & 2  % V  V>Z rCH nPpKuxQxMSt2,GxWsaC83"tdp~$l:qkZ5b 0;xcGFZg1{ R7b     $O?({J|d~uE// ? O ~ n mt`V=(e5>a]A |,3 g`m(:5BOpP" N3zfpqi_Y y,g$\zM?XCzj {LnG&)N[sM]W}~ H` }ldHM?wD)#)7}dTqOz: []W0"/:"HS?"Gg)qsCqxnq{3),6r]q]bj(9BR f >-PcP y!nuTx&$,j)P]aAVPN|oPT[4Ct4`  n H =#6gXndT* u  Y 1 _F92l =Qy$kF/zc~!e;92_q&XPfq-~9bohTU Zx+'{ 20!c ]O#&\ f8:9 }V C^ D rizq   o -/6 k9-}UERzw9 s ݞL*)ݮޗZQޘK{j~7` H5FqM?@7B?|\b[ <C<F-/k+ !~P##+!r$"%5" %"%|"C$!# ";"<n!  ,[s|T Gp  M 7ii7|Y.NhD#J H6{IWqBm4 <=TRP_r8N*p>&K ( ( u c 7 u  R  g u t M T   td JBg !XJ =G5INc;1(qg%0C)!ghh(=TN0ePK\ wt ` =f ! # C B z$  3Y.Zh oaF|G;~`]f"!@t:Pj]\(S h>xp}oDsh>f__ J0i8n] :dW+E  g N - mvh#cwhkm P o W ix Y vpKWnno\|p > Yn-1Tn.i=k0hns#CqUl]y-ad J  ( gdE:<c+h&6e@p^ ; 4 T 7 A[ >}F >M!p vVS_6oy*&[dILS^HO.O ,  A  l p Gl|,e~71Tn]kg2 JZ  < z > hI ?0m=F7Yy(PtbDN` HsOTLXz*I~B Q# ~L T  y 2 ;]G u y: Qi2gB7Pt?@"&03_SonDtF_Cjnl.Gz?yDd:u%.-]K~   AB  M < )"   W!hFzCS9-6[>? d wb P, i /  %Xr= GB (*L6}\'6Kti;2('CWSA7!,=^h<y]03 YMEv J = i |^>L *9)FS4!a~OC2  >yFJhoh^LwUkOSsah*2,>;gel?C#4@)J 1  mvy(mF;w2 1>_0!kH. @ 8& ~`2auJUK1@._{q  UAv"H`(w [.uY02YE+}$[  N} B-zug]0H y}  Y  fb7 `{? O^ rlOcSJk MNC(Fw6RY^)sUzE"hnEvPW**  v  4H1>F 7#" 14.oC  x 29Z~/?3i1r/qOr1##ZN1\*c+p{V,2,T5 <6<%sP m  + 1 2 gF[&4/  `!  +  VI.Fj Ejq45t}RTOjY U3V#P>V9(##8nNg~X0BrhBqF*'h.!V)V]oYr)Z.gnj!>SVbkc<,gk^bz2tyD;Fpm,T8@~n ydSoe}=1 U*1I2I _ p B:  ] u o /    _ 9  sa\9G^i . 5M6I~yb ny ?K:4n@  % * p+h@Gp^T.y&)2_ElMr w l T & B<G?O($;2 w3 s U*]&.rv~+~} %}$l/?   tC##$$%*%&X%+(h%;(!%( &>)4'B('\''4%&\"$ !95xL u c Z;H* 9VJW-_@ 5]KL@c3 K2 .*)vTR|!1!MM.4 r 7 pY@>U`gz@ hevi"6Gv  p K|S\5*6|*Zog.BYL5bO" `:q 2R a%) ol $ z s X1ukV&h 4 L  A p s q b   $X d iU_{?d\#/V0 KywIF [en!/#po?;m72q{ T   e 9'=`IjQ\,R&ET ?5     ^4 , }   ZQ YK{m-uP-bUrZ-J]vTTYm@,`U2th `> KU91' F$}a'3M1 eH~dx  J 3zkE`/KR! B  F "  g JGKEQi GP7V@NMU kAH?Ld!nuT7YTX FS 3 { ~ 3{ ""y"" ~!veQl~ qk,3Q@rf^0H|[  J G g r1:=-kdUQNC&"}Lc%|>/B4R19 uW@Ba*  ;P l L x^J xIZ=$")wt [ 7  b DS 6 Ra 9   J  ed - a= r klSi|`7<`FqMBܐ"o'.9Jfi;neM Jn  >8f\k1~L { 8$i"m%"$S"#A!'#"="!0Zu>a t (  *v@^.|c2(vv1XZnY8F/VF*5*4D:rEwUY]:q_&g8As 6 h nD JJ#7$~&\!("e*"+#+$)w#r(?!&!;#lE (0 7W)Bwb>"[v_7,PQ$f"_U093kA8;?mMC h u  K q .\y"J-_4V}d  6u[P@* ixdn\q2]|h}}TmsCDVb H ~ S"b"2*4"G  t 3 ] x t\ r R8   =Sw*5 =-S F/2v~3O01vW1P~)_@o3q.,4 E;C, T # ^ (  V  u   \<98T8  8 n D KOf  3 JtQr?<jw6vg8|<<~:#SV& BZwx/K%0{s $ -xaK];NF S !6 8 zKD-A% EC%y$c ** L N<{<ZlqumNG#iI;]u8b?/Ly߁b@h2Kl-<0x-Y6=:r 5 # @ h>%Z"!9%$}'a&*t(,4)U-)i,*+)***(*g&/+$%+@$*#''o!b#^$!gY PG51t,'] L,G/܂ڿܺگ܆ڍ rW+Afc*cMokc~y #  n f.q^hw3ZP22/3ce--l m xk?zu83VS*;?og%*6:٩xF.ܘڣݠcݯڦYݠ91! ]tU7k<`;R$&8Et}O8}9\F[=CI9x = V4 . ANZ@@e m z|A x  x R v O s E ^ e#-u{n"JbQqJf}S>;HG=0q:@Fj4_Jkh T_5@j>Yb ]J+^l 6 V PYI   LF g r$FobsH7Q:E44((edxBl0E"$~|h rK<hyh9iI0wO 8# Y   Jpay53^.m?4f ^ { > 7- Q@  j 2 6 5HVlU tr|TPj/$/p$Y-R?R [ " %!<&#L%@$#~$ 1$l"! &-fq]r   bj.]WW8x(/o*}@1WA6Gj6A g6RI  Q"!#"%"%%(F(_*(+'+(*F(?*&(G%[&R"j$ #e!g+^z i 8 f O4)Z:Z wVX6aGvQuYkA T"9 OH?\1if& bNJ k !JCp^YZBXnT5h   G eWQ$D(e3*:gE$w,xL^H:WaNr`9P4#6I'qKGiFG; g  , `!$ ]'$&(%6(%'#%"%"[%O!p% $v#dy#D" %1Y\c 's ~t@*f^/q-%&lD\_b=wԧNο=?ы֢Y_[كS'F`,)y0\,f 3 C b V|oY!" 0$ #)"%""-""!C#!" }!Q N<Lk m y s"U4ag,3,5#)FcY fbdSu >bFyui"Ba _ 8MuS l(o m\ -&~z]i8\ARo V]fU Y;;#.j߱i|MN:1_90 gTr36 jbhPKe "!%"(&+*-*@.L(Z.V&-6&c,'+,))''%$ #)# r ]( Z jb 6*w.p?02S Wl#gW}oNJKqee!PVH2NiP$q%i667{J%[ { qD % . ( 7C[h;x ? W o    B[  X"qZ==Toxx_nC)m^5Hx^i1}DrC \mxEVo  R   2 ` % s  K 5  o Y  7  m G`.lL/>co=,Jt|Am3PYA`K& T ?q\71-l Z    c j , ^ M XTv{uN{^ '*<[i| z 8 N# q <* 27\g =tR[A> mDz"AY*Omp)Kum+^ K  v ( /<LTV] f:fUUdNDS U iHw$l=TBYet yKQo^tTS\7@8,H4;,1 ;  u[1 `$'#Q+&.(C1)q1(1)1)1 +1+0).'p*j$'"#V D:# 2K >Z"yd)@p% o;$c`m+q\gn:3XN r>f$zA J Ws@qC `S(a(ML2]0* V   ne= }\yE[(,}q>Pghd+#dC u2|DG*M*_F]] 5 { $ Qy- a .; Zn).[e.0:(zv3 s L mzj70pj1;\[Du(ޏr XW+Xj?k}DB    1   ece 37V\@.<}s8`>YO|pt Y5~_)V1:B)jh!BM/YGF &ks?   n e S>  m  .  V T$h[AwzX/>e$G4L~ 0wMvVA R"^*mn|t)L^g~yC?]| x  q% T3o0jR c|ߍ=rmBB.re"ca>oZY- F3J3n$s %t#n$ % %% K'"'# )x%|* '(~&&%D&$%"!3G ak$  u @@ ;})CBi z_yޢUڍ^beACՍgלIq;ӭ՘LԠ|jוMָܮD5qMh7~PPI8 gaM a y |8 ! :#b"$"%"}%!%!)$!f e A& m= E = =xE\r}\Opr;a:Dx%n9eT#mNpfW fFo5(@$   y 5? h)*m  , N F4mubr]$?{x'Hhh"W?i&jal{@\,|" V6AI{|; &) 9 I z`    N ) 8 ocR#ZbP N  0y R } ] b  Y[  v S  _ $ d] /$}MCL_73.QA\w-1(Zl}d=3-}EfkM&'""-NdBlP48W%lu{6IW%Y + S* V P ; ZCqS ?#$K n' r q ` / O- g+)R4YP\sVI;cSJ9R U:!D?#+GT~"&#m399 % 7 l 9{FOTe.R< c}]gyCu  V 51iMs;y{:@TDڪ(BI׏վV֋؋RCXܧArwK}0| x\  o b<<yB !"q"\5"4 Yx  :!{ BX,r,j Z 6 DMx A"h@\^Nt+61)QN1 gP7 4, N#c!^&#c)$f+'4-2(-'2-Q(&-(,(+-(*&\(w$$ !K+\0K O ]j3Cc?%!0^@+۔ݍ3D3~;Aל[!FӞGԟO %0٣xVtޚ{#CX&w6/- e8IH=<!!c#%8%(')( +*- ,,,_,=,+c+))m(\&&# &a" &2"#@!$2ll0w,  j :$jw *+ޛ܍Sܢ7gG)Wq1~;ypf7 " $ :  E  j U  H   Ex#w!3^Ga >NEY?y"d66HEM(wFY6+$nhmzhAOr56{5>d?tim  }  _W wwYWu++; 9z   #(e  [- " (   f$?83'"u\`O:B.A9!g)O<]U 5L4zN8f?$~x6SjIl&craMFv3>o gs  2 > epGY.5Y v <  5 f  ;  4 d  c3d  R   M \ j<%rx)n7; bb'LAm0k x 2 2T , j! 2% ([ ( '{ 'X % "&"@"!*S/xbz R   G-]+NfG/4J߬ݓ^f@0&N=]Kl*b,`@y%  B jgu! "#$?'%(c&((p(x)'7(('('$(&H%#!+U< ~6/k!ܾrGF OBا߱@ޙJE!Tzdz;t 7f  *?~C^e0-3-[ b wj &dB Y0O}'s8@.>@y YGvz!|sj;(.gNU)\aA#J#k  V%*S>!k#\%N"r%\$%$&$x(V$(%' &%%$/%##"O!"6!;nJL4 : 9 /D7KTF)R$!"~1X[sPidF>K #|0x1k}) ~, < ( X1q'&q76KqQ\M)b<#SvzO"_H;w|#=),y' @m$ f7*%!y#X ' $E+&t-*//*0I000.0S+0*0(4/&+&'$$R!H - Q !7)k^e -7VOF-,g}I7GL<*s{GY_+ X ~MMsBl T yFi/xI5 vHnAa`]MkmKS I j0yW4RNYz`VWD  8'+> { 3<*<Ceh  h7K{5Zj5)?/;k,2`Knb4. 9z+uf~BW -io:/Ep n  Z ' ^ u k : /  rlS~l    v t d& uyL3x"] OH?*W2-:\:T VHp #)a~emc q ;MqP 1 @C&2 " "!f"L!$G!Y%} %R$v#zp!wDMy_X 9 2&cw/i`4ddGz=ku XUj ܞۧ 2_0ݹZ|sA`:\or:Yl u _%T5P[J!!2"#\!#"#"H#"T"Z!!I !) f5JF1  k)tB:9xHA(ޟDSrh/٧lر'#8օtL V_ފQKߣ KKsy] ~=f '"S&t!)%o-(-0*2*3+3+H4*3+3+:2+#.()" '$ \Tby C  8C`+'pzG;J |2HPZmyܓQ7?ڱ] `Mߣ vn k$"iRK& ( -0 ndo{|$1&Q4 0j3{# z T J u& n"S6k]JX5N9O2w7}tB&E0o6We  0 / P z  7 r      4% 4 "g  i H3  T-=*-W$.-RtBZG}VBRy98h$dA[9KM }UO?9r!ohWxb doj.d|:mOr.W$l6+5"vjT{@%_ q  & /|c?~Y'V3@tSqi o{X&ys|@gqeW(oNH9]5Y9"DI{)&f=:<_;$% R  UTTm=L3Z2G#ih : J 4-Lkum'U:}[ڪ/Jhى^f*vb z*ޙU} A,Ya]& sq0nW "%$(a%+%-n%m/e%/%->':,(+[)*'L)#& "! x]  ,FOd1}Wf\ZxW޲6( ޟN$UmbSsQo/}_ j <y  80gPQ!~!#S$%&i%'$u&$,&$&%&&E%G%"U#? UZu7B* ) !;*qX4UH՚Մn_Ҿѭf:R%f֐a-޼NRQEA$.Xd%- x 2 #rN\:W8\ed41Goq`YXuUKh% > e K  A '  > ? / C" %q t \ %   3 j  F* 574 ?w\^u\e \yqhdJOj_Jz#7sQyl0)pk=>m= l9sB:~JRhDYi,Ic J VpdiX"%%! '#(#(#(!(q ,( %"] w  c 7GMqk 85'O X0BdߧqAآٙٳ٢`?Bmdgg#A%3oG.jUP / ; \# &!(G!(#n*&+(-+-a-,-),5--+,)([(&&)%M#!4 =} G 5Ig%IޫۯR>A-8$زj%Gآڋt^>.a^W>s4'1*FW 4t f3"["'d&**,c,@/g-/00~1121A303X02.0g,,*(%'\#2%   8 U O5Uo\L,Qj/ۓ'ڤwUwݜD)ޗӀr*+ܓѽ 6ޅE֟j$ j"joaJ   O{ * $$!''J)*+-%--, .,-+`*")'%#" O B :Oi)C+LQscN"Y DOc tMN@1GZ([pL | OF Qx W"#w##$"}%"&""T&H $ $]"\bbMvU<eI + g EOEh;=-*$x,.)a FO?N6$ߟF Q=60mFBq=Dz# , yo _  q / J@6.~MEF   k A a ] ,l YJ@!Ui  k    Q h 3 " #u |1.MGespWd1=tr5 r.\K*nP}*h.CR%@;8/]~G,9+DGikg s E   r  yl iQw4CUO'n)idX37nY 77n&1o  " | 9 37oZ ""J%"' #);#+#,#1,% ,&1-&-%/$z/#-"+(($,:{  '] qR'G4**+0۝ٛ(7Ϲѿμ ~ΐs΂ЙΩТҩ6||&׾ܴڒ'2j$PyGn ql<x-A$"o(%+8)-$+\/-0U-1-E0-/3-u0,..+-7(+%(#& v$ j)x  *bN\ <,Q"V!9Uw.OA] ֆףL֋ڹֿڔckBZ 8t<0ݰ߆U9C{pV   S4!"<%&(G*,./0 2234559u7a:6[:U5`:h584O6k2m3 //)$+t%&Y#"az z1hI'3Gg!g߼ LҏӁҥҮ1CԔ C̾՗8$rYY&1;7zsՕaٝ߼Q :"t) 8 x Tktd ""y!x#!h#"#"X#!"2!N"T !@R-O .7j- X3= ttA.IuRc >ODi* &:C30{ {9e%'D6mW`L _ |m?"yVhdg1*a6_o2=PdfH93%LSd={Pm,^0X>|=c8.R0IKb^e2@xp_N,7^n   8 1 V .a7 k }  O [ k  N h  $7Um,0O ds nV  qb %   ) V ,pf/<YtA: j% ~F}{FRLUjݙߌݲhs߬qykD)"n  } mwm@z\uW$,l8: L } 6[  2 N\ @#h&&wAP ANf-?rrk % m< ! !>!""J#!$? %!>&!Q&!p%X E#I ?( Y< k9K1yh;anW[L E 9C n q ?>luUei!"#$<%X'(0'o%$ $!z?3d   N4;|YTeE+GASm[5 2MtWe(F@7%M>SV=wl"zJZA'R4)4}a6V, 2Ho!\m/MY#V\j)0_0qyg,P"I;  C X! jP bW\DuIKR0H) BHngAc=kqC~U?& 6b g  C-nA.C%D<wc830-,' | c Ux T&bjhnI1ZX0D&wdւթ$"уUE(љ)p(VXo2V6*"@ -<\ 1  d I G e u">$ &!'!("6)$G)F& *r'-';/(.),)) +&@)#$!"} Vi1| O ! $1qEf34N(H=2 04~ޮ݂ܵmal8l4oC & v [!1!$"(#(~#T'O$%&\%G%%$x$#!!!VBe7 Y 9C}<9&j<ߙNpfp6on#o| .߱T9 0l`S"\ K $&g 3""$B$7&$'&'i&D'%y(% *#*/#r)"#'K#&!S#d+ Z r.W.o~ @^JJ% Buvp'c[t5 &* ;jv=  > C  1~^?pA x38iw/:\$ 8 @ OTC2nT0f/[ l*)3 dSx~F{ eXkz%A|d XD   f h -[JO -0M!`sw;2a d    & E   n H  G O s    k @ 1  W .E   c* !3s$e}ߛ{u"yݘ7taBJez K+Bm^X)F* ( " >^t 4V,q0s* WPP}rNw~ r  P g G~|udhj#V(ze SYV!-ns}Q(`  :7)@qj*QDQ""`$$$%M&R(J&*:&F,D'o,&*&'%'$$!#G""L!!^ iW./ Y{&{IG8"םՈҙӕ^ҟѩѫѩ^ѴCpP"צI9q~/~ޏb[87Tm>bZ./ P 7vt_=QI, a & t ?Z3'`WxQW!PVxS^;:e1l0,2Si>("cI0q|   _A eL  pWeU= Ya $ $2S g1 Qi+5RLYOe5:E PW`:R|Q5(Eo f7$>@#6"w\`7G-L8A!U]R118/EVWiTuj*a)lsD >,R R3\%c F!$w) 7k 8a df = R os#7E"]d|z( Y-lg=#aap~i?z^T  /  85ZT>]:9*7Olx1vm u r \ gig:aY6'r9p=6ߠfhU9l`p}xTD@n^Kv !88HVjIuhv @ 0,6eO"&% ''"' #(#'3$"(I$'" %"#0""! . 5~) ` ' 7>AW\}a1{}2?hUwae$[% LrgI= boY[E.c= | *xsFXrn0QvH4q }?@= a iha$H|C=h:&0SU7yJjߚQu@w0gޠlXi[v!$IxiO9 L.=D!$$G't*_)"/+2.6"394q;3;m0w;.;.;(.:,6+(J3$!/@!,(#\/  + uurM$kS%FqnB/T <%0Jxj6<}`\DnyjD3 ! ii@K:9[Kg@&i*erg^W7{o OI f ylf*NMwn[Vh55:$|:`&fwt~tRg~() "  } ^ *k + #p   B ` y  D i  = a s M }  T  A D-  y =8 R /8$B / m T j Ek Jc_a|EID?y]2Ep.,TBQc8(j6wgO >r`p>'!LqK`fiNbl/4C Z ! 3 I 7  qXJ'()F:n  K>Q 7 m  $3<.3K<0}E 8]haue`&Q%Zqx h  4 F*   ;/=.v_dan 4~ Z W F#=1ueNm :NGއ2ݩI8ڴ٫.ذڹ<ܯGu]g27^A )" H  xH#!#"&"%(&t*t)*,k*\,++-+.e,.,,*))('$# [m) (o}<-r]AD4>\v8F B0]$2BP),zfF}Al"ad &4Dhb \unf~ Q,vx@W^3r^v s ;  T;rJMLQN}7y-,({24(S`  b?- g2ygVtrBd*e`tEJ\V{\qP5 c l} Vp[8\-[8u&/o4ߩX /?xr3lp+H9VlRvB*% A>b|WJP 8; _ ) .W 3 l i i G<av|;5/0&YZtCB]7:Jgyu>uNc\*'|se#+mT)XOZ}{Ty Fb"1z(M}$ < n $c 0 Q l  l  E e 7 f O o z E  {  jt  3@wwf5`Z5(m"2n`"DDߎݯݰ2;ެ0Aߧ^LFll s-4\% qZM"&=(3!(~"f)$*h%+ 'x,'+','+:'z*&(Z#Q'"& "rvn 4{+Y9HcjX%}JJ./>f%#' jdy^,,REb,)b:! .rXk-%1v My"nQF/K!Dv - o"gkO\yOPh) I[߆-6?ڊ5۴Cߜ Lh^k`U5c}2$W$Y5K. m YiN}W E S!# q%!&#&*#$$$$$$y$## !B ! ` Q: " v<_ XDIa.3tߣ)ݕZR~ߧ^opUߍ_Bl*K>)]"nR|C z ? "` c / , H   T q cD gB > )wTo&r(":> <$_ ef 5 epL.XPYbZ~}  X A < " v n t[ {W  n_    .  U  % M ~ k 6RNHcZtP}[ <Bn K`mb&{0~P q'ezlY?;  VDy~}' aGP\sJQ -v}x7:]u`H C4($KY   t  y ADQ*J]-  15=c\ h 98q="@HfS4>Qk .\8}- iEO&"3ml=gu Xq2 )  FNO R9('  +vxntpD" qH{'gzwn)&*|Q $`j <ٔ+߹ښH۲+\gߙQ--uܿ @0 '۽{۶|~.HN8|1I^L? 9 . _ OsJ^ (Dc!! Y  > QD O D 7eJO,0)/,l}z8n<)%`n955L2 ]CX(:|Y"t>1 *:`1w]P_#"t&>'*C(/G)2+"4).,6k0605.4,-4+1(.&+H% )!%n NW fvT]l$R?W-1޾}`ߎڼ}׻܇ոpԈ۞yVAsՍ_ߦC# v6i roE5i  ` G ]* qP~.#/s-=*7Kb H J0 &9={LE)uO9]w))p*k%MO`%eRCe'W**^6 I 8 =>RT6Q1 fW*go .N x  v ^ gXa5yadx=.a~~uP(8V5h9X ,Ha_+` rU|$q i'I(=GA inZ*U   0.,G[+,Llz     ?   4  L   7Jmg / V J  u @(SpJ3"({hmq"RfY a}mt.   "|](brO( ; o   P $si4Y3L@A~Pz0'>!tKXy8AD pm^):L   @' s :K<}|vUD) !-"$C#h ""U#&!4gLhpVYG" U  #r~|?D1'pSNrۏA?9ѫm֮7*}MLӿةҽڢԁߩ]3s#jBe ,P+ a 0!%!! m!!   Z? N ? 9' hS]6 Sg[ Hy3^b޹Kކ41A//݅}bqC`lW:uqXZ;  V2 A$- ( "+%.''2*3 ,F3,T2+S1(0'/&7-I%j+!)#XGvi J q  ugD-nVnVL ޳%ߐc.V3bӼt8O}ڀaD:ڗO-YD{cKNE}emL|y 'F v < q *D~iz~*#|1~]I * O  %(j+,G&rK2n P}D rJ;"5 /]PX  o & *b )\ {   g >K Erwx#"G2QcAjC{$ }4U6wpf oNV*P?0. s:.d{BPoXvEa{%NMgYGN&#pa/t 1J49#k3 bP    Y a / R  1 #  S o z  E q-<+  h 1 %`v[4M)ޯpi2(֕ Փ43"܏q)ܽ{f, Bv<;L4i q ]D g HB--{"jih&4nWAR<# BzS# j@P![UUr|2 [XDh "jh]_WnsQEWhh ]}dsg8F"E"e#-##"V%X$%1$+'#';$C&#%m#$"# ["L5k> z!2vU;HjEݠؓM.5}MЉTа+ײџ[ڢ(ݶؙ?ۥ"8 G90oTn1 D ?V3'/a ;!o$ %&C!O'!(!) ) &r"! Sj) oH s B[cedVk$C'/T\?,'^&eLWRE7h vK{5b0T  e VH3*w3 i#!7$#'$3+$R+1$*#(!&Xl&I\%<# {  0  t NB$a$7f\!E8ߐDޝ߬ܐfܒJk"T@2b$uas[& Ad ]44 i >Q!6q"?"M"">#;""w"|O ?JvFA  > czOy!c_nEa<0SmLxJ$~V`h O5l |N a1BK)P>ZLw0PB+ Z^$~<jjCuv0EX  P<N\$O,V  ,  6 E e odVxS }h>[XY^Xz\mz'YJ0?-=:HF{qZ Y r x b(43Pj`:ac'Ndo PsiGMGG"p:4d5Crۃ&W^.ބAk[ca ?%x 3 !9)K,x C" .#!5#$i%]('(z&'f&&&L'&8%$""#!!c?ZF< *1>lD[].sަoQj yiۙU_J .ElzfF2 } 3 ()H1++ -)#!\%!F&-!&N!&I!s$""n#& "q]|~iwlyi IfR& R,3^p88G&l4x]fmAnIo)RmYjOd`@@Al1qlR  ^ w3|$!a&%&'A&q)[')*(u*))T()'*&(I%'"i&M$?!+_h#@t 3t vQ& 9U5#=q[& HjN[0>][~{nc-st7rte  _ 2  Y  )   (  3 A $ 2 { O,=t, 4Y nE^?FN iTep)$~Tm./8-iPym4m7 U 9 Q  9 D Y t   9 S .' p 0{  `L ^N(II<H    , x W * I d t {  -( N V , u V Q 'U D v lJfDLr$qW/io~sݴVx YLeta_D[Yx=+Qx \ ; L!Zgz'#j/R{L =!]=!"H$[$b%t$Q+"U.GrM]  t * X7w+Wjc\\}?/ZNuߦ^Oykf\wtoxac6` ?  { u j.mJ Qm[ Vk'6cdx]"  zyUbXBnjx2" cTAp HE> 1vBvrD:1XQ2I}p  g s b *Xz2"D!$$o&%I'g%B'%&k%&$'Y$%t#"# v$$/# 2:iM  @4`CCi3eߔݰގ2c.݁i%ۚ۲#ݸdޱ(M aQmroM?/#O $FWH)S=S^ 1jl   y"P JQy>-<d ;bp߫Qq߮Uߌ)'/ Ue;S;O,j\ s  Q&l;IPu l"K#Z$D$Y#""7 #!cf# { &e B tbKymk7ytoX[=K{; Fk5/d UTKsQmi@#hb A $nj#`EqiiQ8 z %   9 S  ) h`*>O"%}x.H J"P8xDRL  E^ Q]?_<7nJ>YrW 8,?G&{ {| V2Nf  k 8z ZD?'!HGUKj-> ut Q #)IK9u>ib8SؒוݡTۭѷ<֨)GϻZ&ϯթե׿۱__߹PDT^q#r1tYcL:Hj r<g!X$!E&n%;'1((X+*-&+/.00V/f/t/-/{,0*=1+l/*,)')m#%y"O8 dJ  G H0rv/jlv1%Y+K|3؁68Ԕ>|N؊D4A.r: !ty![E^CJ5Nv6o  | %"!nJt,pot6[? v U= 0/C)Mu\P={PkmqSa wa1r_Qp\=BB ia  7WRi" "#"#A##5##k!! 4 \ pTO%/pVS5 C$mvAt "< T- }\]crK84 | r"K;MTM>T3Q lonJpbP$=N +vOCJ)yt_V Upf )/#Tk%KJ`ghHxD"c2 ME i9 {qwZ9Me7$Xi = zwKBMZZoS?B,&!}!2" "#y s# S ?6uW>nFs>NN I oy \ ( T>o@ߐ\wޯޏO?~@kY88*SQTX7 * $ _ F5Qd 3:<pSbtrH_9 Vv b@2|XM5J}1O*d[>b15ߎޚ?vޝ߬Z4."cjnh'!4EWS  r<" %\!L(0"-%60)51,1,1s+&1,o/-. .*,c)+')#f%\!V!'{ g 8kwXs@3K6۔tiڽuݫm[ԹNָفס&sڱt݄ܶ%z^vz\x mf%P  / QOm-I)5/_g[7{?C!h`=ePXt  |  V? .hfDy]+Dz1ި`-5AkM#&*[7~}  ,l6:g;s$XifVQK 8@ % { }   h7=.r0 ;   fZ yaZVTk}N{')Ng4D\4jv&.T[~\pVJn +b >>&$U7B?1 Db/|ra_C<4 @   M   0>V<XlR  t 0 TM{b-T"=pD\}.lg-(SiC(G> l    f1 l s J ]  N"i9 : N m m )7 si m nx[#s# {n^ ff\\V]QU$bK#$i\N>Zls 't) Q|.1 XO-=vn )$'$%4((I+*--Y/0/1/72010>2f12231W2..X+,2')"j$ F  ~ [S8)jLW|F,9d۴ړ6CU*%ڗ5~n{W@[;v!f_r}$J1U:W 7 a  . 5ja NG "! !2rxf+ M |  d  ` BaQ8ttp8N 6evXN='S:CTgs]t % aXt> R! " "#"!=#t"(!   +-O+d v S#ON+(.ZTM39Jf TDFg$Ho2?H 45XRf9F|9CQ  b-  ,s D]hU0X(PA m  uY F N 7 S  6n],+ImX +XL||VEqv]CNi2 EbP$PjEv\;@1K D  W ] XJ, 5vh S .  _ JR%E !    'W=S\ _5Bb[T9!aa5  :"a(g52*cvgQ,"cAB mUJU r aN * ":#J$ %v&*':C((y!w'R!%Z#"^!H+"X:/H t  W!a*M}\F'S'nm"dn :q:L*B'bwzgb4!=[ 4q)  a',l2%QS  P 1G%Q;n6Hx?>;ߝݐE(n=;@KR1g wH1M`kNp   &f"%!!)"&#(%)%)$(p&*-')') ' )&'%0'#$!U_ I HwePmuD;0(v7ۋD :֛ "@k+٩Xٸފ;.bG!2jf(gu vAME,J|1 $ ].7$"& ?& L&-#B&B$'?$("(%"'"a%f!!F/+yE C} 5G2gW)TGZH?Vj4mal9^?m|NBB 6u8~D.p^ E  ; u]@U>A+4@9yA v d   V E 6 Rf/b4DB};S!]5dROG/>#yQ-V~\;?wr,ANk1 +1=4 y;E+p<p*H)>uT?n+  u q@ `  OH*ukZF&`#? `P!*6  a C W ' M O 9 R  F `#s>aKR2g,YbsC OmTtUND]]_B REsWCh4+cpXaBu.R+&JDfJeV[r`$yU {NLXpv L   be I!u#7$#"##%|"%!#  kk"y# w 3 (DpW&3=)FuwXB6[فQGװэ\ы2әѭ3ҾأهaNޣRvs_NP"< Cz Dv|C!m%&!'##'%H)'a,)7-V,4.w,.,.,.+-*/*y'&$$M =  U u J|TzI]z%"߹}ޠj:޸3[S2:~5c/RhS~*x=E %^ Y rEESJ })"!$#&#b(x$(%'%&$5%$$0## `{ Xg! H -nl1bf}R@اܜ׎_Oتד8׵&V%k^ܛ݆| V6 D[b0&~.* S TJIt"!aO ?jwPa/1?* %0 ' *  MTF*mh7~Mc 4u5E;$|0@^zKrpT ] A  {S|cj-s_g9  F S k k,\EIK uI ?YC*8W\]Fo3[-|V0dof7=>|#]WK}~r_<+Yry)r%6<ZESmsj+ T p=lj;];Gz 5] )J j 0  R #w  s o MR   Fu* ]6I#} |%y,zO#V O-wPiLl(/EB1T!J%\ z & 0 Y $Ncab{6(o[ n    1<U+JCQ] #6'"Haq30Ef<6   =   c T bT)zx/l #7($"@"Y$i" qU  GYp#mb}؝~[?.oACn2M$waS=T i n%wSV!4!# #s,#4#2$4 *%o$M$#drk7O}o   ;Fdh8` Z'|(,S ~pG,zzHxnpDCROU Pg*kHh~B2wv^@Hsd4  "=   :Q u @   l f   5n. b#  2 | = B  8TfhC s D v ! Y$ s4K_N ?`*M-y0rj ݭڬXڊֺէԝԤԁbԌyֈ}-ԅj/ ی_"y|(7u  q " 805vLa:X(&rVj3 2]Us .>* l L 6 $   +?9Z%4lH{@?i?w\S)si6/r*`E) :\ r6t!"E!,#5!" :" !z Ag1.;G n i 8 IyZkEA;@b@LK'~Z::EN^aPoq`3m[,2'i  b0ewo[""Z#Z 3&!'"&"$~!s#." X6oSh  + .a #Hm ZO% `{QysSx!$EzS_c29Mm 7 0| j&wDOfgKd5ZBRe ^B1{ v zaD ( P A gWqK]ilLyْVI2/cY$R"9y&Y|!} -J#yex!/!<!S#%!A'#$&J#%^"$ %Wc&"% # H1x D2  m  U ekBQ\Q?)\BC^:e{:,1cpTfe$ :S^s,=%00RaZL_1xjZ/[6g8(botvD<_nhhss|3I!D[&;Am#$ =q  >  WA i :06wI+K\e_n1Du   bw23;'m8>Zc [ݻڢ۩J$krL؊ب9Dkݢۅۚsh.  <e 7u7T ? (=j 9l  }] J" A$"C&e$&$'$(1&) 'P)()*?* **)B+#)O+**,))%t)"/'y&v#0  oj*Fw MM)}ܢJCdL~,֚օR8Lذܔ @ޓ>=LUVlf*#0 F PWYr}df! !w"o!d%F! ((!( ' !% {n3!9Z_BO  8 r]{B-{Qp{l!'ވަޥ6ݕ۫ܡw۸>E o-ߦJ(@`@o r h 148  0"&"%.'("+W*x+=*+***)B*)#()%($l%#4"" 5#mm $E n1b-.)Z\|o-IB=eLd;$]{ESIP "l7#BVlt:s+ h MB' W|  yN ,c X , l ; sN\hV fpxs3>p8j Fey+lntHNc=m5 o  G:aupq }N.~j;=j ~aKSaxcBfZ  s } t[OirZl[-@@tBeR8y#=g%>'r4~,s00n\[2[sV^R@h U0  A } q 2 w O  [ 0 7 *(4C%A7rojp% @   /WYNxa=uqVBo8iH0{nso)yOM9  A 4~eV_*QD  R ( } }: A  c Q  Y C< % ;u=F!Y?54KRdcek`v{U8$H Q j6 i\!%w)="+$y-$/%R1'F1(2)1)M0)]/)-*&U*#&y!!V(hfZIpM 5/^II543E!!XQA3^1I Vns,/0tNLtz7kP r C[P" $!&~"'#(#`(%T)Z&*Z&<+$*^"(!%p ("y.c& B ('6Fx\GLo.9g.ߑI5׷sؑm)ٌ}sِ\&&mEymBSR&p AIm~s =##&%')|)y,+g.,H/-../30-1+_0*/+2-.*+'M*%)").'C&t&%bN"@ ( Z F N}Mb!jDZ/\dSmvmݗڝګ'bA۴sCלߕ,8p#S#&\6Iy  V L  D n ,  &  / 3 u P    l j  X B*0$)SiUJF%v _   } w   v &   W 6   ++": , p }z H  4  "I <9<\(Ne,_U&jG@c@cS."}g6=o,w/=0*|R9rRBs5zK)1nO/r. @ hta6%MZ#$3Tb5Dpb @ .*  x Y* . -S"j4)K{h5SFmJ c,NFrBxmyJ^>>)B\E3(4c[\,;P.5-}O)x?L]B  T x[9QFuT- a C  /n$}bXqTHݶs݅'kw'?|F_l D# Y Y.zm4"}_$o &"&I#'V#)"*&#|+u#+h$+L%,u$+I#T)!& "&y $C/!a$[C H`~7jxOaVع{س&ؘDԋx P}'`ڍuۀےݢ۬,ݜnNsj1XM_ 5,  Dv1rp #V %%"%&&'|%($($(%&$%z""OF u@e  swWM,{jH!%A Np73YTfhB4PIHwt ?  \2{!%#(b'"*+,-?0a.i1]/~2/11Q1324/3i21Y1K202/=0,v*e*%&~!"B!Vh] \ ^Au}slpy6EiܿS\UqՏ֒O Diٵ|A̩;(Юr]Ӌ+QT)xsA&^ ( T  WXM?~?vU-= EYj|iE{W;%MC0~R\ "  A  $>U%|Y/mJ]p;9?a{Rz7=x 1E@L<}]~6A4"5w_w;Z\8>BQ)sK@\ilOmH  o m 9  6  w H }A(u4R5]0z7qNk8ePGzb]Mpe.Nt3rgNrUH_+D  C  cA j k  ;_mhDX&G x,;CPhm_- oYIv* Z/C߷_Ib4׿ѭԈ0Zѡ`ѓ6֕y=ܠ?w/Wd Tk |j9YW%M !#"g# )$%&v% $9 $`8$;%G%#"Mk    1lmEqGQ$oT ;cc3PQ CjBAmI&Xhr  PstC#$ !q&#)E&`,R(.+/ -1-/3,Y2*/8(-&b-#&+E"(R#rUth$ Td/{a uR_tNܟmھߕ(2{U'su=nߒwm~oyp<&Y GRLh9`=eN5(/,4pq w 1 d   olGC! Qz*h<d{~ ` > y MAz{7b} I'\.~IV"n$[C,|c;F(+B4 O .  c vR{'3"R^  \qPVqh6ulj_yw@Pw. y pdQ$Sc?^5_h[\z9$tr4RrcJhh ` | W"UhRO0S#> $$!c%#$9$$r%%$%#W%/"^#! "!qFJ$Us =  a 8 A*a.ap'fr$# |Uem6 P/PUbn2LCn(;g/2/\'9 ' M O$; bEBW;5CC  iM 8 JK <\|YhCbmY((D8-SQ:lwKU7'8j!npE(B4^Hn];86c  Sl8+ # %#'$q'"''Q(v'a%q!#jK i_I2 5 ,*?ENClvCߠQܴٕEFTOOf٦|كڣ#m.N$b6QF rEk f h |V,"%'1) *#J-m$-$_.#/e"f0 !&0 .|,*(a"Qg. id{:}q:&[e)IۆڝN?,G܇WaX!08LGq _  cS?9Fk?6bwr m  ' 2  _ NWB($J5` rL^fdtG-e#{q1qV߃ޙ߮ި1<jLxP{<5{* q } 7#J#$$(R(|++-../1t.3.-3.E2F./-H--)+#)'X$% > = # ] {8a\&m1+T;rRFn2b?S>$$<|i9{ JI4Zf_ J  mDr$[Vs VStl.U =~M=Sl-exq ] B! F#{dxtBO1 \   $  b  3TB6W}]f0cS"+-d:tighLE\z+s}cg>euF 0!{b !r^f`r5"no+whhUjDXD9 l1+IkZvh\mBG f    L 9 Cx=&?J>p|QcyMQ! y b  MMi/Q<;V6cT /EH(/P"g)?P p@> OY&bqM M %U 1w]'! ! N#b$l%&'%0'$%H##"""""!!!!!DRKqM4 # G?\|fw I\EOؤԏP&S͛KRxgrSΙj(oQʷ`<ڈe^I; m   $ n&#*D(].,0o257;:=i>>.@>?=}?E=@=@ y b  Q /  ~x`!Gn|Z&1 2  BWS@dusރ s":YW8^xR)==3$Q g.4q [   F9i{CPF8h # D~f23]4)2s5#2k41~4v051.f6"+6*@3)m0u(.'@,G&)=%m( #e&Zq#` ; Ix- ~` oc ;:?:E9߬9܃f٫שӮBIřթ%er؜ЈlљmMٟiO}RGr2U r cv  C `q784][.tO/) S 4 |  ;euV,d'+D(P28p.f,?@c  t . %  t %#  j75_ X ] C {  Q`)e9pCZcVC^C`ly lda519#/D'k6G3v>A`:u-i0Rq#O  _J[V W#y$!$"###A# $O#"i"U ""9"xTUn3e*'p 0 cN%rO<=9>jq߂ުߓGXߟgN~fIPwA[s 4mPS&z,C  J,"Z !Ov" #!":" "!L!# 1#! 0~e |X [ 5 8#}Op0H5ۇE*<ԷԅQԗۥ34۫:۽WܭQ:|d?*ige@ )J /!{a$j#(.&*&(6,+,0,-2.2X0a41516 27<1'91:09 -5'R2$1#.!,'0$D# T( ~? 'AzOW!i}'>@vԹՙvM$C/XЭ*&M$MȫcϛH؉rSsl  &Y!4r)IH+zdS[K7"Vo< D j l g1m*C' @N^&$m <wmlH/k|= v@6C9L  t ['  } k^Z5DoiGb "}j* 3L M 1 (h(lMTdd\]4+qN9PhNf1@۝ݎ$_L+[ZKl^{4eh(F T zjMwx4c ~o 0e 2M O(}8 : hOq  e H~ s: V?e  ~^ >z Qg Z T 2 8  rh 7 qu&X2vzZ h#0S~j-3zo`~_$f({NPKxo]xBQAU~l V ,c` E+..yZ@|& |&wl  J'N[ z z |=KO'(=]#{!cN=>  MxPH:CF "f!#w#"sN##6$T!% "&#P'#&#&"#! /=Bj Gh Spq]Tl=.D_M>^Рͧжj΂ͳ 2U׌MHf }NQw>N" }.Mp  c#$a$!'$'$P'J$j&u$%$$:## "$ X&[p%D$!I^ # s %>jH2;$`]<Q! %vޤ@i:JX=1WN+<0u  *7"!(x$(I%,)X103&65s9z6i;7%=85>;9?<=<;m<:98542B/u0(,u"Z&H S} v yq 8} _CבߝԉѹuדЙґh(Z|n͵ɎgldzȬɨ*#˲DZ;XFΖ*+ظ.ܼI ;}'M;c' 5H5nI Z !%!&L"'#@)$k*%J+&A+'*1)z((&)q%*%%@*}$)#'1#&!%%Z#] slc<<U ah #j P L 9 =aA[I6J9eVG<5BYlI!NVzci[(X| K ! _Nr[d)~6N@dEx5pUQrY@U`2InEq` '~ R_!5WFIR\MmV!f\.\8H&\ $w8nRb_&CxoA0 [  1 B Il\5 ^? "  _/ %Ze > i lF   i : H  h  EP!xhz]O~>7lhb؇W"ְ)a6Rp^Ffv19 -| /  rO!5X V!W!f!h c%\#Gs4 b   V+}YN-YJfF*< }!~nfn#s%)T\|h_P{qf_k<  e(4o9 5"9$'(+,.>-- .P.(/0.1.`1/1>/.r.v-t-+,P)+;&(!$4om dD6T2ӊjс-ԯس#0zmLxwHr 5V /qI!`{r#f # %&"<($B'%n'%%#o#! {X#3  r 9(IHV|9nO"0{k L8s Y I5> 9r=cqjUt4N00 : qd E  [ qsc}OYcNt& >dDR zw~2S-WL7f<S E .|,4  bU@tz1|}Oo  'i|QO&zU A # "-Wk;:e"wU&xWLJەժڼLݛճԣb׵ة ߑ8NhOf- I (3EM!"$'J(++1-,Z/'/T2223:342424-33V211=/ 0-O/.H-Q,)J(& $$ !DI( '  ;$T8>d\G-ZF1k%Jާ޽D߳Hs$ 9\)z^fYM|.Q"a9MV1 `  X v%"#um #!#C!<"?"O!I OI :n5 ,rptt?Yl@%ޫnߡ٫J 1&c 9/B%I "M$; #L'-!~*"g+#d,b$m/%@1&0('/&/'0!)1(1&.%*%L'<"T%2$5"z!7eh'w  K `N  =[}ENMAe|w6yݷImsڼ/Dmw݁wcle`Asۣnن^ݦ j~dS,z-g 4c I$$nPZLX )+3 };ir| S [   / ExNAC6Zvw),btY #NX=  06C6  QU8("q`_7@}l%4tNS ~b7:q@:^ir:-5@7$S= 14cdpN Ux/svu~k R`mE/5gbSQ7 VtJT5jE<  .  } c g Fo/%pE)XEW0XG [ 0gXCB6 P \~G4o[i`@w$$5lHEUvMve i-qv ^ r 0  fd10vS= ?Uh> 3 +HdX0p^l8IXߙ&߹ޙ;(+ߥTR-b7~\ ]p |& gj Y!"$#&$&'%'%(&)(*(+w)l,)-'3.%Q.m#,|!7,!+s ) !(u!'!& 6$ g4B cbT64\H[ی 8I4sֽפYB΄R9Hdډ{ݔ+lҞԒ<֢Ob+&~n)a x , 4J-" L}  ?!2 N`hvw~  k%tR'U*_0S<+(\6>$>K7geH`g EB 7|l[d : g  $Wv ."oF$% &"$!x#o"N)k| I1 *s?vEFw1yުޱEܼ/*G^޵Y+VݗFֹD%6ۑ7X9y.Z#%L A`6I^I  J > 0$ l *uw)`Bwi0HD.ai\T;" > j   $ } tlEpTTs/G,<qOU GO4`R3' ><>2I S p ! ,  1C C v s Ak 1 & t W# 7 S c ? A } $ R   D<~}Fj c W9qP~R)6\1w4^Pn-  sp=He$;T C A t iJ 20E R>&9 }"%p(P d +     * u ATg0Mi=n.ܢZW=3ue۠>HCN^_j"e.< vs 6 1  O I  e  W Gu   0    c  ps/'t:/2f%4h1*KVtQr9@7jBjj>U W)UKsz*AI118t<&PYpYr =B V]-d]!mO!!"*m$S$n O% % I%%C%U#""M!I1 I  +D fS8 FXfs`Elf~}\K/S'8[{D88cRwdTOAwpK7uZ]8JLY; z  U ;   E  Y  L F q C 9 4 E  - - 7, .IB$B(c V*pK T$l?;y!=1B\hN< r[27 y_Q=TTP.8 > a g!( to!;5j [mUN0l.VZJ| 7 '  C # d`*B4R<-45\38 i/hfv߬cߤuj@=#YDf:VB /)G_ r"+M=Yg Yw ?W  l f7Mzr-O)&  {?} o 6 a  E   |+Sj hJBkk+ El Lu-T0o0heMQ u ^; // e BAZ&2R5mSgi Sj3 = u , :  w VK9&*N?iM5b% \}0l5@;# ZH XP"#=9ay`8Y# X  O@@b! d%))"j*%#*y&)''4*&+'-&-&+&%*$r)O"1' u#F" 7+-CF n\G)N&n.YTG )46AS-boG>{Il'fd+F e | < ;O]\D D L _t0  > :NPc?)c߁,MߴRݹߠ<\5^AFsK=fs^0kd_ t l d  TF;!#^% /''&_C&%%#!F ,(}]!< v O  =cG$N  fyod$O0";?KrTSHF[yW.f ! !HQpylIUhv~'D% I[?%tk\I   k }81b@wG{Q{>!_|!@c[8k]Ln1C=}zM^ hT)Os % G  m)  Z U Ia-~\QuECd9:\ =! X5 }D>- sR?{{/&0VX ް{S=ߚߣ߬oK['Od23kc_y4JNG XsH/@2'i34g{<-  # zb&F9Hq: s-cV 25[?5)x5 b wi a LZ f\z@  >]}g]u9}$[{7JaX}H4 n@;H=s787qbMK w   % x3ud{67u7x  0 #?vWGf3F%=1yW-C q0|'x'mJ67M / ~8"u._"d \ !I *! @!klQD V  =FH n`*wA)Wl/DWc V޽" mgaKs 2< w`e ^ Y+of!"#_8$$$!  }x  9 Wn  q"|1B*gCT@"#hqiG@k5LrGSn>Ay A m x ui{H#hg6!' #,!;$#$$n%A%H&&&a%&"% 7$@"!)JWB9W+ ^ J ?"4~CkUtwL+މޡܝ| cOޢjF߰G?8|@`:cZJ~Z6A:^@<:>     # n  ,  >  c g u u  4 > K   <p   7 v/\us&+k4U{f'KOnH5ux$ZI   ,k  9 k m !  - z zU   7 B W K~]}4yaBF YT E$GR) 9Q=%L]|U}vHIM /qW|!P9lAO%   1XM[(l T!!! Q(R ) Ep]  {lx-'YU*V!#Pj=E` L|߾7Nc Tvy9~BYkWvYi: J  2 E1x}6  ~ :/S`!/ffj= P R N814 WJ%}Ly,r9$v5#(DygrF?>0yr:Lmw Lw  Sg*T W!_"$#'#)#z*#*$V*m$)%y('&(&'|'%'#%?"D:5A 5 r6 cWV37nߨ8݊&%ٳڙXjר۳dUڣ}܁=nG?_T ;D%Q0H0Z jYN9? h #\  _  \`TCJtn)PU  I0   ) XX&LWv3E9&'y 7\V[9dlI#cfK+v{)zS n (p@wF>Qr!f!b O2P I  iKT1I1M2W TT+B?c;Vl=^ZLPd*|!W>:<< Kxv<1$K>]$eqPW,$YZ'lfE/ V`26ZN< -=|P7go   `v   ~ F 9 8H!w0K0$2N7+^6U8I{w&PB4-  %  ' # J D ) 9 6q   UZrh  G! q jKzn? |t*@v;S}WV)M0b3M$Jan)IW]}ss  u Q T M b  @(GF6&f r]2{>$2d0^f  } T 3c,Z>Zk5;^޻܉yߗW1ޭmޡ݅mRޠs@`0P:X=  nTR]Yf"#&((Z) **)f+*,*#-+*,,*C+*)\+)*k)g((*&&%&#" !<3>7  P [nwef b0#߲a0ۍ۷eڷvlJؐ"&&ڨzaRNA2_M]gkYWN ~  Q:!"%#u'$r('**(>,u'!+3&)%V)%'U&x&&%$U$##!!Y}iNKv D s7kp7o5}WB=r=9 0 > Fr   @ c ~ 1 N ; J b 5  h/  M  w O    }o   h   Y" D '4 5doLV"PW:v:IfL7IQ rO. qMaX}VJZ.b!3c)6 -  t s   9 J B  _ 3  " 3E#Iuf$y[oIfe I a^x(T_TaS 0_<"efTsHqiHP.:NAFu?G= E= ! Q P*bD @gzIb +N 8 D :_ M ~ V_gFx uJP{)h {Vz/yb5CTem h};l{v V | 7T B\  C={z,a^fPcc7R 4$  ? >  M H  Gro <@d__Krrw%Enpو'\3<ߏZ6F8 Kn\JHQ ? M $uV<  E#%!m'"'$&$v&$%#% $<$S#aE! VTA5   = /EIX]68N18i[1:'Knߋ)]wZ'!" WtVrE'S) uE ( 6z  >6u@$(P\t/U2! 6 s[u8:e~8Jw~Ldj]])'މ]C߲oUߙ3&Dl 9FtC r~7@DcmwRpk A q  vGB[ )"cFzm%9iq'7d3<[>1 Y k b :F9*P/[tGh^Zpj6 Jd!yy^`,><Qm J}5uH}`v~GMI=0/_:Slp'%P!Ea8;'T|  8  Z,_/{YX Cmlm )9rG y   [ o & % , C = J L : 9   7 q7  { U  @w)HAsAv?][*IV[S(F s*_.j(e|e\%;MY.Wo 0 7 =cy|/Hsw$Nx3a`z;8-3>mK?Ec|,U)<2o: E NwAkgyE!y#I cH1A*/ X [ |iq22x]`.6QKstcsLU+QxiJ(MX SrTgDvl .b%mw`VLjfTICpJ^q 0G 0 q _',F+Dsf- n !C^uUl* wM68]U "xZ Rb  7  Q  P \ M  A r  U ]  Y  Oo6m!vym} !r |xNNOy6tVxvaVGL tUcl[)K[@gV  xw rPbyqV  T$  Wb)}a6JU N ( { v  P PBL y s|6D}:Jj/.6#^;_oS}5fL;!i#9` <  j / on:[&T^9I I wJ &>T[t8w4u}2MTeIX Y 1 ;P5~*KJeMnDaOWbE#vk?xd+DF  g K fJY|< 5  [ " {pR  CZ Wm4\7 }2N4 @i"itM 9p(qpH!QT(sQ- 2X*o=WFP8LuedeXd 2 bd'  ^ pW|8HJvJetrHj  ;  {\t%b&%SZVRU}8%HId:G]D |\,!L)"su' Y'W\hYE,qq2! wHYn|Yh' 1gE/oxIAIe?r`ZI9F3#< vZ&izmYbnK 3t !J P_  c9J`# Rw b"P#y#; d" = !9! Y{7:U   c s"a6_ OU*)"}7Px1UK9?@Coq"y3a>CO2XnjP] -K)Z[tSLRFe]]g#6 = !  ,g{PT +6zV=]D 6S9%>,QcQ5sObeor /MyO$5a` / 3f ( % ,K&uN] i U S+ ^ C U L 4SL-DUQ5Zx R_KK',fb 8kXBq} jw i1Q ++ "?   ? v f 1 D Q 6  e E  G_ %  R  c !    a -ib[zl%#D!Z? vwd|3EZAPS:6>3EAv&,34L&R X? XhV"1Gd7kLD03WvahuJu8_ A)97/&s!C \z;~X0+A$@9I:22Eo{tN@5mb  Rg @ x Z 6|ye)   30 } V  U "  . $ u   a  - < t + 2 s  a(`5:"QsdunB9HZQFG ]!2y<eT1t2+jwd!~8@ ] 3 }   ZrHEy O  + }KjDBT3O4Hl>H:*>r 7 qT "T+I8ygc G5C9l +   m % A  T      [ +B ,J`Chh$N$D?^,r ,zs![Ur?{sv6.9J"HR&p "G(a(  H . @ Birj2 p'X>"\ 3 + <  ]ZNbz| F&pO@{Lfu2BG=}?= LWFQ6oDNCDb'#D6{'bsI^>n{*LP= )45  Pv g < n   O = Y  D 9 , ?   ]C r O   :AoG?'/T08(J -i) bZ)v(r./|0;F:gm#[e3NR.J#?O P ^ 9  M  . 7    3 p  7KLCgu4jA`K%Ms4YY d;W]r O.C7'wMSwa-& tEwg-j6O nE ( H A I . R j C Y ; l j t P $  S3s(eX$d/~'2/26__nS>.`LJCR" XW#2c03;>4)m]S % D#4 Q {DC+v"y\",Q-*Ah!g^J73V\5-; <%Y5NyKtDa?[;K~JzYyF>zgw~:bb su@[9tnVlQJ/)E G^b}wZ\h@;Z fG#<,53 PB:k]h[%L"oYv.g"6R+vA, Cu.8h/4)rGVHy.R 7ALzyx6e06G"@%Und'g4jTg*=gX!M1cis=]r4MCy`c?&eAr!OP@Z ,IAAOejw"n2R(ZVZ'C Ke7H_Ny_teNbq1x{60R?i5'^L\s=?"nimlN5% K1] ;U7ixuaXr"I*tkB@+N1+%x/ p^nXnXtfD0kU[-BU'l[t_FzN\"ih@FF1'M9'sHW58OTN^ZTVpQX:Nf^Wjto&]bnqvmu^ . NH  -Snkv[ b519 W(UI>R _.FzBxx`IQ,`{H8Y9v%bT &'}3wF?='%JAoSBLqVd}lisyr$FUq\c1{lQBd(gqZ  4I^kgA.EH&)b+NDJ_$+?RRSi02j:xs_-N'sY  vJ5V+#TA` 9 ~b]T+g]z['ztm:wXa ro"1VS~  ~SsFssR8+_ r`\TRfJ|(z/ [[~H E3+W< E'jF<Tur~w  |$f&JZ.:$oZqekyF9H_%%R'uva|nGk `awwXN{Z kY0 /7=OcS\eiNMn/%*:\Vv{)r7y`4GT+DjH~LEw]spt{D\ON /GW=RhaL'wp N,WECg]'[pZ %QfEpIddar}^eqq2+"R9:c1#oS3s+(r84NLfQs9qYsdnLtZ_m+ePeU'!5~;l%c$8- ,  d c9R;" mLL=e,oKI]z~iV;"6Jv4?IWfHhlv)*N+ CVRbhh4,!M<Xh`b{71-.)\-'J:H#C.\ rR%^W`XD.{[Go H )N!>rxpDa*Np8ITq(xIeJ[Xtw~~iZ{)Xwzz.[:\~r{)]uqhs`wBo1d+p$e#!Ngt=&wooqGe%M8>e:42+{wf{wnqUQEZ|ju? $T~mbh~k] +< *$EY{dM^v9_PZW@Fr-LjXZRNIV1u~z]Hd9c,J 8&'BKL#xSnkQb@E(ek:N4 ~KD719F<-)mJ@:-wr{4PpsomkmaB $7@>+#,,Ir5o\UNN[h{ ".?ERItWu~4Xd |/A/$"+@6?L*^!w(DYRT\Q PWK$JM^zvk4;pRdO2rgaW\l f!M4&:5* (C_h}tfsyqQGF=zAf;`0TL[owmhoj_O/%;7!$5Nf_R[_br%Mtyjo~}deu~ujmiO]wR</FXL.DRJYAB)HT"I/?843(/7-.f>;1 5<2%).paS_iVKMJS ZTh   vt#fJrjD ";IXw,R|,Xsvmi_E(ofh[`3L>DNIS x&LD[y>{+<,5&d/|30+x!xu X+uVc> }^B.' qJ8 ~~ {o z+2+%"*2+-CNHH\*|,! lZSPTN?W0BMD6DWSJUh{6?Kc\837 wpvaePa@aSGNe))w mm` N>. *-"7 H Y mxrt%=]uyj_RP*F?@0wY='oI4=IEAJW]`j uy#9KIQew+.8;AYfa]f7Mu \A*] 7*x-2.8~HIHOSQJEE?=HH :/-3&, 1 $$+'&00,$$4:3-&%% x^@$.}/rfO@D0EU4v'9B DD-H8`Uqvry Db#*0 ;3i{>qoghqi\VC/10*%t[IM [ [\o44(2;1*""m!a\C*& jUQI? 62&L4+  $ $',1 3' !& 1H%_#ggoqf [K7-*% vp`TTRWhty((05246.>-@,=(6!' xruzx  #,/;$I/S=TPNXNUWP^O^RZYUVTPWW[[^P]FOCAB@=A7;65:2?.G1M<SD`HgRhSpGs@pFsKuLuH}BAx;i0Z)I(4,!/033 .29;<3    #()0 97, %#%   %# !,0.1;DJOPOMIEGGHF8--/031,%      $$  %-47"8)?-L-T-Y1c7h6f/c"_] ]YUVY[[XWTMJE:."  %(%'.2697:I[#e/e;`CYCM<D5@/>&<>@<52 6=CC<9 ;AIRVQMQUR RSMD=72-)$!! $+3AQQKIHKNF=83+    #&&)/5534579987-   )3;BGIJNP#Q(T-U/R/P2M7K:J:G<B=<?5A+@#92,'%!        &,/6:60---,) !    $)!+#+",',,,/044;3>0?1@4@6@7@5B.B%@;753/+)*)%       "%%#               $()'$!     "(.369<????<99997532223431000.--*&"!                                                   audio-0.7.2/test/torchaudio_unittest/assets/vad-go-mono-32000.wav000066400000000000000000001526041376444676100245400ustar00rootroot00000000000000RIFF|WAVEfmt }dataX2VhbVQV[YW\bc^XSTX_b_XTUTSSY^`ekpkggkllnpkcfwzf^gi[NR`cQCKcsupqyzj]]dhfeipssy~}wqle[X]`]^ly{plszwnmlcREGOSQHBGVbdZOORRNNU]_^[\^j{vqw{vkimnhc_XQNXecTC<=8.$%.20-09<967>A@=:<EPWSPS_d^OC;77<BFHLQROLORRPMD7,)-1/-3<>3(/EXWIER\YOINPMQ`icSNVZPCCNXSF;8=CFA<;AHJHBAFMPLIMW\VLHJOPMLOSRJ?:@GHFJX`[LFKOMEELLB;@MRH804;??90#+:@;6=M]_YUY]]ZXWWVZ]]Z\fuyj]X[clsriciv}wy~|x|sbao{vf`l}uu~zpkie]WXbowxtpke]TMMSRI@ARiobQRevzo`SMR`lj^X^aVE=CMSRLGGJH@76<BGQ_f]NFHKB99=>836:64>MUMHRgwxl^TSX\VF99GU]^_`]\akqhXKHKOKHGNYaiqtusne^_c^PCBNXVRY`[LI]v|qglz~wrru~{}}~xebmvslmrrlhig^TU[]Z\folacrxgI=Lcicdw{w~{{vrv~~}zqqvxo_SKIJOV[^`]Z]hohYQYab[VXYSOU]`]TJDFOQ@)*87,'.5439BB7.-39<:2)$%'$%7?>=B@6(")234<@>:?MVUQWbhd\\_eknjaXX[^]]^^[WZbltvqhabiqsrsvvhVMRZUE>BKMFDIQZ_a`agnnhlyyuurmp~ye`hk_TYjpkeisvoeeluwuplfabkuzwqt|}w}}~~xy}urqqt}~{vxxrnv}}{tfWQU]a[QNOPPPUZ]\WTV[aeif^QMT^`^anwxtrutojie]QE<9AO\ZOJS[UB45=B=;ANOG@FOM?46604HeobXcvzk_fro_QR]ijfa_cge\ROZiog]`igZPV_[J>FZkpojedku|zpbXYguytmmu}yj^_krmktx^O[rxgTQSPNXim`TYeaJ42@GFDKSSPOLF@CIMLOVZUNPY]\\``XL>629JX\[_b`\Z[TD:<CEEO\]N=:AFB:2*&(1:7* #% !%*'"&#!##"$),'$&,9=859BHFAABA9.+*(',(   !+5'  #%#%&"'+,70 (/0-*+,-19<7) ")*(%$#!(13/*09@@?@CIQSL=37FRROMNLHHHD<>J[a\Y[\XTUWTPV_a\Z_ea\Y\accb[TRUVZ_c\NGRbf[NMXa^RE<;97:?GHEDHMLJKNNKMRVRKFKSVRMEA?=??=:=CIH?88:857;8/*1AKD6/6ENMKOX[WPMLIMYe`PEPckc[ZYQHEJNNLOSW[acb]XX_dd]URNMORUUUXYRF?AC</&"!!%,.,,3=?;;AIPSSTX^a]Y[cjjd]ZY^cefirwtmjmmbTNVdooloyyzqs{||vms~|~yox}yujZNOZde]SPROGAJ\hijsytmcakxztoon`PHN]fe[UX]`bfjgZNNX_a]WRQZjxyuonmjhebbhpvx{xo`X]hfZXaouu{zx{y}}tibfq}srz}xx}xgYW_bZNKT\ZSS]hjgghknpqmhilhbbo|w|xmin{vkhmolqz{tuvx{u{v|}{}}~{nhp{zqgec``cea[XUSRV^c_Z\mtrwxrmniWCBVkohgntttwxtrxzt}rmzxzvkhnw~|yzms|wo{}z~zzpknnaTV`fefnsnhn|xm`VWalrpkiowukhxkhpspuz~rhmzz{~|xwztjcdea^dfYD>L\]PMT\\[alutlkryymbageYOMU^fjkhhjjghq}zzvh`cffdc`\[akpi^\fpsomllfaclrtvz}vlltuhWWbkeXU[]XRVchefp|~z}z~}lVQ^oqhblzxnmwzpiinw{zw|wy{y{xtrvulc_cikf^Z_inoou}woowwhXSVWYfyxpx|xujbiv{qggmle_]WJ=;BJH@AM]aZSUZZVYfu}zvuvwxxtjcfieZQQ]ku{zvtw{{yyyxu{tqtrh\WXZ^_]XSQSUVTRQSYagie_[amy|wtx|naY[erz{si_XVWWRLGDFHHE@ELLB9;DD7/2;:0+1<DFHMW_a__beisoYTbni]X]YI?EV_\TQQU[ac_^cklbRGCDC=:>A?98:91)'-2:GJ7 1GHELYYL6!,1,2HS>BN<% +& $-)%8?2%N}~utiT6  %=MMGEOcrvoeeigQ."( ,GVTB,!6LXYL?<FPPB+**#"4A8 ,,!&-.+09<<:CSdqxwpjlu{wrpocRKVeeUEAK[k|m\UTWZ_]RGIY`S=:M\U@9FV\\][URYce_^fqz}fTSWTHFVaU;.9O_fq}vjgp||wwywm_TV_gaULOTUNHFKSXTGBJVZZcrvdMFML?28KY^_acehlidht{p]Vanpkfd]VUYZPC?BFFCCEJQTRLJOVWVUWURWgwubQMMH:04@LLF@@;1()6@>42:A@:;=7,(3AGHLTTG<CSYM817A@=<@EMV`gbYWakhWKMVULDJUUKCFQVWTRSUY]^binlbYZbhmorywg[\iuyqgcfp}zv~}{nchr~yqtwsnr|yuxyc_lwuljqxzwuv|yfX[lwrhfmtusrtslfiryysoqrl^WX`eebbm|zx{zna]dihglstrrurj`XVZ_fhgjt|uaOL[pxrcY[ba[[fswsrx~z{~vrwzvwyvngju|xs}ujorg]_jphcjx|oaUMHJNRQKGPdy~xpnns{|wu}|z|yy}xpp~wtxyqjjpw~h_dh`X`svcex|vq{uz{qgn}~kWVfpi_]fnpmqy~{snmmhd``ceghkkifddddca\UPOPWZZXY]^WIAER_eb\XSMGHNPH9..37502<C=1*1@E>8<HQRRUVQHDGKLGDEIE6&)>V^UJGIHDCDC?>@CFIPV]elpi`YYZXTV\`[VZdkeWKGGHKQXY\dow|}urtrgYTVYWUSMFEOXSKOatytrtvuusplmok`Y^dbXT]hbQKVbedisvpkr{|}~ynpyvlb`cecc`VOVjvp`W`q|nlunet{|y}qhmwxsmkiffjjhjrtiXUZZK6.7CKNOQV\cd_\cmrmgglqtrl`SLJGDABDDFJLJFDHP[eh_WXcicXRNKINW[\_`]Y^m{{spv{~zutmhjqtngdktyxzzxtppw~~}{qmpvzzrf]^de`\`dbYTW[WNHJOPLGB@?CIMICEOY[URTWQF@FNND;>LXWMECEFFFHHKQVWQKKJIJOY^XI=<@?2+4CC0 ':A84@KC1,5<95;FGA<:975. ->=/%&(&%*6<=60/484-4DH6$+1-*+&$''$'6B@7.& 1=?8.&&0<?6/.-'",016@FB98@LTSNHEB<:?GI?45DUYPLYmvl``kw||rpx{xutvtqtwtj`dpwsmuvz{trsv~zps{{ttury}}zwusu||~~qgfklcQDGPQD7133,#!'..'"*9CE?<?ITXSMKPUX[bigYF=CQZWOKMNH>8@NYYPKJNSSK=2.5<CHJ?(+9;8=EE=>M_dZQQTTNJNW^__epxxxt`X\aa____``^UJBDLPLFER`hkmonhfmvwneb_^_hspc\gwzphmrfN<:??<CVfjggjlpx}zmjovocafg_\epqgagswrptzwnjnx|vnlrxztolj`SIDEA@FR\[[eqpaZez{spg\XdpiUQ]dZMOWL5/FbaJ9@MQKINSQMNTVVTLD=>EGB93583)&0>D<1+-/05?IOQNJDCHQVYXYXVSQPK@:>D?.$-=?/#)6<<?GG<6>E;'!->CBGRZUOR^fdXNLLKHLZb`\bjhZU`lhZRRVVZckeZYcif\\bbVGDMWVNLUagfb`^afmru}|y{zz}xqurpwonqtx}}xv|xtqnmnqrj_^jwtf]]^WMScqqpu~wont|kbejjhjkeYSYac]^ejga_`cbcdd]UPWagfb^_`dd`YUUVTQQQQLGDGLOQOLJNTXWY]_YQLNOJEJU\YMA<967:>>99>FFB@DNSPLQbsxk\W`ig\M@?FNK<2<OYTLVcbVQW]XLKQRKGKSRNLNLECIT\`\WTXckh_YWTMIUpwnpw{{|~ww|{rjfinoha_caWR]op^NNSTOUgndW[fhZLMVXPKSajhbadfdfmupZFALWUOQXXPKNRM@:>EEBBIRRNOV\ZSNXkxqbZfy|vuy~~{y{zkacig_ZXY]cg`PITccWT_qsgZRQWbmnd\\_XKCEKNMQRI>BYnjSCL[[LEPdic[Y]]^_chpsm_VZgqps|s{zhbeinw}wx|wqqv~|vtw|uqx|qnw|ujky}sot{|{ywx{{plrzyod`glh_YXYURSTPJHHJJR_hg^WX]abchmqmgeffddl|~xnc^gx}}re_bfhffn{|pmruungb^[VPIEFKPRSSQOLHIOUYUPOT\eow{tidjoi`altogmxxk_\[RFJZc]W\gkc]cosgZW`lrvyyuqtzvi\\behnzzl^[]^`gpsqprna]lzsfen|ryremz{|oYP\kj]Yjzusppmkjpvwnjsxrtzzsjeddgkszvk`]][Z`gcWTduvh]\_^cqzteaisqnrxyux}peceedcejmia[XVVY\]XSW_d^XY_gow|zsooleZWYamuxqoztfl{oZSUYVNHB>==AM[gjdZSONPXfrxvtstqkedgkmnpsuvumaUTdyznlqqnhcYOPYZL:7DRTOMNMKLNQSSTPLJF>59HQNIShttolg\W_jj`ZbicUPXd`TIHJIGKQUUTRT\jrkWHITWSOMJFFMTUPNQUWXZWYervkbgprpvtZOOROMMNNQX_\TQUXYW[`efjqx{yxyytjbgv}nbdknjeejpoiccgh^PNYb`UOSZ]_`^XX`ge][`aZSTULBEPSJAEMI:06CID==BGIHFCDIPXdpy{wv|}se\XWWVV]baYTU[\YX]eea]_gihbbgnk`TPV[YSOQX_dfdcfmqqrx}wwzzxwy{vjdiy~xomsvupmjjow}}vnnt}{tvtinvxrptwty}qwxtuwuu{yoiny}q_Zaie]]chc\]fgcco|qa]djjhikjhgd_[YUKJT_\PO_lf`to2&33;]zv}P'AIfqR5-=Sf}vkhsy[CLj}}lA9Yp_??fi=3L]M6;PQ8):Y^NFT_N1*FitjclmY:,:ID3.=LH=D_rfG37A@56F[eechjhd^WU]o{pnu}xkdky}vnqz~|xutspnouxo]NM^q}zpggmso`QHHIECFNX`gdVC:FX\NBJ\]I6;NSD:CPF+%66($/3%*0'$7KMC@FJFEIKEBLXXMKZjkc_a_YYerpcTKFDGPSOIIOPA0+6AA:>IOI??KROJO\ff`]ZY`mxthgvxcXanlc\_`XOJEACJPQPW\UE;@NN?1058538>?859;739KZ\UV`f]LHUguuri`URV^`YOJHEA?@DFFFEFEHKKJILMIEGRXSF==BCADJNH?AOWSKO_ie^eu|wor{ymiowyqf^[\ce]ROTYVLJR\a\SNOSVSONT\cb]\`dd]XYajlg^^fiifjqtsv||o]X^_TKNY``fkja^foohb^ZTW`e`Z]`ZOOX]SE@BHKQYZRF>98>N]]SNXdaTHGGB:<DKI?4-2:@</#$.86(!.3*!)?LD508DGDCCEGLNOPSXZXRRX\VMQ_mmbXTNC@GSZ]^`_ZWWSLILMKIKMJILRTSVZWPORM@7?LK>4/(!(?PNDFXjkedknjc`fpsnbZZ\^dlpjfimkeitzvllqqlfdecflqpjhjov{zqf^`gpsqmt~sv~xzyj`h{{rzl]UNNWbd^ZXZahojb`hrwwvqljls{~p]NECENXdksyywzget}vlkeQ0+211:ENPOMMOSX_b^YY^abgli_WZ_WG<?DDCGPW`oxr[MO\ecZTV\]VMKMKEGVaW@8G^hginollu|{zxt[Wckioy}vn}so}uq{{wwrgcprnzw|{zuvsor}|mht}z~~vv~~}{~xlikox|nd^][XY`ehgfebXOMRX\^fmmfckyzvy~vpnlgiv}qoxwfXQQRW[\WSUYWTWbnuy{rt}qptl]TW]\Z]isusuwvvuqi`_iswwtqh^[dmfQ@GZgd_eqqgcm}~uruwoffmx|yz}ymgovsnvlbmwjSQdo`LIQTMMYb_TS[fhf`]\]]ajrwvv{{yzvqx~z{}zr{ziehhc]]agjicZTYbea]aff^Z^gmnmnlfemusgZTRPLOZhsuqjnzskmrpnnplb]_]UNR_eaXTWY\cjomls~vtzobet|usxvmfcfjr|~xyz|}vuqcUQW^[TU]aYOKPTPMNUVK?;@IPSQG3#$*+)/?S[ULFIRWXWX_ee]TT_lu{~}~yrien|{uzxtwsg^fuypjmrk^[af_VXdhb[ZYUNOYa^URW\ZRIDFNVXPE?:624=L[hkc[X_c^QHGJMLD:59?=0&(16348:6357409GH=5>PXRKMU]cjsyzxpgcejlh_VMGIOTSLGCEIID>BPTH9;O^]OFGIHFIOW_aXIGUhrm`VJCEPZ[RKKPOJGKQUQIA;:93--5AGJNU[[ZXOB;@NVXX[\YSQTWOC96763008CLRSSPQTTNGFILHB;4+#  "" &,+%#+6:989>DLQM?2154,&(/0,.44-+5DI?/  ")7=5*,=QXM;/+,,-.14:BHMQRNFAEMW`ef^QD<80((+-.,+**+,'" !%&+8?<;EUZN@>CECKX\UNS]a]YXTLC>><723:@A=:?HMKEERbhbXW`hjfdcb_[UI?=IY`ZUYaecacd`XWZ`dgf^SJNVXRNTYVRQRK:.1<DGLPRTYdmqolcXV]`ZNOY_XRV^\UNHA;;CIIIMRRRZfdS>3.)&.=D?9?JLF?@GKMSY[VSV[ULITbbQ:18ISO<,,?NI1$.27<DIPX__YW[eje]]cge_^`dhoqfSNZmwtmaTQRI76Sn\64Yc8N^>NL,9'2)j8 gV!t2Vb =o])>L3(MhE:veh#Tn<FoYw<3S?$0F@7IXF:YvY%,_]Lx% 9X=#7SF"9KFHZgcUJA;:9+$BQ>'.GK63HP2"EH";@+'8@A;-!*AF."=C4/?G6.960& %<9''5ANVQHFMVVL<24CK='(DXK02SniTObvxpgbbbeddlx|qfgsxm`_ff^Zahjipzwh\_gf`^cdcjtunly}y~qinuvuvwuvzwon|yqu~hchJ^{vk[d{}sz|~|{|naan||zwutqmjjpx{xpklpojc^YSPVeqrfYVaqyvkgmtqd`lxxnhicQACQWVYdh_UTYVRT[ZTU`e`_o~wgktr{}{mm}vjpz||}}zuqpmhbitwojq}wihyv|}ocfsz|{uvtkhstiinrstocVRPJCFQO>/8Rc^NIMXeu~sXFDIB54CPSTZ[P=5:CHOVZRJMW][`kn[FAO[UHBIORSUSPLKHEJ[kmb`ky}}z~}~zsmjhmtyzzwnhp|oU]yx_ROLGDGJJKT`glrvn\PPVRB54?MUVRMP^kiZQ\mti^`lslbakxztnmqqjfhnspfXLKTj{z{toquy}zs|ue`giaWZbd\WWTMHNWYUPPOIGNY\YW]_WLKOQNPTUMHN]`RCEVfha\^b_XTT[`]TQ]qykVQ^nvvtnbWW\[SS^e[KJV\WWk~ye]kukYPUUPQ_g[IH\kfUQani\Y_fddjqw{uvyg``]Y[c`REDJMHCDLTXPA9BSZRJLW_abefc][^ceb^^_```entqhdfmprsusmfcdecdozzm`anzvi_^]YXeyzuwtgZUUUUYWN=58<6*'09:56;CLSSH<:IXUE9<DC:6?NV[^_YOKOUWUL@2**06;<7/*3DMC:;GPMHHKHC?=>AEIKIA528EOSRQPJEFIE;6;GMNNPMJLTYYW_hi_VW_c^UUY`gkjdZSSSQJCBINPQW]abbfhe_[[\bistlfdeb``b`ZVXXSNQZ]UE99ALPKEHT]_]clonmrwwv|xoqzyqpwzraW[il^IAJXZQNQTOFFPWULHIG>6:GSPC66>A=3*%'3ALJHO_pxxsfWNT`gaZZafe`YX\b`WMKQZbike[W]eg^SF>89>>:6:AB@=BLVYVQOU[[QFEJNF:3683(#%,21*"!'*$!-/**02)"%./(#&& (87!   %& "*/1,$1ITI60:DC848<946<<2+,,# #($  )14.,057<GXaeed^SNVcgc^_ck{mWVgrngm|wqppnjkqvrfaa`VG<9=EHD:7;B>48I[]WXac^X]a\UYbaVR\e_M>:;>AB?85:AA=@JV\TD86=?85@NQICFG=45:97>LOA0*/542.)!$0;A=98:93-+++/6:4-/43*$&.8GRPE<?C;27HSMEB@6,*+#"&.2/+.8<76ASZQ>2/0/,+*$  8JI>BS\YVX\YSTSKEM\`UJKTUOJOYa^XYbkfXPYffULP\hlkeZTRRMEGVdd^\ab\NBDRdonmqtsmqyssurj^Z\bgkosph`ainh]\erqaSTaeZKIU__VNJE@>?CDB>=@GKLKOV\[XRLHINNJJOWYY^b[KFS`[I@HSM>=LYWI;9ALQNEAEHHGOZdc\UNHHPWWSQSVWY^]SLMSUPJE?3.5CLICEKSVWWUX\YPDFVhkc]dmk[KB?;75872) #1BHE<9AJU]aa_cjkf`eotrortnikoh\Zfv}yqhb`bdbeoxukfmtsmjdWHFRcnrof`ciieblz{rknuvpnvojz|ykoul\YekaRNTWQMWfi\OP[b]RJFDHQ]hos{{rmllllid_^^[WTSPH>?HMH<58@GJG=6=QbbVNMNKGGOX]^\^dkkf^ZYWTQPNLLMRW\ab`^ZYUPIEGS\^XPKJLOQNGBCINLIIHEHPX^_bfhfa\^hu{p[PVekheiorsvxy}ztz|t~|wru||vvz}|~~~zyuttsqpmdYUSMDAED9-,41%"-) 3:/"")-,+-/* )( %(&)7HTX`my  &4ACAIUYVRQND5*&#xaRH=5,oWGEJKD6'169BS_gu+<Xw9gCez)G\gx|kK"pHg; X)rJ$m9xV2~c?'0=Sv"FmAoY2i S FRF1Qq'/.06>@9, yQ$xG[JyGZBfh5n8Z54[},@Tk8nEdw4[Dd/St*54+%+4659CHD91${lcP9/>Xjqz{z1Wklfgs?[jmlptogluoeM)k9[4V4U_(pG#cP<&'* 2Ol3\AkAd7Rp'<Q]akxyeQB2 ]A2.*%!&/2/*)+09Nn0>Qp&VCr /U(,+'0ImGf)o\F DtkO,*qg dCvjq :Vfpvut|)uOq :| }L}"_O( %;Xc)t-c z\C%pd? sJ&/Lay .ZV>kh YE}8\.^h.P'xD@dS0UZl(V( ,) ?f)Ms&Q Gv Q    ! aKC;0#uv~|y7YuAz!U?w/h6BL]p Yt2g#W T(5!^~F 0`p\$w>?fn\6%sB$*;[ e"3<DWS&,(*MomX  f+nYT`z=kwgakq{VZ\IGv2D_3PZZ\^R2k&\*v,k <q%V mvTi>1*q=8^x /\Y6bX*b/V=;PalnfVLVrrI* mC^@!rL 3c Dn"g Q>b/p(c *T>e$e8&KR!5R}xC#Lz{*99+&N|@|=}T 8RkJ IAh{]5ufS9W9+,36/hOC@J^v Ag"@d(m?} /SAn ,CSYY`s}n@.nP+|#F8)rClie9mP=.1%!$#/]=t %J2v1`}1n,H]lsrnpz ,& qM.e$|t`H/ 7O]do}7g!P8bT 2Wv7ESoc")\#QH |2a7$@pc[I%hl 0R~V%<^m:eL L.5/'#%0C]vy`G4 yW<W-jPA4(##*6BMNE9/.1\u #&)2;;3,%$6CFDB?4$ "+09@>."*?QZbq+>Rh &*3BTg&:EDDN_hhotorurfWIBJ^otmbR:iTG=5%uNqQ1uM'u]OA1 yZ;##-5673)  !:IMQVZYXWX\m(EZny+:CHOXcq     *<>4-384+(,)vtzt[B<DH?5.,(&"{zyp^H9798+ ztl`V[jtpcY[`a[SPWddRA;>8)5EXdn}'0>Qbox(:FIN\p| $/<OVI5,' Qw"4Aggp0h@,jr#\0<<.|!43bJXrpe>T*l^ D/ >~.:]_NYr9V0LBzD!SO3G|Y&7V=V*1] ?=&]>E!l0v?cs 9[&G9XP@*L PKBWxaA30q|;F (=5-k")a CN Ec6MlO2V[&a$I\'6fM`r<.(nzJYgLBn X Tlx*eX?v]5Dm j69:2re*$$Xz~1W%-m=\O 1~mM8G7N?\9.1}p v#h AT^u*|%] yB,p7<y);8Pn':_`wZ'X)D^0XW3g%/ ckK=P#{ rw H[^|#91F'z-g&n5T2>UhT { - q 2 Fg o  {  K L Zt z o  _ s k'-)]5V(Yf=SFJx~n%Ik#oAa+>p6f~N W?`f_%ilNF)nfh*=1M_hx!%j&D9-Pfa]CwP<ba>r u P c v- I  { Rb S 7 N  i  I EI&E*BiE Wb{S#o<_D5OMdlIRFfJ]mB4 >72|^l O!nAn+Nfc( r|/d-|d@^p?6 r d ) zo  D 4> L  \J4Oj[_pc8lq]~>qiUTfNtW G \<#Y,'SH1zWe&-&+ ^jM.=Gm^= ?s 2 ' 4 7 ) $ z rHzG 8 p h ' ppI2qaHh.9/U4Q?IId}qY#W{'OEg^!s%f!+4 & ^ x     a V "*pXa C W4e ^ r .e5]al FTXwa1?"wJ] w U 4 p0H  9fcf+ d+jcy\]$bm-[oHEl4M QX~mdtUXTl_ a !@ 9Z8  L _|c  e&,L"LJB\OB+c6 1^Q]W_l\b}]d/ $\! C>[tl4qf; J  C 0D [ h j MU. uZ qkU21[2|>ZM;ELjM6u)acr)+I}y~"~ 1]bhXj^VcLut,AO_|(4c~oo~xxrj" k '  ,7O.%ZmTIoP &3*0vlE!rM6cq,3 m]t{+\k13FP /"wf+~b.\+slTb*@apAZp1.8MU;y9:Ka 8 ~ # G6Dc i E    S&yh07=K8%eL"nN$pG#y,}X$fIO)T$'xN^My>/#^0a&%xu2,@`&:j92/YYT9[!,[R^AT5v Y q  w y O #tAx / o L  tY~sIRYS:Y"-hIZ2&u6 P&v`fASHoO7'tADl2Fv,51K|r3qQJtJb%GaxOX4 &#o X p A  7 H T cf, [ -   J n !2$J)mV-!5x!S(mQJ5s@QG\I X y0v{@e 7R! 3 N O Lcy o = % 2 9 $ l ! TYXd)3%2&I|AtR<]5H Pn$sU5N7^'S$A45Hby0QZW!K R E { GM^VrhZ  QD[cFr@#u# )9:Vqm9 - D ? wT  < w + :   , ! 6c h  ~0$8B^5lj5! &PjeTHrsY@]J"T$o(9/xXvL (:s"hv , u 29\>-:G+]<8S $TM%|l %/ X a .(F ) )F ? R  j O ? 7 $ _ NJ*M_?HvW~IKGs:a5e6p}N 9G!18;-omd*wjbGR66 z ^i^XY&NeP*%ywJE;~-{l{y9Ev   & < /04okO  w E S = E E sm|B2 V H]  |G-g] J cGth}E-TO aV}|E4jysi/"sdkVu\BNac$Q} pci Q$oR  Pt^je{. Vni0${Ve sr\q_)Jt./Bvtb   %?+ FD * f  7 O a pEcD ^ d B3)b(){ xV*=o Sp"tpb9k!<jzt6/b}a1@m   osl @&N)#n: *'j\$1;Bv#~dl0WoQE] B f v Y ( H Z j P [ q2rfz0Z1@=ZAcL?aBm_ C } o C AnliAXBgSKG{Cu|:i6gK:uD T n~`*A1= !aTcV:%dM5qU7<\P {<AteF M W;c@T`{- ! c ``oun]@"7uMJPhS%e'8 })f=R]Ga ,'}Jr#tfpy&xmd'+lb>R'l>N_16L wI_iR8,X0T%-t|)tiK !{@n% Db~1:eYK0 K L  ' r  / N $iqMa{qAYSz86H  [3ii/|U\=^z*r]bVk.(V&Vm"{fO]G9HD*@7Z} *Oi8d&q-^aaS&7zU+F,;my8 AI` % 0 r SI_Y'|   w # M 9Ylf7X }mxrrJ==_ &vI5  j A Y=q.#w]meWtX. ~I2xX KZ- t ? TH .8QwxXOd3mS1GA'o^ -s Tl+i<z Qf1  a ^ z H _ MIu\L3OJ{=G[/:?tc4 >G5qe }&r&YG_o~`3xFC'p[m,zhiI)/;8}la#EZ=RE:\:e0J*[]!h(r1]P[uYi + ^ F  U*"A2$_=P.#$Z{V@j&j/U( l))Q';(` M\`Si1'\/]d+6{1#=,G.+dh@3QmF".uMJZ3{Usy k|'GVrg7P$jYC#oty + ~!Cxo(y - gg 4 z  nSD%W0N?P16N%/TbMN c ha?yWVb4l]IqP},G\Q/5:L9a(9^1MDl}0!Htp~W{V}-@>>bO#7)bX\j7D #GB}5mX tl@1O,J   a u:ry=v0 u:-"T Y; u,edo!k+Ieh+ tuuvtCM)_*}`M3a"-P f4yY8D4?6Y+Y0~F9K(8trop\t[f!$vK>UMYPjqy8 c . M g q J m No%,uDT5Zp/J>.. MXG[_)*61A*L$$wnyd(S,O(\c-OM*/9 cg! r!=@ }C@/<{):mia.C:V1drWz|!a8%b413P3OsaK-& + u { - < + U _ ` c0rA:6s{rhhxvO`9hd&en![N.QszFrj{[,n1!^M~WwCrb+6RfH*q&kyolQPlyd E YZ.UJ{0`| m e N.SK c  V 5 4 %DuytU.)) @O 5.yh&sim[DcV>,bEppi\/4,As $Q7Hl oQ@:;0lK_w_Wz*b*^PlM^z|RQr}b]"%g|] 3OB' G -  !(F    k  y ! c']Hvx8q2fV PL*~nl,{+Ua3 !"BP+ Q'1ehp]4^qh[ \zKMHPvhiLD2)5W$ !f8q xw= 7=wK}~T| K u5  7 E L 2   s)N+ 1*/-V|\Rs\UfI[U*zr_,1:^B}p:c^M*slf^[ 5 1).C0+DPaZY^7wioA3%%_z4A=c (9A:-*qMaW__9lOyxrh4 iF4_tp\^}GBp2:vSrq ^ \  8 f \;  N  B < BK07O( ;|RE6&HR%e+Y;OM.yU3s/fRze;5d-D]o#HHs5}j^q>T; 8$6pyBR-SoB-?N> t q9,_ 7QwqGw;[#X:  \  i==KI0 / A Q < q9C7O"iR0[5``xZAZe^ m+L_T\1[_l'&z!+Un_ ./n=Z:ANGnhHmx _~:XGz~O9l18nn^k.R!C bt~a? < y @ RY V > _ Y z u044BqU ?DaL/m].gyn 3\F!QFMjM]GTe](B'j(\xNe)dINe1A^ LNHV'S/:E$ 9 J*V`J[B';P\i#i!G\> j G sZ_Z F  \ }~ggCUWdGmGCaOc%Ea?Q+*k$s=C1-Rb?6IcqIF > !Z9U\+q@F,HiI[h[dx3,i\}(tQ2v:f,8L,,Z)4FLv.hoJ-Q'Z{?c  OQ(79L C ~ r  < ^~l: a"Z%0$Ws ,[ p0>qb)kg~M w*gKZu] 1q~wssEB\To{;Mi4lWSp6=Ij{2'j4YnYmEG!C&R Dkkj3F,R z !>j. V <V(GmqN f \J.F$K gdQr-xd-? 0\\06Z P9T>ojy sW\,#b>Tf2O_8([1V&l2If Q%w]6*UO\yaAB .:$w|yYe_ xDLjA&"0EYj X  ]jQ%[ 6?c!@PM4LQd|C^KW.W .W`LlCv0#[@K!.p![3{V9R'Kt|}-B`*'#+r:zaM+qE}Sb:lzq0^(Ou3 S  8dqFq>&MYR7 p uMB&^lX"hy?/ ](}g|-"jym1DRzBi*ns8 g&EAh(z#|t-#|LyN\y#( J Y^'A%r :`)3{~H:zm]_fi h t : b N F V E9N|UQ}/Z/KV*0k*eT~e{$_0f]6!! JmGw'""8^CTbVAVKvF7B1n,Ls-7_]}EQiIpU'JU yjq-:f"n^{L]A)| N C i='UTg-c~>~U==0z q z W  { ksMWh> jxZ^&TnKOdUb2(n]dfRd(E-iI0&C"(8GKSw5 --R[`eW2M&jEm]{N+*873fDg'i 6'Ms8sc&X5>r}10U b`|2%hW d 5 l  f  [dxj@u9Cr 4 x hChxXqY%Ssz[ c|7gRZ(T27m`J] /D*d=$oiKTDt9H  9ph&<Ti'v["vh[&pM4@"BK?'$Gc_2h')8yxmf,0b}5sI>bj q@S?{IvM:95'3or  ixRF73\I"UtoM[7n1#"  Jvf.v d?46=IZl|1wYbCbtP.#pP1le+^,Bm =Z^0YS!yp#=,{cfpmW@>Sw- yEPaQD(jmN=6;OsPUL&Hn3b6I> ;J'O1C{X8n}j,e }#~?lzoR&:A8-*:aAdr*3^-Vm2 &T 0ADDRvwLE0DLXw>OKuA:Ykxn!Cfa~4L DLJ MljG#d (-8NqyVnN !52 Lzzk7QvD4/"'Qxugfxp4OQ9 ^KLN@#AJV@:D^&h 9nO}$Dk .\K3Zz;| L=dp.9#eI)vj`D P.  p"(&Mrr]6 +?B6d[ldzy$R|wM ! )^ $/>[HoF[:6P0qg2  !C^yY&CJ#.Qwk/SlwvpfXLPeQ"i+VkcWa6r/=KU[m_!S@w  :: `~'E iwp ? X$J QMnR;QG5'(And&Nm%54i2.W}.%~;;3p(Mp)<L0s8KZ1I.p`Raudio-0.7.2/test/torchaudio_unittest/assets/vad-go-stereo-44100.wav000066400000000000000000005225301376444676100250740ustar00rootroot00000000000000RIFFPWAVEfmt Ddata, 5Nahe[RPTY][XX\aed]VRRVZ]^`a_[UQPRVXYVVZ`innkhgijjhgjosrkebhs}xldbfhd[TRW_bZOEFP_mssppt|}tjc^aceeeehknosux|~}{vqle_]\]^\Z[aktxxsopruvvtqmjc[SKHHKPSRKEAFQ^fd]TPQRROLMQX\\\\]]]]am{vnpw||ulfgkooic]YURQRYaeaVH=:;=8/#(..,+-048988899:=?@@=:9>FPVWSPQV^cc^RH@;8679>DHHIKPTUQLIKOUURLD;4.+-/0.**2;B?4($/?PVRKILSWWTPOQOLJKQZcfc\USSVVRKFEIPVUPE=89=ADDB?<<>CHJID@?CIOPLJKNSWXURPMKIJMQSQNKLRTOB84=HNKDBKYedWIBFNROGCFMOKB;:BKQNG=6347=@B>7/&!"+7?A=68AO[_]WUX\^]YXZ[YVSTX_a]WW]jxymb[Z[^ciptskc`gr~~z{wsv|{vxuf^bnxzsjcelv|~|yx|yy|{tkddde_XTYeqyytqpomg`XSOOQQQNIB@EScmmdWOTaoxysj^TLKS`koh^VX`d`SD<?FMQOMLLKJGFEB>957;AGMV^dbZQJIIHB<;=@@<524:<9426AMSQMILVbpwyshZQOT\_\OB:9@HPVZ_bb`\Y[bjooi_ULIIMNNKGGKQY_ekptvusplgb^]_`\SF@ALVZWRSY_^UKHTfx~wmfir|{wsqrv}|}|}vicekrspmlpsspjhijf^URT[^]XY`jppf_`juxmYHAFSaggegoyzx}~zy}}urtz}{||vssuwuph^VOIFHNSWZ\^_][Z]dkoj`VQT]bc^YVXYXURQU[_a\VNFCDJPRK;) *6;5+%'.79536<CC<2++08<<:62,'$$&($&4<><:>CD</$#'.10/2:BB>99BNTUQPT\beda_`__aekooh^WVY]^\[[_a_[VVZbimqrusle_^dnuurprxzuhZOMSYYSGA@CHJIGEGKOV[^`^_`djnnkils|ztsrqpru|wkb`cge`YX]hookghnsuqidekpstvvung_^ajptvvvvtuxwu~yvw~{wrmmqw~}zxxwtppsy~{xwvqeWMNWbd_TMMQURLJMU]`^YUUWWXY[agkjf^TMLRZ`b_^bku|{vppswvqjfddaZMB:8<CLSYZVOLNUZWM=318@CA<9?JPPIA@GOPJ>64793/2@Wjpi]V]lzzpd_dotocUPS]dhihec`_aege\SMQ\home]^cjibXRTY^[THBCLXdlqqoidbfmv|}xpg_ZY_hsxxtnknu}~wj_\ajrrmjox}o]OR`qxteWPOPPPQYcihb[Z]a`WK>669?FJKJIKOUWTLD?BFJJHGJQW[XSPPRWZ[[[]``]VMC:547>GPX_`a_^\\]^[VOF@=>ABCFLU\\UJ?;;@CDA:5.*&&,4:92( !%$!!&**&!"%$$#"# #&))*'! $%!&/6::888<@CDEDBBC@<60,,,(!%,,'"  " .5.  !&'&&$!$)&*56."$+...-..,*),4=@=3' !%*+(%%&'$  '.540+)-4<AA@=>AFLPQNIA:68=FOUVSMIHILOLHA<:?IS[]][[\]]ZVTQRTVVXYZ[^__`_^^^^\[\_dfe_YUTVVUUW]de_SHEM\ikaRHHS`fbVJB>>=:66:?FIGCCEHLMLKKKLMMNOQRRRPMLKMPTUTOHC>>?@@?<:9;AFIID?<98776679941..4<DGE>724;DLONMNSWYZWSOJGGLU_ebXLGKVchga][ZXRJFEIMNMJKOUZ]\[]bec[UTYbig`XSSTRLILSYZVSRWZXMC=>DD=2(##$# "'-/-+,2:?>;9>CGKLOSWZYYZ]`_]Z[ahllf_ZXY]adeefjpuytojhkokbWOOV`joomlnv{{|~}yutx~z||yrpr|~~~}~vqsz}vpmg_SKJTclj_QLMUWPE>@M[egfiny|ysja^bmw{ysppqpj]OHHQ[bec^ZVWX\`eijie_ZSQQTY^ca[UOPU`mtxwusqnjhgiifb`airxzyxwtmc]Z_dea[Y\fnqsuzwu{{x{~zsme`blxtlpzwrwo^UX`d`YRPQUTTUVXYXZbinmgccjqurniijmliecafnzzuw}}wnhgp{tjgioqomnt|}xtu{xxxs|vrw}xy}}}wlfjs|}vleccca``bdd`\YWTSRTX\`a^\\`jw{tptxwtolmkbSD?H[kpmfdiswwrrtwyurry}wv}vikwyx|{tnkkmtz{|wnnw~zsu}}{}|{|xrmmooh_VSX`fhfgjoqpkjmvzrjb\XV[eossmggltywphhrzkfjqtssv}y{|uljlt|}||zzyy{ytlecdfec__ce`SE?CQ\_WNKPX_`ZX]htyulgiqy|xneacfgc\UNMPW_eikjggikjihhlt{~|||}}wphcabdddfec_YX]hpslc[Zajpqpnopojd`afkmnouz}}xrmmqtsmd\Y[aegb]WXYYYWVW\adfglswyyz{pdYUX`ioplgemvzpknu{uojghmv~ztu}}xw~zy{{yusstutngcaacgklf^YX_kssokmv|yxuspqtuqeYSRUWY]htzqqy|xxxpf_co|wiacltqe[VZ]XK<5:DLLE<=GU_`[USV\]XSQYeqyzxuuwwxvvwwvqidbdggbZQOS^kuz{xvuvwyyzyyyyxvvz~wrqqqld[VTW[^`_\YUSRRSTUTSSRRUW\cikhd^Z\dmv{}yusw}~th^YY^entz|yph`ZXWWVUSPLFBBEIJGC@AFMMH@9:>DD?60/38960,,4<DHGGJQZ`b`^_`cehnwzi[UZdkjd^]^]UMDCGPVZZZXUQNPW_dd`]]biljdZQIEBAA@?@>>=<<;<<83/,,,,+0;HOI6 $:EHGGMUYWN@0  &,.,0:IQJ5 ";JJ=,  '+'$(*'!.=B8%6Ww}wvqgWB.   1ALQNGBGUhvysjdcimk_I2 $'# 2ESWQE6&$2AQ]^VI<9>HRSL?/!&+*%%4>>5$ !)*'#+01./05:<=>@HR_jtzzvoigmu{{wqoonh[OJO\fg]NBAGPZdruk`UPOW_b`YPKKNSXYVMD@BLVXPC;;FT_a^[YWVWW[aca_^bhrytdWRTWVMFFP]aXE4.7FT^bir{}tkgjry~xvx{|xncZVVZ_cb]WPNPSUSNIFGMQUURMIEHNTY]ahqsnaSHFJKG>64=IV^ab```dimmjecis{zpaWX_inpmkigbZTSUYZULD>?DHIFC@@FMSUTOJILQTWVTUVWWUSV_lvxp_PIJMLB5.0:GNNHB@@>:2+),3:>=9536:@BA<;:960*,1<FJKKNRSOD=>GT[TD5-1:BD@::=CHLRY`ee`[Y]cihaWOLOTUSKGGMTUQIBAHRXZXRNORXZ[\]`gknlgaZZ]afilorvz}}}zqg]Y^ju{xoebciqx~zvy{x}meekrw~}tpruusqrv{|{yy{|}}i]\hv{xmfhqz~ytpsz|rha]_dlsspjfhnsutsruvtleciryzvqorutog`\YZ[_cfecbgt{vw{~zmaY\dklhehowyuqmptuoe[TTX]bfhgdeku}}s`OHO\ktupic^\\_``^]airxxtqt{|wx~}vqrx|wuwxwuojilry{yuw{mjnpme]\ckmjechr{yoe[RLIIJMPRQLHGN\n{~}sljosx|{vty~|||zxwvtsw}zwuuurojilt~zmdacfd^[\epyynggoz}uu|wsvyxrjiq|weUQ[iroe]\akoonosy||xutppkhfeeca`acfikmnjgdcbdeecccb^WPLMQUWXWXZ\]\\XSIB@ER^dea][YUNHFHNRPH?73101244446;??<4-,2:AB?:9>ENRTTTTTRNHDEILLHCBDJKF9+$*7HUZXTOJGFFFECBBBBA@?@CHLORTZbinpmga]ZYXYXUUW[__&[CYYXf\ed^jViSbTVXLYGYEXFZG]IaLbPaV]YZ\X\VaUgUnXu]za}b`\V|SvQqRqStTtVpVeXZ[S^SbWgZlZnVlSiQgPgMiHiFiFjMmVoYrUoLiJdQdbltw~{}tsmimcrdyg|hybsXoQmSpZq`ranXkLfDbH_U^e`q_t`r^n[pXwZ~^bzbp^fV`Q`PbUb\cbdfdigljmmpoqpqspwpzr}u}w{yx|tpjc][[^][Z]dovywq~nxorsnwozrwtqrlkjdf^c_[bPfFgCeF`NZVUWRPTFZ@a@lLsZuemfa`WXWQaOtPQQONOQW[_``[YY^ivvmmpzxu~suxy}vrmkhijkie]UO{NnTgZk`xc_XOF@z<~972+#&-10-|,}/59:y9p8k9k9q:u;w=u?qBnBm>m9j8f=dIdWh]lZmQlKkOmYodqhlbeW[KWBV>X<X:O7A74</B2G:HEHLIMLNQNUPSSPXK]JaMbSaW_U^O`Gd?j8l2n.m+j*i,g/h0m0q/u2w8r=h<^6T,N)M/K@IPFXCUBLAFAICRDYEZFUGOIMKMKOJOGLFKEQKZTd]ifcgZcS[PWSXX^XcSfJdD`D\JYRTWNUILG@J9O8V;X@YCYD\CaAb?`=Z=W?[DgJtL}J}Dv?o>oDtL{QPKHJPVYX{TtQqMpJoImIjLjPmSqPrMpKkNeSdUiPoEu9x6x=yF|KIDCIU`aZPIFILMLIHHHHGEA@AGNOI>2.1:AD@93+%&3=@=88>GRY]][YXXY~\x]t]p[pYqUuUyV}Y~]~_}]}ZVZdpz|uomoux|zuogb}^s^ga`c\dZc[`^^e_mbucwbp\fW`TcTmVyYVOIFIOTRL~D}@@A}ByCvCyG}JML{HxDzDLV\z]lWaR`QhTsXzVyNoEd@aBgIsO~QIA}:9BNVZWOEAB}EwJtHyFCBEIMOQSUVSNIH}IyKsJmIiJhQfZda__YSVDX:_9i>sCxBy9w.s*n/k:gBcB_8Y,S%M'L.O7R;T=P<F>>?=BHB\=l8p3i3[4R6R7\7h7r:v>wDrGiG[BM;H7L6[8i;o:j3`)XY_da&X0J7A;@9B3G,M%O!Q"P&M*J-G/H1J3I9F=?<:8607-:/=3A7H7Q4[2c4c<]BTBN:L,KHC><=(@.>1</7)6!7;; 7#3&1'5'=)G)M(P$N"L#K)Q1\:h>r?x<v7n2b+W%QQW]"]-X8K??A8;93@*L%U$[+]5_<`=a:a3_0[/\1a/j)q ogZN%K,K/L0N1K4J;JBJGLDM?P8W8b=lErLrRpSqRsOvKtGlCa@Z>\<b=f@bBUEHEAAA:I5Q6U=UJUVXZ[V\PZLURPaMoRx\tiis_x\wcqplzlqyvpvmnplwr|~v~qzq|txwroqwxp~d~\_kw|v}mjrwu|k`akttnikrxvn~fvfqlqpplsawT~OS\a|_sXpVs[xezoxrsksby_eowtfwStDtAwJ{Y}d~g}eydvhsurtx}~yy~}~}|||}wphdfilkcTF@DN~UwRtEv8y0|/{3{5{1~*$!#'+-,)&$)3>FGvCp<q9x={GxRqXhX`T\QVLNKGMFQJTPXVYX\Z_\d^g_h^a[TZE];f=pGpSh[Y[PTQLYIcKeM_OWLTEW>\9];WCPMMWQ[YXaQcJ_HXKPNJRESDQHLMGR?N6C03-$0 8&B0J7M7I0B*8(,+!034"6.88<=>===;<7@5C2C0A0@2D9N?Z?c:d-]#T N%N*R+T&TOKI$O/X7_9a:`=_AaDhBq<w4w-w(w)|*+-0y5m:a=[?Z=[;^<`?aFbN`S^U\S\R_TbZbc^hWgObH\FZD^FcIiNkPkNjIhDdG_PZ]WiWo[n]l^i^j\k]k^j\j[mXrWu[ucqkkrfubu_q[mZg^dgaocuhqnhr`s^rcslvuxxvupockXlOmNmRfVZVKR?H9A8>;B>G@LCMGIPE[CdIkSm\k`h`g\g\m^sdzj~m|muiohjilqr{vtldz`ubtfvgucr^n[o`wjrr~krbe_]damfuiwdt[pUpXtbxmyqvnphlgljppuuxtznwhsdoemkoquvyxzwwsqnnjmfkdhbacWfMmGuD|D}DvBoAmCtIRWZZ\ybwj{noi`]akx}umhd_^_dhhd\WWZ]]XTRxStQyH;36CVb_RB:>IN|OxLsJoLmOpQuQ{OOPSSTTUUQKB=<AHGC=777752.++,2:?}@y>w6w/v+s+q.q/u2z6<CJMNN~NxLwJvEuCnDaJSRKWPYZWdVfW^YSZJXLTPPTPROONLHNAV<\;^?\BXAV8W.Y'X)Y1Y9\<b:j1m)k&a*V3N:L?PAYB^C_B]B]>_<h<q>x?y=v6s+t$u$v-t9oBkEjEkEhJbQZYO[GVBQ=O<T>_DhMiV`[UXLSKNMMORNYHXGQLEV9a4c5_;[@[@c=k<l=eDZLUOXLcEkAlCdHZOSNRGT=U5T3V5\6d3j0k7cH\]Ym\pcfgZfXcb^r^|`xbk`_Z_QhJrHsJkM\SQTPSVP`NgQiVh^fecgag^d^ab_g^g`bcYgOkOnVrcvl|mia^`dhg`XSUY{\z[yQ{Fz?{D}O~_~lzptpqmuj~hgfh{mpup}{~ymbYWZcnvzxqklrzzoydv_tarhqmonqktjym}w~}ztwbxV|S\ittk^TRQQNMS]hmh\UV_gdT@21;EHGBCJPUUQNLKzHwEvCsBoDkHjKmMrOtRsVlWdU_T_QfQoTtXt[n\f]_]]_]^\\YYTSOKQA[8g1q2t9sDpPrWxZ\\^{`p`k`m^s\|YWSLxFq@i<c;b=dAhGlMmRmWiXgUcP_GZ@W<W;Y>^BaCaBa<`2b*g#j%i*f3`9]9]3`+c$d!c"d#e#d!`YRPTZadd#c%b(a(`&_#`acca]!X%U(V&W#V"T QQRTRNIE!E#G%I(L,N,N'OPNNM$M)N%QSVX!\,^5^8[8X7U8R<Q<P=N>KAHDFFHELCQ@W?Z>W;R5L0E+?):(6&4"48<?$?,<.8(7 ;AGHD@? B I ORQNKN V cpv$u#mb[ Y^)d7h8i&b XK?;>GO PH;46@OVVSPSY"`&`)\+W%UWZZWQN$N%O!ONLJ!J,L3N5P,P!POOMJ&G-F1G1J/M,R+X*]+`,_.Z1T6Q:U<_9i1o'l!d!Z$T)U+V)V'Q%J&I%S#h"*|2m5h3m-v)}+}2z9y>{@@?@@~CxFwKyP}R}P|H{>w6q4i9fCfLiSnUqSlQeL_J_IbJeKaL[KTGT@\;h;qApLdWX^O_M]P[TZT\R[S[YXaViRkRfS`SYTZT`VeZe]]_R_K_L^Q^W`YaSaN_M[TY`Zk^mche`f]b`^fYhUhSeSdUjVrYv[o_``O`CYBOHJQJVSU_QhOgR\WPXHVKQVMaLdO_RRQHJAA>9<9:?9E6H7F<CAAFEGKFQESFRHOJOKQLWM\L[KVKPKNMUMaOoPwRtSjS_R[N`JmIyLOTzUySxOyLyFxBz>~=>?|@x?w<|98=DrIfI_Fb@g<j;h;b:^7\5[4Z6X8Y;_9f3j.c+V.J7G@OH]HgBf8[2R2S9]AjHsLsKkL_MWRRVRYTYXW`TiRnNnJhH`I\O\Z_a_cY^OTFLAJCPJZOdPgOeMaN\PZNXFVBOCGND_EkKlPaPPMCIDKPQ\X_\V[JZD[K`ZfhfkafW[RWUW^]gai_c\ZYT]ScUlUpQqKpIlMfTaZ[ZYV]RcRjVqWtUwM|C<=@B>3w)uy$'((o)e*`-b0g3k5m8r;y=>??{BwGvL|PRSUWZ]{]w^s]p[r[w]}`eh{jxiucu]xYyX~Y^adeehmsvzvsrqmvj~jl}mthn`nUtN{P}Xudknhqloxmlr}yuoqvz|{zyyxxz}xojlt|}vlecdhjie`^[[XVTSSSROMKIGGGIOW_ffd_[YZ\^_acfjkmlmlifddddfkq{}}{{rjc`bis}~~|ti~a{^yaxexgwg{feiox|yzxolmt~w~wr~k|gwdscp_t[USQNJC~A~ENTVR}O|NRTSNGCHOUXX}SQPQRUZakqwyxsmhfglnje`aiqtqlzjtmtuxx~uk`Y|VwVqSjNbKWMOVL^Ra\]fZhYc_ZgQjQgT`T\P_HhApBtInTb]YbVe[icoiun{r~uxzz|wuskqesbudvirnkudx\xYw[rbmilnkrfr^rQsGsFmNe]\iTjTc\YdTkTnXl]k_nbrcxhwkqihd_\]TbRnSzUXZ^}`}`\UNOvViebrbzmz{vqonoymvlxgedczcpehhiltqvz||}x{o{ey]o[c]UcRfYfcakZjZd]\e[oftuvx{|{~uu~|ytqp}pwoxl}ihlqzwuxptknelbofun{{~xqpu{zndabghfeirz|ukb`{_p^pZwWX_{ftjud|ZTVy`hmZvUvYo`dc]aYZYR\N`OhQnVqXuZsXpUjTeXd_hhlmplrhsdsdugvmwswtxrymjhg~irkfkbgdai`ieft_]bgnzotlvf~b`]YVTUW[\\YWVVZ_dd_XTW`ksvuvx{ysniggd\UzTsYjeerkwwuqmnzvoijn}otnllimoqwy|zozbvWtRwS~WYXRJC?>>>>?BKVclmg]URRRQNPXeryyusru|wuojedfijkklprtv~vtuwuqj`V~SrWuds~||tunwm~npq~o{l{hbYR|P|SWYU{Jn@h<i>pDxJzNxPrQlQgQcN`K^J`JcLfNeNbO^Q[T[V[TYPTKPLQLUM\Ga>a5^4[;ZF^OfPpL}HLWexoqtsuvsvpulpen^oYpYh_ZfHi>hAcS^e]oamdffdbi[qStQsUq\qcvb{ZzMuDoDnHwMMKHHNX\ZzSsMuMTajp}nkhg^qTLJKRW~XzTyO}JHIIJILPUyVrUkQgMjNpRxY~]\XUTZdntrnh|gyi~lppqu|}ox`mUlPuNNNMNyP~PNLMSY~_`[TPyRpUrZ~[ZWXz\z`dgj~kyoytxzz{yyywrlfehpz}ukcaflpm|hvcpbnhnmnrlrdl[fUbWc[ebifgh`gWhOmNpUr\pckck[oSxNNU\x`k`b^]\Z[Y[[]_^g_p`saqalagbgbo`w^zZtWlWfWkWyTOGDEsIjOhRlPpJqErCuE|HJD:3|1|7BJKD;8=DKLHCCDGHGIOXblruwxxy{}ztkcv\mWhVlVsV{VVX}[{_|`~_~[zVwVwWyY|ZzYrWiXc\c_fcgceb__]_`bedef\eMd@d>eIfWf_g]hSjLiLeT]\T]N[NXT[[d]pZuQtLoLkSk[nbuewcwbscnehgdjakcndpbr]uTvMyJ~P[ejjgfgjlkhfhmrxz||}}|~w}vzzt{m{fxav`ubye|e|ewcpbi`f]gZm[tb{i~p{ptjm`kZn\teymwrrqlnhlinmqoorivbz^~`}gvnorlqnqts{x|~}{xvrumwl}ptsk~`sXlWj\odviygw`rYpUqXt\v[vXwU}SW^ehyhqhqlzsy|{{yrru~xxuwtlx`VT[emq~mxgoeihirp{{|{tln^mXsZ|cji|cv\r[m_jfhhjfp`y\\azeugvedelw~~~ti`]`gjkihijjjjheb^]]ZVPIJR\a]SLO[h~kyey_dy~m|Ay#vu$u/u3w3v8sJngiecbzbte{ik|h_a:[(X>]weopoWjlr}E]~q}|zvqnqtsrn^bFX5R.Q4UBXP]_cony~|urwyphhzpx}xtwkaaKbBiKvav|r~f}bgmpkdcE[7[B[[YpQmDV;>79=MFlKJxBY=9@.J=WTa_bV]AU4R7TGZU]RY?T-S)Z8hOu_|]|SxItJuSx[yWxGu4v+v4xIsampfrbmdhghhkcj\aUNR;T/Y1b;kGvH|@}4y.u3s?tKyM}F}?zCxSxhzrzmyVv>w/|1;CB:y3u5sCsVqdlhgdbb^bXfUjUkYh_dd`d\\YTXOXO_SlWWTQQRTTTUY}`sfmjnitgza}]xZn^ggeqjyr~yz{wytuurzqsw{y~p~fz\uXqYoaplrurxrwpuqttpuip`dVVQKSKYV[gYuQ}IE|ExFtGnHhGfGhFnEuBtCkF[KMLEHG>J7M8J>FEAFC>J2R-Z/`6c;f:b4[,N*B/=8AAKFWH[HUKKMCTE[P_\b_aU`D_6`6bBfPkUrL|>8=uJdRWKT6[!hol.b8Z6X-[$\&V-K3B.A"IT[ \,Z/X)W#U$R0N@PLXMbFhAf@_EYI[KcHlEpDkG`JTIKFHFFHDPBW@Y>S=N=M=U>a>j>m<h:b9^9^8`5_0[,Z'^(f,n1r8o@eHWIMAG-DDEIM,Q?RGOGKDJILRPXPYJS=H1:,+.7> @=<,=1E/L,M2J@BP=S?EG)OS PK0IDNKXCc4g&gc_[YY[`i(q,v&un i jq{+0x,k!_\`gl*l5g<b;^1^"_\W#S?MdIDBBDIM{PxPsQkT`YO]<Z(OB;<FMPH<3038952&297I=Q?N>H;B7D6N8_;n:u8u4o5i;eFeRh[i\fXYUDX+^ee\ PGJUeo$t(q%onmg$\:QOMXRV]Kd=d0Z$PLKL'I:EL>X=\?XCMDBD=D?EEHLJPHNDGA;C,GLMKHG$J,M-N'M JGFINTV(T5K@A?:38= CFED,D.H*MLGAAE O%V+U.O/L/N0X2a7e:d<b>b>hBpKvYxgwpuvuwtuwsyo~kjntzw{nyitjooluhw`xXtOoMgS_^[fZe]ZaKc@b?]HVTSbRmSwUUSQML|OnTb][aWaTZTSVLZL`PaU[VQTGPELLMWQ_V]]RbDc=aA^K[U\V^QcGe@d?`C[KXUY]_agam\nViQaS[X[]aaian^l^f`bddgljupzywtrwz|iz[pU`WVXUU\NaG]GTNJWI]QZ\Od@e5c3b9dGiUjbgkaq_wbyj{pxqtkmej]kXqVyWZ^`a_^y^v`vaz_{XyQsOiR`YY\WZXR[I`DcCaD[DTENHNNQVU[V\QVKOFHFBJ=O8U6V9TDOQJ\E^FXJQROXS\]_cccj\qQtKmI]IMHDDE=J9L:G?;H2L4K@DP;\4a0`0_4_7a<c>e<i5k,l$j"e)e1j8t9z0y$m^V%W.a2m-r&o"j(f5gAeIbFZ>T6T2W4[;XAODFF@E@DECHCHCDEAIBNDPHPJOLPNRRWTZRYNVJRJPOTVYZ\Y[VTSNTMVTX\VeUkXlbgoayZxTkMZHLDHDJEMIHN>T2[-`2b>cJ`O\MYFXAX?W?U=Q7M/I)H)I.L6M>O?N<L7I3H3I9L?NBP?O<O:Q;W<\;\4W-P(N,P6VBVJOKDK;K9P?SHRLJIBB=;B6N2W-X&M >#2//>4L=PBMAG=F;K<WAcEjIlMiSf\feigldo\kVcW^_]ifnphw[uNjJ_NZT\W^T^L\FZG_LhSpTrRmKfEcDiFoMpUlYfYeUkQtNyOyUrZn[nZnZo^mellkpkmigda`^`^d]l^r_rdojjphtkultlxm|qx~x}jt_hYa]`fcofwgxiulnsgwaubrirs|}yxyoyu}}{x|kefkrzvjdxepmntszw|w{sxowpzy|w}unx^~TONQUY_bb`[VVw[c`Yf^hmj|j~jtfgabbiewmw{v{numpunnlkwlmoex__agnsrmhfjptvutvtktbsZnQiGfAg?mDsMwWw]vcshroqupypymvhxa~ZUW\}cqhgghan^wbzlx{rmjg]L7%~y'w0z4{3z/t0h9_C]M`RePiMiLgMhOkPqPtQvTsZr_rcs`t\pXjWa\Z`TcUeXf_hdifhgfe_f[iYqZxZ|WwPkG[?N<K>PB_EnGwHwIpKeO]W[b\l_taw_s\f\X`NfMnTs`tguft^vUyP}T[_^~X|Q|N~NOMHDDKT]y^uVqIu>|;DR_hkiizjumtoxoynzottlyg}g}o}x}ztszskk}n{pkc^]dknlhdir|v~jn_aV\P]LaIdHgKkOsQQMHGKWdqz{~~sovqmvvpm{nrqpuxy}~yyxvynvhueygq{|ups}}|vx~}|xtqnns{}tkinxzy|}zsoqz}~ytsvxxrjfiq|~|yqq{wmd`bc|b{`]`gq{|wy}rzkthnlivi|ipx~x|otgs_zZYZZ\z[u\w`zezjrjlgidpbyc~bz\lT]MUJYPcXl]n^i^d_^d^kcoimngocpepntxy}~{{wuumzk}lm}mwhqcm`j`gcfejeqdzdf}lwopnpjve~cdyenfcd]aXbTdPdM`OZWR_NaO]RTTNUPVWX^Z]ZVYRYRZ\]h^rZuPuCw=}CN\bc`^^^YOHEHORPKD=7~3z/x.t1v4|6423w7r?oCq@p7j-`*V-R8UA]D`B_:Z6Y9^@jJuRzVwUtQrQrRuUxTwNvFtAqAkGcL^P]LcEnAvByGwHtDr8r+o$h*_9YM\\e_mYmOcGQECG@JHJWEcAg@dA`D`EgBo>s<o>gCcIeKoK|MPWa~g~kmmk|gtap[rYvXvXrXjUeTeVl[u`|a\VU[cjic[RLHECE~K|R}VWVX^fmswz~}wsrtu|pwho_iXkWoVsVsVoVnVrW{SOGyDlGfNiTqVtSoLbKWPS]Zleujydw[sPpKqLtNwOxNwMuQqZo_man]pWoSkUf]_d[i[h`db_b\^]X^V^Y]_\e^dd[kQsKwOwYvcugxg~ehou|vyrwlvkvpuww||}}}}w}uxwnmrwxqidbcddcbcb\U|OrQr\zhsvqzfnZfUf\jlh}e`^_a|aaeimjaXRT\dxflcj]o\x`}e~f~d~_~\\_bfilpqplgfgwjindrmsqkaWQxOyOPOMPYgsxunjj{qyx~~xvrnnjlmmrpvrxsuqqnnkkjihgffah^h\i[jYhTiPlQrXu`rege\]VUVQ[T]ZV^F^8^0a2g:mArEpInLnPtR~TRT[ehe]X[gqtqjdfjnpqrtp}fw[tQuM{LLJD|?l?bBaFjFvC}A~CxIvMvNyJyEtCmDhJgQhYhafefeibs[XY^{duevd~_[VQJGHLS~WXWY]ce^WV]lz{{s}npv|~z}xzvxrtjpajZgViToVtXtYpYiYdXcXi[o\s]uYuSuNzKNQRPOOQUSOF?:=CJOTURJ>0$ !$(*)).6DOWYTNHFINTWYWUX]bge_WTU]ekou|xtrrss~uw{|}|tolmr|zxt}mtfie`k\x_df}eu_t\y]`ccyas]qXuVuVpYfZ_WaRkKvGzGuLlQhRjNpGsCm@cB\B\BaAfCdG]MVOTKZDbBgGgQc[^_[[[TYPURPUMWQSWK]Ba@^DYKUQSOUGY=[8[<WGOSHZCXDQHIOFUDXFUGOEIECE?F<G9H5I2K3O6T>XJWURaNhJiJeJaJ\H[H[K_O`X_^[_SXKLFAF;I;M@OBL=D5<,6+639>>E?@;43(+#)))3-;0=2:3:6=7B:E;B9;453132647657290:5=??HBKEEF;C6=97F3T5\9Z:Q4I(GLVbh-l7m;o9t4y.|)z%s#k%d'b(d+h.l3m9k>f<_8X1P.J/H4H7K6N3R0T4S;OAICC=A2C%GKID?!>*E1M1R,Q$H >9>I"U$](]+X+N(G$E!E"H'J.J4I9I<L?S?[:b1c'^QHDJ(X1h9r?rAl9b0Y&R#M'F0C8D<J;T7\4^2X1M/F*G#NTRL D(B,H0S2Y3Y7P>FD@F>B?;>7:96A0J/P.R0P4N9N?MEIIBL;O8S;Y?\D]F[DW@U=P9J8B:;B;LBUOXZT^O[NUWUgYt]x]qXdP\M^PiWtY|SG:348:z8o3l.q.x1}6~=zEuMqQsRsQuPtPtRtTuUtUpQiLcIbHfInHuIvIsIoGpBx:3+'$w#u |  |r o#p#u"y{ ~#)-+}&u#p$q+w4{9z<w:u7y89=@G}MsRpQuK{A61|1y4w4u0t+r(t(x,~./-,/3}5}4.+-5@HHB6*"~ !}!s j g'f1h:l=l8f/Z)M,E8DHJTPWQPKEA:722.1,1+1*.+*.%/"1"2&7,9/<.@(E#L$R+V9SEMJFDC<D8H:LDNNPTVV^UfSjPfL\KQMIQCW?Z:[5]0_+f(i'g'\*K/<190B,O'Y&[*V/O2K0L'N PM H%A(<%:">%H-R7Z?[AU>M;H>HINTSZUWSMNCH>C><@5D/E.G2L<TEZKZLVHP?O3T']bb]&V3U=V@W=S<K<@?<D<D>C>A;E6P0]2f7d<[@Q@L?O=T=V?TCLFHIKKRJZH`H`L_Ua^dhmitdw[wTwUy]~flkguchb^dYeYd]_`XaR`N_J^D^@_?_F_S`^`d]`VWMRDUA^DgKjPfP`L^G`EdIdP`XZ_VgVlZo_pdnglihfh`iUmNrKtPuVqWnTiOdL`P\W\\]XbRiNoPqVoXhQbD`6e0n1u6x;s?oCjFkMmOkPcPUPDU:\8d;i>l@o?rApJlVacXkTmWi_faf^iUlOpNtTxZz\z[vWpSlUmYp\s\rYkTdOaJbEf@f=a=^>]AdFmHsJpJhM`O`PhQsRxVvZqamdoavY|J{<t0l+h)l*s,z.{2x8r?oCnBq?t>v@vFuJuLsFr@n>iAbFZLSPMQISEWCZAY@XAUEULWUYZV[Q\K_JdOkYnbmbfYaK^=d5n4y:CO|TtOlCd3^)\+_7eGiPiKe;^)XX[]$\+Y2T6S;S<S=M@CG8P5Y<\J\YZ_X[YM\B_<a>aGcOeQeQcM`K_K_NbQdReRdPaQ`Q`S`UcVjTrOtGo?c<S=LAQG`GmCt<t5q3o5j8b8X2O,L(N(L.D7:?8CG>]9j2a-H+3,8.P2d5[9;? E+JYNPPN\JAFDCRCPF8M(S?XuXX}X$YYYZVS2RQP?KE>;(=)AC>4)&\+6>>5}*M%(/57w<??qA3DD/Ab=;y=H@B;!1P&o$i)D4"?C1CHCJF7O'V.ZNWgR`O<RZ$dQixfs\?R M KGMMJ4IJRZt_`|^]af3jh_)XV]gljl`VQ-RTUsU W\ eOkyjkc9[W[=dTjKg0`"[+[@_Ic?b5Y:MLEYFRKAS<VOTlQsMZP2T![6aYeefGfca%_g^`dQjo r'uNxY}C& 5RVA##9II|ExHwSya{g}cYR}LvEp<o6w6:7-un(tASO9$#7MRC0.>PQ:!>~PxDu&s qpo7qCu<{* {+u8u@yBA:1&"*8EB3#$4>>406BIB1  ~-7971) !1:80{$vq!o+n;nJoUoVqQrHpDkFcL]R]UfUqQxLuBk:b3\4^<aG^IV@O/L$U'b:nPsYrOo:o+v0HcqkwZqMmOp_vp|zzq~jvdncfbbbbcecjdndoemihpbx^{ZxZnZfZf[n]v_xarbfb^d^gchhgdd^`Z][^b`hbidgegemfve{_yVnPcN^T_]dffhdda``^b`cbccbbcahapav`u]nYjVoUyTTSQ}QzR|SRNHEDGKMNOOPOMLyLlOgSjWrYwZxYwZu]u]vZuUuPvLwKxMwLqJoHtH}JQY\zYrQpHs@{;96568v<e?a?r<:9<A`EMGTEmA@BHxNxSSPMOXhtzthm[^V[Ydcuijf]QvGp?w>BJOMD82~8ERXVOOU^c~`YSQV[[WQLLN}PwOyLII|LnNaQ\QaPnOzMLJHGG~I|OyVv]t`u^tYsSnSjVg^jepiwjzez`v[qXoUmSoOpKoKlQj`frfd`YwQnLmNqWxd{mzsyo{jc]ZZ`}lxyy~{x|k|a|bymuzn|hpd`fXm_qpq}j~ar]g_edkenahWURDT>aClOrVkT_PRRL\OhRlUfSZRRTS\Xe\mZkRcNZRXY^]dZhUbSUWK`HfOdW_[_WgNtJ|OzZphhnkk{c^_bfhfgiptqhYJC~DwJuRzWURORWYVOJINSRI=7:AHIC@AGPTSMLQW\\XQ}OR[hquqg^^ep{zvuwz||plp|zyx{tlxlmtebehhd`\\[YX[aihaRFGRaieYOQ`pyvfWNOTZ`bgklhb][\[VMEBDJNOOPPOIA?GXioiXGBJV^\QFFP_ijcYUX]``^]_dlqrpic]Z[_fmtuw|xr|uulgfddgoy{wx}~xropu{~}{yvtvy}t|lypzyniq{~xohzkyu{~}~vxstspuovpxpzm|f}a|ezmuvtyytkgn}yr~lzllqcxh|wyphctcrg~jjfb`^]YTtQgSaUdVoUxP{LzJ{LLJFEyIrSt^veufocgaf^o]}ZYYw]jbefghngrgsjrnrqsppjhd^aTcPeMfMeIfEkEuKPPF915|C|T__XRMLNSy^plhza]zdhnTzGFJLE~912=xJmQdR`P_RcXg]g[fOd?d5i4r:|AFJM}StWoXnToNtKwNuSqYkZd[a`_f_m]lYbSSMGHCEIGQGVKVMPNJQGSGTHTKSOPTKWHVHRINLLPOURWMXGV@RBOLO\QiXm`hfam`qevnzuyyrzj~efjo}ozi{b_cmssokl|qzv{v|pyhu_mZgVdTiOpLuKxQxXx^y_{\wZp[j`hfqh~e`^bjqslbWpU`ZZdcmssuuzwjxZxOvLtLsLuKuFuDoDhGaL\N[P_SbWh`mgsnwtvuttmoffb\]SZPZR[VaThKn?p5p2p7rBtLuSpUfT]Q]OfOsQYdj~j|aWQWd|pptgocch]q`}hpsmdx`ubyjsw~xuvkripmnxoppmjg|hzjroht\sVoUd]YfOlJiJ`QY^\mjz~~y|yw}zytrqorw{{xtzr|stqlhfyjupzwxu{pnmcn_scyi}je]XY^cb^ZWXWTMxHrGrMuU{Z|[yVrQkNgOePeOeLfIfIjOoWv]y^w\rYjYb\_\]Z[SYLYI^JdNhPfQ^RTSRS[RjPuKwJoOeW_]^_aV`K\C[D`Om]zf}jvei`_]`\i_q`s_q[lVoRsRyW{]watavZ|RPVdxrlydt`fcVfOiUh`cn`v`yeyltqoohg`]YWYV[Z\\Z[VVQTSVZ\c^e\]VQRHTJ[ScZe[aVZSV[Xj^zf~lvqhv_xbzlzsvqrgoZnRmQjSdR\PWPVUZ_`fhcoXtLvItNr\qfwh}`WT~Xsaighjofya}]x\l^]aSdQgThXhZjUmOsG{A@>>?=?EP]hlhaYVTR|QzM{M|R^~k{vsyjvasYrUuXw]wcrdl`fYdReKgHhHiIjImJpIrFsDqCsGvOwWvYpUeJY@S<U?^HjRvX|X~RzLtJoMmSl\ocrgqelcdaYbSfReS`WZXWT[OcGiAj=c?YCWJ[QbSfSdO_L\K`LjMuMyLsKjNbRbUfUkSoOoMpMqPtNvHv?r7m6h9eBcJdMdLdKdMfSj]rgyp{tvultco]hbamZxX{\vcjiak\f__`[__YeWg]fk]|TPS[xbsbu[xSuKlHaGWHSITHUIVKVNWSWVXWSVIS>R6R5X8a;j9p3p,g(Z+M1G7H:P:V7Z7V8P=KCJLJRJWITHKJ?M8S:VFUSQYMVLJP>V:[=\BYDUAT;X8`:j@pGrNnUiZh_i`k]mYmSmPrOyPQRTtWdVZQSFR8Q-N*L+K/N2R2R4O9J=K=R9\/b(a,Z8RFNNQKVAZ8Z7Y=VHXP]PcLgGiHjJlLqLvF{?{<y<w>x?x@zBwEqJiNbLdFm=y745w:m@dEdLgRlVlVlRhLeIeGgHkJnIpFlBi?e=c:f9h<hCbL[QSSOORJZG_H`M^PXTSSQSRUVXZ]^aaebf`e\aZ\XY[Y`[d^e_d^`[_X_V_W^Z[^WfUkUnUlSeN\GVDTGTMWRUQPLJDE@BECJFMIIK>N3P/T5W?ZH^KaGb?c9c:e@fGgLfLbG^CZAWBZG_KeLjMoPqXqenqkygyevcsbt`z``aba^ZXWWUS|QxQqRgV_YX[VXWOWDW:W6W:YB\K_R_P_J\DXDUJTTV\Z_[^\^[`Ze]kaoeofncn`p_s`vdwhxhyg|dcdhzkslohqawX}O~MyRrXn]q]wW}NyJpNbVX_Xd_eicnahc[eOhEkCmJpQpYqZtUxP~LNRT~OIEFNVZTMFGIJD936@OxUwQyG|>|:x9s<r=v=~;;|8q0f'c g"o,v<yGxKuItFtFrMrWqbrkrssxszowkohcjXoPvP{U}\|cwfsco^mZoYu^|dhh|asXpUuV^ce`uYkRjOpNwPyRuWp]pfskvlvgs`r[yY[_bd~du`sYxNC:68<@@;|9v7s8u>vCvEuAu;w9}<EPVXVR|PrQjSgVlWvY~X~TtMgF[DYF]KdNhJgAa6\1]2b8f:g4d+_$\!]%b+g1f1e/d,h)q&y$#{$q&e&\#]dklj&g,f/i/m.n/k/g.b+b'a%a&^*Z,V,P+M'M&O&V%[#] XQ#O+U3`7i0i cak^2(3 6 5=Spyxp M--"T$ 10 Th{{kV'?(0&,6HX&i1x85-" +y:rGmNiMkFv=~5~3p7Y>GCBBQ=i7|58~:};866x9U;::75K1g,s,f+J(7!>[y kI2#4)H([#[L94? PUI6*!/+C3U6^2W.M)J+O0X6Z:P;>@/F/O<ZTbhhqiohibg[jTlPhQZVE]5a/c5dAdHcDa9`0a0g:sELHBx@dKX]Vn_qkcrKq6k/g5j?tC?63;~Jw[rergseqcnekhjjlipftbt_o\jWfTcXcccw`YNE>;:<AEHuFo@o9s8x:{?y@s<l7f6h;lGuT|\|\wZqXn[q_wb~`\}[y]t_r_sZuVsVqZoaocq^tVwQtVl_^fQeJZOK]An<z<<~=y=w?qClCg>e7j3q4w<sCeFSAG:E:JBNOL[F^@XAMGBO<V<[=`<e9h6c5V9F?;F<IFKTJ\IYJMKDHCBL;Y8`8[:K;;754<3K:UFSNGO9H8<B2O-S.D0,233%260<-3(&#"(14"*(19?&@/=/:&8":';7:F7N1L.D.@-@,E)J+J/H6F:F9G3G,H+G/H4L5R1T)U$R"Q'S/Y9aBhJjOiPdL`F^@]=[=[=]<b8i7p;qBjI_NRNJLFIEEE=H5J0N-R/R/P*L!IJMMF;/+#/*81@3A.?*<*?1E8L<M:I3B1>7@DGPPWSUQOKHJ@N:Y2e-k+j+b-Y0U/V+[&b!gmqrp l j mu~~te\[cmoja \.\<`EaG^DVANCHJERCXDZEZHWKWMXMZOYSXYV^S\QUMHI>I<NCUKZM\JYAR8L3K2O2S4U4R5L7I8M9T:];a;_=Y:U8Y6a7j8k9e8Y9R>QGYTb]f^bYYUQVM^OfWe_\hMnFnJhZcj[tWtVqUmSnOkJbFXGOMOWW_`bdb_`V]O]L_LbLaG[AP=D>>ABCOB^CkEoHoJmGmDpAsCtHqKoKoJvFHJNNKGFtHoKqOwQyTvSlQdI^A\:_9`<`CaGdFiFpFtHsJoJhFdCaCaHeQjUlTkOcM^Q[[`cjfscsakc^jSsRyZycvfr_sTvKzJPY^_ZVwQnLhGjDn@w?{?y@sAjAbB\BZ@\>`=b>cBaF[LUMQMPLTLWPWWT^N_J[LTRMZL`M`N\NWJQHNGNLPPSRVPUNROOVL]OcVd_^eWeObK\MZP[UaYdYfVdN^FXCUFYLbOkLpDm>fA^LZW][dRjEl9j7f<dFiMoOuOuLuJvGxC{@zArFfJ\NYP[R_V^_XeNfJ`NVVM^HbGcIcMePjTkWhWbT]Q`PhRqUsXnYeX]Y[Z[[\[ZSYLZI^LbScYaV_M\C[=[9X9S7P3S4X8]B[JRNGJ@D?ADFIMJUIYKXSUZS]TYWN[B\:[8V9N=FACIJPXYf\mYiT`PZS][gapbo]gRYIMEGEFFDD>?8;3;4?7F;M9K3C,8&/!,08$>.@;<F6I.F)>&9'8,>1E6L5Q-V$\b e'd/a0a+d%g"j+h:eFaIcDh:o3s2u8u>sDqEoEmCkDlCnDoDlHfJ]NYP\OfOpSwVyYwXtWqTmRhRbV]Y\Y_VeRhPjQiXmaphukthoei^gZiSpLuEv@rBjHdP^UXXQYI[F^KbWcg_qXvUqUkVdVaRaLeGiGiKhOeOdMfJmHvJ|K|LuKmKhKkPrTzXyYrXlWmTwSSRR{OlKfCo=:>EJJC:1,($#)5CNQKEEN]k}nicbgourmmmes^t^meanZt\rdljeha^`U]PZQXUYW_ShMpLqRn]gefgicnZoTlRfTdXi\p_w]yYuQpGmAn@qDoLmUj[i`idhjesazaemrrojiiimpu{|ypf}a{`xbrgmjilhokrotprkrfwa__`^\uXpUtUUTOJ~C>>BIMLE;33:CKLHB<y7y:}AKXad_UKuHhJbNeOoLzFE}HwSt]wa`\Z]~btjil^kTfMbL]O[V[^ZcWcT`Q\OXQXPYO]LaJgJkMmSlXf]b^a^d^k_r`x`{]y[uYpUmSkNkJlFpEtHzNUZ]\YTMIGKOSRN|IsDjBaBUEIIBKAMEMKKQIVE\DcFmJuNyRxTvXu\|aefggwgkfgbj[qYw[{fvup~m|hob^WSDQ/Yah g,e4g5h/j,l2m@rJwQyOyLwKtNvQ~ROMPuWn`sdb[XXv[q_xabdhii~f}a][\[}X{S}LE@=>}@uDqGqJvI~KQ\grwuykw`xS{N|P{Xxbyf}c[USyVt]x][TQOONJFDGOX\ZPD==HWflkhfiorpmnt||}{rop~ttw|vrlfb^[WQKGEEFEA9w3f0\/[2`1e,h&g l u%))#)485,{#y")02.~*(*+*"yqr} "'&z$o"p"y#$$%x(r.s5zAKSY}]xawhwqt{mfdiu|sov~wu| |}!%|y)w7sAqCnCpBvF}NX[yXpSjOkOrQ|OF8+&&' }|ygWKB>~;~5.!ytt}~}}jVHBGKMJC9/$}|~}xzwnjjlpt!x,}47:@uJkTa][dZk[w\[ZY]afjjhfc)`5\EVXSlP}PRUX]aejkj.hMemflu{}xvAw[|mz~ysolkigj$r:{LV~^wgoxpw~yk^WUTRPRV\^\UPQY\[UQU_|lrtfvVu>wfE#bD!wR{0usw~k|Mt-oopofZiSCSX_`]Zp][eDo'uwvsrtwww|ukqXmBg&b ^afouxxvtoid^\`hlh [LBB"M(\0e8hDcU_lbjqrkecj7vUr~~+J}fvqsvxAsdlediq/xU}uR,[|{?~i9`,BWn|{ytokkorsp)o/u-~+,2s;hBfBl=s4s*i![S Wbkh]PKM|RdSDN#IKS^dbYoPJP,XahigHb_][\S]_`bgam;twywvdx4~d{4wwvu^t'yxQ.~}i{Eyy}tS;%}xvx :yVopedehgd_&[7[G`Ugcmqnha[WX&\M_tab```GRTfZzYQJFFKRV#W8WTVoX[`ceb] X)VGWe]dlt{ (@Xm~}}3J^t|ywqk$d1gCpR}Z^azgsqt{|s}duSrEt9w0t&j_^es{xohhmsqi`[^cekbU\AW4W.]-d+f'f#b!^$[+Y1W4S0P+P(R*X-].`0_5YASWQqUY\[SLFCE(L5S?WKV]QwMGB=963/2U5};DMXcik8gZ_|YW[ac`W:N\HEHJMNJC; 448&>.@0<+2&'&$1'G0_4v65469:744V6"762u.F1#:EKG=5{8lB_OOX6YSKJ^MSZ}`-flpHu xzzwkqRi;d$`chnrn3kbZsT.OKHlG9J OTVRLEACFHJGbBE@)A FNQOpGe>h:v@LZ`]R,HKC]DfJlKpIvFvFuJtRzZ^_\W Q>KyJO\&jKrgr~k_UNGDCGQ1Z\^YOHWHNTS1LZE}CHRWVPJFC7@i>;75Q30./4< CF)I&LR X[ [Y&X4YDW[PwE:6>KX]ZVVZm]C]WROQWXTK@:76665k392015o>AIQTTQOPTtW\VER1MHHIKcJ&IGGFqAP94/&" " #  z]=" !'#@#V ft$)++($$(.6:=4<T9}77=D=4*(/?L UUNC 7/))+h.;00.-1v7L=*AEHMQUTxMRF-BBFwJ!PU~\:chgakXNN6F#B >70+)_+.,,,o,---,+N((+/.(!"&'|'])=08??<=CNWYQH@>@CC!E,J-P$VZX ROP+V@]]aa^YUS1QLNhIC=:::97446;6AXBA=:=8D]L}OLFBEP]hid\UV:\cdiifcdef#c#`ZWRLF?>DNY_^W"TV]d gd`^beeag[UVJUE[?`7c,d#e!fc]U MJOUXVQOOyUyXzWzS|Q}R~TSL@4/18<AEINQQPR V$_<fRkfnyqrog]VV\a`2YOPxMRZ^\BViSSX\\[.WTRMGB?>@A=BjBEJPR Q(L;LDQIZMcWghczZOD:1*&',28>A@ ?=@EIJEmA@=@FKMrMBOT[`\T_P0RY\YlO3GHSH_e`SD:Y67c=F=PToN5@.&',V>OSG2 Tt$)}+04<BCDF+MTWp`ta`]8XUX^ewhgd`_]`dffea^^ `Kbfmr;qXjl^rReMFT!bowv>r{kc YUTRSOF#:)40>d*?V:pum;]LMZ%>nj5  0]jr_7Y!09KE0&9ZhS+4fc%dyemX TXg0}N+Sdq~kzofdKhloEtQ%pQ4'fgzW%*LT>%8#o7JH8I2~>T[N-<U?{YqmL*& D#`4\@4M b ?}u7 5#R<PQ8\%^,[BXSYJZ3Q</@FDEaN,\ed\UtQTM(C:58|:I4 %u/4MTUF."v+>B PK9u-A3 HTIZ,!+lF#L8W(&<B~7X'>0$+.%:@C@8-$a$;.=E@/ '6&?C;a4v2:EH<*%3;:3*-#Ko /%[7=8*  %40BLOpSRNIHPIMRVVHQpH=538A&G<DZ9,&/A'Q]TF6/!:;SMi\pgfkUmMhSadZuS|PxWofgcbdccccdgltzztlbfHi1ovvne_^ced`w]U^4beghkbpFw2xtme``bcdcak`L_)_bhoutoklt}} (Jp}pikruu,tHsfxyxsqt+{^|vn l@rq'sDl\ps{)Utfgy;bxYMZtxy .Ns|k^[hzJ~pp?olJ==}~JfBzUz[} sfz^0`hsw|R8"~zvutvvprElgglt|zxz~vrppqomk)j6j;j8f,`XSQRW ]'cFjfoqmdYEUuYfu|qd_fs|2w]j]\f0u\}zph g,kHk[`kN|B?HQUSR1Vo_iia#XMSvVZZUOOT\]XST\dg b&^D`dk}x}vkkgRq7vneZG{/uu}gF1*,1551)q]MB@BKYj|}|~*Pm}*x<qRnns}%ySn}in|Bj $<[6Z} $3COUVX]ft}zfCVjX@FLNF aCl4y+vS4gRB2|{ +5/"!)+"<a"Tx -IoIx 5Um~~3Z <~NzWy`|ktx}tunolprs~uof_akvysk)h+m&x~znfgs{owX{@+  {uokhWj+m qz|z{}|zvsmj_fOi>q-{~wqnmmlmpt4vIsYlbadXgSoQ|OKGEHNOL@6#37:VIY`^X O#JDKiPYes||rb R8HXEGFA;35\7?HOSUY:[WZoTH=56<A3H?LDPNVcYWRLKOV[]]`fki_PCBJTYVMFDqGBKNQT`VVSOLMNrLPG(BDQa[lnf_`_hsy?zy|S~xy}fJ"U} }~d}3zvpifgm~sqvhvbuYwI|3~xmdgtthkxv~}cUZm  }o` XS"O0JEE_DFHJJIDJpOU]elp tt+q>kSapYTRS8SsQH=593Z8wBMVYVQLK RE_rjnh\1S]Q\jsri%`/\3c2l.r(q"l d'a3dCjVrgyvywqmmnqqmgevgdnSsDu7p'iaXOIIRcu|dMz7x }yfsGn,mry~|oYI=5.(#!$,5?GM{OtMwE~:0|*n+a1\9bEjSjfe|[VY`ec]XWWVQ K)GPL|RYZW T'PBPYOoMKIJOUYZZ<[X\w]\YT P*KEL[MqNPPPQRR P$L@J[OsX_`VH?CSdolbYW^c|bp]kUjPnSxZ_a^YTRU^vhSs%vnaULQWerzzvqukaeP`<[YYXXZV3U X^`T_WOLOU|W_ULTCX9ds|ynVc-`forlvabWQRBS4T(SQ QXae`SH}HoSXcCJQUUQMMQV$\+b+e(e$eddb_][]aeed_[\`bbu`]]I`5f#ot tngfeikkmqsv^wKvv@`A??BGLNtILB ;657:AJjQOV2WROKJHtHVG;F!FD?:6:B~K|QyOsMlJeJ\LSNGL8L&NTZ][Z\cijcYRU+\0d-e(_'V,Q7SAYD`Cf@iEkRkdhvc[TTUVTNHCCD H KNOQ#T4XC\R`abrdcddfgfb]YWZ`gmpqpmj0gHe^bo`{a`aa`^\ZYXWUQPQTX[ZSI>9 8=F O P MHE#H'P'X)^/^7]?]?b8i/o'q#o!klq!w*z5zAwHwI{DA?<w5o+mqz~wo nrz|w k]!W'Y-b2k9n?gAX<J3A)C$K'V4[EZSS\M`LfOoTTNGCHQY[TJDFHIB836'C5SDYRRaEp939@C@841.*% ##+&:-J5P>OHGVBfKy[kuwvtqlcWNM Uagg`Y$W0[;b@hBgDdI_P[WW^Xb[g_mbw_YRLLOU]chjiyds_nZoXs[v`tekg\cO]ERCIF?O9[8g:r=u?q=f:Z8K8<;,?BB@=<@HPeUTXJXFSAR9Q.SVYYWRK^DAB#EKOK?z3e.Q0;7$:6+ %{/[6@5'- &#$'}(l'`%U#F!8*"!)-..../v.\+?')%',"-*,/(1&3&6(8&7"1&% 075(  *;GLNP UY\ZVUWY[`i}# , 9FX!o   %&# %+.1F3^1r+" /BORK?637>!A%@,=69@7J9P9S9U8Z7b6o8~9983/-+*$  ',( |s m mnlib&\/U3Q4K/F,B,?/;576480:.@-K.W-_)d"effc\#U+N0N4U8`?fKhYdd`m^u_~bfmxs`TUaouphd.k<yEIKP[yltrsroljknr"t1sGn\ikdub{ba]TKB<9:?CGHD<7&86;@@H@O<U7[5b>eKhXm]t\}YX]ac_[Z\__ZVV[bc^UQW_eaVH?<u<i=_<W<U>SBOCJ?I8M3U4_;bC[FLB==.<D P\^XKj@Q:5:<<;97:@sFOK1LMKIHEYA3<867887|8`=ED,KNH=2))d.H5-850+'%$" )4?BA{;k6X5A9*<< 71+)*-./2 4!65300222.)%#'0;GQ-R>NOG\Ae>m?t@y=~8|5x6q>oHxMNLHEC>6)09-H+P,V(] jz #&+/1.1,F+Z1l7z;;64:DQZXOB8100#/<.X,s,,*'!   $ 2?GFCBEMUYYWWYYYXVTRNKHIPX][UPMNQSQNLNSY^_\ZY^dhhaXSU^df` UM"M.T9]AeCh?j9k3h3d;\IVYRjPzQOKGGOYbgd_Z \`&b5_BVLIYBiAxHVclpomnpttqnqz#z4rBrFvBw=v:p=iAb?_8^-_&_(_1a:g=n9s5w5t:lAcB_@_6d,k"nkd \Z_hptnaWTW`dbYQLMRZ]n]`[NT:O'HEBBA A@@ADDA<:<zD\LAO&NJHMV^`\UPpN\NGN4L$JJKMNNNiPQS9VZ[^__ZQKwGdMUVH^;\+RG @BLRPH>=FRZWL@89@IOPOKzIiEZAR@UB`FlKtOxRzV[`dd^TKEwEoJkQmVuXVSOQSVWXXX\_'[/U0N.H1J9OBVJWMQQIYBj>98315>HMKEACKSXX UT2UEXTZd[tZVRKGGO\hlha]` jpl$b5SKJ^EmCt@{;656895/*&!&3AIHB;9;BGLSZ_cc`aeikgcacinpqr vvsnjjnqo"g&`([*]2b?kNrZwcygyjulpmijcf_dajaybbdiotsqnkklnpqsrldYPKJMS\gpt rjc"`%b!giige(e/j(pwyxsn knsvv$r(p)s$|wlk!t*.,%  ~|roqsof^\augkiiclYmQfPYUNYDW=O4J&LUbkh`UPPV\`^YTMyExAwBmI\QLXE\G_MfOnDx2!}}}~{~q~[A~,x$n(g2f6j.progb__ab^ZURSUTvPrGu=u:j?UH>O,O'G+<04/2)8@GII FA<7;BP^fbXMIJORME@DP]ca [WZai l&k)g+b1a<_J^S\XWXUXT[SbQlNxLKLMMPRX]ab`^]\][XSPM IF$E/I;QHYW^d_nYrSrMuJ~JLNOPPL I DBB-E<ICKBM>K>JGIVHfFrFzHMSY]^_bfjkhb\Y\dowy ti^VSX&`5gCkIkJhHfKfUjcpoww{zz|usv}xss}}uu~ {{ zsps y,9?<3-|-y4z9z8z2y+x(z*},(}yvy |uw|{n[H>=DGE?72.+)('$}urrstsrqnib[VSOKGCCEEA|9z1y-w.r1g1V+E":8:&<.8,1#'$4;6+ &,0.*(*-0,# "'&%#}!v#o$g&_(Z*Z0`:gEoOrTpYg^_fYoZy]aa\UQPV^dcZMB<<<6' ''/?DA?BLUZXTRRSPH=2+'&# (5EQn[_aTgJqA962+ !%*3APt]bfPnEuD~INMF<2*#$1>GIKPZgt{(25+63:>DKQU[UaId:m0+(! .>N` rj8#Y&6":0X)xU#1,6Ogu"~kDDz5*IASSZanPOk U81OG'+"/+d!azredL,e 4PqoV<Ku\<"Vl;I#UERe_F=GG~EW1pr}eQ:W1R[=NxcNLa2Y$ Y&P8bP%,B3;kI]yS+z ?*GayG;V5mRos-]&Mq4.<adS-2dK>jSh( Q8{Lcd %Gn' /2H`|}axZA)<>(.L...N06*=BE@90& E;x=rLSj2LH9P`@K$i#1Cp?;q8vO@(-#~*OVPo8&JnidfRC%9 uQl6Z3' dFr.m|u@ti N](C/*C_x}~:ib00G@MyY?fPwt:6"_")8I `p5~>*Bb_=RfX#%q?[>sN7Fn"^* 240+').C366$59?LEGD>7$2R*H w366aI~Avqei*[GL6)0_5DTxbhXoBz!D~zF|N/XP@j;UWinFkgciu8\!{;Q _ ik morqgrPpmhjq~H-~xtmc_P7d V{CW9j8KwWh<C#*H'z\i>S)zA~vg i1 \+OC4)>pLl !F9=x6^hHA7120P.+%!p!_&-330/B*+''u+/4=L`a ybAj,49ETiEW?d#~3 &oFiS  *J>j l<g**?0/U*%Z(c8Oi5~fD]qC d(_07].Cui[D"{GCrWiu1^ze)LW3}^ZS]U ']U_pVAv:(/m#@CgA^ J/!L1hV|h #(! Q w G  = +:Lue# %nG Y /W     Z  O    !   b - S \ \I+  3 t | g U AU ,z  v  M(fH, a k)Z4 l~K.r< m J}4$KQ\k{>LNs'A@cU%Qw{<b\V}@2Al>=SS:u;%fi)6 'DbX D!e<j=qS?|}7{SNTB)2c3= y(BZjF~RNb ! _G1 8\O{NmR)hJ4d"nrO3, . Cd .%0. {l  '#4jLkv;Xu0V^ ]'tEhhG E 6 ! Jf m{ 4 > 3 *u N6 w ) p  Bb$V e z A 6 G k  L ! ! [   !  YczcPD<9?5z/&\t8 xc~w~u{~~||o+O.MSs S-&F{]XqP>?P"<!^] e.RP{Sv=<eabh$Qn|Fa$1?D^IQR_pj|}qZ0 ~8Y,Z4] +'"zM8%YXu'p-}0Q%] R$9opmgC\)5<QPI*A`mjET*ty3rd{ J<~)?n#7K[f0rlsU6c!Su*s3 Y &S ( /p B \( |e D!( 3, ;9 @2 H T kX<5 ek $   ? s ' * ) '   X V . |  M 3 H@ a,zNzCiw03eGt)>5F<{H ~5=L]^vFE)~t_n=jc,B\l4?Z#'{bn(}<FBoLwyBnJJ6/+BVu6O (? H4Skzt'ho9Z>Bml" > b c$<:\Zn  3 h { 4 - X  w t. Jkb$'n =SuW/oCS ]} g nw o i _c T9 N Q^7sfx.b&"nas V=U&dchlHK#u?C{>XR=)Wc!GRxUY9^$obl9UOgv h`\65Yl:+b 8nSpUj C | = t 4  $_Wu4OgT2`=j4eu$Lt*O]}> UW!7[z izl 0A^(.{Ubxu-]9?m&o t+}NVyU0kLCKvU3P<#> VByjF3)O Q9]`2*zxbz1R =!1;;3%Ou 4 0Qs 8 &9 Y # f g k  A p `Alk|8 Ntar P = MC  4[`oB2U@/Qq]Gt`afJu. b!%eyn`N:n$ @tyYAd1*N*/5)84(.V~hVGAw?FxPar  ]"p9Y!s>  ]  Y3MI8_py,o9(f4B(T|[~S*2Kj<#@Lk/ *H? \)p9J7UkWYUW^nS{sVp00 yF9"I3zeqM-t 4jS"|~06s0=g+5 sR/Ud\c7E\'la:|B@s^M}@1* Had } O + 2 . % # & % e  q *D Hp m ` .7c| eu8 Dn " 8q Y- 7./] >  CZ a# uaNm7A^n,BQ].gpusv4qln~v*z6$s,* " 0] ~gM(4$ [,ABdJ<<0T{+YEe+w}Ci[~ j'C_yKl/%;CIU-k >C`r@*\J.H(Dpg?w9ECv.hG!u>Mtb\a;q uO5+Q"Sex5|n d8 ]o S B )6 aYHle+nX    &7O l ?*VX; a1F%_@cJ8N9_$AEJb}9 y1M]]Bbq->*231,d%x! *:uM`Joz *=OIt^I:/K" gr,nq5\*HB/gFDvW';#"A|dSF <[1'\##T&v*.5??KT RH:/-/+35Y9wE[qv23W`'i9^[0I_c5zQx ([Dzd.]6Qhz 3.Nk9d= 2byxpnkxjoQzC4$IhT? 1oj7 ])HmYlH/ >t u Ig  | ? )  tM[JF=+ esBV: c mY X{ I = 1 %   \ ; vdL3~"$z)92ABSdZqLxzu!j!^wTPUctN8iRshyx-WOdr1?| UA_x;MG(I>V>meZH''+dl`pt 'm**h'#oMWri!42p{V4>( DJ @{gU+F:-Z0 eP; >pkhH^)B_uyD^;CFkZJ( '>]IcS -,@T)iU~oa.'APWiqx\B^~ / & ." 0 -& ( #l # ' -0O-%ER< GgmZGNnjF/   k9 @XI"GnTn/e<|=Dz` C& lG7GgI02kl s|Dwmoh{a>ZO:A0{N_.&Z00+&(1=CB=AcB_JYjy#(2 S ny,8@FW9i|` 9)R21/ Y !T8:PlevvGONco.puV*^ 4   4 "' (&,29 <|;6-;' #!C$.; EJ3H[C@=b92&= | Ep("&|-)7@B->5,'(b0 ;G8Tn^emvZIvEd+ v/#-9 : Hm W hQ y @  m DG$:&(.e8BN\~m :   d 5      %   &2 <D0F/GJQoYxaei1oziRmX;[|toApst>sntd ? e x=p3lmnmf^WPM<JF @f < 7Y 5 4 2 0 .{ +o )Y &5  /  '.25:qDQM^hpy(6!0>nI_&7AFiG KUeyC"&Ct z(=Tdls?z)X P/2M{)7DPWYZ]cmv|'TDC`#vh#+|G43+ M}seyZSRROKJQi[`^RD7,,ru={\bH) e]@bkB` '  NoG&A ]ksGV-: 0`sU;$0 v!5!AVhtaK6t"o iP1_ "! 4Kc}Rn##2ECT4bnkrtx{7{xs$t~B   * > O Wt [8 a m. ~ F  yX'9Mase _ Z h h v ^.Ic}} 2-@,Mk'c88  nOH-3\06ZM^>`nvz!:P\p073N Q(6l?A?<8P69@1K^`q'f=K<"-5VBqQct67-am{DF  @,;<BC}@K=&?A?9U/))8/6:p9;658>{AOA;3q)  C3QB9*|qtyhX)D1!vn>3l Q7* =v wOfTB04 r o  y ^' D* ) S q `- Q B* 1p "z!nB U N    I } unfYESU`nx~2)Lyrooqx0A( > (/d2259 BKSGXbqWKru>`%6Ib\nA3gYe 2CHR[^*jv5K >?y^,e)A9,I`"~t $&V &- ,M 8 I U]faOf[m|rph_`~n,C<G^%OVc UN"($6g %-- % 16 (4"Y+-v'#)10Y#X Sh    @ N '   M M   yrjh/ii c Y$ L @G 7, ,+ 2 5 .  a * m%ziuvBtwiWIElHNrL_?, 2:dOnvfMN7 *& - 3)2o&{E;N{aCmo{vwxq9_YG4$++./,$ 1/ xp}`T44jf' q!n&)/7ASM(UZYtY[9cVqf"chzBWN~&2"A;Q ` jf oL p q" vT t  I$;2z=@??B0N]lw ~pml`u `u R$.9@a6b@  J >    ( Yy  O"!1I;p < 9} 2I / 2 5 5} 3 / , +" *? )$ " I       V  4%+      <  zy{r|tdySCP?@FHD<3-+n++($HRPucpl1 h~xwwwpvaO@w8&89:75/~% q;A]'HohzK  J|xu*oSef\jVwXa lssm6c[tX6Y^Waa~\_S_OP`Xtbg b TD<;> ?  .6jOU6~7(CMEt PZ/!UD!q-: JWm_dblu(HCZO&*/D7B>SbmsHxf`7  b f   Y ,(6BIK N S& ` m xV}n B   /  >          &k +V 4I BA R< X2 R D3+[)'~=OSzfh%I5-DMEN [_ ~9h`rs0 ;L{k%Q-bCO09 @7mA/+4 6` pwF 9'H6 %$k}gc"iE{Wu}Q,JQA p^.O{Z  ]eiYm9(3a(z+u9 M  ]   ] .zux y;yBB=v=UCd\l<0bGPd?q&o_%\mf$`{[jG ~~xD?qfP$X1Ka].9t7 7R R  >  j ^4s1-:F-xzq?!l[  1 , q p  W ?  S S * 8>Q$v|_O(Bu] 0 5]l~    ; b g[`y![{:xwi -( >!O Bi%?5%*65qBd~6Qm $5 }~&*=Fi I\w@IKe=.ba%q522*_RNl)q6o&(rcybMJa_Hz7 M#^<6bQ.y/:Ap]P^:_=8 hXCDo H0Sd;,nb H  ^Yd~g<Rh|^ IF!VdMOF/"p%/o8w)j\k z^BD8!Sa=DqU;p[Qb0iFEFG(e3 YO`Cwv @AUqS,:i %  S : Q.,P]r xS+ BN5m'Q g @ < ?z k 7   x ~< Y +VBX?oR a =2 Vb # k-a|Eva?Xxb 6vC  (n^:G *u9b{.dG  )^kg/i?hgac+X99+p7#n0GeB0Ua) =EZn m lmj^|Em i+u%z>Y(`ql.I>{*[u].C0z4+LtjbK>3<.|fC7;v*W0)ysZ)Y 6CE)0uchB2D\biR[>H#m8yiSb0TmPDxb0C d]TnyS$XN:f  P I da p  i U r M AHxy  b g T/ { OGuZth Z_dS2G3G0 w8\0Bs[m Z2!/ 2J Ww| 2Kpa_Z=ZJ:v\{FM;xQo^  n {l ^ N CGSkM\  > | p p j TBN  { b t -  4  W   q L    e!  Q v ,q 6 ue H Z U --WEsHbD?<$}wkz B =]}&  4'F/XcT5f]BF8UQrV f x 1" NpWp8)G ZL2._  [R6W<3W\'G \EbQisyd%0roH| 7~vsa6n ]N}Sy6kL="t2S zs2 j\:'k9F=(v:*:NKC F4 FcI4,ADM<=vWY6~4?{4|/[ d W1"3De){HTNOaHRjOU/ FFv_GN|g;=VIzVw)H8(?cu*ZUT{@Fn64r U S, n $ D  m 8   z 7 Hy d zq    m wQ  m < K z   8 T c 5pC) 9 q4 W   c}c[*rcqss?S/X=`ukT/`T8GO" y t r  .q2aYJ!ej+L/q5: MM=`oJ?z-j'?ygh>-4LV_Q_ C  c % ebTB1Ps]WVYOz)5 J-j'b xc {3YIt[DP9Rj3t8ES;i;JOhv\9LwQpGh6 z#KDm$Xs"==!MUK->,OK%f-HRi}u6(Zc'!+x :> M c q X  C c ; +; b  G   V  < @  #!D l :   { a  ' | Fu S   3 } v [  B *c<e;DR1D7<J_h8= f*=c[;g}e1QmuOy7N+ l9S>G/oe\V =),odmh l " S@vR q/ZWrwXa iS;&H/PnS 7 4 VLF,'(VPyA*;$pgxuJ2d$!zPhd Ga5.Vw"yT?/Ro(A@ L2Q U ?t ` yx*Q'&+e8SSBm 2'VcHcaL~L\BBhOV{L5E)Wf-'S#gJ kij<3a  ADuF 1  q  !; X |  6[ R : C q}  D  (  P " . ' 1 )r-q?(M-\d[ l S i F  B a! YSQB->=[odME CI3 7 ( b 1 a i W  Q  c ] RT  E -\2DTt/*@ -8 xKojqqgg1jq6uA |X?N0/"[FbK * L 'huae>  (d9  E M  `  k k @r% gs [ u@7Ot2^:PUOBjPpv|~A/eA5G TtqX 'RPz"o.*s>[ mL;S~f N  #Ov |wM$Ct7x(02VNti<:,FJfi4Qhh~)r7jM|Am:U   $  b q   1 tU I  - ; P QCS:Ip7vikwK) /!   rf~ X ,  r 5  G bQ .G(5MeZ"bMK DHy$*3F*2J9|4k\Qz-LbD ~>4Tz%w@k  d i    % I z(   q> W } \vZkEqk ,g   ; *m g#)1M}N*F&/\n0l_W3(:3. BHcGll} [ ;T B(\>*Tj5O@-WQxdu/q^`i1yFj2P/$bS7]Xk5I3^g S  b6 |py-B"Ok Sp- Fi   @ 0].@+} L %G"qczGR d "PqUfzaUU1Xt6uG&'HG/]4~Lec .c`gA?\1BL8NlI<XbWfU7^B30Q$(  p{ 4 LN   ( =  cC H + ,j[<M$XKp_EeldpZDsQc1i/0OT"L!B -  7EBw>?=1;<eh%4|G$rM= Tpf~!0Kxj'j!%( y|BZ5 !/j,@N- }s`3#\"GE6}S 1 T k B / a f Sf0( bqT9Z3Z  Y lf {  N    h  {% W 6  y~Bm#PHL+\Y~  \`]/`({5()p0i<|&?b%Q,` }&?O0Wm.^mmEX"st3v1S~S>t7UeQe7"g%f.#k^#YrvvgbAO |! !t=+f Yc0t>,-`&9   \ Q`g{Th f }  " X H  K> VnNxsl4qgp#Uk1'foF*a"`f8bn/EU)`;!0kKwd J>`srH%D$N5Ye& ^Pi I<u_AZ)j T _ ]  W "3b'1TUK*W2JY\lcOF[22CRu9fGt 1 w =e75 eS@L)c/BG?s4nF6aYPPda408_N Zc8_UY@OL]0Y\O}x T~Y@:SBNgVI cOVu"Zqzm5jtzX^>zR}A@*.0{$ n*=A??=IJw-!e40$ },Nxo:JG=3[m [|=)!&YCfL%M*7qecUP5C{i<g/e8p  gl PX  a [ u\ `BY_&Et16]~h!)DO`8@\{ 8  R  |  ;^9&|5H,yE9TMIH h h LR @) b    t  4 \ J87aC68M^J3 Iqm:;w,W^$SGC^"7DR0Y'.z%H_'ezEAU]?R~Mo6%rHQ;@+vs- r= ;41_+#'WAv~VCuhZdx>P;U)OL=!H9~-AT}&S('<}-Y[Q[a VZ -8%b5(O0,T7SF`R &{=_L@@8~&?l{heXeH&'`q>  X(CZ,?vB#I]7-B\hWTOTVe=+AOuy.zSY cA e  p + v z  8 Q  d Z p k  N o  c   l^ &EYjj _&  0 R 7  Cu c TI g | D F }&%DB>RT,8}EkW&ll9)RS<[LFBXCCNnA3,8QT1:uZ0z5YzwBw2vXj$#pqf:)g{'i+,)/5Wl`6*Ngz2=CZV ]AOhr53c7@82"k C*s*D[9.5@ntb^7o T>2>-W%xH*C `  M RCS%$?B*_Dp*!7v= ~OYa3RU.sK*ug?my4k:odjmxk#K>}Vo]1Rws0hXQi@>03]R] P+  6L   b Z " \ S   'h / 2>!b{YE  -    B  i A?  3 dar`8| Hz" l - \ %T | | S w U - 1 M l` J  yW.E2g87*b>w2BI-JN"U+w^qX,%.?yA&fo,ztlg<hKrO|h|2Y{'e|D2+ pwm{j?Iv'i=&.C$ (THM5O7*PEl {fuJG~$Q>rQDs-zXc9Run)#XAIm:{I5+wcNNR?~lF-ny9V**0y'*[Kz{C[*:>VKAmO+ +x* wU B } S 7 j zIx< 6 q  ;w  ?(D_,_ 6@q H   [0    * c  ^ 2c~j@=D: ueZ. 4ib5@vVnfwCPYz ) { }p ` i}\>V` +j@Q)D ?F O N b   ;   x] E ' m j }  d f qn|n T * j O |u n<kVpW!e&ZP aa]M:z$0eS*(Uoex_&%H Q9|H=#Ac= y/Nsq[^bO[K%S%g*  x  ) 1I C n w ]zeTH$C9 j S ?vx*YyM\n t ^ 4 q : ) + \0 >3 ,  r D H  RiMRc7l;-^7*(_?,z{k"H)p}f@h5x5!$`T+b^>Af^+~C6GH3Z"Sr Iq4tKeOl9EyK4\yH$g T Q .6 % 8 V1'#rl!L7 5  -Y O g u  6R G ? W  d  K [R pgo:3-B-b!)@ \vZ!%1t| {n '8 g u t+DgZ9Mu:B% wU~>:!70_E*bv2|QQK{Bx YX``v;PJ4%]o->"~?(:@ '#27S;9EhxiX>b%*Zhj=$ " 6 K (- [ yZs`^ *"     ^  2U   1/ < 6   >  8 i j A  E +WaW e Z )  e $ YBNn}:arICBxM;rY>jHwY25yD>8ypg2|Ft<|_"" -{-[N;WKHg[ Jg}# #Khc|{R+? sY`~ub'&5w9G%5 u&`"k}*n ]!w M q V q e j M~nP\GA`}F , = B oG E /    _  = N  f H  4  -J '`(bY` ~DU:3:3oT->)VG`IYf9vb=DZWfGgku,j@Q4v  eD$+mF (mcan^n .9 < ]l P > s <rY IW% ^^ > f }*j?W q 8 Wx  Z Z { b N A = 9 ~, f6-Zh8#RyK q;I]u1u)'*sVC4Sd\5g0w/&It,""hP]aaLwLiwO9._ & Y&N7K ehDySa3:$o42RJp0D$J90c!I bvtfdk}\zA4!xSmt&0=amN>n +E v P Y  k  )& ML!+e  Z  , l  ~ (; O DG\}Y! 9 ? < mp i c8 X   ` $ r C   U+KN5?|;qfZR>47A < nYFqG Zu&=Js\ - z' a xL& .7]vn}P_ W  \ U s R G  : [  [a s# a V N _vxI`3mC B > K LtK  8  ; k= J KC%Qw/h5,eXR8h.)F1VF|~\C C190GAuWU)[ V.f+oASmNmnEIyPTfVU]bTU.!9:d0{ar` r*[:)KO)h>OG0\Bkd4 yx\Np-kT$`*<.8- = ^#i `F(C& [o G r  u:<w?1!:=f B-iq3aIk=83 ^0d ! S % W   Sn  y FlN6tm Ne 3  q2 1_  ' e ) q E C L @l   9}xADh*5tc` +]^eVPg #  B ZwEB=4( yGI||.So$28ggX< w B( x(  K S  ^ QE   F  & ULnpHK]s4L t = o | lKt%dC~cF\L J0:juheUD8>K9tCN?1XFA 'Jx} $}!J P58 8Cz9y9(oY2al!9I6t5zUv(u ",oISh{%~~{m7RR[X,b= $zqL5,"gog @f0sd]v,pJS7s5!vR4 6 lvkEVlw"e,U  n`Q4Tu/w7+u,R[4- f Z  $ N ( r W , i|B]8@tLwMB.+!wbl =    /| t  U  $ I kSrE + 1 X %g es C O . $ 'R kab%G z X  + Yr & Q6 ZTOWug&+`77J#V`@PqmIwvu4%|wFnL6)}y1d@^r& / Z`MC)V. m$vFtJ'Zb+-l" s7 3 1 9 @ V K+v@A>2V;{Vi:}DzJPS!-b\MTc_/DX]N|s:uxL*zl0R{i`Iz}CNZMz*ERdfQ9L?^pn=r$ %p _ +3T i"X0ywjiC(^R:kJ/ zAC4yTW z2NZ0U j1pO2!\k$YR<o~c8^F2S=zPH0 i!9jC$ t J 2X `   /} 0  .7 90s,CH1l^ =  M  \ , 96 )u  0t  +3  60JU]wk fK2U8  ~ ` "  Sxv#`` i_qvsiZC%qD5fr'5L;e }9# {P"vo9#g9r ]"t7gEQ|I=Os>xGwUP1/O8k> o   32*%x'8X{y[GG"NG[0sL!f[nD=iP>]=/G' DK)CQ ZGl.j[TBA3>m r'Sc;%&gG!GT8=^A&+')AtW#OUD.4\ve+'oh3`%g,MG=nYpV\83' AvHn7%?G}!|' qmF'1&D5?.5T^S7jF;gf:yx1\hbWOi!wkj>B9'HU}$ q^  ]   x 9 P[0G1w -Hh  t  +i _ ^ Y ?  o! !  :  I o K va|Z> NZ E: y :l2~J^d)tk0"+e4OQ^r|E5. I5W/g.,SL7OB>q(uD>w7X6x K   [ U =9D.m6xHMtQLMs<1H^Cl8=%n;9i,s ML >`vHMwAd[CHWf2k.cqyfo=E(QV_hb; Rd,cr O#+B:<9ARE}Z a(h`oiWl#,w="(F*~KPq3Kl`Wuj/u &CN7dL5q*T% %@$/JtfT Y]$A?FGfXS2LE*mF g[Yma SI / # ? e @ E9+RlI  Mt k    M   C   ^    a: 8 $ 3s b}   / `  E .  f 0< n  sk ' q ""m_tooYaU Io!{"ljdK HFq ' eu#*B9 ScvoE 'VmgN9XPl\ I ) @i i m2 X0zc5ybGHB+s%NYkdyodh'xFa((gEhsz h{Y l 49=oJVBK X{reit{sOpH@C's:kJAM H \= x\*4 S&*0y,l) YkluQN/ Y4[gTk`D4y%{4:@Ng@l}3L: D0d I lJ~[0V|E 5>xDKfI>?S?H j3_}+-)j-$6.dbb#2`?jAx `9s/Evv6 ]b" % !   } \   w  ~3 o B 8 ' S   IPC_R$#:Tat!7q# d M  # Qb+y$4w85 zhf>s+:~:$4IcHpInT4Y,#BOt#j06q0 .k d p "/xt@bz]B%zvf{@Lb_ Dm]_#RbGNk^!g>@g\(3Ac4aU/XAV.a21t~bV]~K;~ZsJJhdC^wbZX68:^<)%_>%A)~H_{rQ G~H.IJL)8/}qF"!A}+DPVJ>AZ&Z$T!P*YxY$N2HC~7YdFk[Sp }-/o2 _~d\Y/G .C7k}-T (KRGP -2 m   +  t x H  / bD  (| } -e+5wg~LP.9;Ph}]>'"U2DR\nev3H13 Xm  9 F K[ynI&Eax;Z{M_]Ux4u-^%c~ 0 _/n6^HMOLAJ*o@m(O=X0A9yCL^GnNFYO.9&/O^ A<SS9 5Nut YpjOe "}HD`)6i E0dC'g eqQ3GF:~r,D?Z.ehSgZ u 6o(oOD'TBznnIzI#J}|Dkh3{ J %hA5_/p jUMcW-2B,&F%|A~;E@@1hcj| +  < w ~a ; * e K =V96ad{d]S.5&|$O`Vj1sF?vq~)&t)Nsu6(`E?h\u!?C@?A 9: %w : d hgc|  >oAc0z$+K@E1GROWU:B& Frc \q{f]w.BYC<Me3"C=X LyA5F~(#)3 Q*tw_Rj<K0H%qJ0H6# S.u]^IEbOja L4{.wH0 z^H sCo :]d{/tk*F~a7YPP[Y52GxQJ\|'$3^HL1T(9hh?8Y7UB+t yMw\`Z3Hij|)@p"z**I}&p),j X^l` &7 gg ; A K   j sl%T\'5nK'x>fN1Li{P"bU[6J"z'n<=]t7c]4xnb6[hc~1wKBBy%i X   B   E [ Y D4 ^ b 1fs+!!6Jv<oMO)l~d?t `$aj6( p}%WzK^PcMGc-9h(3U 4KSA> ;2~^)#3M RwM`V0 REbH;o$Hs:IY@^ $^dd)~!0 $% FhA&~d?aqD2.qtQ} ^#%wSv- N}/`42<>4>D]fG@VQx. 5r+egxW Jqm?xz!'zCpx s4Ce3#T[oh>bnZ_pC'Zp[]9iR} U.p<  H2 ^ Z-  % |&`#%[Hy:3]k7! b"0s]M:rzx5opHw,nz 62n?"O *:'3gj0#vQw{[)*-RF; O<km70*{p9gCB 5  J w ` {Z,B=CAvFYnY(J_qw/>rP}CRt 7rmQNY+SgQyt4zAp{ (x"wC^5jGZ&#USt=c/ye(XBaO 17m}Bg(IlTTK$<gOq_cUd=b**CNx= 6jK#)_|<&M~q`J2 <VVJLp3Tb,%~l~>hz>_p z/ 7? ^* ]0M0bA<&=!"gmLOuv ;8 8 ^ ' }W %t { k D  ! u~ %xxU\A 0`,$ Y~.O|A[n!e!#b5  eV ? ) e G~ s 3;  : h% : o[ :b /6 C pB  qz"I!SBu  k:DCm4Fc&Vi%k*Q|8vmoh.hnzw0qK.NyV\8$3#d<|K5A7&N6}x01_-M!*(t6@+7;Zpi|8m/\#EhHZ noXh+( L! g q  SJ p y W  )G iE<5#-{Y(KZkf^;Lcvo= AX~~<_}?>I3yMS__IWs=MvBoW/9ToSf @oK_"j%U[X#Xs;@lkTU5#Zwzl;ZH;<*/7$v :bR@"x|c+ R%9k( Ay W  $O 1 3 %(WwjU#q9Fh{^BP  c n $ >y  ^ r T \;      0 Q> l< {pDm1j\'?|_,^rs2fpFi,$(c&t7(jN] F-`drXy)nB"w%R@>[sWM+B|xoi_ky[ )7u]jclU|C/o7uP/*+OQuRhjW;VSo~\Ji kgiE% dDT>\ T   8 0v   P p   z%=NE<OgWNuCwazMmB=0FwPmmCOcPtfxukoJM8lQ 1z,+yl oP9pZLoIq .~'Q)MKS/jsGU($4 _aSJL+e;5E;8zg1'Nm>v$X$?fNH-!T#s 0 R   7ViyR <pE< i1ym      ~' ,r ] n t"  W (| I ! D { .#ZfZR-)g[5Sl;^[ y{;hF[T F>rmN\)QE%?&LK?-#J8^OPabP'Cy`)Am)n$#*&SziA1*{%nfzni) wA5*iRnL3s@Z 3 3~}\E?Q{}> U`RmVd+BYf SP~vS+alQtB#<83+R"k!X.%L|q70x9  Q C. lyNF[utDD~C#>deDD;v@G(,=vm=^kq!F#zaXbbPTo_L$h%@>%e#WteqW)mV> i\B64;7=~E$OYd?qx}Ays@ i3s8      I4  q3 |=r|-;- H i N 83 > F J ?   2 l  j Eq l L Mf9:6qyINV' s"44Tpp?}v <*Yb&{ST>)N]}R0dv4RxO<j&*%Y%</rablnv_p`M?>HXxmg&+#'$6a;{3BcTc`c`ZY<\US4d;gQJC;6e7AIVTq$q#QT M *IG= sk+iC^0{"]uK#2TVwRXSRy%SAjdFSiIQ1KO&9uM33PKyC-jNPr<|\u~^.~Z{!}l D2Xo)J;JWbla{'1gknDmk}=G2zLkSC |(7Il'y-\VC@52$  > }O j ] [ iS 6 W$y,Nnq4`J%spx}mE$nL+W&:$h{D 2g&0=QLekDbznxDJk @cDy6Z5`F}iKt %l~\8s @ L2KbWt>i}{V*GGaPVC1Y'<(U}qFur`M*Qo *5D\]o!yxtn1ic{YANJSgz8Nj)PsZR8jI'<aYnhi`{X]~q k>oi '&4>HDORLVay{'2W)8q\O *rQ| U  o'a-f"@iA=8`RRWw 3&A+h{yF{`>a% 6 ?]'j.wJr-MR . dw 9  c  H $tnfa-Q+rN$JULg<, %T ) 4 I eW N qO!i vZH#gC\&3~FJ#k8$8!\/z[10LOj\n3 #xT  2_hDm:d) !E;Wsq!eC)AJ>{ =FB0XLh=gI.$LPuPEEIwTe=l: sz$j"Ku@jv1.dH6n;h K|w6~}D # h$D'f|XW[<:)c&9&OR-/[(O\1]RX SlY@1AB|h/` ; u   ^  Kxm  +      I I %[W FtgB~uud6xd{ 6X}fEY!&o%#q}3'eg4pH;Ny.^2M=+Rkxyu{Z5%O"rJjAe|.~p&e#w|Q()qRf=o nCmlF _$f}%<i:%DJb&G&L*x5GHKgxW/>'|+x/ R#n >^v$h>     4O,#@}GuV  U z } V  ` KXa6N/wHB}xBY0Fv/KXToiMBh){\71Gs1kL 2lQOaKJk;1z bZXCBPh4WKOcWBfe4>?(j<-38DZxn1m](}EiXezT>Ci v?}J=K<H$f6r|\/M14V-"!?)Wj   Y $x=,FaB7     T <RM,a'X\+'F~l"_T%i}P]tk)k+ij6 -~/TaW7A s8v&ZR<OQZ%~1^Nj _qZUfYA;1``!!} L|sP4#!2WC9Z+lv  /Z1n9&Q<q@r|30x6(7_u~O8)}KO[DdO|x+TRwz^$ikJ0$$,7DQ`q I  v  K~ %7Ou6!NH<w*AMNF7qby`DRE O~"J[O#( JWQ:>Fg P& l,r.Z<\Q>\]9>$$-JX!`k(KHk3Kh~& fqq!")$)Ywzp6~zw,iJv+kT7ZbMw"rtC.` .Mh~ Q    6 &|r7Ahtt~a|u?QXVH2  JMt.o('Ez^W S/b{n9tWbr*pxB5"\a6b4(`3R=s&"sD$ `11B2VhYNl *v@CEBVvf`O g=D<H3Rx8 "|GI;<X~(m05b_![(|l[Ue/__) }  L  ( O a S    g ,~AP{kI5Fv'4uyR W6*M.(>m2fk,x2ng"Ae5 N}m#,.|$rFIn3'J Oddx4a"XsR#Z Wa|@jj-7pn*)S$}-soP@IXaYH6-6Vw#r%-whWC+0ZFGB72  ; <  p#P0$#1p=0 N = h  z [ &  r  3 `twf;"cVDx*x7EvcJ c:z#]Jqr<($ +/dELxr3N* E%5o.$PA" ?gPA k TdFU\aecX>+, >:zBV*^nK wU*B&S26V1 r7fMr0Rp{E |s-ZpE ]cA5>^di_Tanv`S${? I4%xi%I <  ' Z z p @    a e{xan"On-~;!&B@! z ,8?MqR/8D](1SI`kV`7K?r9gwugVD5&PK"B^HQDcm?!W-61Mk| >B .yF6n;]w}d$)x> p]f~I}::~[ @+;,IRhjlDX[?9~kfrOaa)k $Ba{q@=vgtGjz( v R    K 7 eb4@6,_+srlF/'Sp{u[/GluwT,$wp0 NJ6XM- xrzXJSshB jW,l ]2!kVW&Fd!U [S[/AC!)ScT'}Bm6ra3 Fu9'h3DHD9((@Zf_@ iK7d OL)))M <`{_)pQ@C_/%o5rQ-hiD`G;995*4_O   c9Oj<;os+L96}Rv99qXTb|%_VeIM5mygB9qN=76:?GQ^jw%W2Wu"<R^#z_D+J2)XvyX)d= ?^~;pKd<Y]F[`%O |@ k`eotl[J??J_y %+sN-8k12|^1lIow^L>87;I^} 2f*jU4Nj?aw2lL1j!j? {"_i>.9\5/az~oLMGIw% "5@LVdv.a4CtA N,%pSG~&{sk]CP_ e?duxq`F" %8A@7-(+;V| c@|zF T lL* h: g; 8Wz ",6<>BGTi3zWM !3?FN\q 5g6_HjAk#>Q[fv^),!q'm4I]2na'm3Ylo`=OO8J&-04AUs4@[U<yrJ171  4]/O:0jB#y9U }{>0|360#  %Ca}uicgvV'APQF. eQIHIG>+ a1uL _JCACIWqHy  "Bg 4[~.Gb 8Yy 3a /Oj.^#T'=Xx]xS~K'cP3d~jp'|%f1- {6 s#xBFo}u_@!7DE:*qc^cv!UkYy*||`:g0V<!*2AVv+Poe2{R;4<T|.`sL'&;Pf|hCo#1rG**DdE8Laq{|umc[SNOZn<cQ-OdiaXXg$P+9EMPT[k >o"Lq@h  - "+2Bct y9No}xAd ~QEv.|R%"lc{$7QSG6(%*<Usb;d9QtR);1wF#";YvZIVm)aLw/Ia{?7JH-Uf/ @hzU:%2\-YkIaudio-0.7.2/test/torchaudio_unittest/assets/vec_flt.ark000066400000000000000000000001211376444676100233370ustar00rootroot00000000000000key1 BFV ?@@@key2 BFV 0A@APAkey3 BFV AAAaudio-0.7.2/test/torchaudio_unittest/assets/vec_int.ark000066400000000000000000000001211376444676100233440ustar00rootroot00000000000000key1 Bkey2 B   key3 Baudio-0.7.2/test/torchaudio_unittest/backend_test.py000066400000000000000000000034341376444676100227260ustar00rootroot00000000000000import torchaudio from torchaudio_unittest import common_utils class BackendSwitchMixin: """Test set/get_audio_backend works""" backend = None backend_module = None def test_switch(self): torchaudio.set_audio_backend(self.backend) if self.backend is None: assert torchaudio.get_audio_backend() is None else: assert torchaudio.get_audio_backend() == self.backend assert torchaudio.load == self.backend_module.load assert torchaudio.load_wav == self.backend_module.load_wav assert torchaudio.save == self.backend_module.save assert torchaudio.info == self.backend_module.info class TestBackendSwitch_NoBackend(BackendSwitchMixin, common_utils.TorchaudioTestCase): backend = None backend_module = torchaudio.backend.no_backend @common_utils.skipIfNoExtension class TestBackendSwitch_SoX(BackendSwitchMixin, common_utils.TorchaudioTestCase): backend = 'sox' backend_module = torchaudio.backend.sox_backend @common_utils.skipIfNoExtension class TestBackendSwitch_SoXIO(BackendSwitchMixin, common_utils.TorchaudioTestCase): backend = 'sox_io' backend_module = torchaudio.backend.sox_io_backend @common_utils.skipIfNoModule('soundfile') class TestBackendSwitch_soundfile_legacy(BackendSwitchMixin, common_utils.TorchaudioTestCase): backend = 'soundfile' backend_module = torchaudio.backend.soundfile_backend @common_utils.skipIfNoModule('soundfile') class TestBackendSwitch_soundfile(BackendSwitchMixin, common_utils.TorchaudioTestCase): backend = 'soundfile' backend_module = torchaudio.backend._soundfile_backend def setUp(self): torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = False def tearDown(self): torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = True audio-0.7.2/test/torchaudio_unittest/batch_consistency_test.py000066400000000000000000000255141376444676100250440ustar00rootroot00000000000000"""Test numerical consistency among single input and batched input.""" import unittest import itertools from parameterized import parameterized import torch import torchaudio import torchaudio.functional as F from torchaudio_unittest import common_utils class TestFunctional(common_utils.TorchaudioTestCase): backend = 'default' """Test functions defined in `functional` module""" def assert_batch_consistency( self, functional, tensor, *args, batch_size=1, atol=1e-8, rtol=1e-5, seed=42, **kwargs): # run then batch the result torch.random.manual_seed(seed) expected = functional(tensor.clone(), *args, **kwargs) expected = expected.repeat([batch_size] + [1] * expected.dim()) # batch the input and run torch.random.manual_seed(seed) pattern = [batch_size] + [1] * tensor.dim() computed = functional(tensor.repeat(pattern), *args, **kwargs) self.assertEqual(computed, expected, rtol=rtol, atol=atol) def assert_batch_consistencies( self, functional, tensor, *args, atol=1e-8, rtol=1e-5, seed=42, **kwargs): self.assert_batch_consistency( functional, tensor, *args, batch_size=1, atol=atol, rtol=rtol, seed=seed, **kwargs) self.assert_batch_consistency( functional, tensor, *args, batch_size=3, atol=atol, rtol=rtol, seed=seed, **kwargs) def test_griffinlim(self): n_fft = 400 ws = 400 hop = 200 window = torch.hann_window(ws) power = 2 normalize = False momentum = 0.99 n_iter = 32 length = 1000 tensor = torch.rand((1, 201, 6)) self.assert_batch_consistencies( F.griffinlim, tensor, window, n_fft, hop, ws, power, normalize, n_iter, momentum, length, 0, atol=5e-5 ) @parameterized.expand(list(itertools.product( [100, 440], [8000, 16000, 44100], [1, 2], )), name_func=lambda f, _, p: f'{f.__name__}_{"_".join(str(arg) for arg in p.args)}') def test_detect_pitch_frequency(self, frequency, sample_rate, n_channels): waveform = common_utils.get_sinusoid(frequency=frequency, sample_rate=sample_rate, n_channels=n_channels, duration=5) self.assert_batch_consistencies(F.detect_pitch_frequency, waveform, sample_rate) def test_contrast(self): waveform = torch.rand(2, 100) - 0.5 self.assert_batch_consistencies(F.contrast, waveform, enhancement_amount=80.) def test_dcshift(self): waveform = torch.rand(2, 100) - 0.5 self.assert_batch_consistencies(F.dcshift, waveform, shift=0.5, limiter_gain=0.05) def test_overdrive(self): waveform = torch.rand(2, 100) - 0.5 self.assert_batch_consistencies(F.overdrive, waveform, gain=45, colour=30) def test_phaser(self): sample_rate = 44100 waveform = common_utils.get_whitenoise( sample_rate=sample_rate, duration=5, ) self.assert_batch_consistencies(F.phaser, waveform, sample_rate) def test_flanger(self): torch.random.manual_seed(40) waveform = torch.rand(2, 100) - 0.5 sample_rate = 44100 self.assert_batch_consistencies(F.flanger, waveform, sample_rate) def test_sliding_window_cmn(self): waveform = torch.randn(2, 1024) - 0.5 self.assert_batch_consistencies(F.sliding_window_cmn, waveform, center=True, norm_vars=True) self.assert_batch_consistencies(F.sliding_window_cmn, waveform, center=True, norm_vars=False) self.assert_batch_consistencies(F.sliding_window_cmn, waveform, center=False, norm_vars=True) self.assert_batch_consistencies(F.sliding_window_cmn, waveform, center=False, norm_vars=False) def test_vad(self): common_utils.set_audio_backend('default') filepath = common_utils.get_asset_path("vad-go-mono-32000.wav") waveform, sample_rate = torchaudio.load(filepath) self.assert_batch_consistencies(F.vad, waveform, sample_rate=sample_rate) class TestTransforms(common_utils.TorchaudioTestCase): backend = 'default' """Test suite for classes defined in `transforms` module""" def test_batch_AmplitudeToDB(self): spec = torch.rand((6, 201)) # Single then transform then batch expected = torchaudio.transforms.AmplitudeToDB()(spec).repeat(3, 1, 1) # Batch then transform computed = torchaudio.transforms.AmplitudeToDB()(spec.repeat(3, 1, 1)) self.assertEqual(computed, expected) def test_batch_Resample(self): waveform = torch.randn(2, 2786) # Single then transform then batch expected = torchaudio.transforms.Resample()(waveform).repeat(3, 1, 1) # Batch then transform computed = torchaudio.transforms.Resample()(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected) def test_batch_MelScale(self): specgram = torch.randn(2, 31, 2786) # Single then transform then batch expected = torchaudio.transforms.MelScale()(specgram).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.MelScale()(specgram.repeat(3, 1, 1, 1)) # shape = (3, 2, 201, 1394) self.assertEqual(computed, expected) def test_batch_InverseMelScale(self): n_mels = 32 n_stft = 5 mel_spec = torch.randn(2, n_mels, 32) ** 2 # Single then transform then batch expected = torchaudio.transforms.InverseMelScale(n_stft, n_mels)(mel_spec).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.InverseMelScale(n_stft, n_mels)(mel_spec.repeat(3, 1, 1, 1)) # shape = (3, 2, n_mels, 32) # Because InverseMelScale runs SGD on randomly initialized values so they do not yield # exactly same result. For this reason, tolerance is very relaxed here. self.assertEqual(computed, expected, atol=1.0, rtol=1e-5) def test_batch_compute_deltas(self): specgram = torch.randn(2, 31, 2786) # Single then transform then batch expected = torchaudio.transforms.ComputeDeltas()(specgram).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.ComputeDeltas()(specgram.repeat(3, 1, 1, 1)) # shape = (3, 2, 201, 1394) self.assertEqual(computed, expected) def test_batch_mulaw(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 # Single then transform then batch waveform_encoded = torchaudio.transforms.MuLawEncoding()(waveform) expected = waveform_encoded.unsqueeze(0).repeat(3, 1, 1) # Batch then transform waveform_batched = waveform.unsqueeze(0).repeat(3, 1, 1) computed = torchaudio.transforms.MuLawEncoding()(waveform_batched) # shape = (3, 2, 201, 1394) self.assertEqual(computed, expected) # Single then transform then batch waveform_decoded = torchaudio.transforms.MuLawDecoding()(waveform_encoded) expected = waveform_decoded.unsqueeze(0).repeat(3, 1, 1) # Batch then transform computed = torchaudio.transforms.MuLawDecoding()(computed) # shape = (3, 2, 201, 1394) self.assertEqual(computed, expected) def test_batch_spectrogram(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 # Single then transform then batch expected = torchaudio.transforms.Spectrogram()(waveform).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.Spectrogram()(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected) def test_batch_melspectrogram(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 # Single then transform then batch expected = torchaudio.transforms.MelSpectrogram()(waveform).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.MelSpectrogram()(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected) def test_batch_mfcc(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # Single then transform then batch expected = torchaudio.transforms.MFCC()(waveform).repeat(3, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.MFCC()(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected, atol=1e-4, rtol=1e-5) def test_batch_TimeStretch(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 kwargs = { 'n_fft': 2048, 'hop_length': 512, 'win_length': 2048, 'window': torch.hann_window(2048), 'center': True, 'pad_mode': 'reflect', 'normalized': True, 'onesided': True, } rate = 2 complex_specgrams = torch.stft(waveform, **kwargs) # Single then transform then batch expected = torchaudio.transforms.TimeStretch( fixed_rate=rate, n_freq=1025, hop_length=512, )(complex_specgrams).repeat(3, 1, 1, 1, 1) # Batch then transform computed = torchaudio.transforms.TimeStretch( fixed_rate=rate, n_freq=1025, hop_length=512, )(complex_specgrams.repeat(3, 1, 1, 1, 1)) self.assertEqual(computed, expected, atol=1e-5, rtol=1e-5) def test_batch_Fade(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 fade_in_len = 3000 fade_out_len = 3000 # Single then transform then batch expected = torchaudio.transforms.Fade(fade_in_len, fade_out_len)(waveform).repeat(3, 1, 1) # Batch then transform computed = torchaudio.transforms.Fade(fade_in_len, fade_out_len)(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected) def test_batch_Vol(self): test_filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform, _ = torchaudio.load(test_filepath) # (2, 278756), 44100 # Single then transform then batch expected = torchaudio.transforms.Vol(gain=1.1)(waveform).repeat(3, 1, 1) # Batch then transform computed = torchaudio.transforms.Vol(gain=1.1)(waveform.repeat(3, 1, 1)) self.assertEqual(computed, expected) audio-0.7.2/test/torchaudio_unittest/common_utils/000077500000000000000000000000001376444676100224325ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/common_utils/__init__.py000066400000000000000000000010131376444676100245360ustar00rootroot00000000000000from .data_utils import ( get_asset_path, get_whitenoise, get_sinusoid, ) from .backend_utils import ( set_audio_backend, ) from .case_utils import ( TempDirMixin, TestBaseMixin, PytorchTestCase, TorchaudioTestCase, skipIfNoCuda, skipIfNoExec, skipIfNoModule, skipIfNoExtension, skipIfNoSoxBackend, ) from .wav_utils import ( get_wav_data, normalize_wav, load_wav, save_wav, ) from .parameterized_utils import ( load_params, ) from . import sox_utils audio-0.7.2/test/torchaudio_unittest/common_utils/backend_utils.py000066400000000000000000000012201376444676100256060ustar00rootroot00000000000000import unittest import torchaudio def set_audio_backend(backend): """Allow additional backend value, 'default'""" backends = torchaudio.list_audio_backends() if backend == 'soundfile-new': be = 'soundfile' torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = False elif backend == 'default': if 'sox_io' in backends: be = 'sox_io' elif 'soundfile' in backends: be = 'soundfile' torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = True else: raise unittest.SkipTest('No default backend available') else: be = backend torchaudio.set_audio_backend(be) audio-0.7.2/test/torchaudio_unittest/common_utils/case_utils.py000066400000000000000000000044641376444676100251470ustar00rootroot00000000000000import shutil import os.path import tempfile import unittest import torch from torch.testing._internal.common_utils import TestCase as PytorchTestCase import torchaudio from torchaudio._internal.module_utils import is_module_available from .backend_utils import set_audio_backend class TempDirMixin: """Mixin to provide easy access to temp dir""" temp_dir_ = None @classmethod def get_base_temp_dir(cls): # If TORCHAUDIO_TEST_TEMP_DIR is set, use it instead of temporary directory. # this is handy for debugging. key = 'TORCHAUDIO_TEST_TEMP_DIR' if key in os.environ: return os.environ[key] if cls.temp_dir_ is None: cls.temp_dir_ = tempfile.TemporaryDirectory() return cls.temp_dir_.name @classmethod def tearDownClass(cls): super().tearDownClass() if cls.temp_dir_ is not None: cls.temp_dir_.cleanup() cls.temp_dir_ = None def get_temp_path(self, *paths): temp_dir = os.path.join(self.get_base_temp_dir(), self.id()) path = os.path.join(temp_dir, *paths) os.makedirs(os.path.dirname(path), exist_ok=True) return path class TestBaseMixin: """Mixin to provide consistent way to define device/dtype/backend aware TestCase""" dtype = None device = None backend = None def setUp(self): super().setUp() set_audio_backend(self.backend) class TorchaudioTestCase(TestBaseMixin, PytorchTestCase): pass def skipIfNoExec(cmd): return unittest.skipIf(shutil.which(cmd) is None, f'`{cmd}` is not available') def skipIfNoModule(module, display_name=None): display_name = display_name or module return unittest.skipIf(not is_module_available(module), f'"{display_name}" is not available') skipIfNoSoxBackend = unittest.skipIf( 'sox' not in torchaudio.list_audio_backends(), 'Sox backend not available') skipIfNoCuda = unittest.skipIf(not torch.cuda.is_available(), reason='CUDA not available') def skipIfNoExtension(test_item): if is_module_available('torchaudio._torchaudio'): return test_item if 'TORCHAUDIO_TEST_FAIL_IF_NO_EXTENSION' in os.environ: raise RuntimeError('torchaudio C++ extension is not available.') return unittest.skip('torchaudio C++ extension is not available')(test_item) audio-0.7.2/test/torchaudio_unittest/common_utils/data_utils.py000066400000000000000000000072101376444676100251350ustar00rootroot00000000000000import os.path from typing import Union import torch _TEST_DIR_PATH = os.path.realpath( os.path.join(os.path.dirname(__file__), '..')) def get_asset_path(*paths): """Return full path of a test asset""" return os.path.join(_TEST_DIR_PATH, 'assets', *paths) def convert_tensor_encoding( tensor: torch.tensor, dtype: torch.dtype, ): """Convert input tensor with values between -1 and 1 to integer encoding Args: tensor: input tensor, assumed between -1 and 1 dtype: desired output tensor dtype Returns: Tensor: shape of (n_channels, sample_rate * duration) """ if dtype == torch.int32: tensor *= (tensor > 0) * 2147483647 + (tensor < 0) * 2147483648 if dtype == torch.int16: tensor *= (tensor > 0) * 32767 + (tensor < 0) * 32768 if dtype == torch.uint8: tensor *= (tensor > 0) * 127 + (tensor < 0) * 128 tensor += 128 tensor = tensor.to(dtype) return tensor def get_whitenoise( *, sample_rate: int = 16000, duration: float = 1, # seconds n_channels: int = 1, seed: int = 0, dtype: Union[str, torch.dtype] = "float32", device: Union[str, torch.device] = "cpu", channels_first=True, scale_factor: float = 1, ): """Generate pseudo audio data with whitenoise Args: sample_rate: Sampling rate duration: Length of the resulting Tensor in seconds. n_channels: Number of channels seed: Seed value used for random number generation. Note that this function does not modify global random generator state. dtype: Torch dtype device: device channels_first: whether first dimension is n_channels scale_factor: scale the Tensor before clamping and quantization Returns: Tensor: shape of (n_channels, sample_rate * duration) """ if isinstance(dtype, str): dtype = getattr(torch, dtype) if dtype not in [torch.float32, torch.int32, torch.int16, torch.uint8]: raise NotImplementedError(f'dtype {dtype} is not supported.') # According to the doc, folking rng on all CUDA devices is slow when there are many CUDA devices, # so we only fork on CPU, generate values and move the data to the given device with torch.random.fork_rng([]): torch.random.manual_seed(seed) tensor = torch.randn([int(sample_rate * duration)], dtype=torch.float32, device='cpu') tensor /= 2.0 tensor *= scale_factor tensor.clamp_(-1.0, 1.0) tensor = tensor.repeat([n_channels, 1]) if not channels_first: tensor = tensor.t() return convert_tensor_encoding(tensor, dtype) def get_sinusoid( *, frequency: float = 300, sample_rate: int = 16000, duration: float = 1, # seconds n_channels: int = 1, dtype: Union[str, torch.dtype] = "float32", device: Union[str, torch.device] = "cpu", channels_first: bool = True, ): """Generate pseudo audio data with sine wave. Args: frequency: Frequency of sine wave sample_rate: Sampling rate duration: Length of the resulting Tensor in seconds. n_channels: Number of channels dtype: Torch dtype device: device Returns: Tensor: shape of (n_channels, sample_rate * duration) """ if isinstance(dtype, str): dtype = getattr(torch, dtype) pie2 = 2 * 3.141592653589793 end = pie2 * frequency * duration theta = torch.linspace(0, end, int(sample_rate * duration), dtype=torch.float32, device=device) tensor = torch.sin(theta, out=None).repeat([n_channels, 1]) if not channels_first: tensor = tensor.t() return convert_tensor_encoding(tensor, dtype) audio-0.7.2/test/torchaudio_unittest/common_utils/parameterized_utils.py000066400000000000000000000003361376444676100270620ustar00rootroot00000000000000import json from parameterized import param from .data_utils import get_asset_path def load_params(*paths): with open(get_asset_path(*paths), 'r') as file: return [param(json.loads(line)) for line in file] audio-0.7.2/test/torchaudio_unittest/common_utils/sox_utils.py000066400000000000000000000061401376444676100250360ustar00rootroot00000000000000import subprocess def get_encoding(dtype): encodings = { 'float32': 'floating-point', 'int32': 'signed-integer', 'int16': 'signed-integer', 'uint8': 'unsigned-integer', } return encodings[dtype] def get_bit_depth(dtype): bit_depths = { 'float32': 32, 'int32': 32, 'int16': 16, 'uint8': 8, } return bit_depths[dtype] def gen_audio_file( path, sample_rate, num_channels, *, encoding=None, bit_depth=None, compression=None, attenuation=None, duration=1, ): """Generate synthetic audio file with `sox` command.""" if path.endswith('.wav'): raise RuntimeError( 'Use get_wav_data and save_wav to generate wav file for accurate result.') command = [ 'sox', '-V3', # verbose '-R', # -R is supposed to be repeatable, though the implementation looks suspicious # and not setting the seed to a fixed value. # https://fossies.org/dox/sox-14.4.2/sox_8c_source.html # search "sox_globals.repeatable" ] if bit_depth is not None: command += ['--bits', str(bit_depth)] command += [ '--rate', str(sample_rate), '--null', # no input '--channels', str(num_channels), ] if compression is not None: command += ['--compression', str(compression)] if bit_depth is not None: command += ['--bits', str(bit_depth)] if encoding is not None: command += ['--encoding', str(encoding)] command += [ str(path), 'synth', str(duration), # synthesizes for the given duration [sec] 'sawtooth', '1', # saw tooth covers the both ends of value range, which is a good property for test. # similar to linspace(-1., 1.) # this introduces bigger boundary effect than sine when converted to mp3 ] if attenuation is not None: command += ['vol', f'-{attenuation}dB'] print(' '.join(command)) subprocess.run(command, check=True) def convert_audio_file( src_path, dst_path, *, bit_depth=None, compression=None): """Convert audio file with `sox` command.""" command = ['sox', '-V3', '-R', str(src_path)] if bit_depth is not None: command += ['--bits', str(bit_depth)] if compression is not None: command += ['--compression', str(compression)] command += [dst_path] print(' '.join(command)) subprocess.run(command, check=True) def _flattern(effects): if not effects: return effects if isinstance(effects[0], str): return effects return [item for sublist in effects for item in sublist] def run_sox_effect(input_file, output_file, effect, *, output_sample_rate=None, output_bitdepth=None): """Run sox effects""" effect = _flattern(effect) command = ['sox', '-V', '--no-dither', input_file] if output_bitdepth: command += ['--bits', str(output_bitdepth)] command += [output_file] + effect if output_sample_rate: command += ['rate', str(output_sample_rate)] print(' '.join(command)) subprocess.run(command, check=True) audio-0.7.2/test/torchaudio_unittest/common_utils/wav_utils.py000066400000000000000000000055441376444676100250310ustar00rootroot00000000000000from typing import Optional import torch import scipy.io.wavfile def normalize_wav(tensor: torch.Tensor) -> torch.Tensor: if tensor.dtype == torch.float32: pass elif tensor.dtype == torch.int32: tensor = tensor.to(torch.float32) tensor[tensor > 0] /= 2147483647. tensor[tensor < 0] /= 2147483648. elif tensor.dtype == torch.int16: tensor = tensor.to(torch.float32) tensor[tensor > 0] /= 32767. tensor[tensor < 0] /= 32768. elif tensor.dtype == torch.uint8: tensor = tensor.to(torch.float32) - 128 tensor[tensor > 0] /= 127. tensor[tensor < 0] /= 128. return tensor def get_wav_data( dtype: str, num_channels: int, *, num_frames: Optional[int] = None, normalize: bool = True, channels_first: bool = True, ): """Generate linear signal of the given dtype and num_channels Data range is [-1.0, 1.0] for float32, [-2147483648, 2147483647] for int32 [-32768, 32767] for int16 [0, 255] for uint8 num_frames allow to change the linear interpolation parameter. Default values are 256 for uint8, else 1 << 16. 1 << 16 as default is so that int16 value range is completely covered. """ dtype_ = getattr(torch, dtype) if num_frames is None: if dtype == 'uint8': num_frames = 256 else: num_frames = 1 << 16 if dtype == 'uint8': base = torch.linspace(0, 255, num_frames, dtype=dtype_) elif dtype == 'int8': base = torch.linspace(-128, 127, num_frames, dtype=dtype_) elif dtype == 'float32': base = torch.linspace(-1., 1., num_frames, dtype=dtype_) elif dtype == 'float64': base = torch.linspace(-1., 1., num_frames, dtype=dtype_) elif dtype == 'int32': base = torch.linspace(-2147483648, 2147483647, num_frames, dtype=dtype_) elif dtype == 'int16': base = torch.linspace(-32768, 32767, num_frames, dtype=dtype_) else: raise NotImplementedError(f'Unsupported dtype {dtype}') data = base.repeat([num_channels, 1]) if not channels_first: data = data.transpose(1, 0) if normalize: data = normalize_wav(data) return data def load_wav(path: str, normalize=True, channels_first=True) -> torch.Tensor: """Load wav file without torchaudio""" sample_rate, data = scipy.io.wavfile.read(path) data = torch.from_numpy(data.copy()) if data.ndim == 1: data = data.unsqueeze(1) if normalize: data = normalize_wav(data) if channels_first: data = data.transpose(1, 0) return data, sample_rate def save_wav(path, data, sample_rate, channels_first=True): """Save wav file without torchaudio""" if channels_first: data = data.transpose(1, 0) scipy.io.wavfile.write(path, sample_rate, data.numpy()) audio-0.7.2/test/torchaudio_unittest/compliance/000077500000000000000000000000001376444676100220345ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/compliance/__init__.py000066400000000000000000000000001376444676100241330ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/compliance/generate_fbank_data.py000066400000000000000000000162551376444676100263430ustar00rootroot00000000000000import argparse import logging import os import random import subprocess import torch import torchaudio import utils def run(exe_path, scp_path, out_dir, wave_len, num_outputs, remove_files, log_level): logging.basicConfig(level=log_level) for _ in range(num_outputs): try: nyquist = 16000 // 2 high_freq = random.randint(1, nyquist) low_freq = random.randint(0, high_freq - 1) vtln_low = random.randint(low_freq + 1, high_freq - 1) vtln_high = random.randint(vtln_low + 1, high_freq - 1) vtln_warp_factor = random.uniform(0.0, 10.0) if random.random() < 0.3 else 1.0 except Exception: continue if not ((0.0 <= low_freq < nyquist) and (0.0 < high_freq <= nyquist) and (low_freq < high_freq)): continue if not (vtln_warp_factor == 1.0 or ((low_freq < vtln_low < high_freq) and (0.0 < vtln_high < high_freq) and (vtln_low < vtln_high))): continue inputs = { 'blackman_coeff': '%.4f' % (random.random() * 5), 'energy_floor': '%.4f' % (random.random() * 5), 'frame_length': '%.4f' % (float(random.randint(3, wave_len - 1)) / 16000 * 1000), 'frame_shift': '%.4f' % (float(random.randint(1, wave_len - 1)) / 16000 * 1000), 'high_freq': str(high_freq), 'htk_compat': utils.generate_rand_boolean(), 'low_freq': str(low_freq), 'num_mel_bins': str(random.randint(4, 8)), 'preemphasis_coefficient': '%.2f' % random.random(), 'raw_energy': utils.generate_rand_boolean(), 'remove_dc_offset': utils.generate_rand_boolean(), 'round_to_power_of_two': utils.generate_rand_boolean(), 'snip_edges': utils.generate_rand_boolean(), 'subtract_mean': utils.generate_rand_boolean(), 'use_energy': utils.generate_rand_boolean(), 'use_log_fbank': utils.generate_rand_boolean(), 'use_power': utils.generate_rand_boolean(), 'vtln_high': str(vtln_high), 'vtln_low': str(vtln_low), 'vtln_warp': '%.4f' % (vtln_warp_factor), 'window_type': utils.generate_rand_window_type() } fn = 'fbank-' + ('-'.join(list(inputs.values()))) out_fn = out_dir + fn + '.ark' arg = [exe_path] arg += ['--' + k.replace('_', '-') + '=' + inputs[k] for k in inputs] arg += ['--dither=0.0', scp_path, out_fn] logging.info(fn) logging.info(inputs) logging.info(' '.join(arg)) try: if log_level == 'INFO': subprocess.call(arg) else: subprocess.call(arg, stderr=open(os.devnull, 'wb'), stdout=open(os.devnull, 'wb')) logging.info('success') except Exception: if remove_files and os.path.exists(out_fn): os.remove(out_fn) def decode(fn, sound_path, exe_path, scp_path, out_dir): """ Takes a filepath and prints out the corresponding shell command to run that specific kaldi configuration. It also calls compliance.kaldi and prints the two outputs. Example: >> fn = 'fbank-1.1009-2.5985-1.1875-0.8750-5723-true-918-4-0.31-true-false-true-true-' \ 'false-false-false-true-4595-4281-1.0000-hamming.ark' >> decode(fn) """ out_fn = out_dir + fn fn = fn[len('fbank-'):-len('.ark')] arr = [ 'blackman_coeff', 'energy_floor', 'frame_length', 'frame_shift', 'high_freq', 'htk_compat', 'low_freq', 'num_mel_bins', 'preemphasis_coefficient', 'raw_energy', 'remove_dc_offset', 'round_to_power_of_two', 'snip_edges', 'subtract_mean', 'use_energy', 'use_log_fbank', 'use_power', 'vtln_high', 'vtln_low', 'vtln_warp', 'window_type'] fn_split = fn.split('-') assert len(fn_split) == len(arr), ('Len mismatch: {} and {}'.format(len(fn_split), len(arr))) inputs = {arr[i]: utils.parse(fn_split[i]) for i in range(len(arr))} # print flags for C++ s = ' '.join(['--' + arr[i].replace('_', '-') + '=' + fn_split[i] for i in range(len(arr))]) logging.info(exe_path + ' --dither=0.0 --debug-mel=true ' + s + ' ' + scp_path + ' ' + out_fn) logging.info() # print args for python inputs['dither'] = 0.0 logging.info(inputs) sound, sample_rate = torchaudio.load_wav(sound_path) kaldi_output_dict = {k: v for k, v in torchaudio.kaldi_io.read_mat_ark(out_fn)} res = torchaudio.compliance.kaldi.fbank(sound, **inputs) torch.set_printoptions(precision=10, sci_mode=False) logging.info(res) logging.info(kaldi_output_dict['my_id']) if __name__ == '__main__': """ Examples: >> python test/compliance/generate_fbank_data.py \ --exe_path=/scratch/jamarshon/kaldi/src/featbin/compute-fbank-feats \ --scp_path=scp:/scratch/jamarshon/downloads/a.scp \ --out_dir=ark:/scratch/jamarshon/audio/test/assets/kaldi/ >> python test/compliance/generate_fbank_data.py \ --exe_path=/scratch/jamarshon/kaldi/src/featbin/compute-fbank-feats \ --scp_path=scp:/scratch/jamarshon/downloads/a.scp \ --out_dir=ark:/scratch/jamarshon/audio/test/assets/kaldi/ \ --decode=true \ --sound_path=/scratch/jamarshon/audio/test/assets/kaldi_file.wav \ --fn="fbank-1.1009-2.5985-1.1875-0.8750-5723-true-918-4-0.31-true-false-true- true-false-false-false-true-4595-4281-1.0000-hamming.ark" """ parser = argparse.ArgumentParser(description='Generate fbank data using Kaldi.') parser.add_argument('--exe_path', type=str, required=True, help='Path to the compute-fbank-feats executable.') parser.add_argument('--scp_path', type=str, required=True, help='Path to the scp file. An example of its contents would be \ "my_id /scratch/jamarshon/audio/test/assets/kaldi_file.wav". where the space separates an id from a wav file.') parser.add_argument('--out_dir', type=str, required=True, help='The directory to which the stft features will be written to.') # run arguments parser.add_argument('--wave_len', type=int, default=20, help='The number of samples inside the input wave file read from `scp_path`') parser.add_argument('--num_outputs', type=int, default=100, help='How many output files should be generated.') parser.add_argument('--remove_files', type=bool, default=False, help='Whether to remove files generated from exception') parser.add_argument('--log_level', type=str, default='WARNING', help='Log level (DEBUG|INFO|WARNING|ERROR|CRITICAL)') # decode arguments parser.add_argument('--decode', type=bool, default=False, help='Whether to run the decode or run function.') parser.add_argument('--fn', type=str, help='Filepath to decode.') parser.add_argument('--sound_path', type=str, help='Sound filepath to decode.') args = parser.parse_args() if args.decode: decode(args.fn, args.sound_path, args.exe_path, args.scp_path, args.out_dir) else: run(args.exe_path, args.scp_path, args.out_dir, args.wave_len, args.num_outputs, args.remove_files, args.log_level) audio-0.7.2/test/torchaudio_unittest/compliance/generate_test_stft_data.py000066400000000000000000000065301376444676100272740ustar00rootroot00000000000000import argparse import logging import os import random import subprocess import utils def run(exe_path, scp_path, out_dir, wave_len, num_outputs, remove_files, log_level): logging.basicConfig(level=log_level) for _ in range(num_outputs): inputs = { 'blackman_coeff': '%.4f' % (random.random() * 5), 'dither': '0', 'energy_floor': '%.4f' % (random.random() * 5), 'frame_length': '%.4f' % (float(random.randint(2, wave_len - 1)) / 16000 * 1000), 'frame_shift': '%.4f' % (float(random.randint(1, wave_len - 1)) / 16000 * 1000), 'preemphasis_coefficient': '%.2f' % random.random(), 'raw_energy': utils.generate_rand_boolean(), 'remove_dc_offset': utils.generate_rand_boolean(), 'round_to_power_of_two': utils.generate_rand_boolean(), 'snip_edges': utils.generate_rand_boolean(), 'subtract_mean': utils.generate_rand_boolean(), 'window_type': utils.generate_rand_window_type() } fn = 'spec-' + ('-'.join(list(inputs.values()))) out_fn = out_dir + fn + '.ark' arg = [exe_path] arg += ['--' + k.replace('_', '-') + '=' + inputs[k] for k in inputs] arg += [scp_path, out_fn] logging.info(fn) logging.info(inputs) logging.info(' '.join(arg)) try: if log_level == 'INFO': subprocess.call(arg) else: subprocess.call(arg, stderr=open(os.devnull, 'wb'), stdout=open(os.devnull, 'wb')) logging.info('success') except Exception: if remove_files and os.path.exists(out_fn): os.remove(out_fn) if __name__ == '__main__': """ Examples: >> python test/compliance/generate_test_stft_data.py \ --exe_path=/scratch/jamarshon/kaldi/src/featbin/compute-spectrogram-feats \ --scp_path=scp:/scratch/jamarshon/downloads/a.scp \ --out_dir=ark:/scratch/jamarshon/audio/test/assets/kaldi/ """ parser = argparse.ArgumentParser(description='Generate spectrogram data using Kaldi.') parser.add_argument('--exe_path', type=str, required=True, help='Path to the compute-spectrogram-feats executable.') parser.add_argument('--scp_path', type=str, required=True, help='Path to the scp file. An example of its contents would be \ "my_id /scratch/jamarshon/audio/test/assets/kaldi_file.wav". where the space separates an id from a wav file.') parser.add_argument('--out_dir', type=str, required=True, help='The directory to which the stft features will be written to.') # run arguments parser.add_argument('--wave_len', type=int, default=20, help='The number of samples inside the input wave file read from `scp_path`') parser.add_argument('--num_outputs', type=int, default=100, help='How many output files should be generated.') parser.add_argument('--remove_files', type=bool, default=False, help='Whether to remove files generated from exception') parser.add_argument('--log_level', type=str, default='WARNING', help='Log level (DEBUG|INFO|WARNING|ERROR|CRITICAL)') args = parser.parse_args() run(args.exe_path, args.scp_path, args.out_dir, args.wave_len, args.num_outputs, args.remove_files, args.log_level) audio-0.7.2/test/torchaudio_unittest/compliance/utils.py000066400000000000000000000013741376444676100235530ustar00rootroot00000000000000import random import torchaudio TEST_PREFIX = ['spec', 'fbank', 'mfcc', 'resample'] def generate_rand_boolean(): # Generates a random boolean ('true', 'false') return 'true' if random.randint(0, 1) else 'false' def generate_rand_window_type(): # Generates a random window type return torchaudio.compliance.kaldi.WINDOWS[random.randint(0, len(torchaudio.compliance.kaldi.WINDOWS) - 1)] def parse(token): # converts an arg extracted from filepath to its corresponding python type if token == 'true': return True if token == 'false': return False if token in torchaudio.compliance.kaldi.WINDOWS or token in TEST_PREFIX: return token if '.' in token: return float(token) return int(token) audio-0.7.2/test/torchaudio_unittest/compliance_kaldi_test.py000066400000000000000000000254551376444676100246240ustar00rootroot00000000000000import os import math import unittest import torch import torchaudio import torchaudio.compliance.kaldi as kaldi from torchaudio_unittest import common_utils from .compliance import utils as compliance_utils def extract_window(window, wave, f, frame_length, frame_shift, snip_edges): # just a copy of ExtractWindow from feature-window.cc in python def first_sample_of_frame(frame, window_size, window_shift, snip_edges): if snip_edges: return frame * window_shift else: midpoint_of_frame = frame * window_shift + window_shift // 2 beginning_of_frame = midpoint_of_frame - window_size // 2 return beginning_of_frame sample_offset = 0 num_samples = sample_offset + wave.size(0) start_sample = first_sample_of_frame(f, frame_length, frame_shift, snip_edges) end_sample = start_sample + frame_length if snip_edges: assert(start_sample >= sample_offset and end_sample <= num_samples) else: assert(sample_offset == 0 or start_sample >= sample_offset) wave_start = start_sample - sample_offset wave_end = wave_start + frame_length if wave_start >= 0 and wave_end <= wave.size(0): window[f, :] = wave[wave_start:(wave_start + frame_length)] else: wave_dim = wave.size(0) for s in range(frame_length): s_in_wave = s + wave_start while s_in_wave < 0 or s_in_wave >= wave_dim: if s_in_wave < 0: s_in_wave = - s_in_wave - 1 else: s_in_wave = 2 * wave_dim - 1 - s_in_wave window[f, s] = wave[s_in_wave] @common_utils.skipIfNoSoxBackend class Test_Kaldi(common_utils.TempDirMixin, common_utils.TorchaudioTestCase): backend = 'sox' kaldi_output_dir = common_utils.get_asset_path('kaldi') test_filepath = common_utils.get_asset_path('kaldi_file.wav') test_filepaths = {prefix: [] for prefix in compliance_utils.TEST_PREFIX} def setUp(self): super().setUp() # 1. test signal for testing resampling self.test1_signal_sr = 16000 self.test1_signal = common_utils.get_whitenoise( sample_rate=self.test1_signal_sr, duration=0.5, ) # 2. test audio file corresponding to saved kaldi ark files self.test2_filepath = common_utils.get_asset_path('kaldi_file_8000.wav') # separating test files by their types (e.g 'spec', 'fbank', etc.) for f in os.listdir(kaldi_output_dir): dash_idx = f.find('-') assert f.endswith('.ark') and dash_idx != -1 key = f[:dash_idx] assert key in test_filepaths test_filepaths[key].append(f) def _test_get_strided_helper(self, num_samples, window_size, window_shift, snip_edges): waveform = torch.arange(num_samples).float() output = kaldi._get_strided(waveform, window_size, window_shift, snip_edges) # from NumFrames in feature-window.cc n = window_size if snip_edges: m = 0 if num_samples < window_size else 1 + (num_samples - window_size) // window_shift else: m = (num_samples + (window_shift // 2)) // window_shift self.assertTrue(output.dim() == 2) self.assertTrue(output.shape[0] == m and output.shape[1] == n) window = torch.empty((m, window_size)) for r in range(m): extract_window(window, waveform, r, window_size, window_shift, snip_edges) torch.testing.assert_allclose(window, output) def test_get_strided(self): # generate any combination where 0 < window_size <= num_samples and # 0 < window_shift. for num_samples in range(1, 20): for window_size in range(1, num_samples + 1): for window_shift in range(1, 2 * num_samples + 1): for snip_edges in range(0, 2): self._test_get_strided_helper(num_samples, window_size, window_shift, snip_edges) def _create_data_set(self): # used to generate the dataset to test on. this is not used in testing (offline procedure) sr = 16000 x = torch.arange(0, 20).float() # between [-6,6] y = torch.cos(2 * math.pi * x) + 3 * torch.sin(math.pi * x) + 2 * torch.cos(x) # between [-2^30, 2^30] y = (y / 6 * (1 << 30)).long() # clear the last 16 bits because they aren't used anyways y = ((y >> 16) << 16).float() torchaudio.save(self.test_filepath, y, sr) sound, sample_rate = torchaudio.load(self.test_filepath, normalization=False) print(y >> 16) self.assertTrue(sample_rate == sr) torch.testing.assert_allclose(y, sound) def _print_diagnostic(self, output, expect_output): # given an output and expected output, it will print the absolute/relative errors (max and mean squared) abs_error = output - expect_output abs_mse = abs_error.pow(2).sum() / output.numel() abs_max_error = torch.max(abs_error.abs()) relative_error = abs_error / expect_output relative_mse = relative_error.pow(2).sum() / output.numel() relative_max_error = torch.max(relative_error.abs()) print('abs_mse:', abs_mse.item(), 'abs_max_error:', abs_max_error.item()) print('relative_mse:', relative_mse.item(), 'relative_max_error:', relative_max_error.item()) def _compliance_test_helper(self, sound_filepath, filepath_key, expected_num_files, expected_num_args, get_output_fn, atol=1e-5, rtol=1e-7): """ Inputs: sound_filepath (str): The location of the sound file filepath_key (str): A key to `test_filepaths` which matches which files to use expected_num_files (int): The expected number of kaldi files to read expected_num_args (int): The expected number of arguments used in a kaldi configuration get_output_fn (Callable[[Tensor, List], Tensor]): A function that takes in a sound signal and a configuration and returns an output atol (float): absolute tolerance rtol (float): relative tolerance """ sound, sr = torchaudio.load_wav(sound_filepath) files = self.test_filepaths[filepath_key] assert len(files) == expected_num_files, \ ('number of kaldi {} file changed to {}'.format( filepath_key, len(files))) for f in files: print(f) # Read kaldi's output from file kaldi_output_path = os.path.join(self.kaldi_output_dir, f) kaldi_output_dict = {k: v for k, v in torchaudio.kaldi_io.read_mat_ark(kaldi_output_path)} assert len(kaldi_output_dict) == 1 and 'my_id' in kaldi_output_dict, 'invalid test kaldi ark file' kaldi_output = kaldi_output_dict['my_id'] # Construct the same configuration used by kaldi args = f.split('-') args[-1] = os.path.splitext(args[-1])[0] assert len(args) == expected_num_args, 'invalid test kaldi file name' args = [compliance_utils.parse(arg) for arg in args] output = get_output_fn(sound, args) self._print_diagnostic(output, kaldi_output) torch.testing.assert_allclose(output, kaldi_output, atol=atol, rtol=rtol) def test_mfcc_empty(self): # Passing in an empty tensor should result in an error self.assertRaises(AssertionError, kaldi.mfcc, torch.empty(0)) def test_resample_waveform(self): def get_output_fn(sound, args): output = kaldi.resample_waveform(sound, args[1], args[2]) return output self._compliance_test_helper(self.test2_filepath, 'resample', 32, 3, get_output_fn, atol=1e-2, rtol=1e-5) def test_resample_waveform_upsample_size(self): upsample_sound = kaldi.resample_waveform(self.test1_signal, self.test1_signal_sr, self.test1_signal_sr * 2) self.assertTrue(upsample_sound.size(-1) == self.test1_signal.size(-1) * 2) def test_resample_waveform_downsample_size(self): downsample_sound = kaldi.resample_waveform(self.test1_signal, self.test1_signal_sr, self.test1_signal_sr // 2) self.assertTrue(downsample_sound.size(-1) == self.test1_signal.size(-1) // 2) def test_resample_waveform_identity_size(self): downsample_sound = kaldi.resample_waveform(self.test1_signal, self.test1_signal_sr, self.test1_signal_sr) self.assertTrue(downsample_sound.size(-1) == self.test1_signal.size(-1)) def _test_resample_waveform_accuracy(self, up_scale_factor=None, down_scale_factor=None, atol=1e-1, rtol=1e-4): # resample the signal and compare it to the ground truth n_to_trim = 20 sample_rate = 1000 new_sample_rate = sample_rate if up_scale_factor is not None: new_sample_rate *= up_scale_factor if down_scale_factor is not None: new_sample_rate //= down_scale_factor duration = 5 # seconds original_timestamps = torch.arange(0, duration, 1.0 / sample_rate) sound = 123 * torch.cos(2 * math.pi * 3 * original_timestamps).unsqueeze(0) estimate = kaldi.resample_waveform(sound, sample_rate, new_sample_rate).squeeze() new_timestamps = torch.arange(0, duration, 1.0 / new_sample_rate)[:estimate.size(0)] ground_truth = 123 * torch.cos(2 * math.pi * 3 * new_timestamps) # trim the first/last n samples as these points have boundary effects ground_truth = ground_truth[..., n_to_trim:-n_to_trim] estimate = estimate[..., n_to_trim:-n_to_trim] torch.testing.assert_allclose(estimate, ground_truth, atol=atol, rtol=rtol) def test_resample_waveform_downsample_accuracy(self): for i in range(1, 20): self._test_resample_waveform_accuracy(down_scale_factor=i * 2) def test_resample_waveform_upsample_accuracy(self): for i in range(1, 20): self._test_resample_waveform_accuracy(up_scale_factor=1.0 + i / 20.0) def test_resample_waveform_multi_channel(self): num_channels = 3 multi_sound = self.test1_signal.repeat(num_channels, 1) # (num_channels, 8000 smp) for i in range(num_channels): multi_sound[i, :] *= (i + 1) * 1.5 multi_sound_sampled = kaldi.resample_waveform(multi_sound, self.test1_signal_sr, self.test1_signal_sr // 2) # check that sampling is same whether using separately or in a tensor of size (c, n) for i in range(num_channels): single_channel = self.test1_signal * (i + 1) * 1.5 single_channel_sampled = kaldi.resample_waveform(single_channel, self.test1_signal_sr, self.test1_signal_sr // 2) torch.testing.assert_allclose(multi_sound_sampled[i, :], single_channel_sampled[0], rtol=1e-4, atol=1e-7) audio-0.7.2/test/torchaudio_unittest/dataloader_test.py000066400000000000000000000024501376444676100234340ustar00rootroot00000000000000import unittest import torchaudio from torch.utils.data import Dataset, DataLoader from torchaudio_unittest import common_utils class TORCHAUDIODS(Dataset): def __init__(self): sound_files = ["sinewave.wav", "steam-train-whistle-daniel_simon.mp3"] self.data = [common_utils.get_asset_path(fn) for fn in sound_files] self.si, self.ei = torchaudio.info(common_utils.get_asset_path("sinewave.wav")) self.si.precision = 16 self.E = torchaudio.sox_effects.SoxEffectsChain() self.E.append_effect_to_chain("rate", [self.si.rate]) # resample to 16000hz self.E.append_effect_to_chain("channels", [self.si.channels]) # mono signal self.E.append_effect_to_chain("trim", [0, "16000s"]) # first 16000 samples of audio def __getitem__(self, index): fn = self.data[index] self.E.set_input_file(fn) x, sr = self.E.sox_build_flow_effects() return x def __len__(self): return len(self.data) class Test_DataLoader(common_utils.TorchaudioTestCase): backend = 'sox' @common_utils.skipIfNoSoxBackend def test_1(self): expected_size = (2, 1, 16000) ds = TORCHAUDIODS() dl = DataLoader(ds, batch_size=2) for x in dl: self.assertTrue(x.size() == expected_size) audio-0.7.2/test/torchaudio_unittest/datasets/000077500000000000000000000000001376444676100215325ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/datasets/__init__.py000066400000000000000000000000001376444676100236310ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/datasets/cmuarctic_test.py000066400000000000000000000043601376444676100251200ustar00rootroot00000000000000import os from torchaudio.datasets import cmuarctic from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) class TestCMUARCTIC(TempDirMixin, TorchaudioTestCase): backend = "default" root_dir = None samples = [] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() sample_rate = 16000 utterance = "This is a test utterance." base_dir = os.path.join(cls.root_dir, "ARCTIC", "cmu_us_aew_arctic") txt_dir = os.path.join(base_dir, "etc") os.makedirs(txt_dir, exist_ok=True) txt_file = os.path.join(txt_dir, "txt.done.data") audio_dir = os.path.join(base_dir, "wav") os.makedirs(audio_dir, exist_ok=True) seed = 42 with open(txt_file, "w") as txt: for c in ["a", "b"]: for i in range(5): utterance_id = f"arctic_{c}{i:04d}" path = os.path.join(audio_dir, f"{utterance_id}.wav") data = get_whitenoise( sample_rate=sample_rate, duration=3, n_channels=1, dtype="int16", seed=seed, ) save_wav(path, data, sample_rate) sample = ( normalize_wav(data), sample_rate, utterance, utterance_id.split("_")[1], ) cls.samples.append(sample) txt.write(f'( {utterance_id} "{utterance}" )\n') seed += 1 def test_cmuarctic(self): dataset = cmuarctic.CMUARCTIC(self.root_dir) n_ite = 0 for i, (waveform, sample_rate, utterance, utterance_id) in enumerate(dataset): expected_sample = self.samples[i] assert sample_rate == expected_sample[1] assert utterance == expected_sample[2] assert utterance_id == expected_sample[3] self.assertEqual(expected_sample[0], waveform, atol=5e-5, rtol=1e-8) n_ite += 1 assert n_ite == len(self.samples) audio-0.7.2/test/torchaudio_unittest/datasets/commonvoice_test.py000066400000000000000000000064231376444676100254660ustar00rootroot00000000000000import os import csv import random from torchaudio.datasets import commonvoice from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) class TestCommonVoice(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None data = [] _headers = [u"client_ids", u"path", u"sentence", u"up_votes", u"down_votes", u"age", u"gender", u"accent"] # Note: extension is changed to wav for the sake of test # Note: the first content is missing values for `age`, `gender` and `accent` as in the original data. _train_csv_contents = [ ["9d16c5d980247861130e0480e2719f448be73d86a496c36d01a477cbdecd8cfd1399403d7a77bf458d211a70711b2da0845c", "common_voice_en_18885784.wav", "He was accorded a State funeral, and was buried in Drayton and Toowoomba Cemetery.", "2", "0", "", "", ""], ["c82eb9291328620f06025a1f8112b909099e447e485e99236cb87df008650250e79fea5ca772061fb6a370830847b9c44d20", "common_voice_en_556542.wav", "Once more into the breach", "2", "0", "thirties", "male", "us"], ["f74d880c5ad4c5917f314a604d3fc4805159d255796fb9f8defca35333ecc002bdf53dc463503c12674ea840b21b4a507b7c", "common_voice_en_18607573.wav", "Caddy, show Miss Clare and Miss Summerson their rooms.", "2", "0", "twenties", "male", "canada"], ] _folder_audio = "clips" sample_rate = 48000 @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() # The path convention commonvoice uses base_dir = os.path.join(cls.root_dir, commonvoice.FOLDER_IN_ARCHIVE, commonvoice.VERSION, "en") os.makedirs(base_dir, exist_ok=True) # Tsv file name difference does not mean different subset, testing as a whole dataset here tsv_filename = os.path.join(base_dir, commonvoice.TSV) with open(tsv_filename, "w", newline='') as tsv: writer = csv.writer(tsv, delimiter='\t') writer.writerow(cls._headers) for i, content in enumerate(cls._train_csv_contents): audio_filename = audio_filename = content[1] writer.writerow(content) # Generate and store audio audio_base_path = os.path.join(base_dir, cls._folder_audio) os.makedirs(audio_base_path, exist_ok=True) audio_path = os.path.join(audio_base_path, audio_filename) data = get_whitenoise(sample_rate=cls.sample_rate, duration=1, n_channels=1, seed=i, dtype='float32') save_wav(audio_path, data, cls.sample_rate) # Append data entry cls.data.append((normalize_wav(data), cls.sample_rate, dict(zip(cls._headers, content)))) def test_commonvoice(self): dataset = commonvoice.COMMONVOICE(self.root_dir) n_ite = 0 for i, (waveform, sample_rate, dictionary) in enumerate(dataset): expected_dictionary = self.data[i][2] expected_data = self.data[i][0] self.assertEqual(expected_data, waveform, atol=5e-5, rtol=1e-8) assert sample_rate == TestCommonVoice.sample_rate assert dictionary == expected_dictionary n_ite += 1 assert n_ite == len(self.data) audio-0.7.2/test/torchaudio_unittest/datasets/datasets_test.py000066400000000000000000000006451376444676100247600ustar00rootroot00000000000000from torchaudio.datasets.librispeech import LIBRISPEECH from torchaudio.datasets.speechcommands import SPEECHCOMMANDS from torchaudio.datasets.vctk import VCTK from torchaudio_unittest.common_utils import ( TorchaudioTestCase, get_asset_path, ) class TestDatasets(TorchaudioTestCase): backend = 'default' path = get_asset_path() def test_vctk(self): data = VCTK(self.path) data[0] audio-0.7.2/test/torchaudio_unittest/datasets/gtzan_test.py000066400000000000000000000060571376444676100242760ustar00rootroot00000000000000import os from torchaudio.datasets import gtzan from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) class TestGTZAN(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None samples = [] training = [] validation = [] testing = [] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() sample_rate = 22050 seed = 0 for genre in gtzan.gtzan_genres: base_dir = os.path.join(cls.root_dir, 'genres', genre) os.makedirs(base_dir, exist_ok=True) for i in range(100): filename = f'{genre}.{i:05d}' path = os.path.join(base_dir, f'{filename}.wav') data = get_whitenoise(sample_rate=sample_rate, duration=0.01, n_channels=1, dtype='int16', seed=seed) save_wav(path, data, sample_rate) sample = (normalize_wav(data), sample_rate, genre) cls.samples.append(sample) if filename in gtzan.filtered_test: cls.testing.append(sample) if filename in gtzan.filtered_train: cls.training.append(sample) if filename in gtzan.filtered_valid: cls.validation.append(sample) seed += 1 def test_no_subset(self): dataset = gtzan.GTZAN(self.root_dir) n_ite = 0 for i, (waveform, sample_rate, label) in enumerate(dataset): self.assertEqual(waveform, self.samples[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[i][1] assert label == self.samples[i][2] n_ite += 1 assert n_ite == len(self.samples) def test_training(self): dataset = gtzan.GTZAN(self.root_dir, subset='training') n_ite = 0 for i, (waveform, sample_rate, label) in enumerate(dataset): self.assertEqual(waveform, self.training[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.training[i][1] assert label == self.training[i][2] n_ite += 1 assert n_ite == len(self.training) def test_validation(self): dataset = gtzan.GTZAN(self.root_dir, subset='validation') n_ite = 0 for i, (waveform, sample_rate, label) in enumerate(dataset): self.assertEqual(waveform, self.validation[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.validation[i][1] assert label == self.validation[i][2] n_ite += 1 assert n_ite == len(self.validation) def test_testing(self): dataset = gtzan.GTZAN(self.root_dir, subset='testing') n_ite = 0 for i, (waveform, sample_rate, label) in enumerate(dataset): self.assertEqual(waveform, self.testing[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.testing[i][1] assert label == self.testing[i][2] n_ite += 1 assert n_ite == len(self.testing) audio-0.7.2/test/torchaudio_unittest/datasets/librispeech_test.py000066400000000000000000000067311376444676100254430ustar00rootroot00000000000000import os from torchaudio.datasets import librispeech from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) # Used to generate a unique utterance for each dummy audio file NUMBERS = [ 'ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE' ] class TestLibriSpeech(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None samples = [] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() dataset_dir = os.path.join( cls.root_dir, librispeech.FOLDER_IN_ARCHIVE, librispeech.URL ) os.makedirs(dataset_dir, exist_ok=True) sample_rate = 16000 # 16kHz seed = 0 for speaker_id in range(5): speaker_path = os.path.join(dataset_dir, str(speaker_id)) os.makedirs(speaker_path, exist_ok=True) for chapter_id in range(3): chapter_path = os.path.join(speaker_path, str(chapter_id)) os.makedirs(chapter_path, exist_ok=True) trans_content = [] for utterance_id in range(10): filename = f'{speaker_id}-{chapter_id}-{utterance_id:04d}.wav' path = os.path.join(chapter_path, filename) utterance = ' '.join( [NUMBERS[x] for x in [speaker_id, chapter_id, utterance_id]] ) trans_content.append( f'{speaker_id}-{chapter_id}-{utterance_id:04d} {utterance}' ) data = get_whitenoise( sample_rate=sample_rate, duration=0.01, n_channels=1, dtype='float32', seed=seed ) save_wav(path, data, sample_rate) sample = ( normalize_wav(data), sample_rate, utterance, speaker_id, chapter_id, utterance_id ) cls.samples.append(sample) seed += 1 trans_filename = f'{speaker_id}-{chapter_id}.trans.txt' trans_path = os.path.join(chapter_path, trans_filename) with open(trans_path, 'w') as f: f.write('\n'.join(trans_content)) @classmethod def tearDownClass(cls): # In case of test failure librispeech.LIBRISPEECH._ext_audio = '.flac' def test_librispeech(self): librispeech.LIBRISPEECH._ext_audio = '.wav' dataset = librispeech.LIBRISPEECH(self.root_dir) print(dataset._path) num_samples = 0 for i, ( data, sample_rate, utterance, speaker_id, chapter_id, utterance_id ) in enumerate(dataset): self.assertEqual(data, self.samples[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[i][1] assert utterance == self.samples[i][2] assert speaker_id == self.samples[i][3] assert chapter_id == self.samples[i][4] assert utterance_id == self.samples[i][5] num_samples += 1 assert num_samples == len(self.samples) librispeech.LIBRISPEECH._ext_audio = '.flac' audio-0.7.2/test/torchaudio_unittest/datasets/libritts_test.py000066400000000000000000000051401376444676100247770ustar00rootroot00000000000000import os from torchaudio.datasets.libritts import LIBRITTS from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) class TestLibriTTS(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None data = [] utterance_ids = [ [19, 198, '000000', '000000'], [26, 495, '000004', '000000'], ] original_text = 'this is the original text.' normalized_text = 'this is the normalized text.' @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() base_dir = os.path.join(cls.root_dir, 'LibriTTS', 'train-clean-100') for i, utterance_id in enumerate(cls.utterance_ids): filename = f'{"_".join(str(u) for u in utterance_id)}.wav' file_dir = os.path.join(base_dir, str(utterance_id[0]), str(utterance_id[1])) os.makedirs(file_dir, exist_ok=True) path = os.path.join(file_dir, filename) data = get_whitenoise(sample_rate=24000, duration=2, n_channels=1, dtype='int16', seed=i) save_wav(path, data, 24000) cls.data.append(normalize_wav(data)) original_text_filename = f'{"_".join(str(u) for u in utterance_id)}.original.txt' path_original = os.path.join(file_dir, original_text_filename) with open(path_original, 'w') as file_: file_.write(cls.original_text) normalized_text_filename = f'{"_".join(str(u) for u in utterance_id)}.normalized.txt' path_normalized = os.path.join(file_dir, normalized_text_filename) with open(path_normalized, 'w') as file_: file_.write(cls.normalized_text) def test_libritts(self): dataset = LIBRITTS(self.root_dir) n_ites = 0 for i, (waveform, sample_rate, original_text, normalized_text, speaker_id, chapter_id, utterance_id) in enumerate(dataset): expected_ids = self.utterance_ids[i] expected_data = self.data[i] self.assertEqual(expected_data, waveform, atol=5e-5, rtol=1e-8) assert sample_rate == 24000 assert speaker_id == expected_ids[0] assert chapter_id == expected_ids[1] assert original_text == self.original_text assert normalized_text == self.normalized_text assert utterance_id == f'{"_".join(str(u) for u in expected_ids[-4:])}' n_ites += 1 assert n_ites == len(self.utterance_ids) audio-0.7.2/test/torchaudio_unittest/datasets/ljspeech_test.py000066400000000000000000000051321376444676100247410ustar00rootroot00000000000000import csv import os from torchaudio.datasets import ljspeech from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, normalize_wav, save_wav, ) class TestLJSpeech(TempDirMixin, TorchaudioTestCase): backend = "default" root_dir = None data = [] transcripts = [ "Test transcript 1", "Test transcript 2", "Test transcript 3", "In 1465 Sweynheim and Pannartz began printing in the monastery of Subiaco near Rome," ] normalized_transcripts = [ "Test transcript one", "Test transcript two", "Test transcript three", "In fourteen sixty-five Sweynheim and Pannartz began printing in the monastery of Subiaco near Rome," ] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() base_dir = os.path.join(cls.root_dir, "LJSpeech-1.1") archive_dir = os.path.join(base_dir, "wavs") os.makedirs(archive_dir, exist_ok=True) metadata_path = os.path.join(base_dir, "metadata.csv") sample_rate = 22050 with open(metadata_path, mode="w", newline='') as metadata_file: metadata_writer = csv.writer( metadata_file, delimiter="|", quoting=csv.QUOTE_NONE ) for i, (transcript, normalized_transcript) in enumerate( zip(cls.transcripts, cls.normalized_transcripts) ): fileid = f'LJ001-{i:04d}' metadata_writer.writerow([fileid, transcript, normalized_transcript]) filename = fileid + ".wav" path = os.path.join(archive_dir, filename) data = get_whitenoise( sample_rate=sample_rate, duration=1, n_channels=1, dtype="int16", seed=i ) save_wav(path, data, sample_rate) cls.data.append(normalize_wav(data)) def test_ljspeech(self): dataset = ljspeech.LJSPEECH(self.root_dir) n_ite = 0 for i, (waveform, sample_rate, transcript, normalized_transcript) in enumerate( dataset ): expected_transcript = self.transcripts[i] expected_normalized_transcript = self.normalized_transcripts[i] expected_data = self.data[i] self.assertEqual(expected_data, waveform, atol=5e-5, rtol=1e-8) assert sample_rate == sample_rate assert transcript == expected_transcript assert normalized_transcript == expected_normalized_transcript n_ite += 1 assert n_ite == len(self.data) audio-0.7.2/test/torchaudio_unittest/datasets/speechcommands_test.py000066400000000000000000000053411376444676100261370ustar00rootroot00000000000000import os from torchaudio.datasets import speechcommands from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, normalize_wav, save_wav, ) LABELS = [ "bed", "bird", "cat", "dog", "down", "eight", "five", "follow", "forward", "four", "go", "happy", "house", "learn", "left", "marvin", "nine", "no", "off", "on", "one", "right", "seven", "sheila", "six", "stop", "three", "tree", "two", "up", "visual", "wow", "yes", "zero", ] class TestSpeechCommands(TempDirMixin, TorchaudioTestCase): backend = "default" root_dir = None samples = [] @classmethod def setUp(cls): cls.root_dir = cls.get_base_temp_dir() dataset_dir = os.path.join( cls.root_dir, speechcommands.FOLDER_IN_ARCHIVE, speechcommands.URL ) os.makedirs(dataset_dir, exist_ok=True) sample_rate = 16000 # 16kHz sample rate seed = 0 for label in LABELS: path = os.path.join(dataset_dir, label) os.makedirs(path, exist_ok=True) for j in range(2): # generate hash ID for speaker speaker = "{:08x}".format(j) for utterance in range(3): filename = f"{speaker}{speechcommands.HASH_DIVIDER}{utterance}.wav" file_path = os.path.join(path, filename) seed += 1 data = get_whitenoise( sample_rate=sample_rate, duration=0.01, n_channels=1, dtype="int16", seed=seed, ) save_wav(file_path, data, sample_rate) sample = ( normalize_wav(data), sample_rate, label, speaker, utterance, ) cls.samples.append(sample) def testSpeechCommands(self): dataset = speechcommands.SPEECHCOMMANDS(self.root_dir) print(dataset._path) num_samples = 0 for i, (data, sample_rate, label, speaker_id, utterance_number) in enumerate( dataset ): self.assertEqual(data, self.samples[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[i][1] assert label == self.samples[i][2] assert speaker_id == self.samples[i][3] assert utterance_number == self.samples[i][4] num_samples += 1 assert num_samples == len(self.samples) audio-0.7.2/test/torchaudio_unittest/datasets/tedlium_test.py000066400000000000000000000151451376444676100246140ustar00rootroot00000000000000import os import platform import unittest from torchaudio.datasets import tedlium from torchaudio_unittest.common_utils import ( TestBaseMixin, TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) # Used to generate a unique utterance for each dummy audio file UTTERANCES = [ "AaronHuey_2010X 1 AaronHuey_2010X 0.0 2.0 script1\n", "AaronHuey_2010X 1 AaronHuey_2010X 2.0 4.0 script2\n", "AaronHuey_2010X 1 AaronHuey_2010X 4.0 6.0 script3\n", "AaronHuey_2010X 1 AaronHuey_2010X 6.0 8.0 script4\n", "AaronHuey_2010X 1 AaronHuey_2010X 8.0 10.0 script5\n", ] PHONEME = [ "a AH", "a(2) EY", "aachen AA K AH N", "aad AE D", "aaden EY D AH N", "aadmi AE D M IY", "aae EY EY", ] class Tedlium(TempDirMixin): root_dir = None samples = {} @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() cls.root_dir = dataset_dir = os.path.join(cls.root_dir, "tedlium") os.makedirs(dataset_dir, exist_ok=True) sample_rate = 16000 # 16kHz seed = 0 for release in ["release1", "release2", "release3"]: data = get_whitenoise(sample_rate=sample_rate, duration=10.00, n_channels=1, dtype="float32", seed=seed) if release in ["release1", "release2"]: release_dir = os.path.join( dataset_dir, tedlium._RELEASE_CONFIGS[release]["folder_in_archive"], tedlium._RELEASE_CONFIGS[release]["subset"], ) else: release_dir = os.path.join( dataset_dir, tedlium._RELEASE_CONFIGS[release]["folder_in_archive"], tedlium._RELEASE_CONFIGS[release]["data_path"], ) os.makedirs(release_dir, exist_ok=True) os.makedirs(os.path.join(release_dir, "stm"), exist_ok=True) # Subfolder for transcripts os.makedirs(os.path.join(release_dir, "sph"), exist_ok=True) # Subfolder for audio files filename = f"{release}.sph" path = os.path.join(os.path.join(release_dir, "sph"), filename) save_wav(path, data, sample_rate) trans_filename = f"{release}.stm" trans_path = os.path.join(os.path.join(release_dir, "stm"), trans_filename) with open(trans_path, "w") as f: f.write("".join(UTTERANCES)) dict_filename = f"{release}.dic" dict_path = os.path.join(release_dir, dict_filename) with open(dict_path, "w") as f: f.write("\n".join(PHONEME)) # Create a samples list to compare with cls.samples[release] = [] for utterance in UTTERANCES: talk_id, _, speaker_id, start_time, end_time, identifier, transcript = utterance.split(" ", 6) start_time = int(float(start_time)) * sample_rate end_time = int(float(end_time)) * sample_rate sample = ( data[:, start_time:end_time], sample_rate, transcript, talk_id, speaker_id, identifier, ) cls.samples[release].append(sample) seed += 1 def test_tedlium_release1(self): release = "release1" dataset = tedlium.TEDLIUM(self.root_dir, release=release) num_samples = 0 for i, (data, sample_rate, transcript, talk_id, speaker_id, identifier) in enumerate(dataset): self.assertEqual(data, self.samples[release][i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[release][i][1] assert transcript == self.samples[release][i][2] assert talk_id == self.samples[release][i][3] assert speaker_id == self.samples[release][i][4] assert identifier == self.samples[release][i][5] num_samples += 1 assert num_samples == len(self.samples[release]) dataset._dict_path = os.path.join(dataset._path, f"{release}.dic") phoneme_dict = dataset.phoneme_dict phoenemes = [f"{key} {' '.join(value)}" for key, value in phoneme_dict.items()] assert phoenemes == PHONEME def test_tedlium_release2(self): release = "release2" dataset = tedlium.TEDLIUM(self.root_dir, release=release) num_samples = 0 for i, (data, sample_rate, transcript, talk_id, speaker_id, identifier) in enumerate(dataset): self.assertEqual(data, self.samples[release][i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[release][i][1] assert transcript == self.samples[release][i][2] assert talk_id == self.samples[release][i][3] assert speaker_id == self.samples[release][i][4] assert identifier == self.samples[release][i][5] num_samples += 1 assert num_samples == len(self.samples[release]) dataset._dict_path = os.path.join(dataset._path, f"{release}.dic") phoneme_dict = dataset.phoneme_dict phoenemes = [f"{key} {' '.join(value)}" for key, value in phoneme_dict.items()] assert phoenemes == PHONEME def test_tedlium_release3(self): release = "release3" dataset = tedlium.TEDLIUM(self.root_dir, release=release) num_samples = 0 for i, (data, sample_rate, transcript, talk_id, speaker_id, identifier) in enumerate(dataset): self.assertEqual(data, self.samples[release][i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[release][i][1] assert transcript == self.samples[release][i][2] assert talk_id == self.samples[release][i][3] assert speaker_id == self.samples[release][i][4] assert identifier == self.samples[release][i][5] num_samples += 1 assert num_samples == len(self.samples[release]) dataset._dict_path = os.path.join(dataset._path, f"{release}.dic") phoneme_dict = dataset.phoneme_dict phoenemes = [f"{key} {' '.join(value)}" for key, value in phoneme_dict.items()] assert phoenemes == PHONEME class TestTedliumSoundfile(Tedlium, TorchaudioTestCase): backend = "soundfile" class TestTedliumSoundfileNew(Tedlium, TorchaudioTestCase): backend = "soundfile-new" if platform.system() != "Windows": class TestTedliumSox(Tedlium, TorchaudioTestCase): backend = "sox" class TestTedliumSoxIO(Tedlium, TorchaudioTestCase): backend = "sox_io" audio-0.7.2/test/torchaudio_unittest/datasets/utils_test.py000066400000000000000000000036101376444676100243030ustar00rootroot00000000000000import os from pathlib import Path from torchaudio.datasets import utils as dataset_utils from torchaudio.datasets.commonvoice import COMMONVOICE from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_asset_path, ) class TestWalkFiles(TempDirMixin, TorchaudioTestCase): root = None expected = None def _add_file(self, *parts): path = self.get_temp_path(*parts) self.expected.append(path) Path(path).touch() def setUp(self): self.root = self.get_temp_path() self.expected = [] # level 1 for filename in ['a.txt', 'b.txt', 'c.txt']: self._add_file(filename) # level 2 for dir1 in ['d1', 'd2', 'd3']: for filename in ['d.txt', 'e.txt', 'f.txt']: self._add_file(dir1, filename) # level 3 for dir2 in ['d1', 'd2', 'd3']: for filename in ['g.txt', 'h.txt', 'i.txt']: self._add_file(dir1, dir2, filename) print('\n'.join(self.expected)) def test_walk_files(self): """walk_files should traverse files in alphabetical order""" n_ites = 0 for i, path in enumerate(dataset_utils.walk_files(self.root, '.txt', prefix=True)): found = os.path.join(self.root, path) assert found == self.expected[i] n_ites += 1 assert n_ites == len(self.expected) class TestIterator(TorchaudioTestCase): backend = 'default' path = get_asset_path() def test_disckcache_iterator(self): data = COMMONVOICE(self.path, url="tatar") data = dataset_utils.diskcache_iterator(data) # Save data[0] # Load data[0] def test_bg_iterator(self): data = COMMONVOICE(self.path, url="tatar") data = dataset_utils.bg_iterator(data, 5) for _ in data: pass audio-0.7.2/test/torchaudio_unittest/datasets/vctk_test.py000066400000000000000000000063731376444676100241230ustar00rootroot00000000000000import os from torchaudio.datasets import vctk from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) # Used to generate a unique utterance for each dummy audio file UTTERANCE = [ 'Please call Stella', 'Ask her to bring these things', 'with her from the store', 'Six spoons of fresh snow peas, five thick slabs of blue cheese, and maybe a snack for her brother Bob', 'We also need a small plastic snake and a big toy frog for the kids', 'She can scoop these things into three red bags, and we will go meet her Wednesday at the train station', 'When the sunlight strikes raindrops in the air, they act as a prism and form a rainbow', 'The rainbow is a division of white light into many beautiful colors', 'These take the shape of a long round arch, with its path high above, and its two ends \ apparently beyond the horizon', 'There is, according to legend, a boiling pot of gold at one end' ] class TestVCTK(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None samples = [] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() dataset_dir = os.path.join(cls.root_dir, 'VCTK-Corpus-0.92') os.makedirs(dataset_dir, exist_ok=True) sample_rate = 48000 seed = 0 for speaker in range(225, 230): speaker_id = 'p' + str(speaker) audio_dir = os.path.join(dataset_dir, 'wav48_silence_trimmed', speaker_id) os.makedirs(audio_dir, exist_ok=True) file_dir = os.path.join(dataset_dir, 'txt', speaker_id) os.makedirs(file_dir, exist_ok=True) for utterance_id in range(1, 11): filename = f'{speaker_id}_{utterance_id:03d}_mic2' audio_file_path = os.path.join(audio_dir, filename + '.wav') data = get_whitenoise( sample_rate=sample_rate, duration=0.01, n_channels=1, dtype='float32', seed=seed ) save_wav(audio_file_path, data, sample_rate) txt_file_path = os.path.join(file_dir, filename[:-5] + '.txt') utterance = UTTERANCE[utterance_id - 1] with open(txt_file_path, 'w') as f: f.write(utterance) sample = ( normalize_wav(data), sample_rate, utterance, speaker_id, utterance_id ) cls.samples.append(sample) seed += 1 def test_vctk(self): dataset = vctk.VCTK_092(self.root_dir, audio_ext=".wav") num_samples = 0 for i, (data, sample_rate, utterance, speaker_id, utterance_id) in enumerate(dataset): self.assertEqual(data, self.samples[i][0], atol=5e-5, rtol=1e-8) assert sample_rate == self.samples[i][1] assert utterance == self.samples[i][2] assert speaker_id == self.samples[i][3] assert int(utterance_id) == self.samples[i][4] num_samples += 1 assert num_samples == len(self.samples) audio-0.7.2/test/torchaudio_unittest/datasets/yesno_test.py000066400000000000000000000027451376444676100243100ustar00rootroot00000000000000import os from torchaudio.datasets import yesno from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) class TestYesNo(TempDirMixin, TorchaudioTestCase): backend = 'default' root_dir = None data = [] labels = [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 1, 0], [1, 1, 1, 1, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1], ] @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() base_dir = os.path.join(cls.root_dir, 'waves_yesno') os.makedirs(base_dir, exist_ok=True) for i, label in enumerate(cls.labels): filename = f'{"_".join(str(l) for l in label)}.wav' path = os.path.join(base_dir, filename) data = get_whitenoise(sample_rate=8000, duration=6, n_channels=1, dtype='int16', seed=i) save_wav(path, data, 8000) cls.data.append(normalize_wav(data)) def test_yesno(self): dataset = yesno.YESNO(self.root_dir) n_ite = 0 for i, (waveform, sample_rate, label) in enumerate(dataset): expected_label = self.labels[i] expected_data = self.data[i] self.assertEqual(expected_data, waveform, atol=5e-5, rtol=1e-8) assert sample_rate == 8000 assert label == expected_label n_ite += 1 assert n_ite == len(self.data) audio-0.7.2/test/torchaudio_unittest/example/000077500000000000000000000000001376444676100213555ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/example/__init__.py000066400000000000000000000002041376444676100234620ustar00rootroot00000000000000import os import sys sys.path.append( os.path.join( os.path.dirname(__file__), '..', '..', '..', 'examples')) audio-0.7.2/test/torchaudio_unittest/example/souce_sepration/000077500000000000000000000000001376444676100245575ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/example/souce_sepration/__init__.py000066400000000000000000000000001376444676100266560ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/example/souce_sepration/metrics_test.py000066400000000000000000000025521376444676100276420ustar00rootroot00000000000000from itertools import product import torch from torch.testing._internal.common_utils import TestCase from parameterized import parameterized from . import sdr_reference from source_separation.utils import metrics class TestSDR(TestCase): @parameterized.expand([(1, ), (2, ), (32, )]) def test_sdr(self, batch_size): """sdr produces the same result as the reference implementation""" num_frames = 256 estimation = torch.rand(batch_size, num_frames) origin = torch.rand(batch_size, num_frames) sdr_ref = sdr_reference.calc_sdr_torch(estimation, origin) sdr = metrics.sdr(estimation.unsqueeze(1), origin.unsqueeze(1)).squeeze(1) self.assertEqual(sdr, sdr_ref) @parameterized.expand(list(product([1, 2, 32], [2, 3, 4, 5]))) def test_sdr_pit(self, batch_size, num_sources): """sdr_pit produces the same result as the reference implementation""" num_frames = 256 estimation = torch.randn(batch_size, num_sources, num_frames) origin = torch.randn(batch_size, num_sources, num_frames) estimation -= estimation.mean(axis=2, keepdim=True) origin -= origin.mean(axis=2, keepdim=True) batch_sdr_ref = sdr_reference.batch_SDR_torch(estimation, origin) batch_sdr = metrics.sdr_pit(estimation, origin) self.assertEqual(batch_sdr, batch_sdr_ref) audio-0.7.2/test/torchaudio_unittest/example/souce_sepration/sdr_reference.py000066400000000000000000000067621376444676100277520ustar00rootroot00000000000000"""Reference Implementation of SDR and PIT SDR. This module was taken from the following implementation https://github.com/naplab/Conv-TasNet/blob/e66d82a8f956a69749ec8a4ae382217faa097c5c/utility/sdr.py which was made available by Yi Luo under the following liscence, Creative Commons Attribution-NonCommercial-ShareAlike 3.0 United States License. The module was modified in the following manner; - Remove the functions other than `calc_sdr_torch` and `batch_SDR_torch`, - Remove the import statements required only for the removed functions. - Add `# flake8: noqa` so as not to report any format issue on this module. The implementation of the retained functions and their formats are kept as-is. """ # flake8: noqa import numpy as np from itertools import permutations import torch def calc_sdr_torch(estimation, origin, mask=None): """ batch-wise SDR caculation for one audio file on pytorch Variables. estimation: (batch, nsample) origin: (batch, nsample) mask: optional, (batch, nsample), binary """ if mask is not None: origin = origin * mask estimation = estimation * mask origin_power = torch.pow(origin, 2).sum(1, keepdim=True) + 1e-8 # (batch, 1) scale = torch.sum(origin*estimation, 1, keepdim=True) / origin_power # (batch, 1) est_true = scale * origin # (batch, nsample) est_res = estimation - est_true # (batch, nsample) true_power = torch.pow(est_true, 2).sum(1) res_power = torch.pow(est_res, 2).sum(1) return 10*torch.log10(true_power) - 10*torch.log10(res_power) # (batch, 1) def batch_SDR_torch(estimation, origin, mask=None): """ batch-wise SDR caculation for multiple audio files. estimation: (batch, nsource, nsample) origin: (batch, nsource, nsample) mask: optional, (batch, nsample), binary """ batch_size_est, nsource_est, nsample_est = estimation.size() batch_size_ori, nsource_ori, nsample_ori = origin.size() assert batch_size_est == batch_size_ori, "Estimation and original sources should have same shape." assert nsource_est == nsource_ori, "Estimation and original sources should have same shape." assert nsample_est == nsample_ori, "Estimation and original sources should have same shape." assert nsource_est < nsample_est, "Axis 1 should be the number of sources, and axis 2 should be the signal." batch_size = batch_size_est nsource = nsource_est nsample = nsample_est # zero mean signals estimation = estimation - torch.mean(estimation, 2, keepdim=True).expand_as(estimation) origin = origin - torch.mean(origin, 2, keepdim=True).expand_as(estimation) # possible permutations perm = list(set(permutations(np.arange(nsource)))) # pair-wise SDR SDR = torch.zeros((batch_size, nsource, nsource)).type(estimation.type()) for i in range(nsource): for j in range(nsource): SDR[:,i,j] = calc_sdr_torch(estimation[:,i], origin[:,j], mask) # choose the best permutation SDR_max = [] SDR_perm = [] for permute in perm: sdr = [] for idx in range(len(permute)): sdr.append(SDR[:,idx,permute[idx]].view(batch_size,-1)) sdr = torch.sum(torch.cat(sdr, 1), 1) SDR_perm.append(sdr.view(batch_size, 1)) SDR_perm = torch.cat(SDR_perm, 1) SDR_max, _ = torch.max(SDR_perm, dim=1) return SDR_max / nsource audio-0.7.2/test/torchaudio_unittest/example/souce_sepration/wsj0mix_test.py000066400000000000000000000071721376444676100276000ustar00rootroot00000000000000import os from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, get_whitenoise, save_wav, normalize_wav, ) from source_separation.utils.dataset import wsj0mix _FILENAMES = [ "012c0207_1.9952_01cc0202_-1.9952.wav", "01co0302_1.63_014c020q_-1.63.wav", "01do0316_0.24011_205a0104_-0.24011.wav", "01lc020x_1.1301_027o030r_-1.1301.wav", "01mc0202_0.34056_205o0106_-0.34056.wav", "01nc020t_0.53821_018o030w_-0.53821.wav", "01po030f_2.2136_40ko031a_-2.2136.wav", "01ra010o_2.4098_403a010f_-2.4098.wav", "01xo030b_0.22377_016o031a_-0.22377.wav", "02ac020x_0.68566_01ec020b_-0.68566.wav", "20co010m_0.82801_019c0212_-0.82801.wav", "20da010u_1.2483_017c0211_-1.2483.wav", "20oo010d_1.0631_01ic020s_-1.0631.wav", "20sc0107_2.0222_20fo010h_-2.0222.wav", "20tc010f_0.051456_404a0110_-0.051456.wav", "407c0214_1.1712_02ca0113_-1.1712.wav", "40ao030w_2.4697_20vc010a_-2.4697.wav", "40pa0101_1.1087_40ea0107_-1.1087.wav", ] def _mock_dataset(root_dir, num_speaker): dirnames = ["mix"] + [f"s{i+1}" for i in range(num_speaker)] for dirname in dirnames: os.makedirs(os.path.join(root_dir, dirname), exist_ok=True) seed = 0 sample_rate = 8000 expected = [] for filename in _FILENAMES: mix = None src = [] for dirname in dirnames: waveform = get_whitenoise( sample_rate=8000, duration=1, n_channels=1, dtype="int16", seed=seed ) seed += 1 path = os.path.join(root_dir, dirname, filename) save_wav(path, waveform, sample_rate) waveform = normalize_wav(waveform) if dirname == "mix": mix = waveform else: src.append(waveform) expected.append((sample_rate, mix, src)) return expected class TestWSJ0Mix2(TempDirMixin, TorchaudioTestCase): backend = "default" root_dir = None expected = None @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() cls.expected = _mock_dataset(cls.root_dir, 2) def test_wsj0mix(self): dataset = wsj0mix.WSJ0Mix(self.root_dir, num_speakers=2, sample_rate=8000) n_ite = 0 for i, sample in enumerate(dataset): (_, sample_mix, sample_src) = sample (_, expected_mix, expected_src) = self.expected[i] self.assertEqual(sample_mix, expected_mix, atol=5e-5, rtol=1e-8) self.assertEqual(sample_src[0], expected_src[0], atol=5e-5, rtol=1e-8) self.assertEqual(sample_src[1], expected_src[1], atol=5e-5, rtol=1e-8) n_ite += 1 assert n_ite == len(self.expected) class TestWSJ0Mix3(TempDirMixin, TorchaudioTestCase): backend = "default" root_dir = None expected = None @classmethod def setUpClass(cls): cls.root_dir = cls.get_base_temp_dir() cls.expected = _mock_dataset(cls.root_dir, 3) def test_wsj0mix(self): dataset = wsj0mix.WSJ0Mix(self.root_dir, num_speakers=3, sample_rate=8000) n_ite = 0 for i, sample in enumerate(dataset): (_, sample_mix, sample_src) = sample (_, expected_mix, expected_src) = self.expected[i] self.assertEqual(sample_mix, expected_mix, atol=5e-5, rtol=1e-8) self.assertEqual(sample_src[0], expected_src[0], atol=5e-5, rtol=1e-8) self.assertEqual(sample_src[1], expected_src[1], atol=5e-5, rtol=1e-8) self.assertEqual(sample_src[2], expected_src[2], atol=5e-5, rtol=1e-8) n_ite += 1 assert n_ite == len(self.expected) audio-0.7.2/test/torchaudio_unittest/functional/000077500000000000000000000000001376444676100220645ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/functional/__init__.py000066400000000000000000000000001376444676100241630ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/functional/functional_cpu_test.py000066400000000000000000000127061376444676100265140ustar00rootroot00000000000000import math import unittest import torch import torchaudio import torchaudio.functional as F from parameterized import parameterized import pytest from torchaudio_unittest import common_utils from .functional_impl import Lfilter class TestLFilterFloat32(Lfilter, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cpu') class TestLFilterFloat64(Lfilter, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cpu') class TestCreateFBMatrix(common_utils.TorchaudioTestCase): def test_no_warning_high_n_freq(self): with pytest.warns(None) as w: F.create_fb_matrix(288, 0, 8000, 128, 16000) assert len(w) == 0 def test_no_warning_low_n_mels(self): with pytest.warns(None) as w: F.create_fb_matrix(201, 0, 8000, 89, 16000) assert len(w) == 0 def test_warning(self): with pytest.warns(None) as w: F.create_fb_matrix(201, 0, 8000, 128, 16000) assert len(w) == 1 class TestComputeDeltas(common_utils.TorchaudioTestCase): """Test suite for correctness of compute_deltas""" def test_one_channel(self): specgram = torch.tensor([[[1.0, 2.0, 3.0, 4.0]]]) expected = torch.tensor([[[0.5, 1.0, 1.0, 0.5]]]) computed = F.compute_deltas(specgram, win_length=3) torch.testing.assert_allclose(computed, expected) def test_two_channels(self): specgram = torch.tensor([[[1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0]]]) expected = torch.tensor([[[0.5, 1.0, 1.0, 0.5], [0.5, 1.0, 1.0, 0.5]]]) computed = F.compute_deltas(specgram, win_length=3) torch.testing.assert_allclose(computed, expected) class TestDetectPitchFrequency(common_utils.TorchaudioTestCase): @parameterized.expand([(100,), (440,)]) def test_pitch(self, frequency): sample_rate = 44100 test_sine_waveform = common_utils.get_sinusoid( frequency=frequency, sample_rate=sample_rate, duration=5, ) freq = torchaudio.functional.detect_pitch_frequency(test_sine_waveform, sample_rate) threshold = 1 s = ((freq - frequency).abs() > threshold).sum() self.assertFalse(s) class TestDB_to_amplitude(common_utils.TorchaudioTestCase): def test_DB_to_amplitude(self): # Make some noise x = torch.rand(1000) spectrogram = torchaudio.transforms.Spectrogram() spec = spectrogram(x) amin = 1e-10 ref = 1.0 db_multiplier = math.log10(max(amin, ref)) # Waveform amplitude -> DB -> amplitude multiplier = 20. power = 0.5 db = F.amplitude_to_DB(torch.abs(x), multiplier, amin, db_multiplier, top_db=None) x2 = F.DB_to_amplitude(db, ref, power) torch.testing.assert_allclose(x2, torch.abs(x), atol=5e-5, rtol=1e-5) # Spectrogram amplitude -> DB -> amplitude db = F.amplitude_to_DB(spec, multiplier, amin, db_multiplier, top_db=None) x2 = F.DB_to_amplitude(db, ref, power) torch.testing.assert_allclose(x2, spec, atol=5e-5, rtol=1e-5) # Waveform power -> DB -> power multiplier = 10. power = 1. db = F.amplitude_to_DB(x, multiplier, amin, db_multiplier, top_db=None) x2 = F.DB_to_amplitude(db, ref, power) torch.testing.assert_allclose(x2, torch.abs(x), atol=5e-5, rtol=1e-5) # Spectrogram power -> DB -> power db = F.amplitude_to_DB(spec, multiplier, amin, db_multiplier, top_db=None) x2 = F.DB_to_amplitude(db, ref, power) torch.testing.assert_allclose(x2, spec, atol=5e-5, rtol=1e-5) @pytest.mark.parametrize('complex_tensor', [ torch.randn(1, 2, 1025, 400, 2), torch.randn(1025, 400, 2) ]) @pytest.mark.parametrize('power', [1, 2, 0.7]) def test_complex_norm(complex_tensor, power): expected_norm_tensor = complex_tensor.pow(2).sum(-1).pow(power / 2) norm_tensor = F.complex_norm(complex_tensor, power) torch.testing.assert_allclose(norm_tensor, expected_norm_tensor, atol=1e-5, rtol=1e-5) @pytest.mark.parametrize('specgram', [ torch.randn(2, 1025, 400), torch.randn(1, 201, 100) ]) @pytest.mark.parametrize('mask_param', [100]) @pytest.mark.parametrize('mask_value', [0., 30.]) @pytest.mark.parametrize('axis', [1, 2]) def test_mask_along_axis(specgram, mask_param, mask_value, axis): mask_specgram = F.mask_along_axis(specgram, mask_param, mask_value, axis) other_axis = 1 if axis == 2 else 2 masked_columns = (mask_specgram == mask_value).sum(other_axis) num_masked_columns = (masked_columns == mask_specgram.size(other_axis)).sum() num_masked_columns //= mask_specgram.size(0) assert mask_specgram.size() == specgram.size() assert num_masked_columns < mask_param @pytest.mark.parametrize('mask_param', [100]) @pytest.mark.parametrize('mask_value', [0., 30.]) @pytest.mark.parametrize('axis', [2, 3]) def test_mask_along_axis_iid(mask_param, mask_value, axis): torch.random.manual_seed(42) specgrams = torch.randn(4, 2, 1025, 400) mask_specgrams = F.mask_along_axis_iid(specgrams, mask_param, mask_value, axis) other_axis = 2 if axis == 3 else 3 masked_columns = (mask_specgrams == mask_value).sum(other_axis) num_masked_columns = (masked_columns == mask_specgrams.size(other_axis)).sum(-1) assert mask_specgrams.size() == specgrams.size() assert (num_masked_columns < mask_param).sum() == num_masked_columns.numel() audio-0.7.2/test/torchaudio_unittest/functional/functional_cuda_test.py000066400000000000000000000006241376444676100266350ustar00rootroot00000000000000import torch from torchaudio_unittest import common_utils from .functional_impl import Lfilter @common_utils.skipIfNoCuda class TestLFilterFloat32(Lfilter, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cuda') @common_utils.skipIfNoCuda class TestLFilterFloat64(Lfilter, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cuda') audio-0.7.2/test/torchaudio_unittest/functional/functional_impl.py000066400000000000000000000024611376444676100256240ustar00rootroot00000000000000"""Test defintion common to CPU and CUDA""" import torch import torchaudio.functional as F from torchaudio_unittest import common_utils class Lfilter(common_utils.TestBaseMixin): def test_simple(self): """ Create a very basic signal, Then make a simple 4th order delay The output should be same as the input but shifted """ torch.random.manual_seed(42) waveform = torch.rand(2, 44100 * 1, dtype=self.dtype, device=self.device) b_coeffs = torch.tensor([0, 0, 0, 1], dtype=self.dtype, device=self.device) a_coeffs = torch.tensor([1, 0, 0, 0], dtype=self.dtype, device=self.device) output_waveform = F.lfilter(waveform, a_coeffs, b_coeffs) self.assertEqual(output_waveform[:, 3:], waveform[:, 0:-3], atol=1e-5, rtol=1e-5) def test_clamp(self): input_signal = torch.ones(1, 44100 * 1, dtype=self.dtype, device=self.device) b_coeffs = torch.tensor([1, 0], dtype=self.dtype, device=self.device) a_coeffs = torch.tensor([1, -0.95], dtype=self.dtype, device=self.device) output_signal = F.lfilter(input_signal, a_coeffs, b_coeffs, clamp=True) assert output_signal.max() <= 1 output_signal = F.lfilter(input_signal, a_coeffs, b_coeffs, clamp=False) assert output_signal.max() > 1 audio-0.7.2/test/torchaudio_unittest/io_test.py000066400000000000000000000261371376444676100217530ustar00rootroot00000000000000import os import math import shutil import tempfile import unittest import torch import torchaudio from torchaudio.utils import sox_utils from torchaudio._internal.module_utils import is_module_available from torchaudio_unittest.common_utils import get_asset_path BACKENDS = [] BACKENDS_MP3 = [] if is_module_available('soundfile'): BACKENDS.append('soundfile') if is_module_available('torchaudio._torchaudio'): BACKENDS.append('sox') if ( 'mp3' in sox_utils.list_read_formats() and 'mp3' in sox_utils.list_write_formats() ): BACKENDS_MP3 = ['sox'] def create_temp_assets_dir(): """ Creates a temporary directory and moves all files from test/assets there. Returns a Tuple[string, TemporaryDirectory] which is the folder path and object. """ tmp_dir = tempfile.TemporaryDirectory() shutil.copytree(get_asset_path(), os.path.join(tmp_dir.name, "assets")) return tmp_dir.name, tmp_dir class Test_LoadSave(unittest.TestCase): test_dirpath, test_dir = create_temp_assets_dir() test_filepath = os.path.join(test_dirpath, "assets", "steam-train-whistle-daniel_simon.mp3") test_filepath_wav = os.path.join(test_dirpath, "assets", "steam-train-whistle-daniel_simon.wav") def setUp(self): torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = True def test_1_save(self): for backend in BACKENDS_MP3: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_1_save(self.test_filepath, False) for backend in BACKENDS: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_1_save(self.test_filepath_wav, True) def _test_1_save(self, test_filepath, normalization): # load signal x, sr = torchaudio.load(test_filepath, normalization=normalization) # check save new_filepath = os.path.join(self.test_dirpath, "test.wav") torchaudio.save(new_filepath, x, sr) self.assertTrue(os.path.isfile(new_filepath)) os.unlink(new_filepath) # check automatic normalization x /= 1 << 31 torchaudio.save(new_filepath, x, sr) self.assertTrue(os.path.isfile(new_filepath)) os.unlink(new_filepath) # test save 1d tensor x = x[0, :] # get mono signal x.squeeze_() # remove channel dim torchaudio.save(new_filepath, x, sr) self.assertTrue(os.path.isfile(new_filepath)) os.unlink(new_filepath) # don't allow invalid sizes as inputs with self.assertRaises(ValueError): x.unsqueeze_(1) # L x C not C x L torchaudio.save(new_filepath, x, sr) with self.assertRaises(ValueError): x.squeeze_() x.unsqueeze_(1) x.unsqueeze_(0) # 1 x L x 1 torchaudio.save(new_filepath, x, sr) # don't save to folders that don't exist with self.assertRaises(OSError): new_filepath = os.path.join(self.test_dirpath, "no-path", "test.wav") torchaudio.save(new_filepath, x, sr) def test_1_save_sine(self): for backend in BACKENDS: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_1_save_sine() def _test_1_save_sine(self): # save created file sinewave_filepath = os.path.join(self.test_dirpath, "assets", "sinewave.wav") sr = 16000 freq = 440 volume = 0.3 y = (torch.cos( 2 * math.pi * torch.arange(0, 4 * sr).float() * freq / sr)) y.unsqueeze_(0) # y is between -1 and 1, so must scale y = (y * volume * (2**31)).long() torchaudio.save(sinewave_filepath, y, sr) self.assertTrue(os.path.isfile(sinewave_filepath)) # test precision new_precision = 32 new_filepath = os.path.join(self.test_dirpath, "test.wav") si, ei = torchaudio.info(sinewave_filepath) torchaudio.save(new_filepath, y, sr, new_precision) si32, ei32 = torchaudio.info(new_filepath) self.assertEqual(si.precision, 16) self.assertEqual(si32.precision, new_precision) os.unlink(new_filepath) def test_2_load(self): for backend in BACKENDS_MP3: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_2_load(self.test_filepath, 278756) for backend in BACKENDS: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_2_load(self.test_filepath_wav, 276858) def _test_2_load(self, test_filepath, length): # check normal loading x, sr = torchaudio.load(test_filepath) self.assertEqual(sr, 44100) self.assertEqual(x.size(), (2, length)) # check offset offset = 15 x, _ = torchaudio.load(test_filepath) x_offset, _ = torchaudio.load(test_filepath, offset=offset) self.assertTrue(x[:, offset:].allclose(x_offset)) # check number of frames n = 201 x, _ = torchaudio.load(test_filepath, num_frames=n) self.assertTrue(x.size(), (2, n)) # check channels first x, _ = torchaudio.load(test_filepath, channels_first=False) self.assertEqual(x.size(), (length, 2)) # check raising errors with self.assertRaises(OSError): torchaudio.load("file-does-not-exist.mp3") with self.assertRaises(OSError): tdir = os.path.join( os.path.dirname(self.test_dirpath), "torchaudio") torchaudio.load(tdir) def test_2_load_nonormalization(self): for backend in BACKENDS_MP3: if backend == 'sox_io': continue with self.subTest(): torchaudio.set_audio_backend(backend) self._test_2_load_nonormalization(self.test_filepath, 278756) def _test_2_load_nonormalization(self, test_filepath, length): # check no normalizing x, _ = torchaudio.load(test_filepath, normalization=False) self.assertTrue(x.min() <= -1.0) self.assertTrue(x.max() >= 1.0) # check different input tensor type x, _ = torchaudio.load(test_filepath, torch.LongTensor(), normalization=False) self.assertTrue(isinstance(x, torch.LongTensor)) def test_3_load_and_save_is_identity(self): for backend in BACKENDS: if backend == 'sox_io': continue with self.subTest(): torchaudio.set_audio_backend(backend) self._test_3_load_and_save_is_identity() def _test_3_load_and_save_is_identity(self): input_path = os.path.join(self.test_dirpath, 'assets', 'sinewave.wav') tensor, sample_rate = torchaudio.load(input_path) output_path = os.path.join(self.test_dirpath, 'test.wav') torchaudio.save(output_path, tensor, sample_rate) tensor2, sample_rate2 = torchaudio.load(output_path) self.assertTrue(tensor.allclose(tensor2)) self.assertEqual(sample_rate, sample_rate2) os.unlink(output_path) @unittest.skipIf(any(be not in BACKENDS for be in ["sox", "soundfile"]), "sox and soundfile are not available") def test_3_load_and_save_is_identity_across_backend(self): with self.subTest(): self._test_3_load_and_save_is_identity_across_backend("sox", "soundfile") with self.subTest(): self._test_3_load_and_save_is_identity_across_backend("soundfile", "sox") def _test_3_load_and_save_is_identity_across_backend(self, backend1, backend2): torchaudio.set_audio_backend(backend1) input_path = os.path.join(self.test_dirpath, 'assets', 'sinewave.wav') tensor1, sample_rate1 = torchaudio.load(input_path) output_path = os.path.join(self.test_dirpath, 'test.wav') torchaudio.save(output_path, tensor1, sample_rate1) torchaudio.set_audio_backend(backend2) tensor2, sample_rate2 = torchaudio.load(output_path) self.assertTrue(tensor1.allclose(tensor2)) self.assertEqual(sample_rate1, sample_rate2) os.unlink(output_path) def test_4_load_partial(self): for backend in BACKENDS_MP3: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_4_load_partial() def _test_4_load_partial(self): num_frames = 101 offset = 201 # load entire mono sinewave wav file, load a partial copy and then compare input_sine_path = os.path.join(self.test_dirpath, 'assets', 'sinewave.wav') x_sine_full, sr_sine = torchaudio.load(input_sine_path) x_sine_part, _ = torchaudio.load(input_sine_path, num_frames=num_frames, offset=offset) l1_error = x_sine_full[:, offset:(num_frames + offset)].sub(x_sine_part).abs().sum().item() # test for the correct number of samples and that the correct portion was loaded self.assertEqual(x_sine_part.size(1), num_frames) self.assertEqual(l1_error, 0.) # create a two channel version of this wavefile x_2ch_sine = x_sine_full.repeat(1, 2) out_2ch_sine_path = os.path.join(self.test_dirpath, 'assets', '2ch_sinewave.wav') torchaudio.save(out_2ch_sine_path, x_2ch_sine, sr_sine) x_2ch_sine_load, _ = torchaudio.load(out_2ch_sine_path, num_frames=num_frames, offset=offset) os.unlink(out_2ch_sine_path) l1_error = x_2ch_sine_load.sub(x_2ch_sine[:, offset:(offset + num_frames)]).abs().sum().item() self.assertEqual(l1_error, 0.) # test with two channel mp3 x_2ch_full, sr_2ch = torchaudio.load(self.test_filepath, normalization=True) x_2ch_part, _ = torchaudio.load(self.test_filepath, normalization=True, num_frames=num_frames, offset=offset) l1_error = x_2ch_full[:, offset:(offset + num_frames)].sub(x_2ch_part).abs().sum().item() self.assertEqual(x_2ch_part.size(1), num_frames) self.assertEqual(l1_error, 0.) # check behavior if number of samples would exceed file length offset_ns = 300 x_ns, _ = torchaudio.load(input_sine_path, num_frames=100000, offset=offset_ns) self.assertEqual(x_ns.size(1), x_sine_full.size(1) - offset_ns) # check when offset is beyond the end of the file with self.assertRaises(RuntimeError): torchaudio.load(input_sine_path, offset=100000) def test_5_get_info(self): for backend in BACKENDS: with self.subTest(): torchaudio.set_audio_backend(backend) self._test_5_get_info() def _test_5_get_info(self): input_path = os.path.join(self.test_dirpath, 'assets', 'sinewave.wav') channels, samples, rate, precision = (1, 64000, 16000, 16) si, ei = torchaudio.info(input_path) self.assertEqual(si.channels, channels) self.assertEqual(si.length, samples) self.assertEqual(si.rate, rate) self.assertEqual(ei.bits_per_sample, precision) audio-0.7.2/test/torchaudio_unittest/kaldi_compatibility_cpu_test.py000066400000000000000000000005331376444676100262200ustar00rootroot00000000000000import torch from torchaudio_unittest import common_utils from .kaldi_compatibility_impl import Kaldi class TestKaldiFloat32(Kaldi, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cpu') class TestKaldiFloat64(Kaldi, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cpu') audio-0.7.2/test/torchaudio_unittest/kaldi_compatibility_cuda_test.py000066400000000000000000000006231376444676100263450ustar00rootroot00000000000000import torch from torchaudio_unittest import common_utils from .kaldi_compatibility_impl import Kaldi @common_utils.skipIfNoCuda class TestKaldiFloat32(Kaldi, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cuda') @common_utils.skipIfNoCuda class TestKaldiFloat64(Kaldi, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cuda') audio-0.7.2/test/torchaudio_unittest/kaldi_compatibility_impl.py000066400000000000000000000105201376444676100253300ustar00rootroot00000000000000"""Test suites for checking numerical compatibility against Kaldi""" import subprocess import kaldi_io import torch import torchaudio.functional as F import torchaudio.compliance.kaldi from parameterized import parameterized from torchaudio_unittest.common_utils import ( TestBaseMixin, load_params, skipIfNoExec, get_asset_path, load_wav ) def _convert_args(**kwargs): args = [] for key, value in kwargs.items(): key = '--' + key.replace('_', '-') value = str(value).lower() if value in [True, False] else str(value) args.append('%s=%s' % (key, value)) return args def _run_kaldi(command, input_type, input_value): """Run provided Kaldi command, pass a tensor and get the resulting tensor Arguments: input_type: str 'ark' or 'scp' input_value: Tensor for 'ark' string for 'scp' (path to an audio file) """ key = 'foo' process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) if input_type == 'ark': kaldi_io.write_mat(process.stdin, input_value.cpu().numpy(), key=key) elif input_type == 'scp': process.stdin.write(f'{key} {input_value}'.encode('utf8')) else: raise NotImplementedError('Unexpected type') process.stdin.close() result = dict(kaldi_io.read_mat_ark(process.stdout))['foo'] return torch.from_numpy(result.copy()) # copy supresses some torch warning class Kaldi(TestBaseMixin): def assert_equal(self, output, *, expected, rtol=None, atol=None): expected = expected.to(dtype=self.dtype, device=self.device) self.assertEqual(output, expected, rtol=rtol, atol=atol) @skipIfNoExec('apply-cmvn-sliding') def test_sliding_window_cmn(self): """sliding_window_cmn should be numerically compatible with apply-cmvn-sliding""" kwargs = { 'cmn_window': 600, 'min_cmn_window': 100, 'center': False, 'norm_vars': False, } tensor = torch.randn(40, 10, dtype=self.dtype, device=self.device) result = F.sliding_window_cmn(tensor, **kwargs) command = ['apply-cmvn-sliding'] + _convert_args(**kwargs) + ['ark:-', 'ark:-'] kaldi_result = _run_kaldi(command, 'ark', tensor) self.assert_equal(result, expected=kaldi_result) @parameterized.expand(load_params('kaldi_test_fbank_args.json')) @skipIfNoExec('compute-fbank-feats') def test_fbank(self, kwargs): """fbank should be numerically compatible with compute-fbank-feats""" wave_file = get_asset_path('kaldi_file.wav') waveform = load_wav(wave_file, normalize=False)[0].to(dtype=self.dtype, device=self.device) result = torchaudio.compliance.kaldi.fbank(waveform, **kwargs) command = ['compute-fbank-feats'] + _convert_args(**kwargs) + ['scp:-', 'ark:-'] kaldi_result = _run_kaldi(command, 'scp', wave_file) self.assert_equal(result, expected=kaldi_result, rtol=1e-4, atol=1e-8) @parameterized.expand(load_params('kaldi_test_spectrogram_args.json')) @skipIfNoExec('compute-spectrogram-feats') def test_spectrogram(self, kwargs): """spectrogram should be numerically compatible with compute-spectrogram-feats""" wave_file = get_asset_path('kaldi_file.wav') waveform = load_wav(wave_file, normalize=False)[0].to(dtype=self.dtype, device=self.device) result = torchaudio.compliance.kaldi.spectrogram(waveform, **kwargs) command = ['compute-spectrogram-feats'] + _convert_args(**kwargs) + ['scp:-', 'ark:-'] kaldi_result = _run_kaldi(command, 'scp', wave_file) self.assert_equal(result, expected=kaldi_result, rtol=1e-4, atol=1e-8) @parameterized.expand(load_params('kaldi_test_mfcc_args.json')) @skipIfNoExec('compute-mfcc-feats') def test_mfcc(self, kwargs): """mfcc should be numerically compatible with compute-mfcc-feats""" wave_file = get_asset_path('kaldi_file.wav') waveform = load_wav(wave_file, normalize=False)[0].to(dtype=self.dtype, device=self.device) result = torchaudio.compliance.kaldi.mfcc(waveform, **kwargs) command = ['compute-mfcc-feats'] + _convert_args(**kwargs) + ['scp:-', 'ark:-'] kaldi_result = _run_kaldi(command, 'scp', wave_file) self.assert_equal(result, expected=kaldi_result, rtol=1e-4, atol=1e-8) audio-0.7.2/test/torchaudio_unittest/kaldi_io_test.py000066400000000000000000000027261376444676100231150ustar00rootroot00000000000000import unittest import torch import torchaudio.kaldi_io as kio from torchaudio_unittest import common_utils class Test_KaldiIO(common_utils.TorchaudioTestCase): data1 = [[1, 2, 3], [11, 12, 13], [21, 22, 23]] data2 = [[31, 32, 33], [41, 42, 43], [51, 52, 53]] def _test_helper(self, file_name, expected_data, fn, expected_dtype): """ Takes a file_name to the input data and a function fn to extract the data. It compares the extracted data to the expected_data. The expected_dtype will be used to check that the extracted data is of the right type. """ test_filepath = common_utils.get_asset_path(file_name) expected_output = {'key' + str(idx + 1): torch.tensor(val, dtype=expected_dtype) for idx, val in enumerate(expected_data)} for key, vec in fn(test_filepath): self.assertTrue(key in expected_output) self.assertTrue(isinstance(vec, torch.Tensor)) self.assertEqual(vec.dtype, expected_dtype) self.assertTrue(torch.all(torch.eq(vec, expected_output[key]))) def test_read_vec_int_ark(self): self._test_helper("vec_int.ark", self.data1, kio.read_vec_int_ark, torch.int32) def test_read_vec_flt_ark(self): self._test_helper("vec_flt.ark", self.data1, kio.read_vec_flt_ark, torch.float32) def test_read_mat_ark(self): self._test_helper("mat.ark", [self.data1, self.data2], kio.read_mat_ark, torch.float32) audio-0.7.2/test/torchaudio_unittest/librosa_compatibility_test.py000066400000000000000000000353531376444676100257300ustar00rootroot00000000000000"""Test suites for numerical compatibility with librosa""" import os import unittest from distutils.version import StrictVersion import torch import torchaudio import torchaudio.functional as F from torchaudio._internal.module_utils import is_module_available LIBROSA_AVAILABLE = is_module_available('librosa') if LIBROSA_AVAILABLE: import numpy as np import librosa import scipy import pytest from torchaudio_unittest import common_utils @unittest.skipIf(not LIBROSA_AVAILABLE, "Librosa not available") class TestFunctional(common_utils.TorchaudioTestCase): """Test suite for functions in `functional` module.""" def test_griffinlim(self): # NOTE: This test is flaky without a fixed random seed # See https://github.com/pytorch/audio/issues/382 torch.random.manual_seed(42) tensor = torch.rand((1, 1000)) n_fft = 400 ws = 400 hop = 100 window = torch.hann_window(ws) normalize = False momentum = 0.99 n_iter = 8 length = 1000 rand_init = False init = 'random' if rand_init else None specgram = F.spectrogram(tensor, 0, window, n_fft, hop, ws, 2, normalize).sqrt() ta_out = F.griffinlim(specgram, window, n_fft, hop, ws, 1, normalize, n_iter, momentum, length, rand_init) lr_out = librosa.griffinlim(specgram.squeeze(0).numpy(), n_iter=n_iter, hop_length=hop, momentum=momentum, init=init, length=length) lr_out = torch.from_numpy(lr_out).unsqueeze(0) self.assertEqual(ta_out, lr_out, atol=5e-5, rtol=1e-5) def _test_create_fb(self, n_mels=40, sample_rate=22050, n_fft=2048, fmin=0.0, fmax=8000.0, norm=None): librosa_fb = librosa.filters.mel(sr=sample_rate, n_fft=n_fft, n_mels=n_mels, fmax=fmax, fmin=fmin, htk=True, norm=norm) fb = F.create_fb_matrix(sample_rate=sample_rate, n_mels=n_mels, f_max=fmax, f_min=fmin, n_freqs=(n_fft // 2 + 1), norm=norm) for i_mel_bank in range(n_mels): self.assertEqual( fb[:, i_mel_bank], torch.tensor(librosa_fb[i_mel_bank]), atol=1e-4, rtol=1e-5) def test_create_fb(self): self._test_create_fb() self._test_create_fb(n_mels=128, sample_rate=44100) self._test_create_fb(n_mels=128, fmin=2000.0, fmax=5000.0) self._test_create_fb(n_mels=56, fmin=100.0, fmax=9000.0) self._test_create_fb(n_mels=56, fmin=800.0, fmax=900.0) self._test_create_fb(n_mels=56, fmin=1900.0, fmax=900.0) self._test_create_fb(n_mels=10, fmin=1900.0, fmax=900.0) if StrictVersion(librosa.__version__) < StrictVersion("0.7.2"): return self._test_create_fb(n_mels=128, sample_rate=44100, norm="slaney") self._test_create_fb(n_mels=128, fmin=2000.0, fmax=5000.0, norm="slaney") self._test_create_fb(n_mels=56, fmin=100.0, fmax=9000.0, norm="slaney") self._test_create_fb(n_mels=56, fmin=800.0, fmax=900.0, norm="slaney") self._test_create_fb(n_mels=56, fmin=1900.0, fmax=900.0, norm="slaney") self._test_create_fb(n_mels=10, fmin=1900.0, fmax=900.0, norm="slaney") def test_amplitude_to_DB(self): spec = torch.rand((6, 201)) amin = 1e-10 db_multiplier = 0.0 top_db = 80.0 # Power to DB multiplier = 10.0 ta_out = F.amplitude_to_DB(spec, multiplier, amin, db_multiplier, top_db) lr_out = librosa.core.power_to_db(spec.numpy()) lr_out = torch.from_numpy(lr_out) self.assertEqual(ta_out, lr_out, atol=5e-5, rtol=1e-5) # Amplitude to DB multiplier = 20.0 ta_out = F.amplitude_to_DB(spec, multiplier, amin, db_multiplier, top_db) lr_out = librosa.core.amplitude_to_db(spec.numpy()) lr_out = torch.from_numpy(lr_out) self.assertEqual(ta_out, lr_out, atol=5e-5, rtol=1e-5) @pytest.mark.parametrize('complex_specgrams', [ torch.randn(2, 1025, 400, 2) ]) @pytest.mark.parametrize('rate', [0.5, 1.01, 1.3]) @pytest.mark.parametrize('hop_length', [256]) @unittest.skipIf(not LIBROSA_AVAILABLE, "Librosa not available") def test_phase_vocoder(complex_specgrams, rate, hop_length): # Due to cummulative sum, numerical error in using torch.float32 will # result in bottom right values of the stretched sectrogram to not # match with librosa. complex_specgrams = complex_specgrams.type(torch.float64) phase_advance = torch.linspace(0, np.pi * hop_length, complex_specgrams.shape[-3], dtype=torch.float64)[..., None] complex_specgrams_stretch = F.phase_vocoder(complex_specgrams, rate=rate, phase_advance=phase_advance) # == Test shape expected_size = list(complex_specgrams.size()) expected_size[-2] = int(np.ceil(expected_size[-2] / rate)) assert complex_specgrams.dim() == complex_specgrams_stretch.dim() assert complex_specgrams_stretch.size() == torch.Size(expected_size) # == Test values index = [0] * (complex_specgrams.dim() - 3) + [slice(None)] * 3 mono_complex_specgram = complex_specgrams[index].numpy() mono_complex_specgram = mono_complex_specgram[..., 0] + \ mono_complex_specgram[..., 1] * 1j expected_complex_stretch = librosa.phase_vocoder(mono_complex_specgram, rate=rate, hop_length=hop_length) complex_stretch = complex_specgrams_stretch[index].numpy() complex_stretch = complex_stretch[..., 0] + 1j * complex_stretch[..., 1] assert np.allclose(complex_stretch, expected_complex_stretch, atol=1e-5) def _load_audio_asset(*asset_paths, **kwargs): file_path = common_utils.get_asset_path(*asset_paths) sound, sample_rate = torchaudio.load(file_path, **kwargs) return sound, sample_rate @unittest.skipIf(not LIBROSA_AVAILABLE, "Librosa not available") class TestTransforms(common_utils.TorchaudioTestCase): """Test suite for functions in `transforms` module.""" def assert_compatibilities(self, n_fft, hop_length, power, n_mels, n_mfcc, sample_rate): common_utils.set_audio_backend('default') path = common_utils.get_asset_path('sinewave.wav') sound, sample_rate = common_utils.load_wav(path) sound_librosa = sound.cpu().numpy().squeeze() # (64000) # test core spectrogram spect_transform = torchaudio.transforms.Spectrogram( n_fft=n_fft, hop_length=hop_length, power=power) out_librosa, _ = librosa.core.spectrum._spectrogram( y=sound_librosa, n_fft=n_fft, hop_length=hop_length, power=power) out_torch = spect_transform(sound).squeeze().cpu() self.assertEqual(out_torch, torch.from_numpy(out_librosa), atol=1e-5, rtol=1e-5) # test mel spectrogram melspect_transform = torchaudio.transforms.MelSpectrogram( sample_rate=sample_rate, window_fn=torch.hann_window, hop_length=hop_length, n_mels=n_mels, n_fft=n_fft) librosa_mel = librosa.feature.melspectrogram( y=sound_librosa, sr=sample_rate, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, htk=True, norm=None) librosa_mel_tensor = torch.from_numpy(librosa_mel) torch_mel = melspect_transform(sound).squeeze().cpu() self.assertEqual( torch_mel.type(librosa_mel_tensor.dtype), librosa_mel_tensor, atol=5e-3, rtol=1e-5) # test s2db power_to_db_transform = torchaudio.transforms.AmplitudeToDB('power', 80.) power_to_db_torch = power_to_db_transform(spect_transform(sound)).squeeze().cpu() power_to_db_librosa = librosa.core.spectrum.power_to_db(out_librosa) self.assertEqual(power_to_db_torch, torch.from_numpy(power_to_db_librosa), atol=5e-3, rtol=1e-5) mag_to_db_transform = torchaudio.transforms.AmplitudeToDB('magnitude', 80.) mag_to_db_torch = mag_to_db_transform(torch.abs(sound)).squeeze().cpu() mag_to_db_librosa = librosa.core.spectrum.amplitude_to_db(sound_librosa) self.assertEqual(mag_to_db_torch, torch.from_numpy(mag_to_db_librosa), atol=5e-3, rtol=1e-5) power_to_db_torch = power_to_db_transform(melspect_transform(sound)).squeeze().cpu() db_librosa = librosa.core.spectrum.power_to_db(librosa_mel) db_librosa_tensor = torch.from_numpy(db_librosa) self.assertEqual( power_to_db_torch.type(db_librosa_tensor.dtype), db_librosa_tensor, atol=5e-3, rtol=1e-5) # test MFCC melkwargs = {'hop_length': hop_length, 'n_fft': n_fft} mfcc_transform = torchaudio.transforms.MFCC( sample_rate=sample_rate, n_mfcc=n_mfcc, norm='ortho', melkwargs=melkwargs) # librosa.feature.mfcc doesn't pass kwargs properly since some of the # kwargs for melspectrogram and mfcc are the same. We just follow the # function body in # https://librosa.github.io/librosa/_modules/librosa/feature/spectral.html#melspectrogram # to mirror this function call with correct args: # # librosa_mfcc = librosa.feature.mfcc( # y=sound_librosa, sr=sample_rate, n_mfcc = n_mfcc, # hop_length=hop_length, n_fft=n_fft, htk=True, norm=None, n_mels=n_mels) librosa_mfcc = scipy.fftpack.dct(db_librosa, axis=0, type=2, norm='ortho')[:n_mfcc] librosa_mfcc_tensor = torch.from_numpy(librosa_mfcc) torch_mfcc = mfcc_transform(sound).squeeze().cpu() self.assertEqual( torch_mfcc.type(librosa_mfcc_tensor.dtype), librosa_mfcc_tensor, atol=5e-3, rtol=1e-5) def test_basics1(self): kwargs = { 'n_fft': 400, 'hop_length': 200, 'power': 2.0, 'n_mels': 128, 'n_mfcc': 40, 'sample_rate': 16000 } self.assert_compatibilities(**kwargs) def test_basics2(self): kwargs = { 'n_fft': 600, 'hop_length': 100, 'power': 2.0, 'n_mels': 128, 'n_mfcc': 20, 'sample_rate': 16000 } self.assert_compatibilities(**kwargs) # NOTE: Test passes offline, but fails on TravisCI (and CircleCI), see #372. @unittest.skipIf('CI' in os.environ, 'Test is known to fail on CI') def test_basics3(self): kwargs = { 'n_fft': 200, 'hop_length': 50, 'power': 2.0, 'n_mels': 128, 'n_mfcc': 50, 'sample_rate': 24000 } self.assert_compatibilities(**kwargs) def test_basics4(self): kwargs = { 'n_fft': 400, 'hop_length': 200, 'power': 3.0, 'n_mels': 128, 'n_mfcc': 40, 'sample_rate': 16000 } self.assert_compatibilities(**kwargs) def test_MelScale(self): """MelScale transform is comparable to that of librosa""" n_fft = 2048 n_mels = 256 hop_length = n_fft // 4 sample_rate = 44100 sound = common_utils.get_whitenoise(sample_rate=sample_rate, duration=60) sound = sound.mean(dim=0, keepdim=True) spec_ta = F.spectrogram( sound, pad=0, window=torch.hann_window(n_fft), n_fft=n_fft, hop_length=hop_length, win_length=n_fft, power=2, normalized=False) spec_lr = spec_ta.cpu().numpy().squeeze() # Perform MelScale with torchaudio and librosa melspec_ta = torchaudio.transforms.MelScale(n_mels=n_mels, sample_rate=sample_rate)(spec_ta) melspec_lr = librosa.feature.melspectrogram( S=spec_lr, sr=sample_rate, n_fft=n_fft, hop_length=hop_length, win_length=n_fft, center=True, window='hann', n_mels=n_mels, htk=True, norm=None) # Note: Using relaxed rtol instead of atol self.assertEqual(melspec_ta, torch.from_numpy(melspec_lr[None, ...]), atol=1e-8, rtol=1e-3) def test_InverseMelScale(self): """InverseMelScale transform is comparable to that of librosa""" n_fft = 2048 n_mels = 256 n_stft = n_fft // 2 + 1 hop_length = n_fft // 4 # Prepare mel spectrogram input. We use torchaudio to compute one. path = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') sound, sample_rate = common_utils.load_wav(path) sound = sound[:, 2**10:2**10 + 2**14] sound = sound.mean(dim=0, keepdim=True) spec_orig = F.spectrogram( sound, pad=0, window=torch.hann_window(n_fft), n_fft=n_fft, hop_length=hop_length, win_length=n_fft, power=2, normalized=False) melspec_ta = torchaudio.transforms.MelScale(n_mels=n_mels, sample_rate=sample_rate)(spec_orig) melspec_lr = melspec_ta.cpu().numpy().squeeze() # Perform InverseMelScale with torch audio and librosa spec_ta = torchaudio.transforms.InverseMelScale( n_stft, n_mels=n_mels, sample_rate=sample_rate)(melspec_ta) spec_lr = librosa.feature.inverse.mel_to_stft( melspec_lr, sr=sample_rate, n_fft=n_fft, power=2.0, htk=True, norm=None) spec_lr = torch.from_numpy(spec_lr[None, ...]) # Align dimensions # librosa does not return power spectrogram while torchaudio returns power spectrogram spec_orig = spec_orig.sqrt() spec_ta = spec_ta.sqrt() threshold = 2.0 # This threshold was choosen empirically, based on the following observation # # torch.dist(spec_lr, spec_ta, p=float('inf')) # >>> tensor(1.9666) # # The spectrograms reconstructed by librosa and torchaudio are not comparable elementwise. # This is because they use different approximation algorithms and resulting values can live # in different magnitude. (although most of them are very close) # See # https://github.com/pytorch/audio/pull/366 for the discussion of the choice of algorithm # https://github.com/pytorch/audio/pull/448/files#r385747021 for the distribution of P-inf # distance over frequencies. self.assertEqual(spec_ta, spec_lr, atol=threshold, rtol=1e-5) threshold = 1700.0 # This threshold was choosen empirically, based on the following observations # # torch.dist(spec_orig, spec_ta, p=1) # >>> tensor(1644.3516) # torch.dist(spec_orig, spec_lr, p=1) # >>> tensor(1420.7103) # torch.dist(spec_lr, spec_ta, p=1) # >>> tensor(943.2759) assert torch.dist(spec_orig, spec_ta, p=1) < threshold audio-0.7.2/test/torchaudio_unittest/models_test.py000066400000000000000000000126431376444676100226240ustar00rootroot00000000000000import itertools from collections import namedtuple import torch from parameterized import parameterized from torchaudio.models import ConvTasNet, Wav2Letter, WaveRNN from torchaudio.models.wavernn import MelResNet, UpsampleNetwork from torchaudio_unittest import common_utils class TestWav2Letter(common_utils.TorchaudioTestCase): def test_waveform(self): batch_size = 2 num_features = 1 num_classes = 40 input_length = 320 model = Wav2Letter(num_classes=num_classes, num_features=num_features) x = torch.rand(batch_size, num_features, input_length) out = model(x) assert out.size() == (batch_size, num_classes, 2) def test_mfcc(self): batch_size = 2 num_features = 13 num_classes = 40 input_length = 2 model = Wav2Letter(num_classes=num_classes, input_type="mfcc", num_features=num_features) x = torch.rand(batch_size, num_features, input_length) out = model(x) assert out.size() == (batch_size, num_classes, 2) class TestMelResNet(common_utils.TorchaudioTestCase): def test_waveform(self): """Validate the output dimensions of a MelResNet block. """ n_batch = 2 n_time = 200 n_freq = 100 n_output = 128 n_res_block = 10 n_hidden = 128 kernel_size = 5 model = MelResNet(n_res_block, n_freq, n_hidden, n_output, kernel_size) x = torch.rand(n_batch, n_freq, n_time) out = model(x) assert out.size() == (n_batch, n_output, n_time - kernel_size + 1) class TestUpsampleNetwork(common_utils.TorchaudioTestCase): def test_waveform(self): """Validate the output dimensions of a UpsampleNetwork block. """ upsample_scales = [5, 5, 8] n_batch = 2 n_time = 200 n_freq = 100 n_output = 256 n_res_block = 10 n_hidden = 128 kernel_size = 5 total_scale = 1 for upsample_scale in upsample_scales: total_scale *= upsample_scale model = UpsampleNetwork(upsample_scales, n_res_block, n_freq, n_hidden, n_output, kernel_size) x = torch.rand(n_batch, n_freq, n_time) out1, out2 = model(x) assert out1.size() == (n_batch, n_freq, total_scale * (n_time - kernel_size + 1)) assert out2.size() == (n_batch, n_output, total_scale * (n_time - kernel_size + 1)) class TestWaveRNN(common_utils.TorchaudioTestCase): def test_waveform(self): """Validate the output dimensions of a WaveRNN model. """ upsample_scales = [5, 5, 8] n_rnn = 512 n_fc = 512 n_classes = 512 hop_length = 200 n_batch = 2 n_time = 200 n_freq = 100 n_output = 256 n_res_block = 10 n_hidden = 128 kernel_size = 5 model = WaveRNN(upsample_scales, n_classes, hop_length, n_res_block, n_rnn, n_fc, kernel_size, n_freq, n_hidden, n_output) x = torch.rand(n_batch, 1, hop_length * (n_time - kernel_size + 1)) mels = torch.rand(n_batch, 1, n_freq, n_time) out = model(x, mels) assert out.size() == (n_batch, 1, hop_length * (n_time - kernel_size + 1), n_classes) _ConvTasNetParams = namedtuple( '_ConvTasNetParams', [ 'enc_num_feats', 'enc_kernel_size', 'msk_num_feats', 'msk_num_hidden_feats', 'msk_kernel_size', 'msk_num_layers', 'msk_num_stacks', ] ) class TestConvTasNet(common_utils.TorchaudioTestCase): @parameterized.expand(list(itertools.product( [2, 3], [ _ConvTasNetParams(128, 40, 128, 256, 3, 7, 2), _ConvTasNetParams(256, 40, 128, 256, 3, 7, 2), _ConvTasNetParams(512, 40, 128, 256, 3, 7, 2), _ConvTasNetParams(512, 40, 128, 256, 3, 7, 2), _ConvTasNetParams(512, 40, 128, 512, 3, 7, 2), _ConvTasNetParams(512, 40, 128, 512, 3, 7, 2), _ConvTasNetParams(512, 40, 256, 256, 3, 7, 2), _ConvTasNetParams(512, 40, 256, 512, 3, 7, 2), _ConvTasNetParams(512, 40, 256, 512, 3, 7, 2), _ConvTasNetParams(512, 40, 128, 512, 3, 6, 4), _ConvTasNetParams(512, 40, 128, 512, 3, 4, 6), _ConvTasNetParams(512, 40, 128, 512, 3, 8, 3), _ConvTasNetParams(512, 32, 128, 512, 3, 8, 3), _ConvTasNetParams(512, 16, 128, 512, 3, 8, 3), ], ))) def test_paper_configuration(self, num_sources, model_params): """ConvTasNet model works on the valid configurations in the paper""" batch_size = 32 num_frames = 8000 model = ConvTasNet( num_sources=num_sources, enc_kernel_size=model_params.enc_kernel_size, enc_num_feats=model_params.enc_num_feats, msk_kernel_size=model_params.msk_kernel_size, msk_num_feats=model_params.msk_num_feats, msk_num_hidden_feats=model_params.msk_num_hidden_feats, msk_num_layers=model_params.msk_num_layers, msk_num_stacks=model_params.msk_num_stacks, ) tensor = torch.rand(batch_size, 1, num_frames) output = model(tensor) assert output.shape == (batch_size, num_sources, num_frames) audio-0.7.2/test/torchaudio_unittest/soundfile_backend/000077500000000000000000000000001376444676100233615ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/soundfile_backend/__init__.py000066400000000000000000000000001376444676100254600ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/soundfile_backend/common.py000066400000000000000000000015731376444676100252310ustar00rootroot00000000000000import itertools from unittest import skipIf from parameterized import parameterized from torchaudio._internal.module_utils import is_module_available def name_func(func, _, params): return f'{func.__name__}_{"_".join(str(arg) for arg in params.args)}' def dtype2subtype(dtype): return { "float64": "DOUBLE", "float32": "FLOAT", "int32": "PCM_32", "int16": "PCM_16", "uint8": "PCM_U8", "int8": "PCM_S8", }[dtype] def skipIfFormatNotSupported(fmt): fmts = [] if is_module_available("soundfile"): import soundfile fmts = soundfile.available_formats() return skipIf(fmt not in fmts, f'"{fmt}" is not supported by sondfile') return skipIf(True, '"soundfile" not available.') def parameterize(*params): return parameterized.expand(list(itertools.product(*params)), name_func=name_func) audio-0.7.2/test/torchaudio_unittest/soundfile_backend/info_test.py000066400000000000000000000071571376444676100257370ustar00rootroot00000000000000import torch from torchaudio.backend import _soundfile_backend as soundfile_backend from torchaudio._internal import module_utils as _mod_utils from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoModule, get_wav_data, save_wav, ) from .common import skipIfFormatNotSupported, parameterize if _mod_utils.is_module_available("soundfile"): import soundfile @skipIfNoModule("soundfile") class TestInfo(TempDirMixin, PytorchTestCase): @parameterize( ["float32", "int32", "int16", "uint8"], [8000, 16000], [1, 2], ) def test_wav(self, dtype, sample_rate, num_channels): """`soundfile_backend.info` can check wav file correctly""" duration = 1 path = self.get_temp_path("data.wav") data = get_wav_data( dtype, num_channels, normalize=False, num_frames=duration * sample_rate ) save_wav(path, data, sample_rate) info = soundfile_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterize( ["float32", "int32", "int16", "uint8"], [8000, 16000], [4, 8, 16, 32], ) def test_wav_multiple_channels(self, dtype, sample_rate, num_channels): """`soundfile_backend.info` can check wav file with channels more than 2 correctly""" duration = 1 path = self.get_temp_path("data.wav") data = get_wav_data( dtype, num_channels, normalize=False, num_frames=duration * sample_rate ) save_wav(path, data, sample_rate) info = soundfile_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterize([8000, 16000], [1, 2]) @skipIfFormatNotSupported("FLAC") def test_flac(self, sample_rate, num_channels): """`soundfile_backend.info` can check flac file correctly""" duration = 1 num_frames = sample_rate * duration data = torch.randn(num_frames, num_channels).numpy() path = self.get_temp_path("data.flac") soundfile.write(path, data, sample_rate) info = soundfile_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == num_frames assert info.num_channels == num_channels @parameterize([8000, 16000], [1, 2]) @skipIfFormatNotSupported("OGG") def test_ogg(self, sample_rate, num_channels): """`soundfile_backend.info` can check ogg file correctly""" duration = 1 num_frames = sample_rate * duration data = torch.randn(num_frames, num_channels).numpy() path = self.get_temp_path("data.ogg") soundfile.write(path, data, sample_rate) info = soundfile_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterize([8000, 16000], [1, 2]) @skipIfFormatNotSupported("NIST") def test_sphere(self, sample_rate, num_channels): """`soundfile_backend.info` can check sph file correctly""" duration = 1 num_frames = sample_rate * duration data = torch.randn(num_frames, num_channels).numpy() path = self.get_temp_path("data.nist") soundfile.write(path, data, sample_rate) info = soundfile_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels audio-0.7.2/test/torchaudio_unittest/soundfile_backend/load_test.py000066400000000000000000000216371376444676100257220ustar00rootroot00000000000000import itertools from unittest.mock import patch import torch from torchaudio._internal import module_utils as _mod_utils from torchaudio.backend import _soundfile_backend as soundfile_backend from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoModule, get_wav_data, normalize_wav, load_wav, save_wav, ) from .common import ( parameterize, dtype2subtype, skipIfFormatNotSupported, ) if _mod_utils.is_module_available("soundfile"): import soundfile def _get_mock_path( ext: str, dtype: str, sample_rate: int, num_channels: int, num_frames: int, ): return f"{dtype}_{sample_rate}_{num_channels}_{num_frames}.{ext}" def _get_mock_params(path: str): filename, ext = path.split(".") parts = filename.split("_") return { "ext": ext, "dtype": parts[0], "sample_rate": int(parts[1]), "num_channels": int(parts[2]), "num_frames": int(parts[3]), } class SoundFileMock: def __init__(self, path, mode): assert mode == "r" self.path = path self._params = _get_mock_params(path) self._start = None @property def samplerate(self): return self._params["sample_rate"] @property def format(self): if self._params["ext"] == "wav": return "WAV" if self._params["ext"] == "flac": return "FLAC" if self._params["ext"] == "ogg": return "OGG" if self._params["ext"] in ["sph", "nis", "nist"]: return "NIST" @property def subtype(self): if self._params["ext"] == "ogg": return "VORBIS" return dtype2subtype(self._params["dtype"]) def _prepare_read(self, start, stop, frames): assert stop is None self._start = start return frames def read(self, frames, dtype, always_2d): assert always_2d data = get_wav_data( dtype, self._params["num_channels"], normalize=False, num_frames=self._params["num_frames"], channels_first=False, ).numpy() return data[self._start:self._start + frames] def __enter__(self): return self def __exit__(self, *args, **kwargs): pass class MockedLoadTest(PytorchTestCase): def assert_dtype( self, ext, dtype, sample_rate, num_channels, normalize, channels_first ): """When format is WAV or NIST, normalize=False will return the native dtype Tensor, otherwise float32""" num_frames = 3 * sample_rate path = _get_mock_path(ext, dtype, sample_rate, num_channels, num_frames) expected_dtype = ( torch.float32 if normalize or ext not in ["wav", "nist"] else getattr(torch, dtype) ) with patch("soundfile.SoundFile", SoundFileMock): found, sr = soundfile_backend.load( path, normalize=normalize, channels_first=channels_first ) assert found.dtype == expected_dtype assert sample_rate == sr @parameterize( ["uint8", "int16", "int32", "float32", "float64"], [8000, 16000], [1, 2], [True, False], [True, False], ) def test_wav(self, dtype, sample_rate, num_channels, normalize, channels_first): """Returns native dtype when normalize=False else float32""" self.assert_dtype( "wav", dtype, sample_rate, num_channels, normalize, channels_first ) @parameterize( ["int8", "int16", "int32"], [8000, 16000], [1, 2], [True, False], [True, False], ) def test_sphere(self, dtype, sample_rate, num_channels, normalize, channels_first): """Returns float32 always""" self.assert_dtype( "sph", dtype, sample_rate, num_channels, normalize, channels_first ) @parameterize([8000, 16000], [1, 2], [True, False], [True, False]) def test_ogg(self, sample_rate, num_channels, normalize, channels_first): """Returns float32 always""" self.assert_dtype( "ogg", "int16", sample_rate, num_channels, normalize, channels_first ) @parameterize([8000, 16000], [1, 2], [True, False], [True, False]) def test_flac(self, sample_rate, num_channels, normalize, channels_first): """`soundfile_backend.load` can load ogg format.""" self.assert_dtype( "flac", "int16", sample_rate, num_channels, normalize, channels_first ) class LoadTestBase(TempDirMixin, PytorchTestCase): def assert_wav( self, dtype, sample_rate, num_channels, normalize, channels_first=True, duration=1, ): """`soundfile_backend.load` can load wav format correctly. Wav data loaded with soundfile backend should match those with scipy """ path = self.get_temp_path("reference.wav") num_frames = duration * sample_rate data = get_wav_data( dtype, num_channels, normalize=normalize, num_frames=num_frames, channels_first=channels_first, ) save_wav(path, data, sample_rate, channels_first=channels_first) expected = load_wav(path, normalize=normalize, channels_first=channels_first)[0] data, sr = soundfile_backend.load( path, normalize=normalize, channels_first=channels_first ) assert sr == sample_rate self.assertEqual(data, expected) def assert_sphere( self, dtype, sample_rate, num_channels, channels_first=True, duration=1, ): """`soundfile_backend.load` can load SPHERE format correctly.""" path = self.get_temp_path("reference.sph") num_frames = duration * sample_rate raw = get_wav_data( dtype, num_channels, num_frames=num_frames, normalize=False, channels_first=False, ) soundfile.write( path, raw, sample_rate, subtype=dtype2subtype(dtype), format="NIST" ) expected = normalize_wav(raw.t() if channels_first else raw) data, sr = soundfile_backend.load(path, channels_first=channels_first) assert sr == sample_rate self.assertEqual(data, expected, atol=1e-4, rtol=1e-8) def assert_flac( self, dtype, sample_rate, num_channels, channels_first=True, duration=1, ): """`soundfile_backend.load` can load FLAC format correctly.""" path = self.get_temp_path("reference.flac") num_frames = duration * sample_rate raw = get_wav_data( dtype, num_channels, num_frames=num_frames, normalize=False, channels_first=False, ) soundfile.write(path, raw, sample_rate) expected = normalize_wav(raw.t() if channels_first else raw) data, sr = soundfile_backend.load(path, channels_first=channels_first) assert sr == sample_rate self.assertEqual(data, expected, atol=1e-4, rtol=1e-8) @skipIfNoModule("soundfile") class TestLoad(LoadTestBase): """Test the correctness of `soundfile_backend.load` for various formats""" @parameterize( ["float32", "int32", "int16"], [8000, 16000], [1, 2], [False, True], [False, True], ) def test_wav(self, dtype, sample_rate, num_channels, normalize, channels_first): """`soundfile_backend.load` can load wav format correctly.""" self.assert_wav(dtype, sample_rate, num_channels, normalize, channels_first) @parameterize( ["int16"], [16000], [2], [False], ) def test_wav_large(self, dtype, sample_rate, num_channels, normalize): """`soundfile_backend.load` can load large wav file correctly.""" two_hours = 2 * 60 * 60 self.assert_wav(dtype, sample_rate, num_channels, normalize, duration=two_hours) @parameterize(["float32", "int32", "int16"], [4, 8, 16, 32], [False, True]) def test_multiple_channels(self, dtype, num_channels, channels_first): """`soundfile_backend.load` can load wav file with more than 2 channels.""" sample_rate = 8000 normalize = False self.assert_wav(dtype, sample_rate, num_channels, normalize, channels_first) @parameterize(["int32", "int16"], [8000, 16000], [1, 2], [False, True]) @skipIfFormatNotSupported("NIST") def test_sphere(self, dtype, sample_rate, num_channels, channels_first): """`soundfile_backend.load` can load sphere format correctly.""" self.assert_sphere(dtype, sample_rate, num_channels, channels_first) @parameterize(["int32", "int16"], [8000, 16000], [1, 2], [False, True]) @skipIfFormatNotSupported("FLAC") def test_flac(self, dtype, sample_rate, num_channels, channels_first): """`soundfile_backend.load` can load flac format correctly.""" self.assert_flac(dtype, sample_rate, num_channels, channels_first) audio-0.7.2/test/torchaudio_unittest/soundfile_backend/save_test.py000066400000000000000000000176421376444676100257420ustar00rootroot00000000000000import itertools from unittest.mock import patch from torchaudio._internal import module_utils as _mod_utils from torchaudio.backend import _soundfile_backend as soundfile_backend from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoModule, get_wav_data, load_wav, ) from .common import parameterize, dtype2subtype, skipIfFormatNotSupported if _mod_utils.is_module_available("soundfile"): import soundfile class MockedSaveTest(PytorchTestCase): @parameterize( ["float32", "int32", "int16", "uint8"], [8000, 16000], [1, 2], [False, True], ) @patch("soundfile.write") def test_wav(self, dtype, sample_rate, num_channels, channels_first, mocked_write): """soundfile_backend.save passes correct subtype to soundfile.write when WAV""" filepath = "foo.wav" input_tensor = get_wav_data( dtype, num_channels, num_frames=3 * sample_rate, normalize=dtype == "flaot32", channels_first=channels_first, ).t() soundfile_backend.save( filepath, input_tensor, sample_rate, channels_first=channels_first ) # on +Py3.8 call_args.kwargs is more descreptive args = mocked_write.call_args[1] assert args["file"] == filepath assert args["samplerate"] == sample_rate assert args["subtype"] == dtype2subtype(dtype) assert args["format"] is None self.assertEqual( args["data"], input_tensor.t() if channels_first else input_tensor ) @patch("soundfile.write") def assert_non_wav( self, fmt, dtype, sample_rate, num_channels, channels_first, mocked_write ): """soundfile_backend.save passes correct subtype and format to soundfile.write when SPHERE""" filepath = f"foo.{fmt}" input_tensor = get_wav_data( dtype, num_channels, num_frames=3 * sample_rate, normalize=False, channels_first=channels_first, ).t() expected_data = input_tensor.t() if channels_first else input_tensor soundfile_backend.save( filepath, input_tensor, sample_rate, channels_first=channels_first ) # on +Py3.8 call_args.kwargs is more descreptive args = mocked_write.call_args[1] assert args["file"] == filepath assert args["samplerate"] == sample_rate assert args["subtype"] is None if fmt in ["sph", "nist", "nis"]: assert args["format"] == "NIST" else: assert args["format"] is None self.assertEqual(args["data"], expected_data) @parameterize( ["sph", "nist", "nis"], ["int32", "int16"], [8000, 16000], [1, 2], [False, True], ) def test_sph(self, fmt, dtype, sample_rate, num_channels, channels_first): """soundfile_backend.save passes default format and subtype (None-s) to soundfile.write when not WAV""" self.assert_non_wav(fmt, dtype, sample_rate, num_channels, channels_first) @parameterize( ["int32", "int16"], [8000, 16000], [1, 2], [False, True], ) def test_flac(self, dtype, sample_rate, num_channels, channels_first): """soundfile_backend.save passes default format and subtype (None-s) to soundfile.write when not WAV""" self.assert_non_wav("flac", dtype, sample_rate, num_channels, channels_first) @parameterize( ["int32", "int16"], [8000, 16000], [1, 2], [False, True], ) def test_ogg(self, dtype, sample_rate, num_channels, channels_first): """soundfile_backend.save passes default format and subtype (None-s) to soundfile.write when not WAV""" self.assert_non_wav("ogg", dtype, sample_rate, num_channels, channels_first) @skipIfNoModule("soundfile") class SaveTestBase(TempDirMixin, PytorchTestCase): def assert_wav(self, dtype, sample_rate, num_channels, num_frames): """`soundfile_backend.save` can save wav format.""" path = self.get_temp_path("data.wav") expected = get_wav_data( dtype, num_channels, num_frames=num_frames, normalize=False ) soundfile_backend.save(path, expected, sample_rate) found, sr = load_wav(path, normalize=False) assert sample_rate == sr self.assertEqual(found, expected) def _assert_non_wav(self, fmt, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save non-wav format. Due to precision missmatch, and the lack of alternative way to decode the resulting files without using soundfile, only meta data are validated. """ num_frames = sample_rate * 3 path = self.get_temp_path(f"data.{fmt}") expected = get_wav_data( dtype, num_channels, num_frames=num_frames, normalize=False ) soundfile_backend.save(path, expected, sample_rate) sinfo = soundfile.info(path) assert sinfo.format == fmt.upper() assert sinfo.frames == num_frames assert sinfo.channels == num_channels assert sinfo.samplerate == sample_rate def assert_flac(self, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save flac format.""" self._assert_non_wav("flac", dtype, sample_rate, num_channels) def assert_sphere(self, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save sph format.""" self._assert_non_wav("nist", dtype, sample_rate, num_channels) def assert_ogg(self, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save ogg format. As we cannot inspect the OGG format (it's lossy), we only check the metadata. """ self._assert_non_wav("ogg", dtype, sample_rate, num_channels) @skipIfNoModule("soundfile") class TestSave(SaveTestBase): @parameterize( ["float32", "int32", "int16"], [8000, 16000], [1, 2], ) def test_wav(self, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save wav format.""" self.assert_wav(dtype, sample_rate, num_channels, num_frames=None) @parameterize( ["float32", "int32", "int16"], [4, 8, 16, 32], ) def test_multiple_channels(self, dtype, num_channels): """`soundfile_backend.save` can save wav with more than 2 channels.""" sample_rate = 8000 self.assert_wav(dtype, sample_rate, num_channels, num_frames=None) @parameterize( ["int32", "int16"], [8000, 16000], [1, 2], ) @skipIfFormatNotSupported("NIST") def test_sphere(self, dtype, sample_rate, num_channels): """`soundfile_backend.save` can save sph format.""" self.assert_sphere(dtype, sample_rate, num_channels) @parameterize( [8000, 16000], [1, 2], ) @skipIfFormatNotSupported("FLAC") def test_flac(self, sample_rate, num_channels): """`soundfile_backend.save` can save flac format.""" self.assert_flac("float32", sample_rate, num_channels) @parameterize( [8000, 16000], [1, 2], ) @skipIfFormatNotSupported("OGG") def test_ogg(self, sample_rate, num_channels): """`soundfile_backend.save` can save ogg/vorbis format.""" self.assert_ogg("float32", sample_rate, num_channels) @skipIfNoModule("soundfile") class TestSaveParams(TempDirMixin, PytorchTestCase): """Test the correctness of optional parameters of `soundfile_backend.save`""" @parameterize([(True,), (False,)]) def test_channels_first(self, channels_first): """channels_first swaps axes""" path = self.get_temp_path("data.wav") data = get_wav_data("int32", 2, channels_first=channels_first) soundfile_backend.save(path, data, 8000, channels_first=channels_first) found = load_wav(path)[0] expected = data if channels_first else data.transpose(1, 0) self.assertEqual(found, expected, atol=1e-4, rtol=1e-8) audio-0.7.2/test/torchaudio_unittest/sox_compatibility_test.py000066400000000000000000000261541376444676100251050ustar00rootroot00000000000000import unittest import torch import torchaudio.functional as F import torchaudio.transforms as T from parameterized import parameterized from torchaudio_unittest.common_utils import ( skipIfNoSoxBackend, skipIfNoExec, TempDirMixin, TorchaudioTestCase, get_asset_path, sox_utils, load_wav, save_wav, get_whitenoise, ) @skipIfNoSoxBackend @skipIfNoExec('sox') class TestFunctionalFiltering(TempDirMixin, TorchaudioTestCase): def run_sox_effect(self, input_file, effect): output_file = self.get_temp_path('expected.wav') sox_utils.run_sox_effect(input_file, output_file, [str(e) for e in effect]) return load_wav(output_file) def assert_sox_effect(self, result, input_path, effects, atol=1e-04, rtol=1e-5): expected, _ = self.run_sox_effect(input_path, effects) self.assertEqual(result, expected, atol=atol, rtol=rtol) def get_whitenoise(self, sample_rate=8000): noise = get_whitenoise( sample_rate=sample_rate, duration=3, scale_factor=0.9, ) path = self.get_temp_path("whitenoise.wav") save_wav(path, noise, sample_rate) return noise, path def test_gain(self): path = get_asset_path('steam-train-whistle-daniel_simon.wav') data, _ = load_wav(path) result = F.gain(data, 3) self.assert_sox_effect(result, path, ['gain', 3]) def test_dither(self): path = get_asset_path('steam-train-whistle-daniel_simon.wav') data, _ = load_wav(path) result = F.dither(data) self.assert_sox_effect(result, path, ['dither']) def test_dither_noise(self): path = get_asset_path('steam-train-whistle-daniel_simon.wav') data, _ = load_wav(path) result = F.dither(data, noise_shaping=True) self.assert_sox_effect(result, path, ['dither', '-s'], atol=1.5e-4) def test_lowpass(self): cutoff_freq = 3000 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.lowpass_biquad(data, sample_rate, cutoff_freq) self.assert_sox_effect(result, path, ['lowpass', cutoff_freq], atol=1.5e-4) def test_highpass(self): cutoff_freq = 2000 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.highpass_biquad(data, sample_rate, cutoff_freq) self.assert_sox_effect(result, path, ['highpass', cutoff_freq], atol=1.5e-4) def test_allpass(self): central_freq = 1000 q = 0.707 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.allpass_biquad(data, sample_rate, central_freq, q) self.assert_sox_effect(result, path, ['allpass', central_freq, f'{q}q']) def test_bandpass_with_csg(self): central_freq = 1000 q = 0.707 const_skirt_gain = True sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.bandpass_biquad(data, sample_rate, central_freq, q, const_skirt_gain) self.assert_sox_effect(result, path, ['bandpass', '-c', central_freq, f'{q}q']) def test_bandpass_without_csg(self): central_freq = 1000 q = 0.707 const_skirt_gain = False sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.bandpass_biquad(data, sample_rate, central_freq, q, const_skirt_gain) self.assert_sox_effect(result, path, ['bandpass', central_freq, f'{q}q']) def test_bandreject(self): central_freq = 1000 q = 0.707 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.bandreject_biquad(data, sample_rate, central_freq, q) self.assert_sox_effect(result, path, ['bandreject', central_freq, f'{q}q']) def test_band_with_noise(self): central_freq = 1000 q = 0.707 noise = True sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.band_biquad(data, sample_rate, central_freq, q, noise) self.assert_sox_effect(result, path, ['band', '-n', central_freq, f'{q}q']) def test_band_without_noise(self): central_freq = 1000 q = 0.707 noise = False sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.band_biquad(data, sample_rate, central_freq, q, noise) self.assert_sox_effect(result, path, ['band', central_freq, f'{q}q']) def test_treble(self): central_freq = 1000 q = 0.707 gain = 40 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.treble_biquad(data, sample_rate, gain, central_freq, q) self.assert_sox_effect(result, path, ['treble', gain, central_freq, f'{q}q']) def test_bass(self): central_freq = 1000 q = 0.707 gain = 40 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.bass_biquad(data, sample_rate, gain, central_freq, q) self.assert_sox_effect(result, path, ['bass', gain, central_freq, f'{q}q'], atol=1.5e-4) def test_deemph(self): sample_rate = 44100 data, path = self.get_whitenoise(sample_rate) result = F.deemph_biquad(data, sample_rate) self.assert_sox_effect(result, path, ['deemph']) def test_riaa(self): sample_rate = 44100 data, path = self.get_whitenoise(sample_rate) result = F.riaa_biquad(data, sample_rate) self.assert_sox_effect(result, path, ['riaa']) def test_contrast(self): enhancement_amount = 80. data, path = self.get_whitenoise() result = F.contrast(data, enhancement_amount) self.assert_sox_effect(result, path, ['contrast', enhancement_amount]) def test_dcshift_with_limiter(self): shift = 0.5 limiter_gain = 0.05 data, path = self.get_whitenoise() result = F.dcshift(data, shift, limiter_gain) self.assert_sox_effect(result, path, ['dcshift', shift, limiter_gain]) def test_dcshift_without_limiter(self): shift = 0.6 data, path = self.get_whitenoise() result = F.dcshift(data, shift) self.assert_sox_effect(result, path, ['dcshift', shift]) def test_overdrive(self): gain = 30 colour = 40 data, path = self.get_whitenoise() result = F.overdrive(data, gain, colour) self.assert_sox_effect(result, path, ['overdrive', gain, colour]) def test_phaser_sine(self): gain_in = 0.5 gain_out = 0.8 delay_ms = 2.0 decay = 0.4 speed = 0.5 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.phaser(data, sample_rate, gain_in, gain_out, delay_ms, decay, speed, sinusoidal=True) self.assert_sox_effect(result, path, ['phaser', gain_in, gain_out, delay_ms, decay, speed, '-s']) def test_phaser_triangle(self): gain_in = 0.5 gain_out = 0.8 delay_ms = 2.0 decay = 0.4 speed = 0.5 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.phaser(data, sample_rate, gain_in, gain_out, delay_ms, decay, speed, sinusoidal=False) self.assert_sox_effect(result, path, ['phaser', gain_in, gain_out, delay_ms, decay, speed, '-t']) def test_flanger_triangle_linear(self): delay = 0.6 depth = 0.87 regen = 3.0 width = 0.9 speed = 0.5 phase = 30 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.flanger( data, sample_rate, delay, depth, regen, width, speed, phase, modulation='triangular', interpolation='linear') self.assert_sox_effect( result, path, ['flanger', delay, depth, regen, width, speed, 'triangle', phase, 'linear']) def test_flanger_triangle_quad(self): delay = 0.8 depth = 0.88 regen = 3.0 width = 0.4 speed = 0.5 phase = 40 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.flanger( data, sample_rate, delay, depth, regen, width, speed, phase, modulation='triangular', interpolation='quadratic') self.assert_sox_effect( result, path, ['flanger', delay, depth, regen, width, speed, 'triangle', phase, 'quadratic']) def test_flanger_sine_linear(self): delay = 0.8 depth = 0.88 regen = 3.0 width = 0.23 speed = 1.3 phase = 60 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.flanger( data, sample_rate, delay, depth, regen, width, speed, phase, modulation='sinusoidal', interpolation='linear') self.assert_sox_effect( result, path, ['flanger', delay, depth, regen, width, speed, 'sine', phase, 'linear']) def test_flanger_sine_quad(self): delay = 0.9 depth = 0.9 regen = 4.0 width = 0.23 speed = 1.3 phase = 25 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.flanger( data, sample_rate, delay, depth, regen, width, speed, phase, modulation='sinusoidal', interpolation='quadratic') self.assert_sox_effect( result, path, ['flanger', delay, depth, regen, width, speed, 'sine', phase, 'quadratic']) def test_equalizer(self): center_freq = 300 q = 0.707 gain = 1 sample_rate = 8000 data, path = self.get_whitenoise(sample_rate) result = F.equalizer_biquad(data, sample_rate, center_freq, gain, q) self.assert_sox_effect(result, path, ['equalizer', center_freq, q, gain]) def test_perf_biquad_filtering(self): b0 = 0.4 b1 = 0.2 b2 = 0.9 a0 = 0.7 a1 = 0.2 a2 = 0.6 data, path = self.get_whitenoise() result = F.lfilter(data, torch.tensor([a0, a1, a2]), torch.tensor([b0, b1, b2])) self.assert_sox_effect(result, path, ['biquad', b0, b1, b2, a0, a1, a2]) @parameterized.expand([ ('q', 'quarter_sine'), ('h', 'half_sine'), ('t', 'linear'), ]) def test_fade(self, fade_shape_sox, fade_shape): fade_in_len, fade_out_len = 44100, 44100 data, path = self.get_whitenoise(sample_rate=44100) result = T.Fade(fade_in_len, fade_out_len, fade_shape)(data) self.assert_sox_effect(result, path, ['fade', fade_shape_sox, '1', '0', '1']) @parameterized.expand([ ('amplitude', 1.1), ('db', 2), ('power', 2), ]) def test_vol(self, gain_type, gain): data, path = self.get_whitenoise() result = T.Vol(gain, gain_type)(data) self.assert_sox_effect(result, path, ['vol', f'{gain}', gain_type]) @parameterized.expand(['vad-go-stereo-44100.wav', 'vad-go-mono-32000.wav']) def test_vad(self, filename): path = get_asset_path(filename) data, sample_rate = load_wav(path) result = T.Vad(sample_rate)(data) self.assert_sox_effect(result, path, ['vad']) audio-0.7.2/test/torchaudio_unittest/sox_effect/000077500000000000000000000000001376444676100220475ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/sox_effect/__init__.py000066400000000000000000000000001376444676100241460ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/sox_effect/common.py000066400000000000000000000014251376444676100237130ustar00rootroot00000000000000import json from parameterized import param from torchaudio_unittest.common_utils import get_asset_path def name_func(func, _, params): if isinstance(params.args[0], str): args = "_".join([str(arg) for arg in params.args]) else: args = "_".join([str(arg) for arg in params.args[0]]) return f'{func.__name__}_{args}' def load_params(*paths): params = [] with open(get_asset_path(*paths), 'r') as file: for line in file: data = json.loads(line) for effect in data['effects']: for i, arg in enumerate(effect): if arg.startswith(""): effect[i] = arg.replace("", get_asset_path()) params.append(param(data)) return params audio-0.7.2/test/torchaudio_unittest/sox_effect/dataset_test.py000066400000000000000000000125061376444676100251110ustar00rootroot00000000000000import sys import platform from unittest import skipIf from typing import List, Tuple from concurrent.futures import ProcessPoolExecutor import numpy as np import torch import torchaudio from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExtension, get_whitenoise, save_wav, ) class RandomPerturbationFile(torch.utils.data.Dataset): """Given flist, apply random speed perturbation""" def __init__(self, flist: List[str], sample_rate: int): super().__init__() self.flist = flist self.sample_rate = sample_rate self.rng = None def __getitem__(self, index): speed = self.rng.uniform(0.5, 2.0) effects = [ ['gain', '-n', '-10'], ['speed', f'{speed:.5f}'], # duration of data is 0.5 ~ 2.0 seconds. ['rate', f'{self.sample_rate}'], ['pad', '0', '1.5'], # add 1.5 seconds silence at the end ['trim', '0', '2'], # get the first 2 seconds ] data, _ = torchaudio.sox_effects.apply_effects_file(self.flist[index], effects) return data def __len__(self): return len(self.flist) class RandomPerturbationTensor(torch.utils.data.Dataset): """Apply speed purturbation to (synthetic) Tensor data""" def __init__(self, signals: List[Tuple[torch.Tensor, int]], sample_rate: int): super().__init__() self.signals = signals self.sample_rate = sample_rate self.rng = None def __getitem__(self, index): speed = self.rng.uniform(0.5, 2.0) effects = [ ['gain', '-n', '-10'], ['speed', f'{speed:.5f}'], # duration of data is 0.5 ~ 2.0 seconds. ['rate', f'{self.sample_rate}'], ['pad', '0', '1.5'], # add 1.5 seconds silence at the end ['trim', '0', '2'], # get the first 2 seconds ] tensor, sample_rate = self.signals[index] data, _ = torchaudio.sox_effects.apply_effects_tensor(tensor, sample_rate, effects) return data def __len__(self): return len(self.signals) def init_random_seed(worker_id): dataset = torch.utils.data.get_worker_info().dataset dataset.rng = np.random.RandomState(worker_id) @skipIfNoExtension @skipIf( platform.system() == 'Darwin' and sys.version_info.major == 3 and sys.version_info.minor in [6, 7], 'This test is known to get stuck for macOS with Python < 3.8. ' 'See https://github.com/pytorch/pytorch/issues/46409' ) class TestSoxEffectsDataset(TempDirMixin, PytorchTestCase): """Test `apply_effects_file` in multi-process dataloader setting""" def _generate_dataset(self, num_samples=128): flist = [] for i in range(num_samples): sample_rate = np.random.choice([8000, 16000, 44100]) dtype = np.random.choice(['float32', 'int32', 'int16', 'uint8']) data = get_whitenoise(n_channels=2, sample_rate=sample_rate, duration=1, dtype=dtype) path = self.get_temp_path(f'{i:03d}_{dtype}_{sample_rate}.wav') save_wav(path, data, sample_rate) flist.append(path) return flist def test_apply_effects_file(self): sample_rate = 12000 flist = self._generate_dataset() dataset = RandomPerturbationFile(flist, sample_rate) loader = torch.utils.data.DataLoader( dataset, batch_size=32, num_workers=16, worker_init_fn=init_random_seed, ) for batch in loader: assert batch.shape == (32, 2, 2 * sample_rate) def _generate_signals(self, num_samples=128): signals = [] for _ in range(num_samples): sample_rate = np.random.choice([8000, 16000, 44100]) data = get_whitenoise( n_channels=2, sample_rate=sample_rate, duration=1, dtype='float32') signals.append((data, sample_rate)) return signals def test_apply_effects_tensor(self): sample_rate = 12000 signals = self._generate_signals() dataset = RandomPerturbationTensor(signals, sample_rate) loader = torch.utils.data.DataLoader( dataset, batch_size=32, num_workers=16, worker_init_fn=init_random_seed, ) for batch in loader: assert batch.shape == (32, 2, 2 * sample_rate) def speed(path): wav, sample_rate = torchaudio.backend.sox_io_backend.load(path) effects = [ ['speed', '1.03756523535464655'], ['rate', f'{sample_rate}'], ] return torchaudio.sox_effects.apply_effects_tensor(wav, sample_rate, effects)[0] @skipIfNoExtension class TestProcessPoolExecutor(TempDirMixin, PytorchTestCase): backend = "sox_io" def setUp(self): sample_rate = 16000 self.flist = [] for i in range(10): path = self.get_temp_path(f'{i}.wav') data = get_whitenoise(n_channels=1, sample_rate=sample_rate, duration=1, dtype='float') save_wav(path, data, sample_rate) self.flist.append(path) def test_executor(self): """Test that apply_effects_tensor with speed + rate does not crush https://github.com/pytorch/audio/issues/1021 """ executor = ProcessPoolExecutor(1) futures = [executor.submit(speed, path) for path in self.flist] for future in futures: future.result() audio-0.7.2/test/torchaudio_unittest/sox_effect/smoke_test.py000066400000000000000000000041741376444676100246040ustar00rootroot00000000000000from torchaudio import sox_effects from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, skipIfNoExtension, get_wav_data, get_sinusoid, save_wav, ) from .common import ( name_func, load_params, ) @skipIfNoExtension class SmokeTest(TempDirMixin, TorchaudioTestCase): """Run smoke test on various effects The purpose of this test suite is to verify that sox_effect functionalities do not exhibit abnormal behaviors. This test suite should be able to run without any additional tools (such as sox command), however without such tools, the correctness of each function cannot be verified. """ @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects_tensor(self, args): """`apply_effects_tensor` should not crash""" effects = args['effects'] num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) original = get_sinusoid( frequency=800, sample_rate=input_sr, n_channels=num_channels, dtype='float32') _found, _sr = sox_effects.apply_effects_tensor(original, input_sr, effects) @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects(self, args): """`apply_effects_file` should return identical data as sox command""" dtype = 'int32' channels_first = True effects = args['effects'] num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) input_path = self.get_temp_path('input.wav') data = get_wav_data(dtype, num_channels, channels_first=channels_first) save_wav(input_path, data, input_sr, channels_first=channels_first) _found, _sr = sox_effects.apply_effects_file( input_path, effects, normalize=False, channels_first=channels_first) audio-0.7.2/test/torchaudio_unittest/sox_effect/sox_effect_test.py000066400000000000000000000215551376444676100256150ustar00rootroot00000000000000import itertools from torchaudio import sox_effects from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExtension, get_sinusoid, get_wav_data, save_wav, load_wav, sox_utils, ) from .common import ( load_params, name_func, ) @skipIfNoExtension class TestSoxEffects(PytorchTestCase): def test_init(self): """Calling init_sox_effects multiple times does not crush""" for _ in range(3): sox_effects.init_sox_effects() @skipIfNoExtension class TestSoxEffectsTensor(TempDirMixin, PytorchTestCase): """Test suite for `apply_effects_tensor` function""" @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2, 4, 8], [True, False] )), name_func=name_func) def test_apply_no_effect(self, dtype, sample_rate, num_channels, channels_first): """`apply_effects_tensor` without effects should return identical data as input""" original = get_wav_data(dtype, num_channels, channels_first=channels_first) expected = original.clone() found, output_sample_rate = sox_effects.apply_effects_tensor( expected, sample_rate, [], channels_first) assert output_sample_rate == sample_rate # SoxEffect should not alter the input Tensor object self.assertEqual(original, expected) # SoxEffect should not return the same Tensor object assert expected is not found # Returned Tensor should equal to the input Tensor self.assertEqual(expected, found) @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects(self, args): """`apply_effects_tensor` should return identical data as sox command""" effects = args['effects'] num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) output_sr = args.get("output_sample_rate") input_path = self.get_temp_path('input.wav') reference_path = self.get_temp_path('reference.wav') original = get_sinusoid( frequency=800, sample_rate=input_sr, n_channels=num_channels, dtype='float32') save_wav(input_path, original, input_sr) sox_utils.run_sox_effect( input_path, reference_path, effects, output_sample_rate=output_sr) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_tensor(original, input_sr, effects) assert sr == expected_sr self.assertEqual(expected, found) @skipIfNoExtension class TestSoxEffectsFile(TempDirMixin, PytorchTestCase): """Test suite for `apply_effects_file` function""" @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2, 4, 8], [False, True], )), name_func=name_func) def test_apply_no_effect(self, dtype, sample_rate, num_channels, channels_first): """`apply_effects_file` without effects should return identical data as input""" path = self.get_temp_path('input.wav') expected = get_wav_data(dtype, num_channels, channels_first=channels_first) save_wav(path, expected, sample_rate, channels_first=channels_first) found, output_sample_rate = sox_effects.apply_effects_file( path, [], normalize=False, channels_first=channels_first) assert output_sample_rate == sample_rate self.assertEqual(expected, found) @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects(self, args): """`apply_effects_file` should return identical data as sox command""" dtype = 'int32' channels_first = True effects = args['effects'] num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) output_sr = args.get("output_sample_rate") input_path = self.get_temp_path('input.wav') reference_path = self.get_temp_path('reference.wav') data = get_wav_data(dtype, num_channels, channels_first=channels_first) save_wav(input_path, data, input_sr, channels_first=channels_first) sox_utils.run_sox_effect( input_path, reference_path, effects, output_sample_rate=output_sr) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_file( input_path, effects, normalize=False, channels_first=channels_first) assert sr == expected_sr self.assertEqual(found, expected) @skipIfNoExtension class TestFileFormats(TempDirMixin, PytorchTestCase): """`apply_effects_file` gives the same result as sox on various file formats""" @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=lambda f, _, p: f'{f.__name__}_{"_".join(str(arg) for arg in p.args)}') def test_wav(self, dtype, sample_rate, num_channels): """`apply_effects_file` works on various wav format""" channels_first = True effects = [['band', '300', '10']] input_path = self.get_temp_path('input.wav') reference_path = self.get_temp_path('reference.wav') data = get_wav_data(dtype, num_channels, channels_first=channels_first) save_wav(input_path, data, sample_rate, channels_first=channels_first) sox_utils.run_sox_effect(input_path, reference_path, effects) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_file( input_path, effects, normalize=False, channels_first=channels_first) assert sr == expected_sr self.assertEqual(found, expected) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=lambda f, _, p: f'{f.__name__}_{"_".join(str(arg) for arg in p.args)}') def test_mp3(self, sample_rate, num_channels): """`apply_effects_file` works on various mp3 format""" channels_first = True effects = [['band', '300', '10']] input_path = self.get_temp_path('input.mp3') reference_path = self.get_temp_path('reference.wav') sox_utils.gen_audio_file(input_path, sample_rate, num_channels) sox_utils.run_sox_effect(input_path, reference_path, effects) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_file( input_path, effects, channels_first=channels_first) save_wav(self.get_temp_path('result.wav'), found, sr, channels_first=channels_first) assert sr == expected_sr self.assertEqual(found, expected, atol=1e-4, rtol=1e-8) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=lambda f, _, p: f'{f.__name__}_{"_".join(str(arg) for arg in p.args)}') def test_flac(self, sample_rate, num_channels): """`apply_effects_file` works on various flac format""" channels_first = True effects = [['band', '300', '10']] input_path = self.get_temp_path('input.flac') reference_path = self.get_temp_path('reference.wav') sox_utils.gen_audio_file(input_path, sample_rate, num_channels) sox_utils.run_sox_effect(input_path, reference_path, effects, output_bitdepth=32) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_file( input_path, effects, channels_first=channels_first) save_wav(self.get_temp_path('result.wav'), found, sr, channels_first=channels_first) assert sr == expected_sr self.assertEqual(found, expected) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=lambda f, _, p: f'{f.__name__}_{"_".join(str(arg) for arg in p.args)}') def test_vorbis(self, sample_rate, num_channels): """`apply_effects_file` works on various vorbis format""" channels_first = True effects = [['band', '300', '10']] input_path = self.get_temp_path('input.vorbis') reference_path = self.get_temp_path('reference.wav') sox_utils.gen_audio_file(input_path, sample_rate, num_channels) sox_utils.run_sox_effect(input_path, reference_path, effects, output_bitdepth=32) expected, expected_sr = load_wav(reference_path) found, sr = sox_effects.apply_effects_file( input_path, effects, channels_first=channels_first) save_wav(self.get_temp_path('result.wav'), found, sr, channels_first=channels_first) assert sr == expected_sr self.assertEqual(found, expected) audio-0.7.2/test/torchaudio_unittest/sox_effect/sox_effects_chain_test.py000066400000000000000000000230641376444676100271370ustar00rootroot00000000000000import sys import math import unittest import torch import torchaudio from .. import common_utils @common_utils.skipIfNoSoxBackend class Test_SoxEffectsChain(common_utils.TorchaudioTestCase): backend = 'sox' test_filepath = common_utils.get_asset_path("steam-train-whistle-daniel_simon.wav") def test_single_channel(self): fn_sine = common_utils.get_asset_path("sinewave.wav") E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(fn_sine) E.append_effect_to_chain("echos", [0.8, 0.7, 40, 0.25, 63, 0.3]) x, sr = E.sox_build_flow_effects() # check if effects worked # print(x.size()) def test_rate_channels(self): target_rate = 16000 target_channels = 1 E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("rate", [target_rate]) E.append_effect_to_chain("channels", [target_channels]) x, sr = E.sox_build_flow_effects() # check if effects worked self.assertEqual(sr, target_rate) self.assertEqual(x.size(0), target_channels) @unittest.skipIf(sys.platform == 'darwin', 'This test is known to fail on macOS') def test_lowpass_speed(self): speed = .8 si, _ = torchaudio.info(self.test_filepath) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("lowpass", 100) E.append_effect_to_chain("speed", speed) E.append_effect_to_chain("rate", si.rate) x, sr = E.sox_build_flow_effects() # check if effects worked, add small tolerance for rounding effects self.assertEqual(x.size(1), int((si.length / si.channels) / speed), atol=1, rtol=1e-8) def test_ulaw_and_siginfo(self): si_out = torchaudio.sox_signalinfo_t() ei_out = torchaudio.sox_encodinginfo_t() si_out.precision = 8 ei_out.encoding = torchaudio.get_sox_encoding_t(9) ei_out.bits_per_sample = 8 si_in, ei_in = torchaudio.info(self.test_filepath) si_out.rate = 44100 si_out.channels = 2 E = torchaudio.sox_effects.SoxEffectsChain(out_siginfo=si_out, out_encinfo=ei_out) E.set_input_file(self.test_filepath) x, sr = E.sox_build_flow_effects() # Note: the output was encoded into ulaw because the # number of unique values in the output is less than 256. self.assertLess(x.unique().size(0), 2**8 + 1) self.assertEqual(x.numel(), si_in.length) def test_band_chorus(self): si_in, ei_in = torchaudio.info(self.test_filepath) ei_in.encoding = torchaudio.get_sox_encoding_t(1) E = torchaudio.sox_effects.SoxEffectsChain(out_encinfo=ei_in, out_siginfo=si_in) E.set_input_file(self.test_filepath) E.append_effect_to_chain("band", ["-n", "10k", "3.5k"]) E.append_effect_to_chain("chorus", [.5, .7, 55, 0.4, .25, 2, '-s']) E.append_effect_to_chain("rate", [si_in.rate]) E.append_effect_to_chain("channels", [si_in.channels]) x, sr = E.sox_build_flow_effects() # The chorus effect will make the output file longer than the input self.assertEqual(x.size(0), si_in.channels) self.assertGreaterEqual(x.size(1) * x.size(0), si_in.length) def test_synth(self): si_in, ei_in = torchaudio.info(self.test_filepath) len_in_seconds = si_in.length / si_in.channels / si_in.rate ei_in.encoding = torchaudio.get_sox_encoding_t(1) E = torchaudio.sox_effects.SoxEffectsChain(out_encinfo=ei_in, out_siginfo=si_in) E.set_input_file(self.test_filepath) E.append_effect_to_chain("synth", [str(len_in_seconds), "pinknoise", "mix"]) E.append_effect_to_chain("rate", [44100]) E.append_effect_to_chain("channels", [2]) x, sr = E.sox_build_flow_effects() self.assertEqual(x.size(0), si_in.channels) self.assertEqual(si_in.length, x.size(0) * x.size(1)) def test_gain(self): E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("gain", ["5"]) x, sr = E.sox_build_flow_effects() E.clear_chain() self.assertTrue(x.abs().max().item(), 1.) E.set_input_file(self.test_filepath) E.append_effect_to_chain("gain", ["-e", "-5"]) x, sr = E.sox_build_flow_effects() E.clear_chain() self.assertLess(x.abs().max().item(), 1.) E.set_input_file(self.test_filepath) E.append_effect_to_chain("gain", ["-b", "8"]) x, sr = E.sox_build_flow_effects() E.clear_chain() self.assertTrue(x.abs().max().item(), 1.) E.set_input_file(self.test_filepath) E.append_effect_to_chain("gain", ["-n", "-10"]) x, sr = E.sox_build_flow_effects() E.clear_chain() self.assertLess(x.abs().max().item(), 1.) def test_tempo_or_speed(self): tempo = .8 si, _ = torchaudio.info(self.test_filepath) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("tempo", ["-s", tempo]) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertAlmostEqual(x.size(1), math.ceil((si.length / si.channels) / tempo), delta=1) # tempo > 1 E.clear_chain() tempo = 1.2 E.append_effect_to_chain("tempo", ["-s", tempo]) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertAlmostEqual(x.size(1), math.ceil((si.length / si.channels) / tempo), delta=1) # tempo > 1 E.clear_chain() speed = 1.2 E.append_effect_to_chain("speed", [speed]) E.append_effect_to_chain("rate", [si.rate]) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertAlmostEqual(x.size(1), math.ceil((si.length / si.channels) / speed), delta=1) # speed < 1 E.clear_chain() speed = 0.8 E.append_effect_to_chain("speed", [speed]) E.append_effect_to_chain("rate", [si.rate]) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertAlmostEqual(x.size(1), math.ceil((si.length / si.channels) / speed), delta=1) def test_trim(self): x_orig, _ = torchaudio.load(self.test_filepath) offset = "10000s" offset_int = int(offset[:-1]) num_frames = "20000s" num_frames_int = int(num_frames[:-1]) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("trim", [offset, num_frames]) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertTrue(x.allclose(x_orig[:, offset_int:(offset_int + num_frames_int)], rtol=1e-4, atol=1e-4)) def test_silence_contrast(self): si, _ = torchaudio.info(self.test_filepath) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("silence", [1, 100, 1]) E.append_effect_to_chain("contrast", []) x, sr = E.sox_build_flow_effects() # check if effect worked self.assertLess(x.numel(), si.length) def test_reverse(self): x_orig, _ = torchaudio.load(self.test_filepath) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("reverse", "") x_rev, _ = E.sox_build_flow_effects() # check if effect worked rev_idx = torch.LongTensor(range(x_orig.size(1))[::-1]) self.assertTrue(x_orig.allclose(x_rev[:, rev_idx], rtol=1e-5, atol=2e-5)) def test_compand_fade(self): E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("compand", ["0.3,1", "6:-70,-60,-20", "-5", "-90", "0.2"]) E.append_effect_to_chain("fade", ["q", "0.25", "0", "0.33"]) x, _ = E.sox_build_flow_effects() # check if effect worked # print(x.size()) def test_biquad_delay(self): si, _ = torchaudio.info(self.test_filepath) E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) E.append_effect_to_chain("biquad", ["0.25136437", "0.50272873", "0.25136437", "1.0", "-0.17123075", "0.17668821"]) E.append_effect_to_chain("delay", ["15000s"]) x, _ = E.sox_build_flow_effects() # check if effect worked self.assertTrue(x.size(1) == (si.length / si.channels) + 15000) def test_invalid_effect_name(self): E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) # there is no effect named "special" with self.assertRaises(LookupError): E.append_effect_to_chain("special", [""]) def test_unimplemented_effect(self): E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) # the sox spectrogram function is not implemented in torchaudio with self.assertRaises(NotImplementedError): E.append_effect_to_chain("spectrogram", [""]) def test_invalid_effect_options(self): E = torchaudio.sox_effects.SoxEffectsChain() E.set_input_file(self.test_filepath) # first two options should be combined to "0.3,1" E.append_effect_to_chain("compand", ["0.3", "1", "6:-70,-60,-20", "-5", "-90", "0.2"]) with self.assertRaises(RuntimeError): E.sox_build_flow_effects() audio-0.7.2/test/torchaudio_unittest/sox_effect/torchscript_test.py000066400000000000000000000064101376444676100260250ustar00rootroot00000000000000from typing import List import torch from torchaudio import sox_effects from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExtension, get_sinusoid, save_wav, ) from .common import ( load_params, ) class SoxEffectTensorTransform(torch.nn.Module): effects: List[List[str]] def __init__(self, effects: List[List[str]], sample_rate: int, channels_first: bool): super().__init__() self.effects = effects self.sample_rate = sample_rate self.channels_first = channels_first def forward(self, tensor: torch.Tensor): return sox_effects.apply_effects_tensor( tensor, self.sample_rate, self.effects, self.channels_first) class SoxEffectFileTransform(torch.nn.Module): effects: List[List[str]] channels_first: bool def __init__(self, effects: List[List[str]], channels_first: bool): super().__init__() self.effects = effects self.channels_first = channels_first def forward(self, path: str): return sox_effects.apply_effects_file(path, self.effects, self.channels_first) @skipIfNoExtension class TestTorchScript(TempDirMixin, PytorchTestCase): @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects_tensor(self, args): effects = args['effects'] channels_first = True num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) trans = SoxEffectTensorTransform(effects, input_sr, channels_first) path = self.get_temp_path('sox_effect.zip') torch.jit.script(trans).save(path) trans = torch.jit.load(path) wav = get_sinusoid( frequency=800, sample_rate=input_sr, n_channels=num_channels, dtype='float32', channels_first=channels_first) found, sr_found = trans(wav) expected, sr_expected = sox_effects.apply_effects_tensor( wav, input_sr, effects, channels_first) assert sr_found == sr_expected self.assertEqual(expected, found) @parameterized.expand( load_params("sox_effect_test_args.json"), name_func=lambda f, i, p: f'{f.__name__}_{i}_{p.args[0]["effects"][0][0]}', ) def test_apply_effects_file(self, args): effects = args['effects'] channels_first = True num_channels = args.get("num_channels", 2) input_sr = args.get("input_sample_rate", 8000) trans = SoxEffectFileTransform(effects, channels_first) path = self.get_temp_path('sox_effect.zip') torch.jit.script(trans).save(path) trans = torch.jit.load(path) path = self.get_temp_path('input.wav') wav = get_sinusoid( frequency=800, sample_rate=input_sr, n_channels=num_channels, dtype='float32', channels_first=channels_first) save_wav(path, wav, sample_rate=input_sr, channels_first=channels_first) found, sr_found = trans(path) expected, sr_expected = sox_effects.apply_effects_file(path, effects, channels_first) assert sr_found == sr_expected self.assertEqual(expected, found) audio-0.7.2/test/torchaudio_unittest/sox_io_backend/000077500000000000000000000000001376444676100226715ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/sox_io_backend/__init__.py000066400000000000000000000000001376444676100247700ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/sox_io_backend/common.py000066400000000000000000000001521376444676100245310ustar00rootroot00000000000000def name_func(func, _, params): return f'{func.__name__}_{"_".join(str(arg) for arg in params.args)}' audio-0.7.2/test/torchaudio_unittest/sox_io_backend/info_test.py000066400000000000000000000120771376444676100252440ustar00rootroot00000000000000import itertools from parameterized import parameterized from torchaudio.backend import sox_io_backend from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExec, skipIfNoExtension, get_asset_path, get_wav_data, save_wav, sox_utils, ) from .common import ( name_func, ) @skipIfNoExec('sox') @skipIfNoExtension class TestInfo(TempDirMixin, PytorchTestCase): @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_wav(self, dtype, sample_rate, num_channels): """`sox_io_backend.info` can check wav file correctly""" duration = 1 path = self.get_temp_path('data.wav') data = get_wav_data(dtype, num_channels, normalize=False, num_frames=duration * sample_rate) save_wav(path, data, sample_rate) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [4, 8, 16, 32], )), name_func=name_func) def test_wav_multiple_channels(self, dtype, sample_rate, num_channels): """`sox_io_backend.info` can check wav file with channels more than 2 correctly""" duration = 1 path = self.get_temp_path('data.wav') data = get_wav_data(dtype, num_channels, normalize=False, num_frames=duration * sample_rate) save_wav(path, data, sample_rate) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [96, 128, 160, 192, 224, 256, 320], )), name_func=name_func) def test_mp3(self, sample_rate, num_channels, bit_rate): """`sox_io_backend.info` can check mp3 file correctly""" duration = 1 path = self.get_temp_path('data.mp3') sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=bit_rate, duration=duration, ) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate # mp3 does not preserve the number of samples # assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], list(range(9)), )), name_func=name_func) def test_flac(self, sample_rate, num_channels, compression_level): """`sox_io_backend.info` can check flac file correctly""" duration = 1 path = self.get_temp_path('data.flac') sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=compression_level, duration=duration, ) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [-1, 0, 1, 2, 3, 3.6, 5, 10], )), name_func=name_func) def test_vorbis(self, sample_rate, num_channels, quality_level): """`sox_io_backend.info` can check vorbis file correctly""" duration = 1 path = self.get_temp_path('data.vorbis') sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=quality_level, duration=duration, ) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=name_func) def test_sphere(self, sample_rate, num_channels): """`sox_io_backend.info` can check sph file correctly""" duration = 1 path = self.get_temp_path('data.sph') sox_utils.gen_audio_file(path, sample_rate, num_channels, duration=duration) info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_frames == sample_rate * duration assert info.num_channels == num_channels @skipIfNoExtension class TestInfoOpus(PytorchTestCase): @parameterized.expand(list(itertools.product( ['96k'], [1, 2], [0, 5, 10], )), name_func=name_func) def test_opus(self, bitrate, num_channels, compression_level): """`sox_io_backend.info` can check opus file correcty""" path = get_asset_path('io', f'{bitrate}_{compression_level}_{num_channels}ch.opus') info = sox_io_backend.info(path) assert info.sample_rate == 48000 assert info.num_frames == 32768 assert info.num_channels == num_channels audio-0.7.2/test/torchaudio_unittest/sox_io_backend/load_test.py000066400000000000000000000257371376444676100252370ustar00rootroot00000000000000import itertools from torchaudio.backend import sox_io_backend from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExec, skipIfNoExtension, get_asset_path, get_wav_data, load_wav, save_wav, sox_utils, ) from .common import ( name_func, ) class LoadTestBase(TempDirMixin, PytorchTestCase): def assert_wav(self, dtype, sample_rate, num_channels, normalize, duration): """`sox_io_backend.load` can load wav format correctly. Wav data loaded with sox_io backend should match those with scipy """ path = self.get_temp_path('reference.wav') data = get_wav_data(dtype, num_channels, normalize=normalize, num_frames=duration * sample_rate) save_wav(path, data, sample_rate) expected = load_wav(path, normalize=normalize)[0] data, sr = sox_io_backend.load(path, normalize=normalize) assert sr == sample_rate self.assertEqual(data, expected) def assert_mp3(self, sample_rate, num_channels, bit_rate, duration): """`sox_io_backend.load` can load mp3 format. mp3 encoding introduces delay and boundary effects so we create reference wav file from mp3 x | | 1. Generate mp3 with Sox | v 2. Convert to wav with Sox mp3 ------------------------------> wav | | | 3. Load with torchaudio | 4. Load with scipy | | v v tensor ----------> x <----------- tensor 5. Compare Underlying assumptions are; i. Conversion of mp3 to wav with Sox preserves data. ii. Loading wav file with scipy is correct. By combining i & ii, step 2. and 4. allows to load reference mp3 data without using torchaudio """ path = self.get_temp_path('1.original.mp3') ref_path = self.get_temp_path('2.reference.wav') # 1. Generate mp3 with sox sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=bit_rate, duration=duration) # 2. Convert to wav with sox sox_utils.convert_audio_file(path, ref_path) # 3. Load mp3 with torchaudio data, sr = sox_io_backend.load(path) # 4. Load wav with scipy data_ref = load_wav(ref_path)[0] # 5. Compare assert sr == sample_rate self.assertEqual(data, data_ref, atol=3e-03, rtol=1.3e-06) def assert_flac(self, sample_rate, num_channels, compression_level, duration): """`sox_io_backend.load` can load flac format. This test takes the same strategy as mp3 to compare the result """ path = self.get_temp_path('1.original.flac') ref_path = self.get_temp_path('2.reference.wav') # 1. Generate flac with sox sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=compression_level, bit_depth=16, duration=duration) # 2. Convert to wav with sox sox_utils.convert_audio_file(path, ref_path) # 3. Load flac with torchaudio data, sr = sox_io_backend.load(path) # 4. Load wav with scipy data_ref = load_wav(ref_path)[0] # 5. Compare assert sr == sample_rate self.assertEqual(data, data_ref, atol=4e-05, rtol=1.3e-06) def assert_vorbis(self, sample_rate, num_channels, quality_level, duration): """`sox_io_backend.load` can load vorbis format. This test takes the same strategy as mp3 to compare the result """ path = self.get_temp_path('1.original.vorbis') ref_path = self.get_temp_path('2.reference.wav') # 1. Generate vorbis with sox sox_utils.gen_audio_file( path, sample_rate, num_channels, compression=quality_level, bit_depth=16, duration=duration) # 2. Convert to wav with sox sox_utils.convert_audio_file(path, ref_path) # 3. Load vorbis with torchaudio data, sr = sox_io_backend.load(path) # 4. Load wav with scipy data_ref = load_wav(ref_path)[0] # 5. Compare assert sr == sample_rate self.assertEqual(data, data_ref, atol=4e-05, rtol=1.3e-06) def assert_sphere(self, sample_rate, num_channels, duration): """`sox_io_backend.load` can load sph format. This test takes the same strategy as mp3 to compare the result """ path = self.get_temp_path('1.original.sph') ref_path = self.get_temp_path('2.reference.wav') # 1. Generate sph with sox sox_utils.gen_audio_file( path, sample_rate, num_channels, bit_depth=32, duration=duration) # 2. Convert to wav with sox sox_utils.convert_audio_file(path, ref_path) # 3. Load sph with torchaudio data, sr = sox_io_backend.load(path) # 4. Load wav with scipy data_ref = load_wav(ref_path)[0] # 5. Compare assert sr == sample_rate self.assertEqual(data, data_ref, atol=4e-05, rtol=1.3e-06) @skipIfNoExec('sox') @skipIfNoExtension class TestLoad(LoadTestBase): """Test the correctness of `sox_io_backend.load` for various formats""" @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], [False, True], )), name_func=name_func) def test_wav(self, dtype, sample_rate, num_channels, normalize): """`sox_io_backend.load` can load wav format correctly.""" self.assert_wav(dtype, sample_rate, num_channels, normalize, duration=1) @parameterized.expand(list(itertools.product( ['int16'], [16000], [2], [False], )), name_func=name_func) def test_wav_large(self, dtype, sample_rate, num_channels, normalize): """`sox_io_backend.load` can load large wav file correctly.""" two_hours = 2 * 60 * 60 self.assert_wav(dtype, sample_rate, num_channels, normalize, two_hours) @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [4, 8, 16, 32], )), name_func=name_func) def test_multiple_channels(self, dtype, num_channels): """`sox_io_backend.load` can load wav file with more than 2 channels.""" sample_rate = 8000 normalize = False self.assert_wav(dtype, sample_rate, num_channels, normalize, duration=1) @parameterized.expand(list(itertools.product( [8000, 16000, 44100], [1, 2], [96, 128, 160, 192, 224, 256, 320], )), name_func=name_func) def test_mp3(self, sample_rate, num_channels, bit_rate): """`sox_io_backend.load` can load mp3 format correctly.""" self.assert_mp3(sample_rate, num_channels, bit_rate, duration=1) @parameterized.expand(list(itertools.product( [16000], [2], [128], )), name_func=name_func) def test_mp3_large(self, sample_rate, num_channels, bit_rate): """`sox_io_backend.load` can load large mp3 file correctly.""" two_hours = 2 * 60 * 60 self.assert_mp3(sample_rate, num_channels, bit_rate, two_hours) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], list(range(9)), )), name_func=name_func) def test_flac(self, sample_rate, num_channels, compression_level): """`sox_io_backend.load` can load flac format correctly.""" self.assert_flac(sample_rate, num_channels, compression_level, duration=1) @parameterized.expand(list(itertools.product( [16000], [2], [0], )), name_func=name_func) def test_flac_large(self, sample_rate, num_channels, compression_level): """`sox_io_backend.load` can load large flac file correctly.""" two_hours = 2 * 60 * 60 self.assert_flac(sample_rate, num_channels, compression_level, two_hours) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [-1, 0, 1, 2, 3, 3.6, 5, 10], )), name_func=name_func) def test_vorbis(self, sample_rate, num_channels, quality_level): """`sox_io_backend.load` can load vorbis format correctly.""" self.assert_vorbis(sample_rate, num_channels, quality_level, duration=1) @parameterized.expand(list(itertools.product( [16000], [2], [10], )), name_func=name_func) def test_vorbis_large(self, sample_rate, num_channels, quality_level): """`sox_io_backend.load` can load large vorbis file correctly.""" two_hours = 2 * 60 * 60 self.assert_vorbis(sample_rate, num_channels, quality_level, two_hours) @parameterized.expand(list(itertools.product( ['96k'], [1, 2], [0, 5, 10], )), name_func=name_func) def test_opus(self, bitrate, num_channels, compression_level): """`sox_io_backend.load` can load opus file correctly.""" ops_path = get_asset_path('io', f'{bitrate}_{compression_level}_{num_channels}ch.opus') wav_path = self.get_temp_path(f'{bitrate}_{compression_level}_{num_channels}ch.opus.wav') sox_utils.convert_audio_file(ops_path, wav_path) expected, sample_rate = load_wav(wav_path) found, sr = sox_io_backend.load(ops_path) assert sample_rate == sr self.assertEqual(expected, found) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=name_func) def test_sphere(self, sample_rate, num_channels): """`sox_io_backend.load` can load sph format correctly.""" self.assert_sphere(sample_rate, num_channels, duration=1) @skipIfNoExec('sox') @skipIfNoExtension class TestLoadParams(TempDirMixin, PytorchTestCase): """Test the correctness of frame parameters of `sox_io_backend.load`""" original = None path = None def setUp(self): super().setUp() sample_rate = 8000 self.original = get_wav_data('float32', num_channels=2) self.path = self.get_temp_path('test.wave') save_wav(self.path, self.original, sample_rate) @parameterized.expand(list(itertools.product( [0, 1, 10, 100, 1000], [-1, 1, 10, 100, 1000], )), name_func=name_func) def test_frame(self, frame_offset, num_frames): """num_frames and frame_offset correctly specify the region of data""" found, _ = sox_io_backend.load(self.path, frame_offset, num_frames) frame_end = None if num_frames == -1 else frame_offset + num_frames self.assertEqual(found, self.original[:, frame_offset:frame_end]) @parameterized.expand([(True, ), (False, )], name_func=name_func) def test_channels_first(self, channels_first): """channels_first swaps axes""" found, _ = sox_io_backend.load(self.path, channels_first=channels_first) expected = self.original if channels_first else self.original.transpose(1, 0) self.assertEqual(found, expected) audio-0.7.2/test/torchaudio_unittest/sox_io_backend/roundtrip_test.py000066400000000000000000000034201376444676100263270ustar00rootroot00000000000000import itertools from torchaudio.backend import sox_io_backend from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExec, skipIfNoExtension, get_wav_data, ) from .common import ( name_func, ) @skipIfNoExec('sox') @skipIfNoExtension class TestRoundTripIO(TempDirMixin, PytorchTestCase): """save/load round trip should not degrade data for lossless formats""" @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_wav(self, dtype, sample_rate, num_channels): """save/load round trip should not degrade data for wav formats""" original = get_wav_data(dtype, num_channels, normalize=False) data = original for i in range(10): path = self.get_temp_path(f'{i}.wav') sox_io_backend.save(path, data, sample_rate) data, sr = sox_io_backend.load(path, normalize=False) assert sr == sample_rate self.assertEqual(original, data) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], list(range(9)), )), name_func=name_func) def test_flac(self, sample_rate, num_channels, compression_level): """save/load round trip should not degrade data for flac formats""" original = get_wav_data('float32', num_channels) data = original for i in range(10): path = self.get_temp_path(f'{i}.flac') sox_io_backend.save(path, data, sample_rate, compression=compression_level) data, sr = sox_io_backend.load(path) assert sr == sample_rate self.assertEqual(original, data) audio-0.7.2/test/torchaudio_unittest/sox_io_backend/save_test.py000066400000000000000000000337551376444676100252550ustar00rootroot00000000000000import itertools from torchaudio.backend import sox_io_backend from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, PytorchTestCase, skipIfNoExec, skipIfNoExtension, get_wav_data, load_wav, save_wav, sox_utils, ) from .common import ( name_func, ) class SaveTestBase(TempDirMixin, PytorchTestCase): def assert_wav(self, dtype, sample_rate, num_channels, num_frames): """`sox_io_backend.save` can save wav format.""" path = self.get_temp_path('data.wav') expected = get_wav_data(dtype, num_channels, num_frames=num_frames) sox_io_backend.save(path, expected, sample_rate) found, sr = load_wav(path) assert sample_rate == sr self.assertEqual(found, expected) def assert_mp3(self, sample_rate, num_channels, bit_rate, duration): """`sox_io_backend.save` can save mp3 format. mp3 encoding introduces delay and boundary effects so we convert the resulting mp3 to wav and compare the results there | | 1. Generate original wav file with SciPy | v -------------- wav ---------------- | | | 2.1. load with scipy | 3.1. Convert to mp3 with Sox | then save with torchaudio | v v mp3 mp3 | | | 2.2. Convert to wav with Sox | 3.2. Convert to wav with Sox | | v v wav wav | | | 2.3. load with scipy | 3.3. load with scipy | | v v tensor -------> compare <--------- tensor """ src_path = self.get_temp_path('1.reference.wav') mp3_path = self.get_temp_path('2.1.torchaudio.mp3') wav_path = self.get_temp_path('2.2.torchaudio.wav') mp3_path_sox = self.get_temp_path('3.1.sox.mp3') wav_path_sox = self.get_temp_path('3.2.sox.wav') # 1. Generate original wav data = get_wav_data('float32', num_channels, normalize=True, num_frames=duration * sample_rate) save_wav(src_path, data, sample_rate) # 2.1. Convert the original wav to mp3 with torchaudio sox_io_backend.save( mp3_path, load_wav(src_path)[0], sample_rate, compression=bit_rate) # 2.2. Convert the mp3 to wav with Sox sox_utils.convert_audio_file(mp3_path, wav_path) # 2.3. Load found = load_wav(wav_path)[0] # 3.1. Convert the original wav to mp3 with SoX sox_utils.convert_audio_file(src_path, mp3_path_sox, compression=bit_rate) # 3.2. Convert the mp3 to wav with Sox sox_utils.convert_audio_file(mp3_path_sox, wav_path_sox) # 3.3. Load expected = load_wav(wav_path_sox)[0] self.assertEqual(found, expected) def assert_flac(self, sample_rate, num_channels, compression_level, duration): """`sox_io_backend.save` can save flac format. This test takes the same strategy as mp3 to compare the result """ src_path = self.get_temp_path('1.reference.wav') flc_path = self.get_temp_path('2.1.torchaudio.flac') wav_path = self.get_temp_path('2.2.torchaudio.wav') flc_path_sox = self.get_temp_path('3.1.sox.flac') wav_path_sox = self.get_temp_path('3.2.sox.wav') # 1. Generate original wav data = get_wav_data('float32', num_channels, normalize=True, num_frames=duration * sample_rate) save_wav(src_path, data, sample_rate) # 2.1. Convert the original wav to flac with torchaudio sox_io_backend.save( flc_path, load_wav(src_path)[0], sample_rate, compression=compression_level) # 2.2. Convert the flac to wav with Sox # converting to 32 bit because flac file has 24 bit depth which scipy cannot handle. sox_utils.convert_audio_file(flc_path, wav_path, bit_depth=32) # 2.3. Load found = load_wav(wav_path)[0] # 3.1. Convert the original wav to flac with SoX sox_utils.convert_audio_file(src_path, flc_path_sox, compression=compression_level) # 3.2. Convert the flac to wav with Sox # converting to 32 bit because flac file has 24 bit depth which scipy cannot handle. sox_utils.convert_audio_file(flc_path_sox, wav_path_sox, bit_depth=32) # 3.3. Load expected = load_wav(wav_path_sox)[0] self.assertEqual(found, expected) def _assert_vorbis(self, sample_rate, num_channels, quality_level, duration): """`sox_io_backend.save` can save vorbis format. This test takes the same strategy as mp3 to compare the result """ src_path = self.get_temp_path('1.reference.wav') vbs_path = self.get_temp_path('2.1.torchaudio.vorbis') wav_path = self.get_temp_path('2.2.torchaudio.wav') vbs_path_sox = self.get_temp_path('3.1.sox.vorbis') wav_path_sox = self.get_temp_path('3.2.sox.wav') # 1. Generate original wav data = get_wav_data('int16', num_channels, normalize=False, num_frames=duration * sample_rate) save_wav(src_path, data, sample_rate) # 2.1. Convert the original wav to vorbis with torchaudio sox_io_backend.save( vbs_path, load_wav(src_path)[0], sample_rate, compression=quality_level) # 2.2. Convert the vorbis to wav with Sox sox_utils.convert_audio_file(vbs_path, wav_path) # 2.3. Load found = load_wav(wav_path)[0] # 3.1. Convert the original wav to vorbis with SoX sox_utils.convert_audio_file(src_path, vbs_path_sox, compression=quality_level) # 3.2. Convert the vorbis to wav with Sox sox_utils.convert_audio_file(vbs_path_sox, wav_path_sox) # 3.3. Load expected = load_wav(wav_path_sox)[0] # sox's vorbis encoding has some random boundary effect, which cause small number of # samples yields higher descrepency than the others. # so we allow small portions of data to be outside of absolute torelance. # make sure to pass somewhat long duration atol = 1.0e-4 max_failure_allowed = 0.01 # this percent of samples are allowed to outside of atol. failure_ratio = ((found - expected).abs() > atol).sum().item() / found.numel() if failure_ratio > max_failure_allowed: # it's failed and this will give a better error message. self.assertEqual(found, expected, atol=atol, rtol=1.3e-6) def assert_vorbis(self, *args, **kwargs): # sox's vorbis encoding has some randomness, so we run tests multiple time max_retry = 5 error = None for _ in range(max_retry): try: self._assert_vorbis(*args, **kwargs) break except AssertionError as e: error = e else: raise error def assert_sphere(self, sample_rate, num_channels, duration): """`sox_io_backend.save` can save sph format. This test takes the same strategy as mp3 to compare the result """ src_path = self.get_temp_path('1.reference.wav') flc_path = self.get_temp_path('2.1.torchaudio.sph') wav_path = self.get_temp_path('2.2.torchaudio.wav') flc_path_sox = self.get_temp_path('3.1.sox.sph') wav_path_sox = self.get_temp_path('3.2.sox.wav') # 1. Generate original wav data = get_wav_data('float32', num_channels, normalize=True, num_frames=duration * sample_rate) save_wav(src_path, data, sample_rate) # 2.1. Convert the original wav to sph with torchaudio sox_io_backend.save(flc_path, load_wav(src_path)[0], sample_rate) # 2.2. Convert the sph to wav with Sox # converting to 32 bit because sph file has 24 bit depth which scipy cannot handle. sox_utils.convert_audio_file(flc_path, wav_path, bit_depth=32) # 2.3. Load found = load_wav(wav_path)[0] # 3.1. Convert the original wav to sph with SoX sox_utils.convert_audio_file(src_path, flc_path_sox) # 3.2. Convert the sph to wav with Sox # converting to 32 bit because sph file has 24 bit depth which scipy cannot handle. sox_utils.convert_audio_file(flc_path_sox, wav_path_sox, bit_depth=32) # 3.3. Load expected = load_wav(wav_path_sox)[0] self.assertEqual(found, expected) @skipIfNoExec('sox') @skipIfNoExtension class TestSave(SaveTestBase): @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_wav(self, dtype, sample_rate, num_channels): """`sox_io_backend.save` can save wav format.""" self.assert_wav(dtype, sample_rate, num_channels, num_frames=None) @parameterized.expand(list(itertools.product( ['float32'], [16000], [2], )), name_func=name_func) def test_wav_large(self, dtype, sample_rate, num_channels): """`sox_io_backend.save` can save large wav file.""" two_hours = 2 * 60 * 60 * sample_rate self.assert_wav(dtype, sample_rate, num_channels, num_frames=two_hours) @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [4, 8, 16, 32], )), name_func=name_func) def test_multiple_channels(self, dtype, num_channels): """`sox_io_backend.save` can save wav with more than 2 channels.""" sample_rate = 8000 self.assert_wav(dtype, sample_rate, num_channels, num_frames=None) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [-4.2, -0.2, 0, 0.2, 96, 128, 160, 192, 224, 256, 320], )), name_func=name_func) def test_mp3(self, sample_rate, num_channels, bit_rate): """`sox_io_backend.save` can save mp3 format.""" self.assert_mp3(sample_rate, num_channels, bit_rate, duration=1) @parameterized.expand(list(itertools.product( [16000], [2], [128], )), name_func=name_func) def test_mp3_large(self, sample_rate, num_channels, bit_rate): """`sox_io_backend.save` can save large mp3 file.""" two_hours = 2 * 60 * 60 self.assert_mp3(sample_rate, num_channels, bit_rate, duration=two_hours) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [None] + list(range(9)), )), name_func=name_func) def test_flac(self, sample_rate, num_channels, compression_level): """`sox_io_backend.save` can save flac format.""" self.assert_flac(sample_rate, num_channels, compression_level, duration=1) @parameterized.expand(list(itertools.product( [16000], [2], [0], )), name_func=name_func) def test_flac_large(self, sample_rate, num_channels, compression_level): """`sox_io_backend.save` can save large flac file.""" two_hours = 2 * 60 * 60 self.assert_flac(sample_rate, num_channels, compression_level, duration=two_hours) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [None, -1, 0, 1, 2, 3, 3.6, 5, 10], )), name_func=name_func) def test_vorbis(self, sample_rate, num_channels, quality_level): """`sox_io_backend.save` can save vorbis format.""" self.assert_vorbis(sample_rate, num_channels, quality_level, duration=20) # note: torchaudio can load large vorbis file, but cannot save large volbis file # the following test causes Segmentation fault # ''' @parameterized.expand(list(itertools.product( [16000], [2], [10], )), name_func=name_func) def test_vorbis_large(self, sample_rate, num_channels, quality_level): """`sox_io_backend.save` can save large vorbis file correctly.""" two_hours = 2 * 60 * 60 self.assert_vorbis(sample_rate, num_channels, quality_level, two_hours) ''' @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], )), name_func=name_func) def test_sphere(self, sample_rate, num_channels): """`sox_io_backend.save` can save sph format.""" self.assert_sphere(sample_rate, num_channels, duration=1) @skipIfNoExec('sox') @skipIfNoExtension class TestSaveParams(TempDirMixin, PytorchTestCase): """Test the correctness of optional parameters of `sox_io_backend.save`""" @parameterized.expand([(True, ), (False, )], name_func=name_func) def test_channels_first(self, channels_first): """channels_first swaps axes""" path = self.get_temp_path('data.wav') data = get_wav_data('int32', 2, channels_first=channels_first) sox_io_backend.save( path, data, 8000, channels_first=channels_first) found = load_wav(path)[0] expected = data if channels_first else data.transpose(1, 0) self.assertEqual(found, expected) @parameterized.expand([ 'float32', 'int32', 'int16', 'uint8' ], name_func=name_func) def test_noncontiguous(self, dtype): """Noncontiguous tensors are saved correctly""" path = self.get_temp_path('data.wav') expected = get_wav_data(dtype, 4)[::2, ::2] assert not expected.is_contiguous() sox_io_backend.save(path, expected, 8000) found = load_wav(path)[0] self.assertEqual(found, expected) @parameterized.expand([ 'float32', 'int32', 'int16', 'uint8', ]) def test_tensor_preserve(self, dtype): """save function should not alter Tensor""" path = self.get_temp_path('data.wav') expected = get_wav_data(dtype, 4)[::2, ::2] data = expected.clone() sox_io_backend.save(path, data, 8000) self.assertEqual(data, expected) audio-0.7.2/test/torchaudio_unittest/sox_io_backend/smoke_test.py000066400000000000000000000061721376444676100254260ustar00rootroot00000000000000import itertools import unittest from torchaudio.utils import sox_utils from torchaudio.backend import sox_io_backend from torchaudio._internal.module_utils import is_module_available from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, skipIfNoExtension, get_wav_data, ) from .common import name_func skipIfNoMP3 = unittest.skipIf( not is_module_available('torchaudio._torchaudio') or 'mp3' not in sox_utils.list_read_formats() or 'mp3' not in sox_utils.list_write_formats(), '"sox_io" backend does not support MP3') @skipIfNoExtension class SmokeTest(TempDirMixin, TorchaudioTestCase): """Run smoke test on various audio format The purpose of this test suite is to verify that sox_io_backend functionalities do not exhibit abnormal behaviors. This test suite should be able to run without any additional tools (such as sox command), however without such tools, the correctness of each function cannot be verified. """ def run_smoke_test(self, ext, sample_rate, num_channels, *, compression=None, dtype='float32'): duration = 1 num_frames = sample_rate * duration path = self.get_temp_path(f'test.{ext}') original = get_wav_data(dtype, num_channels, normalize=False, num_frames=num_frames) # 1. run save sox_io_backend.save(path, original, sample_rate, compression=compression) # 2. run info info = sox_io_backend.info(path) assert info.sample_rate == sample_rate assert info.num_channels == num_channels # 3. run load loaded, sr = sox_io_backend.load(path, normalize=False) assert sr == sample_rate assert loaded.shape[0] == num_channels @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_wav(self, dtype, sample_rate, num_channels): """Run smoke test on wav format""" self.run_smoke_test('wav', sample_rate, num_channels, dtype=dtype) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [-4.2, -0.2, 0, 0.2, 96, 128, 160, 192, 224, 256, 320], ))) @skipIfNoMP3 def test_mp3(self, sample_rate, num_channels, bit_rate): """Run smoke test on mp3 format""" self.run_smoke_test('mp3', sample_rate, num_channels, compression=bit_rate) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], [-1, 0, 1, 2, 3, 3.6, 5, 10], ))) def test_vorbis(self, sample_rate, num_channels, quality_level): """Run smoke test on vorbis format""" self.run_smoke_test('vorbis', sample_rate, num_channels, compression=quality_level) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], list(range(9)), )), name_func=name_func) def test_flac(self, sample_rate, num_channels, compression_level): """Run smoke test on flac format""" self.run_smoke_test('flac', sample_rate, num_channels, compression=compression_level) audio-0.7.2/test/torchaudio_unittest/sox_io_backend/torchscript_test.py000066400000000000000000000130171376444676100266500ustar00rootroot00000000000000import itertools from typing import Optional import torch import torchaudio from parameterized import parameterized from torchaudio_unittest.common_utils import ( TempDirMixin, TorchaudioTestCase, skipIfNoExec, skipIfNoExtension, get_wav_data, save_wav, load_wav, sox_utils, ) from .common import ( name_func, ) def py_info_func(filepath: str) -> torchaudio.backend.sox_io_backend.AudioMetaData: return torchaudio.info(filepath) def py_load_func(filepath: str, normalize: bool, channels_first: bool): return torchaudio.load( filepath, normalize=normalize, channels_first=channels_first) def py_save_func( filepath: str, tensor: torch.Tensor, sample_rate: int, channels_first: bool = True, compression: Optional[float] = None, ): torchaudio.save(filepath, tensor, sample_rate, channels_first, compression) @skipIfNoExec('sox') @skipIfNoExtension class SoxIO(TempDirMixin, TorchaudioTestCase): """TorchScript-ability Test suite for `sox_io_backend`""" backend = 'sox_io' @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_info_wav(self, dtype, sample_rate, num_channels): """`sox_io_backend.info` is torchscript-able and returns the same result""" audio_path = self.get_temp_path(f'{dtype}_{sample_rate}_{num_channels}.wav') data = get_wav_data(dtype, num_channels, normalize=False, num_frames=1 * sample_rate) save_wav(audio_path, data, sample_rate) script_path = self.get_temp_path('info_func.zip') torch.jit.script(py_info_func).save(script_path) ts_info_func = torch.jit.load(script_path) py_info = py_info_func(audio_path) ts_info = ts_info_func(audio_path) assert py_info.sample_rate == ts_info.sample_rate assert py_info.num_frames == ts_info.num_frames assert py_info.num_channels == ts_info.num_channels @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], [False, True], [False, True], )), name_func=name_func) def test_load_wav(self, dtype, sample_rate, num_channels, normalize, channels_first): """`sox_io_backend.load` is torchscript-able and returns the same result""" audio_path = self.get_temp_path(f'test_load_{dtype}_{sample_rate}_{num_channels}_{normalize}.wav') data = get_wav_data(dtype, num_channels, normalize=False, num_frames=1 * sample_rate) save_wav(audio_path, data, sample_rate) script_path = self.get_temp_path('load_func.zip') torch.jit.script(py_load_func).save(script_path) ts_load_func = torch.jit.load(script_path) py_data, py_sr = py_load_func( audio_path, normalize=normalize, channels_first=channels_first) ts_data, ts_sr = ts_load_func( audio_path, normalize=normalize, channels_first=channels_first) self.assertEqual(py_sr, ts_sr) self.assertEqual(py_data, ts_data) @parameterized.expand(list(itertools.product( ['float32', 'int32', 'int16', 'uint8'], [8000, 16000], [1, 2], )), name_func=name_func) def test_save_wav(self, dtype, sample_rate, num_channels): script_path = self.get_temp_path('save_func.zip') torch.jit.script(py_save_func).save(script_path) ts_save_func = torch.jit.load(script_path) expected = get_wav_data(dtype, num_channels) py_path = self.get_temp_path(f'test_save_py_{dtype}_{sample_rate}_{num_channels}.wav') ts_path = self.get_temp_path(f'test_save_ts_{dtype}_{sample_rate}_{num_channels}.wav') py_save_func(py_path, expected, sample_rate, True, None) ts_save_func(ts_path, expected, sample_rate, True, None) py_data, py_sr = load_wav(py_path) ts_data, ts_sr = load_wav(ts_path) self.assertEqual(sample_rate, py_sr) self.assertEqual(sample_rate, ts_sr) self.assertEqual(expected, py_data) self.assertEqual(expected, ts_data) @parameterized.expand(list(itertools.product( [8000, 16000], [1, 2], list(range(9)), )), name_func=name_func) def test_save_flac(self, sample_rate, num_channels, compression_level): script_path = self.get_temp_path('save_func.zip') torch.jit.script(py_save_func).save(script_path) ts_save_func = torch.jit.load(script_path) expected = get_wav_data('float32', num_channels) py_path = self.get_temp_path(f'test_save_py_{sample_rate}_{num_channels}_{compression_level}.flac') ts_path = self.get_temp_path(f'test_save_ts_{sample_rate}_{num_channels}_{compression_level}.flac') py_save_func(py_path, expected, sample_rate, True, compression_level) ts_save_func(ts_path, expected, sample_rate, True, compression_level) # converting to 32 bit because flac file has 24 bit depth which scipy cannot handle. py_path_wav = f'{py_path}.wav' ts_path_wav = f'{ts_path}.wav' sox_utils.convert_audio_file(py_path, py_path_wav, bit_depth=32) sox_utils.convert_audio_file(ts_path, ts_path_wav, bit_depth=32) py_data, py_sr = load_wav(py_path_wav, normalize=True) ts_data, ts_sr = load_wav(ts_path_wav, normalize=True) self.assertEqual(sample_rate, py_sr) self.assertEqual(sample_rate, ts_sr) self.assertEqual(expected, py_data) self.assertEqual(expected, ts_data) audio-0.7.2/test/torchaudio_unittest/torchscript_consistency_cpu_test.py000066400000000000000000000012141376444676100271650ustar00rootroot00000000000000import torch from torchaudio_unittest import common_utils from .torchscript_consistency_impl import Functional, Transforms class TestFunctionalFloat32(Functional, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cpu') class TestFunctionalFloat64(Functional, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cpu') class TestTransformsFloat32(Transforms, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cpu') class TestTransformsFloat64(Transforms, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cpu') audio-0.7.2/test/torchaudio_unittest/torchscript_consistency_cuda_test.py000066400000000000000000000013741376444676100273210ustar00rootroot00000000000000import torch from torchaudio_unittest import common_utils from .torchscript_consistency_impl import Functional, Transforms @common_utils.skipIfNoCuda class TestFunctionalFloat32(Functional, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cuda') @common_utils.skipIfNoCuda class TestFunctionalFloat64(Functional, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cuda') @common_utils.skipIfNoCuda class TestTransformsFloat32(Transforms, common_utils.PytorchTestCase): dtype = torch.float32 device = torch.device('cuda') @common_utils.skipIfNoCuda class TestTransformsFloat64(Transforms, common_utils.PytorchTestCase): dtype = torch.float64 device = torch.device('cuda') audio-0.7.2/test/torchaudio_unittest/torchscript_consistency_impl.py000066400000000000000000000474441376444676100263170ustar00rootroot00000000000000"""Test suites for jit-ability and its numerical compatibility""" import unittest import torch import torchaudio.functional as F import torchaudio.transforms as T from torchaudio_unittest import common_utils class Functional(common_utils.TestBaseMixin): """Implements test for `functinoal` modul that are performed for different devices""" def _assert_consistency(self, func, tensor, shape_only=False): tensor = tensor.to(device=self.device, dtype=self.dtype) ts_func = torch.jit.script(func) output = func(tensor) ts_output = ts_func(tensor) if shape_only: ts_output = ts_output.shape output = output.shape self.assertEqual(ts_output, output) def test_spectrogram(self): def func(tensor): n_fft = 400 ws = 400 hop = 200 pad = 0 window = torch.hann_window(ws, device=tensor.device, dtype=tensor.dtype) power = 2. normalize = False return F.spectrogram(tensor, pad, window, n_fft, hop, ws, power, normalize) tensor = common_utils.get_whitenoise() self._assert_consistency(func, tensor) def test_griffinlim(self): def func(tensor): n_fft = 400 ws = 400 hop = 200 window = torch.hann_window(ws, device=tensor.device, dtype=tensor.dtype) power = 2. normalize = False momentum = 0.99 n_iter = 32 length = 1000 rand_int = False return F.griffinlim(tensor, window, n_fft, hop, ws, power, normalize, n_iter, momentum, length, rand_int) tensor = torch.rand((1, 201, 6)) self._assert_consistency(func, tensor) def test_compute_deltas(self): def func(tensor): win_length = 2 * 7 + 1 return F.compute_deltas(tensor, win_length=win_length) channel = 13 n_mfcc = channel * 3 time = 1021 tensor = torch.randn(channel, n_mfcc, time) self._assert_consistency(func, tensor) def test_detect_pitch_frequency(self): waveform = common_utils.get_sinusoid(sample_rate=44100) def func(tensor): sample_rate = 44100 return F.detect_pitch_frequency(tensor, sample_rate) self._assert_consistency(func, waveform) def test_create_fb_matrix(self): if self.device != torch.device('cpu'): raise unittest.SkipTest('No need to perform test on device other than CPU') def func(_): n_stft = 100 f_min = 0.0 f_max = 20.0 n_mels = 10 sample_rate = 16000 norm = "slaney" return F.create_fb_matrix(n_stft, f_min, f_max, n_mels, sample_rate, norm) dummy = torch.zeros(1, 1) self._assert_consistency(func, dummy) def test_amplitude_to_DB(self): def func(tensor): multiplier = 10.0 amin = 1e-10 db_multiplier = 0.0 top_db = 80.0 return F.amplitude_to_DB(tensor, multiplier, amin, db_multiplier, top_db) tensor = torch.rand((6, 201)) self._assert_consistency(func, tensor) def test_DB_to_amplitude(self): def func(tensor): ref = 1. power = 1. return F.DB_to_amplitude(tensor, ref, power) tensor = torch.rand((1, 100)) self._assert_consistency(func, tensor) def test_create_dct(self): if self.device != torch.device('cpu'): raise unittest.SkipTest('No need to perform test on device other than CPU') def func(_): n_mfcc = 40 n_mels = 128 norm = "ortho" return F.create_dct(n_mfcc, n_mels, norm) dummy = torch.zeros(1, 1) self._assert_consistency(func, dummy) def test_mu_law_encoding(self): def func(tensor): qc = 256 return F.mu_law_encoding(tensor, qc) waveform = common_utils.get_whitenoise() self._assert_consistency(func, waveform) def test_mu_law_decoding(self): def func(tensor): qc = 256 return F.mu_law_decoding(tensor, qc) tensor = torch.rand((1, 10)) self._assert_consistency(func, tensor) def test_complex_norm(self): def func(tensor): power = 2. return F.complex_norm(tensor, power) tensor = torch.randn(1, 2, 1025, 400, 2) self._assert_consistency(func, tensor) def test_mask_along_axis(self): def func(tensor): mask_param = 100 mask_value = 30. axis = 2 return F.mask_along_axis(tensor, mask_param, mask_value, axis) tensor = torch.randn(2, 1025, 400) self._assert_consistency(func, tensor) def test_mask_along_axis_iid(self): def func(tensor): mask_param = 100 mask_value = 30. axis = 2 return F.mask_along_axis_iid(tensor, mask_param, mask_value, axis) tensor = torch.randn(4, 2, 1025, 400) self._assert_consistency(func, tensor) def test_gain(self): def func(tensor): gainDB = 2.0 return F.gain(tensor, gainDB) tensor = torch.rand((1, 1000)) self._assert_consistency(func, tensor) def test_dither_TPDF(self): def func(tensor): return F.dither(tensor, 'TPDF') tensor = common_utils.get_whitenoise(n_channels=2) self._assert_consistency(func, tensor, shape_only=True) def test_dither_RPDF(self): def func(tensor): return F.dither(tensor, 'RPDF') tensor = common_utils.get_whitenoise(n_channels=2) self._assert_consistency(func, tensor, shape_only=True) def test_dither_GPDF(self): def func(tensor): return F.dither(tensor, 'GPDF') tensor = common_utils.get_whitenoise(n_channels=2) self._assert_consistency(func, tensor, shape_only=True) def test_dither_noise_shaping(self): def func(tensor): return F.dither(tensor, noise_shaping=True) tensor = common_utils.get_whitenoise(n_channels=2) self._assert_consistency(func, tensor) def test_lfilter(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise() def func(tensor): # Design an IIR lowpass filter using scipy.signal filter design # https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.iirdesign.html#scipy.signal.iirdesign # # Example # >>> from scipy.signal import iirdesign # >>> b, a = iirdesign(0.2, 0.3, 1, 60) b_coeffs = torch.tensor( [ 0.00299893, -0.0051152, 0.00841964, -0.00747802, 0.00841964, -0.0051152, 0.00299893, ], device=tensor.device, dtype=tensor.dtype, ) a_coeffs = torch.tensor( [ 1.0, -4.8155751, 10.2217618, -12.14481273, 8.49018171, -3.3066882, 0.56088705, ], device=tensor.device, dtype=tensor.dtype, ) return F.lfilter(tensor, a_coeffs, b_coeffs) self._assert_consistency(func, waveform) def test_lowpass(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 cutoff_freq = 3000. return F.lowpass_biquad(tensor, sample_rate, cutoff_freq) self._assert_consistency(func, waveform) def test_highpass(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 cutoff_freq = 2000. return F.highpass_biquad(tensor, sample_rate, cutoff_freq) self._assert_consistency(func, waveform) def test_allpass(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 return F.allpass_biquad(tensor, sample_rate, central_freq, q) self._assert_consistency(func, waveform) def test_bandpass_with_csg(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 const_skirt_gain = True return F.bandpass_biquad(tensor, sample_rate, central_freq, q, const_skirt_gain) self._assert_consistency(func, waveform) def test_bandpass_without_csg(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 const_skirt_gain = True return F.bandpass_biquad(tensor, sample_rate, central_freq, q, const_skirt_gain) self._assert_consistency(func, waveform) def test_bandreject(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 return F.bandreject_biquad(tensor, sample_rate, central_freq, q) self._assert_consistency(func, waveform) def test_band_with_noise(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 noise = True return F.band_biquad(tensor, sample_rate, central_freq, q, noise) self._assert_consistency(func, waveform) def test_band_without_noise(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 central_freq = 1000. q = 0.707 noise = False return F.band_biquad(tensor, sample_rate, central_freq, q, noise) self._assert_consistency(func, waveform) def test_treble(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 gain = 40. central_freq = 1000. q = 0.707 return F.treble_biquad(tensor, sample_rate, gain, central_freq, q) self._assert_consistency(func, waveform) def test_bass(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 gain = 40. central_freq = 1000. q = 0.707 return F.bass_biquad(tensor, sample_rate, gain, central_freq, q) self._assert_consistency(func, waveform) def test_deemph(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 return F.deemph_biquad(tensor, sample_rate) self._assert_consistency(func, waveform) def test_riaa(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 return F.riaa_biquad(tensor, sample_rate) self._assert_consistency(func, waveform) def test_equalizer(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): sample_rate = 44100 center_freq = 300. gain = 1. q = 0.707 return F.equalizer_biquad(tensor, sample_rate, center_freq, gain, q) self._assert_consistency(func, waveform) def test_perf_biquad_filtering(self): if self.dtype == torch.float64: raise unittest.SkipTest("This test is known to fail for float64") waveform = common_utils.get_whitenoise() def func(tensor): a = torch.tensor([0.7, 0.2, 0.6], device=tensor.device, dtype=tensor.dtype) b = torch.tensor([0.4, 0.2, 0.9], device=tensor.device, dtype=tensor.dtype) return F.lfilter(tensor, a, b) self._assert_consistency(func, waveform) def test_sliding_window_cmn(self): def func(tensor): cmn_window = 600 min_cmn_window = 100 center = False norm_vars = False a = torch.tensor( [ [ -1.915875792503357, 1.147700309753418 ], [ 1.8242558240890503, 1.3869990110397339 ] ], device=tensor.device, dtype=tensor.dtype ) return F.sliding_window_cmn(a, cmn_window, min_cmn_window, center, norm_vars) b = torch.tensor( [ [ -1.8701, -0.1196 ], [ 1.8701, 0.1196 ] ] ) self._assert_consistency(func, b) def test_contrast(self): waveform = common_utils.get_whitenoise() def func(tensor): enhancement_amount = 80. return F.contrast(tensor, enhancement_amount) self._assert_consistency(func, waveform) def test_dcshift(self): waveform = common_utils.get_whitenoise() def func(tensor): shift = 0.5 limiter_gain = 0.05 return F.dcshift(tensor, shift, limiter_gain) self._assert_consistency(func, waveform) def test_overdrive(self): waveform = common_utils.get_whitenoise() def func(tensor): gain = 30. colour = 50. return F.overdrive(tensor, gain, colour) self._assert_consistency(func, waveform) def test_phaser(self): waveform = common_utils.get_whitenoise(sample_rate=44100) def func(tensor): gain_in = 0.5 gain_out = 0.8 delay_ms = 2.0 decay = 0.4 speed = 0.5 sample_rate = 44100 return F.phaser(tensor, sample_rate, gain_in, gain_out, delay_ms, decay, speed, sinusoidal=True) self._assert_consistency(func, waveform) def test_flanger(self): torch.random.manual_seed(40) waveform = torch.rand(2, 100) - 0.5 def func(tensor): delay = 0.8 depth = 0.88 regen = 3.0 width = 0.23 speed = 1.3 phase = 60. sample_rate = 44100 return F.flanger(tensor, sample_rate, delay, depth, regen, width, speed, phase, modulation='sinusoidal', interpolation='linear') self._assert_consistency(func, waveform) class Transforms(common_utils.TestBaseMixin): """Implements test for Transforms that are performed for different devices""" def _assert_consistency(self, transform, tensor): tensor = tensor.to(device=self.device, dtype=self.dtype) transform = transform.to(device=self.device, dtype=self.dtype) ts_transform = torch.jit.script(transform) output = transform(tensor) ts_output = ts_transform(tensor) self.assertEqual(ts_output, output) def test_Spectrogram(self): tensor = torch.rand((1, 1000)) self._assert_consistency(T.Spectrogram(), tensor) def test_GriffinLim(self): tensor = torch.rand((1, 201, 6)) self._assert_consistency(T.GriffinLim(length=1000, rand_init=False), tensor) def test_AmplitudeToDB(self): spec = torch.rand((6, 201)) self._assert_consistency(T.AmplitudeToDB(), spec) def test_MelScale(self): spec_f = torch.rand((1, 6, 201)) self._assert_consistency(T.MelScale(), spec_f) def test_MelSpectrogram(self): tensor = torch.rand((1, 1000)) self._assert_consistency(T.MelSpectrogram(), tensor) def test_MFCC(self): tensor = torch.rand((1, 1000)) self._assert_consistency(T.MFCC(), tensor) def test_Resample(self): sr1, sr2 = 16000, 8000 tensor = common_utils.get_whitenoise(sample_rate=sr1) self._assert_consistency(T.Resample(float(sr1), float(sr2)), tensor) def test_ComplexNorm(self): tensor = torch.rand((1, 2, 201, 2)) self._assert_consistency(T.ComplexNorm(), tensor) def test_MuLawEncoding(self): tensor = common_utils.get_whitenoise() self._assert_consistency(T.MuLawEncoding(), tensor) def test_MuLawDecoding(self): tensor = torch.rand((1, 10)) self._assert_consistency(T.MuLawDecoding(), tensor) def test_TimeStretch(self): n_freq = 400 hop_length = 512 fixed_rate = 1.3 tensor = torch.rand((10, 2, n_freq, 10, 2)) self._assert_consistency( T.TimeStretch(n_freq=n_freq, hop_length=hop_length, fixed_rate=fixed_rate), tensor, ) def test_Fade(self): waveform = common_utils.get_whitenoise() fade_in_len = 3000 fade_out_len = 3000 self._assert_consistency(T.Fade(fade_in_len, fade_out_len), waveform) def test_FrequencyMasking(self): tensor = torch.rand((10, 2, 50, 10, 2)) self._assert_consistency(T.FrequencyMasking(freq_mask_param=60, iid_masks=False), tensor) def test_TimeMasking(self): tensor = torch.rand((10, 2, 50, 10, 2)) self._assert_consistency(T.TimeMasking(time_mask_param=30, iid_masks=False), tensor) def test_Vol(self): waveform = common_utils.get_whitenoise() self._assert_consistency(T.Vol(1.1), waveform) def test_SlidingWindowCmn(self): tensor = torch.rand((1000, 10)) self._assert_consistency(T.SlidingWindowCmn(), tensor) def test_Vad(self): filepath = common_utils.get_asset_path("vad-go-mono-32000.wav") waveform, sample_rate = common_utils.load_wav(filepath) self._assert_consistency(T.Vad(sample_rate=sample_rate), waveform) audio-0.7.2/test/torchaudio_unittest/transforms_test.py000066400000000000000000000232741376444676100235410ustar00rootroot00000000000000import math import unittest import torch import torchaudio import torchaudio.transforms as transforms import torchaudio.functional as F from torchaudio_unittest import common_utils class Tester(common_utils.TorchaudioTestCase): backend = 'default' # create a sinewave signal for testing sample_rate = 16000 freq = 440 volume = .3 waveform = (torch.cos(2 * math.pi * torch.arange(0, 4 * sample_rate).float() * freq / sample_rate)) waveform.unsqueeze_(0) # (1, 64000) waveform = (waveform * volume * 2**31).long() def scale(self, waveform, factor=2.0**31): # scales a waveform by a factor if not waveform.is_floating_point(): waveform = waveform.to(torch.get_default_dtype()) return waveform / factor def test_mu_law_companding(self): quantization_channels = 256 waveform = self.waveform.clone() if not waveform.is_floating_point(): waveform = waveform.to(torch.get_default_dtype()) waveform /= torch.abs(waveform).max() self.assertTrue(waveform.min() >= -1. and waveform.max() <= 1.) waveform_mu = transforms.MuLawEncoding(quantization_channels)(waveform) self.assertTrue(waveform_mu.min() >= 0. and waveform_mu.max() <= quantization_channels) waveform_exp = transforms.MuLawDecoding(quantization_channels)(waveform_mu) self.assertTrue(waveform_exp.min() >= -1. and waveform_exp.max() <= 1.) def test_AmplitudeToDB(self): filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') waveform = common_utils.load_wav(filepath)[0] mag_to_db_transform = transforms.AmplitudeToDB('magnitude', 80.) power_to_db_transform = transforms.AmplitudeToDB('power', 80.) mag_to_db_torch = mag_to_db_transform(torch.abs(waveform)) power_to_db_torch = power_to_db_transform(torch.pow(waveform, 2)) self.assertEqual(mag_to_db_torch, power_to_db_torch) def test_melscale_load_save(self): specgram = torch.ones(1, 1000, 100) melscale_transform = transforms.MelScale() melscale_transform(specgram) melscale_transform_copy = transforms.MelScale(n_stft=1000) melscale_transform_copy.load_state_dict(melscale_transform.state_dict()) fb = melscale_transform.fb fb_copy = melscale_transform_copy.fb self.assertEqual(fb_copy.size(), (1000, 128)) self.assertEqual(fb, fb_copy) def test_melspectrogram_load_save(self): waveform = self.waveform.float() mel_spectrogram_transform = transforms.MelSpectrogram() mel_spectrogram_transform(waveform) mel_spectrogram_transform_copy = transforms.MelSpectrogram() mel_spectrogram_transform_copy.load_state_dict(mel_spectrogram_transform.state_dict()) window = mel_spectrogram_transform.spectrogram.window window_copy = mel_spectrogram_transform_copy.spectrogram.window fb = mel_spectrogram_transform.mel_scale.fb fb_copy = mel_spectrogram_transform_copy.mel_scale.fb self.assertEqual(window, window_copy) # the default for n_fft = 400 and n_mels = 128 self.assertEqual(fb_copy.size(), (201, 128)) self.assertEqual(fb, fb_copy) def test_mel2(self): top_db = 80. s2db = transforms.AmplitudeToDB('power', top_db) waveform = self.waveform.clone() # (1, 16000) waveform_scaled = self.scale(waveform) # (1, 16000) mel_transform = transforms.MelSpectrogram() # check defaults spectrogram_torch = s2db(mel_transform(waveform_scaled)) # (1, 128, 321) self.assertTrue(spectrogram_torch.dim() == 3) self.assertTrue(spectrogram_torch.ge(spectrogram_torch.max() - top_db).all()) self.assertEqual(spectrogram_torch.size(1), mel_transform.n_mels) # check correctness of filterbank conversion matrix self.assertTrue(mel_transform.mel_scale.fb.sum(1).le(1.).all()) self.assertTrue(mel_transform.mel_scale.fb.sum(1).ge(0.).all()) # check options kwargs = {'window_fn': torch.hamming_window, 'pad': 10, 'win_length': 500, 'hop_length': 125, 'n_fft': 800, 'n_mels': 50} mel_transform2 = transforms.MelSpectrogram(**kwargs) spectrogram2_torch = s2db(mel_transform2(waveform_scaled)) # (1, 50, 513) self.assertTrue(spectrogram2_torch.dim() == 3) self.assertTrue(spectrogram_torch.ge(spectrogram_torch.max() - top_db).all()) self.assertEqual(spectrogram2_torch.size(1), mel_transform2.n_mels) self.assertTrue(mel_transform2.mel_scale.fb.sum(1).le(1.).all()) self.assertTrue(mel_transform2.mel_scale.fb.sum(1).ge(0.).all()) # check on multi-channel audio filepath = common_utils.get_asset_path('steam-train-whistle-daniel_simon.wav') x_stereo = common_utils.load_wav(filepath)[0] # (2, 278756), 44100 spectrogram_stereo = s2db(mel_transform(x_stereo)) # (2, 128, 1394) self.assertTrue(spectrogram_stereo.dim() == 3) self.assertTrue(spectrogram_stereo.size(0) == 2) self.assertTrue(spectrogram_torch.ge(spectrogram_torch.max() - top_db).all()) self.assertEqual(spectrogram_stereo.size(1), mel_transform.n_mels) # check filterbank matrix creation fb_matrix_transform = transforms.MelScale( n_mels=100, sample_rate=16000, f_min=0., f_max=None, n_stft=400) self.assertTrue(fb_matrix_transform.fb.sum(1).le(1.).all()) self.assertTrue(fb_matrix_transform.fb.sum(1).ge(0.).all()) self.assertEqual(fb_matrix_transform.fb.size(), (400, 100)) def test_mfcc(self): audio_orig = self.waveform.clone() audio_scaled = self.scale(audio_orig) # (1, 16000) sample_rate = 16000 n_mfcc = 40 n_mels = 128 mfcc_transform = torchaudio.transforms.MFCC(sample_rate=sample_rate, n_mfcc=n_mfcc, norm='ortho') # check defaults torch_mfcc = mfcc_transform(audio_scaled) # (1, 40, 321) self.assertTrue(torch_mfcc.dim() == 3) self.assertTrue(torch_mfcc.shape[1] == n_mfcc) self.assertTrue(torch_mfcc.shape[2] == 321) # check melkwargs are passed through melkwargs = {'win_length': 200} mfcc_transform2 = torchaudio.transforms.MFCC(sample_rate=sample_rate, n_mfcc=n_mfcc, norm='ortho', melkwargs=melkwargs) torch_mfcc2 = mfcc_transform2(audio_scaled) # (1, 40, 641) self.assertTrue(torch_mfcc2.shape[2] == 641) # check norms work correctly mfcc_transform_norm_none = torchaudio.transforms.MFCC(sample_rate=sample_rate, n_mfcc=n_mfcc, norm=None) torch_mfcc_norm_none = mfcc_transform_norm_none(audio_scaled) # (1, 40, 321) norm_check = torch_mfcc.clone() norm_check[:, 0, :] *= math.sqrt(n_mels) * 2 norm_check[:, 1:, :] *= math.sqrt(n_mels / 2) * 2 self.assertTrue(torch_mfcc_norm_none.allclose(norm_check)) def test_resample_size(self): input_path = common_utils.get_asset_path('sinewave.wav') waveform, sample_rate = common_utils.load_wav(input_path) upsample_rate = sample_rate * 2 downsample_rate = sample_rate // 2 invalid_resample = torchaudio.transforms.Resample(sample_rate, upsample_rate, resampling_method='foo') self.assertRaises(ValueError, invalid_resample, waveform) upsample_resample = torchaudio.transforms.Resample( sample_rate, upsample_rate, resampling_method='sinc_interpolation') up_sampled = upsample_resample(waveform) # we expect the upsampled signal to have twice as many samples self.assertTrue(up_sampled.size(-1) == waveform.size(-1) * 2) downsample_resample = torchaudio.transforms.Resample( sample_rate, downsample_rate, resampling_method='sinc_interpolation') down_sampled = downsample_resample(waveform) # we expect the downsampled signal to have half as many samples self.assertTrue(down_sampled.size(-1) == waveform.size(-1) // 2) def test_compute_deltas(self): channel = 13 n_mfcc = channel * 3 time = 1021 win_length = 2 * 7 + 1 specgram = torch.randn(channel, n_mfcc, time) transform = transforms.ComputeDeltas(win_length=win_length) computed = transform(specgram) self.assertTrue(computed.shape == specgram.shape, (computed.shape, specgram.shape)) def test_compute_deltas_transform_same_as_functional(self, atol=1e-6, rtol=1e-8): channel = 13 n_mfcc = channel * 3 time = 1021 win_length = 2 * 7 + 1 specgram = torch.randn(channel, n_mfcc, time) transform = transforms.ComputeDeltas(win_length=win_length) computed_transform = transform(specgram) computed_functional = F.compute_deltas(specgram, win_length=win_length) self.assertEqual(computed_functional, computed_transform, atol=atol, rtol=rtol) def test_compute_deltas_twochannel(self): specgram = torch.tensor([1., 2., 3., 4.]).repeat(1, 2, 1) expected = torch.tensor([[[0.5, 1.0, 1.0, 0.5], [0.5, 1.0, 1.0, 0.5]]]) transform = transforms.ComputeDeltas(win_length=3) computed = transform(specgram) assert computed.shape == expected.shape, (computed.shape, expected.shape) self.assertEqual(computed, expected, atol=1e-6, rtol=1e-8) audio-0.7.2/test/torchaudio_unittest/utils/000077500000000000000000000000001376444676100210625ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/utils/__init__.py000066400000000000000000000000001376444676100231610ustar00rootroot00000000000000audio-0.7.2/test/torchaudio_unittest/utils/sox_utils_test.py000066400000000000000000000030711376444676100245250ustar00rootroot00000000000000from torchaudio.utils import sox_utils from torchaudio_unittest.common_utils import ( PytorchTestCase, skipIfNoExtension, ) @skipIfNoExtension class TestSoxUtils(PytorchTestCase): """Smoke tests for sox_util module""" def test_set_seed(self): """`set_seed` does not crush""" sox_utils.set_seed(0) def test_set_verbosity(self): """`set_verbosity` does not crush""" for val in range(6, 0, -1): sox_utils.set_verbosity(val) def test_set_buffer_size(self): """`set_buffer_size` does not crush""" sox_utils.set_buffer_size(131072) # back to default sox_utils.set_buffer_size(8192) def test_set_use_threads(self): """`set_use_threads` does not crush""" sox_utils.set_use_threads(True) # back to default sox_utils.set_use_threads(False) def test_list_effects(self): """`list_effects` returns the list of available effects""" effects = sox_utils.list_effects() # We cannot infer what effects are available, so only check some of them. assert 'highpass' in effects assert 'phaser' in effects assert 'gain' in effects def test_list_read_formats(self): """`list_read_formats` returns the list of supported formats""" formats = sox_utils.list_read_formats() assert 'wav' in formats def test_list_write_formats(self): """`list_write_formats` returns the list of supported formats""" formats = sox_utils.list_write_formats() assert 'opus' not in formats audio-0.7.2/test/torchscript_bc_test/000077500000000000000000000000001376444676100176715ustar00rootroot00000000000000audio-0.7.2/test/torchscript_bc_test/README.md000066400000000000000000000013231376444676100211470ustar00rootroot00000000000000# Torchscript Backward Compatibility Test Suite This directory contains tools to generate Torchscript object of a specific torchaudio version (given that you have the corresponding environments setup correctly) and validate it in the current version. ## Usage ### Generate torchscript object ``` ./main.py --mode generate --version 0.6.0 ``` will generate Torchscript dump files in [`assets`](./assets/) directory. This requries your Python runtime to have torchaudio `0.6.0`. ### Validate torchscript object ``` ./main.py --mode validate --version 0.6.0 ``` will validate if the Torchscript files created in the previous step are compatible with the version of torchaudio available in your environment (master). audio-0.7.2/test/torchscript_bc_test/assets/000077500000000000000000000000001376444676100211735ustar00rootroot00000000000000audio-0.7.2/test/torchscript_bc_test/assets/.gitignore000066400000000000000000000000021376444676100231530ustar00rootroot00000000000000* audio-0.7.2/test/torchscript_bc_test/main.py000077500000000000000000000037001376444676100211720ustar00rootroot00000000000000#!/usr/bin/env python3 """Generate torchscript object of specific torhcaudio version. This requires that the corresponding torchaudio (and torch) is installed. """ import os import sys import argparse _BASE_OBJ_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'assets') def _parse_args(): parser = argparse.ArgumentParser( description=__doc__ ) parser.add_argument( '--mode', choices=['generate', 'validate'], required=True, help=( '"generate" generates Torchscript objects of the specific torchaudio ' 'in the given directory. ' '"validate" validates if the objects in the givcen directory are compatible ' 'with the current torhcaudio.' ) ) parser.add_argument( '--version', choices=['0.6.0'], required=True, help='torchaudio version.' ) parser.add_argument( '--base-obj-dir', default=_BASE_OBJ_DIR, help='Directory where objects are saved/loaded.' ) return parser.parse_args() def _generate(version, output_dir): if version == '0.6.0': import ver_060 ver_060.generate(output_dir) else: raise ValueError(f'Unexpected torchaudio version: {version}') def _validate(version, input_dir): if version == '0.6.0': import ver_060 ver_060.validate(input_dir) else: raise ValueError(f'Unexpected torchaudio version: {version}') def _get_obj_dir(base_dir, version): py_version = f'{sys.version_info.major}.{sys.version_info.minor}' return os.path.join(base_dir, f'{version}-py{py_version}') def _main(): args = _parse_args() obj_dir = _get_obj_dir(args.base_obj_dir, args.version) if args.mode == 'generate': _generate(args.version, obj_dir) elif args.mode == 'validate': _validate(args.version, obj_dir) else: raise ValueError(f'Unexpected mode: {args.mode}') if __name__ == '__main__': _main() audio-0.7.2/test/torchscript_bc_test/ver_060.py000066400000000000000000000037061376444676100214320ustar00rootroot00000000000000import os import tempfile from typing import Optional from packaging import version import torch import torchaudio _MIN_VER = version.parse('0.6.0a0') _MAX_VER = version.parse('0.7.0') _RUNTIME_VER = version.parse(torchaudio.__version__) def info(filepath: str) -> torchaudio.backend.sox_io_backend.AudioMetaData: return torchaudio.info(filepath) def load( filepath: str, frame_offset: int, num_frames: int, normalize: bool, channels_first: bool): return torchaudio.load(filepath, frame_offset, num_frames, normalize, channels_first) def save( filepath: str, tensor: torch.Tensor, sample_rate: int, channels_first: bool = True, compression: Optional[float] = None, ): torchaudio.save(filepath, tensor, sample_rate, channels_first, compression) def generate(output_dir): if not (_MIN_VER <= _RUNTIME_VER < _MAX_VER): raise RuntimeError(f'Invalid torchaudio runtime version: {_RUNTIME_VER}') torchaudio.set_audio_backend('sox_io') funcs = [ info, load, save, ] os.makedirs(output_dir, exist_ok=True) for func in funcs: torch.jit.script(func).save(os.path.join(output_dir, f'{func.__name__}.zip')) def validate(input_dir): torchaudio.set_audio_backend('sox_io') # See https://github.com/pytorch/pytorch/issues/42258 # info_ = torch.jit.load(os.path.join(input_dir, 'info.zip')) load_ = torch.jit.load(os.path.join(input_dir, 'load.zip')) save_ = torch.jit.load(os.path.join(input_dir, 'save.zip')) sample_rate = 44100 normalize = True channels_first = True with tempfile.TemporaryDirectory() as temp_dir: temp_file = os.path.join(temp_dir, 'test.wav') temp_data = torch.rand(2, sample_rate, dtype=torch.float32) save_(temp_file, temp_data, sample_rate, channels_first, 0.) # info_(temp_file) load_(temp_file, 0, -1, normalize, channels_first) audio-0.7.2/third_party/000077500000000000000000000000001376444676100151745ustar00rootroot00000000000000audio-0.7.2/third_party/CMakeLists.txt000066400000000000000000000077601376444676100177460ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) project(torchaudio_third_parties) include(ExternalProject) set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/install) set(ARCHIVE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/archives) set(COMMON_ARGS --quiet --disable-shared --enable-static --prefix=${INSTALL_DIR} --with-pic --disable-dependency-tracking --disable-debug --disable-examples --disable-doc) ExternalProject_Add(libmad PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://downloads.sourceforge.net/project/mad/libmad/0.15.1b/libmad-0.15.1b.tar.gz URL_HASH SHA256=bbfac3ed6bfbc2823d3775ebb931087371e142bb0e9bb1bee51a76a6e0078690 PATCH_COMMAND patch < ${CMAKE_CURRENT_SOURCE_DIR}/patch/libmad.patch CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/src/libmad/configure ${COMMON_ARGS} ) ExternalProject_Add(libmp3lame PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz URL_HASH SHA256=24346b4158e4af3bd9f2e194bb23eb473c75fb7377011523353196b19b9a23ff CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/src/libmp3lame/configure ${COMMON_ARGS} --enable-nasm ) ExternalProject_Add(libogg PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://ftp.osuosl.org/pub/xiph/releases/ogg/libogg-1.3.3.tar.gz URL_HASH SHA256=c2e8a485110b97550f453226ec644ebac6cb29d1caef2902c007edab4308d985 CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/src/libogg/configure ${COMMON_ARGS} ) ExternalProject_Add(libflac PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS libogg DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://ftp.osuosl.org/pub/xiph/releases/flac/flac-1.3.2.tar.xz URL_HASH SHA256=91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_codec_helper.sh ${CMAKE_CURRENT_SOURCE_DIR}/src/libflac/configure ${COMMON_ARGS} --with-ogg ) ExternalProject_Add(libvorbis PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS libogg DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://ftp.osuosl.org/pub/xiph/releases/vorbis/libvorbis-1.3.6.tar.gz URL_HASH SHA256=6ed40e0241089a42c48604dc00e362beee00036af2d8b3f46338031c9e0351cb CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_codec_helper.sh ${CMAKE_CURRENT_SOURCE_DIR}/src/libvorbis/configure ${COMMON_ARGS} --with-ogg ) ExternalProject_Add(libopus PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS libogg DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://ftp.osuosl.org/pub/xiph/releases/opus/opus-1.3.1.tar.gz URL_HASH SHA256=65b58e1e25b2a114157014736a3d9dfeaad8d41be1c8179866f144a2fb44ff9d CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_codec_helper.sh ${CMAKE_CURRENT_SOURCE_DIR}/src/libopus/configure ${COMMON_ARGS} --with-ogg ) ExternalProject_Add(opusfile PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS libopus DOWNLOAD_DIR ${ARCHIVE_DIR} STAMP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/opusfile-stamp SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/opusfile URL https://ftp.osuosl.org/pub/xiph/releases/opus/opusfile-0.12.tar.gz URL_HASH SHA256=118d8601c12dd6a44f52423e68ca9083cc9f2bfe72da7a8c1acb22a80ae3550b CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_codec_helper.sh ${CMAKE_CURRENT_SOURCE_DIR}/src/opusfile/configure ${COMMON_ARGS} --disable-http ) ExternalProject_Add(libsox PREFIX ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS libogg libflac libvorbis opusfile libmp3lame libmad DOWNLOAD_DIR ${ARCHIVE_DIR} URL https://downloads.sourceforge.net/project/sox/sox/14.4.2/sox-14.4.2.tar.bz2 URL_HASH SHA256=81a6956d4330e75b5827316e44ae381e6f1e8928003c6aa45896da9041ea149c # OpenMP is by default compiled against GNU OpenMP, which conflicts with the version of OpenMP that PyTorch uses. # See https://github.com/pytorch/audio/pull/1026 CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_codec_helper.sh ${CMAKE_CURRENT_SOURCE_DIR}/src/libsox/configure ${COMMON_ARGS} --with-lame --with-flac --with-mad --with-oggvorbis --without-alsa --without-coreaudio --without-png --without-oss --without-sndfile --with-opus --disable-openmp ) audio-0.7.2/third_party/build_codec_helper.sh000077500000000000000000000010361376444676100213260ustar00rootroot00000000000000#!/usr/bin/env bash # Helper script for building codecs depending on libogg, such as libopus and opus. # It is difficult to set environment variable inside of ExternalProject_Add, # so this script sets necessary environment variables before running the given command this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" install_dir="${this_dir}/install" export PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig" export LDFLAGS="-L${install_dir}/lib ${LDFLAGS}" export CPPFLAGS="-I${install_dir}/include ${CPPFLAGS}" $@ audio-0.7.2/third_party/patch/000077500000000000000000000000001376444676100162735ustar00rootroot00000000000000audio-0.7.2/third_party/patch/libmad.patch000066400000000000000000000054311376444676100205470ustar00rootroot00000000000000See the followings for the origin of this patch http://www.linuxfromscratch.org/blfs/view/svn/multimedia/libmad.html http://www.linuxfromscratch.org/patches/blfs/svn/libmad-0.15.1b-fixes-1.patch --- src/libmad/configure 2004-02-05 09:34:07.000000000 +0000 +++ src/libmad/configure.new 2020-06-30 21:10:28.528018931 +0000 @@ -19083,71 +19083,7 @@ if test "$GCC" = yes then - if test -z "$arch" - then - case "$host" in - i386-*) ;; - i?86-*) arch="-march=i486" ;; - arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;; - armv4*-*) arch="-march=armv4 -mtune=strongarm" ;; - powerpc-*) ;; - mips*-agenda-*) arch="-mcpu=vr4100" ;; - mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;; - esac - fi - - case "$optimize" in - -O|"-O "*) - optimize="-O" - optimize="$optimize -fforce-mem" - optimize="$optimize -fforce-addr" - : #x optimize="$optimize -finline-functions" - : #- optimize="$optimize -fstrength-reduce" - optimize="$optimize -fthread-jumps" - optimize="$optimize -fcse-follow-jumps" - optimize="$optimize -fcse-skip-blocks" - : #x optimize="$optimize -frerun-cse-after-loop" - : #x optimize="$optimize -frerun-loop-opt" - : #x optimize="$optimize -fgcse" - optimize="$optimize -fexpensive-optimizations" - optimize="$optimize -fregmove" - : #* optimize="$optimize -fdelayed-branch" - : #x optimize="$optimize -fschedule-insns" - optimize="$optimize -fschedule-insns2" - : #? optimize="$optimize -ffunction-sections" - : #? optimize="$optimize -fcaller-saves" - : #> optimize="$optimize -funroll-loops" - : #> optimize="$optimize -funroll-all-loops" - : #x optimize="$optimize -fmove-all-movables" - : #x optimize="$optimize -freduce-all-givs" - : #? optimize="$optimize -fstrict-aliasing" - : #* optimize="$optimize -fstructure-noalias" - - case "$host" in - arm*-*) - optimize="$optimize -fstrength-reduce" - ;; - mips*-*) - optimize="$optimize -fstrength-reduce" - optimize="$optimize -finline-functions" - ;; - i?86-*) - optimize="$optimize -fstrength-reduce" - ;; - powerpc-apple-*) - # this triggers an internal compiler error with gcc2 - : #optimize="$optimize -fstrength-reduce" - - # this is really only beneficial with gcc3 - : #optimize="$optimize -finline-functions" - ;; - *) - # this sometimes provokes bugs in gcc 2.95.2 - : #optimize="$optimize -fstrength-reduce" - ;; - esac - ;; - esac + optimize="-O2" fi case "$host" in @@ -21497,6 +21433,7 @@ then case "$host" in i?86-*) FPM="INTEL" ;; + x86_64*) FPM="64BIT" ;; arm*-*) FPM="ARM" ;; mips*-*) FPM="MIPS" ;; sparc*-*) FPM="SPARC" ;; audio-0.7.2/torchaudio/000077500000000000000000000000001376444676100150045ustar00rootroot00000000000000audio-0.7.2/torchaudio/__init__.py000066400000000000000000000030051376444676100171130ustar00rootroot00000000000000from . import extension from torchaudio._internal import module_utils as _mod_utils from torchaudio import ( compliance, datasets, kaldi_io, utils, sox_effects, transforms ) USE_SOUNDFILE_LEGACY_INTERFACE = True from torchaudio.backend import ( list_audio_backends, get_audio_backend, set_audio_backend, save_encinfo, sox_signalinfo_t, sox_encodinginfo_t, get_sox_option_t, get_sox_encoding_t, get_sox_bool, SignalInfo, EncodingInfo, ) from torchaudio.sox_effects import ( init_sox_effects as _init_sox_effects, shutdown_sox_effects as _shutdown_sox_effects, ) try: from .version import __version__, git_version # noqa: F401 except ImportError: pass @_mod_utils.deprecated( "Please remove the function call to initialize_sox. " "Resource initialization is now automatically handled.", "0.8.0") def initialize_sox(): """Initialize sox effects. This function is deprecated. See :py:func:`torchaudio.sox_effects.init_sox_effects` """ _init_sox_effects() @_mod_utils.deprecated( "Please remove the function call to torchaudio.shutdown_sox. " "Resource clean up is now automatically handled. " "In the unlikely event that you need to manually shutdown sox, " "please use torchaudio.sox_effects.shutdown_sox_effects.", "0.8.0") def shutdown_sox(): """Shutdown sox effects. This function is deprecated. See :py:func:`torchaudio.sox_effects.shutdown_sox_effects` """ _shutdown_sox_effects() audio-0.7.2/torchaudio/_internal/000077500000000000000000000000001376444676100167575ustar00rootroot00000000000000audio-0.7.2/torchaudio/_internal/__init__.py000066400000000000000000000000001376444676100210560ustar00rootroot00000000000000audio-0.7.2/torchaudio/_internal/misc_ops.py000066400000000000000000000017021376444676100211450ustar00rootroot00000000000000from typing import Union, Callable import torch from torch import Tensor def normalize_audio(signal: Tensor, normalization: Union[bool, float, Callable]) -> None: """Audio normalization of a tensor in-place. The normalization can be a bool, a number, or a callable that takes the audio tensor as an input. SoX uses 32-bit signed integers internally, thus bool normalizes based on that assumption. """ if not normalization: return if isinstance(normalization, bool): normalization = 1 << 31 if isinstance(normalization, (float, int)): # normalize with custom value signal /= normalization elif callable(normalization): signal /= normalization(signal) def check_input(src: Tensor) -> None: if not torch.is_tensor(src): raise TypeError('Expected a tensor, got %s' % type(src)) if src.is_cuda: raise TypeError('Expected a CPU based tensor, got %s' % type(src)) audio-0.7.2/torchaudio/_internal/module_utils.py000066400000000000000000000037541376444676100220470ustar00rootroot00000000000000import warnings import importlib.util from typing import Optional from functools import wraps def is_module_available(*modules: str) -> bool: r"""Returns if a top-level module with :attr:`name` exists *without** importing it. This is generally safer than try-catch block around a `import X`. It avoids third party libraries breaking assumptions of some of our tests, e.g., setting multiprocessing start method when imported (see librosa/#747, torchvision/#544). """ return all(importlib.util.find_spec(m) is not None for m in modules) def requires_module(*modules: str): """Decorate function to give error message if invoked without required optional modules. This decorator is to give better error message to users rather than raising ``NameError: name 'module' is not defined`` at random places. """ missing = [m for m in modules if not is_module_available(m)] if not missing: # fall through. If all the modules are available, no need to decorate def decorator(func): return func else: req = f'module: {missing[0]}' if len(missing) == 1 else f'modules: {missing}' def decorator(func): @wraps(func) def wrapped(*args, **kwargs): raise RuntimeError(f'{func.__module__}.{func.__name__} requires {req}') return wrapped return decorator def deprecated(direction: str, version: Optional[str] = None): """Decorator to add deprecation message Args: direction: Migration steps to be given to users. """ def decorator(func): @wraps(func) def wrapped(*args, **kwargs): message = ( f'{func.__module__}.{func.__name__} has been deprecated ' f'and will be removed from {"future" if version is None else version} release. ' f'{direction}') warnings.warn(message, stacklevel=2) return func(*args, **kwargs) return wrapped return decorator audio-0.7.2/torchaudio/backend/000077500000000000000000000000001376444676100163735ustar00rootroot00000000000000audio-0.7.2/torchaudio/backend/__init__.py000066400000000000000000000005471376444676100205120ustar00rootroot00000000000000from . import utils from .utils import ( list_audio_backends, get_audio_backend, set_audio_backend, ) from .sox_backend import ( save_encinfo, sox_signalinfo_t, sox_encodinginfo_t, get_sox_option_t, get_sox_encoding_t, get_sox_bool, ) from .common import ( SignalInfo, EncodingInfo, ) utils._init_audio_backend() audio-0.7.2/torchaudio/backend/_soundfile_backend.py000066400000000000000000000173471376444676100225570ustar00rootroot00000000000000"""The new soundfile backend which will become default in 0.8.0 onward""" from typing import Tuple, Optional import warnings import torch from torchaudio._internal import module_utils as _mod_utils from .common import AudioMetaData if _mod_utils.is_module_available("soundfile"): import soundfile @_mod_utils.requires_module("soundfile") def info(filepath: str) -> AudioMetaData: """Get signal information of an audio file. Args: filepath (str or pathlib.Path): Path to audio file. This functionalso handles ``pathlib.Path`` objects, but is annotated as ``str`` for the consistency with "sox_io" backend, which has a restriction on type annotation for TorchScript compiler compatiblity. Returns: AudioMetaData: meta data of the given audio. """ sinfo = soundfile.info(filepath) return AudioMetaData(sinfo.samplerate, sinfo.frames, sinfo.channels) _SUBTYPE2DTYPE = { "PCM_S8": "int8", "PCM_U8": "uint8", "PCM_16": "int16", "PCM_32": "int32", "FLOAT": "float32", "DOUBLE": "float64", } @_mod_utils.requires_module("soundfile") def load( filepath: str, frame_offset: int = 0, num_frames: int = -1, normalize: bool = True, channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Load audio data from file. Note: The formats this function can handle depend on the soundfile installation. This function is tested on the following formats; * WAV * 32-bit floating-point * 32-bit signed integer * 16-bit signed integer * 8-bit unsigned integer * FLAC * OGG/VORBIS * SPHERE By default (``normalize=True``, ``channels_first=True``), this function returns Tensor with ``float32`` dtype and the shape of ``[channel, time]``. The samples are normalized to fit in the range of ``[-1.0, 1.0]``. When the input format is WAV with integer type, such as 32-bit signed integer, 16-bit signed integer and 8-bit unsigned integer (24-bit signed integer is not supported), by providing ``normalize=False``, this function can return integer Tensor, where the samples are expressed within the whole range of the corresponding dtype, that is, ``int32`` tensor for 32-bit signed PCM, ``int16`` for 16-bit signed PCM and ``uint8`` for 8-bit unsigned PCM. ``normalize`` parameter has no effect on 32-bit floating-point WAV and other formats, such as ``flac`` and ``mp3``. For these formats, this function always returns ``float32`` Tensor with values normalized to ``[-1.0, 1.0]``. Args: filepath (str or pathlib.Path): Path to audio file. This functionalso handles ``pathlib.Path`` objects, but is annotated as ``str`` for the consistency with "sox_io" backend, which has a restriction on type annotation for TorchScript compiler compatiblity. frame_offset (int): Number of frames to skip before start reading data. num_frames (int): Maximum number of frames to read. ``-1`` reads all the remaining samples, starting from ``frame_offset``. This function may return the less number of frames if there is not enough frames in the given file. normalize (bool): When ``True``, this function always return ``float32``, and sample values are normalized to ``[-1.0, 1.0]``. If input file is integer WAV, giving ``False`` will change the resulting Tensor type to integer type. This argument has no effect for formats other than integer WAV type. channels_first (bool): When True, the returned Tensor has dimension ``[channel, time]``. Otherwise, the returned Tensor's dimension is ``[time, channel]``. Returns: torch.Tensor: If the input file has integer wav format and normalization is off, then it has integer type, else ``float32`` type. If ``channels_first=True``, it has ``[channel, time]`` else ``[time, channel]``. """ with soundfile.SoundFile(filepath, "r") as file_: if file_.format != "WAV" or normalize: dtype = "float32" elif file_.subtype not in _SUBTYPE2DTYPE: raise ValueError(f"Unsupported subtype: {file_.subtype}") else: dtype = _SUBTYPE2DTYPE[file_.subtype] frames = file_._prepare_read(frame_offset, None, num_frames) waveform = file_.read(frames, dtype, always_2d=True) sample_rate = file_.samplerate waveform = torch.from_numpy(waveform) if channels_first: waveform = waveform.t() return waveform, sample_rate @_mod_utils.requires_module("soundfile") def save( filepath: str, src: torch.Tensor, sample_rate: int, channels_first: bool = True, compression: Optional[float] = None, ): """Save audio data to file. Note: The formats this function can handle depend on the soundfile installation. This function is tested on the following formats; * WAV * 32-bit floating-point * 32-bit signed integer * 16-bit signed integer * 8-bit unsigned integer * FLAC * OGG/VORBIS * SPHERE Args: filepath (str or pathlib.Path): Path to audio file. This functionalso handles ``pathlib.Path`` objects, but is annotated as ``str`` for the consistency with "sox_io" backend, which has a restriction on type annotation for TorchScript compiler compatiblity. tensor (torch.Tensor): Audio data to save. must be 2D tensor. sample_rate (int): sampling rate channels_first (bool): If ``True``, the given tensor is interpreted as ``[channel, time]``, otherwise ``[time, channel]``. compression (Optional[float]): Not used. It is here only for interface compatibility reson with "sox_io" backend. """ if src.ndim != 2: raise ValueError(f"Expected 2D Tensor, got {src.ndim}D.") if compression is not None: warnings.warn( '`save` function of "soundfile" backend does not support "compression" parameter. ' "The argument is silently ignored." ) ext = str(filepath).split(".")[-1].lower() if ext != "wav": subtype = None elif src.dtype == torch.uint8: subtype = "PCM_U8" elif src.dtype == torch.int16: subtype = "PCM_16" elif src.dtype == torch.int32: subtype = "PCM_32" elif src.dtype == torch.float32: subtype = "FLOAT" elif src.dtype == torch.float64: subtype = "DOUBLE" else: raise ValueError(f"Unsupported dtype for WAV: {src.dtype}") format_ = None # sph is a extension used in TED-LIUM but soundfile does not recognize it as NIST format, # so we extend the extensions manually here if ext in ["nis", "nist", "sph"]: format_ = "NIST" if channels_first: src = src.t() soundfile.write( file=filepath, data=src, samplerate=sample_rate, subtype=subtype, format=format_ ) @_mod_utils.requires_module("soundfile") @_mod_utils.deprecated('Please use "torchaudio.load".', "0.9.0") def load_wav( filepath: str, frame_offset: int = 0, num_frames: int = -1, channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Load wave file. This function is defined only for the purpose of compatibility against other backend for simple usecases, such as ``torchaudio.load_wav(filepath)``. The implementation is same as :py:func:`load`. """ return load( filepath, frame_offset, num_frames, normalize=False, channels_first=channels_first, ) audio-0.7.2/torchaudio/backend/common.py000066400000000000000000000151401376444676100202360ustar00rootroot00000000000000from typing import Any, Optional from torchaudio._internal import module_utils as _mod_utils class AudioMetaData: """Return type of ``torchaudio.info`` function. This class is used by :ref:`"sox_io" backend` and :ref:`"soundfile" backend with the new interface`. :ivar int sample_rate: Sample rate :ivar int num_frames: The number of frames :ivar int num_channels: The number of channels """ def __init__(self, sample_rate: int, num_frames: int, num_channels: int): self.sample_rate = sample_rate self.num_frames = num_frames self.num_channels = num_channels @_mod_utils.deprecated('Please migrate to `AudioMetaData`.', '0.9.0') class SignalInfo: """One of return types of ``torchaudio.info`` functions. This class is used by :ref:`"sox" backend (deprecated)` and :ref:`"soundfile" backend with the legacy interface (deprecated)`. See https://fossies.org/dox/sox-14.4.2/structsox__signalinfo__t.html :ivar Optional[int] channels: The number of channels :ivar Optional[float] rate: Sampleing rate :ivar Optional[int] precision: Bit depth :ivar Optional[int] length: For :ref:`sox backend`, the number of samples. (frames * channels). For :ref:`soundfile backend`, the number of frames. """ def __init__(self, channels: Optional[int] = None, rate: Optional[float] = None, precision: Optional[int] = None, length: Optional[int] = None) -> None: self.channels = channels self.rate = rate self.precision = precision self.length = length @_mod_utils.deprecated('Please migrate to `AudioMetaData`.', '0.9.0') class EncodingInfo: """One of return types of ``torchaudio.info`` functions. This class is used by :ref:`"sox" backend (deprecated)` and :ref:`"soundfile" backend with the legacy interface (deprecated)`. See https://fossies.org/dox/sox-14.4.2/structsox__encodinginfo__t.html :ivar Optional[int] encoding: sox_encoding_t :ivar Optional[int] bits_per_sample: bit depth :ivar Optional[float] compression: Compression option :ivar Any reverse_bytes: :ivar Any reverse_nibbles: :ivar Any reverse_bits: :ivar Optional[bool] opposite_endian: """ def __init__(self, encoding: Any = None, bits_per_sample: Optional[int] = None, compression: Optional[float] = None, reverse_bytes: Any = None, reverse_nibbles: Any = None, reverse_bits: Any = None, opposite_endian: Optional[bool] = None) -> None: self.encoding = encoding self.bits_per_sample = bits_per_sample self.compression = compression self.reverse_bytes = reverse_bytes self.reverse_nibbles = reverse_nibbles self.reverse_bits = reverse_bits self.opposite_endian = opposite_endian _LOAD_DOCSTRING = r"""Loads an audio file from disk into a tensor Args: filepath: Path to audio file out: An optional output tensor to use instead of creating one. (Default: ``None``) normalization: Optional normalization. If boolean `True`, then output is divided by `1 << 31`. Assuming the input is signed 32-bit audio, this normalizes to `[-1, 1]`. If `float`, then output is divided by that number. If `Callable`, then the output is passed as a paramete to the given function, then the output is divided by the result. (Default: ``True``) channels_first: Set channels first or length first in result. (Default: ``True``) num_frames: Number of frames to load. 0 to load everything after the offset. (Default: ``0``) offset: Number of frames from the start of the file to begin data loading. (Default: ``0``) signalinfo: A sox_signalinfo_t type, which could be helpful if the audio type cannot be automatically determined. (Default: ``None``) encodinginfo: A sox_encodinginfo_t type, which could be set if the audio type cannot be automatically determined. (Default: ``None``) filetype: A filetype or extension to be set if sox cannot determine it automatically. (Default: ``None``) Returns: (Tensor, int): An output tensor of size `[C x L]` or `[L x C]` where L is the number of audio frames and C is the number of channels. An integer which is the sample rate of the audio (as listed in the metadata of the file) Example >>> data, sample_rate = torchaudio.load('foo.mp3') >>> print(data.size()) torch.Size([2, 278756]) >>> print(sample_rate) 44100 >>> data_vol_normalized, _ = torchaudio.load('foo.mp3', normalization=lambda x: torch.abs(x).max()) >>> print(data_vol_normalized.abs().max()) 1. """ _LOAD_WAV_DOCSTRING = r""" Loads a wave file. It assumes that the wav file uses 16 bit per sample that needs normalization by shifting the input right by 16 bits. Args: filepath: Path to audio file Returns: (Tensor, int): An output tensor of size `[C x L]` or `[L x C]` where L is the number of audio frames and C is the number of channels. An integer which is the sample rate of the audio (as listed in the metadata of the file) """ _SAVE_DOCSTRING = r"""Saves a Tensor on file as an audio file Args: filepath: Path to audio file src: An input 2D tensor of shape `[C x L]` or `[L x C]` where L is the number of audio frames, C is the number of channels sample_rate: An integer which is the sample rate of the audio (as listed in the metadata of the file) precision Bit precision (Default: ``16``) channels_first (bool, optional): Set channels first or length first in result. ( Default: ``True``) """ _INFO_DOCSTRING = r"""Gets metadata from an audio file without loading the signal. Args: filepath: Path to audio file Returns: (sox_signalinfo_t, sox_encodinginfo_t): A si (sox_signalinfo_t) signal info as a python object. An ei (sox_encodinginfo_t) encoding info Example >>> si, ei = torchaudio.info('foo.wav') >>> rate, channels, encoding = si.rate, si.channels, ei.encoding """ def _impl_load(func): setattr(func, '__doc__', _LOAD_DOCSTRING) return func def _impl_load_wav(func): setattr(func, '__doc__', _LOAD_WAV_DOCSTRING) return func def _impl_save(func): setattr(func, '__doc__', _SAVE_DOCSTRING) return func def _impl_info(func): setattr(func, '__doc__', _INFO_DOCSTRING) return func audio-0.7.2/torchaudio/backend/no_backend.py000066400000000000000000000022071376444676100210310ustar00rootroot00000000000000from pathlib import Path from typing import Any, Callable, Optional, Tuple, Union from torch import Tensor from . import common from .common import SignalInfo, EncodingInfo @common._impl_load def load(filepath: Union[str, Path], out: Optional[Tensor] = None, normalization: Union[bool, float, Callable] = True, channels_first: bool = True, num_frames: int = 0, offset: int = 0, signalinfo: Optional[SignalInfo] = None, encodinginfo: Optional[EncodingInfo] = None, filetype: Optional[str] = None) -> Tuple[Tensor, int]: raise RuntimeError('No audio I/O backend is available.') @common._impl_load_wav def load_wav(filepath: Union[str, Path], **kwargs: Any) -> Tuple[Tensor, int]: raise RuntimeError('No audio I/O backend is available.') @common._impl_save def save(filepath: str, src: Tensor, sample_rate: int, precision: int = 16, channels_first: bool = True) -> None: raise RuntimeError('No audio I/O backend is available.') @common._impl_info def info(filepath: str) -> Tuple[SignalInfo, EncodingInfo]: raise RuntimeError('No audio I/O backend is available.') audio-0.7.2/torchaudio/backend/soundfile_backend.py000066400000000000000000000071101376444676100224030ustar00rootroot00000000000000import os from typing import Optional, Tuple import torch from torch import Tensor from torchaudio._internal import ( module_utils as _mod_utils, misc_ops as _misc_ops, ) from . import common from .common import SignalInfo, EncodingInfo if _mod_utils.is_module_available('soundfile'): import soundfile _subtype_to_precision = { 'PCM_S8': 8, 'PCM_16': 16, 'PCM_24': 24, 'PCM_32': 32, 'PCM_U8': 8 } @_mod_utils.requires_module('soundfile') @common._impl_load def load(filepath: str, out: Optional[Tensor] = None, normalization: Optional[bool] = True, channels_first: Optional[bool] = True, num_frames: int = 0, offset: int = 0, signalinfo: SignalInfo = None, encodinginfo: EncodingInfo = None, filetype: Optional[str] = None) -> Tuple[Tensor, int]: r"""See torchaudio.load""" assert out is None assert normalization assert signalinfo is None assert encodinginfo is None # stringify if `pathlib.Path` (noop if already `str`) filepath = str(filepath) # check if valid file if not os.path.isfile(filepath): raise OSError("{} not found or is a directory".format(filepath)) if num_frames < -1: raise ValueError("Expected value for num_samples -1 (entire file) or >=0") if num_frames == 0: num_frames = -1 if offset < 0: raise ValueError("Expected positive offset value") # initialize output tensor # TODO call libsoundfile directly to avoid numpy out, sample_rate = soundfile.read( filepath, frames=num_frames, start=offset, dtype="float32", always_2d=True ) out = torch.from_numpy(out).t() if not channels_first: out = out.t() # normalize if needed # _audio_normalization(out, normalization) return out, sample_rate @_mod_utils.requires_module('soundfile') @_mod_utils.deprecated('Please use "torchaudio.load".', '0.9.0') @common._impl_load_wav def load_wav(filepath, **kwargs): kwargs['normalization'] = 1 << 16 return load(filepath, **kwargs) @_mod_utils.requires_module('soundfile') @common._impl_save def save(filepath: str, src: Tensor, sample_rate: int, precision: int = 16, channels_first: bool = True) -> None: r"""See torchaudio.save""" ch_idx, len_idx = (0, 1) if channels_first else (1, 0) # check if save directory exists abs_dirpath = os.path.dirname(os.path.abspath(filepath)) if not os.path.isdir(abs_dirpath): raise OSError("Directory does not exist: {}".format(abs_dirpath)) # check that src is a CPU tensor _misc_ops.check_input(src) # Check/Fix shape of source data if src.dim() == 1: # 1d tensors as assumed to be mono signals src.unsqueeze_(ch_idx) elif src.dim() > 2 or src.size(ch_idx) > 16: # assumes num_channels < 16 raise ValueError( "Expected format where C < 16, but found {}".format(src.size())) if channels_first: src = src.t() if src.dtype == torch.int64: # Soundfile doesn't support int64 src = src.type(torch.int32) precision = "PCM_S8" if precision == 8 else "PCM_" + str(precision) return soundfile.write(filepath, src, sample_rate, precision) @_mod_utils.requires_module('soundfile') @common._impl_info def info(filepath: str) -> Tuple[SignalInfo, EncodingInfo]: r"""See torchaudio.info""" sfi = soundfile.info(filepath) precision = _subtype_to_precision[sfi.subtype] si = SignalInfo(sfi.channels, sfi.samplerate, precision, sfi.frames) ei = EncodingInfo(bits_per_sample=precision) return si, ei audio-0.7.2/torchaudio/backend/sox_backend.py000066400000000000000000000244211376444676100212300ustar00rootroot00000000000000import os.path from typing import Any, Optional, Tuple import torch from torch import Tensor from torchaudio._internal import ( module_utils as _mod_utils, misc_ops as _misc_ops, ) from . import common from .common import SignalInfo, EncodingInfo if _mod_utils.is_module_available('torchaudio._torchaudio'): from torchaudio import _torchaudio @_mod_utils.requires_module('torchaudio._torchaudio') @common._impl_load def load(filepath: str, out: Optional[Tensor] = None, normalization: bool = True, channels_first: bool = True, num_frames: int = 0, offset: int = 0, signalinfo: SignalInfo = None, encodinginfo: EncodingInfo = None, filetype: Optional[str] = None) -> Tuple[Tensor, int]: r"""See torchaudio.load""" # stringify if `pathlib.Path` (noop if already `str`) filepath = str(filepath) # check if valid file if not os.path.isfile(filepath): raise OSError("{} not found or is a directory".format(filepath)) # initialize output tensor if out is not None: _misc_ops.check_input(out) else: out = torch.FloatTensor() if num_frames < -1: raise ValueError("Expected value for num_samples -1 (entire file) or >=0") if offset < 0: raise ValueError("Expected positive offset value") sample_rate = _torchaudio.read_audio_file( filepath, out, channels_first, num_frames, offset, signalinfo, encodinginfo, filetype ) # normalize if needed _misc_ops.normalize_audio(out, normalization) return out, sample_rate @_mod_utils.requires_module('torchaudio._torchaudio') @_mod_utils.deprecated('Please use "torchaudio.load".', '0.9.0') @common._impl_load_wav def load_wav(filepath, **kwargs): kwargs['normalization'] = 1 << 16 return load(filepath, **kwargs) @_mod_utils.requires_module('torchaudio._torchaudio') @common._impl_save def save(filepath: str, src: Tensor, sample_rate: int, precision: int = 16, channels_first: bool = True) -> None: r"""See torchaudio.save""" si = sox_signalinfo_t() ch_idx = 0 if channels_first else 1 si.rate = sample_rate si.channels = 1 if src.dim() == 1 else src.size(ch_idx) si.length = src.numel() si.precision = precision return save_encinfo(filepath, src, channels_first, si) @_mod_utils.requires_module('torchaudio._torchaudio') @common._impl_info def info(filepath: str) -> Tuple[SignalInfo, EncodingInfo]: r"""See torchaudio.info""" return _torchaudio.get_info(filepath) @_mod_utils.requires_module('torchaudio._torchaudio') def save_encinfo(filepath: str, src: Tensor, channels_first: bool = True, signalinfo: Optional[SignalInfo] = None, encodinginfo: Optional[EncodingInfo] = None, filetype: Optional[str] = None) -> None: r"""Saves a tensor of an audio signal to disk as a standard format like mp3, wav, etc. Args: filepath (str): Path to audio file src (Tensor): An input 2D tensor of shape `[C x L]` or `[L x C]` where L is the number of audio frames, C is the number of channels channels_first (bool, optional): Set channels first or length first in result. (Default: ``True``) signalinfo (sox_signalinfo_t, optional): A sox_signalinfo_t type, which could be helpful if the audio type cannot be automatically determined (Default: ``None``). encodinginfo (sox_encodinginfo_t, optional): A sox_encodinginfo_t type, which could be set if the audio type cannot be automatically determined (Default: ``None``). filetype (str, optional): A filetype or extension to be set if sox cannot determine it automatically. (Default: ``None``) Example >>> data, sample_rate = torchaudio.load('foo.mp3') >>> torchaudio.save('foo.wav', data, sample_rate) """ ch_idx, len_idx = (0, 1) if channels_first else (1, 0) # check if save directory exists abs_dirpath = os.path.dirname(os.path.abspath(filepath)) if not os.path.isdir(abs_dirpath): raise OSError("Directory does not exist: {}".format(abs_dirpath)) # check that src is a CPU tensor _misc_ops.check_input(src) # Check/Fix shape of source data if src.dim() == 1: # 1d tensors as assumed to be mono signals src.unsqueeze_(ch_idx) elif src.dim() > 2 or src.size(ch_idx) > 16: # assumes num_channels < 16 raise ValueError( "Expected format where C < 16, but found {}".format(src.size())) # sox stores the sample rate as a float, though practically sample rates are almost always integers # convert integers to floats if signalinfo: if signalinfo.rate and not isinstance(signalinfo.rate, float): if float(signalinfo.rate) == signalinfo.rate: signalinfo.rate = float(signalinfo.rate) else: raise TypeError('Sample rate should be a float or int') # check if the bit precision (i.e. bits per sample) is an integer if signalinfo.precision and not isinstance(signalinfo.precision, int): if int(signalinfo.precision) == signalinfo.precision: signalinfo.precision = int(signalinfo.precision) else: raise TypeError('Bit precision should be an integer') # programs such as librosa normalize the signal, unnormalize if detected if src.min() >= -1.0 and src.max() <= 1.0: src = src * (1 << 31) src = src.long() # set filetype and allow for files with no extensions extension = os.path.splitext(filepath)[1] filetype = extension[1:] if len(extension) > 0 else filetype # transpose from C x L -> L x C if channels_first: src = src.transpose(1, 0) # save data to file src = src.contiguous() _torchaudio.write_audio_file(filepath, src, signalinfo, encodinginfo, filetype) @_mod_utils.requires_module('torchaudio._torchaudio') def sox_signalinfo_t() -> SignalInfo: r"""Create a sox_signalinfo_t object. This object can be used to set the sample rate, number of channels, length, bit precision and headroom multiplier primarily for effects Returns: sox_signalinfo_t(object) - rate (float), sample rate as a float, practically will likely be an integer float - channel (int), number of audio channels - precision (int), bit precision - length (int), length of audio in samples * channels, 0 for unspecified and -1 for unknown - mult (float, optional), headroom multiplier for effects and ``None`` for no multiplier Example >>> si = torchaudio.sox_signalinfo_t() >>> si.channels = 1 >>> si.rate = 16000. >>> si.precision = 16 >>> si.length = 0 """ return _torchaudio.sox_signalinfo_t() @_mod_utils.requires_module('torchaudio._torchaudio') def sox_encodinginfo_t() -> EncodingInfo: r"""Create a sox_encodinginfo_t object. This object can be used to set the encoding type, bit precision, compression factor, reverse bytes, reverse nibbles, reverse bits and endianness. This can be used in an effects chain to encode the final output or to save a file with a specific encoding. For example, one could use the sox ulaw encoding to do 8-bit ulaw encoding. Note in a tensor output the result will be a 32-bit number, but number of unique values will be determined by the bit precision. Returns: sox_encodinginfo_t(object) - encoding (sox_encoding_t), output encoding - bits_per_sample (int), bit precision, same as `precision` in sox_signalinfo_t - compression (float), compression for lossy formats, 0.0 for default compression - reverse_bytes (sox_option_t), reverse bytes, use sox_option_default - reverse_nibbles (sox_option_t), reverse nibbles, use sox_option_default - reverse_bits (sox_option_t), reverse bytes, use sox_option_default - opposite_endian (sox_bool), change endianness, use sox_false Example >>> ei = torchaudio.sox_encodinginfo_t() >>> ei.encoding = torchaudio.get_sox_encoding_t(1) >>> ei.bits_per_sample = 16 >>> ei.compression = 0 >>> ei.reverse_bytes = torchaudio.get_sox_option_t(2) >>> ei.reverse_nibbles = torchaudio.get_sox_option_t(2) >>> ei.reverse_bits = torchaudio.get_sox_option_t(2) >>> ei.opposite_endian = torchaudio.get_sox_bool(0) """ ei = _torchaudio.sox_encodinginfo_t() sdo = get_sox_option_t(2) # sox_default_option ei.reverse_bytes = sdo ei.reverse_nibbles = sdo ei.reverse_bits = sdo return ei @_mod_utils.requires_module('torchaudio._torchaudio') def get_sox_encoding_t(i: int = None) -> EncodingInfo: r"""Get enum of sox_encoding_t for sox encodings. Args: i (int, optional): Choose type or get a dict with all possible options use ``__members__`` to see all options when not specified. (Default: ``None``) Returns: sox_encoding_t: A sox_encoding_t type for output encoding """ if i is None: # one can see all possible values using the .__members__ attribute return _torchaudio.sox_encoding_t else: return _torchaudio.sox_encoding_t(i) @_mod_utils.requires_module('torchaudio._torchaudio') def get_sox_option_t(i: int = 2) -> Any: r"""Get enum of sox_option_t for sox encodinginfo options. Args: i (int, optional): Choose type or get a dict with all possible options use ``__members__`` to see all options when not specified. (Default: ``sox_option_default`` or ``2``) Returns: sox_option_t: A sox_option_t type """ if i is None: return _torchaudio.sox_option_t else: return _torchaudio.sox_option_t(i) @_mod_utils.requires_module('torchaudio._torchaudio') def get_sox_bool(i: int = 0) -> Any: r"""Get enum of sox_bool for sox encodinginfo options. Args: i (int, optional): Choose type or get a dict with all possible options use ``__members__`` to see all options when not specified. (Default: ``sox_false`` or ``0``) Returns: sox_bool: A sox_bool type """ if i is None: return _torchaudio.sox_bool else: return _torchaudio.sox_bool(i) audio-0.7.2/torchaudio/backend/sox_io_backend.py000066400000000000000000000167451376444676100217310ustar00rootroot00000000000000from typing import Tuple, Optional import torch from torchaudio._internal import ( module_utils as _mod_utils, ) from .common import AudioMetaData @_mod_utils.requires_module('torchaudio._torchaudio') def info(filepath: str) -> AudioMetaData: """Get signal information of an audio file. Args: filepath (str or pathlib.Path): Path to audio file. This function also handles ``pathlib.Path`` objects, but is annotated as ``str`` for TorchScript compatibility. Returns: AudioMetaData: Metadata of the given audio. """ # Cast to str in case type is `pathlib.Path` filepath = str(filepath) sinfo = torch.ops.torchaudio.sox_io_get_info(filepath) return AudioMetaData(sinfo.get_sample_rate(), sinfo.get_num_frames(), sinfo.get_num_channels()) @_mod_utils.requires_module('torchaudio._torchaudio') def load( filepath: str, frame_offset: int = 0, num_frames: int = -1, normalize: bool = True, channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Load audio data from file. Note: This function can handle all the codecs that underlying libsox can handle, however it is tested on the following formats; * WAV * 32-bit floating-point * 32-bit signed integer * 16-bit signed integer * 8-bit unsigned integer * MP3 * FLAC * OGG/VORBIS * OPUS * SPHERE To load ``MP3``, ``FLAC``, ``OGG/VORBIS``, ``OPUS`` and other codecs ``libsox`` does not handle natively, your installation of ``torchaudio`` has to be linked to ``libsox`` and corresponding codec libraries such as ``libmad`` or ``libmp3lame`` etc. By default (``normalize=True``, ``channels_first=True``), this function returns Tensor with ``float32`` dtype and the shape of ``[channel, time]``. The samples are normalized to fit in the range of ``[-1.0, 1.0]``. When the input format is WAV with integer type, such as 32-bit signed integer, 16-bit signed integer and 8-bit unsigned integer (24-bit signed integer is not supported), by providing ``normalize=False``, this function can return integer Tensor, where the samples are expressed within the whole range of the corresponding dtype, that is, ``int32`` tensor for 32-bit signed PCM, ``int16`` for 16-bit signed PCM and ``uint8`` for 8-bit unsigned PCM. ``normalize`` parameter has no effect on 32-bit floating-point WAV and other formats, such as ``flac`` and ``mp3``. For these formats, this function always returns ``float32`` Tensor with values normalized to ``[-1.0, 1.0]``. Args: filepath (str or pathlib.Path): Path to audio file. This function also handles ``pathlib.Path`` objects, but is annotated as ``str`` for TorchScript compiler compatibility. frame_offset (int): Number of frames to skip before start reading data. num_frames (int): Maximum number of frames to read. ``-1`` reads all the remaining samples, starting from ``frame_offset``. This function may return the less number of frames if there is not enough frames in the given file. normalize (bool): When ``True``, this function always return ``float32``, and sample values are normalized to ``[-1.0, 1.0]``. If input file is integer WAV, giving ``False`` will change the resulting Tensor type to integer type. This argument has no effect for formats other than integer WAV type. channels_first (bool): When True, the returned Tensor has dimension ``[channel, time]``. Otherwise, the returned Tensor's dimension is ``[time, channel]``. Returns: torch.Tensor: If the input file has integer wav format and normalization is off, then it has integer type, else ``float32`` type. If ``channels_first=True``, it has ``[channel, time]`` else ``[time, channel]``. """ # Cast to str in case type is `pathlib.Path` filepath = str(filepath) signal = torch.ops.torchaudio.sox_io_load_audio_file( filepath, frame_offset, num_frames, normalize, channels_first) return signal.get_tensor(), signal.get_sample_rate() @_mod_utils.requires_module('torchaudio._torchaudio') def save( filepath: str, src: torch.Tensor, sample_rate: int, channels_first: bool = True, compression: Optional[float] = None, ): """Save audio data to file. Note: Supported formats are; * WAV * 32-bit floating-point * 32-bit signed integer * 16-bit signed integer * 8-bit unsigned integer * MP3 * FLAC * OGG/VORBIS * SPHERE To save ``MP3``, ``FLAC``, ``OGG/VORBIS``, and other codecs ``libsox`` does not handle natively, your installation of ``torchaudio`` has to be linked to ``libsox`` and corresponding codec libraries such as ``libmad`` or ``libmp3lame`` etc. Args: filepath (str or pathlib.Path): Path to save file. This function also handles ``pathlib.Path`` objects, but is annotated as ``str`` for TorchScript compiler compatibility. tensor (torch.Tensor): Audio data to save. must be 2D tensor. sample_rate (int): sampling rate channels_first (bool): If ``True``, the given tensor is interpreted as ``[channel, time]``, otherwise ``[time, channel]``. compression (Optional[float]): Used for formats other than WAV. This corresponds to ``-C`` option of ``sox`` command. * | ``MP3``: Either bitrate (in ``kbps``) with quality factor, such as ``128.2``, or | VBR encoding with quality factor such as ``-4.2``. Default: ``-4.5``. * | ``FLAC``: compression level. Whole number from ``0`` to ``8``. | ``8`` is default and highest compression. * | ``OGG/VORBIS``: number from ``-1`` to ``10``; ``-1`` is the highest compression | and lowest quality. Default: ``3``. See the detail at http://sox.sourceforge.net/soxformat.html. """ # Cast to str in case type is `pathlib.Path` filepath = str(filepath) if compression is None: ext = str(filepath).split('.')[-1].lower() if ext in ['wav', 'sph']: compression = 0. elif ext == 'mp3': compression = -4.5 elif ext == 'flac': compression = 8. elif ext in ['ogg', 'vorbis']: compression = 3. else: raise RuntimeError(f'Unsupported file type: "{ext}"') signal = torch.classes.torchaudio.TensorSignal(src, sample_rate, channels_first) torch.ops.torchaudio.sox_io_save_audio_file(filepath, signal, compression) @_mod_utils.requires_module('torchaudio._torchaudio') @_mod_utils.deprecated('Please use "torchaudio.load".', '0.9.0') def load_wav( filepath: str, frame_offset: int = 0, num_frames: int = -1, channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Load wave file. This function is defined only for the purpose of compatibility against other backend for simple usecases, such as ``torchaudio.load_wav(filepath)``. The implementation is same as :py:func:`load`. """ return load(filepath, frame_offset, num_frames, normalize=False, channels_first=channels_first) audio-0.7.2/torchaudio/backend/utils.py000066400000000000000000000067401376444676100201140ustar00rootroot00000000000000"""Defines utilities for switching audio backends""" import warnings from typing import Optional, List import torchaudio from torchaudio._internal.module_utils import is_module_available from . import ( no_backend, sox_backend, sox_io_backend, soundfile_backend, _soundfile_backend, ) __all__ = [ 'list_audio_backends', 'get_audio_backend', 'set_audio_backend', ] def list_audio_backends() -> List[str]: """List available backends Returns: List[str]: The list of available backends. """ backends = [] if is_module_available('soundfile'): backends.append('soundfile') if is_module_available('torchaudio._torchaudio'): backends.append('sox') backends.append('sox_io') return backends def set_audio_backend(backend: Optional[str]): """Set the backend for I/O operation Args: backend (Optional[str]): Name of the backend. One of ``"sox"``, ``"sox_io"`` or ``"soundfile"`` based on availability of the system. If ``None`` is provided the current backend is unassigned. """ if backend is not None and backend not in list_audio_backends(): raise RuntimeError( f'Backend "{backend}" is not one of ' f'available backends: {list_audio_backends()}.') if backend is None: module = no_backend elif backend == 'sox': warnings.warn( '"sox" backend is being deprecated. ' 'The default backend will be changed to "sox_io" backend in 0.8.0 and ' '"sox" backend will be removed in 0.9.0. Please migrate to "sox_io" backend. ' 'Please refer to https://github.com/pytorch/audio/issues/903 for the detail.') module = sox_backend elif backend == 'sox_io': module = sox_io_backend elif backend == 'soundfile': if torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE: warnings.warn( 'The interface of "soundfile" backend is planned to change in 0.8.0 to ' 'match that of "sox_io" backend and the current interface will be removed in 0.9.0. ' 'To use the new interface, do ' '`torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE = False` ' 'before setting the backend to "soundfile". ' 'Please refer to https://github.com/pytorch/audio/issues/903 for the detail.' ) module = soundfile_backend else: module = _soundfile_backend else: raise NotImplementedError(f'Unexpected backend "{backend}"') for func in ['save', 'load', 'load_wav', 'info']: setattr(torchaudio, func, getattr(module, func)) def _init_audio_backend(): backends = list_audio_backends() if 'sox' in backends: set_audio_backend('sox') elif 'soundfile' in backends: set_audio_backend('soundfile') else: warnings.warn('No audio backend is available.') set_audio_backend(None) def get_audio_backend() -> Optional[str]: """Get the name of the current backend Returns: Optional[str]: The name of the current backend or ``None`` if no backend is assigned. """ if torchaudio.load == no_backend.load: return None if torchaudio.load == sox_backend.load: return 'sox' if torchaudio.load == sox_io_backend.load: return 'sox_io' if torchaudio.load in [soundfile_backend.load, _soundfile_backend.load]: return 'soundfile' raise ValueError('Unknown backend.') audio-0.7.2/torchaudio/compliance/000077500000000000000000000000001376444676100171165ustar00rootroot00000000000000audio-0.7.2/torchaudio/compliance/__init__.py000066400000000000000000000000241376444676100212230ustar00rootroot00000000000000from . import kaldi audio-0.7.2/torchaudio/compliance/kaldi.py000066400000000000000000001402601376444676100205570ustar00rootroot00000000000000from typing import Tuple import math import torch import torchaudio from torch import Tensor __all__ = [ 'get_mel_banks', 'inverse_mel_scale', 'inverse_mel_scale_scalar', 'mel_scale', 'mel_scale_scalar', 'spectrogram', 'fbank', 'mfcc', 'vtln_warp_freq', 'vtln_warp_mel_freq', 'resample_waveform', ] # numeric_limits::epsilon() 1.1920928955078125e-07 EPSILON = torch.tensor(torch.finfo(torch.float).eps) # 1 milliseconds = 0.001 seconds MILLISECONDS_TO_SECONDS = 0.001 # window types HAMMING = 'hamming' HANNING = 'hanning' POVEY = 'povey' RECTANGULAR = 'rectangular' BLACKMAN = 'blackman' WINDOWS = [HAMMING, HANNING, POVEY, RECTANGULAR, BLACKMAN] def _get_epsilon(device, dtype): return EPSILON.to(device=device, dtype=dtype) def _next_power_of_2(x: int) -> int: r"""Returns the smallest power of 2 that is greater than x """ return 1 if x == 0 else 2 ** (x - 1).bit_length() def _get_strided(waveform: Tensor, window_size: int, window_shift: int, snip_edges: bool) -> Tensor: r"""Given a waveform (1D tensor of size ``num_samples``), it returns a 2D tensor (m, ``window_size``) representing how the window is shifted along the waveform. Each row is a frame. Args: waveform (Tensor): Tensor of size ``num_samples`` window_size (int): Frame length window_shift (int): Frame shift snip_edges (bool): If True, end effects will be handled by outputting only frames that completely fit in the file, and the number of frames depends on the frame_length. If False, the number of frames depends only on the frame_shift, and we reflect the data at the ends. Returns: Tensor: 2D tensor of size (m, ``window_size``) where each row is a frame """ assert waveform.dim() == 1 num_samples = waveform.size(0) strides = (window_shift * waveform.stride(0), waveform.stride(0)) if snip_edges: if num_samples < window_size: return torch.empty((0, 0), dtype=waveform.dtype, device=waveform.device) else: m = 1 + (num_samples - window_size) // window_shift else: reversed_waveform = torch.flip(waveform, [0]) m = (num_samples + (window_shift // 2)) // window_shift pad = window_size // 2 - window_shift // 2 pad_right = reversed_waveform if pad > 0: # torch.nn.functional.pad returns [2,1,0,1,2] for 'reflect' # but we want [2, 1, 0, 0, 1, 2] pad_left = reversed_waveform[-pad:] waveform = torch.cat((pad_left, waveform, pad_right), dim=0) else: # pad is negative so we want to trim the waveform at the front waveform = torch.cat((waveform[-pad:], pad_right), dim=0) sizes = (m, window_size) return waveform.as_strided(sizes, strides) def _feature_window_function(window_type: str, window_size: int, blackman_coeff: float, device: torch.device, dtype: int, ) -> Tensor: r"""Returns a window function with the given type and size """ if window_type == HANNING: return torch.hann_window(window_size, periodic=False, device=device, dtype=dtype) elif window_type == HAMMING: return torch.hamming_window(window_size, periodic=False, alpha=0.54, beta=0.46, device=device, dtype=dtype) elif window_type == POVEY: # like hanning but goes to zero at edges return torch.hann_window(window_size, periodic=False, device=device, dtype=dtype).pow(0.85) elif window_type == RECTANGULAR: return torch.ones(window_size, device=device, dtype=dtype) elif window_type == BLACKMAN: a = 2 * math.pi / (window_size - 1) window_function = torch.arange(window_size, device=device, dtype=dtype) # can't use torch.blackman_window as they use different coefficients return (blackman_coeff - 0.5 * torch.cos(a * window_function) + (0.5 - blackman_coeff) * torch.cos(2 * a * window_function)).to(device=device, dtype=dtype) else: raise Exception('Invalid window type ' + window_type) def _get_log_energy(strided_input: Tensor, epsilon: Tensor, energy_floor: float) -> Tensor: r"""Returns the log energy of size (m) for a strided_input (m,*) """ device, dtype = strided_input.device, strided_input.dtype log_energy = torch.max(strided_input.pow(2).sum(1), epsilon).log() # size (m) if energy_floor == 0.0: return log_energy return torch.max( log_energy, torch.tensor(math.log(energy_floor), device=device, dtype=dtype)) def _get_waveform_and_window_properties(waveform: Tensor, channel: int, sample_frequency: float, frame_shift: float, frame_length: float, round_to_power_of_two: bool, preemphasis_coefficient: float) -> Tuple[Tensor, int, int, int]: r"""Gets the waveform and window properties """ channel = max(channel, 0) assert channel < waveform.size(0), ('Invalid channel {} for size {}'.format(channel, waveform.size(0))) waveform = waveform[channel, :] # size (n) window_shift = int(sample_frequency * frame_shift * MILLISECONDS_TO_SECONDS) window_size = int(sample_frequency * frame_length * MILLISECONDS_TO_SECONDS) padded_window_size = _next_power_of_2(window_size) if round_to_power_of_two else window_size assert 2 <= window_size <= len( waveform), ('choose a window size {} that is [2, {}]' .format(window_size, len(waveform))) assert 0 < window_shift, '`window_shift` must be greater than 0' assert padded_window_size % 2 == 0, 'the padded `window_size` must be divisible by two.' \ ' use `round_to_power_of_two` or change `frame_length`' assert 0. <= preemphasis_coefficient <= 1.0, '`preemphasis_coefficient` must be between [0,1]' assert sample_frequency > 0, '`sample_frequency` must be greater than zero' return waveform, window_shift, window_size, padded_window_size def _get_window(waveform: Tensor, padded_window_size: int, window_size: int, window_shift: int, window_type: str, blackman_coeff: float, snip_edges: bool, raw_energy: bool, energy_floor: float, dither: float, remove_dc_offset: bool, preemphasis_coefficient: float) -> Tuple[Tensor, Tensor]: r"""Gets a window and its log energy Returns: (Tensor, Tensor): strided_input of size (m, ``padded_window_size``) and signal_log_energy of size (m) """ device, dtype = waveform.device, waveform.dtype epsilon = _get_epsilon(device, dtype) # size (m, window_size) strided_input = _get_strided(waveform, window_size, window_shift, snip_edges) if dither != 0.0: # Returns a random number strictly between 0 and 1 x = torch.max(epsilon, torch.rand(strided_input.shape, device=device, dtype=dtype)) rand_gauss = torch.sqrt(-2 * x.log()) * torch.cos(2 * math.pi * x) strided_input = strided_input + rand_gauss * dither if remove_dc_offset: # Subtract each row/frame by its mean row_means = torch.mean(strided_input, dim=1).unsqueeze(1) # size (m, 1) strided_input = strided_input - row_means if raw_energy: # Compute the log energy of each row/frame before applying preemphasis and # window function signal_log_energy = _get_log_energy(strided_input, epsilon, energy_floor) # size (m) if preemphasis_coefficient != 0.0: # strided_input[i,j] -= preemphasis_coefficient * strided_input[i, max(0, j-1)] for all i,j offset_strided_input = torch.nn.functional.pad( strided_input.unsqueeze(0), (1, 0), mode='replicate').squeeze(0) # size (m, window_size + 1) strided_input = strided_input - preemphasis_coefficient * offset_strided_input[:, :-1] # Apply window_function to each row/frame window_function = _feature_window_function( window_type, window_size, blackman_coeff, device, dtype).unsqueeze(0) # size (1, window_size) strided_input = strided_input * window_function # size (m, window_size) # Pad columns with zero until we reach size (m, padded_window_size) if padded_window_size != window_size: padding_right = padded_window_size - window_size strided_input = torch.nn.functional.pad( strided_input.unsqueeze(0), (0, padding_right), mode='constant', value=0).squeeze(0) # Compute energy after window function (not the raw one) if not raw_energy: signal_log_energy = _get_log_energy(strided_input, epsilon, energy_floor) # size (m) return strided_input, signal_log_energy def _subtract_column_mean(tensor: Tensor, subtract_mean: bool) -> Tensor: # subtracts the column mean of the tensor size (m, n) if subtract_mean=True # it returns size (m, n) if subtract_mean: col_means = torch.mean(tensor, dim=0).unsqueeze(0) tensor = tensor - col_means return tensor def spectrogram(waveform: Tensor, blackman_coeff: float = 0.42, channel: int = -1, dither: float = 0.0, energy_floor: float = 1.0, frame_length: float = 25.0, frame_shift: float = 10.0, min_duration: float = 0.0, preemphasis_coefficient: float = 0.97, raw_energy: bool = True, remove_dc_offset: bool = True, round_to_power_of_two: bool = True, sample_frequency: float = 16000.0, snip_edges: bool = True, subtract_mean: bool = False, window_type: str = POVEY) -> Tensor: r"""Create a spectrogram from a raw audio signal. This matches the input/output of Kaldi's compute-spectrogram-feats. Args: waveform (Tensor): Tensor of audio of size (c, n) where c is in the range [0,2) blackman_coeff (float, optional): Constant coefficient for generalized Blackman window. (Default: ``0.42``) channel (int, optional): Channel to extract (-1 -> expect mono, 0 -> left, 1 -> right) (Default: ``-1``) dither (float, optional): Dithering constant (0.0 means no dither). If you turn this off, you should set the energy_floor option, e.g. to 1.0 or 0.1 (Default: ``0.0``) energy_floor (float, optional): Floor on energy (absolute, not relative) in Spectrogram computation. Caution: this floor is applied to the zeroth component, representing the total signal energy. The floor on the individual spectrogram elements is fixed at std::numeric_limits::epsilon(). (Default: ``1.0``) frame_length (float, optional): Frame length in milliseconds (Default: ``25.0``) frame_shift (float, optional): Frame shift in milliseconds (Default: ``10.0``) min_duration (float, optional): Minimum duration of segments to process (in seconds). (Default: ``0.0``) preemphasis_coefficient (float, optional): Coefficient for use in signal preemphasis (Default: ``0.97``) raw_energy (bool, optional): If True, compute energy before preemphasis and windowing (Default: ``True``) remove_dc_offset (bool, optional): Subtract mean from waveform on each frame (Default: ``True``) round_to_power_of_two (bool, optional): If True, round window size to power of two by zero-padding input to FFT. (Default: ``True``) sample_frequency (float, optional): Waveform data sample frequency (must match the waveform file, if specified there) (Default: ``16000.0``) snip_edges (bool, optional): If True, end effects will be handled by outputting only frames that completely fit in the file, and the number of frames depends on the frame_length. If False, the number of frames depends only on the frame_shift, and we reflect the data at the ends. (Default: ``True``) subtract_mean (bool, optional): Subtract mean of each feature file [CMS]; not recommended to do it this way. (Default: ``False``) window_type (str, optional): Type of window ('hamming'|'hanning'|'povey'|'rectangular'|'blackman') (Default: ``'povey'``) Returns: Tensor: A spectrogram identical to what Kaldi would output. The shape is (m, ``padded_window_size // 2 + 1``) where m is calculated in _get_strided """ device, dtype = waveform.device, waveform.dtype epsilon = _get_epsilon(device, dtype) waveform, window_shift, window_size, padded_window_size = _get_waveform_and_window_properties( waveform, channel, sample_frequency, frame_shift, frame_length, round_to_power_of_two, preemphasis_coefficient) if len(waveform) < min_duration * sample_frequency: # signal is too short return torch.empty(0) strided_input, signal_log_energy = _get_window( waveform, padded_window_size, window_size, window_shift, window_type, blackman_coeff, snip_edges, raw_energy, energy_floor, dither, remove_dc_offset, preemphasis_coefficient) # size (m, padded_window_size // 2 + 1, 2) fft = torch.rfft(strided_input, 1, normalized=False, onesided=True) # Convert the FFT into a power spectrum power_spectrum = torch.max(fft.pow(2).sum(2), epsilon).log() # size (m, padded_window_size // 2 + 1) power_spectrum[:, 0] = signal_log_energy power_spectrum = _subtract_column_mean(power_spectrum, subtract_mean) return power_spectrum def inverse_mel_scale_scalar(mel_freq: float) -> float: return 700.0 * (math.exp(mel_freq / 1127.0) - 1.0) def inverse_mel_scale(mel_freq: Tensor) -> Tensor: return 700.0 * ((mel_freq / 1127.0).exp() - 1.0) def mel_scale_scalar(freq: float) -> float: return 1127.0 * math.log(1.0 + freq / 700.0) def mel_scale(freq: Tensor) -> Tensor: return 1127.0 * (1.0 + freq / 700.0).log() def vtln_warp_freq(vtln_low_cutoff: float, vtln_high_cutoff: float, low_freq: float, high_freq: float, vtln_warp_factor: float, freq: Tensor) -> Tensor: r"""This computes a VTLN warping function that is not the same as HTK's one, but has similar inputs (this function has the advantage of never producing empty bins). This function computes a warp function F(freq), defined between low_freq and high_freq inclusive, with the following properties: F(low_freq) == low_freq F(high_freq) == high_freq The function is continuous and piecewise linear with two inflection points. The lower inflection point (measured in terms of the unwarped frequency) is at frequency l, determined as described below. The higher inflection point is at a frequency h, determined as described below. If l <= f <= h, then F(f) = f/vtln_warp_factor. If the higher inflection point (measured in terms of the unwarped frequency) is at h, then max(h, F(h)) == vtln_high_cutoff. Since (by the last point) F(h) == h/vtln_warp_factor, then max(h, h/vtln_warp_factor) == vtln_high_cutoff, so h = vtln_high_cutoff / max(1, 1/vtln_warp_factor). = vtln_high_cutoff * min(1, vtln_warp_factor). If the lower inflection point (measured in terms of the unwarped frequency) is at l, then min(l, F(l)) == vtln_low_cutoff This implies that l = vtln_low_cutoff / min(1, 1/vtln_warp_factor) = vtln_low_cutoff * max(1, vtln_warp_factor) Args: vtln_low_cutoff (float): Lower frequency cutoffs for VTLN vtln_high_cutoff (float): Upper frequency cutoffs for VTLN low_freq (float): Lower frequency cutoffs in mel computation high_freq (float): Upper frequency cutoffs in mel computation vtln_warp_factor (float): Vtln warp factor freq (Tensor): given frequency in Hz Returns: Tensor: Freq after vtln warp """ assert vtln_low_cutoff > low_freq, 'be sure to set the vtln_low option higher than low_freq' assert vtln_high_cutoff < high_freq, 'be sure to set the vtln_high option lower than high_freq [or negative]' l = vtln_low_cutoff * max(1.0, vtln_warp_factor) h = vtln_high_cutoff * min(1.0, vtln_warp_factor) scale = 1.0 / vtln_warp_factor Fl = scale * l # F(l) Fh = scale * h # F(h) assert l > low_freq and h < high_freq # slope of left part of the 3-piece linear function scale_left = (Fl - low_freq) / (l - low_freq) # [slope of center part is just "scale"] # slope of right part of the 3-piece linear function scale_right = (high_freq - Fh) / (high_freq - h) res = torch.empty_like(freq) outside_low_high_freq = torch.lt(freq, low_freq) | torch.gt(freq, high_freq) # freq < low_freq || freq > high_freq before_l = torch.lt(freq, l) # freq < l before_h = torch.lt(freq, h) # freq < h after_h = torch.ge(freq, h) # freq >= h # order of operations matter here (since there is overlapping frequency regions) res[after_h] = high_freq + scale_right * (freq[after_h] - high_freq) res[before_h] = scale * freq[before_h] res[before_l] = low_freq + scale_left * (freq[before_l] - low_freq) res[outside_low_high_freq] = freq[outside_low_high_freq] return res def vtln_warp_mel_freq(vtln_low_cutoff: float, vtln_high_cutoff: float, low_freq, high_freq: float, vtln_warp_factor: float, mel_freq: Tensor) -> Tensor: r""" Args: vtln_low_cutoff (float): Lower frequency cutoffs for VTLN vtln_high_cutoff (float): Upper frequency cutoffs for VTLN low_freq (float): Lower frequency cutoffs in mel computation high_freq (float): Upper frequency cutoffs in mel computation vtln_warp_factor (float): Vtln warp factor mel_freq (Tensor): Given frequency in Mel Returns: Tensor: ``mel_freq`` after vtln warp """ return mel_scale(vtln_warp_freq(vtln_low_cutoff, vtln_high_cutoff, low_freq, high_freq, vtln_warp_factor, inverse_mel_scale(mel_freq))) def get_mel_banks(num_bins: int, window_length_padded: int, sample_freq: float, low_freq: float, high_freq: float, vtln_low: float, vtln_high: float, vtln_warp_factor: float) -> Tuple[Tensor, Tensor]: """ Returns: (Tensor, Tensor): The tuple consists of ``bins`` (which is melbank of size (``num_bins``, ``num_fft_bins``)) and ``center_freqs`` (which is center frequencies of bins of size (``num_bins``)). """ assert num_bins > 3, 'Must have at least 3 mel bins' assert window_length_padded % 2 == 0 num_fft_bins = window_length_padded / 2 nyquist = 0.5 * sample_freq if high_freq <= 0.0: high_freq += nyquist assert (0.0 <= low_freq < nyquist) and (0.0 < high_freq <= nyquist) and (low_freq < high_freq), \ ('Bad values in options: low-freq {} and high-freq {} vs. nyquist {}'.format(low_freq, high_freq, nyquist)) # fft-bin width [think of it as Nyquist-freq / half-window-length] fft_bin_width = sample_freq / window_length_padded mel_low_freq = mel_scale_scalar(low_freq) mel_high_freq = mel_scale_scalar(high_freq) # divide by num_bins+1 in next line because of end-effects where the bins # spread out to the sides. mel_freq_delta = (mel_high_freq - mel_low_freq) / (num_bins + 1) if vtln_high < 0.0: vtln_high += nyquist assert vtln_warp_factor == 1.0 or ((low_freq < vtln_low < high_freq) and (0.0 < vtln_high < high_freq) and (vtln_low < vtln_high)), \ ('Bad values in options: vtln-low {} and vtln-high {}, versus ' 'low-freq {} and high-freq {}'.format(vtln_low, vtln_high, low_freq, high_freq)) bin = torch.arange(num_bins).unsqueeze(1) left_mel = mel_low_freq + bin * mel_freq_delta # size(num_bins, 1) center_mel = mel_low_freq + (bin + 1.0) * mel_freq_delta # size(num_bins, 1) right_mel = mel_low_freq + (bin + 2.0) * mel_freq_delta # size(num_bins, 1) if vtln_warp_factor != 1.0: left_mel = vtln_warp_mel_freq(vtln_low, vtln_high, low_freq, high_freq, vtln_warp_factor, left_mel) center_mel = vtln_warp_mel_freq(vtln_low, vtln_high, low_freq, high_freq, vtln_warp_factor, center_mel) right_mel = vtln_warp_mel_freq(vtln_low, vtln_high, low_freq, high_freq, vtln_warp_factor, right_mel) center_freqs = inverse_mel_scale(center_mel) # size (num_bins) # size(1, num_fft_bins) mel = mel_scale(fft_bin_width * torch.arange(num_fft_bins)).unsqueeze(0) # size (num_bins, num_fft_bins) up_slope = (mel - left_mel) / (center_mel - left_mel) down_slope = (right_mel - mel) / (right_mel - center_mel) if vtln_warp_factor == 1.0: # left_mel < center_mel < right_mel so we can min the two slopes and clamp negative values bins = torch.max(torch.zeros(1), torch.min(up_slope, down_slope)) else: # warping can move the order of left_mel, center_mel, right_mel anywhere bins = torch.zeros_like(up_slope) up_idx = torch.gt(mel, left_mel) & torch.le(mel, center_mel) # left_mel < mel <= center_mel down_idx = torch.gt(mel, center_mel) & torch.lt(mel, right_mel) # center_mel < mel < right_mel bins[up_idx] = up_slope[up_idx] bins[down_idx] = down_slope[down_idx] return bins, center_freqs def fbank(waveform: Tensor, blackman_coeff: float = 0.42, channel: int = -1, dither: float = 0.0, energy_floor: float = 1.0, frame_length: float = 25.0, frame_shift: float = 10.0, high_freq: float = 0.0, htk_compat: bool = False, low_freq: float = 20.0, min_duration: float = 0.0, num_mel_bins: int = 23, preemphasis_coefficient: float = 0.97, raw_energy: bool = True, remove_dc_offset: bool = True, round_to_power_of_two: bool = True, sample_frequency: float = 16000.0, snip_edges: bool = True, subtract_mean: bool = False, use_energy: bool = False, use_log_fbank: bool = True, use_power: bool = True, vtln_high: float = -500.0, vtln_low: float = 100.0, vtln_warp: float = 1.0, window_type: str = POVEY) -> Tensor: r"""Create a fbank from a raw audio signal. This matches the input/output of Kaldi's compute-fbank-feats. Args: waveform (Tensor): Tensor of audio of size (c, n) where c is in the range [0,2) blackman_coeff (float, optional): Constant coefficient for generalized Blackman window. (Default: ``0.42``) channel (int, optional): Channel to extract (-1 -> expect mono, 0 -> left, 1 -> right) (Default: ``-1``) dither (float, optional): Dithering constant (0.0 means no dither). If you turn this off, you should set the energy_floor option, e.g. to 1.0 or 0.1 (Default: ``0.0``) energy_floor (float, optional): Floor on energy (absolute, not relative) in Spectrogram computation. Caution: this floor is applied to the zeroth component, representing the total signal energy. The floor on the individual spectrogram elements is fixed at std::numeric_limits::epsilon(). (Default: ``1.0``) frame_length (float, optional): Frame length in milliseconds (Default: ``25.0``) frame_shift (float, optional): Frame shift in milliseconds (Default: ``10.0``) high_freq (float, optional): High cutoff frequency for mel bins (if <= 0, offset from Nyquist) (Default: ``0.0``) htk_compat (bool, optional): If true, put energy last. Warning: not sufficient to get HTK compatible features (need to change other parameters). (Default: ``False``) low_freq (float, optional): Low cutoff frequency for mel bins (Default: ``20.0``) min_duration (float, optional): Minimum duration of segments to process (in seconds). (Default: ``0.0``) num_mel_bins (int, optional): Number of triangular mel-frequency bins (Default: ``23``) preemphasis_coefficient (float, optional): Coefficient for use in signal preemphasis (Default: ``0.97``) raw_energy (bool, optional): If True, compute energy before preemphasis and windowing (Default: ``True``) remove_dc_offset (bool, optional): Subtract mean from waveform on each frame (Default: ``True``) round_to_power_of_two (bool, optional): If True, round window size to power of two by zero-padding input to FFT. (Default: ``True``) sample_frequency (float, optional): Waveform data sample frequency (must match the waveform file, if specified there) (Default: ``16000.0``) snip_edges (bool, optional): If True, end effects will be handled by outputting only frames that completely fit in the file, and the number of frames depends on the frame_length. If False, the number of frames depends only on the frame_shift, and we reflect the data at the ends. (Default: ``True``) subtract_mean (bool, optional): Subtract mean of each feature file [CMS]; not recommended to do it this way. (Default: ``False``) use_energy (bool, optional): Add an extra dimension with energy to the FBANK output. (Default: ``False``) use_log_fbank (bool, optional):If true, produce log-filterbank, else produce linear. (Default: ``True``) use_power (bool, optional): If true, use power, else use magnitude. (Default: ``True``) vtln_high (float, optional): High inflection point in piecewise linear VTLN warping function (if negative, offset from high-mel-freq (Default: ``-500.0``) vtln_low (float, optional): Low inflection point in piecewise linear VTLN warping function (Default: ``100.0``) vtln_warp (float, optional): Vtln warp factor (only applicable if vtln_map not specified) (Default: ``1.0``) window_type (str, optional): Type of window ('hamming'|'hanning'|'povey'|'rectangular'|'blackman') (Default: ``'povey'``) Returns: Tensor: A fbank identical to what Kaldi would output. The shape is (m, ``num_mel_bins + use_energy``) where m is calculated in _get_strided """ device, dtype = waveform.device, waveform.dtype waveform, window_shift, window_size, padded_window_size = _get_waveform_and_window_properties( waveform, channel, sample_frequency, frame_shift, frame_length, round_to_power_of_two, preemphasis_coefficient) if len(waveform) < min_duration * sample_frequency: # signal is too short return torch.empty(0, device=device, dtype=dtype) # strided_input, size (m, padded_window_size) and signal_log_energy, size (m) strided_input, signal_log_energy = _get_window( waveform, padded_window_size, window_size, window_shift, window_type, blackman_coeff, snip_edges, raw_energy, energy_floor, dither, remove_dc_offset, preemphasis_coefficient) # size (m, padded_window_size // 2 + 1, 2) fft = torch.rfft(strided_input, 1, normalized=False, onesided=True) power_spectrum = fft.pow(2).sum(2) # size (m, padded_window_size // 2 + 1) if not use_power: power_spectrum = power_spectrum.pow(0.5) # size (num_mel_bins, padded_window_size // 2) mel_energies, _ = get_mel_banks(num_mel_bins, padded_window_size, sample_frequency, low_freq, high_freq, vtln_low, vtln_high, vtln_warp) mel_energies = mel_energies.to(device=device, dtype=dtype) # pad right column with zeros and add dimension, size (num_mel_bins, padded_window_size // 2 + 1) mel_energies = torch.nn.functional.pad(mel_energies, (0, 1), mode='constant', value=0) # sum with mel fiterbanks over the power spectrum, size (m, num_mel_bins) mel_energies = torch.mm(power_spectrum, mel_energies.T) if use_log_fbank: # avoid log of zero (which should be prevented anyway by dithering) mel_energies = torch.max(mel_energies, _get_epsilon(device, dtype)).log() # if use_energy then add it as the last column for htk_compat == true else first column if use_energy: signal_log_energy = signal_log_energy.unsqueeze(1) # size (m, 1) # returns size (m, num_mel_bins + 1) if htk_compat: mel_energies = torch.cat((mel_energies, signal_log_energy), dim=1) else: mel_energies = torch.cat((signal_log_energy, mel_energies), dim=1) mel_energies = _subtract_column_mean(mel_energies, subtract_mean) return mel_energies def _get_dct_matrix(num_ceps: int, num_mel_bins: int) -> Tensor: # returns a dct matrix of size (num_mel_bins, num_ceps) # size (num_mel_bins, num_mel_bins) dct_matrix = torchaudio.functional.create_dct(num_mel_bins, num_mel_bins, 'ortho') # kaldi expects the first cepstral to be weighted sum of factor sqrt(1/num_mel_bins) # this would be the first column in the dct_matrix for torchaudio as it expects a # right multiply (which would be the first column of the kaldi's dct_matrix as kaldi # expects a left multiply e.g. dct_matrix * vector). dct_matrix[:, 0] = math.sqrt(1 / float(num_mel_bins)) dct_matrix = dct_matrix[:, :num_ceps] return dct_matrix def _get_lifter_coeffs(num_ceps: int, cepstral_lifter: float) -> Tensor: # returns size (num_ceps) # Compute liftering coefficients (scaling on cepstral coeffs) # coeffs are numbered slightly differently from HTK: the zeroth index is C0, which is not affected. i = torch.arange(num_ceps) return 1.0 + 0.5 * cepstral_lifter * torch.sin(math.pi * i / cepstral_lifter) def mfcc( waveform: Tensor, blackman_coeff: float = 0.42, cepstral_lifter: float = 22.0, channel: int = -1, dither: float = 0.0, energy_floor: float = 1.0, frame_length: float = 25.0, frame_shift: float = 10.0, high_freq: float = 0.0, htk_compat: bool = False, low_freq: float = 20.0, num_ceps: int = 13, min_duration: float = 0.0, num_mel_bins: int = 23, preemphasis_coefficient: float = 0.97, raw_energy: bool = True, remove_dc_offset: bool = True, round_to_power_of_two: bool = True, sample_frequency: float = 16000.0, snip_edges: bool = True, subtract_mean: bool = False, use_energy: bool = False, vtln_high: float = -500.0, vtln_low: float = 100.0, vtln_warp: float = 1.0, window_type: str = POVEY) -> Tensor: r"""Create a mfcc from a raw audio signal. This matches the input/output of Kaldi's compute-mfcc-feats. Args: waveform (Tensor): Tensor of audio of size (c, n) where c is in the range [0,2) blackman_coeff (float, optional): Constant coefficient for generalized Blackman window. (Default: ``0.42``) cepstral_lifter (float, optional): Constant that controls scaling of MFCCs (Default: ``22.0``) channel (int, optional): Channel to extract (-1 -> expect mono, 0 -> left, 1 -> right) (Default: ``-1``) dither (float, optional): Dithering constant (0.0 means no dither). If you turn this off, you should set the energy_floor option, e.g. to 1.0 or 0.1 (Default: ``0.0``) energy_floor (float, optional): Floor on energy (absolute, not relative) in Spectrogram computation. Caution: this floor is applied to the zeroth component, representing the total signal energy. The floor on the individual spectrogram elements is fixed at std::numeric_limits::epsilon(). (Default: ``1.0``) frame_length (float, optional): Frame length in milliseconds (Default: ``25.0``) frame_shift (float, optional): Frame shift in milliseconds (Default: ``10.0``) high_freq (float, optional): High cutoff frequency for mel bins (if <= 0, offset from Nyquist) (Default: ``0.0``) htk_compat (bool, optional): If true, put energy last. Warning: not sufficient to get HTK compatible features (need to change other parameters). (Default: ``False``) low_freq (float, optional): Low cutoff frequency for mel bins (Default: ``20.0``) num_ceps (int, optional): Number of cepstra in MFCC computation (including C0) (Default: ``13``) min_duration (float, optional): Minimum duration of segments to process (in seconds). (Default: ``0.0``) num_mel_bins (int, optional): Number of triangular mel-frequency bins (Default: ``23``) preemphasis_coefficient (float, optional): Coefficient for use in signal preemphasis (Default: ``0.97``) raw_energy (bool, optional): If True, compute energy before preemphasis and windowing (Default: ``True``) remove_dc_offset (bool, optional): Subtract mean from waveform on each frame (Default: ``True``) round_to_power_of_two (bool, optional): If True, round window size to power of two by zero-padding input to FFT. (Default: ``True``) sample_frequency (float, optional): Waveform data sample frequency (must match the waveform file, if specified there) (Default: ``16000.0``) snip_edges (bool, optional): If True, end effects will be handled by outputting only frames that completely fit in the file, and the number of frames depends on the frame_length. If False, the number of frames depends only on the frame_shift, and we reflect the data at the ends. (Default: ``True``) subtract_mean (bool, optional): Subtract mean of each feature file [CMS]; not recommended to do it this way. (Default: ``False``) use_energy (bool, optional): Add an extra dimension with energy to the FBANK output. (Default: ``False``) vtln_high (float, optional): High inflection point in piecewise linear VTLN warping function (if negative, offset from high-mel-freq (Default: ``-500.0``) vtln_low (float, optional): Low inflection point in piecewise linear VTLN warping function (Default: ``100.0``) vtln_warp (float, optional): Vtln warp factor (only applicable if vtln_map not specified) (Default: ``1.0``) window_type (str, optional): Type of window ('hamming'|'hanning'|'povey'|'rectangular'|'blackman') (Default: ``"povey"``) Returns: Tensor: A mfcc identical to what Kaldi would output. The shape is (m, ``num_ceps``) where m is calculated in _get_strided """ assert num_ceps <= num_mel_bins, 'num_ceps cannot be larger than num_mel_bins: %d vs %d' % (num_ceps, num_mel_bins) device, dtype = waveform.device, waveform.dtype # The mel_energies should not be squared (use_power=True), not have mean subtracted # (subtract_mean=False), and use log (use_log_fbank=True). # size (m, num_mel_bins + use_energy) feature = fbank(waveform=waveform, blackman_coeff=blackman_coeff, channel=channel, dither=dither, energy_floor=energy_floor, frame_length=frame_length, frame_shift=frame_shift, high_freq=high_freq, htk_compat=htk_compat, low_freq=low_freq, min_duration=min_duration, num_mel_bins=num_mel_bins, preemphasis_coefficient=preemphasis_coefficient, raw_energy=raw_energy, remove_dc_offset=remove_dc_offset, round_to_power_of_two=round_to_power_of_two, sample_frequency=sample_frequency, snip_edges=snip_edges, subtract_mean=False, use_energy=use_energy, use_log_fbank=True, use_power=True, vtln_high=vtln_high, vtln_low=vtln_low, vtln_warp=vtln_warp, window_type=window_type) if use_energy: # size (m) signal_log_energy = feature[:, num_mel_bins if htk_compat else 0] # offset is 0 if htk_compat==True else 1 mel_offset = int(not htk_compat) feature = feature[:, mel_offset:(num_mel_bins + mel_offset)] # size (num_mel_bins, num_ceps) dct_matrix = _get_dct_matrix(num_ceps, num_mel_bins).to(dtype=dtype, device=device) # size (m, num_ceps) feature = feature.matmul(dct_matrix) if cepstral_lifter != 0.0: # size (1, num_ceps) lifter_coeffs = _get_lifter_coeffs(num_ceps, cepstral_lifter).unsqueeze(0) feature *= lifter_coeffs.to(device=device, dtype=dtype) # if use_energy then replace the last column for htk_compat == true else first column if use_energy: feature[:, 0] = signal_log_energy if htk_compat: energy = feature[:, 0].unsqueeze(1) # size (m, 1) feature = feature[:, 1:] # size (m, num_ceps - 1) if not use_energy: # scale on C0 (actually removing a scale we previously added that's # part of one common definition of the cosine transform.) energy *= math.sqrt(2) feature = torch.cat((feature, energy), dim=1) feature = _subtract_column_mean(feature, subtract_mean) return feature def _get_LR_indices_and_weights(orig_freq: float, new_freq: float, output_samples_in_unit: int, window_width: float, lowpass_cutoff: float, lowpass_filter_width: int, device: torch.device, dtype: int) -> Tuple[Tensor, Tensor]: r"""Based on LinearResample::SetIndexesAndWeights where it retrieves the weights for resampling as well as the indices in which they are valid. LinearResample (LR) means that the output signal is at linearly spaced intervals (i.e the output signal has a frequency of ``new_freq``). It uses sinc/bandlimited interpolation to upsample/downsample the signal. The reason why the same filter is not used for multiple convolutions is because the sinc function could sampled at different points in time. For example, suppose a signal is sampled at the timestamps (seconds) 0 16 32 and we want it to be sampled at the timestamps (seconds) 0 5 10 15 20 25 30 35 at the timestamp of 16, the delta timestamps are 16 11 6 1 4 9 14 19 at the timestamp of 32, the delta timestamps are 32 27 22 17 12 8 2 3 As we can see from deltas, the sinc function is sampled at different points of time assuming the center of the sinc function is at 0, 16, and 32 (the deltas [..., 6, 1, 4, ....] for 16 vs [...., 2, 3, ....] for 32) Example, one case is when the ``orig_freq`` and ``new_freq`` are multiples of each other then there needs to be one filter. A windowed filter function (i.e. Hanning * sinc) because the ideal case of sinc function has infinite support (non-zero for all values) so instead it is truncated and multiplied by a window function which gives it less-than-perfect rolloff [1]. [1] Chapter 16: Windowed-Sinc Filters, https://www.dspguide.com/ch16/1.htm Args: orig_freq (float): The original frequency of the signal new_freq (float): The desired frequency output_samples_in_unit (int): The number of output samples in the smallest repeating unit: num_samp_out = new_freq / Gcd(orig_freq, new_freq) window_width (float): The width of the window which is nonzero lowpass_cutoff (float): The filter cutoff in Hz. The filter cutoff needs to be less than samp_rate_in_hz/2 and less than samp_rate_out_hz/2. lowpass_filter_width (int): Controls the sharpness of the filter, more == sharper but less efficient. We suggest around 4 to 10 for normal use Returns: (Tensor, Tensor): A tuple of ``min_input_index`` (which is the minimum indices where the window is valid, size (``output_samples_in_unit``)) and ``weights`` (which is the weights which correspond with min_input_index, size (``output_samples_in_unit``, ``max_weight_width``)). """ assert lowpass_cutoff < min(orig_freq, new_freq) / 2 output_t = torch.arange(0., output_samples_in_unit, device=device, dtype=dtype) / new_freq min_t = output_t - window_width max_t = output_t + window_width min_input_index = torch.ceil(min_t * orig_freq) # size (output_samples_in_unit) max_input_index = torch.floor(max_t * orig_freq) # size (output_samples_in_unit) num_indices = max_input_index - min_input_index + 1 # size (output_samples_in_unit) max_weight_width = num_indices.max() # create a group of weights of size (output_samples_in_unit, max_weight_width) j = torch.arange(max_weight_width, device=device, dtype=dtype).unsqueeze(0) input_index = min_input_index.unsqueeze(1) + j delta_t = (input_index / orig_freq) - output_t.unsqueeze(1) weights = torch.zeros_like(delta_t) inside_window_indices = delta_t.abs().lt(window_width) # raised-cosine (Hanning) window with width `window_width` weights[inside_window_indices] = 0.5 * (1 + torch.cos(2 * math.pi * lowpass_cutoff / lowpass_filter_width * delta_t[inside_window_indices])) t_eq_zero_indices = delta_t.eq(0.0) t_not_eq_zero_indices = ~t_eq_zero_indices # sinc filter function weights[t_not_eq_zero_indices] *= torch.sin( 2 * math.pi * lowpass_cutoff * delta_t[t_not_eq_zero_indices]) / (math.pi * delta_t[t_not_eq_zero_indices]) # limit of the function at t = 0 weights[t_eq_zero_indices] *= 2 * lowpass_cutoff weights /= orig_freq # size (output_samples_in_unit, max_weight_width) return min_input_index, weights def _lcm(a: int, b: int) -> int: return abs(a * b) // math.gcd(a, b) def _get_num_LR_output_samples(input_num_samp: int, samp_rate_in: float, samp_rate_out: float) -> int: r"""Based on LinearResample::GetNumOutputSamples. LinearResample (LR) means that the output signal is at linearly spaced intervals (i.e the output signal has a frequency of ``new_freq``). It uses sinc/bandlimited interpolation to upsample/downsample the signal. Args: input_num_samp (int): The number of samples in the input samp_rate_in (float): The original frequency of the signal samp_rate_out (float): The desired frequency Returns: int: The number of output samples """ # For exact computation, we measure time in "ticks" of 1.0 / tick_freq, # where tick_freq is the least common multiple of samp_rate_in and # samp_rate_out. samp_rate_in = int(samp_rate_in) samp_rate_out = int(samp_rate_out) tick_freq = _lcm(samp_rate_in, samp_rate_out) ticks_per_input_period = tick_freq // samp_rate_in # work out the number of ticks in the time interval # [ 0, input_num_samp/samp_rate_in ). interval_length_in_ticks = input_num_samp * ticks_per_input_period if interval_length_in_ticks <= 0: return 0 ticks_per_output_period = tick_freq // samp_rate_out # Get the last output-sample in the closed interval, i.e. replacing [ ) with # [ ]. Note: integer division rounds down. See # http://en.wikipedia.org/wiki/Interval_(mathematics) for an explanation of # the notation. last_output_samp = interval_length_in_ticks // ticks_per_output_period # We need the last output-sample in the open interval, so if it takes us to # the end of the interval exactly, subtract one. if last_output_samp * ticks_per_output_period == interval_length_in_ticks: last_output_samp -= 1 # First output-sample index is zero, so the number of output samples # is the last output-sample plus one. num_output_samp = last_output_samp + 1 return num_output_samp def resample_waveform(waveform: Tensor, orig_freq: float, new_freq: float, lowpass_filter_width: int = 6) -> Tensor: r"""Resamples the waveform at the new frequency. This matches Kaldi's OfflineFeatureTpl ResampleWaveform which uses a LinearResample (resample a signal at linearly spaced intervals to upsample/downsample a signal). LinearResample (LR) means that the output signal is at linearly spaced intervals (i.e the output signal has a frequency of ``new_freq``). It uses sinc/bandlimited interpolation to upsample/downsample the signal. https://ccrma.stanford.edu/~jos/resample/Theory_Ideal_Bandlimited_Interpolation.html https://github.com/kaldi-asr/kaldi/blob/master/src/feat/resample.h#L56 Args: waveform (Tensor): The input signal of size (c, n) orig_freq (float): The original frequency of the signal new_freq (float): The desired frequency lowpass_filter_width (int, optional): Controls the sharpness of the filter, more == sharper but less efficient. We suggest around 4 to 10 for normal use. (Default: ``6``) Returns: Tensor: The waveform at the new frequency """ device, dtype = waveform.device, waveform.dtype assert waveform.dim() == 2 assert orig_freq > 0.0 and new_freq > 0.0 min_freq = min(orig_freq, new_freq) lowpass_cutoff = 0.99 * 0.5 * min_freq assert lowpass_cutoff * 2 <= min_freq base_freq = math.gcd(int(orig_freq), int(new_freq)) input_samples_in_unit = int(orig_freq) // base_freq output_samples_in_unit = int(new_freq) // base_freq window_width = lowpass_filter_width / (2.0 * lowpass_cutoff) first_indices, weights = _get_LR_indices_and_weights( orig_freq, new_freq, output_samples_in_unit, window_width, lowpass_cutoff, lowpass_filter_width, device, dtype) assert first_indices.dim() == 1 # TODO figure a better way to do this. conv1d reaches every element i*stride + padding # all the weights have the same stride but have different padding. # Current implementation takes the input and applies the various padding before # doing a conv1d for that specific weight. conv_stride = input_samples_in_unit conv_transpose_stride = output_samples_in_unit num_channels, wave_len = waveform.size() window_size = weights.size(1) tot_output_samp = _get_num_LR_output_samples(wave_len, orig_freq, new_freq) output = torch.zeros((num_channels, tot_output_samp), device=device, dtype=dtype) # eye size: (num_channels, num_channels, 1) eye = torch.eye(num_channels, device=device, dtype=dtype).unsqueeze(2) for i in range(first_indices.size(0)): wave_to_conv = waveform first_index = int(first_indices[i].item()) if first_index >= 0: # trim the signal as the filter will not be applied before the first_index wave_to_conv = wave_to_conv[..., first_index:] # pad the right of the signal to allow partial convolutions meaning compute # values for partial windows (e.g. end of the window is outside the signal length) max_unit_index = (tot_output_samp - 1) // output_samples_in_unit end_index_of_last_window = max_unit_index * conv_stride + window_size current_wave_len = wave_len - first_index right_padding = max(0, end_index_of_last_window + 1 - current_wave_len) left_padding = max(0, -first_index) if left_padding != 0 or right_padding != 0: wave_to_conv = torch.nn.functional.pad(wave_to_conv, (left_padding, right_padding)) conv_wave = torch.nn.functional.conv1d( wave_to_conv.unsqueeze(0), weights[i].repeat(num_channels, 1, 1), stride=conv_stride, groups=num_channels) # we want conv_wave[:, i] to be at output[:, i + n*conv_transpose_stride] dilated_conv_wave = torch.nn.functional.conv_transpose1d( conv_wave, eye, stride=conv_transpose_stride).squeeze(0) # pad dilated_conv_wave so it reaches the output length if needed. dialated_conv_wave_len = dilated_conv_wave.size(-1) left_padding = i right_padding = max(0, tot_output_samp - (left_padding + dialated_conv_wave_len)) dilated_conv_wave = torch.nn.functional.pad( dilated_conv_wave, (left_padding, right_padding))[..., :tot_output_samp] output += dilated_conv_wave return output audio-0.7.2/torchaudio/csrc/000077500000000000000000000000001376444676100157365ustar00rootroot00000000000000audio-0.7.2/torchaudio/csrc/register.cpp000066400000000000000000000055231376444676100202730ustar00rootroot00000000000000#ifndef TORCHAUDIO_REGISTER_H #define TORCHAUDIO_REGISTER_H #include #include #include TORCH_LIBRARY(torchaudio, m) { ////////////////////////////////////////////////////////////////////////////// // sox_utils.h ////////////////////////////////////////////////////////////////////////////// m.class_("TensorSignal") .def(torch::init()) .def("get_tensor", &torchaudio::sox_utils::TensorSignal::getTensor) .def( "get_sample_rate", &torchaudio::sox_utils::TensorSignal::getSampleRate) .def( "get_channels_first", &torchaudio::sox_utils::TensorSignal::getChannelsFirst); m.def("torchaudio::sox_utils_set_seed", &torchaudio::sox_utils::set_seed); m.def( "torchaudio::sox_utils_set_verbosity", &torchaudio::sox_utils::set_verbosity); m.def( "torchaudio::sox_utils_set_use_threads", &torchaudio::sox_utils::set_use_threads); m.def( "torchaudio::sox_utils_set_buffer_size", &torchaudio::sox_utils::set_buffer_size); m.def( "torchaudio::sox_utils_list_effects", &torchaudio::sox_utils::list_effects); m.def( "torchaudio::sox_utils_list_read_formats", &torchaudio::sox_utils::list_read_formats); m.def( "torchaudio::sox_utils_list_write_formats", &torchaudio::sox_utils::list_write_formats); ////////////////////////////////////////////////////////////////////////////// // sox_io.h ////////////////////////////////////////////////////////////////////////////// m.class_("SignalInfo") .def("get_sample_rate", &torchaudio::sox_io::SignalInfo::getSampleRate) .def("get_num_channels", &torchaudio::sox_io::SignalInfo::getNumChannels) .def("get_num_frames", &torchaudio::sox_io::SignalInfo::getNumFrames); m.def("torchaudio::sox_io_get_info", &torchaudio::sox_io::get_info); m.def( "torchaudio::sox_io_load_audio_file", &torchaudio::sox_io::load_audio_file); m.def( "torchaudio::sox_io_save_audio_file", &torchaudio::sox_io::save_audio_file); ////////////////////////////////////////////////////////////////////////////// // sox_effects.h ////////////////////////////////////////////////////////////////////////////// m.def( "torchaudio::sox_effects_initialize_sox_effects", &torchaudio::sox_effects::initialize_sox_effects); m.def( "torchaudio::sox_effects_shutdown_sox_effects", &torchaudio::sox_effects::shutdown_sox_effects); m.def( "torchaudio::sox_effects_apply_effects_tensor", &torchaudio::sox_effects::apply_effects_tensor); m.def( "torchaudio::sox_effects_apply_effects_file", &torchaudio::sox_effects::apply_effects_file); } #endif audio-0.7.2/torchaudio/csrc/sox.cpp000066400000000000000000000421551376444676100172620ustar00rootroot00000000000000#include #include #include #include #include namespace torch { namespace audio { namespace { /// Helper struct to safely close the sox_format_t descriptor. struct SoxDescriptor { explicit SoxDescriptor(sox_format_t* fd) noexcept : fd_(fd) {} SoxDescriptor(const SoxDescriptor& other) = delete; SoxDescriptor(SoxDescriptor&& other) = delete; SoxDescriptor& operator=(const SoxDescriptor& other) = delete; SoxDescriptor& operator=(SoxDescriptor&& other) = delete; ~SoxDescriptor() { if (fd_ != nullptr) { sox_close(fd_); } } sox_format_t* operator->() noexcept { return fd_; } sox_format_t* get() noexcept { return fd_; } private: sox_format_t* fd_; }; int64_t write_audio(SoxDescriptor& fd, at::Tensor tensor) { std::vector buffer(tensor.numel()); AT_DISPATCH_ALL_TYPES(tensor.scalar_type(), "write_audio_buffer", [&] { auto* data = tensor.data_ptr(); std::copy(data, data + tensor.numel(), buffer.begin()); }); const auto samples_written = sox_write(fd.get(), buffer.data(), buffer.size()); return samples_written; } void read_audio( SoxDescriptor& fd, at::Tensor output, int64_t buffer_length) { std::vector buffer(buffer_length); int number_of_channels = fd->signal.channels; const int64_t samples_read = sox_read(fd.get(), buffer.data(), buffer_length); if (samples_read == 0) { throw std::runtime_error( "Error reading audio file: empty file or read failed in sox_read"); } output.resize_({samples_read / number_of_channels, number_of_channels}); output = output.contiguous(); AT_DISPATCH_ALL_TYPES(output.scalar_type(), "read_audio_buffer", [&] { auto* data = output.data_ptr(); std::copy(buffer.begin(), buffer.begin() + samples_read, data); }); } } // namespace std::tuple get_info( const std::string& file_name ) { SoxDescriptor fd(sox_open_read( file_name.c_str(), /*signal=*/nullptr, /*encoding=*/nullptr, /*filetype=*/nullptr)); if (fd.get() == nullptr) { throw std::runtime_error("Error opening audio file"); } return std::make_tuple(fd->signal, fd->encoding); } int read_audio_file( const std::string& file_name, at::Tensor output, bool ch_first, int64_t nframes, int64_t offset, sox_signalinfo_t* si, sox_encodinginfo_t* ei, const char* ft) { SoxDescriptor fd(sox_open_read(file_name.c_str(), si, ei, ft)); if (fd.get() == nullptr) { throw std::runtime_error("Error opening audio file"); } // signal info const int number_of_channels = fd->signal.channels; const int sample_rate = fd->signal.rate; const int64_t total_length = fd->signal.length; // multiply offset and number of frames by number of channels offset *= number_of_channels; nframes *= number_of_channels; if (total_length == 0) { throw std::runtime_error("Error reading audio file: unknown length"); } if (offset > total_length) { throw std::runtime_error("Offset past EOF"); } // calculate buffer length int64_t buffer_length = total_length; if (offset > 0) { buffer_length -= offset; } if (nframes > 0 && buffer_length > nframes) { buffer_length = nframes; } // seek to offset point before reading data if (sox_seek(fd.get(), offset, 0) == SOX_EOF) { throw std::runtime_error("sox_seek reached EOF, try reducing offset or num_samples"); } // read data and fill output tensor read_audio(fd, output, buffer_length); // L x C -> C x L, if desired if (ch_first) { output.transpose_(1, 0); } return sample_rate; } void write_audio_file( const std::string& file_name, const at::Tensor& tensor, sox_signalinfo_t* si, sox_encodinginfo_t* ei, const char* file_type) { if (!tensor.is_contiguous()) { throw std::runtime_error( "Error writing audio file: input tensor must be contiguous"); } #if SOX_LIB_VERSION_CODE >= 918272 // >= 14.3.0 si->mult = nullptr; #endif SoxDescriptor fd(sox_open_write( file_name.c_str(), si, ei, file_type, /*oob=*/nullptr, /*overwrite=*/nullptr)); if (fd.get() == nullptr) { throw std::runtime_error( "Error writing audio file: could not open file for writing"); } const auto samples_written = write_audio(fd, tensor); if (samples_written != tensor.numel()) { throw std::runtime_error( "Error writing audio file: could not write entire buffer"); } } int build_flow_effects(const std::string& file_name, at::Tensor otensor, bool ch_first, sox_signalinfo_t* target_signal, sox_encodinginfo_t* target_encoding, const char* file_type, std::vector pyeffs, int max_num_eopts) { /* This function builds an effects flow and puts the results into a tensor. It can also be used to re-encode audio using any of the available encoding options in SoX including sample rate and channel re-encoding. */ // open input sox_format_t* input = sox_open_read(file_name.c_str(), nullptr, nullptr, nullptr); if (input == nullptr) { throw std::runtime_error("Error opening audio file"); } // only used if target signal or encoding are null sox_signalinfo_t empty_signal; sox_encodinginfo_t empty_encoding; // set signalinfo and encodinginfo if blank if(target_signal == nullptr) { target_signal = &empty_signal; target_signal->rate = input->signal.rate; target_signal->channels = input->signal.channels; target_signal->length = SOX_UNSPEC; target_signal->precision = input->signal.precision; #if SOX_LIB_VERSION_CODE >= 918272 // >= 14.3.0 target_signal->mult = nullptr; #endif } if(target_encoding == nullptr) { target_encoding = &empty_encoding; target_encoding->encoding = SOX_ENCODING_SIGN2; // Sample format target_encoding->bits_per_sample = input->signal.precision; // Bits per sample target_encoding->compression = 0.0; // Compression factor target_encoding->reverse_bytes = sox_option_default; // Should bytes be reversed target_encoding->reverse_nibbles = sox_option_default; // Should nibbles be reversed target_encoding->reverse_bits = sox_option_default; // Should bits be reversed (pairs of bits?) target_encoding->opposite_endian = sox_false; // Reverse endianness } // check for rate or channels effect and change the output signalinfo accordingly for (SoxEffect se : pyeffs) { if (se.ename == "rate") { target_signal->rate = std::stod(se.eopts[0]); } else if (se.ename == "channels") { target_signal->channels = std::stoi(se.eopts[0]); } } // create interm_signal for effects, intermediate steps change this in-place sox_signalinfo_t interm_signal = input->signal; #ifdef __APPLE__ // According to Mozilla Deepspeech sox_open_memstream_write doesn't work // with OSX char tmp_name[] = "/tmp/fileXXXXXX"; int tmp_fd = mkstemp(tmp_name); close(tmp_fd); sox_format_t* output = sox_open_write(tmp_name, target_signal, target_encoding, "wav", nullptr, nullptr); #else // create buffer and buffer_size for output in memwrite char* buffer; size_t buffer_size; // in-memory descriptor (this may not work for OSX) sox_format_t* output = sox_open_memstream_write(&buffer, &buffer_size, target_signal, target_encoding, file_type, nullptr); #endif if (output == nullptr) { throw std::runtime_error("Error opening output memstream/temporary file"); } // Setup the effects chain to decode/resample sox_effects_chain_t* chain = sox_create_effects_chain(&input->encoding, &output->encoding); sox_effect_t* e = sox_create_effect(sox_find_effect("input")); char* io_args[1]; io_args[0] = (char*)input; sox_effect_options(e, 1, io_args); sox_add_effect(chain, e, &interm_signal, &input->signal); free(e); for(SoxEffect tae : pyeffs) { if(tae.ename == "no_effects") break; e = sox_create_effect(sox_find_effect(tae.ename.c_str())); e->global_info->global_info->verbosity = 1; if(tae.eopts[0] == "") { sox_effect_options(e, 0, nullptr); } else { int num_opts = tae.eopts.size(); char* sox_args[max_num_eopts]; for(std::vector::size_type i = 0; i != tae.eopts.size(); i++) { sox_args[i] = (char*) tae.eopts[i].c_str(); } if(sox_effect_options(e, num_opts, sox_args) != SOX_SUCCESS) { #ifdef __APPLE__ unlink(tmp_name); #endif throw std::runtime_error("invalid effect options, see SoX docs for details"); } } sox_add_effect(chain, e, &interm_signal, &output->signal); free(e); } e = sox_create_effect(sox_find_effect("output")); io_args[0] = (char*)output; sox_effect_options(e, 1, io_args); sox_add_effect(chain, e, &interm_signal, &output->signal); free(e); // Finally run the effects chain sox_flow_effects(chain, nullptr, nullptr); sox_delete_effects_chain(chain); // Close sox handles, buffer does not get properly sized until these are closed sox_close(output); sox_close(input); int sr; // Read the in-memory audio buffer or temp file that we just wrote. #ifdef __APPLE__ /* Temporary filetype must have a valid header. Wav seems to work here while raw does not. Certain effects like chorus caused strange behavior on the mac. */ // read_audio_file reads the temporary file and returns the sr and otensor sr = read_audio_file(tmp_name, otensor, ch_first, 0, 0, target_signal, target_encoding, "wav"); // delete temporary audio file unlink(tmp_name); #else // Resize output tensor to desired dimensions, different effects result in output->signal.length, // interm_signal.length and buffer size being inconsistent with the result of the file output. // We prioritize in the order: output->signal.length > interm_signal.length > buffer_size // Could be related to: https://sourceforge.net/p/sox/bugs/314/ int nc, ns; if (output->signal.length == 0) { // sometimes interm_signal length is extremely large, but the buffer_size // is double the length of the output signal if (interm_signal.length > (buffer_size * 10)) { ns = buffer_size / 2; } else { ns = interm_signal.length; } nc = interm_signal.channels; } else { nc = output->signal.channels; ns = output->signal.length; } otensor.resize_({ns/nc, nc}); otensor = otensor.contiguous(); input = sox_open_mem_read(buffer, buffer_size, target_signal, target_encoding, file_type); std::vector samples(buffer_size); const int64_t samples_read = sox_read(input, samples.data(), buffer_size); assert(samples_read != nc * ns && samples_read != 0); AT_DISPATCH_ALL_TYPES(otensor.scalar_type(), "effects_buffer", [&] { auto* data = otensor.data_ptr(); std::copy(samples.begin(), samples.begin() + samples_read, data); }); // free buffer and close mem_read sox_close(input); free(buffer); if (ch_first) { otensor.transpose_(1, 0); } sr = target_signal->rate; #endif // return sample rate, output tensor modified in-place return sr; } } // namespace audio } // namespace torch PYBIND11_MODULE(_torchaudio, m) { py::class_(m, "SoxEffect") .def(py::init<>()) .def("__repr__", [](const torch::audio::SoxEffect &self) { std::stringstream ss; std::string sep; ss << "SoxEffect (" << self.ename << " ,["; for(std::string s : self.eopts) { ss << sep << "\"" << s << "\""; sep = ", "; } ss << "])\n"; return ss.str(); }) .def_readwrite("ename", &torch::audio::SoxEffect::ename) .def_readwrite("eopts", &torch::audio::SoxEffect::eopts); py::class_(m, "sox_signalinfo_t") .def(py::init<>()) .def("__repr__", [](const sox_signalinfo_t &self) { std::stringstream ss; ss << "sox_signalinfo_t {\n" << " rate-> " << self.rate << "\n" << " channels-> " << self.channels << "\n" << " precision-> " << self.precision << "\n" << " length-> " << self.length << "\n" << " mult-> " << self.mult << "\n" << "}\n"; return ss.str(); }) .def_readwrite("rate", &sox_signalinfo_t::rate) .def_readwrite("channels", &sox_signalinfo_t::channels) .def_readwrite("precision", &sox_signalinfo_t::precision) .def_readwrite("length", &sox_signalinfo_t::length) .def_readwrite("mult", &sox_signalinfo_t::mult); py::class_(m, "sox_encodinginfo_t") .def(py::init<>()) .def("__repr__", [](const sox_encodinginfo_t &self) { std::stringstream ss; ss << "sox_encodinginfo_t {\n" << " encoding-> " << self.encoding << "\n" << " bits_per_sample-> " << self.bits_per_sample << "\n" << " compression-> " << self.compression << "\n" << " reverse_bytes-> " << self.reverse_bytes << "\n" << " reverse_nibbles-> " << self.reverse_nibbles << "\n" << " reverse_bits-> " << self.reverse_bits << "\n" << " opposite_endian-> " << self.opposite_endian << "\n" << "}\n"; return ss.str(); }) .def_readwrite("encoding", &sox_encodinginfo_t::encoding) .def_readwrite("bits_per_sample", &sox_encodinginfo_t::bits_per_sample) .def_readwrite("compression", &sox_encodinginfo_t::compression) .def_readwrite("reverse_bytes", &sox_encodinginfo_t::reverse_bytes) .def_readwrite("reverse_nibbles", &sox_encodinginfo_t::reverse_nibbles) .def_readwrite("reverse_bits", &sox_encodinginfo_t::reverse_bits) .def_readwrite("opposite_endian", &sox_encodinginfo_t::opposite_endian); py::enum_(m, "sox_encoding_t") .value("SOX_ENCODING_UNKNOWN", sox_encoding_t::SOX_ENCODING_UNKNOWN) .value("SOX_ENCODING_SIGN2", sox_encoding_t::SOX_ENCODING_SIGN2) .value("SOX_ENCODING_UNSIGNED", sox_encoding_t::SOX_ENCODING_UNSIGNED) .value("SOX_ENCODING_FLOAT", sox_encoding_t::SOX_ENCODING_FLOAT) .value("SOX_ENCODING_FLOAT_TEXT", sox_encoding_t::SOX_ENCODING_FLOAT_TEXT) .value("SOX_ENCODING_FLAC", sox_encoding_t::SOX_ENCODING_FLAC) .value("SOX_ENCODING_HCOM", sox_encoding_t::SOX_ENCODING_HCOM) .value("SOX_ENCODING_WAVPACK", sox_encoding_t::SOX_ENCODING_WAVPACK) .value("SOX_ENCODING_WAVPACKF", sox_encoding_t::SOX_ENCODING_WAVPACKF) .value("SOX_ENCODING_ULAW", sox_encoding_t::SOX_ENCODING_ULAW) .value("SOX_ENCODING_ALAW", sox_encoding_t::SOX_ENCODING_ALAW) .value("SOX_ENCODING_G721", sox_encoding_t::SOX_ENCODING_G721) .value("SOX_ENCODING_G723", sox_encoding_t::SOX_ENCODING_G723) .value("SOX_ENCODING_CL_ADPCM", sox_encoding_t::SOX_ENCODING_CL_ADPCM) .value("SOX_ENCODING_CL_ADPCM16", sox_encoding_t::SOX_ENCODING_CL_ADPCM16) .value("SOX_ENCODING_MS_ADPCM", sox_encoding_t::SOX_ENCODING_MS_ADPCM) .value("SOX_ENCODING_IMA_ADPCM", sox_encoding_t::SOX_ENCODING_IMA_ADPCM) .value("SOX_ENCODING_OKI_ADPCM", sox_encoding_t::SOX_ENCODING_OKI_ADPCM) .value("SOX_ENCODING_DPCM", sox_encoding_t::SOX_ENCODING_DPCM) .value("SOX_ENCODING_DWVW", sox_encoding_t::SOX_ENCODING_DWVW) .value("SOX_ENCODING_DWVWN", sox_encoding_t::SOX_ENCODING_DWVWN) .value("SOX_ENCODING_GSM", sox_encoding_t::SOX_ENCODING_GSM) .value("SOX_ENCODING_MP3", sox_encoding_t::SOX_ENCODING_MP3) .value("SOX_ENCODING_VORBIS", sox_encoding_t::SOX_ENCODING_VORBIS) .value("SOX_ENCODING_AMR_WB", sox_encoding_t::SOX_ENCODING_AMR_WB) .value("SOX_ENCODING_AMR_NB", sox_encoding_t::SOX_ENCODING_AMR_NB) .value("SOX_ENCODING_LPC10", sox_encoding_t::SOX_ENCODING_LPC10) //.value("SOX_ENCODING_OPUS", sox_encoding_t::SOX_ENCODING_OPUS) // creates a compile error .value("SOX_ENCODINGS", sox_encoding_t::SOX_ENCODINGS) .export_values(); py::enum_(m, "sox_option_t") .value("sox_option_no", sox_option_t::sox_option_no) .value("sox_option_yes", sox_option_t::sox_option_yes) .value("sox_option_default", sox_option_t::sox_option_default) .export_values(); py::enum_(m, "sox_bool") .value("sox_false", sox_bool::sox_false) .value("sox_true", sox_bool::sox_true) .export_values(); m.def( "read_audio_file", &torch::audio::read_audio_file, "Reads an audio file into a tensor"); m.def( "write_audio_file", &torch::audio::write_audio_file, "Writes data from a tensor into an audio file"); m.def( "get_info", &torch::audio::get_info, "Gets information about an audio file"); m.def( "build_flow_effects", &torch::audio::build_flow_effects, "build effects and flow chain into tensors"); } audio-0.7.2/torchaudio/csrc/sox.h000066400000000000000000000050451376444676100167240ustar00rootroot00000000000000#include #include #include #include #include namespace at { struct Tensor; } // namespace at namespace torch { namespace audio { /// Reads an audio file from the given `path` into the `output` `Tensor` and /// returns the sample rate of the audio file. /// Throws `std::runtime_error` if the audio file could not be opened, or an /// error occurred during reading of the audio data. int read_audio_file( const std::string& file_name, at::Tensor output, bool ch_first, int64_t nframes, int64_t offset, sox_signalinfo_t* si, sox_encodinginfo_t* ei, const char* ft); /// Writes the data of a `Tensor` into an audio file at the given `path`, with /// a certain extension (e.g. `wav`or `mp3`) and sample rate. /// Throws `std::runtime_error` when the audio file could not be opened for /// writing, or an error occurred during writing of the audio data. void write_audio_file( const std::string& file_name, const at::Tensor& tensor, sox_signalinfo_t* si, sox_encodinginfo_t* ei, const char* file_type); /// Reads an audio file from the given `path` and returns a tuple of /// sox_signalinfo_t and sox_encodinginfo_t, which contain information about /// the audio file such as sample rate, length, bit precision, encoding and more. /// Throws `std::runtime_error` if the audio file could not be opened, or an /// error occurred during reading of the audio data. std::tuple get_info( const std::string& file_name); // Struct for build_flow_effects function struct SoxEffect { SoxEffect() : ename(""), eopts({""}) { } std::string ename; std::vector eopts; }; /// Build a SoX chain, flow the effects, and capture the results in a tensor. /// An audio file from the given `path` flows through an effects chain given /// by a list of effects and effect options to an output buffer which is encoded /// into memory to a target signal type and target signal encoding. The resulting /// buffer is then placed into a tensor. This function returns the output tensor /// and the sample rate of the output tensor. int build_flow_effects(const std::string& file_name, at::Tensor otensor, bool ch_first, sox_signalinfo_t* target_signal, sox_encodinginfo_t* target_encoding, const char* file_type, std::vector pyeffs, int max_num_eopts); }} // namespace torch::audio audio-0.7.2/torchaudio/csrc/sox_effects.cpp000066400000000000000000000075451376444676100207650ustar00rootroot00000000000000#include #include #include #include using namespace torchaudio::sox_utils; namespace torchaudio { namespace sox_effects { namespace { enum SoxEffectsResourceState { NotInitialized, Initialized, ShutDown }; SoxEffectsResourceState SOX_RESOURCE_STATE = NotInitialized; std::mutex SOX_RESOUCE_STATE_MUTEX; } // namespace void initialize_sox_effects() { const std::lock_guard lock(SOX_RESOUCE_STATE_MUTEX); switch (SOX_RESOURCE_STATE) { case NotInitialized: if (sox_init() != SOX_SUCCESS) { throw std::runtime_error("Failed to initialize sox effects."); }; SOX_RESOURCE_STATE = Initialized; case Initialized: break; case ShutDown: throw std::runtime_error( "SoX Effects has been shut down. Cannot initialize again."); } }; void shutdown_sox_effects() { const std::lock_guard lock(SOX_RESOUCE_STATE_MUTEX); switch (SOX_RESOURCE_STATE) { case NotInitialized: throw std::runtime_error( "SoX Effects is not initialized. Cannot shutdown."); case Initialized: if (sox_quit() != SOX_SUCCESS) { throw std::runtime_error("Failed to initialize sox effects."); }; SOX_RESOURCE_STATE = ShutDown; case ShutDown: break; } } c10::intrusive_ptr apply_effects_tensor( const c10::intrusive_ptr& input_signal, std::vector> effects) { auto in_tensor = input_signal->getTensor(); validate_input_tensor(in_tensor); // Create SoxEffectsChain const auto dtype = in_tensor.dtype(); torchaudio::sox_effects_chain::SoxEffectsChain chain( /*input_encoding=*/get_encodinginfo("wav", dtype, 0.), /*output_encoding=*/get_encodinginfo("wav", dtype, 0.)); // Prepare output buffer std::vector out_buffer; out_buffer.reserve(in_tensor.numel()); // Build and run effects chain chain.addInputTensor(input_signal.get()); for (const auto& effect : effects) { chain.addEffect(effect); } chain.addOutputBuffer(&out_buffer); chain.run(); // Create tensor from buffer const auto channels_first = input_signal->getChannelsFirst(); auto out_tensor = convert_to_tensor( /*buffer=*/out_buffer.data(), /*num_samples=*/out_buffer.size(), /*num_channels=*/chain.getOutputNumChannels(), dtype, /*noramlize=*/false, channels_first); return c10::make_intrusive( out_tensor, chain.getOutputSampleRate(), channels_first); } c10::intrusive_ptr apply_effects_file( const std::string path, std::vector> effects, const bool normalize, const bool channels_first) { // Open input file SoxFormat sf(sox_open_read( path.c_str(), /*signal=*/nullptr, /*encoding=*/nullptr, /*filetype=*/nullptr)); validate_input_file(sf); const auto dtype = get_dtype(sf->encoding.encoding, sf->signal.precision); // Prepare output std::vector out_buffer; out_buffer.reserve(sf->signal.length); // Create and run SoxEffectsChain torchaudio::sox_effects_chain::SoxEffectsChain chain( /*input_encoding=*/sf->encoding, /*output_encoding=*/get_encodinginfo("wav", dtype, 0.)); chain.addInputFile(sf); for (const auto& effect : effects) { chain.addEffect(effect); } chain.addOutputBuffer(&out_buffer); chain.run(); // Create tensor from buffer auto tensor = convert_to_tensor( /*buffer=*/out_buffer.data(), /*num_samples=*/out_buffer.size(), /*num_channels=*/chain.getOutputNumChannels(), dtype, normalize, channels_first); return c10::make_intrusive( tensor, chain.getOutputSampleRate(), channels_first); } } // namespace sox_effects } // namespace torchaudio audio-0.7.2/torchaudio/csrc/sox_effects.h000066400000000000000000000013501376444676100204160ustar00rootroot00000000000000#ifndef TORCHAUDIO_SOX_EFFECTS_H #define TORCHAUDIO_SOX_EFFECTS_H #include #include namespace torchaudio { namespace sox_effects { void initialize_sox_effects(); void shutdown_sox_effects(); c10::intrusive_ptr apply_effects_tensor( const c10::intrusive_ptr& input_signal, std::vector> effects); c10::intrusive_ptr apply_effects_file( const std::string path, std::vector> effects, const bool normalize = true, const bool channels_first = true); } // namespace sox_effects } // namespace torchaudio #endif audio-0.7.2/torchaudio/csrc/sox_effects_chain.cpp000066400000000000000000000222671376444676100221250ustar00rootroot00000000000000#include #include using namespace torch::indexing; using namespace torchaudio::sox_utils; namespace torchaudio { namespace sox_effects_chain { namespace { // Helper struct to safely close sox_effect_t* pointer returned by // sox_create_effect struct SoxEffect { explicit SoxEffect(sox_effect_t* se) noexcept : se_(se){}; SoxEffect(const SoxEffect& other) = delete; SoxEffect(const SoxEffect&& other) = delete; SoxEffect& operator=(const SoxEffect& other) = delete; SoxEffect& operator=(SoxEffect&& other) = delete; ~SoxEffect() { if (se_ != nullptr) { free(se_); } } operator sox_effect_t*() const { return se_; }; sox_effect_t* operator->() noexcept { return se_; } private: sox_effect_t* se_; }; /// helper classes for passing the location of input tensor and output buffer /// /// drain/flow callback functions require plaing C style function signature and /// the way to pass extra data is to attach data to sox_fffect_t::priv pointer. /// The following structs will be assigned to sox_fffect_t::priv pointer which /// gives sox_effect_t an access to input Tensor and output buffer object. struct TensorInputPriv { size_t index; TensorSignal* signal; }; struct TensorOutputPriv { std::vector* buffer; }; struct FileOutputPriv { sox_format_t* sf; }; /// Callback function to feed Tensor data to SoxEffectChain. int tensor_input_drain(sox_effect_t* effp, sox_sample_t* obuf, size_t* osamp) { // Retrieve the input Tensor and current index auto priv = static_cast(effp->priv); auto index = priv->index; auto signal = priv->signal; auto tensor = signal->getTensor(); auto num_channels = effp->out_signal.channels; // Adjust the number of samples to read const size_t num_samples = tensor.numel(); if (index + *osamp > num_samples) { *osamp = num_samples - index; } // Ensure that it's a multiple of the number of channels *osamp -= *osamp % num_channels; // Slice the input Tensor and unnormalize the values const auto tensor_ = [&]() { auto i_frame = index / num_channels; auto num_frames = *osamp / num_channels; auto t = (signal->getChannelsFirst()) ? tensor.index({Slice(), Slice(i_frame, i_frame + num_frames)}).t() : tensor.index({Slice(i_frame, i_frame + num_frames), Slice()}); return unnormalize_wav(t.reshape({-1})).contiguous(); }(); priv->index += *osamp; // Write data to SoxEffectsChain buffer. auto ptr = tensor_.data_ptr(); std::copy(ptr, ptr + *osamp, obuf); return (priv->index == num_samples) ? SOX_EOF : SOX_SUCCESS; } /// Callback function to fetch data from SoxEffectChain. int tensor_output_flow( sox_effect_t* effp, sox_sample_t const* ibuf, sox_sample_t* obuf LSX_UNUSED, size_t* isamp, size_t* osamp) { *osamp = 0; // Get output buffer auto out_buffer = static_cast(effp->priv)->buffer; // Append at the end out_buffer->insert(out_buffer->end(), ibuf, ibuf + *isamp); return SOX_SUCCESS; } int file_output_flow( sox_effect_t* effp, sox_sample_t const* ibuf, sox_sample_t* obuf LSX_UNUSED, size_t* isamp, size_t* osamp) { *osamp = 0; if (*isamp) { auto sf = static_cast(effp->priv)->sf; if (sox_write(sf, ibuf, *isamp) != *isamp) { if (sf->sox_errno) { std::ostringstream stream; stream << sf->sox_errstr << " " << sox_strerror(sf->sox_errno) << " " << sf->filename; throw std::runtime_error(stream.str()); } return SOX_EOF; } } return SOX_SUCCESS; } sox_effect_handler_t* get_tensor_input_handler() { static sox_effect_handler_t handler{/*name=*/"input_tensor", /*usage=*/NULL, /*flags=*/SOX_EFF_MCHAN, /*getopts=*/NULL, /*start=*/NULL, /*flow=*/NULL, /*drain=*/tensor_input_drain, /*stop=*/NULL, /*kill=*/NULL, /*priv_size=*/sizeof(TensorInputPriv)}; return &handler; } sox_effect_handler_t* get_tensor_output_handler() { static sox_effect_handler_t handler{/*name=*/"output_tensor", /*usage=*/NULL, /*flags=*/SOX_EFF_MCHAN, /*getopts=*/NULL, /*start=*/NULL, /*flow=*/tensor_output_flow, /*drain=*/NULL, /*stop=*/NULL, /*kill=*/NULL, /*priv_size=*/sizeof(TensorOutputPriv)}; return &handler; } sox_effect_handler_t* get_file_output_handler() { static sox_effect_handler_t handler{/*name=*/"output_file", /*usage=*/NULL, /*flags=*/SOX_EFF_MCHAN, /*getopts=*/NULL, /*start=*/NULL, /*flow=*/file_output_flow, /*drain=*/NULL, /*stop=*/NULL, /*kill=*/NULL, /*priv_size=*/sizeof(FileOutputPriv)}; return &handler; } } // namespace SoxEffectsChain::SoxEffectsChain( sox_encodinginfo_t input_encoding, sox_encodinginfo_t output_encoding) : in_enc_(input_encoding), out_enc_(output_encoding), in_sig_(), interm_sig_(), out_sig_(), sec_(sox_create_effects_chain(&in_enc_, &out_enc_)) { if (!sec_) { throw std::runtime_error("Failed to create effect chain."); } } SoxEffectsChain::~SoxEffectsChain() { if (sec_ != nullptr) { sox_delete_effects_chain(sec_); } } void SoxEffectsChain::run() { sox_flow_effects(sec_, NULL, NULL); } void SoxEffectsChain::addInputTensor(TensorSignal* signal) { in_sig_ = get_signalinfo(signal, "wav"); interm_sig_ = in_sig_; SoxEffect e(sox_create_effect(get_tensor_input_handler())); auto priv = static_cast(e->priv); priv->signal = signal; priv->index = 0; if (sox_add_effect(sec_, e, &interm_sig_, &in_sig_) != SOX_SUCCESS) { throw std::runtime_error("Failed to add effect: input_tensor"); } } void SoxEffectsChain::addOutputBuffer( std::vector* output_buffer) { SoxEffect e(sox_create_effect(get_tensor_output_handler())); static_cast(e->priv)->buffer = output_buffer; if (sox_add_effect(sec_, e, &interm_sig_, &in_sig_) != SOX_SUCCESS) { throw std::runtime_error("Failed to add effect: output_tensor"); } } void SoxEffectsChain::addInputFile(sox_format_t* sf) { in_sig_ = sf->signal; interm_sig_ = in_sig_; SoxEffect e(sox_create_effect(sox_find_effect("input"))); char* opts[] = {(char*)sf}; sox_effect_options(e, 1, opts); if (sox_add_effect(sec_, e, &interm_sig_, &in_sig_) != SOX_SUCCESS) { std::ostringstream stream; stream << "Failed to add effect: input " << sf->filename; throw std::runtime_error(stream.str()); } } void SoxEffectsChain::addOutputFile(sox_format_t* sf) { out_sig_ = sf->signal; SoxEffect e(sox_create_effect(get_file_output_handler())); static_cast(e->priv)->sf = sf; if (sox_add_effect(sec_, e, &interm_sig_, &out_sig_) != SOX_SUCCESS) { std::ostringstream stream; stream << "Failed to add effect: output " << sf->filename; throw std::runtime_error(stream.str()); } } void SoxEffectsChain::addEffect(const std::vector effect) { const auto num_args = effect.size(); if (num_args == 0) { throw std::runtime_error("Invalid argument: empty effect."); } const auto name = effect[0]; if (UNSUPPORTED_EFFECTS.find(name) != UNSUPPORTED_EFFECTS.end()) { std::ostringstream stream; stream << "Unsupported effect: " << name; throw std::runtime_error(stream.str()); } SoxEffect e(sox_create_effect(sox_find_effect(name.c_str()))); const auto num_options = num_args - 1; std::vector opts; for (size_t i = 1; i < num_args; ++i) { opts.push_back((char*)effect[i].c_str()); } if (sox_effect_options(e, num_options, num_options ? opts.data() : nullptr) != SOX_SUCCESS) { std::ostringstream stream; stream << "Invalid effect option:"; for (const auto& v : effect) { stream << " " << v; } throw std::runtime_error(stream.str()); } if (sox_add_effect(sec_, e, &interm_sig_, &in_sig_) != SOX_SUCCESS) { std::ostringstream stream; stream << "Failed to add effect: \"" << name; for (size_t i = 1; i < num_args; ++i) { stream << " " << effect[i]; } stream << "\""; throw std::runtime_error(stream.str()); } } int64_t SoxEffectsChain::getOutputNumChannels() { return interm_sig_.channels; } int64_t SoxEffectsChain::getOutputSampleRate() { return interm_sig_.rate; } } // namespace sox_effects_chain } // namespace torchaudio audio-0.7.2/torchaudio/csrc/sox_effects_chain.h000066400000000000000000000024471376444676100215700ustar00rootroot00000000000000#ifndef TORCHAUDIO_SOX_EFFECTS_CHAIN_H #define TORCHAUDIO_SOX_EFFECTS_CHAIN_H #include #include #include namespace torchaudio { namespace sox_effects_chain { // Helper struct to safely close sox_effects_chain_t with handy methods class SoxEffectsChain { const sox_encodinginfo_t in_enc_; const sox_encodinginfo_t out_enc_; sox_signalinfo_t in_sig_; sox_signalinfo_t interm_sig_; sox_signalinfo_t out_sig_; sox_effects_chain_t* sec_; public: explicit SoxEffectsChain( sox_encodinginfo_t input_encoding, sox_encodinginfo_t output_encoding); SoxEffectsChain(const SoxEffectsChain& other) = delete; SoxEffectsChain(const SoxEffectsChain&& other) = delete; SoxEffectsChain& operator=(const SoxEffectsChain& other) = delete; SoxEffectsChain& operator=(SoxEffectsChain&& other) = delete; ~SoxEffectsChain(); void run(); void addInputTensor(torchaudio::sox_utils::TensorSignal* signal); void addInputFile(sox_format_t* sf); void addOutputBuffer(std::vector* output_buffer); void addOutputFile(sox_format_t* sf); void addEffect(const std::vector effect); int64_t getOutputNumChannels(); int64_t getOutputSampleRate(); }; } // namespace sox_effects_chain } // namespace torchaudio #endif audio-0.7.2/torchaudio/csrc/sox_io.cpp000066400000000000000000000064351376444676100177520ustar00rootroot00000000000000#include #include #include #include #include using namespace torch::indexing; using namespace torchaudio::sox_utils; namespace torchaudio { namespace sox_io { SignalInfo::SignalInfo( const int64_t sample_rate_, const int64_t num_channels_, const int64_t num_frames_) : sample_rate(sample_rate_), num_channels(num_channels_), num_frames(num_frames_){}; int64_t SignalInfo::getSampleRate() const { return sample_rate; } int64_t SignalInfo::getNumChannels() const { return num_channels; } int64_t SignalInfo::getNumFrames() const { return num_frames; } c10::intrusive_ptr get_info(const std::string& path) { SoxFormat sf(sox_open_read( path.c_str(), /*signal=*/nullptr, /*encoding=*/nullptr, /*filetype=*/nullptr)); if (static_cast(sf) == nullptr) { throw std::runtime_error("Error opening audio file"); } return c10::make_intrusive( static_cast(sf->signal.rate), static_cast(sf->signal.channels), static_cast(sf->signal.length / sf->signal.channels)); } c10::intrusive_ptr load_audio_file( const std::string& path, const int64_t frame_offset, const int64_t num_frames, const bool normalize, const bool channels_first) { if (frame_offset < 0) { throw std::runtime_error( "Invalid argument: frame_offset must be non-negative."); } if (num_frames == 0 || num_frames < -1) { throw std::runtime_error( "Invalid argument: num_frames must be -1 or greater than 0."); } std::vector> effects; if (num_frames != -1) { std::ostringstream offset, frames; offset << frame_offset << "s"; frames << "+" << num_frames << "s"; effects.emplace_back( std::vector{"trim", offset.str(), frames.str()}); } else if (frame_offset != 0) { std::ostringstream offset; offset << frame_offset << "s"; effects.emplace_back(std::vector{"trim", offset.str()}); } return torchaudio::sox_effects::apply_effects_file( path, effects, normalize, channels_first); } void save_audio_file( const std::string& file_name, const c10::intrusive_ptr& signal, const double compression) { const auto tensor = signal->getTensor(); validate_input_tensor(tensor); const auto filetype = get_filetype(file_name); const auto signal_info = get_signalinfo(signal.get(), filetype); const auto encoding_info = get_encodinginfo(filetype, tensor.dtype(), compression); SoxFormat sf(sox_open_write( file_name.c_str(), &signal_info, &encoding_info, /*filetype=*/filetype.c_str(), /*oob=*/nullptr, /*overwrite_permitted=*/nullptr)); if (static_cast(sf) == nullptr) { throw std::runtime_error("Error saving audio file: failed to open file."); } torchaudio::sox_effects_chain::SoxEffectsChain chain( /*input_encoding=*/get_encodinginfo("wav", tensor.dtype(), 0.), /*output_encoding=*/sf->encoding); chain.addInputTensor(signal.get()); chain.addOutputFile(sf); chain.run(); } } // namespace sox_io } // namespace torchaudio audio-0.7.2/torchaudio/csrc/sox_io.h000066400000000000000000000020201376444676100174010ustar00rootroot00000000000000#ifndef TORCHAUDIO_SOX_IO_H #define TORCHAUDIO_SOX_IO_H #include #include namespace torchaudio { namespace sox_io { struct SignalInfo : torch::CustomClassHolder { int64_t sample_rate; int64_t num_channels; int64_t num_frames; SignalInfo( const int64_t sample_rate_, const int64_t num_channels_, const int64_t num_frames_); int64_t getSampleRate() const; int64_t getNumChannels() const; int64_t getNumFrames() const; }; c10::intrusive_ptr get_info(const std::string& path); c10::intrusive_ptr load_audio_file( const std::string& path, const int64_t frame_offset = 0, const int64_t num_frames = -1, const bool normalize = true, const bool channels_first = true); void save_audio_file( const std::string& file_name, const c10::intrusive_ptr& signal, const double compression = 0.); } // namespace sox_io } // namespace torchaudio #endif audio-0.7.2/torchaudio/csrc/sox_utils.cpp000066400000000000000000000222731376444676100205010ustar00rootroot00000000000000#include #include #include namespace torchaudio { namespace sox_utils { void set_seed(const int64_t seed) { sox_get_globals()->ranqd1 = static_cast(seed); } void set_verbosity(const int64_t verbosity) { sox_get_globals()->verbosity = static_cast(verbosity); } void set_use_threads(const bool use_threads) { sox_get_globals()->use_threads = static_cast(use_threads); } void set_buffer_size(const int64_t buffer_size) { sox_get_globals()->bufsiz = static_cast(buffer_size); } std::vector> list_effects() { std::vector> effects; for (const sox_effect_fn_t* fns = sox_get_effect_fns(); *fns; ++fns) { const sox_effect_handler_t* handler = (*fns)(); if (handler && handler->name) { if (UNSUPPORTED_EFFECTS.find(handler->name) == UNSUPPORTED_EFFECTS.end()) { effects.emplace_back(std::vector{ handler->name, handler->usage ? std::string(handler->usage) : std::string("")}); } } } return effects; } std::vector list_write_formats() { std::vector formats; for (const sox_format_tab_t* fns = sox_get_format_fns(); fns->fn; ++fns) { const sox_format_handler_t* handler = fns->fn(); for (const char* const* names = handler->names; *names; ++names) { if (!strchr(*names, '/') && handler->write) formats.emplace_back(*names); } } return formats; } std::vector list_read_formats() { std::vector formats; for (const sox_format_tab_t* fns = sox_get_format_fns(); fns->fn; ++fns) { const sox_format_handler_t* handler = fns->fn(); for (const char* const* names = handler->names; *names; ++names) { if (!strchr(*names, '/') && handler->read) formats.emplace_back(*names); } } return formats; } TensorSignal::TensorSignal( torch::Tensor tensor_, int64_t sample_rate_, bool channels_first_) : tensor(tensor_), sample_rate(sample_rate_), channels_first(channels_first_){}; torch::Tensor TensorSignal::getTensor() const { return tensor; } int64_t TensorSignal::getSampleRate() const { return sample_rate; } bool TensorSignal::getChannelsFirst() const { return channels_first; } SoxFormat::SoxFormat(sox_format_t* fd) noexcept : fd_(fd) {} SoxFormat::~SoxFormat() { if (fd_ != nullptr) { sox_close(fd_); } } sox_format_t* SoxFormat::operator->() const noexcept { return fd_; } SoxFormat::operator sox_format_t*() const noexcept { return fd_; } void validate_input_file(const SoxFormat& sf) { if (static_cast(sf) == nullptr) { throw std::runtime_error("Error loading audio file: failed to open file."); } if (sf->encoding.encoding == SOX_ENCODING_UNKNOWN) { throw std::runtime_error("Error loading audio file: unknown encoding."); } if (sf->signal.length == 0) { throw std::runtime_error("Error reading audio file: unkown length."); } } void validate_input_tensor(const torch::Tensor tensor) { if (!tensor.device().is_cpu()) { throw std::runtime_error("Input tensor has to be on CPU."); } if (tensor.ndimension() != 2) { throw std::runtime_error("Input tensor has to be 2D."); } const auto dtype = tensor.dtype(); if (!(dtype == torch::kFloat32 || dtype == torch::kInt32 || dtype == torch::kInt16 || dtype == torch::kUInt8)) { throw std::runtime_error( "Input tensor has to be one of float32, int32, int16 or uint8 type."); } } caffe2::TypeMeta get_dtype( const sox_encoding_t encoding, const unsigned precision) { const auto dtype = [&]() { switch (encoding) { case SOX_ENCODING_UNSIGNED: // 8-bit PCM WAV return torch::kUInt8; case SOX_ENCODING_SIGN2: // 16-bit or 32-bit PCM WAV switch (precision) { case 16: return torch::kInt16; case 32: return torch::kInt32; default: throw std::runtime_error( "Only 16 and 32 bits are supported for signed PCM."); } default: // default to float32 for the other formats, including // 32-bit flaoting-point WAV, // MP3, // FLAC, // VORBIS etc... return torch::kFloat32; } }(); return c10::scalarTypeToTypeMeta(dtype); } torch::Tensor convert_to_tensor( sox_sample_t* buffer, const int32_t num_samples, const int32_t num_channels, const caffe2::TypeMeta dtype, const bool normalize, const bool channels_first) { auto t = torch::from_blob( buffer, {num_samples / num_channels, num_channels}, torch::kInt32); // Note: Tensor created from_blob does not own data but borrwos // So make sure to create a new copy after processing samples. if (normalize || dtype == torch::kFloat32) { t = t.to(torch::kFloat32); t *= (t > 0) / 2147483647. + (t < 0) / 2147483648.; } else if (dtype == torch::kInt32) { t = t.clone(); } else if (dtype == torch::kInt16) { t.floor_divide_(1 << 16); t = t.to(torch::kInt16); } else if (dtype == torch::kUInt8) { t.floor_divide_(1 << 24); t += 128; t = t.to(torch::kUInt8); } else { throw std::runtime_error("Unsupported dtype."); } if (channels_first) { t = t.transpose(1, 0); } return t.contiguous(); } torch::Tensor unnormalize_wav(const torch::Tensor input_tensor) { const auto dtype = input_tensor.dtype(); auto tensor = input_tensor; if (dtype == torch::kFloat32) { double multi_pos = 2147483647.; double multi_neg = -2147483648.; auto mult = (tensor > 0) * multi_pos - (tensor < 0) * multi_neg; tensor = tensor.to(torch::dtype(torch::kFloat64)); tensor *= mult; tensor.clamp_(multi_neg, multi_pos); tensor = tensor.to(torch::dtype(torch::kInt32)); } else if (dtype == torch::kInt32) { // already denormalized } else if (dtype == torch::kInt16) { tensor = tensor.to(torch::dtype(torch::kInt32)); tensor *= ((tensor != 0) * 65536); } else if (dtype == torch::kUInt8) { tensor = tensor.to(torch::dtype(torch::kInt32)); tensor -= 128; tensor *= 16777216; } else { throw std::runtime_error("Unexpected dtype."); } return tensor; } const std::string get_filetype(const std::string path) { std::string ext = path.substr(path.find_last_of(".") + 1); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); return ext; } sox_encoding_t get_encoding( const std::string filetype, const caffe2::TypeMeta dtype) { if (filetype == "mp3") return SOX_ENCODING_MP3; if (filetype == "flac") return SOX_ENCODING_FLAC; if (filetype == "ogg" || filetype == "vorbis") return SOX_ENCODING_VORBIS; if (filetype == "wav") { if (dtype == torch::kUInt8) return SOX_ENCODING_UNSIGNED; if (dtype == torch::kInt16) return SOX_ENCODING_SIGN2; if (dtype == torch::kInt32) return SOX_ENCODING_SIGN2; if (dtype == torch::kFloat32) return SOX_ENCODING_FLOAT; throw std::runtime_error("Unsupported dtype."); } if (filetype == "sph") return SOX_ENCODING_SIGN2; throw std::runtime_error("Unsupported file type."); } unsigned get_precision( const std::string filetype, const caffe2::TypeMeta dtype) { if (filetype == "mp3") return SOX_UNSPEC; if (filetype == "flac") return 24; if (filetype == "ogg" || filetype == "vorbis") return SOX_UNSPEC; if (filetype == "wav") { if (dtype == torch::kUInt8) return 8; if (dtype == torch::kInt16) return 16; if (dtype == torch::kInt32) return 32; if (dtype == torch::kFloat32) return 32; throw std::runtime_error("Unsupported dtype."); } if (filetype == "sph") return 32; throw std::runtime_error("Unsupported file type."); } sox_signalinfo_t get_signalinfo( const TensorSignal* signal, const std::string filetype) { auto tensor = signal->getTensor(); return sox_signalinfo_t{ /*rate=*/static_cast(signal->getSampleRate()), /*channels=*/ static_cast(tensor.size(signal->getChannelsFirst() ? 0 : 1)), /*precision=*/get_precision(filetype, tensor.dtype()), /*length=*/static_cast(tensor.numel())}; } sox_encodinginfo_t get_encodinginfo( const std::string filetype, const caffe2::TypeMeta dtype, const double compression) { const double compression_ = [&]() { if (filetype == "mp3") return compression; if (filetype == "flac") return compression; if (filetype == "ogg" || filetype == "vorbis") return compression; if (filetype == "wav") return 0.; if (filetype == "sph") return 0.; throw std::runtime_error("Unsupported file type."); }(); return sox_encodinginfo_t{/*encoding=*/get_encoding(filetype, dtype), /*bits_per_sample=*/get_precision(filetype, dtype), /*compression=*/compression_, /*reverse_bytes=*/sox_option_default, /*reverse_nibbles=*/sox_option_default, /*reverse_bits=*/sox_option_default, /*opposite_endian=*/sox_false}; } } // namespace sox_utils } // namespace torchaudio audio-0.7.2/torchaudio/csrc/sox_utils.h000066400000000000000000000076441376444676100201530ustar00rootroot00000000000000#ifndef TORCHAUDIO_SOX_UTILS_H #define TORCHAUDIO_SOX_UTILS_H #include #include namespace torchaudio { namespace sox_utils { //////////////////////////////////////////////////////////////////////////////// // APIs for Python interaction //////////////////////////////////////////////////////////////////////////////// /// Set sox global options void set_seed(const int64_t seed); void set_verbosity(const int64_t verbosity); void set_use_threads(const bool use_threads); void set_buffer_size(const int64_t buffer_size); std::vector> list_effects(); std::vector list_read_formats(); std::vector list_write_formats(); /// Class for exchanging signal infomation (tensor + meta data) between /// C++ and Python for read/write operation. struct TensorSignal : torch::CustomClassHolder { torch::Tensor tensor; int64_t sample_rate; bool channels_first; TensorSignal( torch::Tensor tensor_, int64_t sample_rate_, bool channels_first_); torch::Tensor getTensor() const; int64_t getSampleRate() const; bool getChannelsFirst() const; }; //////////////////////////////////////////////////////////////////////////////// // Utilities for sox_io / sox_effects implementations //////////////////////////////////////////////////////////////////////////////// const std::unordered_set UNSUPPORTED_EFFECTS = {"input", "output", "spectrogram", "noiseprof", "noisered", "splice"}; /// helper class to automatically close sox_format_t* struct SoxFormat { explicit SoxFormat(sox_format_t* fd) noexcept; SoxFormat(const SoxFormat& other) = delete; SoxFormat(SoxFormat&& other) = delete; SoxFormat& operator=(const SoxFormat& other) = delete; SoxFormat& operator=(SoxFormat&& other) = delete; ~SoxFormat(); sox_format_t* operator->() const noexcept; operator sox_format_t*() const noexcept; private: sox_format_t* fd_; }; /// /// Verify that input file is found, has known encoding, and not empty void validate_input_file(const SoxFormat& sf); /// /// Verify that input Tensor is 2D, CPU and either uin8, int16, int32 or float32 void validate_input_tensor(const torch::Tensor); /// /// Get target dtype for the given encoding and precision. caffe2::TypeMeta get_dtype( const sox_encoding_t encoding, const unsigned precision); /// /// Convert sox_sample_t buffer to uint8/int16/int32/float32 Tensor /// NOTE: This function might modify the values in the input buffer to /// reduce the number of memory copy. /// @param buffer Pointer to buffer that contains audio data. /// @param num_samples The number of samples to read. /// @param num_channels The number of channels. Used to reshape the resulting /// Tensor. /// @param dtype Target dtype. Determines the output dtype and value range in /// conjunction with normalization. /// @param noramlize Perform normalization. Only effective when dtype is not /// kFloat32. When effective, the output tensor is kFloat32 type and value range /// is [-1.0, 1.0] /// @param channels_first When True, output Tensor has shape of [num_channels, /// num_frames]. torch::Tensor convert_to_tensor( sox_sample_t* buffer, const int32_t num_samples, const int32_t num_channels, const caffe2::TypeMeta dtype, const bool normalize, const bool channels_first); /// /// Convert float32/int32/int16/uint8 Tensor to int32 for Torch -> Sox /// conversion. torch::Tensor unnormalize_wav(const torch::Tensor); /// Extract extension from file path const std::string get_filetype(const std::string path); /// Get sox_signalinfo_t for passing a torch::Tensor object. sox_signalinfo_t get_signalinfo( const TensorSignal* signal, const std::string filetype); /// Get sox_encofinginfo_t for saving audoi file sox_encodinginfo_t get_encodinginfo( const std::string filetype, const caffe2::TypeMeta dtype, const double compression); } // namespace sox_utils } // namespace torchaudio #endif audio-0.7.2/torchaudio/datasets/000077500000000000000000000000001376444676100166145ustar00rootroot00000000000000audio-0.7.2/torchaudio/datasets/__init__.py000066400000000000000000000011451376444676100207260ustar00rootroot00000000000000from .commonvoice import COMMONVOICE from .librispeech import LIBRISPEECH from .speechcommands import SPEECHCOMMANDS from .utils import bg_iterator, diskcache_iterator from .vctk import VCTK, VCTK_092 from .gtzan import GTZAN from .yesno import YESNO from .ljspeech import LJSPEECH from .cmuarctic import CMUARCTIC from .libritts import LIBRITTS from .tedlium import TEDLIUM __all__ = ( "COMMONVOICE", "LIBRISPEECH", "SPEECHCOMMANDS", "VCTK", "VCTK_092", "YESNO", "LJSPEECH", "GTZAN", "CMUARCTIC", "LIBRITTS", "diskcache_iterator", "bg_iterator", "TEDLIUM", ) audio-0.7.2/torchaudio/datasets/cmuarctic.py000066400000000000000000000134251376444676100211450ustar00rootroot00000000000000import os from typing import Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, unicode_csv_reader, ) URL = "aew" FOLDER_IN_ARCHIVE = "ARCTIC" _CHECKSUMS = { "http://festvox.org/cmu_arctic/packed/cmu_us_aew_arctic.tar.bz2": "4382b116efcc8339c37e01253cb56295", "http://festvox.org/cmu_arctic/packed/cmu_us_ahw_arctic.tar.bz2": "b072d6e961e3f36a2473042d097d6da9", "http://festvox.org/cmu_arctic/packed/cmu_us_aup_arctic.tar.bz2": "5301c7aee8919d2abd632e2667adfa7f", "http://festvox.org/cmu_arctic/packed/cmu_us_awb_arctic.tar.bz2": "280fdff1e9857119d9a2c57b50e12db7", "http://festvox.org/cmu_arctic/packed/cmu_us_axb_arctic.tar.bz2": "5e21cb26c6529c533df1d02ccde5a186", "http://festvox.org/cmu_arctic/packed/cmu_us_bdl_arctic.tar.bz2": "b2c3e558f656af2e0a65da0ac0c3377a", "http://festvox.org/cmu_arctic/packed/cmu_us_clb_arctic.tar.bz2": "3957c503748e3ce17a3b73c1b9861fb0", "http://festvox.org/cmu_arctic/packed/cmu_us_eey_arctic.tar.bz2": "59708e932d27664f9eda3e8e6859969b", "http://festvox.org/cmu_arctic/packed/cmu_us_fem_arctic.tar.bz2": "dba4f992ff023347c07c304bf72f4c73", "http://festvox.org/cmu_arctic/packed/cmu_us_gka_arctic.tar.bz2": "24a876ea7335c1b0ff21460e1241340f", "http://festvox.org/cmu_arctic/packed/cmu_us_jmk_arctic.tar.bz2": "afb69d95f02350537e8a28df5ab6004b", "http://festvox.org/cmu_arctic/packed/cmu_us_ksp_arctic.tar.bz2": "4ce5b3b91a0a54b6b685b1b05aa0b3be", "http://festvox.org/cmu_arctic/packed/cmu_us_ljm_arctic.tar.bz2": "6f45a3b2c86a4ed0465b353be291f77d", "http://festvox.org/cmu_arctic/packed/cmu_us_lnh_arctic.tar.bz2": "c6a15abad5c14d27f4ee856502f0232f", "http://festvox.org/cmu_arctic/packed/cmu_us_rms_arctic.tar.bz2": "71072c983df1e590d9e9519e2a621f6e", "http://festvox.org/cmu_arctic/packed/cmu_us_rxr_arctic.tar.bz2": "3771ff03a2f5b5c3b53aa0a68b9ad0d5", "http://festvox.org/cmu_arctic/packed/cmu_us_slp_arctic.tar.bz2": "9cbf984a832ea01b5058ba9a96862850", "http://festvox.org/cmu_arctic/packed/cmu_us_slt_arctic.tar.bz2": "959eecb2cbbc4ac304c6b92269380c81", } def load_cmuarctic_item(line: str, path: str, folder_audio: str, ext_audio: str) -> Tuple[Tensor, int, str, str]: utterance_id, utterance = line[0].strip().split(" ", 2)[1:] # Remove space, double quote, and single parenthesis from utterance utterance = utterance[1:-3] file_audio = os.path.join(path, folder_audio, utterance_id + ext_audio) # Load audio waveform, sample_rate = torchaudio.load(file_audio) return ( waveform, sample_rate, utterance, utterance_id.split("_")[1] ) class CMUARCTIC(Dataset): """Create a Dataset for CMU_ARCTIC. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from or the type of the dataset to dowload. (default: ``"aew"``) Allowed type values are ``"aew"``, ``"ahw"``, ``"aup"``, ``"awb"``, ``"axb"``, ``"bdl"``, ``"clb"``, ``"eey"``, ``"fem"``, ``"gka"``, ``"jmk"``, ``"ksp"``, ``"ljm"``, ``"lnh"``, ``"rms"``, ``"rxr"``, ``"slp"`` or ``"slt"``. folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"ARCTIC"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ _file_text = "txt.done.data" _folder_text = "etc" _ext_audio = ".wav" _folder_audio = "wav" def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False) -> None: if url in [ "aew", "ahw", "aup", "awb", "axb", "bdl", "clb", "eey", "fem", "gka", "jmk", "ksp", "ljm", "lnh", "rms", "rxr", "slp", "slt" ]: url = "cmu_us_" + url + "_arctic" ext_archive = ".tar.bz2" base_url = "http://www.festvox.org/cmu_arctic/packed/" url = os.path.join(base_url, url + ext_archive) basename = os.path.basename(url) root = os.path.join(root, folder_in_archive) if not os.path.isdir(root): os.mkdir(root) archive = os.path.join(root, basename) basename = basename.split(".")[0] self._path = os.path.join(root, basename) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum, hash_type="md5") extract_archive(archive) self._text = os.path.join(self._path, self._folder_text, self._file_text) with open(self._text, "r") as text: walker = unicode_csv_reader(text, delimiter="\n") self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, str]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, utterance, utterance_id)`` """ line = self._walker[n] return load_cmuarctic_item(line, self._path, self._folder_audio, self._ext_audio) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/commonvoice.py000066400000000000000000000235271376444676100215150ustar00rootroot00000000000000import os from typing import List, Dict, Tuple import torchaudio from torchaudio.datasets.utils import download_url, extract_archive, unicode_csv_reader from torch import Tensor from torch.utils.data import Dataset # Default TSV should be one of # dev.tsv # invalidated.tsv # other.tsv # test.tsv # train.tsv # validated.tsv FOLDER_IN_ARCHIVE = "CommonVoice" URL = "english" VERSION = "cv-corpus-4-2019-12-10" TSV = "train.tsv" _CHECKSUMS = { "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/tt.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/en.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/de.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/fr.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/cy.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/br.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/cv.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/tr.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/ky.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/ga-IE.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/kab.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/ca.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/zh-TW.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/sl.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/it.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/nl.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/cnh.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/eo.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/et.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/fa.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/eu.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/es.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/zh-CN.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/mn.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/sah.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/dv.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/rw.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/sv-SE.tar.gz": None, "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com/cv-corpus-3/ru.tar.gz": None } def load_commonvoice_item(line: List[str], header: List[str], path: str, folder_audio: str) -> Tuple[Tensor, int, Dict[str, str]]: # Each line as the following data: # client_id, path, sentence, up_votes, down_votes, age, gender, accent assert header[1] == "path" fileid = line[1] filename = os.path.join(path, folder_audio, fileid) waveform, sample_rate = torchaudio.load(filename) dic = dict(zip(header, line)) return waveform, sample_rate, dic class COMMONVOICE(Dataset): """Create a Dataset for CommonVoice. Args: root (str): Path to the directory where the dataset is found or downloaded. tsv (str, optional): The name of the tsv file used to construct the metadata. (default: ``"train.tsv"``) url (str, optional): The URL to download the dataset from, or the language of the dataset to download. (default: ``"english"``). Allowed language values are ``"tatar"``, ``"english"``, ``"german"``, ``"french"``, ``"welsh"``, ``"breton"``, ``"chuvash"``, ``"turkish"``, ``"kyrgyz"``, ``"irish"``, ``"kabyle"``, ``"catalan"``, ``"taiwanese"``, ``"slovenian"``, ``"italian"``, ``"dutch"``, ``"hakha chin"``, ``"esperanto"``, ``"estonian"``, ``"persian"``, ``"portuguese"``, ``"basque"``, ``"spanish"``, ``"chinese"``, ``"mongolian"``, ``"sakha"``, ``"dhivehi"``, ``"kinyarwanda"``, ``"swedish"``, ``"russian"``, ``"indonesian"``, ``"arabic"``, ``"tamil"``, ``"interlingua"``, ``"latvian"``, ``"japanese"``, ``"votic"``, ``"abkhaz"``, ``"cantonese"`` and ``"romansh sursilvan"``. folder_in_archive (str, optional): The top-level directory of the dataset. version (str): Version string. (default: ``"cv-corpus-4-2019-12-10"``) For the other allowed values, Please checkout https://commonvoice.mozilla.org/en/datasets. download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ _ext_txt = ".txt" _ext_audio = ".mp3" _folder_audio = "clips" def __init__(self, root: str, tsv: str = TSV, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, version: str = VERSION, download: bool = False) -> None: languages = { "tatar": "tt", "english": "en", "german": "de", "french": "fr", "welsh": "cy", "breton": "br", "chuvash": "cv", "turkish": "tr", "kyrgyz": "ky", "irish": "ga-IE", "kabyle": "kab", "catalan": "ca", "taiwanese": "zh-TW", "slovenian": "sl", "italian": "it", "dutch": "nl", "hakha chin": "cnh", "esperanto": "eo", "estonian": "et", "persian": "fa", "portuguese": "pt", "basque": "eu", "spanish": "es", "chinese": "zh-CN", "mongolian": "mn", "sakha": "sah", "dhivehi": "dv", "kinyarwanda": "rw", "swedish": "sv-SE", "russian": "ru", "indonesian": "id", "arabic": "ar", "tamil": "ta", "interlingua": "ia", "latvian": "lv", "japanese": "ja", "votic": "vot", "abkhaz": "ab", "cantonese": "zh-HK", "romansh sursilvan": "rm-sursilv" } if download: raise RuntimeError( "Common Voice dataset requires user agreement on the usage term, " "and torchaudio no longer provides the download feature. " "Please download the dataset manually and extract it in the root directory, " "then provide the target language to `url` argument.") if url not in languages: raise ValueError(f"`url` must be one of available languages: {languages.keys()}") if url in languages: ext_archive = ".tar.gz" language = languages[url] base_url = "https://voice-prod-bundler-ee1969a6ce8178826482b88e843c335139bd3fb4.s3.amazonaws.com" url = os.path.join(base_url, version, language + ext_archive) basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.rsplit(".", 2)[0] folder_in_archive = os.path.join(folder_in_archive, version, basename) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum) extract_archive(archive) self._tsv = os.path.join(root, folder_in_archive, tsv) with open(self._tsv, "r") as tsv: walker = unicode_csv_reader(tsv, delimiter="\t") self._header = next(walker) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, Dict[str, str]]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, dictionary)``, where dictionary is built from the TSV file with the following keys: ``client_id``, ``path``, ``sentence``, ``up_votes``, ``down_votes``, ``age``, ``gender`` and ``accent``. """ line = self._walker[n] return load_commonvoice_item(line, self._header, self._path, self._folder_audio) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/gtzan.py000066400000000000000000000565171376444676100203270ustar00rootroot00000000000000import os import warnings from typing import Any, Tuple, Optional import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, ) # The following lists prefixed with `filtered_` provide a filtered split # that: # # a. Mitigate a known issue with GTZAN (duplication) # # b. Provide a standard split for testing it against other # methods (e.g. the one in jordipons/sklearn-audio-transfer-learning). # # Those are used when GTZAN is initialised with the `filtered` keyword. # The split was taken from (github) jordipons/sklearn-audio-transfer-learning. gtzan_genres = [ "blues", "classical", "country", "disco", "hiphop", "jazz", "metal", "pop", "reggae", "rock", ] filtered_test = [ "blues.00012", "blues.00013", "blues.00014", "blues.00015", "blues.00016", "blues.00017", "blues.00018", "blues.00019", "blues.00020", "blues.00021", "blues.00022", "blues.00023", "blues.00024", "blues.00025", "blues.00026", "blues.00027", "blues.00028", "blues.00061", "blues.00062", "blues.00063", "blues.00064", "blues.00065", "blues.00066", "blues.00067", "blues.00068", "blues.00069", "blues.00070", "blues.00071", "blues.00072", "blues.00098", "blues.00099", "classical.00011", "classical.00012", "classical.00013", "classical.00014", "classical.00015", "classical.00016", "classical.00017", "classical.00018", "classical.00019", "classical.00020", "classical.00021", "classical.00022", "classical.00023", "classical.00024", "classical.00025", "classical.00026", "classical.00027", "classical.00028", "classical.00029", "classical.00034", "classical.00035", "classical.00036", "classical.00037", "classical.00038", "classical.00039", "classical.00040", "classical.00041", "classical.00049", "classical.00077", "classical.00078", "classical.00079", "country.00030", "country.00031", "country.00032", "country.00033", "country.00034", "country.00035", "country.00036", "country.00037", "country.00038", "country.00039", "country.00040", "country.00043", "country.00044", "country.00046", "country.00047", "country.00048", "country.00050", "country.00051", "country.00053", "country.00054", "country.00055", "country.00056", "country.00057", "country.00058", "country.00059", "country.00060", "country.00061", "country.00062", "country.00063", "country.00064", "disco.00001", "disco.00021", "disco.00058", "disco.00062", "disco.00063", "disco.00064", "disco.00065", "disco.00066", "disco.00069", "disco.00076", "disco.00077", "disco.00078", "disco.00079", "disco.00080", "disco.00081", "disco.00082", "disco.00083", "disco.00084", "disco.00085", "disco.00086", "disco.00087", "disco.00088", "disco.00091", "disco.00092", "disco.00093", "disco.00094", "disco.00096", "disco.00097", "disco.00099", "hiphop.00000", "hiphop.00026", "hiphop.00027", "hiphop.00030", "hiphop.00040", "hiphop.00043", "hiphop.00044", "hiphop.00045", "hiphop.00051", "hiphop.00052", "hiphop.00053", "hiphop.00054", "hiphop.00062", "hiphop.00063", "hiphop.00064", "hiphop.00065", "hiphop.00066", "hiphop.00067", "hiphop.00068", "hiphop.00069", "hiphop.00070", "hiphop.00071", "hiphop.00072", "hiphop.00073", "hiphop.00074", "hiphop.00075", "hiphop.00099", "jazz.00073", "jazz.00074", "jazz.00075", "jazz.00076", "jazz.00077", "jazz.00078", "jazz.00079", "jazz.00080", "jazz.00081", "jazz.00082", "jazz.00083", "jazz.00084", "jazz.00085", "jazz.00086", "jazz.00087", "jazz.00088", "jazz.00089", "jazz.00090", "jazz.00091", "jazz.00092", "jazz.00093", "jazz.00094", "jazz.00095", "jazz.00096", "jazz.00097", "jazz.00098", "jazz.00099", "metal.00012", "metal.00013", "metal.00014", "metal.00015", "metal.00022", "metal.00023", "metal.00025", "metal.00026", "metal.00027", "metal.00028", "metal.00029", "metal.00030", "metal.00031", "metal.00032", "metal.00033", "metal.00038", "metal.00039", "metal.00067", "metal.00070", "metal.00073", "metal.00074", "metal.00075", "metal.00078", "metal.00083", "metal.00085", "metal.00087", "metal.00088", "pop.00000", "pop.00001", "pop.00013", "pop.00014", "pop.00043", "pop.00063", "pop.00064", "pop.00065", "pop.00066", "pop.00069", "pop.00070", "pop.00071", "pop.00072", "pop.00073", "pop.00074", "pop.00075", "pop.00076", "pop.00077", "pop.00078", "pop.00079", "pop.00082", "pop.00088", "pop.00089", "pop.00090", "pop.00091", "pop.00092", "pop.00093", "pop.00094", "pop.00095", "pop.00096", "reggae.00034", "reggae.00035", "reggae.00036", "reggae.00037", "reggae.00038", "reggae.00039", "reggae.00040", "reggae.00046", "reggae.00047", "reggae.00048", "reggae.00052", "reggae.00053", "reggae.00064", "reggae.00065", "reggae.00066", "reggae.00067", "reggae.00068", "reggae.00071", "reggae.00079", "reggae.00082", "reggae.00083", "reggae.00084", "reggae.00087", "reggae.00088", "reggae.00089", "reggae.00090", "rock.00010", "rock.00011", "rock.00012", "rock.00013", "rock.00014", "rock.00015", "rock.00027", "rock.00028", "rock.00029", "rock.00030", "rock.00031", "rock.00032", "rock.00033", "rock.00034", "rock.00035", "rock.00036", "rock.00037", "rock.00039", "rock.00040", "rock.00041", "rock.00042", "rock.00043", "rock.00044", "rock.00045", "rock.00046", "rock.00047", "rock.00048", "rock.00086", "rock.00087", "rock.00088", "rock.00089", "rock.00090", ] filtered_train = [ "blues.00029", "blues.00030", "blues.00031", "blues.00032", "blues.00033", "blues.00034", "blues.00035", "blues.00036", "blues.00037", "blues.00038", "blues.00039", "blues.00040", "blues.00041", "blues.00042", "blues.00043", "blues.00044", "blues.00045", "blues.00046", "blues.00047", "blues.00048", "blues.00049", "blues.00073", "blues.00074", "blues.00075", "blues.00076", "blues.00077", "blues.00078", "blues.00079", "blues.00080", "blues.00081", "blues.00082", "blues.00083", "blues.00084", "blues.00085", "blues.00086", "blues.00087", "blues.00088", "blues.00089", "blues.00090", "blues.00091", "blues.00092", "blues.00093", "blues.00094", "blues.00095", "blues.00096", "blues.00097", "classical.00030", "classical.00031", "classical.00032", "classical.00033", "classical.00043", "classical.00044", "classical.00045", "classical.00046", "classical.00047", "classical.00048", "classical.00050", "classical.00051", "classical.00052", "classical.00053", "classical.00054", "classical.00055", "classical.00056", "classical.00057", "classical.00058", "classical.00059", "classical.00060", "classical.00061", "classical.00062", "classical.00063", "classical.00064", "classical.00065", "classical.00066", "classical.00067", "classical.00080", "classical.00081", "classical.00082", "classical.00083", "classical.00084", "classical.00085", "classical.00086", "classical.00087", "classical.00088", "classical.00089", "classical.00090", "classical.00091", "classical.00092", "classical.00093", "classical.00094", "classical.00095", "classical.00096", "classical.00097", "classical.00098", "classical.00099", "country.00019", "country.00020", "country.00021", "country.00022", "country.00023", "country.00024", "country.00025", "country.00026", "country.00028", "country.00029", "country.00065", "country.00066", "country.00067", "country.00068", "country.00069", "country.00070", "country.00071", "country.00072", "country.00073", "country.00074", "country.00075", "country.00076", "country.00077", "country.00078", "country.00079", "country.00080", "country.00081", "country.00082", "country.00083", "country.00084", "country.00085", "country.00086", "country.00087", "country.00088", "country.00089", "country.00090", "country.00091", "country.00092", "country.00093", "country.00094", "country.00095", "country.00096", "country.00097", "country.00098", "country.00099", "disco.00005", "disco.00015", "disco.00016", "disco.00017", "disco.00018", "disco.00019", "disco.00020", "disco.00022", "disco.00023", "disco.00024", "disco.00025", "disco.00026", "disco.00027", "disco.00028", "disco.00029", "disco.00030", "disco.00031", "disco.00032", "disco.00033", "disco.00034", "disco.00035", "disco.00036", "disco.00037", "disco.00039", "disco.00040", "disco.00041", "disco.00042", "disco.00043", "disco.00044", "disco.00045", "disco.00047", "disco.00049", "disco.00053", "disco.00054", "disco.00056", "disco.00057", "disco.00059", "disco.00061", "disco.00070", "disco.00073", "disco.00074", "disco.00089", "hiphop.00002", "hiphop.00003", "hiphop.00004", "hiphop.00005", "hiphop.00006", "hiphop.00007", "hiphop.00008", "hiphop.00009", "hiphop.00010", "hiphop.00011", "hiphop.00012", "hiphop.00013", "hiphop.00014", "hiphop.00015", "hiphop.00016", "hiphop.00017", "hiphop.00018", "hiphop.00019", "hiphop.00020", "hiphop.00021", "hiphop.00022", "hiphop.00023", "hiphop.00024", "hiphop.00025", "hiphop.00028", "hiphop.00029", "hiphop.00031", "hiphop.00032", "hiphop.00033", "hiphop.00034", "hiphop.00035", "hiphop.00036", "hiphop.00037", "hiphop.00038", "hiphop.00041", "hiphop.00042", "hiphop.00055", "hiphop.00056", "hiphop.00057", "hiphop.00058", "hiphop.00059", "hiphop.00060", "hiphop.00061", "hiphop.00077", "hiphop.00078", "hiphop.00079", "hiphop.00080", "jazz.00000", "jazz.00001", "jazz.00011", "jazz.00012", "jazz.00013", "jazz.00014", "jazz.00015", "jazz.00016", "jazz.00017", "jazz.00018", "jazz.00019", "jazz.00020", "jazz.00021", "jazz.00022", "jazz.00023", "jazz.00024", "jazz.00041", "jazz.00047", "jazz.00048", "jazz.00049", "jazz.00050", "jazz.00051", "jazz.00052", "jazz.00053", "jazz.00054", "jazz.00055", "jazz.00056", "jazz.00057", "jazz.00058", "jazz.00059", "jazz.00060", "jazz.00061", "jazz.00062", "jazz.00063", "jazz.00064", "jazz.00065", "jazz.00066", "jazz.00067", "jazz.00068", "jazz.00069", "jazz.00070", "jazz.00071", "jazz.00072", "metal.00002", "metal.00003", "metal.00005", "metal.00021", "metal.00024", "metal.00035", "metal.00046", "metal.00047", "metal.00048", "metal.00049", "metal.00050", "metal.00051", "metal.00052", "metal.00053", "metal.00054", "metal.00055", "metal.00056", "metal.00057", "metal.00059", "metal.00060", "metal.00061", "metal.00062", "metal.00063", "metal.00064", "metal.00065", "metal.00066", "metal.00069", "metal.00071", "metal.00072", "metal.00079", "metal.00080", "metal.00084", "metal.00086", "metal.00089", "metal.00090", "metal.00091", "metal.00092", "metal.00093", "metal.00094", "metal.00095", "metal.00096", "metal.00097", "metal.00098", "metal.00099", "pop.00002", "pop.00003", "pop.00004", "pop.00005", "pop.00006", "pop.00007", "pop.00008", "pop.00009", "pop.00011", "pop.00012", "pop.00016", "pop.00017", "pop.00018", "pop.00019", "pop.00020", "pop.00023", "pop.00024", "pop.00025", "pop.00026", "pop.00027", "pop.00028", "pop.00029", "pop.00031", "pop.00032", "pop.00033", "pop.00034", "pop.00035", "pop.00036", "pop.00038", "pop.00039", "pop.00040", "pop.00041", "pop.00042", "pop.00044", "pop.00046", "pop.00049", "pop.00050", "pop.00080", "pop.00097", "pop.00098", "pop.00099", "reggae.00000", "reggae.00001", "reggae.00002", "reggae.00004", "reggae.00006", "reggae.00009", "reggae.00011", "reggae.00012", "reggae.00014", "reggae.00015", "reggae.00016", "reggae.00017", "reggae.00018", "reggae.00019", "reggae.00020", "reggae.00021", "reggae.00022", "reggae.00023", "reggae.00024", "reggae.00025", "reggae.00026", "reggae.00027", "reggae.00028", "reggae.00029", "reggae.00030", "reggae.00031", "reggae.00032", "reggae.00042", "reggae.00043", "reggae.00044", "reggae.00045", "reggae.00049", "reggae.00050", "reggae.00051", "reggae.00054", "reggae.00055", "reggae.00056", "reggae.00057", "reggae.00058", "reggae.00059", "reggae.00060", "reggae.00063", "reggae.00069", "rock.00000", "rock.00001", "rock.00002", "rock.00003", "rock.00004", "rock.00005", "rock.00006", "rock.00007", "rock.00008", "rock.00009", "rock.00016", "rock.00017", "rock.00018", "rock.00019", "rock.00020", "rock.00021", "rock.00022", "rock.00023", "rock.00024", "rock.00025", "rock.00026", "rock.00057", "rock.00058", "rock.00059", "rock.00060", "rock.00061", "rock.00062", "rock.00063", "rock.00064", "rock.00065", "rock.00066", "rock.00067", "rock.00068", "rock.00069", "rock.00070", "rock.00091", "rock.00092", "rock.00093", "rock.00094", "rock.00095", "rock.00096", "rock.00097", "rock.00098", "rock.00099", ] filtered_valid = [ "blues.00000", "blues.00001", "blues.00002", "blues.00003", "blues.00004", "blues.00005", "blues.00006", "blues.00007", "blues.00008", "blues.00009", "blues.00010", "blues.00011", "blues.00050", "blues.00051", "blues.00052", "blues.00053", "blues.00054", "blues.00055", "blues.00056", "blues.00057", "blues.00058", "blues.00059", "blues.00060", "classical.00000", "classical.00001", "classical.00002", "classical.00003", "classical.00004", "classical.00005", "classical.00006", "classical.00007", "classical.00008", "classical.00009", "classical.00010", "classical.00068", "classical.00069", "classical.00070", "classical.00071", "classical.00072", "classical.00073", "classical.00074", "classical.00075", "classical.00076", "country.00000", "country.00001", "country.00002", "country.00003", "country.00004", "country.00005", "country.00006", "country.00007", "country.00009", "country.00010", "country.00011", "country.00012", "country.00013", "country.00014", "country.00015", "country.00016", "country.00017", "country.00018", "country.00027", "country.00041", "country.00042", "country.00045", "country.00049", "disco.00000", "disco.00002", "disco.00003", "disco.00004", "disco.00006", "disco.00007", "disco.00008", "disco.00009", "disco.00010", "disco.00011", "disco.00012", "disco.00013", "disco.00014", "disco.00046", "disco.00048", "disco.00052", "disco.00067", "disco.00068", "disco.00072", "disco.00075", "disco.00090", "disco.00095", "hiphop.00081", "hiphop.00082", "hiphop.00083", "hiphop.00084", "hiphop.00085", "hiphop.00086", "hiphop.00087", "hiphop.00088", "hiphop.00089", "hiphop.00090", "hiphop.00091", "hiphop.00092", "hiphop.00093", "hiphop.00094", "hiphop.00095", "hiphop.00096", "hiphop.00097", "hiphop.00098", "jazz.00002", "jazz.00003", "jazz.00004", "jazz.00005", "jazz.00006", "jazz.00007", "jazz.00008", "jazz.00009", "jazz.00010", "jazz.00025", "jazz.00026", "jazz.00027", "jazz.00028", "jazz.00029", "jazz.00030", "jazz.00031", "jazz.00032", "metal.00000", "metal.00001", "metal.00006", "metal.00007", "metal.00008", "metal.00009", "metal.00010", "metal.00011", "metal.00016", "metal.00017", "metal.00018", "metal.00019", "metal.00020", "metal.00036", "metal.00037", "metal.00068", "metal.00076", "metal.00077", "metal.00081", "metal.00082", "pop.00010", "pop.00053", "pop.00055", "pop.00058", "pop.00059", "pop.00060", "pop.00061", "pop.00062", "pop.00081", "pop.00083", "pop.00084", "pop.00085", "pop.00086", "reggae.00061", "reggae.00062", "reggae.00070", "reggae.00072", "reggae.00074", "reggae.00076", "reggae.00077", "reggae.00078", "reggae.00085", "reggae.00092", "reggae.00093", "reggae.00094", "reggae.00095", "reggae.00096", "reggae.00097", "reggae.00098", "reggae.00099", "rock.00038", "rock.00049", "rock.00050", "rock.00051", "rock.00052", "rock.00053", "rock.00054", "rock.00055", "rock.00056", "rock.00071", "rock.00072", "rock.00073", "rock.00074", "rock.00075", "rock.00076", "rock.00077", "rock.00078", "rock.00079", "rock.00080", "rock.00081", "rock.00082", "rock.00083", "rock.00084", "rock.00085", ] URL = "http://opihi.cs.uvic.ca/sound/genres.tar.gz" FOLDER_IN_ARCHIVE = "genres" _CHECKSUMS = { "http://opihi.cs.uvic.ca/sound/genres.tar.gz": "5b3d6dddb579ab49814ab86dba69e7c7" } def load_gtzan_item(fileid: str, path: str, ext_audio: str) -> Tuple[Tensor, str]: """ Loads a file from the dataset and returns the raw waveform as a Torch Tensor, its sample rate as an integer, and its genre as a string. """ # Filenames are of the form label.id, e.g. blues.00078 label, _ = fileid.split(".") # Read wav file_audio = os.path.join(path, label, fileid + ext_audio) waveform, sample_rate = torchaudio.load(file_audio) return waveform, sample_rate, label class GTZAN(Dataset): """Create a Dataset for GTZAN. Note: Please see http://marsyas.info/downloads/datasets.html if you are planning to use this dataset to publish results. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from. (default: ``"http://opihi.cs.uvic.ca/sound/genres.tar.gz"``) folder_in_archive (str, optional): The top-level directory of the dataset. download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). subset (str, optional): Which subset of the dataset to use. One of ``"training"``, ``"validation"``, ``"testing"`` or ``None``. If ``None``, the entire dataset is used. (default: ``None``). """ _ext_audio = ".wav" def __init__( self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False, subset: Optional[str] = None, ) -> None: # super(GTZAN, self).__init__() self.root = root self.url = url self.folder_in_archive = folder_in_archive self.download = download self.subset = subset assert subset is None or subset in ["training", "validation", "testing"], ( "When `subset` not None, it must take a value from " + "{'training', 'validation', 'testing'}." ) archive = os.path.basename(url) archive = os.path.join(root, archive) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum, hash_type="md5") extract_archive(archive) if not os.path.isdir(self._path): raise RuntimeError( "Dataset not found. Please use `download=True` to download it." ) if self.subset is None: # Check every subdirectory under dataset root # which has the same name as the genres in # GTZAN (e.g. `root_dir'/blues/, `root_dir'/rock, etc.) # This lets users remove or move around song files, # useful when e.g. they want to use only some of the files # in a genre or want to label other files with a different # genre. self._walker = [] root = os.path.expanduser(self._path) for directory in gtzan_genres: fulldir = os.path.join(root, directory) if not os.path.exists(fulldir): continue songs_in_genre = os.listdir(fulldir) songs_in_genre.sort() for fname in songs_in_genre: name, ext = os.path.splitext(fname) if ext.lower() == ".wav" and "." in name: # Check whether the file is of the form # `gtzan_genre`.`5 digit number`.wav genre, num = name.split(".") if genre in gtzan_genres and len(num) == 5 and num.isdigit(): self._walker.append(name) else: if self.subset == "training": self._walker = filtered_train elif self.subset == "validation": self._walker = filtered_valid elif self.subset == "testing": self._walker = filtered_test def __getitem__(self, n: int) -> Tuple[Tensor, int, str]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, label)`` """ fileid = self._walker[n] item = load_gtzan_item(fileid, self._path, self._ext_audio) waveform, sample_rate, label = item return waveform, sample_rate, label def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/librispeech.py000066400000000000000000000116141376444676100214620ustar00rootroot00000000000000import os from typing import Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, walk_files, ) URL = "train-clean-100" FOLDER_IN_ARCHIVE = "LibriSpeech" _CHECKSUMS = { "http://www.openslr.org/resources/12/dev-clean.tar.gz": "76f87d090650617fca0cac8f88b9416e0ebf80350acb97b343a85fa903728ab3", "http://www.openslr.org/resources/12/dev-other.tar.gz": "12661c48e8c3fe1de2c1caa4c3e135193bfb1811584f11f569dd12645aa84365", "http://www.openslr.org/resources/12/test-clean.tar.gz": "39fde525e59672dc6d1551919b1478f724438a95aa55f874b576be21967e6c23", "http://www.openslr.org/resources/12/test-other.tar.gz": "d09c181bba5cf717b3dee7d4d592af11a3ee3a09e08ae025c5506f6ebe961c29", "http://www.openslr.org/resources/12/train-clean-100.tar.gz": "d4ddd1d5a6ab303066f14971d768ee43278a5f2a0aa43dc716b0e64ecbbbf6e2", "http://www.openslr.org/resources/12/train-clean-360.tar.gz": "146a56496217e96c14334a160df97fffedd6e0a04e66b9c5af0d40be3c792ecf", "http://www.openslr.org/resources/12/train-other-500.tar.gz": "ddb22f27f96ec163645d53215559df6aa36515f26e01dd70798188350adcb6d2" } def load_librispeech_item(fileid: str, path: str, ext_audio: str, ext_txt: str) -> Tuple[Tensor, int, str, int, int, int]: speaker_id, chapter_id, utterance_id = fileid.split("-") file_text = speaker_id + "-" + chapter_id + ext_txt file_text = os.path.join(path, speaker_id, chapter_id, file_text) fileid_audio = speaker_id + "-" + chapter_id + "-" + utterance_id file_audio = fileid_audio + ext_audio file_audio = os.path.join(path, speaker_id, chapter_id, file_audio) # Load audio waveform, sample_rate = torchaudio.load(file_audio) # Load text with open(file_text) as ft: for line in ft: fileid_text, utterance = line.strip().split(" ", 1) if fileid_audio == fileid_text: break else: # Translation not found raise FileNotFoundError("Translation not found for " + fileid_audio) return ( waveform, sample_rate, utterance, int(speaker_id), int(chapter_id), int(utterance_id), ) class LIBRISPEECH(Dataset): """Create a Dataset for LibriSpeech. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from, or the type of the dataset to dowload. Allowed type values are ``"dev-clean"``, ``"dev-other"``, ``"test-clean"``, ``"test-other"``, ``"train-clean-100"``, ``"train-clean-360"`` and ``"train-other-500"``. (default: ``"train-clean-100"``) folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"LibriSpeech"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ _ext_txt = ".trans.txt" _ext_audio = ".flac" def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False) -> None: if url in [ "dev-clean", "dev-other", "test-clean", "test-other", "train-clean-100", "train-clean-360", "train-other-500", ]: ext_archive = ".tar.gz" base_url = "http://www.openslr.org/resources/12/" url = os.path.join(base_url, url + ext_archive) basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.split(".")[0] folder_in_archive = os.path.join(folder_in_archive, basename) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum) extract_archive(archive) walker = walk_files( self._path, suffix=self._ext_audio, prefix=False, remove_suffix=True ) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, int, int, int]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, utterance, speaker_id, chapter_id, utterance_id)`` """ fileid = self._walker[n] return load_librispeech_item(fileid, self._path, self._ext_audio, self._ext_txt) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/libritts.py000066400000000000000000000113471376444676100210300ustar00rootroot00000000000000import os from typing import Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, walk_files, ) URL = "train-clean-100" FOLDER_IN_ARCHIVE = "LibriTTS" _CHECKSUMS = { "http://www.openslr.org/60/dev-clean.tar.gz": "0c3076c1e5245bb3f0af7d82087ee207", "http://www.openslr.org/60/dev-other.tar.gz": "815555d8d75995782ac3ccd7f047213d", "http://www.openslr.org/60/test-clean.tar.gz": "7bed3bdb047c4c197f1ad3bc412db59f", "http://www.openslr.org/60/test-other.tar.gz": "ae3258249472a13b5abef2a816f733e4", "http://www.openslr.org/60/train-clean-100.tar.gz": "4a8c202b78fe1bc0c47916a98f3a2ea8", "http://www.openslr.org/60/train-clean-360.tar.gz": "a84ef10ddade5fd25df69596a2767b2d", "http://www.openslr.org/60/train-other-500.tar.gz": "7b181dd5ace343a5f38427999684aa6f", } def load_libritts_item( fileid: str, path: str, ext_audio: str, ext_original_txt: str, ext_normalized_txt: str, ) -> Tuple[Tensor, int, str, str, int, int, str]: speaker_id, chapter_id, segment_id, utterance_id = fileid.split("_") utterance_id = fileid normalized_text = utterance_id + ext_normalized_txt normalized_text = os.path.join(path, speaker_id, chapter_id, normalized_text) original_text = utterance_id + ext_original_txt original_text = os.path.join(path, speaker_id, chapter_id, original_text) file_audio = utterance_id + ext_audio file_audio = os.path.join(path, speaker_id, chapter_id, file_audio) # Load audio waveform, sample_rate = torchaudio.load(file_audio) # Load original text with open(original_text) as ft: original_text = ft.readline() # Load normalized text with open(normalized_text, "r") as ft: normalized_text = ft.readline() return ( waveform, sample_rate, original_text, normalized_text, int(speaker_id), int(chapter_id), utterance_id, ) class LIBRITTS(Dataset): """Create a Dataset for LibriTTS. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from, or the type of the dataset to dowload. Allowed type values are ``"dev-clean"``, ``"dev-other"``, ``"test-clean"``, ``"test-other"``, ``"train-clean-100"``, ``"train-clean-360"`` and ``"train-other-500"``. (default: ``"train-clean-100"``) folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"LibriTTS"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ _ext_original_txt = ".original.txt" _ext_normalized_txt = ".normalized.txt" _ext_audio = ".wav" def __init__( self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False, ) -> None: if url in [ "dev-clean", "dev-other", "test-clean", "test-other", "train-clean-100", "train-clean-360", "train-other-500", ]: ext_archive = ".tar.gz" base_url = "http://www.openslr.org/resources/60/" url = os.path.join(base_url, url + ext_archive) basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.split(".")[0] folder_in_archive = os.path.join(folder_in_archive, basename) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum) extract_archive(archive) walker = walk_files( self._path, suffix=self._ext_audio, prefix=False, remove_suffix=True ) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, str, int, int, str]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, original_text, normalized_text, speaker_id, chapter_id, utterance_id)`` """ fileid = self._walker[n] return load_libritts_item( fileid, self._path, self._ext_audio, self._ext_original_txt, self._ext_normalized_txt, ) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/ljspeech.py000066400000000000000000000057541376444676100207760ustar00rootroot00000000000000import os import csv from typing import List, Tuple import torchaudio from torchaudio.datasets.utils import download_url, extract_archive, unicode_csv_reader from torch import Tensor from torch.utils.data import Dataset URL = "https://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2" FOLDER_IN_ARCHIVE = "wavs" _CHECKSUMS = { "https://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2": "be1a30453f28eb8dd26af4101ae40cbf2c50413b1bb21936cbcdc6fae3de8aa5" } def load_ljspeech_item(line: List[str], path: str, ext_audio: str) -> Tuple[Tensor, int, str, str]: assert len(line) == 3 fileid, transcript, normalized_transcript = line fileid_audio = fileid + ext_audio fileid_audio = os.path.join(path, fileid_audio) # Load audio waveform, sample_rate = torchaudio.load(fileid_audio) return ( waveform, sample_rate, transcript, normalized_transcript, ) class LJSPEECH(Dataset): """Create a Dataset for LJSpeech-1.1. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from. (default: ``"https://data.keithito.com/data/speech/LJSpeech-1.1.tar.bz2"``) folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"wavs"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ _ext_audio = ".wav" _ext_archive = '.tar.bz2' def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False) -> None: basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.split(self._ext_archive)[0] folder_in_archive = os.path.join(basename, folder_in_archive) self._path = os.path.join(root, folder_in_archive) self._metadata_path = os.path.join(root, basename, 'metadata.csv') if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum) extract_archive(archive) with open(self._metadata_path, "r", newline='') as metadata: walker = unicode_csv_reader(metadata, delimiter="|", quoting=csv.QUOTE_NONE) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, str]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, transcript, normalized_transcript)`` """ line = self._walker[n] return load_ljspeech_item(line, self._path, self._ext_audio) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/speechcommands.py000066400000000000000000000067221376444676100221660ustar00rootroot00000000000000import os from typing import Tuple import torchaudio from torch.utils.data import Dataset from torch import Tensor from torchaudio.datasets.utils import ( download_url, extract_archive, walk_files ) FOLDER_IN_ARCHIVE = "SpeechCommands" URL = "speech_commands_v0.02" HASH_DIVIDER = "_nohash_" EXCEPT_FOLDER = "_background_noise_" _CHECKSUMS = { "https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz": "3cd23799cb2bbdec517f1cc028f8d43c", "https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz": "6b74f3901214cb2c2934e98196829835", } def load_speechcommands_item(filepath: str, path: str) -> Tuple[Tensor, int, str, str, int]: relpath = os.path.relpath(filepath, path) label, filename = os.path.split(relpath) speaker, _ = os.path.splitext(filename) speaker_id, utterance_number = speaker.split(HASH_DIVIDER) utterance_number = int(utterance_number) # Load audio waveform, sample_rate = torchaudio.load(filepath) return waveform, sample_rate, label, speaker_id, utterance_number class SPEECHCOMMANDS(Dataset): """Create a Dataset for Speech Commands. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from, or the type of the dataset to dowload. Allowed type values are ``"speech_commands_v0.01"`` and ``"speech_commands_v0.02"`` (default: ``"speech_commands_v0.02"``) folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"SpeechCommands"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False) -> None: if url in [ "speech_commands_v0.01", "speech_commands_v0.02", ]: base_url = "https://storage.googleapis.com/download.tensorflow.org/data/" ext_archive = ".tar.gz" url = os.path.join(base_url, url + ext_archive) basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.rsplit(".", 2)[0] folder_in_archive = os.path.join(folder_in_archive, basename) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum, hash_type="md5") extract_archive(archive, self._path) walker = walk_files(self._path, suffix=".wav", prefix=True) walker = filter(lambda w: HASH_DIVIDER in w and EXCEPT_FOLDER not in w, walker) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, str, int]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, label, speaker_id, utterance_number)`` """ fileid = self._walker[n] return load_speechcommands_item(fileid, self._path) def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/datasets/tedlium.py000066400000000000000000000172561376444676100206440ustar00rootroot00000000000000import os from typing import Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, ) _RELEASE_CONFIGS = { "release1": { "folder_in_archive": "TEDLIUM_release1", "url": "http://www.openslr.org/resources/7/TEDLIUM_release1.tar.gz", "checksum": "30301975fd8c5cac4040c261c0852f57cfa8adbbad2ce78e77e4986957445f27", "data_path": "", "subset": "train", "supported_subsets": ["train", "test", "dev"], "dict": "TEDLIUM.150K.dic", }, "release2": { "folder_in_archive": "TEDLIUM_release2", "url": "http://www.openslr.org/resources/19/TEDLIUM_release2.tar.gz", "checksum": "93281b5fcaaae5c88671c9d000b443cb3c7ea3499ad12010b3934ca41a7b9c58", "data_path": "", "subset": "train", "supported_subsets": ["train", "test", "dev"], "dict": "TEDLIUM.152k.dic", }, "release3": { "folder_in_archive": "TEDLIUM_release-3", "url": "http://www.openslr.org/resources/51/TEDLIUM_release-3.tgz", "checksum": "ad1e454d14d1ad550bc2564c462d87c7a7ec83d4dc2b9210f22ab4973b9eccdb", "data_path": "data/", "subset": None, "supported_subsets": [None], "dict": "TEDLIUM.152k.dic", }, } class TEDLIUM(Dataset): """ Create a Dataset for Tedlium. It supports releases 1,2 and 3. Args: root (str): Path to the directory where the dataset is found or downloaded. release (str, optional): Release version. Allowed values are ``"release1"``, ``"release2"`` or ``"release3"``. (default: ``"release1"``). subset (str, optional): The subset of dataset to use. Valid options are ``"train"``, ``"dev"``, and ``"test"`` for releases 1&2, ``None`` for release3. Defaults to ``"train"`` or ``None``. download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). """ def __init__( self, root: str, release: str = "release1", subset: str = None, download: bool = False, audio_ext=".sph" ) -> None: self._ext_audio = audio_ext if release in _RELEASE_CONFIGS.keys(): folder_in_archive = _RELEASE_CONFIGS[release]["folder_in_archive"] url = _RELEASE_CONFIGS[release]["url"] subset = subset if subset else _RELEASE_CONFIGS[release]["subset"] else: # Raise warning raise RuntimeError( "The release {} does not match any of the supported tedlium releases{} ".format( release, _RELEASE_CONFIGS.keys(), ) ) if subset not in _RELEASE_CONFIGS[release]["supported_subsets"]: # Raise warning raise RuntimeError( "The subset {} does not match any of the supported tedlium subsets{} ".format( subset, _RELEASE_CONFIGS[release]["supported_subsets"], ) ) basename = os.path.basename(url) archive = os.path.join(root, basename) basename = basename.split(".")[0] self._path = os.path.join(root, folder_in_archive, _RELEASE_CONFIGS[release]["data_path"]) if subset in ["train", "dev", "test"]: self._path = os.path.join(self._path, subset) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _RELEASE_CONFIGS[release]["checksum"] download_url(url, root, hash_value=checksum) extract_archive(archive) # Create list for all samples self._filelist = [] stm_path = os.path.join(self._path, "stm") for file in sorted(os.listdir(stm_path)): if file.endswith(".stm"): stm_path = os.path.join(self._path, "stm", file) with open(stm_path) as f: l = len(f.readlines()) file = file.replace(".stm", "") self._filelist.extend((file, line) for line in range(l)) # Create dict path for later read self._dict_path = os.path.join(root, folder_in_archive, _RELEASE_CONFIGS[release]["dict"]) self._phoneme_dict = None def _load_tedlium_item(self, fileid: str, line: int, path: str) -> Tuple[Tensor, int, str, int, int, int]: """Loads a TEDLIUM dataset sample given a file name and corresponding sentence name. Args: fileid (str): File id to identify both text and audio files corresponding to the sample line (int): Line identifier for the sample inside the text file path (str): Dataset root path Returns: tuple: ``(waveform, sample_rate, transcript, talk_id, speaker_id, identifier)`` """ transcript_path = os.path.join(path, "stm", fileid) with open(transcript_path + ".stm") as f: transcript = f.readlines()[line] talk_id, _, speaker_id, start_time, end_time, identifier, transcript = transcript.split(" ", 6) wave_path = os.path.join(path, "sph", fileid) waveform, sample_rate = self._load_audio(wave_path + self._ext_audio, start_time=start_time, end_time=end_time) return (waveform, sample_rate, transcript, talk_id, speaker_id, identifier) def _load_audio(self, path: str, start_time: float, end_time: float, sample_rate: int = 16000) -> [Tensor, int]: """Default load function used in TEDLIUM dataset, you can overwrite this function to customize functionality and load individual sentences from a full ted audio talk file. Args: path (str): Path to audio file start_time (int, optional): Time in seconds where the sample sentence stars end_time (int, optional): Time in seconds where the sample sentence finishes Returns: [Tensor, int]: Audio tensor representation and sample rate """ start_time = int(float(start_time) * sample_rate) end_time = int(float(end_time) * sample_rate) backend = torchaudio.get_audio_backend() if backend == "sox" or (backend == "soundfile" and torchaudio.USE_SOUNDFILE_LEGACY_INTERFACE): kwargs = {"offset": start_time, "num_frames": end_time - start_time} else: kwargs = {"frame_offset": start_time, "num_frames": end_time - start_time} return torchaudio.load(path, **kwargs) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, int, int, int]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, transcript, talk_id, speaker_id, identifier)`` """ fileid, line = self._filelist[n] return self._load_tedlium_item(fileid, line, self._path) def __len__(self) -> int: """TEDLIUM dataset custom function overwritting len default behaviour. Returns: int: TEDLIUM dataset length """ return len(self._filelist) @property def phoneme_dict(self): """dict[str, tuple[str]]: Phonemes. Mapping from word to tuple of phonemes. Note that some words have empty phonemes. """ # Read phoneme dictionary if not self._phoneme_dict: self._phoneme_dict = {} with open(self._dict_path, "r", encoding="utf-8") as f: for line in f.readlines(): content = line.strip().split() self._phoneme_dict[content[0]] = tuple(content[1:]) # content[1:] can be empty list return self._phoneme_dict.copy() audio-0.7.2/torchaudio/datasets/utils.py000066400000000000000000000270331376444676100203330ustar00rootroot00000000000000import csv import errno import hashlib import logging import os import sys import tarfile import threading import zipfile from _io import TextIOWrapper from queue import Queue from typing import Any, Iterable, List, Optional, Tuple, Union import torch import urllib import urllib.request from torch.utils.data import Dataset from torch.utils.model_zoo import tqdm def unicode_csv_reader(unicode_csv_data: TextIOWrapper, **kwargs: Any) -> Any: r"""Since the standard csv library does not handle unicode in Python 2, we need a wrapper. Borrowed and slightly modified from the Python docs: https://docs.python.org/2/library/csv.html#csv-examples Args: unicode_csv_data (TextIOWrapper): unicode csv data (see example below) Examples: >>> from torchaudio.datasets.utils import unicode_csv_reader >>> import io >>> with io.open(data_path, encoding="utf8") as f: >>> reader = unicode_csv_reader(f) """ # Fix field larger than field limit error maxInt = sys.maxsize while True: # decrease the maxInt value by factor 10 # as long as the OverflowError occurs. try: csv.field_size_limit(maxInt) break except OverflowError: maxInt = int(maxInt / 10) csv.field_size_limit(maxInt) for line in csv.reader(unicode_csv_data, **kwargs): yield line def makedir_exist_ok(dirpath: str) -> None: """ Python2 support for os.makedirs(.., exist_ok=True) """ try: os.makedirs(dirpath) except OSError as e: if e.errno == errno.EEXIST: pass else: raise def stream_url(url: str, start_byte: Optional[int] = None, block_size: int = 32 * 1024, progress_bar: bool = True) -> Iterable: """Stream url by chunk Args: url (str): Url. start_byte (int, optional): Start streaming at that point (Default: ``None``). block_size (int, optional): Size of chunks to stream (Default: ``32 * 1024``). progress_bar (bool, optional): Display a progress bar (Default: ``True``). """ # If we already have the whole file, there is no need to download it again req = urllib.request.Request(url, method="HEAD") url_size = int(urllib.request.urlopen(req).info().get("Content-Length", -1)) if url_size == start_byte: return req = urllib.request.Request(url) if start_byte: req.headers["Range"] = "bytes={}-".format(start_byte) with urllib.request.urlopen(req) as upointer, tqdm( unit="B", unit_scale=True, unit_divisor=1024, total=url_size, disable=not progress_bar, ) as pbar: num_bytes = 0 while True: chunk = upointer.read(block_size) if not chunk: break yield chunk num_bytes += len(chunk) pbar.update(len(chunk)) def download_url(url: str, download_folder: str, filename: Optional[str] = None, hash_value: Optional[str] = None, hash_type: str = "sha256", progress_bar: bool = True, resume: bool = False) -> None: """Download file to disk. Args: url (str): Url. download_folder (str): Folder to download file. filename (str, optional): Name of downloaded file. If None, it is inferred from the url (Default: ``None``). hash_value (str, optional): Hash for url (Default: ``None``). hash_type (str, optional): Hash type, among "sha256" and "md5" (Default: ``"sha256"``). progress_bar (bool, optional): Display a progress bar (Default: ``True``). resume (bool, optional): Enable resuming download (Default: ``False``). """ req = urllib.request.Request(url, method="HEAD") req_info = urllib.request.urlopen(req).info() # Detect filename filename = filename or req_info.get_filename() or os.path.basename(url) filepath = os.path.join(download_folder, filename) if resume and os.path.exists(filepath): mode = "ab" local_size: Optional[int] = os.path.getsize(filepath) elif not resume and os.path.exists(filepath): raise RuntimeError( "{} already exists. Delete the file manually and retry.".format(filepath) ) else: mode = "wb" local_size = None if hash_value and local_size == int(req_info.get("Content-Length", -1)): with open(filepath, "rb") as file_obj: if validate_file(file_obj, hash_value, hash_type): return raise RuntimeError( "The hash of {} does not match. Delete the file manually and retry.".format( filepath ) ) with open(filepath, mode) as fpointer: for chunk in stream_url(url, start_byte=local_size, progress_bar=progress_bar): fpointer.write(chunk) with open(filepath, "rb") as file_obj: if hash_value and not validate_file(file_obj, hash_value, hash_type): raise RuntimeError( "The hash of {} does not match. Delete the file manually and retry.".format( filepath ) ) def validate_file(file_obj: Any, hash_value: str, hash_type: str = "sha256") -> bool: """Validate a given file object with its hash. Args: file_obj: File object to read from. hash_value (str): Hash for url. hash_type (str, optional): Hash type, among "sha256" and "md5" (Default: ``"sha256"``). Returns: bool: return True if its a valid file, else False. """ if hash_type == "sha256": hash_func = hashlib.sha256() elif hash_type == "md5": hash_func = hashlib.md5() else: raise ValueError while True: # Read by chunk to avoid filling memory chunk = file_obj.read(1024 ** 2) if not chunk: break hash_func.update(chunk) return hash_func.hexdigest() == hash_value def extract_archive(from_path: str, to_path: Optional[str] = None, overwrite: bool = False) -> List[str]: """Extract archive. Args: from_path (str): the path of the archive. to_path (str, optional): the root path of the extraced files (directory of from_path) (Default: ``None``) overwrite (bool, optional): overwrite existing files (Default: ``False``) Returns: list: List of paths to extracted files even if not overwritten. Examples: >>> url = 'http://www.quest.dcs.shef.ac.uk/wmt16_files_mmt/validation.tar.gz' >>> from_path = './validation.tar.gz' >>> to_path = './' >>> torchaudio.datasets.utils.download_from_url(url, from_path) >>> torchaudio.datasets.utils.extract_archive(from_path, to_path) """ if to_path is None: to_path = os.path.dirname(from_path) try: with tarfile.open(from_path, "r") as tar: logging.info("Opened tar file {}.".format(from_path)) files = [] for file_ in tar: # type: Any file_path = os.path.join(to_path, file_.name) if file_.isfile(): files.append(file_path) if os.path.exists(file_path): logging.info("{} already extracted.".format(file_path)) if not overwrite: continue tar.extract(file_, to_path) return files except tarfile.ReadError: pass try: with zipfile.ZipFile(from_path, "r") as zfile: logging.info("Opened zip file {}.".format(from_path)) files = zfile.namelist() for file_ in files: file_path = os.path.join(to_path, file_) if os.path.exists(file_path): logging.info("{} already extracted.".format(file_path)) if not overwrite: continue zfile.extract(file_, to_path) return files except zipfile.BadZipFile: pass raise NotImplementedError("We currently only support tar.gz, tgz, and zip achives.") def walk_files(root: str, suffix: Union[str, Tuple[str]], prefix: bool = False, remove_suffix: bool = False) -> Iterable[str]: """List recursively all files ending with a suffix at a given root Args: root (str): Path to directory whose folders need to be listed suffix (str or tuple): Suffix of the files to match, e.g. '.png' or ('.jpg', '.png'). It uses the Python "str.endswith" method and is passed directly prefix (bool, optional): If true, prepends the full path to each result, otherwise only returns the name of the files found (Default: ``False``) remove_suffix (bool, optional): If true, removes the suffix to each result defined in suffix, otherwise will return the result as found (Default: ``False``). """ root = os.path.expanduser(root) for dirpath, dirs, files in os.walk(root): dirs.sort() # `dirs` is the list used in os.walk function and by sorting it in-place here, we change the # behavior of os.walk to traverse sub directory alphabetically # see also # https://stackoverflow.com/questions/6670029/can-i-force-python3s-os-walk-to-visit-directories-in-alphabetical-order-how#comment71993866_6670926 files.sort() for f in files: if f.endswith(suffix): if remove_suffix: f = f[: -len(suffix)] if prefix: f = os.path.join(dirpath, f) yield f class _DiskCache(Dataset): """ Wrap a dataset so that, whenever a new item is returned, it is saved to disk. """ def __init__(self, dataset: Dataset, location: str = ".cached") -> None: self.dataset = dataset self.location = location self._id = id(self) self._cache: List = [None] * len(dataset) def __getitem__(self, n: int) -> Any: if self._cache[n]: f = self._cache[n] return torch.load(f) f = str(self._id) + "-" + str(n) f = os.path.join(self.location, f) item = self.dataset[n] self._cache[n] = f makedir_exist_ok(self.location) torch.save(item, f) return item def __len__(self) -> int: return len(self.dataset) def diskcache_iterator(dataset: Dataset, location: str = ".cached") -> Dataset: return _DiskCache(dataset, location) class _ThreadedIterator(threading.Thread): """ Prefetch the next queue_length items from iterator in a background thread. Example: >> for i in bg_iterator(range(10)): >> print(i) """ class _End: pass def __init__(self, generator: Iterable, maxsize: int) -> None: threading.Thread.__init__(self) self.queue: Queue = Queue(maxsize) self.generator = generator self.daemon = True self.start() def run(self) -> None: for item in self.generator: self.queue.put(item) self.queue.put(self._End) def __iter__(self) -> Any: return self def __next__(self) -> Any: next_item = self.queue.get() if next_item == self._End: raise StopIteration return next_item # Required for Python 2.7 compatibility def next(self) -> Any: return self.__next__() def bg_iterator(iterable: Iterable, maxsize: int) -> Any: return _ThreadedIterator(iterable, maxsize=maxsize) audio-0.7.2/torchaudio/datasets/vctk.py000066400000000000000000000252151376444676100201420ustar00rootroot00000000000000import os import warnings from typing import Any, Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, walk_files ) URL = "https://datashare.is.ed.ac.uk/bitstream/handle/10283/3443/VCTK-Corpus-0.92.zip" FOLDER_IN_ARCHIVE = "VCTK-Corpus" _CHECKSUMS = { "https://datashare.is.ed.ac.uk/bitstream/handle/10283/3443/VCTK-Corpus-0.92.zip": "8a6ba2946b36fcbef0212cad601f4bfa" } def load_vctk_item(fileid: str, path: str, ext_audio: str, ext_txt: str, folder_audio: str, folder_txt: str, downsample: bool = False) -> Tuple[Tensor, int, str, str, str]: speaker_id, utterance_id = fileid.split("_") # Read text file_txt = os.path.join(path, folder_txt, speaker_id, fileid + ext_txt) with open(file_txt) as file_text: utterance = file_text.readlines()[0] # Read wav file_audio = os.path.join(path, folder_audio, speaker_id, fileid + ext_audio) waveform, sample_rate = torchaudio.load(file_audio) if downsample: # TODO Remove this parameter after deprecation F = torchaudio.functional T = torchaudio.transforms # rate sample = T.Resample(sample_rate, 16000, resampling_method='sinc_interpolation') waveform = sample(waveform) # dither waveform = F.dither(waveform, noise_shaping=True) return waveform, sample_rate, utterance, speaker_id, utterance_id class VCTK(Dataset): """Create a Dataset for VCTK. Note: * **This dataset is no longer publicly available.** Please use :py:class:`VCTK_092` * Directory ``p315`` is ignored because there is no corresponding text files. For more information about the dataset visit: https://datashare.is.ed.ac.uk/handle/10283/3443 Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): Not used as the dataset is no longer publicly available. folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"VCTK-Corpus"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). Giving ``download=True`` will result in error as the dataset is no longer publicly available. downsample (bool, optional): Not used. transform (callable, optional): Optional transform applied on waveform. (default: ``None``) target_transform (callable, optional): Optional transform applied on utterance. (default: ``None``) """ _folder_txt = "txt" _folder_audio = "wav48" _ext_txt = ".txt" _ext_audio = ".wav" _except_folder = "p315" def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False, downsample: bool = False, transform: Any = None, target_transform: Any = None) -> None: if downsample: warnings.warn( "In the next version, transforms will not be part of the dataset. " "Please use `downsample=False` to enable this behavior now, " "and suppress this warning." ) if transform is not None or target_transform is not None: warnings.warn( "In the next version, transforms will not be part of the dataset. " "Please remove the option `transform=True` and " "`target_transform=True` to suppress this warning." ) self.downsample = downsample self.transform = transform self.target_transform = target_transform archive = os.path.basename(url) archive = os.path.join(root, archive) self._path = os.path.join(root, folder_in_archive) if download: raise RuntimeError( "This Dataset is no longer available. " "Please use `VCTK_092` class to download the latest version." ) if not os.path.isdir(self._path): raise RuntimeError( "Dataset not found. Please use `VCTK_092` class " "with `download=True` to donwload the latest version." ) walker = walk_files( self._path, suffix=self._ext_audio, prefix=False, remove_suffix=True ) walker = filter(lambda w: self._except_folder not in w, walker) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, str, str, str]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, utterance, speaker_id, utterance_id)`` """ fileid = self._walker[n] item = load_vctk_item( fileid, self._path, self._ext_audio, self._ext_txt, self._folder_audio, self._folder_txt, ) # TODO Upon deprecation, uncomment line below and remove following code # return item waveform, sample_rate, utterance, speaker_id, utterance_id = item if self.transform is not None: waveform = self.transform(waveform) if self.target_transform is not None: utterance = self.target_transform(utterance) return waveform, sample_rate, utterance, speaker_id, utterance_id def __len__(self) -> int: return len(self._walker) SampleType = Tuple[Tensor, int, str, str, str] class VCTK_092(Dataset): """Create VCTK 0.92 Dataset Args: root (str): Root directory where the dataset's top level directory is found. mic_id (str): Microphone ID. Either ``"mic1"`` or ``"mic2"``. (default: ``"mic2"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). url (str, optional): The URL to download the dataset from. (default: ``"https://datashare.is.ed.ac.uk/bitstream/handle/10283/3443/VCTK-Corpus-0.92.zip"``) audio_ext (str, optional): Custom audio extension if dataset is converted to non-default audio format. Note: * All the speeches from speaker ``p315`` will be skipped due to the lack of the corresponding text files. * All the speeches from ``p280`` will be skipped for ``mic_id="mic2"`` due to the lack of the audio files. * Some of the speeches from speaker ``p362`` will be skipped due to the lack of the audio files. * See Also: https://datashare.is.ed.ac.uk/handle/10283/3443 """ def __init__( self, root: str, mic_id: str = "mic2", download: bool = False, url: str = URL, audio_ext=".flac", ): if mic_id not in ["mic1", "mic2"]: raise RuntimeError( f'`mic_id` has to be either "mic1" or "mic2". Found: {mic_id}' ) archive = os.path.join(root, "VCTK-Corpus-0.92.zip") self._path = os.path.join(root, "VCTK-Corpus-0.92") self._txt_dir = os.path.join(self._path, "txt") self._audio_dir = os.path.join(self._path, "wav48_silence_trimmed") self._mic_id = mic_id self._audio_ext = audio_ext if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum, hash_type="md5") extract_archive(archive, self._path) if not os.path.isdir(self._path): raise RuntimeError( "Dataset not found. Please use `download=True` to download it." ) # Extracting speaker IDs from the folder structure self._speaker_ids = sorted(os.listdir(self._txt_dir)) self._sample_ids = [] """ Due to some insufficient data complexity in the 0.92 version of this dataset, we start traversing the audio folder structure in accordance with the text folder. As some of the audio files are missing of either ``mic_1`` or ``mic_2`` but the text is present for the same, we first check for the existence of the audio file before adding it to the ``sample_ids`` list. Once the ``audio_ids`` are loaded into memory we can quickly access the list for different parameters required by the user. """ for speaker_id in self._speaker_ids: if speaker_id == "p280" and mic_id == "mic2": continue utterance_dir = os.path.join(self._txt_dir, speaker_id) for utterance_file in sorted( f for f in os.listdir(utterance_dir) if f.endswith(".txt") ): utterance_id = os.path.splitext(utterance_file)[0] audio_path_mic = os.path.join( self._audio_dir, speaker_id, f"{utterance_id}_{mic_id}{self._audio_ext}", ) if speaker_id == "p362" and not os.path.isfile(audio_path_mic): continue self._sample_ids.append(utterance_id.split("_")) def _load_text(self, file_path) -> str: with open(file_path) as file_path: return file_path.readlines()[0] def _load_audio(self, file_path) -> Tuple[Tensor, int]: return torchaudio.load(file_path) def _load_sample(self, speaker_id: str, utterance_id: str, mic_id: str) -> SampleType: utterance_path = os.path.join( self._txt_dir, speaker_id, f"{speaker_id}_{utterance_id}.txt" ) audio_path = os.path.join( self._audio_dir, speaker_id, f"{speaker_id}_{utterance_id}_{mic_id}{self._audio_ext}", ) # Reading text utterance = self._load_text(utterance_path) # Reading FLAC waveform, sample_rate = self._load_audio(audio_path) return (waveform, sample_rate, utterance, speaker_id, utterance_id) def __getitem__(self, n: int) -> SampleType: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, utterance, speaker_id, utterance_id)`` """ speaker_id, utterance_id = self._sample_ids[n] return self._load_sample(speaker_id, utterance_id, self._mic_id) def __len__(self) -> int: return len(self._sample_ids) audio-0.7.2/torchaudio/datasets/yesno.py000066400000000000000000000074351376444676100203340ustar00rootroot00000000000000import os import warnings from typing import Any, List, Tuple import torchaudio from torch import Tensor from torch.utils.data import Dataset from torchaudio.datasets.utils import ( download_url, extract_archive, walk_files ) URL = "http://www.openslr.org/resources/1/waves_yesno.tar.gz" FOLDER_IN_ARCHIVE = "waves_yesno" _CHECKSUMS = { "http://www.openslr.org/resources/1/waves_yesno.tar.gz": "962ff6e904d2df1126132ecec6978786" } def load_yesno_item(fileid: str, path: str, ext_audio: str) -> Tuple[Tensor, int, List[int]]: # Read label labels = [int(c) for c in fileid.split("_")] # Read wav file_audio = os.path.join(path, fileid + ext_audio) waveform, sample_rate = torchaudio.load(file_audio) return waveform, sample_rate, labels class YESNO(Dataset): """Create a Dataset for YesNo. Args: root (str): Path to the directory where the dataset is found or downloaded. url (str, optional): The URL to download the dataset from. (default: ``"http://www.openslr.org/resources/1/waves_yesno.tar.gz"``) folder_in_archive (str, optional): The top-level directory of the dataset. (default: ``"waves_yesno"``) download (bool, optional): Whether to download the dataset if it is not found at root path. (default: ``False``). transform (callable, optional): Optional transform applied on waveform. (default: ``None``) target_transform (callable, optional): Optional transform applied on utterance. (default: ``None``) """ _ext_audio = ".wav" def __init__(self, root: str, url: str = URL, folder_in_archive: str = FOLDER_IN_ARCHIVE, download: bool = False, transform: Any = None, target_transform: Any = None) -> None: if transform is not None or target_transform is not None: warnings.warn( "In the next version, transforms will not be part of the dataset. " "Please remove the option `transform=True` and " "`target_transform=True` to suppress this warning." ) self.transform = transform self.target_transform = target_transform archive = os.path.basename(url) archive = os.path.join(root, archive) self._path = os.path.join(root, folder_in_archive) if download: if not os.path.isdir(self._path): if not os.path.isfile(archive): checksum = _CHECKSUMS.get(url, None) download_url(url, root, hash_value=checksum, hash_type="md5") extract_archive(archive) if not os.path.isdir(self._path): raise RuntimeError( "Dataset not found. Please use `download=True` to download it." ) walker = walk_files( self._path, suffix=self._ext_audio, prefix=False, remove_suffix=True ) self._walker = list(walker) def __getitem__(self, n: int) -> Tuple[Tensor, int, List[int]]: """Load the n-th sample from the dataset. Args: n (int): The index of the sample to be loaded Returns: tuple: ``(waveform, sample_rate, labels)`` """ fileid = self._walker[n] item = load_yesno_item(fileid, self._path, self._ext_audio) # TODO Upon deprecation, uncomment line below and remove following code # return item waveform, sample_rate, labels = item if self.transform is not None: waveform = self.transform(waveform) if self.target_transform is not None: labels = self.target_transform(labels) return waveform, sample_rate, labels def __len__(self) -> int: return len(self._walker) audio-0.7.2/torchaudio/extension/000077500000000000000000000000001376444676100170205ustar00rootroot00000000000000audio-0.7.2/torchaudio/extension/__init__.py000066400000000000000000000001301376444676100211230ustar00rootroot00000000000000from .extension import ( _init_extension, ) _init_extension() del _init_extension audio-0.7.2/torchaudio/extension/extension.py000066400000000000000000000010011376444676100213760ustar00rootroot00000000000000import warnings import importlib from collections import namedtuple import torch from torchaudio._internal import module_utils as _mod_utils def _init_extension(): ext = 'torchaudio._torchaudio' if _mod_utils.is_module_available(ext): _init_script_module(ext) else: warnings.warn('torchaudio C++ extension is not available.') def _init_script_module(module): path = importlib.util.find_spec(module).origin torch.classes.load_library(path) torch.ops.load_library(path) audio-0.7.2/torchaudio/functional.py000066400000000000000000002415111376444676100175240ustar00rootroot00000000000000# -*- coding: utf-8 -*- import math from typing import Optional, Tuple import warnings import torch from torch import Tensor __all__ = [ "spectrogram", "griffinlim", "amplitude_to_DB", "create_fb_matrix", "create_dct", "mu_law_encoding", "mu_law_decoding", "complex_norm", "angle", "magphase", "phase_vocoder", "lfilter", "lowpass_biquad", "highpass_biquad", "allpass_biquad", "bandpass_biquad", "bandreject_biquad", "equalizer_biquad", "band_biquad", "treble_biquad", "bass_biquad", "deemph_biquad", "riaa_biquad", "biquad", "contrast", "dcshift", "overdrive", "phaser", "flanger", 'mask_along_axis', 'mask_along_axis_iid', 'sliding_window_cmn', 'vad', ] def spectrogram( waveform: Tensor, pad: int, window: Tensor, n_fft: int, hop_length: int, win_length: int, power: Optional[float], normalized: bool ) -> Tensor: r"""Create a spectrogram or a batch of spectrograms from a raw audio signal. The spectrogram can be either magnitude-only or complex. Args: waveform (Tensor): Tensor of audio of dimension (..., time) pad (int): Two sided padding of signal window (Tensor): Window tensor that is applied/multiplied to each frame/window n_fft (int): Size of FFT hop_length (int): Length of hop between STFT windows win_length (int): Window size power (float or None): Exponent for the magnitude spectrogram, (must be > 0) e.g., 1 for energy, 2 for power, etc. If None, then the complex spectrum is returned instead. normalized (bool): Whether to normalize by magnitude after stft Returns: Tensor: Dimension (..., freq, time), freq is ``n_fft // 2 + 1`` and ``n_fft`` is the number of Fourier bins, and time is the number of window hops (n_frame). """ if pad > 0: # TODO add "with torch.no_grad():" back when JIT supports it waveform = torch.nn.functional.pad(waveform, (pad, pad), "constant") # pack batch shape = waveform.size() waveform = waveform.reshape(-1, shape[-1]) # default values are consistent with librosa.core.spectrum._spectrogram spec_f = torch.stft( waveform, n_fft, hop_length, win_length, window, True, "reflect", False, True ) # unpack batch spec_f = spec_f.reshape(shape[:-1] + spec_f.shape[-3:]) if normalized: spec_f /= window.pow(2.).sum().sqrt() if power is not None: spec_f = complex_norm(spec_f, power=power) return spec_f def griffinlim( specgram: Tensor, window: Tensor, n_fft: int, hop_length: int, win_length: int, power: float, normalized: bool, n_iter: int, momentum: float, length: Optional[int], rand_init: bool ) -> Tensor: r"""Compute waveform from a linear scale magnitude spectrogram using the Griffin-Lim transformation. Implementation ported from `librosa`. .. [1] McFee, Brian, Colin Raffel, Dawen Liang, Daniel PW Ellis, Matt McVicar, Eric Battenberg, and Oriol Nieto. "librosa: Audio and music signal analysis in python." In Proceedings of the 14th python in science conference, pp. 18-25. 2015. .. [2] Perraudin, N., Balazs, P., & Søndergaard, P. L. "A fast Griffin-Lim algorithm," IEEE Workshop on Applications of Signal Processing to Audio and Acoustics (pp. 1-4), Oct. 2013. .. [3] D. W. Griffin and J. S. Lim, "Signal estimation from modified short-time Fourier transform," IEEE Trans. ASSP, vol.32, no.2, pp.236–243, Apr. 1984. Args: specgram (Tensor): A magnitude-only STFT spectrogram of dimension (..., freq, frames) where freq is ``n_fft // 2 + 1``. window (Tensor): Window tensor that is applied/multiplied to each frame/window n_fft (int): Size of FFT, creates ``n_fft // 2 + 1`` bins hop_length (int): Length of hop between STFT windows. ( Default: ``win_length // 2``) win_length (int): Window size. (Default: ``n_fft``) power (float): Exponent for the magnitude spectrogram, (must be > 0) e.g., 1 for energy, 2 for power, etc. normalized (bool): Whether to normalize by magnitude after stft. n_iter (int): Number of iteration for phase recovery process. momentum (float): The momentum parameter for fast Griffin-Lim. Setting this to 0 recovers the original Griffin-Lim method. Values near 1 can lead to faster convergence, but above 1 may not converge. length (int or None): Array length of the expected output. rand_init (bool): Initializes phase randomly if True, to zero otherwise. Returns: torch.Tensor: waveform of (..., time), where time equals the ``length`` parameter if given. """ assert momentum < 1, 'momentum={} > 1 can be unstable'.format(momentum) assert momentum >= 0, 'momentum={} < 0'.format(momentum) # pack batch shape = specgram.size() specgram = specgram.reshape([-1] + list(shape[-2:])) specgram = specgram.pow(1 / power) # randomly initialize the phase batch, freq, frames = specgram.size() if rand_init: angles = 2 * math.pi * torch.rand(batch, freq, frames) else: angles = torch.zeros(batch, freq, frames) angles = torch.stack([angles.cos(), angles.sin()], dim=-1) \ .to(dtype=specgram.dtype, device=specgram.device) specgram = specgram.unsqueeze(-1).expand_as(angles) # And initialize the previous iterate to 0 rebuilt = torch.tensor(0.) for _ in range(n_iter): # Store the previous iterate tprev = rebuilt # Invert with our current estimate of the phases inverse = torch.istft(specgram * angles, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window=window, length=length).float() # Rebuild the spectrogram rebuilt = torch.stft(inverse, n_fft, hop_length, win_length, window, True, 'reflect', False, True) # Update our phase estimates angles = rebuilt if momentum: angles = angles - tprev.mul_(momentum / (1 + momentum)) angles = angles.div(complex_norm(angles).add(1e-16).unsqueeze(-1).expand_as(angles)) # Return the final phase estimates waveform = torch.istft(specgram * angles, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window=window, length=length) # unpack batch waveform = waveform.reshape(shape[:-2] + waveform.shape[-1:]) return waveform def amplitude_to_DB( x: Tensor, multiplier: float, amin: float, db_multiplier: float, top_db: Optional[float] = None ) -> Tensor: r"""Turn a tensor from the power/amplitude scale to the decibel scale. This output depends on the maximum value in the input tensor, and so may return different values for an audio clip split into snippets vs. a a full clip. Args: x (Tensor): Input tensor before being converted to decibel scale multiplier (float): Use 10. for power and 20. for amplitude amin (float): Number to clamp ``x`` db_multiplier (float): Log10(max(reference value and amin)) top_db (float or None, optional): Minimum negative cut-off in decibels. A reasonable number is 80. (Default: ``None``) Returns: Tensor: Output tensor in decibel scale """ x_db = multiplier * torch.log10(torch.clamp(x, min=amin)) x_db -= multiplier * db_multiplier if top_db is not None: x_db = x_db.clamp(min=x_db.max().item() - top_db) return x_db def DB_to_amplitude( x: Tensor, ref: float, power: float ) -> Tensor: r"""Turn a tensor from the decibel scale to the power/amplitude scale. Args: x (Tensor): Input tensor before being converted to power/amplitude scale. ref (float): Reference which the output will be scaled by. power (float): If power equals 1, will compute DB to power. If 0.5, will compute DB to amplitude. Returns: Tensor: Output tensor in power/amplitude scale. """ return ref * torch.pow(torch.pow(10.0, 0.1 * x), power) def create_fb_matrix( n_freqs: int, f_min: float, f_max: float, n_mels: int, sample_rate: int, norm: Optional[str] = None ) -> Tensor: r"""Create a frequency bin conversion matrix. Args: n_freqs (int): Number of frequencies to highlight/apply f_min (float): Minimum frequency (Hz) f_max (float): Maximum frequency (Hz) n_mels (int): Number of mel filterbanks sample_rate (int): Sample rate of the audio waveform norm (Optional[str]): If 'slaney', divide the triangular mel weights by the width of the mel band (area normalization). (Default: ``None``) Returns: Tensor: Triangular filter banks (fb matrix) of size (``n_freqs``, ``n_mels``) meaning number of frequencies to highlight/apply to x the number of filterbanks. Each column is a filterbank so that assuming there is a matrix A of size (..., ``n_freqs``), the applied result would be ``A * create_fb_matrix(A.size(-1), ...)``. """ if norm is not None and norm != "slaney": raise ValueError("norm must be one of None or 'slaney'") # freq bins # Equivalent filterbank construction by Librosa all_freqs = torch.linspace(0, sample_rate // 2, n_freqs) # calculate mel freq bins # hertz to mel(f) is 2595. * math.log10(1. + (f / 700.)) m_min = 2595.0 * math.log10(1.0 + (f_min / 700.0)) m_max = 2595.0 * math.log10(1.0 + (f_max / 700.0)) m_pts = torch.linspace(m_min, m_max, n_mels + 2) # mel to hertz(mel) is 700. * (10**(mel / 2595.) - 1.) f_pts = 700.0 * (10 ** (m_pts / 2595.0) - 1.0) # calculate the difference between each mel point and each stft freq point in hertz f_diff = f_pts[1:] - f_pts[:-1] # (n_mels + 1) slopes = f_pts.unsqueeze(0) - all_freqs.unsqueeze(1) # (n_freqs, n_mels + 2) # create overlapping triangles zero = torch.zeros(1) down_slopes = (-1.0 * slopes[:, :-2]) / f_diff[:-1] # (n_freqs, n_mels) up_slopes = slopes[:, 2:] / f_diff[1:] # (n_freqs, n_mels) fb = torch.max(zero, torch.min(down_slopes, up_slopes)) if norm is not None and norm == "slaney": # Slaney-style mel is scaled to be approx constant energy per channel enorm = 2.0 / (f_pts[2:n_mels + 2] - f_pts[:n_mels]) fb *= enorm.unsqueeze(0) if (fb.max(dim=0).values == 0.).any(): warnings.warn( "At least one mel filterbank has all zero values. " f"The value for `n_mels` ({n_mels}) may be set too high. " f"Or, the value for `n_freqs` ({n_freqs}) may be set too low." ) return fb def create_dct( n_mfcc: int, n_mels: int, norm: Optional[str] ) -> Tensor: r"""Create a DCT transformation matrix with shape (``n_mels``, ``n_mfcc``), normalized depending on norm. Args: n_mfcc (int): Number of mfc coefficients to retain n_mels (int): Number of mel filterbanks norm (str or None): Norm to use (either 'ortho' or None) Returns: Tensor: The transformation matrix, to be right-multiplied to row-wise data of size (``n_mels``, ``n_mfcc``). """ # http://en.wikipedia.org/wiki/Discrete_cosine_transform#DCT-II n = torch.arange(float(n_mels)) k = torch.arange(float(n_mfcc)).unsqueeze(1) dct = torch.cos(math.pi / float(n_mels) * (n + 0.5) * k) # size (n_mfcc, n_mels) if norm is None: dct *= 2.0 else: assert norm == "ortho" dct[0] *= 1.0 / math.sqrt(2.0) dct *= math.sqrt(2.0 / float(n_mels)) return dct.t() def mu_law_encoding( x: Tensor, quantization_channels: int ) -> Tensor: r"""Encode signal based on mu-law companding. For more info see the `Wikipedia Entry `_ This algorithm assumes the signal has been scaled to between -1 and 1 and returns a signal encoded with values from 0 to quantization_channels - 1. Args: x (Tensor): Input tensor quantization_channels (int): Number of channels Returns: Tensor: Input after mu-law encoding """ mu = quantization_channels - 1.0 if not x.is_floating_point(): x = x.to(torch.float) mu = torch.tensor(mu, dtype=x.dtype) x_mu = torch.sign(x) * torch.log1p(mu * torch.abs(x)) / torch.log1p(mu) x_mu = ((x_mu + 1) / 2 * mu + 0.5).to(torch.int64) return x_mu def mu_law_decoding( x_mu: Tensor, quantization_channels: int ) -> Tensor: r"""Decode mu-law encoded signal. For more info see the `Wikipedia Entry `_ This expects an input with values between 0 and quantization_channels - 1 and returns a signal scaled between -1 and 1. Args: x_mu (Tensor): Input tensor quantization_channels (int): Number of channels Returns: Tensor: Input after mu-law decoding """ mu = quantization_channels - 1.0 if not x_mu.is_floating_point(): x_mu = x_mu.to(torch.float) mu = torch.tensor(mu, dtype=x_mu.dtype) x = ((x_mu) / mu) * 2 - 1.0 x = torch.sign(x) * (torch.exp(torch.abs(x) * torch.log1p(mu)) - 1.0) / mu return x def complex_norm( complex_tensor: Tensor, power: float = 1.0 ) -> Tensor: r"""Compute the norm of complex tensor input. Args: complex_tensor (Tensor): Tensor shape of `(..., complex=2)` power (float): Power of the norm. (Default: `1.0`). Returns: Tensor: Power of the normed input tensor. Shape of `(..., )` """ # Replace by torch.norm once issue is fixed # https://github.com/pytorch/pytorch/issues/34279 return complex_tensor.pow(2.).sum(-1).pow(0.5 * power) def angle( complex_tensor: Tensor ) -> Tensor: r"""Compute the angle of complex tensor input. Args: complex_tensor (Tensor): Tensor shape of `(..., complex=2)` Return: Tensor: Angle of a complex tensor. Shape of `(..., )` """ return torch.atan2(complex_tensor[..., 1], complex_tensor[..., 0]) def magphase( complex_tensor: Tensor, power: float = 1.0 ) -> Tuple[Tensor, Tensor]: r"""Separate a complex-valued spectrogram with shape `(..., 2)` into its magnitude and phase. Args: complex_tensor (Tensor): Tensor shape of `(..., complex=2)` power (float): Power of the norm. (Default: `1.0`) Returns: (Tensor, Tensor): The magnitude and phase of the complex tensor """ mag = complex_norm(complex_tensor, power) phase = angle(complex_tensor) return mag, phase def phase_vocoder( complex_specgrams: Tensor, rate: float, phase_advance: Tensor ) -> Tensor: r"""Given a STFT tensor, speed up in time without modifying pitch by a factor of ``rate``. Args: complex_specgrams (Tensor): Dimension of `(..., freq, time, complex=2)` rate (float): Speed-up factor phase_advance (Tensor): Expected phase advance in each bin. Dimension of (freq, 1) Returns: Tensor: Complex Specgrams Stretch with dimension of `(..., freq, ceil(time/rate), complex=2)` Example >>> freq, hop_length = 1025, 512 >>> # (channel, freq, time, complex=2) >>> complex_specgrams = torch.randn(2, freq, 300, 2) >>> rate = 1.3 # Speed up by 30% >>> phase_advance = torch.linspace( >>> 0, math.pi * hop_length, freq)[..., None] >>> x = phase_vocoder(complex_specgrams, rate, phase_advance) >>> x.shape # with 231 == ceil(300 / 1.3) torch.Size([2, 1025, 231, 2]) """ # pack batch shape = complex_specgrams.size() complex_specgrams = complex_specgrams.reshape([-1] + list(shape[-3:])) time_steps = torch.arange(0, complex_specgrams.size(-2), rate, device=complex_specgrams.device, dtype=complex_specgrams.dtype) alphas = time_steps % 1.0 phase_0 = angle(complex_specgrams[..., :1, :]) # Time Padding complex_specgrams = torch.nn.functional.pad(complex_specgrams, [0, 0, 0, 2]) # (new_bins, freq, 2) complex_specgrams_0 = complex_specgrams.index_select(-2, time_steps.long()) complex_specgrams_1 = complex_specgrams.index_select(-2, (time_steps + 1).long()) angle_0 = angle(complex_specgrams_0) angle_1 = angle(complex_specgrams_1) norm_0 = torch.norm(complex_specgrams_0, p=2, dim=-1) norm_1 = torch.norm(complex_specgrams_1, p=2, dim=-1) phase = angle_1 - angle_0 - phase_advance phase = phase - 2 * math.pi * torch.round(phase / (2 * math.pi)) # Compute Phase Accum phase = phase + phase_advance phase = torch.cat([phase_0, phase[..., :-1]], dim=-1) phase_acc = torch.cumsum(phase, -1) mag = alphas * norm_1 + (1 - alphas) * norm_0 real_stretch = mag * torch.cos(phase_acc) imag_stretch = mag * torch.sin(phase_acc) complex_specgrams_stretch = torch.stack([real_stretch, imag_stretch], dim=-1) # unpack batch complex_specgrams_stretch = complex_specgrams_stretch.reshape(shape[:-3] + complex_specgrams_stretch.shape[1:]) return complex_specgrams_stretch def lfilter( waveform: Tensor, a_coeffs: Tensor, b_coeffs: Tensor, clamp: bool = True, ) -> Tensor: r"""Perform an IIR filter by evaluating difference equation. Args: waveform (Tensor): audio waveform of dimension of ``(..., time)``. Must be normalized to -1 to 1. a_coeffs (Tensor): denominator coefficients of difference equation of dimension of ``(n_order + 1)``. Lower delays coefficients are first, e.g. ``[a0, a1, a2, ...]``. Must be same size as b_coeffs (pad with 0's as necessary). b_coeffs (Tensor): numerator coefficients of difference equation of dimension of ``(n_order + 1)``. Lower delays coefficients are first, e.g. ``[b0, b1, b2, ...]``. Must be same size as a_coeffs (pad with 0's as necessary). clamp (bool, optional): If ``True``, clamp the output signal to be in the range [-1, 1] (Default: ``True``) Returns: Tensor: Waveform with dimension of ``(..., time)``. """ # pack batch shape = waveform.size() waveform = waveform.reshape(-1, shape[-1]) assert (a_coeffs.size(0) == b_coeffs.size(0)) assert (len(waveform.size()) == 2) assert (waveform.device == a_coeffs.device) assert (b_coeffs.device == a_coeffs.device) device = waveform.device dtype = waveform.dtype n_channel, n_sample = waveform.size() n_order = a_coeffs.size(0) n_sample_padded = n_sample + n_order - 1 assert (n_order > 0) # Pad the input and create output padded_waveform = torch.zeros(n_channel, n_sample_padded, dtype=dtype, device=device) padded_waveform[:, (n_order - 1):] = waveform padded_output_waveform = torch.zeros(n_channel, n_sample_padded, dtype=dtype, device=device) # Set up the coefficients matrix # Flip coefficients' order a_coeffs_flipped = a_coeffs.flip(0) b_coeffs_flipped = b_coeffs.flip(0) # calculate windowed_input_signal in parallel # create indices of original with shape (n_channel, n_order, n_sample) window_idxs = torch.arange(n_sample, device=device).unsqueeze(0) + torch.arange(n_order, device=device).unsqueeze(1) window_idxs = window_idxs.repeat(n_channel, 1, 1) window_idxs += (torch.arange(n_channel, device=device).unsqueeze(-1).unsqueeze(-1) * n_sample_padded) window_idxs = window_idxs.long() # (n_order, ) matmul (n_channel, n_order, n_sample) -> (n_channel, n_sample) input_signal_windows = torch.matmul(b_coeffs_flipped, torch.take(padded_waveform, window_idxs)) input_signal_windows.div_(a_coeffs[0]) a_coeffs_flipped.div_(a_coeffs[0]) for i_sample, o0 in enumerate(input_signal_windows.t()): windowed_output_signal = padded_output_waveform[:, i_sample:(i_sample + n_order)] o0.addmv_(windowed_output_signal, a_coeffs_flipped, alpha=-1) padded_output_waveform[:, i_sample + n_order - 1] = o0 output = padded_output_waveform[:, (n_order - 1):] if clamp: output = torch.clamp(output, min=-1., max=1.) # unpack batch output = output.reshape(shape[:-1] + output.shape[-1:]) return output def biquad( waveform: Tensor, b0: float, b1: float, b2: float, a0: float, a1: float, a2: float ) -> Tensor: r"""Perform a biquad filter of input tensor. Initial conditions set to 0. https://en.wikipedia.org/wiki/Digital_biquad_filter Args: waveform (Tensor): audio waveform of dimension of `(..., time)` b0 (float): numerator coefficient of current input, x[n] b1 (float): numerator coefficient of input one time step ago x[n-1] b2 (float): numerator coefficient of input two time steps ago x[n-2] a0 (float): denominator coefficient of current output y[n], typically 1 a1 (float): denominator coefficient of current output y[n-1] a2 (float): denominator coefficient of current output y[n-2] Returns: Tensor: Waveform with dimension of `(..., time)` """ device = waveform.device dtype = waveform.dtype output_waveform = lfilter( waveform, torch.tensor([a0, a1, a2], dtype=dtype, device=device), torch.tensor([b0, b1, b2], dtype=dtype, device=device) ) return output_waveform def _dB2Linear(x: float) -> float: return math.exp(x * math.log(10) / 20.0) def highpass_biquad( waveform: Tensor, sample_rate: int, cutoff_freq: float, Q: float = 0.707 ) -> Tensor: r"""Design biquad highpass filter and perform filtering. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) cutoff_freq (float): filter cutoff frequency Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) Returns: Tensor: Waveform dimension of `(..., time)` """ w0 = 2 * math.pi * cutoff_freq / sample_rate alpha = math.sin(w0) / 2. / Q b0 = (1 + math.cos(w0)) / 2 b1 = -1 - math.cos(w0) b2 = b0 a0 = 1 + alpha a1 = -2 * math.cos(w0) a2 = 1 - alpha return biquad(waveform, b0, b1, b2, a0, a1, a2) def lowpass_biquad( waveform: Tensor, sample_rate: int, cutoff_freq: float, Q: float = 0.707 ) -> Tensor: r"""Design biquad lowpass filter and perform filtering. Similar to SoX implementation. Args: waveform (torch.Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) cutoff_freq (float): filter cutoff frequency Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) Returns: Tensor: Waveform of dimension of `(..., time)` """ w0 = 2 * math.pi * cutoff_freq / sample_rate alpha = math.sin(w0) / 2 / Q b0 = (1 - math.cos(w0)) / 2 b1 = 1 - math.cos(w0) b2 = b0 a0 = 1 + alpha a1 = -2 * math.cos(w0) a2 = 1 - alpha return biquad(waveform, b0, b1, b2, a0, a1, a2) def allpass_biquad( waveform: Tensor, sample_rate: int, central_freq: float, Q: float = 0.707 ) -> Tensor: r"""Design two-pole all-pass filter. Similar to SoX implementation. Args: waveform(torch.Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) central_freq (float): central frequency (in Hz) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate alpha = math.sin(w0) / 2 / Q b0 = 1 - alpha b1 = -2 * math.cos(w0) b2 = 1 + alpha a0 = 1 + alpha a1 = -2 * math.cos(w0) a2 = 1 - alpha return biquad(waveform, b0, b1, b2, a0, a1, a2) def bandpass_biquad( waveform: Tensor, sample_rate: int, central_freq: float, Q: float = 0.707, const_skirt_gain: bool = False ) -> Tensor: r"""Design two-pole band-pass filter. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) central_freq (float): central frequency (in Hz) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) const_skirt_gain (bool, optional) : If ``True``, uses a constant skirt gain (peak gain = Q). If ``False``, uses a constant 0dB peak gain. (Default: ``False``) Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate alpha = math.sin(w0) / 2 / Q temp = math.sin(w0) / 2 if const_skirt_gain else alpha b0 = temp b1 = 0. b2 = -temp a0 = 1 + alpha a1 = -2 * math.cos(w0) a2 = 1 - alpha return biquad(waveform, b0, b1, b2, a0, a1, a2) def bandreject_biquad( waveform: Tensor, sample_rate: int, central_freq: float, Q: float = 0.707 ) -> Tensor: r"""Design two-pole band-reject filter. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) central_freq (float): central frequency (in Hz) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate alpha = math.sin(w0) / 2 / Q b0 = 1. b1 = -2 * math.cos(w0) b2 = 1. a0 = 1 + alpha a1 = -2 * math.cos(w0) a2 = 1 - alpha return biquad(waveform, b0, b1, b2, a0, a1, a2) def equalizer_biquad( waveform: Tensor, sample_rate: int, center_freq: float, gain: float, Q: float = 0.707 ) -> Tensor: r"""Design biquad peaking equalizer filter and perform filtering. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) center_freq (float): filter's central frequency gain (float): desired gain at the boost (or attenuation) in dB Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``) Returns: Tensor: Waveform of dimension of `(..., time)` """ w0 = 2 * math.pi * center_freq / sample_rate A = math.exp(gain / 40.0 * math.log(10)) alpha = math.sin(w0) / 2 / Q b0 = 1 + alpha * A b1 = -2 * math.cos(w0) b2 = 1 - alpha * A a0 = 1 + alpha / A a1 = -2 * math.cos(w0) a2 = 1 - alpha / A return biquad(waveform, b0, b1, b2, a0, a1, a2) def band_biquad( waveform: Tensor, sample_rate: int, central_freq: float, Q: float = 0.707, noise: bool = False ) -> Tensor: r"""Design two-pole band filter. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) central_freq (float): central frequency (in Hz) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``). noise (bool, optional) : If ``True``, uses the alternate mode for un-pitched audio (e.g. percussion). If ``False``, uses mode oriented to pitched audio, i.e. voice, singing, or instrumental music (Default: ``False``). Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate bw_Hz = central_freq / Q a0 = 1. a2 = math.exp(-2 * math.pi * bw_Hz / sample_rate) a1 = -4 * a2 / (1 + a2) * math.cos(w0) b0 = math.sqrt(1 - a1 * a1 / (4 * a2)) * (1 - a2) if noise: mult = math.sqrt(((1 + a2) * (1 + a2) - a1 * a1) * (1 - a2) / (1 + a2)) / b0 b0 *= mult b1 = 0. b2 = 0. return biquad(waveform, b0, b1, b2, a0, a1, a2) def treble_biquad( waveform: Tensor, sample_rate: int, gain: float, central_freq: float = 3000, Q: float = 0.707 ) -> Tensor: r"""Design a treble tone-control effect. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) gain (float): desired gain at the boost (or attenuation) in dB. central_freq (float, optional): central frequency (in Hz). (Default: ``3000``) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``). Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate alpha = math.sin(w0) / 2 / Q A = math.exp(gain / 40 * math.log(10)) temp1 = 2 * math.sqrt(A) * alpha temp2 = (A - 1) * math.cos(w0) temp3 = (A + 1) * math.cos(w0) b0 = A * ((A + 1) + temp2 + temp1) b1 = -2 * A * ((A - 1) + temp3) b2 = A * ((A + 1) + temp2 - temp1) a0 = (A + 1) - temp2 + temp1 a1 = 2 * ((A - 1) - temp3) a2 = (A + 1) - temp2 - temp1 return biquad(waveform, b0, b1, b2, a0, a1, a2) def bass_biquad( waveform: Tensor, sample_rate: int, gain: float, central_freq: float = 100, Q: float = 0.707 ) -> Tensor: r"""Design a bass tone-control effect. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) gain (float): desired gain at the boost (or attenuation) in dB. central_freq (float, optional): central frequency (in Hz). (Default: ``100``) Q (float, optional): https://en.wikipedia.org/wiki/Q_factor (Default: ``0.707``). Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ w0 = 2 * math.pi * central_freq / sample_rate alpha = math.sin(w0) / 2 / Q A = math.exp(gain / 40 * math.log(10)) temp1 = 2 * math.sqrt(A) * alpha temp2 = (A - 1) * math.cos(w0) temp3 = (A + 1) * math.cos(w0) b0 = A * ((A + 1) - temp2 + temp1) b1 = 2 * A * ((A - 1) - temp3) b2 = A * ((A + 1) - temp2 - temp1) a0 = (A + 1) + temp2 + temp1 a1 = -2 * ((A - 1) + temp3) a2 = (A + 1) + temp2 - temp1 return biquad(waveform, b0 / a0, b1 / a0, b2 / a0, a0 / a0, a1 / a0, a2 / a0) def deemph_biquad( waveform: Tensor, sample_rate: int ) -> Tensor: r"""Apply ISO 908 CD de-emphasis (shelving) IIR filter. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, Allowed sample rate ``44100`` or ``48000`` Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ if sample_rate == 44100: central_freq = 5283 width_slope = 0.4845 gain = -9.477 elif sample_rate == 48000: central_freq = 5356 width_slope = 0.479 gain = -9.62 else: raise ValueError("Sample rate must be 44100 (audio-CD) or 48000 (DAT)") w0 = 2 * math.pi * central_freq / sample_rate A = math.exp(gain / 40.0 * math.log(10)) alpha = math.sin(w0) / 2 * math.sqrt((A + 1 / A) * (1 / width_slope - 1) + 2) temp1 = 2 * math.sqrt(A) * alpha temp2 = (A - 1) * math.cos(w0) temp3 = (A + 1) * math.cos(w0) b0 = A * ((A + 1) + temp2 + temp1) b1 = -2 * A * ((A - 1) + temp3) b2 = A * ((A + 1) + temp2 - temp1) a0 = (A + 1) - temp2 + temp1 a1 = 2 * ((A - 1) - temp3) a2 = (A + 1) - temp2 - temp1 return biquad(waveform, b0, b1, b2, a0, a1, a2) def riaa_biquad( waveform: Tensor, sample_rate: int ) -> Tensor: r"""Apply RIAA vinyl playback equalisation. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz). Allowed sample rates in Hz : ``44100``,``48000``,``88200``,``96000`` Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html https://www.w3.org/2011/audio/audio-eq-cookbook.html#APF """ if (sample_rate == 44100): zeros = [-0.2014898, 0.9233820] poles = [0.7083149, 0.9924091] elif (sample_rate == 48000): zeros = [-0.1766069, 0.9321590] poles = [0.7396325, 0.9931330] elif (sample_rate == 88200): zeros = [-0.1168735, 0.9648312] poles = [0.8590646, 0.9964002] elif (sample_rate == 96000): zeros = [-0.1141486, 0.9676817] poles = [0.8699137, 0.9966946] else: raise ValueError("Sample rate must be 44.1k, 48k, 88.2k, or 96k") # polynomial coefficients with roots zeros[0] and zeros[1] b0 = 1. b1 = -(zeros[0] + zeros[1]) b2 = (zeros[0] * zeros[1]) # polynomial coefficients with roots poles[0] and poles[1] a0 = 1. a1 = -(poles[0] + poles[1]) a2 = (poles[0] * poles[1]) # Normalise to 0dB at 1kHz y = 2 * math.pi * 1000 / sample_rate b_re = b0 + b1 * math.cos(-y) + b2 * math.cos(-2 * y) a_re = a0 + a1 * math.cos(-y) + a2 * math.cos(-2 * y) b_im = b1 * math.sin(-y) + b2 * math.sin(-2 * y) a_im = a1 * math.sin(-y) + a2 * math.sin(-2 * y) g = 1 / math.sqrt((b_re ** 2 + b_im ** 2) / (a_re ** 2 + a_im ** 2)) b0 *= g b1 *= g b2 *= g return biquad(waveform, b0, b1, b2, a0, a1, a2) def contrast( waveform: Tensor, enhancement_amount: float = 75. ) -> Tensor: r"""Apply contrast effect. Similar to SoX implementation. Comparable with compression, this effect modifies an audio signal to make it sound louder Args: waveform (Tensor): audio waveform of dimension of `(..., time)` enhancement_amount (float): controls the amount of the enhancement Allowed range of values for enhancement_amount : 0-100 Note that enhancement_amount = 0 still gives a significant contrast enhancement Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html """ if not 0 <= enhancement_amount <= 100: raise ValueError("Allowed range of values for enhancement_amount : 0-100") contrast = enhancement_amount / 750. temp1 = waveform * (math.pi / 2) temp2 = contrast * torch.sin(temp1 * 4) output_waveform = torch.sin(temp1 + temp2) return output_waveform def dcshift( waveform: Tensor, shift: float, limiter_gain: Optional[float] = None ) -> Tensor: r"""Apply a DC shift to the audio. Similar to SoX implementation. This can be useful to remove a DC offset (caused perhaps by a hardware problem in the recording chain) from the audio Args: waveform (Tensor): audio waveform of dimension of `(..., time)` shift (float): indicates the amount to shift the audio Allowed range of values for shift : -2.0 to +2.0 limiter_gain (float): It is used only on peaks to prevent clipping It should have a value much less than 1 (e.g. 0.05 or 0.02) Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html """ output_waveform = waveform limiter_threshold = 0. if limiter_gain is not None: limiter_threshold = 1.0 - (abs(shift) - limiter_gain) if limiter_gain is not None and shift > 0: mask = waveform > limiter_threshold temp = (waveform[mask] - limiter_threshold) * limiter_gain / (1 - limiter_threshold) output_waveform[mask] = (temp + limiter_threshold + shift).clamp(max=limiter_threshold) output_waveform[~mask] = (waveform[~mask] + shift).clamp(min=-1, max=1) elif limiter_gain is not None and shift < 0: mask = waveform < -limiter_threshold temp = (waveform[mask] + limiter_threshold) * limiter_gain / (1 - limiter_threshold) output_waveform[mask] = (temp - limiter_threshold + shift).clamp(min=-limiter_threshold) output_waveform[~mask] = (waveform[~mask] + shift).clamp(min=-1, max=1) else: output_waveform = (waveform + shift).clamp(min=-1, max=1) return output_waveform def overdrive( waveform: Tensor, gain: float = 20, colour: float = 20 ) -> Tensor: r"""Apply a overdrive effect to the audio. Similar to SoX implementation. This effect applies a non linear distortion to the audio signal. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` gain (float): desired gain at the boost (or attenuation) in dB Allowed range of values are 0 to 100 colour (float): controls the amount of even harmonic content in the over-driven output Allowed range of values are 0 to 100 Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html """ actual_shape = waveform.shape device, dtype = waveform.device, waveform.dtype # convert to 2D (..,time) waveform = waveform.view(-1, actual_shape[-1]) gain = _dB2Linear(gain) colour = colour / 200 last_in = torch.zeros(waveform.shape[:-1], dtype=dtype, device=device) last_out = torch.zeros(waveform.shape[:-1], dtype=dtype, device=device) temp = waveform * gain + colour mask1 = temp < -1 temp[mask1] = torch.tensor(-2.0 / 3.0, dtype=dtype, device=device) # Wrapping the constant with Tensor is required for Torchscript mask2 = temp > 1 temp[mask2] = torch.tensor(2.0 / 3.0, dtype=dtype, device=device) mask3 = (~mask1 & ~mask2) temp[mask3] = temp[mask3] - (temp[mask3]**3) * (1. / 3) output_waveform = torch.zeros_like(waveform, dtype=dtype, device=device) # TODO: Implement a torch CPP extension for i in range(waveform.shape[-1]): last_out = temp[:, i] - last_in + 0.995 * last_out last_in = temp[:, i] output_waveform[:, i] = waveform[:, i] * 0.5 + last_out * 0.75 return output_waveform.clamp(min=-1, max=1).view(actual_shape) def phaser( waveform: Tensor, sample_rate: int, gain_in: float = 0.4, gain_out: float = 0.74, delay_ms: float = 3.0, decay: float = 0.4, mod_speed: float = 0.5, sinusoidal: bool = True ) -> Tensor: r"""Apply a phasing effect to the audio. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., time)` sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) gain_in (float): desired input gain at the boost (or attenuation) in dB Allowed range of values are 0 to 1 gain_out (float): desired output gain at the boost (or attenuation) in dB Allowed range of values are 0 to 1e9 delay_ms (float): desired delay in milli seconds Allowed range of values are 0 to 5.0 decay (float): desired decay relative to gain-in Allowed range of values are 0 to 0.99 mod_speed (float): modulation speed in Hz Allowed range of values are 0.1 to 2 sinusoidal (bool): If ``True``, uses sinusoidal modulation (preferable for multiple instruments) If ``False``, uses triangular modulation (gives single instruments a sharper phasing effect) (Default: ``True``) Returns: Tensor: Waveform of dimension of `(..., time)` References: http://sox.sourceforge.net/sox.html Scott Lehman, Effects Explained, http://harmony-central.com/Effects/effects-explained.html """ actual_shape = waveform.shape device, dtype = waveform.device, waveform.dtype # convert to 2D (channels,time) waveform = waveform.view(-1, actual_shape[-1]) delay_buf_len = int((delay_ms * .001 * sample_rate) + .5) delay_buf = torch.zeros(waveform.shape[0], delay_buf_len, dtype=dtype, device=device) mod_buf_len = int(sample_rate / mod_speed + .5) if sinusoidal: wave_type = 'SINE' else: wave_type = 'TRIANGLE' mod_buf = _generate_wave_table(wave_type=wave_type, data_type='INT', table_size=mod_buf_len, min=1., max=float(delay_buf_len), phase=math.pi / 2, device=device) delay_pos = 0 mod_pos = 0 output_waveform_pre_gain_list = [] waveform = waveform * gain_in delay_buf = delay_buf * decay waveform_list = [waveform[:, i] for i in range(waveform.size(1))] delay_buf_list = [delay_buf[:, i] for i in range(delay_buf.size(1))] mod_buf_list = [mod_buf[i] for i in range(mod_buf.size(0))] for i in range(waveform.shape[-1]): idx = int((delay_pos + mod_buf_list[mod_pos]) % delay_buf_len) mod_pos = (mod_pos + 1) % mod_buf_len delay_pos = (delay_pos + 1) % delay_buf_len temp = (waveform_list[i]) + (delay_buf_list[idx]) delay_buf_list[delay_pos] = temp * decay output_waveform_pre_gain_list.append(temp) output_waveform = torch.stack(output_waveform_pre_gain_list, dim=1).to(dtype=dtype, device=device) output_waveform.mul_(gain_out) return output_waveform.clamp(min=-1, max=1).view(actual_shape) def _generate_wave_table( wave_type: str, data_type: str, table_size: int, min: float, max: float, phase: float, device: torch.device ) -> Tensor: r"""A helper fucntion for phaser. Generates a table with given parameters Args: wave_type (str): SINE or TRIANGULAR data_type (str): desired data_type ( `INT` or `FLOAT` ) table_size (int): desired table size min (float): desired min value max (float): desired max value phase (float): desired phase device (torch.device): Torch device on which table must be generated Returns: Tensor: A 1D tensor with wave table values """ phase_offset = int(phase / math.pi / 2 * table_size + 0.5) t = torch.arange(table_size, device=device, dtype=torch.int32) point = (t + phase_offset) % table_size d = torch.zeros_like(point, device=device, dtype=torch.float64) if wave_type == 'SINE': d = (torch.sin(point.to(torch.float64) / table_size * 2 * math.pi) + 1) / 2 elif wave_type == 'TRIANGLE': d = point.to(torch.float64) * 2 / table_size value = 4 * point // table_size d[value == 0] = d[value == 0] + 0.5 d[value == 1] = 1.5 - d[value == 1] d[value == 2] = 1.5 - d[value == 2] d[value == 3] = d[value == 3] - 1.5 d = d * (max - min) + min if data_type == 'INT': mask = d < 0 d[mask] = d[mask] - 0.5 d[~mask] = d[~mask] + 0.5 d = d.to(torch.int32) elif data_type == 'FLOAT': d = d.to(torch.float32) return d def flanger( waveform: Tensor, sample_rate: int, delay: float = 0., depth: float = 2., regen: float = 0., width: float = 71., speed: float = 0.5, phase: float = 25., modulation: str = 'sinusoidal', interpolation: str = 'linear' ) -> Tensor: r"""Apply a flanger effect to the audio. Similar to SoX implementation. Args: waveform (Tensor): audio waveform of dimension of `(..., channel, time)` . Max 4 channels allowed sample_rate (int): sampling rate of the waveform, e.g. 44100 (Hz) delay (float): desired delay in milliseconds(ms) Allowed range of values are 0 to 30 depth (float): desired delay depth in milliseconds(ms) Allowed range of values are 0 to 10 regen (float): desired regen(feeback gain) in dB Allowed range of values are -95 to 95 width (float): desired width(delay gain) in dB Allowed range of values are 0 to 100 speed (float): modulation speed in Hz Allowed range of values are 0.1 to 10 phase (float): percentage phase-shift for multi-channel Allowed range of values are 0 to 100 modulation (str): Use either "sinusoidal" or "triangular" modulation. (Default: ``sinusoidal``) interpolation (str): Use either "linear" or "quadratic" for delay-line interpolation. (Default: ``linear``) Returns: Tensor: Waveform of dimension of `(..., channel, time)` References: http://sox.sourceforge.net/sox.html Scott Lehman, Effects Explained, https://web.archive.org/web/20051125072557/http://www.harmony-central.com/Effects/effects-explained.html """ if modulation not in ('sinusoidal', 'triangular'): raise ValueError("Only 'sinusoidal' or 'triangular' modulation allowed") if interpolation not in ('linear', 'quadratic'): raise ValueError("Only 'linear' or 'quadratic' interpolation allowed") actual_shape = waveform.shape device, dtype = waveform.device, waveform.dtype if actual_shape[-2] > 4: raise ValueError("Max 4 channels allowed") # convert to 3D (batch, channels, time) waveform = waveform.view(-1, actual_shape[-2], actual_shape[-1]) # Scaling feedback_gain = regen / 100 delay_gain = width / 100 channel_phase = phase / 100 delay_min = delay / 1000 delay_depth = depth / 1000 n_channels = waveform.shape[-2] if modulation == 'sinusoidal': wave_type = 'SINE' else: wave_type = 'TRIANGLE' # Balance output: in_gain = 1. / (1 + delay_gain) delay_gain = delay_gain / (1 + delay_gain) # Balance feedback loop: delay_gain = delay_gain * (1 - abs(feedback_gain)) delay_buf_length = int((delay_min + delay_depth) * sample_rate + 0.5) delay_buf_length = delay_buf_length + 2 delay_bufs = torch.zeros(waveform.shape[0], n_channels, delay_buf_length, dtype=dtype, device=device) delay_last = torch.zeros(waveform.shape[0], n_channels, dtype=dtype, device=device) lfo_length = int(sample_rate / speed) table_min = math.floor(delay_min * sample_rate + 0.5) table_max = delay_buf_length - 2. lfo = _generate_wave_table(wave_type=wave_type, data_type='FLOAT', table_size=lfo_length, min=float(table_min), max=float(table_max), phase=3 * math.pi / 2, device=device) output_waveform = torch.zeros_like(waveform, dtype=dtype, device=device) delay_buf_pos = 0 lfo_pos = 0 channel_idxs = torch.arange(0, n_channels, device=device) for i in range(waveform.shape[-1]): delay_buf_pos = (delay_buf_pos + delay_buf_length - 1) % delay_buf_length cur_channel_phase = (channel_idxs * lfo_length * channel_phase + .5).to(torch.int64) delay_tensor = lfo[(lfo_pos + cur_channel_phase) % lfo_length] frac_delay = torch.frac(delay_tensor) delay_tensor = torch.floor(delay_tensor) int_delay = delay_tensor.to(torch.int64) temp = waveform[:, :, i] delay_bufs[:, :, delay_buf_pos] = temp + delay_last * feedback_gain delayed_0 = delay_bufs[:, channel_idxs, (delay_buf_pos + int_delay) % delay_buf_length] int_delay = int_delay + 1 delayed_1 = delay_bufs[:, channel_idxs, (delay_buf_pos + int_delay) % delay_buf_length] int_delay = int_delay + 1 if interpolation == 'linear': delayed = delayed_0 + (delayed_1 - delayed_0) * frac_delay else: delayed_2 = delay_bufs[:, channel_idxs, (delay_buf_pos + int_delay) % delay_buf_length] int_delay = int_delay + 1 delayed_2 = delayed_2 - delayed_0 delayed_1 = delayed_1 - delayed_0 a = delayed_2 * .5 - delayed_1 b = delayed_1 * 2 - delayed_2 * .5 delayed = delayed_0 + (a * frac_delay + b) * frac_delay delay_last = delayed output_waveform[:, :, i] = waveform[:, :, i] * in_gain + delayed * delay_gain lfo_pos = (lfo_pos + 1) % lfo_length return output_waveform.clamp(min=-1, max=1).view(actual_shape) def mask_along_axis_iid( specgrams: Tensor, mask_param: int, mask_value: float, axis: int ) -> Tensor: r""" Apply a mask along ``axis``. Mask will be applied from indices ``[v_0, v_0 + v)``, where ``v`` is sampled from ``uniform(0, mask_param)``, and ``v_0`` from ``uniform(0, max_v - v)``. Args: specgrams (Tensor): Real spectrograms (batch, channel, freq, time) mask_param (int): Number of columns to be masked will be uniformly sampled from [0, mask_param] mask_value (float): Value to assign to the masked columns axis (int): Axis to apply masking on (2 -> frequency, 3 -> time) Returns: Tensor: Masked spectrograms of dimensions (batch, channel, freq, time) """ if axis != 2 and axis != 3: raise ValueError('Only Frequency and Time masking are supported') device = specgrams.device dtype = specgrams.dtype value = torch.rand(specgrams.shape[:2], device=device, dtype=dtype) * mask_param min_value = torch.rand(specgrams.shape[:2], device=device, dtype=dtype) * (specgrams.size(axis) - value) # Create broadcastable mask mask_start = min_value[..., None, None] mask_end = (min_value + value)[..., None, None] mask = torch.arange(0, specgrams.size(axis), device=device, dtype=dtype) # Per batch example masking specgrams = specgrams.transpose(axis, -1) specgrams.masked_fill_((mask >= mask_start) & (mask < mask_end), mask_value) specgrams = specgrams.transpose(axis, -1) return specgrams def mask_along_axis( specgram: Tensor, mask_param: int, mask_value: float, axis: int ) -> Tensor: r""" Apply a mask along ``axis``. Mask will be applied from indices ``[v_0, v_0 + v)``, where ``v`` is sampled from ``uniform(0, mask_param)``, and ``v_0`` from ``uniform(0, max_v - v)``. All examples will have the same mask interval. Args: specgram (Tensor): Real spectrogram (channel, freq, time) mask_param (int): Number of columns to be masked will be uniformly sampled from [0, mask_param] mask_value (float): Value to assign to the masked columns axis (int): Axis to apply masking on (1 -> frequency, 2 -> time) Returns: Tensor: Masked spectrogram of dimensions (channel, freq, time) """ # pack batch shape = specgram.size() specgram = specgram.reshape([-1] + list(shape[-2:])) value = torch.rand(1) * mask_param min_value = torch.rand(1) * (specgram.size(axis) - value) mask_start = (min_value.long()).squeeze() mask_end = (min_value.long() + value.long()).squeeze() assert mask_end - mask_start < mask_param if axis == 1: specgram[:, mask_start:mask_end] = mask_value elif axis == 2: specgram[:, :, mask_start:mask_end] = mask_value else: raise ValueError('Only Frequency and Time masking are supported') # unpack batch specgram = specgram.reshape(shape[:-2] + specgram.shape[-2:]) return specgram def compute_deltas( specgram: Tensor, win_length: int = 5, mode: str = "replicate" ) -> Tensor: r"""Compute delta coefficients of a tensor, usually a spectrogram: .. math:: d_t = \frac{\sum_{n=1}^{\text{N}} n (c_{t+n} - c_{t-n})}{2 \sum_{n=1}^{\text{N}} n^2} where :math:`d_t` is the deltas at time :math:`t`, :math:`c_t` is the spectrogram coeffcients at time :math:`t`, :math:`N` is ``(win_length-1)//2``. Args: specgram (Tensor): Tensor of audio of dimension (..., freq, time) win_length (int, optional): The window length used for computing delta (Default: ``5``) mode (str, optional): Mode parameter passed to padding (Default: ``"replicate"``) Returns: Tensor: Tensor of deltas of dimension (..., freq, time) Example >>> specgram = torch.randn(1, 40, 1000) >>> delta = compute_deltas(specgram) >>> delta2 = compute_deltas(delta) """ device = specgram.device dtype = specgram.dtype # pack batch shape = specgram.size() specgram = specgram.reshape(1, -1, shape[-1]) assert win_length >= 3 n = (win_length - 1) // 2 # twice sum of integer squared denom = n * (n + 1) * (2 * n + 1) / 3 specgram = torch.nn.functional.pad(specgram, (n, n), mode=mode) kernel = torch.arange(-n, n + 1, 1, device=device, dtype=dtype).repeat(specgram.shape[1], 1, 1) output = torch.nn.functional.conv1d(specgram, kernel, groups=specgram.shape[1]) / denom # unpack batch output = output.reshape(shape) return output def gain( waveform: Tensor, gain_db: float = 1.0 ) -> Tensor: r"""Apply amplification or attenuation to the whole waveform. Args: waveform (Tensor): Tensor of audio of dimension (..., time). gain_db (float, optional) Gain adjustment in decibels (dB) (Default: ``1.0``). Returns: Tensor: the whole waveform amplified by gain_db. """ if (gain_db == 0): return waveform ratio = 10 ** (gain_db / 20) return waveform * ratio def _add_noise_shaping( dithered_waveform: Tensor, waveform: Tensor ) -> Tensor: r"""Noise shaping is calculated by error: error[n] = dithered[n] - original[n] noise_shaped_waveform[n] = dithered[n] + error[n-1] """ wf_shape = waveform.size() waveform = waveform.reshape(-1, wf_shape[-1]) dithered_shape = dithered_waveform.size() dithered_waveform = dithered_waveform.reshape(-1, dithered_shape[-1]) error = dithered_waveform - waveform # add error[n-1] to dithered_waveform[n], so offset the error by 1 index zeros = torch.zeros(1, dtype=error.dtype, device=error.device) for index in range(error.size()[0]): err = error[index] error_offset = torch.cat((zeros, err)) error[index] = error_offset[:waveform.size()[1]] noise_shaped = dithered_waveform + error return noise_shaped.reshape(dithered_shape[:-1] + noise_shaped.shape[-1:]) def _apply_probability_distribution( waveform: Tensor, density_function: str = "TPDF" ) -> Tensor: r"""Apply a probability distribution function on a waveform. Triangular probability density function (TPDF) dither noise has a triangular distribution; values in the center of the range have a higher probability of occurring. Rectangular probability density function (RPDF) dither noise has a uniform distribution; any value in the specified range has the same probability of occurring. Gaussian probability density function (GPDF) has a normal distribution. The relationship of probabilities of results follows a bell-shaped, or Gaussian curve, typical of dither generated by analog sources. Args: waveform (Tensor): Tensor of audio of dimension (..., time) probability_density_function (str, optional): The density function of a continuous random variable (Default: ``"TPDF"``) Options: Triangular Probability Density Function - `TPDF` Rectangular Probability Density Function - `RPDF` Gaussian Probability Density Function - `GPDF` Returns: Tensor: waveform dithered with TPDF """ # pack batch shape = waveform.size() waveform = waveform.reshape(-1, shape[-1]) channel_size = waveform.size()[0] - 1 time_size = waveform.size()[-1] - 1 random_channel = int(torch.randint(channel_size, [1, ]).item()) if channel_size > 0 else 0 random_time = int(torch.randint(time_size, [1, ]).item()) if time_size > 0 else 0 number_of_bits = 16 up_scaling = 2 ** (number_of_bits - 1) - 2 signal_scaled = waveform * up_scaling down_scaling = 2 ** (number_of_bits - 1) signal_scaled_dis = waveform if (density_function == "RPDF"): RPDF = waveform[random_channel][random_time] - 0.5 signal_scaled_dis = signal_scaled + RPDF elif (density_function == "GPDF"): # TODO Replace by distribution code once # https://github.com/pytorch/pytorch/issues/29843 is resolved # gaussian = torch.distributions.normal.Normal(torch.mean(waveform, -1), 1).sample() num_rand_variables = 6 gaussian = waveform[random_channel][random_time] for ws in num_rand_variables * [time_size]: rand_chan = int(torch.randint(channel_size, [1, ]).item()) gaussian += waveform[rand_chan][int(torch.randint(ws, [1, ]).item())] signal_scaled_dis = signal_scaled + gaussian else: # dtype needed for https://github.com/pytorch/pytorch/issues/32358 TPDF = torch.bartlett_window(time_size + 1, dtype=signal_scaled.dtype, device=signal_scaled.device) TPDF = TPDF.repeat((channel_size + 1), 1) signal_scaled_dis = signal_scaled + TPDF quantised_signal_scaled = torch.round(signal_scaled_dis) quantised_signal = quantised_signal_scaled / down_scaling # unpack batch return quantised_signal.reshape(shape[:-1] + quantised_signal.shape[-1:]) def dither( waveform: Tensor, density_function: str = "TPDF", noise_shaping: bool = False ) -> Tensor: r"""Dither increases the perceived dynamic range of audio stored at a particular bit-depth by eliminating nonlinear truncation distortion (i.e. adding minimally perceived noise to mask distortion caused by quantization). Args: waveform (Tensor): Tensor of audio of dimension (..., time) density_function (str, optional): The density function of a continuous random variable (Default: ``"TPDF"``) Options: Triangular Probability Density Function - `TPDF` Rectangular Probability Density Function - `RPDF` Gaussian Probability Density Function - `GPDF` noise_shaping (bool, optional): a filtering process that shapes the spectral energy of quantisation error (Default: ``False``) Returns: Tensor: waveform dithered """ dithered = _apply_probability_distribution(waveform, density_function=density_function) if noise_shaping: return _add_noise_shaping(dithered, waveform) else: return dithered def _compute_nccf( waveform: Tensor, sample_rate: int, frame_time: float, freq_low: int ) -> Tensor: r""" Compute Normalized Cross-Correlation Function (NCCF). .. math:: \phi_i(m) = \frac{\sum_{n=b_i}^{b_i + N-1} w(n) w(m+n)}{\sqrt{E(b_i) E(m+b_i)}}, where :math:`\phi_i(m)` is the NCCF at frame :math:`i` with lag :math:`m`, :math:`w` is the waveform, :math:`N` is the length of a frame, :math:`b_i` is the beginning of frame :math:`i`, :math:`E(j)` is the energy :math:`\sum_{n=j}^{j+N-1} w^2(n)`. """ EPSILON = 10 ** (-9) # Number of lags to check lags = int(math.ceil(sample_rate / freq_low)) frame_size = int(math.ceil(sample_rate * frame_time)) waveform_length = waveform.size()[-1] num_of_frames = int(math.ceil(waveform_length / frame_size)) p = lags + num_of_frames * frame_size - waveform_length waveform = torch.nn.functional.pad(waveform, (0, p)) # Compute lags output_lag = [] for lag in range(1, lags + 1): s1 = waveform[..., :-lag].unfold(-1, frame_size, frame_size)[..., :num_of_frames, :] s2 = waveform[..., lag:].unfold(-1, frame_size, frame_size)[..., :num_of_frames, :] output_frames = ( (s1 * s2).sum(-1) / (EPSILON + torch.norm(s1, p=2, dim=-1)).pow(2) / (EPSILON + torch.norm(s2, p=2, dim=-1)).pow(2) ) output_lag.append(output_frames.unsqueeze(-1)) nccf = torch.cat(output_lag, -1) return nccf def _combine_max( a: Tuple[Tensor, Tensor], b: Tuple[Tensor, Tensor], thresh: float = 0.99 ) -> Tuple[Tensor, Tensor]: """ Take value from first if bigger than a multiplicative factor of the second, elementwise. """ mask = (a[0] > thresh * b[0]) values = mask * a[0] + ~mask * b[0] indices = mask * a[1] + ~mask * b[1] return values, indices def _find_max_per_frame( nccf: Tensor, sample_rate: int, freq_high: int ) -> Tensor: r""" For each frame, take the highest value of NCCF, apply centered median smoothing, and convert to frequency. Note: If the max among all the lags is very close to the first half of lags, then the latter is taken. """ lag_min = int(math.ceil(sample_rate / freq_high)) # Find near enough max that is smallest best = torch.max(nccf[..., lag_min:], -1) half_size = nccf.shape[-1] // 2 half = torch.max(nccf[..., lag_min:half_size], -1) best = _combine_max(half, best) indices = best[1] # Add back minimal lag indices += lag_min # Add 1 empirical calibration offset indices += 1 return indices def _median_smoothing( indices: Tensor, win_length: int ) -> Tensor: r""" Apply median smoothing to the 1D tensor over the given window. """ # Centered windowed pad_length = (win_length - 1) // 2 # "replicate" padding in any dimension indices = torch.nn.functional.pad( indices, (pad_length, 0), mode="constant", value=0. ) indices[..., :pad_length] = torch.cat(pad_length * [indices[..., pad_length].unsqueeze(-1)], dim=-1) roll = indices.unfold(-1, win_length, 1) values, _ = torch.median(roll, -1) return values def detect_pitch_frequency( waveform: Tensor, sample_rate: int, frame_time: float = 10 ** (-2), win_length: int = 30, freq_low: int = 85, freq_high: int = 3400, ) -> Tensor: r"""Detect pitch frequency. It is implemented using normalized cross-correlation function and median smoothing. Args: waveform (Tensor): Tensor of audio of dimension (..., freq, time) sample_rate (int): The sample rate of the waveform (Hz) frame_time (float, optional): Duration of a frame (Default: ``10 ** (-2)``). win_length (int, optional): The window length for median smoothing (in number of frames) (Default: ``30``). freq_low (int, optional): Lowest frequency that can be detected (Hz) (Default: ``85``). freq_high (int, optional): Highest frequency that can be detected (Hz) (Default: ``3400``). Returns: Tensor: Tensor of freq of dimension (..., frame) """ # pack batch shape = list(waveform.size()) waveform = waveform.reshape([-1] + shape[-1:]) nccf = _compute_nccf(waveform, sample_rate, frame_time, freq_low) indices = _find_max_per_frame(nccf, sample_rate, freq_high) indices = _median_smoothing(indices, win_length) # Convert indices to frequency EPSILON = 10 ** (-9) freq = sample_rate / (EPSILON + indices.to(torch.float)) # unpack batch freq = freq.reshape(shape[:-1] + list(freq.shape[-1:])) return freq def sliding_window_cmn( waveform: Tensor, cmn_window: int = 600, min_cmn_window: int = 100, center: bool = False, norm_vars: bool = False, ) -> Tensor: r""" Apply sliding-window cepstral mean (and optionally variance) normalization per utterance. Args: waveform (Tensor): Tensor of audio of dimension (..., freq, time) cmn_window (int, optional): Window in frames for running average CMN computation (int, default = 600) min_cmn_window (int, optional): Minimum CMN window used at start of decoding (adds latency only at start). Only applicable if center == false, ignored if center==true (int, default = 100) center (bool, optional): If true, use a window centered on the current frame (to the extent possible, modulo end effects). If false, window is to the left. (bool, default = false) norm_vars (bool, optional): If true, normalize variance to one. (bool, default = false) Returns: Tensor: Tensor of freq of dimension (..., frame) """ input_shape = waveform.shape num_frames, num_feats = input_shape[-2:] waveform = waveform.view(-1, num_frames, num_feats) num_channels = waveform.shape[0] dtype = waveform.dtype device = waveform.device last_window_start = last_window_end = -1 cur_sum = torch.zeros(num_channels, num_feats, dtype=dtype, device=device) cur_sumsq = torch.zeros(num_channels, num_feats, dtype=dtype, device=device) cmn_waveform = torch.zeros( num_channels, num_frames, num_feats, dtype=dtype, device=device) for t in range(num_frames): window_start = 0 window_end = 0 if center: window_start = t - cmn_window // 2 window_end = window_start + cmn_window else: window_start = t - cmn_window window_end = t + 1 if window_start < 0: window_end -= window_start window_start = 0 if not center: if window_end > t: window_end = max(t + 1, min_cmn_window) if window_end > num_frames: window_start -= (window_end - num_frames) window_end = num_frames if window_start < 0: window_start = 0 if last_window_start == -1: input_part = waveform[:, window_start: window_end - window_start, :] cur_sum += torch.sum(input_part, 1) if norm_vars: cur_sumsq += torch.cumsum(input_part ** 2, 1)[:, -1, :] else: if window_start > last_window_start: frame_to_remove = waveform[:, last_window_start, :] cur_sum -= frame_to_remove if norm_vars: cur_sumsq -= (frame_to_remove ** 2) if window_end > last_window_end: frame_to_add = waveform[:, last_window_end, :] cur_sum += frame_to_add if norm_vars: cur_sumsq += (frame_to_add ** 2) window_frames = window_end - window_start last_window_start = window_start last_window_end = window_end cmn_waveform[:, t, :] = waveform[:, t, :] - cur_sum / window_frames if norm_vars: if window_frames == 1: cmn_waveform[:, t, :] = torch.zeros( num_channels, num_feats, dtype=dtype, device=device) else: variance = cur_sumsq variance = variance / window_frames variance -= ((cur_sum ** 2) / (window_frames ** 2)) variance = torch.pow(variance, -0.5) cmn_waveform[:, t, :] *= variance cmn_waveform = cmn_waveform.view(input_shape[:-2] + (num_frames, num_feats)) if len(input_shape) == 2: cmn_waveform = cmn_waveform.squeeze(0) return cmn_waveform def _measure( measure_len_ws: int, samples: Tensor, spectrum: Tensor, noise_spectrum: Tensor, spectrum_window: Tensor, spectrum_start: int, spectrum_end: int, cepstrum_window: Tensor, cepstrum_start: int, cepstrum_end: int, noise_reduction_amount: float, measure_smooth_time_mult: float, noise_up_time_mult: float, noise_down_time_mult: float, index_ns: int, boot_count: int ) -> float: assert spectrum.size()[-1] == noise_spectrum.size()[-1] samplesLen_ns = samples.size()[-1] dft_len_ws = spectrum.size()[-1] dftBuf = torch.zeros(dft_len_ws) _index_ns = torch.tensor([index_ns] + [ (index_ns + i) % samplesLen_ns for i in range(1, measure_len_ws) ]) dftBuf[:measure_len_ws] = \ samples[_index_ns] * spectrum_window[:measure_len_ws] # memset(c->dftBuf + i, 0, (p->dft_len_ws - i) * sizeof(*c->dftBuf)); dftBuf[measure_len_ws:dft_len_ws].zero_() # lsx_safe_rdft((int)p->dft_len_ws, 1, c->dftBuf); _dftBuf = torch.rfft(dftBuf, 1) # memset(c->dftBuf, 0, p->spectrum_start * sizeof(*c->dftBuf)); _dftBuf[:spectrum_start].zero_() mult: float = boot_count / (1. + boot_count) \ if boot_count >= 0 \ else measure_smooth_time_mult _d = complex_norm(_dftBuf[spectrum_start:spectrum_end]) spectrum[spectrum_start:spectrum_end].mul_(mult).add_(_d * (1 - mult)) _d = spectrum[spectrum_start:spectrum_end] ** 2 _zeros = torch.zeros(spectrum_end - spectrum_start) _mult = _zeros \ if boot_count >= 0 \ else torch.where( _d > noise_spectrum[spectrum_start:spectrum_end], torch.tensor(noise_up_time_mult), # if torch.tensor(noise_down_time_mult) # else ) noise_spectrum[spectrum_start:spectrum_end].mul_(_mult).add_(_d * (1 - _mult)) _d = torch.sqrt( torch.max( _zeros, _d - noise_reduction_amount * noise_spectrum[spectrum_start:spectrum_end])) _cepstrum_Buf: Tensor = torch.zeros(dft_len_ws >> 1) _cepstrum_Buf[spectrum_start:spectrum_end] = _d * cepstrum_window _cepstrum_Buf[spectrum_end:dft_len_ws >> 1].zero_() # lsx_safe_rdft((int)p->dft_len_ws >> 1, 1, c->dftBuf); _cepstrum_Buf = torch.rfft(_cepstrum_Buf, 1) result: float = float(torch.sum( complex_norm( _cepstrum_Buf[cepstrum_start:cepstrum_end], power=2.0))) result = \ math.log(result / (cepstrum_end - cepstrum_start)) \ if result > 0 \ else -math.inf return max(0, 21 + result) def vad( waveform: Tensor, sample_rate: int, trigger_level: float = 7.0, trigger_time: float = 0.25, search_time: float = 1.0, allowed_gap: float = 0.25, pre_trigger_time: float = 0.0, # Fine-tuning parameters boot_time: float = .35, noise_up_time: float = .1, noise_down_time: float = .01, noise_reduction_amount: float = 1.35, measure_freq: float = 20.0, measure_duration: Optional[float] = None, measure_smooth_time: float = .4, hp_filter_freq: float = 50., lp_filter_freq: float = 6000., hp_lifter_freq: float = 150., lp_lifter_freq: float = 2000., ) -> Tensor: r"""Voice Activity Detector. Similar to SoX implementation. Attempts to trim silence and quiet background sounds from the ends of recordings of speech. The algorithm currently uses a simple cepstral power measurement to detect voice, so may be fooled by other things, especially music. The effect can trim only from the front of the audio, so in order to trim from the back, the reverse effect must also be used. Args: waveform (Tensor): Tensor of audio of dimension `(..., time)` sample_rate (int): Sample rate of audio signal. trigger_level (float, optional): The measurement level used to trigger activity detection. This may need to be cahnged depending on the noise level, signal level, and other characteristics of the input audio. (Default: 7.0) trigger_time (float, optional): The time constant (in seconds) used to help ignore short bursts of sound. (Default: 0.25) search_time (float, optional): The amount of audio (in seconds) to search for quieter/shorter bursts of audio to include prior to the detected trigger point. (Default: 1.0) allowed_gap (float, optional): The allowed gap (in seconds) between quiteter/shorter bursts of audio to include prior to the detected trigger point. (Default: 0.25) pre_trigger_time (float, optional): The amount of audio (in seconds) to preserve before the trigger point and any found quieter/shorter bursts. (Default: 0.0) boot_time (float, optional) The algorithm (internally) uses adaptive noise estimation/reduction in order to detect the start of the wanted audio. This option sets the time for the initial noise estimate. (Default: 0.35) noise_up_time (float, optional) Time constant used by the adaptive noise estimator for when the noise level is increasing. (Default: 0.1) noise_down_time (float, optional) Time constant used by the adaptive noise estimator for when the noise level is decreasing. (Default: 0.01) noise_reduction_amount (float, optional) Amount of noise reduction to use in the detection algorithm (e.g. 0, 0.5, ...). (Default: 1.35) measure_freq (float, optional) Frequency of the algorithm’s processing/measurements. (Default: 20.0) measure_duration: (float, optional) Measurement duration. (Default: Twice the measurement period; i.e. with overlap.) measure_smooth_time (float, optional) Time constant used to smooth spectral measurements. (Default: 0.4) hp_filter_freq (float, optional) "Brick-wall" frequency of high-pass filter applied at the input to the detector algorithm. (Default: 50.0) lp_filter_freq (float, optional) "Brick-wall" frequency of low-pass filter applied at the input to the detector algorithm. (Default: 6000.0) hp_lifter_freq (float, optional) "Brick-wall" frequency of high-pass lifter used in the detector algorithm. (Default: 150.0) lp_lifter_freq (float, optional) "Brick-wall" frequency of low-pass lifter used in the detector algorithm. (Default: 2000.0) Returns: Tensor: Tensor of audio of dimension (..., time). References: http://sox.sourceforge.net/sox.html """ measure_duration: float = 2.0 / measure_freq \ if measure_duration is None \ else measure_duration measure_len_ws = int(sample_rate * measure_duration + .5) measure_len_ns = measure_len_ws # for (dft_len_ws = 16; dft_len_ws < measure_len_ws; dft_len_ws <<= 1); dft_len_ws = 16 while (dft_len_ws < measure_len_ws): dft_len_ws *= 2 measure_period_ns = int(sample_rate / measure_freq + .5) measures_len = math.ceil(search_time * measure_freq) search_pre_trigger_len_ns = measures_len * measure_period_ns gap_len = int(allowed_gap * measure_freq + .5) fixed_pre_trigger_len_ns = int(pre_trigger_time * sample_rate + .5) samplesLen_ns = fixed_pre_trigger_len_ns + search_pre_trigger_len_ns + measure_len_ns spectrum_window = torch.zeros(measure_len_ws) for i in range(measure_len_ws): # sox.h:741 define SOX_SAMPLE_MIN (sox_sample_t)SOX_INT_MIN(32) spectrum_window[i] = 2. / math.sqrt(float(measure_len_ws)) # lsx_apply_hann(spectrum_window, (int)measure_len_ws); spectrum_window *= torch.hann_window(measure_len_ws, dtype=torch.float) spectrum_start: int = int(hp_filter_freq / sample_rate * dft_len_ws + .5) spectrum_start: int = max(spectrum_start, 1) spectrum_end: int = int(lp_filter_freq / sample_rate * dft_len_ws + .5) spectrum_end: int = min(spectrum_end, dft_len_ws // 2) cepstrum_window = torch.zeros(spectrum_end - spectrum_start) for i in range(spectrum_end - spectrum_start): cepstrum_window[i] = 2. / math.sqrt(float(spectrum_end) - spectrum_start) # lsx_apply_hann(cepstrum_window,(int)(spectrum_end - spectrum_start)); cepstrum_window *= torch.hann_window(spectrum_end - spectrum_start, dtype=torch.float) cepstrum_start = math.ceil(sample_rate * .5 / lp_lifter_freq) cepstrum_end = math.floor(sample_rate * .5 / hp_lifter_freq) cepstrum_end = min(cepstrum_end, dft_len_ws // 4) assert cepstrum_end > cepstrum_start noise_up_time_mult = math.exp(-1. / (noise_up_time * measure_freq)) noise_down_time_mult = math.exp(-1. / (noise_down_time * measure_freq)) measure_smooth_time_mult = math.exp(-1. / (measure_smooth_time * measure_freq)) trigger_meas_time_mult = math.exp(-1. / (trigger_time * measure_freq)) boot_count_max = int(boot_time * measure_freq - .5) measure_timer_ns = measure_len_ns boot_count = measures_index = flushedLen_ns = samplesIndex_ns = 0 # pack batch shape = waveform.size() waveform = waveform.view(-1, shape[-1]) n_channels, ilen = waveform.size() mean_meas = torch.zeros(n_channels) samples = torch.zeros(n_channels, samplesLen_ns) spectrum = torch.zeros(n_channels, dft_len_ws) noise_spectrum = torch.zeros(n_channels, dft_len_ws) measures = torch.zeros(n_channels, measures_len) has_triggered: bool = False num_measures_to_flush: int = 0 pos: int = 0 while (pos < ilen and not has_triggered): measure_timer_ns -= 1 for i in range(n_channels): samples[i, samplesIndex_ns] = waveform[i, pos] # if (!p->measure_timer_ns) { if (measure_timer_ns == 0): index_ns: int = \ (samplesIndex_ns + samplesLen_ns - measure_len_ns) % samplesLen_ns meas: float = _measure( measure_len_ws=measure_len_ws, samples=samples[i], spectrum=spectrum[i], noise_spectrum=noise_spectrum[i], spectrum_window=spectrum_window, spectrum_start=spectrum_start, spectrum_end=spectrum_end, cepstrum_window=cepstrum_window, cepstrum_start=cepstrum_start, cepstrum_end=cepstrum_end, noise_reduction_amount=noise_reduction_amount, measure_smooth_time_mult=measure_smooth_time_mult, noise_up_time_mult=noise_up_time_mult, noise_down_time_mult=noise_down_time_mult, index_ns=index_ns, boot_count=boot_count) measures[i, measures_index] = meas mean_meas[i] = mean_meas[i] * trigger_meas_time_mult + meas * (1. - trigger_meas_time_mult) has_triggered = has_triggered or (mean_meas[i] >= trigger_level) if has_triggered: n: int = measures_len k: int = measures_index jTrigger: int = n jZero: int = n j: int = 0 for j in range(n): if (measures[i, k] >= trigger_level) and (j <= jTrigger + gap_len): jZero = jTrigger = j elif (measures[i, k] == 0) and (jTrigger >= jZero): jZero = j k = (k + n - 1) % n j = min(j, jZero) # num_measures_to_flush = range_limit(j, num_measures_to_flush, n); num_measures_to_flush = (min(max(num_measures_to_flush, j), n)) # end if has_triggered # end if (measure_timer_ns == 0): # end for samplesIndex_ns += 1 pos += 1 # end while if samplesIndex_ns == samplesLen_ns: samplesIndex_ns = 0 if measure_timer_ns == 0: measure_timer_ns = measure_period_ns measures_index += 1 measures_index = measures_index % measures_len if boot_count >= 0: boot_count = -1 if boot_count == boot_count_max else boot_count + 1 if has_triggered: flushedLen_ns = (measures_len - num_measures_to_flush) * measure_period_ns samplesIndex_ns = (samplesIndex_ns + flushedLen_ns) % samplesLen_ns res = waveform[:, pos - samplesLen_ns + flushedLen_ns:] # unpack batch return res.view(shape[:-1] + res.shape[-1:]) audio-0.7.2/torchaudio/kaldi_io.py000066400000000000000000000117061376444676100171360ustar00rootroot00000000000000# To use this file, the dependency (https://github.com/vesis84/kaldi-io-for-python) # needs to be installed. This is a light wrapper around kaldi_io that returns # torch.Tensors. from typing import Any, Callable, Iterable, Tuple import torch from torch import Tensor from torchaudio._internal import module_utils as _mod_utils if _mod_utils.is_module_available('kaldi_io', 'numpy'): import numpy as np import kaldi_io __all__ = [ 'read_vec_int_ark', 'read_vec_flt_scp', 'read_vec_flt_ark', 'read_mat_scp', 'read_mat_ark', ] def _convert_method_output_to_tensor(file_or_fd: Any, fn: Callable, convert_contiguous: bool = False) -> Iterable[Tuple[str, Tensor]]: r"""Takes a method invokes it. The output is converted to a tensor. Args: file_or_fd (str/FileDescriptor): File name or file descriptor fn (Callable): Function that has the signature (file name/descriptor) and converts it to Iterable[Tuple[str, Tensor]]. convert_contiguous (bool, optional): Determines whether the array should be converted into a contiguous layout. (Default: ``False``) Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is vec/mat """ for key, np_arr in fn(file_or_fd): if convert_contiguous: np_arr = np.ascontiguousarray(np_arr) yield key, torch.from_numpy(np_arr) @_mod_utils.requires_module('kaldi_io', 'numpy') def read_vec_int_ark(file_or_fd: Any) -> Iterable[Tuple[str, Tensor]]: r"""Create generator of (key,vector) tuples, which reads from the ark file/stream. Args: file_or_fd (str/FileDescriptor): ark, gzipped ark, pipe or opened file descriptor Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is the vector read from file Example >>> # read ark to a 'dictionary' >>> d = { u:d for u,d in torchaudio.kaldi_io.read_vec_int_ark(file) } """ # Requires convert_contiguous to be True because elements from int32 vector are # sored in tuples: (sizeof(int32), value) so strides are (5,) instead of (4,) which will throw an error # in from_numpy as it expects strides to be a multiple of 4 (int32). return _convert_method_output_to_tensor(file_or_fd, kaldi_io.read_vec_int_ark, convert_contiguous=True) @_mod_utils.requires_module('kaldi_io', 'numpy') def read_vec_flt_scp(file_or_fd: Any) -> Iterable[Tuple[str, Tensor]]: r"""Create generator of (key,vector) tuples, read according to Kaldi scp. Args: file_or_fd (str/FileDescriptor): scp, gzipped scp, pipe or opened file descriptor Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is the vector read from file Example >>> # read scp to a 'dictionary' >>> # d = { u:d for u,d in torchaudio.kaldi_io.read_vec_flt_scp(file) } """ return _convert_method_output_to_tensor(file_or_fd, kaldi_io.read_vec_flt_scp) @_mod_utils.requires_module('kaldi_io', 'numpy') def read_vec_flt_ark(file_or_fd: Any) -> Iterable[Tuple[str, Tensor]]: r"""Create generator of (key,vector) tuples, which reads from the ark file/stream. Args: file_or_fd (str/FileDescriptor): ark, gzipped ark, pipe or opened file descriptor Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is the vector read from file Example >>> # read ark to a 'dictionary' >>> d = { u:d for u,d in torchaudio.kaldi_io.read_vec_flt_ark(file) } """ return _convert_method_output_to_tensor(file_or_fd, kaldi_io.read_vec_flt_ark) @_mod_utils.requires_module('kaldi_io', 'numpy') def read_mat_scp(file_or_fd: Any) -> Iterable[Tuple[str, Tensor]]: r"""Create generator of (key,matrix) tuples, read according to Kaldi scp. Args: file_or_fd (str/FileDescriptor): scp, gzipped scp, pipe or opened file descriptor Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is the matrix read from file Example >>> # read scp to a 'dictionary' >>> d = { u:d for u,d in torchaudio.kaldi_io.read_mat_scp(file) } """ return _convert_method_output_to_tensor(file_or_fd, kaldi_io.read_mat_scp) @_mod_utils.requires_module('kaldi_io', 'numpy') def read_mat_ark(file_or_fd: Any) -> Iterable[Tuple[str, Tensor]]: r"""Create generator of (key,matrix) tuples, which reads from the ark file/stream. Args: file_or_fd (str/FileDescriptor): ark, gzipped ark, pipe or opened file descriptor Returns: Iterable[Tuple[str, Tensor]]: The string is the key and the tensor is the matrix read from file Example >>> # read ark to a 'dictionary' >>> d = { u:d for u,d in torchaudio.kaldi_io.read_mat_ark(file) } """ return _convert_method_output_to_tensor(file_or_fd, kaldi_io.read_mat_ark) audio-0.7.2/torchaudio/models/000077500000000000000000000000001376444676100162675ustar00rootroot00000000000000audio-0.7.2/torchaudio/models/__init__.py000066400000000000000000000001441376444676100203770ustar00rootroot00000000000000from .wav2letter import Wav2Letter from .wavernn import WaveRNN from .conv_tasnet import ConvTasNet audio-0.7.2/torchaudio/models/conv_tasnet.py000066400000000000000000000267171376444676100212010ustar00rootroot00000000000000"""Implements Conv-TasNet with building blocks of it. Based on https://github.com/naplab/Conv-TasNet/tree/e66d82a8f956a69749ec8a4ae382217faa097c5c """ from typing import Tuple, Optional import torch class ConvBlock(torch.nn.Module): """1D Convolutional block. Args: io_channels (int): The number of input/output channels, hidden_channels (int): The number of channels in the internal layers, . kernel_size (int): The convolution kernel size of the middle layer,

. padding (int): Padding value of the convolution in the middle layer. dilation (int): Dilation value of the convolution in the middle layer. no_redisual (bool): Disable residual block/output. Note: This implementation corresponds to the "non-causal" setting in the paper. Reference: - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 """ def __init__( self, io_channels: int, hidden_channels: int, kernel_size: int, padding: int, dilation: int = 1, no_residual: bool = False, ): super().__init__() self.conv_layers = torch.nn.Sequential( torch.nn.Conv1d( in_channels=io_channels, out_channels=hidden_channels, kernel_size=1 ), torch.nn.PReLU(), torch.nn.GroupNorm(num_groups=1, num_channels=hidden_channels, eps=1e-08), torch.nn.Conv1d( in_channels=hidden_channels, out_channels=hidden_channels, kernel_size=kernel_size, padding=padding, dilation=dilation, groups=hidden_channels, ), torch.nn.PReLU(), torch.nn.GroupNorm(num_groups=1, num_channels=hidden_channels, eps=1e-08), ) self.res_out = ( None if no_residual else torch.nn.Conv1d( in_channels=hidden_channels, out_channels=io_channels, kernel_size=1 ) ) self.skip_out = torch.nn.Conv1d( in_channels=hidden_channels, out_channels=io_channels, kernel_size=1 ) def forward( self, input: torch.Tensor ) -> Tuple[Optional[torch.Tensor], torch.Tensor]: feature = self.conv_layers(input) if self.res_out is None: residual = None else: residual = self.res_out(feature) skip_out = self.skip_out(feature) return residual, skip_out class MaskGenerator(torch.nn.Module): """TCN (Temporal Convolution Network) Separation Module Generates masks for separation. Args: input_dim (int): Input feature dimension, . num_sources (int): The number of sources to separate. kernel_size (int): The convolution kernel size of conv blocks,

. num_featrs (int): Input/output feature dimenstion of conv blocks, . num_hidden (int): Intermediate feature dimention of conv blocks, num_layers (int): The number of conv blocks in one stack, . num_stacks (int): The number of conv block stacks, . Note: This implementation corresponds to the "non-causal" setting in the paper. References: - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 """ def __init__( self, input_dim: int, num_sources: int, kernel_size: int, num_feats: int, num_hidden: int, num_layers: int, num_stacks: int, ): super().__init__() self.input_dim = input_dim self.num_sources = num_sources self.input_norm = torch.nn.GroupNorm( num_groups=1, num_channels=input_dim, eps=1e-8 ) self.input_conv = torch.nn.Conv1d( in_channels=input_dim, out_channels=num_feats, kernel_size=1 ) self.receptive_field = 0 self.conv_layers = torch.nn.ModuleList([]) for s in range(num_stacks): for l in range(num_layers): multi = 2 ** l self.conv_layers.append( ConvBlock( io_channels=num_feats, hidden_channels=num_hidden, kernel_size=kernel_size, dilation=multi, padding=multi, # The last ConvBlock does not need residual no_residual=(l == (num_layers - 1) and s == (num_stacks - 1)), ) ) self.receptive_field += ( kernel_size if s == 0 and l == 0 else (kernel_size - 1) * multi ) self.output_prelu = torch.nn.PReLU() self.output_conv = torch.nn.Conv1d( in_channels=num_feats, out_channels=input_dim * num_sources, kernel_size=1, ) def forward(self, input: torch.Tensor) -> torch.Tensor: """Generate separation mask. Args: input (torch.Tensor): 3D Tensor with shape [batch, features, frames] Returns: torch.Tensor: shape [batch, num_sources, features, frames] """ batch_size = input.shape[0] feats = self.input_norm(input) feats = self.input_conv(feats) output = 0.0 for layer in self.conv_layers: residual, skip = layer(feats) if residual is not None: # the last conv layer does not produce residual feats = feats + residual output = output + skip output = self.output_prelu(output) output = self.output_conv(output) output = torch.sigmoid(output) return output.view(batch_size, self.num_sources, self.input_dim, -1) class ConvTasNet(torch.nn.Module): """Conv-TasNet: a fully-convolutional time-domain audio separation network Args: num_sources (int): The number of sources to split. enc_kernel_size (int): The convolution kernel size of the encoder/decoder, . enc_num_feats (int): The feature dimensions passed to mask generator, . msk_kernel_size (int): The convolution kernel size of the mask generator,

. msk_num_feats (int): The input/output feature dimension of conv block in the mask generator, . msk_num_hidden_feats (int): The internal feature dimension of conv block of the mask generator, . msk_num_layers (int): The number of layers in one conv block of the mask generator, . msk_num_stacks (int): The numbr of conv blocks of the mask generator, . Note: This implementation corresponds to the "non-causal" setting in the paper. Reference: - Conv-TasNet: Surpassing Ideal Time--Frequency Magnitude Masking for Speech Separation Luo, Yi and Mesgarani, Nima https://arxiv.org/abs/1809.07454 """ def __init__( self, num_sources: int = 2, # encoder/decoder parameters enc_kernel_size: int = 16, enc_num_feats: int = 512, # mask generator parameters msk_kernel_size: int = 3, msk_num_feats: int = 128, msk_num_hidden_feats: int = 512, msk_num_layers: int = 8, msk_num_stacks: int = 3, ): super().__init__() self.num_sources = num_sources self.enc_num_feats = enc_num_feats self.enc_kernel_size = enc_kernel_size self.enc_stride = enc_kernel_size // 2 self.encoder = torch.nn.Conv1d( in_channels=1, out_channels=enc_num_feats, kernel_size=enc_kernel_size, stride=self.enc_stride, padding=self.enc_stride, bias=False, ) self.mask_generator = MaskGenerator( input_dim=enc_num_feats, num_sources=num_sources, kernel_size=msk_kernel_size, num_feats=msk_num_feats, num_hidden=msk_num_hidden_feats, num_layers=msk_num_layers, num_stacks=msk_num_stacks, ) self.decoder = torch.nn.ConvTranspose1d( in_channels=enc_num_feats, out_channels=1, kernel_size=enc_kernel_size, stride=self.enc_stride, padding=self.enc_stride, bias=False, ) def _align_num_frames_with_strides( self, input: torch.Tensor ) -> Tuple[torch.Tensor, int]: """Pad input Tensor so that the end of the input tensor corresponds with 1. (if kernel size is odd) the center of the last convolution kernel or 2. (if kernel size is even) the end of the first half of the last convolution kernel Assumption: The resulting Tensor will be padded with the size of stride (== kernel_width // 2) on the both ends in Conv1D |<--- k_1 --->| | | |<-- k_n-1 -->| | | | |<--- k_n --->| | | | | | | | | | | | v v v | |<---->|<--- input signal --->|<--->|<---->| stride PAD stride Args: input (torch.Tensor): 3D Tensor with shape (batch_size, channels==1, frames) Returns: torch.Tensor: Padded Tensor int: Number of paddings performed """ batch_size, num_channels, num_frames = input.shape is_odd = self.enc_kernel_size % 2 num_strides = (num_frames - is_odd) // self.enc_stride num_remainings = num_frames - (is_odd + num_strides * self.enc_stride) if num_remainings == 0: return input, 0 num_paddings = self.enc_stride - num_remainings pad = torch.zeros( batch_size, num_channels, num_paddings, dtype=input.dtype, device=input.device, ) return torch.cat([input, pad], 2), num_paddings def forward(self, input: torch.Tensor) -> torch.Tensor: """Perform source separation. Generate audio source waveforms. Args: input (torch.Tensor): 3D Tensor with shape [batch, channel==1, frames] Returns: torch.Tensor: 3D Tensor with shape [batch, channel==num_sources, frames] """ if input.ndim != 3 or input.shape[1] != 1: raise ValueError( f"Expected 3D tensor (batch, channel==1, frames). Found: {input.shape}" ) # B: batch size # L: input frame length # L': padded input frame length # F: feature dimension # M: feature frame length # S: number of sources padded, num_pads = self._align_num_frames_with_strides(input) # B, 1, L' batch_size, num_padded_frames = padded.shape[0], padded.shape[2] feats = self.encoder(padded) # B, F, M masked = self.mask_generator(feats) * feats.unsqueeze(1) # B, S, F, M masked = masked.view( batch_size * self.num_sources, self.enc_num_feats, -1 ) # B*S, F, M decoded = self.decoder(masked) # B*S, 1, L' output = decoded.view( batch_size, self.num_sources, num_padded_frames ) # B, S, L' if num_pads > 0: output = output[..., :-num_pads] # B, S, L return output audio-0.7.2/torchaudio/models/wav2letter.py000066400000000000000000000064501376444676100207450ustar00rootroot00000000000000from torch import Tensor from torch import nn __all__ = ["Wav2Letter"] class Wav2Letter(nn.Module): r"""Wav2Letter model architecture from the `Wav2Letter an End-to-End ConvNet-based Speech Recognition System`_. .. _Wav2Letter an End-to-End ConvNet-based Speech Recognition System: https://arxiv.org/abs/1609.03193 :math:`\text{padding} = \frac{\text{ceil}(\text{kernel} - \text{stride})}{2}` Args: num_classes (int, optional): Number of classes to be classified. (Default: ``40``) input_type (str, optional): Wav2Letter can use as input: ``waveform``, ``power_spectrum`` or ``mfcc`` (Default: ``waveform``). num_features (int, optional): Number of input features that the network will receive (Default: ``1``). """ def __init__(self, num_classes: int = 40, input_type: str = "waveform", num_features: int = 1) -> None: super(Wav2Letter, self).__init__() acoustic_num_features = 250 if input_type == "waveform" else num_features acoustic_model = nn.Sequential( nn.Conv1d(in_channels=acoustic_num_features, out_channels=250, kernel_size=48, stride=2, padding=23), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=250, kernel_size=7, stride=1, padding=3), nn.ReLU(inplace=True), nn.Conv1d(in_channels=250, out_channels=2000, kernel_size=32, stride=1, padding=16), nn.ReLU(inplace=True), nn.Conv1d(in_channels=2000, out_channels=2000, kernel_size=1, stride=1, padding=0), nn.ReLU(inplace=True), nn.Conv1d(in_channels=2000, out_channels=num_classes, kernel_size=1, stride=1, padding=0), nn.ReLU(inplace=True) ) if input_type == "waveform": waveform_model = nn.Sequential( nn.Conv1d(in_channels=num_features, out_channels=250, kernel_size=250, stride=160, padding=45), nn.ReLU(inplace=True) ) self.acoustic_model = nn.Sequential(waveform_model, acoustic_model) if input_type in ["power_spectrum", "mfcc"]: self.acoustic_model = acoustic_model def forward(self, x: Tensor) -> Tensor: r""" Args: x (torch.Tensor): Tensor of dimension (batch_size, num_features, input_length). Returns: Tensor: Predictor tensor of dimension (batch_size, number_of_classes, input_length). """ x = self.acoustic_model(x) x = nn.functional.log_softmax(x, dim=1) return x audio-0.7.2/torchaudio/models/wavernn.py000066400000000000000000000302041376444676100203200ustar00rootroot00000000000000from typing import List, Tuple import torch from torch import Tensor from torch import nn __all__ = ["ResBlock", "MelResNet", "Stretch2d", "UpsampleNetwork", "WaveRNN"] class ResBlock(nn.Module): r"""ResNet block based on "Deep Residual Learning for Image Recognition" The paper link is https://arxiv.org/pdf/1512.03385.pdf. Args: n_freq: the number of bins in a spectrogram. (Default: ``128``) Examples >>> resblock = ResBlock() >>> input = torch.rand(10, 128, 512) # a random spectrogram >>> output = resblock(input) # shape: (10, 128, 512) """ def __init__(self, n_freq: int = 128) -> None: super().__init__() self.resblock_model = nn.Sequential( nn.Conv1d(in_channels=n_freq, out_channels=n_freq, kernel_size=1, bias=False), nn.BatchNorm1d(n_freq), nn.ReLU(inplace=True), nn.Conv1d(in_channels=n_freq, out_channels=n_freq, kernel_size=1, bias=False), nn.BatchNorm1d(n_freq) ) def forward(self, specgram: Tensor) -> Tensor: r"""Pass the input through the ResBlock layer. Args: specgram (Tensor): the input sequence to the ResBlock layer (n_batch, n_freq, n_time). Return: Tensor shape: (n_batch, n_freq, n_time) """ return self.resblock_model(specgram) + specgram class MelResNet(nn.Module): r"""MelResNet layer uses a stack of ResBlocks on spectrogram. Args: n_res_block: the number of ResBlock in stack. (Default: ``10``) n_freq: the number of bins in a spectrogram. (Default: ``128``) n_hidden: the number of hidden dimensions of resblock. (Default: ``128``) n_output: the number of output dimensions of melresnet. (Default: ``128``) kernel_size: the number of kernel size in the first Conv1d layer. (Default: ``5``) Examples >>> melresnet = MelResNet() >>> input = torch.rand(10, 128, 512) # a random spectrogram >>> output = melresnet(input) # shape: (10, 128, 508) """ def __init__(self, n_res_block: int = 10, n_freq: int = 128, n_hidden: int = 128, n_output: int = 128, kernel_size: int = 5) -> None: super().__init__() ResBlocks = [ResBlock(n_hidden) for _ in range(n_res_block)] self.melresnet_model = nn.Sequential( nn.Conv1d(in_channels=n_freq, out_channels=n_hidden, kernel_size=kernel_size, bias=False), nn.BatchNorm1d(n_hidden), nn.ReLU(inplace=True), *ResBlocks, nn.Conv1d(in_channels=n_hidden, out_channels=n_output, kernel_size=1) ) def forward(self, specgram: Tensor) -> Tensor: r"""Pass the input through the MelResNet layer. Args: specgram (Tensor): the input sequence to the MelResNet layer (n_batch, n_freq, n_time). Return: Tensor shape: (n_batch, n_output, n_time - kernel_size + 1) """ return self.melresnet_model(specgram) class Stretch2d(nn.Module): r"""Upscale the frequency and time dimensions of a spectrogram. Args: time_scale: the scale factor in time dimension freq_scale: the scale factor in frequency dimension Examples >>> stretch2d = Stretch2d(time_scale=10, freq_scale=5) >>> input = torch.rand(10, 100, 512) # a random spectrogram >>> output = stretch2d(input) # shape: (10, 500, 5120) """ def __init__(self, time_scale: int, freq_scale: int) -> None: super().__init__() self.freq_scale = freq_scale self.time_scale = time_scale def forward(self, specgram: Tensor) -> Tensor: r"""Pass the input through the Stretch2d layer. Args: specgram (Tensor): the input sequence to the Stretch2d layer (..., n_freq, n_time). Return: Tensor shape: (..., n_freq * freq_scale, n_time * time_scale) """ return specgram.repeat_interleave(self.freq_scale, -2).repeat_interleave(self.time_scale, -1) class UpsampleNetwork(nn.Module): r"""Upscale the dimensions of a spectrogram. Args: upsample_scales: the list of upsample scales. n_res_block: the number of ResBlock in stack. (Default: ``10``) n_freq: the number of bins in a spectrogram. (Default: ``128``) n_hidden: the number of hidden dimensions of resblock. (Default: ``128``) n_output: the number of output dimensions of melresnet. (Default: ``128``) kernel_size: the number of kernel size in the first Conv1d layer. (Default: ``5``) Examples >>> upsamplenetwork = UpsampleNetwork(upsample_scales=[4, 4, 16]) >>> input = torch.rand(10, 128, 10) # a random spectrogram >>> output = upsamplenetwork(input) # shape: (10, 1536, 128), (10, 1536, 128) """ def __init__(self, upsample_scales: List[int], n_res_block: int = 10, n_freq: int = 128, n_hidden: int = 128, n_output: int = 128, kernel_size: int = 5) -> None: super().__init__() total_scale = 1 for upsample_scale in upsample_scales: total_scale *= upsample_scale self.indent = (kernel_size - 1) // 2 * total_scale self.resnet = MelResNet(n_res_block, n_freq, n_hidden, n_output, kernel_size) self.resnet_stretch = Stretch2d(total_scale, 1) up_layers = [] for scale in upsample_scales: stretch = Stretch2d(scale, 1) conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(1, scale * 2 + 1), padding=(0, scale), bias=False) conv.weight.data.fill_(1. / (scale * 2 + 1)) up_layers.append(stretch) up_layers.append(conv) self.upsample_layers = nn.Sequential(*up_layers) def forward(self, specgram: Tensor) -> Tuple[Tensor, Tensor]: r"""Pass the input through the UpsampleNetwork layer. Args: specgram (Tensor): the input sequence to the UpsampleNetwork layer (n_batch, n_freq, n_time) Return: Tensor shape: (n_batch, n_freq, (n_time - kernel_size + 1) * total_scale), (n_batch, n_output, (n_time - kernel_size + 1) * total_scale) where total_scale is the product of all elements in upsample_scales. """ resnet_output = self.resnet(specgram).unsqueeze(1) resnet_output = self.resnet_stretch(resnet_output) resnet_output = resnet_output.squeeze(1) specgram = specgram.unsqueeze(1) upsampling_output = self.upsample_layers(specgram) upsampling_output = upsampling_output.squeeze(1)[:, :, self.indent:-self.indent] return upsampling_output, resnet_output class WaveRNN(nn.Module): r"""WaveRNN model based on the implementation from `fatchord `_. The original implementation was introduced in `"Efficient Neural Audio Synthesis" `_. The input channels of waveform and spectrogram have to be 1. The product of `upsample_scales` must equal `hop_length`. Args: upsample_scales: the list of upsample scales. n_classes: the number of output classes. hop_length: the number of samples between the starts of consecutive frames. n_res_block: the number of ResBlock in stack. (Default: ``10``) n_rnn: the dimension of RNN layer. (Default: ``512``) n_fc: the dimension of fully connected layer. (Default: ``512``) kernel_size: the number of kernel size in the first Conv1d layer. (Default: ``5``) n_freq: the number of bins in a spectrogram. (Default: ``128``) n_hidden: the number of hidden dimensions of resblock. (Default: ``128``) n_output: the number of output dimensions of melresnet. (Default: ``128``) Example >>> wavernn = WaveRNN(upsample_scales=[5,5,8], n_classes=512, hop_length=200) >>> waveform, sample_rate = torchaudio.load(file) >>> # waveform shape: (n_batch, n_channel, (n_time - kernel_size + 1) * hop_length) >>> specgram = MelSpectrogram(sample_rate)(waveform) # shape: (n_batch, n_channel, n_freq, n_time) >>> output = wavernn(waveform, specgram) >>> # output shape: (n_batch, n_channel, (n_time - kernel_size + 1) * hop_length, n_classes) """ def __init__(self, upsample_scales: List[int], n_classes: int, hop_length: int, n_res_block: int = 10, n_rnn: int = 512, n_fc: int = 512, kernel_size: int = 5, n_freq: int = 128, n_hidden: int = 128, n_output: int = 128) -> None: super().__init__() self.kernel_size = kernel_size self.n_rnn = n_rnn self.n_aux = n_output // 4 self.hop_length = hop_length self.n_classes = n_classes total_scale = 1 for upsample_scale in upsample_scales: total_scale *= upsample_scale if total_scale != self.hop_length: raise ValueError(f"Expected: total_scale == hop_length, but found {total_scale} != {hop_length}") self.upsample = UpsampleNetwork(upsample_scales, n_res_block, n_freq, n_hidden, n_output, kernel_size) self.fc = nn.Linear(n_freq + self.n_aux + 1, n_rnn) self.rnn1 = nn.GRU(n_rnn, n_rnn, batch_first=True) self.rnn2 = nn.GRU(n_rnn + self.n_aux, n_rnn, batch_first=True) self.relu1 = nn.ReLU(inplace=True) self.relu2 = nn.ReLU(inplace=True) self.fc1 = nn.Linear(n_rnn + self.n_aux, n_fc) self.fc2 = nn.Linear(n_fc + self.n_aux, n_fc) self.fc3 = nn.Linear(n_fc, self.n_classes) def forward(self, waveform: Tensor, specgram: Tensor) -> Tensor: r"""Pass the input through the WaveRNN model. Args: waveform: the input waveform to the WaveRNN layer (n_batch, 1, (n_time - kernel_size + 1) * hop_length) specgram: the input spectrogram to the WaveRNN layer (n_batch, 1, n_freq, n_time) Return: Tensor shape: (n_batch, 1, (n_time - kernel_size + 1) * hop_length, n_classes) """ assert waveform.size(1) == 1, 'Require the input channel of waveform is 1' assert specgram.size(1) == 1, 'Require the input channel of specgram is 1' # remove channel dimension until the end waveform, specgram = waveform.squeeze(1), specgram.squeeze(1) batch_size = waveform.size(0) h1 = torch.zeros(1, batch_size, self.n_rnn, dtype=waveform.dtype, device=waveform.device) h2 = torch.zeros(1, batch_size, self.n_rnn, dtype=waveform.dtype, device=waveform.device) # output of upsample: # specgram: (n_batch, n_freq, (n_time - kernel_size + 1) * total_scale) # aux: (n_batch, n_output, (n_time - kernel_size + 1) * total_scale) specgram, aux = self.upsample(specgram) specgram = specgram.transpose(1, 2) aux = aux.transpose(1, 2) aux_idx = [self.n_aux * i for i in range(5)] a1 = aux[:, :, aux_idx[0]:aux_idx[1]] a2 = aux[:, :, aux_idx[1]:aux_idx[2]] a3 = aux[:, :, aux_idx[2]:aux_idx[3]] a4 = aux[:, :, aux_idx[3]:aux_idx[4]] x = torch.cat([waveform.unsqueeze(-1), specgram, a1], dim=-1) x = self.fc(x) res = x x, _ = self.rnn1(x, h1) x = x + res res = x x = torch.cat([x, a2], dim=-1) x, _ = self.rnn2(x, h2) x = x + res x = torch.cat([x, a3], dim=-1) x = self.fc1(x) x = self.relu1(x) x = torch.cat([x, a4], dim=-1) x = self.fc2(x) x = self.relu2(x) x = self.fc3(x) # bring back channel dimension return x.unsqueeze(1) audio-0.7.2/torchaudio/sox_effects/000077500000000000000000000000001376444676100173145ustar00rootroot00000000000000audio-0.7.2/torchaudio/sox_effects/__init__.py000066400000000000000000000006031376444676100214240ustar00rootroot00000000000000from torchaudio._internal import module_utils as _mod_utils from .sox_effects import ( init_sox_effects, shutdown_sox_effects, effect_names, apply_effects_tensor, apply_effects_file, SoxEffect, SoxEffectsChain, ) if _mod_utils.is_module_available('torchaudio._torchaudio'): import atexit init_sox_effects() atexit.register(shutdown_sox_effects) audio-0.7.2/torchaudio/sox_effects/sox_effects.py000066400000000000000000000446251376444676100222110ustar00rootroot00000000000000import warnings from typing import Any, Callable, List, Optional, Tuple, Union import torch from torch import Tensor from torchaudio._internal import ( module_utils as _mod_utils, misc_ops as _misc_ops, ) from torchaudio.utils.sox_utils import list_effects if _mod_utils.is_module_available('torchaudio._torchaudio'): from torchaudio import _torchaudio @_mod_utils.requires_module('torchaudio._torchaudio') def init_sox_effects(): """Initialize resources required to use sox effects. Note: You do not need to call this function manually. It is called automatically. Once initialized, you do not need to call this function again across the multiple uses of sox effects though it is safe to do so as long as :func:`shutdown_sox_effects` is not called yet. Once :func:`shutdown_sox_effects` is called, you can no longer use SoX effects and initializing again will result in error. """ torch.ops.torchaudio.sox_effects_initialize_sox_effects() @_mod_utils.requires_module("torchaudio._torchaudio") def shutdown_sox_effects(): """Clean up resources required to use sox effects. Note: You do not need to call this function manually. It is called automatically. It is safe to call this function multiple times. Once :py:func:`shutdown_sox_effects` is called, you can no longer use SoX effects and initializing again will result in error. """ torch.ops.torchaudio.sox_effects_shutdown_sox_effects() @_mod_utils.requires_module('torchaudio._torchaudio') def effect_names() -> List[str]: """Gets list of valid sox effect names Returns: List[str]: list of available effect names. Example >>> torchaudio.sox_effects.effect_names() ['allpass', 'band', 'bandpass', ... ] """ return list(list_effects().keys()) @_mod_utils.requires_module('torchaudio._torchaudio') def apply_effects_tensor( tensor: torch.Tensor, sample_rate: int, effects: List[List[str]], channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Apply sox effects to given Tensor Note: This function works in the way very similar to ``sox`` command, however there are slight differences. For example, ``sox`` commnad adds certain effects automatically (such as ``rate`` effect after ``speed`` and ``pitch`` and other effects), but this function does only applies the given effects. (Therefore, to actually apply ``speed`` effect, you also need to give ``rate`` effect with desired sampling rate.) Args: tensor (torch.Tensor): Input 2D Tensor. sample_rate (int): Sample rate effects (List[List[str]]): List of effects. channels_first (bool): Indicates if the input Tensor's dimension is ``[channels, time]`` or ``[time, channels]`` Returns: Tuple[torch.Tensor, int]: Resulting Tensor and sample rate. The resulting Tensor has the same ``dtype`` as the input Tensor, and the same channels order. The shape of the Tensor can be different based on the effects applied. Sample rate can also be different based on the effects applied. Example - Basic usage >>> >>> # Defines the effects to apply >>> effects = [ ... ['gain', '-n'], # normalises to 0dB ... ['pitch', '5'], # 5 cent pitch shift ... ['rate', '8000'], # resample to 8000 Hz ... ] >>> >>> # Generate pseudo wave: >>> # normalized, channels first, 2ch, sampling rate 16000, 1 second >>> sample_rate = 16000 >>> waveform = 2 * torch.rand([2, sample_rate * 1]) - 1 >>> waveform.shape torch.Size([2, 16000]) >>> waveform tensor([[ 0.3138, 0.7620, -0.9019, ..., -0.7495, -0.4935, 0.5442], [-0.0832, 0.0061, 0.8233, ..., -0.5176, -0.9140, -0.2434]]) >>> >>> # Apply effects >>> waveform, sample_rate = apply_effects_tensor( ... wave_form, sample_rate, effects, channels_first=True) >>> >>> # Check the result >>> # The new waveform is sampling rate 8000, 1 second. >>> # normalization and channel order are preserved >>> waveform.shape torch.Size([2, 8000]) >>> waveform tensor([[ 0.5054, -0.5518, -0.4800, ..., -0.0076, 0.0096, -0.0110], [ 0.1331, 0.0436, -0.3783, ..., -0.0035, 0.0012, 0.0008]]) >>> sample_rate 8000 Example - Torchscript-able transform >>> >>> # Use `apply_effects_tensor` in `torch.nn.Module` and dump it to file, >>> # then run sox effect via Torchscript runtime. >>> >>> class SoxEffectTransform(torch.nn.Module): ... effects: List[List[str]] ... ... def __init__(self, effects: List[List[str]]): ... super().__init__() ... self.effects = effects ... ... def forward(self, tensor: torch.Tensor, sample_rate: int): ... return sox_effects.apply_effects_tensor( ... tensor, sample_rate, self.effects) ... ... >>> # Create transform object >>> effects = [ ... ["lowpass", "-1", "300"], # apply single-pole lowpass filter ... ["rate", "8000"], # change sample rate to 8000 ... ] >>> transform = SoxEffectTensorTransform(effects, input_sample_rate) >>> >>> # Dump it to file and load >>> path = 'sox_effect.zip' >>> torch.jit.script(trans).save(path) >>> transform = torch.jit.load(path) >>> >>>> # Run transform >>> waveform, input_sample_rate = torchaudio.load("input.wav") >>> waveform, sample_rate = transform(waveform, input_sample_rate) >>> assert sample_rate == 8000 """ in_signal = torch.classes.torchaudio.TensorSignal(tensor, sample_rate, channels_first) out_signal = torch.ops.torchaudio.sox_effects_apply_effects_tensor(in_signal, effects) return out_signal.get_tensor(), out_signal.get_sample_rate() @_mod_utils.requires_module('torchaudio._torchaudio') def apply_effects_file( path: str, effects: List[List[str]], normalize: bool = True, channels_first: bool = True, ) -> Tuple[torch.Tensor, int]: """Apply sox effects to the audio file and load the resulting data as Tensor Note: This function works in the way very similar to ``sox`` command, however there are slight differences. For example, ``sox`` commnad adds certain effects automatically (such as ``rate`` effect after ``speed``, ``pitch`` etc), but this function only applies the given effects. Therefore, to actually apply ``speed`` effect, you also need to give ``rate`` effect with desired sampling rate, because internally, ``speed`` effects only alter sampling rate and leave samples untouched. Args: path (str): Path to the audio file. effects (List[List[str]]): List of effects. normalize (bool): When ``True``, this function always return ``float32``, and sample values are normalized to ``[-1.0, 1.0]``. If input file is integer WAV, giving ``False`` will change the resulting Tensor type to integer type. This argument has no effect for formats other than integer WAV type. channels_first (bool): When True, the returned Tensor has dimension ``[channel, time]``. Otherwise, the returned Tensor's dimension is ``[time, channel]``. Returns: Tuple[torch.Tensor, int]: Resulting Tensor and sample rate. If ``normalize=True``, the resulting Tensor is always ``float32`` type. If ``normalize=False`` and the input audio file is of integer WAV file, then the resulting Tensor has corresponding integer type. (Note 24 bit integer type is not supported) If ``channels_first=True``, the resulting Tensor has dimension ``[channel, time]``, otherwise ``[time, channel]``. Example - Basic usage >>> >>> # Defines the effects to apply >>> effects = [ ... ['gain', '-n'], # normalises to 0dB ... ['pitch', '5'], # 5 cent pitch shift ... ['rate', '8000'], # resample to 8000 Hz ... ] >>> >>> # Apply effects and load data with channels_first=True >>> waveform, sample_rate = apply_effects_file("data.wav", effects, channels_first=True) >>> >>> # Check the result >>> waveform.shape torch.Size([2, 8000]) >>> waveform tensor([[ 5.1151e-03, 1.8073e-02, 2.2188e-02, ..., 1.0431e-07, -1.4761e-07, 1.8114e-07], [-2.6924e-03, 2.1860e-03, 1.0650e-02, ..., 6.4122e-07, -5.6159e-07, 4.8103e-07]]) >>> sample_rate 8000 Example - Apply random speed perturbation to dataset >>> >>> # Load data from file, apply random speed perturbation >>> class RandomPerturbationFile(torch.utils.data.Dataset): ... \"\"\"Given flist, apply random speed perturbation ... ... Suppose all the input files are at least one second long. ... \"\"\" ... def __init__(self, flist: List[str], sample_rate: int): ... super().__init__() ... self.flist = flist ... self.sample_rate = sample_rate ... self.rng = None ... ... def __getitem__(self, index): ... speed = self.rng.uniform(0.5, 2.0) ... effects = [ ... ['gain', '-n', '-10'], # apply 10 db attenuation ... ['remix', '-'], # merge all the channels ... ['speed', f'{speed:.5f}'], # duration is now 0.5 ~ 2.0 seconds. ... ['rate', f'{self.sample_rate}'], ... ['pad', '0', '1.5'], # add 1.5 seconds silence at the end ... ['trim', '0', '2'], # get the first 2 seconds ... ] ... waveform, _ = torchaudio.sox_effects.apply_effects_file( ... self.flist[index], effects) ... return waveform ... ... def __len__(self): ... return len(self.flist) ... >>> dataset = RandomPerturbationFile(file_list, sample_rate=8000) >>> loader = torch.utils.data.DataLoader(dataset, batch_size=32) >>> for batch in loader: >>> pass """ signal = torch.ops.torchaudio.sox_effects_apply_effects_file(path, effects, normalize, channels_first) return signal.get_tensor(), signal.get_sample_rate() @_mod_utils.requires_module('torchaudio._torchaudio') @_mod_utils.deprecated('Please migrate to `apply_effects_file` or `apply_effects_tensor`.', "0.8.0") def SoxEffect(): r"""Create an object for passing sox effect information between python and c++ Warning: This function is deprecated. Please migrate to :func:`apply_effects_file` or :func:`apply_effects_tensor`. Returns: SoxEffect: An object with the following attributes: ename (str) which is the name of effect, and eopts (List[str]) which is a list of effect options. """ return _torchaudio.SoxEffect() class SoxEffectsChain(object): r"""SoX effects chain class. Warning: This class is deprecated. Please migrate to :func:`apply_effects_file` or :func:`apply_effects_tensor`. Args: normalization (bool, number, or callable, optional): If boolean ``True``, then output is divided by ``1 << 31`` (assumes signed 32-bit audio), and normalizes to ``[-1, 1]``. If ``number``, then output is divided by that number. If ``callable``, then the output is passed as a parameter to the given function, then the output is divided by the result. (Default: ``True``) channels_first (bool, optional): Set channels first or length first in result. (Default: ``True``) out_siginfo (sox_signalinfo_t, optional): a sox_signalinfo_t type, which could be helpful if the audio type cannot be automatically determined. (Default: ``None``) out_encinfo (sox_encodinginfo_t, optional): a sox_encodinginfo_t type, which could be set if the audio type cannot be automatically determined. (Default: ``None``) filetype (str, optional): a filetype or extension to be set if sox cannot determine it automatically. (Default: ``'raw'``) Returns: Tuple[Tensor, int]: An output Tensor of size ``[C x L]`` or ``[L x C]`` where L is the number of audio frames and C is the number of channels. An integer which is the sample rate of the audio (as listed in the metadata of the file) Example >>> class MyDataset(Dataset): ... def __init__(self, audiodir_path): ... self.data = [ ... os.path.join(audiodir_path, fn) ... for fn in os.listdir(audiodir_path)] ... self.E = torchaudio.sox_effects.SoxEffectsChain() ... self.E.append_effect_to_chain("rate", [16000]) # resample to 16000hz ... self.E.append_effect_to_chain("channels", ["1"]) # mono signal ... def __getitem__(self, index): ... fn = self.data[index] ... self.E.set_input_file(fn) ... x, sr = self.E.sox_build_flow_effects() ... return x, sr ... ... def __len__(self): ... return len(self.data) ... >>> ds = MyDataset(path_to_audio_files) >>> for sig, sr in ds: ... pass """ EFFECTS_UNIMPLEMENTED = {"spectrogram", "splice", "noiseprof", "fir"} def __init__(self, normalization: Union[bool, float, Callable] = True, channels_first: bool = True, out_siginfo: Any = None, out_encinfo: Any = None, filetype: str = "raw") -> None: warnings.warn( 'torchaudio.sox_effects.SoxEffectsChain has been deprecated and ' 'will be removed from 0.8.0 release. ' 'Please migrate to `apply_effects_file` or `apply_effects_tensor`.' ) self.input_file: Optional[str] = None self.chain: List[str] = [] self.MAX_EFFECT_OPTS = 20 self.out_siginfo = out_siginfo self.out_encinfo = out_encinfo self.filetype = filetype self.normalization = normalization self.channels_first = channels_first # Define in __init__ to avoid calling at import time self.EFFECTS_AVAILABLE = set(effect_names()) def append_effect_to_chain(self, ename: str, eargs: Optional[Union[List[str], str]] = None) -> None: r"""Append effect to a sox effects chain. Args: ename (str): which is the name of effect eargs (List[str] or str, optional): which is a list of effect options. (Default: ``None``) """ e = SoxEffect() # check if we have a valid effect ename = self._check_effect(ename) if eargs is None or eargs == []: eargs = [""] elif not isinstance(eargs, list): eargs = [eargs] eargs = self._flatten(eargs) if len(eargs) > self.MAX_EFFECT_OPTS: raise RuntimeError("Number of effect options ({}) is greater than max " "suggested number of options {}. Increase MAX_EFFECT_OPTS " "or lower the number of effect options".format(len(eargs), self.MAX_EFFECT_OPTS)) e.ename = ename e.eopts = eargs self.chain.append(e) @_mod_utils.requires_module('torchaudio._torchaudio') def sox_build_flow_effects(self, out: Optional[Tensor] = None) -> Tuple[Tensor, int]: r"""Build effects chain and flow effects from input file to output tensor Args: out (Tensor, optional): Where the output will be written to. (Default: ``None``) Returns: Tuple[Tensor, int]: An output Tensor of size `[C x L]` or `[L x C]` where L is the number of audio frames and C is the number of channels. An integer which is the sample rate of the audio (as listed in the metadata of the file) """ # initialize output tensor if out is not None: _misc_ops.check_input(out) else: out = torch.FloatTensor() if not len(self.chain): e = SoxEffect() e.ename = "no_effects" e.eopts = [""] self.chain.append(e) # print("effect options:", [x.eopts for x in self.chain]) sr = _torchaudio.build_flow_effects(self.input_file, out, self.channels_first, self.out_siginfo, self.out_encinfo, self.filetype, self.chain, self.MAX_EFFECT_OPTS) _misc_ops.normalize_audio(out, self.normalization) return out, sr def clear_chain(self) -> None: r"""Clear effects chain in python """ self.chain = [] def set_input_file(self, input_file: str) -> None: r"""Set input file for input of chain Args: input_file (str): The path to the input file. """ self.input_file = input_file def _check_effect(self, e: str) -> str: if e.lower() in self.EFFECTS_UNIMPLEMENTED: raise NotImplementedError("This effect ({}) is not implement in torchaudio".format(e)) elif e.lower() not in self.EFFECTS_AVAILABLE: raise LookupError("Effect name, {}, not valid".format(e.lower())) return e.lower() # https://stackoverflow.com/questions/12472338/flattening-a-list-recursively # convenience function to flatten list recursively def _flatten(self, x: list) -> list: if x == []: return [] if isinstance(x[0], list): return self._flatten(x[:1]) + self._flatten(x[:1]) return [str(a) for a in x[:1]] + self._flatten(x[1:]) audio-0.7.2/torchaudio/transforms.py000066400000000000000000001253301376444676100175600ustar00rootroot00000000000000# -*- coding: utf-8 -*- import math from typing import Callable, Optional from warnings import warn import torch from torch import Tensor from torchaudio import functional as F from torchaudio.compliance import kaldi __all__ = [ 'Spectrogram', 'GriffinLim', 'AmplitudeToDB', 'MelScale', 'InverseMelScale', 'MelSpectrogram', 'MFCC', 'MuLawEncoding', 'MuLawDecoding', 'Resample', 'ComplexNorm', 'TimeStretch', 'Fade', 'FrequencyMasking', 'TimeMasking', 'SlidingWindowCmn', 'Vad', ] class Spectrogram(torch.nn.Module): r"""Create a spectrogram from a audio signal. Args: n_fft (int, optional): Size of FFT, creates ``n_fft // 2 + 1`` bins. (Default: ``400``) win_length (int or None, optional): Window size. (Default: ``n_fft``) hop_length (int or None, optional): Length of hop between STFT windows. (Default: ``win_length // 2``) pad (int, optional): Two sided padding of signal. (Default: ``0``) window_fn (Callable[..., Tensor], optional): A function to create a window tensor that is applied/multiplied to each frame/window. (Default: ``torch.hann_window``) power (float or None, optional): Exponent for the magnitude spectrogram, (must be > 0) e.g., 1 for energy, 2 for power, etc. If None, then the complex spectrum is returned instead. (Default: ``2``) normalized (bool, optional): Whether to normalize by magnitude after stft. (Default: ``False``) wkwargs (dict or None, optional): Arguments for window function. (Default: ``None``) """ __constants__ = ['n_fft', 'win_length', 'hop_length', 'pad', 'power', 'normalized'] def __init__(self, n_fft: int = 400, win_length: Optional[int] = None, hop_length: Optional[int] = None, pad: int = 0, window_fn: Callable[..., Tensor] = torch.hann_window, power: Optional[float] = 2., normalized: bool = False, wkwargs: Optional[dict] = None) -> None: super(Spectrogram, self).__init__() self.n_fft = n_fft # number of FFT bins. the returned STFT result will have n_fft // 2 + 1 # number of frequecies due to onesided=True in torch.stft self.win_length = win_length if win_length is not None else n_fft self.hop_length = hop_length if hop_length is not None else self.win_length // 2 window = window_fn(self.win_length) if wkwargs is None else window_fn(self.win_length, **wkwargs) self.register_buffer('window', window) self.pad = pad self.power = power self.normalized = normalized def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Dimension (..., freq, time), where freq is ``n_fft // 2 + 1`` where ``n_fft`` is the number of Fourier bins, and time is the number of window hops (n_frame). """ return F.spectrogram(waveform, self.pad, self.window, self.n_fft, self.hop_length, self.win_length, self.power, self.normalized) class GriffinLim(torch.nn.Module): r"""Compute waveform from a linear scale magnitude spectrogram using the Griffin-Lim transformation. Implementation ported from ``librosa`` [1]_, [2]_, [3]_. Args: n_fft (int, optional): Size of FFT, creates ``n_fft // 2 + 1`` bins. (Default: ``400``) n_iter (int, optional): Number of iteration for phase recovery process. (Default: ``32``) win_length (int or None, optional): Window size. (Default: ``n_fft``) hop_length (int or None, optional): Length of hop between STFT windows. (Default: ``win_length // 2``) window_fn (Callable[..., Tensor], optional): A function to create a window tensor that is applied/multiplied to each frame/window. (Default: ``torch.hann_window``) power (float, optional): Exponent for the magnitude spectrogram, (must be > 0) e.g., 1 for energy, 2 for power, etc. (Default: ``2``) normalized (bool, optional): Whether to normalize by magnitude after stft. (Default: ``False``) wkwargs (dict or None, optional): Arguments for window function. (Default: ``None``) momentum (float, optional): The momentum parameter for fast Griffin-Lim. Setting this to 0 recovers the original Griffin-Lim method. Values near 1 can lead to faster convergence, but above 1 may not converge. (Default: ``0.99``) length (int, optional): Array length of the expected output. (Default: ``None``) rand_init (bool, optional): Initializes phase randomly if True and to zero otherwise. (Default: ``True``) References: .. [1] | McFee, Brian, Colin Raffel, Dawen Liang, Daniel PW Ellis, Matt McVicar, Eric Battenberg, and Oriol Nieto. | "librosa: Audio and music signal analysis in python." | In Proceedings of the 14th python in science conference, pp. 18-25. 2015. .. [2] | Perraudin, N., Balazs, P., & Søndergaard, P. L. | "A fast Griffin-Lim algorithm," | IEEE Workshop on Applications of Signal Processing to Audio and Acoustics (pp. 1-4), | Oct. 2013. .. [3] | D. W. Griffin and J. S. Lim, | "Signal estimation from modified short-time Fourier transform," | IEEE Trans. ASSP, vol.32, no.2, pp.236–243, Apr. 1984. """ __constants__ = ['n_fft', 'n_iter', 'win_length', 'hop_length', 'power', 'normalized', 'length', 'momentum', 'rand_init'] def __init__(self, n_fft: int = 400, n_iter: int = 32, win_length: Optional[int] = None, hop_length: Optional[int] = None, window_fn: Callable[..., Tensor] = torch.hann_window, power: float = 2., normalized: bool = False, wkwargs: Optional[dict] = None, momentum: float = 0.99, length: Optional[int] = None, rand_init: bool = True) -> None: super(GriffinLim, self).__init__() assert momentum < 1, 'momentum={} > 1 can be unstable'.format(momentum) assert momentum > 0, 'momentum={} < 0'.format(momentum) self.n_fft = n_fft self.n_iter = n_iter self.win_length = win_length if win_length is not None else n_fft self.hop_length = hop_length if hop_length is not None else self.win_length // 2 window = window_fn(self.win_length) if wkwargs is None else window_fn(self.win_length, **wkwargs) self.register_buffer('window', window) self.normalized = normalized self.length = length self.power = power self.momentum = momentum / (1 + momentum) self.rand_init = rand_init def forward(self, specgram: Tensor) -> Tensor: r""" Args: specgram (Tensor): A magnitude-only STFT spectrogram of dimension (..., freq, frames) where freq is ``n_fft // 2 + 1``. Returns: Tensor: waveform of (..., time), where time equals the ``length`` parameter if given. """ return F.griffinlim(specgram, self.window, self.n_fft, self.hop_length, self.win_length, self.power, self.normalized, self.n_iter, self.momentum, self.length, self.rand_init) class AmplitudeToDB(torch.nn.Module): r"""Turn a tensor from the power/amplitude scale to the decibel scale. This output depends on the maximum value in the input tensor, and so may return different values for an audio clip split into snippets vs. a a full clip. Args: stype (str, optional): scale of input tensor ('power' or 'magnitude'). The power being the elementwise square of the magnitude. (Default: ``'power'``) top_db (float, optional): minimum negative cut-off in decibels. A reasonable number is 80. (Default: ``None``) """ __constants__ = ['multiplier', 'amin', 'ref_value', 'db_multiplier'] def __init__(self, stype: str = 'power', top_db: Optional[float] = None) -> None: super(AmplitudeToDB, self).__init__() self.stype = stype if top_db is not None and top_db < 0: raise ValueError('top_db must be positive value') self.top_db = top_db self.multiplier = 10.0 if stype == 'power' else 20.0 self.amin = 1e-10 self.ref_value = 1.0 self.db_multiplier = math.log10(max(self.amin, self.ref_value)) def forward(self, x: Tensor) -> Tensor: r"""Numerically stable implementation from Librosa. https://librosa.org/doc/latest/generated/librosa.amplitude_to_db.html Args: x (Tensor): Input tensor before being converted to decibel scale. Returns: Tensor: Output tensor in decibel scale. """ return F.amplitude_to_DB(x, self.multiplier, self.amin, self.db_multiplier, self.top_db) class MelScale(torch.nn.Module): r"""Turn a normal STFT into a mel frequency STFT, using a conversion matrix. This uses triangular filter banks. User can control which device the filter bank (`fb`) is (e.g. fb.to(spec_f.device)). Args: n_mels (int, optional): Number of mel filterbanks. (Default: ``128``) sample_rate (int, optional): Sample rate of audio signal. (Default: ``16000``) f_min (float, optional): Minimum frequency. (Default: ``0.``) f_max (float or None, optional): Maximum frequency. (Default: ``sample_rate // 2``) n_stft (int, optional): Number of bins in STFT. Calculated from first input if None is given. See ``n_fft`` in :class:`Spectrogram`. (Default: ``None``) """ __constants__ = ['n_mels', 'sample_rate', 'f_min', 'f_max'] def __init__(self, n_mels: int = 128, sample_rate: int = 16000, f_min: float = 0., f_max: Optional[float] = None, n_stft: Optional[int] = None) -> None: super(MelScale, self).__init__() self.n_mels = n_mels self.sample_rate = sample_rate self.f_max = f_max if f_max is not None else float(sample_rate // 2) self.f_min = f_min assert f_min <= self.f_max, 'Require f_min: {} < f_max: {}'.format(f_min, self.f_max) fb = torch.empty(0) if n_stft is None else F.create_fb_matrix( n_stft, self.f_min, self.f_max, self.n_mels, self.sample_rate) self.register_buffer('fb', fb) def forward(self, specgram: Tensor) -> Tensor: r""" Args: specgram (Tensor): A spectrogram STFT of dimension (..., freq, time). Returns: Tensor: Mel frequency spectrogram of size (..., ``n_mels``, time). """ # pack batch shape = specgram.size() specgram = specgram.reshape(-1, shape[-2], shape[-1]) if self.fb.numel() == 0: tmp_fb = F.create_fb_matrix(specgram.size(1), self.f_min, self.f_max, self.n_mels, self.sample_rate) # Attributes cannot be reassigned outside __init__ so workaround self.fb.resize_(tmp_fb.size()) self.fb.copy_(tmp_fb) # (channel, frequency, time).transpose(...) dot (frequency, n_mels) # -> (channel, time, n_mels).transpose(...) mel_specgram = torch.matmul(specgram.transpose(1, 2), self.fb).transpose(1, 2) # unpack batch mel_specgram = mel_specgram.reshape(shape[:-2] + mel_specgram.shape[-2:]) return mel_specgram class InverseMelScale(torch.nn.Module): r"""Solve for a normal STFT from a mel frequency STFT, using a conversion matrix. This uses triangular filter banks. It minimizes the euclidian norm between the input mel-spectrogram and the product between the estimated spectrogram and the filter banks using SGD. Args: n_stft (int): Number of bins in STFT. See ``n_fft`` in :class:`Spectrogram`. n_mels (int, optional): Number of mel filterbanks. (Default: ``128``) sample_rate (int, optional): Sample rate of audio signal. (Default: ``16000``) f_min (float, optional): Minimum frequency. (Default: ``0.``) f_max (float or None, optional): Maximum frequency. (Default: ``sample_rate // 2``) max_iter (int, optional): Maximum number of optimization iterations. (Default: ``100000``) tolerance_loss (float, optional): Value of loss to stop optimization at. (Default: ``1e-5``) tolerance_change (float, optional): Difference in losses to stop optimization at. (Default: ``1e-8``) sgdargs (dict or None, optional): Arguments for the SGD optimizer. (Default: ``None``) """ __constants__ = ['n_stft', 'n_mels', 'sample_rate', 'f_min', 'f_max', 'max_iter', 'tolerance_loss', 'tolerance_change', 'sgdargs'] def __init__(self, n_stft: int, n_mels: int = 128, sample_rate: int = 16000, f_min: float = 0., f_max: Optional[float] = None, max_iter: int = 100000, tolerance_loss: float = 1e-5, tolerance_change: float = 1e-8, sgdargs: Optional[dict] = None) -> None: super(InverseMelScale, self).__init__() self.n_mels = n_mels self.sample_rate = sample_rate self.f_max = f_max or float(sample_rate // 2) self.f_min = f_min self.max_iter = max_iter self.tolerance_loss = tolerance_loss self.tolerance_change = tolerance_change self.sgdargs = sgdargs or {'lr': 0.1, 'momentum': 0.9} assert f_min <= self.f_max, 'Require f_min: {} < f_max: {}'.format(f_min, self.f_max) fb = F.create_fb_matrix(n_stft, self.f_min, self.f_max, self.n_mels, self.sample_rate) self.register_buffer('fb', fb) def forward(self, melspec: Tensor) -> Tensor: r""" Args: melspec (Tensor): A Mel frequency spectrogram of dimension (..., ``n_mels``, time) Returns: Tensor: Linear scale spectrogram of size (..., freq, time) """ # pack batch shape = melspec.size() melspec = melspec.view(-1, shape[-2], shape[-1]) n_mels, time = shape[-2], shape[-1] freq, _ = self.fb.size() # (freq, n_mels) melspec = melspec.transpose(-1, -2) assert self.n_mels == n_mels specgram = torch.rand(melspec.size()[0], time, freq, requires_grad=True, dtype=melspec.dtype, device=melspec.device) optim = torch.optim.SGD([specgram], **self.sgdargs) loss = float('inf') for _ in range(self.max_iter): optim.zero_grad() diff = melspec - specgram.matmul(self.fb) new_loss = diff.pow(2).sum(axis=-1).mean() # take sum over mel-frequency then average over other dimensions # so that loss threshold is applied par unit timeframe new_loss.backward() optim.step() specgram.data = specgram.data.clamp(min=0) new_loss = new_loss.item() if new_loss < self.tolerance_loss or abs(loss - new_loss) < self.tolerance_change: break loss = new_loss specgram.requires_grad_(False) specgram = specgram.clamp(min=0).transpose(-1, -2) # unpack batch specgram = specgram.view(shape[:-2] + (freq, time)) return specgram class MelSpectrogram(torch.nn.Module): r"""Create MelSpectrogram for a raw audio signal. This is a composition of Spectrogram and MelScale. Sources * https://gist.github.com/kastnerkyle/179d6e9a88202ab0a2fe * https://timsainb.github.io/spectrograms-mfccs-and-inversion-in-python.html * http://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html Args: sample_rate (int, optional): Sample rate of audio signal. (Default: ``16000``) win_length (int or None, optional): Window size. (Default: ``n_fft``) hop_length (int or None, optional): Length of hop between STFT windows. (Default: ``win_length // 2``) n_fft (int, optional): Size of FFT, creates ``n_fft // 2 + 1`` bins. (Default: ``400``) f_min (float, optional): Minimum frequency. (Default: ``0.``) f_max (float or None, optional): Maximum frequency. (Default: ``None``) pad (int, optional): Two sided padding of signal. (Default: ``0``) n_mels (int, optional): Number of mel filterbanks. (Default: ``128``) window_fn (Callable[..., Tensor], optional): A function to create a window tensor that is applied/multiplied to each frame/window. (Default: ``torch.hann_window``) wkwargs (Dict[..., ...] or None, optional): Arguments for window function. (Default: ``None``) Example >>> waveform, sample_rate = torchaudio.load('test.wav', normalization=True) >>> mel_specgram = transforms.MelSpectrogram(sample_rate)(waveform) # (channel, n_mels, time) """ __constants__ = ['sample_rate', 'n_fft', 'win_length', 'hop_length', 'pad', 'n_mels', 'f_min'] def __init__(self, sample_rate: int = 16000, n_fft: int = 400, win_length: Optional[int] = None, hop_length: Optional[int] = None, f_min: float = 0., f_max: Optional[float] = None, pad: int = 0, n_mels: int = 128, window_fn: Callable[..., Tensor] = torch.hann_window, power: Optional[float] = 2., normalized: bool = False, wkwargs: Optional[dict] = None) -> None: super(MelSpectrogram, self).__init__() self.sample_rate = sample_rate self.n_fft = n_fft self.win_length = win_length if win_length is not None else n_fft self.hop_length = hop_length if hop_length is not None else self.win_length // 2 self.pad = pad self.power = power self.normalized = normalized self.n_mels = n_mels # number of mel frequency bins self.f_max = f_max self.f_min = f_min self.spectrogram = Spectrogram(n_fft=self.n_fft, win_length=self.win_length, hop_length=self.hop_length, pad=self.pad, window_fn=window_fn, power=self.power, normalized=self.normalized, wkwargs=wkwargs) self.mel_scale = MelScale(self.n_mels, self.sample_rate, self.f_min, self.f_max, self.n_fft // 2 + 1) def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Mel frequency spectrogram of size (..., ``n_mels``, time). """ specgram = self.spectrogram(waveform) mel_specgram = self.mel_scale(specgram) return mel_specgram class MFCC(torch.nn.Module): r"""Create the Mel-frequency cepstrum coefficients from an audio signal. By default, this calculates the MFCC on the DB-scaled Mel spectrogram. This is not the textbook implementation, but is implemented here to give consistency with librosa. This output depends on the maximum value in the input spectrogram, and so may return different values for an audio clip split into snippets vs. a a full clip. Args: sample_rate (int, optional): Sample rate of audio signal. (Default: ``16000``) n_mfcc (int, optional): Number of mfc coefficients to retain. (Default: ``40``) dct_type (int, optional): type of DCT (discrete cosine transform) to use. (Default: ``2``) norm (str, optional): norm to use. (Default: ``'ortho'``) log_mels (bool, optional): whether to use log-mel spectrograms instead of db-scaled. (Default: ``False``) melkwargs (dict or None, optional): arguments for MelSpectrogram. (Default: ``None``) """ __constants__ = ['sample_rate', 'n_mfcc', 'dct_type', 'top_db', 'log_mels'] def __init__(self, sample_rate: int = 16000, n_mfcc: int = 40, dct_type: int = 2, norm: str = 'ortho', log_mels: bool = False, melkwargs: Optional[dict] = None) -> None: super(MFCC, self).__init__() supported_dct_types = [2] if dct_type not in supported_dct_types: raise ValueError('DCT type not supported: {}'.format(dct_type)) self.sample_rate = sample_rate self.n_mfcc = n_mfcc self.dct_type = dct_type self.norm = norm self.top_db = 80.0 self.amplitude_to_DB = AmplitudeToDB('power', self.top_db) if melkwargs is not None: self.MelSpectrogram = MelSpectrogram(sample_rate=self.sample_rate, **melkwargs) else: self.MelSpectrogram = MelSpectrogram(sample_rate=self.sample_rate) if self.n_mfcc > self.MelSpectrogram.n_mels: raise ValueError('Cannot select more MFCC coefficients than # mel bins') dct_mat = F.create_dct(self.n_mfcc, self.MelSpectrogram.n_mels, self.norm) self.register_buffer('dct_mat', dct_mat) self.log_mels = log_mels def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: specgram_mel_db of size (..., ``n_mfcc``, time). """ # pack batch shape = waveform.size() waveform = waveform.reshape(-1, shape[-1]) mel_specgram = self.MelSpectrogram(waveform) if self.log_mels: log_offset = 1e-6 mel_specgram = torch.log(mel_specgram + log_offset) else: mel_specgram = self.amplitude_to_DB(mel_specgram) # (channel, n_mels, time).tranpose(...) dot (n_mels, n_mfcc) # -> (channel, time, n_mfcc).tranpose(...) mfcc = torch.matmul(mel_specgram.transpose(1, 2), self.dct_mat).transpose(1, 2) # unpack batch mfcc = mfcc.reshape(shape[:-1] + mfcc.shape[-2:]) return mfcc class MuLawEncoding(torch.nn.Module): r"""Encode signal based on mu-law companding. For more info see the `Wikipedia Entry `_ This algorithm assumes the signal has been scaled to between -1 and 1 and returns a signal encoded with values from 0 to quantization_channels - 1 Args: quantization_channels (int, optional): Number of channels. (Default: ``256``) """ __constants__ = ['quantization_channels'] def __init__(self, quantization_channels: int = 256) -> None: super(MuLawEncoding, self).__init__() self.quantization_channels = quantization_channels def forward(self, x: Tensor) -> Tensor: r""" Args: x (Tensor): A signal to be encoded. Returns: x_mu (Tensor): An encoded signal. """ return F.mu_law_encoding(x, self.quantization_channels) class MuLawDecoding(torch.nn.Module): r"""Decode mu-law encoded signal. For more info see the `Wikipedia Entry `_ This expects an input with values between 0 and quantization_channels - 1 and returns a signal scaled between -1 and 1. Args: quantization_channels (int, optional): Number of channels. (Default: ``256``) """ __constants__ = ['quantization_channels'] def __init__(self, quantization_channels: int = 256) -> None: super(MuLawDecoding, self).__init__() self.quantization_channels = quantization_channels def forward(self, x_mu: Tensor) -> Tensor: r""" Args: x_mu (Tensor): A mu-law encoded signal which needs to be decoded. Returns: Tensor: The signal decoded. """ return F.mu_law_decoding(x_mu, self.quantization_channels) class Resample(torch.nn.Module): r"""Resample a signal from one frequency to another. A resampling method can be given. Args: orig_freq (float, optional): The original frequency of the signal. (Default: ``16000``) new_freq (float, optional): The desired frequency. (Default: ``16000``) resampling_method (str, optional): The resampling method. (Default: ``'sinc_interpolation'``) """ def __init__(self, orig_freq: int = 16000, new_freq: int = 16000, resampling_method: str = 'sinc_interpolation') -> None: super(Resample, self).__init__() self.orig_freq = orig_freq self.new_freq = new_freq self.resampling_method = resampling_method def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Output signal of dimension (..., time). """ if self.resampling_method == 'sinc_interpolation': # pack batch shape = waveform.size() waveform = waveform.view(-1, shape[-1]) waveform = kaldi.resample_waveform(waveform, self.orig_freq, self.new_freq) # unpack batch waveform = waveform.view(shape[:-1] + waveform.shape[-1:]) return waveform raise ValueError('Invalid resampling method: {}'.format(self.resampling_method)) class ComplexNorm(torch.nn.Module): r"""Compute the norm of complex tensor input. Args: power (float, optional): Power of the norm. (Default: to ``1.0``) """ __constants__ = ['power'] def __init__(self, power: float = 1.0) -> None: super(ComplexNorm, self).__init__() self.power = power def forward(self, complex_tensor: Tensor) -> Tensor: r""" Args: complex_tensor (Tensor): Tensor shape of `(..., complex=2)`. Returns: Tensor: norm of the input tensor, shape of `(..., )`. """ return F.complex_norm(complex_tensor, self.power) class ComputeDeltas(torch.nn.Module): r"""Compute delta coefficients of a tensor, usually a spectrogram. See `torchaudio.functional.compute_deltas` for more details. Args: win_length (int): The window length used for computing delta. (Default: ``5``) mode (str): Mode parameter passed to padding. (Default: ``'replicate'``) """ __constants__ = ['win_length'] def __init__(self, win_length: int = 5, mode: str = "replicate") -> None: super(ComputeDeltas, self).__init__() self.win_length = win_length self.mode = mode def forward(self, specgram: Tensor) -> Tensor: r""" Args: specgram (Tensor): Tensor of audio of dimension (..., freq, time). Returns: Tensor: Tensor of deltas of dimension (..., freq, time). """ return F.compute_deltas(specgram, win_length=self.win_length, mode=self.mode) class TimeStretch(torch.nn.Module): r"""Stretch stft in time without modifying pitch for a given rate. Args: hop_length (int or None, optional): Length of hop between STFT windows. (Default: ``win_length // 2``) n_freq (int, optional): number of filter banks from stft. (Default: ``201``) fixed_rate (float or None, optional): rate to speed up or slow down by. If None is provided, rate must be passed to the forward method. (Default: ``None``) """ __constants__ = ['fixed_rate'] def __init__(self, hop_length: Optional[int] = None, n_freq: int = 201, fixed_rate: Optional[float] = None) -> None: super(TimeStretch, self).__init__() self.fixed_rate = fixed_rate n_fft = (n_freq - 1) * 2 hop_length = hop_length if hop_length is not None else n_fft // 2 self.register_buffer('phase_advance', torch.linspace(0, math.pi * hop_length, n_freq)[..., None]) def forward(self, complex_specgrams: Tensor, overriding_rate: Optional[float] = None) -> Tensor: r""" Args: complex_specgrams (Tensor): complex spectrogram (..., freq, time, complex=2). overriding_rate (float or None, optional): speed up to apply to this batch. If no rate is passed, use ``self.fixed_rate``. (Default: ``None``) Returns: Tensor: Stretched complex spectrogram of dimension (..., freq, ceil(time/rate), complex=2). """ assert complex_specgrams.size(-1) == 2, "complex_specgrams should be a complex tensor, shape (..., complex=2)" if overriding_rate is None: rate = self.fixed_rate if rate is None: raise ValueError("If no fixed_rate is specified" ", must pass a valid rate to the forward method.") else: rate = overriding_rate if rate == 1.0: return complex_specgrams return F.phase_vocoder(complex_specgrams, rate, self.phase_advance) class Fade(torch.nn.Module): r"""Add a fade in and/or fade out to an waveform. Args: fade_in_len (int, optional): Length of fade-in (time frames). (Default: ``0``) fade_out_len (int, optional): Length of fade-out (time frames). (Default: ``0``) fade_shape (str, optional): Shape of fade. Must be one of: "quarter_sine", "half_sine", "linear", "logarithmic", "exponential". (Default: ``"linear"``) """ def __init__(self, fade_in_len: int = 0, fade_out_len: int = 0, fade_shape: str = "linear") -> None: super(Fade, self).__init__() self.fade_in_len = fade_in_len self.fade_out_len = fade_out_len self.fade_shape = fade_shape def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Tensor of audio of dimension (..., time). """ waveform_length = waveform.size()[-1] device = waveform.device return self._fade_in(waveform_length).to(device) * \ self._fade_out(waveform_length).to(device) * waveform def _fade_in(self, waveform_length: int) -> Tensor: fade = torch.linspace(0, 1, self.fade_in_len) ones = torch.ones(waveform_length - self.fade_in_len) if self.fade_shape == "linear": fade = fade if self.fade_shape == "exponential": fade = torch.pow(2, (fade - 1)) * fade if self.fade_shape == "logarithmic": fade = torch.log10(.1 + fade) + 1 if self.fade_shape == "quarter_sine": fade = torch.sin(fade * math.pi / 2) if self.fade_shape == "half_sine": fade = torch.sin(fade * math.pi - math.pi / 2) / 2 + 0.5 return torch.cat((fade, ones)).clamp_(0, 1) def _fade_out(self, waveform_length: int) -> Tensor: fade = torch.linspace(0, 1, self.fade_out_len) ones = torch.ones(waveform_length - self.fade_out_len) if self.fade_shape == "linear": fade = - fade + 1 if self.fade_shape == "exponential": fade = torch.pow(2, - fade) * (1 - fade) if self.fade_shape == "logarithmic": fade = torch.log10(1.1 - fade) + 1 if self.fade_shape == "quarter_sine": fade = torch.sin(fade * math.pi / 2 + math.pi / 2) if self.fade_shape == "half_sine": fade = torch.sin(fade * math.pi + math.pi / 2) / 2 + 0.5 return torch.cat((ones, fade)).clamp_(0, 1) class _AxisMasking(torch.nn.Module): r"""Apply masking to a spectrogram. Args: mask_param (int): Maximum possible length of the mask. axis (int): What dimension the mask is applied on. iid_masks (bool): Applies iid masks to each of the examples in the batch dimension. This option is applicable only when the input tensor is 4D. """ __constants__ = ['mask_param', 'axis', 'iid_masks'] def __init__(self, mask_param: int, axis: int, iid_masks: bool) -> None: super(_AxisMasking, self).__init__() self.mask_param = mask_param self.axis = axis self.iid_masks = iid_masks def forward(self, specgram: Tensor, mask_value: float = 0.) -> Tensor: r""" Args: specgram (Tensor): Tensor of dimension (..., freq, time). mask_value (float): Value to assign to the masked columns. Returns: Tensor: Masked spectrogram of dimensions (..., freq, time). """ # if iid_masks flag marked and specgram has a batch dimension if self.iid_masks and specgram.dim() == 4: return F.mask_along_axis_iid(specgram, self.mask_param, mask_value, self.axis + 1) else: return F.mask_along_axis(specgram, self.mask_param, mask_value, self.axis) class FrequencyMasking(_AxisMasking): r"""Apply masking to a spectrogram in the frequency domain. Args: freq_mask_param (int): maximum possible length of the mask. Indices uniformly sampled from [0, freq_mask_param). iid_masks (bool, optional): whether to apply different masks to each example/channel in the batch. (Default: ``False``) This option is applicable only when the input tensor is 4D. """ def __init__(self, freq_mask_param: int, iid_masks: bool = False) -> None: super(FrequencyMasking, self).__init__(freq_mask_param, 1, iid_masks) class TimeMasking(_AxisMasking): r"""Apply masking to a spectrogram in the time domain. Args: time_mask_param (int): maximum possible length of the mask. Indices uniformly sampled from [0, time_mask_param). iid_masks (bool, optional): whether to apply different masks to each example/channel in the batch. (Default: ``False``) This option is applicable only when the input tensor is 4D. """ def __init__(self, time_mask_param: int, iid_masks: bool = False) -> None: super(TimeMasking, self).__init__(time_mask_param, 2, iid_masks) class Vol(torch.nn.Module): r"""Add a volume to an waveform. Args: gain (float): Interpreted according to the given gain_type: If ``gain_type`` = ``amplitude``, ``gain`` is a positive amplitude ratio. If ``gain_type`` = ``power``, ``gain`` is a power (voltage squared). If ``gain_type`` = ``db``, ``gain`` is in decibels. gain_type (str, optional): Type of gain. One of: ``amplitude``, ``power``, ``db`` (Default: ``amplitude``) """ def __init__(self, gain: float, gain_type: str = 'amplitude'): super(Vol, self).__init__() self.gain = gain self.gain_type = gain_type if gain_type in ['amplitude', 'power'] and gain < 0: raise ValueError("If gain_type = amplitude or power, gain must be positive.") def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Tensor of audio of dimension (..., time). """ if self.gain_type == "amplitude": waveform = waveform * self.gain if self.gain_type == "db": waveform = F.gain(waveform, self.gain) if self.gain_type == "power": waveform = F.gain(waveform, 10 * math.log10(self.gain)) return torch.clamp(waveform, -1, 1) class SlidingWindowCmn(torch.nn.Module): r""" Apply sliding-window cepstral mean (and optionally variance) normalization per utterance. Args: cmn_window (int, optional): Window in frames for running average CMN computation (int, default = 600) min_cmn_window (int, optional): Minimum CMN window used at start of decoding (adds latency only at start). Only applicable if center == false, ignored if center==true (int, default = 100) center (bool, optional): If true, use a window centered on the current frame (to the extent possible, modulo end effects). If false, window is to the left. (bool, default = false) norm_vars (bool, optional): If true, normalize variance to one. (bool, default = false) """ def __init__(self, cmn_window: int = 600, min_cmn_window: int = 100, center: bool = False, norm_vars: bool = False) -> None: super().__init__() self.cmn_window = cmn_window self.min_cmn_window = min_cmn_window self.center = center self.norm_vars = norm_vars def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension (..., time). Returns: Tensor: Tensor of audio of dimension (..., time). """ cmn_waveform = F.sliding_window_cmn( waveform, self.cmn_window, self.min_cmn_window, self.center, self.norm_vars) return cmn_waveform class Vad(torch.nn.Module): r"""Voice Activity Detector. Similar to SoX implementation. Attempts to trim silence and quiet background sounds from the ends of recordings of speech. The algorithm currently uses a simple cepstral power measurement to detect voice, so may be fooled by other things, especially music. The effect can trim only from the front of the audio, so in order to trim from the back, the reverse effect must also be used. Args: sample_rate (int): Sample rate of audio signal. trigger_level (float, optional): The measurement level used to trigger activity detection. This may need to be cahnged depending on the noise level, signal level, and other characteristics of the input audio. (Default: 7.0) trigger_time (float, optional): The time constant (in seconds) used to help ignore short bursts of sound. (Default: 0.25) search_time (float, optional): The amount of audio (in seconds) to search for quieter/shorter bursts of audio to include prior to the detected trigger point. (Default: 1.0) allowed_gap (float, optional): The allowed gap (in seconds) between quiteter/shorter bursts of audio to include prior to the detected trigger point. (Default: 0.25) pre_trigger_time (float, optional): The amount of audio (in seconds) to preserve before the trigger point and any found quieter/shorter bursts. (Default: 0.0) boot_time (float, optional) The algorithm (internally) uses adaptive noise estimation/reduction in order to detect the start of the wanted audio. This option sets the time for the initial noise estimate. (Default: 0.35) noise_up_time (float, optional) Time constant used by the adaptive noise estimator for when the noise level is increasing. (Default: 0.1) noise_down_time (float, optional) Time constant used by the adaptive noise estimator for when the noise level is decreasing. (Default: 0.01) noise_reduction_amount (float, optional) Amount of noise reduction to use in the detection algorithm (e.g. 0, 0.5, ...). (Default: 1.35) measure_freq (float, optional) Frequency of the algorithm’s processing/measurements. (Default: 20.0) measure_duration: (float, optional) Measurement duration. (Default: Twice the measurement period; i.e. with overlap.) measure_smooth_time (float, optional) Time constant used to smooth spectral measurements. (Default: 0.4) hp_filter_freq (float, optional) "Brick-wall" frequency of high-pass filter applied at the input to the detector algorithm. (Default: 50.0) lp_filter_freq (float, optional) "Brick-wall" frequency of low-pass filter applied at the input to the detector algorithm. (Default: 6000.0) hp_lifter_freq (float, optional) "Brick-wall" frequency of high-pass lifter used in the detector algorithm. (Default: 150.0) lp_lifter_freq (float, optional) "Brick-wall" frequency of low-pass lifter used in the detector algorithm. (Default: 2000.0) References: http://sox.sourceforge.net/sox.html """ def __init__(self, sample_rate: int, trigger_level: float = 7.0, trigger_time: float = 0.25, search_time: float = 1.0, allowed_gap: float = 0.25, pre_trigger_time: float = 0.0, boot_time: float = .35, noise_up_time: float = .1, noise_down_time: float = .01, noise_reduction_amount: float = 1.35, measure_freq: float = 20.0, measure_duration: Optional[float] = None, measure_smooth_time: float = .4, hp_filter_freq: float = 50., lp_filter_freq: float = 6000., hp_lifter_freq: float = 150., lp_lifter_freq: float = 2000.) -> None: super().__init__() self.sample_rate = sample_rate self.trigger_level = trigger_level self.trigger_time = trigger_time self.search_time = search_time self.allowed_gap = allowed_gap self.pre_trigger_time = pre_trigger_time self.boot_time = boot_time self.noise_up_time = noise_up_time self.noise_down_time = noise_up_time self.noise_reduction_amount = noise_reduction_amount self.measure_freq = measure_freq self.measure_duration = measure_duration self.measure_smooth_time = measure_smooth_time self.hp_filter_freq = hp_filter_freq self.lp_filter_freq = lp_filter_freq self.hp_lifter_freq = hp_lifter_freq self.lp_lifter_freq = lp_lifter_freq def forward(self, waveform: Tensor) -> Tensor: r""" Args: waveform (Tensor): Tensor of audio of dimension `(..., time)` """ return F.vad( waveform=waveform, sample_rate=self.sample_rate, trigger_level=self.trigger_level, trigger_time=self.trigger_time, search_time=self.search_time, allowed_gap=self.allowed_gap, pre_trigger_time=self.pre_trigger_time, boot_time=self.boot_time, noise_up_time=self.noise_up_time, noise_down_time=self.noise_up_time, noise_reduction_amount=self.noise_reduction_amount, measure_freq=self.measure_freq, measure_duration=self.measure_duration, measure_smooth_time=self.measure_smooth_time, hp_filter_freq=self.hp_filter_freq, lp_filter_freq=self.lp_filter_freq, hp_lifter_freq=self.hp_lifter_freq, lp_lifter_freq=self.lp_lifter_freq, ) audio-0.7.2/torchaudio/utils/000077500000000000000000000000001376444676100161445ustar00rootroot00000000000000audio-0.7.2/torchaudio/utils/__init__.py000066400000000000000000000002741376444676100202600ustar00rootroot00000000000000from . import ( sox_utils, ) from torchaudio._internal import module_utils as _mod_utils if _mod_utils.is_module_available('torchaudio._torchaudio'): sox_utils.set_verbosity(1) audio-0.7.2/torchaudio/utils/sox_utils.py000066400000000000000000000050131376444676100205460ustar00rootroot00000000000000from typing import List, Dict import torch from torchaudio._internal import ( module_utils as _mod_utils, ) @_mod_utils.requires_module('torchaudio._torchaudio') def set_seed(seed: int): """Set libsox's PRNG Args: seed (int): seed value. valid range is int32. See Also: http://sox.sourceforge.net/sox.html """ torch.ops.torchaudio.sox_utils_set_seed(seed) @_mod_utils.requires_module('torchaudio._torchaudio') def set_verbosity(verbosity: int): """Set libsox's verbosity Args: verbosity (int): Set verbosity level of libsox. 1: failure messages 2: warnings 3: details of processing 4-6: increasing levels of debug messages See Also: http://sox.sourceforge.net/sox.html """ torch.ops.torchaudio.sox_utils_set_verbosity(verbosity) @_mod_utils.requires_module('torchaudio._torchaudio') def set_buffer_size(buffer_size: int): """Set buffer size for sox effect chain Args: buffer_size (int): Set the size in bytes of the buffers used for processing audio. See Also: http://sox.sourceforge.net/sox.html """ torch.ops.torchaudio.sox_utils_set_buffer_size(buffer_size) @_mod_utils.requires_module('torchaudio._torchaudio') def set_use_threads(use_threads: bool): """Set multithread option for sox effect chain Args: use_threads (bool): When ``True``, enables ``libsox``'s parallel effects channels processing. To use mutlithread, the underlying ``libsox`` has to be compiled with OpenMP support. See Also: http://sox.sourceforge.net/sox.html """ torch.ops.torchaudio.sox_utils_set_use_threads(use_threads) @_mod_utils.requires_module('torchaudio._torchaudio') def list_effects() -> Dict[str, str]: """List the available sox effect names Returns: Dict[str, str]: Mapping from ``effect name`` to ``usage`` """ return dict(torch.ops.torchaudio.sox_utils_list_effects()) @_mod_utils.requires_module('torchaudio._torchaudio') def list_read_formats() -> List[str]: """List the supported audio formats for read Returns: List[str]: List of supported audio formats """ return torch.ops.torchaudio.sox_utils_list_read_formats() @_mod_utils.requires_module('torchaudio._torchaudio') def list_write_formats() -> List[str]: """List the supported audio formats for write Returns: List[str]: List of supported audio formats """ return torch.ops.torchaudio.sox_utils_list_write_formats() audio-0.7.2/tox.ini000066400000000000000000000002451376444676100141570ustar00rootroot00000000000000[flake8] max-line-length = 120 ignore = E305,E402,E721,E741,F401,F403,F405,F821,F841,F999 exclude = docs/src,venv,torch/lib/gloo,torch/lib/pybind11,torch/lib/nanopb