From 11c67ecd68aaa93ef570f24a29a0d983dac76b02 Mon Sep 17 00:00:00 2001 From: Auryn Macmillan Date: Thu, 16 May 2024 13:32:21 +1000 Subject: [PATCH] Initial commit --- .czrc | 3 + .editorconfig | 16 +++ .eslintignore | 22 ++++ .eslintrc.yml | 21 ++++ .github/FUNDING.yml | 2 + .github/scripts/rename.sh | 38 +++++++ .github/workflows/ci.yml | 55 ++++++++++ .github/workflows/create.yml | 52 +++++++++ .gitignore | 22 ++++ .prettierignore | 22 ++++ .prettierrc.yml | 23 ++++ .solcover.js | 4 + .solhint.json | 19 ++++ .solhintignore | 3 + .vscode/extensions.json | 3 + .vscode/settings.json | 7 ++ LICENSE.md | 16 +++ README.md | 206 +++++++++++++++++++++++++++++++++++ bun.lockb | Bin 0 -> 283884 bytes contracts/Lock.sol | 36 ++++++ deploy/deploy.ts | 24 ++++ hardhat.config.ts | 125 +++++++++++++++++++++ package.json | 79 ++++++++++++++ tasks/accounts.ts | 9 ++ tasks/lock.ts | 63 +++++++++++ test/lock/Lock.fixture.ts | 22 ++++ test/lock/Lock.ts | 102 +++++++++++++++++ test/types.ts | 17 +++ tsconfig.json | 22 ++++ 29 files changed, 1033 insertions(+) create mode 100644 .czrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.yml create mode 100644 .github/FUNDING.yml create mode 100755 .github/scripts/rename.sh create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/create.yml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.yml create mode 100644 .solcover.js create mode 100644 .solhint.json create mode 100644 .solhintignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 contracts/Lock.sol create mode 100644 deploy/deploy.ts create mode 100644 hardhat.config.ts create mode 100644 package.json create mode 100644 tasks/accounts.ts create mode 100644 tasks/lock.ts create mode 100644 test/lock/Lock.fixture.ts create mode 100644 test/lock/Lock.ts create mode 100644 test/types.ts create mode 100644 tsconfig.json diff --git a/.czrc b/.czrc new file mode 100644 index 00000000..d1bcc209 --- /dev/null +++ b/.czrc @@ -0,0 +1,3 @@ +{ + "path": "cz-conventional-changelog" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..6fd96c1e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# All files +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.sol] +indent_size = 4 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..a57b767a --- /dev/null +++ b/.eslintignore @@ -0,0 +1,22 @@ +# directories +.coverage_artifacts +.coverage_cache +.coverage_contracts +artifacts +build +cache +coverage +dist +node_modules +types + +# files +*.env +*.log +.DS_Store +.pnp.* +bun.lockb +coverage.json +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 00000000..27672a35 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,21 @@ +extends: + - "eslint:recommended" + - "plugin:@typescript-eslint/eslint-recommended" + - "plugin:@typescript-eslint/recommended" + - "prettier" +parser: "@typescript-eslint/parser" +parserOptions: + project: "tsconfig.json" +plugins: + - "@typescript-eslint" +root: true +rules: + "@typescript-eslint/no-floating-promises": + - error + - ignoreIIFE: true + ignoreVoid: true + "@typescript-eslint/no-inferrable-types": "off" + "@typescript-eslint/no-unused-vars": + - error + - argsIgnorePattern: "_" + varsIgnorePattern: "_" diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..b763d0f3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +custom: "https://omo.so/prberg" +github: "PaulRBerg" diff --git a/.github/scripts/rename.sh b/.github/scripts/rename.sh new file mode 100755 index 00000000..62e37dda --- /dev/null +++ b/.github/scripts/rename.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# https://gist.github.com/vncsna/64825d5609c146e80de8b1fd623011ca +set -euo pipefail + +# Define the input vars +GITHUB_REPOSITORY=${1?Error: Please pass username/repo, e.g. prb/foundry-template} +GITHUB_REPOSITORY_OWNER=${2?Error: Please pass username, e.g. prb} +GITHUB_REPOSITORY_DESCRIPTION=${3:-""} # If null then replace with empty string + +echo "GITHUB_REPOSITORY: $GITHUB_REPOSITORY" +echo "GITHUB_REPOSITORY_OWNER: $GITHUB_REPOSITORY_OWNER" +echo "GITHUB_REPOSITORY_DESCRIPTION: $GITHUB_REPOSITORY_DESCRIPTION" + +# jq is like sed for JSON data +JQ_OUTPUT=`jq \ + --arg NAME "@$GITHUB_REPOSITORY" \ + --arg AUTHOR_NAME "$GITHUB_REPOSITORY_OWNER" \ + --arg URL "https://github.com/$GITHUB_REPOSITORY_OWNER" \ + --arg DESCRIPTION "$GITHUB_REPOSITORY_DESCRIPTION" \ + '.name = $NAME | .description = $DESCRIPTION | .author |= ( .name = $AUTHOR_NAME | .url = $URL )' \ + package.json +` + +# Overwrite package.json +echo "$JQ_OUTPUT" > package.json + +# Make sed command compatible in both Mac and Linux environments +# Reference: https://stackoverflow.com/a/38595160/8696958 +sedi () { + sed --version >/dev/null 2>&1 && sed -i -- "$@" || sed -i "" "$@" +} + +# Rename instances of "PaulRBerg/foundry-template" to the new repo name in README.md for badges only +sedi "/gitpod/ s|PaulRBerg/foundry-template|"${GITHUB_REPOSITORY}"|;" "README.md" +sedi "/gitpod-badge/ s|PaulRBerg/foundry-template|"${GITHUB_REPOSITORY}"|;" "README.md" +sedi "/gha/ s|PaulRBerg/foundry-template|"${GITHUB_REPOSITORY}"|;" "README.md" +sedi "/gha-badge/ s|PaulRBerg/foundry-template|"${GITHUB_REPOSITORY}"|;" "README.md" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..ec79e636 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: "CI" + +env: + HARDHAT_VAR_MNEMONIC: "test test test test test test test test test test test junk" + HARDHAT_VAR_INFURA_API_KEY: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" + # Uncomment the following lines to set your configuration variables using + # GitHub secrets (https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions) + # + # HARDHAT_VAR_MNEMONIC: ${{ secrets.Mnemonic }} + # HARDHAT_VAR_INFURA_API_KEY: ${{ secrets.InfuraApiKey }} + # HARDHAT_VAR_ARBISCAN_API_KEY: ${{ secrets.ArbiscanApiKey }} + # HARDHAT_VAR_BSCSCAN_API_KEY: ${{ secrets.BscscanApiKey }} + # HARDHAT_VAR_ETHERSCAN_API_KEY: ${{ secrets.EtherscanApiKey }} + # HARDHAT_VAR_OPTIMISM_API_KEY: ${{ secrets.OptimismApiKey }} + # HARDHAT_VAR_POLYGONSCAN_API_KEY: ${{ secrets.PolygonscanApiKey }} + # HARDHAT_VAR_SNOWTRACE_API_KEY: ${{ secrets.SnowtraceApiKey }} + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +jobs: + ci: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + + - name: "Install Bun" + uses: "oven-sh/setup-bun@v1" + + - name: "Install the dependencies" + run: "bun install" + + - name: "Lint the code" + run: "bun run lint" + + - name: "Add lint summary" + run: | + echo "## Lint results" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + - name: "Compile the contracts and generate the TypeChain bindings" + run: "bun run typechain" + + - name: "Test the contracts and generate the coverage report" + run: "bun run coverage" + + - name: "Add test summary" + run: | + echo "## Test results" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/create.yml b/.github/workflows/create.yml new file mode 100644 index 00000000..e0e93696 --- /dev/null +++ b/.github/workflows/create.yml @@ -0,0 +1,52 @@ +name: "Create" + +# The workflow will run only when the "Use this template" button is used +on: + create: + +jobs: + create: + # We only run this action when the repository isn't the template repository. References: + # - https://docs.github.com/en/actions/learn-github-actions/contexts + # - https://docs.github.com/en/actions/learn-github-actions/expressions + if: ${{ !github.event.repository.is_template }} + permissions: "write-all" + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + + - name: "Update package.json" + env: + GITHUB_REPOSITORY_DESCRIPTION: ${{ github.event.repository.description }} + run: + ./.github/scripts/rename.sh "$GITHUB_REPOSITORY" "$GITHUB_REPOSITORY_OWNER" "$GITHUB_REPOSITORY_DESCRIPTION" + + - name: "Add rename summary" + run: | + echo "## Commit result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + - name: "Remove files not needed in the user's copy of the template" + run: | + rm -f "./.github/FUNDING.yml" + rm -f "./.github/scripts/rename.sh" + rm -f "./.github/workflows/create.yml" + + - name: "Add remove summary" + run: | + echo "## Remove result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + - name: "Update commit" + uses: "stefanzweifel/git-auto-commit-action@v4" + with: + commit_message: "feat: initial commit" + commit_options: "--amend" + push_options: "--force" + skip_fetch: true + + - name: "Add commit summary" + run: | + echo "## Commit result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c3995b0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# directories +.coverage_artifacts +.coverage_cache +.coverage_contracts +artifacts +build +cache +coverage +dist +node_modules +types +deployments + +# files +*.env +*.log +.DS_Store +.pnp.* +coverage.json +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..a57b767a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,22 @@ +# directories +.coverage_artifacts +.coverage_cache +.coverage_contracts +artifacts +build +cache +coverage +dist +node_modules +types + +# files +*.env +*.log +.DS_Store +.pnp.* +bun.lockb +coverage.json +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 00000000..3b6e0857 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,23 @@ +bracketSpacing: true +plugins: + - "@trivago/prettier-plugin-sort-imports" + - "prettier-plugin-solidity" +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" + +overrides: + - files: "*.sol" + options: + compiler: "0.8.17" + parser: "solidity-parse" + tabWidth: 4 + - files: "*.ts" + options: + importOrder: ["", "^[./]"] + importOrderParserPlugins: ["typescript"] + importOrderSeparation: true + importOrderSortSpecifiers: true + parser: "typescript" diff --git a/.solcover.js b/.solcover.js new file mode 100644 index 00000000..c61d16c7 --- /dev/null +++ b/.solcover.js @@ -0,0 +1,4 @@ +module.exports = { + istanbulReporter: ["html", "lcov"], + skipFiles: ["test"], +}; diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 00000000..122f1f69 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,19 @@ +{ + "extends": "solhint:recommended", + "plugins": ["prettier"], + "rules": { + "code-complexity": ["error", 8], + "compiler-version": ["error", ">=0.8.4"], + "func-visibility": ["error", { "ignoreConstructors": true }], + "max-line-length": ["error", 120], + "named-parameters-mapping": "warn", + "no-console": "off", + "not-rely-on-time": "off", + "prettier/prettier": [ + "error", + { + "endOfLine": "auto" + } + ] + } +} diff --git a/.solhintignore b/.solhintignore new file mode 100644 index 00000000..16dc0c0d --- /dev/null +++ b/.solhintignore @@ -0,0 +1,3 @@ +# directories +**/artifacts +**/node_modules diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..9a51b727 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "NomicFoundation.hardhat-solidity"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..b7be98ac --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "prettier.documentSelectors": ["**/*.sol"], + "solidity.formatter": "prettier", + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..88a2b87b --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,16 @@ +MIT License + +Copyright (c) 2023 Paul Razvan Berg + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..04dd3eac --- /dev/null +++ b/README.md @@ -0,0 +1,206 @@ +# Hardhat Template [![Open in Gitpod][gitpod-badge]][gitpod] [![Github Actions][gha-badge]][gha] [![Hardhat][hardhat-badge]][hardhat] [![License: MIT][license-badge]][license] + +[gitpod]: https://gitpod.io/#https://github.com/paulrberg/hardhat-template +[gitpod-badge]: https://img.shields.io/badge/Gitpod-Open%20in%20Gitpod-FFB45B?logo=gitpod +[gha]: https://github.com/paulrberg/hardhat-template/actions +[gha-badge]: https://github.com/paulrberg/hardhat-template/actions/workflows/ci.yml/badge.svg +[hardhat]: https://hardhat.org/ +[hardhat-badge]: https://img.shields.io/badge/Built%20with-Hardhat-FFDB1C.svg +[license]: https://opensource.org/licenses/MIT +[license-badge]: https://img.shields.io/badge/License-MIT-blue.svg + +A Hardhat-based template for developing Solidity smart contracts, with sensible defaults. + +- [Hardhat](https://github.com/nomiclabs/hardhat): compile, run and test smart contracts +- [TypeChain](https://github.com/ethereum-ts/TypeChain): generate TypeScript bindings for smart contracts +- [Ethers](https://github.com/ethers-io/ethers.js/): renowned Ethereum library and wallet implementation +- [Solhint](https://github.com/protofire/solhint): code linter +- [Solcover](https://github.com/sc-forks/solidity-coverage): code coverage +- [Prettier Plugin Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity): code formatter + +## Getting Started + +Click the [`Use this template`](https://github.com/paulrberg/hardhat-template/generate) button at the top of the page to +create a new repository with this repo as the initial state. + +## Features + +This template builds upon the frameworks and libraries mentioned above, so for details about their specific features, +please consult their respective documentations. + +For example, for Hardhat, you can refer to the [Hardhat Tutorial](https://hardhat.org/tutorial) and the +[Hardhat Docs](https://hardhat.org/docs). You might be in particular interested in reading the +[Testing Contracts](https://hardhat.org/tutorial/testing-contracts) section. + +### Sensible Defaults + +This template comes with sensible default configurations in the following files: + +```text +├── .editorconfig +├── .eslintignore +├── .eslintrc.yml +├── .gitignore +├── .prettierignore +├── .prettierrc.yml +├── .solcover.js +├── .solhint.json +└── hardhat.config.ts +``` + +### VSCode Integration + +This template is IDE agnostic, but for the best user experience, you may want to use it in VSCode alongside Nomic +Foundation's [Solidity extension](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity). + +### GitHub Actions + +This template comes with GitHub Actions pre-configured. Your contracts will be linted and tested on every push and pull +request made to the `main` branch. + +Note though that to make this work, you must use your `INFURA_API_KEY` and your `MNEMONIC` as GitHub secrets. + +For more information on how to set up GitHub secrets, check out the +[docs](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions). + +You can edit the CI script in [.github/workflows/ci.yml](./.github/workflows/ci.yml). + +## Usage + +### Pre Requisites + +First, you need to install the dependencies: + +```sh +bun install +``` + +Then, you need to set up all the required +[Hardhat Configuration Variables](https://hardhat.org/hardhat-runner/docs/guides/configuration-variables). You might +also want to install some that are optional. + +To assist with the setup process, run `bunx hardhat vars setup`. To set a particular value, such as a BIP-39 mnemonic +variable, execute this: + +```sh +bunx hardhat vars set MNEMONIC +? Enter value: ‣ here is where your twelve words mnemonic should be put my friend +``` + +If you do not already have a mnemonic, you can generate one using this [website](https://iancoleman.io/bip39/). + +### Compile + +Compile the smart contracts with Hardhat: + +```sh +bun run compile +``` + +### TypeChain + +Compile the smart contracts and generate TypeChain bindings: + +```sh +bun run typechain +``` + +### Test + +Run the tests with Hardhat: + +```sh +bun run test +``` + +### Lint Solidity + +Lint the Solidity code: + +```sh +bun run lint:sol +``` + +### Lint TypeScript + +Lint the TypeScript code: + +```sh +bun run lint:ts +``` + +### Coverage + +Generate the code coverage report: + +```sh +bun run coverage +``` + +### Report Gas + +See the gas usage per unit test and average gas per method call: + +```sh +REPORT_GAS=true bun run test +``` + +### Clean + +Delete the smart contract artifacts, the coverage reports and the Hardhat cache: + +```sh +bun run clean +``` + +### Deploy + +Deploy the contracts to Hardhat Network: + +```sh +bun run deploy:contracts +``` + +### Tasks + +#### Deploy Lock + +Deploy a new instance of the Lock contract via a task: + +```sh +bun run task:deployLock --unlock 100 --value 0.1 +``` + +### Syntax Highlighting + +If you use VSCode, you can get Solidity syntax highlighting with the +[hardhat-solidity](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) extension. + +## Using GitPod + +[GitPod](https://www.gitpod.io/) is an open-source developer platform for remote development. + +To view the coverage report generated by `bun run coverage`, just click `Go Live` from the status bar to turn the server +on/off. + +## Local development with Ganache + +### Install Ganache + +```sh +npm i -g ganache +``` + +### Run a Development Blockchain + +```sh +ganache -s test +``` + +> The `-s test` passes a seed to the local chain and makes it deterministic + +Make sure to set the mnemonic in your `.env` file to that of the instance running with Ganache. + +## License + +This project is licensed under MIT. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..484db9be8be5c65b3058f6652210c2142f72e18a GIT binary patch literal 283884 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 z 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 z zfjy?olwobHPDd}J?>c7-%GPysYHh#IP4{QbhF9bo?O{MPlEH2a5nF9&_c@%l^ zaC%nK%twPWB6|S|n!+&n2F<2aL#3AEc0;;Vga{3h1+7G(pP|eFUX-V-sKvKDK)fG7 z*Bxe{n<(qKY*w?p#jZC%=xy^b%fP{hhMg>Pawbc6`p*OSj%A-pd%pyEDRNNY@*~`5 z{H}VFN^p&{CMtS|1lEZOfo|_OR-IYdLSf|94{xNP0&NCC=EMy{xSDq^taQz5Y%5`$4nerzR!$zgLn_tLS5RhwmbA=}4rsQFnzPEnlwN1jofJwbB1Ldb1!+Pw{K` zZg%6ogzAO%b@svM2r;60a^Ts#&TkK<<6klXNx#~~C|4o2q;CSm<{)34 zwf@;c7o+mcDR5ptuG0y@C5MMbq;j%ETOi3IB_O4mL6$4$8b}TdeC!M6D zTRtLpEUwSvZr>{e&9v)%(K**Fqbc1FPnHl2r5sYdPm0Qx3g5+(+9fv>ecFn5=(ne@ z$W906Z{nbvPqGe!qkLd`WgWhLowpHUe;XPTT?Dsn)j~FiaA#m-MKx=mKSQ}(8Gvl4 z?T0oLsFc~}KlHRux3bmhmS_?S#47>1e70$YGteBEQ~rVIq3;f2D+3yY$qcPyvO+q) zDp<*TuhU?4+|sgFD)W;+7+C670uu@994Yc16)baEfTzB7;lo!?1-~> zLNexm#8bsEN==eURSnMNtT6ZUkyVd@W_=%D+WaT6DQEInM8Izbdh=2E{z9txGnX<9 znD>+d-FN1htn0x|4=dJB83czg+djq<#`(0!%_u>qE{i>Bvq?M;-(z~?J}&s;BbwZh zihF(&OJ&7ORz_cheW&jzX$izD4Z6RKb;l*R4ffsFs0}{gvdNx2vGZeAp%=XjeIPvZ zeVALhBQs6SpT7AJH3LP;$s$-eq&nkVJ1AFvJ+V}axM~l$A3=9B+q5x)y18?;5k|1i;+prJmArFmudz4Q3`fAW3*GcJ(>U1gsOZ^RT2$Ip8* z$0xEIA*ECds+I=mS)F@ih|zYEp7io{mSOX4@!HSUAM+yHlt_ds}9C>jt@Z$>EvlVw*>~p3|alP zFo-7;;hDpbQ)jCA;;3N`23&7Z0A07E8XUz89m-Df5V$-Z=7dXZy%iGsRv z@SLjb$gbr}*2urGuO9hF7XJA(86xzEu}pPDvUiNnbp-YgilEz6cK(Qdb+5tl`Kz_* z$gSWvvFM@CU0mkErY3Tl0(A+5;znDrwFtHkozfg+QP!>iFi0gnT>R z6owi1H$f2+diPl;nU~-wIDbB7}cwo{2BnO;01QoPOJm6${%X82R{ObB~{EGAgMq|DRpdFoX2ch-agQ z)g818lML?mcWi&ZYagh?AA$XY8t6h)=ol;SUu|Hh*M}oAXYTJr2Hkjcwn1Ipo>w== zQDyS`ECHQ{k}F-6cGMQ6FIlLOA@)j?OV;jrVJo_1HyV!9z+ zIty{JhAhyTARYVeZ)ke#F0@aWY)@V$|@A{P00JxfaE*<(`~*fJItJU;n{X${hl~o7Q*?Pf$V_z&bZ|#uO3Ng?22C=#n{9`X%(~<4LFb0 z23?y_Sdrpbl3a6MSG+99MsN5v5hn7jPuvR6BY99C>dnO7n09dWwiCpSGkp*LAPb|| z>`q@anJ;FslJY1SdI{zybwGDC^(Kbp{ZH&Kn?CjEC1s5nZGK|05Oo0oEKWgCtzt8S z1}5mAd|7OtKjuDu?9yUno@~1hF64P9s9g-RE(6aAw1Y0_MnMWw!ZMa)&9IAjF%NsZ zr+1l23UfKB2yaiW!855kk_a<2;ZjrcW@=`ksVgj|68;STcZK`&ghea+`GdbRSpT30 zx?x7xKmNJzQH>U^R99rLxlS0ec42WFn{02xoZ9xf;w!wYNu7Su{Ct_1nwHbwWetn4 z@>}cpKip9K&T|T@`r!CiA9VGE(`a&o9RxU%+p|XyBc`A zYb>PyJRO!$_9b>6tP?W?-LJo99rkV7g)cE`Vp`-fc@STR2*}pQ(j-JtN6#6gU65%e zZq~)Qq?Eb~V=U+4iO78T{JB=JqW$`fvaP(iQh<1kKsS`S6=8dLn;s*=tdNL}T?eZG zQs*PO)bM#QqtZ;=a7=L7H0)S&b;OaHAE{ICBt z2Hi$DXVZcqb8g}!z91+MWOL&UDT#9)MYY8WH2xK`VOZ6Jr;NY;4sn=k^^{kQ=7?M{ zmXUtFG_>EnVrO<;{lNag1a!peFcJxyLgtXPMZ%>y){f~LC?W;KYYMtYZGPe#D}0O=c;i9aZY{`* z;BoCzY$2qAs3PiH$(Q%wTom z^Ksm6Z7Ij5$?ua9z%>V5%mEXu5Fy3)q@}->eVK}{>HG(*t)wBZBW4ODTXVMSn)P0- zl^#m56+uQ3KcvHXh$Yb6sKd0?n;KS69 zY?tvVb%|6g`#~;9uiOz!!YrMs-af?TrnsC*lJb_=RYPah+Ffn&ZYsTn9EjHvboFhi zIc7v#f5pw(9j`GVVmguY;@c5#%FSh1AE*|qAC#34&Df6e&QM)19GG2HFFyzfKHTSJ zyXTr{eZKT>>;_yb(0!(THjzO{m8}px-ojD57KQep;u z^gG_XKke>*TTiC_U-;b?xdEYN)63SVS)H&Ag7J%k(!dpVdHCrZ-&Vl2`CqR8K)s;z zw{;%Z)d*BEtEl%PkrThL`yYDa^nJsInFw!5JwQ2MeP&xoSRvxoc0> zl<3gm@i%-nT7E@RfgfFViL6ssVW^Y_i1(jz%m4p_{)XYnqv|dNH{H(-BV_J*k7`sH z{>9~E!e>jnnTwiB>W=J&U5l=pP2JRdN%-r!aJYSSFG{8!+5_2Ub3@2vBEWS5-3es4 z@+Qp-4PP5%*Y?+JbJ5^<=AwY8X#vk!NS~?OgtL3xvo*mb^qtj+u>-xNpE)?jA8hbd z@rWmUkm<1$Z2{LAbYDfs28pI-mv*Gm^hEYfTjuVMV3=wqf|x`yY8(sRURPjJ!iW`f z7Z;Jg{6y@M7NLxCtMPhfS#g>Q--$e60M}zbgKlFb+7~P+k>yw|d8Y(n>zx)A-6Z^? z`XuV4kKqo_eg_{aS1nWs)ALn+olP(}i6Y3I^f$b_MN-nF2rV${qwNCXbpc%k1|o^k zUm@PB)hYWDJz6aPTqw;gwOm`>Ki|{6Ayc93YaBC@RNsW-@odu&bG{U4; zw65{w-h5vn;JSh?k*YwAq+gWJvE~_~r~ulGL(bGD?VChccBlEOb)Hzqit+3E)a5;) zPg<9u6Pf*Q30^m>`jRpD^3$zNCG?TOIx#oUwT9#oxo~5W@of$$Jwc-@7-HF`QoI%K zUm-Hair$63Po=!Gjwn;LlZ_8TZqBhU^Wpi32#O|9@Io#t%P2mT}Dq4Mt%_sbjKo8R%STRmx=Ue#&{)^Xi5ejaUj zyaC@$HeI8Pbi%*5LW{i_icAbKKluW z^v{g~fa?vqL4Q8K*H#?q&HBA4zf18;Xq+E;;t_W4&&YUx_HO3RQPWQHvh%~K1aFGw zK&OgDryhe$VDtEc`?o|gMRuz7ZNT*bT@nm^BkKlMHZAwAlt(85PV7DofWThdFbj%K@n~s=_7d!?qs+8TDcbWPs}ny5c@^Ou1%R`Gdsx zTYn&p#3=|3-(r{eb<~-LIahCPR+$8GZN>h}(Sk%^9NRLo>H=LA&Z9o-bvMQ@S_0f@W_&aMf+5Q5qKj@-Tz4ZxWfk-cW!;v76huj}ah#jl-LuV`Q?M@Z} zh1ejx+;L1x<-^V#7S)T-HW|h)zW3IBjn(n+NI}1}`@h5L|397#0Np#@9$eWTr=sX} zyTbD~-(18Mdy6h*;wm1f?-3=+#T1^4dX58Qv>w_wmM5PN&_dx^S{ zo_nrn^Cq>%yE($&nNP8C&ntC@HetofzJm)YBX$}+gRUnX&obcG2B!n`uSrsA=+J`6 zQAd?qzzqRi51UY2l=WI#Ta#DY-{P|)WKwheOG)I}4 zzs8C2{#za^f7$>>(C5jdCo91H0=kMT?aOS^f6jXsSXhnkR+p+2mh2c=m9?u3x&1e% zcB7k-R$E6C8s>a{;9aWQe7Y)F!x%|!i3r__4*W$>rvdh75uj_dK9A01uJyh`>L^-q zeRf?2PemrcVp%qLuq}9HCu5+*(74@6?EotF1lPr;4%b=J8v<`&LB(3m@Z^I_s{*(l z5DB`UXHi+JHpN2@(;yI{?6T?AW%>=5{u~&UUqGTXN4@Ax-r4FY<--d?9;>0=8oESd zy(7obE7CCg)*B;`(=pi(v_ll=@>Wdw3sPdyr0iZ`|2%1s%(ZTluBm0K7?s1Uiw`oN zyG%3SqxRFQFL}Jp`vR@9)!SMUI}RL|#DOjn z<=H{_cKHayDVL0i(`BhoYekyYZ*uL7hOa1fS?E|X`liHe*n;G!Q^xIAeUHVr>|aKS zk+&uoZJCVne+sw*@y3Jh^ltN*Wz0JUH{HrYQmRq1e6&xOO7Het_x`|cq}-#+P>o*+ z&IuWPM^^uSzHS>tivWj~zpMoPz_#E>7iWhLi@j@n(mR>=nF_S6_&*0P`!v|3TPPS0FugS5b#RJY7aSaIjCzo_1qk-zJi&2aGU(<7Unh(t2FH%q&}0~zbQVbTDYl>H zK5=7YI=miWkj)X(^;*uJz3~l}c>mP7P5!l+F09X%H48OKe3-jwu*(i;-xSdO=ZvIs zPaYmRuS+TyH)&{Et=8A!!cBPu7}JqT-`MBHciJ4^>7zA91ay+tKS>($S}b5aH9Vu% zYRH)RO2e}LyVv%=?^`P9u4Zxi3`|#9SXTTl{W!3UKZ4TrJEwj}EN9pMv8i^QssaH+ZZ@T1ehW{{OM}$hyfnX7Q%kHG zaak&+@^9=2N5r?son4;Ku6B}+oo6rN=JZCD$u8_`{Mo);-&iEEr<(||!RM9^x))vp zzcX!d5Epe};E6e{9lkw&Y(y|WS^WHG z1*0!DUid_o9h`4wfNnDhM;yBD%hLMs;6n0thhlu#cavSJx^9&uPr(HG5d2{)tZ7NU zY)X1KISH4-_o2V zq)IXBZ|P%ajQtVvQ)NJrXv>xFUmlETH?EKs-5e;J!-_jHHLp`QA`e~z+$_+QErpN^ zUg*-hA=lIAKABI9M~x8)a`TYig;9akJy1HeX!pFU$tr(*^QV!rpwLOY1TJ!aG^+?1QrDzoYWh-#y7B;h+0zM7JJD;Ofh$ z{f(s$K9no1YeNlV2<6nXzZKhy(nLa&0piU8-Qao7(9+B?znG8ojt&v0a7JPOY`a#c znLZxs84Mw6UH0^4bZCk8A@RXz@)#J_wMit2oRV-QoD|*~4{%{8Uk2P<(7mczz<`3+ z4f1IiS`cC;otx7WgVlF{6tBST(oUzL;Msq58AL@?fREB7MC0ZkQ=Cj?ha=tU+PxLZ z`Z1HB0QNh1pc~v|UNY?b0P&bXBEZ8e-$Ry27tWnX-faf0wrJzIh9uPKz4^(l_piYt z?hhIxl}yc@==Ln1ZiJ2Qs)mlwj9~sZA9VA5E1MyedR`}Mgs9H_e*P|XLWcUm0O9@2 zB$tbpEjPWslM`4^j$QZqQM4P=j-%otf2OD%j<~^0X|Z}>vwcEUi%%EB(2rWA74dP+Mn7$(K*Y6RoH4?_sua%e{7SuTZM~T*Km_v+NC5; zaW5KNcPa$kJVQTKd_(PFv;-uY3kzt%w#oN;`cXF(QOkZ7(NmmJOx*J*#n;;N|0> zu^%#Y<@d^vF&7*kEn#B8eE|E1QqbM|gguhvbI|CYB%m$-uCS~N0!uz&I#8D7xfQbc zgi#5q-`(i#9S6Sb+egM{<%@##wd;#RrRMum%fzpFtkcjyJCuR0q_pCP?E0F#Zei5h zuRkp&mr&p6K5V-ik>{+O$9OFn&+k!l&7C^RbQaasJP_; z=bPoAt0S{mIupNDyh&ru&eM|EY-YS55$cb~ectlyH0k-W_<(X$hg+d17DxESi6J!a z&}8-DpOeOx9fKogO4#3iCI#ZH0Nnt#%*zrv{}7vTncy$ra5fx0>q>ViwnGnCit-C&-p5_E}dYx92nR3-g-G^XaA z44BIcTP>4^UjHpWvs4ek25-?R9Y{<+^nr{>4^uEXgFqG%ClA?PMNondgD zp$c@(;n#+IRps`=M%cU^c@-}4+Znf0Q8!&gzZ?ZirmPUG=44 z5#j2AIxi*b#}R3@=74wrw25v}qyf5g-t}@Me=o6RB);dO!SSK}yAr9$_g+yKz;pWs zx;7AHSxL!ou96%dYB!d@T9%@9!Hk7*n`T7REjxteR~B3bZyCdkn4ORXyDuVc{r0Pf zYq1o7LMX&%xy^!F&;i`2z8u0?Jyv%y*Tmb@MJmq! zL$PGF8}-;@+f36+dJYDczDP4Pi5Ul>ElDcID;#iZL6_3tsujkqjkD!Tze+?L8_GQK zgO8nx#|G0nf#Z_n-3S6x+nI!3;I*u+xLC+J{h$VHacE9Fr(+44Cl(DxtvBG-fo_x{ zF@!Yy3M%{Wwg~d?iEbyT@Oi(iDPtEkx~nnf`nX``}m(*&lsUlmH*N9^S01dEz3Hl>O5=Su_Uv{-iYfZERa|kHlXWfRkxiDb~x0YFZ{$@llBf)IjRd!No} zpe+@)9x{oF8{jsAt|ifWY-e%HmRE}`;~pu)`RUu2;KH&Pv8Cd9U3?9eV01oQq}iqu zPHn+Wj{Tr&eWVpjeS(*J`l=K0ZcKvzyM*=M__qmkw@8j?s5daLgO&5JiWx{Ist)#v zJG4H~Z~WQO>Gr0uNxpcoXw!!R2STo4QYXEzE>l77%YU=yncx z$p$6AyBQp)C5rs;Pl1lZbd=wBqZGAWzSDVP?+4ybyvKjbqhhfmA{lGY_J(WLMIEOc zXTr+5NDBB=5FY`z1#|^s<^2MR*xeVfUI?Px^MFL}lRNV^U z@Rrx22q}4=a<@gN5F`~m zI>p3#Y9HIkP7s=9H6wb?|&%ia7gH47QSRufz|Z3A6t_C)E) zY6~2%(DKSj{XrF^f%96qBQC3yH@79qBF7*@B zHfbE{0Lwci$m`u+=;|}0c+sbBe^97hab&2;C6uSsu`gyk3h<{hsvJaBwP~j9W478Pa})N z;jFS^^X++}W<6t}Ls*1OuzbgH@&3Da70Rx?2li5?;z>1sB=3`L0Jjr#!{+!k{Gvj< zHl(&mlU0dVrmD zz0lI9p{3g!>zYa#Vb?^o`dLmQ51W8O@&IvNv$WexWuRayS^UTQE|PA^Blqsl$^ji^iEpDwus5 zmahlgUeH}%qCzBPB^!61^UI%)85dDJLld^X3cB!D3faW1_ufTKfhSJxdg-eelzP?= z%L%Vw^!CMS&3U5c=Y^If$4 zl_R@4iG|&LGPTc72ABf5NIJyK`^e$au&&Czy_oB><26i@=2<46D2P*BD-GBzL<@{k zz#RZxlhEhMieA43GS=-|j7$}2aecK)|12rvX!Z<8!`Hi7gcvL#(J6EVWmpKT2#z_Q zW>8B+|5z_3$22ArOgX`KhY*e+9 zbg!~v*Pk}GzUu#GSVv3ZW5p(YHniYrHw?{`p*!ja>!XH1*P>0XPp?|u+cTz+i03s% zbSY^;H=2HtW92yFM-ivYOGmT|0v(E8MBN2m2Fo?Wve16OX9MW8+E{CS!cxD=4j|rP z(2ZF&mpEIM9BTP_j6>QzX62(%jz;w(l*kd9JFw#X3tdEX=@Rd?9KYOGpA~)7s#W}= z`RNz=siw97=m*F02(WHt1axZ&8xm4c?#NF~&}2GG=e$T{CgNH6T@pupr4-NJSPJwW zc&Xxlkq)_Hk6k#URTwoCptd^j4DI_K%c#_x)gu7JI|{mIbxC84cVc>3ccV)4EL2Qu zxJ!x>r)(rT>J3IK0y_G}QEEBwsB^+ahJ5a#malQ?t8VItvgoD^s_3Jr?$^QnS!1Bv z5#_BUsP@N_Z^@q_q)nFZPPpwH>O1pJlCHR#``bsPY$rN-Ogji)itLt`ukq+QA)OK? z4S(_#_GvXF8XnqlfOyA2mt#suX!-6F=QdgTpQL6}?7TN}ztKfJ7DGQlLfu&Ky|Q*9 zR9D2|-UK(NW3kE-E2qRTR&rN3$fBgQW$-huw*u}2==yub-G;E;3I>GWc9ATI-svHx z<%z;8ZXq3xa=^mw5wh@qm!%UFB%YKqTzhsj{_u!zg+xw@Tvn|y!41jbvkkbDpvyTi zte6!(aj)vzyj5=T=0gTQazWje_Tk%){^O)LGu-^KXymO$wZxUwKZyIzr}!D^y6-%p zsAq8to<5ooMZp2?6zI}jt8RM*uygA%mlGWFx<^@Qc_?k^P1lh5*K)s0XH|1`(dmp> zSieyj<>>n|B;G=w*&q^M+f8XkRLTo*r$N`L_L=kzJkihR7LSIz0`*#ayVIUg zYlWKUvw*m+)p*=ui`L)Fu73=xY%O4$j`7NQL<4G9%`NRSATp2^p4`Ci+YIR5kDkgV zQD75j|Kx%6`qHN_8fWmYm!?QS*CRXu%i5I|yMl7Jq}9Q_NW zZf=ycyHcMn`u&Y#2@%Bw_{`r?NnPNQMAZVR9F6?^1BLK->?RxC z``2LXJbNnp{NC0gyd`p$)-!+lJ_3sh_P=wWy942qUCr;ikF6p0<&coa`^N*vuU}E| zRLno--F}@Mwl$$I&yI|os^!pokC2+8ejl1;@`z4b(%7^|Vw~LOpatTc2i?Nwoj3tI z{XE_q{PdQL5mPpYi#aHKnwO&wsa9L&B&hF9v>M7c{SN%2qIIVYh=;gK;^E92oTNVf z!HF=F&C3Sd1<+MObtQy}4N+!oawea!&*a?`Dn^D(*mb1i6^wxCpsO-#HmnQ|{gj<8 z#C)1Ix2Mo((e_iqA-M8pGP;`;S`_Sm7eTi|DE9)YTf*s>UE0RF_@{%zDz94d*5in% zs`eA7$qd3C$3(^Qalxcijrs`Mex0B0$9R(b^Qc4K=}Guj{baB%a|v`iXS?pgiU#|~ zLr;aAnhvFo**+YzJD-r1YmHRe2Q^P`VOc(0Tcg8#j{VhZ)n)xiH6y?_oKs{>*Lj`z z7XG#!XosJmYt%P=SxwOsDrm?35hZz-jj5*wpMKHoY+ue$ZH_#R>wZ%!;TP%5%X7o7;D~AS@dG`?&inmrPdDS>a~{B50o|~*;!Dm_n$FQD z@lYEboMmCpWTngIPhv%rr?5=nZN?MKo+)u(Cm8Ibclq8ZJ)6N5I_WasMV?d1_Ax62 zW`lL{tDu|CBVw=n8$w@y>&&u}e&Rk$7V<0H`c!}H=fh9G1 z=WWQI3Q{T0EgqdWev>7VFQ=YBylbGlD;GXcub1jjIpMwBqD^o7MW>MvgGv=sui}a@ ztG#77yvv{#sdl;qZtyrrjeq$Vqq-2U_JJ%H(kbivCc*{S@2rDvAxqHFTcrnhO?yC!qI2@L_sjpY#A`_aq5khefKU;ET5_xfLk2DKPVY)%u+)MD%>=3I z$CPS9ZV3Ysbwxi=m|a4kjp#5RpOuVl$K=(;@)6E4*n)ZREzq5*me~1p_Z+XyTMnO% zJkTlX_5htIV*C2dIONy9n2Gr12YaI}E4p~IT=tl`6K}$-V?9b`nC&A`O{SVtJi7h;g72(7mII-C6wMy; zBK<77(IY2gM3MFrDMUmPWO_dt&Lcf?(~Omub^VZ^uA zsb-<>2Dg9UxwiyrBRGZvba54Z6=C?btJW4sEFELPx{6)U9p=Ian4`C@+#e*v<^N)Q zJ(XsG6OLGfFwrT0{UsirWkdXI8KTwr+r4`F>zTf^MUTuaf8hMp)c!F^9T&%Y5+L4R zplfA!Ka$7?)ActmT|2w)?a%LJ=ChjeMB=ia&M`eKCFxjHt#F77WN^d-Q5?p_ zl|nt^G091~WK5!#3gH3wH|S2urBIx~ptN3iGUI1#K*z?fQ(3VsYT)yCYwhy{3 z%2srE_iVV)&`GLa27QYZA43F{{+wRS@hXOdEn(=~<7+wDS&Xr}ZtLS{ znQne#UqWF+@)3yl7<9clI)1UmY7F?Sd@$`(E^OL@g8K9G-C$wrL>AsW?D9$32iYwZ z?3XMyHZQ$xGV|5i&v!Q>YZT?44N+X!k!kvXdjh(Pc7&wrdZ#-Yqjw#$;ubAdsPafNvl3S59fHNdJ7S0d!p`_;CsO}I3+*8nfC~zM7 zYE0MIo}RJRi#IMlK!%#Ayg>5q`#n3^SIxTuW6vJTewcwap}}I}7q1soO!bU3kMi?z z?AbdiK}4%-z&!)qzxQzlVmpw*;w%bQlBA&Xzi)B~NL0%#*$mv2 zy!r;k$4&$dJHtD~xjOB8b@emY>^Ce0060zsyYjU+1!3fo@V2_N&Hmk$nk_h*U%8go=$YG}Wzkig~6j z@|P{%f3{DlPbX{lnq37-E5R=;aYN(Q9)VfBvj5<_50MUxRM^px3><(nPPj zkSgQj#H7mW0g+BR(N`ao6UoCpPjM4y$)Kas0DA%+DaOFazoqy3+Gw45DrrbvS!U52 zd0S{eJKTV-4QXVj!(j+nEuSR1G=;zl>4o#A5Jto-21LSut=QRJ>sJrb@7f-|$x6^S z@_`5lk-z=(e@ax@PU~k8MqIRm=NtV2-E&&!xI>y+i1M*%6|_IlOF@P@3U|XGk4xSblqkkY5pkCp^_vBeReBdC4Oi~gPh1Xgex?{t~Z85&n zCIj@yj6sPG9URQdfbau)${u{<64& zx{A5)MZ10B6S$1!x^opW(@$W2{V(WF3G&H~xfJq2>GgEBG&LS`2gxn0(FBi}rnQF< z4D3*gGTHFJIVk<8IfDJ?niM7lR935)al&7Tdqh;@C0uEfz;n9?T?ELxdX0{Q=5iw1 z1Ql}_Ay|HvH6KK`ZwWO!+g9#Qx2?xk`VCUeY7?r0u8*^+do}8b4rOEIT=W+2Z_U_5 z0s!{`bgg=_?Lu-(&GJ1m;4?2Fp)t0f0-k8N`L;sRZ@3s?4cniQe{9`;Wbmo?cxTPd z=GoYUl1R0F-p4a!oKh>(39c7Dg094@nx7{0`T#o}1)V73n>K~e59ewwK?*ZXX|{i* zxFh(i)8HGa*YfC9|1`1kr9d{u-NsSyeQe*_qN=HNm;&c-PoQfOoc>5}W6aE<6)cN`66dEylPr69>Y>Q0eMT-b+iFPHp9MEF`uBAQ@b z+cW5P?BRvNcA~05((|5&id;Gjtqkg1sQB1=un@k<;XRROVfb0LT%SPa@e>7;;{HoO zWwldPPrj(4vA#AhE)N~v$v9T!E@y;idqw5HCPA(+dOpW!=4#mV=hPy{mbv~jGM&Ie8DM78)v;5ZfH z%|F5azaO+vx5=Ai)m-MsGk@&%25qqkfYQ zFHtM&^5es<^Z{|LTxe^lHyyrTP$`;?!SYFm3dyirDq4wZu*>-`w8gJvHc+$9=DR1j z>teD*K)g_(n?N~NmlAJ$Km4W{`mX)nNZsJMdqEh&X1!!U;#~=5d(QXz_d#b&F(=6{ z!>m>}0=*h{>%|U1+;y26tTeTU=oZ zR{5052Ra8^%U--v7YXtZFO3sl#P1s@@}?Y>$tl8AM?>>Kyl|lFTf_IT`sa;2mO!;C zKl7n^9h>c(-In9GQ_|}`>K)#6X46{2m_gI`n5RgtwxMaOp4~JMra`M>6b!6g6`gIj zfC~@0Y|^5Y0zDXs=R;Wh^FuBUDn9Qjih{i4ol#~SX_}tWmFxw< z{yQgma#J(d#t!p!2^Reh9dHpqH#(ApVN%T6!R>ryJ>K@{-PifTubI({<_O(G9#1Wr z*Q+oCauHO@cg<8#OuW`*?Qqp*ghp@N{k*Uh`K<3QlmQnJbYC?oO&$v_7f8+BOlc&lHiWGWW#=O%9t{9})v z-kGzVUC&zRNUb$EK0^cDI;Lr@n0lqrmcv>MoZGxc+i@3@>O$O^d+PcnRT{fH{zix7 zc&Yb^i;K%rxxTE)%JoI{_z8W&5G()O?b9I-&X3VSH?k&2U4?JQ1x+4@?q{WVu!UQT z!Wf2@DmCKU?XSbcnPh`n_!(0dWRuu=9GFQC!yPL0(D^?O=$3P`>AIRtoq*?t0lK+~ z0{f|>4yIK;z2sOr*i{fx@0rnl_+SqmhHE`fJIVwSf62-DpifLg;Xo)lV}!3C<)cek z-|e~cOGOuxoQxPkBZepvf@U(}j{0V`(UQ#|#+hdt0ywuH(?{#4maIry`VhYnJ zIqQ!{8Zj2nt2=KE&t{PHHZx^o%J!Gg?GTB2rGq{G5rIr=mvUq`ool8ArB|&qZaka) zy2@~ZGx8%Xz{LSw+l}WdNCOf7Z&AoI=X8VG1f^B$Ws)NARd{}HC0cAL!Vcl={;(Uc zuZ1Iv{(b$|rbiCWgUTT)go&5^FN@4VE8yaSu3T@hiZi2k$)-d4VpoH|Q^EgX?@i#j z`u6>Qg+dt;nWtn9A)+D~5@pU9GSBmru}n$IkR(GPLYa#O8IoD1GFL)M#!@mA#qYho z-|hd~_x$ep|IR)4ckaFC-p_t`w$^^_wO(uO_g;JNwfE;kk~2LQ!+vqQJ@hkHNvtlX z@rD2D(lVdbFxm)yIcav&kG;<|r_+oNefS~ieymksH_n$4@9TCrrEl(Veb2+F?$d%^ zIn@y}hF`}&WIuFvA%5q{_iWB3e&t)?2)DM<*e(OpLz2fXOpz8%`5{E=sJ z`uU*inpWzYunxz8tFAtsP5Ae;%y?gt2M07vbx(WE-Kgdn5qxY_y!&UN!1I7Y#$CG- z)UG`89SAEUUgcjcrY}!;PuwhSY~hi;!__`CUv2+$iv2BP&ba=v;CB)icrR`TE2aI zK*e@D&X*PMJ2!W07mG=A@Xz5<A^NtUSK*H(YCLI zMdS5{3yj|7w~bETczo^13)Wu&DlGW>CL7*2OD6q*+O1V#?lLjq+p&jB6o(6LxbIUX zOXMz|qB`@z=uAR8!;=ETVn%+Ago&1mThmQ z!|9ke-j<;Uq;?(DIj~Z3;#L8JCTZnjxSbAt7iGx>zzY^wD02yYJ~XZ@-)JAWvWug|)#_YTSE;LjJ=g zVbXV7iDk*2hddBVa;m;|sn^BvX%_vPh^b+7oG&NdH+k>Tr00#6911^t9HNfh3~(c* zVQM!cl?@k>NPbzP>dv&EWAW0U!0&<_x^&VI{z}Gg^e(^h!Zm%FvzD$oe!~BLEEnGQ z#eBG99E8h#>~L}5#`}Kz(UDMQvtO{!YpLW% z%33pX289&!me6U6+V9g&-XqG}8?F}ou+AViHC1?*dF=Ixne*4>_}nRVW`De(S*ZCWB$2__X{e z2eo|FFj@WZWf~VDbz<3$rtg?u#BAP%RN=nNVPtT7Q3ci?;r|>dPkgrJ89StPO0Judu(|b=Sb#osTO&{3h+^ zX%CIxOwVw>e0bka`P_Zz}K*c0F8tUN~pp-1bwVQ*|eQGw{xv_mX}|Og#Qh!SbsU3)QSCBd)&!c;6eI zbx+K$gh;rb6u;vW8WFvV`*Eta?0wD;`Ja;@lbAHjq~vVju^R3UE7sL|Ik_)Q z-YVzFs8B?Xa7cS=>HCi{J>=qfhnLDTpI7dY5{kt2R|xOB&HrWNH=~AAdYP$P__GeT zc~Q~E_%8Iy?IPJfzc>9yt8{z65!2vEnMRu4!L{vlImE^BueDjlk3aK}k9*HofS>Q| z#rx_<=Esz(3i1?%U%Bd@sr7~G>rIC?1FyrGm3^m)?+h**T4guTPwwbnE;D5luFreT zc*f+u{v9sH8Q#5*sy~L((W#=&o{RnTVq8V~$nmI%i<7nYG+F6smg`z<|{6mzfW^owyT5*-5h?U6Ze68-xc=d zqY7iXA$Af+ePTbxe~x>*`PO|(w@{q#KD=+ywT{DgIxTdSXl@%9XisYpms%fr@;kKq z)6}*Oq6fLh*A5;N`y#ZEOzo4H;&6B=sH&-WC~QkyB2Qh_xq1Es{PTqv-j|fCKV*MM zRDn!)%+FcS^r+*13N~Ip`Igc0wnUjlu(-RHel$eJK+wjw!tpeRe_1 zlok?d>F@E^Uva#zYtDkHSim`-?xWAi2QNP;sqxgiCw?WQF8?XH;?l)nJ{yUe1KTL> zUUsNAZ*OC=VXcsiJS|GJ`FphKfw5=#|KjfgO5lAN6rw`J&$Kzzj!0}vv50PbzGR~< zOn$wYttY3dsNNU+*4{`-CV@xH%Q zh$S`~UGxtjiHV7@YnHZ3mr2-p?XV1+(<%;QoUat#_wD`XVYD8xye_-d2R(nT zj~#2h_S@BVO!?f0hV;(M_9v#QT+VdU4Lh}3COs8-5ofE{5ot6)Vpo4T(;h_q3^6Q>no;S1pE^_?`X;B{E;wF<#YsU`No=@AF z7$eAXUF3L%%C5-#Gi7U<^0@v=<9+9E5$R|!NK2Cil4NzCA;~=?x5KDEs<0ietwcolJ z%tb$yGmaW#IJ8z)Prc9Gq{ARCSWR(H6~C}7*JC3;DYO`Z>gS9v997~VVA6*^GG)mA9FFJi|VJ>-SzS)VUP?M&pi%$*9;tKe7nNaP&@u9zr#RC651v$KLnv427t6Uo89bp=w3znTbBU}yN zpLtvN{^FZRiw`!;#q^XuJbc1M7oB)W`VKQ^kaQX|T2H1~r+*%wAS*nTeG1p#BY0nH zDLLn#6&?ED64K`;WpM)bMiH7sQ$HXs+#v~#oXcC3Ww)Q z-F>=Pl0!W+jPsSp`<5uA7hZcUOC;Ab1|=S_tFfXAT(9tWL*k3; zuL9oJZcq5^!0*1S=dV~#jNUHbcQ?3kpRG)*Hd)2wwtlIZXZ>f+_jd+`pM*)-lXHG9 zet9Css$n5z;HjV9tGs>w2gGo`ig;g{$!h6y!pGPc@2NL6(XTG{97!WJuYRQJz-@d? zGwlHr_bU;TptGD7_k{cyXE?SLndE-|5l!Y3_O0-4?qEy*E1a(q-Z#@>f0(@;O~Ml^ z0lCcBhTy<$PCReQdE(ge=X={sQc8E9Q)AH_*uE@O#PY+4|1!Ib`u2Md_9?DDNZ{-U(_*m zCHmoGY8qQ{)O;;{%SWb5_Fvf492s!F$MC*i=}K6Pwxo3owIuA6Z_;^cG(JTd6q~uF zXw2CwO|w$Rv3sHWAn%cDuDhB$E*-mGY9mi-u#>S!s$}3a{_|rMysw{!vvzRye5IFGjVWz95@)HTT5T(8CxbiXU&Uu-{>mLF4^vScK6-6>p0&Ncwf=|BRjPE~P${nF}9V)zut%_r6L`v7RunZt>lpAmYKde4|qy=X(xWC1d>G z$x+Aq_R%xxlknV0j5CUCR7)xLEw*EeG0jvE{XV#<+;s04=|e`-8(CE*#A^!@Y13aG z%)KhkjTmS3U=h4V=Dv3~&1+nLHSoTS{ds13PH%23yq%#w5W{fbdDG7iZzS8=yNhkD z83JbN)1Ft0Q(w)}ex$K$JKy}#D^^(tQij6$q|s4OLtpUSw=)4qrvmx#r8x_cNIk@8f%YqHBsCtO2|(M{B!IGs;)7%I#oS94IOoYq`T)IeF!I9vkwDx^ZuzP&vpy2$A zdp4HW@`)BxcudNUA2iM!HGNPdds6Sths_0j&j*I>st(x;wNh7RUc>cQ2k-md_tM+_ zY}@v0SWB1e&>@ynp~j7F1Njzc10n`~H|y^&HuEelF(>tFl*=$=6D52f=bylkcLB>C31El*Flh#lzoN z|9J88bz)@#X*%oPTxFB!cE&IDE<{D}-$@GL`g;oRdn#}bQSSC{4BhlW?15?i9%cTr zH}d-&-%scHyPnK4xwxXem2!r<_SJa%Qccmfkx28&bJ@8TQL1mh*LD1k44bc{yqNlZRHnjYnW; zNRNii;E9KZMck-~4z9oYc;8^>7@tq2O!q3gCA;-?a(?nq>ea2pMa~*q-ZLS)bm~h^1wjg&a{V7|LMSCcoz9J4u^6Dt`ISb!Oq4iQlJI8A&2PFtdu5 zF_SO%=J}3Xe>}d{{6du(-(MrV?^JglTgvJ=>M?nezMTgjXw61k>YwOItu&|1RUA}! zStS1W#WS*-}VkCNpFsvU-UI?@%+JQYO+Wr;MK}&O(9i79+=|NSJ^@`biv`* zZ(JNs<9+4K$A)JqK6$vBu@6wn=-mRH#`&7yeZ$gJB+0lqUk|M8FYxpcwG5} zLYAj?(o*Tnc{uN2l;%g3NA(D zj<*ilU$b!3>DZo~&#*mw>&i^8rctTgZsz&8vIgJA&@hL#j1jr$zOeAFGg84L8CGZc zhOY_Yzb|Ko_e~fN3bONCf1W)@E>ct}qSN|tJJ-_#$rMZ%-QWG}XIXp6topvq#D!Jv zqpN(9{8pAtm&*3;o+ewqb;85&)^lqCTpZ5eeMxN=RBg=n{u-=3!=ouC-Z#m8L4y|vokm*dQ!&;C?=xjXL^ zd;V@^ma^;1+Bjbeyf4de#jf0((xC#myCjSs0&iaN3H*MYrZ+Q6L83+E@r9i2PruvM zMv+}M~|Wp0>1I=_Ik(+(2%Xzmk!kIMT&N)7!`HJ$YZL_DrD7?F-d1Q^isqPEz>y_Evb` z+ZTBX2Y1+a>6FrM(tGqvBD2Tfk&3c-aoF_m?NC0CSd*EnohhtyYI_<+L=-Ht2lr4n z>8rgrQ6qiXG3eCOj{knDHQx6owE_EU`KuRO8)M&k%n`c}4-3&Jkvq_>YF}L(Nt|rz z$oWN+*U<81CAO4hyL-USF>}{9C+`VHM5mJ}wSUMT$Hl=0?<>iZ^Kplkq2gG-+|C%? zmp-3AG7{(zq+B}rcs60HvZc&G=+IOO{3*)hnJ?!HJpcjeyVqgSLmSuFxyM*F1&chYcfUap|` z7;8M#Na^;|URC%^|Cb=z%gQ_1bRTs*N*Hl>svcz<@>Vd9#rfLfeSelOJvm46@qWY? zj)`|OLnl^g60g_Yi4J(-MrD|8W>E5U_K@I>`8N)7(|c%y-&Bpi*=2gP-zu z88d7VSbsY{ZIf`U;EZZ@*9!;o0>4zkP#Q8eoePyf^zfC^Y?@?G{@0(G}IPZP^_WhaV;V?}yv5F_+M?(d|-MlY$ zd%Mm?koBkrGLfdGQ8`NcvzP`bhe&!gojif_b;0|-%(uGdtyl9%oT72DjO4tjczJd4 zbp@sEllAtqD@k*uo>$21H_;s4vC`E$EGMXw{Vk&0M!rb-$e_-or}?35E}X9`-j}q0 zvTZ7`oU)V2^+Ft%im~EPkx|dMQy)h>KfEYnZr=Ou+Q>Q&|D(#YU410EXLVxgimyxO zZb{r$HOpV9FSv39=j(>|r61-b+O^jDJR~_^=c4*z{F z54UHIJTLm4fB!kjjy$l-;Zn|70 z{Ox0Zk=hFr?(6o()y+nn`1f3%c;C%CD~_sg&l@>8yU1R$*VHxl?FsW~@){OxrAaXs zQfseKlU{tF$;r(h;GxFKZ1F=>StMe!=L+pfB`V$!Dqj5O0bY1t$+`5M(FVL>=>z#b0S;T}s?t`Q3Fo58jf!V&~IlZ4LcY?pZdOg|2R2|2C5Aus2ao8nU2~L-vC8N0G=7aa0b#(si^C0EH$Jd(&g~Gk=)E8JvaCu)b zcyf9EHIegPjhxtNHo;|U_?6P0Y4MdH036 z!Qt3a2I{fJus1o4xcIpDZEd0PG$DJk%E5tnwViE$^9yxYOl5}D&u_p@xB(D z2Xs>8Ym+y(_8$5gPTsaf!DCwRn(@{i-3aC05T348U32jpWbcpfuBUxd8s6ap-{@W+ zXwkiz%~IVGCVmC~`A`7fcVDyov2i6u=@|7f#jn!a^X=VLOphv450R|j6X|DDl^GeT zqx$yEEGk^dC3wZA$0k^Fm3Uw|^rZ9x+oVFqNIpMQeFZc@^ekxr(**o1ff5Kpf^K*MR<6`horJNgMxU`59Tg;IDGwP+xKF73! zsqeUFl4pqNZgjmFbj!k@$H92t;u7Z{*DTH}Y>qsnc!tS_?}>DOr1iLf!J}K-IJSq3 zH)q$Kn-jFWH+F62axRJA>XNKRMd>#7(1)LQ3w+wHHGuy->m1(Kd&al-%lOF_MTzm> z$?RLsjJ_^PQ_#BBwoY!MQRrF1e!S{4nPvAj-#0IrD9+8F)9Kz$t8bOD&?|JMJ~McW z&2C&A&f|Rr?OurbuCRPGs9LA&Us={DvKC$0yo-EE@|ejCrv&m(5rltU7 zcIyT|CX-`$k$67%$6a;@;majG_&9{%eOpE2KMB7lU2EE+;>YjC{CQMe((0J7R7Cxj zT{`?N=AGY*^@%0ql}-FU$U5lToihJ??3T}sC@TBvE2hnp5t~iCfpfyvi9|1jc%*zFDy0d>QC!^ z7#i5&ScHp17~a>7W!T_C(6c0#v9qM=vNN*$OeE6^2?t*Ei16#_sn%W&KSg(vGN7x~ z`^0kB?(zKKwEl^fqufS6D~#oBA1=4yzke2v_vPVK6z6<#Vn2QQ)>l_1l+8AsNzlK+ z9aeqwzTd*O+i#6*Nv%(C7Ogdk38|a^5YX_;skxci8F5^rw*E+?r22RKc!^ZxeeJr%o+*mAl@KvG(_+75~l5^l=#s>g^>Hci2XnnKN;(RfseZ=IlR$`i}rI@H*!T#UX z$$E;v&F(JciP=Aw7<0X_w7!Ik!{vYByRx1fy6CH0(_B98-d^JzGR?obZ@pUBfbZhz zXNSTfxFa1?Z9aQfZvFyaBUmaq5q{e;GDb}+bFk}J;I$_*_`idE1@B9hUdEiS>#g)o zrD!~W)=+kgDnB`f0%Eg@wIDknh*mU4nFCO~kj>45x)E*(AT6uTwnXGHq1M zyh0mB%^lZ;^Nq**M&0J8jJ%ri&bFb;+sP^-*xu@a#FY7J{E9B)gDXb|Tx%XTf1TSC zaVU;2Sz3nd+535>xMUxB1Ki$FR(y(*#v%xg^xlhnhvUsdinoRp|iOpWVr0^XOy z;>x>m{sD_Af$OsA(wReI{_W{OF~zBovd1z#wjLxAwPKy5OHis3KB-u~bmP^V)e@uQ zQ>)5{HGJcrwfWtV!1-Ro`yS=e5~;lN`G@ne{xjN)wtEbx_wf20D>_h|X(}M6)@Ih- z)&5FYb?@Da)s!v*f`dow&Ykb_C(RvDIQp;`=bMQ4jr`hp=f3F4)U8kZY`#Cc z!m=#0t?uC7Ns?v_ubp(=d&KB73+rd8JT4BFDZ<|FEx_fN0=V;nv$Y z-|Ki^J;{`(do9*hR@3E*F3LIx`^lB*h@Sn%t!28D1GT6_~_c#6G z7G!m-Oi~Nhjdggg-$nF-LHv8br-tsJ0;eQ?PVOOrR;#glOgwcJqtsr<%Rec*ohs1m zAJG}c#UUB*`*L`2VSk)Yrq=L_gl*(bX+y1bY8n-t7cE`e^2BT9GEaPdUAF0XZb`V* zV$UAw_0K!Eb&`qJHN~yBOteya^y1%7rr>=K-B=Y|vwz>+uh28_VK238Ny&oS!vd3_ zG+BxgH3OaQ!hjXIkT4aIqc^{?8rwK&eq(-LM;F6o{r;A#l+efme*Tb(_torpc{u-h z+P(F)65D4_cdPw+W>&Jwu~+uQ{)mX@t@SbuDO(-{?L0g;O_Zc4zfZC9S4&H6VJth5 zsvC`W*%PrrTpZHyzP`aWUmsoZFKM}QaI55q>V#9M^QGr=!(o)m-BSj~n^uy^79wAn z61N8gPC6PJ`&)!}iCA&JHQ{W@-cmKg`|cyo_a@$VVxsHo`gXdPHN?CM)XdM{q%hHa zE4xRU*qNCAbo@k(8@<>IA<4*+E%~Hgv{f$Ke<(Cfj9nnvG4-TYe8fv=3;y}|7T#Bb zseopJ=$KVr_8tz)qhEhXE*(F%$x%;b`jf|GlepysvlKjD@r2Zxx2LbMYDHGMeZqDr=84G#Kc~-b~_B?o00_ zer?HeZ8q*~nIy0KYN{)Todl)#2@h|v^L3|r-?8K0b7kOtTcujcxt;u(`DtXA^AF|8 z4QhMvHz@sf8hsIF)A{w;iAVQUB~BXqeHx?-7CBdP-^qH}mW=yM;uF2&>ytnEa_{5f zn~C?OPL0&Q!d>H~9>`*&t{>pz8x#FF)sPco} zcYX|Id(S&HaL#0(AiwXRorCkejrYAr;^SLgz!*B1n3j|Jj4Z3DK2TwJL1Q~#{BDO) zl9LGzw|W;V6je$s)P|n*?w%`fRigDhLcUI!Mp0|zwImaa^UcEhruHY^5FbytGamG7 z(~#~}pULSht+eSJmu}RO?Xe%&Pr{*0#UJEOEN6P|w#Mt>c=Ar$)7qY7Ut2VU$z9z2 zC~o3>v+=$R@9!keag#bYJLsKT3VkETuFf+MP`Ei}>@^S5Jl~m9hc2Gf4Atox>9%<{ zTAcXR|K9BJIelf0E#q;C(N&9I&;!cOv-6EZv2BER)&ponqT6cOSfe zD5Z{Sq)ei(Kc;%wnCg2}@0!9&T1CfNsH4{*^-C2GJ+E0jv0agr!Sy!>@4Hg+c~(`l zSAOt~S)@<#Wf7jmG59KsX}M9+WbjAc+HXeAANUs}XN1eL>2q%;DZeo0JMI|mPW0&| zRpG938*cpP0l9eJ690uP_hnLv>smeURW4baDn4?D=vYqaAs3h7r?z$$-Kp#(bM0+a-&i5YP_t&Rrp_7Ki9rbB+hIgOMQ+8cw(4)7c88>OsPW}CT+01>= z!{?EgPnP-FiKt(CM`PD^z3Spzu?i&mvetBBnLP{Vn~(Q(I%qc08~@=&nz|{-GH}LOM z3-G>%qYl50ZqeDjmq#%0dE0thHr0w=u+F6+<3d;ZpH+UW5{84~K@0&bN22`h$X*e6 z5E=S=iPB%fd+lhB$}Z_L{P(U3@xCjc3fwy07P5BnzxyQ_d@`QB#H}Q^ZXv+YMkFbd zzT1j z9!2Mf__*MAm32!3x|1gt3JcjEIFFy(MY;Wi+#2`I&Y&qt2i3$&x_gAr)=jts1pg9df$)n9(80hB|)2CM?_{rOzzTPImD6+w&$4 z;(h8aD`NQHJGhVcl~!xWfAK9QvDK5;?_gZ|?bP(sePmG+BIb8gi6iAh&)Bw5-;?pP zNWIZPcDI3JsaWqD<0+khwo^l6)$E)Uj`(@W1H7;NHz94KCzZR6XVgA&S5My>edD?8 z*2Ti5>A$DcF^9>PO-7vV(B?oT$!+t`^B?F-R`?`{7M`TL%|IzU+3a+o2N&Nmyl=af3FBF^)G1LzVG&lZf=A}BlwV#B`c&d_Y=1GM?uu>jzGx=84EY?CnD(^#QgHr`# z?mzB2(wOQ}ziT7{=Ua~V%`eX&zhWrQZeJ@9DO?d`%4{$oWRR4WE>lhUN;STg^3YJO zM}Rbq=00AY*>5#BX{g^umKPO9oVA=t-1(#F1OEFv5AnV-mn%(9eu&?5VB59Xcbl2+ zZ|%sNbO`%-G!ElN;q9`}M=AtP{z^}cJu9un0=^xGgxYb1CaR{!z zkMO=Kbwje_DOsjvDy_L3o@N46@k(5$Kl{;LIAfG(ud>%U^8c^sv`KD)-aZEsnLD4Bp(>#7%Ki zcOU+Fr~>bs`Iw&kKoou6sZ5G`O$wW*X9bcTZA#e}W|Pc7{)CeGd+3%u;oFOb4ZpCg zPsC~%R+JYkCQ+wOe3v()&QovB8o8Cv(=u}_PH-we=)OpE^<|!~#(I3-N z_ZFWSJM^iQGAy|BHYKq&HRDbF%CHRK{O)D`<;4WY{VMU3n{OmA;e0FczB_ndRrb$M z1c^+Y9~!v?chkdUQJv$2cE5=|C2Ko?3(VymUOst&r(>OZs`W zisU>B#i!4o#Yu1T-g|Lis~^!28JqhAYf<~ATAXh!-dE+^d6HV2=1Tno*8|S39~tP~ zT&o)8Q&Iaqb+*D!w5;XPT@(MyPXdz9IgpA_*NNaQG^5Lr;J~byCZ$ zG}+gm$1X+tHdSpW+9!hRZynxO>6O{nnbX$AQP)eXcWY1ee5~sEy{Yo|)CcX}oIA%e zJwHta_XjAw`yM#y7SJ#e@}*++q5sP)lEcn-SjXN}so>{3^?2Vq2M;98kze>Rozxi_ z-y-11Lb@dXz=_}d#qs&Q^~xu63UUnO75c@uUMePPyxUIW7ft={p*e49`w5!3eU(ST zEpYv9!21%%?46aT7~LxLO>xn3!u;~9Na~k2o#r3!4LnONb9MKDhhti2*au}DU&VjP zs+eBZ^f*kB@+mSSn6zsrUC_4({Pm#`@9W-dD!ye&Ue)%i>zq$+`5Wm|lI7jSESy9( z61~%Vs5`#!9H!MdpC=e@FQ8|vTy(g_tT6O@rC7emz^75+5hov9f1B{WPU0&KFLtlY zy3WW6U9gsnd3-A316OoMTun3aI%C`2o;}ap;XjRXkrNSxpzm73yQ~nT z|K)8ZX^D)9MW_kPX%?%A>H*?>i(q{Vg0{<1kl)Uak6&sbcgXpK|};U zA^-jN`k!kL(RBcUexLrIc|l{%!phCl71G+Be_qS}tM3o$Gx{5n5c`lYxN!deU3Wcg zyxg39ZHPqR7g4tT2c1X%5$7*z1O0vE9k5S4%zxfTkY;b;X>D)eO|%7WWH5&g0qOr( zP&pqT2WzyUgN=xY@~@QpKPvtw3aHO;B&{61{&)KC>CPX1HZHz4ot)SEb{Yo zaPhRTB_a|LwRCV5K|TF{yWsnL79N=Y8IIfk+X(#o+|czJ{e2{q{#zFmds}BXv0$-s zcK8Pz-G6J32<88l2%zKUYT@dJu6Awku!rW`e@nf8ZyD6CqnEJ1g^M%M>3x5_T~yBA z=FisPsv)|O|M#{}s85K%-x~pReWU}>cW3{nF6g}UbcP2oSkQU7k^e&={PTB30L9eH z-r|pY=RazW^mlcPP>B!$LInOtN8mr}dXL(*^0bl=hm^*E@J#nVdJqzJo)7^-1PBrM zPmI97b|3t6-u~zNO!O?|W&gLo+x(+0_MY|M`py#7b@1}GaJBStu7&rsf9-QHRPL<3 zgBAKrSQp;9{v+P=qc&XK-2Zt0=MDeQ>>XUaiC$g!>(}gmct`#T8bGn~ zwEDB7BBF#(mHr718KH}W2>gde;E!tr_Pv7r@XK)U`Sl<3KRahPOVp7K?LV|r|3ex> zu}6P!49&g!Aw{wOAF}I&-6TYS5CK92{@X?XUE9yY_b1W!?zzkVyv8HV#>*K!x)6ne z_SfF={I?CtKVZjDOgFw4`H%Tlw#Qrn1# z=>H4M!_jrk(aXjQy}n`T{O9<+iGPAa{153O8aIT65CK922oWGefDi#f1PBozM1T+h zLIemAAVh!=0YU@_5g5CK922oWGefDi#f1PBozM1T+hLIemAAVh!=0YU@_5g z5CK922oWGefDi#f1PBozM1T+hLIemAAVh!=0YU@_5g5CK922oWGefDi#f1PBoz zM1T+hLIemAAVh!=0YU@_5g5CK922oWGefDi#f1PBozM1T+hLIemAAVh!=0YU@_ z5g5CK922oWGefDi#f1PBozM1T+hLIemAAVh!=0YU@_5g5CK922oWGefDi#f z1PBozM1T+hLIemAAVh!=0YU@_5g5CK922oWGefDi#f1PBozM1T+hLIemAAVh!= z0YU@_5g5CK922oWGefDi#f1pbVGd+p{wG7W8irWA+0Jgr0=T)n(4oSj9S-K?B! z9h_}MPI=nc$Z?AAh19BPvZ)66lA4Az-3%>vWN zVVwojEI~v5Xm{8!%?>ow#x{T*(;PuVeM9@efoZOoA0@1FVwxLPjtbTtkTEP?SUGCQ zTVk3wrlI{;#WWw#;D=}jppI#0v2rLT?3m^U8tUIpU;%XsmO!i=iqjiR3&P6LgLVlt zROdWs@I$l<$Nu0zKhS~% zSkkb%0+4V0Lm?u%iD`ncPKzD4TbQ2^DuYfYSTeA3dm+CGG&KG*F-;iq^UxR?>$fpY z1oBrwLt{M)^Am;qbxga1mD>ke9Dv4u4pvSK@(BQ1^00E^kWcwTfnx<4iiHG_hG|7u zx&5$y6Vr+@O%m2oT+w+_0vh}fNdYJhXt|G-I{9c!X-6Qh z0-*EhDW=Io{yuixDlzRSXxpHF=p3s84Ruuk7=S!lo?+z_AwLRvbdJ?xniAw+V&$G= znlfnUnu(S=Ogjeo85jrX+^NSj)VD|2cxk}2r@HDQ_>XiqV%8PiUH zR)A?On06AhLQHGLGcsFij8gub~_o|NWSz5BVaj zE;=r#T?4=u(*`lk5Ht%+dyQ#EpowAH8_-bJ7}$?#@33;GL6Zaxojb#z!4HuMa1hhb zu}AHi0zz2b_n2k|8a1YkVcHqcXhB2g*ay&1*vx^QSh)$ToCRofm^O)NmY|`Sp!04D zH25L10?_%7mKjX5hI|gxMd#RO&`|$ufJ4~%@deXtL6gL^IZU$y4UHpoo_xhLd&rkV zN97^?hG`CvH$=v;%ww7(>$g^VoTf;PO z&{nb7uY-oJ(>?%-3mTiGunkr51+*ZK#?lr@QI)d*A7s$6Cx;Yu!4F`AJUaH2kfOT& z06V5pVOjuasDG9K8aJq1Ab`dST4+Fn?hpk5s4vz48cV2LFklCbp_rkugtT*jFct$e zmXLNHKy^_p=rJt>@@%jX#bOtxg+l%}OdFIFxV@+dB-@93DK{>1?mkVgwYro}@Z z)kWn6FzqWgCr?HfAy_C5`$&k(!PNV&Ou~^jDv7M2Yk%CE(YV_Rpg93KKmlw6wgZ#^ z6+jKp0O;OI3+x2w0Cayt_bvti-J6&IW`G4?1<*Z*9pC^s0WQD=t_7}u8{iJ0xvwLD z=DWuL72r64=DH_-? zHGt;5oj@1x3g`xUfL@>j2m!)?a3BJ>07L>8fhgb#5Cg;laX>t96-WTC0g1qMAPKku zqylNcP2d)g4rBnCz-=HKxC7(>K7cQ97VrlGfIz?<@Blo44A|F9;5Lv2WCM4A93U6S z1MUL%fPA0;C@ECXkJO!$NYM=&q20RDqfd-%vXa-tYxC0JhuR)94C4eZSTF+c*40$YHs02x3IPyiQUa9#r9fOsGQxCSHw$v`R) z4nzRx97E?6Iw#QiaTQ1at^rBF4Imjv0n&h*0JXfCpd%)*+_ogcXK*+aXU0Pyx-rGr$FOS6~kK3VZ`9 zL9YUy0QUhAh_5J60{O#`@&SdAF9LMIJ`d8nKmou6+qQ!Tx|g7P2b%i~0V4pKd;Eay zXdZ^jnCNeqaC?1YQGgfVaR9@D4!pP&DsE^UMkW%`Gc|Dxexz zfPO6k5|G~yNCDD-3~&(02hiLT%{BP}0YDJg3kUYIOcMI zJb2|oTY0EW&_6+n=7VVdw+|43bsC5pH82DDS->6e0Nj8=-~nta1NK4vQ{blu7((6z zFa>O&9S6V#K<`k{T+j>f2F?QhKmZU31Ow-Q^FRm?3T%Ql#v%O#pm{Kw_o8|3G=S!| zXzq#TnrPm<4N!$P)c{?{p91s%G}n9vC;~?SS>Qfk0Db)edX0%VZWRJ zD*(+e(R`8@-~(8p{x(R_obVSg27CZM0>wZHPzsy{`~Yvj5l{kD05qRKbA@xzjyvE1 zC;*Cp5}*w12NI#3bl^6S0yqLkL7#@Y@^FkkL)r_7fo=|10yY4e&!hP}n&+aqvpi_d z&|eq86)*?*0Rcb=*b4{)qJS764vd3u4e$)81)c+SKt0d^Gy+XPGtdG&2GBfB56}S= zfb-DT0|1(D-Gn}f14jXEz!cgr0knXVfC?Z1Yz6wDZU@i>yaKv`7eE{E1VHnxr@%q* z)rRuAz$suqAPGnTm9SkFQfWX2kOSm_qW~4eZUs{G{>%@k0G~>r1K0$8i-NlIKn!pd zxDKQN89+3Yi33srUjWVJ{eb|$7T5#u0Q`U;U;@}dd$N$q0h!=|-f0K}q5ui-0s1fw zd;(OU%yD2Flp_PsGXr|g90j@o3&0XE29}_&Gr(tH5~u;n0ZHHia1YP{&~v;xUzEzzS$;u)Q4GJO%CP0S3Tk(9v_|cEA*v1FZ+>1X_T4paduaP(4&f z1JDHCgWpF0JtJ=P9kufVYwInf_W^&v9#99g0Bt}SkOz(ea=>1I4`2aU0rb4V4ln@> zz=pp#v?mFmeNlk@k^xRY{vq_?4D{(X>_Z!*TEIBywxHVqmcVg95D)=SeKshAp0U<| zb$|%;O#pgMLY}&y=>rD9U-oM^XdD3YkpiRvRL36bYGU=#HZsUFLOWX^B?eHN>;MPQ z4)q@a8(ygXAwUnx=>upTc~nCglyAYFW$vO24lMt-XBzbW3cc&91LsaX##-WDPIC?0d!9>1JK+>AIh*p$^|L9mR7?)pt;Ca(9k$Ra}#t=Lgy1Y zMj#V`^vAUo9XB*axq;mP7r+U?;X`33f?fQhEGo|o&;wfm^bAG`Pyyrs8MeM1%TqwQ z4a?I)x&xpFXn>sn9l!)I0t~<|Y@H2K7JwCC2RHy>U@ss9@Buu)9std2H?A*eev5RZ zq4@!tC!qNP%1Z!BfFhs(90lY7bY7xs5xOR!c`iD}2LTxXjT`KvpLKK$(Eg)qxH5po z{4oIC>(TuQ%|lTfbO0>?#SM)QRX`m$37~PJ0cZl+z+c-Z)D{BW!_nLl`96X45rD2~ zWdORS6$7^bbU)#OGU&LcK|U2g_s9SM&3C*3bT8D$Jkh<;0yqJn@s8#ROn@wa=BDU8 zK<5QLKmn{lz2CquU=;`iegddp_kbS&8beFKA}|NE0gXUCAOd6p4L}`G1#kgR0o3OJ z0NwlD09U{QFau10(*U}T8Uh9Y8oSV?|L?dML*5iH2hIR4fHPnZps{QR*a9|y6<`Ti z187V*0gk{PzyUzV4(SMVy!-)gz!UHQyZ}D{jlr{kFW>{9cmxAMKn3swKyg7axeMe0 zw}DI`1GojG0VzN-a05sLt^oLW1+&U}duLDUyDj*0j12=(m;IEC%Y}l3s+yQccT;MTK20Q>tfnuNtC;;+- zLZAe=51?)3z(e2>fXbommB4eL7N`bLjGqBD0P15s&;+yq%|I*g0vH6^fiGBo4AR#? zH_!!i0G+@q;3bx#Is-sI&D3(X-X#bJ+5kPg2hOdKkqigI6+r9XuoUSizYL)9wF02JmKSC8bb_F9z72-1L*pQH1xc~0-*E&zzLvhDB6y$nWzj((HsKJJ@*5mfFK|R z@B!#~A3cLh06c&=AON6e7hwQBL+$~D0B&G6zy)mFi;x%cKy^_)RCdD?X&Y^zJR18b zMW8aMFB{uYA4CAO4f&w9(fbFyH>%$a^aC3@N_WHhhR=ovs=rYNUmp46#_}7-;t;H(z`o^)^IL7EXSPoDH{%^_QpqL=Pje5uz^>d?-8~sD&H~OLod33EpWzm>Jb@5{q9fOT}Xgg|Wqb_O-^$m?7 zRBof68|`h3;lGUQM!Ai8Xdh7D|8iWS{oU}|hzmM)8*>vB=Z#~yah{@c80Q!I)pba2h3qadY{uH1K7y+ihX#jbkdT6@|Pzy1| zYi6J!57fVnv5B^u1897rKL2HZk&eb@8>Hy|hVEt7uxWe*uU9A^~kEdkNArkfL%?z+T9sdlMgky!HS$ zKu-ctn{hx45DQ!bt^`eOi%$ET3i z0kuFiPz5{#&H^<6(w<{!1*9aK;eHBi2GD$M6QtjA zqzwQG<9;4|71DKJ4L}dg zC@xzdB?VAi$RK3^C;{}Ih5{f5&^uU^M{QF>N(Jl$P^@=AisDTJX*{I6ux&`E1?T}f z0If3ti~t+J0x$!?&@L;a=)Ko&fCJD6A1+8a0rYu>KA;6?0&}qK2-MMlJQw8EAw37F z8lZ*92+E9{|w%d$fKC(t~In_E82>^vr8yG!;Pw zK@>$01r;fxh$xDnQWO*{6vbZg|C>4I=HBGCbzi^t|2@x#PuzR&oS8Fc&YU@O=CmvE zd^vu7@XNyQ3jC;z(r*Bs2jMpuKZ=bH#gAk~vGQT~QQSNm=|>=r7A)X%xJc_?z{3hZ@wjhMR&*FO!e@XuX_?w3x%|nn) z^y6{Urt(~Xzhu)M!e9J}>nDh>$MB;*Lcyi_qkJC0 zZy|mPJw^5;TZP{Jcvk9tF`gIUr{$5-5uErXTEs8$LEo0(r|9hycwUAd#r>$w;}5s# zbMTkG(K|@-T1Typz6`*#_^rfm1%Au%YlU>Am#+eW?A_D&MmF(9{9TLR^Z2d7?>YPk z_Zj?%uT}WF8b1YxzSHjo`Il%Y>FN7R_^rop9e!5>zaM@Z@JxT{JMlxXSMVDE+!Xv? z#dA%-DZfp44&X2KUpL?{mHRb(+lJp3{5Ipa5kHd4Qv4pr?@|0nW_RJQBCCt=JQCkB z@xvp_=?y#(y}$9>jo(rH$oHbS0p-0Fa0Pz{p5MfebZ@Mjad0+I?yYA46-fV2c;cAa}trt~V@3rGea za6pzyYF|Ha`=0Zz-}9TA&l`ZCx14&Y;D(bkruB3&4st?24M=@J&Tji?)cuYnM*%_p z$xyF90I3UzXUe=KKW?jf2#{{c;6aYJ0U3S!-=BQGGb13WrKa+zx)vZ;*Lk_+qtDfB z3P>ukoxx)X_!3i3Z0gf*#>_Rz1Od~@oq2?OJ|Op{+&HK0x?bG?Nuz=$XY_(jv;^d> zUAw<+a@{z>>71O3!m@YX7?7M#`n)jG+4YzTap$>wVB9f&%Jgl$u0NgyNJerx$*l;~ zssU%mIi8g*HjQcqNEa}Wj`(53?+Zi`-y1RYmgj1(Ah~r-&g_hQrU2(c;5?Rn@}#TZ z9z-$}8F-_4-f#r{{Fqkx)4Pm02}tMUZX}(Yh|^mV4ZCi-b!FxaWf!yt1TsK{JMvs% zPo694n7%Cd!u*G>t`10Aa%wjy0$F9Mg(-vAWH0~lvk`;?-nzkt2R*Jx9@@dtqF#@5 z8zO2uwM%kZYC#ZXMM0aYT*0!#aT6*{Ic@^Qt{e_0uUCG8O#^>A}xkR`gC=W@8{5Pt(k`G=z(%zMS5Rk5@Q?wuQ+^Pfe zSevOGFPrYo1|$;@)ae2=QPRXi&-LBYyYZ7FDzU6d1|DyAVJ_r0cbX&PNRyp!0>T=i zuQ@5WS}{qQ~rFE>%A{->ooYnu^)q4hNx4T z1+RmAt}HnE(3P(}b1opT6O_+>K*&<$PhZ|^Rlk|-06{w?8GHi>@m96U&Uw#v+bL>+ zC3*)2DpYgLI$c#5?A-BJ&WCNH0S9Tx8C2V}wvBXWQYA`NdG<2qd_sSM_bxHhNO6gb3n_*Czn3m&L6 zOL7ey7a-`H2K&Yf>KV^VWK7F^k-S4*hF$@T4JUGa6MVvW)SMI!nd9TzMePAb3V-6mwB5EOf z;w8PZ&ac&#sj;m(1_+gB&*+u!5BTY^W0jInq11eMjbTFlkPSgTg;hl@q^H#4G1L;UjG>`!`M`Ibtd<dUb4$Ob{0+t&~)ECIXPO`jcgC{#~IdSy;y%GW(UjY4rFB++{ z@Y{xsKHHmHDGBPy|2_pNvSKYN9UV9H^y!e48*qXFx0jNz(?n|L3Tkiw3()`4 zzb9VY_R+fi_w8GXyI$LdX4y-7mA+h7T)(yPX2cRkUwlZ1c;mpd2^fRj&t zy~p#)k}uBy(iK)L6{AYvkgQv6s{hrs$NMZ{2-{ItnEEBiVSDTSLmwVW97v7N0S?vN z4?8}s)_L?bDVz^W$K%UEuZ?&~NzvXpgYRs@I9zp6nU8N!euI?z@0==ez(E-xWL@68 z;KwiiX!`oCfXFsiN-X2wJ8!=7%QacgU0x|kIu4HefkWCmee7E|-!{1VxAoDNkXMu0 zX_16HFuq}*?1MG>s*p7F&ZGy5XIDF^gCK9%|D??nF%`AEeMd*O{0c^&OjpM0`M92IEu=n@d8M% zp`#&)hPYlfp{TI*?3m_)8kv_eKu8m(t?|Csq1&}D10vhPEI?>n^4I1rzrW)h>X8so zLoX97hL-g2b9c2n2Y&uOQ{#NLz_BC_7A@G>WMaXF^BG5!)EDp-_#)8-haOlzbjESf zO48u^|8H1WZdnzvu!-7RDW<*VkXsSfsS6o&>wEv6Y4^=v1R0PQ4JEw?5Yo{mr(d|Q zYie)mx6w+;-7wJ|XrjmKio*4GOzCpl#Xs&C@`sctYT+qRqn0&dz?T`tm%S(~689Kn z5B$Dt$JjfYAKrB7uhb#kkzNgX#M$V7=6-zhl;(kdxCf-hkm}e49MY=LkoC#C^T&L}Tr&q29&y502ECaW z$~g8(YE@<)9e-fJsoG2pK#X#HImjQ;#6ib@SwHR4Du7U5kGAkRa9~EJeqB_z@*fjl zpz@Fx4T+usgyc5<(v0oD&e}vh6ULc5%JCKydBcd$4mfswjr%Y80+22+FOXX#&+GS3 zh&Zl)=epsiJdI8=4#ppdkx1UITYcG{tm8?C0D<#FdYw4ZtIaK#gl(uH+)A#8p@M;# z`c3KfY1=RDNj--2UHpKw0%Y6vL*47W`1_nnNu*RLj$;lWZ2@_6f4>JW8?$pfjY|Y% zEg-D{arLct=Ixg*oLwo2h!M_5fKb~$)A87vGsCXPpa18B|xY=yQ)7rwB|F5mT@hx_I?5g z^%&!W$2+~S^6<@oU|d2*@tA~sb?b*$UHOp+HZ8m2;Ao&x72 zU&yifiQzkLSlR0`&Igvfvm*%(1^HE#_YX>nF3qI=lzL52s|^To&^>2mWL~>*69AEZ zuX)>c=LPe99`yK|@4BgJpA_;#plw9W?Q_Dt3}S`m`F~9~`D{%xCFT8Hg4>#_9h&&-VqHF^Qy2q&<_ix_o$ahWx1hOH$ z?hXjG`gI4-S-J7z+lBx_BO~;4Ilh3$Sr~HEJnpO6WZlpRQ)7wdgq%@w$3Ct6=M|0D zT?xAb#<~%;#CQmB*wexUNEb|>{Fna|Zfe_qt$_>C8FNz-Zgo)}#L zgscuAA!mUr1Rm47v|qV$eWxb?k?l0>Dt2ZEJ*6cXW6P$#)aG_Tq!*y?x4|_Hw;d6^ z-RUgGbLi>a$i{JcWrridW~rZ%zXOwmFFD}4E@bgg?Wvci-}Ee^5vU(%cDkbk5VCx; zpT4C1>Ngr^FoXnz=t?jg1#W6uVDX>6OGc<3eqq4lbNkTC?8@m=HLWUSO|67fv9QqR zAr6|J9z5XvHW$4Eh>W`wQ&r<%m2(H&x?yflf^>oQ!ty0Xaq7o<&BSPg3RwrPsmI8R zJp0cdwO0A+$1M5lfRHA>pILvz4F`X!0*EvsePCLsHNJ9aLfJ(xPJ9p?$W~Gn#*H-o zjk-O49zXbg;*A7{eqlZ!Wc}~>XWgTJHflhvgft$tunZ95;LDS*G}+wp?>&sev4Bx6 z1qY8e|7GB#n{OY;IBC=tyns+X`)YOz)NL?m0Qt(oiWz7;+7)G_j~2;ci6a1Nq~C4Q z57&Kc)RXm@1CH-Z0;C=wW18+*Uy^zDTR>z<4Rj|HdVumo3rIsTgLY;8qGn}_N=0p_ zLwV+aT5V8k+WMTwhAzp#h#xXYrJzFtbTL$(Puw-1nYKIoMR?vM9kids5g2f2Tmp!} zc#b?(aFFkJ6%z;3+L!#g?8aM_2nHbLW7@Lt})@mA)xYhF2CAjUr^sH5E_LU*oN@LHEIs?UB_^nfUiBMlJJowuLs{fcKq z&z2->gsWhY3Iicu2qXKsH=I~d(%uPgP^z2bW#CY4|6Zf@x&~QGU@ce6FCK5m1EP+M zxofW2)YTtS^D&4lpn8yv z4w`~vC~$~_L$lw!@B9m@I0bJ6G4JPogsVaAr|O+oR{3n%(q5`2o&|(F$d{bwJX!0# zt<=*>o4B`~zh(-O$nMOne1H1`Jq{dz?vM)!w(pf3yxsYq$CEu?aII(+ z;+#=1;P`Ij7ygAk7I*<6!J(lplpHj==!!9|Z@UySfVE_c)+RmDS;Oa&p`;GgXm?R^R4=5SH0IRWNI9Ttp!LOaQ)?>p*wu1 znvawDKs+r0AsPJbPg)adeHBF`U=FA}rKw#5#PwA_B>iygwdiI*i0e$OrjT5#a-%sg z8nP?~HEMGwJvWX#)N}Jyz=3;0)RqH6Bg$ujsW19ZyB`Ha`lGJ_QXP=yt&d#1xms%) z*ONrS+qsts$c;&h5A^%>F<2Moz>;edYT)4Gj-uv9et7bdNx|ATfEq~@5X0ClLky+E z^<$ooL1bGt;cm%7I(wJ&`S$W7e~kqPvbJxRkX8p$#3_zqI1q6|wsN?6G zuABXLWM>CJq?6=BTcvzbmiOL#e0ny;AQiazuz(P#QkW&Wz-sxK0EAk zQ}?{N{>SINvh}ML4B=Kk0fv#NJvw9Kl`H-;r}X`PxEQmoh33N;ys9Og`_XMZIP}2|p1Wu=a+%E)UJ!wQlin;}K%K#w{|D98nM_=Cd z_0E7uS?fI^&Ih&jp`^C)gX7sNA}`Ja4&+I)J|ZDY)AtQ|?8)D|FobJcZz;+U2c{OR zAJZ!11%p;XZJWxYZwnG)(0-&=8MG4OnyE#@6y&;X)MX8yT6a^9-|Wq#Gvg?{I8oJ>XC)0X2h?%KEvrmni9rS3dE;o#D|z;ln~Wj@f|JMn01+{qCFh zTWx?=L7XH|hdGWxJ}jMXusgx9E8uZ_otN=S_iB&4C1n6|=$Z1U9=0s<6#qTW18-2# zknG-~Wp%&F*YnQVU)&-g&_omMg)PVjPCan_-h%vId3XIGw3l_X43NfvWLm3pf5X?MFbQ+%^J2zUBPot8W=r z)Py)7#YS&o(&nI56|udB5@lJNNEG=zce$vah~vaQ-}jGK1#e{epdoq-tMoruI>Tmc zW#;V9hyCbX$~YMmT`|!_OKR<|5F9jnCDJh^JB@sQDN%E3CJ>azy#FyQ59`|sa6tOD zwPF1WZf$V^#h$2s(0)uL3av8X03|h%C~yopU|E|>)Py(WW6nW=CzI>P>*(;_lpP)B zb9s2cZNeL5QjPFdzI(`?>V%g$0vVXdad&Np-?WC6nm5N(viCp!CHr&%}-MLYHbLM0u(q>p#Tk>-a~$WcJZ^Pcxdx6Xw{!5u2(3?LNe ztGci9XBk&d%Tpm|CFHV)(ud!3bHg<%#2rL54^gvuA3pJA>hM#Qp`#QaMS0F2C`LI? zc*ftlbZ~GuAadO34;PN7S(Y2Gsn@UJ#H!60hl5;Etkum%4fcEN(8{F^H~z*N&+|<0 zfg1Ui-oICMZ{BUn&xltc9sSeKo58&EKXZtANzFMhm+09+LZVeaKlt=&f63LVbjbIK)u zs*qAZV9=+&GrLB;>0>vXP$8=%&X>o3{<=-q%O^UmrJwTFy)BZ{K(&TSyuTvra@2n-zw{2KhwjuhFE4pTK(i{bDzq8mCDOi=Ye#_fq z<}YNs!`)1!5yH0|Ui{3d?{gMmTvA2>T2#zlKx#tPKi2!eRd~tKIgGHgPGzO@(yg<=msM zH&7v0N}RjB|hM>uEib2ldZi3%y6OrQa?TB6y=6heo+Y!U zd`QD_0alN26B;sqarH?%xl}c z=FDrsT-N5&G0(?bL(Dm-h$fm-Gl+gslnq^yIgUBRyrkx>u_EO$ms{nrqMb%YU(+Gb zme)8-O*H4)yiUzqNps|bWq??j{c+9J)n}5umid^=pduWY*N;B((;2hn)PD3aE*i>o z0i+_lnd6wRYN<$_R;1?4>&KjH^IG_CW2irF+%OtYj|xoGYun#WMB@Hn*)M(_?MuEe2lKMF)|LllU-XR9!F;2Fqwh-;h~9=M5PjPw2rACe68R7ZAA6#w>etyuT_d) zrPmMzqOVg0qOTtXqL+aJ(YHATqHl8wMBnBVh`#+OkcyO4-xd^V`nC{*{HGqVUVD{% z^qQzZ^jf7r^m?E`Dk5uhiCW050@Bgj1BGjIeKVJvxh9&+&E<_aX&U|G6DM{rI&|fI zVhuXNAqKO{JXH;dxpef_MJbPYE$Dj;1*ak!Z{C6{B5U*VnCoaoYQbE4&1InP8x^^k z%fOtPd7bKeK>K{m)pNwm z!r9|(+9^?DZXa;f?Dmu1xCang(}?jYtve3;0=ad+i{$No=WSYNC)f9eas}55 zjt)NhVCP+#4B@p>rGU_k&AvNZT`;rtA8i1Ut3YM~QX7!kE6#hbbi%u|6M!UY$=k!g zq1o~tE&7j}bpJqFmqxP{;LV(C^OEM}39d&CTkJUd-5)!d8qfduyk2jY%nZjJBMZ+C zYjKsB`Q`|1DXzW7_Ik$;53kwRWO6Hb-pV?ZZWF|O{o%cD{(ep1Pg;{D%hOLnUON0| za^V**Vn&*|Hm^AhSb9BY_siJ;(MTbev0ms}Pn73{7`7D#R01f#Byw!tr7B-x;_tJ~2_f%@m zDjs5Pk<5AfZ|#nGtj0X*VZNu>aJ@3?wSKiQ?-9VVjzch1WRcz;QnmHwowXZDy@o`O z143{z{M=!Wo%@3>VDU(Yo!R|aq9tDntr%z0}b6gFh_tK(1I+V`<1#rzzaslh5L zWe1l$v`yS`I3%q9 zPs#0T{I$&U7c@k!)iu-*UW9%MIHV!DZ(RIf(Sg0KSx1>S{k}tGKgP0&LgQQio!x56 z`av|eOO_lQgfV{_^o1Sc+N9TN{J?$Nm>Txu5yarM7+!8~(4)&e0tS7F>>FL#*HzAlM$bfgNWIF1A8p+N1S)(5g?n}Bum9>8FWxC`* zf65MA0EPvEp(yeAa`m#l9o}(aFM@)jKP^Tnk6xmrZd6wNK1%e#tck^WJ~ujb$F738 zzb?D>2iODD9D7g2!LWx;(HdU8Ugm&$hjP?9^+miT6p&xhanz^7>wXK~U|qPjF*lWX z%A3>!gZcpl`e(2cjc_m#sILXZ6WUNHWIgZtV%y+72 z;H;C>S{4ml6Rtmy_Jxvl0VGjw*i|N19k~iTUYy3^U3k&lmsY*s_Tfr6j|&O{@dTlc z)JoRAJ>~u@a-V^BTSoc@4m@6O$mxqXKDqeaHh1(tnZ;|EP*&_r1rF8R=9*tUef3%o z)_MSkec0P2wXP32A856;?%RyR``R#G2#|KAS8a36fWc#EXC19nf<>AQoZ6sP^77AJ zDt8~S3J}s>^i1Zwndf7Uqu)KvelIl9?8J|>)VFRC{^*SQxfc*w3lTpb0_!;SNVWQx zdgttx`GB{LlZCAB_B`2me{;`ldW5f~8Is z-c$EGKN!6aAA6i@WND=dfgATBBi%!`I<~Z7xG(5jWlfz^W zsCNc$hJ6W3)L@4)ojn5_^AofZPsres@|s42b3LRC%+G1e^YXDcj;G$Zx6`$~j+v+L06I^PYL25Qpo%mRdFx}y8v`|&{F)sZqE$U5;vJ)FlSYa#JOWI$wpYJ6fF z`RfMfu5=MgZhi#^G!waT;$x4E{pm6qiIY+8YQ#bBUNrUH$uVNO(6>ozF27?)&&LJV zY_H9^Hs+0*iE9G7P5k@$+6QW89UOQ$IKWxFbl9GdD6I2KH`M*|=nvU|@PMI{qs|Or z6PpftWLQ$x zHv?-)IA+$8Pn6L6d{iE4S?$09jRD6V8+Eei`dgZU15_J9%=?8*;83ftHfZw8KRwxn z)^SO$O==r5FyE;Wb!Gd>e|sd@Z^WMN1(thOi6_PhjA_ z-n=~K=Q*4|Q&`w9(z4F)zVGUJ$cKzCWNm&v#V+6w*Nxx0uiByMYv3QCHF6((0Fe5C zd@`%;+1_JjRRct}#!1k(dVnOHf`nQq4EuNvtX++%Z;rj}t{GfX5n(C}l)7=G_@%wG z@9a{uGW8|Y&49Pyor3H7i=I37`Qxuq-zZ}Nxxpyv4XtEs(f4~By^itrI655(NE?Ae z9IVM}_RpqKAAAA`k4td3fTXrBE30k8&^^xsB1cn(x`TtZ(VNkL3ID#^d~n)R%}=1O zr>-7`!r)wLXbAU!`W~Z9da5QqIZCQO`K65N2fB0gF40PU8rkCd&99eL2iH8v_W%HYUz!w_u0k^H(Jf?gUr? z2x)wci)U89;Flkw(zgT$`tl$j-d(8gndnde9AoDAW47pnbG!E*vN!Tqf8--~gIAv; zc&pX;RC4D0QC%6rytM$NHaNI#(dQ5U(Bbf(fJl3g0!SS|9<5&^Tyy4(^~5zb$F7bn zK&ZBBOq_dVlP_jdv{lyWaEWts-I;Bky?+voLP>7WL=PZT()MQ#e-~-^J^C!hK}iFE z)Bt2~$F^&iwQZFqaZsRJ03lnoy-8^Q&%GO81&HjK?gWG+>e_eYgYzaI8LC1al#uja zza9Hr(uyi7#GKmlxx&5;{bJ~ptEz4I131#_TmuN@Q$KJ)TKeO^c>y6+gsiLID|p-Z z*Qz>wGM>ogd{_@w07CuTwCk$1E_t+=S}^$smNM819BSMDWK0~=f7Q3O8HZbazPFS+ zt+QXZ{^{3fg9QxX1D^~ykbcO1P$P++KG*Tgj?<%_1&*}W=F(YspXlcbF1;vwA|#Czmqp893jVtlG>yL zEo$#_J1KrZb_e6ew;mKV_eS92snS$ELheXZ2KC#__lT!xL=>u3^MMlKH zcaa|Pa^TR+-SO)topa5|1=LP~gD#_!InLX_A^+g(6?fIzx9_|VaHJ-#eOPGXs#c?y z{xSWZO8`L|p<37s2(_$}zhxg9U$1J0iZf)spmySdmW|K9y$#s|+3L;v#=rux()^A- zdz%h?|E;TmBYRqdUQ_O{H18V?JT6#1>Y7$A6cTM*x2}K0#kKY_Z`|r%0fc0*xk;Pz zHjcmfbLN0YECwTSI?@&OLp@W-6^TU7yZ2W2{O%={lD2{ht(ZTAzvtuc^x9+n{yUNu zgBog^ko3{Xc8i3bnNu@wB`p?<`gwHa{U1kQUB=eIv@$=fpe0Yt+$;7dbLG4P(KEkFi8AqClZ&kb9*JX&i>eoNTVv+q!diA;lypP1-^b}9=ADinqYogYJJ%09^mM20jd}rx zEK*t~oqqt{(Wj*K-CXSnudsaF&l#Qy&Alehn^cc``h6-Z5A~^LU=`%r{~M1?>^kIODo`z zhCre;_2CSM+|BDAPJJbHSt@hQJ=1QP&$M<^{>i8|ajKe6lVw6W3!2wDwxR9?S1=BH z_{o5fR*k#kn_13Vmw*~60iD~bU+b>;JH3HJR=M$WGg|B!K8r>4d^T9Q^Nf>^$46^OB1n{(^D1Z=48Sqkj!crsWho^5eUJ z;F1T*=KDo5Dj}#J%**`idl3w|X5AV3q!@jC|I(~`7gRmgmGfa)zW@letdE*)J~;fvZBM8W zb85Lkai;9weTKfhA@5=GuSudP&zqpu2-KF=od0s+oQ+u$f?6=428kL%II?XB;qp|3 z16M@E6Ps`CS{iH>d_kQ>FlY<3-x?-KukqA^Ei@kGG1uOs%SA10owd1D!2_i~sd6(v zN!sMx6=;aTJ{D?O;9&X+(XxVD?q0Kc(KlO>4;2S~Z=I(_TUbBy@eO^0v!3FyGq)do zK4oP2kdH6o3Wr^#j(Uf0ef>jsx4J4$b5JAQd8bFe9uMF0B*s6CgW5LVFQY$EuMB!f zx}!f)4-nQW6KcqZXNvQE(cP=PY0I3i-Nhy4R{!iu(W75m+~KjzJ!YkN^0PXLDB><@cATfb6Sf2 zC;oJBau5vq1xfA2HA2>NU#aoc!evY9pghDI^7+@bjqsOwZJW;s=%YoDDC>d2Jcjgc z4dyYV+{__~`Jfi4=Afg?Ul8kr?x}vTOO1jO^qLR>%UZueMFv+4*1OOE8C7baiFBO> z9JqA-djD6EGxe7GQ(S1Ui%KxqMURUZ8B&p5^u}vsi0i~#H0icM;o@(7QJl>X*)($1 zvz2O{VU6edIRXf+1wAtBK=k<`J869)ZV@2s@&_Qb0r8f7Qyjj5Pn)H-kO5n;PS}GB zE8oz3Nb_mvo#kbnj{1O5RI1mIP-*k&TY7>T>=9}rJp~Xt9in^cpb<@O`%Lj1kdMhM zDKzmK;Ly14g~lxgy;1LCin7V7Gl<9Y9E)MhLADZ;@ec&2p96yoSP?uycNA+|y?2eg zw4d|+t*60(Y^VA&&4I)E<^k8F4~rID^4c}?mXozaY=hJ)1V}wVzIwLwzEMXf(x?Do z687V<7RQU}il-X(op9l%S!sZD6Sd%tOf2-`1k!!!KYv|gZF?^uG%Nr$^K}j;5e)Q9 z)4&1MX_|lSk2~MXqj;ihjRyCMP+Sb^YcN+$IN*RH7%qRrk^I_*Xq8 z-Jc#Exoi8Az@hprJ{v{*ng2l6w!Irh)99V<7)3rNHUzbu zNUe6#`=CN`z7CrNHP@C_+pnJAm};Bs8#plJja#ER#N6&IeAVG-hWvWZ8oKoN@&3uk zhxC9o(cs2kbPFc!hnJ3++jw((O)I<%>?lfVZmY~Kl3{e8M^on3#oQj~=Kh{(CY%q~cG70SLI0C4E*typavJSYuZh0iBp;N=1P66$f&<=u zdqbR36}aff*FXCBl5TW!24D5(XtYI)x9>YJAnAoYH_ucdodCH6C4IX2p|?JIq3-^Ai?uknY!$uc?gsrYf8wVJU$Y*tJxH9-68B=0;rY+j0J0@FZ`+3J>{!<3 zEBz``3x@tRM}p0Dbj3C?KX>0tTetdJr_NIKZ95##tHs@g3 zo1({fy6s~F-~Mvl^75>zG>_sK+`Wc%+2m~;hqb7WS~$Dyqfz%emK?=OKiUca8=p9j z0SFYEa13W`x{;UmGjxZ>7$qOPdZfK8{~&PW-FT)m9GM1p^vW4RJqMlT{sr@VjI9_5 zI=(J^pw@^0@^n3V&36EyQOt3PHd zm>Rg=4+xFKeYcEz;*Ddq9;aCmz)+uNvQA4q4V*f_S^fA`on5znKEHl!cSqtnyV^IGK)n0BH+I ztyO2ADO`9-O$E}~q!x&pUe*e4hHabMf{_m^`t5e_2(H^~e`?2oU!(zPEDwpL&zaLcel{q zMGap1w#oEO`QQz%3yr4qH<~j9_eo5^oqcZT_laQxd!P7n*a_gEn56P+8whG~cb#+n znB8@r;rI?50B!1#v+q9JKBI<+1+XV%hSSN6H&{MHiSlKp=3FQ4V__L^4`_I91V=Co zPg4-H<=Me7gyXoQ-R;$%x?*d0P?M`B%-8Rj=rttT{C#1?CU(5*bnC-)_ktR3goc6` z`Iho-R+II;z%jo~)vzz&dCfpD$LGg3_Pisvf8d_8o1&m{egU<{ZTp*JC(g@!v*!l% zGScq!0E9*bMZ;S^GraHJZ2*B%6W2Ea(jJia+ssQI{Mp2=fJp1VRN{R7!0mg^yME7a zDm9b75!C(wPF+y*OqsXj$8A*)0f$^~KrTQJNaMNDxBvag=Q}e3fXKe2Eg)pcPi*Sb zZ^q0u$>d*)PB^jOCJ2p;l4<3Y4_P_JPno{0*Y(GUq5B= zn(XBtel`NsNCp_`eGCZo3wJhZ_2;~555wm}n}hb~Z>}ZY#F9djJ{U4E?t@8r40bhB zLmm{k~mZy$Ks)ayJAZ2K!GbqKQFM*dHQMC*HLL-ppG`mk&g&Gq1E# zpO^O>p;ZR5l^E6!TO`AhvhJJ&HR{oG-G#5OIMSmBsF8HQ+c_VK*7%)kjO*ni(=L+` z)Q@45fUOv|QThTH@t1U-IeY)|<;scyP&02O|5D$~%hQeO)FifnTF~cnA4*8ABeDIc ze(&g8&*A#%I#v9w-ZK(*C;I}p&DHNu7G8dG-x631lzKQ#5#;u6ncBH!#5c(s%<0&& zYfG1(#-2IVnGEh^roII05&x|JWcY!5>u37{DfF$@;blEfH=p=QG!pTKi@f2RK5Tj0 zu$)1^RjnjAyrXO8uB4KhXA|#qZd6;e{0G-JUvuHiHEk}I@1-xVZ$EU`_a7(YoqW6@ zSB%;n-qP)!UJ~B5TDPT3SM^QqFX3wr71z7`s-|y`!aK#${jKl4ujbboKZSo9E!2`maJ<(j7w*ALy@PL%JLs~e_ntkS5QlrY$%6r$wL9z%2O|-uH&7&# zyMuuoU#?Rrf>Iy3*x(-aQVG0a1*R6y@ALSgr8w3g&lkX=3{h$&89p=E=?+3pE-c%? z6`$S!9-|q; zrcoc}KCN=nrX#+!?@kIkFzXOOtOl%ESC|4V<sP zcvkQy0v_c!21_kg6M>}q;-twGu9~pdQ|R{6ITe`W3|NRQJ|U>Ze<+veHQa-M=FQ35 z=4=F{)&r2$7cL76$AWvbUVlE&_%C>+;Sa>=3PgO)NVF77Z|P?7kQXnkhp;W)l2D{D z#P%6&8%wS&$j2u{KJgz={}^c46i+!W1lY=>lgEiRct(tahS6u%qf8rm8kvBM<_+8+ zd_veP4hRJuMA)h!#H9nVxOXsvr3@;$fUCf3A!30`iDHE41yp1+wZu&@%}gTU8#hue z9xri0$L7Z!)*@_~>_%38TC!@9i@w=YE3>Qi#05D(n68QUUfp;*8X4=68!fw+~>x^}UK0b4ZE zfhM0|ttr}KjYTnNpwJ)GCY_#!^f{4a+{^B#d4JvqO|Cj`9m0IFD;rK>VbrRHB_;*^ z#7`^-yAsh3PTcG{|=IcfyOzIcn(?UgqjGH)fd#U^bjm?S2x`{8PzggTAZkW2U4+ZP;}#Lz!H9$gyR^AX`AW~Qo(jYpDTqPvtbvHZ zWeg}@HE>jKAQJMy5f29ZrLlCe&myTI6{p7ww&@&J8$&L+L@^b9u^gQ?X~HIDxg()q zln%y7i3AJ7Fjr{IPT5yxAuz}T^Asw7YNv$vw1oGJg!j(84iI-J`t#i|$`}-4i$tL> z>@C2B?@rznUeuLFwOoF;3qci(ZL_l?#ctS%u$Ld`21X10mQ_jop?q9Tm|8~pxRr_t z7$*42+D1hNw$W#HtL*5h!UPrd1;z#wjy8OI zd^tJ5qCecK?Yf-!Y6NEd2jofrS<4E63n1eE$kE=hR#k|QpcMhuCk~TvPUOn)cZ>RE zcnlvCJofn}sxq*-4RmHBZfA@Vurn0w494ami3Pg}*l7xO8e`kq&II&M3VJ6-?`Bgy zmIeW&^j3nMHLi=S31Ocn*ISHR=u%+8gfR&r>S9$`GaTdJy6Nv4cUo4cI(Ct$@&8>0gWLTT-+ftC>se;}uMQ*8wseTo={3u!9Bf>)UDSO}BE zqj}}dTvP&EJL$Ab^CSx3QyRgi3PGP`JlN3%=j>m$FxOAWs_l|Pd`%Q@>LRvCs*TwM2 zgks`ykb+0#C6&Q~+xXEPE$6ltPrRlhH>reZ7&MqH7qU_LxJwjs3y~Dz4_a`on{@yq zx^HYS*@$F`$r$X6pMXiT6j!z{E0$VJlt9%m8yFU|YP|6@H!lbgMk$^ha*K6XvN1)- zLyy3V!Yl!-p3_?poB(gjT^NpFtN`Z=XD|A~5jT!~jk*Hah5ll1cDj>~sKo>dPayNm zMRqV41$9@*+8W788kA6(u7Mt72ApJ_Rp5=f3S5zVnr?DNFttP3=w`CG_})THt~j&( zL3h4w0-htWN=0GzV8AMcx2V7h9QKE-z>pj!30(n9D1@!jA;_zrMbs2Gs-M==K<$KO zP=uJ?fH!~XBydL)L*Y_(TV&(ll_T=mA1-vV%k9d|MJ$@UbN0wNS|vieAW-BaQx{QK zbMgr!K@8_Yd8NunR2~!;D?rfFoLHNXn&vAgDCF6Nf&g?d0Cm%Q4G<)zJJ?AODsIuL zifL?D9Kkp^Q+NR4G7XXvj>LC%bz+N$4>Pr1W&D&z~-s4LCsyqGe*Dig`o5n$ChZHBmfe8VTBQ zr^yS*nzwTGifDOm&eQK^S;!d&5&ZX-koL>TKX14I?IBzWsleo;f9A2OQ-Q`PfIJW9kaT*fR$s?8GTkBW_7*ucFHj z;2N8uNHVH=SUVYs8bWJs?V7XE@PpPQ+tmo9njQ2|6h15;AuXC%mo+Im$cPUyu_6Sj zEGH5Q10i3CLQ>*^+l3tiDq-NMFVI88Ot~53xG#=xw(Qw5J>tSGSWaQAteTi68OUm} zP&#{`pGeDs16}h5Y^mjN58%N@gVZGibD}|?hnA$|_^^oCVj+zt83=2!SXg$IOpaI~ z=G3W7@{u{R#fxK>u;V_khT2sW0vL_7G=#Yg}V*}{>uaZm`<52GYU}{78v}O zLvwaKCAe|GP58q3G8MPq>%#Ida=F zofBL|E)ig-r5PcdAC0jz88S#FLJRe<_6#fWN@>Lv++iAyiDxuzezV{(J|S3*|DbA5 zZ2BM3Dq0Bu#tWpYDR+v^7d2fv@i#F^auT~?7c1WQyB!7`cgh6 zP!>4=HCAG*gR)`b0UJfNg` z!i;JG<3DkEy%8P2`U6S317IG+eM9O%Xa4|a5Y<0X)F!UW6w;&PV}l-B-EIVL{lb{W8D&C(O9<7z>oic%CnzD5-J^M zsfm!@ewRyxMtuR1Gw32vLaADqxb*}JxJ$PXu_hHLYTi`aOfFgZ{5YA4SW|J(0Hw^S z&kP{+=kp}HE$0zLB9IXekda)xY*7&H{JLE%HntiCS;U^pWhfFBo&Z1L3pXV@4byb< zprCn!X_Xx!><-pK(BzOZ+3mFo7#Sr8X`|0@*JU159|(@o;p^6e9GM6N<&(;%MUB88 zVgCbY%44~tlSji6Otq8mZ`aNfqwsd=<=I`xKt6G;GZx~z6lA1$B2S-)A)-b3G^s#O z^HwfbLz5k_HE(JQw#wTnFeqdBsFuVU&sX3he+p>y#P)~FUy1|Vf=(QvR%o>VO_K^l zG;gX}S!8dtBo}0iK9@^~+VuhC8`@PrE}zUtAU2FVl}8AG_C}yf;Dvh7SQ;E6-j7{+ z;ZjxyT!B^~Tyd&oi{j-(a4j{Q9*|caq4D;%OU``IfJ%7;TV%<>7FN;+c`=(s#<4V@ z5PRmV?MzX8*?=DZ0c_Yy71EOJP(E?pu}tv+OT-9j!M&OY`KvGB-@ckjs%<8iFt9^W!Q! zmxs6Ez;(rxfCc%4l*lLH3o<0{8>J;TIFLIYV{_ycrdcv|sh~v;@d=SZ{0EN8*~P8m zvj&a$53CAoF5<=D#Pz#a!Qk>Mf8j4Bq@W3J78y@{Tl-V-sNf?0160aB*3KxgT2pAm zKCnvINy8U(a%aVVQFcVA?7|c|A%Vhw2}SN;v8cD$Y%7?IJ)?|tpewY&0#om;l_y}N z@uiTX=8a`y=OSqQIACkuxWU+B8~A0^ILm>T;Fpn6vd5wcbn@l!m-XKcBYsXCsPP|Q zlIZF`)QaXiH8YD!N=O+`lbdL4&@ESEVu4T|urQXeAszO!OXLr6Uu(CDiB}IGd;W_) z$$q4-G9kE@9I-3Q>xR%j<#|hJ(`k;c#Oonr5z>6IkV;}wWRUo&TosnU0mvkLDHjzi zc*GWHA58-*j~HesbFT$1x6>2O&J{ypKW4^!ZYQom!q&F9PhxR}Sde2;bW5DKmZy{(G-A)?!-N9E!V{i&0+!t0V<8uK9TZ;ymV9C?yA~U- z)rb$+JDp04j9U$ZYz@D&va_!)7v6-j^F29OI!`;#5n^(O(lR^er%IOzD@mL<*F8Iu z*%j-!+{(In5+9~0aQhEtCt^65xq`jNS^rvZuBGqY}|go@!tH3L`krYgSM7s8nnb}T5U;6y`+_$p7dr@)gb1ScMV zLxXo~A40@j(gWYoAI3oz`#P)3=F^Q@(*mNblwT>DZW)gW6O$y6T;|#f4 zt61NO6B4*7d+D$jdWn@bD}r^kUW6?|>1mqhZdL_QQMyru0ks=)qyNCaLd4p}Xi^ag z(q+Q8Yo&2T0V2DI5w)o05{Op4nBkQ&Vq%_nA=~ zQh5};fQ_P9Mt$|vqV>})^hDI&Dw@n~Op5N9{Yj4i|ja_kvi2bNLV zG3@dbI4AjN3?QF?hOW}CImw0?TR{x`*fYo7?5fAGB~!r8R*f}lnvpAy(Ggvi<3DA^ zv)DU`kRS$cd4XA>7wteiHTc(yNWUBk7MhKa2J1;>^1Y+t7&y3iqn>&aQKg}SC2i6!n zoH!{1m8A`ym5Q^pKC<%IT^1T1`Io4o-jT1=01djrnH)EjgAth$)Z~+fS~<|6k3hx$ z{~a2sH1K%mRQcqVc!HU3e*nnozM(di-pCf;iFux4tWI);3p!`$wnFGhBW-$`NbM|$ z6uHZRg6&_0B@!h!Q1~w~3JN3o9Vcdd`CMSGoNUR0m;8%jBW-!9i$W8^zbP_jP`(1^ z;9ipKh{p*OD}}XJ01Y8SWzxV^#rmIRsS1Z`*D%-kB>#QJs1=)hk>bC~Rx}z#dkpi9 zPx4=7tm?R7rYiWq%1{&|)(j1EO-S=!Wvw+cHfqJj&Pj>>Ph@VbS|acNT)AYCV393k zt|t1g%B}4^3^Udys92`T@D3rMq5|X*_s%n-?6`yrF|%Z|^E#FWWMa?Y%05_F;P&Ih zf(YfWJOZza*ah)#jG=~m@}J_%LtmV97B`nDi?>PA8nKi}#A*Ua*Q07O5t9S)AK%N=}z2dY3lb2!}-Av(lAH4M{vI-(!}&NE1v8^o;Z0jya9~UnOxYir zry(C>7ZhX9AYwneZ6)U@1*J4%j+UrWPS_uep-B-oSA?zBR#;_4i`s*Bn2=8d zVZ*pZ!&kTI(v6hXgW+r(%E9U*9yp+67c5TT9?U>-@PAeryU}+7GEEi+aw*^&U)267tuOP_wsaQwhY>8T$%UOsrVoBlcVo zF0cxQj48;-r-~3Edqe`kpNgOhs|Nz&p&}#{Lkl9xBa``;riAP|Nbrnb1!^VMuZeyO zloGyFq-Ze`N@uAht9+{nVeTA3jQ^I8fU!F$4+^nReL4&mInf_<541_lx=Yb`YR3K^ zh#3Rm!^z{CE!eSgtk9Vdt86XAaVGRdji<_hcfyK2tIWjmfCL0&k?;jG4Ddef!seRY zA|Ro8Lj~H;v|1IMw%#hop~MS73*mVXJLeFiw1|geI`RoVseP>o1Fd9Dkzr%+5q&Fr zkBJ^lo`)t8609umE5fmbeq0)m0FtXW68Z&s*FZvAY%tN`3#thT>DY8ybz|w*$7dNs zLD6H+s>EoR1`q1ab053yZBy25z*k=)L3& zrE=t&3%d(&hB8)Oxbr!_Ax^^+=PX!d!iVOGWR!{Kl{2xkv8MThm??}Y+xbNC!UMVZ z4@`qQa4fGBD^*ya%I3R>cw_IJSFQ6tDJL%B!NC$ZM$AGc2`Q0v!WZOie|%hG{veb1 zsa$dpWdpWcjzgP_xZH9CV;NKNdA;5)nHj*APt3ZV=wp;AS20dP4@#5ic9`*15G!(Q zKQ5gVV@D%apTxCNx7@Pryb{_DNP}=7Dv!XE^N$u49&4Gzu+mClpzJYA(Z!*g1)hB3 z#d&rmWGPWzWERw|<#H{UFbr-#7RF*#FQ>8KJuV#;T#JV~lWWog*eHS%K{ReN5=8^(0Lfqh zo#6qif;G;({Q(ZR2-`Zbqb}R(4g{PdNXtp-Pr3Y0Em`1cU%{+>%&cOo7-84Rw?u|& z0jWxC!>utXiRK^+=RzSwq-$IXR(IZwm;-WT-cCV~Tq!o>zs;q3Z-ytG1Aoq(; zND>c_Al(FHZND^mQXENHmsqaJ7`0Hq6s0S#O;T5c0#(DVT`v-=fjB({4PyY<;VCm4 z87RmYKFLWzo(bd|kV$^p)`Hj}`%}&w+}vSNnQ9_%r@oYLqD#Y&8mlai9{~mM`*{>7 zpOBy2y~&5u(hUt3Oyju3yr3@(j^z{3<#tF5tQckB#hxL0`y=ua&!wZIN$ut@V$KS3 zi#?a?I0C)nLLBlKnU*2iUNxvW^A~w*-XJA8SA!L(2!vqOV;=U<_`TUU*~&t26mp;w zV?a%LWQ}E(lF=9gDaCm{OEqIS;Zr&w+c#Vv=H)2N#(&wxw2KnNJXw>YX2{CebxCOB zba@@Qsmh~TR0|OqoIz``oo=)-K3f;I~yAifFT~3O}jk~ z=u+r_5+KPZ#L9sEM*ybBl1!Luc8&P zcU+pvwjgF)to1#X4CRSEqq3+wLzUB!=PtVR$Sb#r<0e-N{V_ig*nZWHtH6UTsR6P! z%A?Rd;=>|Ol`&wdFWi^0u+WY93vmK~pH3F^ILU_cqJ7@&M<+z{5HbL(;KgNC=Er9y zCPj9MpV&g$nG6hAX+a460h9J48Vyned7L%gc){jOCRW7* zo%yLOD-$zj^j+L7iGdRCuA&x2-z=I^1Th$zz~#T?8vJ2lTCSG{9pa%}oMY*LSi>(K zFxt0oY%%VURqPoY%E1u^Pad2UnoW1i(R7>koi5#C-`(zLBQ+6~hvKb_!D?XFv=TEU zHY3TDHAEt>_|T@o35Pg8-^ylFDJRO(P9$}bhcsDKA2#qsg!;-SpxK|ZVZfH)Uh;@$ zBex@I!&g>pXyRm`q{U)k*tx24452b5H+W*pV^cjV;S0E%c*f{qrj#=n6r@`w1kO`Hr9jI#H64VL*v-6UFXDx!>`<= zB3Z#ajhJJhP2_UGB@?3m!kHBo0*y)GBb2KvolC%#LFihE86uzIKu%L_&?Mx zUHGQ*vKVK?oy;dUmsq=DaW~8m=h_=*(0kg4DUD9WkHsV`WJc%BiG6kQ3Ax!H?VIQ2 zfhhgq^gPBQ?^|2r?KFD7ZF$5~iv1Fb=~>)rAPR(@8E- zEK#L6j0uF8ga*O;%8DhXVUzNLIR?6m2&cgKX|axlvcxcC-pY(Q$wRWCu%&>wNw7(b zeNhhj7FVs}h{iB!jzYlZAXO!qHcN_Q*aZVEau<^Gd3@2**dgR9Z;)O&ZnKJ!7kVMp zgP7#=%Bc$MBh*US5-LPn)cC4`aHWZ4Uxiw*MeW7XfMD#I>&LdoP&i8=y&-ww56UF{ zDHNVG(z?ORM1(9AI2KSNj}dah1_VUJBJha#22`Am4(HxUqffY%&^XM9;f(eu&O3DS zRYw*@RTCjU^#v^34@8+Zq46nkba)i&mb}0{3O9r1PO%9Ymo3uPaSJxoL{#h;hT6xY z;wUPv&UjnoAKyHH9{+)t;c&YSVZ{q}oI}u-SCVU!5i=Sr^?Yy~ zu8G-voXqAb#3gfd;7TC&sW5DHrkXYx$ZKEO$Fi&TFqs`}fQgNAEJQ>53lc7s0J6bX zZalU*>&vVyfGP=fIyoy82o6)f~Q%Qs3#W1aygX%4h+4ilZ~P6&0!l-R;x#U}*W_z&FG+BHaBI|3QqH*uvAX5(nIB;uRgGC83WQ_vW) z`P@845_fs3-_&Eqt$V__bl@TGyWt~pV#4XNo5`-gVvW3fRX#h%%` z*-e;f#)QDtydhsYfg4TLR}jK&t+>|{Yo>U_ZSU=3PLmUXq>2H4lt5^z7iFL}3+ zo(K&SB8Q8qE3|K}YJ>&@4jOepJ{*-`OMnSW8dcCZIFO6^JB!>!dcM~_7RLcEMxRj{ z`$=STCP393$bKg)Fkdt7#hES$6(<*1uI>@H`+}~#=9d=R*v;i>J2PJPEC!5lguS`p zAg&u@ ziolFLb9clFo8^nRaQ3#iT`wz?pNl1`-0xyZnpGoDObY5TG$?5~mPy3r40Lh7AKh%o z(Fa5bx{Jmm?xxHdN1=sI+D}g00;ePscL8Rxf}~O+@j*!vyZtX~94k)jof247bu1ki zj6Ijj15&&v9E1DBNdH-T>gVq zRg8&-T-??IU(9Fa+h|ges8t*uOWBo-c0bANfUS9BW5VqkOU1KsOA}9&p)=%_NW7jn znU@`^?^Y^I>yMFvScgmww_S8EAy+C|JRdyR;o>O(R#pop;?ijdG9Hg)?WDzK8v|${ zE01c;S>&AO3VZUf$RroboDs~$z=holqtEQ-@Ot9dB9Dn!lplv`krQ^3ORP5X8j+)alq&3?j{#x8o!9#S=R>c36o;K$eN0xFx3Xx&oMCG2xevMGkZt z11-0St-3=1HQy5~4u~W?F)8DuSu{}KRi50LSf4JeMI@2Y1gE5fX00)h_$p$qbV)P@ z={V3lpro`Atu`6xYhT%jvdCmC1H*qzG0OO@{1%JJ$@htvD%GTlfr$k=j2JD^)zGv7;tp1`IND?+B@Gs)b@}vdrGmzJmTgXk53N$ruTzEUbhthLq5?9QY z#0D}J`Nkv)%-A#M$&M}d-r=h10G}U*#ms?R%PSoXQiH6)SCX_a8DeF&m|y_cm`I40 z%F^&NE;|#~xd$zmkC>sT^3YM^LfV@c$bf`= z;=q($_u-208Y=q3y_a1Wj2K8XJ|sDV&)j|48DVKisK*8w?zqYE?~>fvj&shEZH$sX zzpxW3W)5l5i;R!MOhv<3@nLR_*h`O3O`_D(C|BjinMKfvdj|!%T#I7+IPWyxsPN}p)0IK$t@$IZD&1%9Ur=CrDL_I0%R4mjl z)^!3i_KbqcRfvfCpfAJGA&@MlQ!)2~^HJ$&d<&9lBG6P{Kor4KyI2IL_fTwIKB4%T zGAeD6X9AxjhIr0dimY!~!tN@KmB@l-d_s_n|4^=a<;@lOyn|YKM7>Y|)Y=z~`8mjz zT@{2w>@?57q+zKNwx!xNR*4v^e&iW@=GLBWr+$(`oVDRP&^T$3ms|*7A#>q*hGMJi z!XaApBIh|Q@W{iVu>>+z9?=ch>kXV-r@NT?Px-`c+^%*gEyaH&8a%3O6kCp!k+iA~P9DGC4}!ZSy-RG{ zn|eGWa+d_b69|9+HYuh+WXi14&`)|G>P{J($f#W|f?n>2gK2wECLn#B2V?~RExcK^ zysA+HR+TpuNQBq+=YG%`V!yUw6Gvm8sIg^^4OV9xa%%D|n_Lh;^@CLlY9u{WAJeO5 zWR1PLZu|SBchWUzAas^128Nu2V&(3fAA$*)(JrC|nfhYmYmRYc)}}t1INePUibT9@ zPS%3^!gVZ)2b!f;N>E37cLwNj`+V8HfDB((-;72Yc5|o8-|dIrJIf#kW>!3fsOR=U zBM?X*Hj?v2RHF^wS0WY6?aUGRD`zBBCp_WG$RwaU2Jwi`nE9d9n3qGVy&;_wV=spQ zsAAuuTsGJWH)Pi0r60un3-rUT#u4;XW=#V^GquEIx?RNM*u?S3O1-g2QW0}uegD>! zif7`3TPZJmdCK|k*T>g8cZ)w>2a!V5RjE(5_nKE8fiB(C63P62`i2|{<-R}NFjeEG z>M)#kjt)wqb56hQxhCcQT9$v>D3}V$lGm(SEIQ2&l3NNiGAx<<>sS#+JX)WYq(HExt>kokz7AOI8=z{h>xhSK2AulM z6Yz;iOF4yrD6^bEEd>h$r{1~U9Ho+VqLFW3T8b4-IP)*g}C#|*Z#BaPWAa+4amGrcY0 zp#Aod!Ldmrh706*%dYA{91987m{}*g?2jDL)bp!;S*t|-R};6LelVR?1noTL)cBWnJnnmyl1gc9#9i%c3yGW=<501HC^-c*3VeRpm=#mRqX5k zJUr=cLSvkhMl2%kYvITROnVBmNLDaM_0iv)??7#ytRjjH(@^pgKrFMOa4=p*A)8t* zJtcpx&KB-fqqPdmDqeo#i>Qv(+{AeGuxOYos-`D+4e1;Xy-|Eg!mv0`=Uf|rJS7Rz zIn)>tyCQ$j9FAyNT*xaRo!rlDqc5LrA6@Z&GM3ox=Mg~RThr~l9D=yX#ssb{k{{LohC8aB>%?VRlJF$|>cc+P> z6fG4w8jL-1#kvwIi<+Kd+r-+C!*D-~9@sCd=2MCu*1@vs7&WWBE%xX@vKTqLzl3T| zYMq5txforl7C9pj5y#U^6%d*yHeMkq)U>3lzm0D{ySI@ydP+zJ&qCAt!inA^`QV^< zNuuc!`lwq5W;K?c=aTwb*-V-8m`f&Bs}80B5*;f67v1YDk{OuRGl1Fee}htvLxxyB zE1=&n*(T1hNvR!t%VL69)LON;#8p-?gS7Mh#agPC2Z&VpqFbG=%nZHLdE9M@p8(V< zUqGFys@Y1TH}ld)wV>i!_8!#XpCM>~K+JyMAyiu7CM>wTKcYJe8}V`)NUH#)m#0Tx z8R$(Uc?~LaR8YYpXU9bt%x-45rm+Ozlqvcfcj!290#V(5lUer4{w(Mz-DI}tw8Wbj z5ez8K1$`h|lbx3EP>Msgcl~%&{D) zCoso!>ULV(-!FUYLw_K->OEiHIGSvW7&1rzW zOE&vCiQaI9fU`6xw_!MZ9pq%2N5!9*rXyUAOJF^WN{;JRfN$Oyla(|$o#8gtFnwA~ zf(hW7Cv0yI;Msvf&`n}KybSo%*||D)IdPr^lFo`sk82dz=N3a-MVjg~Q5OVa{b1Fa zSVYrUbn|sfRs(s)s^`;kc0t14Ci8Du3O~2`PH%`=y~pu~Zg^^y1l~44_4biXm$8gr cK0io7`tjk=0.8.9; + +error InvalidUnlockTime(uint256 unlockTime); +error NotOwner(address owner); +error UnlockTimeNotReached(uint256 unlockTime); + +contract Lock { + uint256 public unlockTime; + address payable public owner; + + event Withdrawal(uint256 amount, uint256 when); + + constructor(uint256 _unlockTime) payable { + if (block.timestamp >= _unlockTime) { + revert InvalidUnlockTime(_unlockTime); + } + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + if (block.timestamp < unlockTime) { + revert UnlockTimeNotReached(unlockTime); + } + + if (msg.sender != owner) { + revert NotOwner(owner); + } + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/deploy/deploy.ts b/deploy/deploy.ts new file mode 100644 index 00000000..f09cf438 --- /dev/null +++ b/deploy/deploy.ts @@ -0,0 +1,24 @@ +import { DeployFunction } from "hardhat-deploy/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +const DAY_IN_SECONDS = 60 * 60 * 24; +const NOW_IN_SECONDS = Math.round(Date.now() / 1000); +const UNLOCK_IN_X_DAYS = NOW_IN_SECONDS + DAY_IN_SECONDS * 1; // 1 DAY + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { deployer } = await hre.getNamedAccounts(); + const { deploy } = hre.deployments; + const lockedAmount = hre.ethers.parseEther("0.01").toString(); + + const lock = await deploy("Lock", { + from: deployer, + args: [UNLOCK_IN_X_DAYS], + log: true, + value: lockedAmount, + }); + + console.log(`Lock contract: `, lock.address); +}; +export default func; +func.id = "deploy_lock"; // id required to prevent reexecution +func.tags = ["Lock"]; diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 00000000..1e910162 --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,125 @@ +import "@nomicfoundation/hardhat-toolbox"; +import "hardhat-deploy"; +import type { HardhatUserConfig } from "hardhat/config"; +import { vars } from "hardhat/config"; +import type { NetworkUserConfig } from "hardhat/types"; + +import "./tasks/accounts"; +import "./tasks/lock"; + +// Run 'npx hardhat vars setup' to see the list of variables that need to be set + +const mnemonic: string = vars.get("MNEMONIC"); +const infuraApiKey: string = vars.get("INFURA_API_KEY"); + +const chainIds = { + "arbitrum-mainnet": 42161, + avalanche: 43114, + bsc: 56, + ganache: 1337, + hardhat: 31337, + mainnet: 1, + "optimism-mainnet": 10, + "polygon-mainnet": 137, + "polygon-mumbai": 80001, + sepolia: 11155111, +}; + +function getChainConfig(chain: keyof typeof chainIds): NetworkUserConfig { + let jsonRpcUrl: string; + switch (chain) { + case "avalanche": + jsonRpcUrl = "https://api.avax.network/ext/bc/C/rpc"; + break; + case "bsc": + jsonRpcUrl = "https://bsc-dataseed1.binance.org"; + break; + default: + jsonRpcUrl = "https://" + chain + ".infura.io/v3/" + infuraApiKey; + } + return { + accounts: { + count: 10, + mnemonic, + path: "m/44'/60'/0'/0", + }, + chainId: chainIds[chain], + url: jsonRpcUrl, + }; +} + +const config: HardhatUserConfig = { + defaultNetwork: "hardhat", + namedAccounts: { + deployer: 0, + }, + etherscan: { + apiKey: { + arbitrumOne: vars.get("ARBISCAN_API_KEY", ""), + avalanche: vars.get("SNOWTRACE_API_KEY", ""), + bsc: vars.get("BSCSCAN_API_KEY", ""), + mainnet: vars.get("ETHERSCAN_API_KEY", ""), + optimisticEthereum: vars.get("OPTIMISM_API_KEY", ""), + polygon: vars.get("POLYGONSCAN_API_KEY", ""), + polygonMumbai: vars.get("POLYGONSCAN_API_KEY", ""), + sepolia: vars.get("ETHERSCAN_API_KEY", ""), + }, + }, + gasReporter: { + currency: "USD", + enabled: process.env.REPORT_GAS ? true : false, + excludeContracts: [], + src: "./contracts", + }, + networks: { + hardhat: { + accounts: { + mnemonic, + }, + chainId: chainIds.hardhat, + }, + ganache: { + accounts: { + mnemonic, + }, + chainId: chainIds.ganache, + url: "http://localhost:8545", + }, + arbitrum: getChainConfig("arbitrum-mainnet"), + avalanche: getChainConfig("avalanche"), + bsc: getChainConfig("bsc"), + mainnet: getChainConfig("mainnet"), + optimism: getChainConfig("optimism-mainnet"), + "polygon-mainnet": getChainConfig("polygon-mainnet"), + "polygon-mumbai": getChainConfig("polygon-mumbai"), + sepolia: getChainConfig("sepolia"), + }, + paths: { + artifacts: "./artifacts", + cache: "./cache", + sources: "./contracts", + tests: "./test", + }, + solidity: { + version: "0.8.19", + settings: { + metadata: { + // Not including the metadata hash + // https://github.com/paulrberg/hardhat-template/issues/31 + bytecodeHash: "none", + }, + // Disable the optimizer when debugging + // https://hardhat.org/hardhat-network/#solidity-optimizer-support + optimizer: { + enabled: true, + runs: 800, + }, + }, + }, + typechain: { + outDir: "types", + target: "ethers-v6", + }, +}; + +export default config; diff --git a/package.json b/package.json new file mode 100644 index 00000000..f4605af7 --- /dev/null +++ b/package.json @@ -0,0 +1,79 @@ +{ + "name": "@prb/hardhat-template", + "description": "Hardhat-based template for developing Solidity smart contracts", + "version": "1.0.0", + "author": { + "name": "Paul Razvan Berg", + "url": "https://github.com/PaulRBerg" + }, + "devDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", + "@nomicfoundation/hardhat-ethers": "^3.0.5", + "@nomicfoundation/hardhat-network-helpers": "^1.0.10", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.2", + "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", + "@types/chai": "^4.3.11", + "@types/fs-extra": "^11.0.4", + "@types/mocha": "^10.0.6", + "@types/node": "^20.10.4", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "chai": "^4.3.10", + "cross-env": "^7.0.3", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "ethers": "^6.9.0", + "fs-extra": "^11.2.0", + "hardhat": "^2.19.2", + "hardhat-deploy": "^0.12.1", + "hardhat-gas-reporter": "^1.0.9", + "lodash": "^4.17.21", + "mocha": "^10.2.0", + "prettier": "^3.1.1", + "prettier-plugin-solidity": "^1.2.0", + "rimraf": "^5.0.5", + "solhint": "^4.0.0", + "solhint-plugin-prettier": "^0.1.0", + "solidity-coverage": "^0.8.5", + "ts-generator": "^0.1.1", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^5.3.3" + }, + "files": [ + "contracts" + ], + "keywords": [ + "blockchain", + "ethers", + "ethereum", + "hardhat", + "smart-contracts", + "solidity", + "template", + "typescript", + "typechain" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "clean": "rimraf ./artifacts ./cache ./coverage ./types ./coverage.json && bun run typechain", + "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", + "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && bun run typechain", + "deploy:contracts": "hardhat deploy", + "lint": "bun run lint:sol && bun run lint:ts && bun run prettier:check", + "lint:sol": "solhint --max-warnings 0 \"contracts/**/*.sol\"", + "lint:ts": "eslint --ignore-path ./.eslintignore --ext .js,.ts .", + "postcompile": "bun run typechain", + "prettier:check": "prettier --check \"**/*.{js,json,md,sol,ts,yml}\"", + "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", + "task:deployLock": "hardhat task:deployLock", + "task:withdraw": "hardhat task:withdraw", + "test": "hardhat test", + "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain" + } +} diff --git a/tasks/accounts.ts b/tasks/accounts.ts new file mode 100644 index 00000000..9174751e --- /dev/null +++ b/tasks/accounts.ts @@ -0,0 +1,9 @@ +import { task } from "hardhat/config"; + +task("accounts", "Prints the list of accounts", async (_taskArgs, hre) => { + const accounts = await hre.ethers.getSigners(); + + for (const account of accounts) { + console.log(account.address); + } +}); diff --git a/tasks/lock.ts b/tasks/lock.ts new file mode 100644 index 00000000..47aa8c2a --- /dev/null +++ b/tasks/lock.ts @@ -0,0 +1,63 @@ +import { task } from "hardhat/config"; +import type { TaskArguments } from "hardhat/types"; + +function distance(past: number, future: number): string { + // get total seconds between the times + let delta = future - past; + + // calculate (and subtract) whole days + const days = Math.floor(delta / 86400); + delta -= days * 86400; + + // calculate (and subtract) whole hours + const hours = Math.floor(delta / 3600) % 24; + delta -= hours * 3600; + + // calculate (and subtract) whole minutes + const minutes = Math.floor(delta / 60) % 60; + delta -= minutes * 60; + + // what's left is seconds + const seconds = delta % 60; // in theory the modulus is not required + + return `${days} day(s), ${hours} hour(s), ${minutes} minute(s) and ${seconds} second(s)`; +} + +task("task:withdraw", "Calls the withdraw function of Lock Contract") + .addOptionalParam("address", "Optionally specify the Lock address to withdraw") + .addParam("account", "Specify which account [0, 9]") + .setAction(async function (taskArguments: TaskArguments, hre) { + const { ethers, deployments } = hre; + + const Lock = taskArguments.address ? { address: taskArguments.address } : await deployments.get("Lock"); + + const signers = await ethers.getSigners(); + console.log(taskArguments.address); + + const lock = await ethers.getContractAt("Lock", Lock.address); + + const initialBalance = await ethers.provider.getBalance(Lock.address); + await lock.connect(signers[taskArguments.account]).withdraw(); + const finalBalance = await ethers.provider.getBalance(Lock.address); + + console.log("Contract balance before withdraw", ethers.formatEther(initialBalance)); + console.log("Contract balance after withdraw", ethers.formatEther(finalBalance)); + + console.log("Lock Withdraw Success"); + }); + +task("task:deployLock", "Deploys Lock Contract") + .addParam("unlock", "When to unlock funds in seconds (number of seconds into the futrue)") + .addParam("value", "How much ether you intend locking (in ether not wei, e.g., 0.1)") + .setAction(async function (taskArguments: TaskArguments, { ethers }) { + const NOW_IN_SECONDS = Math.round(Date.now() / 1000); + + const signers = await ethers.getSigners(); + const lockedAmount = ethers.parseEther(taskArguments.value); + const unlockTime = NOW_IN_SECONDS + parseInt(taskArguments.unlock); + const lockFactory = await ethers.getContractFactory("Lock"); + console.log(`Deploying Lock and locking ${taskArguments.value} ETH for ${distance(NOW_IN_SECONDS, unlockTime)}`); + const lock = await lockFactory.connect(signers[0]).deploy(unlockTime, { value: lockedAmount }); + await lock.waitForDeployment(); + console.log("Lock deployed to: ", await lock.getAddress()); + }); diff --git a/test/lock/Lock.fixture.ts b/test/lock/Lock.fixture.ts new file mode 100644 index 00000000..4ffe253e --- /dev/null +++ b/test/lock/Lock.fixture.ts @@ -0,0 +1,22 @@ +import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { ethers } from "hardhat"; + +import type { Lock } from "../../types/Lock"; +import type { Lock__factory } from "../../types/factories/Lock__factory"; + +export async function deployLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await ethers.getSigners(); + + const Lock = (await ethers.getContractFactory("Lock")) as Lock__factory; + const lock = (await Lock.deploy(unlockTime, { value: lockedAmount })) as Lock; + const lock_address = await lock.getAddress(); + + return { lock, lock_address, unlockTime, lockedAmount, owner, otherAccount }; +} diff --git a/test/lock/Lock.ts b/test/lock/Lock.ts new file mode 100644 index 00000000..932df747 --- /dev/null +++ b/test/lock/Lock.ts @@ -0,0 +1,102 @@ +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { ethers } from "hardhat"; + +import type { Signers } from "../types"; +import { deployLockFixture } from "./Lock.fixture"; + +describe("Lock", function () { + before(async function () { + this.signers = {} as Signers; + + const signers = await ethers.getSigners(); + this.signers.admin = signers[0]; + + this.loadFixture = loadFixture; + }); + + describe("Deployment", function () { + beforeEach(async function () { + const { lock, lock_address, unlockTime, owner, lockedAmount } = await this.loadFixture(deployLockFixture); + this.lock = lock; + this.lock_address = lock_address; + this.unlockTime = unlockTime; + this.owner = owner; + this.lockedAmount = lockedAmount; + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const latestTime = await time.latest(); + const Lock = await ethers.getContractFactory("Lock"); + await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWithCustomError(Lock, "InvalidUnlockTime"); + }); + + it("Should set the right unlockTime", async function () { + expect(await this.lock.unlockTime()).to.equal(this.unlockTime); + }); + + it("Should set the right owner", async function () { + expect(await this.lock.owner()).to.equal(this.owner.address); + }); + + it("Should receive and store the funds to lock", async function () { + expect(await ethers.provider.getBalance(this.lock_address)).to.equal(this.lockedAmount); + }); + }); + + describe("Withdrawals", function () { + beforeEach(async function () { + const { lock, unlockTime, owner, lockedAmount, otherAccount } = await this.loadFixture(deployLockFixture); + this.lock = lock; + this.unlockTime = unlockTime; + this.owner = owner; + this.lockedAmount = lockedAmount; + this.otherAccount = otherAccount; + }); + + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + await expect(this.lock.withdraw()).to.be.revertedWithCustomError(this.lock, "UnlockTimeNotReached"); + }); + + it("Should revert with the right error if called from another account", async function () { + // We can increase the time in Hardhat Network + await time.increaseTo(this.unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(this.lock.connect(this.otherAccount).withdraw()).to.be.revertedWithCustomError( + this.lock, + "NotOwner", + ); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + // Transactions are sent using the first signer by default + await time.increaseTo(this.unlockTime); + + await expect(this.lock.withdraw()).not.to.be.reverted; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + await time.increaseTo(this.unlockTime); + + await expect(this.lock.withdraw()).to.emit(this.lock, "Withdrawal").withArgs(this.lockedAmount, anyValue); // We accept any value as `when` arg + }); + }); + + describe("Transfers", function () { + it("Should transfer the funds to the owner", async function () { + await time.increaseTo(this.unlockTime); + + await expect(this.lock.withdraw()).to.changeEtherBalances( + [this.owner, this.lock], + [this.lockedAmount, -this.lockedAmount], + ); + }); + }); + }); +}); diff --git a/test/types.ts b/test/types.ts new file mode 100644 index 00000000..645314ee --- /dev/null +++ b/test/types.ts @@ -0,0 +1,17 @@ +import type { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/dist/src/signer-with-address"; + +import type { Lock } from "../types/Lock"; + +type Fixture = () => Promise; + +declare module "mocha" { + export interface Context { + lock: Lock; + loadFixture: (fixture: Fixture) => Promise; + signers: Signers; + } +} + +export interface Signers { + admin: SignerWithAddress; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..734e21a2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDecoratorMetadata": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "lib": ["es2020"], + "module": "commonjs", + "moduleResolution": "node", + "noImplicitAny": true, + "removeComments": true, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "es2020" + }, + "exclude": ["node_modules"], + "files": ["./hardhat.config.ts"], + "include": ["src/**/*", "tasks/**/*", "test/**/*", "deploy/**/*", "types/"] +}