From 5b925b01a065b3b01ba6ca539e2ad995dee70ee4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Mar 2026 15:51:13 +0000 Subject: [PATCH 1/3] Initial plan From d1d869a73909c30f9b28173d832123e173fb8ac2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Mar 2026 16:02:07 +0000 Subject: [PATCH 2/3] Fix medium-severity security issues: shell safety flags, leaked URLs, hash verification, RPC error handling Co-authored-by: numbers-official <181934381+numbers-official@users.noreply.github.com> --- README.md | 6 +-- api/env.sh | 1 + api/health.health.sh | 1 + api/info.getNetworkID.sh | 1 + api/info.getNetworkName.sh | 1 + api/info.getNodeID.sh | 1 + api/info.getVMs.sh | 1 + api/info.isBootstrapped.sh | 1 + api/info.peers.sh | 1 + api/metrics.sh | 1 + api/platform.getBlockchainStatus.sh | 1 + api/platform.getBlockchains.sh | 1 + api/platform.getCurrentValidators.mainnet.sh | 1 + api/platform.getCurrentValidators.sh | 1 + api/platform.getPendingValidators.sh | 1 + api/platform.getSubnets.sh | 1 + api/platform.getValidatorsAt.sh | 1 + api/platform.validatedBy.sh | 1 + api/platform.validates.sh | 1 + chains/backup-validator.sh | 1 + chains/devnet/README.md | 21 +++++++++ chains/install-subnet-cli.sh | 2 + chains/update-validator-mainnet.sh | 11 ++++- chains/update-validator-testnet.sh | 11 ++++- genesis/README.md | 21 +++++++++ rpc/__pycache__/rpc_test.cpython-312.pyc | Bin 0 -> 3835 bytes rpc/rpc_test.py | 41 ++++++++++++++---- subnet-cli/install-subnet-cli.sh | 2 + ...subnet-cli-add-subnet-validator-mainnet.sh | 3 +- ...subnet-cli-add-subnet-validator-testnet.sh | 3 +- subnet-cli/subnet-cli-create-vmid.sh | 1 + subnet-cli/subnet-cli-status-blockchain.sh | 1 + subnet-cli/subnet-cli-wizard-mainnet.sh | 1 + subnet-cli/subnet-cli-wizard.sh | 1 + 34 files changed, 128 insertions(+), 16 deletions(-) create mode 100644 chains/devnet/README.md create mode 100644 genesis/README.md create mode 100644 rpc/__pycache__/rpc_test.cpython-312.pyc diff --git a/README.md b/README.md index c207e4b..9ff3493 100644 --- a/README.md +++ b/README.md @@ -342,7 +342,7 @@ Before validation staking expires, any wallet can not stake to a validator again Validator version distributions: [mainnet](https://explorer-xp.avax.network/validators), [testnet](https://explorer-xp.avax-test.network/validators) -[Renew Numbers Validators](https://app.asana.com/0/1202305127727547/1202919355642524/f) (internal task) +Renew Numbers Validators (see internal task tracker) ## Import Existing L1 in Avalanche CLI @@ -461,7 +461,7 @@ Notes 1. When upgrading node, you need to upgrade EVM and plugins as well. - > [jpop32 — 05/12/2021](https://discord.com/channels/578992315641626624/757576823570825316/841775940706762762) + > [Community discussion — 05/12/2021](https://discord.com/invite/numprotocol) > Plugin is the part of the installation. And it has to be upgraded along with the main executable, yes. Since `avalanchego v1.9.6`, there are two breaking changes @@ -950,4 +950,4 @@ Make a Full Node instance to be an Archive Node instance: --data '{"method":"debug_traceTransaction","params":["0x7d2dec6c3e7ce2a387d988a0603ce7de6d487d6aeaf6b58eabdb123161cee0a2"],"id":1,"jsonrpc":"2.0"}' ``` - [Discord discussion](https://discord.com/channels/578992315641626624/905684871731634196/1026850988042244247) + [Discord discussion](https://discord.com/invite/numprotocol) diff --git a/api/env.sh b/api/env.sh index bbb7296..950717b 100644 --- a/api/env.sh +++ b/api/env.sh @@ -1 +1,2 @@ +set -euo pipefail URL="127.0.0.1:9650" diff --git a/api/health.health.sh b/api/health.health.sh index f1c51d2..959506e 100755 --- a/api/health.health.sh +++ b/api/health.health.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail curl -X POST --data '{ "jsonrpc":"2.0", diff --git a/api/info.getNetworkID.sh b/api/info.getNetworkID.sh index bfcdb81..8d169b6 100755 --- a/api/info.getNetworkID.sh +++ b/api/info.getNetworkID.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail source env.sh diff --git a/api/info.getNetworkName.sh b/api/info.getNetworkName.sh index 4a3b144..d3023a3 100755 --- a/api/info.getNetworkName.sh +++ b/api/info.getNetworkName.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail source env.sh diff --git a/api/info.getNodeID.sh b/api/info.getNodeID.sh index e3c6c95..282dc22 100755 --- a/api/info.getNodeID.sh +++ b/api/info.getNodeID.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Pre-running a node on Chainstake # diff --git a/api/info.getVMs.sh b/api/info.getVMs.sh index af97938..9ea760d 100755 --- a/api/info.getVMs.sh +++ b/api/info.getVMs.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail source env.sh diff --git a/api/info.isBootstrapped.sh b/api/info.isBootstrapped.sh index 2940dfd..64695fe 100755 --- a/api/info.isBootstrapped.sh +++ b/api/info.isBootstrapped.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Note: The bootstrapping process takes approximately 50–100 hours and requires 100 GB of space. # https://chainstack.com/avalanche-subnet-tutorial-series-running-a-local-avalanche-node-on-fuji-testnet/ diff --git a/api/info.peers.sh b/api/info.peers.sh index 7fa32b2..895e5dd 100755 --- a/api/info.peers.sh +++ b/api/info.peers.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # Snow echo "========== Snow nodes information ==========" diff --git a/api/metrics.sh b/api/metrics.sh index a527772..5678da7 100755 --- a/api/metrics.sh +++ b/api/metrics.sh @@ -1,3 +1,4 @@ #!/bin/bash +set -euo pipefail curl -X POST 127.0.0.1:9650/ext/metrics diff --git a/api/platform.getBlockchainStatus.sh b/api/platform.getBlockchainStatus.sh index e6b1c25..19d064b 100755 --- a/api/platform.getBlockchainStatus.sh +++ b/api/platform.getBlockchainStatus.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # { # "id": "fdesjrz477ot2iuUKdrGUephzHEfMN6AayMaWGXxhnZfkGRYr", diff --git a/api/platform.getBlockchains.sh b/api/platform.getBlockchains.sh index 66ef57b..3b2e62a 100755 --- a/api/platform.getBlockchains.sh +++ b/api/platform.getBlockchains.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail source env.sh diff --git a/api/platform.getCurrentValidators.mainnet.sh b/api/platform.getCurrentValidators.mainnet.sh index fba79f6..07c0098 100755 --- a/api/platform.getCurrentValidators.mainnet.sh +++ b/api/platform.getCurrentValidators.mainnet.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Note: The bootstrapping process takes approximately 50–100 hours and requires 100 GB of space. # https://chainstack.com/avalanche-subnet-tutorial-series-running-a-local-avalanche-node-on-fuji-testnet/ diff --git a/api/platform.getCurrentValidators.sh b/api/platform.getCurrentValidators.sh index 0e0f743..934033b 100755 --- a/api/platform.getCurrentValidators.sh +++ b/api/platform.getCurrentValidators.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Note: The bootstrapping process takes approximately 50–100 hours and requires 100 GB of space. # https://chainstack.com/avalanche-subnet-tutorial-series-running-a-local-avalanche-node-on-fuji-testnet/ diff --git a/api/platform.getPendingValidators.sh b/api/platform.getPendingValidators.sh index 8c9402d..e22ec5f 100755 --- a/api/platform.getPendingValidators.sh +++ b/api/platform.getPendingValidators.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Note: The bootstrapping process takes approximately 50–100 hours and requires 100 GB of space. # https://chainstack.com/avalanche-subnet-tutorial-series-running-a-local-avalanche-node-on-fuji-testnet/ diff --git a/api/platform.getSubnets.sh b/api/platform.getSubnets.sh index 3fde414..27d7447 100755 --- a/api/platform.getSubnets.sh +++ b/api/platform.getSubnets.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail # # Note: The bootstrapping process takes approximately 50–100 hours and requires 100 GB of space. # https://chainstack.com/avalanche-subnet-tutorial-series-running-a-local-avalanche-node-on-fuji-testnet/ diff --git a/api/platform.getValidatorsAt.sh b/api/platform.getValidatorsAt.sh index 66ee968..9983740 100755 --- a/api/platform.getValidatorsAt.sh +++ b/api/platform.getValidatorsAt.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail SUBNET_ID="$1" diff --git a/api/platform.validatedBy.sh b/api/platform.validatedBy.sh index 236114c..d50f0b8 100755 --- a/api/platform.validatedBy.sh +++ b/api/platform.validatedBy.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail BLOCKCHAIN_ID="$1" diff --git a/api/platform.validates.sh b/api/platform.validates.sh index a41d4a7..153a9a1 100755 --- a/api/platform.validates.sh +++ b/api/platform.validates.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail SUBNET_ID="$1" diff --git a/chains/backup-validator.sh b/chains/backup-validator.sh index a690c58..8ecf490 100755 --- a/chains/backup-validator.sh +++ b/chains/backup-validator.sh @@ -1,4 +1,5 @@ #!/bin/sh +set -eu # Backup Avalanche validator diff --git a/chains/devnet/README.md b/chains/devnet/README.md new file mode 100644 index 0000000..a061e9d --- /dev/null +++ b/chains/devnet/README.md @@ -0,0 +1,21 @@ +# DEVELOPMENT ONLY + +> ⚠️ **WARNING**: This directory contains devnet (development network) configuration files. Do NOT use these files for production (mainnet/testnet) deployments. + +## Chain ID + +- **Devnet chain ID**: `10509` +- **Testnet chain ID**: `10508` +- **Mainnet chain ID**: `10507` + +Verify the chain ID in deployment scripts before proceeding. Using the wrong genesis file could result in funds allocated to the wrong address or network. + +## Token Allocation + +The devnet genesis allocates a large token balance for development and testing purposes only. This allocation is intentionally disproportionate and must never be used in production. + +## Files + +| File | Description | +|------|-------------| +| `genesis.json` | Devnet genesis configuration (DEVELOPMENT ONLY, chain ID 10509) | diff --git a/chains/install-subnet-cli.sh b/chains/install-subnet-cli.sh index 9b01c83..fa25f1a 100755 --- a/chains/install-subnet-cli.sh +++ b/chains/install-subnet-cli.sh @@ -1,3 +1,5 @@ +#!/bin/bash +set -euo pipefail VERSION=0.0.2 # Populate latest here GOARCH=$(go env GOARCH) diff --git a/chains/update-validator-mainnet.sh b/chains/update-validator-mainnet.sh index f740697..e41f455 100755 --- a/chains/update-validator-mainnet.sh +++ b/chains/update-validator-mainnet.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail AVALANCHEGO_PREVIOUS_VERSION="1.10.7" AVALANCHEGO_VERSION="1.10.11" @@ -24,8 +25,16 @@ download_sunbet_evm() { update_subnet_evm() { echo "Step: update_subnet_evm" + EXPECTED_CHECKSUM="$(curl -sL https://github.com/ava-labs/subnet-evm/releases/download/v${SUBNET_EVM_VERSION}/subnet-evm_${SUBNET_EVM_VERSION}_checksums.txt | grep "subnet-evm_${SUBNET_EVM_VERSION}_linux_amd64.tar.gz" | awk '{print $1}')" + ACTUAL_CHECKSUM="$(sha256sum subnet-evm_${SUBNET_EVM_VERSION}_linux_amd64.tar.gz | awk '{print $1}')" + if [ "${EXPECTED_CHECKSUM}" != "${ACTUAL_CHECKSUM}" ]; then + echo "ERROR: Checksum mismatch for subnet-evm tarball. Aborting installation." + echo " Expected: ${EXPECTED_CHECKSUM}" + echo " Actual: ${ACTUAL_CHECKSUM}" + exit 1 + fi + echo "Checksum verified: ${ACTUAL_CHECKSUM}" cp subnet-evm-${SUBNET_EVM_VERSION}/subnet-evm ~/.avalanchego/plugins/${VM_ID} - sha256sum subnet-evm-${SUBNET_EVM_VERSION}/subnet-evm ~/.avalanchego/plugins/${VM_ID} } show_validator_files() { diff --git a/chains/update-validator-testnet.sh b/chains/update-validator-testnet.sh index 6f2c22d..ef3f6f6 100755 --- a/chains/update-validator-testnet.sh +++ b/chains/update-validator-testnet.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -euo pipefail AVALANCHEGO_PREVIOUS_VERSION="1.10.7" AVALANCHEGO_VERSION="1.10.11" @@ -24,8 +25,16 @@ download_sunbet_evm() { update_subnet_evm() { echo "Step: update_subnet_evm" + EXPECTED_CHECKSUM="$(curl -sL https://github.com/ava-labs/subnet-evm/releases/download/v${SUBNET_EVM_VERSION}/subnet-evm_${SUBNET_EVM_VERSION}_checksums.txt | grep "subnet-evm_${SUBNET_EVM_VERSION}_linux_amd64.tar.gz" | awk '{print $1}')" + ACTUAL_CHECKSUM="$(sha256sum subnet-evm_${SUBNET_EVM_VERSION}_linux_amd64.tar.gz | awk '{print $1}')" + if [ "${EXPECTED_CHECKSUM}" != "${ACTUAL_CHECKSUM}" ]; then + echo "ERROR: Checksum mismatch for subnet-evm tarball. Aborting installation." + echo " Expected: ${EXPECTED_CHECKSUM}" + echo " Actual: ${ACTUAL_CHECKSUM}" + exit 1 + fi + echo "Checksum verified: ${ACTUAL_CHECKSUM}" cp subnet-evm-${SUBNET_EVM_VERSION}/subnet-evm ~/.avalanchego/plugins/${VM_ID} - sha256sum subnet-evm-${SUBNET_EVM_VERSION}/subnet-evm ~/.avalanchego/plugins/${VM_ID} } show_validator_files() { diff --git a/genesis/README.md b/genesis/README.md new file mode 100644 index 0000000..84e126f --- /dev/null +++ b/genesis/README.md @@ -0,0 +1,21 @@ +# Genesis Files + +This directory contains historical and reference genesis configurations for the Numbers Network. The canonical genesis files reside in `chains//`. + +## Chain IDs + +| Network | Chain ID | +|---------|----------| +| Mainnet | `10507` | +| Testnet | `10508` | +| Devnet | `10509` | + +## Files + +| File | Network | Chain ID | Description | +|------|---------|----------|-------------| +| `genesis.json` | Testnet | 10508 | Base testnet genesis configuration | +| `genesis-nativecoin-feemgr.json` | Testnet | 10508 | Testnet genesis with native coin minter and fee manager | +| `genesis-nativecoin-feemgr-feerecv.json` | Testnet | 10508 | Testnet genesis with native coin minter, fee manager, and fee receiver | + +> ⚠️ These files use the **testnet** chain ID (10508). For production deployments, always use the genesis files in `chains/mainnet/`. Verify the chain ID before deploying. diff --git a/rpc/__pycache__/rpc_test.cpython-312.pyc b/rpc/__pycache__/rpc_test.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c08622a7f59d0a143a78b2d4cd7fbd2f77543de2 GIT binary patch literal 3835 zcmdT{O>7%Q6rT0$uGe1wq;^w>6q==}(z>K}o1Y3IlH#}pDz#CSm`eC!x!x^t>%Y#f zn>tEL4;;#^oB$O>Bzj1d9+2SB10a&33dF@hsgf*_0KuiV&|Z+a@MhPWteX&`iVG|G z?VI=Be4d$o@7uROc)e}}*Yerv>`S2iMhDi#)|JOPDDNW~$xIF<%{!B1VC={_@;Hg} zY?94$Nsd7>PVzFFbjn;(kolxbcD{p>Zdm{+$}W%|#Vfln9zcl19Z2!X;tXT{3xil&f-?1;8@q9W#PEB33#@R~jO=&|PE%$-Vka3F($-=x)OT;ps*4FU!N}Yleug5z zHR+geT(F*=X)>hjG)~^5(SI{7w$rL0o87fJ!cFwCWBq(9s2yp7g|!cn=O?iZ!>x&y zZvtDh8WG-vY?{PZaixAAV>FL7X9J%2RCvCB#Pd82-Wa-q-$Y}OHA6Mr6*;U2#*}m2 zsZ1`b6tuGnQ6YC8(x-Ks)twjAVgd3)=ktm-T9kFZlqTuCsyniB;1Xua0gce?+yPgJQe$t z|KLj1cVJNn&kNzdR>W57j)1$`)P5^I&3yXm)QeSL=b~_EUN{8)z?S}143leW4{YMy zu2?hrvIWF!vn%e$vwK3ZK0Mp!0ey}S4erHrdksAjio5YWHwX63N#_24MKbikKXJ{} z#|>2A1Oiy2?M-Ndwb6!PD@%3@+F-A;25rE718vyxTu+79NE>!MJFRVheNEOe8MJ1{ zv(wtP@z!X_Gejtx6H3FxMFoAKCx{Z^>vbp{PiyHu z65J4MvO*{DjagE~f<+#+kR8;<6}48=VOF>VRHrJ|q}wjCldi3q3VIYIL0DVc-nC(lJVTwWRO|+!do2P<$*^$pEZ9^ELU}|Y&(V;8K?Uc_1>-fI&QUJd z4~}*k`#p%wxxgoKy_;}Bi}Z>2L+?%hbuTSo-_g6?2g0k{toayY6#daJ)VoJMzx>%~ z)pu-Bcx7IA#VYzP!@vIyo{r7%Q$QMr7lkA9!V&N{Q&Q+P{0HxJPhXljI(?w(>s}Ok z=7pZWC@J*T)R$m4@AeF!uU&Bo&pJb~c0Akep?WklDB?Mh>T{vcU^kxYHuPhm_-=e} zHwX5Ny^&aJKfYaK252epM|je)jpoB4vv;_)<^xaQ3tRDmJ@@$uc1vF1Y`oyK)iJjP zFK|~mgBRewffwv}cAnWjUL!Bq@$5XaeY{3qu;bZzX4`mcydavqpo`FXq%xz>tDcm@ zn9z=l&=!l(jhHk+Bs!)XK%S>!FBP<0$UYEZ-Y7y{FhEjSdA%G-2MscckO$2u!g>{Y z%@;ELUpnOlaMNs6?}MlpVB3;!*B?&SdK3RItM7VGKl;iQZ^N^ED7F{R!uuEWNNCWF z=iF4E+Z7t@!gF1QJ`jqx;(M(e*mWV5q8|{c)Oaufy-T+6mUPf z{U(Xhl+lA$TNY8SWRw#9WKq{y)a=Oor(-9FhE60>Fgf+c@F~5?GQ?j8PwM1x-Jduy zl4uCA3|5HINEr-jJVm;2Yg4Opx09!H4 zV;(V0KOymFG&qk2S9uidzUE&Fwp3BmQlQIHAMpVu^5|fY>3!50V0u>%BGz+#{73xE zGV7|k+ZI@9nQgvNTwptv* Date: Wed, 4 Mar 2026 16:02:25 +0000 Subject: [PATCH 3/3] Remove pycache from git tracking and add to .gitignore Co-authored-by: numbers-official <181934381+numbers-official@users.noreply.github.com> --- .gitignore | 1 + rpc/__pycache__/rpc_test.cpython-312.pyc | Bin 3835 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 rpc/__pycache__/rpc_test.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 0bbd89e..e9df4f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .subnet-cli.pk +rpc/__pycache__/ diff --git a/rpc/__pycache__/rpc_test.cpython-312.pyc b/rpc/__pycache__/rpc_test.cpython-312.pyc deleted file mode 100644 index c08622a7f59d0a143a78b2d4cd7fbd2f77543de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3835 zcmdT{O>7%Q6rT0$uGe1wq;^w>6q==}(z>K}o1Y3IlH#}pDz#CSm`eC!x!x^t>%Y#f zn>tEL4;;#^oB$O>Bzj1d9+2SB10a&33dF@hsgf*_0KuiV&|Z+a@MhPWteX&`iVG|G z?VI=Be4d$o@7uROc)e}}*Yerv>`S2iMhDi#)|JOPDDNW~$xIF<%{!B1VC={_@;Hg} zY?94$Nsd7>PVzFFbjn;(kolxbcD{p>Zdm{+$}W%|#Vfln9zcl19Z2!X;tXT{3xil&f-?1;8@q9W#PEB33#@R~jO=&|PE%$-Vka3F($-=x)OT;ps*4FU!N}Yleug5z zHR+geT(F*=X)>hjG)~^5(SI{7w$rL0o87fJ!cFwCWBq(9s2yp7g|!cn=O?iZ!>x&y zZvtDh8WG-vY?{PZaixAAV>FL7X9J%2RCvCB#Pd82-Wa-q-$Y}OHA6Mr6*;U2#*}m2 zsZ1`b6tuGnQ6YC8(x-Ks)twjAVgd3)=ktm-T9kFZlqTuCsyniB;1Xua0gce?+yPgJQe$t z|KLj1cVJNn&kNzdR>W57j)1$`)P5^I&3yXm)QeSL=b~_EUN{8)z?S}143leW4{YMy zu2?hrvIWF!vn%e$vwK3ZK0Mp!0ey}S4erHrdksAjio5YWHwX63N#_24MKbikKXJ{} z#|>2A1Oiy2?M-Ndwb6!PD@%3@+F-A;25rE718vyxTu+79NE>!MJFRVheNEOe8MJ1{ zv(wtP@z!X_Gejtx6H3FxMFoAKCx{Z^>vbp{PiyHu z65J4MvO*{DjagE~f<+#+kR8;<6}48=VOF>VRHrJ|q}wjCldi3q3VIYIL0DVc-nC(lJVTwWRO|+!do2P<$*^$pEZ9^ELU}|Y&(V;8K?Uc_1>-fI&QUJd z4~}*k`#p%wxxgoKy_;}Bi}Z>2L+?%hbuTSo-_g6?2g0k{toayY6#daJ)VoJMzx>%~ z)pu-Bcx7IA#VYzP!@vIyo{r7%Q$QMr7lkA9!V&N{Q&Q+P{0HxJPhXljI(?w(>s}Ok z=7pZWC@J*T)R$m4@AeF!uU&Bo&pJb~c0Akep?WklDB?Mh>T{vcU^kxYHuPhm_-=e} zHwX5Ny^&aJKfYaK252epM|je)jpoB4vv;_)<^xaQ3tRDmJ@@$uc1vF1Y`oyK)iJjP zFK|~mgBRewffwv}cAnWjUL!Bq@$5XaeY{3qu;bZzX4`mcydavqpo`FXq%xz>tDcm@ zn9z=l&=!l(jhHk+Bs!)XK%S>!FBP<0$UYEZ-Y7y{FhEjSdA%G-2MscckO$2u!g>{Y z%@;ELUpnOlaMNs6?}MlpVB3;!*B?&SdK3RItM7VGKl;iQZ^N^ED7F{R!uuEWNNCWF z=iF4E+Z7t@!gF1QJ`jqx;(M(e*mWV5q8|{c)Oaufy-T+6mUPf z{U(Xhl+lA$TNY8SWRw#9WKq{y)a=Oor(-9FhE60>Fgf+c@F~5?GQ?j8PwM1x-Jduy zl4uCA3|5HINEr-jJVm;2Yg4Opx09!H4 zV;(V0KOymFG&qk2S9uidzUE&Fwp3BmQlQIHAMpVu^5|fY>3!50V0u>%BGz+#{73xE zGV7|k+ZI@9nQgvNTwptv*