From 8c33d648e5a200048888dfd5de38e2a4193aa3ec Mon Sep 17 00:00:00 2001 From: Harrison Crosse Date: Mon, 24 Aug 2026 14:39:43 -0400 Subject: [PATCH 01/25] Add resume PDF generation tooling --- .gitignore | 4 +- README.md | 43 +++ bun.lock | 36 +- package.json | 8 +- public/harrison-crosse-resume-dark.pdf | Bin 0 -> 18767 bytes public/harrison-crosse-resume-light.pdf | Bin 0 -> 18768 bytes scripts/generate-resume-pdfs.test.ts | 334 ++++++++++++++++++ scripts/generate-resume-pdfs.ts | 439 ++++++++++++++++++++++++ scripts/resume/astro.config.mjs | 6 + scripts/resume/src/pages/[theme].astro | 53 +++ src/resume/Resume.astro | 290 ++++++++++++++++ src/resume/content.test.ts | 26 ++ src/resume/content.ts | 168 +++++++++ 13 files changed, 1402 insertions(+), 5 deletions(-) create mode 100644 public/harrison-crosse-resume-dark.pdf create mode 100644 public/harrison-crosse-resume-light.pdf create mode 100644 scripts/generate-resume-pdfs.test.ts create mode 100644 scripts/generate-resume-pdfs.ts create mode 100644 scripts/resume/astro.config.mjs create mode 100644 scripts/resume/src/pages/[theme].astro create mode 100644 src/resume/Resume.astro create mode 100644 src/resume/content.test.ts create mode 100644 src/resume/content.ts diff --git a/.gitignore b/.gitignore index 1940d15..95d03a2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,9 +20,11 @@ node_modules/ # project TODO.md +.resume/ +.worktrees/ # fonts (private, fetched from R2 at build time) -public/fonts/ +public/fonts # os .DS_Store diff --git a/README.md b/README.md index bdb2915..9a0626b 100644 --- a/README.md +++ b/README.md @@ -15,3 +15,46 @@ bun run dev bun run build bun run preview ``` + +## Resume PDFs + +Install the local browser once: + +```sh +bunx playwright install chromium +``` + +Generate the canonical light and dark resumes from the committed general +content: + +```sh +bun run resume:pdf +``` + +This replaces the stable tracked files only after both generated PDFs pass +validation: + +- `public/harrison-crosse-resume-light.pdf` +- `public/harrison-crosse-resume-dark.pdf` + +They are published at +`https://crosse.dev/harrison-crosse-resume-light.pdf` and +`https://crosse.dev/harrison-crosse-resume-dark.pdf`. The website has no resume +HTML route or navigation item. + +Generate private tailored PDFs with content stored under the ignored `.resume/` +directory: + +```sh +bun run resume:pdf --content .resume/data-platform.json +``` + +Private output names use the local generation date, for example +`.resume/harrison_crosse_resume_light_2026_08_24.pdf` and +`.resume/harrison_crosse_resume_dark_2026_08_24.pdf`. If either dated file +already exists, both new files share a full timestamp suffix such as +`2026_08_24_09_08_07`. A colliding full-timestamp name is not overwritten. + +Both modes require parseable, non-empty US Letter PDFs. A resume that spans more +than one Letter page is retained and reported with a warning so content can be +adjusted manually. diff --git a/bun.lock b/bun.lock index aa89678..3e48dca 100644 --- a/bun.lock +++ b/bun.lock @@ -8,6 +8,8 @@ "@astrojs/cloudflare": "^12.6.12", "@astrojs/rss": "^4.0.15", "@astrojs/sitemap": "^3.7.0", + "@fontsource/archivo": "^5.2.8", + "@fontsource/chivo-mono": "^5.2.8", "@resvg/resvg-js": "^2.6.2", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.1.18", @@ -21,6 +23,8 @@ "@typescript-eslint/parser": "^8.56.0", "eslint": "^10.0.1", "eslint-plugin-astro": "^1.6.0", + "pdf-lib": "^1.17.1", + "playwright": "^1.55.0", "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", }, @@ -141,6 +145,10 @@ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.0", "", { "dependencies": { "@eslint/core": "^1.1.0", "levn": "^0.4.1" } }, "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ=="], + "@fontsource/archivo": ["@fontsource/archivo@5.3.0", "", {}, "sha512-5DIMgPVJRi62OqdOVoogCFxP73EkNM/E0YVTSDIQlDEJfDbxqZduwM/YoNZwC9Sx1CDgpKinqf8ckRY1QNIecw=="], + + "@fontsource/chivo-mono": ["@fontsource/chivo-mono@5.3.0", "", {}, "sha512-JhGFmYUkWc/jQ5yQt8tp02VO1gouolfnSfNbo8qCuET7Cu6X2VieLpic2ZXQPvDQBcqjjrmruPnkGnoYmxMlaQ=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], @@ -217,6 +225,10 @@ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], + "@pdf-lib/standard-fonts": ["@pdf-lib/standard-fonts@1.0.0", "", { "dependencies": { "pako": "^1.0.6" } }, "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA=="], + + "@pdf-lib/upng": ["@pdf-lib/upng@1.0.1", "", { "dependencies": { "pako": "^1.0.10" } }, "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ=="], + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], @@ -621,7 +633,7 @@ "fontkitten": ["fontkitten@1.0.2", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], @@ -883,7 +895,7 @@ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], - "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], "parse-css-color": ["parse-css-color@0.2.1", "", { "dependencies": { "color-name": "^1.1.4", "hex-rgb": "^4.1.0" } }, "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg=="], @@ -899,12 +911,18 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "pdf-lib": ["pdf-lib@1.17.1", "", { "dependencies": { "@pdf-lib/standard-fonts": "^1.0.0", "@pdf-lib/upng": "^1.0.1", "pako": "^1.0.11", "tslib": "^1.11.1" } }, "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw=="], + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "playwright": ["playwright@1.62.1", "", { "dependencies": { "playwright-core": "1.62.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg=="], + + "playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], @@ -1043,7 +1061,7 @@ "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -1147,6 +1165,8 @@ "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@emnapi/runtime/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@poppinss/colors/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], @@ -1193,14 +1213,24 @@ "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "unicode-trie/pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], + "vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "wrangler/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "@astrojs/cloudflare/wrangler/@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], "@astrojs/cloudflare/wrangler/@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.11", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251106.1" }, "optionalPeers": ["workerd"] }, "sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ=="], "@astrojs/cloudflare/wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + "@astrojs/cloudflare/wrangler/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "@astrojs/cloudflare/wrangler/miniflare": ["miniflare@4.20251118.1", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251118.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-uLSAE/DvOm392fiaig4LOaatxLjM7xzIniFRG5Y3yF9IduOYLLK/pkCPQNCgKQH3ou0YJRHnTN+09LPfqYNTQQ=="], "@astrojs/cloudflare/wrangler/workerd": ["workerd@1.20251118.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="], diff --git a/package.json b/package.json index 1119978..704127b 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,16 @@ "preview": "bun run build && wrangler dev", "astro": "astro", "deploy": "bun run build && wrangler deploy", - "cf-typegen": "wrangler types" + "cf-typegen": "wrangler types", + "resume:pdf": "bun scripts/generate-resume-pdfs.ts", + "test:resume": "bun test src/resume/content.test.ts scripts/generate-resume-pdfs.test.ts" }, "dependencies": { "@astrojs/cloudflare": "^12.6.12", "@astrojs/rss": "^4.0.15", "@astrojs/sitemap": "^3.7.0", + "@fontsource/archivo": "^5.2.8", + "@fontsource/chivo-mono": "^5.2.8", "@resvg/resvg-js": "^2.6.2", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.1.18", @@ -27,6 +31,8 @@ "@typescript-eslint/parser": "^8.56.0", "eslint": "^10.0.1", "eslint-plugin-astro": "^1.6.0", + "pdf-lib": "^1.17.1", + "playwright": "^1.55.0", "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1" } diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f9296662e63da12cd2d582e232f5f9d01f907a8 GIT binary patch literal 18767 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≶>Ntt%Itwl9x1N5E zkKcYVL|B_R__Fj%{{`*5_!Y6B6h@Xpu$caW->Bhu`VSOcvz9!6-0R$H5jIn`XI}4%HG*{>qy4_NbNUa>G4&%8t=a4F>CbNzS-#+y0~0OShHq3 z2yYJWBCcD^J3M32RYH#XjxSht7O9L!SEu_g7Wk4;lIOZ8OUU013${WeI%= z;q{(a4nLx~oMLLo2dEdSG%yAC_DpmNS{xO1`{a9+UO3SWx`aR) z)M_J@>L~H2d4!^iaY8&|8S}G191DCF z4JAG7`a-q}9g3Q>-y=Rr%gJ2Z=gts2H81LAauj;`30#$>mgFbKJR`2!z*Kx9y{#Yc z*kutbijB&PdZhRLao)nLC|&52HC|kT=a(VNnC;$6i|lx@%nfeL667*^Gjbd{wZqtT zrj*2lIoZma?KZu>(OH0AJYY-^jR9MHoh-wC) zEa_ymY~gB+MPsG%I3(UBbRBNGV&HE%EQqOCyFSGXkGuV0(R@la6Y%iUq@N*VZb*c( zdqq08GoQmCE7jOvxT^8~2~# z8h3mfG3YodZ)wV2)fZ`sO><+YDNd2&r z({X>8psIvS%BZRR37S0rUOsjDO_>_?7g( zv5x;Kwf{GyBb0^X0K(|UKNMB}R8tOFO$DgFC@f z!NQ>kuDA{M;FzEM88>30^<^!KRO3x916uF$-%Z%@$R&TZJGJB-L-xd-2qPU*IHb&K zx4C4@J#1$5+m(g#aK+NG&Ny**Gb~4UsiwU)EZ-%WW!ElFZCXhC=4{APfdeUKDH6?$ zcY^J1G+6n{(rVS#X$3`yO(z{k5#oz$T(`UYBOB65()kX3XGoLT1n&X~6#H?$Wor~r z!h^GkRSHsS;kU9M1q;}uqApFLB3|O4BOUHCJUM)6#(K=AxP3eV9t6IyA3v_Km&~qB zp_&f@)~&G4q+_9<7nG)6=wL-stW+}|4hh(jmmisx`igMSTH(|n4$MDsGeW^}zt6fZ!+#W>75(QR{6BEze-_<8D7ybtuKz7V_lLsmUkn|TAO1Hf+b@3mcjEUC zh7Qci3MJhCH--+x$qoK%1#W40S?g%Le0cA4H`sG>gZav2mGBi-2bKY^e8#lHB-f{# zWpN|HyR)u*)Hz-3k@%`p)QF3bDTokNgq(nSP$+u@S|}pJ!mDLkFMu3E zj8b52PG9o!YZ@P06aQY)426p;Z<3B9hxQ}h0RUXFJsy5E>Kh4@CYh|Omx3#Z_V(Vn zCdS)s@0sA5kUK}09Bu1l^)BE9z2I&w$lRP?_~UjG!VTjl$uCXLIElimdK1!;>STN- zHe2k-j$zfevbIQdhF>kE;QWxj3dHMV+FjpvkqEkyWXqH=NX&)22!_kW`ld0rt%3KV@DS-31h=ISZhyH^ z&4Pd^ijf^)u}{S)h+c)MyP9H5!x)jmX^ChU`vg<);&qqu&!&TWLLjpg1get$LCOsO>;ExBssU-f7oC(vjWhXmneZmBfxLVsKpV$v{uk*l5 z`tmo3T4x`3p+3e}R5V_#4}piLa&#mW{G8lRTlKZFR#+U-G0TFRU*YJneestB4UC>w zwzWT`2}y|d`q=C@M29ZmPhB_%EgfQucey8i#P`>33gvx>_%d?*1P-~@FguWtO!RFZ zTz_28qf^a3)};XKK!8zrjb8pd_hwaa-Q>a4Ppm`uV7!p1ZU+D3BxmVBfc0xD=JQ;I zk~QYL;y|R9@hIPDLmXtN_G^=J6H+P|y}a-|-}j8-GOqTT_3S_byJ}UC!ZbL8yl{}E zewV2^>#$J5R+wg2<;>-p$D}E?pNeO=wG;Y7QKKv7W$I;Wa7#KlXS#ZK6z|-+yE2D{Gv+?!^jh=dp8a-jqOz2OpMD`%+=fSN){xN6*AEhaQ zJPQmH+jQVn2gZ6ZQoNBbHGCR|*^j?nMmv7b{$D{P?lcjL7KqU6;6CR>V zG|9vLx8(=ceLy7EVEtNOVVm;1a|eQhcc2r**?JqibGx?!wz7tpKkQfiL4n}XuPP}6 z8MS!`1C*rYlD_s70J1WZ7ZP#8I7&q;;S8~B800AlV^onwj2ll*xq?l&B7xNQk4jP` z&UhkR&M;+H&g6fFi~AWYiICoHdNr^XKisuV-m`^2NZjxnzH*Jh(l1izW;w6xyWbNp z&dDV!5oa;Rrl4EX4)a(|J;wxlSR@4VyF5~t^_S+iy7+-QldJ!-+G^{yO2!b z$|>6zr7Y<+CfufE65cF-AvDRadvTWW^U;RO`reRMb$aHax3jKjy z*e3;ucB(1S%-sW%vg9O6l{vjiP+QTp6(nbBaDXwe~|$;y@@o{61? zpKN&vc`sijx8>LDc9wU_`q+K2={@=!{hj3d@wvA;#Foe^PGc~Y-XnXyd|b25mE)i` z<$aed<(C(A+PVC#(mfns7=^s#+Lo;yka%<3ZuW(`Pza}mY%D~14ddA5RD5N~Xx6+> zMET_0Cn|XIni5l{gH0%UKNl4lI65fVowl;QaO!)$G-J1!w-#*4DMcjfc8IoLa%(kf zZE_y1oOLkSq9a^CQAa#OmbkEtWxaRtdLiQ+SEfvhqC%0w+1-0NCS(pR?OpEDW}RkR zzd#UF?>$d8b&%fvCzvneAS$*O3 z_ChgTVZb$NqWDpGh<>nGG=#a!j_~!mW=O&@wS0q}g(T^-lJB#T!84#&3Yp*2KT0`9 zXIM69_urt{7-r*LTQI#Bd8CKGe5$Q-I^6KYs{VsiJZEu4bxM&?H@&Q}Vc+OtgbbF0 zf#nj$Yw2DeB8L1ik@o0{xH=wpmi;%|&C8$6ViUesN${z^b~c+!c@O!{l7Af-bUXE` z?&m1{9LsXf_&3n5GxgM=g>NqPizoTh#n~~hY1z#8O%QTUQEW!HrR^j4IG8!`L0ZwX zUG;|bwuJ%U>HxzS8bNsuP7ZcX&S~~9y$>SmHfM64@Tl+n$-2_V$7(TNvs zQPk}8k(#U$RbN)CoOPQua*c&I;U@JnwWd658`GHK6*3U-fvsINQYZ0WZ~PQ!>&B3A zLgRN)Aqbo6t(%p%w9z;D9;;nU;);yw!rHL9vunrVow&Jlo)o!IZn37JQAKMdcrR{K zsh=OPFYZww8pb(GnlZ_}U%DdihnYpZL%XD4#(zGe%`NqaAdeha2Dy6&yLDj&ntKT<#Jc$F2`_hOk|2i zS$ph0x#4buxZuFu#vW8AbrE`|b3d#|h&q>%5@9k^yHf;`Kq#!D=d;e!5t;ESH7d+_ zSvOtC7ZSDZEB^(+qQt->Q&$&5=@BwPNd>};Dt*;$y^KH&E#PHD)o9nKDAt!V&NY^$ zLqZoA-T6M5W(t*y-^Px?V+CCnrLWZGsO7xBXdNlmFp-qIh0QJVl!E38TTdOu3k)0m z)d%MJGpeeW4z}-f6FwWFAIpnTsaT$A52LA zixQ!D&WIP;ns>WwE|?}74fS5O@^&`m_FQV<)`ZP#`K&_*KC`-lO_U}J5AiPmJC!r7uMVZELVBgiSdZLP1&Op%u-GS%#JUS*h-) z_U6l#ues|=lxP|br~{%OpOl!63AFl&Drrf*s2+AKFt688Cp|6j|a?@;DES(yd zR5INBvDtoTT2sT);z?0>%Q3PZ*M}*j9-eMneQIrlET9#+l-C+DhU!zFO$Al7LerR6 zWCZa`%E6d@C8>2*@|eZ3h|?^x-x866gvnIY)P^n&?{W$_-uVhkf%-!|iKh~X8g#OqWUlzBnXm3~1o{7neR$haZ3*|%pc^}#Yw=GeINIbmtBSL*xdT=I=x}ksj>EbOs{MhRvDq zssdt#3Ui>33;}>RIscI6aQ`mN0fC_C>Q7SOF9MJM4U@64Lz#qsJr+VQegr1X5xcxc zVM!MYCgUS`N(RQD#P#{ePAWJm$n+v8y5{Q8u50Win)!C>P<i@Uyfmvu)guJvXGSR~c( z99}1Xt?f`Ei#))Q1DSOxhY)iCgTg2y2t(%4E#r~?GR+dR$aUSxejr}~yHa&N@a`z_VVKC{>lSC{^C?EghH^{=7-ze#WY(-`?Las96%f~{Qp3$BM%$zO)C zJ9OxShdzPl?|$qc@ZVzr zva>;l+TYsagg&(A?=~(VRJ->#KQ1uz4*EA6H!D;w`R_L9Lv{Xf4OTV~beR9$4-8co z{>{eD3cXeT&Bh6YNho2jKffbZPMDJK?=}utQT*ZO>?0LRPYA3GSd{JT qpi2{B|64(C+rQM3F!dm;WSpFh9G!m^3@aBa7dHwOm6(D!%KryGp7r7Y literal 0 HcmV?d00001 diff --git a/public/harrison-crosse-resume-light.pdf b/public/harrison-crosse-resume-light.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d92f26ab8ee46df155a4dbcadf4ab818427e33e3 GIT binary patch literal 18768 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 EA7h#A { + test('uses canonical content by default', () => { + expect(parseArguments([])).toEqual({ contentPath: undefined }); + }); + + test('accepts one private content override', () => { + expect(parseArguments(['--content', '.resume/data-platform.json'])).toEqual( + { + contentPath: '.resume/data-platform.json', + }, + ); + }); + + test('rejects invalid arguments', () => { + expect(() => parseArguments(['--profile', 'private'])).toThrow( + 'Unknown argument', + ); + expect(() => parseArguments(['--content'])).toThrow( + '--content requires exactly one path', + ); + expect(() => + parseArguments(['--content', '.resume/one.json', 'extra']), + ).toThrow('--content requires exactly one path'); + }); +}); + +describe('resolvePrivateContentPath', () => { + test('accepts files inside .resume', () => { + expect( + resolvePrivateContentPath('.resume/data-platform.json').endsWith( + '/.resume/data-platform.json', + ), + ).toBe(true); + }); + + test('rejects paths outside .resume and the directory itself', () => { + expect(() => resolvePrivateContentPath('private.json')).toThrow( + 'must be inside .resume', + ); + expect(() => resolvePrivateContentPath('.resume')).toThrow( + 'must be inside .resume', + ); + }); +}); + +describe('createHarnessEnvironment', () => { + test('removes an inherited content override for canonical content', () => { + expect( + createHarnessEnvironment(undefined, { + PATH: '/bin', + RESUME_CONTENT_PATH: '/tmp/private.json', + }), + ).toEqual({ PATH: '/bin' }); + }); + + test('replaces an inherited override with the validated explicit path', () => { + expect( + createHarnessEnvironment('/private/validated.json', { + PATH: '/bin', + RESUME_CONTENT_PATH: '/tmp/inherited.json', + }), + ).toEqual({ + PATH: '/bin', + RESUME_CONTENT_PATH: '/private/validated.json', + }); + }); +}); + +describe('generateResumePdfs', () => { + test('selects stable public paths for canonical generation', async () => { + const workspace = await createTestWorkspace(); + + try { + await generateResumePdfs(undefined, { + outputDirectory: workspace.temporaryDirectory, + publicDirectory: workspace.publicDirectory, + startedAt, + renderPdfs: writeLetterPdfs, + }); + + expect((await readdir(workspace.publicDirectory)).sort()).toEqual([ + 'harrison-crosse-resume-dark.pdf', + 'harrison-crosse-resume-light.pdf', + ]); + expect(await readdir(workspace.temporaryDirectory)).toEqual([]); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + test('uses one daily suffix when both private daily names are free', async () => { + const workspace = await createTestWorkspace(); + + try { + const contentPath = await writePrivateContent( + workspace.temporaryDirectory, + ); + await generateResumePdfs(contentPath, { + outputDirectory: workspace.temporaryDirectory, + publicDirectory: workspace.publicDirectory, + startedAt, + renderPdfs: writeLetterPdfs, + }); + + expect((await readdir(workspace.temporaryDirectory)).sort()).toEqual([ + 'content.json', + 'harrison_crosse_resume_dark_2026_08_24.pdf', + 'harrison_crosse_resume_light_2026_08_24.pdf', + ]); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + for (const existingTheme of ['light', 'dark'] as const) { + test(`uses one full timestamp suffix when the ${existingTheme} private daily file exists`, async () => { + const workspace = await createTestWorkspace(); + + try { + const contentPath = await writePrivateContent( + workspace.temporaryDirectory, + ); + await writeFile( + resolve( + workspace.temporaryDirectory, + `harrison_crosse_resume_${existingTheme}_2026_08_24.pdf`, + ), + 'existing', + ); + await generateResumePdfs(contentPath, { + outputDirectory: workspace.temporaryDirectory, + publicDirectory: workspace.publicDirectory, + startedAt, + renderPdfs: writeLetterPdfs, + }); + + expect((await readdir(workspace.temporaryDirectory)).sort()).toEqual( + [ + 'content.json', + `harrison_crosse_resume_${existingTheme}_2026_08_24.pdf`, + 'harrison_crosse_resume_dark_2026_08_24_09_08_07.pdf', + 'harrison_crosse_resume_light_2026_08_24_09_08_07.pdf', + ].sort(), + ); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + } + + test('refuses a private full timestamp collision before rendering', async () => { + const workspace = await createTestWorkspace(); + let rendered = false; + + try { + const contentPath = await writePrivateContent( + workspace.temporaryDirectory, + ); + const collisionPath = resolve( + workspace.temporaryDirectory, + 'harrison_crosse_resume_dark_2026_08_24_09_08_07.pdf', + ); + await Promise.all([ + writeFile( + resolve( + workspace.temporaryDirectory, + 'harrison_crosse_resume_light_2026_08_24.pdf', + ), + 'existing daily', + ), + writeFile(collisionPath, 'existing timestamp'), + ]); + + await expect( + generateResumePdfs(contentPath, { + outputDirectory: workspace.temporaryDirectory, + publicDirectory: workspace.publicDirectory, + startedAt, + renderPdfs: async () => { + rendered = true; + }, + }), + ).rejects.toThrow('already exists'); + expect(rendered).toBe(false); + expect(await readFile(collisionPath, 'utf8')).toBe('existing timestamp'); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + test('cleans ordinary temporary PDFs when rendering fails', async () => { + const workspace = await createTestWorkspace(); + + try { + await expect( + generateResumePdfs(undefined, { + outputDirectory: workspace.temporaryDirectory, + publicDirectory: workspace.publicDirectory, + startedAt, + renderPdfs: async (outputs) => { + await writeFile(outputs[0].temporaryPath, 'partial PDF'); + throw new Error('render failed'); + }, + }), + ).rejects.toThrow('render failed'); + expect(await readdir(workspace.temporaryDirectory)).toEqual([]); + expect(await readdir(workspace.publicDirectory)).toEqual([]); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); +}); + +describe('verifyPdf', () => { + test('accepts a one-page US Letter PDF', async () => { + const workspace = await createTestWorkspace(); + const path = resolve(workspace.temporaryDirectory, 'one-page.pdf'); + + try { + await writePdf(path, [[612, 792]]); + await expect(verifyPdf(path)).resolves.toBeUndefined(); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + test('rejects a zero-byte PDF', async () => { + const workspace = await createTestWorkspace(); + const path = resolve(workspace.temporaryDirectory, 'empty.pdf'); + + try { + await writeFile(path, ''); + await expect(verifyPdf(path)).rejects.toThrow('Invalid PDF'); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + test('warns and accepts a multi-page US Letter PDF', async () => { + const workspace = await createTestWorkspace(); + const path = resolve(workspace.temporaryDirectory, 'multi-page.pdf'); + const warnings: string[] = []; + + try { + await writePdf(path, [ + [612, 792], + [612, 792], + ]); + await verifyPdf(path, (warning) => warnings.push(warning)); + expect(warnings).toHaveLength(1); + expect(warnings[0]).toContain('2 pages'); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); + + test('rejects malformed and non-Letter PDFs', async () => { + const workspace = await createTestWorkspace(); + const malformedPath = resolve( + workspace.temporaryDirectory, + 'malformed.pdf', + ); + const a4Path = resolve(workspace.temporaryDirectory, 'a4.pdf'); + + try { + await writeFile(malformedPath, 'not a PDF'); + await writePdf(a4Path, [[595.28, 841.89]]); + await expect(verifyPdf(malformedPath)).rejects.toThrow('Invalid PDF'); + await expect(verifyPdf(a4Path)).rejects.toThrow('US Letter'); + } finally { + await rm(workspace.root, { recursive: true, force: true }); + } + }); +}); + +async function createTestWorkspace(): Promise<{ + root: string; + publicDirectory: string; + temporaryDirectory: string; +}> { + await mkdir('.resume', { recursive: true }); + const root = await mkdtemp(resolve('.resume/generator-test-')); + const publicDirectory = resolve(root, 'public'); + const temporaryDirectory = resolve(root, 'temporary'); + await Promise.all([ + mkdir(publicDirectory, { recursive: true }), + mkdir(temporaryDirectory, { recursive: true }), + ]); + return { root, publicDirectory, temporaryDirectory }; +} + +async function writePrivateContent(directory: string): Promise { + const path = resolve(directory, 'content.json'); + await writeFile(path, JSON.stringify(generalResume)); + return path; +} + +async function writeLetterPdfs(outputs: ResumeOutput[]): Promise { + await Promise.all( + outputs.map(({ temporaryPath }) => writePdf(temporaryPath, [[612, 792]])), + ); +} + +async function writePdf( + path: string, + sizes: Array<[number, number]>, +): Promise { + const document = await PDFDocument.create(); + for (const size of sizes) document.addPage(size); + await writeFile(path, await document.save()); +} diff --git a/scripts/generate-resume-pdfs.ts b/scripts/generate-resume-pdfs.ts new file mode 100644 index 0000000..8ef3bf5 --- /dev/null +++ b/scripts/generate-resume-pdfs.ts @@ -0,0 +1,439 @@ +import { spawn, type ChildProcess } from 'node:child_process'; +import { randomUUID } from 'node:crypto'; +import { + access, + mkdir, + readFile, + realpath, + rename, + rm, +} from 'node:fs/promises'; +import { createServer } from 'node:net'; +import { isAbsolute, relative, resolve } from 'node:path'; +import { setTimeout as delay } from 'node:timers/promises'; +import { PDFDocument } from 'pdf-lib'; +import { chromium, type Browser } from 'playwright'; +import { parseResumeContent } from '../src/resume/content'; + +type Arguments = { + contentPath: string | undefined; +}; + +const themes = ['light', 'dark'] as const; +type Theme = (typeof themes)[number]; +const outputDirectory = resolve('.resume'); +const publicDirectory = resolve('public'); +const readinessTimeoutMs = 30_000; +const letterWidth = 612; +const letterHeight = 792; + +export type ResumeOutput = { + theme: Theme; + finalPath: string; + temporaryPath: string; +}; + +type GenerateResumePdfsOptions = { + outputDirectory?: string; + publicDirectory?: string; + startedAt?: Date; + renderPdfs?: ( + outputs: ResumeOutput[], + contentPath: string | undefined, + ) => Promise; +}; + +export function createHarnessEnvironment( + contentPath: string | undefined, + inheritedEnvironment: NodeJS.ProcessEnv = process.env, +): NodeJS.ProcessEnv { + const environment = { ...inheritedEnvironment }; + delete environment.RESUME_CONTENT_PATH; + if (contentPath) environment.RESUME_CONTENT_PATH = contentPath; + return environment; +} + +export function parseArguments(arguments_: string[]): Arguments { + if (arguments_.length === 0) return { contentPath: undefined }; + + if (arguments_[0] !== '--content') { + throw new Error(`Unknown argument: ${arguments_[0]}`); + } + if (arguments_.length !== 2 || !arguments_[1]) { + throw new Error('--content requires exactly one path'); + } + + return { contentPath: arguments_[1] }; +} + +export function resolvePrivateContentPath(contentPath: string): string { + const resolvedPath = resolve(contentPath); + assertPathInside(outputDirectory, resolvedPath); + return resolvedPath; +} + +async function preflightContent(contentPath: string): Promise { + const resolvedPath = resolvePrivateContentPath(contentPath); + const [privateDirectoryPath, realContentPath] = await Promise.all([ + realpath(outputDirectory), + realpath(resolvedPath), + ]); + assertPathInside(privateDirectoryPath, realContentPath); + parseResumeContent(JSON.parse(await readFile(realContentPath, 'utf8'))); + return realContentPath; +} + +function assertPathInside(directory: string, path: string): void { + const relativePath = relative(directory, path); + if ( + relativePath === '' || + relativePath === '..' || + relativePath.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || + isAbsolute(relativePath) + ) { + throw new Error('Resume content path must be inside .resume'); + } +} + +function formatDate(date: Date): string { + return [date.getFullYear(), date.getMonth() + 1, date.getDate()] + .map((part) => String(part).padStart(2, '0')) + .join('_'); +} + +function formatTime(date: Date): string { + return [date.getHours(), date.getMinutes(), date.getSeconds()] + .map((part) => String(part).padStart(2, '0')) + .join('_'); +} + +function privatePath(directory: string, theme: Theme, suffix: string): string { + return resolve(directory, `harrison_crosse_resume_${theme}_${suffix}.pdf`); +} + +function canonicalPath(directory: string, theme: Theme): string { + return resolve(directory, `harrison-crosse-resume-${theme}.pdf`); +} + +async function pathExists(path: string): Promise { + try { + await access(path); + return true; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false; + throw error; + } +} + +async function createOutputs( + privateMode: boolean, + directory: string, + stableDirectory: string, + startedAt: Date, +): Promise { + let finalPaths: string[]; + + if (privateMode) { + const dateSuffix = formatDate(startedAt); + const dailyPaths = themes.map((theme) => + privatePath(directory, theme, dateSuffix), + ); + const useTimestamp = ( + await Promise.all(dailyPaths.map((path) => pathExists(path))) + ).some(Boolean); + const suffix = useTimestamp + ? `${dateSuffix}_${formatTime(startedAt)}` + : dateSuffix; + finalPaths = themes.map((theme) => privatePath(directory, theme, suffix)); + + if (useTimestamp) { + for (const path of finalPaths) { + if (await pathExists(path)) { + throw new Error( + `Resume PDF already exists; refusing to overwrite: ${relative(process.cwd(), path)}`, + ); + } + } + } + } else { + finalPaths = themes.map((theme) => canonicalPath(stableDirectory, theme)); + } + + return themes.map((theme, index) => ({ + theme, + finalPath: finalPaths[index], + temporaryPath: resolve( + directory, + `.harrison-crosse-resume-${theme}-${randomUUID()}.tmp.pdf`, + ), + })); +} + +export async function verifyPdf( + path: string, + warn: (message: string) => void = console.warn, +): Promise { + let document: PDFDocument; + try { + const bytes = await readFile(path); + if (bytes.length === 0) throw new Error('empty file'); + document = await PDFDocument.load(Uint8Array.from(bytes)); + } catch (error) { + throw new Error(`Invalid PDF: ${relative(process.cwd(), path)}`, { + cause: error, + }); + } + + const pages = document.getPages(); + if (pages.length === 0) { + throw new Error( + `Invalid PDF contains no pages: ${relative(process.cwd(), path)}`, + ); + } + for (const page of pages) { + const { width, height } = page.getSize(); + if ( + Math.abs(width - letterWidth) > 0.01 || + Math.abs(height - letterHeight) > 0.01 + ) { + throw new Error( + `Generated PDF is not US Letter (${letterWidth}x${letterHeight} points): ${relative(process.cwd(), path)}`, + ); + } + } + if (pages.length > 1) { + warn( + `Warning: generated PDF has ${pages.length} pages and will be retained: ${relative(process.cwd(), path)}`, + ); + } +} + +async function reservePort(): Promise { + const server = createServer(); + + return await new Promise((resolvePort, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(); + reject(new Error('Failed to reserve a loopback port')); + return; + } + + server.close((error) => { + if (error) reject(error); + else resolvePort(address.port); + }); + }); + }); +} + +async function fetchBeforeDeadline( + url: string, + deadline: number, +): Promise { + const remainingMs = deadline - Date.now(); + if (remainingMs <= 0) { + throw new Error('Resume harness readiness deadline expired'); + } + return await fetch(url, { signal: AbortSignal.timeout(remainingMs) }); +} + +async function waitForHarness( + harness: ChildProcess, + baseUrl: string, +): Promise { + const deadline = Date.now() + readinessTimeoutMs; + let spawnError: unknown; + harness.once('error', (error) => { + spawnError = error; + }); + + while (Date.now() < deadline) { + if (spawnError !== undefined) throw spawnError; + if (harness.exitCode !== null || harness.signalCode !== null) { + throw new Error( + `Resume harness exited with ${ + harness.exitCode !== null + ? `code ${harness.exitCode}` + : `signal ${harness.signalCode}` + }`, + ); + } + + try { + const response = await fetchBeforeDeadline(`${baseUrl}/light`, deadline); + if (response.status === 200) return; + } catch { + // Astro may not have bound the reserved port yet. + } + await delay(Math.min(200, Math.max(0, deadline - Date.now()))); + } + + throw new Error( + `Resume harness did not become ready within ${readinessTimeoutMs}ms`, + ); +} + +async function stopHarness(harness: ChildProcess): Promise { + if ( + harness.pid === undefined || + harness.exitCode !== null || + harness.signalCode !== null + ) { + return; + } + + harness.kill('SIGTERM'); + const exited = new Promise((resolveExit) => { + harness.once('exit', () => resolveExit()); + }); + if ( + (await Promise.race([ + exited.then(() => true), + delay(5_000).then(() => false), + ])) === false + ) { + harness.kill('SIGKILL'); + await exited; + } +} + +async function renderPdfsWithHarness( + outputs: ResumeOutput[], + contentPath: string | undefined, +): Promise { + let browser: Browser | undefined; + let harness: ChildProcess | undefined; + let primaryError: unknown; + + try { + const port = await reservePort(); + const baseUrl = `http://127.0.0.1:${port}`; + harness = spawn( + 'bunx', + [ + 'astro', + 'dev', + '--config', + 'scripts/resume/astro.config.mjs', + '--host', + '127.0.0.1', + '--port', + String(port), + ], + { + env: createHarnessEnvironment(contentPath), + stdio: 'inherit', + }, + ); + + await waitForHarness(harness, baseUrl); + browser = await chromium.launch(); + const page = await browser.newPage(); + + for (const { theme, temporaryPath } of outputs) { + const response = await page.goto(`${baseUrl}/${theme}`, { + waitUntil: 'networkidle', + }); + if (!response?.ok()) + throw new Error(`Failed to load ${theme} resume route`); + await page.evaluate(() => document.fonts.ready); + await page.pdf({ + path: temporaryPath, + format: 'Letter', + printBackground: true, + preferCSSPageSize: true, + margin: { top: '0', right: '0', bottom: '0', left: '0' }, + }); + } + } catch (error) { + primaryError = error; + } + + const cleanupErrors: unknown[] = []; + if (browser) { + try { + await browser.close(); + } catch (error) { + cleanupErrors.push(error); + } + } + if (harness) { + try { + await stopHarness(harness); + } catch (error) { + cleanupErrors.push(error); + } + } + + if (primaryError !== undefined) { + for (const error of cleanupErrors) console.error(error); + throw primaryError; + } + if (cleanupErrors.length > 0) { + throw new AggregateError(cleanupErrors, 'Resume harness cleanup failed'); + } +} + +export async function generateResumePdfs( + contentPath: string | undefined, + options: GenerateResumePdfsOptions = {}, +): Promise { + const directory = options.outputDirectory ?? outputDirectory; + const stableDirectory = options.publicDirectory ?? publicDirectory; + const startedAt = options.startedAt ?? new Date(); + const renderPdfs = options.renderPdfs ?? renderPdfsWithHarness; + await Promise.all([ + mkdir(directory, { recursive: true }), + mkdir(stableDirectory, { recursive: true }), + ]); + + const validatedContentPath = contentPath + ? await preflightContent(contentPath) + : undefined; + const outputs = await createOutputs( + validatedContentPath !== undefined, + directory, + stableDirectory, + startedAt, + ); + + let primaryError: unknown; + try { + await renderPdfs(outputs, validatedContentPath); + await Promise.all( + outputs.map(({ temporaryPath }) => verifyPdf(temporaryPath)), + ); + for (const output of outputs) { + await rename(output.temporaryPath, output.finalPath); + } + } catch (error) { + primaryError = error; + } + + const cleanupResults = await Promise.allSettled( + outputs.map(({ temporaryPath }) => rm(temporaryPath, { force: true })), + ); + const cleanupErrors = cleanupResults.flatMap((result) => + result.status === 'rejected' ? [result.reason] : [], + ); + if (primaryError !== undefined) { + for (const error of cleanupErrors) console.error(error); + throw primaryError; + } + if (cleanupErrors.length > 0) { + throw new AggregateError(cleanupErrors, 'Temporary PDF cleanup failed'); + } + + for (const output of outputs) { + console.log(`Generated ${relative(process.cwd(), output.finalPath)}`); + } +} + +if ((import.meta as ImportMeta & { main: boolean }).main) { + const startedAt = new Date(); + const { contentPath } = parseArguments(process.argv.slice(2)); + await generateResumePdfs(contentPath, { startedAt }); +} diff --git a/scripts/resume/astro.config.mjs b/scripts/resume/astro.config.mjs new file mode 100644 index 0000000..c5c68e7 --- /dev/null +++ b/scripts/resume/astro.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + output: 'static', + srcDir: './scripts/resume/src', +}); diff --git a/scripts/resume/src/pages/[theme].astro b/scripts/resume/src/pages/[theme].astro new file mode 100644 index 0000000..1f940f2 --- /dev/null +++ b/scripts/resume/src/pages/[theme].astro @@ -0,0 +1,53 @@ +--- +import { readFileSync } from 'node:fs'; +import Resume from '../../../../src/resume/Resume.astro'; +import { + generalResume, + parseResumeContent, +} from '../../../../src/resume/content'; + +export function getStaticPaths() { + return ['light', 'dark'].map((theme) => ({ params: { theme } })); +} + +const theme = Astro.params.theme as 'light' | 'dark'; +const contentPath = process.env.RESUME_CONTENT_PATH; +const content = contentPath + ? parseResumeContent(JSON.parse(readFileSync(contentPath, 'utf8'))) + : generalResume; +--- + + + + + + + {content.identity.name} Resume + + + + + + + diff --git a/src/resume/Resume.astro b/src/resume/Resume.astro new file mode 100644 index 0000000..6ab28b1 --- /dev/null +++ b/src/resume/Resume.astro @@ -0,0 +1,290 @@ +--- +import '@fontsource/archivo/latin-400.css'; +import '@fontsource/archivo/latin-600.css'; +import '@fontsource/chivo-mono/latin-400.css'; +import type { ResumeContent } from './content'; + +interface Props { + content: ResumeContent; + theme: 'light' | 'dark'; +} + +const { content, theme } = Astro.props; +--- + +
+
+
+

{content.identity.name}

+

{content.identity.title}

+
+ +
+ +
+
+ +
+
+

Employment

+ { + content.employment.map((job) => ( +
+
+
+

{job.company}

+

{job.title}

+
+

+ {job.start} - {job.end} +

+
+
    + {job.highlights.map((highlight) => ( +
  • {highlight}
  • + ))} +
+
+ )) + } +
+ +
+
+

Tools

+
    + {content.tools.map((tool) =>
  • {tool}
  • )} +
+
+ +
+

Selected Work

+ { + content.selectedWork.map((work) => ( +
+

+ {work.url ? {work.name} : work.name} +

+

{work.description}

+ {work.url &&

{work.url}

} +
+ )) + } +
+ +
+

Education

+

{content.education.institution}

+

{content.education.degree}

+

{content.education.year}

+
+
+
+
+ + diff --git a/src/resume/content.test.ts b/src/resume/content.test.ts new file mode 100644 index 0000000..036d486 --- /dev/null +++ b/src/resume/content.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from 'bun:test'; +import { generalResume, parseResumeContent } from './content'; + +describe('parseResumeContent', () => { + test('accepts the general resume', () => { + expect(parseResumeContent(generalResume)).toEqual(generalResume); + }); + + test.each([ + [ + 'missing name', + { ...generalResume, identity: { ...generalResume.identity, name: '' } }, + ], + ['empty employment', { ...generalResume, employment: [] }], + [ + 'empty highlight', + { + ...generalResume, + employment: [{ ...generalResume.employment[0], highlights: [''] }], + }, + ], + ['empty tools', { ...generalResume, tools: [] }], + ])('rejects %s', (_name, value) => { + expect(() => parseResumeContent(value)).toThrow(); + }); +}); diff --git a/src/resume/content.ts b/src/resume/content.ts new file mode 100644 index 0000000..45fa6ce --- /dev/null +++ b/src/resume/content.ts @@ -0,0 +1,168 @@ +export type ResumeContent = { + identity: { + name: string; + title: string; + email: string; + website: string; + location: string; + }; + employment: Array<{ + company: string; + title: string; + start: string; + end: string; + highlights: string[]; + }>; + education: { + institution: string; + degree: string; + year: string; + }; + tools: string[]; + selectedWork: Array<{ + name: string; + description: string; + url?: string; + }>; +}; + +function assertRecord( + value: unknown, + path: string, +): asserts value is Record { + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + throw new TypeError(`${path} must be an object`); + } +} + +function assertString(value: unknown, path: string): asserts value is string { + if (typeof value !== 'string' || value.trim() === '') { + throw new TypeError(`${path} must be a non-empty string`); + } +} + +function assertArray(value: unknown, path: string): asserts value is unknown[] { + if (!Array.isArray(value) || value.length === 0) { + throw new TypeError(`${path} must be a non-empty array`); + } +} + +function assertResumeContent(value: unknown): asserts value is ResumeContent { + assertRecord(value, 'resume'); + + assertRecord(value.identity, 'identity'); + assertString(value.identity.name, 'identity.name'); + assertString(value.identity.title, 'identity.title'); + assertString(value.identity.email, 'identity.email'); + assertString(value.identity.website, 'identity.website'); + assertString(value.identity.location, 'identity.location'); + + assertArray(value.employment, 'employment'); + value.employment.forEach((job, jobIndex) => { + const path = `employment[${jobIndex}]`; + assertRecord(job, path); + assertString(job.company, `${path}.company`); + assertString(job.title, `${path}.title`); + assertString(job.start, `${path}.start`); + assertString(job.end, `${path}.end`); + assertArray(job.highlights, `${path}.highlights`); + job.highlights.forEach((highlight, highlightIndex) => { + assertString(highlight, `${path}.highlights[${highlightIndex}]`); + }); + }); + + assertRecord(value.education, 'education'); + assertString(value.education.institution, 'education.institution'); + assertString(value.education.degree, 'education.degree'); + assertString(value.education.year, 'education.year'); + + assertArray(value.tools, 'tools'); + value.tools.forEach((tool, toolIndex) => { + assertString(tool, `tools[${toolIndex}]`); + }); + + assertArray(value.selectedWork, 'selectedWork'); + value.selectedWork.forEach((work, workIndex) => { + const path = `selectedWork[${workIndex}]`; + assertRecord(work, path); + assertString(work.name, `${path}.name`); + assertString(work.description, `${path}.description`); + if (work.url !== undefined) { + assertString(work.url, `${path}.url`); + } + }); +} + +export function parseResumeContent(value: unknown): ResumeContent { + assertResumeContent(value); + return value; +} + +const loremIpsum = 'Lorem ipsum dolor sit amet.'; + +export const generalResume: ResumeContent = { + identity: { + name: 'Harrison Crosse', + title: 'Senior Software Engineer', + email: 'harrison@crosse.dev', + website: 'https://crosse.dev', + location: 'United States', + }, + employment: [ + { + company: 'Docker', + title: 'Senior Software Engineer', + start: '2025', + end: 'Present', + highlights: [loremIpsum], + }, + { + company: 'Calendly', + title: 'Senior Data Engineer', + start: '2024', + end: '2025', + highlights: [loremIpsum], + }, + { + company: 'Calendly', + title: 'Data Engineer', + start: '2022', + end: '2024', + highlights: [loremIpsum], + }, + { + company: 'Amobee', + title: 'Software Engineer, Data Systems', + start: '2021', + end: '2022', + highlights: [loremIpsum], + }, + { + company: 'Sayari Labs', + title: 'Data Engineer', + start: '2020', + end: '2021', + highlights: [loremIpsum], + }, + { + company: 'Booz Allen Hamilton', + title: 'Data Scientist', + start: '2019', + end: '2020', + highlights: [loremIpsum], + }, + ], + education: { + institution: loremIpsum, + degree: loremIpsum, + year: loremIpsum, + }, + tools: [loremIpsum], + selectedWork: [ + { + name: 'crosse.dev', + description: loremIpsum, + url: 'https://crosse.dev', + }, + ], +}; From 6402fe564a2112c3cb36cc1081dba0f3a3276e74 Mon Sep 17 00:00:00 2001 From: Harrison Crosse Date: Mon, 24 Aug 2026 17:12:44 -0400 Subject: [PATCH 02/25] Refine resume contact details --- public/harrison-crosse-resume-dark.pdf | Bin 18767 -> 21960 bytes public/harrison-crosse-resume-light.pdf | Bin 18768 -> 21960 bytes src/resume/Resume.astro | 134 ++++++++++++++++++------ src/resume/content.test.ts | 21 ++++ src/resume/content.ts | 35 +++++-- 5 files changed, 150 insertions(+), 40 deletions(-) diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf index 6f9296662e63da12cd2d582e232f5f9d01f907a8..78d553e173cf210948a58dc1f7c02a83564dcc7e 100644 GIT binary patch delta 15540 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 oCu9~WJ2QL0KWwG9CFSg5QxHe~KPVR?RR910 delta 12487 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 delta 12488 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 b4(|aqEZ`h + +

-
-

{content.identity.name}

-

{content.identity.title}

-
+

{content.identity.name}

@@ -60,13 +106,6 @@ const { content, theme } = Astro.props;
-
-

Tools

-
    - {content.tools.map((tool) =>
  • {tool}
  • )} -
-
-

Selected Work

{ @@ -88,6 +127,13 @@ const { content, theme } = Astro.props;

{content.education.degree}

{content.education.year}

+ +
+

Tools

+
    + {content.tools.map((tool) =>
  • {tool}
  • )} +
+
@@ -120,7 +166,7 @@ const { content, theme } = Astro.props; .resume[data-theme='dark'] { --resume-background: #0d0d0d; --resume-text: #f2f2f2; - --resume-muted: #9aa4a6; + --resume-muted: #b8c0c2; --resume-accent: #6b8a5c; } @@ -129,13 +175,6 @@ const { content, theme } = Astro.props; padding-bottom: 0.2in; } - .identity { - display: flex; - align-items: baseline; - justify-content: space-between; - gap: 0.25in; - } - h1, h2, h3, @@ -152,15 +191,6 @@ const { content, theme } = Astro.props; line-height: 1; } - .identity > p { - color: var(--resume-muted); - font-size: 10pt; - font-weight: 600; - letter-spacing: 0.5pt; - text-align: right; - text-transform: uppercase; - } - address { margin-top: 0.14in; color: var(--resume-muted); @@ -172,11 +202,40 @@ const { content, theme } = Astro.props; address ul { display: flex; flex-wrap: wrap; - gap: 0.08in 0.24in; + gap: 0.08in 0.2in; padding: 0; list-style: none; } + address li { + display: inline-flex; + align-items: center; + gap: 0.05in; + } + + address svg { + width: 0.12in; + height: 0.12in; + flex: none; + fill: none; + stroke: currentColor; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 1.8; + } + + address .brand-icon { + fill: currentColor; + stroke: none; + } + + .icon-definitions { + position: absolute; + width: 0; + height: 0; + overflow: hidden; + } + a { color: inherit; text-decoration: none; @@ -262,12 +321,23 @@ const { content, theme } = Astro.props; } .tool-list { + display: flex; + flex-wrap: wrap; padding: 0; + font-family: 'Chivo Mono', monospace; + font-size: 8pt; list-style: none; } .tool-list li + li { - margin-top: 0.06in; + display: inline-flex; + align-items: center; + } + + .tool-list li + li::before { + margin: 0 0.07in; + color: var(--resume-muted); + content: '·'; } .selected-work-entry { diff --git a/src/resume/content.test.ts b/src/resume/content.test.ts index 036d486..a2f736d 100644 --- a/src/resume/content.test.ts +++ b/src/resume/content.test.ts @@ -6,11 +6,32 @@ describe('parseResumeContent', () => { expect(parseResumeContent(generalResume)).toEqual(generalResume); }); + test('defines the requested contact details', () => { + expect(generalResume.identity).toEqual({ + name: 'Harrison Crosse', + email: 'harrison@crosse.dev', + phone: '703-472-7202', + linkedin: { + handle: 'hcrosse', + url: 'https://linkedin.com/in/hcrosse', + }, + github: { + handle: 'hcrosse', + url: 'https://github.com/hcrosse', + }, + location: 'Arlington, VA, US', + }); + }); + test.each([ [ 'missing name', { ...generalResume, identity: { ...generalResume.identity, name: '' } }, ], + [ + 'missing phone', + { ...generalResume, identity: { ...generalResume.identity, phone: '' } }, + ], ['empty employment', { ...generalResume, employment: [] }], [ 'empty highlight', diff --git a/src/resume/content.ts b/src/resume/content.ts index 45fa6ce..05e2689 100644 --- a/src/resume/content.ts +++ b/src/resume/content.ts @@ -1,9 +1,16 @@ export type ResumeContent = { identity: { name: string; - title: string; email: string; - website: string; + phone: string; + linkedin: { + handle: string; + url: string; + }; + github: { + handle: string; + url: string; + }; location: string; }; employment: Array<{ @@ -52,9 +59,14 @@ function assertResumeContent(value: unknown): asserts value is ResumeContent { assertRecord(value.identity, 'identity'); assertString(value.identity.name, 'identity.name'); - assertString(value.identity.title, 'identity.title'); assertString(value.identity.email, 'identity.email'); - assertString(value.identity.website, 'identity.website'); + assertString(value.identity.phone, 'identity.phone'); + assertRecord(value.identity.linkedin, 'identity.linkedin'); + assertString(value.identity.linkedin.handle, 'identity.linkedin.handle'); + assertString(value.identity.linkedin.url, 'identity.linkedin.url'); + assertRecord(value.identity.github, 'identity.github'); + assertString(value.identity.github.handle, 'identity.github.handle'); + assertString(value.identity.github.url, 'identity.github.url'); assertString(value.identity.location, 'identity.location'); assertArray(value.employment, 'employment'); @@ -103,10 +115,17 @@ const loremIpsum = 'Lorem ipsum dolor sit amet.'; export const generalResume: ResumeContent = { identity: { name: 'Harrison Crosse', - title: 'Senior Software Engineer', email: 'harrison@crosse.dev', - website: 'https://crosse.dev', - location: 'United States', + phone: '703-472-7202', + linkedin: { + handle: 'hcrosse', + url: 'https://linkedin.com/in/hcrosse', + }, + github: { + handle: 'hcrosse', + url: 'https://github.com/hcrosse', + }, + location: 'Arlington, VA, US', }, employment: [ { @@ -157,7 +176,7 @@ export const generalResume: ResumeContent = { degree: loremIpsum, year: loremIpsum, }, - tools: [loremIpsum], + tools: ['Python', 'Go', 'SQL', 'Kafka', 'Kubernetes', 'AWS'], selectedWork: [ { name: 'crosse.dev', From 9b840d6225dc024676845bbed0d41c397e1d0d8d Mon Sep 17 00:00:00 2001 From: Harrison Crosse Date: Mon, 24 Aug 2026 17:32:45 -0400 Subject: [PATCH 03/25] Increase light resume metadata contrast --- public/harrison-crosse-resume-dark.pdf | Bin 21960 -> 21960 bytes public/harrison-crosse-resume-light.pdf | Bin 21960 -> 21957 bytes src/resume/Resume.astro | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf index fcd5ad57fbe52cd44de54a35519ba8b1c6808cc0..f8fc6e01a97fd3497242325d06a65ba6499dba14 100644 GIT binary patch delta 25 dcmX@Hn(@SH#tBU<#zscQ6Wip$^v0F)p#XaC2%7)^ delta 25 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 diff --git a/src/resume/Resume.astro b/src/resume/Resume.astro index 73656b8..f876d22 100644 --- a/src/resume/Resume.astro +++ b/src/resume/Resume.astro @@ -159,7 +159,7 @@ const { content, theme } = Astro.props; .resume[data-theme='light'] { --resume-background: #f2f2f2; --resume-text: #0d0d0d; - --resume-muted: #3e4a4f; + --resume-muted: #333e42; --resume-accent: #566e49; } From 34dcd238e40fac8caec335a8c2fd6765a3a4148b Mon Sep 17 00:00:00 2001 From: Harrison Crosse Date: Mon, 24 Aug 2026 17:49:20 -0400 Subject: [PATCH 04/25] Group resume tools by capability --- public/harrison-crosse-resume-dark.pdf | Bin 21960 -> 24880 bytes public/harrison-crosse-resume-light.pdf | Bin 21957 -> 24877 bytes src/resume/Resume.astro | 49 +++++++++++++++++------- src/resume/content.test.ts | 15 ++++++++ src/resume/content.ts | 21 ++++++++-- 5 files changed, 67 insertions(+), 18 deletions(-) diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf index f8fc6e01a97fd3497242325d06a65ba6499dba14..5626287c8f460c5d45ce3db95e0b290e2497051b 100644 GIT binary patch delta 14332 zcmZX41ymf%wl+?JySoQx26qYW?(QCJa0b@|8{FL`1Pku&5H!I(xCj3^=l*ZKd(P{% zdR3S0y=zzR?yB#r;Y#SQz0mQ&aGbnAzJze{|D@$%kQr!k$R}u1h%Jl+1RF*hf((fe>HadLa>IGpi3e#`+;(_%CE%?!u?OY~sj$=v}@G|5Fzw z(=)PMgJM72VpI3@bnF&@j=B;t%l(*|>jeJ(ym`Aw+yZZ{-=EPJi6HxjE9tn``TZEt}^B^ZQ$RrGi*Hw{Rj36zBSyJL{ihuLM zz_r_MP(H}k^Bs?YW12{q6OOGi*Waz07-qt^^=?fb%uET>4j2=!dr#T<2^Zwunh<)x z(Z*y$WJbqPSeF`hP?YnB9lD2Y*mWle|5Bv@Oi!d!g7Zr-lQguDgtLUeRt0uf<(uTb zn4v~6PIMw#bTO8iY=S#G^bm%5c3oyg`rYAe>d&sezG}iu93?nx6%?Za9aPGo2_y*X z#~^i==+5}ioewP`-vcW6e|B|u5a0E9#l$2OE z%#5&Y-9t>d9(}Otv6{k@B~z3|hl|WevtzudFn|@fkC$(UiAwfDmM5)9sK(Qobec9u9Ksl*wY5S-Ivj zAkS@yanXKzKrY}Cm(}ZR%>60Y0o>&_CMpq&9Hh6Kt9nv#@^?6VqWaW4AO`;m2Dj#W z+=J$_zr5h;-Zz*s*kbXK(j_Zi2eok{S*;Xf$lSU^ibtEl`IRQ*rIlsMyo~krP4*q~ zCO5fwzU+&h-EfH|>I%>1p)_=28A72nnboNG*EUrdh;_D0nNrOW)KjUt=-HBCd~I{0 zeCD1jd2>3+)A#dF9J)}nh_6$s1By-hIkqN~=x-IL<&UKNN;jEdBj&3Mj8#c+9YltT=RTz~Rj^5uPc zv9y}+Qgy!vuMvzV+J|{1)p@l`Q7WWEt220u*=(AndtXS&!(bTL21nL;f_LLl)70(H zr*||Os5oLPXsL|KT|lGqNa7WNElZZ%HibcI`aQ}#Xx$SAa$%EtNsI`oSq#*ogAUQ8 z07QI6r|ui49TNSWXqX+e$jPL{c~Sdut0laC0@RW@QMiC|@mJ2L+mn=FY}2{#DhvZu z;lq>}P{tv)ZYgjFB~&AX;3^wDY*tO*^aessi|F(#HSwgx&tC~m_7dS6xQp4au(U%* zk;HrP7`L%EDobuhg6G0v?5Qam33)!r>99vt+Qq1y=%R3bB20%c!iw}t(a58*DjJ;= z%l~9aQZWPeHtWBqE8fvz{CG!DuJI1d4rXvcY2F|1n}1|!>(w0{71;J%Pg2#w6L|nT zQ`0BOEa7+W1r7^-bwGxg2d~MzXtt$WQ>%4iwu2@I7c#PAzeWPAc3D=Xy^FrW2h&F> zqUb$^a#l*laDQywyd>Sw-vy@DpDlX?flYDUXq1`SQ#HiEreov2bj=_wp|1r2TkInKO&b zNp2_g?7nM30C8Dk*8J8$5OYseg4nfGQM?B&k)0t26_mT(>bbh%G3XC>gq(v146FT6 zPzB{K-s*1z@4`62REm|}VShU`+Q#G;R0*0_UBH0J%7TBfHQ4U(P$spTNuTz6O^d?M zV@%ccBXLF*tZK0qZ2kLUJI_4OX_Ppe$Ev~-*|5VAxWU#EDsnTnxNG&rwVr}x@po#C z%k3j-Pppj4nTE#H(!@_5zP&6YfHep+PG*mM}9*yCcHq6`_H3X zU##dtFr1I`Iyf|_2Y%0%T8lMWY{B2@b9PMRe2YLTmI`7?G#t0>hKxLZ%S*JJ*(6`4 z3bj`}T*(}JDD^P)`Y|LqWm`3j)z*XwUUuRj`x&Q*b}1z9In$8VzrUu{(Mf=z#cg?F z2L8~h&Dz8w9;f0?N{HG2eF-9Zd8ms}-lr9s@5-bC>)=dSrMpscDqq{Z4I)FMZ|RSi z++spuMLG)^FCuDNB5{{QxQq1#b~`EjW?w&kMzYx`SYBdeoe+I$f`fcCBP`yn+QJnK z9nQhUL^X0u_@RT3B;~~VegJ>cs!n5kvY-Ih0e`G+5Mj26wFQ@}KwU$Rv;U(WujY7c zf1u0oI0~3{&4h!noL9^DLz<0uYZwU&fHp}}6^Cn)HWJ6J;P+{rMI9{$=KE~}6hx); zkBq-w6e;8k1a~t=)F|1KQrAOueqg1lxzQwRxDGOu%OoM_V%G7RmSW>%!cf>{L4VZp zG!l2|4Z`oPjPK@QD2im)xYMD_kU5f)o<|x&GK7HB`MF^ee`@8TLSY(Q#%S^ax1C4k zH+5R!AK$ojS%Ah%eE8ZW{u_36V{K zO$FE_r~N{@Dt5pH)awdVT^3QY?*%aAQ8*;^*45rF^h38C=7EkCvxDOv+60*yuG2`2 zWj^6Gb;3Ml3BNIaR;W13jSV|TWr(9n;}jQxK^mULJ~F?geyIG8gi>%>^`b;`=z#Vv zdmrIw#4+ER-zL%U2uqXYTJ=&N9eP5Be*8pA+&#~v<)T*oYoW>rq0SU&c%iF}ahw^A zGmx?r({GTPw=YLc!2xol%>oVnaI8-h{IpiplE1&Y5a>lLqttVYT8FTYz`QB+1zctd zzDaJco(a+tFX_xRD*x%D;K;LDJ};uqGGjtT;xNh$r8_(uc#nswHpjDz<^6?Vv@x>! z-PSA>vYnbox(z~N1;?;Tc*Xg=P}`oCsI*~;Q?@E!nLHCTgm4gZ_kiW4u6{vI(2kEW z4O0rg2wiF-f@BQ!zRpC%DC|>l(h*1moJoZzT%C&9e#-am0Ckr$??`W`G(HhS(-yf+ z^higMMp7wU3zM-A1z)CBmTuSW7zQ<)aVqmsEle$p*{XZY zW=WR&h{JneZMfbDh`#B-CSQeHVN=DTsWU#H*VISJ*(?-+ydx3R^KN2324Lv|-lHY3 zrm4%Q2*ggj_{MLwdWe4bau^Zhx<`V9UGy?9+LF57Q~pi+4#GwBtIIV+Z_h_zg z+uKahd8_hsyY2!n7S)d^wjwdOG(RK6_X$I@HxIZGRfOG_Rn<6Y?K#3(A92#kJ|2Cm zO|AOMRZj)tv+MjOkPVA5!IMI37hAl(ELVN{?)Y$Tfq22*mcbsk%k2?G0F2z6_T=ra zXt_+frq#EG&-LR*7<}fy}98At=Gc;yK-=9%^9W z79v9Ng9?XAsVVo?yG!z-m+MO*KGWD;W-*BI?^3-^P?t=xrQ)zv9xYE# zOVZ}cXLHCXnM4r-;rg|VEVyMh%|&2JO^9zOAF>Ga8?ENa=+I!~pZEUFev(O$g@46u znhEbfVVkMFP&5G>e#AowjrL8nGH}$-w3gzRIF{nb&|vg9&Ye*Ouj7d^1tAm>(QNJL50t031l;>p&j$gWW0UhUbVGm>J_uWJ)r0nIZCU`-MOb=3wvc|9vy^@+ED*ie(Z*Cz8(j0%v;(Dr zRBOR0)O|?DyK%?3i5T2B_hY9eC!iOe=RivTosvlgt0$=Ra3^TV!MF(}*A0MUk@IEc zidnl!Cle6(d}EfD@iR?c?UxTmZ1tE(Z;Fz2F5Tc%mtSj6wD98AqDQRHnwn9(RB5?S z&471e=ETbk`tlhqJJ!37p5ZuR@;%zj65!GKvyQ`ei_R4U0aYRFmjX>HbwR~65 zXA;5PkFe)ilL?n>h=P`gi(PM%)i6?&u#%sMQ1u zh7o7-8Azw|87SA)h&Cu~!Yltsw8En5rlOy#B-t-CLX!oDR|%BpP1l@bXvFP!2S()4 zdi+veofEXt_Id}lo0;uw5f7L9xnWwF<&nn0dHTtMzygsq;t&)GWN(tl7YiiiB>lL$ zIiHtA8jd>p6Z)svgg^r^3Y8~H>3jvXFwPfzzjrHyb&KcGLSF=Gl zwQZi-AB_Mrd@5YO|=I=A~g{r(&cMI;`Qk{dM?aFE5+o&_GE zLgPZY;0#7xp$wwyYt8x4ihye{C(+GGH^I%K0^2OpHD1U+-1yKM{<^Ea zr+|gGSX8EVzsvnRPx(fAzA*j0^v*P%^j+0l_W45h5*iBvGzh~L!y|$zL=B_^WN=0l zMdUhDv1N}m`0LH3{-w6Z*uc6?fRfKbZnYi#{t2oXX9{a4c;6r4S7fUmWGOkTcb25dPx z&x9o=LLPu{R52%1RVfnUacAvr6zRe88~RA^hrA1B18@oc1PR2l0)HF~LTJk~>|rgl z{))Up_?Crl%gc$0Np1=?+olmp#L36KLTo+J<)@3=$J4G@P!n!PofEqG{^6 zdjWqE43d0PGgGsUP zrrtn>J&gVPm6@&?xQ+#_&z#nhpJc3HzAK2#P4Az~GPaMg4^Zv_f-O_BXkr>772SaVo}hPk2xg zC*FK4eUS2OPy%=8XOF?T)93fmiOpEgs)6TXx+g-!go72sZ{L4O#ZF zQ}>a}qNf{qp2zH9v#bKx*hvLMy6i(VQ>hF7rNiihyfUV$zEagjQX3EI;dw2+6E7(H zmgt|cWp^AE)1dC~<l>u{V7%h4_cfhDZH z2%1iHVjJwiF2$cWZ)pesL#_^SE5B@^qIEEteR@(f?n46C351RGz#YbxU)l{x=jpMY zshp5jJU`@ToZ;U7FlR z)gIsV)fW~)BOWdC{h^Jy;1e8gC0bp@Xl$O%z9V1jM&qM6@(#Z4Ytru5G|BGgXSulZ;vA%q1B%f9pxPrZg!@UtE&$BLW z)Q zP)^ODw6P{YBAT9s4r_fR3=4Lb%Fi=YWhk@8L0Wmsf~pCEeWdceFjiLLFvGZA@8G-g zru%S0!1wTBXbR|LN1iGNd6A~5e+a{3eMq%5TLY(iRJp=rCxiGoH!NMn)B1%MmHl?SvF+h$w#wq^$ z_nx_m!oFrX)^5`has9&eXG@MVzz$aC*{w|gp@`8r))C;k2{pAIlgrxoC;&dxKwi_n6|U*ieyP|pbn_ zN2@D=MzvKvh|i4+*S}^!m(repi0QZeRrA8Qm58R4aeUaon*7t5?w?#L5Gn)eYZzL;YQ&be}UY)uB?j~3%k{rvN;RBsi^w! zd#2&e_E|Eo`5j>JQgJ6(-T2q&D)DVst-I3(uPw!2Sk#bv?4ioV(dSA--LfiM@k8Hy zkFHlW4A-Fqq+rAy45EBhSQb zJSO8~=WhIp{@?d`U2GherK?u~n0J$Io57|5q zzuZe@V#serT5bs9Zp^q&r8}VGXy@-d$3_OdI!FslW(npNxoE+>?Wot)+TSn8_GbIM z<*bFs(DBe~7Y~g{u4wKrX81}ZCg7iZBHw#KuMmHHrKB4si+@kMvlv7?M9P}wSamJu>U9F_)h}(PXhcaF+^gMaCUOHbaHp2 z;NbkL1c^<<)Xa^7O&y6%#nkn!f`WtVuX4x>F$rXgm>!xNf`j1(S+uy4a3LPnJEAW!tEm^^c!vNU-g5~S& z81JA3{xX3xEVMh9d=Y z0)c$O!W3@qu9l{bNM2d1y2zi17d?c|py6cVq26!yiM%(tpneBKgBL>!1w$hfxFJpR z2md;sK`&G$Bk7}R67%jpuM*MX7woob`o_7|bpG6^0#oKvC5yPZ5?Smq7vTy>Q@Sj% zKo`F{y$ggctLa1Cgnl3nt$>RV#I_W?DzN0~d3WM}x8}Lta>pVHWpe>yU{6WEMvO&V zf6xpxK>Xz3%E)mun{B)Ry+Z~CJES~WtI3)43YB*P)!D@h2BC`LZbK)r)))z1Y#`s> zLF3Bi{XR=^y+W=57RNoytq}xH&#E~Y6@NscFoL=*h7jYkc9!`PsDR(81bhPDTwmNr zs{cV#0U%6AL9Xx@WZvb%ol`@ls9({$k>-@M!6H$MQrnkKImsY$yo*P=^>Y+zZYuJb zYJ+-$g}TwC>Nw)q^@oB^pwS41>i=S{VoD+hYTQ=|6je1TCPaa17L?wM-TGDpW25!3 zduu!`(R@qkbdQ#go4WQ&Ug!o+Htb^1WC$3}@$>ax=d?He^E~7*%T^5XkPlb z%+u%uj9LpEkjBUpEBv|~d}5pl?0#2VMNhjc@G#7;UO;mPdud1<-Y~ALK1ta`OYa#pOw((MFQ%VOvF6f--dAmKF1Q#a zo|{5J(vtRfDrc_(uUXPx^RJ_SIgM@qw75C>gr|S&Hr9?W+~SY7-p}>KvKGR&iHqU2 zQwJY99Y&)jV~*jb(|@7^?vc%cQHk|U_mJDGL{F@sQa0&Rjus36z1dv0T6YqOnFf z;{Eb7q0gno6K4Nw5G~)}WG_rJ^V?#EH|E{bxjE*TYn+ZPEB!pw%QTIRL zIi~eWR#76p=FI3tV}c1Doo5Z3r~Cda)#e|4SK{qW0Pdi)fK$n6bKAr;z{s?Rl0FGW zC8>vZo-(S%ytQ637p4R1&C^%WsY&yrUjbDHond4Nhb>s!i zn94_Ek~BzFg^C_(^eUCg)qnHdWIa&7%DYQGe||Wsm0eFhqz5~P%I&{I*oIjW!`a+w z>pnDlO*50!Uin2@)m8KX&Mw?SeMPj3p`jL_C;QqHO(&ay#QxOdVXyjpS+-P<5{Z@-%EzoZJXdn0_2o6;+Yy}-+wY;j$6+c-%T!R1< zLTs|$a+hkEaHH(8Xmg5Xs%Ym3Yuz7s!x(fFSMX2$T);Q)cazmzBb}U-r>}1z=y7o& z-IR_qXg;{4qEQpl<}?JQs#rD!bgT!|S&Gs`QFT$5LA+6zN?$WR@7YZjQmC4k$wxp2={Z3bQ<+J@)p{}MNrD;M$M*3X#_u{B2ST&WZwIZ+&|%8 z-eJBzSc?)gsR36l8u@+u^g0?8K9a8f>P&)9-u0MKv{9vg1Wfm%%p_>3$)|CMPfP2K zU|d9e3ywz>s<(a5&2_P$*h)B#M6?+n|BAM3g9O%N>9JDbEt+eHFbacJT~_YjRsZz~ z7h7SzU}hXqyg*jkAc)tkD9)9eGK3z7N-F$Gl_R_lMNm)`+}e9fnmu=o-SE30D9!p3>4kQNo*M z%8tQGO~fv;`kbP*RBCDR`7x30qc#BU6CDF8xb4tX!=Cp8hg^i2atczUlxrKm0wYN1 zPlIl615$Z}gtBkx79SpzX!l5?v^?VqxrBh(PV%ey9G;&+jAQZ|M4Iwn2XSm%ypAS3 zavGL|HeD6z8a27WUuMj=1skP6o)!zR!DL|Dn1yM@WAj!%c%j?bCCyvH`* z2W11D83O}aBl_tR@ zb~IUW1QX)y{fOgqx^CQ4B*<{29wYV=pyK=Dardnt0e&j+op-c5;|5N3a{ASa{ECW` z{z(31&Hea}StE@PToSN`Ax)E@+C@Xv;(WOk0e=3JSKH(oD%Fzm2K@}uWLwYKIR_h$ zmQ{x-FP)VFJRed79ZU4qA6YqzXXD_K1b9ORspu7=35(#|vJb?@>~ZHE5l=nT*k<4^ z1~e2KL6(qfpO@0C!u|2DPFt}#K^GwjP-W>Y)#vL30h&!*{Uj(a`mS7?auAD zk>IJ-tqLDFkrL#dW@V&h;gr&g?v_;+S(Y*BH2{&W2txpPLE~6q9-e#{XG;KbT~awx z{44a6xa(_D)cqPvOSk@IB1iDTwF63~)MA@J+yLZZ{G%YIz>*SG@?_ZrH>J;E4W`qU9wc=fei!yI*X>_#?@x`EK1cEXt{N zH)PG8oVkRArpCx#A7rVo*;g>Fhv}rPWv&xef#hYe*a5iR0y>D6&e!k@ zs*<)uM`nBW-90RHR~*=yfeTiJs{>6Px*2)Sbk@zMBr!Ja8i?$n?)dcGIiJbq$f0EM zimlDyv`*&*5asEq-*@}8PZOnC@I$gzm7Z?NlVS@nGS>AeSBAlK-L`6c&Zp9Z3-hW} z*8c@@ho}XRK~GIhF%0!XuJ+7=1h$s@6Kms#`t!o8spscRGE#8q;?;c79{s&`4zVvV zns7k$bx$+#P*eA^{`z#rv5Q$3sw_LDhf2PN6)w;(Wx^tM-7&1JM6F>7?nJnUR?3?H z=wvRzCsxL^a$?fu_T}S?qlM#=`NX=h14u{*VVmrphwqbty3l|!3-d>K>9Q!9km}Py z=}T=Hlf1=*^Br(k(AH>KzU6e`y(ZK4yv-JAYe)UnZI3C4EE)w>vbV1N#6p9#n=5HInG)ft`$9QRr(#0}L6_@ia8{Tn`oE%za0W zHUq0Q)2a%dBPGoOMaK};OqG_Y*bBaB)wGUOm2dP`2N`9uEL1RP{v=(2mZ+{XIQsk$ z7C`)tzlcRo^7ZpPrz_qroY9UVirNkhn>P85C;IA3#M%B9TgML!ySm7d3`)g4jAfpO zgTlglmdwSn#m@&z&A&`-V{Wm^)09B~*R12cJ)sZaSd%R;R>n_eSHVi994YpOQf(6Q zO#Utt3A%ukS3l*fBUcO#5&dHI6uMDPI%~y_J}4LwQT@mU9ye#9`pdkno}W3iYA-M? z^lvhG5{#JKoE;Rbk|A!?qv>_Pmd}?^372;X^_Ow+&AaQ+FqnDVRCSC&Jm3G=86_~b~nZb-nGB)oF1!MsPB{Xgf!H&n7l^VF1sYwl6WHGK*4~Y!^pL94=9#eZhZP_ zm9~|$%Zv?;nny?4dn3s+y3S=v>MQzcdRky@9-)k>>7$<~d6Dw^4Y5XHnIaQkkrphd5`7ccvinGiJcO$hOEy(&nGr zr%zJ`E{HLIJ`iHpj^^N`(Yi2R`mAx@^kXm7g;d8XD>R_uOXdI;KI(EF~gq5-5^wbXXYvxX%}$$^VD z47yIypA{xO)FHiEoZ>DKz)5zx5|&v~^K*;43k-quZ6r z_rku5gD9=3nC?qa9RqUZJr#~l-+|HsO4dpjKj@>8{OSKFVFfZ>n@bs+KwAU{6lb}8 zT6r?x&V>?dZjdBCq_zj8zNMWRIv79NRX~?*jdCLIXNCR@%#L$NiuCs zXa~MFjJOdI+WMZf8*y91 z;)7CYS?3n1;B>|-)P2CB_^1}x^`P*qOMsJ@;Gs}j*bfS){j;35sn}yp%3g15T_8p8 z+K+;zd80KyjNW3rKIw?UQ-VeI)ddfI&d!Wu<1YhRv(<*&`t1YQ&8{3@(&Xu+zJEWO zxWzLSPT-#*)IEOnw&PO(Od2Wc_nsa&-q7t31Q1ftU*O%6BeR{Cq^@6pQD#Lg&d4sIqZzVq<1a#D0Ks&mzc~0@2aU#kx%1~f=Y!N+@f6g8e5X(y~vCVJ- zjLe79`&@R6_{|OBBEDV~I{Z>>ml0MnJ1%E9FPS*Ox3<=$qnYLK2^5ZkZfcd=8C9HA z3KL`yh+J!3#0aKrasL?v-pRI89AucA&_^=^pLfIw`mMv3sC1temn1dke*uOneQ7)S zvgRU=c3lxMc%vubaXX zc6ei+{09tVDp{dOA1C`#T}&zpzICMbv=Oglv79%#$-TLSfggUBS$_xN2qghnDd%E={FjE62VCoMWO zsHQBXr7_b|t^6D(X<*TOEBL>4-ZhtYl!I||n-eVhNeVJS2L}LdmX^UB84I}&$zxT_ zV*q@MHt=JD_|oQ509Wj;DJ!rzkv*5eAV{smW~@Pt0yY@15@c4Q6Qo7Kz?CG6Bqs_c z#z?Bf(g4^psQ=I}^!aSGFihy2hVt+^kJEk{EfgsMdP28JVSpsUXMjYT{bX9cVCnmE z{&|=2;jcO^xy-K7iGudmsIMlr?@AM`y+Y8;Q2RI)WGQ-bV!wXZf07a-;C{s_S{N>G zMy~UJw^$FStM)y2kfOtHNsqZ^Q>s0ShI~KG$|mFHF|bK{f7quJLojKM_crC!(~4y9 zgPl(RRA|7O2V_7zM&N%Cy#E5v{)X`W3q1P^y89P+2IOOB{||V^!N&{u@2Nh~c63nR z#|@bDea5`B4asK1Hh-k!s57Up+eRmGxD=Ct;e8*(jfO%5N$cl~TI~<|HtQt*Rc%=1 zkWR6pU$0s`6R=Y!UMzDIS7BCGUGdE$lXJn=1~-|%To3FZQ6Y7jy+%wQ%I5eu<-6lM z=?^~R+ZWnznesp5dMAq6i46Vh-$pD*?P)v?bIlRBx$3)e>vwTE#2=^xyTlJ5R7O4# z7w-NIokb8cRRnzi^$Q`Mhuh_NTEE2k6<5cNNTo|CCo*ouc=Qoh^cm`Ddpqj86#eUa z3Nm9M;dJlL4-8Lm(?!tvepFmouMY?7i%{TWfapHm_EhPGuL1NqF4UNYA7Ey>@sTLc z4n9pFJ7Z*6;sClV-dI_ges(*fMIGt|MYK)yvV5%K3>GfYGAZ!RhqQ0n1Ycuxxq~v0 zf;s(i?f`-8du%b`W?~hzjzVYKA2fmM_$d#|aGg!mF55F8ZRTq-{X64JWN^CCBMx}6 z*{IC{ayIG&lCeb0gVrBW99Ex18LcBaK3MV!FO|32!cIaDhGr~Ql7b(*Vb&BS!h_8- z3t>j!>YilS7f9hG73J~no~zMa9qX9EKRM~~{c2)UE;8?V5Db3}JD_T%8(R~MrXIh= zg(QbyG?P@|fsq#s?|2}N?lTit$_|dC)YUTkIUPiHEJ}{xT93bb2X&8quP*wc&`G;K zs#&BS8=gFiq!NlnU=oUoW?4eCDLsry(gSbMJ&$`IA6*vdP+1h#G)It~hkgA5d&$E( zK54alw=|&X`o++kCwF+8#xr8_6L%SJ^BRrjBpv5A4_{_J!P&k8^v_R%)|Ftb`!dz2 z5I+47DX$a<7$nuqdamhwPV4T*w2xRPGNv$Z z*w$O#l!VaTghZA^3`wfBGZG z7aTO|Ak2X_)cRo)k`Kk|Zy=;DK*k(_k~0t5T!xXXp7$M(6wVLg=?GZ`%BYaE0ThF! z5OW#opm5E~`HO69GCYYj3Ev}XgqVE6(mp;?|4?Q3)6UB z;ue!GiWOeS9mmU9>jwDnWW)=Q646V_^@q4Mr2`q7s7j1d4ytyoqPA|O5nAA|@iuT? z;x(yL(sxfJEw@yAf8uJE_V#p3EAFYBS^hK4GHu9(b<9mYb3<0tn#Y<)0R<8$cRuZI zQ-D1CHQ{%Aj*l+L1sur5vc{XL5Uj$wZmQ@2O$^;QG12>j#FS-+1ET5xg4i%wX$A9Fxvm3>TaMM@yx7ssrXe+?DZpJEX+m1>OgbwGQUMb~_;-$R#RGRV5aShmIa47^4P zrtCPAQlda;U=_=aZf;*k?e^mF=H|J86&!cXh$;mAkaB*S9O@9cB~2}kmyw(4o8m+!%)Feti|c0a zn38b*d(k`0qacqfd@A6+FYe`hZ~!eOd9C1iHu#z!oQ(1sEPV{CgFALvD@A6?^3yYi z*(b&DY2)2H)<8a8P*hBoyirHlz8}_2P339@skV{Y9j&h>Gt>OEbquUR#~%gOHeD!%Fnr77NvELAT{1E8W8{C)Za4&~goshSaNI>a|fkl|k)J@+%S%K}_L& zE2b&~u;idh`{Kd~>eJZ*}_&Wp`-w^FRh1h7`@N^9B%@Na)qG09| zszCp@ujf3uD|>sJ3hqg(IDsi@nPRh_*Dq3|Ce z2*e;MdKCNE7q_f@ujyUJJ&0=)Wrt-hI#$uKx;i;>c=o^>wZN-&)AHFBs0z2NOVKty zn)AI0S3|?#;iPhuAr~RGyLIIE6-)-}I|K*Nw*)81#2-bO%fC|VFc0a8nX=$d>Y3Uc zgmG&g=~PyDxE?gJRJb;zKdAJXrJ~6x`-_2JsIDi*y-D`_ zPwBN{up)gnr0VZ^w1zUzt4r5_s*N7a22={w#8z53Sux54C$!;VBBbMf;izEjvmVi} zPCLq_6+hW$3_D(f-W%*BCe!k;v#WO8zEtN1A~XMNLNI7>SNG(>)cNUpZ zRtEJjaFmvDHQ~0%8f#vYk1;`P>A1S`dTo0IWvBhw zx3hZ-9YW#NwUmJ|-wjC4`Sp%A>cAq8jduP4&;otgAV{{F9Qwa~%*qU)1^msv{*zDT z{U;#{;DZE_;M7M-Fd@SL+26JWjL;t;n`-2cS0xY3zv+#Z#e#84)E_C$N#GEa<#NVVy6HCA?oUE zaBow<3kg@Jh2`V`LTc1$n7DcQ-fa5oqHv->`ul-{kMA#I{!s=1^6^3r)dj(CgZ)PZ zJ39~Wn@|2##>e@8+Hr8O|636|4}kA&J^jzVJV360D`)570-u&|4eZlPP9Ne6Mw~fI+1@f?S{d*)F zd>nxPqnHl}__r50__(Y&@4p8E0Pu11(Em#@0La1f_VM_KF#sSJ55!xO7#Rpe dVpDT=emh{m4awCcL+0e*1R&AUN-9es{Xgxwlb8Si delta 11825 zcmZXa1ymf{vW9U84#9%E%M4C%cM0wq++lE;0Ko}1NN@=5?h@QB5NrtU9wfLt&bjx! zcV)L!uiCZyuPwcL^|!jF7k0QDHa-}Ei<6TpA&lZ5wlow{Z-fI8g-wL8!%9H#;B+7} zueK7-8e$J80nvsxf#AVQLT=%WVYwj0hV%$Lyu3V+AOun{5^PWRq~#x0KUlEXSfc4T zQT$`UcRtLtnv?cR>_i_b$GSnv7adLe_>-2UlWRW-+%iG=L|{CsjV7J1Pux)%80r}z9Q>bOm5 z!kA&PF1i9vRR2SlhRY!@Bzpv=dOn%rgM|J}k?`4Ay;~O*B5U)M66((d<4W z@!6!1{+L1Ilsbs-MjrygcgpB-c#iE-D-JMsjS^j}&sVa~`Eu!sliVdi)N?h*LM735 zi3)n7;vaQVCN@qSeu1vT#=kt*0dZLbKD~%c>M^YtIZW zYxRC7P=WQa)JXkGm*j}|MnvvdUpyONJJ4PuZ?>LggzRDhuf5uFF?*tW6 zs<#g`m9MT?V_Q5~q8YK*m|=mFQdD9~_SUEh%HrR~t&Vg{wh}gm$e)_cLNv?g!T~R{ z1wE@1#8#3^;qoERLK*(^eOAIn?j7LjdZY~Q;R>^|^6IZNs>HWjz#IN7x2Y76acbb? zmcR0S?ErS%q4^jC0uR^j^ngCV;#@2x*X|fSF_E(o4_CYQ@B*}zNo}7H{8i78ajdt& zTb(Vm;wjkXi<)|h>eF68b|;r~PBr>0rPS8jKepO|jJ^~Go`E^Fwb{uw$l?^uywl4FZ*8yU@#80j7+>l7$l>P}fNng;WR z0)CDgK~Gc>?O-c+x)o|OxifPzT&@C>8$mKbn%l^&R4Kv8{JL3#D~p%hVWUi?qi(dJ zVu(vmFUHmGM{Prr{`~IEbAnKSB}|dpdDL|8T(Hl%3JVj)wb=*)mSk7=J&*4nN zh8Ea`_5}CS1QxV-LCW_UO!IJ+zzj2kcz52fDsORa3z442elHgr$g6x--jXQQ9wVYw z=Y{P;n%!kZoK}{O;?f2Gz?aPzNDp>%Vdb$b9YD!|wW^}Z{lgTHpxHvDsf~@= zq!y(5sapS@K~cpEZ;|*-=|oG2MsG0FFHM7F{VBWLps{g7&3CsrywrNststKs=c<5a zHI0cClpH6Xw4cPSyb-4Y8jjecKjC631+|)ShMTCep_6Ov5d|Y)1AOU(6*esnhxvWI zGD|zOA;qQ==p(n72fyj8SjNt&gX0t}$x^zxJ^?}7TSZCCU%77F3!7bE6?(3}aBF?Z zok_vg>g$SR{qTk$ugPZdorNAJ*5EbHB2}o*<#7|x0?nkR>jNv*aIS!a#}aiqrGe{7R(&uMHQYu__Y>#?x;3w}!#7=Phrs%&`YtmHkjqS*cW< zlVgZ~ah%WsEwpdg!mdF7Ug704RTMZuNg(aoV{KntSeOiakmzk$PQSpDYMUcWbLeLv zhp+IBhw-f6IM5bKRw8&K#T3%!MDKw1(en)4U~2&ru@O`#y7KH+Pn)@Lm|Ep}eTmT% zD<{m$TxNZ|`;?JMqaeMDPIw;kk$lO>?qCEOiG6_Gp*d}UTdmKHm)yI4#)2UTr-z2S zAMiqtj?NASs8ZCre!!@6a<@1xp`PDeZB6?89>7EEl8O}Da7^87@8UbbtAzFc@HAJu5ATU%be?T6R3Vq&%_R`BWCFRi+`mhw}PX0oIX_tp#x!jF8* zH1ISbNk2RIj?4}eIfcFDXkw0FLuc80EDjg%evrC=+eDwRmlQ)F_MSc?R;RLy2q#Ph z+imk#FA2CWK1tOdTm@O|WKK(I7+CsCKG9bZ56-*T!kjNBDxpRqDvafAVh9zClSf4$ zRW~WwRiM$)@TCTCqJ`^KVbs@`*uXE(Q8zD&>Hnnj{XipVStzZ+UXZNVcPxia6h1z# zwyB%~j!uZOXk3Vje0_ODIi!{5Rz!U(X=Rr$NPo-YHO14PA|*u|;|?U{M~viddCHK| zZ1Igu8Bw6C#v5~1ud)lZcN9ppE5#uy)Et?iVxcA=JO(A2Yrsf-;rcXwIH_2s!v7o2 z8z1);sW1^I3`#yGg=V|FU!uSBE7u;VF=QnMjxzXxWRg%Xr{+^?rQ(RTAFrTK2_j9R zY<8)0sYcl_JI3#%tCgRq>{hy+JIiBjG8|5%uFi=16>E-a!>psfR?_G=Dl_rvK-fa> z0zWfETK@*bbJ|!_;CR1t#`t-pX~luz{mqUFU2;cYG{h$d5zuy%toiY&sF>KX!k3~P zT!5ZaTSpEncId&X>U5W_Twk@J_AT7-=jlHCS*KU$O;|_YwfAg{*`UH=Oyxd8xS)?B zf#!XTBYdZwq&8YSgHuVjEH&NGaUL6o)Alb>B%~Hqt%t8aJVRT{nG$)`#3#5wU;g~a zld+X`D3|DDVT)fw^#~=7Wwc{^Dmhj71J-PbD=BTlf&F^Xb}m8Ma)Y#;$4=VhGpD&6 zb_)B0981k*wDx|A8Mnz#sOHkk0Y;}i{u5_1M?W(4l3H>hfkYV{4DmeF7f*j5rEl8_3S^)S1~92Vt0kAOaX ztHbrHoLCzU9JI}-TDEy6#7woA z)H&d?3Rvz&RTMpmYfm$c@=rC=Xy+s5q>-mWolMA(j+5G$VVt~RUxJ)m$?@!LMG!ds z&n^E^4+JT4K}Eze^|E4PPx%XD*2zl{W?WJ`T;oQC>|{MtJku%aqsw>I?a;>Up1OuQ z&0n2Kz9L>I1-ZYB0{&#*9Dy6D=6V^y+3crM=GsV%B1R;^AP!>&1`=Rs4;ZKBjK2Cc3`4X$0Z;AVNuD0HT9X-mRDL;p-`blRnn|KsjE({sNtz+_7t$| zsuRqD$DTN2Rh%F8_+GE&yMnVgJK^Z8TV0q}q4m^r!gb90%k6yc4-Yum(%qZo-5%x? z%PqS_N{JQ6^dqQ*sd+YRg{+y;|CgM*{JY{mE@O?DF)=hpQ{5AAcm@xu&u{Vw@~~a& zUK+5L*`f%mY)LzHjYQTet~6|i&Ptwt!zF4DW)CnwN)xj+P-X;a|3cVP4}0K>Rc7{6 zNvlKXI!KFh%Li_GW+#I^-C`vfoUL#1I{DH&d70lg`al6s8AO?cmm+34hz^vt8GQ2v zQ}AKSd{nTQbz=6PM*Yp4DSxTsuni0ihK*BQ0V3!KJW{qmj+Y;`WC!sgWMGOtVH+r* zvmZ2-)k6wn6?#^vnT~|YFJMx>O2^tc!4&1*IAOO!l{1ucoGicwpuAMq7#oQrv!;EC zo266#p0|`&oWHR$2=U~R3Cgvt~VL3Q7e6(R-UTA(pCdJ@tki?jc^{A7x8&3QpFqlMxilkKA zetd&V^yc%b*><}i#V(K1SenOeU=^<+r-@@oR>5e=0h2zs0YizuR83e=hL+=l4NUf| zfP%m1Iul9Db299d2gfJecjbnTw=hhT{DHLRn-S}xn3gf!7GnYU+{8aVi1GFo)`=;bE+T3#0O|QaJ$CjQVvI)so{&dw znHy>6n=T~v`fC0g(AHfUbkJjcATHpf)?b6l8;Wsc`P$JsUYaE2zdQQLVDuTOd3Alh zn!>4c?EJv&*HU*hd?p8}o14`yJ%Q!*9-nH}=~=vp6Arsu%zdWY)-*G=JYyd60Nq% zQrOgJ%$JEh*b}Ke*Qlq;vi+0M^rR_a1Ir@fA9PP~!4RYADpSIr?yj{zPE8l;D7sIl zTY}2X;xWR=ik4xPyBCp;kzjdIys>(zreRyaPyIDcec4%i1SoF zK|%P?k40b01>ReLZly6Z1M&Fovjj5q4;D98<}& z$P0xlsyQUf2uF|+ir>^%{Gm~B8v2D&$H2CJ3${Y~Z8OCOXAADUlTR3ZKY*$fp-@cp#s<~|iKSs<+a3J?ElIXs;cH4dF5d36}8H}ZYuF?qP;?FUz zg)*+LPlGe4k%qn>+3QkW=K=)2<_ZC{Dm?u$G^6j4=2ml|)f8oS+GbOtj_>I@28Pc0 zFAL#HrSY5*Rx-C%><|s-H<)##GlBDjsJZntYtG)QLg9gd)@X4HU*?AHfVT~%g3{R< z^4gHie&yTW_p5p*3)e$&T>{-#7~L;lrMpj_?7-S}wcja^JD>IUG-G|#yo=!OgswpI zTvtCcx1I=d_pVo42qjc+_{CliN!56@d}4dbTztN3_$yE~Tjwl{u(-v~gYZmD;+l69 zxeO&O(|iON;(Y_(Yp>yn%e(_WW#@id-Gje!Xm}pQG3nTbhan^8`^AM`M^(@VB1s`8 z0xts=D7(WZF~2$SJE@H#-5~8acK^=Z#gM>6N+@4xSOR^{JKa&|LO4N}6o=P;pR492 zny(f=$%xm$f{OSjMnYULUv0VyUs7#~5f4kk;05??T4gn$hlBA7FtBbCD4qvD8!~hc zkN2L@To*o2CNJMOTuY0c5(Ln!(Dp|}0T0->tcmTDpgft0?~esVG8q%(Dhft=pR9#@ z?=D@}+pPU~QMI_jFFJgwh((j7W+|BIY6!;Luig+@i>;!7Z*I zn%q~cr*EoACY)WL*s5N@5l3-1f+6JwE5^xiT9q#;&zjEt=UrtMd_7${0G+ z>(5#6DWdyon`f<`ajs{RV-@EHZZ0n+j7!xFD{@eNJJtciT}dZgzNVyJB2?0y*_s|D zvaneZ&y%&qa%g|qJU?zFswHC*A3CtA@aU{}n?sFuhP69A#M4)GHdxzuWz%47`O-3* z;By|}*L(v{wq_q7a<#S-a5lTzd};PD_HK<%<49X7i+;>UC6i~|M7-$<{3nml`o|s1 zw&%O!SYGdIi55;j+owkk@rhNLn_m=mckiwJ3_E&r_9+cbm!u!X)>J~->$=o@C~~Yg zmLCpjlJ2g&ztobk-6{`A-f`~lQ&BK%o*&1(Ob#04Fyp#1w%H%*_W75D}qt2f10AIih-JuITxINQQh~CSWM#;$aXs*OlRP z4H4u&^_$nyvg3AiOLlY{;L;^fORMA2rGNW4;(5X!Ny3o)w%yS<{Zc@F_Gca1va;r^ zkIGS#z&3yQCe-#Gx~Ss5SRI?s?{WKRtl+?f7XQsg(COLc0s2G^_Uy{ay4!u|x~tOr z1T(#9q-JX4(!VE4(9sD)sRK(&_U=nu7ifsj1E!Tk?4~w3O)E>;k31Ix<^%h9rXFGq zR(BliHhX4=%i~M|&Kr z)i3C|W_FWUzeV6G`;Lo!6oav0^R@k|psaevtEDHvUqiHdPPUzzW37~xi2)q??xEcPICD;SgW|)6py$VB9Rbe7%fGZM%H#^chhj`S_yMi zVbo^cxN&I0Ji%lkOsCq8n1SAk5*>6Hah|myJs|u3re*bJrOCg*ypTs5rWiq!=N{nB z)MFEzWxRw-1DBh?xb(r%xtRrF!AX6_mSw=*?}4EQg!-^<;Ay*J68`>5J92e64TCdb zBi$}khZXX*7d_VEU2$y+*_{9k4bjNyWOJdj;uOpb+NY~Jkn-uWMA~??2KinH>+aAUeXOqsCp zaae$ZWTn&_NPu2ucUX?KD=L}s_$Df7{jHwi8&Q>yuK1&XqyhK!P_~e_xiGt|RUInf zHfk`+1XJNiVz|Y%!S6C9u;zgw5Zzv&(r}w`H}(9FSZUS`Qk8s)Vpj#HJzzLp<^bwp zLcb7!3z&cb7{U`{L2l0K9N9%dJDy_m&AXzT!_OecHg3%9wQE0jYLjLXApwPg9(97xfkZn1u9NYLLm*AJxt! z3qROuo~{L5j_zqm6>2SAi^=hnv`PN4oh#N_>%?*6B+PL)m~<4#8S!yKHnz&0?_{I> z36}ktqxM4UW#Z)Jza7NXaM$h&v4f4XByXe`M9j2|F5puJx; z?{Fq0e{^hEv+5+u>bLPU>ChuEz?N&OU8b?R9eu*m9~qkTCn+ zdHZt0WA`OLTE!fVxn^`$KIaphz_27NDy*^doL~ie<36=-qhiDT$kBo1$E%rSuwv?P zXKERHA;mXU2anrAYg#5{dHu3fF};}l0B%H{3)t0e5`M&DY{YW;hh8#{?2Zb5?o`s; z(n?xo2jS=14Kr;10_DRz5*K*pj8qwUN}0ZX6KN&GZbkl#SZ!Pj{GBK9AihHs+00E) z>evbo+dh&?_%4fJdgZs`f_@r(@X*`(JPmka#m!&0dFSqL6t{bOns8F{0x2K6ew%ih z*?C_0qm{?{!9tZaroSc0k35tw;=Uhk^#;dC$#*N-$)7duE*Zxado|rvEtA|VESx!a zWEGV`b&w`cOl+HD^dJFeXYXo*YW9^_Y!y;;oV5&;Iq_8E89WY#A{d^8!JH-erL||V zLZS)DO$ko9u5k?@1O3G06kzWgZO9M9@z$@4P3w7>srBw{rPHEI2kGt}_lIr2=(4S% zi2d@V@-=w{C~0#*Si8FVgRocs2&pl3=r9tx|lmWw_O+*MN)lwKhZw_fSY z-e9jmQ^jjg)VP#uxiB-#*o+OSzr_|cu>(z_U>bspI0*(>KQFlZTG3^ST=dY4S`cED z?-pBYaX0?4(63D{2�hGf9C+_^fTG4aD#lyOjRvjGp38s#ko`1Q))_jAOSpCDVde zXjZH-|#)N6$n@mosDr%a-P^vp2isAvfO0%SB_~q|bTcA#Bh#^@WUB zFtsL@_z=183=QiiiKmj&GL)Kgfvzs}wtSJ`NREw(&LJZ-rWMD;MID07>G@_G;>or0znkA*7lOq!JS5G>KwS!3XXhXU_c2WcHv_?`aIy77-qIW= z%A_SnDhVl(AsbF@M|%T01oO|S%|UPLRIE9*OO<5Es62vbR><9ATG~m7+YCJ-Yip&9 zhV1+vN^fJpG{#3x9zW>^hj9O7@!5}mfma^&*NUYtrdKn+Sl~Y#ov_UQyqE}Tm3iOr z;LwGeKQ!p0@TH;|426fo%nc?bt37dd7Ltw5&VT#%tpOIm**=-q_Kk9_uY#pJs;@DJ zb5YE;%Vz_T@6&TLP>;vQy4_y+3#^0t*ym@=`RooDa2?Biu+DH-p?9+M%6CKWprR)7 z;>gO6^cg=!Dv+&YMrhKo*f}W3wJ=pMm>~IMCi;R1hD*tetJM26Pyj9a&0wU zN4!!0)u8H>p}L66CIhYy{}ZjPGFJWT7r3K(&~9FA)>*Wpir$$-_sEhP^P4?7nR;xL zi@Dp zK~f=89I~FS>>8trY}`00p6lxaHF=x1tgYf@;{4>0k?Wq1mJPK}E;Nkkh01jvM&uld z;Ezhg?m#q172ilcHdbWMfmPslTPOZCp^rFk-+WM_nVa6KIw2>w zCsvM)iLj7YTM|LDB_FNBb*%0M4JOWcrfchZ8AkuaU^~x)bY>0pU&-Et>n~&RO_@-Q z9>&-68dlmGopE7QG;))D@z_U()Ov%;z(Jo;v&=FWoZv0jl1f4YDGE!*Z_znE7IHck zE3WpBbY10R1u(jZRU86HNJiO|=ZkZm@$ZOzKw>tBP4<^>TlG7KjQHZokI$@4hP+Ed z!uG|vDF>+=9J0g{5X+9UZU~1WhR5=vq$~8z$AIr9%r^O6pTY{wVJWuO1xisDFz2(k zed>@M`=7Rx>z%@{vqt$uPS+_(lN9pWu1#fQksBMU&i+dqApY+TUhmKFEP%kpnF}ex zvzUF*DrXhb!cXmGzN#rgesFOZac|S=NYu>CMYf!O!GxCH21qNZeWcyHdg|=P$A^Gx z5VovH$82^0P}EpD z+l-iqyc>huOO-?1MFnrJL{~4C%zSx_loSH9yRNUME0@!Lh<$&c9|cK*iyrX;rn*y9 zi&$ZPs$7~TFcDg#i*=2ea}Jy}Na$)X>N^BC$+<*soEN!0=$2&CsMpU~?eY8R2n7i0 zom}e9-dJUjVeIy_L_cGolFsABUF5sFoAuySP^+s}KK#zR%I{xW*^Tg=N5_rj ztNDF|Yn4>_&{vh4Cu{!zY;m)y=ImV3TCF)pc?glqTg9nngY1@AA4vf4w3IZe_m9fFi+uc7yr};yN#rB9r6N^9Xz7 z#(eAE$tazd02^++lP2w(eu;d^TvlrhiizbNcfBt}?mri}ijLjESZjANWhK?M&R?g2 z8kH0J&VgzE(L(R1_o{LZ$N6lOcUBdwhZCQfFW(2l+Cp|`g%IkrV8^v0ily{%5MgyO|C6aw4BWLhl4+MzMC$~CC-Q7Llb#>ui3nY>fx?}t z#p7T0Y?USx-NIo%2L$BuNI|o<_`Y{Nnhk_o=TNKP3%&kh^jwOfVDwXlmf&raqe^Og zX<+{`0@;%WL^8*DS;vfN4(xarA^-+F6tvcEDcX5dGgoVt(0o^T5ox7!bQ1Z65cRb| zerz8Jov+^?ED&v3F-3>gYC$x}Ea6ZYov^RoQF7wVUq>|MKEThu>n442T|(cncECyU~J7(ab`P2fbM2fP3gD%jjH!U}oC)WlibStAoX?U9r4g(IKQ% z2|JUIlRgP(g5-cy8%DjdC}q7h`_rq?ww4kWos4{KmSsYT-VNPcQBB{nnhx5WEUS(g zdbVN`RtZb)zO%3HY&cCvegt1zNW6zX;-{Rm;EpBqNs>9{S84Bgf2TRDkB*fTblpYPfvsG`4aam=9y5^RrEDRo|U~?iJ0=0xlz(0}GbO+z89A^2zcdWwc*L zUHwDus#JKRM<0J9>f2B&LPnXWe`Cc&8awYpVhDdMz^WO3=*W&iR9b2!qa8C@y-QJfwzTwY{6$a{)g^wbJs0RRzD$P zfCUZHxfl*&*50(k*O`a=wLUU@J~Ffs`9{-eI-P5|_f_w=;h!-ABSNis<8XC%w< znz|>$nPrlEL`D2qOr3a-zgX3)Af71!;12fJ@g)pJ|{oR6#&&+$HP^#&Uv-W?_Jk^UR7Bf(FoB> z=EHj0Iyk2lHNRf6tiQiJ>b!WKXMe7qH!!imc%T1p5;TZZTrHNIGrPq1DWCP?Eg z_D) z{gaq+0$-sRGo(lag7Y_n`xnB+`C5bbipX$bfe=^GW{A8f8idx66wJ*D{8zSR1etKk z2jGR?1fp^*ONZWZNlC~>zQK*QEzb*pf#Z8u5Gfv8KfD~*f~;;!5P6m6H`OZYX_{VE zo1fZKoN=GhAr$B70?Ih8V(|GkW+P2BVs`wb@VI8uu7^-m3LTo5ZLHms#|usBac+y@ zJ0rgUTZ$?%_~Q43lMH{krZ(wPeqav17MTJcD9kI;jjCgU2!ihBCeBupKX%(XPl(OO zJ)d7YLUSUjhm<(YF+V7aVt_K*vkk2|Xi*E3m@Pjnco?D9^?}!DzBJ6XzRU_>Vkzn| zCV!@zg~bbDR)Z@OXVUl@%&CS11xn+TAf2Rv)d%qQD5VC&F0>pWGQA z&t@x?Q8ks?NKGPX$mC@uCn!`TWx1&%YESF*Y%<}`Bk1;?ozSb{%HQacn?rBxjKW1` zvk!7E9!>kdT=oC4CgQ>=O$kQ4znSa5@l;Meh?p@x z949|S$Cv|wm!F#l5@k#W&&eeKsWYY}KkQV}LA_V69j|u>Q zkN;KR-+}=E0q*~b0|EiBVE5nS_<(N?far+V)*gB9Raec*9{PylXr?)XsR|2vk2fM&o&K~CVtAZrLQ5GI5s2oq8i zR0&}TYJ?O6X+Ro)vxAtyML>6uhTs5@2ptuWgPRQ?C`jV!=3;JakKmPgs=pS)*y8NB zX*e?lF4s^^0Z!i2`nVF|@7qI>fR>5bGYNVV)H37BSnvF7(F}-mPpD&<$lj*X=F(uq zUJ(c=ntx+-ju<2EyRfC};P>l%xedkUjEa(q9@~7~xpRDLd|o=O;esE~csk9=?%Du~ z&eWg0J){URQ;%+bX?wYxs(-%Obl;WhQUVP32yFyPB~X^eF$FZpo&rf@8%D37jE;csBB;LFRkU6P`n-Ng}rsa!;(#CCx3gs zI3LR~NmOhK;E3}oR=7t^Qo#PivzG}pm^PW!F+p=>1VrD}O^}I9kg7T6E^d+9xV89I zPF3{=O2iIz{xmh^4pE78y4yh8^1GxzB5ycs&YRGjss9 zzT8SU^sZpn?X%>IV0=NQYOz!>e=yvuN0Lv8f*0)k5>T-Ol~<7 z;6#osJY{~NGP zJG@Xlk^wu?d@o#4;~Nt#VjUb#!eCHO+A;SjrgzCA(KT7GjO)+&;dpnuip(b5&wFHy ziY>EVbM+Uaj@mSwqysqBeN2i#t^_mz3r}cyv2h9uz+F9B);uOL6^R#=b`1Z8D3Q#~ zC&;nHzzoZVAg9Ejp%3K9Hn{{c&4>J@Q8IC&%CjPMYNB+s2`E%sA5ALR&x&pK{n}o9 zpEQ3rbC`nq{EQ$Xdu2aV^pe+V8_$N&IMFH0;3UNHQ+lE;DXLq(Aa-~Hcl=n+*o9|$ zry~Lfw&|?xVo04o4CFZ%e$+}0IbyMgm*${SBoEt*VJMQ0B(gO_sOCmrTx_#?q94${51V{5`e@N>F@-HgBrm~?fXsoraPw2W z3P$3J6zB#2Axf?NGF{jNh?qoFs6{IneCG**@e#63MK&jhMOUrn>yD2Cg5OL5qD$8D5LV1_^0Wpd~J!;Wu zDItMvp)sD(oPKQXtLb-T5XHdAuBbA0@nDdRjM**DC#&GtMqg{7P|N4L$;35Z>r@zH z+?-PRhAXkw+dA_DoZdD@M7rN^bI4U=DH$G|cQxNfOOVB+LEn#9%Ixw{e>5qxsHTXL ztjx(L(;2??RR;=AR_FWmDW~z->L0g5X}noq!npcD14yiS2j|}oSq3Pi%EMU98g5C5 ziM}dc_i!M)&xPLsof;ni$9WA>ES8>l1ePZX_-=SPSCx|9Zlx5|xpFi8^ib8;+^8nz z)fX|~DY)^uEZ7iXAGKwWHL#-)nB_>#HR*nTD1g&og=UQ@n+2$N*s>NY$$%ApaEZ=W zDNvR}&!I`An4v=&cmL6c?Cnk4n#fzZr==2NlNLh%?Q1UsuvLRb5_fFKcDFYX*C{vw zCm53{ISt3Lkpiqei7FhUlRnI@Cs_wFl#1F;4?H8^CL&zfCNt|QAux_^i{UOFxz8$h ze(`MXE93=hiVA5xc2Q&#CG{v=Bx{BV>Ugg>2>+rTpJy1mDjzHlGLpT>jN=<#1MU_u zdM5ff80t$IQ1lt_e7Bbzh-s|*O^IfZEc82RI+$dTwQDj|crn=sZlx7ACX>2PS|cvN zEHdp{MKm!X8tgHx)eO8!{wOMV04t(CFs@d8^fy#$d6{4RR%2f0s+5%F5OOd^vdnh* zYQCBeHYBp1#D3vuPed*HNJ5Y-2i0A~M<`&&#AiCRT+(MV~u6e=mPQk-ZcJwi2(j!ERFHUSf7c z151^?W?DiHi_s}$ptTLVWiSz=*}5>#YBKQ`M!v~1aXhq4ns_M_p2v_D_Bgv~23!YP z{pZ^gU>msUSeKDs0fA_oi0NdxY%EkaECmy7s42vF10c?PaSIe0+mM@WDdH#iz+gLZ z;N?}?>hCd1V^afCR@mXU(E8+U8&C#(j6BR9i+D88T_jVFLWiw~YLI}L!H*YROtLC9 z8VncjRz0@J{sqy}-@>D2QUUIy&4;3fOxqF;)ZpsI_uFlSn!)BhQ+1^&t2$%;NcO-r z@*&7t_c$rLtf-J&AEL%CX{&9Y*}g&YlXs15sjze-%y!nY483|gr29cO%_pTL`Jme^ zbKSQBd3s1;cu$6xy}Rp)KqozV-L|2{8ZIbqvfCeJrO|a6EsieZJXmI9CuBtNJ+5vk zzyzH@53)~OPz+c%$vqX=$j}9L7dJ^TyUezA;GHdweLY(c*Ny1(ID;g%IrydrWG3!s zS+ek@XDSn~833n3bDY-KNIK(5o(v^&uQ;gUIhJ7ZTJqtW5t*^$QpOZOZBk&N#ZA`B zheFDQpxh@e&!iLbv+}k5=AZ;mCQsKBVBm>GyQPuY*AM0Q5&{f<@WrsGWx>t@xiqU3 z-xLY?HZvd1z7|eOw?Hu|8MiC#e zCVIph>eQdp0#5AVsUim0WCpbd>DA!k1?clX@~@DU)iHgD{-K9~K%Y5bQns8a4iu*^ zWlA>v3R@_x??SKjsid^gDmQx$;7VW#-Bakw?c&h6a@X z-MX54lWzah!l3Dhi7W{j#t=MCOblCun$}C0aN;+wQ4XIXQ3D!gAY5H3B~#J9I9=Ip zw6aP(4RSh}jB{TM6-|#&9J|e9Ja8c^MJdzC4LXjF;sODImh5J}Gckf{wk=P&sjp6S z-mDm9nt6oLI;8BoDn)7e2lkS-1y?Cbj^8{ef^mx6S{}@BYb(o$-m*p@4BOt+iweh| z^!Lxh7%qBTsC7hD6w_+ejm@MLYw-$S{dX8;wJ)%OgT!_29Vi{$t8?8S_kia#F4CJC zi^>6D7GewXo;)Q?gbq-Vj75Xu+>sMl4Q`sC)&15 zC%emn7D%=7>Z_@(XRjuzsz4N-04VjTX^yS~7-kg#HeIY=^47RKjLNE|KfmWC&c|$2 ztD#1$h2zN(qLa{8<1-8dRB;)haQv*zqA%9ra_|iI0Qv{3MlAp};%lpR08aMRpq`4!#OrQv$yk>t4_jy94x{vS%ZjsbPl3(a(nQ>ji$Bm@ zTR4o?VWL%QyDk^De)Ldulw6{6RCXn_aPUscd~ZC@(EQa*q`Jm&KL0DHEZKww9fi&u z-=D$E+Q>HwrtB!gC89$DX-_9t1IpPt9=fTdO%4Dlu<+50hD-hXuWWr+`j~=Om6q?N zX!Au${{2Wh;Vw7WZ_7Y!+ay8`e5`S}0>oL^f@ZOpz0h&3+Vg7BZz`kix;gUbh&hY4 z&<6LoPy?a$xM=QGGpbV3;pL4X`nm3vR0(876K8{3$JHWHK3SP7m~`{KX&B(WuKo~e z^c`{>Tg}Kq*7BYdWMzFNqS)*t=71CYjN8l_l8cgxcF$;&uG2&%t|BHzG|wMu4PKPx zqahBCuH;e1NB#RtDum+Bpy>-`QjYb*9A&AyWQH^3zmk*EWpRuC5>pyEz=}h&XV7O> zbpD{vK+3B-cEpLxRM2&1lQWfAH(1nuHXD7Q&kVw zakSseRhcrX)J6B@;OwIZrUUE4^<(OFn zj_eUtht8RkB9)o4N!2jx&4I0s)E4+P1|!Ib)sA{9dm=iuK0TnvEy zX)6LiXG`z<73Gfgc2Dt>3M0+sS_7B`6#5E$(sfo11ICAIk4?|?bp9of{I@NbRV&0^ zc)7W~p;JH>KU&7=T=JT$LMYjIgR)Qd-YB-MDokp(!KI2TzN>VkE^1%A+XIK)k=vcM z$@A~ElH;;NSH>>}2c-ved(hTy>E#DHnbfVom6P+AxEBKml7I<(f8Xv)|iMUc7=Vdj~XtAz+l8;Z!icUsljx2i4?MzRwGD-7YsjfDQ{I|f^Z%gCY~>J&Sn7}H*yG(4eB%+ zNyKy}l-_fwP_4{QI5bz}7dm8+h7b`jjk!7~#+_ICO+xpM`+$d>l|>To~Y69jzh@!VBo>p?^|g6JeoSwVj! z@mplvF4F#UVqBSGE;H^!F;o6zoz2`udQrwq{Ph5xJLJ+NqF|j-7k`~d_G(igJW3(^ zEW~MKW8!UKqc9&i<8-wY;=C(7O5>k*Anxg98eC^ly#)-2(Ar^O4!_ zVV=PnKTN^w23mT+ydJ3p&H*2LdRn1if8kmMc);l7>dQLiX3IK_&W}sO<}Q41=bA2p z@=P_kU}*!Z3OMSuJW_ynP#UO3XzL5TWh?d2(q4xx{!fn;>& z5qyej$MxFUeCQ*EwH#VcY(PHCJbQ%Vk|$k$wF%K2luyg4DDBLOdkQt8ZK_-rl1(J;{R8NIwpJi{vW8*RMBS&4M%UDpEJgnQA+O%HnBtQfu?E z5VE%4jj$X!+FgnZZW`FTDKd|O30vgG%|lZIITe)7_lXdR%oC|(p`3iOi3TSVaTWI< z5Qc>cHq$nqnH#5(eG>XK(p4lWL3gi-KK74!IwAgrTG|P zw2-H93XlC~9YwusAB1e$hK^i_*7TvkPt0D(!_qTL^~Ot<=yc{iZZD!`sh9@8FHd$= zPXvD8`-q3zKcQ?_0Umx8NvpQPuI}RJ$`eD|uf*muKD7eiXCFLBtiA_7gs-@?{Xl^_ z4SYX_t+*Tm&B!grjw0V%u5d`d-aA@K?2kW$FA8rM_ii}DqV0U(n_o^_Asv~#K{1fH z^hj->HwhDK@AKFKlzW6}wWIIa&{uiz_cZDa+QZKJMbkABDj7HP?MaQvAEFoS(XkUl zFZj?f9%B{l@isq+j3gmmk;{yE^W2G-^{mE1%2-$Iu7lsWocN@gIF(P1Z~1zQTNii* ziFt}6#dIIpYLR-BeB?n7O}_~PeEH_T7Kuj=kgl9>t+-E(9b1o3EW&m6e;l$^jEm|g~=kxW8zp85SDc~ zft@}wurVnCcMBXUoj_e70OYd0_fc|oc4YVv7>fACv=bJfcJ>U$DFeeL2$`M1uURrK#VTv0S=OtlLu(8-Bga zzpq&aw+z4Z=0MH`4L=e-^U#=RL4Fy^DKH2FswXjBxU#4jRQ(2f9vG|N+&aL2eqQgJ zN)g6T<$tb`74Y=BVdmn$9{5}i-0&Z!p5!a^x@=gVgB>do*nX0R6nZv#KN+CFB=xhMz>ECj{qyT#?)s*wFPj$cp zYTS!o$$D{((c17kHIUt^{;+hqug3rCi2lNu58On5c_p%Ra-n}&pjMiFbhMdT1$yD^ zNZP(_5BhkaYznqCpK3p&;`SE!Z5VpJJX(w8^WWzuSoQ~uS}p6o7%Ze=>lK>=v#cqH-nX*pT(cIMs*2f$DzNGG9P+f+E>n#z zH}m_Jg_hBO>ShG$DB(-_%yBDUF0(NuTl7bdKq< z#gLz;-47f~&@xu-U(x%}Bag9vt&0(b>v#>|Cm5K@+tn~^wpL_t`Q4ZhEDqWp*%{*S zY2MTw$;Mx8+zNT$s+|1_vHIcQ4Sgn4?zor?62HXY{q(JnwRp-l-_O%a7kF@7Wwt}q zH`~7=X(>R2ihx=(c0_PJfB!neQ!F+C{p_ptDukLEcY8^ zh8zA0g1Lj)f52^X2T&7UHVgu@1UCscND-e71jNT7WYc|dtIRN&kV-)TI-A=p?NMCb@1_;~)~ zU(He7!P?Z(%$$Uc<)3VtM*v&_Ee?3?yI~O|E+u1C`MetoB zFvwxW$r^P);u~1*DOguGH_!uF7;6VSk*V5%|8fiQ?j9UVI``LkvdcAMHG5I)i_FGH z|LIv32ZN$d2qXqzcSRt49Hy>PpN~pFIHfO6z}uV4hj7*3C`xQF(-EL+oJA?P9HP1YFEPSGG<5wa$$1Yk|_r%SXQ_=ggak*ftKb%@2PgMXGpMHb+XQ5);&Kk@OTQf zK(K+Yrb@;HG9FC_O8&yiMn$+tU@iQTKV!D*3n8pD9{27Hr^QPiXxEgw< zoAK{~E2^ZX+~a%v&a0YFaSwT84JPC5|05Q|e?ztbEEJKEClVY33{$^(DH~tX!psdV zCj=S?k(2J60%!vM0NGmbi7PD(u>ebw1320yy!flFvJP5?#yEf&;?t)%VZ0~S7-<4w zlrioQj?8{>=>+r7GbrfBHzZ$;qm419&V4&2*gWZbRYyTU@w70yQ z$R7@4J8NdQr%u?qcdla{ID)Ny*qZ|!&x{*E%s;WvymsrLgQr6%RHRJNT(t&HwSc|S znGi}bK56bU`xU4O_e?~v7e0&Br}z?e6#{9dsYRMmr-3$agD z(?J?$r35Y?&m0ER1EsJ-vG0r!wA{n5Q5U@;$o}1!(6Wxr8%=;a_6_;K3EMukPrQ;8_APrxClVd_@yT&k zzh%1r_i|0%@iztTzIgUsq*h=G5oJ!hh#C-)@<`k}-k><;=-yLGxrn>QOX|{iP_9ZG%8VzP+6exv0A4>p-lA` z&u!)-`J1ep_)GNTagFq5(h)V#F<9o{HOxB193RT+PE-4_#cP^@pyt{)+@kIV#vJ7| zNxs1eYb|@}up;St&UWm`C(9XSjsZhl@ELz7wNU#45QUpQNbuAd^FwaNA)xd6cz2_G zjHoNbf>mdi&kDQ0W@dBhq*yx~5H;LwJOkaP8Jd+LG_-k-=9Gj(*wk_{wr({# z`+uoKG39Hvf3o#|<_8AL>9=_tVYI%f%oRPGKi+t-kq9tLf0nsY$$%PVi9wl@FI7gl zfZ6Dwol4r_G;ziU&Tm^7Ppexj-NAKHA7LgOwg~U+kPtMy}nv-O>Fn&|{;@I6jgxTx` z!yg;(CnNqtt9!bvu5fCKAdM%d8Q?Z?D-LVlY`4EYBbSk9&AkU)ew$*vOi#P>KnwMC z3wIdxKK?B56AMNmj}tkIB)JLrn1VP(P@M7LGxG3^b9ImY_Gl^mu~~(E-K>e%r(dVD zQSKAr`j4(e=%hXO8F?#Z@+Y?G0i>CD4Hel`R?%rmoe{Lluy>XLS)joho|EHpQN9g# z90BiVT-+PViWLG-hq2c}iMw#FG0Y$YQh7yjU{Cdj6Bef2LjKG+tZ2Tpq+S5GYhkPl zCt=dMWcHPLV9}|mKDOsuWiF=WQswQ<#;MW<`9sVW> z4^Oj2$Uq{Xb=2at{E2BB541o{$~q-GU5pbw4)#;K&!eKA){LGWrQuWyrKChcrG6(| zJ#}?2y_Vi}Byoe+7vD?hw$>L4c}K+$PJtFj#U0)Vox9m~$d#1@St=GNF|^dh8jEbB z%5ANT%4Ba;-xaTuat}exrNU!d;?zp^uA^NTfeMqrVjGIg*pCyUECaCPRNAhbQv`@m zgzh7@Vje{gMdNPU0erkNmBgT>M%~+EjSdm zz@zRVmm6np`N@KuBYs6NCg=1toWp|Zkqs00wJxTsfG`(MR@dw)R6wwAh|IS~uj=3y z$;hEjl9UKttikw8x3zJ{4}J^uIcsIP5{|yK{=K<_b^>gbx^=-r2f~jzXPN1#nIB51 zh4)G;3e8LDbsE_bu5p9dumi?1Lfk!h(9W0Hh_wl22yw1aPh)Rx2$2t}(al{4R`BeB zi#K*i84^qFe6fR|$MH}6=zPlxWJ!~y6QJ6F`cBTKX~%r*uSo9P0XUHwX&ya^T+ZI1 z1)DybPk~_r#f2-&298IKg7-g|zvGM~Dd)NNR5L23*xVAecmi^8ag7ZTy=bM$Z&+5* zEx%JqT1wr-ud@@E#$d*CmCqMbnXr`ubt2@=+0qLrj5u-CGox_v+_2B_b`cf!b54%# zwI-SbTh_bk2|U|$KkOJA%G*0QxNn0>_Om2S(lR9;E!_7FD{~bP*VBme??Z%6zk0B$hv=k1n-UoTGDVp zDsgn8sDig3&Kb|TdKV|eq~5S2x~tkhe{;;Ew>q{fUb<#(*E_4zdS#37^wjOYdp@9u zP|u$iuTiF^TJ|K_W*ZsncFK{WG2XPU9G~;9FycVJE|K_HTXge>0I-=DtWD)#t-AF=V(c(JhL{{A#4SrNJeuNYeg z29i6st<+qZ+tRg7E}y^8A;MUY-@t+BJemNT*Rub)_DG>_6T4ZP{4Rj{FbB2SYv8tj zwX8wevOo6C-Hr|ezm^jfI7F^$ntM_Kemhq$U|W5NULfN~J~m=|hUqC_Snv4F)GKq^ zTD4+g)#8=(0il(R_r!rOm5$3w{2LP#2gNrpWsoS4Ecf&$6Ls#BmNe>0C2(HgEH8a zM^f3PVAdqw^+a8N4Ld*BX6~Fvv#AR&PA8S$M_b`~JS-@9V9Z!5U5Y+jZuwzs9d(CM zma6E%=8}1`zb`-wj4|5wVxn_0xein)VNJHxmuMH0rT255h}ULIe)Cn#Ja$2271AwI zO{N+JP+7`%_JctP3G0S8a=AJRG+gCw_pW7As=Pw9Qoq~eiZ`Hlb+nVSNCLT%kEYeJ zw??4x7hAWS5YK3*h>b6aMxPm8hM7tbX0zK-UK5 zOm)$xH2O(r=M;L2mSMn5(e4yTcE*H#KfFDBlCWiM=j?e(&lxuAH!Ut^&1m+AR7z*M zEAI`!?EvOtT~JkwqC!H734-5C*D0!8{i{BheW51sr}0Zroi-uH5-;FR6Xj*HPFc+cZ@6$}+!;6B4s8S6?5|Fq)g#wZg|*EUq0ybBh5zqQU)AlV{j|MbMMphx$h^M$GVA=C855=z9U9tz9>%FyaXn<_-|ny0Y-ijC7)J=aHDevSi)~7J;HqH zth)racV+gR;yDMvO4CV^V7PDNJrPG|jqr)&rW9MJJFtx`1XFuob&mMX4P(K+T^HE> zknfNZR4_Ryqq!)aIK{EF)TW}CW%c$Ki~w(Lli3}WpHv9pr{N3VXj?)HByDwD3jpqB z*~kyk%uVQ`m;f(2WBGkIA&ZrI&Wef?Tk^iL2P=GSKmEGlEQ)ed9yWBVBj)}v^r(BT z)2+0GwQ7k$KFRAS23Rn9*jnnkoNxsGtVuqTebV)_Pg;y)Z{8$2vGRPRml;(r`+1qy zF>i*H&3h3a`*v$6`0%N$S&pGf>5b9Uln3m37c4+Ja{l8kchs}rpq^9(6Byys zWPggYQF(rSXG(87{%U#$|6Q}I8*X(q<>y>gNAZs%)s8Q6&kj=)G!Uv-x2M}jdMi65 z^>U+IK?*N}?HRty9>D$pBJqoTUYAaRk+9A(VsRzI;meFkvraX#DRW6l^wbm!U;9Z4 zNEDxP-ukZlmXgjgAXZLGyx9Ojeul^4AsZ)S>rl3onG9{xSS7<48;)5!@F`w&`RDQ% zj+i}TCibEPmK++r0F`2^u|^dV$UwH$0Fz>^01Xlvjznn$8K5veT4Du;8k;qZ>b!1& zceKIccU;F*q{rx7fbBF&FhV@|gm$ysAVHY-Ab}>!>9lPA^0$?|i*CcCA9Wfs8Qr53 z`5kW&wMN!(B?*>ZK`183{Qx;>lHTl?+Hbng5+WZt-!KXnzn8Tj*7?CLH9%>re9IXk z>GWOJVW|Eo(LtF>e2{8km45r=->iA?-Mb5oKXH!xF8R#Uf?$Z&#`_Cc@RtpDP@iZN z-~Wg5{syJ}h2{Mhf@AxG;r$CrW9MOE`9CO)m4}<{@2Ni3w6{||!1^-j^MZb59hAk4 zY5GLPT4zdKw}VPxcO@bP!3`h4iGqX&N*w@1tPcd#&pL?Ks(e>EqLMEk(5Vv5VB4(| zEs{EpEjKBxDzA6X04!QtVI}dF=>YA-$|cUSHt?x~neCsZe0F^%{eb5@2LcDJQ-0?h zaKh+ah~O`N?fCrUo`&NPH?00Y*L_y+d@rwtdHoe2mwDN66%kKG1$%yhXMT*DDg-|S z`vDWj#p!%9ty}E)hNb0-r_?Qw9Ui-CIQoPo`~vp8vlH=6g8B`fgvd}pFzs^}EzL93 zbRl@2FBu2M+vDNp5*YA=P56LnXR74VM-Ti03v5iymu+Uc=?O2_20E25D}Cg<*dcgn zoS~v3_3Tc1t18$ll5o55RoPhiIV4nqd7}TlH(~#@5supEN++p52}9b|+#w9nx0oW_ zp9z)VT5?_Ozft&Z;-=iqL$!V)cUzycQ)av+QNtNtAp+A3o<0DVS`6ClKZW+{t@vtFtO@bI;IC>^&4)~G* zgu+~(d*-UO*T*_%a86HqeQJ%Y%7hj?4+EiZAP1E#v}39RQB>o$IS^!E3}zDZ-O+Lb zq3sVvQN3qkOIU#6q}m!LYtsQlC&I)qE)6()_h1j0530hia$S_0qw0mKF`-Gb2ui^i zAB}>MQOt|+eoB5vC+LON>si2hh>I)@x2q@&X`cI-m5X`v3VFrFG(Ksua=$#N?($XN zlq=`^4uxmfq!VW;cgqHa`Xm)#hl?j8@8kJ_9r&6PzhwnbB6W2$vohpjT7H$e59c{#gk@^YaRLU6Q9qD>+8x!EV84*Ym zh#)8zvJ@RcNyHB@Q2q3#xwEEV`HD+{<%pQRB|(mdu4mqqi>iE+56k%G`3g?K5~?jn z5_6_L>f-f->$UiY5mi^GkbT{rUlgJOF*L9l7DV z5dm$H>N_N<%_e0ELkh?RHKOH75M;Z~7I*6pV9Aqj*9uTTtv2dA% zNrWx7A?9;T4ilBfU((M*=ohT$mbAHLdKIjV^aRvGs#b3ueH&Z-3A;_NjbwoxbkF)a z*0u#aIvw$1OAhNJmfVR5j#nu{Dg#!tQC?HG+62yb)O6>+AoiBnCGN8?l$ukb zc`$K3OL=#;tr7cN#vmI_u|gSiX&H6fz|fc(vEjbqo=<|{k+YC`|C5h6>n;9QN4B@N zhcnQhgK>j9MJ`Z@Y13HV4jdo6X=0*pp1_!KmldRJ=K->!w@^1@VXqlJzs8G{rqHF? zu-{x3=qPiu4Q?CNIl+F!5~TBJ``)jqY$FY3$U|B=mTh$Eseu zM;(f3xvmLk>B(n^B2&9y>Lg+}%ukK*r~y)o8ryh)Kz%A!ZteYbegFWg9uE4T)H=(U z&Z-38mmjRN7Jk)a7{7~zOdu}x16H&&jx-$?biPI=iXXM`9$~Uc8^#$9*B|A`>rd=< zEY&l-Ve4EjN**oo9#L5rIcj@_=z##>tEzN~(5QxB_z(G4o&rN|}^l37;QU_I#$1DTJpqaR?`+1P6Jmiabp zvRx&yt2B+Rz-_nV73cv4YqD!7esvD@w(_LsWcVaI5D7A@OCdLU;JA79O9mz z%Mm*D<)J_J^Hc2y%mWX!ncna$vxtpB_P2gl^k zqwNt9l__h`S$g1$aa&!nUQVcKpmI;?qs~CTFl`wHDcAYi@pVkyMCGg&Lwg7m6{uf< zn$v2goW<|DQfQ%l^!4=SdJtTu5!9G+9Z0@0imf!H*+qO!AjFR@cwj+asRtAvQtB9U zILAZ5O2@N@396bgv)O9mQzpJ-zo}%L3+J_RGwz+NMq5^%n zcA`s0)dYPH1K|^-xi1$J=`#GtlYD!AodR_STL_$v!n!@CKbGguct++MsIR@?%30mt z|2Z!0tt@Q^uxgZG-zj9p#sprLRJ1Nik6T%D9?RWbmAN*SnH#$L{Q9Bsbo6gK_5j8(0o#8~5zhZ8}|D+YKdEo6^d2cn>7rV;H_D1bO!&Z`-2Q z)o;~(D_DoI?ZPaO42363S{B!*$96C7*rR6HHLe=odwi9l=5@)MhR1V0x1lO1Xj}j? zdnsZee49IaULXD>pt)V(7wXo)c&WJK2vgZNaxI2o9T8(joJk#HtHTgZ^<%Aya(9=* zCdP8OF&TNcpf_yTL;EtEfgD0}$L*&eM_N6Wjjo5s%wIPZzz#9Q*#ooWwsWvI@Xzdp z<$o&yy%hhHfP^2#tgJm8Iato5!*VLMjo}} zC3xLq7KOxbNFkcByxAe^tDbMLwkO(yQ5L*YT8#*#P`?$SDm<6QaK=Sd$p*V}lY5IE znOqgVg~o@>D8-Mbl%XL)gyX)U$e6(MUg27YUB!~}HI^Cu&bI(~z1@T)N-h=_<<7g; zsvLhrhP7rGy+-Gi?D8|_9ox$u%*K3&8@sJ-ALKkw@>)?DT3G{t{9GbZ=EJ?dG#wx6 zV>@bUwTyvOS{a5rMNwgTVmzKojEc`JBAv7p@{#{2CEa@bU7;n$f;taf{Ic*#RmIK5 z&Q6Y6sC8t01EIUprY);iVFhif3X7t{!L0N#|6->=XjKiVf7CZUf(u@q&SFA{5bP}PIs5QuM*#i_ zw4p)_dRA~p|BI3RZ(nxSKY7Ju|BIDHU=}rYHUBdSNSOc9XjoC?28Up0`;*cJUS${X zcLo>-^hA&Mmq7^z_P=%+{}>GWUptNeI`DEaw?JSaVP^*^sWL;oCx8PKq)G`1U}XVS zs8Y~#a`U`TsXs3g2NHz8zOeG}{0Z_OGB$P|ZqU9eKkz-&f1F@p;o|;xXBHM7!2k4P zWo3B}{hzvAY&`D){7c3T_#b;*0M7pm68PUyvaoZ$m*oFYW@X{v`d=9j_rD#pvU2=? zga5V1!Sg?ZVdZ4y`R8DOEG(>?fIl4iKOJ+iaQr(GRvuQ?|8dO2{^u9`PhB1kj(^)@ zV`1U`cOYzRJe&aee<`!EvvR#B{2vC{*#B`A++2*`R}_~&{JyHSxB2@_KwwsJbbNp0 WfD@FdPJ{?xW#>Vlq!d?_K=^+>-jf&r delta 11882 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

Tools

-
    - {content.tools.map((tool) =>
  • {tool}
  • )} -
+
+ { + content.tools.map((group) => ( +
+

{group.category}

+
    + {group.items.map((tool) => ( +
  • {tool}
  • + ))} +
+
+ )) + } +
@@ -253,7 +265,7 @@ const { content, theme } = Astro.props; color: var(--resume-accent); font-family: 'Chivo Mono', monospace; font-size: 8.5pt; - font-weight: 400; + font-weight: 600; letter-spacing: 1pt; text-transform: uppercase; } @@ -320,24 +332,33 @@ const { content, theme } = Astro.props; margin-top: 0.3in; } + .tool-group + .tool-group { + margin-top: 0.08in; + } + + .tool-category { + margin-bottom: 0.02in; + color: var(--resume-muted); + font-family: 'Chivo Mono', monospace; + font-size: 7pt; + font-weight: 600; + letter-spacing: 0.45pt; + text-transform: uppercase; + } + .tool-list { display: flex; flex-wrap: wrap; + gap: 0.04in 0.06in; padding: 0; font-family: 'Chivo Mono', monospace; - font-size: 8pt; + font-size: 7.5pt; list-style: none; } - .tool-list li + li { - display: inline-flex; - align-items: center; - } - - .tool-list li + li::before { - margin: 0 0.07in; - color: var(--resume-muted); - content: '·'; + .tool-list li { + padding: 0 0.04in 0.02in; + border-bottom: 0.75pt solid var(--resume-muted); } .selected-work-entry { diff --git a/src/resume/content.test.ts b/src/resume/content.test.ts index 69f7c4b..11ce439 100644 --- a/src/resume/content.test.ts +++ b/src/resume/content.test.ts @@ -23,6 +23,14 @@ describe("parseResumeContent", () => { }); }); + test("groups tools by capability", () => { + expect(generalResume.tools).toEqual([ + { category: "Languages", items: ["Python", "Go", "SQL"] }, + { category: "Data Systems", items: ["Spark", "dbt", "Kafka", "Snowflake"] }, + { category: "Infrastructure", items: ["AWS", "Kubernetes", "Linux"] }, + ]); + }); + test.each([ ["missing name", { ...generalResume, identity: { ...generalResume.identity, name: "" } }], ["missing phone", { ...generalResume, identity: { ...generalResume.identity, phone: "" } }], @@ -35,6 +43,13 @@ describe("parseResumeContent", () => { }, ], ["empty tools", { ...generalResume, tools: [] }], + [ + "empty tool item", + { + ...generalResume, + tools: [{ category: "Languages", items: [""] }], + }, + ], ])("rejects %s", (_name, value) => { expect(() => parseResumeContent(value)).toThrow(); }); diff --git a/src/resume/content.ts b/src/resume/content.ts index 6b25fe0..b2ea2d9 100644 --- a/src/resume/content.ts +++ b/src/resume/content.ts @@ -25,7 +25,10 @@ export type ResumeContent = { degree: string; year: string; }; - tools: string[]; + tools: Array<{ + category: string; + items: string[]; + }>; selectedWork: Array<{ name: string; description: string; @@ -86,8 +89,14 @@ function assertResumeContent(value: unknown): asserts value is ResumeContent { assertString(value.education.year, "education.year"); assertArray(value.tools, "tools"); - value.tools.forEach((tool, toolIndex) => { - assertString(tool, `tools[${toolIndex}]`); + value.tools.forEach((group, groupIndex) => { + const path = `tools[${groupIndex}]`; + assertRecord(group, path); + assertString(group.category, `${path}.category`); + assertArray(group.items, `${path}.items`); + group.items.forEach((item, itemIndex) => { + assertString(item, `${path}.items[${itemIndex}]`); + }); }); assertArray(value.selectedWork, "selectedWork"); @@ -173,7 +182,11 @@ export const generalResume: ResumeContent = { degree: loremIpsum, year: loremIpsum, }, - tools: ["Python", "Go", "SQL", "Kafka", "Kubernetes", "AWS"], + tools: [ + { category: "Languages", items: ["Python", "Go", "SQL"] }, + { category: "Data Systems", items: ["Spark", "dbt", "Kafka", "Snowflake"] }, + { category: "Infrastructure", items: ["AWS", "Kubernetes", "Linux"] }, + ], selectedWork: [ { name: "crosse.dev", From 8fa2ab0b0a7d3aceeae77f9d218e4dc5290f1aaa Mon Sep 17 00:00:00 2001 From: Harrison Crosse Date: Mon, 24 Aug 2026 17:59:14 -0400 Subject: [PATCH 05/25] Refine resume tool spacing --- public/harrison-crosse-resume-dark.pdf | Bin 24880 -> 24879 bytes public/harrison-crosse-resume-light.pdf | Bin 24877 -> 24875 bytes src/resume/Resume.astro | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf index 5626287c8f460c5d45ce3db95e0b290e2497051b..cc4d44d437c91f21b44b5e700f4fb69119042bec 100644 GIT binary patch delta 769 zcmdmRh;jWP#tBU@a_i}$1*H}IOntFb&|EBA6pX@k#O8mFnyHD|rcdz)*#^Y*<9k_|f*{c`>KDd(hX^L7O< zIm-Wg{++5GcNs6iKHGZ@$0xn|z58iO@}7Hqfd-j9FJI4^WG{1%?bkK!JHO%#Z09U5 zx%T*D!p9F)bI%$2Pm-6Pn{0I@=D_;)842IiF4lK&ZnOXEr=hr??~cX00vk!c<@XLu z|M=;$7)V}o(tdF1iKKn@Lp5vY8zE5ZC%zbJv`%mrs zf2N)39xpcgNn1NJnosVEQ)e`qyeUpy(?Y=j1QhZVxWEiUOG_h5G%+J%OAE8fO!3|I z#%MAI=Ef%IstwFd%rHzfFg7zq(`#s8YK|#pX=#YA&d?NQUOmE@rk0lIjxjU?Iv!oK znTe4Rx|q3vDTZE4Ln91}Esc#(JrZtUU}$M-if*8hfq@0OPmGK#&CJj&HZnFeH^C4C ThQj1W32q#QT&k+B{%%|Vm){Mz delta 712 zcmZ2~h;hRq#tBU);}f}0+U_Obu+H>Uga8To7%fet=3H0eknd)bFTTXJ0;6K zy5+yw@BAv!|24_$Ke$}hr%TJ#?Rn-;1epws7e<|}><>$wXmdl*avi_;+;H+T0CGGNGQSF4>1Wwf_*Bhme+sf+ADPL;- zA$8B6Ek~Q?ny)c;2sqNrrEYI>|K5Vs>ZOmhf1KO+>91O$()+?ipZ_j(Op5;L-@gCk z=lu_^dVJsPD{bw}Xfe4nPMy(s^2RuIO-ls>5Kzcd-~uxYEiH`=(8P?4EiKF^Gsbs| znxM%Tm>ZiKOkNl-Y>Q!zfw7qxnrcG>Q*%r)OG~54AF-KWYH5jXpP`u%(5+}LHZw6Y zp6r+)Y>T1V($L5VUA3jL5r$hWO-+p_PXwBP?m8nQOEYsc6O4=v%}p`HfIgf2Fu{$( Mh)Y$~)!&T^0Eedm1poj5 diff --git a/public/harrison-crosse-resume-light.pdf b/public/harrison-crosse-resume-light.pdf index 91a0522ade5a011383dc44c3f9c9052ceff62c8f..3e90f007979235ac8355914d5809a6a94242577d 100644 GIT binary patch delta 5666 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 BWa0n- delta 5625 zcmZWtcTf||x21zXXi|*yDiBJ5gb-;`rHE7!5ReW5lwPD52uPD2K&pfudW&?W_gi55H}>L&`O5oYHW0crci4m8AVC7#i30}^nnV*1f*13eW>nD6CYYqoojQJ%wyO=6EM6_XvG_rO+#9B&2 zJa&-N8k(%ByX<@%zC^~cGKY$68pq0ngGs0i``QrKq>vtZZh#|(MWgPg4EDW7yrS-e zLbZXSpgwwGWf9jyt=#D@O0`x2i3)wYAi_dBxcprU50zz(i z9E7X|ZU=r@l$Tv1+0ffb_62sS<%pzBbuAQB9-FBsEmsV8LYg;7Q;r8N?Aq-{8I{Y$nX~Ni^L<47{Y;g*gbXo6Wqn4 zRuT@jsXgIfXN%E3YJ&p2CL>N=ap#booLV)oz0Z9X``xF^p7*nVmp%6L#PU4AJQ?o< z5mg*XQCrzo9LC~*045+YU`B%Qd&U|7L&o>yqE9$&p9}t>&m%JwBNmG-o`C3iJBbzQ zXyE13yGQ5h<>@}5&E`+y85g7+@>=Ww`1uJmCOs@$H`06OnD!3T5YsNyXvqH90n z5jsr(bU0w9X7(pz2oJ?R=yBFC7DRpGeK0^4C6-}DJ=Cs(WnW(amM-bGrY4Su=S*89*dhR7OJeATmoKSZe|#ep>|xSY@PYHId9 zfKa*=jUOfRxd#4>gaA|3jr@VO$ST_Y#1Kt1(^b!eH!*M0Z1mx}Axd2Uo^`>E zdBpHcb)w&pL0_VBO!WzauzzX#dkH9 zrZNBs)JGV?TA2ga8i~dkAMWdW@E4cwi{9fphxOBkAYSYwe=IJ@=Qbm#bWUDr+7NwJ z`&ikpQWN_~9Y^vbYgPmFteMbj^CQ2q&R4CFlNH++w|QD1!bf*}gs#_5kA_jMrl1#1 zJu{UsA}J)-$zm}!x;mrY#eE3QU^BSO#g@?K;rSua1m(@83?mX^I8JFRWdsoCIUgP; zldOq4RpWoIcj;(bAvnU(f|$BFoU)m%H@U35_OmqaVE6TgZ!#dR`L;}rH&KF?Bk&9z zZr^yK!bxx_cNKTStGJ!Mm^S@I`isYjhiTgAB+L zkg}lMdopue#nmG8(Tk>Zv#I9?=7XMNDg zboC^T7vwo4Cl}y4p8A{=$v4rIqx-3&T5-yzkZMe{Ul{SOxKE!4TS6~U)HLm(#tZ!e zr;>};mNN1dC0m%ArSQ|VK+`$3ryiENd;Esjct z6!D}LYHg3Xh&CC}#4`v*BBoeM#H3k*b;gXROX9)ZZl<^hV$yV0xf!_rI@BnNd;u12^YGv3Y`J0-J1nHh%2@+c-q^Ximh*TaU4stzg? z8}tUeUSw<0Qe@9K5u2X@iMqmSfHYp^?P+xQ?H)k{2B4NF(3LuXJVMKdhpV`wNRd&3!xpm3oNu8`~;rHBv`((GrP9TF)Ml^~Yb7TF(St$M0vq zB|RL@RI)_1ECT}k&t=mE{k>%9j91&Pog}b^6}=y0zO$&Q@$aGAs2P!srDFGmFOir| zZd-kfVW`*WnFX^N`9BZvE+ADma2U+Zc`6Krn% z)}k6329EPaQ{w!hq{!4v(PxwyZ9?eZ#Kf1wwdMr%ekx(e4`EKK{{w}&2ocAc@0_1)z7{(_x=0_GFk8~=O6xcx|7H`N_0(31E!aKf z{IQsYI1O|Z~tspgCr12VdgWQD9?|>wsbO|?qyd_z;&UY*xn@~FDmnsa)S#V~4 zc}PU|newW0;|_0vf}ZBd>cCFnUCmGW)BT0gvx{AWSX<3xz-!6*U3~3F2ut9u-EbxY z0#H}6wh!>{U2^FW@TNvCq|M2?+54T%>9#C2`>5=eT0EbvGAEg)0+ljzE{PeM3!fi( zFZ-mY%X~#^HLQ@#J5aRWc`~`)vj@qNp~={rOj+=F8pbtLtLy)9eSpzPpCq-_{Fj~w zvxj=r3+j#p&vU5rmggzL>gvxz(N6JC58=1wo7hdkbz+2PddVizB=bSz-0s13{Ixj& zNANInP(bT1%fDXyu$F2$t~(6$qx4mkzX1>`+Z{R69*QPUuC-oU5qNN)W79J>2}#i> zz^a3^kN4=l<&UTynD+Al{}_5-D0|atq5O$~JH?ZlyO3K|=0`87TMj>~YYso>q~84? zPKU7f$4a?`fb$e2b(>C-)0a>9_fTO0(tO5a6>T&Iacghz!Z5sEi;%rLY&Z~@=#v9t z*|c4;;8k1Ibia3y7{r@HoN|J5(6Wi@HA&Ayvin3oUAH(KNex5v9^x@4ea)Fy7-pRU zkR(WlO*&4~0;75;#EJHzDHW{8!$3Yg`3A*-kHRnt+q8tp5JP#kcuuUn4cR;ph*Is@ zW88mDBam##7N4V5d|LLYvwb#samn(aL3%{0d*4c0q8YUR&y)B+V^6R-r~Q<#C4!_n%qTU?;~VtTW2nps^62 zQo|ZQGd6qo608=Ex8wOB9}1pP=;nA7&Q7W;tpiM&z#qo6Pz6#s?sFi(5vF^E(}mn) zdK-c`k=1*YIl}CAt5GCZcsTk|k~NgQH^~ihOAj@9(bm>TM7j-h2=*p1!I){fVm@lR z4onTHlVYa(nqgxFL_Vojhu|i>^5Cs@`>m&UUh8yKkvDaOorq(-jf|JbwqmP)JNAepd51M(%q%NZn%hjrM!-xs&=BznrH6uar|DP)m}$yGp?X3x z)oGj>?BlRo<#;cju&UFOwFD6Dg;ax)jkPZ;Oi|q>E%20r^H&m%hNMd?vr=;TP!>&> zaF2ZAXUe3Q2X3NBzz_bz|3N?_#3#`nfVe3fJNL+| zwI$X+C=Y6VN|7F>Olh#Jl<;zUV+dE6ZQBRbkHUFt1ve`F4T2ek1Ap8Z$L@D7XI-?Nv91&Ld_XeY0%;=0-}hN-sS% zn>NSUKXOcEuKLS6wH9O*uGHM&y#gum4mWD1U2_DLd&{)pOuJu^P6S2^;#hSo>!jD! z2DN_D7OV?OuoF-F^9%1V6s$k2yHw~;rufaRG3Ws`{ZEptb!B79F&4|bS( zjs=1d|I5*Fb8``*M}<+mwf;;BG1$Mtd#IoiGfD~`Ge+#KbAIuSBK--6cy~!qPE?Ou zHpS-twYB-bw$`xA;rQ6~udR*!wKdM~3d3lEd$Ky;0^3FZ9D%!6UcPP5CY%iEyqLLi-u0}4ImU(dS~wTEOnZI9X7B0_x}JWZGjZYKI69B?Wm{;L z+tS-O8FOZ9w6A_^KApyBT4shqzzTqf%VfwzdX4*6MrH)oc>pMHi%VMev)D`H|a11%vdfR(+a5Dx7H1XKEs9=6U z5u@racd9MTii9&Q*Pr>zkNx^QziEAGCWn(dxrVb}F4zCja>tz}Zb7t0YQL9R-iTLg zQ@Dg`EbK72t6&!-t<~uI39Z=jLdyGnB!soaQ;isSiI8BkP*4=KK7>i&ovU8lg(RfZX0RxTK)m4jeMhqiEEGjhZ@tNV}mpAzVEf3 zL%$MhI5fx5cF;!cFm5j?u|=5pb}=WKTWdL23N1I5X21fEtypHdowl4`GD$x_uHMp2 z`2Fof-Vb@Ax4-?)Vez#e@xDfh%S;Md1n>*z;t85(;opX=v zW!b37sVfJ!SdOO7ZpPt-O2fog0Y;a;3Ui>YGs`_q>XuOP!#s;_w;l3LgDr+DCQ+VO zPG3CUO%sD7yq0shb6c+Eln-y1PFTpacfOk4sk1wmh%M+w5k{&59{ zNkINd2g4welIZG}caakRV2gpFuzzE4DfmBmVo=F{6$XX>OI=J-4E|4bF-eFx_ Date: Mon, 24 Aug 2026 18:19:21 -0400 Subject: [PATCH 06/25] Add resume education and tool inventory --- public/harrison-crosse-resume-dark.pdf | Bin 24879 -> 26624 bytes public/harrison-crosse-resume-light.pdf | Bin 24875 -> 26616 bytes src/resume/Resume.astro | 40 ++++++--- src/resume/content.test.ts | 67 ++++++++++++++- src/resume/content.ts | 103 ++++++++++++++++-------- 5 files changed, 161 insertions(+), 49 deletions(-) diff --git a/public/harrison-crosse-resume-dark.pdf b/public/harrison-crosse-resume-dark.pdf index cc4d44d437c91f21b44b5e700f4fb69119042bec..21abb82de723df613b2cbc24e8954fa62731302d 100644 GIT binary patch delta 19456 zcmY&;b8sg>lXh%vY}>YNXJgyR#{9*$ZQHgswr$(a?R(#MRd@ePJ&i%t^ic!P-Ou`z&wof`=XY$w=TWcqM7nprMNG(#H?;IH zAk{#+3+yh<`U~ampGz8TQ447VY-OK^6?8oEnOn_m)U(zXsj9%dD; zU^G*4D)th~E!BUPJr9#3o4WL*59B5WXnIZaS0RXc9PlphJ&B;_j9t}dS%+ke#Et1- z=cM@V@<9W1^yKWe`eE+iiF^jM8?pwAsv;Vl_{mUp;DwJ z$;9S`z;Q*Qn*Zvm$#vJJ_Ue73q1(x=6)_T*`5E0J4_ClK+x$**CW6U|PhU8tZ$RXjx?6U1>d%?p@Kj+Gvs#G76vFsk1dQEwlk&7 zi$`Ev8=m>xL?3ovboXuwbn8JJD_17FV}-;EXET?>+Y|T{-w=+bU>{As9SKq^49ShaiCsU+VZvJb{7(Qj|8D~`dx_c}j3v+o;Ww4yo zEerEFQT3n+pShIwdgt1X3Yz!!`!apUEhk1Qqdgjy}&cS!Sh80-3;zjngVR|iW zSiMJ+pNitTFj`8lcNb5}GrELJNMK$HoXo3bdyLeFj{=%=RRh>}E*;E z_8BzrQ9Pt^yC2r<@p5mw+Hh=pTX z=vg_j1OSW194)y{#Urz&ip3}@%Smw%B^j0>Q{N;RtVOkqJ}GGpR5Dsn5Si)-MW4Fd zRU&vPJovJ(umy|VZW5y*vicl)u~s9d#V#{5g&Kr!P>f^>uFkr9zdfyOv!Zag9JD?I zSz1zpaXHeKagj0+XBjl6wp+zB`lu≪^AkEg-C@-x^))*A^YBg3a$Ur3kSKl)oxX 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 delta 17666 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 z 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 NBZf;=)z#mP3jpyVrFZ}U diff --git a/public/harrison-crosse-resume-light.pdf b/public/harrison-crosse-resume-light.pdf index 3e90f007979235ac8355914d5809a6a94242577d..b809eb6b0b24e0d21ddd2fae5114fe64251d6bbb 100644 GIT binary patch delta 19459 zcmY&-*mC$Gtz2Su1jit71d9!TVqxZDVUGJn@IRoYbPfXGVCLi!5Fm1PaWXZuh4aWf*Ilo~ zYjN!SU3_#3D$?vC10(e>AbnmL2KV&eU6LSzs&?LQLK3LW7|+H&`CesaYfDn)KAE`_ zOZNl4OaKFrH=w=;WOa6KGML`d;TWs*8Gw$Qpz$3Nl---A&-S;!U38zm&!^(xHS=Dt z#ft!Aief$8EAVmtIEub+4|KjgJl4KF16HGHKDidrzdl`HNu-l=L|P#y7#cnhum5?Z z(iJq4g~KO|$By2rq$PQa^l0hft%Hi$!C7Fqm9JI4Z#nW z=e~WUlrFs?dahNH1q2B;sottw6U>R9wn|gVs(DUoTUV#9q}5z{;AK-NOHP#-fOCOr z1gi$#-{75_!jJl34@12VKTAP$GVy;gO2G?9L%A1+kYwO4Bo7u@o_CqvV#dVO=0h8X zzR+jHAhC=ii3m2*9V0ViTc}0OnnNYzA<}@h(OjziGI-kSGUt8vsWI&8Sq)6Vq)LERC7hUCJe{FC}u5xF)P4sFrpQFkb0JJq|WM zf`nm2$>C5U$_i?@e)TJDg$yPe85m*|i8hgw&8PB3;U)7LQ`;7l)LaOFJ|iKd4pRK?I1=!;8ZHrFlZVZxXU zMNo~*5>{3&!r`bbv@!MUa6sU;iiZ?T)1eyat@lur3oHKsM?!oA;*uxN4;Lo&(wt5i z5!buvcTpSce)v%}@id;j^=dX*3PXMVTR<+)KGPF}ALyFT^|{oRq)t38G^I>V;yW-U;pC<7`$ zbBfGU?oj&v?Kf2-*)$EpSi^cRqL&wSOX5oTzJ_wJRa!7D&>Yo6*Ybl(5_@*A>`*ub z+aV|(vl*2kIStdko($BML~(`EK@(!rovelbi-M9)2P`AcD(p(hDl_XQJ}{PMi*6wf zvDYGJ?%?7y7~+aKMVYu3qcFUIoN~k=oH@e?ajZu?0r#p6m;3KQMII;@BAm6*WWEKb z4tooToQ|{xLLmK0Mc&xn9-iX^Q4KYl6{!YD(uauCL6Sc$os%I$i%5pC%PlZa8PvSe z>Z#dG!qaY*MH1s9K`&`7CSVn=#}PsO=wY>ivDK<0Pmrm9N_}g$>T^4^q`sIBA_k!p z$?VXq#?%qho97Gw7TquY{j6Pp83IzUJy~0Z--g4r+rxh4$nyKr2CYToP{xWef*f%w7ym zQ$3IPCpsy`yL?52=O5IyubT&oVe~NFrWIU@0DHk2pO)^M-Cf)vide>Jv%+|80Y{r) ze%PKqxe7v&ZKb+b5k`Ep3v7F>THq;8SN%P~_Hl=NE;#Y@NvOM#Y=!Fa*SRe3JY->A zOvHt(6x;h4o(cpI`P%f|;ix_XM$m5h^2~gbUrTq-x6(s-akI$vcHac!iBcjhGtBEy z0F<5ImN*AqkJ{7LV_2Hg2&q?SA%$i7v#^Sd2+&MGEa~t?g@eXCDsIqdq54(x&^hhK zK=R{tqb1S*jA8z$D+>Bo{h4TG7l~}D^904*7Xq??V>Y&JhqF-Tj=Gs09;Z=qM4LjQ zQfgmwK`2Y%d#0)Pj5etU4EJeU-&NrufH$R$=ON(Cs;$^SEDG(M`I)tStUa#XY z7*&f!Mw)HqEici0j0rt7LMDhAVVCZd@1WBJ4P~S2Atc+x&1qo5N!T&KhM`ZG0X3>N z6M1>)s+glSFAy^Y3@zkzc`B+}Z2e+dTxvGa2L5hCV+ho%2F%!{TxK5BM;4wPL3s2m z$fr+TET$kCn0d$0|A4fOi z_ToFs%X!&W#fs6Cb-D(6+V8=e*G^=lYW-$KhZ`zt8V*wy!08Di2lIXox|CuAg6_Mw-4)3^eVtm)Mo{v%SrqmFoJKqu zY1`BDUrp~Tn;X}!|>9D;8py*b$cSiMWcq_u2LEc*WDAF zHB;IZM)>l7G?#IPN11GnzN>$4g#Yp)CmwEed@62KsWRnU_-zWa4QN!ATV-8wt&8V# z*r;zIKB%uCv))==0bG}5pow|92QNs6`9=d7Bu6)0-7+9;hDP>~zR zA+=E*SpaDc&2&EqO$0 zFWC@~Ia=GMf4(-+KS^6RlYWy%7eKE~1*6V4TwkjHyN7O1Iste^@db6X($$#d<<&GQ z8Zu*APk+rASzEwnz#>F}m7uEpkw_iE%Gkq28al5C6%>n*+l6DMyNI;?anI{-e}D&v zI`~=^U?1~4ztp(u7iAe?GhhR~JmR`q$D9cP3tQOXosNFhrWqAehr>r5>(h8k-G*ll z^}7`-f4cS)h6UhL<^Z!2*LaL9hL5GT2lrW?fb=wybDW~9pd)uzDAl>7Hi7)T6zS8D zjdVIqINvYjpoiZ%9H5Eq@N{y7B=OjdP?|q_U*5MUN!b}4&6$NG8K~a6^CcHao?L&@ zAJX3V_~8mIq#WDeMoXTW$#Y$^87H%wGuh&`WRX-^BNWj5*0#*nY3jZLV~}P~Cp(8X z>bFDFFh+7!l(DK;O+X|1^5-e5&R9dPd0@|e)S4&R?j)Jy0c`{0ier$fC6%A(*-}Nt zt{AF~*zMC>hr=1}+v^2g#%WI_!j{l`nxh2hcr^01_3p-Iu7f^ zg61FI?Ip#VR!W7Id5M}78S%mu1=}KD)Tmpd4IY~ge?&;D+mZBozix+j3JHHXnkkx4 z7X2mKtHxL{m7ALCJVyjCi+=D3p3$1NR)g9+QeyxPjnrT96;yBAJL_12Q(%(J0ta>Y zldR&syca^q2!lJkB``T?rA=h-hrO2Tix>8&6Yd>LW87)Z{gk%dPrD9VpB@yZBhxKH z9tEi|1kwgo!OC_!mKs%BwKSXBpA&NJk;;v#%UebHa)i~81sKV~_6u{GaSJ)8G8YTg z>TAHc*_lyObynIsihGfJ27XAB_9H{6FUA=-?!hS0ilLb+c>(XpNEyXvZPsJfFN#T5 zb5x4v0FD(M2k==J=N&g3dHE-^*XDtT%miZC+oHv6$(GvZl|--u`xuYXmZ%!CfeL6t z*;XHTZJu*q94vjmX9s@#7oG6m3j!ydGM)fYq`c_8PWUYm=jnR~VcsSw2xX}qZ0He} z@PIs{$a=x>wPwjd%x50)M+{AVK{3}fPpX4*u9Gbmx5r2r^bq$s>ApU=lMKvU7t2t~ z4nWqgvH!!{ooQz*yomjy%RsE**SFvq{>ap5tm{xhBsoDN2d9R>*W4a+E5!?|sZJoT z#|33MVixRQVXuW5c0e@}qR9bcy8hST4E3FZ$a|_Xj^Cnbh+xjz1Zm};3q7rTRn&i} zz9nvLO6zhxX@71t>2PjbH22~~W$b&mhGb12h-ZTzp@DQ)mZ9 zF?8)ju1sFigi#|{huC`xV6x!3`z4EPzg-iFGbiRPIfqR(R&ww-FeMpZKzY5K86z1_umOa44mWZx=}9Qo^2bT2%e+YIEm^@dC-~d&xoeFO?J=57D@>^!rpz;sC!G+?I;rx^oj6ui+ zk18(KX{;TV5DXBK>z2y(rLb>U*aP2#pnr|{BnP=ApQ}O(-?5Trb4zEcl65HuEHVjV zLamU;N`DY+3ULDJ9OE#MhMZH_bz3Po*$PBxuF@ zUe3yzYGm%kq}BS<8AcdkHs@bJnf?W|bbu54Ojy%%eh)UY>_pJv0x9zq03DifgA12a zvL-CCA2z|Bv3C}4rLl}cP+zLCV~~0EoNv$yZyuDk@kJ<7Llm7Js`h6(#5|2p6fb!% zMf;He{f$F{$_ZT>Rx?KJFe`hsIdTet9GQ}Y!WlJs#T3G=gEl!}-=DzhuvZbyAQ0mm zzTf)0Wu!x*C)sq{Ib0A=y8U z-*hzo*7l>QKg)T4{r+};_=8T|80g;45=3Xg|GS3Y9_Q)=PChu;Z)wg2UqO2g=GJ z`FjX)R9^2!iA_2RbHt72*3Zf|Q!}007M%w@$g_e2J>|G;Sc2b!C~_=ikF57M2!`4H zj*Cjn?!HK^m=ttxu?RvVi{vKcspEywvtBsxspJ$J$-E_T+B-E^|GvY^*g=yL>jJ z6yZHa(mKZX6vVP;5(+Y%m(Cj;%84HZoiVS_Hyft;*CCRh+ta{0!TSe|Ig=CZyF7bP z{YS!NTaMDAxoy@YkOD0^BYi2thCVz#_u}C(q_#U^)-$H zYPMR~@`v%s=`Q2;OrbuMo@7+S1exZ}_^&Bj4zqMh&2{tM1lE4eRe@RWiKbOxmWb)x zJ3ah3BVPTxoU_dBnw(CXf1HYsiNeinvUNO}(ow+OoGRI|2jLG(AE5yuM<=-0 zNN4*K?A?I*xRISyM!`C})lO5=vyk5T^ib5JY7^ecip5|Cp{c#geO}YyMNwF#Wz@5q zO$M$9<`DZcX@G-YuPugZaop?Mb1UV>#;2qSRIxALJ=VFM>ifqg$Nlvq4%uK&^Q3)- z;J59}%Qtnm!8=~&KTSmQej6{T+#mZnaSs_-DlPyE3~^oH^DYyif&wGo+x;N&$T<7; zOC-T1&neKi)9Sxl;BTW$REIMwP$V~?z*^aw8r#Aa9&sgNt-P<)?*4ZSt~Sjhf%v6b ziHZ=1q{%~qJ9-xa?V1y#GmZ6c{_1_&ctD*>_L5^N2vDRG2*B;xl)d2_2|GKZ$l9d> zX9FY^wuVYO-?&CX1lY#Oj{$}qr3slj>h`e5@l5pgdHt^(!G}6qBQ-evBgka}ysmDQ zTKp;I+WhY7A+9HXUFp5T>#Xi0CE2sB?s?4#jrWk&6Zl7xtoBE4QJZJlH9sfji`DW^ zweWQw*!e50KW>XjH{H(7)OnZ8bzaBX#>$}^r@dpB-1KpcTD;| zyqM^g^Q>kM#T@ww*|myxcssfM_Kk`YtL@wlN0$$Dv(gtQdU_pyug=%VHx4Ez)_D}} zR5I4D`0s1V+}|nIuqRW0v(CcET{1#~!?f$Sh>v-P%(7V@T_1Tx%mR&v z&F<0GABqaE*Lbw*3ez47a=UGK`su%VG{^0dU7>x?kUq1fxF&>#RM;>0No88C@nR~M z+nlefRWGhmq&j`|>{sxcWyiltYAzJ-Oc>S_C?w<-(+hmn>13lTB3zB+4*C1%mm|#{ z?2_x018|+l8Hx0%0e$IgH~2-3;T^yx&~cf)3mEMbyqfXZf1ui$6cwkoN;pM5@CesE zg^7Nx9F%?4KDd)bNePV?Y6+}BKS zIlBk130(eA8b=KaXU5`NaGo+pf}HHZ&{=^4>99xh*HjL6!mZ+OAv>2s0`9>2L0Xk! zwjWOi&R@;C7oi>2MO(>tZAAn$gRk$|U<i#S8oJlf8x7y*!eYt+x+h@PZ`Yl>ZnG|5 zCm!>JKyy1RTnLEKWXhDCcQu5dJxWk?OeBUxOouiVXb%=7DL)a#cx1mA3R*|p8k~Dt zh64QnMRuB5xgFR1UH#nI_1}*0zYabgz7Fda{Lo|-`UR?2P*8|IU1**Kg@J#OpQP7Y zqdbZ9?}XiA7@q)s;{mQ`W~|+oASYwHw;gc5a7$1ZXp5I!fHUo5Km#+!6ETMp<6x5E z$H6zK&@f+pF4h*Ninbdr|0d8;mjq3W{;UrU5m6Exok4476tzVUbWg|6GWjIU!CQf! zptVvNyeXYBtP%ZbI@|5*##)h@I_*!h$JD~pMRvSL!ZV=n-1Tv@_PHXOpwp;?j9oUJ z2gEalxBM3`=rn%Nsk_=hW`!$V?#J;S2jVJ9#AG*+x89JM=$0o~j$QQ48d{7Xsm7gQUX z3m^y<8r{7IWPo*>+Q%htNQl84tvR+u295Tat+FA>6vjPfKzYC%0gKm*Kv5lP$*xtz z6eW)408Pmpg`N5LEt$WDo)(5VjFl?_du$iYM~XO_EZ$-@XrDRM55a)&=F|G4FSQ?S z!VqJZ%X!jn6XT?Uwv8zUif()C*RSt`1;EW=A5{@E>?TI1DA!LTs({rr?15O;7g zcb9V`*Z#uxd18QnYTzewAyOf5+QY^cf};N7AVAps>HLT8Gic|%(|Hm7^KI*034kPc z^8EruL!7rW-%`P2PayUy?Q3AMINB8f93hRnaZ-1*(lcOoUcH{a2#?rR+K+l15e$?4`$s7LN31Pp=?W zgfdNL&RKX>W&VbtF`*(^UZLz$we)-+x*5Cuxv0l?Rr(&&l)U0bXld)~q2QHse=}A5 zy@OHj<;3b@Ep9H`z^rwXg9*q=ekh2}JT=L}n>`(ML5IeGa&ItNahW|Q!!Q0G@p63l z>sNM$-^;Oy{mAk6dy3yhWgWk{fs4A1+lw=)A4gcjt(uDi&HUo(h9>PxS;Ou9ug^1Z z%Qdyioxqo6+xE#G-6 zM+@3YGjEiU;#f{>zaRp7_;q;HuJT9&!<5p^O9v^UZpIGYpC2FRJqMj(K5p$z`>4ta zvNn=Jy63M2!*SR)i)ma|b5E$zI1yX*9=-BC3s~z(QW&UtOA9F+*nDyv8}{yyXNY;6 zjjS6$}(^`5}Cx z?0K{e&s``B?H*NGn@;KcC#uEfo#Hz?GwXx(;_u8u7oI$IF{GM?q zC!M|M=aDO-dBxR7k+2J@2lm_|yl(DKBBu9i?Me0Z2`MfcyPg5 z<%iO**V#Myj@lKI$ZotD>pb|skET6PqkJBw=@`=@H+*W}bIm%{5a3+p>ol#W{<_J? zb);?1X-l$8Y?!0IxuUvuHjmnUm33u+k4WjgG^$P82K*cxqn5kh_qS z+Vz5mgefFpk%#On6>l)Ll-CWm1wQ9nK2MiwNT9LS45t1)8%j;jc%0GRuU)qvr;ozd zpBR@KC~qRhH9 z*Ghgs>U%rD$!RpgNQkRF!pjPAtT^-S;ae-%5Gn%kEkW*x09H%OJ zf&YZ4iSSNLqKpxPt)&aDGKZs0q)yfn`8}KET{=Wwg>{|}GTxI6BmI=LNj2{4I* zp-s*y9=_6~dpl79;}Jej@w3hcFsk1@XgcL@-~7;RtGYIlz&6@3b#J7mSxiq~+fLP^ z8?5^|osL7?Cws0ORl%ExAHJYzjr-DOG>{DRHMm909)A-@O0$fRNEj|D9vD1R1(n2Y z1m>rgUV8A#4$O}tKlRpT#~l7F{Wy}e#uv^IoRzXqq7AGP;HocsBRO^t5&Kz1s`}B1 zA`a>lwh#D8P%=3L{&&>J(9<(5nx3H&2uNQ93bRLMwcY9=4SnsQ_D3j_ig5^^ z3u}x=pTiXOLt63~3*`T-?Qyx*zSIsofsb0Ng&}4)Z=TGA;3W9bvd3^~>GE9A5!xUn zZyLU4{G0u{C*2cru5)sbi%`W&-Z)1Uo{*(tU z)F`>&SipRc@CZkq;)NG?7^-I894VZl>I^X%PEL6eEP*sVrJg;}s$|rjg9j(`f~Su| zJEwy>K7x%ch((|y?dVi@0mnJ3X2WdV4B4l}q#d~wLfFggC$LqIVvbw8+_u9{D= zg741T7T;)6e)VZOpF_KM>l#QSS@k7jzdox&-3Pw)D@EyzvYBTUhovV?Bqa=3UCxM_ zT-;yk2;}UZx@cu3Eyn11MWqA7?so2>x-BpIGy+u>cQm~G-vb@QEXnKKH5?*?(_VKK zGf$DVz}f9}1ag}+8nmK%EM^dNTg_k_&b^kUzApEYuy_3}uH%qxrWUc$V_a-Zbn-)9 z*o|u{#a;z*ixx!c6Z!SXBYcW?>U^-*xW><-;_nNlft36x-|B9D8x3J=ay?y-rUZO~ zVTV<2*O^ltfawu&v9akAv2hS-b8v7HF%faH{G;q_MB3c!{{ROIkv2O!hb|E((?7t? z^3U=gr~jaTH3zdU5!XKhD--9xCT1dbu76$rnY7v2SpR{4A4v$MAx@~EVFqVmPuQYi z2jff-(7^%{#Dj?WP+*D4k;yQ8OV|j7405Cfh<53oUc*}~X1&N0Gzl(X6`atiI%~}y>%wKD&Q@S+pR&$Q z|B3c{RBXoBZM%p7H@)}|h01ZXSb3sySmZ6=B&u-hv-{<*FKrF?>ZTeO6f8eR+);}V z_E=kpkGl7CQv>;D^#Z_=6NMoIS;XW&zlg|xB8cdOo)~@|Nh6`k2cZRi%_04wnTI-y zJ>LPZsq*V2dk2h<$M@l#vlw+0jpdnuN1_~_)DLbnhFR`OyMRl~!$U%y z3xRoM$a^U;&Q<(W#p|N06IXQQ#(OubYW0Gh|Mwo7y!G76JBY!xbt=J+t{0Mvg@f(C z5|xdcjpP4FR84pXZS}N|i8!0(T5`$hK6}lX`O#Xs<<{2Lh1pB@w|IRSJYGkmzi#LK zmAeJf)bxq!$Bk3HEJB9ZX3KWTjkGv2#HJ(G@Z^Pj;P7;H@bzug^>t9-g&wQa3+vgm z%Z@WbA!%9b*cXDWhil%zEW|G_WCLO$d>a$mGkyAaxx7p2a1M+6IH?F4DZ&N zFGzif0X>m}M#GkOZ=(RwfLwY9?BPrpfA z|Kxv4>rOxu_TC8y<$7fEKOetrI4%g>c81u_lqo~-=ahqDky`sQa)dfrhRk`7os?WVZ(9#lqnT zGaJ)V1Y=)dMja20Jt<%e=Gn!km}hCWeP+|5iC9Y)TL`p%$$|6E5n`sh67>)L!ZQ`& zo7&Hp>;TRw8$Z?;0Ui1!A4>PAkIBptVN@fDYz@f(E&m3`NBbpvO@L8%LRyPBLKCWP zZDoq6Nf@NCE!iAOxW(WDks_QU@r~`OJHqQ}OA-Py2w4<{XF5s`uNOSo0V3HEkJ14J zmn(Rd3m(Y%;?7c$I3__z>FwkTj_a3os$y|%Q&}YhBanVd`>h+X#gBl7Df9HO4@SFD z!QUv=$#)-JKrG6r#QB}11dOaEd^dFf_Ra{RPNN4U`hc#*U)&}KKSHC|vfKz%#zoxp zPkN%rZ*!f*_48pkz|p1-@K7+txMudp^DP8QJONYw&}`>B#>?9#E#WEqIC|W@SjXr6ytq}bOSdJaE=^!)9%FZ@+L0be z2vs%2Gf5k%;|G!d%U%}M0|ID)4Ut` zq%Xw|EJn^LU97#u#bXN=NDnk_`=lI{t95L-9$oYl$ntJ{l5p1J1uEAM&hw}p*n*Q! zBj<-ak6(ONHVv|=(?zT+2`3sBGmI09x@XZSEZ{I5Kj&=q9d zblHB;$2f(?Q1>wDq2E;Y`(rc3A>{G&^lw+r&!XyJzUuH9X~GcjXDTsf8IYd&Ja;)m z(h&(yl59QnkZjsdle2&bBtD@Fz_a^J=z#d;>4&7yOE#G))v(k(3RNH1io&d7?w76m z_G}dgIHhVF_Q|z}vyuFfTc|ydoISbaWb)uK>$QYJLP=gl^JF7gisff49W?(~Pd z*Jn3L;ZBiDi|bos#NC6O~&H6flnAv$_oKi}gA9I#FZl?m-oK#pPq9T9mCZV)6)o=+}!WzshG`H1^?20DVw&cKcN`*lshQv zk9{VWQ+RV=yIr@H!####)61t`Ur5|zGZk?NoVQ>~a$+c|rFW_B1NP4{?Py>NcyygB z<-3|jbq`>*`S`O#hV=?b3`;VtTk|~C&J?}t7tLf5hto4&dGTLA$~crbrl&w8r}`qZ zwf0A~{l{Fon>8tz748@6&!!DBKB+ax6u_wKj(u}6}GIFgv<#adS}k-DgZ2KU(G7dvQg03UPBf$ zCA6gQxB^DG#Wi~PRHyNL+9pdHpPEuVvnA$9lv-FSxHG#EfE+j5NH01zkWqw(2^#B4 zKy;q6f?e?MC9ask@B;fPR)^E-6HY5j#TzS=$c_=EwF5`C1payy4UsVU`YR9$v5z_8 ztZm07CBYi|a1Uz-l+IL-YWssdK{iUAk!NgBwcEhm7vz1B#|LEQ& z2#)3^aWB~|JI248-1eUw@t0cY3dZ{O?DKQlV589u$VUE-tfvPpKh)AbZ7^Z{B+}j^ z%1_{w*zApi)2g#^aeZxP|5wZVHEcms(mJbcKxvVmc|&*8Ghts){LLmHg@`kSEQRgc^!6Sk%iXa{TY=fndssEej4-s)Q6#|lZ~gX6t~o@HVXL- zqqJWJHJEr?y)=~87shmdduv+DZ_Ikv0j?~4&|N$4_1fXy1H!0Pn`;weMi)!|cO1QEilR7GcF!D%>ryuCX z%ogzcS>(_bviylRw#fx*XBItG$9z2W3krQH_<%SnYm$jpi>Ox9{7tUrjWrj5YdRNK zhC*xi6<4aDAG^U*%QolC8o6PLFc)urS!ydd^T*&hT0br~w}{`v#v?RR=)u>7+}xQN z6W^EP%>>HfXW`t^zm?P{3{yvZc9#Zb76$&lT|0$eadK5GgaWrK&$5W)dK50kU}R9m z_Dn%WT&j{b&k{eWWxy%&iGLRY8*~`M?)NuPl#hhg$2S^s`vOhto$ZMZt=8zIhWeV% zZ@C3&b!mj>1lY%~gP3^oA-C{u#kUnkB*eecGYBttvY0Ct)O*;`u~tuBC|$(CF^^PL zeCHNY{?IU1okcZ7H@5sK%dGq(!|4fsc?$#XM>rX40G>nR1v_Z-W0)ZXQ2KkEDy3yK zCpV@RIe$yq*`hJEpeo8}s^`$M)^|N7N;bV_gSg82NhWO*Bc^*t;z}~y`5h%i>Fej2 zF9~ss8p01V%Ph5OoUmi(0+!p~dnDX~sl*TvL|EV@NqQ?2AzpfghdMO7Q)`S0g71u+ zfKia%NMd}gzBz*+|69>H&?=$O^~y7G7dZAz{nFS&-!-NQD#^m=C2?jL=kfPRo;Ufm zX&GG7DptP)Ij+}3Ex-iu{Zl7VH!g4m_RQ`e*&AdqYK6xxtBHn&P$@%naP~yec2{rjQ9@!Li&c7 ziH(LtyswFDcGy5O5F5OY&-TqT%ew7str86Ox!REkD+?~1b-RezczXzNFwCGgGCsUA z*Q;;swayn;DbBy2*r*7=wBdUV8t=JJ^*N{A zmD1GIRRaV~IT~k;YuS5c`$S|Cp1ChxUee82M<#VznfJ#7&o~jzfx?yv7}FvTSsIlL z8qt$Is%~+*O8Gx{D(7sJF`c(tg)+u5s#MTQ&c4dUbgn5DI7+;WV3u{^7Rt4T ze9)I&@3oHuuHq?avI=dU2NssT^u79#O9J zc6#Oqo&ndr(W1fV$ud=6&*1&QlsAD}c_-&Vv}{XoLw&;`Q2PyHBv=XRLHWq-cg!ROHJ&5^fu`mv<>%juPH_I>Y##mUL|+n=)=iovZp^i?_4 zc}6}=tYVC|?EWOgwli>E#F);j*A(h-%U|4q;n7x9IJyHH`iPn*<s;C% zN7xivyQaVM(*w~dJQ(>cW=nAn-zsNEnxE_x3 z7q;JBqa`JVogITKoh}z7C6=GCgvySgJeHmeO45e3tu)hVlt;LK_BM9YImv`3|0y2? zQmd}1Bf9d(*UyMTq-eN9Gdg(okP3>^WUuNOg7A)N+Q^OB2uGzZp_| z!wXIPO;t)qYqY84Gec2PfT@8obUx<>?qP1vxTq{~L4#eJmZ7Gmwmw>uwjJHbtRCTP z)cwtUX?Nn_qV%W+L+)0m{!cE&9Jc;3pbDcb=go_H-At*vq20rq6;Latib-%kAM8Cua zD*3YVtjssnS}O}Ly9E_NLBVzXj|!5B9!nOa7#}#u@qgnjvRrc37|>r1V>(v_7&_)H z)b_W+a}%oE$(=&2E6eN~d9>Cl<=;KnJ-rWj$QgD81!>ZT)~g$F(aGmUSHuIW5u`PjT8a|uG&n>@q4O3m0)q^s7-*Vuz1yM_YsNh8%|e$1 zud-v--5)y!6}vAA2j%SnHU46xEG);>vJTRq?~SD|5-vEtmeYeT8Jn$sMI;z2)@Y;? zaQ15Tbt5;|mp-48g6}Kp7?&3hi_a&r<;3PbzxkJzw(c+w(f8dSV(v`I>WDpzZY~Mm zPErWG>xERPFwn~Ul-I|2X>n}iqb)ndF^ADQhS(P2+a0ZcF%SsAAiN<(at&J684DbN z0W8e_I~Av!Fm9L6gckhh2gkT79t`#u8J4(^LW=G{vhNP;%bH0n&QHABp;h%YV=XyM ze*x!*>FgsGo^O;+Sg+*BU9Z-h5knkmug&x> zwrid!;>4zRAq=~=*GSJU09Fwyf5cG=;ZV#4$?pxDSGv3hfyql3@+K+r5#_Hg7;*2@ zcmj3^6I3tA5lU0%q~B&XIO6mN~0y_j|nV#7b0!s?-s!m8Z(FxSj7Y z&Ouod?_Cphd<>?!iP5q}a0O}c5VP{kg~`K0rL4$_UPvp<=T?g2fJx3+Ecs6sUZ(w$ zSTiD3smJebe-nu&4*ruDMS+LYjID!nEYS;Y4nGc^s5f#BguixIsGaIk8d>^G9Hw}$ z#ci0UMWNK8SoqHDR*8sF)Akf9&Xy5GPs@d9uX0Ajt|8VeAs+=m2j4kHi1t+rMk3a+ zRi*a&kv0+re~%?%ll`S>Mm=OhNPviO>tl^s+5PK2v*L047WvWra+u!7@@cD5(#_@0 zv+BT7FMr_>Vx(?AuI@}Y9RY%k{r}(iVfw%Ci}!zc+K~Rc@zcS{M;1;pU@Ucw#!X7F zL;n>iERRZt_M)=BwQ%0b7Jqbp1jX8t+`6H0-!=mjjC;sreCf@1_Sq!Dz z=ctTp5l|ovPxdtsJo>aqE+7YSW>5`mwS;RNf!eZa@EB|_2IxfEdp*G4yzjhxB>3WQ z=7WVmF<87ie6!khZw`8f^@pEjeP@lh%sPS|LIq)@aE@prPW)noxMTBAQ6E)r1l5C{ znEijv-><`Df0R1IPWix2z4fffJfl2rU zG-%Ae(w-p&5R891GW7=&(p#kxYz+qbar}RSU+FN|mz($<_F4*E;|MJ_aa5g!W`u&o zXvghst86Mt1+KaL3BeV+zW4vtSLTC7MpgU}@eQxxz^2y1e&`5R?~L zMvm~m4d+u*h_I!;PU6ee(8)! z`2)>>Wt39&tw%7fX>e#Q4`g8k@<<~b)AGDPdYu8%C3JDkUu?Yo-#p#0(aVk71YQw+ z@DxBhkNunjO`z-Fdnzd6*F(yq^c|?@_l$_?QwaR>hF{E?0;K5-zR6OJ&Tv-4QUj}( z!m=JX3cIH5kzF5!cNjIF%B^o;cbM+euY0~gdM@_M)HmO7B^H^YdxE)%awY{91(vE! zVHgx@o$wHJBwB%dkN4C>G3mstE{PG^;!k^NiK@*67WwHfTe3lAw~z!Pr+mR*UtP0% zi1hy4!jYNmC3ujZdE`u#A&aUk23ljFSDZFf6@wv&b#I{b~XFZitEt zQ0=n(s{YBcpwz=MSRH2T>4Sf$*h7A1fOuFP2=}Ar7yg|w?x=<+6p}IOtVRzs4OTbB zf+MWbcSESM=5W`}P2SKZm?0&cV2d__#`zryYsWk6W zFZv#`q|P9o<$#)w7{cgHOFwh;zgMbIn2zY`$O8y&HNoipms3l^UH;478}ROIFK}kZ zn?kYAT@~lK`fu|O8!CFVW@*=-10T3j?+TA2uN_+g4pBG)Et4cfkLL{^3ldtnK;bv6 z{TRaBJ6h_`Z!%+iGO8sN#Vu|78)lLZ8vn11GYyA&d*JvjWEqkq;*KSI8D{2ZW-K)$ zTb3C6PEytk60$a-k~JB-Y#F;OO$v=H)wN8FHB`ttM$1^zWTg9_?(=_fug;6}oacMC z?^)iQb3V^eJ$5G1ri&8I&99y~f0{{-RfrgP))CITi}AntDx%xt#{{kiKlL1>qr8Lx zS2V=M@}&;x3i2Fi=%NW!k@k65a6g)He00805kPfBY$`;oR_u6f8L(En+^v2TDcLDk zCt2c!QdDRQA%Y4mM3=+-GsJ>MFR&#k;KUZ0TJV}^4LhvhE8{3l&%~Vb>U&i*)dJ9c zsq3!E?c*G}w;lka>p!Wj#FIJUIbTBgL9ww$gawEZhL#EcRo|ToZJ4BT+^Cp35Y-3*!Ip=!nub;j;B^j)GT{tPEg|z&up#U_u5RX>fd*fP9){M3Gwa}S27>!WdY zRQXSD8p|MyjSjAJKfe#{%2))=qeHE0`I1F^&D>8;qoyV1WmMlb@Onm?14hQ3TUdx>cv-046KCRp9Z^jRQoQ$9P#9CaFFJ(O&(@tOHoH6oB)JAPW z=HWY9?>r35-)-V2=SKptOg(SC7y>$8(L=D1{Wf=Aj)4kNEY}*||I%dkrfrQd8uF(m zW#fLo0cSSqJqqb{&M@>~fdY$NMf;oHPY zO7~{c)wJ9RuVl5N{NSMb3*4=9YgKEh4bHpSB|B=T@AW1m-O_EEq$(2)+=nLPeOI2`A zp7!-0X)N+rx8cdxaX-W~2DQt`#JY4G7Qe)0r+Y)3H9Dc?vD`&~DCXp(K2c2_#h2rR zU5KZmcUeJO1_h8x8)bQF@;rL`*tjuc-$@!)f-}DLODGsk#~LovoZf>U{`BZ^fzTdb z^xSaYx_$pbxtOsOS$3&V?jdiISqlDYgj7TtPy1(}L!={oi+M6QHeMBqe#{&aNo3y_j zW+j!QZOxLF_3y0KU{Ib{v$NebN)#cshb2u~b%G>2CoJv>$wC@wYIY~2Rm4P5YkVgT zYdMc{)sg}E^-TFTP;J?dw7lb^2Q_Xj#^T9HZ|+xN+`(HNwr1{g*VaLb*xJmSA+!wgD5ybiwsb5n%me^iKLZrF%NIaa!9 zMX!AOkNvlgXYCUp82o(Rog-%@dgI`?t?y}{i3WBnGbXgrlu%>4C+z|J0}JD0a%y8+ zPAx_LtheJhUZ#4b?<`+7We$pl?)ndyJ^wR*T^BDg7oGbHmDvt9r=$k; ze^lQc(RphkpP`Q&<5P^Otzh~|(;NMre~~hQ@2)zbf#-q3#&@R-P+OBjr)&{$a-KRwq@r(>~v`FZL`FX*+kFQ}^|3yu~X_ zoQ3>k?6-5Jcu@bDA%i4kzB58ABAnAgFa~Egoqd&D3SgU-#+}2jvB-HGmC7NssJhV7 zQ2PZXF(t9{Q3C72C=qEu-zzunP_hN^no<9Kp#fKV&r^xAaZ17Me5wpC;zf8rB|6IN zuKfMKd@UhVDK(oG44-GfrT_mC#ZCo!`0)|yUB@^8geKvZn;Zum4kOgL$*X7pa5m}m zD@X@O^Zk>6!vF+(CI71-P;h{->z0T|sw4K~K~X3u>^DsV4&9@{U@!pqO#{?_*HD_j z)rA8n_P&Bb@&7UkL#acNdmBU{VQgsYKjzsVW&wLm!!*=2_LhS~5s1AV!=Wg|zbDAy zSIcmyrpDe8!(j;6KMwz85U!3y{Wg>88X9{|!w~?K@ZMb?gwQ}~@X5;?U=8{H2Lu^< AtpET3 delta 17736 zcmY&<1CVC1)@|FiZQHhO+qS>vw9RSTwr$(Cr`^;3=YRLrtNZFys`k!FC3SX^m8_MV zzjMGxR2 zfaRKM$$&}wJKi@U1O58Rl8~}d`)8AX1hmXNlXrT&En3;4+>;vUW^xZHv^h2CF*f*v zN|t} z0pBNcQ;`pCc@BWjCOW|{PkioVMzk5`yZAPuBr|B5V%hy`l@G%Rz{iC}W5Q+<6~p#> z@6W-@*j#5hI1`Td+rbzvdxsS>LWP$?YfAg)-SbNs*2K@hd_l*-ASu^0at6WAkB2g> z6IFX7c(PpUvX5{XO4!0|7X<*L6|*%xb3_LQj>N~hMPmLbl8s~j>OQfJTbsb@*{YFn zk>pX&fvG81m`aq>OAm3cBZ-QWODpXVjthehouJ@H_MT|SOF{F@_eJ=Yp#z}f>si8K zU<0G!l&Me{B>5eGQ3b$1yYGyL88x-` zzJzfY=Kc0j^QD%6cB9Ct??R;_wTuam*KwSZh6ZDD>R z!-z6JiBQyNXP|~{fWk}~3F-fR#dU+~Q?^R*NHQSfde9tCdbO^>ZOi&FDXx?2P;y^t zevrD?sAMM+!KfFep9^pxBlelTg~|MtAw6w%ZBEQnK`9_7bO+Ul=e-}smvSBnkwy*9 zIcEWRKm{2~ErGKv#GPWd;H`w2N)%RD9AZ)ts-{AQFW1jJtYvv!YIEw}`Q`Va`L~tb zG%_1s>sK^#BDti*3f` zCFV3TCH&__hGVwEn}s4ime5YT>#jM0nRJGqGQwm#THbU|w#e2U#E;#Fr3KW@d=Y-11 zR^PmOef*O8G9_N>hW1v=E_waCVl-#Q6>UDS^b&RHw`4dmg|G^LC~;N|2Hc9|6-9SIXAF*6oCP;Q_h$-60K{PCtUk< z1Xx%D64&s!icNi^mYSC_40V^vKpB>JeH3+svs`LvVxw*}bC?PUQAvU+S}IPgNz`Al z06WBRcq8nr1py#aeTiwQuB2=}BGhXE;K>2x4zN;grqQ^Rz( zR}nezdJUU!%6gZ}ID}mVyOEX4;3#@Mb!A!vR>|lFH6t}t1<0%k;RaC*gpB=-zz!D> zp(`~yiLG*_maa=-Og>f<^-DjV9$N=+Uss~5-2x2^5>Gyts*FZR6>}Ew_ZZepyMoky zIt^f0amdloftm}sH4HXPh0Y`buMpaaErY{SI?#$HDSIHwg84wDC0#m8ShO^Qn~_|M zdIBmx@3$<*{ANn8l$2f~6)hCBZb^({U`6I8C9DGOW>svco5i*em2m}GZ6&=-izV}X zzqy%0C0sTXZXz9bJDc}_Bb~jbl1StXlp(-@JR>E^v_fgyv{qXKmNW}uVGWu5za~k;L^g0CyW2l`0e;2@^ zf4z}WYmX`%$!tEO>9SEWcn=gM9c_pi_*5HboW=G|dT2~rX|5?>AkQzY< z*Bq^7ZGx)InShm!q^G678Sox;o;wx!Zl1qNq8^P5*$CDo0kMFaD6*PrRcx`wxcwnuze$Cevygp0D76Up@j2?IJeZn3enNy9FClo4eOgD(a|X^iy{siHWbZ&k-;Urz&< zzWyT4YGrb_OQfgUZ3ZA_<>Ydx(Ama*ucchi74eno9g?g0wUtI=(IFQVVz*myv_=WC zCiKt`kR@tKRB%;!g~1RvT8g8EQ0kJguZ9IDX32^ehc#)_p=ULfTLHjVMqH}z1KBEM z9l)c{(NZzsnG-P-(6dOfjqq4lMJG74-$`pw(RX<1(D42>J7IkXluqP*o#278ZCClAX&^jN3?&-8vL{67t$cxyAF z)snQ(Y^k(0_T!fxW@Qrn_h}_`e_;j(NNRlBlG=DQ=Xt&!JOOAOW_uc|sG0T!sxZ{G zdxu857QlKA{^VrZeHR7CJQ^FLGQ@+HbT#DuQay1e1N08qY?nA7XT>$eiWaU1;YVY|uy%H}IH!77JWv0fhBQr(dB@s%BJ)S&De5AG|mX$6e zfTW#wjEE8JdVpQap~G+Vm{&TTyF{BmK*_Ros=u3}LhbPpuRrl|dsb*QoKnYA^MuCt=hMpoCNhxO9)&typR89nSvGCeGo?Ey_md``R79mJp=hW_+g&+-)(q2b{iY*^G`?c+g6+u<{5hD^jwMh;j?eWF_zZmc; zOPnVt-mzGdEkZR=hl?bzHj3`Qtss0Vna7nJDic=tyG}LmB)>`=5|xR|Wod!Ku}6_l z&gs7!ngFXbyfz#(8ORct#fTF2;doQxSJ@|%0pPmL4wbKz{@qfe%tih;|45d z-b#t7geiv6SqM#9t#fi*F?)|}jW-#vA|6yT$O5WU%dM*E)wQNabXtcBSlax5!5)he z4?xYVM6;MXpORx)k~L&j1|lU9KWmOvf4md#2!0{#XK{xQf_eAh{(X7yWmA8-^lBUp z`dG72s?m$*#~tEMNKm?5TB;7(oAL3>eBPH1IhLf%Yn*akz4O*IWz%^F?adTw(%BpZFXn9ylg_uF0R>0>ypa6=J%Is1TbmnR>w~*30XWFTdfx~nzYOdh)&^=wk z$2Ocb9R8iL_8rhYF{Z~f%>))x^5+~|qnLcaB8;Fv_1+@VW(mtGU+oW_7sDzyYVM5} z2ppXEEH)b|<{??J9KQXiN;+B)UD~Xc;yNKUwBE13b{jrsxWr%UXXRdpX8~@n8_M0c zJNn4}=x$-~SLRAL^^G2+#k`}FRpfx(+YbfRg+L5^{ zyl1_VZlYKP)n~ovM>5W=FF+4rP0oinWd zzNlUQeXGD5wYJkmTgVtvTW>r7SBamd(M>copyl0i3_7l)wwG{#%kuf1SYYNO`YS|$ zZPc{l8Q!LcWO=Y-0l(aQFHq+~xV(f8vb==rh$n4d2*5*1KVK^)tIa3{+swKMaud}o z#Gk$|#QQHzMcJN`E`mJk1y?o0TT^cVTf@itnh-*45cl)!KwHDd+~k`e8HE!x{0WkzuE`B^5+X4>f%E6fbo zP3+TPkFbvXTw?|+%YQEVX|N9imBuE7EB!n0DMBo7H4elE@Vap)e&xU5B{(1%K>`5( zqL;x%WgedVFM9jl|DvZ188VJPWZiNZ;YvRVeirO8+K~?&GXZ?2a|}BReiP#=+;ym@ zRC280y^}hInfG!-?T(J#m z{{TN<8Xw$xEjgd|rI!hI;m3=_W;Wt%+rlDeMyiP;i)YW*AdK+FmY1rnB}qDixEkc>rM_@{2-Zd}Xgt3gZUn+Oe^$j3Ic zH6DEZ&3YsDkc%H!>Q=n@gLa;iiD_B$q%u?L76LGpuSz6LErgIM8WVsW;3t=B-wYF{%ADT=Z%6{5K5R1Klgi~L2{@yKj886iMBjpp>73E~A-Q5n}v5ys)_RJyi+9ILV{8{ z&J{sEIp+)Lxf>&U!x9jWu<7z?xE%tH5;ma_WqEr$CkBl05O`n1E+`I-X8=%6e&OgD z=y`SX%L4$(kZ%O^2@l6}m=&(kwCEqMMd4s=Evypt$4&jiH7JLFxc2l9*Anjj;Tj(T zL}JxW^QIeE{_TYdCD;v|kT9qM&%UCk;E`g&>|fMo+HbJu7(rp)BgOezbrGexzo_w? zx*yDka}u|``U0Oo37!J|3lx}i!L%)i`NG<6z&Kmmv5 z8;*C6@B!Zr2WPTGk< zOAoQxD`h@sjK2TX4RuRgDw)12*x+-S1DJeuSF+N#%T4ht$;8YBzq2_O&(xOY^7R!X zu$kLts+^wWTA!S2e@P^XT_~)aOs}XtbzoSUS6$%suJ{(m5OdNn`%?E0p{SIc?@&yK!d0rUaM zcs0HgZkZHk8&0cCfZyw7;q*b6;sT_>`j=eKEmhn6Mn74SXAp785RK9y(>`)%83^ct zbM2cep)i@H?fd@eSGV6K{YP=Im?v z^g|KK5%3uc!NCX}m$q zP^TAt&a?YMM`66YVN}Yi!%vYW;|T(!Y-mxm=6-GQyM;ZsHX37rXs9d>!1TSFV$(Cc z&AoS5rnR?97SWP0=h=&oim#iY%yn9I??dw6_p)Q&JsRI+^~m@UuJ+z2R-#V!#|NX2 z)zA)AEYkjEG?3a{{hUSD!0abm^#}j;CsWXosG-O1o;c368m~`=Z`_yf91mbqzp632 zbijDE=cqzElA34&r|S~MCcpL=uf|qjnkZD1)9(;P`&HV@_5X5i~!_3Jdi?s z{PZjk6R6RH_)#(}r(nR>i^$PZO)o`%biWtpxOW%5T>9T^j0r=E$rOe|zF3JR# z#|FYb7vBLBkAlQFX##$_JJ1hf`0mI^f$K>yaO-%Y|+HUU*7bIsR%`KbvIJ^s?ZV^T2xPtzD zT4mXoALT!lmlK%F2mk>Ix(#It+L{IqlGw74|?X~W1p;7?d0l{>b!L;hU4Dh6xofz%v%;1X7UpeoJ zQ#M*5ZOwvt5h|ic^ECAX{q@o(FEjRzFvT{50~DVKlS&zJFh`?kJUB%&XN-EQ?mc79 zqQm7RcH$mUSk;f(AHk7o`G%(I%|Crt*$pqDrM?SH3P)oI4H{UJF^VSP1eC=bjx1*a z^0826_LA~24Y)LdLDdSkmNP*U&FH5(O&CZ}AwC*6LZHSQ4lrX163sAZp=`dK@rXGf zvS1Ff#tXz{4n-D6i%oZ~Sr0aNGG^8JvH#L#{^dMvibBfewc_wfbFt#MN~_);7=nq+ zLRd7JhZ{0(1b3_M^WluN)DCXCUUw~JY`|S%4PJ%Y0*ET*o;Jde7DF1~qCkuEz81y$ zNVO8H2Uq0^guWi)vp^ms!e9zv7OQQ<0y~#3zL;BajIxD$XDz;nhNAwQk}}l%Zn2%3 zKYn)CbN%6j>HQr0z}@dT^$}E26B9atbu~5qPCr5|uC;B$p{5wSk%;m@KfZXey)y5u zzB|S!29%?=z~qTR_W<8i9ly!mcV|;hmAB^tei%d8j6Qxg!)@apftsr!&UN0|xX$Y# zBvL?7{v7z{1_~e(bqgfi6;G(#Qm}YkepaX+->TNCcKlf?OXnPZU_5!`mT`GgB2epi z%r1(a9|DmQBQfbOVoV1yW+2KeH;|1YBp>ZU0dyFWy?mP&m9ASY+qidY%VMUt?fNnf zXp6SY8QMgK%l1pXhm1P|_@$FY zBMUNQT|TzD>4$1$0dSM634bqTYx9xr`$RCW7FCSw{ToWDnwgtDn7HtxG*&iBs{?dJ z0r*fNZ{+X%J{SZ-SMaFZyJXBoCVX;Yb&*_=BjRYPNh4xX9*05nWrVvPXR(x*OR=~f zt7`xY)9$)&t)HCH+wk~rD`xIK*474z*(aS37H4NuyE8x7t`26s_$6^HEp$DRk$Jay z4-`bzUxj?G0Km`JZ{OQUk1@PBEzc(cKlgVAI#} z+P)6@C8m`^qVuYk$YV8Z)n}!RzYX{1A&nv@v1kNGao9kOhD#leXxb923k-F{>s@|a(m;i(I*xMB61S5MpcA=*5( zgl@M2aH^JI5ZK>YvU-IW;ggu|CCx2O{uHDIX&hvEt4cmLj$l1sz!_r>a6fg@mA|TO zZ}#OQ+p=>h=Q(EEFgImtk2DxRq2W6{9=zMNa}l|g$;jl4UhRw%lJ1^D3>FHA^b^6q zPBR!cKM^}Gqhuvl*DcFLQRSS})zz1*A!f#E+seY}E{GDXJq~PO@3QnNSRsBL@mKEZ zD=R7HzG)g89_=lqQL=~xq}38N>ou>JVy9^G4aZEfPy{cSDv%%85ACBhKshgOipt88k7Q78vCY3ukNAO!8J6Z_ zn4FXj8kMfpCqbBHFDFHAT}?jNS(2`xZB=-AYE?$1cpj3up;b9*m@2>bDitnd8`R;u2fA_Fuw>pQ99s1D@E`aO7NN}HH%qk zP2%bvuWGL~Qsu-2Jo$-6b8ee2JRWc`FRG`r!>pLkI++{Csi`cL!sP8cmfu0|_Nv_q zFB)E;!rfXJ-iA$Sm2*W^fWA!eIn}gkuC8CiKXYtrnAA1+9A5^1XMR6-giAZ7&b1cS zAvHj`=Rc{0(~DhSvQQmERqP3*%gx#oX3A4oh8NbPrq(C}PE=!6uLkdO?XJq}$~Km_ zk5tP{myaE>F3Q(a=G&kqUR8%ZlK57Do@k268M*6oQHQWzGizS@uPDd=&V;yrPUUe( ztFx}0=$V@ZbaC{F2^4x%cU6OGA`44f4C3e!P1igb4HTkkbTXOmOrIWtX-t%+-AGe% zi)=fWk*ertJ$SE95IAnFS{1jIWa721bkW+_Nu(cFN|)J;%-T!%idL1=7pjTU@|T)) zjVP;IXqi59tUx3IM~_f;JyR4i*0Ev!o{XBRIc0|c4CKW8QVn83N;yuC2p0g!(s}Eq zl7*H|083WmHY;Easj_1v?%eGRr(Dq3SXzIh|BETVYH zv3h(rH#nrHv1tjLZ(AJFW*^Y%qq4nbLx@TG>Yz-4v#lU*I6>6fWwyU2Fe#=uAsCY8 zz%(xaoRgt=es7p=x%vH8sA7G5A1InrUh?&m?b=yQqXQ^b=-Kz`Zd|B+LQ!Ex4@beo zRWLalK7@5x6wK;AU73D7l~~khm{M`ryvOG=PU4!~vi9~?tnRRPrOHD}XS z$WrnX!Qp#{WY$9@n2}5p1bKzRnEb`{=6fY3Y-ml;mCSNA#0OV)i0xDTR)msH3%$t` z^tdJz@Q|WzvZXx*=G7-+;~>)I;Na9J;$R`tWoPHmC*oxOXR!Ut;bi}3a4_o=aj_EV zvaqx06LJ4<88%j;e-2S{9X&A^5jz)a@;p5=2s?K&C<8ly>A!c}`biTGAxucW{sh1f zCX0p=(?y0Rpg^I7GtkU{B4JUfFpqPEcl(cgY8MkQy^pdU0Wc`(8%16PjiR3u@N}pUsxmUKIRRMcJYM6?)*%#evz0BZ(_<>n*>sv~_TCw;F}52?IPD z-|7;9Y6Ml6osOEJK|-&NcVQhg_Tmcy)-Vm(~4I`?a$pHY)SxFqjhLN5KhpBSfh* zc^ni>zl4EC65R($91Q>imm9!nwgkZ3`(%V5VN#b;0fpt`LpdY6NI;g7y7^F+!s+mh zz_)AS@LdKxU-Ub`{PsiC`GYQ*0B)L4xQsVS+B}F=XpGD^^r;N=^VtQ`-63bXk$F~r zRmEIPUxyLziEUSR(c!@5GG zKy0k6-2dGnJKC^LxNGkGe}KWH5`dr&h6JIF?n$9Q$S|VGfk4Ql0{11!{$f5AQ0at9 zWu}NJr_i08aVg-e#iDlAP_`^}{^rSxEHtJoQ!tBPDwRf^au%peZv8Ed%iG7JO6iKS236K)roj01tQ}^dsODhFSx@`+eA#S73DM{L4RS zE|0LatR?YZGP_uT^NT7D1|?!JL)&dMaB{jA1Q4}A@EMxtbDazmPt$A zbNpyoT)FLs(NCI%z<#KbYD)4G-uH1H)k3mY&?jpk8K1!Ic$C0h*(RW0u=Lzfz$ied z`mJlZxRMrTZb*4y;Fz!+G=IndCctl?9YtcCzr$gR&?VUclbu4Vmz~uO;4)OkL4+V; zVhKVxAIx#mctQwMTw(0lL*mj&=H3ek$i`1ZvBojRC`%b*(AE2FtIh^Vcg8@;87XJS zRf~^-PxQZk3ZA029j1=9%${$YFmzvBr@Ao(I{Y#AhS@*qcS9Ht(2=~38^A;7!^l*m zOp#o*hHtb01Jc2WMp5QNCA6Krf=EIk?hQzD?Y&r@9-JAAMCGW#o!!-A=R>lhG+^_{#jn z@3lHr3KgoC+|SwXq(8E5;$JcES9Q{RsTY(0$55HG?{Modb6ha17ftQ=Hm`X)yt+rf z2#ba%2y=v+RQV<+^sU^r^QzRxCEKYB-yCOzB{~#wflu7gjAHFOwrK3k5xkF{xNW%w zhoGLvtK;3uDT3ZG3uc{TUMq~Dx`n;D>r(9qw&;1sB>n5U-V+{$ri?;uw*@-C=`l7y zw8Qm1ZqwWI@wcJi%P7Lkp?T&AZM8q>pR3oqtUiBuPxHRcxKDuFJYB0Yh=w-L#gdXx z7>imy%Ko!P&(NhxG((|gmzZtfCm$eGPQTOR0;S_eWvS%T{Qb#;g@~U~+FRy9B@1kl zDGp&tzFZmM4q~^Tnk$S-OMVmc*3TL641JQS;u7KDpg8~Zl8hK1AJR{3zkuL_jxQ8B zBWX&8Ri=z$RY<{bPMR$*i4)ln`4GeviL6kc8FOkgTSAK05Ee(KKf7#aX-<^oLf@_u z;MmtSirVT0!55$CFC)IK)i+_nSMfmCbGDSsc>7)$Vj>K`yJnn(G9x{xe5^ zpZWX61L>EaTZF@;&y_d-0Xl?20S9~zQCbV&JsoxquQcn;cjE06^Whcw=iO2Wt5t<{ z$E=0NcSxtFSxyXpXS+8AJoUtVLEcK4^n+!77;Yg^Lq#@&S!7;PX9DRyyfHWdp1;W& znuGm*RlXB@8V2VeA>jvM!wLqVLqA}l#8tf19BvQ>s=T2%e4@JTgpMk=Qn)Y;DN-mc zsTaiMS{(1ffuFh~nfqWKTykTokKy@KosVkyk)t=qW{8To;{JOEG_Ua&KRbJF{fdee zVf|<~jqm$Y#x>Ve|Jw!WktHNoSdV`7GDY(*N9;|O1y4!IEx2E;3+2}Ug;rc=X`cX71XRoUn_uS@n{sR|ziWYSa zKYe7$s+;Faq zTv8&bTE7RXk+ODxR!i?Oim=Hm!0#Tsv*U|Q-cb?FDcItowA%-!=Q!66zPcJON5ujm zj+(MmW0hr6xwC^_ndFCJT=6kA|2(<1Txe=voKnf&b+Q*FSYZ}WYD1PCk2NF0Gz>XS zq3y~shX)IW?>=EG>QVAmGVOL4#LGh>atuX&Jgw)@AfsEe#v?C3>ks2!-ZqSBpFPp? z&Mpe7AJRJOQMabATv8yj$;-o&_G6t|OQKv_(X5+^pK9&7xMXML-mzmh=cTn-h~a|| zp=FNPxtyK5_GcPUnh35>B@wlWGh-HCZX~p*Fq@KIS9hP5jdnKKxlN zvbpQ<297;o^~nw{OJc2yH-04feOinUnRi`*Bz3lYCb>SSv4^8&-mwrP7S5e32s29K zw?}^pr?bzmqCMZekKpj((&CME1ILSIf!A%uamiD6P8MVPNcj!OJ)(75eK$NaJkL&Dv?F6fd3y(k!pJ6e{zL*o!uLf>JcaN_R*$kr24(_G z(VZQ|*T-3goLS8=_q0qO-EhmN6A(-(>vCcn+)0k*)m20fatdGlSa=0Z(VndCoYyx{ z;J$c(B^5iU5_=DVDsUU@lJTOePiazI#uF>7yQ=+XyJG>Z)sg%fwWlQ=Sx+@t$?{^pa1N5j*l@nY8~mZZG*$GNYsECPH$+1leu@hRn-W-hKTYZUf~(9fxQ(uKPA zL(|jkf_)#IHc)v^+5m}cEdyAfU)qdW+@5_{d8tbCI@pcC0J(%E&(+ORqEDQZan;PM z^UJr`x4oJDy6McGp`8c67Q_+38z;Auo+|%{B0ZfLxMX>xR7lNjk>rD>lu`a#;@vTz zFX(Wxyuf_E=uMsWXvOLfzq6<5@nyi+gCGhHUVLz9D0A0U^!*DrayQm^wYco{^(HS( z5xg6x6hj9Blqd9}| z=-6)Rl|65*S~at2@lE^&)4{@X?ZBHs!)Yb|+$&)@ob&^t>kd}5h(TXw4u!!-cD6)f z1*Q!x$U##u_rA<*9GzxfjaMmIpFIkohvI>vgP~MsO_AnuGk-}2{Oo{U#+B4-@@Mn7OiQ}yNY=a3&4fqDW=yE|A|>) zbHO+PGdPxqQ#mGM)FeFiMBMof|8sW8*t3je(-2XbNi2Vgw88m)UR3l(pS4!L7IVJd zwry-3{en`Fq3FTll6`%8%1;f5GdlEQpm8#J3|1&(PP5gQ=n|Es^>?00)MiQh@l(vc zazSDi)Gbj>qnKo)u$1o^0s;{f(v4{5bamu!ddNQ<*vchW`3C8r{8uMuq5-X|qn(^Z zYO*Wo>ZHd@#+F57kbXtqHF}8)0YXUOQk)YzzX zleuUaFqbAvJM|3Q6fEF#cb?H;8hL-}*rI#hQQvSwf!ld)^O`FRHcRt&DO5dFw1Qy9o4V9CM>~V2?Le@1aDs6`-!sgzk><7vB zj*Kd`DwV2K|7hd`D?Toi3VwBML)F=rP=S9->rxe*Eo|3WMkI9!i(+{dIe$i zUcoY-f?y?_(%(MW*mGE4yD(2i0>Q2RQg>ELQyWeTyb4J(s#~GrG^}03gV>UU_N@%w zJ|IulQ|{^($|ED7bhm7cS{DKD@35Gtg@^I(QrgrE!Wtl;B-_<#^V9Sw4@kJJSseF* z;)8+F6bVq2X}MaV4^cHy$uNi{iodsSV-|PiV1L!haNSyn|W;*JEE~zqtBt+J%ZZi!W^3+OCizTel_!gVJwiyvw*FA{o`%J zEyprzpr|`|dv5NvV=ZN zeTN9>X}AZrcV+aPA*6v5=!aw&@iO z^H^lJE#ECApkQ)cL3LL;bAxGVsZBw)$m|m+5DDDcDRVq2KdTVNN5vbl+qs4mOx)qN z6$CiWv5_C8TAI;CFag~4#Pj*>ftD)u--Wjw(b#JTY0|I%1o+P z9NZUlFPp*T^4ulH|2!KCyopt`%F)#*{g9fPa{j5dZR6&)c;nC~3BO>s=n&qQ-;%so zY%uKy00$Cb9W`Bxo&y7z*#BE5(NCWGU)@Ul^&5t9OFYbbm<&ZkMm|C7sbJ9$C`dYL z8S9uU`qO_zPpXOm2>)YtDBanpvaqoyeV_|>GqaoTrPb99ySA3xJ73jN9BZQ1@k{R0 zVQz*BL>2w{=I}yq8pM&udFG8^$Zl@;ENv?xpFC`2NK=cWQ1oK7FLP&0V&UZe|2pkN^Zy<1j}P5{APbuA;R>Skp&0TiWG_1} za?O0~u-PvaJ7khuNGF$Eta|WK6b!IMVW}-qfNe!(fSId-76i4j{9=oQ{{=?7DY!%B zOC%2(s~p^1Fp|DwOX=@m8aPatt@!fhN6`1j8PNNOcZ>+A(g_nQ1}DIPmRhaZ=C0l57iV{uTJ& z@vh75Uz+a-aUcN1zCe<0uH*aX0D+JPLB4Dit>ju5dMHpK%9-ZcsU{|R*)7B!3($#T zgwyL$BO@r77*c+a)fG9N5JCg8-d=_YC0%3&r!|;S92Bz9i|v5Q-;V2VTqXu-QnZ}9 zm3ziHo6T>7QKmvhXXmAR&;~$9hd!lND4_g0;5R`ah#PKJzT9Fzm4CRr;17K#KyXM0U0| z49|s%RR;`TmBA2Q^U(n@Mre>sA=<}e$L7^SF*}=xB>_*QuZhj?%um;ns118Uq-LSn zBxU1_trzs2dADVf4kDBns!#6kJOI;*n5HYs(*G?Y3auo>}OAevAaK4EZ~ zzhVL4$y)ir9m8AsBI1#4MIilH8uc-Faru~6}(}qA(EfECUjA6c2Cp7QseW>jS;$R52 z{Cgg}S9q!0tAyHXyAdV`=1_y?01^AzuV-hR>lBuIu+>(3%xA|00S7rFV4IWvFzp|&@nQ?TB(29Dk%|hjVZchq6nID#cl*`+yN3vM)E9qlrh~A)B{(jDOVH| zg%e0shU61Zr27-H-0qXY-v|kS;kGE@*RgLKbLG!h&*C?0#E;|$zmcFvEQ&#e;vnO5 z%gFboL}fuCafJYA9mxkHGyq-O0!Moib8Trkwtek9u{&56B7qzn;Dllbi62Ysy2OvE zL|xV@yhMO-=##Q}_IL{zVtag&ER{kRK5OCPfq+zW<7kr*5oH?mbfBLeYm} zLc%yxF5Cb1TH9q$du?OT^y$+=Q_f2n2_^+Cv>u4&z%M>m6ugo=G$T4A#%A#CO)K-3 z=pG6_NjkU$Qc{u-pvUv*G}Rk3w$#h`%*4O;*nhu8c#ZGcI^%)UWwDigNGmO-TX;4M zb?8p8gdwkDZ=A8M-=6%Lk&FAWvyN+8(t`e!{TJlO{qS-^yD=+w%g;?uED9F)N#ng3 ztH^~z1ogfY%uy{PhGB4QQI3Q_ne5Pda!hYox?PMk&KM&$A-q`M zRl&1x-u9QZD7gq*FukXw>7u{3U(VmL*narWT+9u@&E2z~hPeZtO`_)bZyN9XjoNvw z9uJP|=8T*HIkI*17M()=ZkZvDbvj{R`JNp+X9(WHo{uZx0T|q6VS6hvUZX@ddDQ?} zV#))*doezFfY(ADPfF``dg`tbHvg1QHE4u3l;`WN;anV7jHK#P5oaZh4 zRn@1>s-5X`j7r}1VwbK+>p~0u3UTV@4vO97i|uCiGlp!9Hffy_hntt*PHfm3d}d1F z_Hm0=&!|Arzdt({B`M}OfOPdutO{~i{FkRV7^>6Vj zmvh1q0CKlOpHdR zw<2XxoDHqFk!)p#{qbl^W<`5r>JnRcycn zwh-_)KVj4z4InyfQq`~R2g_&GJ9w7@K*#lK{?^U(agh-G{9 zSD6gmYO~hrKvT1U z%0}p0!oJ?1BjGP5Ix>|71ZU>a&-zeSzQ;YG4 zj%LPQaci=!o)CWd$4LBhEfnjw&Svk}XG;gHss%OVDdhduwf`tJ(G%2q0>amJc&b^} z%DNw1Bub6i12x7r__G@tx35pX^pfX{5bhMj$yKeNbSB|7YGw-Rs+l^H58nT0B?lOo z=5BD@@}(z&bIBjk)sB`z#G?mzG`){cThld~`-I@6!`&TaANS zQk7LURz~(%3$7Jfa6WMBkEkb-_Z}>I6sW=*UdVIYWd+CTlyi1_>RkdOJw-R2Dq5Dl zEj&!|lc?6u4@aDT?@C$aHM42j>QlQ`>?$~UB_cdCgJWgK?hov-z>##e!&Zm#;?$y; z>*pI}DS1{ulobf!tbO7i!n-`B*IrR-(w(3d!K15ZZq4!&T-C>NMc?Q7RJLX(#o*A; zli%L`UAW9_N}ZFZ(XqCwReFD}PVkwzwQ)hb^A=X2H@()58^jL;pYRq{J~;cE+^Oe| z20A*AJ)azXmE*Z2v&s8I(gA+yHLE<%U9Q;W_l%4G_GjajeAn6Euc~J{oXJ(RIV52( zqbP8m-rU$k!9c;x95{b(Yyh0CH#VDWl60!x1Z`#>(ZiYT+M;M9#i?j2pdwbg!bINT zjDxOdbI;}n@3m_@wMrRZ80>p&&9A?{%S-$8UVh_Kvvl51$>Tly_^ijH@K;mQ>JCJ! zzIA)2+n$yb7bp7FC|XMEZm*87<#)T4;hRml>#H)4YrmZVoJx-}^7{Vg<)rJ@&#rFI z{I#%g%hRS*$^4bcasO`lZEO_^nQEC{h#|IO6^f&vV7i?8<%WMC;2R{ zPFgA8lwzZMdea$+m*3*=^egTz`?TBeUB$$YAsq&1WTq}SF|nTQX&+NSNkIw2(S3^z z7!}3j98XBjb2uR>>)@W`zL8(c@q+51K%r)#3&tF~gp&?Rw%lg^q4PjTU>#%h(uaHB zxzAT>EHYy^yt7bR@Ropb;+$pyZ>B#w@8j;O-_djawe{ocCYxni`Nt+~%j>?Qa$Qo( zx8HU4vCPo5=k*ItZCW!qGvyhxfr0Vlpi~uRLlc9^m8q&aW)_yf=l}tQJOwT=!_d;w z$P`V?$k@`tX!5DlPT;C#OEftHV2q-xH!wFb!!Xyt*vt@3uc3h{a5V>-{RWm6=ICOE zrV#V$ksWGkiQyPSGeb*s#~7NK7+RnkXl`JF?h!*vLqiOUEsc$kJrV(OE6@rPbOVhH q3@p%nVq|0qT(pAfJ0oL5a{~-9Q}f9y(_Oet42{jXR8?L5-M9en@~~b2 diff --git a/src/resume/Resume.astro b/src/resume/Resume.astro index b0753b3..9393dfe 100644 --- a/src/resume/Resume.astro +++ b/src/resume/Resume.astro @@ -3,7 +3,7 @@ import '@fontsource/archivo/latin-400.css'; import '@fontsource/archivo/latin-600.css'; import '@fontsource/chivo-mono/latin-400.css'; import '@fontsource/chivo-mono/latin-600.css'; -import type { ResumeContent } from './content'; +import { sortToolItems, type ResumeContent } from './content'; interface Props { content: ResumeContent; @@ -88,14 +88,20 @@ const { content, theme } = Astro.props; content.employment.map((job) => (
-
-

{job.company}

-

{job.title}

-
-

- {job.start} - {job.end} -

+

{job.company}

+
+ { + job.roles.map((role) => ( +
+

{role.title}

+

+ {role.start} - {role.end} +

+
+ )) + } +