/harvest — distill a finished project into the wiki
Vault: ~/Documents/Obsidian Vault (read its CLAUDE.md for full conventions before writing anything).
Argument: $ARGUMENTS — the project to harvest. May be a filename in projects/, a partial name, or empty.
Steps
Resolve the project file. Look in projects/ for a file matching $ARGUMENTS (fuzzy match on filename is fine). If no argument was given, list files in projects/ with status: done (or abandoned) that have no Harvested: line, and ask which one to harvest. If the match is ambiguous, ask.
Gate on status. Only projects with status: done or status: abandoned may be harvested — the whole point of the wiki is that articles trace back to finished work. If the project is still active or paused, ask whether the user wants to close it first (and if yes, set status: done before continuing). Never silently harvest an active project.
Gather the full story. Read the entire project file, plus any output/ artifacts it links to or that reference it (grep -rF for the project name across the vault). The article should be grounded in what actually happened, not what was planned.
Distill — do not summarize. Write the wiki article as the reusable lesson, stripped of project-specific narrative:
- What is the transferable pattern, principle, or pipeline?
- When does it apply, and when does it NOT apply?
- What would you do differently next time? (failed approaches are often the most valuable part)
- Concrete anchors: one or two short examples from the project, kept brief
A reader should be able to apply the article to a new situation without ever opening the source project. If the project taught more than one distinct lesson, write multiple small articles rather than one grab-bag.
Create the article(s) in wiki/ — plain markdown, no plugin syntax, no emojis:
---
created: <today YYYY-MM-DD>
tags: [relevant, kebab-case, tags]
harvested_from: "[[<Project Filename>]]"
---
# <Pattern-style title — name the lesson, not the project>
<article body>
## Related
- [[<Project Filename>]] (source project)
- [[<output artifacts, related wiki articles>]]
Check wiki/ for an existing article covering the same ground first — if one exists, update and extend it (append to its harvested_from) instead of creating a near-duplicate.
Cross-link both directions. In the project file, add under the title (or in a closing section):
Harvested: [[<Wiki Article Title>]] (<date>)
Link the new article from any obviously related wiki articles.
Update the maps. Add the article to wiki/_index.md; update the project's line in projects/_index.md (status done, harvested).
Commit in the vault repo: harvest: <lesson> from <project>.
Report back: article title(s), the one-sentence lesson each captures, and the links created.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as harvest_agent.py and embedded as the fenced Python below (sha256 7dbd8459d682d355…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to harvest_agent.py first:
python3 harvest_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 harvest_agent.py # or on stdin
python3 harvest_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""Harvest -- Distill a finished project from the Obsidian vault into a wiki article and cross-link it
Generated by the rapp skill from harvest. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability. The brainstem
# returns this to the model, so the skill's instructions still drive behaviour
# -- now behind a typed, deterministic tool contract.
INSTRUCTIONS = '# /harvest — distill a finished project into the wiki\n\nVault: `~/Documents/Obsidian Vault` (read its `CLAUDE.md` for full conventions before writing anything).\n\nArgument: `$ARGUMENTS` — the project to harvest. May be a filename in `projects/`, a partial name, or empty.\n\n## Steps\n\n1. **Resolve the project file.** Look in `projects/` for a file matching `$ARGUMENTS` (fuzzy match on filename is fine). If no argument was given, list files in `projects/` with `status: done` (or `abandoned`) that have no `Harvested:` line, and ask which one to harvest. If the match is ambiguous, ask.\n\n2. **Gate on status.** Only projects with `status: done` or `status: abandoned` may be harvested — the whole point of the wiki is that articles trace back to finished work. If the project is still `active` or `paused`, ask whether the user wants to close it first (and if yes, set `status: done` before continuing). Never silently harvest an active project.\n\n3. **Gather the full story.** Read the entire project file, plus any `output/` artifacts it links to or that reference it (`grep -rF` for the project name across the vault). The article should be grounded in what actually happened, not what was planned.\n\n4. **Distill — do not summarize.** Write the wiki article as the reusable lesson, stripped of project-specific narrative:\n - What is the transferable pattern, principle, or pipeline?\n - When does it apply, and when does it NOT apply?\n - What would you do differently next time? (failed approaches are often the most valuable part)\n - Concrete anchors: one or two short examples from the project, kept brief\n A reader should be able to apply the article to a new situation without ever opening the source project. If the project taught more than one distinct lesson, write multiple small articles rather than one grab-bag.\n\n5. **Create the article(s)** in `wiki/` — plain markdown, no plugin syntax, no emojis:\n\n ```markdown\n ---\n created: <today YYYY-MM-DD>\n tags: [relevant, kebab-case, tags]\n harvested_from: "[[<Project Filename>]]"\n ---\n\n # <Pattern-style title — name the lesson, not the project>\n\n <article body>\n\n ## Related\n\n - [[<Project Filename>]] (source project)\n - [[<output artifacts, related wiki articles>]]\n ```\n\n Check `wiki/` for an existing article covering the same ground first — if one exists, update and extend it (append to its `harvested_from`) instead of creating a near-duplicate.\n\n6. **Cross-link both directions.** In the project file, add under the title (or in a closing section):\n `Harvested: [[<Wiki Article Title>]] (<date>)`\n Link the new article from any obviously related wiki articles.\n\n7. **Update the maps.** Add the article to `wiki/_index.md`; update the project's line in `projects/_index.md` (status done, harvested).\n\n8. **Commit** in the vault repo: `harvest: <lesson> from <project>`.\n\n9. **Report** back: article title(s), the one-sentence lesson each captures, and the links created.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = [
{
"cmd": "grep -rF",
"line": 13
}
]
class HarvestAgent(BasicAgent):
def __init__(self):
self.name = 'Harvest'
self.metadata = {
"name": "Harvest",
"description": "Distill a finished project from the Obsidian vault into a wiki article and cross-link it",
"parameters": {
"properties": {},
"required": [],
"type": "object"
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
missing = [k for k in self.metadata["parameters"].get("required", [])
if k not in kwargs]
if missing:
return json.dumps({"status": "error",
"missing_required": missing}, indent=2)
resolved, unresolved = [], set()
for step in STEPS:
cmd = step["cmd"]
for key, value in kwargs.items():
for token in ("<" + key.replace("_", "-") + ">",
"<" + key + ">",
"{{" + key + "}}",
"$" + key.upper()):
cmd = cmd.replace(token, str(value))
for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):
unresolved.add(leftover)
resolved.append(cmd)
return json.dumps({"status": "ok",
"steps": resolved,
"unresolved_placeholders": sorted(unresolved),
"note": "Resolved deterministically by the agent; "
"run in order. Nothing was executed here."},
indent=2)
if __name__ == "__main__":
# Standalone entry point: the deterministic layer runs with NO brainstem,
# no framework, no install. This is what lets a "simple SKILL.md" platform
# keep real determinism -- the host model shells out to this file instead
# of improvising the procedure in prose.
# echo '{"arg": "value"}' | python3 harvest_agent.py
# python3 harvest_agent.py '{"arg": "value"}'
# python3 harvest_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(HarvestAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(HarvestAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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
1---2name: harvest3description: Distill a finished project from the Obsidian vault into a wiki article and cross-link it4---56# /harvest — distill a finished project into the wiki78Vault: `~/Documents/Obsidian Vault` (read its `CLAUDE.md` for full conventions before writing anything).910Argument: `$ARGUMENTS` — the project to harvest. May be a filename in `projects/`, a partial name, or empty.1112## Steps13141. **Resolve the project file.** Look in `projects/` for a file matching `$ARGUMENTS` (fuzzy match on filename is fine). If no argument was given, list files in `projects/` with `status: done` (or `abandoned`) that have no `Harvested:` line, and ask which one to harvest. If the match is ambiguous, ask.15162. **Gate on status.** Only projects with `status: done` or `status: abandoned` may be harvested — the whole point of the wiki is that articles trace back to finished work. If the project is still `active` or `paused`, ask whether the user wants to close it first (and if yes, set `status: done` before continuing). Never silently harvest an active project.17183. **Gather the full story.** Read the entire project file, plus any `output/` artifacts it links to or that reference it (`grep -rF` for the project name across the vault). The article should be grounded in what actually happened, not what was planned.19204. **Distill — do not summarize.** Write the wiki article as the reusable lesson, stripped of project-specific narrative:21 - What is the transferable pattern, principle, or pipeline?22 - When does it apply, and when does it NOT apply?23 - What would you do differently next time? (failed approaches are often the most valuable part)24 - Concrete anchors: one or two short examples from the project, kept brief25 A reader should be able to apply the article to a new situation without ever opening the source project. If the project taught more than one distinct lesson, write multiple small articles rather than one grab-bag.26275. **Create the article(s)** in `wiki/` — plain markdown, no plugin syntax, no emojis:2829 ```markdown30 ---31 created: <today YYYY-MM-DD>32 tags: [relevant, kebab-case, tags]33 harvested_from: "[[<Project Filename>]]"34 ---3536 # <Pattern-style title — name the lesson, not the project>3738 <article body>3940 ## Related4142 - [[<Project Filename>]] (source project)43 - [[<output artifacts, related wiki articles>]]44 ```4546 Check `wiki/` for an existing article covering the same ground first — if one exists, update and extend it (append to its `harvested_from`) instead of creating a near-duplicate.47486. **Cross-link both directions.** In the project file, add under the title (or in a closing section):49 `Harvested: [[<Wiki Article Title>]] (<date>)`50 Link the new article from any obviously related wiki articles.51527. **Update the maps.** Add the article to `wiki/_index.md`; update the project's line in `projects/_index.md` (status done, harvested).53548. **Commit** in the vault repo: `harvest: <lesson> from <project>`.55569. **Report** back: article title(s), the one-sentence lesson each captures, and the links created.5758<!-- toaster:generated:begin -->5960## Run this — do not improvise6162This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `harvest_agent.py` and embedded as the fenced Python below (sha256 7dbd8459d682d355…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `harvest_agent.py` first:6364```bash65python3 harvest_agent.py '{"key": "value"}' # arguments as one JSON object66echo '{"key": "value"}' | python3 harvest_agent.py # or on stdin67python3 harvest_agent.py --tool # emit the JSON tool contract68```6970Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.7172````python # rapp:deterministic73"""Harvest -- Distill a finished project from the Obsidian vault into a wiki article and cross-link it7475Generated by the rapp skill from harvest. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""7677import json78import re79import sys8081try:82 from agents.basic_agent import BasicAgent83except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.84 class BasicAgent: # noqa: D101 - minimal stand-in, same contract85 def __init__(self, name=None, metadata=None):86 if name:87 self.name = name88 if metadata:89 self.metadata = metadata9091 def perform(self, **kwargs):92 return "Not implemented."9394 def system_context(self):95 return None9697 def to_tool(self):98 return {"type": "function", "function": {99 "name": self.name,100 "description": self.metadata.get("description", ""),101 "parameters": self.metadata.get("parameters", {})}}102103# The procedural layer, verbatim from the source capability. The brainstem104# returns this to the model, so the skill's instructions still drive behaviour105# -- now behind a typed, deterministic tool contract.106INSTRUCTIONS = '# /harvest — distill a finished project into the wiki\n\nVault: `~/Documents/Obsidian Vault` (read its `CLAUDE.md` for full conventions before writing anything).\n\nArgument: `$ARGUMENTS` — the project to harvest. May be a filename in `projects/`, a partial name, or empty.\n\n## Steps\n\n1. **Resolve the project file.** Look in `projects/` for a file matching `$ARGUMENTS` (fuzzy match on filename is fine). If no argument was given, list files in `projects/` with `status: done` (or `abandoned`) that have no `Harvested:` line, and ask which one to harvest. If the match is ambiguous, ask.\n\n2. **Gate on status.** Only projects with `status: done` or `status: abandoned` may be harvested — the whole point of the wiki is that articles trace back to finished work. If the project is still `active` or `paused`, ask whether the user wants to close it first (and if yes, set `status: done` before continuing). Never silently harvest an active project.\n\n3. **Gather the full story.** Read the entire project file, plus any `output/` artifacts it links to or that reference it (`grep -rF` for the project name across the vault). The article should be grounded in what actually happened, not what was planned.\n\n4. **Distill — do not summarize.** Write the wiki article as the reusable lesson, stripped of project-specific narrative:\n - What is the transferable pattern, principle, or pipeline?\n - When does it apply, and when does it NOT apply?\n - What would you do differently next time? (failed approaches are often the most valuable part)\n - Concrete anchors: one or two short examples from the project, kept brief\n A reader should be able to apply the article to a new situation without ever opening the source project. If the project taught more than one distinct lesson, write multiple small articles rather than one grab-bag.\n\n5. **Create the article(s)** in `wiki/` — plain markdown, no plugin syntax, no emojis:\n\n ```markdown\n ---\n created: <today YYYY-MM-DD>\n tags: [relevant, kebab-case, tags]\n harvested_from: "[[<Project Filename>]]"\n ---\n\n # <Pattern-style title — name the lesson, not the project>\n\n <article body>\n\n ## Related\n\n - [[<Project Filename>]] (source project)\n - [[<output artifacts, related wiki articles>]]\n ```\n\n Check `wiki/` for an existing article covering the same ground first — if one exists, update and extend it (append to its `harvested_from`) instead of creating a near-duplicate.\n\n6. **Cross-link both directions.** In the project file, add under the title (or in a closing section):\n `Harvested: [[<Wiki Article Title>]] (<date>)`\n Link the new article from any obviously related wiki articles.\n\n7. **Update the maps.** Add the article to `wiki/_index.md`; update the project's line in `projects/_index.md` (status done, harvested).\n\n8. **Commit** in the vault repo: `harvest: <lesson> from <project>`.\n\n9. **Report** back: article title(s), the one-sentence lesson each captures, and the links created.'107108# Ordered commands lifted verbatim from the capability's own documentation.109STEPS = [110 {111 "cmd": "grep -rF",112 "line": 13113 }114]115116117class HarvestAgent(BasicAgent):118 def __init__(self):119 self.name = 'Harvest'120 self.metadata = {121 "name": "Harvest",122 "description": "Distill a finished project from the Obsidian vault into a wiki article and cross-link it",123 "parameters": {124 "properties": {},125 "required": [],126 "type": "object"127 }128 }129 super().__init__(name=self.name, metadata=self.metadata)130131 def perform(self, **kwargs): # toaster:generated-perform132 missing = [k for k in self.metadata["parameters"].get("required", [])133 if k not in kwargs]134 if missing:135 return json.dumps({"status": "error",136 "missing_required": missing}, indent=2)137 resolved, unresolved = [], set()138 for step in STEPS:139 cmd = step["cmd"]140 for key, value in kwargs.items():141 for token in ("<" + key.replace("_", "-") + ">",142 "<" + key + ">",143 "{{" + key + "}}",144 "$" + key.upper()):145 cmd = cmd.replace(token, str(value))146 for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):147 unresolved.add(leftover)148 resolved.append(cmd)149 return json.dumps({"status": "ok",150 "steps": resolved,151 "unresolved_placeholders": sorted(unresolved),152 "note": "Resolved deterministically by the agent; "153 "run in order. Nothing was executed here."},154 indent=2)155156if __name__ == "__main__":157 # Standalone entry point: the deterministic layer runs with NO brainstem,158 # no framework, no install. This is what lets a "simple SKILL.md" platform159 # keep real determinism -- the host model shells out to this file instead160 # of improvising the procedure in prose.161 # echo '{"arg": "value"}' | python3 harvest_agent.py162 # python3 harvest_agent.py '{"arg": "value"}'163 # python3 harvest_agent.py --tool # emit the JSON tool contract164 _a = sys.argv[1:]165 if _a and _a[0] == "--tool":166 print(json.dumps(HarvestAgent().to_tool(), indent=2))167 else:168 _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")169 print(HarvestAgent().perform(**json.loads(_raw)))170171# rci-capsule:v1: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````173174<!-- toaster:generated:end -->175176<!-- rci-capsule:v1:H4sIAAAAAAAC/5W8Z5PjZrYm+Fcy6k7ESheS4J2mb0/A0sAThCFaHS1YAiC8JdDR+9v3JbNKUvf07N3lh8rka495znPOQRTy71/Cecrb4cvPzVxVP3xJ0qFYwqlomy8//+Wvr+9jPBTd58AXsRinoqo+wo+saIoxT5OPbmjLNJ4+sqGtP6Y8/TCisUiKsPlYwrmaPopmasH6tXgUH+EwFXGVfoRN8hEP7Tj+WBXN46OYvvzwJX2GdVel4+e1eVunXXhPv4lVgLkvP//9S1yFI1jy5RgOSzpO3D1tXpursLmD0W4DqjTge5cOWTvUYChJs4+v374b0yr74eM///OxhsN9/P7nj4//+JjacJzS4WdwUDqEU5r8+HX1L83H109djGPR3D/+6+Mvjw8w9QEkbj5eh/1Up1OYhFP4l1++dOEQgq/pMP7y5a8/3dPpu1++DGk/F0Oa/PLlh4+//PX734/8w6fIwHlN+zLUx6dgf/19HZj8evvP/7x5SKd5aD7KsW1+Sua6G7/7+y9fximcZnD9zx+/fEmHoR3Avf/2zj9+fvny9Ya//S7tz99u/ccPQKwE2Pi/sD9IP6RjWy1p8sPH3Hz7/WWdv/4ArDJ994eVL2sB83Yv5eyrZNr/okZcvza+VgALgi/AdP+84G3udPsBgKma099t9FMxpfX43fc//+/6vbZM7SNtXquBE/70y5cP6HXIT0PaVWGcgrG/vTzyy5cff/nyPZj75cuf/z9Y6g8n/f/Y8/e//9Omf/zj/9Ou//GbzHMH8Pjd9/9O0d8NCP79Tbm36sAR0/Dd22bff/+/W7RKs6ld0uFloSH9CcRyElbVdwAvf/pL+OPO/Rj89etP5Ef2428//fjXv6M/EMg/Xiq/Lvt30vwOhZ/CJPnu2xXf/ytuv60BejXJd6/D/gis/wbV7eO/M99rfdq9l/8G0/9mw++S/+1twrytkncY//wxtgOghO9+X/H9f3cYiOT0U9bLt8hIXqxQv/gSsB+w8/YRbW+mDF/s9T/B0v82SD/PHuY3ptsBiPfTh95O+YuW1nD8SJ9pPANJP/IU+BPA7P9VzN9CGjDl21qAc//+Cj/Al3eAo48fB/lFqkUD+BfF//HXfwACbgCi5viVB178+x8fcP5JwR+/zBiCEh/J/zk1vFPAS+FXEvil+aVxX5nh549f/29YbOO5BsKM8G9p4z3568d3QxomIDWMH78KKueI0k918usbvRnICB9x2yxg30ucjygFw+D0oZheBgmb7W2Z73963cUN9/cN4Lr/wV0OjibpV/vXb1K/pPomJhDyq04/fWgh8FL6VqZKG0DsL8P/+nXlCP/6A5jqXuksrD5e0z8Ar3ykdTdt70v/4z8+7DcMwe/oTyDlfAXDP933Ovqn//zPD7VtH/9y/FvPz8s/6nCK347+J/m/y+Z93z4nP9rmD3KOLwek3//0ccpAXgE591P/N07uxfIihwr46r1j/Nd712LKP379DLmfP5K2ScFVQJZfwwgkbfA1+fV7oEQ4AVMBdcD5v35NxWny868fL8j88E7v4fj4WPPiLVz6T6YFYr2s8Ck5kDaso+I+t/P4w2vT23zYy2QHkI1fmn0K8zKU0YDY+SbsvxX1Jem3kd8lBne9vZl/k/SP3l9BuAOftACkH232G0xfkr31/FqzgG8D4IaPKIwfL3V+A/naDo/flPoN8ePHZzT8GoKQWb5K1oXzCMT54atxUrBjeG8DwwPwDwiD19Fx1Y7Ajy8PDcBP373MCQqBLR3f+fVfdf6KfhAQAP3zG/cfevpi9/GFiQnY7Fuoguj6lOeboG9r41+t/U2ad3yNUztsL6NfXmH4Gn5F2/DP6P3ho6vm8RVwH7+289TNE4DQy2BZ+PIQUOFV372VeiXllzmHNAMU1cRvBb/79RvdfCL+jyZ8gzl8V4nv8Xc1CVS7vojzax055u1cJS/X3od2BqyWvPC8vt0WT/Oba/N3pnkVK68i6z33igTA9A0YfRuAeBngW2n7jc7a9/pxrutwKPZ3oHqAYNLfEfJbNfsp4JDOYxiB7wAsIIG9U3AB7k5esPqq1Y9jl8ZFVsRAvQGUm8AVn6n0xw/vJVnxeRSAWjMCO72P68IJ5A9wXjcUTVx01SfZdEWXvsLtf/22H1Q8SZu+zQ50rrbPQFz/OK4b18+5//XHW9e3Fbd2fmmdFNnbQy/cNOkT0GJRp/8L8E0IHJ68dg9tGOfgvBCgoc0mcPw7nlsAsFfF8VXoYfr+6x1C28Qgs7/K/hh0GgC4L0p4uXttXy4cpo9vxf/vXcRXg/0AiqBu+oiGIs3ex3Efr7zwAvdvvn9f+GoyXop9Jtavnnl3Hk26gkgAaHglizdrAKh+vAOkBch4Metrz9jOQ/x7YPxrRE/hfM8noOXwQgAIpJcO75zXgNlvLl/fCKkBUl9++hjr8JURvzHI8C3Gvm6/Awf/GIX3NwjJFwgFoNxXiH3d9d34PUDei6VfmIN/S1wAv2AQYPORtGvzAvcrFu+vxmRrpvD5HknrtizGn1/HA9P9+uuv39Z/eubHH98/4/elyc8ff5raBDDlDXx+1LQfRfHP7/kpvAOf/WVIq3QBHPVySQQEj8MRIPE1+Vmz/8auf3s58VUB/eUvfzK/mk/+mp7+/Ne/fi133re/f/uPjz+Znxj/cZy2l9uKCfz7VdE3D7wM8s3Gr7D8g2f+/PWUP31zetQm27dBkIcvafXS7uvAjx//XqiP7/7Z/9//vvqT2H6ntR8AAt9H/hMLjC/Nvlr5611CnoJc8c1v74zeAKS/MXP/DaPxq0r+DYQvZT+57Cv7f7UC4P8XYt67gQRzl4TTZx8NQjR9JYhXonjX1C/Uv8umf3YIyNuvGu7F5oCP3j5/iwHiIxx+TOauAsXplL6xSH1i8bcGPQKlJgD7kH7Wfy8uPDX/Wy0D+CZJPl40/Mnkn258VQ8AleE7rb1uHD9P+dpD/KF8eBnbe5mU+2qa6+uAt3P+9FL3z9//+t6ivkR6XfCK7G9mfBPHKxG10VKAYgIwwb9101s/+qWf82nDz1qkeyvFJcm/8sen+/72Kpmfrwr0f36z/R+0/7/Gd+Hzz7XU71sAtt4J+52vf/g9Tj7rU+Zt67aui+kz0H9LdkCBrv35Nz+C+PwMgT9/KvunbwHw6/sc9rPM7ACdgnNeZcrPv+vxMiRgkh/ehwMpfhwBwb+z8OeRHymg9I847ED/9SozXsB6x9w7fX8liJ/ePUGcNuNvj2Ve0fP705jXg5ffnoK8ntYACUH3OhWvpzp/B03EtycMn894pq17bW6jlxagZfkCOG36fGzzWtwBSVJwbvI66d0qvX6JKOJ1ITGeuM+PANMuSUVK5KnqnO2QfJvSc6jOz922JUZpZgnJT3fNeugi77hsqZ3Ew/mQDk6ZjRa7NsuDXWWsWaKhOePNzvpOerBvChob/k4GgOmuCGs2soP4VaObzXbTXDm4+BIzYgFUSUFFqfW+aMXcVKYOC2c1qPx292y61PeTXae6G2euKvWDqDyXFh2RkWj7uD4vQe/Pu1Bv47JaF6ia5Mpd8IFPqdz1eOsawrZdj+aZcSf6gGzRhXAMtaS1a6rUMxRUJek5rNDPNesHHtgRkK2eOVaDcBQT99u9GMg9hXbPqnj3IimuB5+hXUXdmvMq0sSNbTIPCjXOI2ecdoaDLX7LL+kFYvZG6Uug8xWD04tUp3Lij14ddRucCSlceezsRTrqXzK83TmSPXvbsiL9wITyVJHHLc3GLZUp+HCBrwR5wn3DJdM9K7tneGvHWb1GZnQdlPKqS71Y+yt09KuaoYV5VBRkUJ+PUjoHXoZr1L41Q/Gk4zrLvAU/Ur4FCuRhqxGtLrwKm3ZaP/AXPniytXDL49volZV+ZSXFXwLKc1NFi/q7ejOQR2BSdLPvJMwDkgc/sqqix4WEqptxzDphR/GRsQf6HPe0UjcQAy0pEZqkBA8AUER2Dzp/jX0Gh/QeJwiK8NuMfZDMNIzmUlHksqAaxq4jpJByEy0wjaJVJzsmyc+MMlCFkphOE8hn82YTQmSaWYnA6WbJAj/vkBktByrMVfKGHEqOpjOv9rJ+21SY8VKcpHpzSVNzxFJY7NC+yNWGJWEGxq+0GsNpyncJnxMMNIgszqZE01cOciVHYl8y8/ZklB7HN4Tjd4qFiIOFCz3HaqCyz2EVMiIWYqtloWEazmI8wqlwzM/WPTXIxDpysjuzLr1l99jeBrtTluEs1okna1hQR1N1Oco+e6LkjLFQyfSfjrmcbg8tJdS4itU1OGXZFoaGtJzkI1/1SprJkXEc94dcSeLzWOeoc70rAmecpQ2wi1EKumDol5GlaeJ4t051qT44tqx3zaUWJROfos0kV6gjs/RcUVZpsV2aBQu3w8wO0TAMmbuJN6x5vxzTsizMHLZN9oK3AEvildYW+N41Wu+kY5Vxw8UhloXZU7mjK25quwCFPa5Baz1nriwzapbZ8F6ui53FDJHFMPykqD3fklxvQbGshYs5Es3D8VffEgyDgMOzwxbPpUvMdevdlSVKsxPECxO42sU5NdM1iCS8s0PnOtDMsG25CjE8BW+PKOEdIXM4i0pS52FwZZpCug7cbVZk6hPHDDk5DxrdivUgZSW2yEfkScNQYgcPLEVMoojLI5GZUj9tl2qGXJia/JUVYfxObux5Yfnn+diI5vP5MCEucupDVgYU6u53heNGHihaOpNiMgRdTe7J21WCE3t6YPSjzoutUd4FMlP5xTotZZc1j2PJiTJvi+cDuCkNKbFZlk54csxj5m9PELB6vYihrBoQQ6ELuJHuLRLRA4UWinakO8bEqBA/pbpa6zx2AUlwu+/GowMWpOUUckz3gqCZ32yup69oftUZyb+irIDfrBvTHGKuaRkbssS214MHedQrfmA5rhWZMdijUBuHRZ8BxaAhexrQirrSXHc6GOaWuzXtnhOxgiO9MVWhrNWQf67OSXwUnBNZ14By8KpqYeUhWHhLQbzg3VmCp+0eplrmaM48C/hqGIRM2jfLZLRiOlrylbvZTCAsat/GkNp2xsB4ib9g9z1IghtjLhcC6m93wyy1GFJo6khnXXRMrnWNzU/VrRLSt44MCPp9uErMerKfBVlrW9sfjXUx2bVdEvsm4jhxFgooy+wCE+kcppjTeUsiR0BwsyPpDr9pV5/uK23ce4zHy0N+CZqovR85UaMvFtZR/ZSqJ3ZHpCPv3yfec6e0TGvrQkaKf6cMj4OMWajuwXRTz6NX4Z7tSYBFhLrnXPq5jGo5eTIdygmRXCv0yHFdy2vCPew43ZIRo1Z7LLTMICXIh8UQuuUn1e4fiESDnYq/meOGOCHenqzhrgoY/9iC5+w6vHaPNqY4K41dmMfdvl7oB36eOnhJadzpRbRFNJEfM/a0+lFEsiozN096gABhAiPrecN6BXqAq2sqRVanCMSOCDKzEKp2QuR2xoyZWLT4cbrv69nazFUpjoxzugnzsx0GkB9UasL3A6h+EkcMDtX4PDOrctf7i6gFt4l93ExWxO9esEViBEjcXzHvuAR0+hToC99BnUnMZeBx5CFQGRBV3Uor+nGlIl0FQ/W8OCEihZxQaLqnFgIhXrHASg43Ud6UJkN1yh/MvDSqxDveLHdUTzfJErZQveRK491V/6GnV8DGnLQeUw1REGk4+FBVQqdqDSic30TuiK1DzfOnkstj4MH0lIUMheGkWPALacSXGBZK/3583IuYq8UYD1ntgtaad59viX4IusD3r9IGn4fqSIaBpcNmVG2AdNgbtGbmfYUTKLg2Frz71KzlsdVxEnREriDaTSbzu8yzpBMmQLKMj/pNiZ/HMrKwQVY4zXySIXwdq8SGr8+DpF7mBd63EVbHeUZ3JxtowIJQdkVpaImu9CGruJQxg8QzpdvYMwbbEuSVaTc9zcS5Jvb4AmXzXpzZ7F6jrwS7SfIlRW/TcSWJLDuXrKccAwyCS3imB+qeRlnqbezKkw+mXMaBkayKiOHj7hnLhbv7xRlFr6JDiKtgL7yyh4koiKvsb+VoMUJKRQxieRzjpLervPCM78/e5JYgs5DUDalu9qqf6JQ8sXYjzw1tnbjN9D0DfVwEh1qbo8PbnuYcJ4YuN07azis3H+88c7zu/M7fhZzP0pZwYiHgTZi1Ke58fuJJdVo4eM7ulzXib9yhx7rHCWmqO9PRT3JkEQzXjl14gNGzCS+VzvW302LuoUFnOI4F070o7Vnjb3sPEiH3vN5U+8FWpYXOAmuyeSlE9KYfIIYxjiV7KxtiK/wsNTvzcDpeysVXmGhmcDgzj6zORjBHX28nmIXwfWJxy7D0xG97x4Zhsr2XWIAY1wdtk0qb9lc8xBFRnq9BxybcfbwwZ03MjmwEwZwKq6QWU5PslaW2PUQdO3cQdCjPlLSIRwh5EIhxFg2L3G+QzBbnJ3nXymNoGZp80BvNPg/bUHS3ktlXJoVL3tD8V9VPx5R18NZIvCZHFmfIZ1NTMCccueuNn0qYMtYGXnCCbMpQMcwbo42If0QSMqDiJ482IEtjhNEMrOkgUF4zFnzskJRdsgbfyREtq4Y5IKA8XWCEwkTGrBooRAYmMFQmmWB4U43bEsF0YJuY3oxQSY6LvtMJlZVsYS44POcixY7lwk+nTNSiuyWKhEtK+JLBLL/pE5Ggw8PwSmBukrWyxSei584TaIZ3CWOCirJzUMPYp5mAlmvHzJeINEiXXS6goGfUEQd3J2rs3hQqiJQQJmT1Gec4SvgLSmW54koswqU6UpMdeuhn2IBmN6pgnKr1LvMzLp0NMWnQfZ2PEHkF1UlxnFvWmKMIYuvjnEGM2AHhI5rSg7M/0CydNrwQavSSyQoFNWy50vS+4GZbsrBERc2FhuCGQMcHGsBgqvfF5+GqiwM6NyrLSsmCUOLKzouAZAt3gOsWca/XhlpMLT+MBzRmtNmpX6UoHmyDFVO7eswZmqBIW28zUt3oaIRxVNYXH8U4Bik8c8eoNG0O14sCccVmWoGIJnOzQ0ayEWmTQCKJsDA8uGzKZ6tZwTCG7dmQwTCLYzBRPmOZwjeBBZUwNLc1Y0DDKTAuDmzCSaMaM57ATLWPUOLeYCfxZZ08WhwxU7yZyQ8GnHZmD8bdJHuwAYkhRzVB/oIZKF+orKUZcVzjK9zz5wrUYRfZIeh4YSaY5W7EYlOhQaRIS404LCognbgMTR8aaYvKTfZxOF5cP7mypnk3ywmemHaN+tpIITga7ngEebx43ogiQvm0yXz3qa8svJdZhezZlo1UAlcYY9r92tSHoEQs45qIUXJ6IDsB6cXhskqHplkI1gTQ7tmBachzPgyIVnDNDnRZQhxLzGZfm5YQWThrBike1mZ83KyrgaZe7rPEHhUIdaVYMnkikJ+nHA5lZpxvLrzwLAPbq5ksO7vhx/tTixGBwJZ76csIX2g1dGDCe62ZyWn1Cp1EkH2k6abiOQVXkT3PXAU0Xrl+4hDu2vLzaUHlaq7HbLKW4+xB1N2yyvqSHUFZ6qOpXjOzs4gxM1GqhiCnQmCIfizi3geRXAFUFtIilKxIQOqTABF+DwMQb7T1sHa+HJRwTrMFVmmVbVILOsyXCxyGRJohC1GbWRaZZGPjxJ05QhsFOJO6qgibadeDahRPdNsMZrBZNK0ejGje4MliZ/cYy8MuwENnhVZ5UrZubCAse8hQ44ig+sYRPQJWiVgKQlAjm7JpMRci7nyI7iaBkfJO3SgYshaRZM79/aKYjyfRlOvE5evgKMWI2yVkWKCfN2Q0WI4ILs4JcCQOsQZh9suew+ckhJMUvpbDoU49L2IyUMBI6HOY+jM8rPApba8rThXB7JsmTgyHI3PraimuQDuQDCaPIGi6XYKnryOEy3oTOzLCab/bpoE3vnk4jN7VY6lZwW3y1CR7TB2jQJ+wYL47t/vWXNAuXfEhuGFTNvMGsN9BvPbx6VFexHgXRV8WdKsg7pCUuyw9oGg7Vyt+nmepouLUpQSf5UnmmWzaMBb1eb/GEKobg56Ui6lushAcIm8zA8Muw1C5gqqjro+IVGPk0/DO4fVkK9UztqqkgyyMGp7W8+QxDH4UNdDEb5Xda9Di1gHtHwNPOkyaBY+OT7aPs+EtgXAotVwOGlwlZ99tUD7ZoDsSrzXX4/xZvRwep1J7sAezfHL9dtyQqw6tzvmSnC/OTe82dSai+SpEQ4KWkRCmaMeJDBasxtnltyl3cMFuoLgTR9tlcskVJmilygcz2f1DdK7uZdqeFiwJfpjILhqt9nw/gjKkx0urMg3VQ56+0iWLWIGmz1nHtgvtArqZ+yU4FV6Y1Xo7CzcqpC5rH2uHyl3hy6aUVnwdXOVeaeH93LuTVB1z/3ZdJ7y8Iey9l9tjsNnqHTTjHYHPYx0Y/W3el6ALT/HNQgXiWqvxeQNZ+8xEhJlP54SK227yHoXUB8Zcndp4blvnoAxH6XlHZWXIUYqHnrijZwdydrFKLWLRk9q8fFjPckmup1xxuk4A3SUnzPKxRCa2HbTopD2eYxS3ViWH7slVKxEecyzm/AZW9VjXTLw/ITa1n5GownU9a2+he8nV8hAmTZNojAkdhPuQ1VQnZ6owDJXNtDkhjZU/3CXPDzYjgAdQCJ78y1G8tjYiF9soge5dPgRjYFMxJlLhxsbldhHckVmWx/Rc7OzWS2O8GTGRFOF1PKdDyNVnrp6w5BAgVyYUqlwIy6rbxgEeQBdJKH0ijpJ9nbR4zKHn4j9loOwcV1oHNUwXhUTk0nc3o6BIQVgr38dDgAvISj/hBTPz6yF/FF1+nTNmS5wIcXNqvSgXaaZD0AoqRUo8l3N9pMjr0GTPUTgVOZbw67JIx/L8VDoNn0DbfC7dpT5cDdq+lpMxcc89bXbAHxd7CYIn1032IX92rhxthO9GqEY/Quq8XQdZthplCu4adbT3aS0qv+pP7DOSH6HBpxFPLOGhiJ+uUa3NBs0XKmVRZUl1erEqvz6lQ8BJcgoriUTakLnHZ4c0WWkkkmcRXpwraJfWjD6dm2pL98WNqUSpT5Hu2+LpQaOqrw1sf0btGSXnasJ6WuNNha1VcmLpNZzVji+oGNlOt+TILTYgiNOhPxhBMM2kNU5N1cijBT/887gssj/qVZuGPK8LdRYIWbuP2Gnrr7fpEmh+n1695ozJZ2KG2mO/gf3JmfAmzlUDw0zCVImcu4bqzxq69AdYMnXEgXlawQbFPSF3NMro1GhG/x6E0DJe60g7BGHigNiBlqdE5HbcW+nA1P21Sl2aw6NjNdXhKdLyyUGXM6aNh/ukB/YZ61GBE8N2qE431b0WvspNSrLtqTxOJ+WANRIG4SGxRiGN8ZlEtOc9vtd+djtVl/D0DDtx1Xp5YmvyqASN5/XHXEfJClTvxhOO5qraA6dZTHQrLxHnu2baSNUtMY3qNrN0rTzEy6VYaH3RH3VwMBm7vwZ5UJ9kJKZss8X8xJBOQdfs/umAbg7SLxwuyfNTqm9+/7y1GRJIlumdbrfwceyK2/1epsjxRkOF0jB5D7f0hGkRQ2LwDAr+h1zvxjRqF4PrnFtHgj6vKKb5qHbzlspaLYYa6Mn9hx0jvWncb4ZQI4RJN87x5qGS5CR8EWrARFbCMwsN6iD3GoqPNL65qeRSW4dxaNKmglgczMSGdGwUxspIZ6IIRLtBpTHLO50WhHS/baCRarVTos8XUrU93Hcs2qk8rOvu27nbMU1pZENYM1ajUSMaj6iVQuyT41D2eViPseXQ8xF2eonTk6Ranf0MitBh1Fq1xURueRwD4iDIhumeg4tnVcwyMFN10SLpyLUIU0YEhVMTLkn2QclCls5zv8CnbWAEGXR/eTLFee9xshscEee49CZRgGLnrvYXA0EEd0qHc6RMtn89OwXqpJZG2/kyERZFWTf/MUIXpNvkbme8A55jZTvPu0ahq41JYjvqxA7lLoxOOB0UU/aA/USOAdMZjv5UsJtFu+vVnNKzXiuVZF2r+l6JBUOScojHGjKfqBji0euUY/m1F3EhmMlgzdbqEuD+HYOFC+9kvHoB3chI7qAb87dqoC5VoikpMnfA46FhZF3XXS1sJ64ndIY75Gxs/QGgFxRSfKadfc24ypWrjnSizQbJYsrVxVVNDVj9nDL8LZpLtFIIIbgH0t1IyvxxpvCHbKTbTp00/MwR4bnsBJfhThiXajdBUjjrPnOiyBcS5+Un+jlIx+u9ES6jhm9sjlOVyYv0yBMH5+FIE7JtMuA0rC1jipcRtPbiO+iI9vV+C2WF1D2qHtfcvkrTcGbysbTxUS30EgHR3uCkACVXWz67Ec/bqtr4J7o69uNRTbHw0Yb3iqIx+uCYVyg/TNeSd5UHVhiew6cZbTBn2wMAqzpMoRxjkzYtwhRxbhVCmsLkRtztuI3IZ1Wdwx6QPmhd1QPmTNfT/uAaBRs30X4+rPxyW6mCno4qmjD+YDaBUWZ5yF7uRzlkmKxEF/dcbxXonZ5I0N7KqtBOp9LfR2ZAKr+MafdON5hGoJOeI1BjSXf74RnLrrcFIrd38hnwcm6hNp87RUspxOEyhhRJa3MCYnFYNN3fSL9DdbJmlNG4jgpBonLtpCy+UjvlD2cQt5bhEaNYIlg3ad7cIpLqnPjrAbGYVIsTSnS7OoB2z1UE+2Ic00eVyN7lcrgdZzUR0LzYFKrKY/qyu0hASiX9gKqFzQrVy7iuMH0BJ01xxbChZ0HD7nloEw2XwzQlXixWOrYFnhmhUG9rzINiqTtjbvNpZGPiUjA5NUdoAZUFyu86djiX9EG1Wr6iT3Y4XxVpk0B9nkK5k9L75DBn2Yfz80DfTz6c0Q40pLvttQKbRYfRWbjhdimuTwndz14DUYDYl9rLA7ZUbjJCFCZ0OWa9aZ9ZZbbvx0E4L5g4adohLMq+LZ2derTiMvIRzHc4U3cJVD1xq2XxnbohF/mKkv6t2tSxMCX/WFDQeBaOD451MZton/oeqBLuL3N+6jVmrDz4+DhU2KgKRWgTT7irvfH6NKotNkg1EuIh0euL53mPLD2KyU0f/KuTYs2xaFDk+pi6R+CzsmOq6NmeDqYUP0fQ3TdtfZpCDZe6RNqeUnPQNeJGRXedXTb8Yh0qnWePWBw9e3HX02CFkm1atGfH3QKXhe+efA2vB95SFwM9aSdC5I8sajuKoC7xoI62GXo+xlTnwg5enFStmLn0Skbr0qUyHBN04eSlOZ3yh6SoNJWp5kQ/3IkoSsEZXy0spNZ8hz1r8UlHLqfsS3Ycemav9U2ZDSlKZGQ6LwFj7fRdvbV5tmeRs1vNETlh0bwuCkY7Z3mdgkYzL355WkqOWBI6R8BEZxf6dIZOETVwW0rtN9AHDNQW1ixbWrSmyPdcfNaFFmuXHTElREGHnbvX8QRF9LVLFYjU3IdPjZeuYstm2raRoyvGo9AyRvUALcIb74/o5NJxgW6g7GHxeSFsNY3GZyyNxjofquLpslht2VI2eDDrm+cZRSlQdbsrJpbQ6K7INB7XnIxi0UkhnDnUKBuRI8C3Nw1rcDiVBkW7zORSTXmKyOE5ESeUtzJn5nz8ik+KrKZw2I0g/ydkWNWXAZrJyxyYohMH3v3udmfcyRgXbQgt4bVwJ9dOOqSS4QlKLkYjsSuqrqDt2Ua7UTpzh5k/ZQfLkAbP7p5Vc0LdAlcKkhuw2asvN5vHj2Pn3SK96IQbmjpWkzUxbjzXm2HwR0HZXHueayD88MzqFVYLzcZoXxAdseKvXSLMRR5tWmtpp+G5kcKhUpZ5JW/UMM7a07Hy+PLEe41w1NYmMpCNRcfEBfk8V/iMyFHC4JoN2ctkSkRCYOnlqeVIeY8YujoU83AO7ijh9a1SGAyy28OGxDQbpPjIDgjPjtgO+uITs6o9hwNGf97w6lkKe8qrykMBJawyq6A9KYsBPz1qlhBNgfGQw0KlZ/TMo0SXI4a7PbzI26fOr93UkQGHDkw4YWLgDfBhTWHfd7Exd4mRW+YLoyxtGIe4mQqPLZLEGRFOpdwgnMooSRo/kdrVeB2dyMUUZp5JrrmppYUnTcHVGswDVBo1hEe6kZar0Dl1EdTDxkYU7oFQPENExLn+ZWGWaeKc+oCtj22iDh5mddkx79DUl80Eg4xz25EJcVZ0OD1YtYwUgfTsb+1AW1xNGt4FYHIdE3ebJnuujlpTxoZMXvqkp2u6RbPo5Ba9Xj/xA+oYiSAf3OtI021FZoSsRGc0dABV1NvS+PvNV7stamNxsPu4za55FhlZcvUe61JjQRKaOzGE+9MULAMEqxRLUkYaKip3l2sFtbZq57u4TlZgHqlbHKGJfnne82qUBwI9K1RyiTF7haUoxYKdx7v4KipdTKOj9AwfFH0eFC803YeGbpZ+Mo9Sq6BTngCq5wVqUldraM8pC5vGOkkTqTOVGOMbohKdHQjXJIpyPT1j/pNLqK6/pVOAB/u5Yg6WT0cIhj+FNMUVlB6CAz0e3KfbiP3mHMt1yK9GZHuPBOPaR0g66rkVlD4lbwhFopSbKnfsWKuyF6ftGesCQupbWl79UK9Q2T4L+FEtoCaERN8tud1loVxG0nUz2JRyfUlSZEuw2bvg9+cwvFyGwGWSqgu99BaSPS0zg8X648yHpRLOY5wIrXzy9qZxEcnM21S6iJQQLdfGQa9H4zHZVzLsjrFsZA10J+pZ39JyPqizQ5c96D+ynnKiGMN9Rdb5IrJ74rHaJKhLCyG2MQ2ZbNQQH5bvh0lfnZ4mxvBYq7R3qmOR03TiN9e/O6tW+WctOS39Weap1LYxQ3+CAjrt9dMQPt3NSDhqq4WECG1bhUfBYu0a2rkEnum+xk5R1Ceqngurqh0l0wYNxrDC+Ql4RfBmAvFP7MoruLHHPV+9npzm4v1UaTpaBbOeyyN/Q58Hkt8eJLwo9ILKcrrxc0uoUWhEymlfRGo1FPo4nmaFktMDY3NTfy30q9ypnuqsc7lj/lFuvHbo53a53Ni+z0kOwNJHovqM9sl1rteZiw4Qww7pat2cniC3gbjuAnLmb012tVja5/a5zQkM15ZOnnL7xkyE3zEnHOHbDZXvE6OOTZAEKLHdlTnVTmXke32wrbEUzu5WYD5+ywXHPd4ekHwE5H5t+qOtzphEIAfCPt8OWKWcBd/AmnBwwjMWqMFpWmTXAcXpxrobgto+xt5Ar+veW5eSqH0y6anRxYi1kZ5ogsOxqZnssY1uQ7aAJ1Wel7f74y7ULLIU0Bg47LQ92pVySPhY6tgSbE61DmZKsb6rALoka/71382GuueayWWfsTBGV+fcq8ll7vujcTAz41ze+PBpzdTdaU7bQifRGm3JqcUTBO+H7jZGyTNZXPo+i+KtnszNOB56R2ZjP2A9NHdup1rm4q0hklrf57tcso2bHyvZvftaSd0iKZHFy3oKUqc6OUNVOmxJYqWTMsddt7Fmeub0IEtC0w0cy6g8UcaYB3oc9oQ+noveDXErSqYwjDr5tFbA2YhENZS2MtdrDZL3htiYCQeWc1nP7Ej0sU2d4I6+jHOweZcVpH6D2Y1autlLeTzi8SUZDhtqyVP/JAVVyDwazRzT2O39EPHywazrfNofMoNC9Gl+mHWCadxzXITONxaDW5675Qw1gSG6GwYYfkgPAuWxLR6CCtlpe0kVA+E4VllP6rdnY+Og5fATnJ8bKnzOZinmxxTxep7zUrfpXQIr1QsQXV9ujlYwwjQzZ+YOeYb1WCZ8eLLS0emWA+bznHKhw7xwKB05PErt7tb+4lvKZesVmAZ1NXX0b3AaBuJoj+tZBuWMd+WI28nF6i1JZ5S63BbZCe+mdKRmXwfkHx8Kga7YsIxqt9yUPXOt1ZZBdHlMN5zlecYZ2gu6I0bQF0q9FOXNrnzrWfXq8GxRFSk1ky357Ebyg3NM4h0W6byql8SXUTk/zDGf+CU9C1uiyxR97zF9H1mVYzT/AuEprV/iS4k+TzgmUxMkBuHWkQ6JPdP7hTwZrm/soHCxOu1SOaqwgDIm8oCKPXlvZm+7FbC3+DhHYYUbx+5TgAvEZLOTMHuYFgXR6cGp4VkwuhiaNUyV/Vok1WUZRtXiL5EtXaczD9KuncbyrBsgStqbeViupTqQN5QFXUHvQvMMqTgwpxOit4l4IMwhE4zlihE5LeOPCtTg97PGijhrxqwbqfV4jjXxNFdQ6NXCqD+uINbt2IzvrMTcH0il37fiDIV6ad/wAVKvjjGjoB8UmwMvkvGe+acA9xRvs+B5W6T6cUksMVUOka/yazEeFRpJaaqJDnuQVMbec+H1RGME1srKrso3g5gCJZ/j6mhPgnfiEtlikqhg8/kKoc/eadiMR7QzxI1b8lxpxWH9QNX1OdRmUQ3vwxOzbifjsOEGqBNtn9llA5JMeuBs/FjgU9muuntJqtQ75pH15A3Sji9n3+IKWGJvON5Hg6rIl7xEpsPcGKyWpy61rvY0xETdIkIBCV2YRimBSwFDownhpOru1SA9H4KsFjN7M/wgubvIxnogY1/9FIrV1Zi6PcBL39YmIM7gFDo6rod1BzCvbjpsefGSrUp/FJvkVnreWb1kipTb+OIWxA1NmmRzwtJwLHtiKK0SEM+9pTtdU2HiSbWyE3XKTgLL2AaxC9fyYI+lpILG64Sr9D3zpOvpxByHwIA90J5n6H3lsWsqmKitK2nR131ebyTywB1swkgvUfeJRcnzhFXwMgNc3xNtEZvLTpRBwdYJkCrkBD/gaJleoHEP/Jk4Z2k5XK5qczFyIun2Ma+w1uMLolGh8dbZz1q5HTjmmUjRjaz1SGGUu88CYAe6Rsa+xOse3Ub0lNCzHF2FcprkJyEjijz4BmhIJ5a/oGbdNEacHEXYMw5rSPHaNZOOMj9p9hPRXKzBKo/yUU9dLkfHuk2GLefKU+jnQsL0iu5D14rd+GKRctIoBumLYuuZVxVFoFHyeGgmlsK+3SIBX69NeWBDxpoiijjwdIo+bmafeQntsPMtcI7DtOUuqHMuB3puLjpXl9ZVVgqOYccErb3efjR8U16iuRMf2DhkF7ZvNdQ/RftMlSiEQdg2SSdyEoqpvaOzi/fi1piUuaRaIwzN8cje1MZXzfvglEVvpx4+XKy4drA4w0PivCRXZvcVU4hiaj3P/D7hFt5vBg8wCNYmN5qx3Lmae12Ug1s97ouwln6EP6iTQ2YHYhwesosyp67WsSFtnD1f9XWcnrbj6XhSqLtD12rmUd4hGtNw9NQbwBZeziI3KdghdHMdRUhyX+P+kCLybMzOOT96bCEqiLZbBTOHzhw9xtykRDKJHBfk9RPbbPnpZpuUSvGOoWwWl5NNStK++MQC2t/yYbaH0Ey3xFm3XOQnQY109yTkSqEmgoVdfDRq7m6KddR9eT2ns7PMbaVIgsvidJBUv858Q1VSigBdDhRYVb6fsTI/lQ/v1HnPqCAxJUruceBm9IrzRu676pHb45t796qt0JcNUeYooxAYt+gb1kYcen5wVGGL5og6pwI+3WKoC/wT9sh6KBl2klSPGnLKtqeNXA5IOsZ77gdDppnEclhrUn4UgNoaF/VytMRlr1RdPylRHXJiHDIsLCTy5cD7yOyk8zK3krexm0Xrp6vSa6xxE/vwKMfJBJ85hrQ7uXGvZ7x+Wouc++UkDDVmFg7/+t8dcXh1R0lF0ZlImWEuWDlV7+n1fitvmiZjCS7HlWZ3rTwy0lj4jqeuIP6UJjB0LG6EYKS2oX30OgBK0lPkgZov3OlwhpaptoLnAN9wsigA19Rs8jwdCauiYle78IInwP3z9JxPB+omHE4A1dItnsgeQyiVO+2TSrb3R9XWOF2QaRCklaVfYyQqsxsVt16cpwfCiU6CA50r/HJlj6J452+89CDmLWggw5f8kIsDWgiC5rZ6CIqcR0SM6IzDukcu7KvSNvcdJIRWHMlsJm4P/EEgHX8ZCLwaWLcKdO9qm0gf4o9tKwjpICGYywUi7gHyqyhrsRwbvsOPFQvgM3WpZ+TJjbf1uOSggtpcObDETD9YVD8J1Aim9J2lO0SY+9nHZKK2CFRPLnsuUyNZUfd6fT7PQ7kv6uHWOfGVrCl+JZ4wpt6PaXt4VMJ6n/tFcNqMfOJ02hn+oTj3DqguqcVlcpFbn7w0XSXLtOs+ymARgmuIunf7g+O4//qvLz98+fYi75efv3x98eNv75cffuq21+vaeYiRFJgDRW/CECSbUAxwPklSMQ7SRIjieEJgLB2xGBGzLJZRNBayVEIyWJRECMokCYuDrjT+8o/3KxbtAi5rYnDbX768Xqz7eXwUVfWzrZxU9ac6ATe+/0DGz+8/C/J6pfv1fsf4X8j7bzaM/4V++eH/sO39fvYw/fzjn99T39a9Vfn53yj2bf176Numv4JdcQG0RX9C3id07Vi8Xkz99v7JWM333w31ss8GBKv/9noZNn1O35a9XlL7fOcE3DF+/ikTcCQ49B//D9th+HwARQAA -->