From 5883e5af2d05e20e15888f298386feeea757ec93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Boschi?= Date: Mon, 16 Feb 2026 14:43:03 +0100 Subject: [PATCH] doc: add go client examples (#380) * doc: add go client examples * doc: add go client examples --- hindsight-dev/hindsight_dev/sync_cookbook.py | 6 +- .../applications/go-memory-service.md | 102 ++++++++++++++++++ .../applications/hindsight-litellm-demo.md | 2 +- .../hindsight-tool-learning-demo.md | 2 +- .../applications/openai-fitness-coach.md | 2 +- .../applications/sanity-blog-memory.md | 2 +- .../cookbook/applications/stancetracker.md | 2 +- .../docs/cookbook/applications/taste-ai.md | 2 +- hindsight-docs/docs/cookbook/index.mdx | 6 ++ hindsight-docs/examples/api/documents.mjs | 4 +- hindsight-docs/examples/api/retain.py | 5 +- hindsight-docs/sidebars.ts | 8 ++ .../src/components/RecipeCarousel.tsx | 7 +- hindsight-docs/src/css/custom.css | 4 +- .../src/theme/DocSidebarItem/Link/index.tsx | 36 +++++++ hindsight-docs/static/img/icons/golang.png | Bin 0 -> 38066 bytes 16 files changed, 174 insertions(+), 16 deletions(-) create mode 100644 hindsight-docs/docs/cookbook/applications/go-memory-service.md create mode 100644 hindsight-docs/src/theme/DocSidebarItem/Link/index.tsx create mode 100644 hindsight-docs/static/img/icons/golang.png diff --git a/hindsight-dev/hindsight_dev/sync_cookbook.py b/hindsight-dev/hindsight_dev/sync_cookbook.py index 52f13a27..7794264c 100644 --- a/hindsight-dev/hindsight_dev/sync_cookbook.py +++ b/hindsight-dev/hindsight_dev/sync_cookbook.py @@ -489,8 +489,10 @@ def convert_tags_to_structured(tags: list[str]) -> dict[str, str]: - sdk: Package name (detected from tag values) - topic: anything else (Learning, Quick Start, etc.) - If sdk tag starts with '@vectorize-io', it's Node.js. - Otherwise assumes Python. + Supported languages: + - Node.js: packages starting with '@vectorize-io' + - Go: packages ending with '-go' or containing 'go-' + - Python: everything else """ structured = {} topic_tags = {"Learning", "Quick Start", "Recommendation", "Chat"} diff --git a/hindsight-docs/docs/cookbook/applications/go-memory-service.md b/hindsight-docs/docs/cookbook/applications/go-memory-service.md new file mode 100644 index 00000000..2cc8db82 --- /dev/null +++ b/hindsight-docs/docs/cookbook/applications/go-memory-service.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 3 +--- + +# Go Memory-Augmented API + + +:::info Complete Application +This is a complete, runnable application demonstrating Hindsight integration. +[**View source on GitHub →**](https://github.com/vectorize-io/hindsight-cookbook/tree/main/applications/go-memory-service) +::: + + +A Go HTTP microservice demonstrating per-user memory isolation with Hindsight. Remembers each user's tech stack, problems solved, and preferences to provide personalized assistance. + +## Features + +- 🔐 **Per-User Isolation**: Each user gets their own memory bank +- 🧠 **Context-Aware Responses**: Uses recall + reflect for personalized answers +- 🏃 **Fire-and-Forget Memory**: Background goroutines store interactions without blocking responses +- 🏷️ **Tag-Based Partitioning**: Organize memories by type (projects, debugging, preferences) + +## Setup + +### 1. Start Hindsight + +```bash +export OPENAI_API_KEY=your-key + +docker run --rm -it --pull always -p 8888:8888 -p 9999:9999 \ + -e HINDSIGHT_API_LLM_API_KEY=$OPENAI_API_KEY \ + -e HINDSIGHT_API_LLM_MODEL=o3-mini \ + -v $HOME/.hindsight-docker:/home/hindsight/.pg0 \ + ghcr.io/vectorize-io/hindsight:latest +``` + +### 2. Run the service + +```bash +go run main.go +``` + +### 3. Try it out + +```bash +# Store memories +curl -s localhost:8080/learn -d '{ + "user_id": "alice", + "content": "I am building a Go microservice with gRPC and PostgreSQL", + "tags": ["project"] +}' + +curl -s localhost:8080/learn -d '{ + "user_id": "alice", + "content": "I prefer structured logging with slog over zerolog", + "tags": ["preferences"] +}' + +# Ask questions (uses recall + reflect) +curl -s localhost:8080/ask -d '{ + "user_id": "alice", + "query": "What tech stack am I using?" +}' | jq . + +# Raw memory recall +curl -s "localhost:8080/recall/alice?q=database" | jq . +``` + +## API Endpoints + +- `POST /learn` - Store new information for a user +- `POST /ask` - Ask a question using the user's memories +- `GET /recall/{userID}?q=query` - Direct memory recall +- `GET /health` - Health check + +## Key Patterns + +**Per-User Banks**: Each user gets an isolated memory bank (`user-alice`, `user-bob`) + +**Async Memory Storage**: Interactions are stored in background goroutines: + +```go +go func() { + bgCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + retainReq := hindsight.RetainRequest{ + Items: []hindsight.MemoryItem{{ + Content: interaction, + Context: *hindsight.NewNullableString(hindsight.PtrString("Q&A interaction")), + }}, + } + client.MemoryAPI.RetainMemories(bgCtx, bankID).RetainRequest(retainReq).Execute() +}() +``` + +**Tag-Based Filtering**: Partition memories within a bank by type for scoped retrieval + +## Learn More + +- [Go SDK Documentation](https://hindsight.vectorize.io/sdks/go) +- [Hindsight Documentation](https://hindsight.vectorize.io) diff --git a/hindsight-docs/docs/cookbook/applications/hindsight-litellm-demo.md b/hindsight-docs/docs/cookbook/applications/hindsight-litellm-demo.md index ea55cd0e..6ec29c3c 100644 --- a/hindsight-docs/docs/cookbook/applications/hindsight-litellm-demo.md +++ b/hindsight-docs/docs/cookbook/applications/hindsight-litellm-demo.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 --- # Memory Approaches Comparison Demo diff --git a/hindsight-docs/docs/cookbook/applications/hindsight-tool-learning-demo.md b/hindsight-docs/docs/cookbook/applications/hindsight-tool-learning-demo.md index f8f8cf7b..81d10dbf 100644 --- a/hindsight-docs/docs/cookbook/applications/hindsight-tool-learning-demo.md +++ b/hindsight-docs/docs/cookbook/applications/hindsight-tool-learning-demo.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 --- # Tool Learning Demo diff --git a/hindsight-docs/docs/cookbook/applications/openai-fitness-coach.md b/hindsight-docs/docs/cookbook/applications/openai-fitness-coach.md index d5bb278f..d0971fc0 100644 --- a/hindsight-docs/docs/cookbook/applications/openai-fitness-coach.md +++ b/hindsight-docs/docs/cookbook/applications/openai-fitness-coach.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 --- # OpenAI Agent + Hindsight Memory Integration diff --git a/hindsight-docs/docs/cookbook/applications/sanity-blog-memory.md b/hindsight-docs/docs/cookbook/applications/sanity-blog-memory.md index 798ced50..fc555869 100644 --- a/hindsight-docs/docs/cookbook/applications/sanity-blog-memory.md +++ b/hindsight-docs/docs/cookbook/applications/sanity-blog-memory.md @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 7 --- # Sanity CMS Blog Memory diff --git a/hindsight-docs/docs/cookbook/applications/stancetracker.md b/hindsight-docs/docs/cookbook/applications/stancetracker.md index 9e6ce781..5d464017 100644 --- a/hindsight-docs/docs/cookbook/applications/stancetracker.md +++ b/hindsight-docs/docs/cookbook/applications/stancetracker.md @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 --- # Stance Tracker diff --git a/hindsight-docs/docs/cookbook/applications/taste-ai.md b/hindsight-docs/docs/cookbook/applications/taste-ai.md index f5c9888d..b6883c16 100644 --- a/hindsight-docs/docs/cookbook/applications/taste-ai.md +++ b/hindsight-docs/docs/cookbook/applications/taste-ai.md @@ -1,5 +1,5 @@ --- -sidebar_position: 8 +sidebar_position: 9 --- # Hindsight AI SDK - Personal Chef diff --git a/hindsight-docs/docs/cookbook/index.mdx b/hindsight-docs/docs/cookbook/index.mdx index cb22bd4d..f6e63c5b 100644 --- a/hindsight-docs/docs/cookbook/index.mdx +++ b/hindsight-docs/docs/cookbook/index.mdx @@ -105,6 +105,12 @@ Learn how to build with Hindsight through practical examples: description: "Delivery agent simulation demonstrating learning through mental models", tags: { sdk: "hindsight-client", topic: "Learning" } }, + { + title: "Go Memory-Augmented API", + href: "/cookbook/applications/go-memory-service", + description: "Go HTTP microservice with per-user memory banks for a developer knowledge assistant", + tags: { sdk: "hindsight-go", topic: "Learning" } + }, { title: "Memory Approaches Comparison Demo", href: "/cookbook/applications/hindsight-litellm-demo", diff --git a/hindsight-docs/examples/api/documents.mjs b/hindsight-docs/examples/api/documents.mjs index 458f5613..d973a2e3 100644 --- a/hindsight-docs/examples/api/documents.mjs +++ b/hindsight-docs/examples/api/documents.mjs @@ -50,7 +50,7 @@ const apiClient = createClient(createConfig({ baseUrl: 'http://localhost:8888' } // Get document to expand context from recall results const { data: doc, error } = await sdk.getDocument({ client: apiClient, - path: { bank_id: 'my-bank', document_id: 'meeting-2024-03-15' } + path: { bank_id: 'my-bank', document_id: 'meeting-2024-03-15-section-1' } }); if (error) { @@ -68,7 +68,7 @@ console.log(`Created: ${doc.created_at}`); // Delete document and all its memories const { data: deleteResult } = await sdk.deleteDocument({ client: apiClient, - path: { bank_id: 'my-bank', document_id: 'meeting-2024-03-15' } + path: { bank_id: 'my-bank', document_id: 'meeting-2024-03-15-section-1' } }); console.log(`Deleted ${deleteResult.memory_units_deleted} memories`); diff --git a/hindsight-docs/examples/api/retain.py b/hindsight-docs/examples/api/retain.py index bf127ed0..5c57c415 100644 --- a/hindsight-docs/examples/api/retain.py +++ b/hindsight-docs/examples/api/retain.py @@ -90,10 +90,9 @@ client.retain_batch( client.retain_batch( bank_id="my-bank", items=[ - {"content": "Alice mentioned she prefers dark mode"}, - {"content": "Bob asked about keyboard shortcuts"} + {"content": "Alice mentioned she prefers dark mode", "document_id": "support_session_123_msg_1"}, + {"content": "Bob asked about keyboard shortcuts", "document_id": "support_session_123_msg_2"} ], - document_id="support_session_123", document_tags=["session:123", "support"] # Applied to all items ) # [/docs:retain-with-document-tags] diff --git a/hindsight-docs/sidebars.ts b/hindsight-docs/sidebars.ts index acb43598..64854791 100644 --- a/hindsight-docs/sidebars.ts +++ b/hindsight-docs/sidebars.ts @@ -165,6 +165,14 @@ const sidebars: SidebarsConfig = { id: 'sdks/nodejs', label: 'Node.js', }, + { + type: 'doc', + id: 'sdks/go', + label: 'Go', + customProps: { + icon: "/img/icons/golang.png" + } + }, { type: 'doc', id: 'sdks/cli', diff --git a/hindsight-docs/src/components/RecipeCarousel.tsx b/hindsight-docs/src/components/RecipeCarousel.tsx index 59ab7307..4044cd7c 100644 --- a/hindsight-docs/src/components/RecipeCarousel.tsx +++ b/hindsight-docs/src/components/RecipeCarousel.tsx @@ -17,11 +17,12 @@ interface RecipeCarouselProps { items: RecipeCard[]; } -// Language icons using inline SVG data URIs +// Language icons using inline SVG data URIs or image paths const LANGUAGE_ICONS: Record = { Python: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%233776ab' d='M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z'/%3E%3C/svg%3E", 'Node.js': "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23339933' d='M11.998 0c-.27 0-.54.07-.772.202L2.428 5.05C1.983 5.321 1.7 5.802 1.7 6.32v11.36c0 .518.283 1 .728 1.27l2.375 1.371c.64.321 1.094.32 1.468.32 1.203 0 1.89-.73 1.89-1.996V7.362c0-.146-.117-.264-.262-.264H7.11c-.146 0-.263.118-.263.264v11.283c0 .876-.906 1.753-2.38 1.01L2.103 18.28c-.046-.026-.073-.08-.073-.132V6.754c0-.051.027-.106.073-.132l8.798-5.08c.044-.026.102-.026.145 0l8.798 5.08c.046.026.074.081.074.132v11.394c0 .051-.028.106-.074.132l-8.798 5.08c-.043.026-.101.026-.144 0l-2.248-1.336c-.064-.037-.144-.04-.21-.011-.55.307-.658.373-1.177.45-.12.019-.301.06.073.276l2.93 1.738c.23.133.49.202.772.202s.542-.069.772-.202l8.798-5.08c.476-.27.772-.772.772-1.27V6.32c0-.518-.296-.999-.772-1.27L12.77.202C12.538.07 12.268 0 11.998 0zm2.657 6.343c-2.432 0-2.945.953-2.945 2.146 0 .145.117.263.263.263h.788c.131 0 .24-.095.261-.221.177-.718.708-1.08 1.633-1.08.738 0 1.177.168 1.177.803 0 .325-.128.567-.678.73l-1.69.419c-.899.223-1.47.756-1.47 1.636 0 1.076.905 1.715 2.423 1.715 1.704 0 2.55-.593 2.656-1.866.006-.073-.018-.144-.066-.197-.047-.053-.114-.083-.186-.083h-.791c-.123 0-.23.089-.258.207-.286.644-.98.849-1.817.849-.65 0-1.16-.207-1.16-.725 0-.325.144-.424.903-.609l1.476-.367c.898-.223 1.462-.72 1.462-1.613 0-1.12-.937-1.787-2.574-1.787z'/%3E%3C/svg%3E", TypeScript: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%233178c6' d='M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111.472.074.914.187 1.323.34v2.458c-.444-.223-.935-.39-1.473-.501-.539-.111-1.09-.167-1.655-.167-.562 0-1.011.062-1.349.187-.338.124-.507.335-.507.632 0 .234.095.42.285.558.19.138.503.275.94.411l1.503.434c.915.262 1.577.609 1.984 1.04.408.432.612.998.612 1.699 0 .915-.35 1.638-1.05 2.168-.7.53-1.667.795-2.9.795-.591 0-1.178-.051-1.76-.153-.582-.102-1.13-.258-1.645-.468v-2.503c.544.287 1.09.507 1.637.66.546.153 1.084.23 1.613.23.609 0 1.071-.073 1.386-.219.315-.146.472-.369.472-.669 0-.262-.106-.471-.318-.628-.212-.157-.551-.306-1.017-.447l-1.42-.395c-.877-.234-1.515-.563-1.916-.985-.4-.422-.6-.98-.6-1.673 0-.857.348-1.545 1.044-2.063.696-.518 1.633-.777 2.811-.777zm-13.6 1.77H8.45l-.031 4.18c0 .754-.13 1.314-.39 1.68-.26.367-.65.55-1.168.55-.286 0-.56-.037-.822-.11-.262-.074-.506-.173-.733-.297v1.818c.319.111.665.187 1.038.228.373.04.736.06 1.089.06.924 0 1.623-.247 2.097-.74.474-.494.711-1.254.711-2.28V11.52z'/%3E%3C/svg%3E", + Go: "/img/icons/golang.png", }; // Get language icon based on package name @@ -30,6 +31,10 @@ function getPackageIcon(packageName: string): string | undefined { if (packageName.startsWith('@vectorize-io')) { return LANGUAGE_ICONS['Node.js']; } + // If it ends with -go or contains go-, it's Go + if (packageName.endsWith('-go') || packageName.includes('go-')) { + return LANGUAGE_ICONS.Go; + } // Otherwise assume Python return LANGUAGE_ICONS.Python; } diff --git a/hindsight-docs/src/css/custom.css b/hindsight-docs/src/css/custom.css index 62072095..4f62828d 100644 --- a/hindsight-docs/src/css/custom.css +++ b/hindsight-docs/src/css/custom.css @@ -639,8 +639,8 @@ article p { line-height: 1.7; } -/* Links with gradient */ -article a:not(.button):not([class*="hash-link"]) { +/* Links with gradient - exclude RecipeCarousel cards and sidebar links */ +article a:not(.button):not([class*="hash-link"]):not([class*="card"]):not([class*="menu__link"]) { background: var(--hindsight-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; diff --git a/hindsight-docs/src/theme/DocSidebarItem/Link/index.tsx b/hindsight-docs/src/theme/DocSidebarItem/Link/index.tsx new file mode 100644 index 00000000..2e938b9f --- /dev/null +++ b/hindsight-docs/src/theme/DocSidebarItem/Link/index.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import Link from '@theme-original/DocSidebarItem/Link'; +import type LinkType from '@theme/DocSidebarItem/Link'; +import type {WrapperProps} from '@docusaurus/types'; + +type Props = WrapperProps; + +export default function LinkWrapper(props: Props): JSX.Element { + const {item} = props; + const icon = item.customProps?.icon as string | undefined; + + if (!icon) { + return ; + } + + // Create a modified item with icon in the label + const modifiedItem = { + ...item, + label: ( + + + {item.label} + + ), + }; + + return ; +} diff --git a/hindsight-docs/static/img/icons/golang.png b/hindsight-docs/static/img/icons/golang.png new file mode 100644 index 0000000000000000000000000000000000000000..cefc68cbb44c78f894fd61fc3ed3ed39763bb708 GIT binary patch literal 38066 zcmeFZd0dl6*D!qHhFX`Rf{JVv1rY%e*-5ZfL}f_@0oe-yLP$c`m#|s2vKlHNJEWB* zB1>f7K?O{aO$ckkju1lFApyenUSL~o@7~YTKJWK@-yh#S{z%TuoH=vm%$YMYXO7wI z-W=lM*YHBx0f3GUa2^1Fy}&-ML%gJ8M1%R7ip{o)AyvYE|oxEL;2zxh?kA)&q+f7`Rq~Tc179HRQ_y_X&>-X*- z0bq-dT^BFOUi|4dSoY$@pSV8qwYdoZKkfL9mt8M^+W83v+X0(H$9U}B+?-ToWE@?k zt!%K?wp(4vcv(5g$Vy+70o2sJoUGs|TQ?DFTLjV(B0f`IEiQtzfruN)>s-`vx@v2W zyn%DE)yL`Hf#XncWgBsI=zcXX6)%hv#@5YB#0!IVbXD3QGP26b z$}$%($y~Z51!73KdONyVc}Y3Cih>mOi)_=lX6p)fK{~l1LE&%Fw6ey!yFtXo_lx{W z+6MkRWhZwR^fp}^xQs2@7Gvw^<_bzeRt6*|BBEvkSAo0OTDf6ewz40|>)SeSXFlf8 zNa)A8QA1H6JtFom?5OFUl8(TXoceI;0 z^xx~&U$F2i$!!+?)aMo(+sfzqPdWJSH21&Z#xJvR##ga5o_&puAl|kvTh$umGtL>{sU8gjV~UuXMDHoeXHLKGzJeO67N34D)of z{V$gLwn=faa&fi2-d+>i>iu7tyuT-d&uRUo1i%^IX68?bp9|pgs(&5+ zztsM{!GGTD)6lh%a9c;$|NCM8M&~bw{OgE6!})x)zZL)MNdHjtS4|A`wEsfKWYF7# zvi(!HTgZP;RKN8LqW@nkM{v36Z5?y|uqOZY^zm_H_;u_3y^V^2D|leI0~)J;yit9P zMvHtTD&k`6YU|=*YxB_*V(moS?2)b_$gQ&oSm*4H1QA56KpVHE1h#+P6{JOUur^3L zB;0EIRPoW0VlcKYaHJJl1hg*O2Gt6U#(IM06zhog7IAm9v2_7^*|M7-X}WCeblz=F0rTJf=1mcilfDQjeRET1*OogI06GPBoCAEf?@J>8 z-*^@Tc6Q&2c^nDVs~ykYXORsJ$R1yW>g!RK)H$@i2h)3eF^sB6W(7!`?vgaV9gr%cLwg{;s)|0 z0>Y;~-JG`IYao0KZf|7+!goRVf(ytX2tV8^M|^~1w_xj!aMl*=a!2nfi1P}BMG&9C z)}O%`wEI@STWQPHe8ASxKp*_x3;qcJu7Dn(34HT!aQ1BDTm`NI7Xe^PUSJ+fpXA_b zCwFPPi0gnl0PODD+*}X?{nnr#dp%-vbM@!V&Glyhu(KERzdL_wkNpV%l;*+m@K0sd z(Ev~!3;-vnpUTdFc!z%gfTCK^A!D`O&ra}jhaD0C=7|7s&=>%Yf)4rprkga7$344t z@7cX;&z{|TxViW2-T&qO{rmRqKX&NwfiI6AJ8|OpF+M(i!L!2rr$hz#_(U#D3z zoR>H$EOk-p+{Lr!B+hLS;o|1z-oJPM(f#|6p5y1^KlhK*<|}|_@2;1-Uhd>N4ea3I z+R4MUSqlo93)r!fYfBM-OMAGvcJ1D=b1zt{`z2V*wPVNbJ^Q%#?g#O}ncA@v91YKr zuVlZz&3)9$`N`|km%h<+`TpnJ)?=d9_w(KiospBj3Xga;yO)>m?B#3vu90oSa|#9z zQb2mAz<#!R`>iYRd-ooYAQv}Sslv0}+0LE&xOe@EwAC5U?(M$z9KB@a{QVQKm(y~W ze||m0EBcMz?A#f7m#g}lRNw%}+76zbJb*f|uJ;-B|A7C$kN~&R+&%9{Ce+7{F)-nG z@=CdWlC^%*9*$?IPHTR4${Zer)t{sEC_M)iTSA4??8DLJ-`1uWm$aaXwP7pJ$Lc2^ zrCTUbG#5;?J30D1%SG1-7dC;=_+Bk73)&lNk;fcTzdh%<7jViPE$#jHz-FCjJoJ4<-OU=61~=B@u1 zCyZp@mdE&itUx>;!36jpRL=`II_d3un2EDIxqLwvA@3vLoK5dae+|tE2xVHRv+ zjqw&8WWMw-Y?s58GO42N#?08;_s)P2HmlU6lR!Qux24VBE=Q zR@F(?iGt;^m3fMwXi;ZukY@2A+4qcrr{ZQ;{Qc=Jjcd`#hww$1ld1&vz*=I)r z8x+u9NX7bys8o+8VwB`#&*P3N!Lc>+6v~_2X21OD4?_;}Cs`*|yccX50!~rw%-!Bo z{Umx06T*i{+U{}dd={h-k8DNtQ6XGwUxufNAfgYDR34#?8xI5@ctOa@`(Q3@OPI>^8CKg@!xPPih1mIQu(^C zcP=cf)&$yIoojy3uywfDqq)}?VW3OHPW@1x(qA-Xbgm|=4h6Hd>pRJYnWnVi&0nUP z;>>G|Q%6@6G8N9vX47NxbDJ=`Hi58IXYa4oHwu>hjtgkdPuhtYRE35u38XM7E7oq_RPlUo1uTmFXYmqu4T<3OJmz7Yg0to1i&K zQc$!vYDDYWJm#`CrcF=Qz5ojxKKcK+8mW=3-&5h}pmpxI^>Dwo<1n;2D z`4yUEamp82$}Tp=kEdEo!jPfOpR{iRY}5M(1bSZXS;k2s?$!DU7W}pOkyB^cv|G_G4LWN$457Qp)YcH z6Y!b)@Z(6K3p`Y>)uF{q8>aO1TrX`2VmII)9eLZ=nI=zf&SwTsIDdGL?TkpEIIkL| z<7Sxnjyl04^wL*8M*Jfcoe9x0@>otRhsh$N{W2V5^aG6^U1H?vpB2yRNOl^m4_RJ6 zclR=KGz3EJXW%+*?>ebHq2|LU9?wp^eT}19Dvt^o7d0woEUgVIy0; z-EClI-`#Ml;i*jVb48{janpt3eN7z{M}8eMSBitI4M!n3S`N>edbEbiQigm{yGr|c z=bl*r*dqe5@81M!IetZ$K<*3F*opC4mVOs>ru3-z4033`(%nC+OqCv=9!*thTyGHEEXRLpwXRB89S`G-HtTOY?_5h^@WavKRk8o#GdCOt~7lXrUwH_Ho zfD<5W;4*M#*)VeEL$hpuf0**T!^;tdPpwZI&#`1h+A!{=1ERxZ6PRRKDA0(-LeHwo zG>01|R{}bS9DKt1(7Cae%K^vvFvsx~Y$8dpn)@oOe2SBNJJ9$(MO~c81AQwO!kP+p zOeYPVWkvJT8janb{8M1ID6Q+%v5 zP0Z9VmMJjSnSA@p6-WMF{)6)Q4%lO9zCL!oqHhh7H-TzIUtW`FGDHe7I1)UyNPBDi z9ffw86U$u2Lj-ZG0`}F6S~KIw+ijGoqC~H9shB*<#B6xs(W$BLwBa>o&V_fHbTg%2 ztaT9vxpLqA+o}4!;y@=wOCwXx^x8sj@aV<3Svnsz(j3ZAWA>Q!%`H|RyMStVR0>C_ z6qHqznJ(!0N0iNd$T88Fqe^{T2Nq-AnwDpcYkI#XIMkn*Y7vV@4Cx_;IjF&&ffC~F zoCNDOlkUrXk+Nzetl1Lo=aVXu3-e?|NUMeNeWwLl+w3NgRByLX%aJNi!xt@Zf;LD3 zY*@O_k4+81OM>V|Bbg7&8;;T$9D3m!!R~^Rxh3p5K_kAF=Sjt*;d?px$OIERikuwn z(kqqQ<x-QpTef<7b!n z7C9=IHft$}K}*lk#R`c18dZYWPrPe;!hc_bBQY z=#{U?9$R}Wv0{v?d_s*F_tMk|jG7=t-o_sC<6jjeO}T#PfRib1j|e|F$O~GRYlbau ze7mP#u-r8Hv=c+FUkxrW&(2zxesD8wbOoBgr;O)xDzBPKqnr=3UYH6;4r~HiYhM}b z2Ns*M?Ppk2(U}+$8|5*&3G7o}kyy^kB~7iUebp+k6E=WchlbRM)s(@PsTcAWy-lZ) zh&G4In?MU=euU!|yV^O(mS@jAIzAt8jB`A8-9N<1B)&4`>r6U*u_PTadd&?%J9Mb} zfwPGiRe+sVWv5%hCY$-?grIV1ZR7ZsR|_M|o1y*@5Alyi3Q!)5xb~p}eR@|;RTreo zR3pVJ3aV{Hb~Jt42C(jZKFfz5^%XEZ_l4KLG(m0xdVL1$io$2P6%BT3M)i&+*XQZM zMGqc08=j_4X^_y8SaZ*3!>OJ#D%mYOdtxp%fiX0u7m z^9_37L8U`4_(>bAc6!m1{K|h8g^A~C61@os*oy*iFE4hq zoQ>QBA_$>P%RcTzNBkyW@XViKoYGSKVfK;htBal{1H@MSFAW=r?BE@gk-x`oUgcvzT*B|R1mEa^&lb) zXJ1%Me?(~z9P_`h3`?25%hM2}_vCIbPx*#y z)Bj+t-N5n+qG$2eJm@yOt`c97eQcjF8 zr&doJ>s7Er$UeHhxuJq2NNZVTe_>~@=LKr0>o~PH<7nUA$wxsKjs<054kz1Gd?@Je z%L7=TBhR`sq!WV-%JOJz`R<*l$MqkIlX9ZRX)djX{YR5?)qSvge2p2D*U@nj3mNtW ze&MHEArbGoNq76L7P**P&O$JD)oJE{u6+*CC96vq?QOqZ5rPaTv zmJ(fdX8T1Nm05`M;!Y^DMvD<0!--R>he9zS)To8h5e|*j(jnNKu3{u8sqG%pmitbU z=iO213c1^FhqT7cH01OL-Bl43I(TSrO&a-F zs+ULOa^q5|Jbwv!3Dv2urvA`Ue`(&0#DtQMB8JSRqa`Da8*V2QN3Gr9ly4M-CX9K>Zt{~I5qhX26)xrSmZi@!F^e~y?^pkE4;ggHf-Y1#0eayWgWjNh zXQiva5ZamMnUupG?{aB1>E}t#SNEwe&_ov*@lKtpReURHUufMC8{cA6%g$rrX&(0u zTmi7?GA4$WEU4kVh;lRvn#p3JvENLQy(&+4#Ky+bj|$G{a_@22 z1kQImEfSMv8%GG4`IE7p-s|tynGMLSC1~J-3$|oavach1C*R-}dw(-o?Vf+~d>IE( zgWb`{)Al(HVYIiHNkXCZlmTzwMuYGwzv*m2&jz7XP5x@>X!u)ebvLJ7?;-#|xk96~ z3(><;X}G47VR0vGEfaP}vv4$B@>GMGTalKABuyH2!r4v`Uj^TdO0cx2AB$VQ9Dd4w zKgqpcel^Fqs$4%(#!`t0H6XoE<&RHXaW@HzV;xTztw$DSL-H@JeC6sO72&7V92jWb z)~SMZT;Uw9iZpoMIu=%D)^qVg_)|Q^cvYCIg|BBoKI?5;UWq22sBp`EsWi)CU{8E3 z{> zd|fHM*b){<3l~@;Xmj)izaDKs7mejDrL~Q;jfCid3RAolZ2mDVL<(LSDN=h1URvLw zWShl=?!}HV&d&t1Phm>cHj>4tTCf}>^yv6v$rlfx=Mgo&#+k>-UZV~zzLL5kRBR#2 z?n!gEOc$OqGz5*+LdvVn)jM{mht3YjLVb?;^{lH0p5u1ddSC#P=Q6^oXf(2A;xsBX zi<7=EBowY?6v$4PF6$9`(A)z{&Ng3{7xG-49 zLWdiSvoj%c7cLoMjDwQW%3%>D^PNkNhgAs#7B2gG{^ik*vHFBFY$`i0<~3zliYVPs zZr3_Wm(ND4u5Y|RnW)i(DXt61su zbMBGUf3RGTINrBKax;Wp5*zMpp%t#&4e|IBi9$WYx|g=>9CVJ_2x0oR4_ey>K=C% zAXKSSkuU)j%7@8y$eKM7>L$3jWGiutU-cVZm@|PgmM#>C<(1nKOr~DDxH7EO#NbOd z+?PJ?L?5U9zxzC4P=Qoijx-YD0sXqWq|TbY?TDWfd*Sb<7f{19?P0He#4iY{zT(9u zzcUj#GU2rI{T1IF2PyMC1H|BE_-5+OWlKa&6ZTdgf_;zs{2yd!KV#|vY56*G_lib25}V-2z#c{+ zvt|xlg6G_7k~&rU;=nTLf&83pR@YfElzlQIut{d5vOFbHsG1j-J$uPzZkpiPvG=~u zp&Ru#3ZMa56x{^*+!jy7%a2z)XsoOy)WN#WxJawfFjsIvCf@Q@0`}I5{0geW^7~Li zxbJFZws+q3^EzoADHL6zyfZlfn=95+H0fjaKxn^9f=B;=O5c3{u7lYMNuvQ|drf^cQWl z{T1aH*i&#uGuw!Slw*WblbgVV-;$JUS9F3R-P!9J4DF}ScDc^X4d7^2+7FsE4Lh0A zgeyb`MWYRpK7`*!*()AYYXKFgIJ`4Bybt!H@EM$s(bpvoV$eg{PgDJ~v^VB`6WeCS zGRp$%JXX!wpjwG=RSE!yW_GtopJ~$!vrvC6d5hO`mr+_R4!M%+y$Kv3SK5;uM9r6< zOqzLdj}mF>=WMw7ojw!He+QnJF|zpfrH&$6`5E-!T%CVO+>-VM%UcqoJ2mM=S-23g z>UY)39EAx&ab${?zuC($&{HBEP4jeLmV9~C;T&)X%Y%8^ui$qbPvJpzB}u7^wRRny zatn+OD!^Qr>+haAPC~1zIXKz2Ok2Q^IRl@f782E^NuG+19U+{nmUb_G;qzr_0hqhGCccE}X;DE9ReSTg;AoiJnC zeDI8Gm>I_#BP{lWw(RG4t8X5azwvdxzj1U$A%B%2bDCHmPAX;w#-lA<<^;({I^HJi zYV>FUtwC~XF`tT6owipdFZo7DXKoLV;E#*@>W&rwUMjwjpErTKj@=ij$|J#yfpPLm z5U016cJFeM0RLn2lpOYgJ4@4SeQpxjZnNMuX5Om^V?WkGL6Y*PwXS?EGx$fLAH+0h znR^5(#IMImHV_^z!3yu#rsdjHsgfnz?DB<#b#-Sz3Za66}H+tF*17a6{X89 zzN_Ct54QR1SL(6xZm*5&p;f=EA_(odx8v6msOJi252{N^#rq&qeE=Tjmw)7Q2WeRF zFsIt1-3IJ6$Vxjdxu5tgSMYlO|PfR);<@|f{n>5 zWO;ayE4WJE06SzxkAjyl_nPDyM`C-@YlrD0ckA_)ZMALm;jd{^EXO?20yT-pax9vyKOA{RViSXihy@ws92^UCa;>Y9Ly8Jh)kN+gV*ghctQIP*O$Iq#R z$eW-`T*xXmS)Hxp(KWkt`|dVsq#*TG*2Q%AiWL$r`>J`2w-Dd>m!QPgT=R8_yHEuz zddxAGifg_O%j=ddKq6%{tYDz>n_>Q&ZDa9Eo<6{-UJ*dnp)OOt;994THN5ag+oSp4 z&=k6S+(<>^+1Qh>jR~dIcSAZ)=koA$@Cd$|KP{U3l!U_Rm+b6(3Gjs<0_RMu=d#=A zJG&%h7LC-OC1G62ygOAe|3fwYNw^@=GW2fH!+D}gYRAFh%& zj2BIzzGXrJb>U8(dUnO_76EcMXYuBqoKnqn69R*ae9~i*cc_VUfpYsf5oQ#T-(}|7 zb7PTKF!5Hp%kNWh|3)w7U^6+;O-?tffvykGhe}9g<(Md0OwHl6!)`FYd9l z!(v9Hz(VNN*>?@|66BL!SpT{rrc2`#KeJAXFF8wD{Dq7VPtVbD<}~-jl~1##q4pD! zW1=JdOf)AZ9`*uGD3x?BsXm_6Ee|nw8>d2Yr^ov4_m-lhrA5P=kt9pQP2kXr_FYW+ zAOP$m14xbvME4myXDLMUg(#sCYtV>fGWK zFSED~&S%!myh z=}YzAbcF(TW5e)1KB&@gqPL3suoM-sSZGw>Bjzn;COb+B^5`u{pF2@(E(0}W7|M zFWH(r2p|LiJ@1j1Q0^se-SD9g#n&N1a;&Sy-#IBXsi5_9+Kr;ka^F2s7psDnuExus zg!3xScsi}0naJ1hDPIr19tqQtPT&)`{VtZtn}z#oY5L^XjnmbJxp%1m_fK0r{M~d| zAt)|3ndMp63sF&}89yUw=^*Ji&0h#L(|1VdCys_^lRz3AFbJ25damGranq4MD6T+iJ^y9~UXLnB@t#DBZZ z(VosOi)4Cg*3wvNKnUNv=T!0Nsh>8x{WcKtDe zCP15#!h26rg;$TQ$2w*%Ev7B{DQX+AHGlE9+XQYjwQ-si>waRu;@>lvcS($aA?;Na zAu=OoR7U15HuRkb-KTcGDf}RFV!@p>VEi4GbOiu}Q>$C^-KsJlvS|KVZq=vT7l_Yd z@V?cRe1z1L1*woQ4YO+c=Bg|Qs(RhtVM1_Pz_pP&t-nsyNLe^boCxaaqNF^np%D2~s%a zZcun>-lyqOPSgode96Q>7ROf+F_jd}61rkSkJr6g03Spi0*f_8FyvYMRbggCs*UX`Myb@R7$A$ zeSspK($@d{SODkdY`-?g@9>w5423YB6$N6Hhan(A*+WNXM>TP9X=BtyOqJglK+D^CUsjx*QP7 zFtuQ1ODYr+qpoQx$L$f#!4YyQest% z&dqVQs5ezu+!EO>PmAj8&h@U4Tes7F&Z+QET|f_ImtU2yuv+MWdRYE2iT}l8SXuMF zqI7k+z=bl4og2ne)8UzcxwHL|s8O$QRl-KvNIvM(o^@p|bU1acqRLfYcB5Q#8endP_ye97T5I$zs!8Kj4Hrk{G&M-4+38b%xe_wjpWO& zbe1XEPj{b}f5X2PT_vSJ)Ihm6BJ;I1^ZL$(XJkH`|LP6S_X)bFxA3;GxPn&@VcIaS z0B~Uo2~#}|stxrNtwSRs=ZJ#-yj4%j5zLs6Th~XC>=F%UL8J^5bdIj|*)1>$8&&Q7 zcA(+(zIHx|ZnWY-f8Or8tXTY-BikViFTSdaPVC>St4fI61)nL{__2-aLi#;mXX}N* zgD_2l42t#|u5P4DusWbS;YCt{(aIqP5o|7B{05ArP`B<34hA=0=W~zUm0euDa?HL^ zhwdXo3JGmj1a20Iood$^Y?_94( z%we%TSiJa@{UHX^w<1GM`&`&sJ}OhSId<@h%J$YZ#6e_29{1E$y( z7trFhGwm2iO77@8Z!!vCtK1p~9mE`MWqAHsNh}&Vt@*|1LiwIY{U?U2nn|vt{j3y} zHZ=UvhN~cE^s_^@J1o#= z>La??EsC$dtFtiCuvBjUuuzJ@o{R(R-h=!?<9)j*baKM6`6^W~QZd%|4cx<^pwsh* z;-5P7O;c)~*Uh;Y5i;MN+N-&9IvFKja5DQ{oOl`@QPwvH`m~eV`*stK4Oesoymv^^ zeC|o3qQdal5dVCsE;wn@hfbIA=y_pyul;%tX3B48AT2@XChIDAV7T&$rN0evJ;JjhoG>bl zPiSUFv8?$C#}?PXx8A-3haA#XF|DMc)@fV3ayAdszI~u+sIua;f&CX>(Dk+=BEdcW zg+=#_X`5Y9))|w#xKV} ziQGvf-R_%CeZGuKtVKleMA4q~9#TySLy`byRqJl!bi3)&>7!Sg>aq2Iv1sBGh3i9a+gs)=?vnyZEQ}?lUe3M3jG@yW8!EsjxCia9Q5|q z+XIoEsu1VFDPZt(XY8JII;o}@DMh&LXn=p7vzHCl8YCv2e$VvyxwsP@(Kc*=JR229#{ z#UowKBpKLsRp?KL9@=k<337Bmj7?AL)PFOFMF;F^Dcw7dQr~GQ6z@NezTe?56;s8d z%8-~@X%M-5=H7OTfA+!k(DEIh?xT8>wY9?VJVbBQR~vdV4PU1b@wzd2>Y*O-iVa5G zM~bDR7r^Vc?sJik)DK_ZXep&rS+`?$Eo8AQB75vX0W*aidJ9&Q<1aC$x`g>7X~v5$ zqThxZ5j39XU=(hq-1#%9;=G>#&jkN3Dp&et_mMvu;$E6lJCmP zb-Y6i(mJ3YzUT4vAgh`j7vK-Wg)G362Du(=PcImlqAX+PRyc1Wd5f$J9%8QO6ycnf z13||DJkhJvrlZkazpN^5O(1(IWcYNqLOmT484qW}`vdzsE62JDsGZ5Ka%y9?VCX{Q zI+N`s*{d1W`9x_}cVT2`(x;u?kkR7XLsHzjh9@umV$IH$Kv}e!bSgJC&IdgtK6}yF zME9Pu`Fd#+ILB`;l^y6n=FiIQpkq4l;;jSN{Lb&E6Sd00ADDROUJ4fgqr&hwUbZH- z^Fw_WS@%hYRQh1gf~I`cByQFJix|@i4E1De2eV)~TUe||G;MOqd10=(F2vhN-#4Fg zB6}uC|7tXKwZ-Oa?(6|s2IvMbHJlI5@5JSzFcW0U^^lcoJyQ^`!a~*vY2#g#6}vZk z;QeBMb;#&zvMQfNrUN!40LEL{D*ZOpo93R+lh%dIqxwjm-0JDut18SH!IzZCd)5Rn zfN7t9*fEQa+JvGWS$=ann4)mUhvX!`$R3usulndttrvw()7>Ll(YT5!+*}K(sv4Ck zlrPAEUDGArr`HH{thP=}EsM+K5TND?IJ?*0>9=4?1)k8$l`eY4Y0ugVTtmSCu}9|q z5n^IURk8zlXlj*@j+eC^4L9QHvS8xiv!2ITQVteUS~{4c&0^wFwdtph^ODaG_R^!+ z*X_fp;W)Y5DY2{Vld~pXo+q=1W$8&oGMO41t~6s7l?{fIX=y4Iz?5QAadoDyzpa5o zdsb@8{C1i0C8QAad)|o;c6C9=+{oz2LMtLPMJTzV2mI-&V)F)A5t1mK-WLG6sFAZj zI9E7&FX`MFZBfe4W}e6L499f9 zq;UE*WGXPB@oU#RupcPJ&YQr>#=LX?LvOjMUiFQDiiD+~j{_f7&!ChWW)$R)4sHL@73nZ6DGtBU3onM;EoOH-|w-xIHf158) z@F50<6&Q}vUm{XD$|leyse(9EZ#21Xu~fYQ>!7RTHk|aLuasnIp}Yi2pkNgyvz)OB zkON+m8f`$g^s)-voJd#*4^tI=5E;TQTQeQ4ZY4w6(f)Fju9e4Prt7L2{?q6bSad*L z&KgWdmqsop)k}IeM8sw&HsIQx&`_{*54nx%Xpih;Yfik>e2i)%6wf-bOe(MEtV`*l z;}DD4Es=hgj}vZrXd*_sQ50S~#L&KGdR;t3Q3ZM0U0DtOBA2zae#4(p&Qz3KX#cP* z*v;&?%c(xD=4nmQKYkbgT+s4JO9lf;RTF*5RVk!hd#$nM9G<2Ac1=IVvwc7-wSwZ9 zIv<25smjh1TZg_l`j~Z`;*>KId92a2sZN>vLpCoV?+#AgJR0usO~b2#sH&ChPHT_w z=R0IS8ht=ZNi@V|ia#Fd?wNq;5szA6F6gVDhX`FPIc*Kb*CxVjY8K+>29q>cYLdk^ z4RQ(#uDY&6#_{ByeUL-ONsRN=f^B*UcBGqeRR5greY=tGsY`x#G)Ek|dIutLq}UuW zv3B%ee(2@+U(Q45-ohVYtAuB!<>d#Oz(gjKl} zgzhYJD_kqH9VtVh*wu#&q&S-OHHja0JYg*=?~DjPWt5_h7#ym)KR4dYm=p*&SZ15m z>3{L%E`9EkjH$Ja7%Auv&jtd-rlFG5sX0Xycxs(U z^$w_mZK!S>J`QS2WgH1>sJxWBa8ezN*^11ekXOiW1z(?NdTXLmyOMQs2AT{8hL|-O zopc~IU#9xrO?gXEAh_DPm126w>gyK4$B~8rYqt?cGmYYLZ*tN?5B!5Qligw?V$#=T zo=xXZ(gi~#VNlR-rGK*{{A-tjK@Ugol0KoD zajQ)sOT^XT5~5h)X8)Cwmw#JmfH+jgM}8B?SgkL{@qVBTqt@NmKXg@cXRevb_=?U) zEv@x%{e0$k^nU;x@O*c0RAvOzpG7E1T>1o$xA|WXRU&UM`Xf6qznP!UD03A)Yqjkd zcq;l-v}mE{ptr03L9rEa`$v=fzVV@N)eQP6y`4dE$+rbY-?vSvg!QIx0`Vk<$EskG z*n>mS%59aBYpWhbE6eBO2hL5&$y2Vkj;I$%SE$$Ds?}h*RxE2GDqr=Lpl+6+IhB06 zQ8cKeo{YL!Zy7P>nYY#gl>T!&CVq`0<)}=4UV}_yLe(FzDqLr-DJ^`z=xcEQ(qf8E zDV%h{dsrn~SfO=580{C-r+BoUF6K(L6JOlmlNjpGg^#|zo6|2i)0C21Yo=W0#3nXQ z$D57>C*NrhbgO>RM=(O+6SAMRRwBHdv~>_jz-|^40JmkJm#f>bptcotvACW`jTDW` zr7%qMAm&*ZuPiK*DpY4jDY#tJbSTBOYp~Tmw^`>pN<-rA+?sH@M>2mKX7zfcMtByUy3^1Ebn*9MB(Xwx8+yLC2aUjy>-_0fomJVfk7mM>M)4d;WH)D|bWe4$@E@BK?6 zUu@8NK%k$O$Ayv=*G{SGa2LfFRQD6snDA(mjc{ykOKfbizCfDXG}D23S;_r&Gi!XH zY>pb)>aA%Xo0F~>eqw#dVp!;wo;5Z#iTK6`^2>8-=Xf4NW_Bb=Ja4W?%7Db@V3%qs zFmoi8{yGxoO^z-%QN4G{wg$vn0(4y$6fI7bJfDEu;ymHH}$J>*rS#C>ld6WT5kBUE32sGi!;q7@FHKoFP{u& zBX6Xu)S(2Q?3V3}&AfF@110cGsA{RjE9OXjc74TSmdDizU-5?{L)~nAQF4#XE^8aW zYk9(L+5N6epnj+jS`lvuhTLV!GJ?NWtUl|rX9#7}x-wM_{@=sa;#-LuVXNtU++URo zp<{_S-6l`67UyY9dDmLOEU9FZ`7!Q#WFOrmtXl1zstr}$t z>Ua*vW%m@w<%9}&%$(a(_kr{sZLCzj%E!4un1x8u4Y&?jkm!$r1!~=obt`cms<|<0 z0?#tcoe1*N)xA)fXPY#mT86|&EyC@tAklzOg>5$W=9W~z(9JPMG3};*k}~Z;%bjK1 z*|V$t*jod<8D7EJDN(hl%h)6J&+04Ov)FG=g*qkrY6?->T6@lY*VB8ssLeqvvdfs6 zwOnJosAi0ce-aT{p*0#GruaI-+2(P&%8i{0KmJ(*?m~6p>wPZ>QksEeC2auTtAmFswLV?qx@Y6`>XF?jMrW}r=chSg_}k{5#}Z+ zv2G1~=+Ci}y5H9aU;1_}yH&%k>;)Nnb3Oi*)U6wzQ`&+rz{GDiAX*qL>iKtac*4b7 z8*GY+QpCxJNjsl|Tg#e?0!6?3mxH>4e{T49^8eE{tkSEhi%X1IDIA?549>7wC5ei( z=j)a}g~GfG8>+}8%&S4(zV^;&200+f!lK@j zI9yV3lSW(ze**S<6S(OO{QAbNrKt8$dl|Vt*@d1uu0`&Kdw(LqWjlMor5nYlOgj_h z^Sx-y;o(K<0O(b3S&n8`J^1NyK|6cPrShj%e=Ey{U-`NsZ4Fc25xI0U`4cS25375K zII)(tKA`l?6`kil{fXLPP0K)11JuN;i;x!(T1h*X-jmRXa_&bwwZq9xM3E}5%?BQ! z=(qIQuekY%*XvvZ4N(=Raih|h3n;kvM`E%)(ucnsNcO!mOHxN~0^B~;?IDid6&uA; z!`_|ZDMHU-E09On4El7IFXw!}!Gx$#c+(OUzBtjrh4bzHBP{?7CD^4Y&ELiWALt6D z7fZ}|1;DMFSv}QIe(u0PFcw`E`0R1PB3rZmNB+Jme{TGD@?_ti`t>#x`X=gEgIhkq z_{ZYIZ{))K^)_Y_zY-B^|Mt(cj_9Nq^M~=^7gng65{u*zg{9E5b2g!%x2Cn{V)(Gh zex|bv>?Xec)+}D!UoatAr4y%(t9lvd>H6q2&LU7wqa0q(W3~w-R5wo(UbhA3Y*~6R z%q-dA5K$vR$IEmaA%l-uUd*m^>T=}SC|*CQ`Q_XT6?awd%Stjm##tL-1q+y%sXDLX zXSl>TB}WJMpn>iI9XnNz=B7QC+9j8Umlq3gJ_K>z42R~<$4RnY1=s`kUPm^zXe3X& zEXbJ{+EI9eX5v1KF+I^9)fF)Mwo%Vmqy3)BRc5%9fNCN$KD^g4wIMPU{QHjrt~ zFOyc9r^O+kV3o^+(7nyFD_W~nP7m)T+`jTJq`51+W$@l3l^N;gX71Dil=Yjfr|00ybhU9%@Y2jAC!@gy+qfP}b zL+gjvOWdt28W=5wi{>(elpbNRE7tx0((rE-{Lim2;Lo5iNpA=gj%C++@Lh+6AJmD9 z)uh!UFI!b+YQwDuK5PP`Q=35h+D}}yNgp}krSonAu!(AY_E%P!&5|304u9h0)#9(0 zBPTf`;FWNc3F7-E-aGQ{SEu412XNR5GfQ6F6S&c?@}z&v=~vLXpJcO0r*fndW|3Pe zD~tVOtG}1~A0JM($g{eJV2pJc=0#-DocFy})u`ODPkHt97(FEA zF>eDbHoBxr-3>16F*RJMkI7rx7qWjyd~Wsd&r1J8+{ezX@5oBgK4)mIS}^8v){d6$ z_T}Bn(xPp_Y!uHRhBk~30lh9_;yb6hw~C! zRNYlPLiQKEJ!+gt0f%*;B#JFX(}t1uw_z^xVaoSj>Ygd$1TL#!In+^Swi1jk@EqYM zkg9ToyG8w;4XD0dd-cO5ikAwoQ=DR0j`F~@YawhU&5-BfZOMpd^=?AL86%1>UbKE` zq!S?BJJn%_9cdBUPRXkP?UnKEZzQ%M!xPVi|Cy3-l?G?A(;G3PA$=IXrIXm{g_uzW zPwR<#PpEMS%&d#>scHP|#VuNYTKLZh{xZgUF(#jeH! zOSBHQx;b7!=-PK(jA3uEI!YGWRajnydxb!fY>=IZ4ag6g@e4{uF86_OjB8kD-nPQg zSv%ZGfv=QyUaJBJ>-qSseQebsvC-_sinB>^0f_7~+uCztW=?p{hH45y`W2AAHbCzp z%54xmyk|JhXiy1PxV?0=%!#mg>O%gY1JHgopbeY@k6c9bQh_cmgI2`Xkam*H4Sn>y zZyquwbF2)HAtr#d3=%{-L!!`@2Co0|8wqd&Y?=9zI&(44<%;;+GvA9ZC-%8rpy;)6 z?P<=-AZrZ2*pFLW7LQnJkY#}ncJ-HwVKmm);?r~-)xp6_J3IAQ|Dg@z{9TM&NBrZh;MdNa6}judOlHr{W4cBU--q1q@?fcVs2NV~Dn=uo z4*+OfS2^;ESun%Dey|O71zQmx2l~{=PiByjvt*o6Ic$_+ZDIqw4sKeL27U8JB6%Gh zkaB_|O6S1oJ?t>p$v9x%&;Yw`6^9>qvI&JB`W>(Ld)=DfAUO%l>$KKrXlws|7@c8~ zGhtPzOU2T~j%@(akmLSUXy5_klfwq8K+kNNX=8(U+fX`!^i>!(M3B4fx-NBYkalyD+Zgi z_rlj;5Bq`-z2Nx0PKyO@9CcbY?I+OY}OiYYa=_0A#>=$G$7F&g*>8{#mReKN}=~ zHg9~UXz5ftSiCFP-m90q`Kbnzq1;@tMtYU{s~*ku|1Wy{I3>FNi4rBY7X7NdpxaHa zt^2@&kXvgzMHP!{Ke?TGBOxdYslWVMVnt^7*hlG6D!I{w+FOhGHaR zG3(@PT#fe~ygLYecUg^qlBHi|w8(FQIZ13S{y*uFy`3B%{@!wKH`lJ2)XuLRXfi1^ zn}3eaUsKv4_RBX2?2Jxm=`kXADvk2A>bX zz5bA^W}#8~_&YU}YUk_NbuEiM30HV$kQm6+=j0?d_j{+M=LF%gJ;Ck&&G3ESHj@!F z3-lw9G;rZgv+5(?j%sy;+&REBQtm;j_0gK46C0L%F45xne@I9s3G|Pxi zyU$e`%t9&VO0&jLcNsbjo+#AdX9+O-yru%WPOBS1h6f-^(Z1goJq1WK(piaWGz~eh zLxCeK*Gu<6$|NYa7X{%4a++PlNM7XRnTkBbE!s_iM)-^8@=bBe=-s(u6QMweJ{sM# z?B86Fniltf9LySfl-rygR20JT=jR>l?^;4Bpfl4)7_hd5CeLA9sQF?*LuN14KCacH zuC81?!UppwuN6B%@#uecR-~=1ZCX}yIaKpoyG~ei#4sqYM>QVQ&=W3W{?mKb`*+!X znr0afb&jJP_%1;u7Ae678{1|t4Dr7qI2JXU`r-Y2-SUU0F8i5Clc3(_@Nj;n5y#2Y zZv~V?d*H)VoJHUUD-j^Rf~qlGY=)K2F?NS1)`yU+61EGyLT%)5m&EFj;QO98G}@~#>tD4s2CQ86?# z84FyRTe_24*m8f>-%$s5ipgf1-U~g6ZA069W$g0mch&jp*X^NJmMcmiLe1+E@ZND! zX=Upd?@T7@D0$_z7D=cC3+-b*{hZzNZ=Hb zp)gp1%fc!6d;2kpd0#Fw)s=S28+MCbM6(?x+xdW3tmjW{8a+laIYS ziTyh{f1kE#>ufx!@WhX5l_>10is`5kgkH5axo+?pR|=;PssxLV4KljyQ)Ca~?bR~7 zokBzKMq()2hrcKDUhk4f@8%Jj=>dLORsQPfZjW-^)Kp>I1FToSo@ZPyEe4}CzHt2L zGGa>p+b%IS;1fD)rLb(}geRs~;^KQT_-!UhnU^4=+U`fWt;v0fcR7T6BM>{i)X08Y z{av1GWE^WKjnB}$qt>Z(X3=nh!xTdunv8g6wtlf=e{$*0%;DOhX8r8t-c1Roe@pZO zp6Ah**ViUnZ#VcXr$1SFt+aRIGDcl3bD&NCCeD^L1+D6f>kiRCVTsP8VxX>p+*)@) z_(y!`+j(@*&o>O%$Y~7_P;tursl;m6L}-hu@Ad8oS*V+3=El9KwF|Tz*fKjs+(b4S z8iFIwzjc-Xzx56Ks9-9mmhe1FGecLcGL75=RBk#gon|G?EbBPIJ-VngV8IEzJL+)b z53|_%uOGoy66*-R+|_+e=LRM ze9IUaEdtb^C9_KQUL3tVQi(_IUf_Ifdq78eQ8m;%B~gy2sXi`lsPL`0`VVFDzxn5? z<|<>;@xgJecA5)^Ev6Qt58aNsX)##Iv!Pu*CRzF)IHdoT?mZtg-F7we z4T4XAcBiju0w--Pw0}4nxUk)JIk}F|Pgs+ z+D&X=EES!tN3Dxjj^37mHK+0QmZoD9Ru7sZA<8}16k^*~YC`HyON^cPaO%JC`C@1D zaMi?0D$CwewCWzVRkadKJw*7-*!zx&yUnp(g8ToG?LD8=-$)#i z+i=V&xuyyB1|(xokQVc@!DZ`XX3TWhhEd%P3o5nwSbLz2Ed?d{eDy~2&%R|pANoH zsxJF`v)SJF(TYdQ7(D>7&PiV6@*7ajHn!>!FRXYyL)zYj?YyJEeEH@6O zqpg-~Pd~VeDrl(K)bZZ?!auP2lBDLhvC;~D3FV!0)R?`ZJmn%9xRJt@dMi8c@nEQ} zY2mKTDrcH?kVY8x^1zwMGutRlh@o@oQ4gxky%n7YL5x#b5mVLtvgdPOXz zGvtsM5;UR18IxW>I1T3>IEs17+qrsv^N+QEDf~YrXoRV~tnF_`GUn4z=(7F2#d7q| z2Sf^6qHC)H^Sd_YM2iooEUqGiV*Kz>TQ+Jy>fyGehyO(M59xpqTYZ_ah6B7Sfsw<` zuy#m6A7P$4`Y)3luVs&}ae?Yu3=E^8e7VCFNeiK6Kn`=bMGihFcrivpTYi4y1Ou)cN>&BNMd zFySx<3G|xuZjC$Ih45{@nHWCiCwF5VR_oc=nq=f^6e=$uHjW3_eeR?w?S&U<88%^a zYv4aivVQ(xN!}IMH10XXw_<<_ZGqiRPmLHQ#e~rXGCtEC=@Q0Nm_hF?-HXsM9{E(s+ztAd>`1BHxeg9OcNG=Rwvv3 zn4Sf4k>8(n)DG!2XHM!3Ow%#y<+wB`D^&%|#Eq>C9J<}wrkK!sZ>H~v>ZvxjX5j)g zJoqDPzNMdeH!EnE%!Gj3-BfyO3c1=7BQGr1vb}JQ<$@9=TcR!u=ELX{zD2bOObZ$n zqcM0foPvW_WeV)n9VqT9;w>;F;N@4OV{zdhqkK_|;cdccz4mO4kn8)_G{Pj+j%4(K z&&`J-O6>Jp&sklcBeCBFUJ+IlsGTAk(0w5)eO5>f5p0BxcLqZb3GGdg<<>Fw%O3m0w^FpC zuSw6Mm&_q2NN6Fqm*Q6^CH4i8C8E3cZ2G3~Bbe{Rl=AeP;7yLyDWDiiY{X3lAj!c` zI`(SYzp}~lGh1Zf*Ih~Lx|f>w=If=n#aN-N9q7ulU$({g7WY)XX0j7G`?Dy@hnZZh zpT5dtBKqwo0%Na4+n3328ayxYF+oz1w8J+=uG|VQFOU<10(ynM{$3?WupQ-4fijH_ z!*TtEPJ&mh?MSZ0qEo%*r=?Gftu=Wk4ERa@>;ZT~8|ksF2YHLD9zHdo3z?ueOTDC> z$B;*|D`m6Q8u=Cp>GiP-p~_z=o%;Dhr2~|9^&Az$Wb4)CsZis3;wMfD`%-+Ht0rZc zgZ$muHQW()y&WqBO0*)=BX+nym|>|q%o(}>E9?;+O=xMO%uGsh=imS!GU)b>0tO%T z4xB9ze5vUzI9q**O^4LE4_`C>QVGdzJUJiT-f67R#LRn!ZXaw7@>#w0z5H2GTyF=H z^r^0FW^mlCyCoLzx_n$4+EEM-+T!kJrzST&fkYV9DPg?}l|L_CzeqSd+o>zIjROKr z^3#~>Q7K8WXkXWp)Y zcWgXE8S}2NjeJ3OVV50QJNqcxB$+M-ZJamq_D1M5E6FAayxowvHq+JDb|3>D3W}L_}>Ft-rvz$;5O|v#67-xLJl0DtaF^sAR?U^9$`AO+i$A7c_ zySGiF3DYDg=gW0hoH%WPNu&tJ@yvuJ?ZKp_OxI zH(aY-^}+oO7m&`HdF(W59#(v#1{8LusgSIWSB&q$phVL~In>W$K$iNkiCKAH%Fn%= z-^&M>PdQGSU2*cMcFEdK9Ud_4T2eKf9&C$7B$whCFNwYi9#;Cs%&ZyABApU6kckG6 zeXs;!!}klI;HI^#*1J4arF4Loqf4XnT5WyrpdhwD;+wbZq^KsnuMS`x3uXcQVy{4p)S$1>(hsD@%!b zuuuS5HAMraxFRr3*p?+%c^Rr%w>!foFE+j|#757l+SJa}?O?s(JY75;${pq$QS6>L z{#@*Wa&gQ5pYRZhIjW)Zo}^mHuS4+ToN+rBVO>J?7M;9{m@3i z;{K4}=L>ZbH!Z>?g*jqhz2qZtp;xk-ua-ax=!K1Y=%5EvQO7-$f7|SzDgC?I_W;ON z^7}DD%O3C1d53w-oh3e7X+|^Eq0p-~z`k?`P&X_0C;5M_@}Fyj9+FYxD}9%IT=`I& z*Elg_ESW_!4dft)Xn|KCv5PA5WjsA+H&MITd--4=q3kmIR(9e>T%8uFouOOv^~eHM zs8`#T=b8C@F}&DvGA&X9GxwI!-t6|gyprP)wlex95H&^#(%0zrLMOss45$U97c+Zy zjWUN?<7P%Y+(WHV*4qv9b=#zYf)i8)P>HhnOFu5ih;CSE^n8|RX;?^t@>sxAs7B zr>LHkOqRv>7edB2woRHlD~+V7d%GFsRmRzTW`0qOJ5*j>MY2eN8ec4Ce5D=mcZz&& z_WX%iK$<+NMv_)J{dBN6HLYm`$Y^Qpo``!<<2|4xm8`N7nPulNRqJ1}7zXggrx#&X z7Za~%T=UkRALf``f*}Ia=Czj#Ea~mp_ksdLKpHNTZ2WL72s&d;Gp$UI^)qm%*1^RH zIR{gxPnI~tYgyv?7J4XZ($;_`(;eV%Kgq%yd-hjPXG`8~Qe0eR69LZ_fez76-r_)& zef3q^5aqc@6DaM#k>3>a)!U{Btw_%p3pg>uC@$~$HfeO;VBP_)YB-+#aw=;2xF@Bm zVw`W0AC_OO9|fpfsaThC$>Cp?gYnf*!l=(ulnLmd-~6$Wn^NTnB zr0z+|@vsJq%MGJXAU$miTU~a>NChK~w|OMF_CdijDabqblW)IV9i3yp7>Z zDe+SPkh^0?qfeKw>~O&&i+O+X0y=db>Z8BBYeCgL`1+n)v|{DWfo;7Q)p8kBgALI1 zMJpTda!vXsq4j~6VSA1hrU+k6H?My=;oM#@)H1C<9HQfF@RIK%XCT z-nSlsVu>=Vy-)CmnXkAL!j;bTU`hI+EV%;s<0?3bs~l05&T*#Q*#nk*0T);$j4vi6EPviDQrh5cQZ3H*%2;bIf%6+1rY*~sMR zlA1-F$`xE}8u@X22N7R2RoLXVNC3#>xAwT!)q#@;W21VebXVYr4m+CBS{sNIX7lnr zyn=2voM;K;xCB<`L(|13Y;}Y}B~T;`}VZ*q=KvpQwy}71xTK2UWWh`$>-u zaw~62@f_AttjxK5%K%y>t`C5JS)QWmlV*Cz@_fg6=6o)0X`%JSu^n10#WuEYaY3C4 zzA$}%0Y3E0v71;wdrgm&xY+y65I^$!CaX-D&9N>Vn9-{3wy&cPG*g_~7 zXs&-f-Q568uj?d)c}@qB>rh>8=FLxqqV6#Mcp>`ftk+zX?yvFY6;4iw%T403G-Sj|E(MSxYomzc*I%OUDjlsj z^P?eU>}%@2s8(ah`A`1!{NKVh4&3W{^};5HBxORKu5;&wxPPbS`&8Q@m2*Z2`yAyI zS;5|MzdvM#1E0wDTQD>#-csT+Moo@frj>vz!JFBc<;~UAu}Kr<#3MVHm*(;TlcWQl z_g<|t_ZZ&2&^o8tLg=^l&AHe+{k&<;aTyYd=pvS)6>}cdS5L%qrM0$aZiS*xddOy5 z2Ge~V4|zkc{7)*Ct1QXEpJhud;9ytpE$NxG>incfBgBLn?*?yEX7G~Xcpa!Z~i zHx;H_TM(}`45HQ*IG{1_ORt2*Jh`g;Ie&u2pewQdK%4KTdvVQCi;PaE7^&W!x3k+$ z=9vaKE`s!4p}@_oOGH<9$CI=@G3TbO&V|L|FMJ}C_R4$_DFoDpHSyOYNN*(I%1dF( zM^`;p107qpxm7|B|Gw_}SotunpK6kvcH5OzNbD30COcTV(FNvJ71j zFbWk3M{+R=Rv2;g&S6)Np3wVl~v zk75O-<#C_pXZO_~e(B_}Wba8{BU_AJtXSphybP*_JnBI3$Ihxv!Hrge&1m-F9whV5 zl>!J?Dg%TbxqPX4?$FT(mq#mJhNUxKlRNJohvz7D?g)5da+n8IYv8<9+`VZZ=REYt zoMX<|+RlcA+hlQrX+W$Wl!h9MR;!BIkDn8iK`$OJ5VsD@+~c$>_!C~Hb*K*{2LKB5 zVN|_fP6x50-Tj~Xh*pA!l|8>ni$mGH7^W>7`%Twrfm$F9C2fqZiB&=}(jX9n1orq| zwOsY2bPP)?on~N|dTGLxOF&jURqXbOdHG8}Osf`lciWSRN&Zi+K#6x;frVO!hl{#q zI+Kq01dSBzz;TuGXi=0qSW9Stv`JT}cuXi%i5w>>o8{4!v^(HJr7_)zV`#2i#DrO8znl#Yg2rOmAopEx(ohO=@?fBI7D{2%M_XE9s;GZZKPdno>?J7u>&3xOGJNvSjr zu-)?8u{JUragtB7v3JWdwATrO2Cf`XXuH02M7Q<(B6>8npbPeCExbuP;*3kF0JG`o zxCFrDd3ANgg5g+`f*yKa{qFMYeXz9NIRrkrhE;u$=3AQkq(sJ{-J_ z3<0Y)S7RENg_L~<$XT9XS|m2x%R9)4FF!Hsw2m?k*DL)qJ^y)}vf>huPljl!d#_wr zn1oY@o>-#35nILhmHS{Q?U#qBrZVgu&OVM+Yl;=AbE2y^Q6j62Vrg?+yNu0EdF3IH(CQ7k*(D<6hT@b{X?@Ot70WV7%H2N~;Qz<|zo7x; HH$DFYeAL%r literal 0 HcmV?d00001