From ff801fb32abb646438327dbcbe1433348002f51c Mon Sep 17 00:00:00 2001
From: Konstantinos Leimonis
Date: Sun, 6 Jun 2021 19:49:11 +0100
Subject: [PATCH 01/84] [WIP] Add cms notion integration example - index page
---
examples/cms-notion/.env.local.example | 2 +
examples/cms-notion/.gitignore | 34 ++++
examples/cms-notion/README.md | 172 ++++++++++++++++++
examples/cms-notion/components/alert.js | 42 +++++
examples/cms-notion/components/avatar.js | 12 ++
examples/cms-notion/components/container.js | 3 +
examples/cms-notion/components/cover-image.js | 25 +++
examples/cms-notion/components/date.js | 7 +
examples/cms-notion/components/footer.js | 30 +++
examples/cms-notion/components/header.js | 12 ++
examples/cms-notion/components/hero-post.js | 44 +++++
examples/cms-notion/components/intro.js | 28 +++
examples/cms-notion/components/layout.js | 16 ++
.../components/markdown-styles.module.css | 18 ++
examples/cms-notion/components/meta.js | 42 +++++
.../cms-notion/components/more-stories.js | 24 +++
examples/cms-notion/components/post-body.js | 13 ++
examples/cms-notion/components/post-header.js | 27 +++
.../cms-notion/components/post-preview.js | 39 ++++
examples/cms-notion/components/post-title.js | 7 +
.../components/section-separator.js | 3 +
examples/cms-notion/lib/api.js | 157 ++++++++++++++++
examples/cms-notion/lib/constants.js | 5 +
examples/cms-notion/package.json | 23 +++
examples/cms-notion/pages/_app.js | 7 +
examples/cms-notion/pages/_document.js | 15 ++
examples/cms-notion/pages/api/exit-preview.js | 8 +
examples/cms-notion/pages/api/posts.js | 57 ++++++
examples/cms-notion/pages/api/preview.js | 41 +++++
examples/cms-notion/pages/index.js | 44 +++++
examples/cms-notion/pages/posts/[slug].js | 73 ++++++++
examples/cms-notion/postcss.config.js | 19 ++
.../0f5a110c-7e12-4bc3-8f5e-b207c29eeedb.jpeg | Bin 0 -> 190878 bytes
.../538d7d3a-6efb-48cd-84fd-6da8700a12a8.jpeg | Bin 0 -> 59229 bytes
.../b73b3510-6d65-44ae-8986-3d5c47294780.jpeg | Bin 0 -> 118218 bytes
.../public/favicon/android-chrome-192x192.png | Bin 0 -> 4795 bytes
.../public/favicon/android-chrome-512x512.png | Bin 0 -> 14640 bytes
.../public/favicon/apple-touch-icon.png | Bin 0 -> 1327 bytes
.../public/favicon/browserconfig.xml | 9 +
.../public/favicon/favicon-16x16.png | Bin 0 -> 595 bytes
.../public/favicon/favicon-32x32.png | Bin 0 -> 880 bytes
.../cms-notion/public/favicon/favicon.ico | Bin 0 -> 15086 bytes
.../public/favicon/mstile-150x150.png | Bin 0 -> 3567 bytes
.../public/favicon/safari-pinned-tab.svg | 33 ++++
.../public/favicon/site.webmanifest | 19 ++
examples/cms-notion/styles/index.css | 5 +
examples/cms-notion/tailwind.config.js | 32 ++++
examples/cms-notion/types/author.json | 18 ++
examples/cms-notion/types/post.json | 52 ++++++
49 files changed, 1217 insertions(+)
create mode 100644 examples/cms-notion/.env.local.example
create mode 100644 examples/cms-notion/.gitignore
create mode 100644 examples/cms-notion/README.md
create mode 100644 examples/cms-notion/components/alert.js
create mode 100644 examples/cms-notion/components/avatar.js
create mode 100644 examples/cms-notion/components/container.js
create mode 100644 examples/cms-notion/components/cover-image.js
create mode 100644 examples/cms-notion/components/date.js
create mode 100644 examples/cms-notion/components/footer.js
create mode 100644 examples/cms-notion/components/header.js
create mode 100644 examples/cms-notion/components/hero-post.js
create mode 100644 examples/cms-notion/components/intro.js
create mode 100644 examples/cms-notion/components/layout.js
create mode 100644 examples/cms-notion/components/markdown-styles.module.css
create mode 100644 examples/cms-notion/components/meta.js
create mode 100644 examples/cms-notion/components/more-stories.js
create mode 100644 examples/cms-notion/components/post-body.js
create mode 100644 examples/cms-notion/components/post-header.js
create mode 100644 examples/cms-notion/components/post-preview.js
create mode 100644 examples/cms-notion/components/post-title.js
create mode 100644 examples/cms-notion/components/section-separator.js
create mode 100644 examples/cms-notion/lib/api.js
create mode 100644 examples/cms-notion/lib/constants.js
create mode 100644 examples/cms-notion/package.json
create mode 100644 examples/cms-notion/pages/_app.js
create mode 100644 examples/cms-notion/pages/_document.js
create mode 100644 examples/cms-notion/pages/api/exit-preview.js
create mode 100644 examples/cms-notion/pages/api/posts.js
create mode 100644 examples/cms-notion/pages/api/preview.js
create mode 100644 examples/cms-notion/pages/index.js
create mode 100644 examples/cms-notion/pages/posts/[slug].js
create mode 100644 examples/cms-notion/postcss.config.js
create mode 100644 examples/cms-notion/public/cover-images/0f5a110c-7e12-4bc3-8f5e-b207c29eeedb.jpeg
create mode 100644 examples/cms-notion/public/cover-images/538d7d3a-6efb-48cd-84fd-6da8700a12a8.jpeg
create mode 100644 examples/cms-notion/public/cover-images/b73b3510-6d65-44ae-8986-3d5c47294780.jpeg
create mode 100644 examples/cms-notion/public/favicon/android-chrome-192x192.png
create mode 100644 examples/cms-notion/public/favicon/android-chrome-512x512.png
create mode 100644 examples/cms-notion/public/favicon/apple-touch-icon.png
create mode 100644 examples/cms-notion/public/favicon/browserconfig.xml
create mode 100644 examples/cms-notion/public/favicon/favicon-16x16.png
create mode 100644 examples/cms-notion/public/favicon/favicon-32x32.png
create mode 100644 examples/cms-notion/public/favicon/favicon.ico
create mode 100644 examples/cms-notion/public/favicon/mstile-150x150.png
create mode 100644 examples/cms-notion/public/favicon/safari-pinned-tab.svg
create mode 100644 examples/cms-notion/public/favicon/site.webmanifest
create mode 100644 examples/cms-notion/styles/index.css
create mode 100644 examples/cms-notion/tailwind.config.js
create mode 100644 examples/cms-notion/types/author.json
create mode 100644 examples/cms-notion/types/post.json
diff --git a/examples/cms-notion/.env.local.example b/examples/cms-notion/.env.local.example
new file mode 100644
index 0000000000000..51f6650723fb5
--- /dev/null
+++ b/examples/cms-notion/.env.local.example
@@ -0,0 +1,2 @@
+NOTION_API_TOKEN=
+NOTION_DATABASE_ID=
\ No newline at end of file
diff --git a/examples/cms-notion/.gitignore b/examples/cms-notion/.gitignore
new file mode 100644
index 0000000000000..1437c53f70bc2
--- /dev/null
+++ b/examples/cms-notion/.gitignore
@@ -0,0 +1,34 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# vercel
+.vercel
diff --git a/examples/cms-notion/README.md b/examples/cms-notion/README.md
new file mode 100644
index 0000000000000..bf5755fd92860
--- /dev/null
+++ b/examples/cms-notion/README.md
@@ -0,0 +1,172 @@
+# A statically generated blog example using Next.js and Prismic
+
+This example showcases Next.js's [Static Generation](https://nextjs.org/docs/basic-features/pages) feature using [Prismic](https://prismic.io/) as the data source.
+
+## Demo
+
+### [https://next-blog-prismic.vercel.app/](https://next-blog-prismic.vercel.app/)
+
+## Deploy your own
+
+Once you have access to [the environment variables you'll need](#step-5-set-up-environment-variables), deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-prismic&project-name=cms-prismic&repository-name=cms-prismic&env=PRISMIC_API_TOKEN,PRISMIC_REPOSITORY_NAME&envDescription=Required%20to%20connect%20the%20app%20with%20Prismic&envLink=https://vercel.link/cms-prismic-env)
+
+### Related examples
+
+- [WordPress](/examples/cms-wordpress)
+- [DatoCMS](/examples/cms-datocms)
+- [Sanity](/examples/cms-sanity)
+- [TakeShape](/examples/cms-takeshape)
+- [Contentful](/examples/cms-contentful)
+- [Strapi](/examples/cms-strapi)
+- [Agility CMS](/examples/cms-agilitycms)
+- [Cosmic](/examples/cms-cosmic)
+- [ButterCMS](/examples/cms-buttercms)
+- [Storyblok](/examples/cms-storyblok)
+- [Kontent](/examples/cms-kontent)
+- [Ghost](/examples/cms-ghost)
+- [Blog Starter](/examples/blog-starter)
+
+## How to use
+
+Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:
+
+```bash
+npx create-next-app --example cms-prismic cms-prismic-app
+# or
+yarn create next-app --example cms-prismic cms-prismic-app
+```
+
+## Configuration
+
+### Step 1. Create an account and a repository on Prismic
+
+First, [create an account on Prismic](https://prismic.io/).
+
+After creating an account, create a **repository** from the [dashboard](https://prismic.io/dashboard/) and assign to it any name of your liking.
+
+### Step 2. Create an `author` type
+
+From the repository page, create a new **custom type**:
+
+- The name should be `author`.
+
+Next, add these fields (you don't have to modify the settings):
+
+- `name` - **Key Text** field
+- `picture` - **Image** field
+
+Alternatively, you can copy the JSON in [`types/author.json`](types/author.json), then click on **JSON editor** and paste it there.
+
+Save the type and continue.
+
+### Step 3. Create a `post` type
+
+From the repository page, create a new **custom type**:
+
+- The name should be `post`.
+
+Next, add these fields (you don't have to modify the settings unless specified):
+
+- `title` - **Title** field
+- `content` - **Rich Text** field
+- `excerpt` - **Key Text** field
+- `coverimage` - **Image** field
+- `date` - **Date** field
+- `author` - **Content relationship** field, you may also add `author` to the **Constraint to custom type** option to only accept documents from the `author` type.
+- `slug` - **UID** field.
+
+Alternatively, you can copy the JSON in [`types/post.json`](types/post.json), then click on **JSON editor** and paste it there.
+
+Save the type and continue.
+
+### Step 4. Populate Content
+
+Go to the **Content** page, it's in the menu at the top left, then click on **Create new** and select the **author** type:
+
+- You just need **1 author document**.
+- Use dummy data for the text.
+- For the image, you can download one from [Unsplash](https://unsplash.com/).
+
+Next, select **Post** and create a new document.
+
+- We recommend creating at least **2 Post documents**.
+- Use dummy data for the text.
+- You can write markdown for the **content** field.
+- For images, you can download them from [Unsplash](https://unsplash.com/).
+- Pick the **author** you created earlier.
+
+**Important:** For each document, you need to click **Publish** after saving. If not, the document will be in the draft state.
+
+### Step 5. Set up environment variables
+
+Follow the instructions in [this post](https://intercom.help/prismicio/en/articles/1036153-generating-an-access-token) to generate a new access token.
+
+Next, copy the `.env.local.example` file in this directory to `.env.local` (which will be ignored by Git):
+
+```bash
+cp .env.local.example .env.local
+```
+
+Then set each variable on `.env.local`:
+
+- `PRISMIC_API_TOKEN` should be the **Permanent access token** you just created
+- `PRISMIC_REPOSITORY_NAME` is the name of your repository (the one in the URL)
+- `PRISMIC_REPOSITORY_LOCALE` is the locale of your repository. Defaults to `en-us`
+
+Your `.env.local` file should look like this:
+
+```bash
+PRISMIC_API_TOKEN=...
+PRISMIC_REPOSITORY_NAME=...
+PRISMIC_REPOSITORY_LOCALE=...
+```
+
+Make sure the locale matches your settings in the Prismic dashboard.
+
+### Step 6. Run Next.js in development mode
+
+```bash
+npm install
+npm run dev
+
+# or
+
+yarn install
+yarn dev
+```
+
+Your blog should be up and running on [http://localhost:3000](http://localhost:3000)! If it doesn't work, post on [GitHub discussions](https://github.com/vercel/next.js/discussions).
+
+### Step 7. Try preview mode
+
+On your repository page, go to **Settings**, click on **Previews** and then **Create a New Preview** for development, fill the form like so:
+
+- **Site Name**: may be anything, like `development`
+- **Domain of Your Application**: `http://localhost:3000`
+- **Link Resolver**: `/api/preview`
+
+Once saved, go to one of the posts you've created and:
+
+- **Update the title**. For example, you can add `[Draft]` in front of the title.
+- Click **Save**, but **DO NOT** click **Publish**. By doing this, the post will be in draft state.
+- Right next to the **Publish** button you should see the **Preview** button, displayed with an eye icon. Click on it!
+
+You should now be able to see the updated title. To exit preview mode, you can click on **Click here to exit preview mode** at the top of the page.
+
+### Step 8. Deploy on Vercel
+
+You can deploy this app to the cloud with [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).
+
+#### Deploy Your Local Project
+
+To deploy your local project to Vercel, push it to GitHub/GitLab/Bitbucket and [import to Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example).
+
+**Important**: When you import your project on Vercel, make sure to click on **Environment Variables** and set them to match your `.env.local` file.
+
+#### Deploy from Our Template
+
+Alternatively, you can deploy using our template by clicking on the Deploy button below.
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/cms-prismic&project-name=cms-prismic&repository-name=cms-prismic&env=PRISMIC_API_TOKEN,PRISMIC_REPOSITORY_NAME&envDescription=Required%20to%20connect%20the%20app%20with%20Prismic&envLink=https://vercel.link/cms-prismic-env)
diff --git a/examples/cms-notion/components/alert.js b/examples/cms-notion/components/alert.js
new file mode 100644
index 0000000000000..2994d59fbd321
--- /dev/null
+++ b/examples/cms-notion/components/alert.js
@@ -0,0 +1,42 @@
+import Container from './container'
+import cn from 'classnames'
+import { EXAMPLE_PATH } from '../lib/constants'
+
+export default function Alert({ preview }) {
+ return (
+
+
+
+ {preview ? (
+ <>
+ This is page is a preview.{' '}
+
+ Click here
+ {' '}
+ to exit preview mode.
+ >
+ ) : (
+ <>
+ The source code for this blog is{' '}
+
+ available on GitHub
+
+ .
+ >
+ )}
+
+
+
+ )
+}
diff --git a/examples/cms-notion/components/avatar.js b/examples/cms-notion/components/avatar.js
new file mode 100644
index 0000000000000..50847843ff60d
--- /dev/null
+++ b/examples/cms-notion/components/avatar.js
@@ -0,0 +1,12 @@
+export default function Avatar({ name, picture }) {
+ return (
+
+
+
{name}
+
+ )
+}
diff --git a/examples/cms-notion/components/container.js b/examples/cms-notion/components/container.js
new file mode 100644
index 0000000000000..fc1c29dfb0747
--- /dev/null
+++ b/examples/cms-notion/components/container.js
@@ -0,0 +1,3 @@
+export default function Container({ children }) {
+ return {children}
+}
diff --git a/examples/cms-notion/components/cover-image.js b/examples/cms-notion/components/cover-image.js
new file mode 100644
index 0000000000000..9f52f4e51c199
--- /dev/null
+++ b/examples/cms-notion/components/cover-image.js
@@ -0,0 +1,25 @@
+import cn from 'classnames'
+import Link from 'next/link'
+
+export default function CoverImage({ title, url, slug }) {
+ const image = (
+
+ )
+ return (
+
+ {slug ? (
+
+
{image}
+
+ ) : (
+ image
+ )}
+
+ )
+}
diff --git a/examples/cms-notion/components/date.js b/examples/cms-notion/components/date.js
new file mode 100644
index 0000000000000..c77dbb23fad83
--- /dev/null
+++ b/examples/cms-notion/components/date.js
@@ -0,0 +1,7 @@
+import { format } from 'date-fns'
+// import { Date as PrismicDate } from 'prismic-reactjs'
+
+export default function Date({ dateString }) {
+ // const date = PrismicDate(dateString)
+ return {dateString}
+}
diff --git a/examples/cms-notion/components/footer.js b/examples/cms-notion/components/footer.js
new file mode 100644
index 0000000000000..da9eed88ec263
--- /dev/null
+++ b/examples/cms-notion/components/footer.js
@@ -0,0 +1,30 @@
+import Container from './container'
+import { EXAMPLE_PATH } from '../lib/constants'
+
+export default function Footer() {
+ return (
+
+
+
+
+ Statically Generated with Next.js.
+
+
+
+
+
+ )
+}
diff --git a/examples/cms-notion/components/header.js b/examples/cms-notion/components/header.js
new file mode 100644
index 0000000000000..562e7e3eebb6a
--- /dev/null
+++ b/examples/cms-notion/components/header.js
@@ -0,0 +1,12 @@
+import Link from 'next/link'
+
+export default function Header() {
+ return (
+
+
+ Blog
+
+ .
+
+ )
+}
diff --git a/examples/cms-notion/components/hero-post.js b/examples/cms-notion/components/hero-post.js
new file mode 100644
index 0000000000000..4a218ee32c691
--- /dev/null
+++ b/examples/cms-notion/components/hero-post.js
@@ -0,0 +1,44 @@
+import Link from 'next/link'
+// import { RichText } from 'prismic-reactjs'
+import Avatar from '../components/avatar'
+import Date from '../components/date'
+import CoverImage from '../components/cover-image'
+
+export default function HeroPost({
+ title,
+ coverImageUrl,
+ date,
+ excerpt,
+ author,
+ slug,
+}) {
+ return (
+
+
+
+
+
+
+
+
{excerpt}
+ {author &&
}
+
+
+
+ )
+}
diff --git a/examples/cms-notion/components/intro.js b/examples/cms-notion/components/intro.js
new file mode 100644
index 0000000000000..5931b3c5961bd
--- /dev/null
+++ b/examples/cms-notion/components/intro.js
@@ -0,0 +1,28 @@
+import { CMS_NAME, CMS_URL } from '../lib/constants'
+
+export default function Intro() {
+ return (
+
+ )
+}
diff --git a/examples/cms-notion/components/layout.js b/examples/cms-notion/components/layout.js
new file mode 100644
index 0000000000000..99d95353131e0
--- /dev/null
+++ b/examples/cms-notion/components/layout.js
@@ -0,0 +1,16 @@
+import Alert from '../components/alert'
+import Footer from '../components/footer'
+import Meta from '../components/meta'
+
+export default function Layout({ preview, children }) {
+ return (
+ <>
+
+
+
+ >
+ )
+}
diff --git a/examples/cms-notion/components/markdown-styles.module.css b/examples/cms-notion/components/markdown-styles.module.css
new file mode 100644
index 0000000000000..95d4f8b04172d
--- /dev/null
+++ b/examples/cms-notion/components/markdown-styles.module.css
@@ -0,0 +1,18 @@
+.markdown {
+ @apply text-lg leading-relaxed;
+}
+
+.markdown p,
+.markdown ul,
+.markdown ol,
+.markdown blockquote {
+ @apply my-6;
+}
+
+.markdown h2 {
+ @apply text-3xl mt-12 mb-4 leading-snug;
+}
+
+.markdown h3 {
+ @apply text-2xl mt-8 mb-4 leading-snug;
+}
diff --git a/examples/cms-notion/components/meta.js b/examples/cms-notion/components/meta.js
new file mode 100644
index 0000000000000..d9c48d5831e13
--- /dev/null
+++ b/examples/cms-notion/components/meta.js
@@ -0,0 +1,42 @@
+import Head from 'next/head'
+import { CMS_NAME, HOME_OG_IMAGE_URL } from '../lib/constants'
+
+export default function Meta() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/examples/cms-notion/components/more-stories.js b/examples/cms-notion/components/more-stories.js
new file mode 100644
index 0000000000000..7820641498d76
--- /dev/null
+++ b/examples/cms-notion/components/more-stories.js
@@ -0,0 +1,24 @@
+import PostPreview from '../components/post-preview'
+
+export default function MoreStories({ posts }) {
+ return (
+
+
+ More Stories
+
+
+ {posts.map(post => (
+
+ ))}
+
+
+ )
+}
\ No newline at end of file
diff --git a/examples/cms-notion/components/post-body.js b/examples/cms-notion/components/post-body.js
new file mode 100644
index 0000000000000..a748ac49f6723
--- /dev/null
+++ b/examples/cms-notion/components/post-body.js
@@ -0,0 +1,13 @@
+import markdownStyles from './markdown-styles.module.css'
+// import { RichText } from 'prismic-reactjs'
+
+export default function PostBody({ content }) {
+ return (
+
+
+ {content}
+ {/* */}
+
+
+ )
+}
diff --git a/examples/cms-notion/components/post-header.js b/examples/cms-notion/components/post-header.js
new file mode 100644
index 0000000000000..a2fd840214d0a
--- /dev/null
+++ b/examples/cms-notion/components/post-header.js
@@ -0,0 +1,27 @@
+// import { RichText } from 'prismic-reactjs'
+import Avatar from '../components/avatar'
+import Date from '../components/date'
+import CoverImage from '../components/cover-image'
+import PostTitle from '../components/post-title'
+
+export default function PostHeader({ title, coverImage, date, author }) {
+ return (
+ <>
+ {title[0].text}
+
+
+
+
+
+ >
+ )
+}
diff --git a/examples/cms-notion/components/post-preview.js b/examples/cms-notion/components/post-preview.js
new file mode 100644
index 0000000000000..66c4c293660ce
--- /dev/null
+++ b/examples/cms-notion/components/post-preview.js
@@ -0,0 +1,39 @@
+import Link from 'next/link'
+// import { RichText } from 'prismic-reactjs'
+import Avatar from '../components/avatar'
+import Date from '../components/date'
+import CoverImage from './cover-image'
+
+export default function PostPreview({
+ title,
+ coverImageUrl,
+ date,
+ excerpt,
+ author,
+ slug,
+}) {
+ return (
+
+
+
+
+
+
+
+
+
{excerpt}
+
+
+ )
+}
diff --git a/examples/cms-notion/components/post-title.js b/examples/cms-notion/components/post-title.js
new file mode 100644
index 0000000000000..edd8cba65c257
--- /dev/null
+++ b/examples/cms-notion/components/post-title.js
@@ -0,0 +1,7 @@
+export default function PostTitle({ children }) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/examples/cms-notion/components/section-separator.js b/examples/cms-notion/components/section-separator.js
new file mode 100644
index 0000000000000..4ca5c65fdc6ee
--- /dev/null
+++ b/examples/cms-notion/components/section-separator.js
@@ -0,0 +1,3 @@
+export default function SectionSeparator() {
+ return
+}
diff --git a/examples/cms-notion/lib/api.js b/examples/cms-notion/lib/api.js
new file mode 100644
index 0000000000000..3bdb25f217cb0
--- /dev/null
+++ b/examples/cms-notion/lib/api.js
@@ -0,0 +1,157 @@
+// import Prismic from 'prismic-javascript'
+
+// const REPOSITORY = process.env.PRISMIC_REPOSITORY_NAME
+// const REF_API_URL = `https://${REPOSITORY}.prismic.io/api/v2`
+// const GRAPHQL_API_URL = `https://${REPOSITORY}.prismic.io/graphql`
+// // export const API_URL = 'https://your-repo-name.cdn.prismic.io/api/v2'
+// export const API_TOKEN = process.env.PRISMIC_API_TOKEN
+// export const API_LOCALE = process.env.PRISMIC_REPOSITORY_LOCALE
+
+// export const PrismicClient = Prismic.client(REF_API_URL, {
+// accessToken: API_TOKEN,
+// })
+
+// async function fetchAPI(query, { previewData, variables } = {}) {
+// const prismicAPI = await PrismicClient.getApi()
+// const res = await fetch(
+// `${GRAPHQL_API_URL}?query=${query}&variables=${JSON.stringify(variables)}`,
+// {
+// headers: {
+// 'Prismic-Ref': previewData?.ref || prismicAPI.masterRef.ref,
+// 'Content-Type': 'application/json',
+// 'Accept-Language': API_LOCALE,
+// Authorization: `Token ${API_TOKEN}`,
+// },
+// }
+// )
+
+// if (res.status !== 200) {
+// console.log(await res.text())
+// throw new Error('Failed to fetch API')
+// }
+
+// const json = await res.json()
+// if (json.errors) {
+// console.error(json.errors)
+// throw new Error('Failed to fetch API')
+// }
+// return json.data
+// }
+
+// export async function getAllPostsWithSlug() {
+// const data = await fetchAPI(`
+// {
+// allPosts {
+// edges {
+// node {
+// _meta {
+// uid
+// }
+// }
+// }
+// }
+// }
+// `)
+// return data?.allPosts?.edges
+// }
+
+// export async function getAllPostsForHome(previewData) {
+// const data = await fetchAPI(
+// `
+// query {
+// allPosts(sortBy: date_DESC) {
+// edges {
+// node {
+// date
+// title
+// content
+// coverimage
+// excerpt
+// author {
+// ...on Author {
+// name
+// picture
+// }
+// }
+// _meta {
+// uid
+// }
+// }
+// }
+// }
+// }
+// `,
+// { previewData }
+// )
+
+// return data.allPosts.edges
+// }
+
+// export async function getPostAndMorePosts(slug, previewData) {
+// const data = await fetchAPI(
+// `
+// query PostBySlug($slug: String!, $lang: String!) {
+// post(uid: $slug, lang: $lang) {
+// title
+// content
+// date
+// coverimage
+// author {
+// ...on Author {
+// name
+// picture
+// }
+// }
+// _meta {
+// uid
+// }
+// }
+
+// morePosts: allPosts(sortBy: date_DESC, first: 3) {
+// edges {
+// node {
+// title
+// content
+// date
+// coverimage
+// excerpt
+// author {
+// ...on Author {
+// name
+// picture
+// }
+// }
+// _meta {
+// uid
+// }
+// }
+// }
+// }
+// }
+// `,
+// {
+// previewData,
+// variables: {
+// slug,
+// lang: API_LOCALE,
+// },
+// }
+// )
+
+// data.morePosts = data.morePosts.edges
+// .filter(({ node }) => node._meta.uid !== slug)
+// .slice(0, 2)
+
+// return data
+// }
+
+const dev = process.env.NODE_ENV !== 'production';
+
+export const server = dev ? 'http://localhost:3000' : 'https://your_deployment.server.com';
+
+export async function getAllPostsForHome(previewData) {
+ const response = await fetch(`${server}/api/posts`);
+ const data = await response.json();
+ console.log(data);
+ return data.posts;
+}
\ No newline at end of file
diff --git a/examples/cms-notion/lib/constants.js b/examples/cms-notion/lib/constants.js
new file mode 100644
index 0000000000000..5bacd2449d98a
--- /dev/null
+++ b/examples/cms-notion/lib/constants.js
@@ -0,0 +1,5 @@
+export const EXAMPLE_PATH = 'cms-notion'
+export const CMS_NAME = 'Notion'
+export const CMS_URL = 'https://notion.so/'
+export const HOME_OG_IMAGE_URL =
+ 'https://og-image.vercel.app/Next.js%20Blog%20Example%20with%20**Prismic**.png?theme=light&md=1&fontSize=75px&images=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ffront%2Fassets%2Fdesign%2Fnextjs-black-logo.svg&images=https%3A%2F%2Fi.imgur.com%2FGVmKYul.png&widths=undefined&widths=auto&heights=undefined&heights=100'
diff --git a/examples/cms-notion/package.json b/examples/cms-notion/package.json
new file mode 100644
index 0000000000000..9674c06938d0f
--- /dev/null
+++ b/examples/cms-notion/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "cms-prismic",
+ "version": "1.0.0",
+ "scripts": {
+ "dev": "next",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "@notionhq/client": "^0.1.3",
+ "classnames": "2.2.6",
+ "date-fns": "2.10.0",
+ "next": "latest",
+ "react": "^16.13.0",
+ "react-dom": "^16.13.0"
+ },
+ "devDependencies": {
+ "@fullhuman/postcss-purgecss": "^2.1.0",
+ "postcss-preset-env": "^6.7.0",
+ "tailwindcss": "^1.2.0"
+ },
+ "license": "MIT"
+}
diff --git a/examples/cms-notion/pages/_app.js b/examples/cms-notion/pages/_app.js
new file mode 100644
index 0000000000000..d56d9bf601a90
--- /dev/null
+++ b/examples/cms-notion/pages/_app.js
@@ -0,0 +1,7 @@
+import '../styles/index.css'
+
+function MyApp({ Component, pageProps }) {
+ return
+}
+
+export default MyApp
diff --git a/examples/cms-notion/pages/_document.js b/examples/cms-notion/pages/_document.js
new file mode 100644
index 0000000000000..c55951c0d5daf
--- /dev/null
+++ b/examples/cms-notion/pages/_document.js
@@ -0,0 +1,15 @@
+import Document, { Html, Head, Main, NextScript } from 'next/document'
+
+export default class MyDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+ )
+ }
+}
diff --git a/examples/cms-notion/pages/api/exit-preview.js b/examples/cms-notion/pages/api/exit-preview.js
new file mode 100644
index 0000000000000..6c63a0a6e8a42
--- /dev/null
+++ b/examples/cms-notion/pages/api/exit-preview.js
@@ -0,0 +1,8 @@
+export default async function exit(_, res) {
+ // Exit the current user from "Preview Mode". This function accepts no args.
+ res.clearPreviewData()
+
+ // Redirect the user back to the index page.
+ res.writeHead(307, { Location: '/' })
+ res.end()
+}
diff --git a/examples/cms-notion/pages/api/posts.js b/examples/cms-notion/pages/api/posts.js
new file mode 100644
index 0000000000000..376a6dbf75d32
--- /dev/null
+++ b/examples/cms-notion/pages/api/posts.js
@@ -0,0 +1,57 @@
+import { Client } from '@notionhq/client';
+
+const notion = new Client({
+ auth: process.env.NOTION_API_TOKEN,
+});
+
+function toPages(response) {
+ return response.results.map(page => ({
+ id: page.id,
+ date: page.properties['Date']['rich_text'][0].plain_text,
+ author: {
+ name: page.properties['Author']['people'][0].name,
+ picture: {
+ url: page.properties['Author']['people'][0].avatar_url,
+ }
+ },
+ title: page.properties['Name']['title'][0].plain_text
+ }));
+}
+
+function toPageBlocks(response) {
+ return response.results.map(pageBlock => ({
+ id: pageBlock.id,
+ type: pageBlock.type,
+ text: pageBlock?.[pageBlock.type]?.text?.[0]?.plain_text
+ }));
+}
+
+export default async function handler(req, res) {
+ if (req.method === 'GET') {
+ const response = await notion.databases.query({
+ database_id: process.env.NOTION_DATABASE_ID,
+ filter: {
+ property: 'Category',
+ multi_select: {
+ contains: 'home',
+ },
+ },
+ });
+
+ const pages = toPages(response);
+ const pagesBlocks = await Promise.all(
+ pages.map(page => notion.blocks.children.list({
+ block_id: page.id,
+ page_size: 50,
+ }))
+ );
+
+ const pagesWithBlocks = pages.map((page, pageIndex) => ({
+ ...page,
+ blocks: toPageBlocks(pagesBlocks[pageIndex])
+ }))
+
+ res.status(200).json({ posts: pagesWithBlocks });
+ return;
+ }
+}
\ No newline at end of file
diff --git a/examples/cms-notion/pages/api/preview.js b/examples/cms-notion/pages/api/preview.js
new file mode 100644
index 0000000000000..976cc683b4666
--- /dev/null
+++ b/examples/cms-notion/pages/api/preview.js
@@ -0,0 +1,41 @@
+// import { PrismicClient } from '../../lib/api'
+
+// function linkResolver(doc) {
+// // Pretty URLs for known types
+// if (doc.type === 'post') {
+// return `/posts/${doc.uid}`
+// }
+
+// // Fallback for other types, in case new custom types get created
+// return `/${doc.uid}`
+// }
+
+// export default async function preview(req, res) {
+// const { token: ref, documentId } = req.query
+
+// // Check the token parameter against the Prismic SDK
+// const url = await PrismicClient.getPreviewResolver(ref, documentId).resolve(
+// linkResolver,
+// '/'
+// )
+
+// if (!url) {
+// return res.status(401).json({ message: 'Invalid token' })
+// }
+
+// // Enable Preview Mode by setting the cookies
+// res.setPreviewData({
+// ref, // pass the ref to pages so that they can fetch the draft ref
+// })
+
+// // Redirect the user to the share endpoint from same origin. This is
+// // necessary due to a Chrome bug:
+// // https://bugs.chromium.org/p/chromium/issues/detail?id=696204
+// res.write(
+// `
+//
+// `
+// )
+
+// res.end()
+// }
diff --git a/examples/cms-notion/pages/index.js b/examples/cms-notion/pages/index.js
new file mode 100644
index 0000000000000..b3447068a7091
--- /dev/null
+++ b/examples/cms-notion/pages/index.js
@@ -0,0 +1,44 @@
+import Container from '../components/container'
+import MoreStories from '../components/more-stories'
+import HeroPost from '../components/hero-post'
+import Intro from '../components/intro'
+import Layout from '../components/layout'
+import { getAllPostsForHome } from '../lib/api'
+import Head from 'next/head'
+import { CMS_NAME } from '../lib/constants'
+
+export default function Index({ preview, allPosts }) {
+ console.log('Index:allPosts', allPosts);
+ const heroPost = allPosts[0];
+ const morePosts = allPosts.slice(1);
+ return (
+ <>
+
+
+ Next.js Blog Example with {CMS_NAME}
+
+
+
+ {heroPost && (
+
+ )}
+ {morePosts.length > 0 && }
+
+
+ >
+ )
+}
+
+export async function getStaticProps({ preview = false, previewData }) {
+ const allPosts = await getAllPostsForHome(previewData)
+ return {
+ props: { preview, allPosts },
+ }
+}
diff --git a/examples/cms-notion/pages/posts/[slug].js b/examples/cms-notion/pages/posts/[slug].js
new file mode 100644
index 0000000000000..8abaf573f07ce
--- /dev/null
+++ b/examples/cms-notion/pages/posts/[slug].js
@@ -0,0 +1,73 @@
+import { useRouter } from 'next/router'
+import Head from 'next/head'
+import ErrorPage from 'next/error'
+import Container from '../../components/container'
+import PostBody from '../../components/post-body'
+import MoreStories from '../../components/more-stories'
+import Header from '../../components/header'
+import PostHeader from '../../components/post-header'
+import SectionSeparator from '../../components/section-separator'
+import Layout from '../../components/layout'
+import { getAllPostsWithSlug, getPostAndMorePosts } from '../../lib/api'
+import PostTitle from '../../components/post-title'
+import { CMS_NAME } from '../../lib/constants'
+
+export default function Post({ post, morePosts, preview }) {
+ const router = useRouter()
+ if (!router.isFallback && !post?._meta?.uid) {
+ return
+ }
+
+ return (
+
+
+
+ {router.isFallback ? (
+ Loading…
+ ) : (
+ <>
+
+
+
+ {post.title[0].text} | Next.js Blog Example with {CMS_NAME}
+
+
+
+
+
+
+
+ {morePosts && morePosts.length > 0 && (
+
+ )}
+ >
+ )}
+
+
+ )
+}
+
+export async function getStaticProps({ params, preview = false, previewData }) {
+ const data = await getPostAndMorePosts(params.slug, previewData)
+
+ return {
+ props: {
+ preview,
+ post: data?.post ?? null,
+ morePosts: data?.morePosts ?? [],
+ },
+ }
+}
+
+export async function getStaticPaths() {
+ const allPosts = await getAllPostsWithSlug()
+ return {
+ paths: allPosts?.map(({ node }) => `/posts/${node._meta.uid}`) || [],
+ fallback: true,
+ }
+}
diff --git a/examples/cms-notion/postcss.config.js b/examples/cms-notion/postcss.config.js
new file mode 100644
index 0000000000000..72eae8d0fe31c
--- /dev/null
+++ b/examples/cms-notion/postcss.config.js
@@ -0,0 +1,19 @@
+module.exports = {
+ plugins: [
+ 'tailwindcss',
+ process.env.NODE_ENV === 'production'
+ ? [
+ '@fullhuman/postcss-purgecss',
+ {
+ content: [
+ './pages/**/*.{js,jsx,ts,tsx}',
+ './components/**/*.{js,jsx,ts,tsx}',
+ ],
+ defaultExtractor: (content) =>
+ content.match(/[\w-/:]+(?I7badq$<6HVhACS
zfJhgRBSl2%frKJpmu@)<=n>n^`Tg#=@B8Wf@_xJHzju<6vB%hZ%{AA2o@cJP_WCvd
z>jfa~Xy;%DfIuL?UU&k(7J(E%L{wA^CML0GkA&1-;VCC8EiEgjs-P%5RdrOTL
zgg)Y+@M~jgU|?!<+WLg`=`$qKnM+ZZ%FCxg|9>CwYXFcDhpdV5ARr9@ECYhbfPM`E
zDgXcx8Y(pP{~RDN1S%pb{%Zjc|L^4=Sl~fqz`VH9_DZ)Xox<0k!S^(v6ac7)0cbr_
z8{*tjYm>+(p%ZiKVEZbX4GPi6BeTvi9b$q>)@QBuUvsdg5TOs7!s+PcBr=dHE_3Wh
znjEf_%>#Ejbjjh3f-)uoCI5l~4}4m?0qJogw-SVC>9{FPq6ekmq-0C$Q(dW}CSIDM
zU1Pf$pkJS?McJB`)DX_zqBN$%^j_B-GD3;RYC_xa0TXMY`Jhp(9Dsx1jvw!7*G!9I
z52BE{drxvehuCVX8vs05DNITdVxOTTku$a}L5C&y6M;GzGyu2Z;~+g{N*N6e0ZMi>
z@j5P4gL>aD>ujwh4B65wl}paZZL+U2so)_HKw=VEcAg%3V_|=a77I^1hWs5Eh%-hhAb(NNO)-vsQK3
zw19KYp}1tsY3B%0qJip5w^POiaRnse84nhVeS-c(#sMAQt_sG&DRA
z4Sz*I^Q;WwxYn$@H)zvrEgp!$9qxeLHdX?W=pEt*5?ts(9qO#E-3#{{24W5&TOyJ*
zQY?z5nT}A~ru|I;$_|o279z*~GLH#pqaj^z00N;#ffu`AYi^Y2K^LgCXH~-C0RPxF
zi^um0Y7niX_n@#!!xaFa`esdfW`KdD)-|UcNH9!ixgLxjo+(?;xj>O
z(w&!1-MnU62-r3oh&4(zX+9}52oH(tM{P~f4(sPdM6VwvvdzizTTPt(R8*-t+KDVd
zgH0hdO60JT8_D@TyVpi9>h4$2rqP1|$pB|2W}G>@4{d;RD_`!Q1NAFB7XRdFRd62o
zjv7NrCL9oB>oqf~P1j)UiiT3F5$r_ye1kc&&JsD&!E=@p(se-5;4lMD1g@iP@#0*F
z73A1z-QnU8RH6~(5Z4wQNu%$_e?pX9vV@aM&K4yYGC=Fs46D+MQ)xrsX^n^Ihl+gw
zcPs+17%8>sHtwMND^Sx>oa@KCj@S7UT*;-L>nPlzc_&COADX)PlQ&w*g
zr;c4#Of-;|l7GlJ><-~n9Qxau-L{HS0!q)7xtZW0eA&b#mY;$xm^wW{XMp4ZNGBE^
z*g)l5pR)`gZ*k$u$m^4hr)vNaTLYDedAb51hc?otA<2$SAqhYzLo`9@k#nrg$L$3G
zWGJu%Djh7FtPn19|_~YH;B&``>;pGBtU9bwnNC2?{jQL7S*_h*znJV<6S0l#L
zT(_#q#ENFIM0K>+z&d+c#dMiHgeVO?UM&aRKn&y~Dgwg+N;b$KP@`W89^wHUYg2+0
z+ebSnjI-{S&(KV9F7$(FkQDpSyhKD(-k|hbST?$J20At|W6TJ=v74L$FwK4rr2I4rHmG
z$2GguTPcAmI%rB@qM;lEY5`m)W5f0yMjzhum;6NHSOjA@P$Ap7VPYN!<(-~PBoMGY
zuZF;Z+FNT2fCOK3Ap+Qx(xQW`4A~Hz3i-8DwERV*@knx%(om)wTdA(B_oNRNS86Lg;#
zX}lUvt=cT$Er8%JooUeb!A)@S4v4Knez@ozLmsT>-Sh>jZBx{Rot4aKD?7=jAZ5lhrZ~RrD>A
zft=h_ppXZ8G8jP@@=P-tGGy#~W@*4yM}?+~7r86J*y05^EYSr=E3M1|J941h
z6ixDM+>o*_Xb)PQ66m=Nj=#58KRZUm6h=U7=jm!T|Mq&<6d4vqHGH<0uarm+hNJj6
zvp*N60q`q*8eD5+zJyoCqASN|Da~LPDPr7Y`!Nztf{^qP+^-NUgduXLY(Wg=>S`I1k49Y=yL>JwZI2c_l~WzYbV
zRW1e4epyY~&+pNr_2u#K;FqR6`Ot6*(kTaUTi%MGza2^Ja>ElV699U)60`$WLp&_f
zrqux%dTRp*M70R?PzJGOFjKkoSRD!tld{8KN_I5<_|2<1($eQ=?y!%x+^Hlu2|z=2Y`
zWE?PlAseoQ@E#b!!McZ+3Xsmsa8M$O*QbXeiyY&Yz;c6Sr_3hXPQ|%ro4O(gM^0M-
zxX^m(tqx6mBkNFyHW48ctFB=G2x}okj}0$+&bDb{zWVsF=!dpPnJSxNM~)@<;&1@J
zb7Gzc(GHHFA*{^bMgaTdSkr;HIyTCHPUhS8ltrTXa5ga3#*u#fsM>t9*i(M!aa-Rx
zVPm#Uu$aV=CTl$wn`dkVXq4XQ`5`5mfVy^a`2MVhb7W*V#`2(TWom-{lT2{D#TthJ
z#C+Y3ki=OuMhG*oInnn7i89X_1i~~l5DTWVc}AZi(2EqH+qwshRop?zfH{kWqK}VCLduabwERVCD7@
zA5h`bIqXFC+3^S(xc+fCTy%2}L+QFl7_XlblZqm}T1U;eIrD*ds?A-YLa#nA*_R*A
z3`GMC?I07y!LfHq9O85oLB0T%?|kZrUe}jQa_fu~LSN<02pA5JtxS#eoKk%Oh#lK*
zp#iF|2xRedSdszs(OErdz=Un$n8H7zB3c4-8RGec&B&61-h#|3h)d;v$rT5nKOkJ7
zeDYr10LhL1WAE~<%YdQhB%VghM%R-i9+o
zOQQ>$(-{eNUXp;~O?U(#S~3G>88vqp8X$(~oQw2!yh#{JG{1p+{n(=JJt+Mmy=uzP
z-+?fB^6}Wat{MdgS4|+42$M$$c-K>Ve(2IMrRCLSxwxsy)VQrkZ)+wc#n1=_sls4o;llgeq)0-z
z{QL|~#w};;Z5>lLs!^B)HJfWg(7)|@P!}XvPBniCJJ!*#!RoTMwM7<9-+ouDChxRT
z$)r)J-Ge-+lv%9_PYN+^5OG(J_@pQ!hmQ-@o3_kS8q=Lq3g2Rn3#hRN(KTt5dfGRZSjuP~k`Ymla#Epy5-L(fv
zYNw9)<)e9hbIR;K==k}FWSnT1P@p241fot6%Yi_oDxyUGV+%_nei1;5jki4Nz_VdX
zPQq?Mf;?ck80tgfHT(HA_B5RVHIciq)b%=7;!V#?$hv${zQvn&wwmlX=8dODqprL{
zSnhaZJBn9FoOPQAM8*iBH0@Ok21k17mN+gF90*WNB{9`HjJ%AIdGQ*hcjj?@NQw#p
z{m@iO#4dvsa?xS0b{CvQr)IfENYX2>91DQ@5QN^bn@Bt;xOp+
z%Gg;54)w^xn+#MaEe4|b_b)5kRMCUh+3LmF*#=Y#9AG(;C`?`F5$3Nq%I}e>F1!J6
zaz0t=p`pAjk*l#(kWW6eAl@N2K3*g_p35pWW{n?O&c^E#6ic~zRoBlVyEamXnUwOc
z-?V@Lm4=mh0I|I?MT6`as*nY_r-!8setG&m1t(54J?a3Walmjm
z9F%C|QS!Jd5iZLa6-}AfGVi)DQsY^fU!miKv66R1)lApG$7X_qTtM@9)KCn-py$OW
za1+y$E=s=@(u8bc6+`&L&>mb{Ne|=@0aOMBj%-zxHS;V2AKk^?Qv)-3d>BJnFY%-z
z0-51eVc%7r0wl0)S-n8UvIR+0;S<
z5e%oYK#GCY7@|lZ;|)V=6b-Q%HPD|af(5-W5h!_$FofV{-g{p5e3b^Zc9V;B?Q!wVXe*)
zN)Yt+z(As*p9wWdq9K9?DO!MQk1ZbBL%=RSi+VRk772}jz}Ucb93)!~y+VUADkJ|i
z${1>$sf|aKxHKx3-f$%1V6O7WqBqlur7n6FIRSB=rO3q+`b-@MRfFtd+?xol2xQ1bF
z1;QkqDwx6aT!Uw%O$Tt0g{~yMheuma7V_0QdgKXP*eAKNdW&6iAsxg*>
z?dOm^{Vu3FY)0kbkgUScj*D{qOX)d7B#zdtX-sK&jlGuJni
zIqFd4Rn{|_M3SCz8
zhHrk@)zt!fSDt<#(?TOX((bT@?havX>!|^N-sswxfuO}K)!Fnh6ZHsKhTbj{w$
zE+55wJnh?m{vqnRzCe&YE@LBL8y?>rwNe2|B%aN~lJe5YdD3K4yk$D!bjOg&_FGF#C5uw#s=xu0JC@m=2XVi!>EtgkIs?0A+
zuDh7C@_07XAr&6d@2Z=T5l}0S)s7t5@}hMCAuOo_bmb>kqfOpSUAOKAVShu$DbId1=qloYHyA;thu
z5{BW7y=D1&cWMbW{UjPUYib~;BAkv8xp4Agvg(-=G5IK;Ytm~@2ad6`a;r1T+Z1}1
z;KLW>xvevy@iW8m#U(4x;%qrJrbyQy{zN%mrPyU7dTLy|b{3HLi>J(kmEgf4mVD0gv-DBscNEPOh6wR*vcTH>BmaIC+
z5QpYxds6|8m1q0V{Zh&wzjy$HBOXta(PezmAy{hZUK-9~L|AVe2^TFdN>$qMUo^aq
zT3JT%{alUC4;wkBdJIb_1ISwA>m7cSL1t6(9
zo)L@Vx23>JW^B)}J`g^#83kvl9nP#LgBTGntI4#Gk^%!cy-;jWhnw>tUo@0S1`|#H
z7OXTxJ)B@u>ALi#N7!@rIx1&v%PPFE6Q8D;&(QBf9f~zaJBiF10m%VR&(`d!)jUdx
zB#nS`mMglW{vrf5fuBs)h{*1Zm?f|l$f-Bnr}?6(mV;~rJ@QkT5;*2#cTvA->r_gI
zSz()`?LY>1nTdOwybxQkm)COrOr=gwzd5^CQ)}!4`MPc4VR_)q$_6Dsc`IhEga-+6
zGo>qiD038+P9Ju|5g8BgIVEluC<)lgP}o*>$f{+`mX}>7vcivQMa6m*!Gi>mbG}n-H@L88oMdh*@%KI1@BoM)-vTjF@30tYd1^{n
zzpyfU|FRaDcYXX;AV7(53q~0l@D&0938QZ5ftZI2QQ|#YP1lq^J$(!>?fHB@G!8Qv
zy06k(2LT~iUEtic3%V_H!EBFxt$vjV(Q-^N<rJuU0{g&xs@{uZ33WjqdG68#@Qu
z^+_u@8&1za3lCnLbS?oz|Ewq&N>vxEG6wrD7A(R!5|^kp1t9tqOxL}onEN_`er8+25g6zZs=m8o7OSXU0Sw>5G0C@Enk6;NKK#~M~u
zw8=b!wT<|6uMMIgx~ttRkj>po^=^Q;x#>JywB#Aw6ij_GULWXC=<~UM)ONy@4y~Ig
z7&12tf#1DE*YS9__Y-cdxpTI)Yhr0F)G@M^`|xhGY4a@gAymL6zF>M*=B*<&(wSa)
z(|7k7MmnZGiwj)?Ah_o`Gf5OtE5ov2S%rhu@D3RJU_~r|;*qvy41m+lXW1y&dQwLU
z;uw<6k|>F;^e8jY^rR;oOQi(Nj#}h9;G9BAi}M!E*c5tQtsai(saTcqEN-iNB&KxA
zRqyd|Tj5ARSj4#UTE50TG#qsAk(Dvof9s#`Q;aL_7#
zBpeM7Ey`BY+#H)1r@r=FPVct+!$*22rKl0+#p%H*xY@^g`Uc{{S~+wHjTK#O=hg}*
zPB@)l7vr45A3dpH7>i_4lQF%
z3^N2QC-t3IMm7Sr1jSzSeN?@MLQ`ITusMN{X>i0={Affk-r#}#CkZ7#T3oj(*61zR9L|Fw?g}<920~h`J
z2^OHzqb(!E#cB;Bpv?9Wk5qaX6(l}kq~o~C<4#0S0>ik660pRwkhWobm08)e>Y%`a
zF5+3hS;gTT9FnSqsPmr0=pBfo`^&$oq1c*7YJV>8zK0bpk=j}(gF&s%(T+I)GG>rR
z2GWLyR7p+6`yn4%pcS^?dlmcJt)1<;xuTZ;?d{SOyy^djb
z8G`LyAPIo|~JxJ56nF!c`)SbE#j<)Xem8HZ<=
z-UYSeQF4N~2On6g4UFYG3AHbHhNg>QREK+&GE&4|EpI^E(78*y*Rd_;bA
zWgA(YZSm)vKOQA=-#45L%dE7Z$N{R+-BtFYH!I7m!S!$exYVuTPwqCF3FIBFpjPG<
z-S&%r+b|Ip)6kyP4tiYJvyFe~7%^J#uu89>uM(Nly%7ne4dl^7grn$i+JksgLpkUOcjYO_$LQCcDBsCFQ#
zKL{oBBhBw}abWU@&tivql1k?zcl;Dyr15e%9Bez>_)0W2J9H0OjnoJXCGN|pYfmCpX-7-yxwDT?#JF=weekEO<`mB&w>
zD!OUG$rk6E_|Jn(pKFHq0ZN3G+e%a`lL8qNOj80Yl3c7l`E2D9YT~Q#*f8zMXShMnoT?3Ht|7yV#-8BVwnCYtSINOD>0{aT0f7e
z-LGS<*H86XS$~L;VV22NkeDfu#?Z%#!egeJ9eTXz3yAZvKk
zp+2wZqKJvJp8A+iG4e5Qq9j=_*aOFDhf8~w_0%_8L`_!}beYD%*bse#S-v$z)z33*
zJ`sW%G65Oc*!fBVBG{14Ly%X}!m;jX7EEJ&TX*xSwzocC}R)
zb*!hYOD~u;l+@ywTJ4znrdm&4P!w8K)(+Q-DRk6V)wG#1W$mqyb^#>oR-P<~NU0tIt
zHG9LB-E6rvMXAoOsl~1)mfFP7FjPh)CC7N$>7WB$ePNO$|Atf7sgJIZY}mfE%BE<+
z7}{IT3-*#gWEYByu@~K*R8;|qALt5Yn3E6R_@e`s-qG424(bU@O_vTPxMUs3t-A4M
z{ped{`DY?C(j@AYDMEl7V$zMe>OI38bX-woW1RZJvzGD2Wt^B=hce@f0MREKD9YJT
zP%SvW*(w3h;XO^yQt4y}pB@_lE_&oXvJK#*2m>4%T{C*y1GQJXrviYGa-;E1GMUh>
z#>&I3*U?hpQL6OPt_6>L(iGHyw@_GS+yxt
zx3S1e$DvH-t;`QI$fgcB!t3cZq6`5i*jmTc)lnDu`y2Z(gwuZKJMuGaUe@rSJcZmq
z9IU+pQUJ=Mk~iJcV`gJ5x@^Ln%6A&t5&9;FjBXR3D9~q+QOb*DhnQhOop*IH1U#`e
zevyE0cTv!+>%urw4maO;eUr_XfJvwZrp{2AVUEbIY&6|odueMOBmFAberOE~7~Z&M
z!-GUCg8emLlA(-r$(H91xo2IrOf+i3n5$NsYUPS`JH3>f>~dUiG9d|Q;tuTr_Mcs9mR9cGXUZFv1ycC9uNC|Bz4lzJBt_Ua
zTHg^9uJ)EHoh8f5VTSoRxV;kgF4HCHPkjBoZ5uB?WWBtNG~(22uuUC$k}5DE?udFT
z*nv2y;b;&_kxeht5ExpfGhhz1w+UKW5@
z{EHq)VfKj}YuJOv1s0?G8GF*WMe346!#&fd_gVI=6x}&AF1evE=&Z08jHC-PCeC{3
zg`PW1sL~wFSWp?Y)kMz-X+=LwpK$WLd7SbLhEt(ws8jlGe-lRkpUU+%Na}3iu|G@=
zuyXfSD(uuzX6*R+kph&jzcV|X1AB0m0$>|B?3|L1s#@xJ#soqC*Ojs0U
zA1c1lSU5S!9q8()w#HcWY{RN8jU&7#9$4)s7ElQpY
zy>xD)yA;uV0X2jKcT*EDv6IQI$i$E2l70_pA?YTxXA&F>vQ`11~?NK3PN*OLLPi2Dxxdt(V!(B0-h$DyU&Q=Q7IPedU
zWELU|HSu+QHWL{$#tCPY&J26dnX8tWL0*%8W^l6I&e~6{Vrlflu2MMVX{^3O8v-W|
z3#e6RyX6e>>3=@8l0xz2dHgwj=S(gVZ}TE
zZg329h{SF!9-FvcqUVR+ad{aYdQPHq=8a5(13@L&!Y$SgW6I`z+?7#@hrL;=z6ElYD
zHIhDqY2PR399AW$FO6^#<;(3iC|a4)PwR@tyXr2%JwL{7%RAu3{S#h~{{^4`lD;oB
zi43VpEkKpvEX!lU(Ww=$)|BXW@!M+9LI>?6c|ma1xqW9(Wwck7==t2-$C?kBs;W$)
z#cef>IY0Ai*v>^+PP{?dMyv6Og|clyuC0+0Ig&DmIG!(ulb~_#y}swA1|S;0
zx>ZAmNHZ_8j8xroAuVcZX6WkR;o+z%wrU07BT$ckZ!<9%#{8o4dXoN~cN
z`O#X}=)JXejAEO$*>L(f@Z0pE|7*RYx+B#5kr0XgQ_~cueoDJR3{E
zD%h*XFMc+`_oH~@O`~poNbBn!3K%qB^y?0JuXSomHvp9i^*2$=6*7!8+RrhzXRwVU
zxoNL&w7`63k9@+t9Zsx7g}pT{B^erYI+_mhsiN_ny-PRevbZV{
z;&O`n?_Z-0ic9Fed6ET4?74Bd4hz@bSMD7&jU&Wo1yCWzx;fC=gZ|Jw^YIN_u$LS=
zeq)8JQIR6sAuP^ex{3sZY~&uJcD-@h(TE3*d2DuicqWXZlGp~IhQn&op0$rw-tGYC
z*uxWZU0G;4D}#SaKQZy7I`MBLPfE(tgEGiRKehAX;^ge(*#qp8p*OKfa`CI|+>m|L
zrQkZxoLSak1)DYN!;Xo09AwyIegB#&y?lFmPIOR9YZLvvtEN4yt&ENa=#{B{<(=E|
zrs{yxqno`hSgdCA)adQ>DRuOQ;WQ2KKMkJesdxC-fhh>Kb`>gF*Fqn@XEpoOX)*3O
z)0sm0Y0|+5Zd`VlV!D~9V3;L*-BrD-`&w0g6iUjpP}WtxoL6{=ukg4;t<3KAfy}(N
zK)_ne_~D&kHPS&j_+oCjB&V*6c_V=fhp}gzy(Hx@Di7y1BJr`=iMsaXXDK4JM!efb
z89EqstB{yUtC(@Bc|n8i8wEV#GQb*kd#!VB^EjRldcd&0Nd4IXQ9#e8~-KBLVfL
zT>+Xqj4Z~O;YkZw)Sv-j8Yd|?
zr|-+jP6JLB?~5F6M)Bl*qTe|%mkqre6g<@$5F1hTnKG!uo)h^lsFL(D8$DGf6
z_bEs6UR0emFKDciy@M4x-0ju%%6whzT%0;$2APR}BA<)zgClKEBM-zKd&gc(IJZh06t%n>*uhDESA&B4S(SY8MxZ#vSrVr$Y#
zrM#oAy{v7+zm`kOqt}>dPrK_!M%R~#w_P_RFA(!N^qdR0QL1Z&p(*o$Wf-+T$g^Y@
zjRWB$_RmFRSqHU+K6t`|fbIBRk4)bNC>_SV@U$r?FT7A#>O3Z)oa@l85%m&)F>+se
zapU!r#xit^4OVrEcjRd&kyhvwEIJpm@TU
z5*8an-5%PbH9|96FBo8miA&M%i1}DtxA`JNi%!?kZEwnv9vSMhSF_1Bbt=wuulAfG
zw(t+v*sq`{97N0dhmb1p)P!hEp;mM=g>@SoE=ArUBtbL|CyNTJW7CRm
zo7`7=+QdWO#<>)2dv8nX@W(!P%*fq=(PVm<~|Z%j-wIAs%hngKrSs(wAd;ufLwYPNBm%
z+B2Ul+8wf;q)+X0d(m$Iq6go&-2~-xeddDgiAhthOkpU)iMW!2G*^pe)F(o_{mV6W
zR%MG>p-4J@)Ll`~z7N0d#L4AK53^Z^cywvO0!9uxWr7kEIM@_8oNoZu`1;-*u9~*(
zD66Oyz9W>620c=x;}C$P>ZiX%C8aGI6ln-p!7J@FX_SEGSoHFt0d;J(tMaC*GQ1&%
z(;RBEw%l1Jfu8juT9)sG!L#>wJEmi8)l1jZ>zc6Af^LU#)~gj33z=DL;>G`Ss-D9D
z+dQgXB}Jq&s3!Y;Re1ldKHu<`3<#hu1y+O7{OwSK=G3fVuZBT&ubd;AX130jc%(*A
z_8^gpZx~7MzQ7vv#i7b_hi&+|c>`La3fk?J*$DP^d07BevYbxCiID2&^ut<8pi}D3
zb0*!|hEnEd%MN@t0B~lcVK0M7FS(0ZVTKa<&aIPnYG{5*fULN{)1oJ6R=+jddKu?T
z;|dq9jgg4?y2NyWh0!e0gThSmwGr$iI7joa(RiLPI`Y(PAM0cul8{iTy`yiz4@V^J
zx$gaGd_e+(V6%_j-5{p|h!46u+7c;{&IjZG>Hg9VF!U&2O(RbX9@0K(aiAsSSyCcA
zy>rsBOg^t&!Q@8ng-D9=l=YNpwY8&t0fjw?&p>)qpOj207f#<0=CKet6ZAX&YZNnG
zn5`fu!nl+w6z@j3B{yFhxqs@<;yRu=OYv`AK=`UzG};-B*rMATcPy`7nvOkp*o?)<
zKczQFsW>En%URnjP*@eZ4fHNJmMYswX&7}4pG4z;msQ+E!Dvtcz14z?k!bn&z|BJn
zn$DlQrJ5~=fkO9t#{vtm2s5_%MjtT+&)0oVqhoCCyt1Kq|MCUvY-q&``aK$b$}Uq?
z-&c2FsBq9qbDC}s>nJ?r7TmLA7dOm7u#>2zYiT@N-EoZ=O&{ifsCtdH3hxm4{jFnE
zlBQ5jMBEL9yntgl@Bgu2Vh@r;c9~SMjXc`QBNKs=-&7*Z&%^3e9EK5{L@U3G<{w;K
z^V?7UW>#0yQcu+GsxTJPXq|G!FjL0C)yOTO-&rD$p11759M(!Dy^hMvHBg|?9j`lX
z#K$B6h4#d2n>UYl43*Fbga>y5Puk1LxEEPw0l>v9Uwa~FO*%AeyAYFNaJXCw{ZOsMV^mTYBdB@w
zH{rG>`TzHZrvL72`p*{>KCVr`}cL
z!*j2H0e6Cb0mxpwRh#6l&_v~5z?WIu$%Av})30!gH#$!>WNa@ToY`5wu#ON
zDE4PrzD_$o64JV^(0fVl?B2L9GSb)
zqBHYly~};$PW*rGzpBw&c6DI)$G(jdn}m^DzE|3J-8awFpsyN{eui$Oy#34J+sqkf09o3@?1dw2f3nc&gR_uqTJI~IRGa%bensomrqjTfl1
zbAI$6XSX$eiyi1){`RNxn?FF;u6A9ym-6pJGC!Z;zC3WJ*Zq0jZrGXS-hTrxaQCP0
zFTm&*kk}zMt#$6~?d$XnW~g`}g04X!%pN3?t2;h5A^ueN#EU{
zf7v8(&oFC#zWW6@2_Lj??q|dwA9gg(Y}klx{dlk=xA~=)mth9_A`si&-6_;rCMABk
zJZ>-ai5uhi0O*$Ay_Bm$SlW*65QR>Ol-b~1$teD2_T$KZocfR1yMKe7eB$QMUYHPR
zpL_W~Prvx%!~FaD->rU=$@|{-lk)B4wX1!Xi-oZtAjGZOO@D9N?#7Se%{wHg?c5LN
zcF*+hmiz*Gzr%lQeyRKI?~OB?_|;#)nUwFz-_E?rq-~u2(i{8px|;N=#X_s0$J?ri
z(i=s+N&4PLo_>pzxw4o7IsR9%IOj^MUHpMwAu2!2`Eh$mPM`1o`0YOr7W=C3J*@b<
zMe%OwFJSKF)!uQZ?WSh=sp=#D*rboOmgMTCeG;D=$QusCU*LOXUD3<%_%2}fI`;j1
zW_3XFljiPwVT675(fJA4{M#Rz@NmFc
z^!tx5GJcEK!p=0l+;?Q&HbFRgzkp1?JH4boRNh?`+X&eGalAM8-xg%P=YKu{`FZo*
zl_HPqEBET6v~JS5#`gyl_wD(@d436e-OwY_M&)e;IMrV!QCCBB>(W3bM8(4pvbp#f
zDLJ3Kx_G{!mn`IL(9V)D-i5gN1%P%S;=ceP{)M1h`gG#@&VSkr{Bfl>=hXe0U%*k}
zU?lzmLjRHMop)>gHlJOH?u^PiW|eCs4}LPA!G`AUXT)~sH36I@<&Rk{iwQK<;bh!n
zpgB;%J|M)(lq}thn6kh3{S5twy=c6L_`${VnU$y7XqWE`N&Koy=5DX&zDbzk?|
z4}zi6tD=EFe*s~4-njSNeAav8xiGYn`jY)|H-|N%ZmtFEsxA8UHRjE~{(F>)eQ50y
zu$vu)%rT9Fcq}gPwVpWWLmDjKYjHn$&YvUPUjeGs6I0)aJP)ME8z*GkYHIxLUVp)<
zyZy3hLN*ulo=HA3hyHeCj7mEtY}7IK`xD)or=@eqAs4hF_SD`isH8#0%vm_xWf!VYo0h8?_u|PZ-?hyaM;Bz
zUQn6o4!GjIl&G~;crirggMw>|s?yL130o
zt-JRbb7kwL%a7r2TqxyPp#SZY5YV9Idqi@Ma$v%b(P6q$Si1Rd|
zB;T)3aliAPbX7^HzZz$1H$R_i{+D-HH{ZD5?=5UeCw!~*$2``Upyr(9n
z?ZPNJ@~Z3)uV7z6Uf)r<`&+KV=M9$9%;p!gpo3&5pzP}+yiUQeGk62C|1!;`(Dbk>
z2Y+EIpjx%)NUcxi+0}zuE>0hOqqI;Vb}nuwG;jOGQcq=foypk4V2yv|*iD#}Wd18WLLU5msrSs1kbJqnfNb}TZ^D%D@8@T~KH7C>
z-Td+DmE`>}@X)(cNfHLyvn8zaJ(q=&&c);jFwv(j{apYma(CeoTx);HOD4#VWCrg3LqM?@I
zb+Sylu7*xr4@OnhwKPw}f}rhuykq?41FhF=-D=hAOSL{3HGfkdi~j<4eK}FKLckIxi6y2S8N*knfL!7O5m!oqOXN=wh$`-w}RIs*`je7-e
z73?f5kEjlK)YRXuF)kFByu5Zc_hfw>&=B!i-u-{^^yPt2uI>LbgUMR9VZ>x8nz3b+
zb;=n+WjkZvw;7aSgp;8<%32z08cX3E*~h*PLP;1~y~$WdTF@z>qqnG3=XXEO`~Ce<
z|CH@{?(4cf*JrtP>b6`*#4Ls`6x0pW%M5@h|JYfI&d}H1o4Q
zH7YfV;3X0CdpC|urBezRPGY!W!Hz|tN_D(lfuK(K)H#QtG44zkSJ@$}Ra(Bb784AJ
zclSaEVfw>jV|DJOc!M=-L2+KX-GGEo^IQ3vW_*M^URcR_!-n+iGC#xOW(R~ZY~L~Agt|qQ^e}nFHF3+hkmh7DGxrv6(F>K1Ny=H%
zuN<+a^Ieu#k_6T}-M&8v>erl$VCJt%LPO766$~`F+9{W}SHJ!G%%
z6JC}pL{AID=XdI|6u@H({pc-ZEF6D-9TieA5IC23H_CJ3bXR(nf9F^>T`n(E@80Jh
z4N_Nvc9>WF^>%r+j8DcAATg&DHtxM*yibn
zbIYot-0a`nVyJ*BL73)sA61k+87^MFf((nP76`W`C(PfhYa{iq!(sEX!qGy7O8!Rg
z(%_j>91TsJwNP&Xj?H+{HqR?D91-xY+SvnSKwZ1(46fQ4YzO{Xd{yh(<_TFbBrFw?zB208qiZlHjd*1x;69-
zSdvOYcN25}{ALO)K7)2nphCZ7P>jH(y$?Ng5C_YDF{qcp8q&a=jeFC(f%loUJksi^
zO_w5dWh5Y3#`X`LsnzHrMqNeoMATiaF1l3%M{t9w+!bA-xqC@7
zSSPj)&s8@rMc0Ry=dUF4;$qFmh1n?Q4_yh)f$Exj%@H43!2$;x+eVcIc!Ra%{%g%S
z@N)*Bj!Z#6GI$V|QuDu_fB)aC|9*Z4sD+`Jf4SgjCsK@*YV(N^u7nS0!AHUvduK%1Er(z5Za7dYo+U(8pED2ls1Og?!{-(Du@
z&>g5>;E^X$-8W_R+m}RjZq}g%WGlx1uf0)4F!kYahtSg@Suw
zyyU_J`|JMBly*8Zc3Aq_IL}pbhdE^&j#RuUYdZ84H-8XOSMQpre^^s|I=Q%|MK
zyJ4;dJKA~~yu6^jP5BEBzS|p6>kR=3p14I7)LN(Ij?V6;@o&R&+r09_@9MRm4~ziN
z_iO~*z(P||Z*I&(G8%BD=n$tz{*7VUmUb63RnmM#)i$1#FPcznmigWRC
zO}udGDP>3W(too{NFHOcm0tbZ4#FPuG-3GsyWSY>gW7y&&N;<{GsWxunZbLpe
zxfrZy1lMy|nwK9XIwWpADfs-%gNyRVv!dOy(cn<1?HmVeK_|(yU&rSX=-~1nreDnb
zr9Ahe_8*wo`;So~!{J^Y?TyFkJhXJ%)~qTo9hC0cpt3(&g?Z{Jb}lWt
z($T|K%~){ugTqP0z|v$pKKP{mmv+_q{u+*%O
zP}|4}lZIckynMUlRs(SgU>d<1wzZ8l5d4C>^^MBPbccc@ls#+IEvvru@O6Q#Zhh=g
zY!tE!Ws=7zZTiqMN`J^o!WJH|jyHY7!!lC0##Q%l`1?y{#n1ac+rwK+KsdY2X*n3Z
zyC)veY_zUmqb84&9?P3-uxwIyOfU;e`5t;R96V?C;c?a8pMVpH^kTl4*aD|x=eW7>
zR@@`%%(iK-oA3j_nN6ju{{au?yYh6e{*f1cy^pftV(qc#^~GSLYMf28*@6@z%|KIF
z07W>2n@W;yduZqw2C8Q6#*n031;v#X`>x)KVAm@ep?yY6Ac6P+5x+*s0;!;5@jiOD
zEvq7S3TjTu$fO^I)p0`s4x36
zGAuh+Bb!MRTy89RMM{L8H+87
zE2?%-4E4l@i?=VU;x8N2x=Ci3WOJ2XuyaQ=Z$K-C)MAK7w*(7O1OCF-PCm7ZBYcrCcG4&m1D~U4^Dujr03>l
zy!qYTIop!XP>d>$62gW(_8fWG*D*a#=oH=;@IItGW(
z32)caRqHhfc$8P>ZFBJ}s2kjWIWMPRqxGx5b^>1gMMR?7j`daM_Il^3uYeJqX?W!Y
zk@8>m)g_*YS!G|Xz3NwV_3Ynqf|o+4C{YwyQ+Dd&zUt3~N-@d3w02med4znvi&=8i
zB1kRX?(JHMAoB&LR@1=v7OA-S&b5Z}+)ThKoFT^R(*gZ*x_%)wVI4e)(`ax5gre`T
zB=v744pHbl<|qoiL3H$v8wE7d9jy%^s~16)E^}wJ%2aQ>xLCd1DJq^!^7{=Hl5Sq8
zE9(1r$y{fX^${hOO_xn6ORX$+ZvIu{y0y`0$drxVl^L)HCOwY;lF0n1xVYN~zVC}p
zK<7z{f7@NZeY-!qtpZNxFXb06zn$LB5j4KWK{r0AM#=|dCCSO=-tl-65l36qkl*N&!UroEMEmAhNZHW|WU!txeG
zPF+r`Iw)MnAfQqfPauk&Th%~AD%d@if9T<`UQI&O^G&5?5kZY=_B#c&_O{@02z%$X
zdCqTwWK+uA@wZ0rI+Pf7kGTO!dbT~6_{P}Sh@o1*sRUCLEHwB@!gdb}x7ojrL}dr+
z{sOSpa{xHcrHkp_=;h4v!~_%t+SNZXh7z1p(4ju3Wyd>|FyD^3nHvr_nyM122#c
z2gabC=Zh}$^N;^Dl6A9uzSVxZ`u^jepROLd6#C4f(_6s!IFHjxgE<)<#?*>Agp>8=
zw0i(tRI#BuH@lOTDuXLzAJ#d+oAkI?NjZQp)m3~giGUXYxNy*nRCTuKDAKuPB}UsIu8UN5R(tyPnIPSFBgfZeF?Xm-
zYbb>RyDKJi7Nsdhb9ZRKTrpcR4#VOAANy<@FhRs|?9HvH-dqyczXxd#Z>!tsudR_}
zU)}JGC}bbXerX-I0bcp@VLc;>EQcv?6Bu**9>6mIG1r
z2h6~hN&@Nq*|^rL8t*dBvOU7H1roppBSHR
z9(lg4QL$q!1$h3g1=Wgg8!kIKQh?-leqh%RIN<4@5AfUHfQA$|U<~*LkLtmbTAW1~
zgGwm6Fu!dCpi~USs_EK-f=w55(Gy1@!jfdw0OSm!z6%X3?ql%_?u7Bmvx6UC2>z02
z{uii}ntRRe|Jx6p-`hHk{d@4lG)0E=ZnTD5kWUhfI(KO4?!zBsfqq|7BYFPX*8UTjB@e2h#mz#vgZ9Fx_dVarPUUpP_(Ct}e
zS!RLmQo9OYIX&Un+PY1^qijv=uR<*+Q0dA6wzcH`=yd*(+X2nQ7Z-P8X7#lHa5gWWC)>9A|(!I{0v
zKF}?>3`;OH6q;kYW^&du1I0?_GNkaFc%5~rhLr7fj{4b@w5A%A!E|*dB)S%+R
z+lNfsI}%`|t4Kg4ttnAp`QmXrQg1IebLt`X6i#$byGh2Wi*QVQo~{0-S2$Dv@F{og
z<)+8L;{=D7k=nOz(~G&6{u>qAe3k7vgB%#`qK;=2x&jO&-EMBl9v7_<(eKX73F(sj
zZ2gG)Vn@L#-j)H}DGE%&xH}W)+J;8Wro>PmWyLQrlo;hl4-L!sZt#SRLSw*@%WSpGm*&b5L5BepxaINd?q-QpO16CQ8?A&0WHt+%ZO~D-vc+3k9&SA~
zeXTi5()$6xVo99eZ||o*zrTw5`s;&-KQyz%u7<{HlFpjW5
zj4dT5!F`6AzVm%>iS^BSU5a3wp(BIHgLBle4(*!K$=BpFZ_mOG=54Z_nuwf9#~p%;){QsepWU_=zoMP_i+BlWfaH9oF8eM?y|m%c66uxiw6`KMDkSH;
zBcZnC_X@b^=w!}IJNs=@LSEQK4WM6arvLH!{y(rT3!AOngQK-cYh9pw03sQX@?Va=
zpCOHX{;E7M{L5b-|GZM#XZ{b&C3q#HM$SMg%Xa5MsvchV8Ci8Df)z;x+jW);#4fKTVyF~XLz(%4=Tl4ZpEzv@(L!G
z+Lz>P%}_&Jq&$y4*mSf?ONc{o&Zs}edq3Aao^WC9G0AElCDn)bxSI#WFPKoNu0}MR
zDS5^$Yb=jPdwD0La*V;}mGurTJ!hX$D@E>7DjcIVy-$_FaI>rj89tV5tx-(Ck)9ba
z@WV-tJNl(JW73z(YVz^RM+R+$(cd^L#{-4kIH!2RJM*hA!^)fCyp#7|gMHNVqZB-D
zek$b7CW|AM!CFJeW7jia=Bj${rWi)w-y%)uToijRSVD{9p0l-#qJ)B+4}wo4pkzGb
z&E)*w>Wo;m(Yx-T2zvQfcyh^zU+*Phz{9==18=Lvub}IfvNZt6fJE-s3OKSxAlcWf
zxYbmAQ~vh7@x_NunVk6&?KkUy1|m;g5754d)ei1|rb~1sS_$$@An*lU8^qN
zsC<0dJxOy(ZA$~Rmy(9N!9T1Hzkr|9&Y@JF6
zQnD!D-~)Nj!hj2)i1+dmJ`+`|t(h~->4K$?-vrmjFSJKfU2bKu&r*cpNnyBjD)wmj
zXZ%+kA&2b2$Yv=|Ko74s?k{N~-0vIM*BB@)UD{sJP#3wSf;^&jpXlZq$c7+dp_iLu
zpKZ?tv1JOZF5$7OSthTwOUS~1N88Abmv<>z`o}*o2o0wq<1Sk#8Q`~pFtM_u@fU!^
zK%8*<2R5(jSNTf$ufM%OH!mzoQ#^=jH>HjE4E%dG6=Lfpa-}}aou~Ga6ocEIYKDe6
zKB~rg>FzCM%xlDtQ>56_MN6eCFh%L<_S*B2vD-Aqp_hJ{h5m#@MXK||7{@Sx8aM_e
z5r>svTbzX$;n{Q{hPG=V*HArgapO%amFo=kLwRt(bYxJ7s*gWx?TA$efnTz9w$8
z?iE$qBDmRV7$jYI(Pj(<2v@`Pb1)}VBZe*1JTXiLQ#5*tmFKh%J*-v?HXj)o(&N*E
z4H}%{TV`2<&0N~M5WAZ!m`(nsZQdwVRzc3|JQ>W+A}~AM^HR%wUN4D8J9?;Bft{7|
z_uy#s1tFp3XtD@E^#BU6AQA}Pc==Cdt+@`c_ZC`I0{n1U*E!e_{JsOjw9HiJ;J^fX
z)<_ALchrEmf6;{E4Ae`&OV2^7&{+OVgT<^!_7Y4ks!zg4L?ifQI!bHpktbGR#sA=<
zE3m(?PTgbv0~_`~#YyFy4NS5zjDxZxO
z2CVhhcG2pfKZtIQq;$8SZb;{(%Gl4dDb4Zd9pn8AYCTS3L3%SeB}clL?QKJDCmW+~
zso!BR4!WNVQ#*VJ@ZNXV>k%nfB!H!rv+r8;VA^S(6Byo@y>&ci+0s#=@c;{awp)J8
z+XXtry-EqSHS;;+0@cOa38&Ns1E0q`{-nz#^aNda|NPci%2HKu`Tow|T(Z^J!8CuB
zeVweHe1VM76sW4?3P!(9?KPJuO|jM(8w`cIW9-h+X9y)@0q>e(MoejQ#~j3h*(3mc
z@8YjLqIXA_U{Zf*^~4E|hgJDYJ}AD4KV86-U9A}XDvC4-3R-IG2#aJzI)x#Ld!qi(
z!{Tk9AOw`7%Dhw25-oc1B2l08zsok3oL?jzeY?{DgglR5ni_v7)4}46Ix-DxBR9c|
zsr?C8jS^EuQY6~N<8G){Ut2J%Tu0sLVjHCfYoMs-Dea02<{X|Oj^2jekzUlud^tGD
zs5rDRvs9&h8qCe9BiQ(iS<4qs`mlo{l=xb)Y3c48^d1*%8@KYh^>3M`_cGEH9q`-n
zI&U;R&I!;MtDScbX2ajx$
zCdNuRg*p0*4N$c~_2)caWh`pMuS+G&-?~JEm0>Vhm@>Sk643YM+Dp-$N2?BrL*iY*
zcmT5RpywSp)9C{Gu9oA}Oi)>N$;{a!p_cZm0ZS_~!HXplU25igXjUzhJ^$tClZ1tL
z)Z)=gm2U};3o2^afo#^2u$VDz|GgZGks$?}qq;$o09&&c{{plL7s$oSR7otOB2-It
zPit&{M*PsrB+0-s&M_D3f(6;tyQ2*7ic}tQL+xkZ=K5;Txqya@90v$?1L1zf{EuJc
zMU!-T^S|x@Lm(e${C|exbO{H5)5vc_;622N_$5hXdC0>*1N)g9uk-6(jv|%(Zn#ON
zS?Z(%zvlJdd`VpOb6dgieu-`$+~9IEkJdN;q$pb^SR=bC)FGY5FFu#Dj6`l&`1H*3
zsL7lpS1(NwUo$v8-KD-1_3Y_}W8h@NI5z?iy0X|{<{4z_VFmF)^HhE;fVJ^e2VvdP
zbT_u3?ou0(_4lf1Mp3oq-klph8!A2pf?#~W(~~;Dnv^Q_sr}HcPU*tSOc_S%v@Lm_
z0hgBr`pJ;;+XIOfGjS04a{MelA(A;ECx&ax=2O
zSU3>3tH0=dzcAjX#(m+?U?F6=9OS7sHa`hegi%AmJOQlC{nsJ8Ivxz@cy?{}C!p2K
zQxh?hmi44_Hk-1Cx1Nf%cBbd_i8})BB|?9x8IZ8$=B}30dqitm;RYK
zk$|zv{YmdYt`=kdaT`+Icdaeohvj2jSD|K`YBV{!P^HZRYndr-RSjvhS87
z!touQ31&2N>)0TmqqBsr$EA=LU*|rL_Zg8Ej60=sB=~SY~WRAdGGWj`&l%$+S$-~fz#t!wx98_b3KYq9mYz$N96s_z{tAOZW
zXZ2*j*`F_}auHq_qbji#Is_WlEXpKxYeVCCXVVZDN^=gD^8
z*E5{GPYG$0qF9eh23HCI$=ZwvTw3**O>8?UkCe({DRf){JhVnNBej3l;zj!sx#UI$
zuhC_pD!YVQxez(u#Ng@)PImX=4q|`vTy|Eo30#`9IqHNpkz{|=UF+G%te!6Z0KIT=uGdx
zOz_<+@1vHngdxUa0&rjJ)V^6VAqHJ3I9grqu}oq;Ijb*?)*ECt<7z)HAF_W^cT+J;o+
z)TGgQkF#QFd6%kst>JGI@!!-j;Fxl8s
zlR@1?Ugc~7wEanoi$V&95&!8F3qxmawD4o)if*S@aH_qNE`7hi->d1m*V!rAWbLtS
zsnZ8UqYA-;;V*O5AQeUc1bK0x(y)BiuG>m2WatDKY`~?E;A~7l%lXUv#u+Zb%P1yg
zPTy|k0T0a_Bwhi9*S-R*x4=o_0;+Vc^`Gi*1nZIqfTULAo!3LN1cdk7l-oKXo0C9E
ztOu`{C0ofL=j)vSomAfgWe+VhhU)!HFLwH{9xiVu;n?wfQ`6H5T^fLrh89%oWiVdW
zrV~!;A58RA-(n0gJKUe!_Z?QlG*<|``v>;TIjbZt=9?5Cs)P^DTi#evOWGyyfi-;v
z*sd=gs0DV?t6o2Jq>gO2gNyDR*ccWhj2Wz7Kpt%lk7oXtb@*ZgI;wt9EB>HlBT-0`e-
zHc(t@^B=Sr;m%O(`$XvjaAR@TwSMdsKF;!_!C_P_9{-mL39jW8ROtk~N-GJO|GG=$
zP-qr_MDGepmpTVO?Z5Z@6ixw9vtR@J6Furr@ku6a&7@=JZ{Bc1bYKiE2Mws1Q`s%f
z!(^DpTn}yajQawhPM$z4A`Q45ewqUUW+sEAO=u!IMoBVU;OENlkSRxBKtbXGmo`4{
zK3q4Zx49~|90gN(w7)JvOD?8V(0`|1ui<6Rs9pka4F0J;8K^+>`X~j6MP_7rvQU&y
zvP;Ccb>uaFsS)7e;QQ)ZYWo(ZgnJwi{&rv$c~SaD2k3nH>%1(DhJ9dqZ39R3Oyk2p
zfqT#IscGqvt)FkW=FV)5gYWJ=FRsCbhB}rh@HU)jeV&VtE+t(ikc0uuKIKTm#7N3?
zNtr2n=Ayq9GnsJ=FFrtVR7so!9AIb!*(-N09B933wnL7EzJmu-CcF1fOY(1=8G$yP
z80`8}%E!SrA&)cD(uFtZy_OQqJ(pnfchz*9iY`2^HVb<^<0#^PmOBC`qHCsSvPf0H
ziPtn1`>vP;2daLvym4q7cB$!&+I_*PiTutBxCtT%Y;|NS+g9kC}+S^V}~$obWT6^Dv|0<=`Zsv00@sB%~^~vZJ_C>=4
z;w?CLlq9rGAYZ4-F755R^j(21{bR-7^ff$xUGqoZKd_0dSlz@EAQl0cyloyl10FAl
z<5`i{7`TxB)o!^;2jT}wn5U+%X7J4u%*Q5JETqd`?FOt0Y7asiq%
zWtGp8ePuES+^zgUm%T#=1uk@l{^ghXC)k4PyAVY>V?ozmLVVc-72*pF@GFVw&f^2P
zO7YW`OUwTr3Mpr~)R_wctV$JmARm!jcy}@**UIzgfQ()cP*!11192Mopf$*VqjM}@
zD*X%ntB&WrPKxU<=;#*vm)7An@z`NoP@w8t=l5$QA`OM?ON{M#WhevCj;{r7W~(9Q
z&<)Lxa`64(|N6Y{B;>pdT-F3&K{eZb{C5VxiQPkWLIx`7+8V8TBxUP6nJ2u0(Dhyn
z`-YOLu*{l#kz$4`LPo2bNT)&K|n&lf%vQ1(-#Mv;?-!k9oV;q70EcitM$^?Ml3B`
zJO|w_r!_n#b*pg1h775e;J59iJTEN-pc`mh`+<2v=&MM<=+@n?Uv=conkk|a5}gp&
ze530WSc;ORI^J7e2At?TKFafRIWf#A!AhJ~p#J_cKz(6!L|R2CmzU^xdlbeQTyu%(
ztWrMccvP{?QGQssbG#L-GX4iybAT=apar1xa!NRkj;}`^k+@&%V>Ufo9i6vxgS}8t
zVMsH#n@_qcUYCSoFH~K3IC<7z12{)e8{&{a4mvQleaYzUYQ=4x(9Ov($Y$B-om%Au
ztc}Et_QuP3MY-DBsv6nj_NGMt&e=kyqIKXz7A^9S1EW>
zc%@W&Ad(JlH(dnqkbsu=m%mJ;+A#{|h@t6SzN6)8q!Kkt|H%0mJQ_Tu6V&zyK=V1{
z`3F}!c3&CoqlvcH2dbM_5P^@5R=d4LRyY$ujZ9~rp>|4MUq(u$2O*VmvyYVi1B-(H
zVeug5GZ0rSfKtz4{?HVF7$Yby)Mr`}ApgG0;?mDj)3K|G@>VS&$Z~?Fk1^K37T&IM
z!)55;`RVHOk=7f$ZppBkO(()Jee9Ze`7+^*S_MWJtXk$?gOY|wME6bkD>Edj;Z;EE
z>suUFeY`t4o?@Nqn{C{@5VO@mc{{1{T?A3alnu+^VQhD+V}`qay<|^(A5fKg3x{B`
zk`2Xlu=@c2kApj7*3K>GWk46;hG->tA@@kn?6q5mF%omBs;O}gSw;D%gnvy@aAscx
zutHgW>1Qy2F>@gGp`ix^x|at<6-sptt@md>{8!U*0h$(Ki=oQ?*NMS^c*57!dxtc2
z#u52y^)h6$At(DX26wq+sY(k;+y}U5lyydnNj1`R>t2f&KAmg?V6uAsu5W;woqBis
zPzfNWUgk*|A79TP35o|G$gWy{z@k`vST0cc*y6y%YL?Y%{A}t`OYA7&J^$ddM7=%O
z(3{Q^#!A|!mfzQwsGS)e7Ue4yYU@dlQi}q3dBJm}Juf2I%A^-9|G?zIyow*&%I&%`
z{p+URH`DH9f#X>|z{UH?@AY3`KL$GE#~&7MuX&ni27Zbq-9f#?^n9EmnsNDe|FXpB
z>si?(`!%e%03GmP{HK)y(Ry4JU?gjTorL}aBKo@BGy-r10Sq81IyL{gcaP5v;OhN=
z3b~`QzxcA!l_)`B1IkHlr*LryCA3VOq@BFr?U0r$c2RDFx7_-c3Gbd**
z<|rhdRY1g@wy}lah6Smwy@a&4W}xaC2(J)vHrfxEnqid}mj91dDo$hrKM+Ue~3c=e<@nARlkXsDuTIlj@R`6X%pYvmSU3Gp%pkoU-OFH`gBivhV&Ya?nf?Bo70(
z$KOFxT9*~f5|}@BPOJJgf^6KE2X;xXrF`$@ud?4{ILS(ldioTv;)uuWj+ty5eK+#$
zmRS%64nr6n4m>Ys5Cpqv@SIEdzIsUtGhMm2VjA2J)j6Nn0wx2~a9u<6u5F=y?u{
zuite$He(xx1rNHeLBmS#DvULC|#mw
zn}7>@Y#Fex+9j8Z$eO6{<8a-&^fnRlEmd&_`|eUjdQ=Hf-HR`BqSAQueX-W%l_V
z;giibxUH~s?m1>3ra3ZswayCzZFbf=nwgJ5yAF~$0_3JviIChI?n?(oJ&LX)B)=!p
zdO8f10CXvIhR+V*yJ0|{M{oa^bBrfNFgRgf?cEq;E_v-_mOXQPb|Z38+w&=;t_7PLFEeaqKCG#5UoL$Me^qX%HP&GzW>!rr;GytT5HT|aQx0}Rdsi6`Q
zK&}c%Ng$%YtwvisZ~$qFg(Tpko2#y?TEvmZDeY`tV&qm-nHP}`(a(1nyztqj6kZs&
z<%V4kq(9W#N!pt}aR$qEfM@Z>;RBDY-RpqMAHa3V9Z_DCx41!o{CPubLZMddLm-BP
zpP1f)4F38hr2Prh%tvDObD|kxAMTBQh_ns|MqRsxMY?%|N#OzFDZy%B*y)z$;{c2x
z7q)B8oxA&)D1kH%1El+WT2y>}Gd+HP@y1@$lc*a23SXQ<>RwAYjJf6r2wqud!LF%9jYGppUJa)BytE$(x<=n4kTwOzX#4h&Pnh0ah*%WH?THpGwr9$%aZ$sh3a
zK=nNv7OrZumiy?Ce_-I{bM>EKzk=ux_Ee1KoMTR=UQwJGgL~{td#FR^(0Jr*5FawY
ze9zlmC3wS;$s7iFjUKnS%jFUuI-S1nS#;ZpzkTId$$w0r{Sl`5qTwHyp!WlJUEn|m
zft;Uz&6MpVM`MfK(CMBto*Uxkh3$xCMgKD8sMCNNN=1ZE*e#SsP7=ta(mUFrfL5A|
zcLe`#)P0NO03__94pe=C<-SwlX-w()3=cYM%pS0Z<7BJp6r^c6REhODh9Jy_uNBk?6D(B=ej|-OC
z1GO`=-n=58y$OGC5e_WoJJkxyHd{YNRsEW?(deu_Grv7#S?rmLs5Tva5U}~SVyf~5
zTBEP{ti3yAb)nl&C&^#qH^1^`p^tUw6;2Dlw~ExchTcJSdK*!2Yk_pjk}C|fX-fwHj;E62D+
z6$9q7Fn~*YxNDbw@{LDdj}B5~r{rggoF748{x_IxJduJRM}k11vnjP9wg~ZPP?^9&
zW^&sI038#EXlzN3vkAPUsk|E_%k#%r99Dn*d(kb2VcWeuDU|%@_2g?*$))FswbGv0
zfS7bD@HloCJeuI|uVJDW^gOFn?1%3#2B+`O0l*^(*g)bd{kZ4)?j%>K
z_Sr96?rG1kGOePN79d9LALW$rsk9Pg!gW*`QsZFyW$iTxyHf-eX&}0Q_DqW^sW0w8
z2oY})-qCCFK;GuUTAxtH{eEU6R#*3Vvd?-QPB={W^}p0bXfqX1?y+|Tj@h4>71T0I
zxT2>R2v(Y?GB=VnU+=od3qV8_q-e9nnha!?RO+oXT^FkBm{nfE;P-@W%h+$rRst#f
z(7cK$T@+CAOPTQ%239U)>POE>wR;5@7XE))u$;n3J&-w8%@vTzD9iq%TkTPnE&hToe<*>#RP?WIn~h8$-#Kn^omMIwDkgm+ZwH*=8N)xm)T#04!@
zlv04zlX2M8RA%!K(WiJgNGfR!R~s%~2Sj3ECV3HyvNHFNUe=VoKQx6e7^i13MAHY_
zms}NnbqGz~;hwMeltD5L`XllH;X`8>4Z#~)b)1U9&q?QGtw)sT4evaN?(fjb>fT0m
zMX!U{dEDh_?5x|Kf4x4*ZVf9^?^XTY2PRp%FUhTF1CjzR4p@L%AjNUTW+>15Al)1}
z;kh~Aq?Nc(0`_GdY;A}-$teNYu%zlNF!;s2^aNH2BF!)msNEamyKbv9!xa5INjiJ}
zX5__SlMHtc_t>w30RO=ubLZZ>1xro+ldakMU`-hqsy_U^+eo~e(eB~a{!vZ^YgEb!8FjTnBpXf2e&nsh^
zoGIbdeSd|W+@C0~xc-|mpcAWIuvfNmKvq%A-vAmId^=VzH8FMz{GGoR)T#Vf*=H2c
ziA@2@E8iM`Y+QZg>Yp1i8uY}?ZHk#^<*cR4^K{oHo*BptmWTy%`W*oN@S=&eoD$ua5%o)eca7)1XsGLD^*d#QdeVSs`iFD}K+|)Qb)Ql|Mh%n%
z$SH+}c?Fd!LK)r1_sy~Un%hLh9Q6vz7aILbsAWw+edGM1fH-FmQz9PsZL(UcycHKM
z`Jwa9_k6g$BbEvUDF>F&59yJ;kcDt4!LianNE;{!cN{VcBSDXyJ09qQ=c|+0kzaA4
zH{raZ)N=OO2nA|XSQ|Nf|50qD$Q6=$Ra_PL@_@H*9JUn$NJTT#yg6oJ9w%;VWmh0{
zgnq7EuIKE5aTMkT0djoVEGjMguHmu7wO9bKu?cL+=WrLR#g|6I+Ck!!68VG?Mo((St
z@!b|$;qRBKW`#WI>$?J`;!Wh6HJIcgG#Kxs6E-@Ufo|Js8$hD%i(Pk@$r@wrU$Y4l
z1pXnBZpR!3a4t-zWfCs!zc=S@9R=6!VE@|1gaxOLGAb6TawI8h<7*b%n=S&Dp%pnB-t`DKQhFy4E!d)qNM_V1Lgm$lH$hjh_(G%Z4
zHsbgqR=TL5>cAR8PHQFu?eiMl=ij-|L_oDwk`pv^Yz9H}v%1M%XM7p(9czE+>72N{
zvQ*+Rm*R9?EmXAvygSjDF&F
zrcyy&cax}hx2MY9A?niJhjD=d!m0uvK>8JO=(VWr=tzqHcfIBt@<+aCU){RbCU1FX1@ozs4&3H@%n(6lpz$wwF}LONBf#EXkzFSOlSds
zIFsobl&}gHRkkMxb<4(aFtg7(ZUqA#Duyj$h$t5JCxbjEOUUPlS5(6E2)%E2JMMNQ
z7)tqB2TerAa{djDnX$Fp^%B4^`SR7)wIe|GMEjC62opkanyomb&N$#6A7OU+*x)J$
z;kW@_l#GDRvJjLc^d5?w0A{>O!7o6}0i$a5eJGFsO7hRXuVt%IBLS~SOu&CtXOBb}
zEo;gHmnE*bVAKni{^rAeT|uSaFGX9a=?ERaFr6ejmkE)WWw+7~pN$p?8l&kCr^Mfm
z9h4hhb}{MFtWBP?Ax`2lMmj6aIw|8xs;M^NFx*9h{PZ9hYOnPb8&*;4)m!ey#^S=D
zk%Bq6f&Y>AQvm-nVLKLb34m*Z^4GB55dzxwcn-0~f8Djwql%U7<3;BbI)*jtf30hYm2z|wL
z*^ER;?b1~7cq!nl5@wvqRxdkCgX{vpqAv^_G9a5pN=z?`GqvLC2~Bo4!K@ainVFVQ
zmQZYif)}5ZSEffc2X)GB0MVpd@QUsMMd%wpJv
z*tJxIq|0>_s7Q=kW^s`q()9C;x^8p_Zr4wI7hHAm@kaA@V+MhopOY4Wr0jqD{KGU;Rq}+SBBUDwN6i{Vzvot
zJT>rhb;sI4h-|W9Ff{_ZuM0@cxi@|l*TxrBgAzywz(m
z>6D#XQD3L6BH<5`h@;GCN7pe4XqL5&Q)J7kpEq+wz-UaISe!=LlLMAOZ3E}iRwyZc
zznhvCfc0l_l3w!fEzblUU0Q~ch6g|zSN`-?WjnCtw4r-i4a(eH_3a58yVU@6N}@%C
zjc{RMJ4u?Ux9KUlo*Cr4wDG}O9Dw;iMSKb?5aIQKtQl_WOSs8)&pVg!eLWrPh&WNf
zq-Ne>QPzRT^=j_-AoN>6Ljb#_W^J`r@RQvWP#^OU^nxhD#{ohtv#y}XVoRiX~hrWI9379
zs{{3c&Y5=JaVdF~h?}*$_iZ4KQfr}0xl`I~*S?7hS
zz?Em3v!@zXuI9f}%%Wkt~JyG
zJ4QGZ?ysT}-i4tQm<93``Zcec__?cZh2>UG{`(Ck+5e9P>7g;pHQK8ZK~S2GJfiiu
z8dy49Nrm`eV5s~PWQDzjVjx4HCAMuKatlCjboGTwA9?uYMifS5uF
z_tdSWb|S}U^*ZKgr%1q8(dgm$#-ciAUX(l!7z^NfMgE96Op2=|)g_zSuC;+|{;C}^
zamLYS!kVAo-Z1KK_@UDo46)A_f9QZarFKTgw!ZulC=)L}HWUH2z}RH6oc%ANx(g2|jdYx)LmNbeZL9j`LTfKA=>)N6LoQ)29zd%o&`
zD{u(z(*1`I7w4K+kd~MeNgQL)J!5Fox*#hK@^-r|lJ0yh1bCG|#p~k11qT2;vfke`
zaJVQcaVGe(k97|4vn|W~)=N^3vaY#)F1?~a(3lu@!y54UStZ7bO1wxX>00KJJbp%X
zRzCM8No%FYsZ7pEF)R8|uaUcz{h6Bde1S$4chHL~hzeQ%u3e>_+OdgZVi{Y=!|L}P
zysQI-2~SV)q0qHeHuaYYsw&5n(`xAz@YH~B*knWzj5`U
zH0z+o>@b%kZ^M>upad$0i!p
zyAu$)cC2E^ZGL`#Lc69f(NQ7i7c`LjM}>gbO?}-O2%dngKiByk%(iSBt@33_XtUz<
z&}zzI%iyd-n`#_GjU&rnYllK+QIfLF+O%?kkdmS3jxYws%#33t23#1xUW1HZT2a+B
zSW~TK^aLP^U4ZxK7W4L(spDPefx@l15BTYe!CE=Otj1It?4j8`UQ3n7pn$0Ldj>Pm
z`PuDRjU?r(va4cvEoYN{zX>0G*`6(i+yLqXlYG=r?}%YdQr3tr5i9vTez-#
z-34!VvyVjmaMC+F^99?<`T1Q#UbizcnJmq~Gd
zf}l-@=1%^O-}}!ycppVa@1?(A*>g@WBP6y7a-8-6?zxka2j8_Uf>hmBDEY1}5Pq!$
z6BO+&AnWe*B$`wYobUm8ys$w7ua0?$5ZUC@Dwyb1ux?@Dig78>68*eX&M+WUL81v=
zZ$D^h!qzyWp$CV@jXSH{p#q6gOg3{5int3i3J5_p_9XxFP&j*kL(V8%lT#@~Db-XZ=34hd_~Ou+dFb
zbbr1A2L4<>aVXh<+QHyMLSe))P&M?2kl$CJ9T#<-TKf9qK>WRy_Ig)SvVZup<%{-e@-<|S
zYi4=%ZKL(D<^>TzOSk}5EM{)cM}Lu^7l){WC54q
z^V>Q?hcRGlF9g$?#WA^kOk{2$r5#++u)C3!TP+UCDqaJgDgXzar@C}5C}4jZwt#ON
zRM)Iak&ikCasp&>p3H8h%u@pm8}tS+H--I-I{TkdDPxhSPXHKM1M6|kM&wsvq>09A
zxK$5MiJgcBaT
z@aaGC=aufpD!7P_6_#_$)E;}(2
zA`)@am@UtlUa+vkDl%q)5GM)&_v#tdr26Hh_YgA}vnV8>LQt^L6&pSuLxj5t^nzA{$B>e3T`7k%_I@2OXzRcg1G^=0xP2uEW6Ijj@sZes<20)nf9BM^HEm=
z!FKg!OfJkETv$IJ6BapP?bMwD2+QcH>Cv3Egy}KUmv&w`D^vyS)tkv?w}L@0_oM_G
z)+i-2EXvE$L5SZY=amhx49d$=zIoo0bI{w27Xueey&6H?bPD=^M7?)dljr;Y%@zR>
zWCZ~UP*#`$*$y@eLK$HXfdpi0qTqyrOhedPpd!c~G9$wQN(RHt3d2D{RRsM&D{lKc
zZ~8r+=f57Ut(N4zuj_n|*Qr`10QH_3^4VR$S%_Jff{#!Xn-7JgWD#0cmSVUnk3bat
zRS#Dsm=yI5YBtoS$+)M2l5_p{^ZVyYu)ObH?#0v}ixcv@&h+T6LA_-YOxIn9ehWB}
zTe$_HIbs1vVBf?~K>;@;M4bBVUf8cguiaID-TIy?2pXjzpVRC@(8LDj&Y9gSR?{i5
z@Mm0#M}H6rI%Ff+rRKKW_!~wjcFn8qB3K{wi%Y8ly0m6~{n*kz`Q+gT3F0PyUr5RB
z3YBOTFn_vpuv~Efab9Y)EMJ1utZ5MWpID6i6y5dF(`F32`^2qqw2pqX-;I@ixgo(J
zR{$5d`pnrEP^U+-C|%l5dC%XDN;wj6GBVm%
z)La{6n1GG>eiA3``(cW9rK1&CsWZ{iK2Y#Yv{-bgDH`!5;zhB
z&kNf@xJs*VO*vC!h77jkh&B(&_jY8*b8*I;u5mb|gLF4Ug2nn@28Uydg65ujM&Zw(
z-%|!4^Qfcvf{iv9FBkm9&G^OpVc^xc764VV(}5dvS48=q%=_Bi$%)razh}As4CUhK
z6%jzYrB+9zarjb^V#=TudC!@>-G#Og1s?4Yyxz2CIxDH#$L|a20W*w1EHkT3FN}>E
zETnOJyT(&73c-4J>;xV*q`1@!;envYV%c}DBaKCwyoCC26C=cia(h@Z3{*+BeyyAK8}OrNekcj03v6p@xT
z%maIMO`YVuI?@XpY$zJYPaftgq?Pf?6nS%gIJQGkN!&NvsJ2t*T*jgKx^*J&DvSWl
zZu0U8bp>7b>&WGus5RpibB^VNbHOxj&&u##j&)R+>4^Iyjudz5TJLyOav{6G_9aL7
zkn>-uMUma4DUly(fZGdZ%kI)D;6BMCqk40%TO@@|-L?t5B3$J<|K`WPF08ARK%UzR@RLHgyWjzLX4sx2Kl#Nn&$>Y(K!
znNAJvc@@pU4|6~6LR3B!Q*L~}PrghlgJZYwFij{;Arm4&TJoyf$%T(nmf?o7Hq<)O
zpT3r~V~>vrl0Hq3m;>ex+Gvi6lb)^*#Zz`U4M4~Z1WCG3e<(kIvYb2scmV1wQtbDE
z_(Cz0NJ)&%)q-as*E(64v=o_N3K#l(=b@>_#rYc1r?N+bWuh#U-Sb^*XwR0q=#~&c
zfiJ+slUe1U9woYLZ21~jgRTf*isDRWctJ2Mo(wmrgcg`ZkP-1>C~6uW*6wqlDsa_F
ziLuGEL-<^o-0DTX{>AhQgJ1IkAjT4~ikbH(YjQjbpny^dAOQmdSGe
ztqriW=y|WZH@EKD-LH8Ndb}S%i8XM_l{&oazH{yL<7OX^XczZG)d|1_#O}wf3PXD0M$PSXZpfER30W+<9Goxs7;(MV;+Zan^03i+
zH-tSKsBlBvxj;06qx6vdjc^l5;~V;rdedeov|iWpP=dFUlYn2tixu_Xyg%FrNP!ra
zEuHCc6Lbp?N-|Fv5)SP8qt1TBt_t`a8XPG
z7e2SVg>r@lFcwjWhGw}}s-!zrm}x|p@V-AUE1hj&I#Yh99f@FV>;ziCqup}gP(gWrE614=<$HKYbI0#Wl_6NTvkz1
zw7Tuex_1|>^V7$9W%G!DgXjzu`7l7D)D|^eIbN`Te0*2@Q@erdA$6OB0
zUtTMiid?$d2Q42V6a02U^^A`m3Y?t#azrFI@8j<}2jye@+Gw(7>Ynbh!sSlzM1QQ+
zh!Ei6s@tIyc|Yb>|Dv|shtMV@fzufD1_{>>8R0BognO~vP0}X^l)@(Y`C`<%%gO=s
zQoo9G!*T#P&5BK%2L1*VUti2mYsgY=Dmo?56ucczoZM%jYK
zvvO;lJ51kY(feAdiXO%0T&`OaasB4Om7N>s
zvdzFDzFT@x?68|1kX2vYW1i`@bF9BM^VAdKCIkgxat~F`h_dH{TjvtnIWE-nlX;z?
zD$V{`HAt{K)TN*z`!pCxYVQ?VKX}mX+^f6ITNcO0Y`kC62e7H_L$xKhPV_Zc`yM0a
z#j93jfWl2P0Oy$FR$#08m0$8e%5_uv(E(0#>t+Bv@+7DZsQ>nyGarO4y)#Uw@2(&u
zEOt~X#EXJc32)-j8d6JY(z%{
z?BM;fZ#T>Oo>j`{MXjXoX<+so@4u4tO!s(K`h?0yR?v9zuMt77c@VP}@_TVI9y({0
zHREQRP!NHm8^x|iUjDF+QTY|4fnr*4Q>235_yrF&TZkgUN=tG(Z?2ZT2$We^Cqw!r
zAoC4n8QsPpAYMG
z9>FD~|gF9D?V$ar#P?Q-Rx7VZjNbZhqp7i`|pz|N2dFxTL6S@M|6
zB>7^aGYh_DSy8@orIcMZ$EFfvnaq*FW!;vRj1$Dzs2
z#ve-;>VDB#ytIwfP3UC{#)Ajt?cW+&+0J@V+Zr>Qms=SK2?VBN0;J*!7gB&kfgl5B
zM5e0FJR){rV}2)xg$_T?D-{672;uK;Obc#--5VBeWk8%?^DE!^JLKLH4CQ!y_!gTN
zT(KU0#6|7Jgk12o01#~`2A7}ZbkSq>{zyBy#L`hIQ=xgWkwUJwAe_R$g!p{BLsLGG
zwQnINgbS^*Mn%q|G*okTwN8K;PnCN1StODo>CJ(0!!M;A@v~=AxMA8_Qd@BuPsZ1_
znXX^#K1OboI^-afJX!gF_ZOkHwUJ^Txl^DHa%ZAtjjF$*f6wpr$SX+p3SCp)!GDF`
zKh=jnm4I9Y8F`+{_^{a)!|wBT=0NhGy$%2nO;2b8TmHg*_zwB@uLt@THrUZUdhV!h
zhuTrXOlE6r{+;-3|L!*Ucig_bSKG201G~-J_qEAZrnIAdB`H)t0JJAj$4!fndKuSXhU6LZnpoe*Deas
zMq
z#w5c%Hysor$@fM3CLA>B(k#~H%LBXytw<8(S@Sa`s!P
zn9@#Fg%4=U$Bv`d+mAY)&@h6GEADJR@RiyeuVT)igof
zy>)2!hhg27t51)pZOEUAx7WTw^MY!8e*hJEP8`;#+?eH
z0YP=-nj-qnV>B`g@~RGx4Y&$_xR2=!$C_?MIdtF0%j!_!)m+XJG@=X$Y+T=Ytm=Y0
zo4|hCHd$sAhe@iFU#vHKC0s>isM}XjzRBWsRfcDGe-da`n}|TE+Nw2i4IqDz}-C9Hvf&^iQ3;
zVp#1CRazLZqfc7!wGptvAdCIgTr7hyK-|Bh$aeFRs7JtvdeDS14(EatpP1&0W#ZZt
z<%l7S778-*;feMgX(c%fCK6rQJ+y~h7v;e3(t7vLGwKQ!k^ycLtH|dxAJ>B)1F#Cs
zRkqfky3d-U(963WAy2Zd?cOe=#gr{N|E>lXMwEP+GCBzYl~%ma5S@x6epRx^grCCB
z-(3OcQz4dRqtkQfe(!-~aL%D>*abK@F@eY{`Rg499FQIzkfhyCD%SS>ey7
zr{`S9vCq~EKJgq@?Pvq2NL5JbSmH3B@nW
zJu8=?EpP~&S<9L$6gI}1eFhV6y>fufIOTmjKurwNJ|zR)pT>*emVKw28l
zR&k{s&~9yW+7Ch5FS8*0<$xt4T2(6m{brL&PrIW7rtQ8*c@Bd~v(FNuSE>+&ke5`A
ztW>N@=h;==>Zde8u7^Y&Xu-!HrgMwV)G2z&3PENV(Q0g|FZkdrWyH1^!nk%^$&%p=
z*Pfe9kJj4i*zrt%)z195XfPbp;
zrc^SVISR+B#?sax
z6*I}$_u^%_&|^wDWKLkCerT0C3CXh?pnM_)p|kq&q{kGLe5&&|?@rlQ_uD!ZUr8zR
zez^$?EmnSg`VKobNFB$!$|fPn0t67H?k_s+lHtZ1tlJ*QRqy&OMrS|u0mO1z3empihH7-HMLd8n5uW3ceCOYPZ3=N)QK+{rux
zh5%QgJ*!VPD77ayqYt?pt>LH%xL9+AFJ`sabY)>PW8K!vZJ8h>82HELh$pngH3nm=
zGPdaHR<|7#6o>;M*w(i;%XYXaJhQD4$5El~pVnA5{q#O(LTA*Q-7wnJY$K83(*IQ`
z;b+U}RO2(wjxQ#%hbMmJy-%v7=muVl3urBM80>(xM&g(|X*&st|8fc3a~)pft4iod
zYsz5^zF=G+16oP2DLNEnqC!4|8VZ^tbdA!uo6Jnx1CJj05!|t$FbqYtQHVSqY(_)A
zn8Ox=UTRaC@vDd4`Q>dpp}2n%E}b%M2_5q9T_gvKIyp_E&P=c(dJ&ti80iH=05m3O
zhFtgxxx}i1To0T9{+g@&$k3MIL_4K1*1A;aKgUg5MlB
zZJtQUeelu7+tral5WNMoCa)K-P+#|Mr-l+1_VV-D5}r-T#GI-DLYt>kh4B07nNb3{WaBSxuUQ}x^Sy~3|^TP&VfL!WqAKrU6QDCu$dW}u_+EgxTv{{a0SIOMpCp%Cl`DyCyBTsP(Q6f8RVLtYa7
zKC3A?|Cv9e342q{hT+7szf1vV}7NW<{v&)L7{Ynt&S_hb};({O`o13%a(W^t$!>Tf%8{-hM>Z|+
z_A+P%qoN*t%FE5$fg-@bZR;@$AGBP)J2A#w4P)-3VH|7%b%pxGEw>i%w(iq8BiaIn
zg$pqe-qAF=Fh8ABT28lgc}f1+lK9XUIVOL|QLfGL{nFcjeG?~F9}m8E(@tF-D>i)=P+u3`%f?HNgyJllU=!2ZU?
zc@OzBkLlQ)@=oO}K#2cW|9R;_ZRvko_ExC#5An-!H`dHB2xd}aKi$L0W(W_v2i$t}
z`NQrmgO%uBX`~`?N=s7dt`SYP5~+G4uYorgs&8Q>1tN3uUo>$R?GiPcWhAxFtp`|e
z`||j$A#cMM{4mv+ehwBdUyo{Zmpy~}wg%#9Goh}G0_=p0-q%}x!Bxo*Gr`a}Ep;Tk
z{L6Zuz1p(CY~w%1c=+l
z3|L8GHowuzl`x8JaXnV4+9XQcdTNic5Y_Tv&fPW_U^o{%b)V>gtvB#&o_puS8Ebdo
zn6JJS)-;oqDxK?(=en*dav)?Rr?5)$
z1AUgDal6=a`%dJ03Wlr7pc3jYCWzZR&p+i#!1|hm2|Wr-u?wF3y}c{dOz2Cn12kQo
z(gf0^^yNMWd@qKga;l)plI7z%y#wMJGQzIoFDUUYg5^$ei=a9_!^l8zR})*YZpu#gjITq#^+@+|2_oMls$2
zEYFS$_IGM!pxLD)QZJx8WX1@29ww8|-n$^pvIIOJS5+GAR3Ow<+GYI9EB3DnQ%#wo
z=4S~w0kc2$4(`E$%>nZss0vaz0$#ir9%kJl-<|K0#b&v&53m_E=M>Vyu;hpv(V?le4y
zuZ(*-gu{{ey)5z^-FJwDYv2sDkR(jx)8S1F*I(o08m6V_d7{FsOgzv_kwBL-gp6|zlk+5CIEDlAlP3#nUc#ZJ
ztD>i912Yjp$a-y(R|9A<7ymCEQ*o2wLX(jX{TYvO(u4sMA)rM=jigmD@7y}d5Z|1S
zpNjct2ejn<@|AX)14x1HcIkq0I-eatXEX%La-*c-%bMX5)vpY
z=z{se{QsLTV50;&jH)-70y;!^1rqvUb6T-h+-)4?BH6eNfrDXSHwXkIvm6*`IDI7KlTJ
zy2>kOz|Ez__hiVJn-i>kNcF*B{i-2$%h&u{&TumIFEA3XTV}$czq%?YO|#KiIO)ne
zV2Gj{Px};i+Q^?_?HAfErhGhwAxXeKKps+5!jysJ_!pCkC4%+H-7P8$-Zau
zQ5R_*J;=E-E#HZ?d27R!O_q)WH-f2Vm0Nb=!ij&A}v3iBOtwf
zVqufh3?SG0!X5-8ASAYG;s~*9s
z(gi#NG1i?Mj6-+TQqv6ha5Xp2ty=pFQnnwlV5Bb7Kpxxz&K%f(AcohI?VyZ7)HfI1)_15GYWX
z_?Ptr9oUuhmvR#n&z&3-7;g970qoRs_kXZajqVEX;_KaYj&2KmTJhZdz_UAyle(8kxC6GzDnQWg{W21!u2S3m!u}Lat98!}0*dNB
z`~78e{(e^3n%vLUX&@#_CBLk_7oBePr|mxIAAJXT0H7fQgo~K-<>Lw4ezjGPsR-OJ
z_#ho!+yF8O!__rrlH12=4ec>tsHi|~q2=EPSBI41HP@+S=kl4$dD6c7>3JgyvFz-z
zP)VuarHB@iCSrk5A4Zh)+Phd-2X@WH^V>gS0?fM~fqBDx5C019d*>sFBN*J;iU0%Z
zVKJ(D(veo!4`8`2j>JvG5+K=SaZ{>p6ZYlsa>s3h&n>5K!4<`WccJqNZ1LmYC0^!|
zJiw5J|()zu&7E$M2x%#t16yW)k012*EWw;&(*k^xuxjy0lcAFUa+ks&3AH!qzi
z@M^Fr>KGt?Y#S$%wLN|eB$5BAvOVuPmUQs$VJFb;{s>l#e=Omyij<^bAJdn9%fs1Q
zxO=|EcEcy1A5W1i0;dt$$7rfH;BoHIgqhD_F9Fv&Wo@2M&Jb~Oky4LXd!O!#a|y4M
zp}vsjtv*@Dh&YhkO)_G(RSW#{Yq{|eK0tzgJBTxFKS^i3}B&YFT
zq;)^1nw#-NnVfCO0b$+#)r5;*N+q1^F|!mre;@sIO1&uYc@)&nL8a@2=1d9hJ=MY0
zt}C&ar}0!6o>TcF%?i0V%2MdW1%CSE@VpkEQa(N)iMJ?srn>7Xaa(THCcu_2j8>G3
zgQeHfwJ`32>}CpflLvX$;b{A1jfe`CYXMm)ThVrQ;Wy${lj$S{Dl+s3oUv}OzW!z<+;FgDpAG*6l|p|V0p
zT